diff --git a/.dockerignore b/.dockerignore index 0af94525e7..7c3825a172 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,10 +1,29 @@ +**.DS_Store +.env +.devcontainer +.dockerignore +.editorconfig .git -node_modules -vendor +.github +**.gitignore +.php-cs-fixer.dist.php +.prettierrc.json +.vscode +Dockerfile +bounties.md +compose.yml +contributing.md +contributor_license_agreement.md database/database.sqlite +docker/README.md +node_modules +phpstan.neon +phpunit.xml +readme.md storage/debugbar/*.json -storage/logs/*.log storage/framework/cache/data/* storage/framework/sessions/* storage/framework/testing storage/framework/views/*.php +storage/logs/*.log +vendor diff --git a/.env.example b/.env.example index c242132286..74f817210a 100644 --- a/.env.example +++ b/.env.example @@ -1,34 +1,6 @@ APP_ENV=production APP_DEBUG=false APP_KEY= -APP_TIMEZONE=UTC APP_URL=http://panel.test -APP_LOCALE=en APP_INSTALLED=false - -LOG_CHANNEL=daily -LOG_STACK=single -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=sqlite - -CACHE_STORE=file -QUEUE_CONNECTION=database -SESSION_DRIVER=file - -MAIL_MAILER=log -MAIL_HOST=smtp.example.com -MAIL_PORT=25 -MAIL_USERNAME= -MAIL_PASSWORD= -MAIL_ENCRYPTION=tls -MAIL_FROM_ADDRESS=no-reply@example.com -MAIL_FROM_NAME="Pelican Admin" -# Set this to your domain to prevent it defaulting to 'localhost', causing mail servers such as Gmail to reject your mail -# MAIL_EHLO_DOMAIN=panel.example.com - -SESSION_ENCRYPT=false -SESSION_PATH=/ -SESSION_DOMAIN=null -SESSION_COOKIE=pelican_session +APP_LOCALE=en diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 01050140aa..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -public -node_modules -resources/views -babel.config.js -tailwind.config.js -webpack.config.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index e129753f2f..0000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,52 +0,0 @@ -/** @type {import('eslint').Linter.Config} */ -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 6, - ecmaFeatures: { - jsx: true, - }, - project: './tsconfig.json', - tsconfigRootDir: './', - }, - settings: { - react: { - pragma: 'React', - version: 'detect', - }, - linkComponents: [ - { name: 'Link', linkAttribute: 'to' }, - { name: 'NavLink', linkAttribute: 'to' }, - ], - }, - env: { - browser: true, - es6: true, - }, - plugins: ['react', 'react-hooks', 'prettier', '@typescript-eslint'], - extends: [ - // 'standard', - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:jest-dom/recommended', - ], - rules: { - eqeqeq: 'error', - 'prettier/prettier': ['error', {}, { usePrettierrc: true }], - // TypeScript can infer this significantly better than eslint ever can. - 'react/prop-types': 0, - 'react/display-name': 0, - '@typescript-eslint/no-explicit-any': 0, - '@typescript-eslint/no-non-null-assertion': 0, - // 'react/no-unknown-property': ['error', { ignore: ['css'] }], - // This setup is required to avoid a spam of errors when running eslint about React being - // used before it is defined. - // - // @see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-use-before-define.md#how-to-use - 'no-use-before-define': 0, - '@typescript-eslint/no-use-before-define': 'warn', - '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], - '@typescript-eslint/ban-ts-comment': ['error', { 'ts-expect-error': 'allow-with-description' }], - }, -}; diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index c9cb05955b..9ade7cda99 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -64,10 +64,9 @@ body: label: Error Logs description: | Run the following command to collect logs on your system. - - Wings: `sudo wings diagnostics` - Panel: `tail -n 150 /var/www/pelican/storage/logs/laravel-$(date +%F).log | curl -X POST -F 'c=@-' paste.pelistuff.com` - placeholder: "https://pelipaste.com/a1h6z" + Wings: `sudo wings diagnostics --hastebin-url=https://logs.pelican.dev` + Panel: `tail -n 300 /var/www/pelican/storage/logs/laravel-$(date +%F).log | curl --data-binary @- https://logs.pelican.dev` + placeholder: "https://logs.pelican.dev/c17f750e" render: bash validations: required: false diff --git a/.github/docker/README.md b/.github/docker/README.md deleted file mode 100644 index 77f79291f7..0000000000 --- a/.github/docker/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Pelican Panel - Docker Image -This is a ready to use docker image for the panel. - -## Requirements -This docker image requires some additional software to function. The software can either be provided in other containers (see the [docker-compose.yml](https://github.com/pelican-dev/panel/blob/develop/docker-compose.example.yml) as an example) or as existing instances. - -A mysql database is required. We recommend the stock [MariaDB Image](https://hub.docker.com/_/mariadb/) image if you prefer to run it in a docker container. As a non-containerized option we recommend mariadb. - -A caching software is required as well. We recommend the stock [Redis Image](https://hub.docker.com/_/redis/) image. You can choose any of the [supported options](#cache-drivers). - -You can provide additional settings using a custom `.env` file or by setting the appropriate environment variables in the docker-compose file. - -## Setup - -Start the docker container and the required dependencies (either provide existing ones or start containers as well, see the [docker-compose.yml](https://github.com/pelican-dev/panel/blob/develop/docker-compose.example.yml) file as an example. - -After the startup is complete you'll need to create a user. -If you are running the docker container without docker-compose, use: -``` -docker exec -it php artisan p:user:make -``` -If you are using docker compose use -``` -docker-compose exec panel php artisan p:user:make -``` - -## Environment Variables -There are multiple environment variables to configure the panel when not providing your own `.env` file, see the following table for details on each available option. - -Note: If your `APP_URL` starts with `https://` you need to provide an `LE_EMAIL` as well so Certificates can be generated. - -| Variable | Description | Required | -|-------------------| ------------------------------------------------------------------------------ | -------- | -| `APP_URL` | The URL the panel will be reachable with (including protocol) | yes | -| `APP_TIMEZONE` | The timezone to use for the panel | yes | -| `LE_EMAIL` | The email used for letsencrypt certificate generation | yes | -| `DB_HOST` | The host of the mysql instance | yes | -| `DB_PORT` | The port of the mysql instance | yes | -| `DB_DATABASE` | The name of the mysql database | yes | -| `DB_USERNAME` | The mysql user | yes | -| `DB_PASSWORD` | The mysql password for the specified user | yes | -| `CACHE_STORE` | The cache driver (see [Cache drivers](#cache-drivers) for detais) | yes | -| `SESSION_DRIVER` | | yes | -| `QUEUE_DRIVER` | | yes | -| `REDIS_HOST` | The hostname or IP address of the redis database | yes | -| `REDIS_PASSWORD` | The password used to secure the redis database | maybe | -| `REDIS_PORT` | The port the redis database is using on the host | maybe | -| `MAIL_DRIVER` | The email driver (see [Mail drivers](#mail-drivers) for details) | yes | -| `MAIL_FROM` | The email that should be used as the sender email | yes | -| `MAIL_HOST` | The host of your mail driver instance | maybe | -| `MAIL_PORT` | The port of your mail driver instance | maybe | -| `MAIL_USERNAME` | The username for your mail driver | maybe | -| `MAIL_PASSWORD` | The password for your mail driver | maybe | - - -### Cache drivers -You can choose between different cache drivers depending on what you prefer. -We recommend redis when using docker as it can be started in a container easily. - -| Driver | Description | Required variables | -| -------- | ------------------------------------ | ------------------------------------------------------ | -| redis | host where redis is running | `REDIS_HOST` | -| redis | port redis is running on | `REDIS_PORT` | -| redis | redis database password | `REDIS_PASSWORD` | - -### Mail drivers -You can choose between different mail drivers according to your needs. -Every driver requires `MAIL_FROM` to be set. - -| Driver | Description | Required variables | -| -------- | ------------------------------------ | ------------------------------------------------------------- | -| mail | uses the installed php mail | | -| mandrill | [Mandrill](http://www.mandrill.com/) | `MAIL_USERNAME` | -| postmark | [Postmark](https://postmarkapp.com/) | `MAIL_USERNAME` | -| mailgun | [Mailgun](https://www.mailgun.com/) | `MAIL_USERNAME`, `MAIL_HOST` | -| smtp | Any SMTP server can be configured | `MAIL_USERNAME`, `MAIL_HOST`, `MAIL_PASSWORD`, `MAIL_PORT` | diff --git a/.github/docker/default.conf b/.github/docker/default.conf deleted file mode 100644 index a6bd58d720..0000000000 --- a/.github/docker/default.conf +++ /dev/null @@ -1,75 +0,0 @@ -# If using Ubuntu this file should be placed in: -# /etc/nginx/sites-available/ -# -# If using CentOS this file should be placed in: -# /etc/nginx/conf.d/ -# - -# The MIT License (MIT) -# -# Pterodactyl® -# Copyright © Dane Everitt and contributors -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -server { - listen 80; - server_name _; - - root /app/public; - index index.html index.htm index.php; - charset utf-8; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location = /favicon.ico { access_log off; log_not_found off; } - location = /robots.txt { access_log off; log_not_found off; } - - access_log off; - error_log /var/log/nginx/panel.app-error.log error; - - # allow larger file uploads and longer script runtimes - client_max_body_size 100m; - client_body_timeout 120s; - - sendfile off; - - location ~ \.php$ { - fastcgi_split_path_info ^(.+\.php)(/.+)$; - # the fastcgi_pass path needs to be changed accordingly when using CentOS - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M"; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - fastcgi_param HTTP_PROXY ""; - fastcgi_intercept_errors off; - fastcgi_buffer_size 16k; - fastcgi_buffers 4 16k; - fastcgi_connect_timeout 300; - fastcgi_send_timeout 300; - fastcgi_read_timeout 300; - } - - location ~ /\.ht { - deny all; - } -} diff --git a/.github/docker/default_ssl.conf b/.github/docker/default_ssl.conf deleted file mode 100644 index 930a38daa6..0000000000 --- a/.github/docker/default_ssl.conf +++ /dev/null @@ -1,70 +0,0 @@ -# If using Ubuntu this file should be placed in: -# /etc/nginx/sites-available/ -# -server { - listen 80; - server_name ; - return 301 https://$server_name$request_uri; -} - -server { - listen 443 ssl http2; - server_name ; - - root /app/public; - index index.php; - - access_log /var/log/nginx/panel.app-access.log; - error_log /var/log/nginx/panel.app-error.log error; - - # allow larger file uploads and longer script runtimes - client_max_body_size 100m; - client_body_timeout 120s; - - sendfile off; - - # strengthen ssl security - ssl_certificate /etc/letsencrypt/live//fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live//privkey.pem; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - ssl_session_cache shared:SSL:10m; - ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; - - # See the link below for more SSL information: - # https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html - # - # ssl_dhparam /etc/ssl/certs/dhparam.pem; - - # Add headers to serve security related headers - add_header Strict-Transport-Security "max-age=15768000; preload;"; - add_header X-Content-Type-Options nosniff; - add_header X-XSS-Protection "1; mode=block"; - add_header X-Robots-Tag none; - add_header Content-Security-Policy "frame-ancestors 'self'"; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location ~ \.php$ { - fastcgi_split_path_info ^(.+\.php)(/.+)$; - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M"; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - fastcgi_param HTTP_PROXY ""; - fastcgi_intercept_errors off; - fastcgi_buffer_size 16k; - fastcgi_buffers 4 16k; - fastcgi_connect_timeout 300; - fastcgi_send_timeout 300; - fastcgi_read_timeout 300; - include /etc/nginx/fastcgi_params; - } - - location ~ /\.ht { - deny all; - } -} diff --git a/.github/docker/entrypoint.sh b/.github/docker/entrypoint.sh deleted file mode 100644 index b6aac4daae..0000000000 --- a/.github/docker/entrypoint.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/ash -e - -#mkdir -p /var/log/supervisord/ /var/log/php8/ \ - -## check for .env file and generate app keys if missing -if [ -f /pelican-data/.env ]; then - echo "external vars exist." - rm -rf /var/www/html/.env -else - echo "external vars don't exist." - rm -rf /var/www/html/.env - touch /pelican-data/.env - - ## manually generate a key because key generate --force fails - if [ -z $APP_KEY ]; then - echo -e "Generating key." - APP_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) - echo -e "Generated app key: $APP_KEY" - echo -e "APP_KEY=$APP_KEY" > /pelican-data/.env - else - echo -e "APP_KEY exists in environment, using that." - echo -e "APP_KEY=$APP_KEY" > /pelican-data/.env - fi -fi - -mkdir /pelican-data/database -ln -s /pelican-data/.env /var/www/html/ -ln -s /pelican-data/database/database.sqlite /var/www/html/database/ - -if ! grep -q "APP_KEY=" .env || grep -q "APP_KEY=$" .env; then - echo "Generating APP_KEY..." - php artisan key:generate --force -else - echo "APP_KEY is already set." -fi - -## make sure the db is set up -echo -e "Migrating Database" -php artisan migrate --force - -echo -e "Optimizing Filament" -php artisan filament:optimize - -## start cronjobs for the queue -echo -e "Starting cron jobs." -crond -L /var/log/crond -l 5 - -export SUPERVISORD_CADDY=false - -## disable caddy if SKIP_CADDY is set -if [[ -z $SKIP_CADDY ]]; then - echo "Starting PHP-FPM and Caddy" - export SUPERVISORD_CADDY=true -else - echo "Starting PHP-FPM only" -fi - -chown -R www-data:www-data . /pelican-data/.env /pelican-data/database - -echo "Starting Supervisord" -exec "$@" diff --git a/.github/docker/supervisord.conf b/.github/docker/supervisord.conf deleted file mode 100644 index 237c0dbdb0..0000000000 --- a/.github/docker/supervisord.conf +++ /dev/null @@ -1,39 +0,0 @@ -[unix_http_server] -file=/tmp/supervisor.sock ; path to your socket file - -[supervisord] -logfile=/var/log/supervisord/supervisord.log ; supervisord log file -logfile_maxbytes=50MB ; maximum size of logfile before rotation -logfile_backups=2 ; number of backed up logfiles -loglevel=error ; info, debug, warn, trace -pidfile=/var/run/supervisord.pid ; pidfile location -nodaemon=false ; run supervisord as a daemon -minfds=1024 ; number of startup file descriptors -minprocs=200 ; number of process descriptors -user=root ; default user -childlogdir=/var/log/supervisord/ ; where child log files will live - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[supervisorctl] -serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket - -[program:php-fpm] -command=/usr/local/sbin/php-fpm -F -autostart=true -autorestart=true - -[program:queue-worker] -command=/usr/local/bin/php /var/www/html/artisan queue:work --tries=3 -user=www-data -autostart=true -autorestart=true - -[program:caddy] -command=caddy run --config /etc/caddy/Caddyfile --adapter caddyfile -autostart=%(ENV_SUPERVISORD_CADDY)s -autorestart=%(ENV_SUPERVISORD_CADDY)s -priority=10 -stdout_events_enabled=true -stderr_events_enabled=true diff --git a/.github/docker/www.conf b/.github/docker/www.conf deleted file mode 100644 index c0c17903f3..0000000000 --- a/.github/docker/www.conf +++ /dev/null @@ -1,16 +0,0 @@ -[www] - -user = nginx -group = nginx - -listen = 127.0.0.1:9000 -listen.owner = nginx -listen.group = nginx -listen.mode = 0750 - -pm = ondemand -pm.max_children = 9 -pm.process_idle_timeout = 10s -pm.max_requests = 200 - -clear_env = no \ No newline at end of file diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3021c6799a..050d02d7c4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -3,31 +3,40 @@ name: Build on: push: branches: - - '**' + - main pull_request: - branches: - - '**' jobs: ui: name: UI runs-on: ubuntu-latest strategy: - fail-fast: false + fail-fast: true matrix: - node-version: [18, 20] + node-version: [20, 22] steps: - name: Code Checkout uses: actions/checkout@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip + tools: composer:v2 + coverage: none + + - name: Install PHP dependencies + run: composer install --no-interaction --no-suggest --no-progress --no-autoloader --no-scripts --no-dev + - name: Setup Node uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: "yarn" - - name: Install dependencies + - name: Install JS dependencies run: yarn install --frozen-lockfile - name: Build - run: yarn build:production + run: yarn build diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5e2ee88471..896fd3ed95 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,20 +3,84 @@ name: Tests on: push: branches: - - '**' + - main pull_request: - branches: - - '**' + +env: + APP_ENV: testing + APP_DEBUG: "false" + APP_KEY: ThisIsARandomStringForTests12345 + APP_TIMEZONE: UTC + APP_URL: http://localhost/ + CACHE_DRIVER: array + MAIL_MAILER: array + SESSION_DRIVER: array + QUEUE_CONNECTION: sync + GUZZLE_TIMEOUT: 60 + GUZZLE_CONNECT_TIMEOUT: 60 jobs: + sqlite: + name: SQLite + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + php: [8.3, 8.4, 8.5] + env: + DB_CONNECTION: sqlite + DB_DATABASE: testing.sqlite + steps: + - name: Code Checkout + uses: actions/checkout@v4 + + - name: Get cache directory + id: composer-cache + run: | + echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer-${{ matrix.php }}- + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip + tools: composer:v2 + coverage: none + + - name: Install dependencies + run: composer install --no-interaction --no-suggest --no-progress --no-scripts + + - name: Create SQLite file + run: touch database/testing.sqlite + + - name: Run Migrations + run: php artisan migrate --force --seed + + - name: Unit tests + run: vendor/bin/pest tests/Unit --parallel + env: + DB_HOST: UNIT_NO_DB + SKIP_MIGRATIONS: true + + - name: Integration tests + run: vendor/bin/pest tests/Integration --parallel + mysql: name: MySQL runs-on: ubuntu-latest strategy: - fail-fast: false + fail-fast: true matrix: - php: [8.2, 8.3] - database: ["mysql:8"] + php: [8.5] + database: ["mysql:8.4", "mysql:9.6"] services: database: image: ${{ matrix.database }} @@ -27,21 +91,10 @@ jobs: - 3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 env: - APP_ENV: testing - APP_DEBUG: "false" - APP_KEY: ThisIsARandomStringForTests12345 - APP_TIMEZONE: UTC - APP_URL: http://localhost/ - CACHE_DRIVER: array - MAIL_MAILER: array - SESSION_DRIVER: array - QUEUE_CONNECTION: sync DB_CONNECTION: mysql DB_HOST: 127.0.0.1 DB_DATABASE: testing DB_USERNAME: root - GUZZLE_TIMEOUT: 60 - GUZZLE_CONNECT_TIMEOUT: 60 steps: - name: Code Checkout uses: actions/checkout@v4 @@ -68,16 +121,22 @@ jobs: coverage: none - name: Install dependencies - run: composer install --no-interaction --no-suggest --prefer-dist + run: composer install --no-interaction --no-suggest --no-progress --no-scripts + + - name: Run Migrations + run: php artisan migrate --force --seed + env: + DB_PORT: ${{ job.services.database.ports[3306] }} + DB_USERNAME: root - name: Unit tests - run: vendor/bin/phpunit tests/Unit + run: vendor/bin/pest tests/Unit --parallel env: DB_HOST: UNIT_NO_DB SKIP_MIGRATIONS: true - name: Integration tests - run: vendor/bin/phpunit tests/Integration + run: vendor/bin/pest tests/Integration --parallel env: DB_PORT: ${{ job.services.database.ports[3306] }} DB_USERNAME: root @@ -86,10 +145,10 @@ jobs: name: MariaDB runs-on: ubuntu-latest strategy: - fail-fast: false + fail-fast: true matrix: - php: [8.2, 8.3] - database: ["mariadb:10.3", "mariadb:10.11", "mariadb:11.4"] + php: [8.5] + database: ["mariadb:10.11", "mariadb:11.4"] services: database: image: ${{ matrix.database }} @@ -100,21 +159,10 @@ jobs: - 3306 options: --health-cmd="mariadb-admin ping || mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 env: - APP_ENV: testing - APP_DEBUG: "false" - APP_KEY: ThisIsARandomStringForTests12345 - APP_TIMEZONE: UTC - APP_URL: http://localhost/ - CACHE_DRIVER: array - MAIL_MAILER: array - SESSION_DRIVER: array - QUEUE_CONNECTION: sync DB_CONNECTION: mariadb DB_HOST: 127.0.0.1 DB_DATABASE: testing DB_USERNAME: root - GUZZLE_TIMEOUT: 60 - GUZZLE_CONNECT_TIMEOUT: 60 steps: - name: Code Checkout uses: actions/checkout@v4 @@ -141,41 +189,55 @@ jobs: coverage: none - name: Install dependencies - run: composer install --no-interaction --no-suggest --prefer-dist + run: composer install --no-interaction --no-suggest --no-progress --no-scripts + + - name: Run Migrations + run: php artisan migrate --force --seed + env: + DB_PORT: ${{ job.services.database.ports[3306] }} + DB_USERNAME: root - name: Unit tests - run: vendor/bin/phpunit tests/Unit + run: vendor/bin/pest tests/Unit --parallel env: DB_HOST: UNIT_NO_DB SKIP_MIGRATIONS: true - name: Integration tests - run: vendor/bin/phpunit tests/Integration + run: vendor/bin/pest tests/Integration --parallel env: DB_PORT: ${{ job.services.database.ports[3306] }} DB_USERNAME: root - sqlite: - name: SQLite + postgresql: + name: PostgreSQL runs-on: ubuntu-latest strategy: - fail-fast: false + fail-fast: true matrix: - php: [8.2, 8.3] + php: [8.5] + database: ["postgres:17", "postgres:18"] + services: + database: + image: ${{ matrix.database }} + env: + POSTGRES_DB: testing + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_HOST_AUTH_METHOD: trust + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 env: - APP_ENV: testing - APP_DEBUG: "false" - APP_KEY: ThisIsARandomStringForTests12345 - APP_TIMEZONE: UTC - APP_URL: http://localhost/ - CACHE_DRIVER: array - MAIL_MAILER: array - SESSION_DRIVER: array - QUEUE_CONNECTION: sync - DB_CONNECTION: sqlite - DB_DATABASE: testing.sqlite - GUZZLE_TIMEOUT: 60 - GUZZLE_CONNECT_TIMEOUT: 60 + DB_CONNECTION: pgsql + DB_HOST: 127.0.0.1 + DB_DATABASE: testing + DB_USERNAME: postgres + DB_PASSWORD: postgres steps: - name: Code Checkout uses: actions/checkout@v4 @@ -202,16 +264,16 @@ jobs: coverage: none - name: Install dependencies - run: composer install --no-interaction --no-suggest --prefer-dist + run: composer install --no-interaction --no-suggest --no-progress --no-scripts - - name: Create SQLite file - run: touch database/testing.sqlite + - name: Run Migrations + run: php artisan migrate --force --seed - name: Unit tests - run: vendor/bin/phpunit tests/Unit + run: vendor/bin/pest tests/Unit --parallel env: DB_HOST: UNIT_NO_DB SKIP_MIGRATIONS: true - name: Integration tests - run: vendor/bin/phpunit tests/Integration + run: vendor/bin/pest tests/Integration --parallel diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000000..7f02df5b8b --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,168 @@ +name: Docker + +on: + push: + branches: + - main + release: + types: + - published + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-php-base: + name: Build PHP base image on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-24.04 + arch: amd64 + platform: linux/amd64 + - os: ubuntu-24.04-arm + arch: arm64 + platform: linux/arm64 + steps: + - name: Code checkout + uses: actions/checkout@v4 + + - name: Setup Docker buildx + uses: docker/setup-buildx-action@v3 + + - name: Build the base PHP image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile.base + push: false + load: true + platforms: ${{ matrix.platform }} + tags: base-php:${{ matrix.arch }} + cache-from: type=gha,scope=base-php${{ matrix.arch }} + cache-to: type=gha,scope=base-php${{ matrix.arch }} + + - name: Export image to file + run: docker save -o base-php-${{ matrix.arch }}.tar base-php:${{ matrix.arch }} + + - name: Push the docker build to the artifacts + uses: actions/upload-artifact@v4 + with: + name: base-php-${{ matrix.arch }}.tar + path: base-php-${{ matrix.arch }}.tar + retention-days: 7 + + + build-and-push: + name: Build and Push ubuntu-24.04 + runs-on: ubuntu-24.04 + needs: build-php-base + permissions: + contents: read + packages: write + # Start a temp local registry because workflow can not pull from localy loaded images + services: + registry: + image: registry:2 + ports: + - 5000:5000 + # Always run against a tag, even if the commit into the tag has [docker skip] within the commit message. + if: "!contains(github.ref, 'main') || (!contains(github.event.head_commit.message, 'skip docker') && !contains(github.event.head_commit.message, 'docker skip'))" + steps: + - name: Code checkout + uses: actions/checkout@v4 + + - name: Docker metadata + id: docker_meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + flavor: | + latest=false + tags: | + type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.action == 'published' && github.event.release.prerelease == false }} + type=ref,event=tag + type=ref,event=branch + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + # We Need to start it in host mode else it can't acces the local registry on port 5000 + - name: Setup Docker buildx + uses: docker/setup-buildx-action@v3 + with: + driver-opts: network=host + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get Build Information + id: build_info + run: | + echo "version_tag=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_OUTPUT + echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + # Download the base PHP image AMD64 + - uses: actions/download-artifact@v4 + with: + name: base-php-amd64.tar + + # Download the base PHP image ARM64 + - uses: actions/download-artifact@v4 + with: + name: base-php-arm64.tar + + - name: Load base images into local registry + run: | + docker load -i base-php-amd64.tar + docker load -i base-php-arm64.tar + docker tag base-php:amd64 localhost:5000/base-php:amd64 + docker tag base-php:arm64 localhost:5000/base-php:arm64 + docker push localhost:5000/base-php:amd64 + docker push localhost:5000/base-php:arm64 + rm base-php-arm64.tar base-php-amd64.tar + + - name: Update version in config/app.php (tag) + if: "github.event_name == 'release' && github.event.action == 'published'" + run: | + sed -i "s/'version' => 'canary',/'version' => '${{ steps.build_info.outputs.version_tag }}',/" config/app.php + + - name: Build and Push (tag) + uses: docker/build-push-action@v6 + if: "github.event_name == 'release' && github.event.action == 'published'" + with: + context: . + file: ./Dockerfile + push: true + platforms: 'linux/amd64,linux/arm64' + build-args: | + VERSION=${{ steps.build_info.outputs.version_tag }} + labels: ${{ steps.docker_meta.outputs.labels }} + tags: ${{ steps.docker_meta.outputs.tags }} + cache-from: type=gha,scope=tagged${{ matrix.os }} + cache-to: type=gha,scope=tagged${{ matrix.os }},mode=max + + - name: Build and Push (main) + uses: docker/build-push-action@v6 + if: "github.event_name == 'push' && contains(github.ref, 'main')" + with: + context: . + file: ./Dockerfile + push: ${{ github.event_name != 'pull_request' }} + platforms: 'linux/amd64,linux/arm64' + build-args: | + VERSION=dev-${{ steps.build_info.outputs.short_sha }} + labels: ${{ steps.docker_meta.outputs.labels }} + tags: ${{ steps.docker_meta.outputs.tags }} + cache-from: type=gha,scope=${{ matrix.os }} + cache-to: type=gha,scope=${{ matrix.os }},mode=max diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 0b767fcf78..e88c0f7e1e 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -3,7 +3,7 @@ name: Lint on: pull_request: branches: - - '**' + - "**" jobs: pint: @@ -16,7 +16,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: "8.3" + php-version: "8.4" extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip tools: composer:v2 coverage: none @@ -25,21 +25,38 @@ jobs: run: cp .env.example .env - name: Install dependencies - run: composer install --no-interaction --no-progress --prefer-dist + run: composer install --no-interaction --no-suggest --no-progress --no-autoloader --no-scripts - name: Pint run: vendor/bin/pint --test phpstan: name: PHPStan runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + php: [8.2, 8.3, 8.4, 8.5] steps: - name: Code Checkout uses: actions/checkout@v4 + - name: Get cache directory + id: composer-cache + run: | + echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer-${{ matrix.php }}- + - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: "8.3" + php-version: ${{ matrix.php }} extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip tools: composer:v2 coverage: none @@ -48,7 +65,7 @@ jobs: run: cp .env.example .env - name: Install dependencies - run: composer install --no-interaction --no-progress --prefer-dist + run: composer install --no-interaction --no-suggest --no-progress --no-scripts - name: PHPStan - run: vendor/bin/phpstan --memory-limit=-1 + run: vendor/bin/phpstan --memory-limit=-1 --error-format=github diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5ede81c071..38e11561e5 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -11,22 +11,33 @@ jobs: runs-on: ubuntu-22.04 permissions: contents: write - + steps: - name: Code checkout uses: actions/checkout@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip + tools: composer:v2 + coverage: none + + - name: Install PHP dependencies + run: composer install --no-interaction --no-suggest --no-progress --no-autoloader --no-scripts --no-dev + - name: Setup Node uses: actions/setup-node@v4 with: node-version: 20 cache: "yarn" - - name: Install dependencies + - name: Install JS dependencies run: yarn install --frozen-lockfile - name: Build - run: yarn build:production + run: yarn build - name: Create release branch and bump version env: @@ -44,8 +55,8 @@ jobs: - name: Create release archive run: | - rm -rf node_modules tests CODE_OF_CONDUCT.md CONTRIBUTING.md flake.lock flake.nix phpunit.xml shell.nix - tar -czf panel.tar.gz * .editorconfig .env.example .eslintignore .eslintrc.js .gitignore .prettierrc.json + rm -rf node_modules vendor tests CODE_OF_CONDUCT.md CONTRIBUTING.md phpunit.xml shell.nix + tar -czf panel.tar.gz * .env.example - name: Create checksum run: | diff --git a/.gitignore b/.gitignore index 8a0a2ef56f..f82788f112 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ /.phpunit.cache /node_modules /public/build -/public/hot /public/storage /storage/*.key +/storage/pail /storage/clockwork/* /vendor *.DS_Store* @@ -19,10 +19,11 @@ npm-debug.log yarn-error.log /.fleet /.idea +/.nova /.vscode +/.ddev public/assets/manifest.json -/database/*.sqlite -filament-monaco-editor/ +/database/*.sqlite* _ide_helper* /.phpstorm.meta.php diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php deleted file mode 100644 index 9245b7e6e5..0000000000 --- a/.php-cs-fixer.dist.php +++ /dev/null @@ -1,52 +0,0 @@ -in(__DIR__) - ->exclude([ - 'vendor', - 'node_modules', - 'storage', - 'bootstrap/cache', - ]) - ->notName(['_ide_helper*']); - -return (new Config()) - ->setRiskyAllowed(true) - ->setFinder($finder) - ->setRules([ - '@Symfony' => true, - '@PSR1' => true, - '@PSR2' => true, - '@PSR12' => true, - 'align_multiline_comment' => ['comment_type' => 'phpdocs_like'], - 'combine_consecutive_unsets' => true, - 'concat_space' => ['spacing' => 'one'], - 'heredoc_to_nowdoc' => true, - 'no_alias_functions' => true, - 'no_unreachable_default_argument_value' => true, - 'no_useless_return' => true, - 'ordered_imports' => [ - 'sort_algorithm' => 'length', - ], - 'phpdoc_align' => [ - 'align' => 'left', - 'tags' => [ - 'param', - 'property', - 'return', - 'throws', - 'type', - 'var', - ], - ], - 'random_api_migration' => true, - 'ternary_to_null_coalescing' => true, - 'yoda_style' => [ - 'equal' => false, - 'identical' => false, - 'less_and_greater' => false, - ], - ]); diff --git a/Caddyfile b/Caddyfile deleted file mode 100644 index 1c835bf057..0000000000 --- a/Caddyfile +++ /dev/null @@ -1,11 +0,0 @@ -{ - email {$ADMIN_EMAIL} -} - -{$APP_URL} { - root * /var/www/html/public - encode gzip - - php_fastcgi 127.0.0.1:9000 - file_server -} diff --git a/Dockerfile b/Dockerfile index 8c99bcc252..f0af8aa5a9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,58 +1,108 @@ +# syntax=docker.io/docker/dockerfile:1.13-labs # Pelican Production Dockerfile -FROM node:20-alpine AS yarn -#FROM --platform=$TARGETOS/$TARGETARCH node:20-alpine AS yarn +## +# If you want to build this locally you want to run `docker build -f Dockerfile.dev .` +## + +# ================================ +# Stage 1-1: Composer Install +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH localhost:5000/base-php:$TARGETARCH AS composer WORKDIR /build -COPY . ./ +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN yarn install --frozen-lockfile && yarn run build:production +# Copy bare minimum to install Composer dependencies +COPY composer.json composer.lock ./ -FROM php:8.3-fpm-alpine -# FROM --platform=$TARGETOS/$TARGETARCH php:8.3-fpm-alpine +RUN composer install --no-dev --no-interaction --no-autoloader --no-scripts -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer +# ================================ +# Stage 1-2: Yarn Install +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH node:20-alpine AS yarn -WORKDIR /var/www/html +WORKDIR /build -# Install dependencies -RUN apk update && apk add --no-cache \ - libpng-dev libjpeg-turbo-dev freetype-dev libzip-dev icu-dev \ - zip unzip curl \ - caddy ca-certificates supervisor \ - && docker-php-ext-install bcmath gd intl zip opcache pcntl posix pdo_mysql +# Copy bare minimum to install Yarn dependencies +COPY package.json yarn.lock ./ -# Copy the Caddyfile to the container -COPY Caddyfile /etc/caddy/Caddyfile +RUN yarn config set network-timeout 300000 \ + && yarn install --frozen-lockfile -# Copy the application code to the container -COPY . . +# ================================ +# Stage 2-1: Composer Optimize +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH composer AS composerbuild -COPY --from=yarn /build/public/assets ./public/assets +# Copy full code to optimize autoload +COPY --exclude=docker/ . ./ -RUN touch .env +RUN composer dump-autoload --optimize -RUN composer install --no-dev --optimize-autoloader +# ================================ +# Stage 2-2: Build Frontend Assets +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH yarn AS yarnbuild -# Set file permissions -RUN chmod -R 755 /var/www/html/storage \ - && chmod -R 755 /var/www/html/bootstrap/cache +WORKDIR /build -# Add scheduler to cron -RUN echo "* * * * * php /var/www/html/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data - +# Copy full code +COPY --exclude=docker/ . ./ +COPY --from=composer /build . -## supervisord config and log dir -RUN cp .github/docker/supervisord.conf /etc/supervisord.conf && \ - mkdir /var/log/supervisord/ +RUN yarn run build + +# ================================ +# Stage 5: Build Final Application Image +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH localhost:5000/base-php:$TARGETARCH AS final + +WORKDIR /var/www/html + +RUN apk add --no-cache \ + # packages for running the panel + caddy ca-certificates supervisor supercronic fcgi \ + # required for installing plugins. Pulled from https://github.com/pelican-dev/panel/pull/2034 + zip unzip 7zip bzip2-dev yarn git + +# Copy composer binary for runtime plugin dependency management +COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer +COPY --chown=root:www-data --chmod=770 --from=composerbuild /build . +COPY --chown=root:www-data --chmod=770 --from=yarnbuild /build/public ./public + +# Create and remove directories +RUN mkdir -p /pelican-data/storage /pelican-data/plugins /var/run/supervisord \ + && rm -rf /var/www/html/plugins \ +# Symlinks for env, database, storage, and plugins + && ln -s /pelican-data/.env /var/www/html/.env \ + && ln -s /pelican-data/database/database.sqlite ./database/database.sqlite \ + && ln -s /pelican-data/storage /var/www/html/public/storage \ + && ln -s /pelican-data/storage /var/www/html/storage/app/public \ + && ln -s /pelican-data/plugins /var/www/html \ +# Allow www-data write permissions where necessary + && chown -R www-data: /pelican-data .env ./storage ./plugins ./bootstrap/cache /var/run/supervisord /var/www/html/public/storage \ + && chmod -R 770 /pelican-data ./storage ./bootstrap/cache /var/run/supervisord \ + && chown -R www-data: /usr/local/etc/php/ /usr/local/etc/php-fpm.d/ /var/www/html/composer.json /var/www/html/composer.lock +# Configure Supervisor +COPY docker/supervisord.conf /etc/supervisord.conf +COPY docker/Caddyfile /etc/caddy/Caddyfile +# Add Laravel scheduler to crontab +COPY docker/crontab /etc/crontabs/crontab + +COPY docker/entrypoint.sh /entrypoint.sh +COPY docker/healthcheck.sh /healthcheck.sh HEALTHCHECK --interval=5m --timeout=10s --start-period=5s --retries=3 \ - CMD curl -f http://localhost/up || exit 1 + CMD /bin/ash /healthcheck.sh -EXPOSE 80:2019 -EXPOSE 443 +EXPOSE 80 443 VOLUME /pelican-data -ENTRYPOINT [ "/bin/ash", ".github/docker/entrypoint.sh" ] +USER www-data + +ENTRYPOINT [ "/bin/ash", "/entrypoint.sh" ] CMD [ "supervisord", "-n", "-c", "/etc/supervisord.conf" ] diff --git a/Dockerfile.base b/Dockerfile.base new file mode 100644 index 0000000000..f01323ebca --- /dev/null +++ b/Dockerfile.base @@ -0,0 +1,10 @@ +# ================================ +# Stage 0: Build PHP Base Image +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH php:8.4-fpm-alpine + +ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ + +RUN install-php-extensions bcmath gd intl zip pcntl pdo_mysql pdo_pgsql bz2 + +RUN rm /usr/local/bin/install-php-extensions diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000000..ca8a1b5a6d --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,114 @@ +# syntax=docker.io/docker/dockerfile:1.13-labs +# Pelican Development Dockerfile + +FROM --platform=$TARGETOS/$TARGETARCH php:8.4-fpm-alpine AS base + +ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ + +RUN install-php-extensions bcmath gd intl zip pcntl pdo_mysql pdo_pgsql bz2 + +RUN rm /usr/local/bin/install-php-extensions + +# ================================ +# Stage 1-1: Composer Install +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH base AS composer + +WORKDIR /build + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +# Copy bare minimum to install Composer dependencies +COPY composer.json composer.lock ./ + +RUN composer install --no-dev --no-interaction --no-autoloader --no-scripts + +# ================================ +# Stage 1-2: Yarn Install +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH node:20-alpine AS yarn + +WORKDIR /build + +# Copy bare minimum to install Yarn dependencies +COPY package.json yarn.lock ./ + +RUN yarn config set network-timeout 300000 \ + && yarn install --frozen-lockfile + +# ================================ +# Stage 2-1: Composer Optimize +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH composer AS composerbuild + +# Copy full code to optimize autoload +COPY --exclude=docker/ . ./ + +RUN composer dump-autoload --optimize + +# ================================ +# Stage 2-2: Build Frontend Assets +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH yarn AS yarnbuild + +WORKDIR /build + +# Copy full code +COPY --exclude=docker/ . ./ +COPY --from=composer /build . + +RUN yarn run build + +# ================================ +# Stage 5: Build Final Application Image +# ================================ +FROM --platform=$TARGETOS/$TARGETARCH base AS final + +WORKDIR /var/www/html + +# Install additional required libraries +RUN apk add --no-cache \ + # packages for running the panel + caddy ca-certificates supervisor supercronic fcgi coreutils \ + # required for installing plugins. Pulled from https://github.com/pelican-dev/panel/pull/2034 + zip unzip 7zip bzip2-dev yarn git + +# Copy composer binary for runtime plugin dependency management +COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer +COPY --chown=root:www-data --chmod=770 --from=composerbuild /build . +COPY --chown=root:www-data --chmod=770 --from=yarnbuild /build/public ./public + +# Create and remove directories +RUN mkdir -p /pelican-data/storage /pelican-data/plugins /var/run/supervisord \ + && rm -rf /var/www/html/plugins \ +# Symlinks for env, database, storage, and plugins + && ln -s /pelican-data/.env /var/www/html/.env \ + && ln -s /pelican-data/database/database.sqlite ./database/database.sqlite \ + && ln -s /pelican-data/storage /var/www/html/public/storage \ + && ln -s /pelican-data/storage /var/www/html/storage/app/public \ + && ln -s /pelican-data/plugins /var/www/html \ +# Allow www-data write permissions where necessary + && chown -R www-data: /pelican-data .env ./storage ./plugins ./bootstrap/cache /var/run/supervisord /var/www/html/public/storage \ + && chmod -R 770 /pelican-data ./storage ./bootstrap/cache /var/run/supervisord \ + && chown -R www-data: /usr/local/etc/php/ /usr/local/etc/php-fpm.d/ /var/www/html/composer.json /var/www/html/composer.lock + +# Configure Supervisor +COPY docker/supervisord.conf /etc/supervisord.conf +COPY docker/Caddyfile /etc/caddy/Caddyfile +# Add Laravel scheduler to crontab +COPY docker/crontab /etc/crontabs/crontab + +COPY docker/entrypoint.sh /entrypoint.sh +COPY docker/healthcheck.sh /healthcheck.sh + +HEALTHCHECK --interval=5m --timeout=10s --start-period=5s --retries=3 \ + CMD /bin/ash /healthcheck.sh + +EXPOSE 80 443 + +VOLUME /pelican-data + +USER www-data + +ENTRYPOINT [ "/bin/ash", "/entrypoint.sh" ] +CMD [ "supervisord", "-n", "-c", "/etc/supervisord.conf" ] diff --git a/app/Checks/CacheCheck.php b/app/Checks/CacheCheck.php new file mode 100644 index 0000000000..d250807428 --- /dev/null +++ b/app/Checks/CacheCheck.php @@ -0,0 +1,58 @@ +driver = $driver; + + return $this; + } + + public function run(): Result + { + $driver = $this->driver ?? $this->defaultDriver(); + + $result = Result::make()->meta([ + 'driver' => $driver, + ]); + + try { + return $this->canWriteValuesToCache($driver) + ? $result->ok(trans('admin/health.results.cache.ok')) + : $result->failed(trans('admin/health.results.cache.failed_retrieve')); + } catch (Exception $exception) { + return $result->failed(trans('admin/health.results.cache.failed', ['error' => $exception->getMessage()])); + } + } + + protected function defaultDriver(): ?string + { + return config('cache.default', 'file'); + } + + protected function canWriteValuesToCache(?string $driver): bool + { + $expectedValue = Str::random(5); + + $cacheName = "laravel-health:check-{$expectedValue}"; + + Cache::driver($driver)->put($cacheName, $expectedValue, 10); + + $actualValue = Cache::driver($driver)->get($cacheName); + + Cache::driver($driver)->forget($cacheName); + + return $actualValue === $expectedValue; + } +} diff --git a/app/Checks/DatabaseCheck.php b/app/Checks/DatabaseCheck.php new file mode 100644 index 0000000000..2ffe48bb97 --- /dev/null +++ b/app/Checks/DatabaseCheck.php @@ -0,0 +1,42 @@ +connectionName = $connectionName; + + return $this; + } + + public function run(): Result + { + $connectionName = $this->connectionName ?? $this->getDefaultConnectionName(); + + $result = Result::make()->meta([ + 'connection_name' => $connectionName, + ]); + + try { + DB::connection($connectionName)->getPdo(); + + return $result->ok(trans('admin/health.results.database.ok')); + } catch (Exception $exception) { + return $result->failed(trans('admin/health.results.database.failed', ['error' => $exception->getMessage()])); + } + } + + protected function getDefaultConnectionName(): string + { + return config('database.default'); + } +} diff --git a/app/Checks/DebugModeCheck.php b/app/Checks/DebugModeCheck.php new file mode 100644 index 0000000000..a5a41eb7cd --- /dev/null +++ b/app/Checks/DebugModeCheck.php @@ -0,0 +1,44 @@ +expected = $bool; + + return $this; + } + + public function run(): Result + { + $actual = config('app.debug'); + + $result = Result::make() + ->meta([ + 'actual' => $actual, + 'expected' => $this->expected, + ]) + ->shortSummary($this->convertToWord($actual)); + + return $this->expected === $actual + ? $result->ok() + : $result->failed(trans('admin/health.results.debugmode.failed', [ + 'actual' => $this->convertToWord($actual), + 'expected' => $this->convertToWord($this->expected), + ])); + } + + protected function convertToWord(bool $boolean): string + { + return $boolean ? 'true' : 'false'; + } +} diff --git a/app/Checks/EnvironmentCheck.php b/app/Checks/EnvironmentCheck.php new file mode 100644 index 0000000000..d0eb86fe01 --- /dev/null +++ b/app/Checks/EnvironmentCheck.php @@ -0,0 +1,38 @@ +expectedEnvironment = $expectedEnvironment; + + return $this; + } + + public function run(): Result + { + $actualEnvironment = (string) App::environment(); + + $result = Result::make() + ->meta([ + 'actual' => $actualEnvironment, + 'expected' => $this->expectedEnvironment, + ]) + ->shortSummary($actualEnvironment); + + return $this->expectedEnvironment === $actualEnvironment + ? $result->ok(trans('admin/health.results.environment.ok')) + : $result->failed(trans('admin/health.results.environment.failed', [ + 'actual' => $actualEnvironment, + 'expected' => $this->expectedEnvironment, + ])); + } +} diff --git a/app/Checks/NodeVersionsCheck.php b/app/Checks/NodeVersionsCheck.php new file mode 100644 index 0000000000..856b82c5d2 --- /dev/null +++ b/app/Checks/NodeVersionsCheck.php @@ -0,0 +1,47 @@ +isEmpty()) { + $result = Result::make() + ->notificationMessage(trans('admin/health.results.nodeversions.no_nodes_created')) + ->shortSummary(trans('admin/health.results.nodeversions.no_nodes')); + $result->status = Status::skipped(); + + return $result; + } + + $outdated = $all + ->filter(fn (Node $node) => !isset($node->systemInformation()['exception']) && !$this->versionService->isLatestWings($node->systemInformation()['version'])) + ->count(); + + $all = $all->count(); + $latestVersion = $this->versionService->latestWingsVersion(); + + $result = Result::make() + ->meta([ + 'all' => $all, + 'outdated' => $outdated, + 'latestVersion' => $latestVersion, + ]) + ->shortSummary($outdated === 0 ? trans('admin/health.results.nodeversions.all_up_to_date') : trans('admin/health.results.nodeversions.outdated', ['outdated' => $outdated, 'all' => $all])); + + return $outdated === 0 + ? $result->ok(trans('admin/health.results.nodeversions.ok')) + : $result->failed(trans('admin/health.results.nodeversions.failed', ['outdated' => $outdated, 'all' => $all])); + } +} diff --git a/app/Checks/PanelVersionCheck.php b/app/Checks/PanelVersionCheck.php new file mode 100644 index 0000000000..f815a9a3bd --- /dev/null +++ b/app/Checks/PanelVersionCheck.php @@ -0,0 +1,34 @@ +versionService->isLatestPanel(); + $currentVersion = $this->versionService->currentPanelVersion(); + $latestVersion = $this->versionService->latestPanelVersion(); + + $result = Result::make() + ->meta([ + 'isLatest' => $isLatest, + 'currentVersion' => $currentVersion, + 'latestVersion' => $latestVersion, + ]) + ->shortSummary($isLatest ? trans('admin/health.results.panelversion.up_to_date') : trans('admin/health.results.panelversion.outdated')); + + return $isLatest + ? $result->ok(trans('admin/health.results.panelversion.ok')) + : $result->failed(trans('admin/health.results.panelversion.failed', [ + 'currentVersion' => $currentVersion, + 'latestVersion' => $latestVersion, + ])); + } +} diff --git a/app/Checks/ScheduleCheck.php b/app/Checks/ScheduleCheck.php new file mode 100644 index 0000000000..be75839144 --- /dev/null +++ b/app/Checks/ScheduleCheck.php @@ -0,0 +1,41 @@ +ok(trans('admin/health.results.schedule.ok')); + + $lastHeartbeatTimestamp = cache()->store($this->cacheStoreName)->get($this->cacheKey); + + if (!$lastHeartbeatTimestamp) { + return $result->failed(trans('admin/health.results.schedule.failed_not_ran')); + } + + $latestHeartbeatAt = Carbon::createFromTimestamp($lastHeartbeatTimestamp); + + $carbonVersion = InstalledVersions::getVersion('nesbot/carbon'); + + $minutesAgo = $latestHeartbeatAt->diffInMinutes(); + + if (version_compare($carbonVersion, + '3.0.0', '<')) { + $minutesAgo += 1; + } + + if ($minutesAgo > $this->heartbeatMaxAgeInMinutes) { + return $result->failed(trans('admin/health.results.schedule.failed_last_ran', [ + 'time' => $minutesAgo, + ])); + } + + return $result; + } +} diff --git a/app/Checks/UsedDiskSpaceCheck.php b/app/Checks/UsedDiskSpaceCheck.php new file mode 100644 index 0000000000..26879d11de --- /dev/null +++ b/app/Checks/UsedDiskSpaceCheck.php @@ -0,0 +1,16 @@ +filesystemName ?? '/'); + $totalSpace = disk_total_space($this->filesystemName ?? '/'); + + return 100 - ($freeSpace * 100 / $totalSpace); + } +} diff --git a/app/Console/Commands/Dev/GenerateTablerIconsEnum.php b/app/Console/Commands/Dev/GenerateTablerIconsEnum.php new file mode 100644 index 0000000000..abff562efd --- /dev/null +++ b/app/Console/Commands/Dev/GenerateTablerIconsEnum.php @@ -0,0 +1,48 @@ + $file->getExtension() === 'svg'); + + $enumContent = "getFilename(), PATHINFO_FILENAME); + + // Letter V is duplicate, as "letter-v" and "letter-letter-v" + if (str($filename)->contains('letter-letter')) { + continue; + } + + // Filled icons exist with "-f" and "-filled", we only want the later + if (str($filename)->endsWith('-f') && file_exists(base_path("vendor/secondnetwork/blade-tabler-icons/resources/svg/{$filename}illed.svg"))) { + continue; + } + + $caseName = str($filename)->title()->replace('-', ''); + $value = str($filename)->slug()->prepend('tabler-'); + + $enumContent .= " case $caseName = '$value';\n"; + } + + $enumContent .= "}\n"; + + File::put(base_path('app/Enums/TablerIcon.php'), $enumContent); + + $this->info('Enum generated'); + } +} diff --git a/app/Console/Commands/Egg/CheckEggUpdatesCommand.php b/app/Console/Commands/Egg/CheckEggUpdatesCommand.php new file mode 100644 index 0000000000..c50dceeb70 --- /dev/null +++ b/app/Console/Commands/Egg/CheckEggUpdatesCommand.php @@ -0,0 +1,64 @@ +check($egg, $exporterService); + } catch (Exception $exception) { + $this->error("$egg->name: Error ({$exception->getMessage()})"); + } + } + } + + /** @throws Exception */ + private function check(Egg $egg, EggExporterService $exporterService): void + { + if (is_null($egg->update_url)) { + $this->comment("$egg->name: Skipping (no update url set)"); + + return; + } + + $ext = strtolower(pathinfo(parse_url($egg->update_url, PHP_URL_PATH), PATHINFO_EXTENSION)); + $isYaml = in_array($ext, ['yaml', 'yml']); + + $local = $isYaml + ? Yaml::parse($exporterService->handle($egg->id, EggFormat::YAML)) + : json_decode($exporterService->handle($egg->id, EggFormat::JSON), true); + + $remote = Http::timeout(5)->connectTimeout(1)->get($egg->update_url); + + if ($remote->failed()) { + throw new Exception("HTTP request returned status code {$remote->status()}"); + } + + $remote = $remote->body(); + $remote = $isYaml ? Yaml::parse($remote) : json_decode($remote, true); + + unset($local['exported_at'], $remote['exported_at']); + + $localHash = md5(json_encode($local, JSON_THROW_ON_ERROR)); + $remoteHash = md5(json_encode($remote, JSON_THROW_ON_ERROR)); + + $status = $localHash === $remoteHash ? 'Up-to-date' : 'Found update'; + $this->{($localHash === $remoteHash) ? 'info' : 'warn'}("$egg->name: $status"); + + cache()->put("eggs.$egg->uuid.update", $localHash !== $remoteHash, now()->addHour()); + } +} diff --git a/app/Console/Commands/Egg/UpdateEggIndexCommand.php b/app/Console/Commands/Egg/UpdateEggIndexCommand.php new file mode 100644 index 0000000000..ee80a998c3 --- /dev/null +++ b/app/Console/Commands/Egg/UpdateEggIndexCommand.php @@ -0,0 +1,46 @@ +connectTimeout(1)->get('https://raw.githubusercontent.com/pelican-eggs/pelican-eggs.github.io/refs/heads/main/content/pelican.json')->throw()->json(); + } catch (Exception $exception) { + $this->error($exception->getMessage()); + + return 1; + } + + $index = []; + foreach ($data['nests'] as $nest) { + $nestName = $nest['nest_type']; + + $this->info("Nest: $nestName"); + + $nestEggs = []; + foreach ($nest['Eggs'] as $egg) { + $eggName = $egg['egg']['name']; + + $this->comment("Egg: $eggName"); + + $nestEggs[$egg['download_url']] = $eggName; + } + $index[$nestName] = $nestEggs; + + $this->info(''); + } + + cache()->forever('eggs.index', $index); + + return 0; + } +} diff --git a/app/Console/Commands/Environment/AppSettingsCommand.php b/app/Console/Commands/Environment/AppSettingsCommand.php index a16f381763..928c7c74e5 100644 --- a/app/Console/Commands/Environment/AppSettingsCommand.php +++ b/app/Console/Commands/Environment/AppSettingsCommand.php @@ -3,7 +3,6 @@ namespace App\Console\Commands\Environment; use Illuminate\Console\Command; -use Illuminate\Support\Facades\Artisan; class AppSettingsCommand extends Command { @@ -21,9 +20,13 @@ public function handle(): void if (!config('app.key')) { $this->comment('Generating app key'); - Artisan::call('key:generate'); + $this->call('key:generate'); } - Artisan::call('filament:optimize'); + $this->comment('Creating storage link'); + $this->call('storage:link'); + + $this->comment('Caching components & icons'); + $this->call('filament:optimize'); } } diff --git a/app/Console/Commands/Environment/CacheSettingsCommand.php b/app/Console/Commands/Environment/CacheSettingsCommand.php index 7837bea1de..2d69051121 100644 --- a/app/Console/Commands/Environment/CacheSettingsCommand.php +++ b/app/Console/Commands/Environment/CacheSettingsCommand.php @@ -27,8 +27,6 @@ class CacheSettingsCommand extends Command {--redis-pass= : Password used to connect to redis.} {--redis-port= : Port to connect to redis over.}'; - protected array $variables = []; - /** * CacheSettingsCommand constructor. */ diff --git a/app/Console/Commands/Environment/DatabaseSettingsCommand.php b/app/Console/Commands/Environment/DatabaseSettingsCommand.php index 570df0f2e5..0be9798bb0 100644 --- a/app/Console/Commands/Environment/DatabaseSettingsCommand.php +++ b/app/Console/Commands/Environment/DatabaseSettingsCommand.php @@ -6,6 +6,7 @@ use Illuminate\Console\Command; use Illuminate\Contracts\Console\Kernel; use Illuminate\Database\DatabaseManager; +use PDOException; class DatabaseSettingsCommand extends Command { @@ -27,6 +28,7 @@ class DatabaseSettingsCommand extends Command {--username= : Username to use when connecting to the MySQL/ MariaDB server.} {--password= : Password to use for the MySQL/ MariaDB database.}'; + /** @var array */ protected array $variables = []; /** @@ -57,7 +59,7 @@ public function handle(): int ); if ($this->variables['DB_CONNECTION'] === 'mysql') { - $this->output->note(__('commands.database_settings.DB_HOST_note')); + $this->output->note(trans('commands.database_settings.DB_HOST_note')); $this->variables['DB_HOST'] = $this->option('host') ?? $this->ask( 'Database Host', config('database.connections.mysql.host', '127.0.0.1') @@ -73,7 +75,7 @@ public function handle(): int config('database.connections.mysql.database', 'panel') ); - $this->output->note(__('commands.database_settings.DB_USERNAME_note')); + $this->output->note(trans('commands.database_settings.DB_USERNAME_note')); $this->variables['DB_USERNAME'] = $this->option('username') ?? $this->ask( 'Database Username', config('database.connections.mysql.username', 'pelican') @@ -82,7 +84,7 @@ public function handle(): int $askForMySQLPassword = true; if (!empty(config('database.connections.mysql.password')) && $this->input->isInteractive()) { $this->variables['DB_PASSWORD'] = config('database.connections.mysql.password'); - $askForMySQLPassword = $this->confirm(__('commands.database_settings.DB_PASSWORD_note')); + $askForMySQLPassword = $this->confirm(trans('commands.database_settings.DB_PASSWORD_note')); } if ($askForMySQLPassword) { @@ -104,11 +106,11 @@ public function handle(): int ]); $this->database->connection('_panel_command_test')->getPdo(); - } catch (\PDOException $exception) { + } catch (PDOException $exception) { $this->output->error(sprintf('Unable to connect to the MySQL server using the provided credentials. The error returned was "%s".', $exception->getMessage())); - $this->output->error(__('commands.database_settings.DB_error_2')); + $this->output->error(trans('commands.database_settings.DB_error_2')); - if ($this->confirm(__('commands.database_settings.go_back'))) { + if ($this->confirm(trans('commands.database_settings.go_back'))) { $this->database->disconnect('_panel_command_test'); return $this->handle(); @@ -117,7 +119,7 @@ public function handle(): int return 1; } } elseif ($this->variables['DB_CONNECTION'] === 'mariadb') { - $this->output->note(__('commands.database_settings.DB_HOST_note')); + $this->output->note(trans('commands.database_settings.DB_HOST_note')); $this->variables['DB_HOST'] = $this->option('host') ?? $this->ask( 'Database Host', config('database.connections.mariadb.host', '127.0.0.1') @@ -133,7 +135,7 @@ public function handle(): int config('database.connections.mariadb.database', 'panel') ); - $this->output->note(__('commands.database_settings.DB_USERNAME_note')); + $this->output->note(trans('commands.database_settings.DB_USERNAME_note')); $this->variables['DB_USERNAME'] = $this->option('username') ?? $this->ask( 'Database Username', config('database.connections.mariadb.username', 'pelican') @@ -142,7 +144,7 @@ public function handle(): int $askForMariaDBPassword = true; if (!empty(config('database.connections.mariadb.password')) && $this->input->isInteractive()) { $this->variables['DB_PASSWORD'] = config('database.connections.mariadb.password'); - $askForMariaDBPassword = $this->confirm(__('commands.database_settings.DB_PASSWORD_note')); + $askForMariaDBPassword = $this->confirm(trans('commands.database_settings.DB_PASSWORD_note')); } if ($askForMariaDBPassword) { @@ -164,11 +166,11 @@ public function handle(): int ]); $this->database->connection('_panel_command_test')->getPdo(); - } catch (\PDOException $exception) { + } catch (PDOException $exception) { $this->output->error(sprintf('Unable to connect to the MariaDB server using the provided credentials. The error returned was "%s".', $exception->getMessage())); - $this->output->error(__('commands.database_settings.DB_error_2')); + $this->output->error(trans('commands.database_settings.DB_error_2')); - if ($this->confirm(__('commands.database_settings.go_back'))) { + if ($this->confirm(trans('commands.database_settings.go_back'))) { $this->database->disconnect('_panel_command_test'); return $this->handle(); @@ -179,7 +181,7 @@ public function handle(): int } elseif ($this->variables['DB_CONNECTION'] === 'sqlite') { $this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask( 'Database Path', - env('DB_DATABASE', 'database.sqlite') + (string) env('DB_DATABASE', 'database.sqlite') ); } diff --git a/app/Console/Commands/Environment/EmailSettingsCommand.php b/app/Console/Commands/Environment/EmailSettingsCommand.php index 87c8186c14..922c5bedbb 100644 --- a/app/Console/Commands/Environment/EmailSettingsCommand.php +++ b/app/Console/Commands/Environment/EmailSettingsCommand.php @@ -2,6 +2,7 @@ namespace App\Console\Commands\Environment; +use App\Exceptions\PanelException; use App\Traits\EnvironmentWriterTrait; use Illuminate\Console\Command; @@ -22,12 +23,13 @@ class EmailSettingsCommand extends Command {--username=} {--password=}'; + /** @var array */ protected array $variables = []; /** * Handle command execution. * - * @throws \App\Exceptions\PanelException + * @throws PanelException */ public function handle(): void { @@ -70,7 +72,7 @@ public function handle(): void /** * Handle variables for SMTP driver. */ - private function setupSmtpDriverVariables() + private function setupSmtpDriverVariables(): void { $this->variables['MAIL_HOST'] = $this->option('host') ?? $this->ask( trans('command/messages.environment.mail.ask_smtp_host'), @@ -91,7 +93,7 @@ private function setupSmtpDriverVariables() trans('command/messages.environment.mail.ask_smtp_password') ); - $this->variables['MAIL_ENCRYPTION'] = $this->option('encryption') ?? $this->choice( + $this->variables['MAIL_SCHEME'] = $this->option('encryption') ?? $this->choice( trans('command/messages.environment.mail.ask_encryption'), ['tls' => 'TLS', 'ssl' => 'SSL', '' => 'None'], config('mail.mailers.smtp.encryption', 'tls') @@ -101,7 +103,7 @@ private function setupSmtpDriverVariables() /** * Handle variables for mailgun driver. */ - private function setupMailgunDriverVariables() + private function setupMailgunDriverVariables(): void { $this->variables['MAILGUN_DOMAIN'] = $this->option('host') ?? $this->ask( trans('command/messages.environment.mail.ask_mailgun_domain'), @@ -122,7 +124,7 @@ private function setupMailgunDriverVariables() /** * Handle variables for mandrill driver. */ - private function setupMandrillDriverVariables() + private function setupMandrillDriverVariables(): void { $this->variables['MANDRILL_SECRET'] = $this->option('password') ?? $this->ask( trans('command/messages.environment.mail.ask_mandrill_secret'), @@ -133,7 +135,7 @@ private function setupMandrillDriverVariables() /** * Handle variables for postmark driver. */ - private function setupPostmarkDriverVariables() + private function setupPostmarkDriverVariables(): void { $this->variables['MAIL_DRIVER'] = 'smtp'; $this->variables['MAIL_HOST'] = 'smtp.postmarkapp.com'; diff --git a/app/Console/Commands/Environment/QueueSettingsCommand.php b/app/Console/Commands/Environment/QueueSettingsCommand.php index f8b667402d..59fbe76eaf 100644 --- a/app/Console/Commands/Environment/QueueSettingsCommand.php +++ b/app/Console/Commands/Environment/QueueSettingsCommand.php @@ -27,8 +27,6 @@ class QueueSettingsCommand extends Command {--redis-pass= : Password used to connect to redis.} {--redis-port= : Port to connect to redis over.}'; - protected array $variables = []; - /** * QueueSettingsCommand constructor. */ diff --git a/app/Console/Commands/Environment/QueueWorkerServiceCommand.php b/app/Console/Commands/Environment/QueueWorkerServiceCommand.php index dbf1aa7354..23fdff40ac 100644 --- a/app/Console/Commands/Environment/QueueWorkerServiceCommand.php +++ b/app/Console/Commands/Environment/QueueWorkerServiceCommand.php @@ -18,10 +18,21 @@ class QueueWorkerServiceCommand extends Command public function handle(): void { + if (@file_exists('/.dockerenv')) { + $result = Process::run('supervisorctl restart queue-worker'); + if ($result->failed()) { + $this->error('Error restarting service: ' . $result->errorOutput()); + + return; + } + $this->line('Queue worker service file updated successfully.'); + + return; + } $serviceName = $this->option('service-name') ?? $this->ask('Queue worker service name', 'pelican-queue'); $path = '/etc/systemd/system/' . $serviceName . '.service'; - $fileExists = file_exists($path); + $fileExists = @file_exists($path); if ($fileExists && !$this->option('overwrite') && !$this->confirm('The service file already exists. Do you want to overwrite it?')) { $this->line('Creation of queue worker service file aborted because service file already exists.'); diff --git a/app/Console/Commands/Environment/RedisSetupCommand.php b/app/Console/Commands/Environment/RedisSetupCommand.php index 281a97bac9..39dbf2ad57 100644 --- a/app/Console/Commands/Environment/RedisSetupCommand.php +++ b/app/Console/Commands/Environment/RedisSetupCommand.php @@ -20,8 +20,6 @@ class RedisSetupCommand extends Command {--redis-pass= : Password used to connect to redis.} {--redis-port= : Port to connect to redis over.}'; - protected array $variables = []; - /** * RedisSetupCommand constructor. */ @@ -37,7 +35,7 @@ public function handle(): int { $this->variables['CACHE_STORE'] = 'redis'; $this->variables['QUEUE_CONNECTION'] = 'redis'; - $this->variables['SESSION_DRIVERS'] = 'redis'; + $this->variables['SESSION_DRIVER'] = 'redis'; $this->requestRedisSettings(); diff --git a/app/Console/Commands/Environment/SessionSettingsCommand.php b/app/Console/Commands/Environment/SessionSettingsCommand.php index be99686f4e..61e0a58297 100644 --- a/app/Console/Commands/Environment/SessionSettingsCommand.php +++ b/app/Console/Commands/Environment/SessionSettingsCommand.php @@ -28,8 +28,6 @@ class SessionSettingsCommand extends Command {--redis-pass= : Password used to connect to redis.} {--redis-port= : Port to connect to redis over.}'; - protected array $variables = []; - /** * SessionSettingsCommand constructor. */ diff --git a/app/Console/Commands/InfoCommand.php b/app/Console/Commands/InfoCommand.php index c093259e07..24dceb5cfb 100644 --- a/app/Console/Commands/InfoCommand.php +++ b/app/Console/Commands/InfoCommand.php @@ -3,7 +3,6 @@ namespace App\Console\Commands; use Illuminate\Console\Command; -use App\Services\Helpers\SoftwareVersionService; class InfoCommand extends Command { @@ -11,98 +10,8 @@ class InfoCommand extends Command protected $signature = 'p:info'; - /** - * InfoCommand constructor. - */ - public function __construct(private SoftwareVersionService $versionService) - { - parent::__construct(); - } - - /** - * Handle execution of command. - */ public function handle(): void { - $this->output->title('Version Information'); - $this->table([], [ - ['Panel Version', $this->versionService->versionData()['version']], - ['Latest Version', $this->versionService->getPanel()], - ['Up-to-Date', $this->versionService->isLatestPanel() ? 'Yes' : $this->formatText('No', 'bg=red')], - ], 'compact'); - - $this->output->title('Application Configuration'); - $this->table([], [ - ['Environment', config('app.env') === 'production' ? config('app.env') : $this->formatText(config('app.env'), 'bg=red')], - ['Debug Mode', config('app.debug') ? $this->formatText('Yes', 'bg=red') : 'No'], - ['Application Name', config('app.name')], - ['Application URL', config('app.url')], - ['Installation Directory', base_path()], - ['Cache Driver', config('cache.default')], - ['Queue Driver', config('queue.default') === 'sync' ? $this->formatText(config('queue.default'), 'bg=red') : config('queue.default')], - ['Session Driver', config('session.driver')], - ['Filesystem Driver', config('filesystems.default')], - ], 'compact'); - - $this->output->title('Database Configuration'); - $driver = config('database.default'); - if ($driver === 'sqlite') { - $this->table([], [ - ['Driver', $driver], - ['Database', config("database.connections.$driver.database")], - ], 'compact'); - } else { - $this->table([], [ - ['Driver', $driver], - ['Host', config("database.connections.$driver.host")], - ['Port', config("database.connections.$driver.port")], - ['Database', config("database.connections.$driver.database")], - ['Username', config("database.connections.$driver.username")], - ], 'compact'); - } - - $this->output->title('Email Configuration'); - $driver = config('mail.default'); - if ($driver === 'smtp') { - $this->table([], [ - ['Driver', $driver], - ['Host', config("mail.mailers.$driver.host")], - ['Port', config("mail.mailers.$driver.port")], - ['Username', config("mail.mailers.$driver.username")], - ['Encryption', config("mail.mailers.$driver.encryption")], - ['From Address', config('mail.from.address')], - ['From Name', config('mail.from.name')], - ], 'compact'); - } else { - $this->table([], [ - ['Driver', $driver], - ['From Address', config('mail.from.address')], - ['From Name', config('mail.from.name')], - ], 'compact'); - } - - $this->output->title('Backup Configuration'); - $driver = config('backups.default'); - if ($driver === 's3') { - $this->table([], [ - ['Driver', $driver], - ['Region', config("backups.disks.$driver.region")], - ['Bucket', config("backups.disks.$driver.bucket")], - ['Endpoint', config("backups.disks.$driver.endpoint")], - ['Use path style endpoint', config("backups.disks.$driver.use_path_style_endpoint") ? 'Yes' : 'No'], - ], 'compact'); - } else { - $this->table([], [ - ['Driver', $driver], - ], 'compact'); - } - } - - /** - * Format output in a Name: Value manner. - */ - private function formatText(string $value, string $opts = ''): string - { - return sprintf('<%s>%s', $opts, $value); + $this->call('about'); } } diff --git a/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php b/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php index 7a54c0b54e..876c9fce97 100644 --- a/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php +++ b/app/Console/Commands/Maintenance/CleanServiceBackupFilesCommand.php @@ -4,8 +4,9 @@ use Carbon\Carbon; use Illuminate\Console\Command; -use Illuminate\Contracts\Filesystem\Filesystem; use Illuminate\Contracts\Filesystem\Factory as FilesystemFactory; +use Illuminate\Contracts\Filesystem\Filesystem; +use SplFileInfo; class CleanServiceBackupFilesCommand extends Command { @@ -32,9 +33,10 @@ public function __construct(FilesystemFactory $filesystem) */ public function handle(): void { + /** @var SplFileInfo[] */ $files = $this->disk->files('services/.bak'); - collect($files)->each(function (\SplFileInfo $file) { + collect($files)->each(function ($file) { $lastModified = Carbon::createFromTimestamp($this->disk->lastModified($file->getPath())); if ($lastModified->diffInMinutes(Carbon::now()) > self::BACKUP_THRESHOLD_MINUTES) { $this->disk->delete($file->getPath()); diff --git a/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php b/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php index 90880e9478..9cb49f6436 100644 --- a/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php +++ b/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php @@ -5,6 +5,7 @@ use App\Models\Backup; use Carbon\CarbonImmutable; use Illuminate\Console\Command; +use InvalidArgumentException; class PruneOrphanedBackupsCommand extends Command { @@ -16,7 +17,7 @@ public function handle(): void { $since = $this->option('prune-age') ?? config('backups.prune_age', 360); if (!$since || !is_digit($since)) { - throw new \InvalidArgumentException('The "--prune-age" argument must be a value greater than 0.'); + throw new InvalidArgumentException('The "--prune-age" argument must be a value greater than 0.'); } $query = Backup::query() diff --git a/app/Console/Commands/Node/MakeNodeCommand.php b/app/Console/Commands/Node/MakeNodeCommand.php index f78f73c252..82c01647fe 100644 --- a/app/Console/Commands/Node/MakeNodeCommand.php +++ b/app/Console/Commands/Node/MakeNodeCommand.php @@ -2,8 +2,9 @@ namespace App\Console\Commands\Node; +use App\Exceptions\Model\DataValidationException; +use App\Models\Node; use Illuminate\Console\Command; -use App\Services\Nodes\NodeCreationService; class MakeNodeCommand extends Command { @@ -24,52 +25,46 @@ class MakeNodeCommand extends Command {--overallocateCpu= : Enter the amount of cpu to overallocate (% or -1 to overallocate the maximum).} {--uploadSize= : Enter the maximum upload filesize.} {--daemonListeningPort= : Enter the daemon listening port.} + {--daemonConnectingPort= : Enter the daemon connecting port.} {--daemonSFTPPort= : Enter the daemon SFTP listening port.} {--daemonSFTPAlias= : Enter the daemon SFTP alias.} {--daemonBase= : Enter the base folder.}'; protected $description = 'Creates a new node on the system via the CLI.'; - /** - * MakeNodeCommand constructor. - */ - public function __construct(private NodeCreationService $creationService) - { - parent::__construct(); - } - /** * Handle the command execution process. * - * @throws \App\Exceptions\Model\DataValidationException + * @throws DataValidationException */ public function handle(): void { - $data['name'] = $this->option('name') ?? $this->ask(__('commands.make_node.name')); - $data['description'] = $this->option('description') ?? $this->ask(__('commands.make_node.description')); + $data['name'] = $this->option('name') ?? $this->ask(trans('commands.make_node.name')); + $data['description'] = $this->option('description') ?? $this->ask(trans('commands.make_node.description')); $data['scheme'] = $this->option('scheme') ?? $this->anticipate( - __('commands.make_node.scheme'), + trans('commands.make_node.scheme'), ['https', 'http'], 'https' ); - $data['fqdn'] = $this->option('fqdn') ?? $this->ask(__('commands.make_node.fqdn')); - $data['public'] = $this->option('public') ?? $this->confirm(__('commands.make_node.public'), true); - $data['behind_proxy'] = $this->option('proxy') ?? $this->confirm(__('commands.make_node.behind_proxy')); - $data['maintenance_mode'] = $this->option('maintenance') ?? $this->confirm(__('commands.make_node.maintenance_mode')); - $data['memory'] = $this->option('maxMemory') ?? $this->ask(__('commands.make_node.memory'), '0'); - $data['memory_overallocate'] = $this->option('overallocateMemory') ?? $this->ask(__('commands.make_node.memory_overallocate'), '-1'); - $data['disk'] = $this->option('maxDisk') ?? $this->ask(__('commands.make_node.disk'), '0'); - $data['disk_overallocate'] = $this->option('overallocateDisk') ?? $this->ask(__('commands.make_node.disk_overallocate'), '-1'); - $data['cpu'] = $this->option('maxCpu') ?? $this->ask(__('commands.make_node.cpu'), '0'); - $data['cpu_overallocate'] = $this->option('overallocateCpu') ?? $this->ask(__('commands.make_node.cpu_overallocate'), '-1'); - $data['upload_size'] = $this->option('uploadSize') ?? $this->ask(__('commands.make_node.upload_size'), '256'); - $data['daemon_listen'] = $this->option('daemonListeningPort') ?? $this->ask(__('commands.make_node.daemonListen'), '8080'); - $data['daemon_sftp'] = $this->option('daemonSFTPPort') ?? $this->ask(__('commands.make_node.daemonSFTP'), '2022'); - $data['daemon_sftp_alias'] = $this->option('daemonSFTPAlias') ?? $this->ask(__('commands.make_node.daemonSFTPAlias'), ''); - $data['daemon_base'] = $this->option('daemonBase') ?? $this->ask(__('commands.make_node.daemonBase'), '/var/lib/pelican/volumes'); + $data['fqdn'] = $this->option('fqdn') ?? $this->ask(trans('commands.make_node.fqdn')); + $data['public'] = $this->option('public') ?? $this->confirm(trans('commands.make_node.public'), true); + $data['behind_proxy'] = $this->option('proxy') ?? $this->confirm(trans('commands.make_node.behind_proxy')); + $data['maintenance_mode'] = $this->option('maintenance') ?? $this->confirm(trans('commands.make_node.maintenance_mode')); + $data['memory'] = $this->option('maxMemory') ?? $this->ask(trans('commands.make_node.memory'), '0'); + $data['memory_overallocate'] = $this->option('overallocateMemory') ?? $this->ask(trans('commands.make_node.memory_overallocate'), '-1'); + $data['disk'] = $this->option('maxDisk') ?? $this->ask(trans('commands.make_node.disk'), '0'); + $data['disk_overallocate'] = $this->option('overallocateDisk') ?? $this->ask(trans('commands.make_node.disk_overallocate'), '-1'); + $data['cpu'] = $this->option('maxCpu') ?? $this->ask(trans('commands.make_node.cpu'), '0'); + $data['cpu_overallocate'] = $this->option('overallocateCpu') ?? $this->ask(trans('commands.make_node.cpu_overallocate'), '-1'); + $data['upload_size'] = $this->option('uploadSize') ?? $this->ask(trans('commands.make_node.upload_size'), '256'); + $data['daemon_listen'] = $this->option('daemonListeningPort') ?? $this->ask(trans('commands.make_node.daemonListen'), '8080'); + $data['daemon_connect'] = $this->option('daemonConnectingPort') ?? $this->ask(trans('commands.make_node.daemonConnect'), '8080'); + $data['daemon_sftp'] = $this->option('daemonSFTPPort') ?? $this->ask(trans('commands.make_node.daemonSFTP'), '2022'); + $data['daemon_sftp_alias'] = $this->option('daemonSFTPAlias') ?? $this->ask(trans('commands.make_node.daemonSFTPAlias'), ''); + $data['daemon_base'] = $this->option('daemonBase') ?? $this->ask(trans('commands.make_node.daemonBase'), '/var/lib/pelican/volumes'); - $node = $this->creationService->handle($data); - $this->line(__('commands.make_node.success', ['name' => $data['name'], 'id' => $node->id])); + $node = Node::create($data); + $this->line(trans('commands.make_node.success', ['name' => $data['name'], 'id' => $node->id])); } } diff --git a/app/Console/Commands/Node/NodeConfigurationCommand.php b/app/Console/Commands/Node/NodeConfigurationCommand.php index 44c2ec22bf..b95839c171 100644 --- a/app/Console/Commands/Node/NodeConfigurationCommand.php +++ b/app/Console/Commands/Node/NodeConfigurationCommand.php @@ -17,16 +17,16 @@ public function handle(): int { $column = ctype_digit((string) $this->argument('node')) ? 'id' : 'uuid'; - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = Node::query()->where($column, $this->argument('node'))->firstOr(function () { - $this->error(__('commands.node_config.error_not_exist')); + $this->error(trans('commands.node_config.error_not_exist')); exit(1); }); $format = $this->option('format'); if (!in_array($format, ['yaml', 'yml', 'json'])) { - $this->error(__('commands.node_config.error_invalid_format')); + $this->error(trans('commands.node_config.error_invalid_format')); return 1; } diff --git a/app/Console/Commands/Overrides/ConfigCacheCommand.php b/app/Console/Commands/Overrides/ConfigCacheCommand.php new file mode 100644 index 0000000000..1732b26c96 --- /dev/null +++ b/app/Console/Commands/Overrides/ConfigCacheCommand.php @@ -0,0 +1,19 @@ +components->warn('Configuration caching has been disabled.'); + + $this->line(' Reason: This application uses dynamic plugins. Caching config'); + $this->line(' prevents /plugins/config/*.php files from being loaded correctly.'); + } +} diff --git a/app/Console/Commands/Overrides/KeyGenerateCommand.php b/app/Console/Commands/Overrides/KeyGenerateCommand.php index c1528de692..3f8c886cf2 100644 --- a/app/Console/Commands/Overrides/KeyGenerateCommand.php +++ b/app/Console/Commands/Overrides/KeyGenerateCommand.php @@ -13,12 +13,12 @@ class KeyGenerateCommand extends BaseKeyGenerateCommand public function handle(): void { if (!empty(config('app.key')) && $this->input->isInteractive()) { - $this->output->warning(__('commands.key_generate.error_already_exist')); - if (!$this->confirm(__('commands.key_generate.understand'))) { + $this->output->warning(trans('commands.key_generate.error_already_exist')); + if (!$this->confirm(trans('commands.key_generate.understand'))) { return; } - if (!$this->confirm(__('commands.key_generate.continue'))) { + if (!$this->confirm(trans('commands.key_generate.continue'))) { return; } } diff --git a/app/Console/Commands/Overrides/OptimizeCommand.php b/app/Console/Commands/Overrides/OptimizeCommand.php new file mode 100644 index 0000000000..8956682bb0 --- /dev/null +++ b/app/Console/Commands/Overrides/OptimizeCommand.php @@ -0,0 +1,18 @@ + + */ + protected function getOptimizeTasks() + { + return array_except(parent::getOptimizeTasks(), 'config'); + } +} diff --git a/app/Console/Commands/Plugin/ComposerPluginsCommand.php b/app/Console/Commands/Plugin/ComposerPluginsCommand.php new file mode 100644 index 0000000000..c1668f6dae --- /dev/null +++ b/app/Console/Commands/Plugin/ComposerPluginsCommand.php @@ -0,0 +1,25 @@ +manageComposerPackages(); + } catch (Exception $exception) { + report($exception); + + $this->error($exception->getMessage()); + } + } +} diff --git a/app/Console/Commands/Plugin/DisablePluginCommand.php b/app/Console/Commands/Plugin/DisablePluginCommand.php new file mode 100644 index 0000000000..5d6684ad25 --- /dev/null +++ b/app/Console/Commands/Plugin/DisablePluginCommand.php @@ -0,0 +1,37 @@ +argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); + + $plugin = Plugin::find(str($id)->lower()->toString()); + + if (!$plugin) { + $this->error('Plugin does not exist!'); + + return; + } + + if (!$plugin->canDisable()) { + $this->error("Plugin can't be disabled!"); + + return; + } + + $pluginService->disablePlugin($plugin); + + $this->info('Plugin disabled.'); + } +} diff --git a/app/Console/Commands/Plugin/InstallPluginCommand.php b/app/Console/Commands/Plugin/InstallPluginCommand.php new file mode 100644 index 0000000000..67b3ccacbe --- /dev/null +++ b/app/Console/Commands/Plugin/InstallPluginCommand.php @@ -0,0 +1,43 @@ +argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); + + $plugin = Plugin::find(str($id)->lower()->toString()); + + if (!$plugin) { + $this->error('Plugin does not exist!'); + + return; + } + + if ($plugin->status !== PluginStatus::NotInstalled) { + $this->error('Plugin is already installed!'); + + return; + } + + try { + $pluginService->installPlugin($plugin); + + $this->info('Plugin installed and enabled.'); + } catch (Exception $exception) { + $this->error('Could not install plugin: ' . $exception->getMessage()); + } + } +} diff --git a/app/Console/Commands/Plugin/ListPluginsCommand.php b/app/Console/Commands/Plugin/ListPluginsCommand.php new file mode 100644 index 0000000000..9173910c1f --- /dev/null +++ b/app/Console/Commands/Plugin/ListPluginsCommand.php @@ -0,0 +1,28 @@ +get(['name', 'author', 'status', 'version', 'panels', 'category']); + + if (count($plugins) < 1) { + $this->warn('No plugins installed'); + + return; + } + + $this->table(['Name', 'Author', 'Status', 'Version', 'Panels', 'Category'], $plugins->toArray()); + + $this->output->newLine(); + } +} diff --git a/app/Console/Commands/Plugin/MakePluginCommand.php b/app/Console/Commands/Plugin/MakePluginCommand.php new file mode 100644 index 0000000000..a8f2eb1d46 --- /dev/null +++ b/app/Console/Commands/Plugin/MakePluginCommand.php @@ -0,0 +1,135 @@ +option('name') ?? $this->ask('Name'); + $name = preg_replace('/[^A-Za-z0-9 ]/', '', Str::ascii($name)); + + $id = Str::slug($name); + + if ($this->filesystem->exists(plugin_path($id))) { + $this->error('Plugin with that name already exists!'); + + return; + } + + $author = $this->option('author') ?? $this->ask('Author', cache('plugin.author')); + $author = preg_replace('/[^A-Za-z0-9 ]/', '', Str::ascii($author)); + cache()->forever('plugin.author', $author); + + $namespace = Str::studly($author) . '\\' . Str::studly($name); + $class = Str::studly($name . 'Plugin'); + + if (class_exists('\\' . $namespace . '\\' . $class)) { + $this->error('Plugin class with that name already exists!'); + + return; + } + + $this->info('Creating Plugin "' . $name . '" (' . $id . ') by ' . $author); + + $description = $this->option('description') ?? $this->ask('Description (can be empty)'); + + $category = $this->option('category') ?? $this->choice('Category', collect(PluginCategory::cases())->mapWithKeys(fn (PluginCategory $category) => [$category->value => $category->getLabel()])->toArray(), PluginCategory::Plugin->value); + + if (!PluginCategory::tryFrom($category)) { + $this->error('Unknown plugin category!'); + + return; + } + + $url = $this->option('url') ?? $this->ask('URL (can be empty)'); + $updateUrl = $this->option('updateUrl') ?? $this->ask('Update URL (can be empty)'); + + $panels = $this->option('panels'); + if (!$panels) { + if ($this->confirm('Should the plugin be available on all panels?', true)) { + $panels = null; + } else { + $panels = $this->choice('Panels (comma separated list)', [ + 'admin' => 'Admin Area', + 'server' => 'Client Area', + 'app' => 'Server List', + ], multiple: true); + } + } + $panels = is_string($panels) ? explode(',', $panels) : $panels; + + $panelVersion = $this->option('panelVersion'); + if (!$panelVersion) { + $panelVersion = $this->ask('Required panel version (leave empty for no constraint)', config('app.version') === 'canary' ? null : config('app.version')); + + if ($panelVersion && $this->confirm("Should the version constraint be minimal instead of strict? ($panelVersion or higher instead of only $panelVersion)")) { + $panelVersion = "^$panelVersion"; + } + } + + $composerPackages = null; + // TODO: ask for composer packages? + + // Create base directory + $this->filesystem->makeDirectory(plugin_path($id)); + + // Write plugin.json + $this->filesystem->put(plugin_path($id, 'plugin.json'), json_encode([ + 'id' => $id, + 'name' => $name, + 'author' => $author, + 'version' => '1.0.0', + 'description' => $description, + 'category' => $category, + 'url' => $url, + 'update_url' => $updateUrl, + 'namespace' => $namespace, + 'class' => $class, + 'panels' => $panels, + 'panel_version' => $panelVersion, + 'composer_packages' => $composerPackages, + 'meta' => [ + 'status' => PluginStatus::Enabled, + 'status_message' => null, + ], + ], JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + + // Create src directory and create main class + $this->filesystem->makeDirectory(plugin_path($id, 'src')); + $this->filesystem->put(plugin_path($id, 'src', $class . '.php'), Str::replace(['$namespace$', '$class$', '$id$'], [$namespace, $class, $id], file_get_contents(__DIR__ . '/Plugin.stub'))); + + // Create Providers directory and create service provider + $this->filesystem->makeDirectory(plugin_path($id, 'src', 'Providers')); + $this->filesystem->put(plugin_path($id, 'src', 'Providers', $class . 'Provider.php'), Str::replace(['$namespace$', '$class$'], [$namespace, $class], file_get_contents(__DIR__ . '/PluginProvider.stub'))); + + // Create config directory and create config file + $this->filesystem->makeDirectory(plugin_path($id, 'config')); + $this->filesystem->put(plugin_path($id, 'config', $id . '.php'), Str::replace(['$name$'], [$name], file_get_contents(__DIR__ . '/PluginConfig.stub'))); + + $this->info('Plugin created.'); + } +} diff --git a/app/Console/Commands/Plugin/Plugin.stub b/app/Console/Commands/Plugin/Plugin.stub new file mode 100644 index 0000000000..ab6ba7233b --- /dev/null +++ b/app/Console/Commands/Plugin/Plugin.stub @@ -0,0 +1,25 @@ +argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); + + $plugin = Plugin::find(str($id)->lower()->toString()); + + if (!$plugin) { + $this->error('Plugin does not exist!'); + + return; + } + + if ($plugin->status === PluginStatus::NotInstalled) { + $this->error('Plugin is not installed!'); + + return; + } + + $deleteFiles = $this->option('delete'); + if ($this->input->isInteractive() && !$deleteFiles) { + $deleteFiles = $this->confirm('Do you also want to delete the plugin files?'); + } + + try { + $pluginService->uninstallPlugin($plugin, $deleteFiles); + + $this->info('Plugin uninstalled' . ($deleteFiles ? ' and files deleted' : '') . '.'); + } catch (Exception $exception) { + $this->error('Could not uninstall plugin: ' . $exception->getMessage()); + } + } +} diff --git a/app/Console/Commands/Plugin/UpdatePluginCommand.php b/app/Console/Commands/Plugin/UpdatePluginCommand.php new file mode 100644 index 0000000000..75dc8208f0 --- /dev/null +++ b/app/Console/Commands/Plugin/UpdatePluginCommand.php @@ -0,0 +1,42 @@ +argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); + + $plugin = Plugin::find(str($id)->lower()->toString()); + + if (!$plugin) { + $this->error('Plugin does not exist!'); + + return; + } + + if (!$plugin->isUpdateAvailable()) { + $this->error("Plugin doesn't need updating!"); + + return; + } + + try { + $pluginService->updatePlugin($plugin); + + $this->info('Plugin updated.'); + } catch (Exception $exception) { + $this->error('Could not update plugin: ' . $exception->getMessage()); + } + } +} diff --git a/app/Console/Commands/Schedule/ProcessRunnableCommand.php b/app/Console/Commands/Schedule/ProcessRunnableCommand.php index d1d71ae024..8a0cdb385b 100644 --- a/app/Console/Commands/Schedule/ProcessRunnableCommand.php +++ b/app/Console/Commands/Schedule/ProcessRunnableCommand.php @@ -2,11 +2,11 @@ namespace App\Console\Commands\Schedule; -use Illuminate\Console\Command; use App\Models\Schedule; -use Illuminate\Database\Eloquent\Builder; use App\Services\Schedules\ProcessScheduleService; -use Carbon\Carbon; +use Illuminate\Console\Command; +use Illuminate\Database\Eloquent\Builder; +use Throwable; class ProcessRunnableCommand extends Command { @@ -14,21 +14,18 @@ class ProcessRunnableCommand extends Command protected $description = 'Process schedules in the database and determine which are ready to run.'; - /** - * Handle command execution. - */ - public function handle(): int + public function handle(ProcessScheduleService $processScheduleService): int { $schedules = Schedule::query() ->with('tasks') ->whereRelation('server', fn (Builder $builder) => $builder->whereNull('status')) ->where('is_active', true) ->where('is_processing', false) - ->where('next_run_at', '<=', Carbon::now()->toDateTimeString()) + ->where('next_run_at', '<=', now('UTC')->toDateTimeString()) ->get(); if ($schedules->count() < 1) { - $this->line(__('commands.schedule.process.no_tasks')); + $this->line(trans('commands.schedule.process.no_tasks')); return 0; } @@ -36,7 +33,7 @@ public function handle(): int $bar = $this->output->createProgressBar(count($schedules)); foreach ($schedules as $schedule) { $bar->clear(); - $this->processSchedule($schedule); + $this->processSchedule($processScheduleService, $schedule); $bar->advance(); $bar->display(); } @@ -51,23 +48,23 @@ public function handle(): int * never throw an exception out, otherwise you'll end up killing the entire run group causing * any other schedules to not process correctly. */ - protected function processSchedule(Schedule $schedule) + protected function processSchedule(ProcessScheduleService $processScheduleService, Schedule $schedule): void { if ($schedule->tasks->isEmpty()) { return; } try { - $this->getLaravel()->make(ProcessScheduleService::class)->handle($schedule); + $processScheduleService->handle($schedule); $this->line(trans('command/messages.schedule.output_line', [ 'schedule' => $schedule->name, 'id' => $schedule->id, ])); - } catch (\Throwable|\Exception $exception) { + } catch (Throwable $exception) { logger()->error($exception, ['schedule_id' => $schedule->id]); - $this->error(__('commands.schedule.process.no_tasks') . " #$schedule->id: " . $exception->getMessage()); + $this->error(trans('commands.schedule.process.error_message', ['schedules' => " #$schedule->id: " . $exception->getMessage()])); } } } diff --git a/app/Console/Commands/Server/BulkPowerActionCommand.php b/app/Console/Commands/Server/BulkPowerActionCommand.php index 4f95278feb..3774228e91 100644 --- a/app/Console/Commands/Server/BulkPowerActionCommand.php +++ b/app/Console/Commands/Server/BulkPowerActionCommand.php @@ -3,12 +3,12 @@ namespace App\Console\Commands\Server; use App\Models\Server; +use App\Repositories\Daemon\DaemonServerRepository; +use Exception; use Illuminate\Console\Command; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Validation\ValidationException; use Illuminate\Validation\Factory as ValidatorFactory; -use App\Repositories\Daemon\DaemonPowerRepository; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Illuminate\Validation\ValidationException; class BulkPowerActionCommand extends Command { @@ -19,26 +19,13 @@ class BulkPowerActionCommand extends Command protected $description = 'Perform bulk power management on large groupings of servers or nodes at once.'; - /** - * BulkPowerActionCommand constructor. - */ - public function __construct(private DaemonPowerRepository $powerRepository, private ValidatorFactory $validator) - { - parent::__construct(); - } - - /** - * Handle the bulk power request. - * - * @throws \Illuminate\Validation\ValidationException - */ - public function handle(): void + public function handle(DaemonServerRepository $serverRepository, ValidatorFactory $validator): void { $action = $this->argument('action'); $nodes = empty($this->option('nodes')) ? [] : explode(',', $this->option('nodes')); $servers = empty($this->option('servers')) ? [] : explode(',', $this->option('servers')); - $validator = $this->validator->make([ + $validator = $validator->make([ 'action' => $action, 'nodes' => $nodes, 'servers' => $servers, @@ -64,13 +51,17 @@ public function handle(): void } $bar = $this->output->createProgressBar($count); - $powerRepository = $this->powerRepository; - $this->getQueryBuilder($servers, $nodes)->each(function (Server $server) use ($action, $powerRepository, &$bar) { + + $this->getQueryBuilder($servers, $nodes)->get()->each(function ($server, int $index) use ($action, $serverRepository, &$bar): mixed { $bar->clear(); + if (!$server instanceof Server) { + return null; + } + try { - $powerRepository->setServer($server)->send($action); - } catch (DaemonConnectionException $exception) { + $serverRepository->setServer($server)->power($action); + } catch (Exception $exception) { $this->output->error(trans('command/messages.server.power.action_failed', [ 'name' => $server->name, 'id' => $server->id, @@ -81,6 +72,8 @@ public function handle(): void $bar->advance(); $bar->display(); + + return null; }); $this->line(''); @@ -88,6 +81,9 @@ public function handle(): void /** * Returns the query builder instance that will return the servers that should be affected. + * + * @param string[]|int[] $servers + * @param string[]|int[] $nodes */ protected function getQueryBuilder(array $servers, array $nodes): Builder { diff --git a/app/Console/Commands/UpgradeCommand.php b/app/Console/Commands/UpgradeCommand.php deleted file mode 100644 index 75a3c185f7..0000000000 --- a/app/Console/Commands/UpgradeCommand.php +++ /dev/null @@ -1,197 +0,0 @@ -option('skip-download'); - if (!$skipDownload) { - $this->output->warning(__('commands.upgrade.integrity')); - $this->output->comment(__('commands.upgrade.source_url')); - $this->line($this->getUrl()); - } - - if (version_compare(PHP_VERSION, '7.4.0') < 0) { - $this->error(__('commands.upgrade.php_version') . ' [' . PHP_VERSION . '].'); - } - - $user = 'www-data'; - $group = 'www-data'; - if ($this->input->isInteractive()) { - if (!$skipDownload) { - $skipDownload = !$this->confirm(__('commands.upgrade.skipDownload'), true); - } - - if (is_null($this->option('user'))) { - $userDetails = function_exists('posix_getpwuid') ? posix_getpwuid(fileowner('public')) : []; - $user = $userDetails['name'] ?? 'www-data'; - - $message = __('commands.upgrade.webserver_user', ['user' => $user]); - if (!$this->confirm($message, true)) { - $user = $this->anticipate( - __('commands.upgrade.name_webserver'), - [ - 'www-data', - 'nginx', - 'apache', - ] - ); - } - } - - if (is_null($this->option('group'))) { - $groupDetails = function_exists('posix_getgrgid') ? posix_getgrgid(filegroup('public')) : []; - $group = $groupDetails['name'] ?? 'www-data'; - - $message = __('commands.upgrade.group_webserver', ['group' => $user]); - if (!$this->confirm($message, true)) { - $group = $this->anticipate( - __('commands.upgrade.group_webserver_question'), - [ - 'www-data', - 'nginx', - 'apache', - ] - ); - } - } - - if (!$this->confirm(__('commands.upgrade.are_your_sure'))) { - $this->warn(__('commands.upgrade.terminated')); - - return; - } - } - - ini_set('output_buffering', '0'); - $bar = $this->output->createProgressBar($skipDownload ? 9 : 10); - $bar->start(); - - if (!$skipDownload) { - $this->withProgress($bar, function () { - $this->line("\$upgrader> curl -L \"{$this->getUrl()}\" | tar -xzv"); - $process = Process::fromShellCommandline("curl -L \"{$this->getUrl()}\" | tar -xzv"); - $process->run(function ($type, $buffer) { - $this->{$type === Process::ERR ? 'error' : 'line'}($buffer); - }); - }); - } - - $this->withProgress($bar, function () { - $this->line('$upgrader> php artisan down'); - $this->call('down'); - }); - - $this->withProgress($bar, function () { - $this->line('$upgrader> chmod -R 755 storage bootstrap/cache'); - $process = new Process(['chmod', '-R', '755', 'storage', 'bootstrap/cache']); - $process->run(function ($type, $buffer) { - $this->{$type === Process::ERR ? 'error' : 'line'}($buffer); - }); - }); - - $this->withProgress($bar, function () { - $command = ['composer', 'install', '--no-ansi']; - if (config('app.env') === 'production' && !config('app.debug')) { - $command[] = '--optimize-autoloader'; - $command[] = '--no-dev'; - } - - $this->line('$upgrader> ' . implode(' ', $command)); - $process = new Process($command); - $process->setTimeout(10 * 60); - $process->run(function ($type, $buffer) { - $this->line($buffer); - }); - }); - - /** @var \Illuminate\Foundation\Application $app */ - $app = require __DIR__ . '/../../../bootstrap/app.php'; - /** @var \App\Console\Kernel $kernel */ - $kernel = $app->make(Kernel::class); - $kernel->bootstrap(); - $this->setLaravel($app); - - $this->withProgress($bar, function () { - $this->line('$upgrader> php artisan view:clear'); - $this->call('view:clear'); - }); - - $this->withProgress($bar, function () { - $this->line('$upgrader> php artisan config:clear'); - $this->call('config:clear'); - }); - - $this->withProgress($bar, function () { - $this->line('$upgrader> php artisan migrate --force --seed'); - $this->call('migrate', ['--force' => true, '--seed' => true]); - }); - - $this->withProgress($bar, function () use ($user, $group) { - $this->line("\$upgrader> chown -R {$user}:{$group} *"); - $process = Process::fromShellCommandline("chown -R {$user}:{$group} *", $this->getLaravel()->basePath()); - $process->setTimeout(10 * 60); - $process->run(function ($type, $buffer) { - $this->{$type === Process::ERR ? 'error' : 'line'}($buffer); - }); - }); - - $this->withProgress($bar, function () { - $this->line('$upgrader> php artisan queue:restart'); - $this->call('queue:restart'); - }); - - $this->withProgress($bar, function () { - $this->line('$upgrader> php artisan up'); - $this->call('up'); - }); - - $this->newLine(2); - $this->info(__('commands.upgrade.success')); - } - - protected function withProgress(ProgressBar $bar, \Closure $callback) - { - $bar->clear(); - $callback(); - $bar->advance(); - $bar->display(); - } - - protected function getUrl(): string - { - if ($this->option('url')) { - return $this->option('url'); - } - - return sprintf(self::DEFAULT_URL, $this->option('release') ? 'download/v' . $this->option('release') : 'latest/download'); - } -} diff --git a/app/Console/Commands/User/DeleteUserCommand.php b/app/Console/Commands/User/DeleteUserCommand.php index 8c85510ed8..87a78329a4 100644 --- a/app/Console/Commands/User/DeleteUserCommand.php +++ b/app/Console/Commands/User/DeleteUserCommand.php @@ -3,8 +3,8 @@ namespace App\Console\Commands\User; use App\Models\User; -use Webmozart\Assert\Assert; use Illuminate\Console\Command; +use Webmozart\Assert\Assert; class DeleteUserCommand extends Command { @@ -35,7 +35,7 @@ public function handle(): int if ($this->input->isInteractive()) { $tableValues = []; foreach ($results as $user) { - $tableValues[] = [$user->id, $user->email, $user->name]; + $tableValues[] = [$user->id, $user->email, $user->username]; } $this->table(['User ID', 'Email', 'Name'], $tableValues); diff --git a/app/Console/Commands/User/DisableTwoFactorCommand.php b/app/Console/Commands/User/DisableTwoFactorCommand.php index 8a14c81fd4..20e959f6aa 100644 --- a/app/Console/Commands/User/DisableTwoFactorCommand.php +++ b/app/Console/Commands/User/DisableTwoFactorCommand.php @@ -2,6 +2,7 @@ namespace App\Console\Commands\User; +use App\Exceptions\Model\DataValidationException; use App\Models\User; use Illuminate\Console\Command; @@ -14,7 +15,7 @@ class DisableTwoFactorCommand extends Command /** * Handle command execution process. * - * @throws \App\Exceptions\Model\DataValidationException + * @throws DataValidationException */ public function handle(): void { @@ -24,10 +25,12 @@ public function handle(): void $email = $this->option('email') ?? $this->ask(trans('command/messages.user.ask_email')); - $user = User::query()->where('email', $email)->firstOrFail(); - $user->use_totp = false; - $user->totp_secret = null; - $user->save(); + $user = User::where('email', $email)->firstOrFail(); + $user->update([ + 'mfa_app_secret' => null, + 'mfa_app_recovery_codes' => null, + 'mfa_email_enabled' => false, + ]); $this->info(trans('command/messages.user.2fa_disabled', ['email' => $user->email])); } diff --git a/app/Console/Commands/User/MakeUserCommand.php b/app/Console/Commands/User/MakeUserCommand.php index 320f07f534..821765770c 100644 --- a/app/Console/Commands/User/MakeUserCommand.php +++ b/app/Console/Commands/User/MakeUserCommand.php @@ -2,9 +2,10 @@ namespace App\Console\Commands\User; +use App\Exceptions\Model\DataValidationException; +use App\Services\Users\UserCreationService; use Exception; use Illuminate\Console\Command; -use App\Services\Users\UserCreationService; use Illuminate\Support\Facades\DB; class MakeUserCommand extends Command @@ -25,7 +26,7 @@ public function __construct(private UserCreationService $creationService) * Handle command request to create a new user. * * @throws Exception - * @throws \App\Exceptions\Model\DataValidationException + * @throws DataValidationException */ public function handle(): int { diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 4a9bbee17d..8421c1b82b 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,15 +2,19 @@ namespace App\Console; -use App\Jobs\NodeStatistics; +use App\Console\Commands\Egg\CheckEggUpdatesCommand; +use App\Console\Commands\Egg\UpdateEggIndexCommand; +use App\Console\Commands\Maintenance\CleanServiceBackupFilesCommand; +use App\Console\Commands\Maintenance\PruneImagesCommand; +use App\Console\Commands\Maintenance\PruneOrphanedBackupsCommand; +use App\Console\Commands\Schedule\ProcessRunnableCommand; use App\Models\ActivityLog; +use App\Models\Webhook; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Database\Console\PruneCommand; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; -use App\Console\Commands\Schedule\ProcessRunnableCommand; -use App\Console\Commands\Maintenance\PruneOrphanedBackupsCommand; -use App\Console\Commands\Maintenance\CleanServiceBackupFilesCommand; -use App\Console\Commands\Maintenance\PruneImagesCommand; +use Spatie\Health\Commands\RunHealthChecksCommand; +use Spatie\Health\Commands\ScheduleCheckHeartbeatCommand; class Kernel extends ConsoleKernel { @@ -27,8 +31,11 @@ protected function commands(): void */ protected function schedule(Schedule $schedule): void { - // https://laravel.com/docs/10.x/upgrade#redis-cache-tags - $schedule->command('cache:prune-stale-tags')->hourly(); + if (config('cache.default') === 'redis') { + // https://laravel.com/docs/10.x/upgrade#redis-cache-tags + // This only needs to run when using redis. anything else throws an error. + $schedule->command('cache:prune-stale-tags')->hourly(); + } // Execute scheduled commands for servers every minute, as if there was a normal cron running. $schedule->command(ProcessRunnableCommand::class)->everyMinute()->withoutOverlapping(); @@ -36,7 +43,8 @@ protected function schedule(Schedule $schedule): void $schedule->command(CleanServiceBackupFilesCommand::class)->daily(); $schedule->command(PruneImagesCommand::class)->daily(); - $schedule->job(new NodeStatistics())->everyFiveSeconds()->withoutOverlapping(); + $schedule->command(CheckEggUpdatesCommand::class)->daily(); + $schedule->command(UpdateEggIndexCommand::class)->daily(); if (config('backups.prune_age')) { // Every 30 minutes, run the backup pruning command so that any abandoned backups can be deleted. @@ -46,5 +54,12 @@ protected function schedule(Schedule $schedule): void if (config('activity.prune_days')) { $schedule->command(PruneCommand::class, ['--model' => [ActivityLog::class]])->daily(); } + + if (config('panel.webhook.prune_days')) { + $schedule->command(PruneCommand::class, ['--model' => [Webhook::class]])->daily(); + } + + $schedule->command(ScheduleCheckHeartbeatCommand::class)->everyMinute(); + $schedule->command(RunHealthChecksCommand::class)->everyFiveMinutes(); } } diff --git a/app/Contracts/Http/ClientPermissionsRequest.php b/app/Contracts/Http/ClientPermissionsRequest.php index 898ef032e0..d098b3ce90 100644 --- a/app/Contracts/Http/ClientPermissionsRequest.php +++ b/app/Contracts/Http/ClientPermissionsRequest.php @@ -2,12 +2,13 @@ namespace App\Contracts\Http; +use App\Enums\SubuserPermission; + interface ClientPermissionsRequest { /** - * Returns the permissions string indicating which permission should be used to - * validate that the authenticated user has permission to perform this action against - * the given resource (server). + * Returns the permission used to validate that the authenticated user may perform + * this action against the given resource (server). */ - public function permission(): string; + public function permission(): SubuserPermission|string; } diff --git a/app/Contracts/Plugins/HasPluginSettings.php b/app/Contracts/Plugins/HasPluginSettings.php new file mode 100644 index 0000000000..1ed556c6ca --- /dev/null +++ b/app/Contracts/Plugins/HasPluginSettings.php @@ -0,0 +1,18 @@ + $data + */ + public function saveSettings(array $data): void; +} diff --git a/app/Contracts/Validatable.php b/app/Contracts/Validatable.php new file mode 100644 index 0000000000..bea7e8da9a --- /dev/null +++ b/app/Contracts/Validatable.php @@ -0,0 +1,22 @@ + + */ + public static function getRules(): array; + + /** + * @return array> + */ + public static function getRulesForField(string $field): array; + + public function validate(): void; +} diff --git a/app/Eloquent/BackupQueryBuilder.php b/app/Eloquent/BackupQueryBuilder.php new file mode 100644 index 0000000000..53f10a28f4 --- /dev/null +++ b/app/Eloquent/BackupQueryBuilder.php @@ -0,0 +1,24 @@ + + */ +class BackupQueryBuilder extends Builder +{ + public function nonFailed(): self + { + $this->where(function (Builder $query) { + $query + ->whereNull('completed_at') + ->orWhere('is_successful', true); + }); + + return $this; + } +} diff --git a/app/Enums/BackupStatus.php b/app/Enums/BackupStatus.php new file mode 100644 index 0000000000..96543159c7 --- /dev/null +++ b/app/Enums/BackupStatus.php @@ -0,0 +1,38 @@ + TablerIcon::CircleDashed, + self::Successful => TablerIcon::CircleCheck, + self::Failed => TablerIcon::CircleX, + }; + } + + public function getColor(): string + { + return match ($this) { + self::InProgress => 'primary', + self::Successful => 'success', + self::Failed => 'danger', + }; + } + + public function getLabel(): string + { + return trans('server/backup.backup_status.' . $this->value); + } +} diff --git a/app/Enums/ConsoleWidgetPosition.php b/app/Enums/ConsoleWidgetPosition.php new file mode 100644 index 0000000000..81153b9738 --- /dev/null +++ b/app/Enums/ConsoleWidgetPosition.php @@ -0,0 +1,11 @@ + 'tabler-heart-plus', - self::Starting => 'tabler-heart-up', - self::Running => 'tabler-heartbeat', - self::Restarting => 'tabler-heart-bolt', - self::Exited => 'tabler-heart-exclamation', - self::Paused => 'tabler-heart-pause', - self::Dead, self::Offline => 'tabler-heart-x', - self::Removing => 'tabler-heart-down', - self::Missing => 'tabler-heart-search', - self::Stopping => 'tabler-heart-minus', + self::Created => TablerIcon::HeartPlus, + self::Starting => TablerIcon::HeartUp, + self::Running => TablerIcon::Heartbeat, + self::Restarting => TablerIcon::HeartBolt, + self::Exited => TablerIcon::HeartExclamation, + self::Paused => TablerIcon::HeartPause, + self::Dead, self::Offline => TablerIcon::HeartX, + self::Removing => TablerIcon::HeartDown, + self::Missing => TablerIcon::HeartSearch, + self::Stopping => TablerIcon::HeartMinus, }; } - public function color(): string + public function getColor(bool $hex = false): string { + if ($hex) { + return match ($this) { + self::Created, self::Restarting => '#2563EB', + self::Starting, self::Paused, self::Removing, self::Stopping => '#D97706', + self::Running => '#22C55E', + self::Exited, self::Missing, self::Dead, self::Offline => '#EF4444', + }; + } + return match ($this) { self::Created => 'primary', self::Starting => 'warning', @@ -49,7 +63,51 @@ public function color(): string self::Removing => 'warning', self::Missing => 'danger', self::Stopping => 'warning', - self::Offline => 'gray', + self::Offline => 'danger', }; } + + public function getLabel(): string + { + return trans('server/console.status.' . $this->value); + } + + public function isOffline(): bool + { + return in_array($this, [ContainerStatus::Offline, ContainerStatus::Missing]); + } + + public function isStartingOrRunning(): bool + { + return in_array($this, [ContainerStatus::Starting, ContainerStatus::Running]); + } + + public function isStartingOrStopping(): bool + { + return in_array($this, [ContainerStatus::Starting, ContainerStatus::Stopping, ContainerStatus::Restarting]); + } + + public function isStartable(): bool + { + return !in_array($this, [ContainerStatus::Running, ContainerStatus::Starting, ContainerStatus::Stopping, ContainerStatus::Restarting, ContainerStatus::Missing]); + } + + public function isRestartable(): bool + { + if ($this->isStartable()) { + return true; + } + + return !in_array($this, [ContainerStatus::Offline, ContainerStatus::Missing]); + } + + public function isStoppable(): bool + { + return !in_array($this, [ContainerStatus::Starting, ContainerStatus::Stopping, ContainerStatus::Restarting, ContainerStatus::Exited, ContainerStatus::Offline, ContainerStatus::Missing]); + } + + public function isKillable(): bool + { + return !in_array($this, [ContainerStatus::Offline, ContainerStatus::Running, ContainerStatus::Exited, ContainerStatus::Missing]); + } } diff --git a/app/Enums/CustomRenderHooks.php b/app/Enums/CustomRenderHooks.php new file mode 100644 index 0000000000..861b2c94b1 --- /dev/null +++ b/app/Enums/CustomRenderHooks.php @@ -0,0 +1,9 @@ + 30, + self::ConsoleFont => 'monospace', + self::ConsoleFontSize => 14, + self::ConsoleGraphPeriod => 30, + self::TopNavigation => config('panel.filament.default-navigation', 'sidebar'), + self::DashboardLayout => 'grid', + self::ButtonStyle => true, + self::RedirectToAdmin => false, + }; + } + + /** @return array */ + public static function getDefaultCustomization(): array + { + $default = []; + + foreach (self::cases() as $key) { + $default[$key->value] = $key->getDefaultValue(); + } + + return $default; + } +} diff --git a/app/Enums/EditorLanguages.php b/app/Enums/EditorLanguages.php new file mode 100644 index 0000000000..3badb48d1a --- /dev/null +++ b/app/Enums/EditorLanguages.php @@ -0,0 +1,141 @@ + self::c, + + 'cc', 'hpp' => self::cpp, + + 'cs' => self::csharp, + + 'class' => self::java, + + 'htm' => self::html, + + 'js', 'mjs', 'cjs' => self::javascript, + + 'kt', 'kts' => self::kotlin, + + 'md' => self::markdown, + + 'm' => self::objectivec, + + 'pl', 'pm' => self::perl, + + 'php3', 'php4', 'php5', 'phtml' => self::php, + + 'py', 'pyc', 'pyo', 'pyi' => self::python, + + 'rdata', 'rds' => self::r, + + 'rb', 'erb' => self::ruby, + + 'sc' => self::scala, + + 'sh', 'zsh' => self::shell, + + 'ts', 'tsx' => self::typescript, + + 'yml' => self::yaml, + + default => self::tryFrom($match) ?? self::plaintext, + }; + } + + public function getLabel(): string + { + return $this->name; + } +} diff --git a/app/Enums/EggFormat.php b/app/Enums/EggFormat.php new file mode 100644 index 0000000000..3100390d81 --- /dev/null +++ b/app/Enums/EggFormat.php @@ -0,0 +1,9 @@ + TablerIcon::Package, + self::Theme => TablerIcon::Palette, + self::Language => TablerIcon::Language, + }; + } + + public function getLabel(): string + { + return trans('admin/plugin.category_enum.' . $this->value); + } +} diff --git a/app/Enums/PluginStatus.php b/app/Enums/PluginStatus.php new file mode 100644 index 0000000000..2608375073 --- /dev/null +++ b/app/Enums/PluginStatus.php @@ -0,0 +1,44 @@ + TablerIcon::HeartOff, + self::Disabled => TablerIcon::HeartX, + self::Enabled => TablerIcon::HeartCheck, + self::Errored => TablerIcon::HeartBroken, + self::Incompatible => TablerIcon::HeartCancel, + }; + } + + public function getColor(): string + { + return match ($this) { + self::NotInstalled => 'gray', + self::Disabled => 'warning', + self::Enabled => 'success', + self::Errored => 'danger', + self::Incompatible => 'danger', + }; + } + + public function getLabel(): string + { + return trans('admin/plugin.status_enum.' . $this->value); + } +} diff --git a/app/Enums/ResourceLimit.php b/app/Enums/ResourceLimit.php new file mode 100644 index 0000000000..59707601a4 --- /dev/null +++ b/app/Enums/ResourceLimit.php @@ -0,0 +1,65 @@ +name}"; + } + + /** + * Returns a middleware that will throttle the specific resource by server. This + * throttle applies to any user making changes to that resource on the specific + * server, it is NOT per-user. + */ + public function middleware(): string + { + return ThrottleRequests::using($this->throttleKey()); + } + + public function limit(): Limit + { + return match ($this) { + self::Websocket => Limit::perMinute(5), + self::BackupRestore => Limit::perMinutes(15, 3), + self::DatabaseCreate => Limit::perMinute(2), + self::SubuserCreate => Limit::perMinutes(15, 10), + self::FilePull => Limit::perMinutes(10, 5), + default => Limit::perMinute(2), + }; + } + + public static function boot(): void + { + foreach (self::cases() as $case) { + RateLimiter::for($case->throttleKey(), function (Request $request) use ($case) { + Assert::isInstanceOf($server = $request->route()->parameter('server'), Server::class); + + return $case->limit()->by($server->uuid); + }); + } + } +} diff --git a/app/Enums/RolePermissionModels.php b/app/Enums/RolePermissionModels.php index 36b7913b73..0ecfc69989 100644 --- a/app/Enums/RolePermissionModels.php +++ b/app/Enums/RolePermissionModels.php @@ -5,6 +5,7 @@ enum RolePermissionModels: string { case ApiKey = 'apiKey'; + case Allocation = 'allocation'; case DatabaseHost = 'databaseHost'; case Database = 'database'; case Egg = 'egg'; @@ -13,4 +14,30 @@ enum RolePermissionModels: string case Role = 'role'; case Server = 'server'; case User = 'user'; + case Webhook = 'webhook'; + + public function viewAny(): string + { + return RolePermissionPrefixes::ViewAny->value . ' ' . $this->value; + } + + public function view(): string + { + return RolePermissionPrefixes::View->value . ' ' . $this->value; + } + + public function create(): string + { + return RolePermissionPrefixes::Create->value . ' ' . $this->value; + } + + public function update(): string + { + return RolePermissionPrefixes::Update->value . ' ' . $this->value; + } + + public function delete(): string + { + return RolePermissionPrefixes::Delete->value . ' ' . $this->value; + } } diff --git a/app/Enums/ScheduleStatus.php b/app/Enums/ScheduleStatus.php new file mode 100644 index 0000000000..0110c32a16 --- /dev/null +++ b/app/Enums/ScheduleStatus.php @@ -0,0 +1,27 @@ + 'danger', + self::Processing => 'warning', + self::Active => 'success', + }; + } + + public function getLabel(): string + { + return trans('server/schedule.schedule_status.' . $this->value); + } +} diff --git a/app/Enums/ServerResourceType.php b/app/Enums/ServerResourceType.php new file mode 100644 index 0000000000..35d3abd2ce --- /dev/null +++ b/app/Enums/ServerResourceType.php @@ -0,0 +1,51 @@ +isLimit()) { + $resourceAmount = $server->{$this->value} ?? 0; + + if (!$this->isPercentage()) { + // Our limits are entered as MiB/ MB so we need to convert them to bytes + $resourceAmount *= config('panel.use_binary_prefix') ? 1024 * 1024 : 1000 * 1000; + } + + return $resourceAmount; + } + + return $server->retrieveResources()[$this->value] ?? 0; + } + + public function isLimit(): bool + { + return $this === ServerResourceType::CPULimit || $this === ServerResourceType::MemoryLimit || $this === ServerResourceType::DiskLimit; + } + + public function isTime(): bool + { + return $this === ServerResourceType::Uptime; + } + + public function isPercentage(): bool + { + return $this === ServerResourceType::CPU || $this === ServerResourceType::CPULimit; + } +} diff --git a/app/Enums/ServerState.php b/app/Enums/ServerState.php index 47ac64a909..5967c23f03 100644 --- a/app/Enums/ServerState.php +++ b/app/Enums/ServerState.php @@ -2,31 +2,40 @@ namespace App\Enums; -enum ServerState: string +use BackedEnum; +use Filament\Support\Contracts\HasColor; +use Filament\Support\Contracts\HasIcon; +use Filament\Support\Contracts\HasLabel; + +enum ServerState: string implements HasColor, HasIcon, HasLabel { - case Normal = 'normal'; case Installing = 'installing'; case InstallFailed = 'install_failed'; case ReinstallFailed = 'reinstall_failed'; case Suspended = 'suspended'; case RestoringBackup = 'restoring_backup'; - public function icon(): string + public function getIcon(): BackedEnum { return match ($this) { - self::Normal => 'tabler-heart', - self::Installing => 'tabler-heart-bolt', - self::InstallFailed => 'tabler-heart-x', - self::ReinstallFailed => 'tabler-heart-x', - self::Suspended => 'tabler-heart-cancel', - self::RestoringBackup => 'tabler-heart-up', + self::Installing => TablerIcon::HeartBolt, + self::InstallFailed, self::ReinstallFailed => TablerIcon::HeartX, + self::Suspended => TablerIcon::HeartCancel, + self::RestoringBackup => TablerIcon::HeartUp, }; } - public function color(): string + public function getColor(bool $hex = false): string { + if ($hex) { + return match ($this) { + self::Installing, self::RestoringBackup => '#2563EB', + self::Suspended => '#D97706', + self::InstallFailed, self::ReinstallFailed => '#EF4444', + }; + } + return match ($this) { - self::Normal => 'primary', self::Installing => 'primary', self::InstallFailed => 'danger', self::ReinstallFailed => 'danger', @@ -34,4 +43,9 @@ public function color(): string self::RestoringBackup => 'primary', }; } + + public function getLabel(): string + { + return str($this->value)->headline(); + } } diff --git a/app/Enums/StartupVariableType.php b/app/Enums/StartupVariableType.php new file mode 100644 index 0000000000..479a6cd16c --- /dev/null +++ b/app/Enums/StartupVariableType.php @@ -0,0 +1,11 @@ +value, 2); + } + + public function isHidden(): bool + { + return $this === self::WebsocketConnect; + } + + public function getIcon(): ?BackedEnum + { + [$group, $permission] = $this->split(); + + return match ($group) { + 'control' => TablerIcon::Terminal2, + 'user' => TablerIcon::Users, + 'file' => TablerIcon::Files, + 'backup' => TablerIcon::FileZip, + 'allocation' => TablerIcon::Network, + 'startup' => TablerIcon::PlayerPlay, + 'database' => TablerIcon::Database, + 'schedule' => TablerIcon::Clock, + 'settings' => TablerIcon::Settings, + 'activity' => TablerIcon::Stack, + default => null, + }; + } +} diff --git a/app/Enums/SuspendAction.php b/app/Enums/SuspendAction.php new file mode 100644 index 0000000000..c985295489 --- /dev/null +++ b/app/Enums/SuspendAction.php @@ -0,0 +1,9 @@ +value); + } + + public function getColor(): ?string + { + return match ($this) { + self::Regular => null, + self::Discord => 'blurple', + }; + } + + public function getIcon(): BackedEnum + { + return match ($this) { + self::Regular => TablerIcon::WorldWww, + self::Discord => TablerIcon::BrandDiscord, + }; + } +} diff --git a/app/Events/ActivityLogged.php b/app/Events/ActivityLogged.php index bb47929a2d..aec7952e1e 100644 --- a/app/Events/ActivityLogged.php +++ b/app/Events/ActivityLogged.php @@ -2,15 +2,13 @@ namespace App\Events; -use Illuminate\Support\Str; use App\Models\ActivityLog; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Str; class ActivityLogged extends Event { - public function __construct(public ActivityLog $model) - { - } + public function __construct(public ActivityLog $model) {} public function is(string $event): bool { diff --git a/app/Events/Auth/DirectLogin.php b/app/Events/Auth/DirectLogin.php deleted file mode 100644 index 6bfe8a8096..0000000000 --- a/app/Events/Auth/DirectLogin.php +++ /dev/null @@ -1,13 +0,0 @@ - + */ public function getHeaders(): array { return []; @@ -46,7 +57,7 @@ public function getHeaders(): array * and then redirecting them back to the page that they came from. If the * request originated from an API hit, return the error in JSONAPI spec format. */ - public function render(Request $request) + public function render(Request $request): bool|RedirectResponse|JsonResponse { if ($request->is('livewire/update')) { Notification::make() @@ -55,15 +66,13 @@ public function render(Request $request) ->danger() ->send(); - return; + return false; } if ($request->expectsJson()) { return response()->json(Handler::toArray($this), $this->getStatusCode(), $this->getHeaders()); } - app(AlertsMessageBag::class)->danger($this->getMessage())->flash(); - return redirect()->back()->withInput(); } @@ -71,12 +80,12 @@ public function render(Request $request) * Log the exception to the logs using the defined error level only if the previous * exception is set. * - * @throws \Throwable + * @throws Throwable */ - public function report() + public function report(): void { - if (!$this->getPrevious() instanceof \Exception || !Handler::isReportable($this->getPrevious())) { - return null; + if (!$this->getPrevious() instanceof Exception || !Handler::isReportable($this->getPrevious())) { + return; } try { @@ -85,6 +94,6 @@ public function report() throw $this->getPrevious(); } - return $logger->{$this->getErrorLevel()}($this->getPrevious()); + $logger->{$this->getErrorLevel()}($this->getPrevious()); } } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index d30475f668..0590a85d8a 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,24 +2,28 @@ namespace App\Exceptions; -use Illuminate\Support\Arr; -use Illuminate\Support\Str; -use Illuminate\Http\JsonResponse; -use Illuminate\Support\Collection; +use Exception; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Auth\AuthenticationException; use Illuminate\Container\Container; use Illuminate\Database\Connection; -use Illuminate\Http\RedirectResponse; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Application; -use Illuminate\Auth\AuthenticationException; +use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\RedirectResponse; +use Illuminate\Http\Request; use Illuminate\Session\TokenMismatchException; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; +use PDOException; use Symfony\Component\HttpFoundation\Response; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Database\Eloquent\ModelNotFoundException; use Symfony\Component\HttpKernel\Exception\HttpException; -use Symfony\Component\Mailer\Exception\TransportException; -use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; +use Symfony\Component\Mailer\Exception\TransportException; +use Throwable; class Handler extends ExceptionHandler { @@ -45,6 +49,8 @@ class Handler extends ExceptionHandler /** * Maps exceptions to a specific response code. This handles special exception * types that don't have a defined response code. + * + * @var array */ protected static array $exceptionResponseCodes = [ AuthenticationException::class => 401, @@ -76,7 +82,7 @@ public function register(): void $this->dontReport = []; } - $this->reportable(function (\PDOException $ex) { + $this->reportable(function (PDOException $ex) { $ex = $this->generateCleanedExceptionStack($ex); }); @@ -85,7 +91,7 @@ public function register(): void }); } - private function generateCleanedExceptionStack(\Throwable $exception): string + private function generateCleanedExceptionStack(Throwable $exception): string { $cleanedStack = ''; foreach ($exception->getTrace() as $index => $item) { @@ -114,11 +120,11 @@ class_basename($exception), /** * Render an exception into an HTTP response. * - * @param \Illuminate\Http\Request $request + * @param Request $request * - * @throws \Throwable + * @throws Throwable */ - public function render($request, \Throwable $e): Response + public function render($request, Throwable $e): Response { $connections = $this->container->make(Connection::class); @@ -140,7 +146,7 @@ public function render($request, \Throwable $e): Response * Transform a validation exception into a consistent format to be returned for * calls to the API. * - * @param \Illuminate\Http\Request $request + * @param Request $request */ public function invalidJson($request, ValidationException $exception): JsonResponse { @@ -180,9 +186,16 @@ public function invalidJson($request, ValidationException $exception): JsonRespo } /** - * Return the exception as a JSONAPI representation for use on API requests. + * @param array $override + * @return array{errors: array{ + * code: string, + * status: string, + * detail: string, + * source?: array{line: int, file: string}, + * meta?: array{trace: string[], previous: string[]} + * }}|array{errors: array{non-empty-array}} */ - protected function convertExceptionToArray(\Throwable $e, array $override = []): array + public static function exceptionToArray(Throwable $e, array $override = []): array { $match = self::$exceptionResponseCodes[get_class($e)] ?? null; @@ -214,7 +227,7 @@ protected function convertExceptionToArray(\Throwable $e, array $override = []): 'trace' => Collection::make($e->getTrace()) ->map(fn ($trace) => Arr::except($trace, ['args'])) ->all(), - 'previous' => Collection::make($this->extractPrevious($e)) + 'previous' => Collection::make(self::extractPrevious($e)) ->map(fn ($exception) => $exception->getTrace()) ->map(fn ($trace) => Arr::except($trace, ['args'])) ->all(), @@ -225,10 +238,21 @@ protected function convertExceptionToArray(\Throwable $e, array $override = []): return ['errors' => [array_merge($error, $override)]]; } + /** + * Return the exception as a JSONAPI representation for use on API requests. + * + * @param array{detail?: mixed, source?: mixed, meta?: mixed} $override + * @return array{errors?: array} + */ + protected function convertExceptionToArray(Throwable $e, array $override = []): array + { + return self::exceptionToArray($e, $override); + } + /** * Return an array of exceptions that should not be reported. */ - public static function isReportable(\Exception $exception): bool + public static function isReportable(Exception $exception): bool { return (new self(Container::getInstance()))->shouldReport($exception); } @@ -236,7 +260,7 @@ public static function isReportable(\Exception $exception): bool /** * Convert an authentication exception into an unauthenticated response. * - * @param \Illuminate\Http\Request $request + * @param Request $request */ protected function unauthenticated($request, AuthenticationException $exception): JsonResponse|RedirectResponse { @@ -244,22 +268,19 @@ protected function unauthenticated($request, AuthenticationException $exception) return new JsonResponse($this->convertExceptionToArray($exception), JsonResponse::HTTP_UNAUTHORIZED); } - return redirect()->guest('/auth/login'); + return redirect()->guest(route('filament.app.auth.login')); } /** * Extracts all the previous exceptions that lead to the one passed into this * function being thrown. * - * @return \Throwable[] + * @return Throwable[] */ - protected function extractPrevious(\Throwable $e): array + public static function extractPrevious(Throwable $e): array { $previous = []; while ($value = $e->getPrevious()) { - if (!$value instanceof \Throwable) { - break; - } $previous[] = $value; $e = $value; } @@ -270,9 +291,11 @@ protected function extractPrevious(\Throwable $e): array /** * Helper method to allow reaching into the handler to convert an exception * into the expected array response type. + * + * @return array */ - public static function toArray(\Throwable $e): array + public static function toArray(Throwable $e): array { - return (new self(app()))->convertExceptionToArray($e); + return self::exceptionToArray($e); } } diff --git a/app/Exceptions/Http/Base/InvalidPasswordProvidedException.php b/app/Exceptions/Http/Base/InvalidPasswordProvidedException.php index a0e1665373..188f4a19b7 100644 --- a/app/Exceptions/Http/Base/InvalidPasswordProvidedException.php +++ b/app/Exceptions/Http/Base/InvalidPasswordProvidedException.php @@ -4,6 +4,4 @@ use App\Exceptions\DisplayException; -class InvalidPasswordProvidedException extends DisplayException -{ -} +class InvalidPasswordProvidedException extends DisplayException {} diff --git a/app/Exceptions/Http/Connection/DaemonConnectionException.php b/app/Exceptions/Http/Connection/DaemonConnectionException.php deleted file mode 100644 index 342fd7a24f..0000000000 --- a/app/Exceptions/Http/Connection/DaemonConnectionException.php +++ /dev/null @@ -1,76 +0,0 @@ -getResponse() : null; - $this->requestId = $response?->getHeaderLine('X-Request-Id'); - - Context::add('request_id', $this->requestId); - - if ($useStatusCode) { - $this->statusCode = is_null($response) ? $this->statusCode : $response->getStatusCode(); - // There are rare conditions where daemon encounters a panic condition and crashes the - // request being made after content has already been sent over the wire. In these cases - // you can end up with a "successful" response code that is actual an error. - // - // Handle those better here since we shouldn't ever end up in this exception state and - // be returning a 2XX level response. - if ($this->statusCode < 400) { - $this->statusCode = Response::HTTP_BAD_GATEWAY; - } - } - - if (is_null($response)) { - $message = 'Could not establish a connection to the machine running this server. Please try again.'; - } else { - $message = sprintf('There was an error while communicating with the machine running this server. This error has been logged, please try again. (code: %s) (request_id: %s)', $response->getStatusCode(), $this->requestId ?? ''); - } - - // Attempt to pull the actual error message off the response and return that if it is not - // a 500 level error. - if ($this->statusCode < 500 && !is_null($response)) { - $body = json_decode($response->getBody()->__toString(), true); - $message = sprintf('An error occurred on the remote host: %s. (request id: %s)', $body['error'] ?? $message, $this->requestId ?? ''); - } - - $level = $this->statusCode >= 500 && $this->statusCode !== 504 - ? DisplayException::LEVEL_ERROR - : DisplayException::LEVEL_WARNING; - - parent::__construct($message, $previous, $level); - } - - /** - * Return the HTTP status code for this exception. - */ - public function getStatusCode(): int - { - return $this->statusCode; - } -} diff --git a/app/Exceptions/Http/HttpForbiddenException.php b/app/Exceptions/Http/HttpForbiddenException.php index b0536257e0..2caef2915a 100644 --- a/app/Exceptions/Http/HttpForbiddenException.php +++ b/app/Exceptions/Http/HttpForbiddenException.php @@ -4,13 +4,14 @@ use Illuminate\Http\Response; use Symfony\Component\HttpKernel\Exception\HttpException; +use Throwable; class HttpForbiddenException extends HttpException { /** * HttpForbiddenException constructor. */ - public function __construct(string $message = null, \Throwable $previous = null) + public function __construct(?string $message = null, ?Throwable $previous = null) { parent::__construct(Response::HTTP_FORBIDDEN, $message, $previous); } diff --git a/app/Exceptions/Http/Server/FileTypeNotEditableException.php b/app/Exceptions/Http/Server/FileTypeNotEditableException.php deleted file mode 100644 index d199ce8fd5..0000000000 --- a/app/Exceptions/Http/Server/FileTypeNotEditableException.php +++ /dev/null @@ -1,9 +0,0 @@ -isSuspended()) { diff --git a/app/Exceptions/Http/TwoFactorAuthRequiredException.php b/app/Exceptions/Http/TwoFactorAuthRequiredException.php index 6b9804812b..fb9c09ebc1 100644 --- a/app/Exceptions/Http/TwoFactorAuthRequiredException.php +++ b/app/Exceptions/Http/TwoFactorAuthRequiredException.php @@ -11,7 +11,7 @@ class TwoFactorAuthRequiredException extends HttpException implements HttpExcept /** * TwoFactorAuthRequiredException constructor. */ - public function __construct(\Throwable $previous = null) + public function __construct(?\Throwable $previous = null) { parent::__construct(Response::HTTP_BAD_REQUEST, 'Two-factor authentication is required on this account in order to access this endpoint.', $previous); } diff --git a/app/Exceptions/ManifestDoesNotExistException.php b/app/Exceptions/ManifestDoesNotExistException.php deleted file mode 100644 index 12fde8f016..0000000000 --- a/app/Exceptions/ManifestDoesNotExistException.php +++ /dev/null @@ -1,14 +0,0 @@ - + */ public function getHeaders(): array { return []; diff --git a/app/Exceptions/PanelException.php b/app/Exceptions/PanelException.php index 532869ac3e..3bec87c183 100644 --- a/app/Exceptions/PanelException.php +++ b/app/Exceptions/PanelException.php @@ -2,6 +2,6 @@ namespace App\Exceptions; -class PanelException extends \Exception -{ -} +use Exception; + +class PanelException extends Exception {} diff --git a/app/Exceptions/PluginIdMismatchException.php b/app/Exceptions/PluginIdMismatchException.php new file mode 100644 index 0000000000..c5d050d9b4 --- /dev/null +++ b/app/Exceptions/PluginIdMismatchException.php @@ -0,0 +1,7 @@ + 'https://github.com/pelican/panel/blob/master/package.json', - ]; - } -} diff --git a/app/Exceptions/Transformer/InvalidTransformerLevelException.php b/app/Exceptions/Transformer/InvalidTransformerLevelException.php deleted file mode 100644 index 9484960e1b..0000000000 --- a/app/Exceptions/Transformer/InvalidTransformerLevelException.php +++ /dev/null @@ -1,9 +0,0 @@ -schemas, $id); + } + + public function getActiveSchema(): ?AvatarSchemaInterface + { + return $this->get($this->activeSchema); + } + + public function getAvatarUrl(User $user): ?string + { + if ($this->allowUploadedAvatars) { + $path = "avatars/$user->id.png"; + + if (Storage::disk('public')->exists($path)) { + return Storage::url($path); + } + } + + return $this->getActiveSchema()?->get($user); + } + + public function register(AvatarSchemaInterface $schema): void + { + if (array_key_exists($schema->getId(), $this->schemas)) { + return; + } + + $this->schemas[$schema->getId()] = $schema; + } + + /** @return array */ + public function getMappings(): array + { + return collect($this->schemas)->mapWithKeys(fn ($schema) => [$schema->getId() => $schema->getName()])->all(); + } +} diff --git a/app/Extensions/Avatar/Schemas/GravatarSchema.php b/app/Extensions/Avatar/Schemas/GravatarSchema.php new file mode 100644 index 0000000000..953cab5a1a --- /dev/null +++ b/app/Extensions/Avatar/Schemas/GravatarSchema.php @@ -0,0 +1,24 @@ +email); + } +} diff --git a/app/Extensions/Avatar/Schemas/UiAvatarsSchema.php b/app/Extensions/Avatar/Schemas/UiAvatarsSchema.php new file mode 100644 index 0000000000..2fe28191c9 --- /dev/null +++ b/app/Extensions/Avatar/Schemas/UiAvatarsSchema.php @@ -0,0 +1,25 @@ + */ protected array $adapters = []; /** * The registered custom driver creators. + * + * @var array */ protected array $customCreators; - /** - * BackupManager constructor. - */ - public function __construct(protected Application $app) - { - } + public function __construct(protected Application $app) {} /** * Returns a backup adapter instance. */ - public function adapter(string $name = null): FilesystemAdapter + public function adapter(?string $name = null): FilesystemAdapter { return $this->get($name ?: $this->getDefaultAdapter()); } @@ -65,7 +65,7 @@ protected function resolve(string $name): FilesystemAdapter $config = $this->getConfig($name); if (empty($config['adapter'])) { - throw new \InvalidArgumentException("Backup disk [$name] does not have a configured adapter."); + throw new InvalidArgumentException("Backup disk [$name] does not have a configured adapter."); } $adapter = $config['adapter']; @@ -83,11 +83,13 @@ protected function resolve(string $name): FilesystemAdapter return $instance; } - throw new \InvalidArgumentException("Adapter [$adapter] is not supported."); + throw new InvalidArgumentException("Adapter [$adapter] is not supported."); } /** * Calls a custom creator for a given adapter type. + * + * @param array{adapter: string} $config */ protected function callCustomCreator(array $config): mixed { @@ -96,6 +98,8 @@ protected function callCustomCreator(array $config): mixed /** * Creates a new daemon adapter. + * + * @param array $config */ public function createWingsAdapter(array $config): FilesystemAdapter { @@ -104,6 +108,8 @@ public function createWingsAdapter(array $config): FilesystemAdapter /** * Creates a new S3 adapter. + * + * @param array $config */ public function createS3Adapter(array $config): FilesystemAdapter { @@ -120,6 +126,8 @@ public function createS3Adapter(array $config): FilesystemAdapter /** * Returns the configuration associated with a given backup type. + * + * @return array */ protected function getConfig(string $name): array { @@ -145,12 +153,13 @@ public function setDefaultAdapter(string $name): void /** * Unset the given adapter instances. * - * @param string|string[] $adapter + * @param string|string[] $adapter */ public function forget(array|string $adapter): self { + $adapters = &$this->adapters; foreach ((array) $adapter as $adapterName) { - unset($this->adapters[$adapterName]); + unset($adapters[$adapterName]); } return $this; diff --git a/app/Extensions/Captcha/CaptchaService.php b/app/Extensions/Captcha/CaptchaService.php new file mode 100644 index 0000000000..0edfbd6fb3 --- /dev/null +++ b/app/Extensions/Captcha/CaptchaService.php @@ -0,0 +1,48 @@ + */ + private array $schemas = []; + + /** + * @return CaptchaSchemaInterface[] + */ + public function getAll(): array + { + return $this->schemas; + } + + public function get(string $id): ?CaptchaSchemaInterface + { + return array_get($this->schemas, $id); + } + + public function register(CaptchaSchemaInterface $schema): void + { + if (array_key_exists($schema->getId(), $this->schemas)) { + return; + } + + config()->set('captcha.' . Str::lower($schema->getId()), $schema->getConfig()); + $this->schemas[$schema->getId()] = $schema; + } + + /** @return Collection */ + public function getActiveSchemas(): Collection + { + return collect($this->schemas) + ->filter(fn (CaptchaSchemaInterface $schema) => $schema->isEnabled()); + } + + public function getActiveSchema(): ?CaptchaSchemaInterface + { + return $this->getActiveSchemas()->first(); + } +} diff --git a/app/Extensions/Captcha/Schemas/BaseSchema.php b/app/Extensions/Captcha/Schemas/BaseSchema.php new file mode 100644 index 0000000000..155aba1ef1 --- /dev/null +++ b/app/Extensions/Captcha/Schemas/BaseSchema.php @@ -0,0 +1,59 @@ +getId()); + } + + /** + * @return array + */ + public function getConfig(): array + { + $id = Str::upper($this->getId()); + + return [ + 'site_key' => env("CAPTCHA_{$id}_SITE_KEY"), + 'secret_key' => env("CAPTCHA_{$id}_SECRET_KEY"), + ]; + } + + /** + * @return Component[] + */ + public function getSettingsForm(): array + { + $id = Str::upper($this->getId()); + + return [ + TextInput::make("CAPTCHA_{$id}_SITE_KEY") + ->label('Site Key') + ->placeholder('Site Key') + ->columnSpan(2) + ->required() + ->password() + ->revealable() + ->autocomplete(false) + ->default(env("CAPTCHA_{$id}_SITE_KEY")), + TextInput::make("CAPTCHA_{$id}_SECRET_KEY") + ->label('Secret Key') + ->placeholder('Secret Key') + ->columnSpan(2) + ->required() + ->password() + ->revealable() + ->autocomplete(false) + ->default(env("CAPTCHA_{$id}_SECRET_KEY")), + ]; + } +} diff --git a/app/Extensions/Captcha/Schemas/CaptchaSchemaInterface.php b/app/Extensions/Captcha/Schemas/CaptchaSchemaInterface.php new file mode 100644 index 0000000000..fc08680f87 --- /dev/null +++ b/app/Extensions/Captcha/Schemas/CaptchaSchemaInterface.php @@ -0,0 +1,31 @@ + + */ + public function getConfig(): array; + + public function isEnabled(): bool; + + public function getFormComponent(): Component; + + /** + * @return Component[] + */ + public function getSettingsForm(): array; + + public function getIcon(): null|string|BackedEnum; + + public function validateResponse(?string $captchaResponse = null): void; +} diff --git a/app/Extensions/Captcha/Schemas/Turnstile/Component.php b/app/Extensions/Captcha/Schemas/Turnstile/Component.php new file mode 100644 index 0000000000..107e134cf0 --- /dev/null +++ b/app/Extensions/Captcha/Schemas/Turnstile/Component.php @@ -0,0 +1,23 @@ +hiddenLabel(); + + $this->required(); + + $this->rule(new Rule()); + } +} diff --git a/app/Extensions/Captcha/Schemas/Turnstile/Rule.php b/app/Extensions/Captcha/Schemas/Turnstile/Rule.php new file mode 100644 index 0000000000..2f0af26225 --- /dev/null +++ b/app/Extensions/Captcha/Schemas/Turnstile/Rule.php @@ -0,0 +1,23 @@ + $service->get('turnstile')->validateResponse($value)); + } catch (Exception $exception) { + report($exception); + + $fail('Captcha validation failed: ' . $exception->getMessage()); + } + } +} diff --git a/app/Extensions/Captcha/Schemas/Turnstile/TurnstileSchema.php b/app/Extensions/Captcha/Schemas/Turnstile/TurnstileSchema.php new file mode 100644 index 0000000000..f6220b2fe2 --- /dev/null +++ b/app/Extensions/Captcha/Schemas/Turnstile/TurnstileSchema.php @@ -0,0 +1,119 @@ + + */ + public function getConfig(): array + { + return array_merge(parent::getConfig(), [ + 'verify_domain' => env('CAPTCHA_TURNSTILE_VERIFY_DOMAIN'), + ]); + } + + /** + * @return \Filament\Support\Components\Component[] + * + * @throws Exception + */ + public function getSettingsForm(): array + { + return array_merge(parent::getSettingsForm(), [ + Toggle::make('CAPTCHA_TURNSTILE_VERIFY_DOMAIN') + ->label(trans('admin/setting.captcha.verify')) + ->columnSpan(2) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->default(env('CAPTCHA_TURNSTILE_VERIFY_DOMAIN', true)), + TextEntry::make('info') + ->label(trans('admin/setting.captcha.info_label')) + ->columnSpan(2) + ->state(new HtmlString(trans('admin/setting.captcha.info'))), + ]); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandCloudflare; + } + + /** + * @throws Exception + */ + public function validateResponse(?string $captchaResponse = null): void + { + $captchaResponse ??= request()->get('cf-turnstile-response'); + + if (!$secret = env('CAPTCHA_TURNSTILE_SECRET_KEY')) { + throw new Exception('Turnstile secret key is not defined.'); + } + + $response = Http::asJson() + ->timeout(15) + ->connectTimeout(5) + ->throw() + ->post('https://challenges.cloudflare.com/turnstile/v0/siteverify', [ + 'secret' => $secret, + 'response' => $captchaResponse, + ]) + ->json(); + + if (!$response['success']) { + match ($response['error-codes'][0] ?? null) { + 'missing-input-secret' => throw new Exception('The secret parameter was not passed.'), + 'invalid-input-secret' => throw new Exception('The secret parameter was invalid, did not exist, or is a testing secret key with a non-testing response.'), + 'missing-input-response' => throw new Exception('The response parameter (token) was not passed.'), + 'invalid-input-response' => throw new Exception('The response parameter (token) is invalid or has expired.'), + 'bad-request' => throw new Exception('The request was rejected because it was malformed.'), + 'timeout-or-duplicate' => throw new Exception('The response parameter (token) has already been validated before.'), + default => throw new Exception('An internal error happened while validating the response.'), + }; + } + + if (!$this->verifyDomain($response['hostname'] ?? '')) { + throw new Exception('Domain verification failed.'); + } + } + + private function verifyDomain(string $hostname): bool + { + if (!env('CAPTCHA_TURNSTILE_VERIFY_DOMAIN', true)) { + return true; + } + + $requestUrl = parse_url(request()->url()); + + return $hostname === array_get($requestUrl, 'host'); + } +} diff --git a/app/Extensions/DynamicDatabaseConnection.php b/app/Extensions/DynamicDatabaseConnection.php deleted file mode 100644 index d144074273..0000000000 --- a/app/Extensions/DynamicDatabaseConnection.php +++ /dev/null @@ -1,33 +0,0 @@ -findOrFail($host); - } - - config()->set('database.connections.' . $connection, [ - 'driver' => self::DB_DRIVER, - 'host' => $host->host, - 'port' => $host->port, - 'database' => $database, - 'username' => $host->username, - 'password' => $host->password, - 'charset' => self::DB_CHARSET, - 'collation' => self::DB_COLLATION, - ]); - } -} diff --git a/app/Extensions/Facades/Theme.php b/app/Extensions/Facades/Theme.php deleted file mode 100644 index 870525e081..0000000000 --- a/app/Extensions/Facades/Theme.php +++ /dev/null @@ -1,13 +0,0 @@ -schemas; + } + + public function get(string $id): ?FeatureSchemaInterface + { + return array_get($this->schemas, $id); + } + + /** + * @param ?string[] $features + * @return FeatureSchemaInterface[] + */ + public function getActiveSchemas(?array $features = []): array + { + return collect($this->schemas)->only($features)->all(); + } + + public function register(FeatureSchemaInterface $schema): void + { + if (array_key_exists($schema->getId(), $this->schemas)) { + return; + } + + $this->schemas[$schema->getId()] = $schema; + } + + /** + * @param ?string[] $features + * @return array> + */ + public function getMappings(?array $features = []): array + { + return collect($this->getActiveSchemas($features)) + ->mapWithKeys(fn (FeatureSchemaInterface $schema) => [ + $schema->getId() => $schema->getListeners(), + ])->all(); + } +} diff --git a/app/Extensions/Features/Schemas/GSLTokenSchema.php b/app/Extensions/Features/Schemas/GSLTokenSchema.php new file mode 100644 index 0000000000..c52faab405 --- /dev/null +++ b/app/Extensions/Features/Schemas/GSLTokenSchema.php @@ -0,0 +1,120 @@ + */ + public function getListeners(): array + { + return [ + '(gsl token expired)', + '(account not found)', + ]; + } + + public function getId(): string + { + return 'gsl_token'; + } + + /** + * @throws Exception + */ + public function getAction(): Action + { + /** @var Server $server */ + $server = Filament::getTenant(); + + /** @var ServerVariable $serverVariable */ + $serverVariable = $server->serverVariables()->whereHas('variable', function (Builder $query) { + $query->where('env_variable', 'STEAM_ACC'); + })->first(); + + return Action::make($this->getId()) + ->requiresConfirmation() + ->modalHeading('Invalid GSL token') + ->modalDescription('It seems like your Gameserver Login Token (GSL token) is invalid or has expired.') + ->modalSubmitActionLabel('Update GSL Token') + ->disabledSchema(fn () => !user()?->can(SubuserPermission::StartupUpdate, $server)) + ->schema([ + TextEntry::make('info') + ->label(new HtmlString(Blade::render('You can either generate a new one and enter it below or leave the field blank to remove it completely.'))), + TextInput::make('gsltoken') + ->label('GSL Token') + ->rules([ + fn (): Closure => function (string $attribute, $value, Closure $fail) use ($serverVariable) { + $validator = Validator::make(['validatorkey' => $value], [ + 'validatorkey' => $serverVariable->variable->rules, + ]); + + if ($validator->fails()) { + $message = str($validator->errors()->first())->replace('validatorkey', $serverVariable->variable->name); + + $fail($message); + } + }, + ]) + ->hintIcon(TablerIcon::Code, fn () => implode('|', $serverVariable->variable->rules)) + ->label(fn () => $serverVariable->variable->name) + ->prefix(fn () => '{{' . $serverVariable->variable->env_variable . '}}') + ->helperText(fn () => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description), + ]) + ->action(function (array $data, DaemonServerRepository $serverRepository) use ($server, $serverVariable) { + /** @var Server $server */ + $server = Filament::getTenant(); + try { + $new = $data['gsltoken'] ?? ''; + $original = $serverVariable->variable_value; + + $serverVariable->update([ + 'variable_value' => $new, + ]); + + if ($original !== $new) { + + Activity::event('server:startup.edit') + ->property([ + 'variable' => $serverVariable->variable->env_variable, + 'old' => $original, + 'new' => $new, + ]) + ->log(); + } + + $serverRepository->setServer($server)->power('restart'); + + Notification::make() + ->title('GSL Token updated') + ->body('Server will restart now.') + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title('Could not update GSL Token') + ->body($exception->getMessage()) + ->danger() + ->send(); + } + }); + } +} diff --git a/app/Extensions/Features/Schemas/JavaVersionSchema.php b/app/Extensions/Features/Schemas/JavaVersionSchema.php new file mode 100644 index 0000000000..6ca0be2583 --- /dev/null +++ b/app/Extensions/Features/Schemas/JavaVersionSchema.php @@ -0,0 +1,89 @@ + */ + public function getListeners(): array + { + return [ + 'java.lang.UnsupportedClassVersionError', + 'unsupported major.minor version', + 'has been compiled by a more recent version of the java runtime', + 'minecraft 1.17 requires running the server with java 16 or above', + 'minecraft 1.18 requires running the server with java 17 or above', + 'minecraft 1.19 requires running the server with java 17 or above', + ]; + } + + public function getId(): string + { + return 'java_version'; + } + + public function getAction(): Action + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return Action::make($this->getId()) + ->requiresConfirmation() + ->modalHeading('Unsupported Java Version') + ->modalDescription('This server is currently running an unsupported version of Java and cannot be started.') + ->modalSubmitActionLabel('Update Docker Image') + ->disabledSchema(fn () => !user()?->can(SubuserPermission::StartupDockerImage, $server)) + ->schema([ + TextEntry::make('java') + ->label('Please select a supported version from the list below to continue starting the server.'), + Select::make('image') + ->label('Docker Image') + ->disabled(fn () => !in_array($server->image, $server->egg->docker_images)) + ->options(fn () => collect($server->egg->docker_images)->mapWithKeys(fn ($key, $value) => [$key => $value])) + ->selectablePlaceholder(false) + ->default(fn () => $server->image) + ->notIn(fn () => $server->image) + ->required() + ->preload(), + ]) + ->action(function (array $data, DaemonServerRepository $serverRepository) use ($server) { + try { + $new = $data['image']; + $original = $server->image; + $server->forceFill(['image' => $new])->saveOrFail(); + + if ($original !== $server->image) { + Activity::event('server:startup.image') + ->property(['old' => $original, 'new' => $new]) + ->log(); + } + + $serverRepository->setServer($server)->power('restart'); + + Notification::make() + ->title('Docker image updated') + ->body('Server will restart now.') + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title('Could not update docker image') + ->body($exception->getMessage()) + ->danger() + ->send(); + } + }); + } +} diff --git a/app/Extensions/Features/Schemas/MinecraftEulaSchema.php b/app/Extensions/Features/Schemas/MinecraftEulaSchema.php new file mode 100644 index 0000000000..fb40c30c13 --- /dev/null +++ b/app/Extensions/Features/Schemas/MinecraftEulaSchema.php @@ -0,0 +1,61 @@ + */ + public function getListeners(): array + { + return [ + 'you need to agree to the eula in order to run the server', + ]; + } + + public function getId(): string + { + return 'eula'; + } + + public function getAction(): Action + { + return Action::make($this->getId()) + ->requiresConfirmation() + ->modalHeading('Minecraft EULA') + ->modalDescription(new HtmlString(Blade::render('By pressing "I Accept" below you are indicating your agreement to the Minecraft EULA .'))) + ->modalSubmitActionLabel('I Accept') + ->action(function (DaemonFileRepository $fileRepository, DaemonServerRepository $serverRepository) { + try { + /** @var Server $server */ + $server = Filament::getTenant(); + + $fileRepository->setServer($server)->putContent('eula.txt', 'eula=true'); + + $serverRepository->setServer($server)->power('restart'); + + Notification::make() + ->title('Minecraft EULA accepted') + ->body('Server will restart now.') + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title('Could not accept Minecraft EULA') + ->body($exception->getMessage()) + ->danger() + ->send(); + } + }); + } +} diff --git a/app/Extensions/Features/Schemas/PIDLimitSchema.php b/app/Extensions/Features/Schemas/PIDLimitSchema.php new file mode 100644 index 0000000000..871014214b --- /dev/null +++ b/app/Extensions/Features/Schemas/PIDLimitSchema.php @@ -0,0 +1,67 @@ + */ + public function getListeners(): array + { + return [ + 'pthread_create failed', + 'failed to create thread', + 'unable to create thread', + 'unable to create native thread', + 'unable to create new native thread', + 'exception in thread "craft async scheduler management thread"', + ]; + } + + public function getId(): string + { + return 'pid_limit'; + } + + public function getAction(): Action + { + return Action::make($this->getId()) + ->requiresConfirmation() + ->icon(TablerIcon::AlertTriangle) + ->modalHeading(fn () => user()?->isAdmin() ? 'Memory or process limit reached...' : 'Possible resource limit reached...') + ->modalDescription(new HtmlString(Blade::render( + user()?->isAdmin() ? <<<'HTML' +

+ This server has reached the maximum process or memory limit. +

+

+ Increasing container_pid_limit in the wings + configuration, config.yml, might help resolve + this issue. +

+

+ Note: Wings must be restarted for the configuration file changes to take effect +

+ HTML + : + <<<'HTML' +

+ This server is attempting to use more resources than allocated. Please contact the administrator + and give them the error below. +

+

+ + pthread_create failed, Possibly out of memory or process/resource limits reached + +

+ HTML + ))) + ->modalCancelActionLabel('Close') + ->action(fn () => null); + } +} diff --git a/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php b/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php new file mode 100644 index 0000000000..3862310b85 --- /dev/null +++ b/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php @@ -0,0 +1,54 @@ + */ + public function getListeners(): array + { + return [ + 'steamcmd needs 250mb of free disk space to update', + '0x202 after update job', + ]; + } + + public function getId(): string + { + return 'steam_disk_space'; + } + + public function getAction(): Action + { + return Action::make($this->getId()) + ->requiresConfirmation() + ->modalHeading('Out of available disk space...') + ->modalDescription(new HtmlString(Blade::render( + user()?->isAdmin() ? <<<'HTML' +

+ This server has run out of available disk space and cannot complete the install or update + process. +

+

+ Ensure the machine has enough disk space by typing{' '} + df -h on the machine hosting + this server. Delete files or increase the available disk space to resolve the issue. +

+ HTML + : + <<<'HTML' +

+ This server has run out of available disk space and cannot complete the install or update + process. Please get in touch with the administrator(s) and inform them of disk space issues. +

+ HTML + ))) + ->modalCancelActionLabel('Close') + ->action(fn () => null); + } +} diff --git a/app/Extensions/Filesystem/S3Filesystem.php b/app/Extensions/Filesystem/S3Filesystem.php index 6ce793b996..64aa95bb48 100644 --- a/app/Extensions/Filesystem/S3Filesystem.php +++ b/app/Extensions/Filesystem/S3Filesystem.php @@ -1,28 +1,5 @@ and contributors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. */ - namespace App\Extensions\Filesystem; use Aws\S3\S3ClientInterface; @@ -30,6 +7,9 @@ class S3Filesystem extends AwsS3V3Adapter { + /** + * @param array $options + */ public function __construct( private S3ClientInterface $client, private string $bucket, diff --git a/app/Extensions/Laravel/Sanctum/NewAccessToken.php b/app/Extensions/Laravel/Sanctum/NewAccessToken.php index 00023193db..e6969f71de 100644 --- a/app/Extensions/Laravel/Sanctum/NewAccessToken.php +++ b/app/Extensions/Laravel/Sanctum/NewAccessToken.php @@ -6,7 +6,7 @@ use Laravel\Sanctum\NewAccessToken as SanctumAccessToken; /** - * @property \App\Models\ApiKey $accessToken + * @property ApiKey $accessToken */ class NewAccessToken extends SanctumAccessToken { diff --git a/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php b/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php index d4ed47bbc0..d3410494f4 100644 --- a/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php +++ b/app/Extensions/Lcobucci/JWT/Encoding/TimestampDates.php @@ -2,6 +2,7 @@ namespace App\Extensions\Lcobucci\JWT\Encoding; +use DateTimeImmutable; use Lcobucci\JWT\ClaimsFormatter; use Lcobucci\JWT\Token\RegisteredClaims; @@ -20,7 +21,7 @@ public function formatClaims(array $claims): array continue; } - assert($claims[$claim] instanceof \DateTimeImmutable); + assert($claims[$claim] instanceof DateTimeImmutable); $claims[$claim] = $claims[$claim]->getTimestamp(); } diff --git a/app/Extensions/League/Fractal/Serializers/PanelSerializer.php b/app/Extensions/League/Fractal/Serializers/PanelSerializer.php index 29148c0816..161fc2cbec 100644 --- a/app/Extensions/League/Fractal/Serializers/PanelSerializer.php +++ b/app/Extensions/League/Fractal/Serializers/PanelSerializer.php @@ -8,6 +8,9 @@ class PanelSerializer extends ArraySerializer { /** * Serialize an item. + * + * @param array $data + * @return array{object: ?string, attributes: array} */ public function item(?string $resourceKey, array $data): array { @@ -19,6 +22,9 @@ public function item(?string $resourceKey, array $data): array /** * Serialize a collection. + * + * @param array $data + * @return array{object: 'list', data: array} */ public function collection(?string $resourceKey, array $data): array { @@ -35,6 +41,8 @@ public function collection(?string $resourceKey, array $data): array /** * Serialize a null resource. + * + * @return ?array{object: ?string, attributes: null} */ public function null(): ?array { @@ -46,6 +54,10 @@ public function null(): ?array /** * Merge the included resources with the parent resource being serialized. + * + * @param array{relationships: array{string, mixed}} $transformedData + * @param array{string, mixed} $includedData + * @return array{relationships: array{string, mixed}} */ public function mergeIncludes(array $transformedData, array $includedData): array { diff --git a/app/Extensions/OAuth/OAuthSchemaInterface.php b/app/Extensions/OAuth/OAuthSchemaInterface.php new file mode 100644 index 0000000000..56320d5b21 --- /dev/null +++ b/app/Extensions/OAuth/OAuthSchemaInterface.php @@ -0,0 +1,42 @@ + + */ + public function getServiceConfig(): array; + + /** @return Component[] */ + public function getSettingsForm(): array; + + /** @return Step[] */ + public function getSetupSteps(): array; + + public function getIcon(): null|string|BackedEnum; + + public function getHexColor(): ?string; + + public function isEnabled(): bool; + + public function shouldCreateMissingUser(OAuthUser $user): bool; + + public function shouldLinkMissingUser(User $user, OAuthUser $oauthUser): bool; +} diff --git a/app/Extensions/OAuth/OAuthService.php b/app/Extensions/OAuth/OAuthService.php new file mode 100644 index 0000000000..8ac26d99dc --- /dev/null +++ b/app/Extensions/OAuth/OAuthService.php @@ -0,0 +1,71 @@ +schemas; + } + + public function get(string $id): ?OAuthSchemaInterface + { + return array_get($this->schemas, $id); + } + + /** @return OAuthSchemaInterface[] */ + public function getEnabled(): array + { + return collect($this->schemas) + ->filter(fn (OAuthSchemaInterface $schema) => $schema->isEnabled()) + ->all(); + } + + public function register(OAuthSchemaInterface $schema): void + { + if (array_key_exists($schema->getId(), $this->schemas)) { + return; + } + + config()->set('services.' . $schema->getId(), array_merge($schema->getServiceConfig(), ['redirect' => '/auth/oauth/callback/' . $schema->getId()])); + + if ($schema->getSocialiteProvider()) { + Event::listen(fn (SocialiteWasCalled $event) => $event->extendSocialite($schema->getId(), $schema->getSocialiteProvider())); + } + + $this->schemas[$schema->getId()] = $schema; + } + + public function linkUser(User $user, OAuthSchemaInterface $schema, OAuthUser $oauthUser): User + { + $oauth = $user->oauth ?? []; + $oauth[$schema->getId()] = $oauthUser->getId(); + + $user->update(['oauth' => $oauth]); + + return $user->refresh(); + } + + public function unlinkUser(User $user, OAuthSchemaInterface $schema): User + { + $oauth = $user->oauth ?? []; + if (!isset($oauth[$schema->getId()])) { + return $user; + } + + unset($oauth[$schema->getId()]); + $user->update(['oauth' => $oauth]); + + return $user->refresh(); + } +} diff --git a/app/Extensions/OAuth/Schemas/AuthentikSchema.php b/app/Extensions/OAuth/Schemas/AuthentikSchema.php new file mode 100644 index 0000000000..95f4fa9356 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/AuthentikSchema.php @@ -0,0 +1,83 @@ + env('OAUTH_AUTHENTIK_BASE_URL'), + ]); + } + + public function getSetupSteps(): array + { + return array_merge([ + Step::make('Create Authentik Application') + ->schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

On your Authentik dashboard select Applications, then select Create with Provider.

On the creation step select OAuth2/OpenID Provider and on the configure step set Redirect URIs/Origins to the value below.

'))), + TextInput::make('_noenv_callback') + ->label('Callback URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/authentik')), + ]), + ], parent::getSetupSteps()); + } + + public function getSettingsForm(): array + { + return array_merge(parent::getSettingsForm(), [ + TextInput::make('OAUTH_AUTHENTIK_BASE_URL') + ->label('Base URL') + ->placeholder('Base URL') + ->columnSpan(2) + ->required() + ->url() + ->autocomplete(false) + ->default(env('OAUTH_AUTHENTIK_BASE_URL')), + TextInput::make('OAUTH_AUTHENTIK_DISPLAY_NAME') + ->label('Display Name') + ->placeholder('Display Name') + ->autocomplete(false) + ->default(env('OAUTH_AUTHENTIK_DISPLAY_NAME', 'Authentik')), + ColorPicker::make('OAUTH_AUTHENTIK_DISPLAY_COLOR') + ->label('Display Color') + ->placeholder('#fd4b2d') + ->default(env('OAUTH_AUTHENTIK_DISPLAY_COLOR', '#fd4b2d')) + ->hex(), + ]); + } + + public function getName(): string + { + return env('OAUTH_AUTHENTIK_DISPLAY_NAME', 'Authentik'); + } + + public function getHexColor(): string + { + return env('OAUTH_AUTHENTIK_DISPLAY_COLOR', '#fd4b2d'); + } +} diff --git a/app/Extensions/OAuth/Schemas/BitbucketSchema.php b/app/Extensions/OAuth/Schemas/BitbucketSchema.php new file mode 100644 index 0000000000..bcb271ee7b --- /dev/null +++ b/app/Extensions/OAuth/Schemas/BitbucketSchema.php @@ -0,0 +1,47 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Visit the Bitbucket OAuth Documentation and follow the steps in Create a consumer.

For the Callback URL use the value below.

'))), + TextInput::make('_noenv_callback') + ->label('Callback URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/bitbucket')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandBitbucketFilled; + } + + public function getHexColor(): string + { + return '#205081'; + } +} diff --git a/app/Extensions/OAuth/Schemas/CommonSchema.php b/app/Extensions/OAuth/Schemas/CommonSchema.php new file mode 100644 index 0000000000..d03fa80dbe --- /dev/null +++ b/app/Extensions/OAuth/Schemas/CommonSchema.php @@ -0,0 +1,41 @@ +id; + } + + public function getName(): string + { + return $this->name ?? parent::getName(); + } + + public function getConfigKey(): string + { + return $this->configName ?? parent::getConfigKey(); + } + + public function getIcon(): null|string|BackedEnum + { + return $this->icon; + } + + public function getHexColor(): ?string + { + return $this->hexColor; + } +} diff --git a/app/Extensions/OAuth/Schemas/DiscordSchema.php b/app/Extensions/OAuth/Schemas/DiscordSchema.php new file mode 100644 index 0000000000..0b43dd4c12 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/DiscordSchema.php @@ -0,0 +1,56 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Visit the Discord Developer Portal and click on New Application. Enter a Name (e.g. your panel name) and click on Create.

Copy the Client ID and the Client Secret from the OAuth2 tab, you will need them in the final step.

'))), + TextEntry::make('set_redirect') + ->hiddenLabel() + ->state(new HtmlString('

Under Redirects add the below URL.

')), + TextInput::make('_noenv_callback') + ->label('Redirect URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->formatStateUsing(fn () => url('/auth/oauth/callback/discord')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandDiscordFilled; + } + + public function getHexColor(): string + { + return '#5865F2'; + } +} diff --git a/app/Extensions/OAuth/Schemas/FacebookSchema.php b/app/Extensions/OAuth/Schemas/FacebookSchema.php new file mode 100644 index 0000000000..15e673a7d3 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/FacebookSchema.php @@ -0,0 +1,50 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Visit the Facebook Developer Dashboard and select or create a new app you will use for authentication. Make sure to have "Authenticate and request data from users with Facebook Login" as one of the Use Cases.

Once selected go to Use Cases and customize "Authenticate and request data from users with Facebook Login", from there go to Settings and add Valid OAuth Redirect URIs using the value below.

'))), + TextInput::make('_noenv_callback') + ->label('Valid OAuth Redirect URIs') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/facebook')), + TextEntry::make('get_app_info') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

To obtain the OAuth values go to App Settings > Basic.

'))), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandFacebookFilled; + } + + public function getHexColor(): string + { + return '#1877f2'; + } +} diff --git a/app/Extensions/OAuth/Schemas/GithubSchema.php b/app/Extensions/OAuth/Schemas/GithubSchema.php new file mode 100644 index 0000000000..089aa185d4 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/GithubSchema.php @@ -0,0 +1,56 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Visit the GitHub Developer Dashboard, go to OAuth Apps and click on New OAuth App.

Enter an Application name (e.g. your panel name), set Homepage URL to your panel url and enter the below url as Authorization callback URL.

'))), + TextInput::make('_noenv_callback') + ->label('Authorization callback URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/github')), + TextEntry::make('register_application') + ->hiddenLabel() + ->state(new HtmlString('

When you filled all fields click on Register application.

')), + ]), + Step::make('Create Client Secret') + ->schema([ + TextEntry::make('create_client_secret') + ->hiddenLabel() + ->state(new HtmlString('

Once you registered your app, generate a new Client Secret.

You will also need the Client ID.

')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandGithubFilled; + } + + public function getHexColor(): string + { + return '#4078c0'; + } +} diff --git a/app/Extensions/OAuth/Schemas/GitlabSchema.php b/app/Extensions/OAuth/Schemas/GitlabSchema.php new file mode 100644 index 0000000000..692acf7862 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/GitlabSchema.php @@ -0,0 +1,67 @@ + env('OAUTH_GITLAB_HOST'), + ]); + } + + public function getSettingsForm(): array + { + return array_merge(parent::getSettingsForm(), [ + TextInput::make('OAUTH_GITLAB_HOST') + ->label('Custom Host') + ->placeholder('Only set a custom host if you are self hosting gitlab') + ->columnSpan(2) + ->url() + ->autocomplete(false) + ->default(env('OAUTH_GITLAB_HOST')), + ]); + } + + public function getSetupSteps(): array + { + return array_merge([ + Step::make('Register new Gitlab OAuth App') + ->schema([ + TextEntry::make('register_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('Check out the Gitlab docs on how to create the oauth app.'))), + TextInput::make('_noenv_callback') + ->label('Redirect URI') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/gitlab')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandGitlab; + } + + public function getHexColor(): string + { + return '#fca326'; + } +} diff --git a/app/Extensions/OAuth/Schemas/GoogleSchema.php b/app/Extensions/OAuth/Schemas/GoogleSchema.php new file mode 100644 index 0000000000..0caa3ae9b9 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/GoogleSchema.php @@ -0,0 +1,56 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Visit the Google API Console and create or select the project you want to use.

Navigate or search Credentials, click on the Create Credentials button and select OAuth client ID. On the Application type select Web Application.

On Authorized JavaScript origins and Authorized redirect URIs add and use the values below.

'))), + TextInput::make('_noenv_origin') + ->label('Authorized JavaScript origins') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('')), + TextInput::make('_noenv_callback') + ->label('Authorized redirect URIs') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/google')), + TextEntry::make('register_application') + ->hiddenLabel() + ->state(new HtmlString('

When you filled all fields click on Create.

')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandGoogleFilled; + } + + public function getHexColor(): string + { + return '#4285f4'; + } +} diff --git a/app/Extensions/OAuth/Schemas/LinkedinSchema.php b/app/Extensions/OAuth/Schemas/LinkedinSchema.php new file mode 100644 index 0000000000..b198439c0a --- /dev/null +++ b/app/Extensions/OAuth/Schemas/LinkedinSchema.php @@ -0,0 +1,47 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Create or select the one you will be using for authentication.

Select the Auth tab and set Authorized redirect URLs for your app to the value below.

'))), + TextInput::make('_noenv_callback') + ->label('Authorized redirect URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/linkedin')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandLinkedinFilled; + } + + public function getHexColor(): string + { + return '#0a66c2'; + } +} diff --git a/app/Extensions/OAuth/Schemas/OAuthSchema.php b/app/Extensions/OAuth/Schemas/OAuthSchema.php new file mode 100644 index 0000000000..c9f1b38a76 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/OAuthSchema.php @@ -0,0 +1,139 @@ +getId()); + + return [ + 'client_id' => env("OAUTH_{$id}_CLIENT_ID"), + 'client_secret' => env("OAUTH_{$id}_CLIENT_SECRET"), + ]; + } + + /** + * @return Component[] + */ + public function getSettingsForm(): array + { + $id = Str::upper($this->getId()); + + return [ + TextInput::make("OAUTH_{$id}_CLIENT_ID") + ->label('Client ID') + ->placeholder('Client ID') + ->columnSpan(2) + ->required() + ->password() + ->revealable() + ->autocomplete(false) + ->default(env("OAUTH_{$id}_CLIENT_ID")), + TextInput::make("OAUTH_{$id}_CLIENT_SECRET") + ->label('Client Secret') + ->placeholder('Client Secret') + ->columnSpan(2) + ->required() + ->password() + ->revealable() + ->autocomplete(false) + ->default(env("OAUTH_{$id}_CLIENT_SECRET")), + Toggle::make("OAUTH_{$id}_SHOULD_CREATE_MISSING_USERS") + ->label(trans('admin/setting.oauth.create_missing_users')) + ->columnSpan(2) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->formatStateUsing(fn ($state) => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set("OAUTH_{$id}_SHOULD_CREATE_MISSING_USERS", (bool) $state)) + ->default(env("OAUTH_{$id}_SHOULD_CREATE_MISSING_USERS")), + Toggle::make("OAUTH_{$id}_SHOULD_LINK_MISSING_USERS") + ->label(trans('admin/setting.oauth.link_missing_users')) + ->columnSpan(2) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->formatStateUsing(fn ($state) => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set("OAUTH_{$id}_SHOULD_LINK_MISSING_USERS", (bool) $state)) + ->default(env("OAUTH_{$id}_SHOULD_LINK_MISSING_USERS")), + ]; + } + + /** + * @return Step[] + */ + public function getSetupSteps(): array + { + return [ + Step::make('OAuth Config') + ->columns(4) + ->schema($this->getSettingsForm()), + ]; + } + + public function getName(): string + { + return Str::title($this->getId()); + } + + public function getConfigKey(): string + { + $id = Str::upper($this->getId()); + + return "OAUTH_{$id}_ENABLED"; + } + + public function getIcon(): null|string|BackedEnum + { + return null; + } + + public function getHexColor(): ?string + { + return null; + } + + public function isEnabled(): bool + { + return env($this->getConfigKey(), false); + } + + public function shouldCreateMissingUser(OAuthUser $user): bool + { + $id = Str::upper($this->getId()); + + return env("OAUTH_{$id}_SHOULD_CREATE_MISSING_USERS", false); + } + + public function shouldLinkMissingUser(User $user, OAuthUser $oauthUser): bool + { + $id = Str::upper($this->getId()); + + return env("OAUTH_{$id}_SHOULD_LINK_MISSING_USERS", false); + } +} diff --git a/app/Extensions/OAuth/Schemas/SlackSchema.php b/app/Extensions/OAuth/Schemas/SlackSchema.php new file mode 100644 index 0000000000..2028edfdac --- /dev/null +++ b/app/Extensions/OAuth/Schemas/SlackSchema.php @@ -0,0 +1,47 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Create a slack app or select the one you will be using for authentication.

Navigate to the OAuth & Permissions section and configure the Redirect URL using the value below.

'))), + TextInput::make('_noenv_callback') + ->label('Redirect URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/slack')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandSlack; + } + + public function getHexColor(): string + { + return '#6ecadc'; + } +} diff --git a/app/Extensions/OAuth/Schemas/SteamSchema.php b/app/Extensions/OAuth/Schemas/SteamSchema.php new file mode 100644 index 0000000000..29b179a1b2 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/SteamSchema.php @@ -0,0 +1,73 @@ + null, + 'client_secret' => env('OAUTH_STEAM_CLIENT_SECRET'), + 'allowed_hosts' => [ + str_replace(['http://', 'https://'], '', env('APP_URL')), + ], + ]; + } + + public function getSettingsForm(): array + { + return [ + TextInput::make('OAUTH_STEAM_CLIENT_SECRET') + ->label('Web API Key') + ->placeholder('Web API Key') + ->columnSpan(4) + ->required() + ->password() + ->revealable() + ->autocomplete(false) + ->default(env('OAUTH_STEAM_CLIENT_SECRET')), + ]; + } + + public function getSetupSteps(): array + { + return array_merge([ + Step::make('Create API Key') + ->schema([ + TextEntry::make('create_api_key') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('Visit https://steamcommunity.com/dev/apikey to generate an API key.'))), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandSteamFilled; + } + + public function getHexColor(): string + { + return '#00adee'; + } +} diff --git a/app/Extensions/OAuth/Schemas/XSchema.php b/app/Extensions/OAuth/Schemas/XSchema.php new file mode 100644 index 0000000000..52952bbe67 --- /dev/null +++ b/app/Extensions/OAuth/Schemas/XSchema.php @@ -0,0 +1,56 @@ +schema([ + TextEntry::make('create_application') + ->hiddenLabel() + ->state(new HtmlString(Blade::render('

Visit the X Developer Dashboard and create or select the project app you want to use.

Go to the app\'s settings and set up User authentication if not yet. Make sure to select Web App as the type of app.

For the Callback URI / Redirect URL and Website URL set it using the value below.

'))), + TextInput::make('_noenv_origin') + ->label('Website URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('')), + TextInput::make('_noenv_callback') + ->label('Callback URI / Redirect URL') + ->dehydrated() + ->disabled() + ->hintCopy() + ->default(fn () => url('/auth/oauth/callback/x')), + TextEntry::make('register_application') + ->hiddenLabel() + ->state(new HtmlString('

If you have already set this up go to your app\'s Keys and tokens and obtain the Client ID and Secret there.

')), + ]), + ], parent::getSetupSteps()); + } + + public function getIcon(): BackedEnum + { + return TablerIcon::BrandX; + } + + public function getHexColor(): string + { + return '#1da1f2'; + } +} diff --git a/app/Extensions/Spatie/Fractalistic/Fractal.php b/app/Extensions/Spatie/Fractalistic/Fractal.php index fba04f66fa..4c52f792fc 100644 --- a/app/Extensions/Spatie/Fractalistic/Fractal.php +++ b/app/Extensions/Spatie/Fractalistic/Fractal.php @@ -2,20 +2,22 @@ namespace App\Extensions\Spatie\Fractalistic; +use App\Extensions\League\Fractal\Serializers\PanelSerializer; +use Illuminate\Contracts\Pagination\LengthAwarePaginator; +use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Scope; use League\Fractal\TransformerAbstract; use Spatie\Fractal\Fractal as SpatieFractal; -use Illuminate\Contracts\Pagination\LengthAwarePaginator; -use League\Fractal\Pagination\IlluminatePaginatorAdapter; -use App\Extensions\League\Fractal\Serializers\PanelSerializer; +use Spatie\Fractalistic\Exceptions\InvalidTransformation; +use Spatie\Fractalistic\Exceptions\NoTransformerSpecified; class Fractal extends SpatieFractal { /** * Create fractal data. * - * @throws \Spatie\Fractalistic\Exceptions\InvalidTransformation - * @throws \Spatie\Fractalistic\Exceptions\NoTransformerSpecified + * @throws InvalidTransformation + * @throws NoTransformerSpecified */ public function createData(): Scope { diff --git a/app/Extensions/Tasks/Schemas/CreateBackupSchema.php b/app/Extensions/Tasks/Schemas/CreateBackupSchema.php new file mode 100644 index 0000000000..98927ab08c --- /dev/null +++ b/app/Extensions/Tasks/Schemas/CreateBackupSchema.php @@ -0,0 +1,32 @@ +backupService->setIgnoredFiles(explode(PHP_EOL, $task->payload))->handle($task->server, null, true); + } + + public function canCreate(Schedule $schedule): bool + { + return $schedule->server->backup_limit > 0; + } + + public function getPayloadLabel(): string + { + return trans('server/schedule.tasks.actions.backup.files_to_ignore'); + } +} diff --git a/app/Extensions/Tasks/Schemas/DeleteFilesSchema.php b/app/Extensions/Tasks/Schemas/DeleteFilesSchema.php new file mode 100644 index 0000000000..a23e5971c1 --- /dev/null +++ b/app/Extensions/Tasks/Schemas/DeleteFilesSchema.php @@ -0,0 +1,26 @@ +deleteFilesService->handle($task->server, explode(PHP_EOL, $task->payload)); + } + + public function getPayloadLabel(): string + { + return trans('server/schedule.tasks.actions.delete_files.files_to_delete'); + } +} diff --git a/app/Extensions/Tasks/Schemas/PowerActionSchema.php b/app/Extensions/Tasks/Schemas/PowerActionSchema.php new file mode 100644 index 0000000000..777a20bf47 --- /dev/null +++ b/app/Extensions/Tasks/Schemas/PowerActionSchema.php @@ -0,0 +1,57 @@ +serverRepository->setServer($task->server)->power($task->payload); + } + + public function getDefaultPayload(): string + { + return 'restart'; + } + + public function getPayloadLabel(): string + { + return trans('server/schedule.tasks.actions.power.action'); + } + + public function formatPayload(string $payload): string + { + return Str::ucfirst($payload); + } + + /** @return Component[] */ + public function getPayloadForm(): array + { + return [ + Select::make('payload') + ->label($this->getPayloadLabel()) + ->required() + ->options([ + 'start' => trans('server/schedule.tasks.actions.power.start'), + 'restart' => trans('server/schedule.tasks.actions.power.restart'), + 'stop' => trans('server/schedule.tasks.actions.power.stop'), + 'kill' => trans('server/schedule.tasks.actions.power.kill'), + ]) + ->selectablePlaceholder(false) + ->default($this->getDefaultPayload()), + ]; + } +} diff --git a/app/Extensions/Tasks/Schemas/SendCommandSchema.php b/app/Extensions/Tasks/Schemas/SendCommandSchema.php new file mode 100644 index 0000000000..5d6c680423 --- /dev/null +++ b/app/Extensions/Tasks/Schemas/SendCommandSchema.php @@ -0,0 +1,36 @@ +server->send($task->payload); + } + + public function getPayloadLabel(): string + { + return trans('server/schedule.tasks.actions.command.command'); + } + + /** @return Component[] */ + public function getPayloadForm(): array + { + return [ + TextInput::make('payload') + ->required() + ->label($this->getPayloadLabel()) + ->default($this->getDefaultPayload()), + ]; + } +} diff --git a/app/Extensions/Tasks/Schemas/TaskSchema.php b/app/Extensions/Tasks/Schemas/TaskSchema.php new file mode 100644 index 0000000000..8b8e02c09a --- /dev/null +++ b/app/Extensions/Tasks/Schemas/TaskSchema.php @@ -0,0 +1,52 @@ +getId() . '.title'); + } + + public function canCreate(Schedule $schedule): bool + { + return true; + } + + public function getDefaultPayload(): ?string + { + return null; + } + + public function getPayloadLabel(): ?string + { + return null; + } + + /** @return null|string|string[] */ + public function formatPayload(string $payload): null|string|array + { + if (empty($payload)) { + return null; + } + + return explode(PHP_EOL, $payload); + } + + /** @return Component[] */ + public function getPayloadForm(): array + { + return [ + Textarea::make('payload') + ->label($this->getPayloadLabel() ?? trans('server/schedule.tasks.payload')) + ->default($this->getDefaultPayload()) + ->autosize(), + ]; + } +} diff --git a/app/Extensions/Tasks/TaskSchemaInterface.php b/app/Extensions/Tasks/TaskSchemaInterface.php new file mode 100644 index 0000000000..c832562aac --- /dev/null +++ b/app/Extensions/Tasks/TaskSchemaInterface.php @@ -0,0 +1,28 @@ + */ + private array $schemas = []; + + /** + * @return TaskSchemaInterface[] + */ + public function getAll(): array + { + return $this->schemas; + } + + public function get(string $id): ?TaskSchemaInterface + { + return array_get($this->schemas, $id); + } + + public function register(TaskSchemaInterface $schema): void + { + if (array_key_exists($schema->getId(), $this->schemas)) { + return; + } + + $this->schemas[$schema->getId()] = $schema; + } + + /** @return array */ + public function getMappings(): array + { + return collect($this->schemas)->mapWithKeys(fn ($schema) => [$schema->getId() => $schema->getName()])->all(); + } +} diff --git a/app/Extensions/Themes/Theme.php b/app/Extensions/Themes/Theme.php deleted file mode 100644 index 2badc3dcb0..0000000000 --- a/app/Extensions/Themes/Theme.php +++ /dev/null @@ -1,21 +0,0 @@ -' . PHP_EOL, $this->getUrl($path)); - } - - public function css($path): string - { - return sprintf('' . PHP_EOL, $this->getUrl($path)); - } - - protected function getUrl($path): string - { - return '/themes/panel/' . ltrim($path, '/'); - } -} diff --git a/app/Facades/Activity.php b/app/Facades/Activity.php index 763e45e652..36a6ac352b 100644 --- a/app/Facades/Activity.php +++ b/app/Facades/Activity.php @@ -2,8 +2,8 @@ namespace App\Facades; -use Illuminate\Support\Facades\Facade; use App\Services\Activity\ActivityLogService; +use Illuminate\Support\Facades\Facade; class Activity extends Facade { diff --git a/app/Facades/LogBatch.php b/app/Facades/LogBatch.php deleted file mode 100644 index 03fa90c2fc..0000000000 --- a/app/Facades/LogBatch.php +++ /dev/null @@ -1,14 +0,0 @@ -softwareVersionService = $softwareVersionService; + } + + public function getColumns(): int|array + { + return 1; + } + + public function getHeading(): string + { + return trans('admin/dashboard.heading'); + } + + public function getSubheading(): string + { + return trans('admin/dashboard.version', ['version' => $this->softwareVersionService->currentPanelVersion()]); + } +} diff --git a/app/Filament/Admin/Pages/Health.php b/app/Filament/Admin/Pages/Health.php new file mode 100644 index 0000000000..7518d5ab7e --- /dev/null +++ b/app/Filament/Admin/Pages/Health.php @@ -0,0 +1,176 @@ + */ + protected $listeners = [ + 'refresh-component' => '$refresh', + ]; + + public function getTitle(): string + { + return trans('admin/health.title'); + } + + public static function getNavigationLabel(): string + { + return trans('admin/health.title'); + } + + public static function getNavigationGroup(): ?string + { + return trans('admin/dashboard.advanced'); + } + + public static function canAccess(): bool + { + return user()?->can('view health'); + } + + protected function getActions(): array + { + return [ + Action::make('refresh') + ->hiddenLabel() + ->tooltip(trans('admin/health.refresh')) + ->icon(TablerIcon::Refresh) + ->action('refresh'), + ]; + } + + protected function getViewData(): array + { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + $checkResults = app(ResultStore::class)->latestResults(); + + if ($checkResults === null) { + Artisan::call(RunHealthChecksCommand::class); + + $this->dispatch('refresh-component'); + } + + return [ + 'lastRanAt' => new Carbon($checkResults?->finishedAt), + 'checkResults' => $checkResults, + ]; + } + + public function refresh(): void + { + Artisan::call(RunHealthChecksCommand::class); + + $this->dispatch('refresh-component'); + + Notification::make() + ->title(trans('admin/health.results_refreshed')) + ->success() + ->send(); + } + + public static function getNavigationBadge(): ?string + { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + $results = app(ResultStore::class)->latestResults(); + + if ($results === null) { + return null; + } + + $results = json_decode($results->toJson(), true); + + $failed = array_reduce($results['checkResults'], function ($numFailed, $result) { + return $numFailed + ($result['status'] === 'failed' ? 1 : 0); + }, 0); + + return $failed === 0 ? null : (string) $failed; + } + + public static function getNavigationBadgeColor(): string + { + return self::getNavigationBadge() > null ? 'danger' : ''; + } + + public static function getNavigationBadgeTooltip(): ?string + { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + $results = app(ResultStore::class)->latestResults(); + + if ($results === null) { + return null; + } + + $results = json_decode($results->toJson(), true); + + $failedNames = array_reduce($results['checkResults'], function ($carry, $result) { + if ($result['status'] === 'failed') { + $carry[] = $result['name']; + } + + return $carry; + }, []); + + return trans('admin/health.checks.failed', ['checks' => implode(', ', $failedNames)]); + } + + public static function getNavigationIcon(): BackedEnum + { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + $results = app(ResultStore::class)->latestResults(); + + if ($results === null) { + return TablerIcon::HeartQuestion; + } + + return $results->containsFailingCheck() ? TablerIcon::HeartExclamation : TablerIcon::HeartCheck; + } + + public function backgroundColor(string $str): string + { + return match ($str) { + Status::ok()->value => 'bg-success-100 dark:bg-success-200', + Status::warning()->value => 'bg-warning-100 dark:bg-warning-200', + Status::skipped()->value => 'bg-info-100 dark:bg-info-200', + Status::failed()->value, Status::crashed()->value => 'bg-danger-100 dark:bg-danger-200', + default => 'bg-gray-100 dark:bg-gray-200' + }; + } + + public function iconColor(string $str): string + { + return match ($str) { + Status::ok()->value => 'text-success-500 dark:text-success-600', + Status::warning()->value => 'text-warning-500 dark:text-warning-600', + Status::skipped()->value => 'text-info-500 dark:text-info-600', + Status::failed()->value, Status::crashed()->value => 'text-danger-500 dark:text-danger-600', + default => 'text-gray-500 dark:text-gray-600' + }; + } + + public function icon(string $str): BackedEnum + { + return match ($str) { + Status::ok()->value => TablerIcon::CircleCheck, + Status::warning()->value => TablerIcon::ExclamationCircle, + Status::skipped()->value => TablerIcon::CircleChevronRight, + Status::failed()->value, Status::crashed()->value => TablerIcon::CircleX, + default => TablerIcon::HelpCircle + }; + } +} diff --git a/app/Filament/Admin/Pages/ListLogs.php b/app/Filament/Admin/Pages/ListLogs.php new file mode 100644 index 0000000000..032d3c66ad --- /dev/null +++ b/app/Filament/Admin/Pages/ListLogs.php @@ -0,0 +1,128 @@ +emptyStateHeading(trans('admin/log.empty_table')) + ->emptyStateIcon(TablerIcon::Check) + ->columns([ + NameColumn::make('date'), + LevelColumn::make(Level::ALL) + ->tooltip(trans('admin/log.total_logs')), + LevelColumn::make(Level::Error) + ->tooltip(trans('admin/log.error')), + LevelColumn::make(Level::Warning) + ->tooltip(trans('admin/log.warning')), + LevelColumn::make(Level::Notice) + ->tooltip(trans('admin/log.notice')), + LevelColumn::make(Level::Info) + ->tooltip(trans('admin/log.info')), + LevelColumn::make(Level::Debug) + ->tooltip(trans('admin/log.debug')), + ]) + ->recordActions([ + ViewLogAction::make() + ->icon(TablerIcon::FileDescription)->iconButton(), + DownloadAction::make() + ->tooltip(fn ($record) => trans('filament-log-viewer::log.table.actions.download.label', ['log' => ParseDateUseCase::execute($record['date'])])) + ->icon(TablerIcon::FileDownload)->iconButton(), + Action::make('uploadLogs') + ->hiddenLabel() + ->tooltip(trans('admin/log.actions.upload_tooltip', ['url' => 'logs.pelican.dev'])) + ->icon(TablerIcon::WorldUpload) + ->requiresConfirmation() + ->modalHeading(trans('admin/log.actions.upload_logs')) + ->modalDescription(fn ($record) => trans('admin/log.actions.upload_logs_description', ['file' => $record['date'], 'url' => 'https://logs.pelican.dev'])) + ->action(function ($record) { + $prefix = config('filament-log-viewer.pattern.prefix', 'laravel-'); + $extension = config('filament-log-viewer.pattern.extension', '.log'); + $logPath = storage_path('logs/' . $prefix . $record['date'] . $extension); + + if (!file_exists($logPath)) { + Notification::make() + ->title(trans('admin/log.actions.log_not_found')) + ->body(trans('admin/log.actions.log_not_found_description', ['filename' => $record['date']])) + ->danger() + ->send(); + + return; + } + + $lines = file($logPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $totalLines = count($lines); + $uploadLines = $totalLines <= 1000 ? $lines : array_slice($lines, -1000); + $content = implode("\n", $uploadLines); + + try { + $response = Http::timeout(10) + ->asMultipart() + ->attach('c', $content) + ->attach('e', '14d') + ->post('https://logs.pelican.dev'); + + if ($response->failed()) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body(trans('admin/log.actions.failed_to_upload_description', ['status' => $response->status()])) + ->danger() + ->send(); + + return; + } + + $data = $response->json(); + $url = $data['url']; + + Notification::make() + ->title(trans('admin/log.actions.log_upload')) + ->body("{$url}") + ->success() + ->actions([ + Action::make('exclude_viewLogs') + ->label(trans('admin/log.actions.view_logs')) + ->url($url) + ->openUrlInNewTab(true), + ]) + ->persistent() + ->send(); + + } catch (\Exception $e) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body($e->getMessage()) + ->danger() + ->send(); + + return; + } + }), + DeleteAction::make() + ->icon(TablerIcon::Trash)->iconButton(), + ]); + } +} diff --git a/app/Filament/Admin/Pages/Settings.php b/app/Filament/Admin/Pages/Settings.php new file mode 100644 index 0000000000..fea6c11c0d --- /dev/null +++ b/app/Filament/Admin/Pages/Settings.php @@ -0,0 +1,878 @@ +|null */ + public ?array $data = []; + + public function mount(): void + { + $this->form->fill(); + } + + public function boot(OAuthService $oauthService, AvatarService $avatarService, CaptchaService $captchaService, IconFactory $iconFactory): void + { + $this->oauthService = $oauthService; + $this->avatarService = $avatarService; + $this->captchaService = $captchaService; + $this->iconFactory = $iconFactory; + } + + public static function canAccess(): bool + { + return user()?->can('view settings'); + } + + public function getTitle(): string + { + return trans('admin/setting.title'); + } + + public static function getNavigationLabel(): string + { + return trans('admin/setting.title'); + } + + /** @return array */ + protected function getFormSchema(): array + { + return [ + Tabs::make('Tabs') + ->columns() + ->persistTabInQueryString() + ->disabled(fn () => !user()?->can('update settings')) + ->tabs($this->getTabs()), + ]; + } + + /** + * @return Tab[] + * + * @throws Exception + */ + protected function getDefaultTabs(): array + { + return [ + Tab::make('general') + ->label(trans('admin/setting.navigation.general')) + ->icon(TablerIcon::Home) + ->schema($this->generalSettings()), + Tab::make('captcha') + ->label(trans('admin/setting.navigation.captcha')) + ->icon(TablerIcon::Shield) + ->schema($this->captchaSettings()) + ->columns(1), + Tab::make('mail') + ->label(trans('admin/setting.navigation.mail')) + ->icon(TablerIcon::Mail) + ->schema($this->mailSettings()), + Tab::make('backup') + ->label(trans('admin/setting.navigation.backup')) + ->icon(TablerIcon::Box) + ->schema($this->backupSettings()), + Tab::make('oauth') + ->label(trans('admin/setting.navigation.oauth')) + ->icon(TablerIcon::BrandOauth) + ->schema($this->oauthSettings()) + ->columns(1), + Tab::make('misc') + ->label(trans('admin/setting.navigation.misc')) + ->icon(TablerIcon::Tool) + ->schema($this->miscSettings()), + ]; + } + + /** @return Component[] + * @throws Exception + */ + private function generalSettings(): array + { + return [ + TextInput::make('APP_NAME') + ->label(trans('admin/setting.general.app_name')) + ->required() + ->default(env('APP_NAME', 'Pelican')), + Group::make() + ->columns(2) + ->schema([ + TextInput::make('APP_LOGO') + ->label(trans('admin/setting.general.app_logo')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/setting.general.app_logo_help')) + ->default(env('APP_LOGO')) + ->placeholder('/pelican.svg'), + TextInput::make('APP_FAVICON') + ->label(trans('admin/setting.general.app_favicon')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/setting.general.app_favicon_help')) + ->required() + ->default(env('APP_FAVICON', '/pelican.ico')) + ->placeholder('/pelican.ico'), + ]), + Group::make() + ->columns(2) + ->schema([ + Toggle::make('APP_DEBUG') + ->label(trans('admin/setting.general.debug_mode')) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->stateCast(new BooleanStateCast(false)) + ->default(env('APP_DEBUG', config('app.debug'))), + ]), + Group::make() + ->columns(2) + ->schema([ + Select::make('FILAMENT_AVATAR_PROVIDER') + ->label(trans('admin/setting.general.avatar_provider')) + ->options($this->avatarService->getMappings()) + ->selectablePlaceholder(false) + ->default(env('FILAMENT_AVATAR_PROVIDER', config('panel.filament.avatar-provider'))), + Toggle::make('FILAMENT_UPLOADABLE_AVATARS') + ->label(trans('admin/setting.general.uploadable_avatars')) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->stateCast(new BooleanStateCast(false)) + ->default(env('FILAMENT_UPLOADABLE_AVATARS', config('panel.filament.uploadable-avatars'))), + ]), + ToggleButtons::make('PANEL_USE_BINARY_PREFIX') + ->label(trans('admin/setting.general.unit_prefix')) + ->inline() + ->options([ + 0 => trans('admin/setting.general.decimal_prefix'), + 1 => trans('admin/setting.general.binary_prefix'), + ]) + ->stateCast(new BooleanStateCast(false, true)) + ->default(env('PANEL_USE_BINARY_PREFIX', config('panel.use_binary_prefix'))), + ToggleButtons::make('FILAMENT_DEFAULT_NAVIGATION') + ->label(trans('admin/setting.general.default_navigation')) + ->inline() + ->options([ + 'sidebar' => trans('admin/setting.general.sidebar'), + 'topbar' => trans('admin/setting.general.topbar'), + 'mixed' => trans('admin/setting.general.mixed'), + ]) + ->default(env('FILAMENT_DEFAULT_NAVIGATION', config('panel.filament.default-navigation'))), + ToggleButtons::make('APP_2FA_REQUIRED') + ->label(trans('admin/setting.general.2fa_requirement')) + ->inline() + ->options([ + 0 => trans('admin/setting.general.not_required'), + 1 => trans('admin/setting.general.admins_only'), + 2 => trans('admin/setting.general.all_users'), + ]) + ->formatStateUsing(fn ($state): int => (int) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set('APP_2FA_REQUIRED', (int) $state)) + ->default(env('APP_2FA_REQUIRED', config('panel.auth.2fa_required'))), + Select::make('FILAMENT_WIDTH') + ->label(trans('admin/setting.general.display_width')) + ->options(Width::class) + ->selectablePlaceholder(false) + ->default(env('FILAMENT_WIDTH', config('panel.filament.display-width'))), + TagsInput::make('TRUSTED_PROXIES') + ->label(trans('admin/setting.general.trusted_proxies')) + ->separator() + ->splitKeys(['Tab', ' ']) + ->placeholder(trans('admin/setting.general.trusted_proxies_help')) + ->default(env('TRUSTED_PROXIES', implode(',', Arr::wrap(config('trustedproxy.proxies'))))) + ->hintActions([ + Action::make('hint_clear') + ->label(trans('admin/setting.general.clear')) + ->color('danger') + ->icon(TablerIcon::Trash) + ->requiresConfirmation() + ->authorize(fn () => user()?->can('update settings')) + ->action(fn (Set $set) => $set('TRUSTED_PROXIES', [])), + Action::make('hint_cloudflare') + ->label(trans('admin/setting.general.set_to_cf')) + ->icon(TablerIcon::BrandCloudflare) + ->authorize(fn () => user()?->can('update settings')) + ->action(function (Factory $client, Set $set) { + $ips = collect(); + + try { + $response = $client + ->timeout(3) + ->connectTimeout(3) + ->get('https://api.cloudflare.com/client/v4/ips'); + + if ($response->status() === 200) { + $result = $response->json('result'); + foreach (['ipv4_cidrs', 'ipv6_cidrs'] as $value) { + $ips->push(...data_get($result, $value)); + } + $ips->unique(); + } + } catch (Exception) { + } + + $set('TRUSTED_PROXIES', $ips->values()->all()); + }), + ]), + ]; + } + + /** + * @return Component[] + * + * @throws Exception + */ + private function captchaSettings(): array + { + $formFields = []; + + $captchaSchemas = $this->captchaService->getAll(); + foreach ($captchaSchemas as $schema) { + $id = Str::upper($schema->getId()); + + $formFields[] = Section::make($schema->getName()) + ->columns(5) + ->icon($schema->getIcon() ?? TablerIcon::Shield) + ->collapsed(fn () => !$schema->isEnabled()) + ->collapsible() + ->schema([ + Hidden::make("CAPTCHA_{$id}_ENABLED") + ->live() + ->default(env("CAPTCHA_{$id}_ENABLED")), + Actions::make([ + Action::make("disable_captcha_$id") + ->visible(fn (Get $get) => $get("CAPTCHA_{$id}_ENABLED")) + ->disabled(fn () => !user()?->can('update settings')) + ->label(trans('admin/setting.captcha.disable')) + ->color('danger') + ->action(fn (Set $set) => $set("CAPTCHA_{$id}_ENABLED", false)), + Action::make("enable_captcha_$id") + ->visible(fn (Get $get) => !$get("CAPTCHA_{$id}_ENABLED")) + ->disabled(fn () => !user()?->can('update settings')) + ->label(trans('admin/setting.captcha.enable')) + ->color('success') + ->action(fn (Set $set) => $set("CAPTCHA_{$id}_ENABLED", true)), + ])->columnSpan(1), + Group::make($schema->getSettingsForm()) + ->visible(fn (Get $get) => $get("CAPTCHA_{$id}_ENABLED")) + ->columns(4) + ->columnSpan(4), + ]); + } + + return $formFields; + } + + /** + * @return Component[] + * + * @throws Exception + */ + private function mailSettings(): array + { + return [ + ToggleButtons::make('MAIL_MAILER') + ->label(trans('admin/setting.mail.mail_driver')) + ->columnSpanFull() + ->inline() + ->options([ + 'log' => '/storage/logs Directory', + 'smtp' => 'SMTP Server', + 'mailgun' => 'Mailgun', + 'mandrill' => 'Mandrill', + 'postmark' => 'Postmark', + 'sendmail' => 'sendmail (PHP)', + ]) + ->live() + ->default(env('MAIL_MAILER', config('mail.default'))) + ->hintAction( + Action::make('hint_test') + ->label(trans('admin/setting.mail.test_mail')) + ->icon(TablerIcon::Send) + ->hidden(fn (Get $get) => $get('MAIL_MAILER') === 'log') + ->authorize(fn () => user()?->can('update settings')) + ->action(function (Get $get) { + // Store original mail configuration + $originalConfig = [ + 'mail.default' => config('mail.default'), + 'mail.mailers.smtp.host' => config('mail.mailers.smtp.host'), + 'mail.mailers.smtp.port' => config('mail.mailers.smtp.port'), + 'mail.mailers.smtp.username' => config('mail.mailers.smtp.username'), + 'mail.mailers.smtp.password' => config('mail.mailers.smtp.password'), + 'mail.mailers.smtp.scheme' => config('mail.mailers.smtp.scheme'), + 'mail.from.address' => config('mail.from.address'), + 'mail.from.name' => config('mail.from.name'), + 'services.mailgun.domain' => config('services.mailgun.domain'), + 'services.mailgun.secret' => config('services.mailgun.secret'), + 'services.mailgun.endpoint' => config('services.mailgun.endpoint'), + ]; + + try { + // Update mail configuration dynamically + config([ + 'mail.default' => $get('MAIL_MAILER'), + 'mail.mailers.smtp.host' => $get('MAIL_HOST'), + 'mail.mailers.smtp.port' => $get('MAIL_PORT'), + 'mail.mailers.smtp.username' => $get('MAIL_USERNAME'), + 'mail.mailers.smtp.password' => $get('MAIL_PASSWORD'), + 'mail.mailers.smtp.scheme' => $get('MAIL_SCHEME'), + 'mail.from.address' => $get('MAIL_FROM_ADDRESS'), + 'mail.from.name' => $get('MAIL_FROM_NAME'), + 'services.mailgun.domain' => $get('MAILGUN_DOMAIN'), + 'services.mailgun.secret' => $get('MAILGUN_SECRET'), + 'services.mailgun.endpoint' => $get('MAILGUN_ENDPOINT'), + ]); + + MailNotification::route('mail', user()?->email) + ->notify(new MailTested(user())); + + Notification::make() + ->title(trans('admin/setting.mail.test_mail_sent')) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/setting.mail.test_mail_failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + } finally { + config($originalConfig); + } + }) + ), + Section::make(trans('admin/setting.mail.from_settings')) + ->description(trans('admin/setting.mail.from_settings_help')) + ->columns() + ->columnSpanFull() + ->schema([ + TextInput::make('MAIL_FROM_ADDRESS') + ->label(trans('admin/setting.mail.from_address')) + ->required() + ->email() + ->default(env('MAIL_FROM_ADDRESS', config('mail.from.address'))), + TextInput::make('MAIL_FROM_NAME') + ->label(trans('admin/setting.mail.from_name')) + ->required() + ->default(env('MAIL_FROM_NAME', config('mail.from.name'))), + ]), + Section::make(trans('admin/setting.mail.smtp.smtp_title')) + ->columns() + ->columnSpanFull() + ->visible(fn (Get $get) => $get('MAIL_MAILER') === 'smtp') + ->schema([ + TextInput::make('MAIL_HOST') + ->label(trans('admin/setting.mail.smtp.host')) + ->required() + ->default(env('MAIL_HOST', config('mail.mailers.smtp.host'))), + TextInput::make('MAIL_PORT') + ->label(trans('admin/setting.mail.smtp.port')) + ->required() + ->numeric() + ->minValue(1) + ->maxValue(65535) + ->default(env('MAIL_PORT', config('mail.mailers.smtp.port'))), + TextInput::make('MAIL_USERNAME') + ->label(trans('admin/setting.mail.smtp.username')) + ->default(env('MAIL_USERNAME', config('mail.mailers.smtp.username'))), + TextInput::make('MAIL_PASSWORD') + ->label(trans('admin/setting.mail.smtp.password')) + ->password() + ->revealable() + ->default(env('MAIL_PASSWORD')), + ToggleButtons::make('MAIL_SCHEME') + ->label(trans('admin/setting.mail.smtp.scheme')) + ->inline() + ->options([ + 'smtp' => 'SMTP', + 'smtps' => 'SMTPS', + ]) + ->default(env('MAIL_SCHEME', config('mail.mailers.smtp.scheme'))) + ->live() + ->afterStateUpdated(function ($state, Set $set) { + $set('MAIL_PORT', $state === 'smtps' ? 587 : 2525); + }), + ]), + Section::make(trans('admin/setting.mail.mailgun.mailgun_title')) + ->columns() + ->columnSpanFull() + ->visible(fn (Get $get) => $get('MAIL_MAILER') === 'mailgun') + ->schema([ + TextInput::make('MAILGUN_DOMAIN') + ->label(trans('admin/setting.mail.mailgun.domain')) + ->required() + ->default(env('MAILGUN_DOMAIN', config('services.mailgun.domain'))), + TextInput::make('MAILGUN_SECRET') + ->label(trans('admin/setting.mail.mailgun.secret')) + ->required() + ->default(env('MAILGUN_SECRET', config('services.mailgun.secret'))), + TextInput::make('MAILGUN_ENDPOINT') + ->label(trans('admin/setting.mail.mailgun.endpoint')) + ->required() + ->default(env('MAILGUN_ENDPOINT', config('services.mailgun.endpoint'))), + ]), + ]; + } + + /** + * @return Component[] + * + * @throws Exception + */ + private function backupSettings(): array + { + return [ + ToggleButtons::make('APP_BACKUP_DRIVER') + ->label(trans('admin/setting.backup.backup_driver')) + ->columnSpanFull() + ->inline() + ->options([ + Backup::ADAPTER_DAEMON => 'Wings', + Backup::ADAPTER_AWS_S3 => 'S3', + ]) + ->live() + ->default(env('APP_BACKUP_DRIVER', config('backups.default'))), + Section::make(trans('admin/setting.backup.throttle')) + ->description(trans('admin/setting.backup.throttle_help')) + ->columns() + ->columnSpanFull() + ->schema([ + TextInput::make('BACKUP_THROTTLE_LIMIT') + ->label(trans('admin/setting.backup.limit')) + ->required() + ->numeric() + ->minValue(1) + ->default(config('backups.throttles.limit')), + TextInput::make('BACKUP_THROTTLE_PERIOD') + ->label(trans('admin/setting.backup.period')) + ->required() + ->numeric() + ->minValue(0) + ->suffix('Seconds') + ->default(config('backups.throttles.period')), + ]), + Section::make(trans('admin/setting.backup.s3.s3_title')) + ->columns() + ->visible(fn (Get $get) => $get('APP_BACKUP_DRIVER') === Backup::ADAPTER_AWS_S3) + ->schema([ + TextInput::make('AWS_DEFAULT_REGION') + ->label(trans('admin/setting.backup.s3.default_region')) + ->required() + ->default(config('backups.disks.s3.region')), + TextInput::make('AWS_ACCESS_KEY_ID') + ->label(trans('admin/setting.backup.s3.access_key')) + ->required() + ->default(config('backups.disks.s3.key')), + TextInput::make('AWS_SECRET_ACCESS_KEY') + ->label(trans('admin/setting.backup.s3.secret_key')) + ->required() + ->default(config('backups.disks.s3.secret')), + TextInput::make('AWS_BACKUPS_BUCKET') + ->label(trans('admin/setting.backup.s3.bucket')) + ->required() + ->default(config('backups.disks.s3.bucket')), + TextInput::make('AWS_ENDPOINT') + ->label(trans('admin/setting.backup.s3.endpoint')) + ->required() + ->default(config('backups.disks.s3.endpoint')), + Toggle::make('AWS_USE_PATH_STYLE_ENDPOINT') + ->label(trans('admin/setting.backup.s3.use_path_style_endpoint')) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->stateCast(new BooleanStateCast(false)) + ->default(env('AWS_USE_PATH_STYLE_ENDPOINT', config('backups.disks.s3.use_path_style_endpoint'))), + ]), + ]; + } + + /** + * @return Component[] + * + * @throws Exception + */ + private function oauthSettings(): array + { + $formFields = []; + + $oauthSchemas = $this->oauthService->getAll(); + foreach ($oauthSchemas as $schema) { + $key = $schema->getConfigKey(); + + $icon = $schema->getIcon(); + if (is_string($icon)) { + try { + $this->iconFactory->svg($icon); + } catch (SvgNotFound) { + $icon = null; + } + } + + $formFields[] = Section::make($schema->getName()) + ->columns(5) + ->icon($icon ?? TablerIcon::BrandOauth) + ->collapsed(fn () => !$schema->isEnabled()) + ->collapsible() + ->schema([ + Hidden::make($key) + ->live() + ->default($schema->isEnabled()), + Actions::make([ + Action::make('disable_oauth_' . $schema->getId()) + ->visible(fn (Get $get) => $get($key)) + ->disabled(fn () => !user()?->can('update settings')) + ->label(trans('admin/setting.oauth.disable')) + ->color('danger') + ->action(fn (Set $set) => $set($key, false)), + Action::make('enable_oauth_' . $schema->getId()) + ->visible(fn (Get $get) => !$get($key)) + ->disabled(fn () => !user()?->can('update settings')) + ->label(trans('admin/setting.oauth.enable')) + ->color('success') + ->steps($schema->getSetupSteps()) + ->modalHeading(trans('admin/setting.oauth.enable_schema', ['schema' => $schema->getName()])) + ->modalSubmitActionLabel(trans('admin/setting.oauth.enable')) + ->modalCancelAction(false) + ->action(function ($data, Set $set) use ($key) { + $data = array_merge([ + $key => 'true', + ], $data); + + foreach ($data as $key => $value) { + $set($key, $value); + } + }), + ])->columnSpan(1), + Group::make($schema->getSettingsForm()) + ->visible(fn (Get $get) => $get($key)) + ->columns(4) + ->columnSpan(4), + ]); + } + + return $formFields; + } + + /** + * @return Component[] + * + * @throws Exception + */ + private function miscSettings(): array + { + return [ + Section::make(trans('admin/setting.misc.auto_allocation.title')) + ->description(trans('admin/setting.misc.auto_allocation.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + Toggle::make('PANEL_CLIENT_ALLOCATIONS_ENABLED') + ->label(trans('admin/setting.misc.auto_allocation.question')) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->columnSpanFull() + ->stateCast(new BooleanStateCast(false)) + ->default(env('PANEL_CLIENT_ALLOCATIONS_ENABLED', config('panel.client_features.allocations.enabled'))), + Toggle::make('PANEL_CLIENT_ALLOCATIONS_CREATE_NEW') + ->label(trans('admin/setting.misc.auto_allocation.create_new')) + ->helperText(trans('admin/setting.misc.auto_allocation.create_new_help')) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->columnSpanFull() + ->visible(fn (Get $get) => $get('PANEL_CLIENT_ALLOCATIONS_ENABLED')) + ->stateCast(new BooleanStateCast(false)) + ->default(env('PANEL_CLIENT_ALLOCATIONS_CREATE_NEW', config('panel.client_features.allocations.create_new'))), + TextInput::make('PANEL_CLIENT_ALLOCATIONS_RANGE_START') + ->label(trans('admin/setting.misc.auto_allocation.start')) + ->required() + ->numeric() + ->minValue(1024) + ->maxValue(65535) + ->visible(fn (Get $get) => $get('PANEL_CLIENT_ALLOCATIONS_ENABLED')) + ->default(env('PANEL_CLIENT_ALLOCATIONS_RANGE_START')), + TextInput::make('PANEL_CLIENT_ALLOCATIONS_RANGE_END') + ->label(trans('admin/setting.misc.auto_allocation.end')) + ->required() + ->numeric() + ->minValue(1024) + ->maxValue(65535) + ->visible(fn (Get $get) => $get('PANEL_CLIENT_ALLOCATIONS_ENABLED')) + ->default(env('PANEL_CLIENT_ALLOCATIONS_RANGE_END')), + ]), + Section::make(trans('admin/setting.misc.mail_notifications.title')) + ->description(trans('admin/setting.misc.mail_notifications.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + Toggle::make('PANEL_SEND_INSTALL_NOTIFICATION') + ->label(trans('admin/setting.misc.mail_notifications.server_installed')) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->formatStateUsing(fn ($state): bool => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_SEND_INSTALL_NOTIFICATION', (bool) $state)) + ->default(env('PANEL_SEND_INSTALL_NOTIFICATION', config('panel.email.send_install_notification'))), + Toggle::make('PANEL_SEND_REINSTALL_NOTIFICATION') + ->label(trans('admin/setting.misc.mail_notifications.server_reinstalled')) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->formatStateUsing(fn ($state): bool => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_SEND_REINSTALL_NOTIFICATION', (bool) $state)) + ->default(env('PANEL_SEND_REINSTALL_NOTIFICATION', config('panel.email.send_reinstall_notification'))), + ]), + Section::make(trans('admin/setting.misc.connections.title')) + ->description(trans('admin/setting.misc.connections.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('GUZZLE_TIMEOUT') + ->label(trans('admin/setting.misc.connections.request_timeout')) + ->required() + ->numeric() + ->minValue(15) + ->maxValue(60) + ->suffix(trans('admin/setting.misc.connections.seconds')) + ->default(env('GUZZLE_TIMEOUT', config('panel.guzzle.timeout'))), + TextInput::make('GUZZLE_CONNECT_TIMEOUT') + ->label(trans('admin/setting.misc.connections.connection_timeout')) + ->required() + ->numeric() + ->minValue(5) + ->maxValue(60) + ->suffix(trans('admin/setting.misc.connections.seconds')) + ->default(env('GUZZLE_CONNECT_TIMEOUT', config('panel.guzzle.connect_timeout'))), + ]), + Section::make(trans('admin/setting.misc.activity_log.title')) + ->description(trans('admin/setting.misc.activity_log.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('APP_ACTIVITY_PRUNE_DAYS') + ->label(trans('admin/setting.misc.activity_log.prune_age')) + ->required() + ->numeric() + ->minValue(1) + ->maxValue(365) + ->suffix(trans('admin/setting.misc.activity_log.days')) + ->default(env('APP_ACTIVITY_PRUNE_DAYS', config('activity.prune_days'))), + Toggle::make('APP_ACTIVITY_HIDE_ADMIN') + ->label(trans('admin/setting.misc.activity_log.log_admin')) + ->inline(false) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->stateCast(new BooleanStateCast(false)) + ->default(env('APP_ACTIVITY_HIDE_ADMIN', config('activity.hide_admin_activity'))), + ]), + Section::make(trans('admin/setting.misc.api.title')) + ->description(trans('admin/setting.misc.api.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('APP_API_CLIENT_RATELIMIT') + ->label(trans('admin/setting.misc.api.client_rate')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.rpm')) + ->default(env('APP_API_CLIENT_RATELIMIT', config('http.rate_limit.client'))), + TextInput::make('APP_API_APPLICATION_RATELIMIT') + ->label(trans('admin/setting.misc.api.app_rate')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.rpm')) + ->default(env('APP_API_APPLICATION_RATELIMIT', config('http.rate_limit.application'))), + ]), + Section::make(trans('admin/setting.misc.server.title')) + ->description(trans('admin/setting.misc.server.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + Toggle::make('PANEL_EDITABLE_SERVER_DESCRIPTIONS') + ->label(trans('admin/setting.misc.server.edit_server_desc')) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->columnSpan(1) + ->formatStateUsing(fn ($state): bool => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_EDITABLE_SERVER_DESCRIPTIONS', (bool) $state)) + ->default(env('PANEL_EDITABLE_SERVER_DESCRIPTIONS', config('panel.editable_server_descriptions'))), + FileUpload::make('ConsoleFonts') + ->hint(trans('admin/setting.misc.server.console_font_hint')) + ->label(trans('admin/setting.misc.server.console_font_upload')) + ->directory('fonts') + ->disk('public') + ->columnSpan(1) + ->maxFiles(1) + ->preserveFilenames(), + ]), + Section::make(trans('admin/setting.misc.webhook.title')) + ->description(trans('admin/setting.misc.webhook.helper')) + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('APP_WEBHOOK_PRUNE_DAYS') + ->label(trans('admin/setting.misc.webhook.prune_age')) + ->required() + ->numeric() + ->minValue(1) + ->maxValue(365) + ->suffix(trans('admin/setting.misc.webhook.days')) + ->default(env('APP_WEBHOOK_PRUNE_DAYS', config('panel.webhook.prune_days'))), + ]), + ]; + } + + protected function getFormStatePath(): ?string + { + return 'data'; + } + + public function save(): void + { + try { + $data = $this->form->getState(); + unset($data['ConsoleFonts']); + + $data = array_map(function ($value) { + // Convert bools to a string, so they are correctly written to the .env file + if (is_bool($value)) { + return $value ? 'true' : 'false'; + } + + // Convert enum to its value + if ($value instanceof BackedEnum) { + return $value->value; + } + + return $value; + }, $data); + + $this->writeToEnvironment($data); + + Artisan::call('queue:restart'); + + $this->redirect($this->getUrl()); + + Notification::make() + ->title(trans('admin/setting.save_success')) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/setting.save_failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + } + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + Action::make('save') + ->hiddenLabel() + ->icon(TablerIcon::DeviceFloppy) + ->action('save') + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->authorize(fn () => user()?->can('update settings')) + ->keyBindings(['mod+s']), + ]; + + } +} diff --git a/app/Filament/Admin/Pages/ViewLogs.php b/app/Filament/Admin/Pages/ViewLogs.php new file mode 100644 index 0000000000..f17a70eacb --- /dev/null +++ b/app/Filament/Admin/Pages/ViewLogs.php @@ -0,0 +1,101 @@ +tooltip(trans('filament-log-viewer::log.table.actions.close.label')) + ->icon(TablerIcon::ArrowLeft)->iconButton(), + DeleteAction::make(withTooltip: true) + ->icon(TablerIcon::Trash)->iconButton(), + DownloadAction::make(withTooltip: true) + ->icon(TablerIcon::FileDownload)->iconButton(), + Action::make('uploadLogs') + ->hiddenLabel() + ->icon(TablerIcon::WorldUpload) + ->requiresConfirmation() + ->tooltip(trans('admin/log.actions.upload_tooltip', ['url' => 'logs.pelican.dev'])) + ->modalHeading(trans('admin/log.actions.upload_logs')) + ->modalDescription(fn () => trans('admin/log.actions.upload_logs_description', ['file' => $this->resolveRecordDate(), 'url' => 'https://logs.pelican.dev'])) + ->action(function () { + $prefix = config('filament-log-viewer.pattern.prefix', 'laravel-'); + $extension = config('filament-log-viewer.pattern.extension', '.log'); + $logPath = storage_path('logs/' . $prefix . $this->resolveRecordDate() . $extension); + + if (!file_exists($logPath)) { + Notification::make() + ->title(trans('admin/log.actions.log_not_found')) + ->body(trans('admin/log.actions.log_not_found_description', ['filename' => $this->resolveRecordDate()])) + ->danger() + ->send(); + + return; + } + + $lines = file($logPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $totalLines = count($lines); + $uploadLines = $totalLines <= 1000 ? $lines : array_slice($lines, -1000); + $content = implode("\n", $uploadLines); + + try { + $response = Http::timeout(10) + ->asMultipart() + ->attach('c', $content) + ->attach('e', '14d') + ->post('https://logs.pelican.dev'); + + if ($response->failed()) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body(trans('admin/log.actions.failed_to_upload_description', ['status' => $response->status()])) + ->danger() + ->send(); + + return; + } + + $data = $response->json(); + $url = $data['url']; + + Notification::make() + ->title(trans('admin/log.actions.log_upload')) + ->body("{$url}") + ->success() + ->actions([ + Action::make('exclude_viewLogs') + ->label(trans('admin/log.actions.view_logs')) + ->url($url) + ->openUrlInNewTab(true), + ]) + ->persistent() + ->send(); + + } catch (\Exception $e) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body($e->getMessage()) + ->danger() + ->send(); + + return; + } + }), + ]; + } +} diff --git a/app/Filament/Admin/Resources/ApiKeys/ApiKeyResource.php b/app/Filament/Admin/Resources/ApiKeys/ApiKeyResource.php new file mode 100644 index 0000000000..c8a26de50b --- /dev/null +++ b/app/Filament/Admin/Resources/ApiKeys/ApiKeyResource.php @@ -0,0 +1,201 @@ +count() ?: null; + } + + public static function getEloquentQuery(): Builder + { + $query = parent::getEloquentQuery(); + + return $query->where('key_type', ApiKey::TYPE_APPLICATION); + } + + public static function getNavigationGroup(): ?string + { + return trans('admin/dashboard.advanced'); + } + + /** + * @throws Exception + */ + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('key') + ->label(trans('admin/apikey.table.key')) + ->icon(TablerIcon::ClipboardText) + ->state(fn (ApiKey $key) => $key->identifier . $key->token) + ->copyable(), + TextColumn::make('memo') + ->label(trans('admin/apikey.table.description')) + ->wrap() + ->limit(50), + DateTimeColumn::make('last_used_at') + ->label(trans('admin/apikey.table.last_used')) + ->placeholder(trans('admin/apikey.table.never_used')) + ->sortable(), + DateTimeColumn::make('created_at') + ->label(trans('admin/apikey.table.created')) + ->sortable(), + TextColumn::make('user.username') + ->label(trans('admin/apikey.table.created_by')) + ->url(fn (ApiKey $apiKey) => user()?->can('update', $apiKey->user) ? EditUser::getUrl(['record' => $apiKey->user]) : null), + ]) + ->recordActions([ + DeleteAction::make(), + ]) + ->toolbarActions([ + CreateAction::make(), + ]) + ->emptyStateIcon(TablerIcon::Key) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/apikey.empty')); + } + + /** + * @throws Exception + */ + public static function defaultForm(Schema $schema): Schema + { + $permissionList = ApiKey::getPermissionList(); + + return $schema + ->components([ + Section::make(trans('admin/apikey.permissions.all')) + ->description(trans('admin/apikey.permissions.all_description')) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('permissions_all') + ->hiddenLabel() + ->inline() + ->options([ + 0 => trans('admin/apikey.permissions.none'), + 1 => trans('admin/apikey.permissions.read'), + 3 => trans('admin/apikey.permissions.read_write'), + ]) + ->icons([ + 0 => TablerIcon::BookOff, + 1 => TablerIcon::Book, + 3 => TablerIcon::Writing, + ]) + ->colors([ + 0 => 'success', + 1 => 'warning', + 3 => 'danger', + ]) + ->live() + ->afterStateUpdated(function ($state, callable $set) use ($permissionList) { + foreach ($permissionList as $resource) { + $set('permissions_' . $resource, $state); + } + }) + ->default(0), + ]), + Fieldset::make('Permissions') + ->columnSpanFull() + ->schema( + collect($permissionList)->map(fn ($resource) => ToggleButtons::make('permissions_' . $resource) + ->label(str($resource)->replace('_', ' ')->title())->inline() + ->options([ + 0 => trans('admin/apikey.permissions.none'), + 1 => trans('admin/apikey.permissions.read'), + 3 => trans('admin/apikey.permissions.read_write'), + ]) + ->icons([ + 0 => TablerIcon::BookOff, + 1 => TablerIcon::Book, + 3 => TablerIcon::Writing, + ]) + ->colors([ + 0 => 'success', + 1 => 'warning', + 3 => 'danger', + ]) + ->required() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + ]) + ->default(0), + )->all(), + ), + TagsInput::make('allowed_ips') + ->placeholder(trans('admin/apikey.whitelist_placeholder')) + ->label(trans('admin/apikey.whitelist')) + ->helperText(trans('admin/apikey.whitelist_help')) + ->columnSpanFull(), + Textarea::make('memo') + ->required() + ->label(trans('admin/apikey.description')) + ->helperText(trans('admin/apikey.description_help')) + ->columnSpanFull(), + ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListApiKeys::route('/'), + 'create' => CreateApiKey::route('/create'), + ]; + } +} diff --git a/app/Filament/Admin/Resources/ApiKeys/Pages/CreateApiKey.php b/app/Filament/Admin/Resources/ApiKeys/Pages/CreateApiKey.php new file mode 100644 index 0000000000..0b4b382636 --- /dev/null +++ b/app/Filament/Admin/Resources/ApiKeys/Pages/CreateApiKey.php @@ -0,0 +1,63 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + Action::make('create') + ->hiddenLabel() + ->action('create') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->icon(TablerIcon::FilePlus), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function handleRecordCreation(array $data): Model + { + $data['identifier'] = ApiKey::generateTokenIdentifier(ApiKey::TYPE_APPLICATION); + $data['token'] = Str::random(ApiKey::KEY_LENGTH); + $data['user_id'] = user()?->id; + $data['key_type'] = ApiKey::TYPE_APPLICATION; + + $permissions = []; + + foreach (ApiKey::getPermissionList() as $permission) { + if (isset($data['permissions_' . $permission])) { + $permissions[$permission] = intval($data['permissions_' . $permission]); + unset($data['permissions_' . $permission]); + } + } + + $data['permissions'] = $permissions; + + return parent::handleRecordCreation($data); + } +} diff --git a/app/Filament/Admin/Resources/ApiKeys/Pages/ListApiKeys.php b/app/Filament/Admin/Resources/ApiKeys/Pages/ListApiKeys.php new file mode 100644 index 0000000000..fc5fc9648c --- /dev/null +++ b/app/Filament/Admin/Resources/ApiKeys/Pages/ListApiKeys.php @@ -0,0 +1,16 @@ +count() ?: null; + } + + public static function getNavigationLabel(): string + { + return trans('admin/databasehost.nav_title'); + } + + public static function getModelLabel(): string + { + return trans('admin/databasehost.model_label'); + } + + public static function getPluralModelLabel(): string + { + return trans('admin/databasehost.model_label_plural'); + } + + public static function getNavigationGroup(): ?string + { + return trans('admin/dashboard.advanced'); + } + + /** + * @throws Exception + */ + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('name') + ->label(trans('admin/databasehost.table.name')), + TextColumn::make('host') + ->label(trans('admin/databasehost.table.host')), + TextColumn::make('port') + ->label(trans('admin/databasehost.table.port')), + TextColumn::make('username') + ->label(trans('admin/databasehost.table.username')), + TextColumn::make('databases_count') + ->counts('databases') + ->label(trans('admin/databasehost.databases')), + TextColumn::make('nodes.name') + ->badge() + ->placeholder(trans('admin/databasehost.no_nodes')), + ]) + ->checkIfRecordIsSelectableUsing(fn (DatabaseHost $databaseHost) => !$databaseHost->databases_count) + ->recordActions([ + ViewAction::make() + ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), + EditAction::make(), + ]) + ->toolbarActions([ + CreateAction::make(), + BulkActionGroup::make([ + DeleteBulkAction::make('exclude_bulk_delete'), + ]), + ]) + ->emptyStateIcon(TablerIcon::Database) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/databasehost.no_database_hosts')); + } + + /** + * @throws Exception + */ + public static function defaultForm(Schema $schema): Schema + { + return $schema + ->components([ + Section::make() + ->columnSpanFull() + ->columns([ + 'default' => 2, + 'sm' => 3, + 'md' => 3, + 'lg' => 4, + ]) + ->schema([ + TextInput::make('host') + ->columnSpan(2) + ->label(trans('admin/databasehost.host')) + ->helperText(trans('admin/databasehost.host_help')) + ->required() + ->live(onBlur: true) + ->afterStateUpdated(fn ($state, Set $set) => $set('name', $state)) + ->maxLength(255), + TextInput::make('port') + ->columnSpan(1) + ->label(trans('admin/databasehost.port')) + ->helperText(trans('admin/databasehost.port_help')) + ->required() + ->numeric() + ->default(3306) + ->minValue(0) + ->maxValue(65535), + TextInput::make('max_databases') + ->label(trans('admin/databasehost.max_database')) + ->helperText(trans('admin/databasehost.max_databases_help')) + ->numeric(), + TextInput::make('name') + ->label(trans('admin/databasehost.display_name')) + ->helperText(trans('admin/databasehost.display_name_help')) + ->required() + ->maxLength(60), + TextInput::make('username') + ->label(trans('admin/databasehost.username')) + ->helperText(trans('admin/databasehost.username_help')) + ->required() + ->maxLength(255), + TextInput::make('password') + ->label(trans('admin/databasehost.password')) + ->helperText(trans('admin/databasehost.password_help')) + ->password() + ->revealable() + ->maxLength(255) + ->required(fn ($operation) => $operation === 'create'), + Select::make('node_ids') + ->multiple() + ->searchable() + ->preload() + ->helperText(trans('admin/databasehost.linked_nodes_help')) + ->label(trans('admin/databasehost.linked_nodes')) + ->relationship('nodes', 'name', fn (Builder $query) => $query->whereIn('nodes.id', user()?->accessibleNodes()->pluck('id'))), + ]), + ]); + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return [ + DatabasesRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListDatabaseHosts::route('/'), + 'create' => CreateDatabaseHost::route('/create'), + 'view' => ViewDatabaseHost::route('/{record}'), + 'edit' => EditDatabaseHost::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + $query = parent::getEloquentQuery(); + + return $query->where(function (Builder $query) { + return $query->whereHas('nodes', function (Builder $query) { + $query->whereIn('nodes.id', user()?->accessibleNodes()->pluck('id')); + })->orDoesntHave('nodes'); + }); + } +} diff --git a/app/Filament/Admin/Resources/DatabaseHosts/Pages/CreateDatabaseHost.php b/app/Filament/Admin/Resources/DatabaseHosts/Pages/CreateDatabaseHost.php new file mode 100644 index 0000000000..737bdfb3ff --- /dev/null +++ b/app/Filament/Admin/Resources/DatabaseHosts/Pages/CreateDatabaseHost.php @@ -0,0 +1,198 @@ +service = $service; + } + + protected function getCreateFormAction(): Action + { + $hasFormWrapper = $this->hasFormWrapper(); + + return Action::make('exclude_create') + ->label(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->submit($hasFormWrapper ? $this->getSubmitFormLivewireMethodName() : null) + ->action($hasFormWrapper ? null : $this->getSubmitFormLivewireMethodName()) + ->keyBindings(['mod+s']); + } + + /** @return Step[] + * @throws Exception + */ + public function getSteps(): array + { + return [ + Step::make(trans('admin/databasehost.setup.preparations')) + ->columns() + ->schema([ + TextEntry::make('setup') + ->hiddenLabel() + ->state(trans('admin/databasehost.setup.note')), + Toggle::make('different_server') + ->label(new HtmlString(trans('admin/databasehost.setup.different_server'))) + ->dehydrated(false) + ->live() + ->columnSpanFull() + ->afterStateUpdated(fn ($state, Set $set) => $state ? $set('panel_ip', gethostbyname(str(config('app.url'))->replace(['http:', 'https:', '/'], ''))) : '127.0.0.1'), + Hidden::make('panel_ip') + ->default('127.0.0.1') + ->dehydrated(false), + TextInput::make('username') + ->label(trans('admin/databasehost.username')) + ->helperText(trans('admin/databasehost.username_help')) + ->required() + ->default('pelicanuser') + ->maxLength(255), + TextInput::make('password') + ->label(trans('admin/databasehost.password')) + ->helperText(trans('admin/databasehost.password_help')) + ->required() + ->default(Str::password(16)) + ->password() + ->revealable() + ->maxLength(255), + ]) + ->afterValidation(function (Get $get, Set $set) { + $set('create_user', "CREATE USER '{$get('username')}'@'{$get('panel_ip')}' IDENTIFIED BY '{$get('password')}';"); + $set('assign_permissions', "GRANT ALL PRIVILEGES ON *.* TO '{$get('username')}'@'{$get('panel_ip')}' WITH GRANT OPTION;"); + }), + Step::make(trans('admin/databasehost.setup.database_setup')) + ->schema([ + Fieldset::make(trans('admin/databasehost.setup.database_user')) + ->schema([ + TextEntry::make('cli_login') + ->hiddenLabel() + ->state(new HtmlString(trans('admin/databasehost.setup.cli_login'))) + ->columnSpanFull(), + TextInput::make('create_user') + ->label(trans('admin/databasehost.setup.command_create_user')) + ->default(fn (Get $get) => "CREATE USER '{$get('username')}'@'{$get('panel_ip')}' IDENTIFIED BY '{$get('password')}';") + ->disabled() + ->dehydrated(false) + ->copyable() + ->columnSpanFull(), + TextInput::make('assign_permissions') + ->label(trans('admin/databasehost.setup.command_assign_permissions')) + ->default(fn (Get $get) => "GRANT ALL PRIVILEGES ON *.* TO '{$get('username')}'@'{$get('panel_ip')}' WITH GRANT OPTION;") + ->disabled() + ->dehydrated(false) + ->copyable() + ->columnSpanFull(), + TextEntry::make('cli_exit') + ->hiddenLabel() + ->state(new HtmlString(trans('admin/databasehost.setup.cli_exit'))) + ->columnSpanFull(), + ]), + Fieldset::make(trans('admin/databasehost.setup.external_access')) + ->schema([ + TextEntry::make('allow_external_access') + ->hiddenLabel() + ->state(new HtmlString(trans('admin/databasehost.setup.allow_external_access'))) + ->columnSpanFull(), + ]), + ]), + Step::make(trans('admin/databasehost.setup.panel_setup')) + ->columns([ + 'default' => 2, + 'lg' => 3, + ]) + ->schema([ + TextInput::make('host') + ->columnSpan(2) + ->label(trans('admin/databasehost.host')) + ->helperText(trans('admin/databasehost.host_help')) + ->required() + ->live(onBlur: true) + ->afterStateUpdated(fn ($state, Set $set) => $set('name', $state)) + ->maxLength(255), + TextInput::make('port') + ->label(trans('admin/databasehost.port')) + ->helperText(trans('admin/databasehost.port_help')) + ->required() + ->numeric() + ->default(3306) + ->minValue(0) + ->maxValue(65535), + TextInput::make('max_databases') + ->label(trans('admin/databasehost.max_database')) + ->helperText(trans('admin/databasehost.max_databases_help')) + ->placeholder(trans('admin/databasehost.unlimited')) + ->numeric(), + TextInput::make('name') + ->label(trans('admin/databasehost.display_name')) + ->helperText(trans('admin/databasehost.display_name_help')) + ->required() + ->maxLength(60), + Select::make('node_ids') + ->multiple() + ->searchable() + ->preload() + ->helperText(trans('admin/databasehost.linked_nodes_help')) + ->label(trans('admin/databasehost.linked_nodes')) + ->relationship('nodes', 'name', fn (Builder $query) => $query->whereIn('nodes.id', user()?->accessibleNodes()->pluck('id'))), + ]), + ]; + } + + /** + * @throws Halt + * @throws Throwable + */ + protected function handleRecordCreation(array $data): Model + { + try { + return $this->service->handle($data); + } catch (PDOException $exception) { + Notification::make() + ->title(trans('admin/databasehost.error')) + ->body($exception->getMessage()) + ->color('danger') + ->icon(TablerIcon::Database) + ->danger() + ->send(); + + throw new Halt(); + } + } +} diff --git a/app/Filament/Admin/Resources/DatabaseHosts/Pages/EditDatabaseHost.php b/app/Filament/Admin/Resources/DatabaseHosts/Pages/EditDatabaseHost.php new file mode 100644 index 0000000000..a7672cf579 --- /dev/null +++ b/app/Filament/Admin/Resources/DatabaseHosts/Pages/EditDatabaseHost.php @@ -0,0 +1,75 @@ +hostUpdateService = $hostUpdateService; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make() + ->tooltip(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0 ? trans('admin/databasehost.delete_help') : trans('filament-actions::delete.single.modal.actions.delete.label')) + ->disabled(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function handleRecordUpdate(Model $record, array $data): Model + { + if (!$record instanceof DatabaseHost) { + return $record; + } + + try { + return $this->hostUpdateService->handle($record, $data); + } catch (PDOException $exception) { + Notification::make() + ->title(trans('admin/databasehost.error')) + ->body($exception->getMessage()) + ->color('danger') + ->icon(TablerIcon::Database) + ->danger() + ->send(); + + throw new Halt(); + } + } +} diff --git a/app/Filament/Admin/Resources/DatabaseHosts/Pages/ListDatabaseHosts.php b/app/Filament/Admin/Resources/DatabaseHosts/Pages/ListDatabaseHosts.php new file mode 100644 index 0000000000..7cae7c055d --- /dev/null +++ b/app/Filament/Admin/Resources/DatabaseHosts/Pages/ListDatabaseHosts.php @@ -0,0 +1,16 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + EditAction::make(), + ]; + } +} diff --git a/app/Filament/Admin/Resources/DatabaseHosts/RelationManagers/DatabasesRelationManager.php b/app/Filament/Admin/Resources/DatabaseHosts/RelationManagers/DatabasesRelationManager.php new file mode 100644 index 0000000000..73eda7ece1 --- /dev/null +++ b/app/Filament/Admin/Resources/DatabaseHosts/RelationManagers/DatabasesRelationManager.php @@ -0,0 +1,75 @@ +components([ + TextInput::make('database') + ->columnSpanFull(), + TextInput::make('username') + ->label(trans('admin/databasehost.table.username')), + TextInput::make('password') + ->label(trans('admin/databasehost.table.password')) + ->password() + ->revealable() + ->hintAction(RotateDatabasePasswordAction::make()) + ->formatStateUsing(fn (Database $database) => $database->password), + TextInput::make('remote') + ->label(trans('admin/databasehost.table.remote')) + ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? trans('admin/databasehost.anywhere'). ' ( % )' : $record->remote), + TextInput::make('max_connections') + ->label(trans('admin/databasehost.table.max_connections')) + ->formatStateUsing(fn (Database $record) => $record->max_connections ?: trans('admin/databasehost.unlimited')), + TextInput::make('jdbc') + ->label(trans('admin/databasehost.table.connection_string')) + ->columnSpanFull() + ->password() + ->revealable() + ->formatStateUsing(fn (Database $database) => $database->jdbc), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('database') + ->heading('') + ->columns([ + TextColumn::make('database'), + TextColumn::make('username') + ->label(trans('admin/databasehost.table.username')), + TextColumn::make('remote') + ->label(trans('admin/databasehost.table.remote')) + ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? trans('admin/databasehost.anywhere'). ' ( % )' : $record->remote), + TextColumn::make('server.name') + ->url(fn (Database $database) => route('filament.admin.resources.servers.edit', ['record' => $database->server_id])), + TextColumn::make('max_connections') + ->label(trans('admin/databasehost.table.max_connections')) + ->formatStateUsing(fn ($record) => $record->max_connections ?: trans('server/database.unlimited')), + DateTimeColumn::make('created_at') + ->label(trans('admin/databasehost.table.created_at')), + ]) + ->recordActions([ + ViewAction::make() + ->color('primary'), + DeleteAction::make(), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Eggs/EggResource.php b/app/Filament/Admin/Resources/Eggs/EggResource.php new file mode 100644 index 0000000000..4031b410c8 --- /dev/null +++ b/app/Filament/Admin/Resources/Eggs/EggResource.php @@ -0,0 +1,77 @@ + 0 ? (string) $count : null; + } + + public static function getNavigationGroup(): ?string + { + return user()?->getCustomization(CustomizationKey::TopNavigation) ? false : trans('admin/dashboard.server'); + } + + public static function getNavigationLabel(): string + { + return trans('admin/egg.nav_title'); + } + + public static function getModelLabel(): string + { + return trans('admin/egg.model_label'); + } + + public static function getPluralModelLabel(): string + { + return trans('admin/egg.model_label_plural'); + } + + public static function getGloballySearchableAttributes(): array + { + return ['name', 'tags', 'uuid', 'id']; + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return [ + ServersRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListEggs::route('/'), + 'create' => CreateEgg::route('/create'), + 'edit' => EditEgg::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Eggs/Pages/CreateEgg.php b/app/Filament/Admin/Resources/Eggs/Pages/CreateEgg.php new file mode 100644 index 0000000000..3ae0b459ab --- /dev/null +++ b/app/Filament/Admin/Resources/Eggs/Pages/CreateEgg.php @@ -0,0 +1,308 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + Action::make('create') + ->hiddenLabel() + ->action('create') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->icon(TablerIcon::FilePlus), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + public function form(Schema $schema): Schema + { + return $schema + ->components([ + Tabs::make() + ->tabs($this->getTabs()) + ->columnSpanFull() + ->persistTabInQueryString(), + ]); + } + + /** @return Tab[] */ + protected function getDefaultTabs(): array + { + return [ + Tab::make('configuration') + ->label(trans('admin/egg.tabs.configuration')) + ->columns(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 4]) + ->schema([ + TextInput::make('name') + ->label(trans('admin/egg.name')) + ->required() + ->maxLength(255) + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) + ->helperText(trans('admin/egg.name_help')), + TextInput::make('author') + ->label(trans('admin/egg.author')) + ->maxLength(255) + ->required() + ->email() + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) + ->helperText(trans('admin/egg.author_help')), + Textarea::make('description') + ->label(trans('admin/egg.description')) + ->rows(2) + ->columnSpanFull() + ->helperText(trans('admin/egg.description_help')), + KeyValue::make('startup_commands') + ->label(trans('admin/egg.startup_commands')) + ->live() + ->columnSpanFull() + ->required() + ->addActionLabel(trans('admin/egg.add_startup')) + ->keyLabel(trans('admin/egg.startup_name')) + ->keyPlaceholder('Default') + ->valueLabel(trans('admin/egg.startup_command')) + ->valuePlaceholder('java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}') + ->helperText(trans('admin/egg.startup_help')), + TagsInput::make('file_denylist') + ->label(trans('admin/egg.file_denylist')) + ->placeholder('denied-file.txt') + ->helperText(trans('admin/egg.file_denylist_help')) + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), + TagsInput::make('features') + ->label(trans('admin/egg.features')) + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 1]), + Toggle::make('force_outgoing_ip') + ->label(trans('admin/egg.force_ip')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.force_ip_help')), + Hidden::make('script_is_privileged') + ->default(1), + TagsInput::make('tags') + ->label(trans('admin/egg.tags')) + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), + TextInput::make('update_url') + ->label(trans('admin/egg.update_url')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.update_url_help')) + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) + ->url(), + KeyValue::make('docker_images') + ->label(trans('admin/egg.docker_images')) + ->live() + ->columnSpanFull() + ->required() + ->addActionLabel(trans('admin/egg.add_image')) + ->keyLabel(trans('admin/egg.docker_name')) + ->keyPlaceholder('Java 21') + ->valueLabel(trans('admin/egg.docker_uri')) + ->valuePlaceholder('ghcr.io/pelican-eggs/yolks:java_21') + ->helperText(trans('admin/egg.docker_help')), + ]), + Tab::make('process_management') + ->label(trans('admin/egg.tabs.process_management')) + ->columns() + ->schema([ + CopyFrom::make('copy_process_from') + ->process(), + TextInput::make('config_stop') + ->label(trans('admin/egg.stop_command')) + ->required() + ->maxLength(255) + ->helperText(trans('admin/egg.stop_command_help')), + Textarea::make('config_startup')->rows(10)->json() + ->label(trans('admin/egg.start_config')) + ->default('{}') + ->helperText(trans('admin/egg.start_config_help')), + Textarea::make('config_files')->rows(10)->json() + ->label(trans('admin/egg.config_files')) + ->default('{}') + ->helperText(trans('admin/egg.config_files_help')), + Textarea::make('config_logs')->rows(10)->json() + ->label(trans('admin/egg.log_config')) + ->default('{}') + ->helperText(trans('admin/egg.log_config_help')), + ]), + Tab::make('egg_variables') + ->label(trans('admin/egg.tabs.egg_variables')) + ->columnSpanFull() + ->schema([ + Repeater::make('variables') + ->hiddenLabel() + ->addActionLabel(trans('admin/egg.add_new_variable')) + ->grid() + ->relationship('variables') + ->orderColumn() + ->reorderAction(fn (Action $action) => $action->hiddenLabel()->tooltip(fn () => $action->getLabel())) + ->collapsible()->collapsed() + ->columnSpan(2) + ->defaultItems(0) + ->itemLabel(fn (array $state) => $state['name']) + ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { + $data['default_value'] ??= ''; + $data['description'] ??= ''; + $data['rules'] ??= []; + $data['user_viewable'] ??= ''; + $data['user_editable'] ??= ''; + + return $data; + }) + ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { + $data['default_value'] ??= ''; + $data['description'] ??= ''; + $data['rules'] ??= []; + $data['user_viewable'] ??= ''; + $data['user_editable'] ??= ''; + + return $data; + }) + ->schema([ + TextInput::make('name') + ->label(trans('admin/egg.name')) + ->live() + ->debounce(750) + ->maxLength(255) + ->columnSpanFull() + ->afterStateUpdated(fn (Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString())) + ->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id'))) + ->validationMessages([ + 'unique' => trans('admin/egg.error_unique'), + ]) + ->required(), + Textarea::make('description')->label(trans('admin/egg.description'))->columnSpanFull(), + TextInput::make('env_variable') + ->label(trans('admin/egg.environment_variable')) + ->maxLength(255) + ->prefix('{{') + ->suffix('}}') + ->hintIcon(TablerIcon::Code, fn ($state) => "{{{$state}}}") + ->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id'))) + ->rules(EggVariable::getRulesForField('env_variable')) + ->validationMessages([ + 'unique' => trans('admin/egg.error_unique'), + 'required' => trans('admin/egg.error_required'), + '*' => trans('admin/egg.error_reserved'), + ]) + ->required(), + TextInput::make('default_value')->label(trans('admin/egg.default_value')), + Fieldset::make(trans('admin/egg.user_permissions')) + ->schema([ + Checkbox::make('user_viewable')->label(trans('admin/egg.viewable')), + Checkbox::make('user_editable')->label(trans('admin/egg.editable')), + ]), + TagsInput::make('rules') + ->label(trans('admin/egg.rules')) + ->columnSpanFull() + ->reorderable() + ->suggestions([ + 'required', + 'nullable', + 'string', + 'integer', + 'numeric', + 'boolean', + 'alpha', + 'alpha_dash', + 'alpha_num', + 'url', + 'email', + 'regex:', + 'min:', + 'max:', + 'between:', + 'between:1024,65535', + 'in:', + 'in:true,false', + ]), + ]), + ]), + Tab::make('install_script') + ->label(trans('admin/egg.tabs.install_script')) + ->columns(3) + ->schema([ + CopyFrom::make('copy_script_from') + ->script(), + TextInput::make('script_container') + ->label(trans('admin/egg.script_container')) + ->required() + ->maxLength(255) + ->default('ghcr.io/pelican-eggs/installers:debian'), + Select::make('script_entry') + ->label(trans('admin/egg.script_entry')) + ->selectablePlaceholder(false) + ->default('bash') + ->options([ + 'bash' => 'bash', + 'ash' => 'ash', + '/bin/bash' => '/bin/bash', + ]) + ->required(), + MonacoEditor::make('script_install') + ->label(trans('admin/egg.script_install')) + ->language(EditorLanguages::shell) + ->columnSpanFull() + ->lazy(), + ]), + ]; + } + + protected function handleRecordCreation(array $data): Model + { + $data['uuid'] ??= Str::uuid()->toString(); + + if (is_array($data['config_startup'])) { + $data['config_startup'] = json_encode($data['config_startup']); + } + + if (is_array($data['config_logs'])) { + $data['config_logs'] = json_encode($data['config_logs']); + } + + logger()->info('new egg', $data); + + return parent::handleRecordCreation($data); + } +} diff --git a/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php b/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php new file mode 100644 index 0000000000..5fec9f225b --- /dev/null +++ b/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php @@ -0,0 +1,509 @@ +components([ + Tabs::make() + ->tabs($this->getTabs()) + ->columnSpanFull() + ->persistTabInQueryString(), + ]); + } + + /** @return Tab[] */ + protected function getDefaultTabs(): array + { + return [ + Tab::make('configuration') + ->label(trans('admin/egg.tabs.configuration')) + ->columns(['default' => 2, 'sm' => 2, 'md' => 4, 'lg' => 6]) + ->icon(TablerIcon::Egg) + ->schema([ + Grid::make(2) + ->columnSpan(1) + ->schema([ + Image::make('', '') + ->hidden(fn ($record) => !$record->image) + ->url(fn ($record) => $record->image) + ->alt('') + ->alignJustify() + ->imageSize(150) + ->columnSpanFull(), + Flex::make([ + Action::make('uploadImage') + ->hiddenLabel() + ->tooltip(trans('admin/egg.import.import_image')) + ->iconSize(IconSize::Large) + ->icon(TablerIcon::PhotoUp) + ->modal() + ->modalHeading('') + ->modalSubmitActionLabel(trans('admin/egg.import.import_image')) + ->schema([ + Tabs::make() + ->contained(false) + ->tabs([ + Tab::make(trans('admin/egg.import.url')) + ->schema([ + Hidden::make('imageUrl'), + Hidden::make('imageExtension'), + TextInput::make('image_url') + ->label(trans('admin/egg.import.image_url')) + ->reactive() + ->autocomplete(false) + ->debounce(500) + ->afterStateUpdated(function ($state, Set $set) { + if (!$state) { + $set('image_url_error', null); + $set('imageUrl', null); + $set('imageExtension', null); + + return; + } + + try { + if (!filter_var($state, FILTER_VALIDATE_URL)) { + throw new Exception(trans('admin/egg.import.invalid_url')); + } + + $extension = strtolower(pathinfo(parse_url($state, PHP_URL_PATH), PATHINFO_EXTENSION)); + + if (!array_key_exists($extension, Egg::IMAGE_FORMATS)) { + throw new Exception(trans('admin/egg.import.unsupported_format', ['format' => implode(', ', array_keys(Egg::IMAGE_FORMATS))])); + } + + $host = parse_url($state, PHP_URL_HOST); + $ip = gethostbyname($host); + + if ( + filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false + ) { + throw new Exception(trans('admin/egg.import.no_local_ip')); + } + + $set('imageUrl', $state); + $set('imageExtension', $extension); + $set('image_url_error', null); + + } catch (Exception $e) { + $set('image_url_error', $e->getMessage()); + $set('imageUrl', null); + $set('imageExtension', null); + } + }), + TextEntry::make('image_url_error') + ->hiddenLabel() + ->visible(fn ($get) => $get('image_url_error') !== null) + ->afterStateHydrated(fn ($set, $get) => $get('image_url_error')), + Image::make(fn (Get $get) => $get('image_url'), '') + ->imageSize(150) + ->visible(fn ($get) => $get('image_url') && !$get('image_url_error')) + ->alignCenter(), + ]), + Tab::make(trans('admin/egg.import.file')) + ->schema([ + FileUpload::make('image') + ->hiddenLabel() + ->previewable() + ->openable(false) + ->downloadable(false) + ->maxSize(256) + ->maxFiles(1) + ->columnSpanFull() + ->alignCenter() + ->imageEditor() + ->image() + ->disk('public') + ->directory(Egg::ICON_STORAGE_PATH) + ->acceptedFileTypes([ + 'image/png', + 'image/jpeg', + 'image/webp', + 'image/svg+xml', + ]) + ->getUploadedFileNameForStorageUsing(function (TemporaryUploadedFile $file, $record) { + return $record->uuid . '.' . $file->getClientOriginalExtension(); + }), + ]), + ]), + ]) + ->action(function (array $data, $record): void { + if (!empty($data['imageUrl']) && !empty($data['imageExtension'])) { + $this->saveImageFromUrl($data['imageUrl'], $data['imageExtension'], $record); + + Notification::make() + ->title(trans('admin/egg.import.image_updated')) + ->success() + ->send(); + + return; + } + + if (!empty($data['image'])) { + Notification::make() + ->title(trans('admin/egg.import.image_updated')) + ->success() + ->send(); + + return; + } + + if (empty($data['imageUrl']) && empty($data['image'])) { + Notification::make() + ->title(trans('admin/egg.import.no_image')) + ->warning() + ->send(); + } + }), + Action::make('delete_image') + ->visible(fn ($record) => $record->image) + ->hiddenLabel() + ->tooltip(trans('admin/egg.import.delete_image')) + ->icon(TablerIcon::Trash) + ->iconSize(IconSize::Large) + ->color('danger') + ->action(function ($record) { + foreach (array_keys(Egg::IMAGE_FORMATS) as $ext) { + $path = Egg::ICON_STORAGE_PATH . "/$record->uuid.$ext"; + if (Storage::disk('public')->exists($path)) { + Storage::disk('public')->delete($path); + } + } + + Notification::make() + ->title(trans('admin/egg.import.image_deleted')) + ->success() + ->send(); + + $record->refresh(); + }), + ]), + ]), + TextInput::make('name') + ->label(trans('admin/egg.name')) + ->required() + ->maxLength(255) + ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 3, 'lg' => 2]) + ->helperText(trans('admin/egg.name_help')), + Textarea::make('description') + ->label(trans('admin/egg.description')) + ->rows(3) + ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 4, 'lg' => 3]) + ->helperText(trans('admin/egg.description_help')), + TextInput::make('id') + ->label(trans('admin/egg.egg_id')) + ->columnSpan(1) + ->disabled(), + TextInput::make('uuid') + ->label(trans('admin/egg.egg_uuid')) + ->disabled() + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) + ->helperText(trans('admin/egg.uuid_help')), + TextInput::make('author') + ->label(trans('admin/egg.author')) + ->required() + ->maxLength(255) + ->email() + ->disabled() + ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) + ->helperText(trans('admin/egg.author_help_edit')), + Toggle::make('force_outgoing_ip') + ->inline(false) + ->label(trans('admin/egg.force_ip')) + ->columnSpan(1) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.force_ip_help')), + KeyValue::make('startup_commands') + ->label(trans('admin/egg.startup_commands')) + ->live() + ->columnSpanFull() + ->required() + ->addActionLabel(trans('admin/egg.add_startup')) + ->keyLabel(trans('admin/egg.startup_name')) + ->valueLabel(trans('admin/egg.startup_command')) + ->helperText(trans('admin/egg.startup_help')), + TagsInput::make('file_denylist') + ->label(trans('admin/egg.file_denylist')) + ->placeholder('denied-file.txt') + ->helperText(trans('admin/egg.file_denylist_help')) + ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 2, 'lg' => 3]), + TextInput::make('update_url') + ->label(trans('admin/egg.update_url')) + ->url() + ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.update_url_help')) + ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 2, 'lg' => 3]), + TagsInput::make('features') + ->label(trans('admin/egg.features')) + ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 2, 'lg' => 3]), + Hidden::make('script_is_privileged') + ->helperText('The docker images available to servers using this egg.'), + TagsInput::make('tags') + ->label(trans('admin/egg.tags')) + ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 2, 'lg' => 3]), + KeyValue::make('docker_images') + ->label(trans('admin/egg.docker_images')) + ->live() + ->columnSpanFull() + ->required() + ->addActionLabel(trans('admin/egg.add_image')) + ->keyLabel(trans('admin/egg.docker_name')) + ->valueLabel(trans('admin/egg.docker_uri')) + ->helperText(trans('admin/egg.docker_help')), + ]), + Tab::make('process_management') + ->label(trans('admin/egg.tabs.process_management')) + ->columns() + ->icon(TablerIcon::ServerCog) + ->schema([ + CopyFrom::make('copy_process_from') + ->process(), + TextInput::make('config_stop') + ->label(trans('admin/egg.stop_command')) + ->maxLength(255) + ->helperText(trans('admin/egg.stop_command_help')), + Textarea::make('config_startup')->rows(10)->json() + ->label(trans('admin/egg.start_config')) + ->helperText(trans('admin/egg.start_config_help')), + Textarea::make('config_files')->rows(10)->json() + ->label(trans('admin/egg.config_files')) + ->dehydrateStateUsing(fn ($state) => blank($state) ? '{}' : $state) + ->helperText(trans('admin/egg.config_files_help')), + Textarea::make('config_logs')->rows(10)->json() + ->label(trans('admin/egg.log_config')) + ->helperText(trans('admin/egg.log_config_help')), + ]), + Tab::make('egg_variables') + ->label(trans('admin/egg.tabs.egg_variables')) + ->columnSpanFull() + ->icon(TablerIcon::Variable) + ->schema([ + Repeater::make('variables') + ->hiddenLabel() + ->grid() + ->relationship('variables') + ->orderColumn() + ->reorderAction(fn (Action $action) => $action->hiddenLabel()->tooltip(fn () => $action->getLabel())) + ->collapsible()->collapsed() + ->addActionLabel(trans('admin/egg.add_new_variable')) + ->itemLabel(fn (array $state) => $state['name']) + ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { + $data['default_value'] ??= ''; + $data['description'] ??= ''; + $data['rules'] ??= []; + $data['user_viewable'] ??= ''; + $data['user_editable'] ??= ''; + + return $data; + }) + ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { + $data['default_value'] ??= ''; + $data['description'] ??= ''; + $data['rules'] ??= []; + $data['user_viewable'] ??= ''; + $data['user_editable'] ??= ''; + + return $data; + }) + ->schema([ + TextInput::make('name') + ->label(trans('admin/egg.name')) + ->live() + ->debounce(750) + ->maxLength(255) + ->columnSpanFull() + ->afterStateUpdated(fn (Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString())) + ->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id'))) + ->validationMessages([ + 'unique' => trans('admin/egg.error_unique'), + ]) + ->required(), + Textarea::make('description')->label(trans('admin/egg.description'))->columnSpanFull(), + TextInput::make('env_variable') + ->label(trans('admin/egg.environment_variable')) + ->maxLength(255) + ->prefix('{{') + ->suffix('}}') + ->hintIcon(TablerIcon::Code, fn ($state) => "{{{$state}}}") + ->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id'))) + ->rules(EggVariable::getRulesForField('env_variable')) + ->validationMessages([ + 'unique' => trans('admin/egg.error_unique'), + 'required' => trans('admin/egg.error_required'), + '*' => trans('admin/egg.error_reserved'), + ]) + ->required(), + TextInput::make('default_value')->label(trans('admin/egg.default_value')), + Fieldset::make(trans('admin/egg.user_permissions')) + ->schema([ + Checkbox::make('user_viewable')->label(trans('admin/egg.viewable')), + Checkbox::make('user_editable')->label(trans('admin/egg.editable')), + ]), + TagsInput::make('rules') + ->label(trans('admin/egg.rules')) + ->columnSpanFull() + ->reorderable() + ->suggestions([ + 'required', + 'nullable', + 'string', + 'integer', + 'numeric', + 'boolean', + 'alpha', + 'alpha_dash', + 'alpha_num', + 'url', + 'email', + 'regex:', + 'min:', + 'max:', + 'between:', + 'between:1024,65535', + 'in:', + 'in:true,false', + ]), + ]), + ]), + Tab::make('install_script') + ->label(trans('admin/egg.tabs.install_script')) + ->columns(3) + ->icon(TablerIcon::FileDownload) + ->schema([ + CopyFrom::make('copy_script_from') + ->script(), + TextInput::make('script_container') + ->label(trans('admin/egg.script_container')) + ->required() + ->maxLength(255) + ->placeholder('ghcr.io/pelican-eggs/installers:debian'), + Select::make('script_entry') + ->label(trans('admin/egg.script_entry')) + ->selectablePlaceholder(false) + ->options([ + 'bash' => 'bash', + 'ash' => 'ash', + '/bin/bash' => '/bin/bash', + ]) + ->required(), + MonacoEditor::make('script_install') + ->hiddenLabel() + ->language(EditorLanguages::shell) + ->columnSpanFull(), + ]), + ]; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make() + ->disabled(fn (Egg $egg): bool => $egg->servers()->count() > 0) + ->tooltip(fn (Egg $egg): string => $egg->servers()->count() <= 0 ? trans('filament-actions::delete.single.label') : trans('admin/egg.in_use')), + ExportEggAction::make(), + ImportEggAction::make() + ->multiple(false), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + public function refreshForm(): void + { + $this->fillForm(); + } + + /** + * Save an image from URL download to a file. + * + * @throws Exception + */ + private function saveImageFromUrl(string $imageUrl, string $extension, Egg $egg): void + { + $context = stream_context_create([ + 'http' => ['timeout' => 3], + 'https' => [ + 'timeout' => 3, + 'verify_peer' => true, + 'verify_peer_name' => true, + ], + ]); + + $normalizedExtension = match ($extension) { + 'svg+xml', 'svg' => 'svg', + 'jpeg', 'jpg' => 'jpg', + 'png' => 'png', + 'webp' => 'webp', + default => throw new Exception(trans('admin/egg.import.unknown_extension')), + }; + + $data = @file_get_contents($imageUrl, false, $context, 0, 1048576); // 1024KB + + if (empty($data)) { + throw new Exception(trans('admin/egg.import.invalid_url')); + } + + Storage::disk('public')->put(Egg::ICON_STORAGE_PATH . "/$egg->uuid.$normalizedExtension", $data); + } + + protected function getFormActions(): array + { + return []; + } +} diff --git a/app/Filament/Admin/Resources/Eggs/Pages/ListEggs.php b/app/Filament/Admin/Resources/Eggs/Pages/ListEggs.php new file mode 100644 index 0000000000..49a7873ca4 --- /dev/null +++ b/app/Filament/Admin/Resources/Eggs/Pages/ListEggs.php @@ -0,0 +1,139 @@ +searchable(true) + ->defaultPaginationPageOption(25) + ->columns([ + TextColumn::make('id') + ->label('Id') + ->hidden(), + ImageColumn::make('image') + ->label('') + ->alignCenter() + ->circular() + ->getStateUsing(fn ($record) => $record->image + ? $record->image + : 'data:image/svg+xml;base64,' . base64_encode(file_get_contents(public_path('pelican.svg')))), + TextColumn::make('name') + ->label(trans('admin/egg.name')) + ->description(fn ($record): ?string => (strlen($record->description) > 120) ? substr($record->description, 0, 120).'...' : $record->description) + ->wrap() + ->searchable() + ->sortable(), + TextColumn::make('servers_count') + ->counts('servers') + ->label(trans('admin/egg.servers')), + ]) + ->recordActions([ + EditAction::make() + ->tooltip(trans('filament-actions::edit.single.label')), + ExportEggAction::make() + ->tooltip(trans('filament-actions::export.modal.actions.export.label')), + UpdateEggAction::make() + ->tooltip(trans_choice('admin/egg.update', 1)), + ReplicateAction::make() + ->tooltip(trans('filament-actions::replicate.single.label')) + ->modal(false) + ->excludeAttributes(['author', 'uuid', 'update_url', 'servers_count', 'created_at', 'updated_at']) + ->beforeReplicaSaved(function (Egg $replica) { + $replica->author = user()?->email; + $replica->name .= ' Copy'; + $replica->uuid = Str::uuid()->toString(); + }) + ->after(fn (Egg $record, Egg $replica) => $record->variables->each(fn ($variable) => $variable->replicate()->fill(['egg_id' => $replica->id])->save())) + ->successRedirectUrl(fn (Egg $replica) => EditEgg::getUrl(['record' => $replica])), + ]) + ->toolbarActions([ + ImportEggAction::make() + ->multiple(), + CreateAction::make(), + BulkActionGroup::make([ + DeleteBulkAction::make('exclude_bulk_delete') + ->before(function (Collection &$records) { + $eggsWithServers = $records->filter(fn (Egg $egg) => $egg->servers_count > 0); + + if ($eggsWithServers->isNotEmpty()) { + $eggNames = $eggsWithServers->map(fn (Egg $egg) => sprintf('%s (%d server%s)', $egg->name, $egg->servers_count, $egg->servers_count > 1 ? 's' : '')) + ->join(', '); + Notification::make() + ->danger() + ->title(trans('admin/egg.cannot_delete', ['count' => $eggsWithServers->count()])) + ->body(trans('admin/egg.eggs_have_servers', ['eggs' => $eggNames])) + ->send(); + } + + $records = $records->filter(fn (Egg $egg) => $egg->servers_count <= 0); + + if ($records->isEmpty()) { + $this->halt(); + } + }), + UpdateEggBulkAction::make('exclude_bulk_update') + ->before(function (Collection &$records) { + $eggsWithoutUpdateUrl = $records->filter(fn (Egg $egg) => $egg->update_url === null); + + if ($eggsWithoutUpdateUrl->isNotEmpty()) { + $eggNames = $eggsWithoutUpdateUrl->pluck('name')->join(', '); + + Notification::make() + ->warning() + ->title(trans('admin/egg.cannot_update', ['count' => $eggsWithoutUpdateUrl->count()])) + ->body(trans('admin/egg.no_update_url', ['eggs' => $eggNames])) + ->send(); + } + + $records = $records->filter(fn (Egg $egg) => $egg->update_url !== null); + + if ($records->isEmpty()) { + $this->halt(); + } + }), + ]), + ]) + ->emptyStateIcon(TablerIcon::Eggs) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/egg.no_eggs')) + ->filters([ + TagsFilter::make() + ->model(Egg::class), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Eggs/RelationManagers/ServersRelationManager.php b/app/Filament/Admin/Resources/Eggs/RelationManagers/ServersRelationManager.php new file mode 100644 index 0000000000..ca949235ca --- /dev/null +++ b/app/Filament/Admin/Resources/Eggs/RelationManagers/ServersRelationManager.php @@ -0,0 +1,44 @@ +recordTitleAttribute('servers') + ->emptyStateDescription(trans('admin/egg.no_servers')) + ->emptyStateHeading(trans('admin/egg.no_servers_help')) + ->searchable(false) + ->heading(trans('admin/egg.servers')) + ->columns([ + TextColumn::make('user.username') + ->label(trans('admin/server.owner')) + ->url(fn (Server $server): string => route('filament.admin.resources.users.edit', ['record' => $server->user])) + ->sortable(), + TextColumn::make('name') + ->label(trans('admin/server.name')) + ->url(fn (Server $server): string => route('filament.admin.resources.servers.edit', ['record' => $server])) + ->sortable(), + TextColumn::make('node.name') + ->url(fn (Server $server): string => route('filament.admin.resources.nodes.edit', ['record' => $server->node])), + TextColumn::make('image') + ->label(trans('admin/server.docker_image')), + SelectColumn::make('allocation.id') + ->label(trans('admin/server.primary_allocation')) + ->disabled() + ->options(fn (Server $server) => $server->allocations->take(1)->mapWithKeys(fn ($allocation) => [$allocation->id => $allocation->address])) + ->placeholder(trans('admin/server.none')) + ->sortable(), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Mounts/MountResource.php b/app/Filament/Admin/Resources/Mounts/MountResource.php new file mode 100644 index 0000000000..462ae595cb --- /dev/null +++ b/app/Filament/Admin/Resources/Mounts/MountResource.php @@ -0,0 +1,210 @@ +count() ?: null; + } + + public static function getNavigationGroup(): ?string + { + return trans('admin/dashboard.advanced'); + } + + /** + * @throws Exception + */ + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('name') + ->label(trans('admin/mount.table.name')) + ->description(fn (Mount $mount) => "$mount->source -> $mount->target") + ->sortable(), + TextColumn::make('eggs.name') + ->label(trans('admin/mount.eggs')) + ->badge() + ->placeholder(trans('admin/mount.table.all_eggs')), + TextColumn::make('nodes.name') + ->label(trans('admin/mount.nodes')) + ->badge() + ->placeholder(trans('admin/mount.table.all_nodes')), + TextColumn::make('read_only') + ->label(trans('admin/mount.table.read_only')) + ->badge() + ->icon(fn ($state) => $state ? TablerIcon::WritingOff : TablerIcon::Writing) + ->color(fn ($state) => $state ? 'success' : 'warning') + ->formatStateUsing(fn ($state) => $state ? trans('admin/mount.toggles.read_only') : trans('admin/mount.toggles.writable')), + ]) + ->recordActions([ + ViewAction::make() + ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), + EditAction::make(), + ]) + ->toolbarActions([ + CreateAction::make(), + BulkActionGroup::make([ + DeleteBulkAction::make('exclude_bulk_delete'), + ]), + ]) + ->emptyStateIcon(TablerIcon::LayersLinked) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/mount.no_mounts')); + } + + /** + * @throws Exception + */ + public static function defaultForm(Schema $schema): Schema + { + return $schema + ->components([ + Section::make()->schema([ + TextInput::make('name') + ->label(trans('admin/mount.name')) + ->required() + ->helperText(trans('admin/mount.name_help')) + ->maxLength(64), + ToggleButtons::make('read_only') + ->label(trans('admin/mount.read_only')) + ->helperText(trans('admin/mount.read_only_help')) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + false => trans('admin/mount.toggles.writable'), + true => trans('admin/mount.toggles.read_only'), + ]) + ->icons([ + false => TablerIcon::Writing, + true => TablerIcon::WritingOff, + ]) + ->colors([ + false => 'warning', + true => 'success', + ]) + ->inline() + ->default(false), + TextInput::make('source') + ->label(trans('admin/mount.source')) + ->required() + ->helperText(trans('admin/mount.source_help')) + ->maxLength(255), + TextInput::make('target') + ->label(trans('admin/mount.target')) + ->required() + ->helperText(trans('admin/mount.target_help')) + ->maxLength(255), + Textarea::make('description') + ->label(trans('admin/mount.description')) + ->helperText(trans('admin/mount.description_help')) + ->columnSpanFull(), + ]) + ->columnSpan([ + 'default' => 1, + 'lg' => 2, + ]) + ->columns([ + 'default' => 1, + 'xl' => 2, + ]), + Section::make()->schema([ + Select::make('eggs') + ->multiple() + ->label(trans('admin/mount.eggs')) + // Selecting only non-json fields to prevent Postgres from choking on DISTINCT JSON columns + ->relationship('eggs', 'name', fn (Builder $query) => $query->select(['eggs.id', 'eggs.name'])) + ->preload(), + Select::make('nodes') + ->multiple() + ->label(trans('admin/mount.nodes')) + ->relationship('nodes', 'name', fn (Builder $query) => $query->whereIn('nodes.id', user()?->accessibleNodes()->pluck('id'))) + ->searchable(['name', 'fqdn']) + ->preload(), + ]), + ])->columns([ + 'default' => 1, + 'lg' => 3, + ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListMounts::route('/'), + 'create' => CreateMount::route('/create'), + 'view' => ViewMount::route('/{record}'), + 'edit' => EditMount::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + $query = parent::getEloquentQuery(); + + return $query->where(function (Builder $query) { + return $query->whereHas('nodes', function (Builder $query) { + $query->whereIn('nodes.id', user()?->accessibleNodes()->pluck('id')); + })->orDoesntHave('nodes'); + }); + } +} diff --git a/app/Filament/Admin/Resources/Mounts/Pages/CreateMount.php b/app/Filament/Admin/Resources/Mounts/Pages/CreateMount.php new file mode 100644 index 0000000000..e35eb5ec1a --- /dev/null +++ b/app/Filament/Admin/Resources/Mounts/Pages/CreateMount.php @@ -0,0 +1,49 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + Action::make('create') + ->hiddenLabel() + ->action('create') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->icon(TablerIcon::FilePlus), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function handleRecordCreation(array $data): Model + { + $data['uuid'] ??= Str::uuid()->toString(); + $data['user_mountable'] = 1; + + return parent::handleRecordCreation($data); + } +} diff --git a/app/Filament/Admin/Resources/Mounts/Pages/EditMount.php b/app/Filament/Admin/Resources/Mounts/Pages/EditMount.php new file mode 100644 index 0000000000..f520ab78a8 --- /dev/null +++ b/app/Filament/Admin/Resources/Mounts/Pages/EditMount.php @@ -0,0 +1,39 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make(), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + protected function getFormActions(): array + { + return []; + } +} diff --git a/app/Filament/Admin/Resources/Mounts/Pages/ListMounts.php b/app/Filament/Admin/Resources/Mounts/Pages/ListMounts.php new file mode 100644 index 0000000000..3bc47be461 --- /dev/null +++ b/app/Filament/Admin/Resources/Mounts/Pages/ListMounts.php @@ -0,0 +1,16 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + EditAction::make(), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Nodes/NodeResource.php b/app/Filament/Admin/Resources/Nodes/NodeResource.php new file mode 100644 index 0000000000..426a2895fc --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/NodeResource.php @@ -0,0 +1,82 @@ +getCustomization(CustomizationKey::TopNavigation) ? false : trans('admin/dashboard.server'); + } + + public static function getNavigationBadge(): ?string + { + return (string) static::getEloquentQuery()->count() ?: null; + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return [ + AllocationsRelationManager::class, + ServersRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListNodes::route('/'), + 'create' => CreateNode::route('/create'), + 'edit' => EditNode::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + $query = parent::getEloquentQuery(); + + return $query->whereIn('id', user()?->accessibleNodes()->pluck('id')); + } +} diff --git a/app/Filament/Admin/Resources/Nodes/Pages/CreateNode.php b/app/Filament/Admin/Resources/Nodes/Pages/CreateNode.php new file mode 100644 index 0000000000..b913ec4d84 --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/Pages/CreateNode.php @@ -0,0 +1,451 @@ +components([ + Wizard::make($this->getSteps()) + ->columnSpanFull() + ->nextAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowRight)) + ->previousAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowLeft)) + ->submitAction(new HtmlString(Blade::render(<<<'BLADE' + + {{ trans('admin/node.create') }} + + BLADE))), + ]); + } + + /** @return Step[] */ + protected function getDefaultSteps(): array + { + return [ + Step::make('basic') + ->label(trans('admin/node.tabs.basic_settings')) + ->icon(TablerIcon::Server) + ->columnSpanFull() + ->columns([ + 'default' => 2, + 'sm' => 3, + 'md' => 3, + 'lg' => 4, + ]) + ->schema([ + TextInput::make('fqdn') + ->columnSpan(2) + ->required() + ->autofocus() + ->live(debounce: 1500) + ->rules(Node::getRulesForField('fqdn')) + ->prohibited(fn ($state) => is_ip($state) && request()->isSecure()) + ->label(fn ($state) => is_ip($state) ? trans('admin/node.ip_address') : trans('admin/node.domain')) + ->placeholder(fn ($state) => is_ip($state) ? '192.168.1.1' : 'node.example.com') + ->helperText(function ($state) { + if (is_ip($state)) { + if (request()->isSecure()) { + return trans('admin/node.fqdn_help'); + } + + return ''; + } + + return trans('admin/node.error'); + }) + ->hintColor('danger') + ->hint(function ($state) { + if (is_ip($state) && request()->isSecure()) { + return trans('admin/node.ssl_ip'); + } + + return ''; + }) + ->afterStateUpdated(function (Set $set, ?string $state) { + $set('dns', null); + $set('ip', null); + + [$subdomain] = str($state)->explode('.', 2); + if (!is_numeric($subdomain)) { + $set('name', $subdomain); + } + + if (!$state || is_ip($state)) { + $set('dns', null); + + return; + } + + $ip = get_ip_from_hostname($state); + if ($ip) { + $set('dns', true); + + $set('ip', $ip); + } else { + $set('dns', false); + } + }) + ->maxLength(255), + + TextInput::make('ip') + ->disabled() + ->hidden(), + + ToggleButtons::make('dns') + ->label(trans('admin/node.dns')) + ->helperText(trans('admin/node.dns_help')) + ->disabled() + ->inline() + ->default(null) + ->hint(fn (Get $get) => $get('ip')) + ->hintColor('success') + ->options([ + true => trans('admin/node.valid'), + false => trans('admin/node.invalid'), + ]) + ->colors([ + true => 'success', + false => 'danger', + ]) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]), + + TextInput::make('daemon_connect') + ->columnSpan(1) + ->label(fn (Get $get) => $get('connection') === 'https_proxy' ? trans('admin/node.connect_port') : trans('admin/node.port')) + ->helperText(fn (Get $get) => $get('connection') === 'https_proxy' ? trans('admin/node.connect_port_help') : trans('admin/node.port_help')) + ->minValue(1) + ->maxValue(65535) + ->default(8080) + ->required() + ->integer(), + + TextInput::make('name') + ->label(trans('admin/node.display_name')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->required() + ->maxLength(100), + + Hidden::make('scheme') + ->default(fn () => request()->isSecure() ? 'https' : 'http'), + + Hidden::make('behind_proxy') + ->default(false), + + ToggleButtons::make('connection') + ->label(trans('admin/node.ssl')) + ->columnSpan(1) + ->inline() + ->helperText(function (Get $get) { + if (request()->isSecure()) { + return new HtmlString(trans('admin/node.panel_on_ssl')); + } + + if (is_ip($get('fqdn'))) { + return trans('admin/node.ssl_help'); + } + + return ''; + }) + ->disableOptionWhen(fn (string $value) => $value === 'http' && request()->isSecure()) + ->options([ + 'http' => 'HTTP', + 'https' => 'HTTPS (SSL)', + 'https_proxy' => 'HTTPS with (reverse) proxy', + ]) + ->colors([ + 'http' => 'warning', + 'https' => 'success', + 'https_proxy' => 'success', + ]) + ->icons([ + 'http' => TablerIcon::LockOpenOff, + 'https' => TablerIcon::Lock, + 'https_proxy' => TablerIcon::ShieldLock, + ]) + ->default(fn () => request()->isSecure() ? 'https' : 'http') + ->live() + ->dehydrated(false) + ->afterStateUpdated(function ($state, Set $set) { + $set('scheme', $state === 'http' ? 'http' : 'https'); + $set('behind_proxy', $state === 'https_proxy'); + + $set('daemon_connect', $state === 'https_proxy' ? 443 : 8080); + $set('daemon_listen', 8080); + }), + + TextInput::make('daemon_listen') + ->columnSpan(1) + ->label(trans('admin/node.listen_port')) + ->helperText(trans('admin/node.listen_port_help')) + ->minValue(1) + ->maxValue(65535) + ->default(8080) + ->required() + ->integer() + ->visible(fn (Get $get) => $get('connection') === 'https_proxy'), + ]), + Step::make('advanced') + ->label(trans('admin/node.tabs.advanced_settings')) + ->icon(TablerIcon::ServerCog) + ->columnSpanFull() + ->columns([ + 'default' => 2, + 'sm' => 3, + 'md' => 3, + 'lg' => 4, + ]) + ->schema([ + ToggleButtons::make('maintenance_mode') + ->label(trans('admin/node.maintenance_mode'))->inline() + ->columnSpan(1) + ->default(false) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.maintenance_mode_help')) + ->options([ + true => trans('admin/node.enabled'), + false => trans('admin/node.disabled'), + ]) + ->colors([ + true => 'danger', + false => 'success', + ]), + ToggleButtons::make('public') + ->default(true) + ->columnSpan(1) + ->label(trans('admin/node.use_for_deploy'))->inline() + ->options([ + true => trans('admin/node.yes'), + false => trans('admin/node.no'), + ]) + ->colors([ + true => 'success', + false => 'danger', + ]), + TagsInput::make('tags') + ->label(trans('admin/node.tags')) + ->columnSpan(2), + TextInput::make('upload_size') + ->label(trans('admin/node.upload_limit')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.upload_limit_help')) + ->columnSpan(1) + ->numeric()->required() + ->default(256) + ->minValue(1) + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'), + TextInput::make('daemon_base') + ->label(trans('admin/node.daemon_base')) + ->placeholder('/var/lib/pelican/volumes') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.daemon_base_help')) + ->columnSpan(1) + ->required() + ->default('/var/lib/pelican/volumes') + ->rule('regex:/^([\/][\d\w.\-\/]+)$/'), + TextInput::make('daemon_sftp') + ->columnSpan(1) + ->label(trans('admin/node.sftp_port')) + ->minValue(1) + ->maxValue(65535) + ->default(2022) + ->required() + ->integer(), + TextInput::make('daemon_sftp_alias') + ->columnSpan(1) + ->label(trans('admin/node.sftp_alias')) + ->helperText(trans('admin/node.sftp_alias_help')), + Grid::make() + ->columns(6) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_mem') + ->dehydrated() + ->label(trans('admin/node.memory'))->inlineLabel()->inline() + ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) + ->afterStateUpdated(fn (Set $set) => $set('memory_overallocate', 0)) + ->formatStateUsing(fn (Get $get) => $get('memory') == 0) + ->live() + ->options([ + true => trans('admin/node.unlimited'), + false => trans('admin/node.limited'), + ]) + ->colors([ + true => 'primary', + false => 'warning', + ]) + ->columnSpan(2), + TextInput::make('memory') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_mem')) + ->label(trans('admin/node.memory_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->columnSpan(2) + ->numeric() + ->minValue(0) + ->default(0) + ->required(), + TextInput::make('memory_overallocate') + ->dehydratedWhenHidden() + ->label(trans('admin/node.overallocate'))->inlineLabel() + ->hidden(fn (Get $get) => $get('unlimited_mem')) + ->columnSpan(2) + ->numeric() + ->minValue(-1) + ->maxValue(100) + ->default(0) + ->suffix('%') + ->required(), + ]), + Grid::make() + ->columns(6) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_disk') + ->dehydrated() + ->label(trans('admin/node.disk'))->inlineLabel()->inline() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) + ->afterStateUpdated(fn (Set $set) => $set('disk_overallocate', 0)) + ->formatStateUsing(fn (Get $get) => $get('disk') == 0) + ->options([ + true => trans('admin/node.unlimited'), + false => trans('admin/node.limited'), + ]) + ->colors([ + true => 'primary', + false => 'warning', + ]) + ->columnSpan(2), + TextInput::make('disk') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_disk')) + ->label(trans('admin/node.disk_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->columnSpan(2) + ->numeric() + ->minValue(0) + ->default(0) + ->required(), + TextInput::make('disk_overallocate') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_disk')) + ->label(trans('admin/node.overallocate'))->inlineLabel() + ->columnSpan(2) + ->numeric() + ->minValue(-1) + ->maxValue(100) + ->default(0) + ->suffix('%') + ->required(), + ]), + Grid::make() + ->columns(6) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_cpu') + ->dehydrated() + ->label(trans('admin/node.cpu'))->inlineLabel()->inline() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) + ->afterStateUpdated(fn (Set $set) => $set('cpu_overallocate', 0)) + ->formatStateUsing(fn (Get $get) => $get('cpu') == 0) + ->options([ + true => trans('admin/node.unlimited'), + false => trans('admin/node.limited'), + ]) + ->colors([ + true => 'primary', + false => 'warning', + ]) + ->columnSpan(2), + TextInput::make('cpu') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_cpu')) + ->label(trans('admin/node.cpu_limit'))->inlineLabel() + ->suffix('%') + ->columnSpan(2) + ->numeric() + ->default(0) + ->minValue(0) + ->required(), + TextInput::make('cpu_overallocate') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_cpu')) + ->label(trans('admin/node.overallocate'))->inlineLabel() + ->columnSpan(2) + ->numeric() + ->default(0) + ->minValue(-1) + ->maxValue(100) + ->suffix('%') + ->required(), + ]), + ]), + ]; + } + + protected function getRedirectUrlParameters(): array + { + return [ + 'tab' => 'configuration-file::data::tab', + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function mutateFormDataBeforeCreate(array $data): array + { + if (!$data['behind_proxy']) { + $data['daemon_listen'] = $data['daemon_connect']; + } + + return $data; + } +} diff --git a/app/Filament/Admin/Resources/Nodes/Pages/EditNode.php b/app/Filament/Admin/Resources/Nodes/Pages/EditNode.php new file mode 100644 index 0000000000..91fd73ac59 --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/Pages/EditNode.php @@ -0,0 +1,881 @@ +daemonSystemRepository = $daemonSystemRepository; + $this->nodeUpdateService = $nodeUpdateService; + } + + public function form(Schema $schema): Schema + { + return $schema->components([ + Tabs::make('Tabs') + ->columns([ + 'default' => 2, + 'sm' => 3, + 'md' => 3, + 'lg' => 4, + ]) + ->persistTabInQueryString() + ->columnSpanFull() + ->tabs($this->getTabs()), + ]); + } + + /** @return Tab[] */ + protected function getDefaultTabs(): array + { + return [ + Tab::make('overview') + ->label(trans('admin/node.tabs.overview')) + ->icon(TablerIcon::ChartAreaLineFilled) + ->columns([ + 'default' => 4, + 'sm' => 2, + 'md' => 4, + 'lg' => 4, + ]) + ->schema([ + Fieldset::make() + ->label(trans('admin/node.node_info')) + ->columns(4) + ->columnSpanFull() + ->schema([ + TextEntry::make('wings_version') + ->label(trans('admin/node.wings_version')) + ->state(fn (Node $node, SoftwareVersionService $versionService) => ($node->systemInformation()['version'] ?? trans('admin/node.unknown')) . ' ' . trans('admin/node.latest', ['version' => $versionService->latestWingsVersion()])), + TextEntry::make('cpu_threads') + ->label(trans('admin/node.cpu_threads')) + ->state(fn (Node $node) => $node->systemInformation()['cpu_count'] ?? 0), + TextEntry::make('architecture') + ->label(trans('admin/node.architecture')) + ->state(fn (Node $node) => $node->systemInformation()['architecture'] ?? trans('admin/node.unknown')), + TextEntry::make('kernel') + ->label(trans('admin/node.kernel')) + ->state(fn (Node $node) => $node->systemInformation()['kernel_version'] ?? trans('admin/node.unknown')), + ]), + View::make('filament.components.node-cpu-chart') + ->columnSpan([ + 'default' => 4, + 'sm' => 1, + 'md' => 2, + 'lg' => 2, + ]), + View::make('filament.components.node-memory-chart') + ->columnSpan([ + 'default' => 4, + 'sm' => 1, + 'md' => 2, + 'lg' => 2, + ]), + View::make('filament.components.node-storage-chart') + ->columnSpanFull(), + ]), + Tab::make('basic_settings') + ->label(trans('admin/node.tabs.basic_settings')) + ->icon(TablerIcon::Server) + ->schema([ + TextInput::make('fqdn') + ->columnSpan(2) + ->required() + ->autofocus() + ->live(debounce: 1500) + ->rules(Node::getRulesForField('fqdn')) + ->prohibited(fn ($state) => is_ip($state) && request()->isSecure()) + ->label(fn ($state) => is_ip($state) ? trans('admin/node.ip_address') : trans('admin/node.domain')) + ->placeholder(fn ($state) => is_ip($state) ? '192.168.1.1' : 'node.example.com') + ->helperText(function ($state) { + if (is_ip($state)) { + if (request()->isSecure()) { + return trans('admin/node.fqdn_help'); + } + + return ''; + } + + return trans('admin/node.error'); + }) + ->hintColor('danger') + ->hint(function ($state) { + if (is_ip($state) && request()->isSecure()) { + return trans('admin/node.ssl_ip'); + } + + return ''; + }) + ->afterStateUpdated(function (Set $set, ?string $state) { + $set('dns', null); + $set('ip', null); + + [$subdomain] = str($state)->explode('.', 2); + if (!is_numeric($subdomain)) { + $set('name', $subdomain); + } + + if (!$state || is_ip($state)) { + $set('dns', null); + + return; + } + + $ip = get_ip_from_hostname($state); + if ($ip) { + $set('dns', true); + + $set('ip', $ip); + } else { + $set('dns', false); + } + }) + ->maxLength(255), + TextInput::make('ip') + ->disabled() + ->hidden(), + ToggleButtons::make('dns') + ->label(trans('admin/node.dns')) + ->helperText(trans('admin/node.dns_help')) + ->disabled() + ->inline() + ->default(null) + ->hint(fn (Get $get) => $get('ip')) + ->hintColor('success') + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/node.valid'), + 0 => trans('admin/node.invalid'), + ]) + ->colors([ + 1 => 'success', + 0 => 'danger', + ]) + ->columnSpan(1), + TextInput::make('daemon_connect') + ->columnSpan(1) + ->label(fn (Get $get) => $get('connection') === 'https_proxy' ? trans('admin/node.connect_port') : trans('admin/node.port')) + ->helperText(fn (Get $get) => $get('connection') === 'https_proxy' ? trans('admin/node.connect_port_help') : trans('admin/node.port_help')) + ->minValue(1) + ->maxValue(65535) + ->default(8080) + ->required() + ->integer(), + TextInput::make('name') + ->label(trans('admin/node.display_name')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->required() + ->maxLength(100), + Hidden::make('scheme'), + Hidden::make('behind_proxy'), + ToggleButtons::make('connection') + ->label(trans('admin/node.ssl')) + ->columnSpan(1) + ->inline() + ->helperText(function (Get $get) { + if (request()->isSecure()) { + return new HtmlString(trans('admin/node.panel_on_ssl')); + } + + if (is_ip($get('fqdn'))) { + return trans('admin/node.ssl_help'); + } + + return ''; + }) + ->disableOptionWhen(fn (string $value) => $value === 'http' && request()->isSecure()) + ->options([ + 'http' => 'HTTP', + 'https' => 'HTTPS (SSL)', + 'https_proxy' => 'HTTPS with (reverse) proxy', + ]) + ->colors([ + 'http' => 'warning', + 'https' => 'success', + 'https_proxy' => 'success', + ]) + ->icons([ + 'http' => TablerIcon::LockOpenOff, + 'https' => TablerIcon::Lock, + 'https_proxy' => TablerIcon::ShieldLock, + ]) + ->formatStateUsing(fn (Get $get) => $get('scheme') === 'http' ? 'http' : ($get('behind_proxy') ? 'https_proxy' : 'https')) + ->live() + ->dehydrated(false) + ->afterStateUpdated(function ($state, Set $set) { + $set('scheme', $state === 'http' ? 'http' : 'https'); + $set('behind_proxy', $state === 'https_proxy'); + + $set('daemon_connect', $state === 'https_proxy' ? 443 : 8080); + $set('daemon_listen', 8080); + }), + TextInput::make('daemon_listen') + ->columnSpan(1) + ->label(trans('admin/node.listen_port')) + ->helperText(trans('admin/node.listen_port_help')) + ->minValue(1) + ->maxValue(65535) + ->default(8080) + ->required() + ->integer() + ->visible(fn (Get $get) => $get('connection') === 'https_proxy'), + ]), + Tab::make('advanced_settings') + ->label(trans('admin/node.tabs.advanced_settings')) + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 4, + 'lg' => 6, + ]) + ->icon(TablerIcon::ServerCog) + ->schema([ + TextInput::make('id') + ->label(trans('admin/node.node_id')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 1, + ]) + ->disabled(), + TextInput::make('uuid') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 2, + ]) + ->label(trans('admin/node.node_uuid')) + ->hintCopy() + ->disabled(), + TagsInput::make('tags') + ->label(trans('admin/node.tags')) + ->placeholder('') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]), + TextInput::make('upload_size') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 1, + ]) + ->label(trans('admin/node.upload_limit')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.upload_limit_help')) + ->numeric() + ->required() + ->minValue(1) + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'), + TextInput::make('daemon_base') + ->label(trans('admin/node.daemon_base')) + ->placeholder('/var/lib/pelican/volumes') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.daemon_base_help')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 2, + ]) + ->required() + ->rule('regex:/^([\/][\d\w.\-\/]+)$/'), + TextInput::make('daemon_sftp') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 1, + ]) + ->label(trans('admin/node.sftp_port')) + ->minValue(1) + ->maxValue(65535) + ->default(2022) + ->required() + ->integer(), + TextInput::make('daemon_sftp_alias') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 2, + ]) + ->label(trans('admin/node.sftp_alias')) + ->helperText(trans('admin/node.sftp_alias_help')), + ToggleButtons::make('public') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->label(trans('admin/node.use_for_deploy')) + ->inline() + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/node.yes'), + 0 => trans('admin/node.no'), + ]) + ->colors([ + 1 => 'success', + 0 => 'danger', + ]), + ToggleButtons::make('maintenance_mode') + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->label(trans('admin/node.maintenance_mode')) + ->inline() + ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.maintenance_mode_help')) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/node.enabled'), + 0 => trans('admin/node.disabled'), + ]) + ->colors([ + 1 => 'danger', + 0 => 'success', + ]), + Grid::make() + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 3, + 'lg' => 6, + ]) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_mem') + ->dehydrated() + ->label(trans('admin/node.memory'))->inlineLabel()->inline() + ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) + ->afterStateUpdated(fn (Set $set) => $set('memory_overallocate', 0)) + ->formatStateUsing(fn (Get $get) => $get('memory') == 0) + ->live() + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/node.unlimited'), + 0 => trans('admin/node.limited'), + ]) + ->colors([ + 1 => 'primary', + 0 => 'warning', + ]) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]), + TextInput::make('memory') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_mem')) + ->label(trans('admin/node.memory_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->required() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->numeric() + ->minValue(0), + TextInput::make('memory_overallocate') + ->dehydratedWhenHidden() + ->label(trans('admin/node.overallocate'))->inlineLabel() + ->required() + ->hidden(fn (Get $get) => $get('unlimited_mem')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->numeric() + ->minValue(-1) + ->maxValue(100) + ->suffix('%'), + ]), + Grid::make() + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 3, + 'lg' => 6, + ]) + ->schema([ + ToggleButtons::make('unlimited_disk') + ->dehydrated() + ->label(trans('admin/node.disk'))->inlineLabel()->inline() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) + ->afterStateUpdated(fn (Set $set) => $set('disk_overallocate', 0)) + ->formatStateUsing(fn (Get $get) => $get('disk') == 0) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/node.unlimited'), + 0 => trans('admin/node.limited'), + ]) + ->colors([ + 1 => 'primary', + 0 => 'warning', + ]) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]), + TextInput::make('disk') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_disk')) + ->label(trans('admin/node.disk_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->required() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->numeric() + ->minValue(0), + TextInput::make('disk_overallocate') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_disk')) + ->label(trans('admin/node.overallocate'))->inlineLabel() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->required() + ->numeric() + ->minValue(-1) + ->maxValue(100) + ->suffix('%'), + ]), + Grid::make() + ->columns(6) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_cpu') + ->dehydrated() + ->label(trans('admin/node.cpu'))->inlineLabel()->inline() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) + ->afterStateUpdated(fn (Set $set) => $set('cpu_overallocate', 0)) + ->formatStateUsing(fn (Get $get) => $get('cpu') == 0) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/node.unlimited'), + 0 => trans('admin/node.limited'), + ]) + ->colors([ + 1 => 'primary', + 0 => 'warning', + ]) + ->columnSpan(2), + TextInput::make('cpu') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_cpu')) + ->label(trans('admin/node.cpu_limit'))->inlineLabel() + ->suffix('%') + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + TextInput::make('cpu_overallocate') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_cpu')) + ->label(trans('admin/node.overallocate'))->inlineLabel() + ->columnSpan(2) + ->required() + ->numeric() + ->minValue(-1) + ->maxValue(100) + ->suffix('%'), + ]), + ]), + Tab::make('config_file') + ->label(trans('admin/node.tabs.config_file')) + ->icon(TablerIcon::Code) + ->schema([ + TextEntry::make('instructions') + ->label(trans('admin/node.instructions')) + ->columnSpanFull() + ->state(new HtmlString(trans('admin/node.instructions_help'))), + CodeEntry::make('config') + ->label('/etc/pelican/config.yml') + ->grammar(Grammar::Yaml) + ->state(fn (Node $node) => $node->getYamlConfiguration()) + ->copyable() + ->disabled() + ->columnSpanFull(), + Grid::make() + ->columns() + ->columnSpanFull() + ->schema([ + Actions::make([ + Action::make('exclude_autoDeploy') + ->label(trans('admin/node.auto_deploy')) + ->color('primary') + ->modalHeading(trans('admin/node.auto_deploy')) + ->icon(TablerIcon::Rocket) + ->modalSubmitAction(false) + ->modalCancelAction(false) + ->modalFooterActionsAlignment(Alignment::Center) + ->schema([ + ToggleButtons::make('docker') + ->label(trans('admin/node.auto_label')) + ->live() + ->helperText(trans('admin/node.auto_question')) + ->inline() + ->default(false) + ->afterStateUpdated(fn (bool $state, NodeAutoDeployService $service, Node $node, Set $set) => $set('generatedToken', $service->handle(request(), $node, $state))) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 0 => trans('admin/node.standalone'), + 1 => trans('admin/node.docker'), + ]) + ->colors([ + 0 => 'primary', + 1 => 'success', + ]) + ->columnSpan(1), + Textarea::make('generatedToken') + ->label(trans('admin/node.auto_command')) + ->readOnly() + ->autosize() + ->hintCopy() + ->formatStateUsing(fn (NodeAutoDeployService $service, Node $node, Set $set, Get $get) => $set('generatedToken', $service->handle(request(), $node, $get('docker')))), + ]) + ->mountUsing(function (Schema $schema) { + $schema->fill(); + }), + ])->fullWidth(), + Actions::make([ + Action::make('exclude_resetKey') + ->label(trans('admin/node.reset_token')) + ->color('danger') + ->requiresConfirmation() + ->modalHeading(trans('admin/node.reset_token')) + ->modalDescription(trans('admin/node.reset_help')) + ->action(function (Node $node) { + try { + $this->nodeUpdateService->handle($node, [], true); + } catch (Exception) { + Notification::make() + ->title(trans('admin/node.error_connecting', ['node' => $node->name])) + ->body(trans('admin/node.error_connecting_description')) + ->color('warning') + ->icon(TablerIcon::Database) + ->warning() + ->send(); + + } + Notification::make()->success()->title(trans('admin/node.token_reset'))->send(); + $this->fillForm(); + }), + ])->fullWidth(), + ]), + ]), + Tab::make('diagnostics') + ->label(trans('admin/node.tabs.diagnostics')) + ->icon(TablerIcon::HeartSearch) + ->schema([ + Section::make('diag') + ->heading(trans('admin/node.tabs.diagnostics')) + ->columnSpanFull() + ->columns(4) + ->disabled(fn (Get $get) => $get('pulled')) + ->headerActions([ + Action::make('pull') + ->tooltip(trans('admin/node.diagnostics.pull')) + ->icon(TablerIcon::CloudDownload) + ->hidden(fn (Get $get) => $get('pulled')) + ->action(function (Get $get, Set $set, Node $node) { + $includeEndpoints = $get('include_endpoints') ?? true; + $includeLogs = $get('include_logs') ?? true; + $logLines = $get('log_lines') ?? 200; + + try { + $response = $this->daemonSystemRepository->setNode($node)->getDiagnostics($logLines, $includeEndpoints, $includeLogs); + + if ($response->status() === 404) { + Notification::make() + ->title(trans('admin/node.diagnostics.404')) + ->warning() + ->send(); + + return; + } + + $set('pulled', true); + $set('uploaded', false); + $set('log', $response->body()); + + Notification::make() + ->title(trans('admin/node.diagnostics.logs_pulled')) + ->success() + ->send(); + } catch (ConnectionException $e) { + Notification::make() + ->title(trans('admin/node.error_connecting', ['node' => $node->name])) + ->body($e->getMessage()) + ->danger() + ->send(); + + } + }), + Action::make('upload') + ->tooltip(trans('admin/node.diagnostics.upload')) + ->visible(fn (Get $get) => $get('pulled') ?? false) + ->icon(TablerIcon::CloudUpload) + ->action(function (Get $get, Set $set) { + try { + $response = Http::asMultipart() + ->attach('c', $get('log')) + ->attach('e', '14d') + ->post('https://logs.pelican.dev'); + + if ($response->failed()) { + Notification::make() + ->title(trans('admin/node.diagnostics.upload_failed')) + ->body(fn () => $response->status() . ' - ' . $response->body()) + ->danger() + ->send(); + + return; + } + + $data = $response->json(); + $url = $data['url']; + + Notification::make() + ->title(trans('admin/node.diagnostics.logs_uploaded')) + ->body("{$url}") + ->success() + ->actions([ + Action::make('exclude_viewLogs') + ->label(trans('admin/node.diagnostics.view_logs')) + ->url($url) + ->openUrlInNewTab(true), + ]) + ->persistent() + ->send(); + $set('log', $url); + $set('pulled', false); + $set('uploaded', true); + + } catch (\Exception $e) { + Notification::make() + ->title(trans('admin/node.diagnostics.upload_failed')) + ->body($e->getMessage()) + ->danger() + ->send(); + } + }), + Action::make('clear') + ->tooltip(trans('admin/node.diagnostics.clear')) + ->visible(fn (Get $get) => $get('pulled') ?? false) + ->icon(TablerIcon::Trash)->color('danger') + ->action(function (Get $get, Set $set) { + $set('pulled', false); + $set('uploaded', false); + $set('log', null); + $this->refresh(); + } + ), + ]) + ->schema([ + ToggleButtons::make('include_endpoints') + ->hintIcon(TablerIcon::QuestionMark)->inline() + ->hintIconTooltip(trans('admin/node.diagnostics.include_endpoints_hint')) + ->formatStateUsing(fn () => 1) + ->boolean(), + ToggleButtons::make('include_logs') + ->live() + ->hintIcon(TablerIcon::QuestionMark)->inline() + ->hintIconTooltip(trans('admin/node.diagnostics.include_logs_hint')) + ->formatStateUsing(fn () => 1) + ->boolean(), + Slider::make('log_lines') + ->columnSpan(2) + ->hiddenLabel() + ->live() + ->tooltips(RawJs::make(<<<'JS' + `${$value} lines` + JS)) + ->visible(fn (Get $get) => $get('include_logs')) + ->range(minValue: 100, maxValue: 500) + ->pips(PipsMode::Steps, density: 10) + ->step(50) + ->formatStateUsing(fn () => 200) + ->fillTrack(), + Hidden::make('pulled'), + Hidden::make('uploaded'), + ]), + Textarea::make('log') + ->hiddenLabel() + ->columnSpanFull() + ->rows(35) + ->visible(fn (Get $get) => ($get('pulled') ?? false) || ($get('uploaded') ?? false)), + ]), + ]; + } + + protected function mutateFormDataBeforeFill(array $data): array + { + $node = Node::findOrFail($data['id']); + + if (!is_ip($node->fqdn)) { + $ip = get_ip_from_hostname($node->fqdn); + if ($ip) { + $data['dns'] = true; + $data['ip'] = $ip; + } else { + $data['dns'] = false; + } + } + + return $data; + } + + protected function getFormActions(): array + { + return []; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make() + ->disabled(fn (Node $node) => $node->servers()->count() > 0) + ->tooltip(fn (Node $node) => $node->servers()->count() > 0 ? trans('admin/node.node_has_servers') : trans('filament-actions::delete.single.label')), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + protected function mutateFormDataBeforeSave(array $data): array + { + if (!$data['behind_proxy']) { + $data['daemon_listen'] = $data['daemon_connect']; + } + + return $data; + } + + protected function afterSave(): void + { + $this->fillForm(); + + /** @var Node $node */ + $node = $this->record; + + $changed = collect($node->getChanges())->except(['updated_at', 'name', 'tags', 'public', 'maintenance_mode', 'memory', 'memory_overallocate', 'disk', 'disk_overallocate', 'cpu', 'cpu_overallocate'])->all(); + + try { + if ($changed) { + $this->daemonSystemRepository->setNode($node)->update($node); + } + parent::getSavedNotification()?->send(); + } catch (ConnectionException) { + Notification::make() + ->title(trans('admin/node.error_connecting', ['node' => $node->name])) + ->body(trans('admin/node.error_connecting_description')) + ->color('warning') + ->icon(TablerIcon::Database) + ->warning() + ->send(); + } + } + + protected function getSavedNotification(): ?Notification + { + return null; + } + + protected function getColumnSpan(): ?int + { + return null; + } + + protected function getColumnStart(): ?int + { + return null; + } +} diff --git a/app/Filament/Admin/Resources/Nodes/Pages/ListNodes.php b/app/Filament/Admin/Resources/Nodes/Pages/ListNodes.php new file mode 100644 index 0000000000..afaf12a77e --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/Pages/ListNodes.php @@ -0,0 +1,79 @@ +searchable(false) + ->checkIfRecordIsSelectableUsing(fn (Node $node) => $node->servers_count <= 0) + ->columns([ + TextColumn::make('uuid') + ->label('UUID') + ->searchable() + ->hidden(), + NodeHealthColumn::make('health'), + NodeClientHealthColumn::make('reachable'), + TextColumn::make('name') + ->label(trans('admin/node.table.name')) + ->sortable() + ->searchable(), + TextColumn::make('fqdn') + ->visibleFrom('md') + ->label(trans('admin/node.table.address')) + ->sortable() + ->searchable(), + IconColumn::make('scheme') + ->visibleFrom('xl') + ->label('SSL') + ->trueIcon(TablerIcon::Lock) + ->falseIcon(TablerIcon::LockOpenOff) + ->state(fn (Node $node) => $node->scheme === 'https'), + IconColumn::make('public') + ->label(trans('admin/node.table.public')) + ->visibleFrom('lg') + ->trueIcon(TablerIcon::EyeCheck) + ->falseIcon(TablerIcon::EyeCancel), + TextColumn::make('servers_count') + ->visibleFrom('sm') + ->counts('servers') + ->label(trans('admin/node.table.servers')) + ->sortable(), + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + CreateAction::make(), + ]) + ->emptyStateIcon(TablerIcon::Server2) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/node.no_nodes')) + ->filters([ + TagsFilter::make() + ->model(Node::class), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Nodes/RelationManagers/AllocationsRelationManager.php b/app/Filament/Admin/Resources/Nodes/RelationManagers/AllocationsRelationManager.php new file mode 100644 index 0000000000..e08d6eb0f3 --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/RelationManagers/AllocationsRelationManager.php @@ -0,0 +1,147 @@ +recordTitleAttribute('address') + ->checkIfRecordIsSelectableUsing(fn (Allocation $allocation) => $allocation->server_id === null) + ->paginationPageOptions([10, 20, 50, 100, 200, 500]) + ->searchable() + ->heading('') + ->selectCurrentPageOnly() //Prevent people from trying to nuke 30,000 ports at once.... -,- + ->columns([ + TextColumn::make('id') + ->toggleable() + ->toggledHiddenByDefault(), + TextColumn::make('port') + ->searchable() + ->label(trans('admin/node.ports')), + TextColumn::make('server.name') + ->label(trans('admin/node.table.servers')) + ->icon(TablerIcon::BrandDocker) + ->visibleFrom('md') + ->searchable() + ->url(fn (Allocation $allocation): string => $allocation->server ? route('filament.admin.resources.servers.edit', ['record' => $allocation->server]) : ''), + TextInputColumn::make('ip_alias') + ->searchable() + ->label(trans('admin/node.table.alias')), + TextInputColumn::make('notes') + ->label(trans('admin/node.table.allocation_notes')) + ->placeholder(trans('admin/node.table.no_notes')), + SelectColumn::make('ip') + ->options(function (Allocation $allocation) { + $ips = Allocation::where('port', $allocation->port)->pluck('ip'); + + return collect($this->getOwnerRecord()->ipAddresses()) + ->diff($ips) + ->unshift($allocation->ip) + ->unique() + ->mapWithKeys(fn (string $ip) => [$ip => $ip]) + ->all(); + }) + ->selectablePlaceholder(false) + ->searchable() + ->label(trans('admin/node.table.ip')), + ]) + ->toolbarActions([ + DeleteBulkAction::make() + ->authorize(fn () => user()?->can('update', $this->getOwnerRecord())), + Action::make('create new allocation') + ->tooltip(trans('admin/node.create_allocation')) + ->icon(TablerIcon::WorldPlus) + ->schema(fn () => [ + Select::make('allocation_ip') + ->options(fn (Get $get) => collect($this->getOwnerRecord()->ipAddresses()) + ->when($get('allocation_ip'), fn ($ips, $current) => $ips->push($current)) + ->unique() + ->mapWithKeys(fn (string $ip) => [$ip => $ip])) + ->label(trans('admin/node.ip_address')) + ->inlineLabel() + ->ip() + ->helperText(trans('admin/node.ip_help')) + ->afterStateUpdated(fn (Set $set) => $set('allocation_ports', [])) + ->live() + ->hintAction( + Action::make('hint_refresh') + ->hiddenLabel() + ->icon(TablerIcon::Refresh) + ->tooltip(trans('admin/node.refresh')) + ->action(function () { + cache()->forget("nodes.{$this->getOwnerRecord()->id}.ips"); + }) + ) + ->suffixAction( + Action::make('custom_ip') + ->icon(TablerIcon::Keyboard) + ->tooltip(trans('admin/node.custom_ip')) + ->schema([ + TextInput::make('custom_ip') + ->label(trans('admin/node.ip_address')) + ->ip() + ->required(), + ]) + ->action(fn (array $data, Set $set) => $set('allocation_ip', $data['custom_ip'])) + ) + ->required(), + TextInput::make('allocation_alias') + ->label(trans('admin/node.table.alias')) + ->inlineLabel() + ->default(null) + ->helperText(trans('admin/node.alias_help')), + TagsInput::make('allocation_ports') + ->placeholder('27015, 27017-27019') + ->label(trans('admin/node.ports')) + ->inlineLabel() + ->live() + ->disabled(fn (Get $get) => empty($get('allocation_ip'))) + ->afterStateUpdated(fn ($state, Set $set, Get $get) => $set('allocation_ports', CreateServer::retrieveValidPorts($this->getOwnerRecord(), $state, $get('allocation_ip')))) + ->splitKeys(['Tab', ' ', ',']) + ->required(), + ]) + ->action(fn (array $data, AssignmentService $service) => $service->handle($this->getOwnerRecord(), $data)), + UpdateNodeAllocations::make() + ->nodeRecord($this->getOwnerRecord()) + ->authorize(fn () => user()?->can('update', $this->getOwnerRecord())), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Nodes/RelationManagers/ServersRelationManager.php b/app/Filament/Admin/Resources/Nodes/RelationManagers/ServersRelationManager.php new file mode 100644 index 0000000000..e6192cd446 --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/RelationManagers/ServersRelationManager.php @@ -0,0 +1,72 @@ +searchable(false) + ->heading('') + ->columns([ + TextColumn::make('user.username') + ->label(trans('admin/node.table.owner')) + ->url(fn (Server $server): string => route('filament.admin.resources.users.edit', ['record' => $server->user])) + ->searchable(), + TextColumn::make('name') + ->label(trans('admin/node.table.name')) + ->url(fn (Server $server): string => route('filament.admin.resources.servers.edit', ['record' => $server])) + ->searchable() + ->sortable(), + TextColumn::make('egg.name') + ->label(trans('admin/node.table.egg')) + ->url(fn (Server $server): string => route('filament.admin.resources.eggs.edit', ['record' => $server->user])) + ->sortable(), + SelectColumn::make('allocation.id') + ->label(trans('admin/node.primary_allocation')) + ->disabled(fn (Server $server) => $server->allocations->count() <= 1) + ->options(fn (Server $server) => $server->allocations->take(1)->mapWithKeys(fn ($allocation) => [$allocation->id => $allocation->address])) + ->selectablePlaceholder(fn (Server $server) => $server->allocations->count() <= 1) + ->placeholder(trans('admin/server.none')) + ->sortable(), + TextColumn::make('cpu') + ->label(trans('admin/node.cpu')) + ->state(fn (Server $server) => $server->formatResource(ServerResourceType::CPULimit)), + TextColumn::make('memory') + ->label(trans('admin/node.memory')) + ->state(fn (Server $server) => $server->formatResource(ServerResourceType::MemoryLimit)), + TextColumn::make('disk') + ->label(trans('admin/node.disk')) + ->state(fn (Server $server) => $server->formatResource(ServerResourceType::DiskLimit)), + TextColumn::make('databases_count') + ->counts('databases') + ->label(trans('admin/node.databases')) + ->numeric() + ->sortable(), + TextColumn::make('backups_count') + ->counts('backups') + ->label(trans('admin/node.backups')) + ->numeric() + ->sortable(), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Nodes/Widgets/NodeCpuChart.php b/app/Filament/Admin/Resources/Nodes/Widgets/NodeCpuChart.php new file mode 100644 index 0000000000..977af69de7 --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/Widgets/NodeCpuChart.php @@ -0,0 +1,89 @@ + + */ + protected array $cpuHistory = []; + + protected int $threads = 0; + + protected function getData(): array + { + $sessionKey = "node_stats.{$this->node->id}"; + + $data = $this->node->statistics(); + + $this->threads = session("{$sessionKey}.threads", $this->node->systemInformation()['cpu_count'] ?? 0); + + $this->cpuHistory = session("{$sessionKey}.cpu_history", []); + $this->cpuHistory[] = [ + 'cpu' => round($data['cpu_percent'] * $this->threads, 2), + 'timestamp' => now(user()->timezone ?? 'UTC')->format('H:i:s'), + ]; + + $this->cpuHistory = array_slice($this->cpuHistory, -60); + session()->put("{$sessionKey}.cpu_history", $this->cpuHistory); + + return [ + 'datasets' => [ + [ + 'data' => array_column($this->cpuHistory, 'cpu'), + 'backgroundColor' => [ + 'rgba(96, 165, 250, 0.3)', + ], + 'tension' => '0.3', + 'fill' => true, + ], + ], + 'labels' => array_column($this->cpuHistory, 'timestamp'), + 'locale' => user()->language ?? 'en', + ]; + } + + protected function getType(): string + { + return 'line'; + } + + protected function getOptions(): RawJs + { + return RawJs::make(<<<'JS' + { + scales: { + y: { + min: 0, + }, + }, + plugins: { + legend: { + display: false, + } + } + } + JS); + } + + public function getHeading(): string + { + $data = array_slice(end($this->cpuHistory), -60); + + $cpu = format_number($data['cpu'], maxPrecision: 2); + $max = format_number($this->threads * 100); + + return trans('admin/node.cpu_chart', ['cpu' => $cpu, 'max' => $max]); + } +} diff --git a/app/Filament/Admin/Resources/Nodes/Widgets/NodeMemoryChart.php b/app/Filament/Admin/Resources/Nodes/Widgets/NodeMemoryChart.php new file mode 100644 index 0000000000..df4ca0b4f4 --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/Widgets/NodeMemoryChart.php @@ -0,0 +1,96 @@ + + */ + protected array $memoryHistory = []; + + protected int $totalMemory = 0; + + protected function getData(): array + { + $sessionKey = "node_stats.{$this->node->id}"; + + $data = $this->node->statistics(); + + $this->totalMemory = session("{$sessionKey}.total_memory", $data['memory_total']); + + $this->memoryHistory = session("{$sessionKey}.memory_history", []); + $this->memoryHistory[] = [ + 'memory' => round(config('panel.use_binary_prefix') + ? $data['memory_used'] / 1024 / 1024 / 1024 + : $data['memory_used'] / 1000 / 1000 / 1000, 2), + 'timestamp' => now(user()->timezone ?? 'UTC')->format('H:i:s'), + ]; + + $this->memoryHistory = array_slice($this->memoryHistory, -60); + session()->put("{$sessionKey}.memory_history", $this->memoryHistory); + + return [ + 'datasets' => [ + [ + 'data' => array_column($this->memoryHistory, 'memory'), + 'backgroundColor' => [ + 'rgba(96, 165, 250, 0.3)', + ], + 'tension' => '0.3', + 'fill' => true, + ], + ], + 'labels' => array_column($this->memoryHistory, 'timestamp'), + 'locale' => user()->language ?? 'en', + ]; + } + + protected function getType(): string + { + return 'line'; + } + + protected function getOptions(): RawJs + { + return RawJs::make(<<<'JS' + { + scales: { + y: { + min: 0, + }, + }, + plugins: { + legend: { + display: false, + } + } + } + JS); + } + + public function getHeading(): string + { + $latestMemoryUsed = array_slice(end($this->memoryHistory), -60); + + $used = config('panel.use_binary_prefix') + ? format_number($latestMemoryUsed['memory'], maxPrecision: 2) .' GiB' + : format_number($latestMemoryUsed['memory'], maxPrecision: 2) . ' GB'; + + $total = config('panel.use_binary_prefix') + ? format_number($this->totalMemory / 1024 / 1024 / 1024, maxPrecision: 2) .' GiB' + : format_number($this->totalMemory / 1000 / 1000 / 1000, maxPrecision: 2) . ' GB'; + + return trans('admin/node.memory_chart', ['used' => $used, 'total' => $total]); + } +} diff --git a/app/Filament/Admin/Resources/Nodes/Widgets/NodeStorageChart.php b/app/Filament/Admin/Resources/Nodes/Widgets/NodeStorageChart.php new file mode 100644 index 0000000000..da59888c8e --- /dev/null +++ b/app/Filament/Admin/Resources/Nodes/Widgets/NodeStorageChart.php @@ -0,0 +1,79 @@ + [ + 'x' => [ + 'grid' => [ + 'display' => false, + ], + 'ticks' => [ + 'display' => false, + ], + ], + 'y' => [ + 'grid' => [ + 'display' => false, + ], + 'ticks' => [ + 'display' => false, + ], + ], + ], + ]; + + protected function getData(): array + { + $total = config('panel.use_binary_prefix') + ? ($this->node->statistics()['disk_total']) / 1024 / 1024 / 1024 + : ($this->node->statistics()['disk_total']) / 1000 / 1000 / 1000; + $used = config('panel.use_binary_prefix') + ? ($this->node->statistics()['disk_used']) / 1024 / 1024 / 1024 + : ($this->node->statistics()['disk_used']) / 1000 / 1000 / 1000; + + $unused = $total - $used; + + $used = round($used, 2); + $unused = round($unused, 2); + + return [ + 'datasets' => [ + [ + 'data' => [$used, $unused], + 'backgroundColor' => [ + 'rgb(59, 130, 246)', + 'rgb(74, 222, 128)', + 'rgb(255, 205, 86)', + ], + ], + ], + 'labels' => [trans('admin/node.used'), trans('admin/node.unused')], + 'locale' => user()->language ?? 'en', + ]; + } + + protected function getType(): string + { + return 'pie'; + } + + public function getHeading(): string + { + $used = convert_bytes_to_readable($this->node->statistics()['disk_used']); + $total = convert_bytes_to_readable($this->node->statistics()['disk_total']); + + return trans('admin/node.disk_chart', ['used' => $used, 'total' => $total]); + } +} diff --git a/app/Filament/Admin/Resources/Plugins/Pages/ListPlugins.php b/app/Filament/Admin/Resources/Plugins/Pages/ListPlugins.php new file mode 100644 index 0000000000..08d7776aaa --- /dev/null +++ b/app/Filament/Admin/Resources/Plugins/Pages/ListPlugins.php @@ -0,0 +1,43 @@ +updateLoadOrder($order); + } + + public function getTabs(): array + { + $tabs = [ + 'all' => Tab::make('all') + ->label(trans('admin/plugin.all')) + ->badge(Plugin::count()), + ]; + + foreach (PluginCategory::cases() as $category) { + $query = Plugin::whereCategory($category->value); + $tabs[$category->value] = Tab::make($category->value) + ->label($category->getLabel()) + ->icon($category->getIcon()) + ->badge($query->count()) + ->modifyQueryUsing(fn () => $query); + } + + return $tabs; + } +} diff --git a/app/Filament/Admin/Resources/Plugins/PluginResource.php b/app/Filament/Admin/Resources/Plugins/PluginResource.php new file mode 100644 index 0000000000..6076d796d0 --- /dev/null +++ b/app/Filament/Admin/Resources/Plugins/PluginResource.php @@ -0,0 +1,336 @@ +count() ?: null; + } + + public static function table(Table $table): Table + { + return $table + ->openRecordUrlInNewTab() + ->reorderable('load_order') + ->authorizeReorder(fn () => user()?->can('update plugin')) + ->reorderRecordsTriggerAction(fn (Action $action, bool $isReordering) => $action->hiddenLabel()->tooltip($isReordering ? trans('admin/plugin.apply_load_order') : trans('admin/plugin.change_load_order'))) + ->defaultSort('load_order') + ->columns([ + TextColumn::make('name') + ->label(trans('admin/plugin.name')) + ->description(fn (Plugin $plugin) => (strlen($plugin->description) > 80) ? substr($plugin->description, 0, 80).'...' : $plugin->description) + ->icon(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? TablerIcon::VersionsOff : TablerIcon::Versions) + ->iconColor(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? 'danger' : 'success') + ->tooltip(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? trans('admin/plugin.update_available') : null) + ->sortable() + ->searchable(), + TextColumn::make('author') + ->label(trans('admin/plugin.author')) + ->sortable(), + TextColumn::make('version') + ->label(trans('admin/plugin.version')) + ->sortable(), + TextColumn::make('category') + ->label(trans('admin/plugin.category')) + ->badge() + ->sortable() + ->visible(fn ($livewire) => $livewire->activeTab === 'all'), + TextColumn::make('status') + ->label(trans('admin/plugin.status')) + ->badge() + ->tooltip(fn (Plugin $plugin) => $plugin->status_message) + ->sortable(), + ]) + ->recordActions([ + Action::make('exclude_view') + ->label(trans('filament-actions::view.single.label')) + ->icon(fn (Plugin $plugin) => $plugin->getReadme() ? TablerIcon::Eye : TablerIcon::EyeShare) + ->color('gray') + ->visible(fn (Plugin $plugin) => $plugin->getReadme() || $plugin->url) + ->url(fn (Plugin $plugin) => !$plugin->getReadme() ? $plugin->url : null, true) + ->slideOver(true) + ->modalHeading('Readme') + ->modalSubmitAction(fn (Plugin $plugin) => Action::make('exclude_visit_website') + ->label(trans('admin/plugin.visit_website')) + ->visible(!is_null($plugin->url)) + ->url($plugin->url, true) + ) + ->modalCancelActionLabel(trans('filament::components/modal.actions.close.label')) + ->schema(fn (Plugin $plugin) => $plugin->getReadme() ? [ + TextEntry::make('readme') + ->hiddenLabel() + ->markdown() + ->state(fn (Plugin $plugin) => $plugin->getReadme()), + ] : null), + Action::make('exclude_settings') + ->label(trans('admin/plugin.settings')) + ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) + ->icon(TablerIcon::Settings) + ->color('primary') + ->visible(fn (Plugin $plugin) => $plugin->status === PluginStatus::Enabled && $plugin->hasSettings()) + ->schema(fn (Plugin $plugin) => $plugin->getSettingsForm()) + ->action(fn (array $data, Plugin $plugin) => $plugin->saveSettings($data)) + ->slideOver(), + ActionGroup::make([ + Action::make('exclude_install') + ->label(trans('admin/plugin.install')) + ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) + ->icon(TablerIcon::Terminal) + ->color('success') + ->hidden(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled) + ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + try { + $pluginService->installPlugin($plugin, !$plugin->isTheme() || !$pluginService->hasThemePluginEnabled()); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.installed')) + ->send(); + } catch (Exception $exception) { + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.install_error')) + ->body($exception->getMessage()) + ->send(); + } + }), + Action::make('exclude_update') + ->label(trans('admin/plugin.update')) + ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) + ->icon(TablerIcon::Download) + ->color('success') + ->visible(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled && $plugin->isUpdateAvailable()) + ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + try { + $pluginService->updatePlugin($plugin); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.updated')) + ->send(); + } catch (Exception $exception) { + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.update_error')) + ->body($exception->getMessage()) + ->send(); + } + }), + Action::make('exclude_enable') + ->label(trans('admin/plugin.enable')) + ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) + ->icon(TablerIcon::Check) + ->color('success') + ->visible(fn (Plugin $plugin) => $plugin->canEnable()) + ->requiresConfirmation(fn (Plugin $plugin, PluginService $pluginService) => $plugin->isTheme() && $pluginService->hasThemePluginEnabled()) + ->modalHeading(fn (Plugin $plugin, PluginService $pluginService) => $plugin->isTheme() && $pluginService->hasThemePluginEnabled() ? trans('admin/plugin.enable_theme_modal.heading') : null) + ->modalDescription(fn (Plugin $plugin, PluginService $pluginService) => $plugin->isTheme() && $pluginService->hasThemePluginEnabled() ? trans('admin/plugin.enable_theme_modal.description') : null) + ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + $pluginService->enablePlugin($plugin); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.enabled')) + ->send(); + }), + Action::make('exclude_disable') + ->label(trans('admin/plugin.disable')) + ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) + ->icon(TablerIcon::X) + ->color('warning') + ->visible(fn (Plugin $plugin) => $plugin->canDisable()) + ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + $pluginService->disablePlugin($plugin); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.disabled')) + ->send(); + }), + Action::make('exclude_delete') + ->label(trans('filament-actions::delete.single.label')) + ->authorize(fn (Plugin $plugin) => user()?->can('delete', $plugin)) + ->icon(TablerIcon::Trash) + ->color('danger') + ->requiresConfirmation() + ->visible(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled || $plugin->status === PluginStatus::Errored) + ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + $pluginService->deletePlugin($plugin); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.deleted')) + ->send(); + }), + Action::make('exclude_uninstall') + ->label(trans('admin/plugin.uninstall')) + ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) + ->icon(TablerIcon::Terminal) + ->color('danger') + ->requiresConfirmation() + ->hidden(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled || $plugin->status === PluginStatus::Errored) + ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + try { + $pluginService->uninstallPlugin($plugin); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.uninstalled')) + ->send(); + } catch (Exception $exception) { + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.uninstall_error')) + ->body($exception->getMessage()) + ->send(); + } + }), + ]), + ]) + ->headerActions([ + Action::make('import_from_file') + ->hiddenLabel() + ->tooltip(trans('admin/plugin.import_from_file')) + ->authorize(fn () => user()?->can('create', Plugin::class)) + ->icon(TablerIcon::FileDownload) + ->schema([ + // TODO: switch to new file upload + FileUpload::make('file') + ->required() + ->acceptedFileTypes(['application/zip', 'application/zip-compressed', 'application/x-zip-compressed']) + ->preserveFilenames() + ->previewable(false) + ->storeFiles(false), + ]) + ->action(function ($data, $livewire, PluginService $pluginService) { + try { + /** @var UploadedFile $file */ + $file = $data['file']; + + $pluginName = str($file->getClientOriginalName())->before('.zip')->toString(); + + if (Plugin::where('id', $pluginName)->exists()) { + throw new Exception(trans('admin/plugin.notifications.import_exists')); + } + + $pluginService->downloadPluginFromFile($file); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.imported')) + ->send(); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.import_failed')) + ->body($exception->getMessage()) + ->send(); + } + }), + Action::make('import_from_url') + ->hiddenLabel() + ->tooltip(trans('admin/plugin.import_from_url')) + ->authorize(fn () => user()?->can('create', Plugin::class)) + ->icon(TablerIcon::WorldDownload) + ->schema([ + TextInput::make('url') + ->required() + ->url() + ->endsWith('.zip'), + ]) + ->action(function ($data, $livewire, PluginService $pluginService) { + try { + $pluginName = str($data['url'])->before('.zip')->explode('/')->last(); + + if (Plugin::where('id', $pluginName)->exists()) { + throw new Exception(trans('admin/plugin.notifications.import_exists')); + } + + $pluginService->downloadPluginFromUrl($data['url']); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.imported')) + ->send(); + + redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.import_failed')) + ->body($exception->getMessage()) + ->send(); + } + }), + ]) + ->emptyStateIcon(TablerIcon::Packages) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/plugin.no_plugins')); + } + + public static function getPages(): array + { + return [ + 'index' => ListPlugins::route('/'), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Roles/Pages/CreateRole.php b/app/Filament/Admin/Resources/Roles/Pages/CreateRole.php new file mode 100644 index 0000000000..f131d86f24 --- /dev/null +++ b/app/Filament/Admin/Resources/Roles/Pages/CreateRole.php @@ -0,0 +1,74 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + Action::make('create') + ->hiddenLabel() + ->action('create') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->icon(TablerIcon::FilePlus), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function mutateFormDataBeforeCreate(array $data): array + { + $this->permissions = collect($data) + ->filter(function ($permission, $key) { + return !in_array($key, ['name', 'guard_name']); + }) + ->values() + ->flatten() + ->unique(); + + return Arr::only($data, ['name', 'guard_name']); + } + + protected function afterCreate(): void + { + $permissionModels = collect(); + $this->permissions->each(function ($permission) use ($permissionModels) { + $permissionModels->push(Permission::firstOrCreate([ + 'name' => $permission, + 'guard_name' => $this->data['guard_name'], + ])); + }); + + $this->record->syncPermissions($permissionModels); + } +} diff --git a/app/Filament/Admin/Resources/Roles/Pages/EditRole.php b/app/Filament/Admin/Resources/Roles/Pages/EditRole.php new file mode 100644 index 0000000000..9f531ec747 --- /dev/null +++ b/app/Filament/Admin/Resources/Roles/Pages/EditRole.php @@ -0,0 +1,76 @@ +permissions = collect($data) + ->filter(function ($permission, $key) { + return !in_array($key, ['name', 'guard_name']); + }) + ->values() + ->flatten() + ->unique(); + + return Arr::only($data, ['name', 'guard_name']); + } + + protected function afterSave(): void + { + $permissionModels = collect(); + $this->permissions->each(function ($permission) use ($permissionModels) { + $permissionModels->push(Permission::firstOrCreate([ + 'name' => $permission, + 'guard_name' => $this->data['guard_name'], + ])); + }); + + $this->record->syncPermissions($permissionModels); + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make() + ->tooltip(fn (Role $role) => $role->isRootAdmin() ? trans('admin/role.root_admin_delete') : ($role->users_count >= 1 ? trans('admin/role.in_use') : trans('filament-actions::delete.single.label'))) + ->disabled(fn (Role $role) => $role->isRootAdmin() || $role->users_count >= 1), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + protected function getFormActions(): array + { + return []; + } +} diff --git a/app/Filament/Admin/Resources/Roles/Pages/ListRoles.php b/app/Filament/Admin/Resources/Roles/Pages/ListRoles.php new file mode 100644 index 0000000000..c018e68740 --- /dev/null +++ b/app/Filament/Admin/Resources/Roles/Pages/ListRoles.php @@ -0,0 +1,16 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + EditAction::make(), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Roles/RoleResource.php b/app/Filament/Admin/Resources/Roles/RoleResource.php new file mode 100644 index 0000000000..73c07a5357 --- /dev/null +++ b/app/Filament/Admin/Resources/Roles/RoleResource.php @@ -0,0 +1,220 @@ +getCustomization(CustomizationKey::TopNavigation) ? trans('admin/dashboard.advanced') : trans('admin/dashboard.user'); + } + + public static function getNavigationBadge(): ?string + { + return ($count = static::getModel()::count()) > 0 ? (string) $count : null; + } + + /** + * @throws Exception + */ + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('name') + ->label(trans('admin/role.name')) + ->sortable(), + TextColumn::make('permissions_count') + ->label(trans('admin/role.permissions')) + ->badge() + ->counts('permissions') + ->formatStateUsing(fn (Role $role, $state) => $role->isRootAdmin() ? trans('admin/role.all') : $state), + TextColumn::make('nodes.name') + ->label(trans('admin/role.nodes')) + ->badge() + ->placeholder(trans('admin/role.all')), + TextColumn::make('users_count') + ->label(trans('admin/role.users')) + ->counts('users'), + ]) + ->recordActions([ + ViewAction::make() + ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), + EditAction::make(), + ]) + ->toolbarActions([ + CreateAction::make(), + BulkActionGroup::make([ + DeleteBulkAction::make('exclude_bulk_delete'), + ]), + ]) + ->checkIfRecordIsSelectableUsing(fn (Role $role) => !$role->isRootAdmin() && $role->users_count <= 0); + } + + /** + * @throws Exception + */ + public static function defaultForm(Schema $schema): Schema + { + $permissionSections = []; + + foreach (Role::getPermissionList() as $model => $permissions) { + $options = []; + + foreach ($permissions as $permission) { + $options[$permission . ' ' . $model] = Str::headline($permission); + } + + $permissionSections[] = self::makeSection($model, $options); + } + + return $schema + ->columns(1) + ->components([ + TextInput::make('name') + ->label(trans('admin/role.name')) + ->required() + ->disabled(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), + TextInput::make('guard_name') + ->default(Role::DEFAULT_GUARD_NAME) + ->nullable() + ->hidden(), + Fieldset::make(trans('admin/role.permissions')) + ->columns(3) + ->schema($permissionSections) + ->hidden(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), + TextEntry::make('permissions') + ->label(trans('admin/role.permissions')) + ->state(trans('admin/role.root_admin', ['role' => Role::ROOT_ADMIN])) + ->visible(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), + Select::make('nodes') + ->label(trans('admin/role.nodes')) + ->multiple() + ->relationship('nodes', 'name') + ->searchable(['name', 'fqdn']) + ->preload() + ->hint(trans('admin/role.nodes_hint')) + ->hidden(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), + ]); + } + + /** + * @param string[]|int[]|Permission[]|BackedEnum[] $options + * + * @throws Exception + */ + private static function makeSection(string $model, array $options): Section + { + return Section::make(Str::headline($model)) + ->columnSpan(1) + ->collapsible() + ->collapsed() + ->icon(Role::getModelIcon($model)) + ->headerActions([ + Action::make('count') + ->label(fn (Get $get) => count($get(strtolower($model) . '_list'))) + ->badge(), + ]) + ->schema([ + CheckboxList::make(strtolower($model) . '_list') + ->hiddenLabel() + ->options($options) + ->columns() + ->gridDirection('row') + ->bulkToggleable() + ->live() + ->afterStateHydrated( + function (Component $component, string $operation, ?Role $record) use ($options) { + if (in_array($operation, ['edit', 'view'])) { + + if (blank($record)) { + return; + } + + if ($component->isVisible()) { + $component->state( + collect($options) + ->filter(fn ($value, $key) => $record->checkPermissionTo($key)) + ->keys() + ->toArray() + ); + } + } + } + ) + ->dehydrated(fn ($state) => !blank($state)), + ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListRoles::route('/'), + 'create' => CreateRole::route('/create'), + 'view' => ViewRole::route('/{record}'), + 'edit' => EditRole::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Servers/Pages/CreateServer.php b/app/Filament/Admin/Resources/Servers/Pages/CreateServer.php new file mode 100644 index 0000000000..a479358327 --- /dev/null +++ b/app/Filament/Admin/Resources/Servers/Pages/CreateServer.php @@ -0,0 +1,974 @@ +serverCreationService = $serverCreationService; + } + + public function form(Schema $schema): Schema + { + return $schema + ->components([ + Wizard::make($this->getSteps()) + ->columnSpanFull() + ->nextAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowRight)) + ->previousAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowLeft)) + ->submitAction(new HtmlString(Blade::render(<<<'BLADE' + + {{ trans('admin/server.create') }} + + BLADE))), + ]); + } + + /** + * @return Step[] + * + * @throws RandomException + */ + protected function getDefaultSteps(): array + { + return [ + Step::make('Information') + ->label(trans('admin/server.tabs.information')) + ->icon(TablerIcon::InfoCircle) + ->completedIcon(TablerIcon::Check) + ->columns([ + 'default' => 1, + 'sm' => 4, + 'md' => 4, + ]) + ->schema([ + TextInput::make('name') + ->prefixIcon(TablerIcon::Server) + ->label(trans('admin/server.name')) + ->suffixAction(Action::make('hint_random') + ->tooltip('Random') + ->icon('tabler-dice-' . random_int(1, 6)) + ->action(function (Set $set, Get $get) { + $egg = Egg::find($get('egg_id')); + $prefix = $egg ? str($egg->name)->lower()->kebab() . '-' : ''; + + $word = (new RandomWordService())->word(); + + $set('name', $prefix . $word); + })) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + ]) + ->required() + ->maxLength(255), + + TextInput::make('external_id') + ->label(trans('admin/server.external_id')) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + ]) + ->unique() + ->maxLength(255), + + Select::make('node_id') + ->disabledOn('edit') + ->prefixIcon(TablerIcon::Server2) + ->selectablePlaceholder(false) + ->default(function () { + $lastUsedNode = session()->get('last_utilized_node'); + + if ($lastUsedNode && user()?->accessibleNodes()->where('id', $lastUsedNode)->exists()) { + $this->node = Node::find($lastUsedNode); + + return $this->node?->id; + } + + /** @var ?Node $latestNode */ + $latestNode = user()?->accessibleNodes()->latest()->first(); + $this->node = $latestNode; + + return $this->node?->id; + }) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + ]) + ->live() + ->relationship('node', 'name', fn (Builder $query) => $query->whereIn('id', user()?->accessibleNodes()->pluck('id'))) + ->searchable() + ->required() + ->preload() + ->afterStateUpdated(function (Set $set, $state) { + $set('allocation_id', null); + $this->node = Node::find($state); + }), + + Select::make('owner_id') + ->preload() + ->prefixIcon(TablerIcon::User) + ->selectablePlaceholder(false) + ->default(user()?->id) + ->label(trans('admin/server.owner')) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + ]) + ->relationship('user', 'username') + ->searchable(['username', 'email']) + ->getOptionLabelFromRecordUsing(fn (User $user) => "$user->username ($user->email)") + ->createOptionAction(fn (Action $action) => $action->authorize(fn () => user()?->can('create', User::class))) + ->createOptionForm([ + TextInput::make('username') + ->label(trans('admin/user.username')) + ->alphaNum() + ->required() + ->minLength(3) + ->maxLength(255), + + TextInput::make('email') + ->label(trans('admin/user.email')) + ->email() + ->required() + ->unique() + ->maxLength(255), + + TextInput::make('password') + ->label(trans('admin/user.password')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/user.password_help')) + ->password(), + ]) + ->createOptionUsing(function ($data, UserCreationService $service) { + $service->handle($data); + + $this->refreshForm(); + }) + ->required(), + + Select::make('allocation_id') + ->preload() + ->live() + ->prefixIcon(TablerIcon::Network) + ->label(trans('admin/server.primary_allocation')) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + ]) + ->disabled(fn (Get $get) => $get('node_id') === null) + ->searchable(['ip', 'port', 'ip_alias']) + ->afterStateUpdated(function (Set $set) { + $set('allocation_additional', null); + $set('allocation_additional.needstobeastringhere.extra_allocations', null); + }) + ->getOptionLabelFromRecordUsing(fn (Allocation $allocation) => $allocation->address ?? '') + ->placeholder(function (Get $get) { + $node = Node::find($get('node_id')); + + if ($node?->allocations) { + return trans('admin/server.select_allocation'); + } + + return trans('admin/server.new_allocation'); + }) + ->relationship( + 'allocation', + 'ip', + fn (Builder $query, Get $get) => $query + ->where('node_id', $get('node_id')) + ->whereNull('server_id'), + ) + ->createOptionAction(fn (Action $action) => $action->authorize(fn (Get $get) => user()?->can('create', Node::find($get('node_id'))))) + ->createOptionForm(function (Get $get) { + $getPage = $get; + + return [ + Select::make('allocation_ip') + ->options(fn (Get $get) => collect(Node::find($getPage('node_id'))?->ipAddresses()) + ->when($get('allocation_ip'), fn ($ips, $current) => $ips->push($current)) + ->unique() + ->mapWithKeys(fn (string $ip) => [$ip => $ip])) + ->label(trans('admin/server.ip_address'))->inlineLabel() + ->helperText(trans('admin/server.ip_address_helper')) + ->afterStateUpdated(fn (Set $set) => $set('allocation_ports', [])) + ->ip() + ->live() + ->hintAction( + Action::make('hint_refresh') + ->iconButton() + ->icon(TablerIcon::Refresh) + ->tooltip(trans('admin/node.refresh')) + ->action(function () use ($get) { + cache()->forget("nodes.{$get('node_id')}.ips"); + }) + ) + ->suffixAction( + Action::make('custom_ip') + ->icon(TablerIcon::Keyboard) + ->tooltip(trans('admin/node.custom_ip')) + ->schema([ + TextInput::make('custom_ip') + ->label(trans('admin/node.ip_address')) + ->ip() + ->required(), + ]) + ->action(fn (array $data, Set $set) => $set('allocation_ip', $data['custom_ip'])) + ) + ->required(), + TextInput::make('allocation_alias') + ->label(trans('admin/server.alias'))->inlineLabel() + ->default(null) + ->datalist([ + $get('name'), + Egg::find($get('egg_id'))?->name, + ]) + ->helperText(trans('admin/server.alias_helper')), + TagsInput::make('allocation_ports') + ->label(trans('admin/server.port'))->inlineLabel() + ->placeholder('27015, 27017-27019') + ->live() + ->disabled(fn (Get $get) => empty($get('allocation_ip'))) + ->afterStateUpdated(fn ($state, Set $set, Get $get) => $set('allocation_ports', + CreateServer::retrieveValidPorts(Node::find($getPage('node_id')), $state, $get('allocation_ip'))) + ) + ->splitKeys(['Tab', ' ', ',']) + ->required(), + ]; + }) + ->createOptionUsing(function (array $data, Get $get, AssignmentService $assignmentService): int { + return collect( + $assignmentService->handle(Node::find($get('node_id')), $data) + )->first(); + }), + Repeater::make('allocation_additional') + ->label(trans('admin/server.additional_allocations')) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + ]) + ->addActionLabel('Add Allocation') + ->disabled(fn (Get $get) => $get('allocation_id') === null) + // ->addable() TODO disable when all allocations are taken + // ->addable() TODO disable until first additional allocation is selected + ->simple( + Select::make('extra_allocations') + ->live() + ->preload() + ->disableOptionsWhenSelectedInSiblingRepeaterItems() + ->prefixIcon(TablerIcon::Network) + ->label(trans('admin/server.additional_allocations')) + ->columnSpan(2) + ->disabled(fn (Get $get) => $get('../../allocation_id') === null || $get('../../node_id') === null) + ->searchable(['ip', 'port', 'ip_alias']) + ->getOptionLabelFromRecordUsing(fn (Allocation $allocation) => $allocation->address) + ->placeholder(trans('admin/server.select_additional')) + ->disableOptionsWhenSelectedInSiblingRepeaterItems() + ->relationship( + 'allocations', + 'ip', + fn (Builder $query, Get $get, Select $component, $state) => $query + ->where('node_id', $get('../../node_id')) + ->whereNot('id', $get('../../allocation_id')) + ->whereNull('server_id'), + ), + ), + + Textarea::make('description') + ->label(trans('admin/server.description')) + ->rows(3) + ->columnSpan([ + 'default' => 1, + 'sm' => 4, + 'md' => 4, + ]), + ]), + + Step::make(trans('admin/server.tabs.egg_configuration')) + ->icon(TablerIcon::Egg) + ->completedIcon(TablerIcon::Check) + ->columns([ + 'default' => 1, + 'sm' => 4, + 'md' => 4, + 'lg' => 6, + ]) + ->schema([ + Select::make('egg_id') + ->label(trans('admin/server.name')) + ->prefixIcon(TablerIcon::Egg) + ->relationship('egg', 'name') + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + 'lg' => 4, + ]) + ->searchable() + ->preload() + ->live() + ->afterStateUpdated(function ($state, Set $set, Get $get, $old) { + $egg = Egg::query()->find($state); + $set('startup', ''); + $set('image', ''); + + $variables = $egg->variables ?? []; + $serverVariables = collect(); + foreach ($variables as $variable) { + $serverVariables->add($variable->toArray()); + } + + $variables = []; + $set($path = 'server_variables', $serverVariables->sortBy(['sort'])->all()); + for ($i = 0; $i < $serverVariables->count(); $i++) { + $set("$path.$i.variable_value", $serverVariables[$i]['default_value']); + $set("$path.$i.variable_id", $serverVariables[$i]['id']); + $variables[$serverVariables[$i]['env_variable']] = $serverVariables[$i]['default_value']; + } + + $set('environment', $variables); + + $previousEgg = Egg::query()->find($old); + if (!$get('name') || $previousEgg?->getKebabName() === $get('name')) { + $set('name', $egg->getKebabName()); + } + }) + ->required(), + + ToggleButtons::make('skip_scripts') + ->label(trans('admin/server.install_script')) + ->default(false) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]) + ->options([ + false => trans('admin/server.yes'), + true => trans('admin/server.skip'), + ]) + ->colors([ + false => 'primary', + true => 'danger', + ]) + ->icons([ + false => TablerIcon::Code, + true => TablerIcon::CodeOff, + ]) + ->inline() + ->required(), + + ToggleButtons::make('start_on_completion') + ->label(trans('admin/server.start_after')) + ->default(true) + ->required() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]) + ->options([ + true => trans('admin/server.yes'), + false => trans('admin/server.no'), + ]) + ->colors([ + true => 'primary', + false => 'danger', + ]) + ->icons([ + true => TablerIcon::Code, + false => TablerIcon::CodeOff, + ]) + ->inline(), + + Select::make('select_startup') + ->label(trans('admin/server.startup_cmd')) + ->hidden(fn (Get $get) => $get('egg_id') === null) + ->required() + ->live() + ->afterStateUpdated(fn (Set $set, $state) => $set('startup', $state)) + ->options(function ($state, Get $get, Set $set) { + $egg = Egg::query()->find($get('egg_id')); + $startups = $egg->startup_commands ?? []; + + $currentStartup = $get('startup'); + if (!$currentStartup && $startups) { + $currentStartup = collect($startups)->first(); + $set('startup', $currentStartup); + $set('select_startup', $currentStartup); + } + + return array_flip($startups) + ['custom' => 'Custom Startup']; + }) + ->selectablePlaceholder(false) + ->columnSpanFull(), + + Textarea::make('startup') + ->hiddenLabel() + ->hidden(fn (Get $get) => $get('egg_id') === null) + ->required() + ->live() + ->autosize() + ->afterStateUpdated(function ($state, Get $get, Set $set) { + $egg = Egg::query()->find($get('egg_id')); + $startups = $egg->startup_commands ?? []; + + if (in_array($state, $startups)) { + $set('select_startup', $state); + } else { + $set('select_startup', 'custom'); + } + }) + ->placeholder(trans('admin/server.startup_placeholder')) + ->columnSpanFull(), + + Hidden::make('environment')->default([]), + + Section::make(trans('admin/server.variables')) + ->icon(TablerIcon::Eggs) + ->iconColor('primary') + ->hidden(fn (Get $get) => $get('egg_id') === null) + ->collapsible() + ->columnSpanFull() + ->schema([ + TextEntry::make(trans('admin/server.select_egg')) + ->hidden(fn (Get $get) => $get('egg_id')), + TextEntry::make(trans('admin/server.no_variables')) + ->hidden(fn (Get $get) => !$get('egg_id') || + Egg::query()->find($get('egg_id'))?->variables()?->count() + ), + Repeater::make('server_variables') + ->hiddenLabel() + ->relationship('serverVariables', fn (Builder $query) => $query->orderByPowerJoins('variable.sort')) + ->saveRelationshipsBeforeChildrenUsing(null) + ->saveRelationshipsUsing(null) + ->grid(2) + ->reorderable(false) + ->addable(false) + ->deletable(false) + ->default([]) + ->hidden(fn ($state) => empty($state)) + ->schema([ + StartupVariable::make('variable_value') + ->fromForm() + ->disabled(false) + ->afterStateUpdated(function (Set $set, Get $get, $state) { + $environment = $get($envPath = '../../environment'); + $environment[$get('env_variable')] = $state; + $set($envPath, $environment); + }), + ]) + ->columnSpan(2), + ]), + ]), + Step::make(trans('admin/server.tabs.environment_configuration')) + ->icon(TablerIcon::BrandDocker) + ->completedIcon(TablerIcon::Check) + ->schema([ + Fieldset::make(trans('admin/server.resource_limits')) + ->columnSpan(6) + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_cpu') + ->dehydrated() + ->label(trans('admin/server.cpu'))->inlineLabel()->inline() + ->default(true) + ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) + ->live() + ->options([ + true => trans('admin/server.unlimited'), + false => trans('admin/server.limited'), + ]) + ->colors([ + true => 'primary', + false => 'warning', + ]) + ->columnSpan(2), + + TextInput::make('cpu') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_cpu')) + ->label(trans('admin/server.cpu_limit'))->inlineLabel() + ->suffix('%') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.cpu_helper')) + ->default(0) + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + ]), + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_mem') + ->dehydrated() + ->label(trans('admin/server.memory'))->inlineLabel()->inline() + ->default(true) + ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) + ->live() + ->options([ + true => trans('admin/server.unlimited'), + false => trans('admin/server.limited'), + ]) + ->colors([ + true => 'primary', + false => 'warning', + ]) + ->columnSpan(2), + + TextInput::make('memory') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_mem')) + ->label(trans('admin/server.memory_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.memory_helper')) + ->default(0) + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + ]), + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_disk') + ->dehydrated() + ->label(trans('admin/server.disk'))->inlineLabel()->inline() + ->default(true) + ->live() + ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) + ->options([ + true => trans('admin/server.unlimited'), + false => trans('admin/server.limited'), + ]) + ->colors([ + true => 'primary', + false => 'warning', + ]) + ->columnSpan(2), + + TextInput::make('disk') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_disk')) + ->label(trans('admin/server.disk_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->default(0) + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + ]), + + ]), + + Fieldset::make(trans('admin/server.advanced_limits')) + ->columnSpan(6) + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + Hidden::make('io') + ->helperText('The IO performance relative to other running containers') + ->label('Block IO Proportion') + ->default(500), + + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('cpu_pinning') + ->label(trans('admin/server.cpu_pin'))->inlineLabel()->inline() + ->default(false) + ->afterStateUpdated(fn (Set $set) => $set('threads', [])) + ->live() + ->options([ + false => trans('admin/server.disabled'), + true => trans('admin/server.enabled'), + ]) + ->colors([ + false => 'success', + true => 'warning', + ]) + ->columnSpan(2), + + TagsInput::make('threads') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => !$get('cpu_pinning')) + ->label(trans('admin/server.threads'))->inlineLabel() + ->required(fn (Get $get) => $get('cpu_pinning')) + ->columnSpan(2) + ->separator() + ->splitKeys([',']) + ->placeholder(trans('admin/server.pin_help')), + ]), + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('swap_support') + ->live() + ->label(trans('admin/server.swap')) + ->inlineLabel() + ->inline() + ->columnSpan(2) + ->default('disabled') + ->afterStateUpdated(function ($state, Set $set) { + $value = match ($state) { + 'unlimited' => -1, + 'disabled' => 0, + 'limited' => 128, + default => throw new LogicException('Invalid state'), + }; + + $set('swap', $value); + }) + ->options([ + 'unlimited' => trans('admin/server.unlimited'), + 'limited' => trans('admin/server.limited'), + 'disabled' => trans('admin/server.disabled'), + ]) + ->colors([ + 'unlimited' => 'primary', + 'limited' => 'warning', + 'disabled' => 'danger', + ]), + + TextInput::make('swap') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => match ($get('swap_support')) { + 'disabled', 'unlimited' => true, + default => false, + }) + ->label(trans('admin/server.swap_limit')) + ->default(0) + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->minValue(-1) + ->columnSpan(2) + ->inlineLabel() + ->required() + ->integer(), + ]), + + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('oom_killer') + ->label(trans('admin/server.oom')) + ->inlineLabel()->inline() + ->default(false) + ->columnSpan(2) + ->options([ + false => trans('admin/server.disabled'), + true => trans('admin/server.enabled'), + ]) + ->colors([ + false => 'success', + true => 'danger', + ]), + ]), + ]), + + Fieldset::make(trans('admin/server.feature_limits')) + ->inlineLabel() + ->columnSpan(6) + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + TextInput::make('allocation_limit') + ->label(trans('admin/server.allocations')) + ->suffixIcon(TablerIcon::Network) + ->required() + ->numeric() + ->minValue(0) + ->default(0), + TextInput::make('database_limit') + ->label(trans('admin/server.databases')) + ->suffixIcon(TablerIcon::Database) + ->required() + ->numeric() + ->minValue(0) + ->default(0), + TextInput::make('backup_limit') + ->label(trans('admin/server.backups')) + ->suffixIcon(TablerIcon::CopyCheck) + ->required() + ->numeric() + ->minValue(0) + ->default(0), + ]), + Fieldset::make(trans('admin/server.docker_settings')) + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 4, + ]) + ->columnSpan(6) + ->schema(fn (Get $get) => [ + Select::make('select_image') + ->label(trans('admin/server.image_name')) + ->live() + ->afterStateUpdated(fn (Set $set, $state) => $set('image', $state)) + ->options(function ($state, Get $get, Set $set) { + $egg = Egg::query()->find($get('egg_id')); + $images = $egg->docker_images ?? []; + + $currentImage = $get('image'); + if (!$currentImage && $images) { + $defaultImage = collect($images)->first(); + $set('image', $defaultImage); + $set('select_image', $defaultImage); + } + + return array_flip($images) + ['ghcr.io/custom-image' => 'Custom Image']; + }) + ->selectablePlaceholder(false) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 2, + ]), + + TextInput::make('image') + ->label(trans('admin/server.image')) + ->required() + ->afterStateUpdated(function ($state, Get $get, Set $set) { + $egg = Egg::query()->find($get('egg_id')); + $images = $egg->docker_images ?? []; + + if (in_array($state, $images)) { + $set('select_image', $state); + } else { + $set('select_image', 'ghcr.io/custom-image'); + } + }) + ->placeholder(trans('admin/server.image_placeholder')) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 2, + ]), + + KeyValue::make('docker_labels') + ->live() + ->label(trans('admin/server.container_labels')) + ->keyLabel(trans('admin/server.title')) + ->valueLabel(trans('admin/server.description')) + ->columnSpanFull(), + + ServerResource::getMountCheckboxList($get), + ]), + ]), + ]; + } + + public function refreshForm(): void + { + $this->fillForm(); + } + + protected function getFormActions(): array + { + return []; + } + + protected function handleRecordCreation(array $data): Model + { + if ($allocation_additional = array_get($data, 'allocation_additional')) { + $data['allocation_additional'] = collect($allocation_additional)->filter()->all(); + } + + session()->put('last_utilized_node', $data['node_id']); + + try { + return $this->serverCreationService->handle($data); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/server.notifications.create_failed')) + ->body($exception->getMessage()) + ->color('danger') + ->danger() + ->send(); + + throw new Halt(); + } + } + + /** + * @param string[] $portEntries + * @return array + */ + public static function retrieveValidPorts(Node $node, array $portEntries, string $ip): array + { + $portRangeLimit = AssignmentService::PORT_RANGE_LIMIT; + $portFloor = AssignmentService::PORT_FLOOR; + $portCeil = AssignmentService::PORT_CEIL; + + $ports = collect(); + + $existingPorts = $node + ->allocations() + ->where('ip', $ip) + ->pluck('port') + ->all(); + + foreach ($portEntries as $portEntry) { + $start = $end = $portEntry; + if (str_contains($portEntry, '-')) { + [$start, $end] = explode('-', $portEntry); + } + + if (!is_numeric($start) || !is_numeric($end)) { + Notification::make() + ->title(trans('admin/server.notifications.invalid_port_range')) + ->danger() + ->body(trans('admin/server.notifications.invalid_port_range_body', ['port' => $portEntry])) + ->send(); + + continue; + } + + $start = (int) $start; + $end = (int) $end; + $range = $start <= $end ? range($start, $end) : range($end, $start); + + if (count($range) > $portRangeLimit) { + Notification::make() + ->title(trans('admin/server.notifications.too_many_ports')) + ->danger() + ->body(trans('admin/server.notifications.too_many_ports_body', ['limit' => $portRangeLimit])) + ->send(); + + continue; + } + + foreach ($range as $i) { + // Invalid port number + if ($i <= $portFloor || $i > $portCeil) { + Notification::make() + ->title(trans('admin/server.notifications.invalid_port')) + ->danger() + ->body(trans('admin/server.notifications.invalid_port_body', ['i' => $i, 'portFloor' => $portFloor, 'portCeil' => $portCeil])) + ->send(); + + continue; + } + + // Already exists + if (in_array($i, $existingPorts)) { + Notification::make() + ->title(trans('admin/server.notifications.already_exists')) + ->danger() + ->body(trans('admin/server.notifications.already_exists_body', ['i' => $i])) + ->send(); + + continue; + } + + $ports->push($i); + } + } + + $uniquePorts = $ports->unique()->values(); + if ($ports->count() > $uniquePorts->count()) { + $ports = $uniquePorts; + } + + $sortedPorts = $ports->sort()->values(); + if ($sortedPorts->all() !== $ports->all()) { + $ports = $sortedPorts; + } + + return $ports->all(); + } +} diff --git a/app/Filament/Admin/Resources/Servers/Pages/EditServer.php b/app/Filament/Admin/Resources/Servers/Pages/EditServer.php new file mode 100644 index 0000000000..3a5b6bad9d --- /dev/null +++ b/app/Filament/Admin/Resources/Servers/Pages/EditServer.php @@ -0,0 +1,1238 @@ +daemonServerRepository = $daemonServerRepository; + } + + public function form(Schema $schema): Schema + { + return $schema + ->components([ + Tabs::make('Tabs') + ->persistTabInQueryString() + ->columns([ + 'default' => 2, + 'sm' => 2, + 'md' => 4, + 'lg' => 6, + ]) + ->columnSpanFull() + ->tabs($this->getTabs()), + ]); + } + + /** + * @return Tab[] + * + * @throws RandomException + */ + protected function getDefaultTabs(): array + { + return [ + Tab::make('information') + ->label(trans('admin/server.tabs.information')) + ->icon(TablerIcon::InfoCircle) + ->schema([ + Grid::make() + ->columns(2) + ->columnStart(1) + ->schema([ + Image::make('', 'icon') + ->hidden(fn ($record) => !$record->icon && !$record->egg->image) + ->url(fn ($record) => $record->icon ?: $record->egg->image) + ->tooltip(fn ($record) => $record->icon ? '' : trans('server/setting.server_info.icon.tooltip')) + ->columnSpan(2) + ->alignJustify(), + Action::make('uploadIcon') + ->hiddenLabel() + ->icon(TablerIcon::PhotoUp) + ->tooltip(trans('admin/server.import_image')) + ->modal() + ->modalSubmitActionLabel(trans('server/setting.server_info.icon.upload')) + ->schema([ + Tabs::make() + ->contained(false) + ->tabs([ + Tab::make(trans('admin/egg.import.url')) + ->schema([ + Hidden::make('imageUrl'), + Hidden::make('imageExtension'), + TextInput::make('image_url') + ->label(trans('admin/egg.import.image_url')) + ->reactive() + ->autocomplete(false) + ->debounce(500) + ->afterStateUpdated(function ($state, Set $set) { + if (!$state) { + $set('image_url_error', null); + $set('imageUrl', null); + $set('imageExtension', null); + + return; + } + + try { + if (!in_array(parse_url($state, PHP_URL_SCHEME), ['http', 'https'], true)) { + throw new \Exception(trans('admin/egg.import.invalid_url')); + } + + if (!filter_var($state, FILTER_VALIDATE_URL)) { + throw new \Exception(trans('admin/egg.import.invalid_url')); + } + + $extension = strtolower(pathinfo(parse_url($state, PHP_URL_PATH), PATHINFO_EXTENSION)); + + if (!array_key_exists($extension, Server::IMAGE_FORMATS)) { + throw new \Exception(trans('admin/egg.import.unsupported_format', ['format' => implode(', ', array_keys(Server::IMAGE_FORMATS))])); + } + + $host = parse_url($state, PHP_URL_HOST); + $ip = gethostbyname($host); + + if ( + filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false + ) { + throw new \Exception(trans('admin/egg.import.no_local_ip')); + } + + $set('imageUrl', $state); + $set('imageExtension', $extension); + $set('image_url_error', null); + + } catch (\Exception $e) { + $set('image_url_error', $e->getMessage()); + $set('imageUrl', null); + $set('imageExtension', null); + } + }), + TextEntry::make('image_url_error') + ->hiddenLabel() + ->visible(fn (Get $get) => $get('image_url_error') !== null) + ->afterStateHydrated(fn (Get $get) => $get('image_url_error')), + Image::make(fn (Get $get) => $get('image_url'), '') + ->imageSize(150) + ->visible(fn (Get $get) => $get('image_url') && !$get('image_url_error')) + ->alignCenter(), + ]), + Tab::make(trans('admin/egg.import.file')) + ->schema([ + FileUpload::make('image') + ->hiddenLabel() + ->previewable() + ->openable(false) + ->downloadable(false) + ->maxSize(256) + ->maxFiles(1) + ->columnSpanFull() + ->alignCenter() + ->imageEditor() + ->image() + ->disk('public') + ->directory(Server::ICON_STORAGE_PATH) + ->acceptedFileTypes([ + 'image/png', + 'image/jpeg', + 'image/webp', + 'image/svg+xml', + ]) + ->getUploadedFileNameForStorageUsing(function (TemporaryUploadedFile $file, $record) { + return $record->uuid . '.' . $file->getClientOriginalExtension(); + }), + ]), + ]), + ]) + ->action(function (array $data, $record): void { + if (!empty($data['imageUrl']) && !empty($data['imageExtension'])) { + $this->saveIconFromUrl($data['imageUrl'], $data['imageExtension'], $record); + Notification::make() + ->title(trans('server/setting.server_info.icon.updated')) + ->success() + ->send(); + + return; + } + + if (!empty($data['image'])) { + Notification::make() + ->title(trans('server/setting.server_info.icon.updated')) + ->success() + ->send(); + + return; + } + + if (empty($data['imageUrl']) && empty($data['image'])) { + Notification::make() + ->title(trans('admin/egg.import.no_image')) + ->warning() + ->send(); + } + }), + DeleteServerIcon::make(), + ]), + Grid::make() + ->columns(3) + ->columnStart(2) + ->columnSpan([ + 'default' => 2, + 'sm' => 2, + 'md' => 3, + 'lg' => 5, + ]) + ->schema([ + TextInput::make('name') + ->prefixIcon(TablerIcon::Server) + ->label(trans('admin/server.name')) + ->suffixAction(Action::make('hint_random') + ->tooltip('Random') + ->icon('tabler-dice-' . random_int(1, 6)) + ->action(function (Set $set, Get $get) { + $egg = Egg::find($get('egg_id')); + $prefix = $egg ? str($egg->name)->lower()->kebab() . '-' : ''; + + $word = (new RandomWordService())->word(); + + $set('name', $prefix . $word); + })) + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]) + ->required() + ->maxLength(255), + Select::make('owner_id') + ->prefixIcon(TablerIcon::User) + ->label(trans('admin/server.owner')) + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 2, + 'lg' => 2, + ]) + ->relationship('user', 'username') + ->searchable(['username', 'email']) + ->getOptionLabelFromRecordUsing(fn (User $user) => "$user->username ($user->email)") + ->preload() + ->required(), + ToggleButtons::make('condition') + ->label(trans('admin/server.server_status')) + ->formatStateUsing(fn (Server $server) => $server->condition) + ->options(fn ($state) => [$state->value => $state->getLabel()]) + ->colors(fn ($state) => [$state->value => $state->getColor()]) + ->icons(fn ($state) => [$state->value => $state->getIcon()]) + ->stateCast(new ServerConditionStateCast()) + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]) + ->hintAction( + Action::make('view_install_log') + ->label(trans('admin/server.view_install_log')) + //->visible(fn (Server $server) => $server->isFailedInstall()) + ->modalHeading('') + ->modalSubmitAction(false) + ->modalFooterActionsAlignment(Alignment::Right) + ->modalCancelActionLabel(trans('filament::components/modal.actions.close.label')) + ->schema([ + MonacoEditor::make('logs') + ->hiddenLabel() + ->formatStateUsing(function (Server $server, DaemonServerRepository $serverRepository) { + try { + $logs = $serverRepository->setServer($server)->getInstallLogs(); + + return mb_convert_encoding($logs, 'UTF-8', ['UTF-8', 'UTF-16', 'ISO-8859-1', 'ASCII']); + } catch (ConnectionException) { + Notification::make() + ->title(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) + ->body(trans('admin/server.notifications.log_failed')) + ->color('warning') + ->warning() + ->send(); + } catch (Exception) { + return ''; + } + + return ''; + }), + ]) + ), + ]), + Textarea::make('description') + ->label(trans('admin/server.description')) + ->columnSpanFull(), + TextInput::make('uuid') + ->label(trans('admin/server.uuid')) + ->copyable() + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]) + ->readOnly() + ->dehydrated(false), + TextInput::make('uuid_short') + ->label(trans('admin/server.short_uuid')) + ->copyable() + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]) + ->readOnly() + ->dehydrated(false), + TextInput::make('external_id') + ->label(trans('admin/server.external_id')) + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]) + ->unique() + ->maxLength(255), + Select::make('node_id') + ->label(trans('admin/server.node')) + ->relationship('node', 'name', fn (Builder $query) => $query->whereIn('id', user()?->accessibleNodes()->pluck('id'))) + ->columnSpan([ + 'default' => 2, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]) + ->disabled(), + ]), + Tab::make('environment_configuration') + ->label(trans('admin/server.tabs.environment_configuration')) + ->icon(TablerIcon::BrandDocker) + ->schema([ + Fieldset::make(trans('admin/server.resource_limits')) + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_cpu') + ->dehydrated() + ->label(trans('admin/server.cpu'))->inlineLabel()->inline() + ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) + ->formatStateUsing(fn (Get $get) => $get('cpu') == 0) + ->live() + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/server.unlimited'), + 0 => trans('admin/server.limited'), + ]) + ->colors([ + 1 => 'primary', + 0 => 'warning', + ]) + ->columnSpan(2), + + TextInput::make('cpu') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_cpu')) + ->label(trans('admin/server.cpu_limit'))->inlineLabel() + ->suffix('%') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.cpu_helper')) + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + ]), + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_mem') + ->dehydrated() + ->label(trans('admin/server.memory'))->inlineLabel()->inline() + ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) + ->formatStateUsing(fn (Get $get) => $get('memory') == 0) + ->live() + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/server.unlimited'), + 0 => trans('admin/server.limited'), + ]) + ->colors([ + 1 => 'primary', + 0 => 'warning', + ]) + ->columnSpan(2), + + TextInput::make('memory') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_mem')) + ->label(trans('admin/server.memory_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.memory_helper')) + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + ]), + + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('unlimited_disk') + ->dehydrated() + ->label(trans('admin/server.disk'))->inlineLabel()->inline() + ->live() + ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) + ->formatStateUsing(fn (Get $get) => $get('disk') == 0) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 1 => trans('admin/server.unlimited'), + 0 => trans('admin/server.limited'), + ]) + ->colors([ + 1 => 'primary', + 0 => 'warning', + ]) + ->columnSpan(2), + + TextInput::make('disk') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => $get('unlimited_disk')) + ->label(trans('admin/server.disk_limit'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->required() + ->columnSpan(2) + ->numeric() + ->minValue(0), + ]), + ]), + + Fieldset::make(trans('admin/server.advanced_limits')) + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('cpu_pinning') + ->label(trans('admin/server.cpu_pin'))->inlineLabel()->inline() + ->default(0) + ->afterStateUpdated(fn (Set $set) => $set('threads', [])) + ->formatStateUsing(fn (Get $get) => !empty($get('threads'))) + ->live() + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 0 => trans('admin/server.disabled'), + 1 => trans('admin/server.enabled'), + ]) + ->colors([ + 0 => 'success', + 1 => 'warning', + ]) + ->columnSpan(2), + + TagsInput::make('threads') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => !$get('cpu_pinning')) + ->label(trans('admin/server.threads'))->inlineLabel() + ->required(fn (Get $get) => $get('cpu_pinning')) + ->columnSpan(2) + ->separator() + ->splitKeys([',']) + ->placeholder(trans('admin/server.pin_help')), + ]), + ToggleButtons::make('swap_support') + ->live() + ->label(trans('admin/server.swap'))->inlineLabel()->inline() + ->columnSpan(2) + ->afterStateUpdated(function ($state, Set $set) { + $value = match ($state) { + 'unlimited' => -1, + 'disabled' => 0, + 'limited' => 128, + default => throw new LogicException('Invalid state') + }; + + $set('swap', $value); + }) + ->formatStateUsing(function (Get $get) { + return match (true) { + $get('swap') > 0 => 'limited', + $get('swap') == 0 => 'disabled', + $get('swap') < 0 => 'unlimited', + default => throw new LogicException('Invalid state') + }; + }) + ->options([ + 'unlimited' => trans('admin/server.unlimited'), + 'limited' => trans('admin/server.limited'), + 'disabled' => trans('admin/server.disabled'), + ]) + ->colors([ + 'unlimited' => 'primary', + 'limited' => 'warning', + 'disabled' => 'danger', + ]), + + TextInput::make('swap') + ->dehydratedWhenHidden() + ->hidden(fn (Get $get) => match ($get('swap_support')) { + 'disabled', 'unlimited', true => true, + default => false, + }) + ->label(trans('admin/server.swap'))->inlineLabel() + ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') + ->minValue(-1) + ->columnSpan(2) + ->required() + ->integer(), + ]), + + Hidden::make('io') + ->helperText('The IO performance relative to other running containers') + ->label('Block IO Proportion'), + + Grid::make() + ->columns(4) + ->columnSpanFull() + ->schema([ + ToggleButtons::make('oom_killer') + ->dehydrated() + ->label(trans('admin/server.oom')) + ->formatStateUsing(fn ($state) => $state) + ->inlineLabel() + ->inline() + ->columnSpan(2) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 0 => trans('admin/server.disabled'), + 1 => trans('admin/server.enabled'), + ]) + ->colors([ + 0 => 'success', + 1 => 'danger', + ]), + ]), + ]), + + Fieldset::make(trans('admin/server.feature_limits')) + ->inlineLabel() + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + TextInput::make('allocation_limit') + ->label(trans('admin/server.allocations')) + ->suffixIcon(TablerIcon::Network) + ->required() + ->minValue(0) + ->numeric(), + TextInput::make('database_limit') + ->label(trans('admin/server.databases')) + ->suffixIcon(TablerIcon::Database) + ->required() + ->minValue(0) + ->numeric(), + TextInput::make('backup_limit') + ->label(trans('admin/server.backups')) + ->suffixIcon(TablerIcon::CopyCheck) + ->required() + ->minValue(0) + ->numeric(), + ]), + Fieldset::make(trans('admin/server.docker_settings')) + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 4, + ]) + ->schema([ + Select::make('select_image') + ->label(trans('admin/server.image_name')) + ->live() + ->afterStateUpdated(fn (Set $set, $state) => $set('image', $state)) + ->options(function ($state, Get $get, Set $set) { + $egg = Egg::query()->find($get('egg_id')); + $images = $egg->docker_images ?? []; + + $currentImage = $get('image'); + if (!$currentImage && $images) { + $defaultImage = collect($images)->first(); + $set('image', $defaultImage); + $set('select_image', $defaultImage); + } + + return array_flip($images) + ['ghcr.io/custom-image' => 'Custom Image']; + }) + ->selectablePlaceholder(false) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 2, + ]), + + TextInput::make('image') + ->label(trans('admin/server.image')) + ->required() + ->afterStateUpdated(function ($state, Get $get, Set $set) { + $egg = Egg::query()->find($get('egg_id')); + $images = $egg->docker_images ?? []; + + if (in_array($state, $images)) { + $set('select_image', $state); + } else { + $set('select_image', 'ghcr.io/custom-image'); + } + }) + ->placeholder(trans('admin/server.image_placeholder')) + ->columnSpan([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 2, + ]), + + KeyValue::make('docker_labels') + ->live() + ->label(trans('admin/server.container_labels')) + ->keyLabel(trans('admin/server.title')) + ->valueLabel(trans('admin/server.description')) + ->columnSpanFull(), + ]), + ]), + Tab::make('egg') + ->label(trans('admin/server.egg')) + ->icon(TablerIcon::Egg) + ->columns([ + 'default' => 1, + 'sm' => 3, + 'md' => 3, + 'lg' => 5, + ]) + ->schema([ + Select::make('egg_id') + ->disabled() + ->prefixIcon(TablerIcon::Egg) + ->columnSpan([ + 'default' => 6, + 'sm' => 3, + 'md' => 3, + 'lg' => 4, + ]) + ->relationship('egg', 'name') + ->label(trans('admin/server.name')) + ->searchable() + ->preload() + ->required() + ->hintAction( + Action::make('hint_change_egg') + ->label(trans('admin/server.change_egg')) + ->action(function (array $data, Server $server, EggChangerService $service) { + $service->handle($server, $data['egg_id'], $data['keep_old_variables']); + + // Use redirect instead of fillForm to prevent server variables from duplicating + $this->redirect($this->getUrl(['record' => $server, 'tab' => 'egg::data::tab']), true); + }) + ->schema(fn (Server $server) => [ + Select::make('egg_id') + ->label(trans('admin/server.new_egg')) + ->prefixIcon(TablerIcon::Egg) + ->options(fn () => Egg::all()->filter(fn (Egg $egg) => $egg->id !== $server->egg->id)->mapWithKeys(fn (Egg $egg) => [$egg->id => $egg->name])) + ->searchable() + ->preload() + ->required(), + Toggle::make('keep_old_variables') + ->label(trans('admin/server.keep_old_variables')) + ->default(true), + ]) + ), + + ToggleButtons::make('skip_scripts') + ->label(trans('admin/server.install_script')) + ->inline() + ->columnSpan([ + 'default' => 6, + 'sm' => 1, + 'md' => 1, + 'lg' => 2, + ]) + ->stateCast(new BooleanStateCast(false, true)) + ->options([ + 0 => trans('admin/server.yes'), + 1 => trans('admin/server.skip'), + ]) + ->colors([ + 0 => 'primary', + 1 => 'danger', + ]) + ->icons([ + 0 => TablerIcon::Code, + 1 => TablerIcon::CodeOff, + ]) + ->required(), + + Hidden::make('previewing') + ->default(false), + + Select::make('select_startup') + ->label(trans('admin/server.startup_cmd')) + ->required() + ->live() + ->options(function (Get $get) { + $egg = Egg::find($get('egg_id')); + + return array_flip($egg->startup_commands ?? []) + ['custom' => 'Custom Startup']; + }) + ->formatStateUsing(fn (Server $server) => in_array($server->startup, $server->egg->startup_commands) ? $server->startup : 'custom') + ->afterStateUpdated(function (Set $set, string $state) { + if ($state !== 'custom') { + $set('startup', $state); + } + $set('previewing', false); + }) + ->selectablePlaceholder(false) + ->columnSpanFull() + ->hintAction(PreviewStartupAction::make('hint_preview')), + + Textarea::make('startup') + ->hiddenLabel() + ->required() + ->live() + ->autosize() + ->afterStateUpdated(function ($state, Get $get, Set $set) { + $egg = Egg::find($get('egg_id')); + $startups = $egg->startup_commands ?? []; + + if (in_array($state, $startups)) { + $set('select_startup', $state); + } else { + $set('select_startup', 'custom'); + } + }) + ->placeholder(trans('admin/server.startup_placeholder')) + ->columnSpanFull(), + + Repeater::make('server_variables') + ->hiddenLabel() + ->relationship('serverVariables', function (Builder $query) { + /** @var Server $server */ + $server = $this->getRecord(); + + $server->ensureVariablesExist(); + + return $query->orderByPowerJoins('variable.sort'); + }) + ->grid() + ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { + $data['variable_value'] ??= ''; + + return $data; + }) + ->reorderable(false)->addable(false)->deletable(false) + ->schema([ + StartupVariable::make('variable_value') + ->fromRecord() + ->disabled(false), + ]) + ->columnSpan(6), + ]), + Tab::make('mounts') + ->label(trans('admin/server.mounts')) + ->icon(TablerIcon::LayersLinked) + ->schema(fn (Get $get) => [ + ServerResource::getMountCheckboxList($get), + ]), + Tab::make('actions') + ->label(trans('admin/server.actions')) + ->icon(TablerIcon::Settings) + ->schema([ + Fieldset::make(trans('admin/server.actions')) + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 2, + 'md' => 2, + 'lg' => 6, + ]) + ->schema([ + Grid::make() + ->columnSpan(3) + ->schema([ + Actions::make([ + Action::make('exclude_toggle_install') + ->label(trans('admin/server.toggle_install')) + ->disabled(fn (Server $server) => $server->isSuspended()) + ->modal(fn (Server $server) => $server->isFailedInstall()) + ->modalHeading(trans('admin/server.toggle_install_failed_header')) + ->modalDescription(trans('admin/server.toggle_install_failed_desc')) + ->modalSubmitActionLabel(trans('admin/server.reinstall')) + ->action(function (ToggleInstallService $toggleService, ReinstallServerService $reinstallService, Server $server) { + if ($server->isFailedInstall()) { + try { + $reinstallService->handle($server); + + Notification::make() + ->title(trans('admin/server.notifications.reinstall_started')) + ->success() + ->send(); + + } catch (Exception) { + Notification::make() + ->title(trans('admin/server.notifications.reinstall_failed')) + ->body(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) + ->danger() + ->send(); + } + } else { + try { + $toggleService->handle($server); + + Notification::make() + ->title(trans('admin/server.notifications.install_toggled')) + ->success() + ->send(); + + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/server.notifications.install_toggle_failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + } + } + }), + ])->fullWidth(), + ToggleButtons::make('install_help') + ->hiddenLabel() + ->hint(trans('admin/server.toggle_install_help')), + ]), + Grid::make() + ->columnSpan(3) + ->schema([ + Actions::make([ + Action::make('exclude_toggle_suspend') + ->label(trans('admin/server.suspend')) + ->color('warning') + ->hidden(fn (Server $server) => $server->isSuspended()) + ->action(function (SuspensionService $suspensionService, Server $server) { + try { + $suspensionService->handle($server, SuspendAction::Suspend); + + Notification::make() + ->success() + ->title(trans('admin/server.notifications.server_suspended')) + ->send(); + + } catch (Exception) { + Notification::make() + ->warning() + ->title(trans('admin/server.notifications.server_suspension')) + ->body(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) + ->send(); + } + }), + Action::make('exclude_toggle_unsuspend') + ->label(trans('admin/server.unsuspend')) + ->color('success') + ->hidden(fn (Server $server) => !$server->isSuspended()) + ->action(function (SuspensionService $suspensionService, Server $server) { + try { + $suspensionService->handle($server, SuspendAction::Unsuspend); + + Notification::make() + ->success() + ->title(trans('admin/server.notifications.server_unsuspended')) + ->send(); + + } catch (Exception) { + Notification::make() + ->warning() + ->title(trans('admin/server.notifications.server_suspension')) + ->body(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) + ->send(); + } + }), + ])->fullWidth(), + ToggleButtons::make('server_suspend') + ->hiddenLabel() + ->hidden(fn (Server $server) => $server->isSuspended()) + ->hint(trans('admin/server.notifications.server_suspend_help')), + ToggleButtons::make('server_unsuspend') + ->hiddenLabel() + ->hidden(fn (Server $server) => !$server->isSuspended()) + ->hint(trans('admin/server.notifications.server_unsuspend_help')), + ]), + Grid::make() + ->columnSpan(3) + ->schema([ + Actions::make([ + Action::make('exclude_transfer') + ->label(trans('admin/server.transfer')) + ->disabled(fn (Server $server) => user()?->accessibleNodes()->count() <= 1 || $server->isInConflictState()) + ->modalHeading(trans('admin/server.transfer')) + ->schema($this->transferServer()) + ->action(function (TransferServerService $transfer, Server $server, $data) { + try { + $selectedBackupUuids = Arr::get($data, 'backups', []); + $transfer->handle($server, Arr::get($data, 'node_id'), Arr::get($data, 'allocation_id'), Arr::get($data, 'allocation_additional', []), $selectedBackupUuids); + + $server->backups + ->whereNotIn('uuid', $selectedBackupUuids) + ->where('disk', Backup::ADAPTER_DAEMON) + ->each(function ($backup) { + $backup->delete(); + }); + + Notification::make() + ->title(trans('admin/server.notifications.transfer_started')) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/server.notifications.transfer_failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + } + }), + ])->fullWidth(), + ToggleButtons::make('server_transfer') + ->hiddenLabel() + ->hint(new HtmlString(trans('admin/server.transfer_help'))), + ]), + Grid::make() + ->columnSpan(3) + ->schema([ + Actions::make([ + Action::make('exclude_reinstall') + ->label(trans('admin/server.reinstall')) + ->color('danger') + ->requiresConfirmation() + ->modalHeading(trans('admin/server.reinstall_modal_heading')) + ->modalDescription(trans('admin/server.reinstall_modal_description')) + ->disabled(fn (Server $server) => $server->isSuspended()) + ->action(function (ReinstallServerService $service, Server $server) { + try { + $service->handle($server); + + Notification::make() + ->title(trans('admin/server.notifications.reinstall_started')) + ->success() + ->send(); + } catch (Exception) { + Notification::make() + ->title(trans('admin/server.notifications.reinstall_failed')) + ->body(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) + ->danger() + ->send(); + } + }), + ])->fullWidth(), + ToggleButtons::make('server_reinstall') + ->hiddenLabel() + ->hint(trans('admin/server.reinstall_help')), + ]), + ]), + ]), + ]; + } + + /** @return Component[] + * @throws Exception + */ + protected function transferServer(): array + { + return [ + Select::make('node_id') + ->label(trans('admin/server.node')) + ->prefixIcon(TablerIcon::Server2) + ->selectablePlaceholder(false) + ->default(fn (Server $server) => user()?->accessibleNodes()->whereNot('id', $server->node->id)->first()?->id) + ->required() + ->live() + ->options(fn (Server $server) => user()?->accessibleNodes()->whereNot('id', $server->node->id)->pluck('name', 'id')->all()), + Select::make('allocation_id') + ->label(trans('admin/server.primary_allocation')) + ->disabled(fn (Get $get, Server $server) => !$get('node_id') || !$server->allocation_id) + ->required(fn (Server $server) => $server->allocation_id) + ->prefixIcon(TablerIcon::Network) + ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) + ->searchable(['ip', 'port', 'ip_alias']) + ->placeholder(trans('admin/server.select_allocation')), + Select::make('allocation_additional') + ->label(trans('admin/server.additional_allocations')) + ->disabled(fn (Get $get, Server $server) => !$get('node_id') || $server->allocations->count() <= 1) + ->multiple() + ->minItems(fn (Select $select) => $select->getMaxItems()) + ->maxItems(fn (Select $select, Server $server) => $select->isDisabled() ? null : $server->allocations->count() - 1) + ->prefixIcon(TablerIcon::Network) + ->required(fn (Server $server) => $server->allocations->count() > 1) + ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) + ->searchable(['ip', 'port', 'ip_alias']) + ->placeholder(trans('admin/server.select_additional')), + Grid::make() + ->columnSpanFull() + ->schema([ + CheckboxList::make('backups') + ->label(trans('admin/server.backups')) + ->bulkToggleable() + ->options(fn (Server $server) => $server->backups->where('disk', Backup::ADAPTER_DAEMON)->mapWithKeys(fn ($backup) => [$backup->uuid => $backup->name])) + ->columns(fn (Server $record) => (int) ceil($record->backups->where('disk', Backup::ADAPTER_DAEMON)->count() / 4)), + Text::make('backup_helper') + ->columnSpanFull() + ->content(trans('admin/server.warning_backups')), + ]) + ->hidden(fn (Server $server) => $server->backups->where('disk', Backup::ADAPTER_DAEMON)->count() === 0), + ]; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + /** @var Server $server */ + $server = $this->getRecord(); + + $canForceDelete = cache()->get("servers.$server->uuid.canForceDelete", false); + + return [ + Action::make('Delete') + ->color('danger') + ->hiddenLabel() + ->tooltip(trans('filament-actions::delete.single.label')) + ->modalHeading(trans('filament-actions::delete.single.modal.heading', ['label' => $this->getRecordTitle()])) + ->modalSubmitActionLabel(trans('filament-actions::delete.single.label')) + ->requiresConfirmation() + ->action(function (Server $server, ServerDeletionService $service) { + try { + $service->handle($server); + + return redirect(ListServers::getUrl(panel: 'admin')); + } catch (ConnectionException) { + cache()->put("servers.$server->uuid.canForceDelete", true, now()->addMinutes(5)); + + return Notification::make() + ->title(trans('admin/server.notifications.error_server_delete')) + ->body(trans('admin/server.notifications.error_server_delete_body')) + ->color('warning') + ->icon(TablerIcon::Database) + ->warning() + ->send(); + } + }) + ->hidden(fn () => $canForceDelete) + ->authorize(fn (Server $server) => user()?->can('delete server', $server)) + ->icon(TablerIcon::Trash), + Action::make('exclude_force_delete') + ->color('danger') + ->label(trans('filament-actions::force-delete.single.label')) + ->modalHeading(trans('filament-actions::force-delete.single.modal.heading', ['label' => $this->getRecordTitle()])) + ->modalSubmitActionLabel(trans('filament-actions::force-delete.single.label')) + ->requiresConfirmation() + ->action(function (Server $server, ServerDeletionService $service) { + try { + $service->withForce()->handle($server); + + return redirect(ListServers::getUrl(panel: 'admin')); + } catch (ConnectionException) { + return cache()->forget("servers.$server->uuid.canForceDelete"); + } + }) + ->visible(fn () => $canForceDelete) + ->authorize(fn (Server $server) => user()?->can('delete server', $server)), + Action::make('console') + ->hiddenLabel() + ->tooltip(trans('admin/server.console')) + ->icon(TablerIcon::Terminal) + ->url(fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + + } + + protected function getFormActions(): array + { + return []; + } + + protected function mutateFormDataBeforeSave(array $data): array + { + if (!isset($data['description'])) { + $data['description'] = ''; + } + + unset($data['docker'], $data['status'], $data['allocation_id']); + + return $data; + } + + protected function afterSave(): void + { + /** @var Server $server */ + $server = $this->record; + + $changed = collect($server->getChanges())->except(['updated_at', 'name', 'owner_id', 'condition', 'description', 'external_id', 'tags', 'cpu_pinning', 'allocation_limit', 'database_limit', 'backup_limit', 'skip_scripts'])->all(); + + try { + if ($changed) { + $this->daemonServerRepository->setServer($server)->sync(); + } + parent::getSavedNotification()?->send(); + } catch (ConnectionException) { + Notification::make() + ->title(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) + ->body(trans('admin/server.notifications.error_connecting_description')) + ->color('warning') + ->icon(TablerIcon::Database) + ->warning() + ->send(); + } + } + + protected function getSavedNotification(): ?Notification + { + return null; + } + + /** + * Save an icon from URL download to a file. + * + * @throws Exception + */ + private function saveIconFromUrl(string $imageUrl, string $extension, Server $server): void + { + $context = stream_context_create([ + 'http' => ['timeout' => 3], + 'https' => [ + 'timeout' => 3, + 'verify_peer' => true, + 'verify_peer_name' => true, + ], + ]); + + $normalizedExtension = match ($extension) { + 'svg+xml', 'svg' => 'svg', + 'jpeg', 'jpg' => 'jpg', + 'png' => 'png', + 'webp' => 'webp', + default => throw new Exception(trans('admin/egg.import.unknown_extension')), + }; + + $data = @file_get_contents($imageUrl, false, $context, 0, 262144); //256KB + + if (empty($data)) { + throw new Exception(trans('admin/egg.import.invalid_url')); + } + + Storage::disk('public')->put(Server::ICON_STORAGE_PATH . "/$server->uuid.$normalizedExtension", $data); + } +} diff --git a/app/Filament/Admin/Resources/Servers/Pages/ListServers.php b/app/Filament/Admin/Resources/Servers/Pages/ListServers.php new file mode 100644 index 0000000000..189ac4d717 --- /dev/null +++ b/app/Filament/Admin/Resources/Servers/Pages/ListServers.php @@ -0,0 +1,108 @@ +searchable(false) + ->defaultGroup('node.name') + ->groups([ + Group::make('node.name')->getDescriptionFromRecordUsing(fn (Server $server): string => str($server->node->description)->limit(150)), + Group::make('user.username')->getDescriptionFromRecordUsing(fn (Server $server): string => $server->user->email), + Group::make('egg.name')->getDescriptionFromRecordUsing(fn (Server $server): string => str($server->egg->description)->limit(150)), + ]) + ->columns([ + TextColumn::make('condition') + ->label(trans('admin/server.condition')) + ->default('unknown') + ->badge() + ->icon(fn (Server $server) => $server->condition->getIcon()) + ->color(fn (Server $server) => $server->condition->getColor()), + TextColumn::make('uuid') + ->hidden() + ->label('UUID') + ->searchable(), + TextColumn::make('name') + ->label(trans('admin/server.name')) + ->searchable(query: fn (Builder $query, string $search) => $query->where( + Server::query()->qualifyColumn('name'), 'like', "%{$search}%") + ) + ->sortable(), + TextColumn::make('node.name') + ->label(trans('admin/server.node')) + ->url(fn (Server $server) => route('filament.admin.resources.nodes.edit', ['record' => $server->node])) + ->hidden(fn (Table $table) => $table->getGrouping()?->getId() === 'node.name') + ->sortable() + ->searchable(), + TextColumn::make('egg.name') + ->label(trans('admin/server.egg')) + ->url(fn (Server $server) => route('filament.admin.resources.eggs.edit', ['record' => $server->egg])) + ->hidden(fn (Table $table) => $table->getGrouping()?->getId() === 'egg.name') + ->sortable() + ->searchable(), + TextColumn::make('user.username') + ->label(trans('admin/user.username')) + ->url(fn (Server $server) => route('filament.admin.resources.users.edit', ['record' => $server->user])) + ->hidden(fn (Table $table) => $table->getGrouping()?->getId() === 'user.username') + ->sortable() + ->searchable(), + SelectColumn::make('allocation_id') + ->label(trans('admin/server.primary_allocation')) + ->hidden(fn () => !user()?->can('update server')) // TODO: update to policy check (fn (Server $server) --> $server is empty) + ->disabled(fn (Server $server) => $server->allocations->count() <= 1) + ->options(fn (Server $server) => $server->allocations->mapWithKeys(fn ($allocation) => [$allocation->id => $allocation->address])) + ->selectablePlaceholder(fn (Server $server) => $server->allocations->count() <= 1) + ->placeholder(trans('admin/server.none')) + ->sortable(), + TextColumn::make('allocation_id_readonly') + ->label(trans('admin/server.primary_allocation')) + ->hidden(fn () => user()?->can('update server')) // TODO: update to policy check (fn (Server $server) --> $server is empty) + ->state(fn (Server $server) => $server->allocation->address ?? trans('admin/server.none')), + TextColumn::make('image')->hidden(), + TextColumn::make('backups_count') + ->counts('backups') + ->label(trans('admin/server.backups')) + ->numeric() + ->sortable(), + ]) + ->recordActions([ + Action::make('view') + ->tooltip(trans('admin/server.view')) + ->icon(TablerIcon::Terminal) + ->url(fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)) + ->authorize(fn (Server $server) => user()?->canAccessTenant($server)), + EditAction::make(), + ]) + ->toolbarActions([ + CreateAction::make(), + ]) + ->searchable() + ->emptyStateIcon(TablerIcon::BrandDocker) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/server.no_servers')); + } +} diff --git a/app/Filament/Admin/Resources/Servers/RelationManagers/AllocationsRelationManager.php b/app/Filament/Admin/Resources/Servers/RelationManagers/AllocationsRelationManager.php new file mode 100644 index 0000000000..01d8a65254 --- /dev/null +++ b/app/Filament/Admin/Resources/Servers/RelationManagers/AllocationsRelationManager.php @@ -0,0 +1,182 @@ +heading('') + ->selectCurrentPageOnly() + ->recordTitleAttribute('address') + ->recordTitle(fn (Allocation $allocation) => $allocation->address) + ->inverseRelationship('server') + ->columns([ + TextColumn::make('ip') + ->label(trans('admin/server.ip_address')), + TextColumn::make('port') + ->label(trans('admin/server.port')), + TextInputColumn::make('ip_alias') + ->label(trans('admin/server.alias')), + TextInputColumn::make('notes') + ->label(trans('admin/server.notes')) + ->placeholder(trans('admin/server.no_notes')), + IconColumn::make('primary') + ->icon(fn ($state) => match ($state) { + true => TablerIcon::StarFilled, + default => TablerIcon::Star, + }) + ->color(fn ($state) => match ($state) { + true => 'warning', + default => 'gray', + }) + ->tooltip(fn (Allocation $allocation) => trans('admin/server.' . ($allocation->id === $this->getOwnerRecord()->allocation_id ? 'already' : 'make') . '_primary')) + ->action(fn (Allocation $allocation) => $this->getOwnerRecord()->update(['allocation_id' => $allocation->id]) && $this->deselectAllTableRecords()) + ->default(fn (Allocation $allocation) => $allocation->id === $this->getOwnerRecord()->allocation_id) + ->label(trans('admin/server.primary')), + IconColumn::make('is_locked') + ->label(trans('admin/server.locked')) + ->tooltip(trans('admin/server.locked_helper')) + ->trueIcon(TablerIcon::Lock) + ->falseIcon(TablerIcon::LockOpen), + ]) + ->recordActions([ + Action::make('make-primary') + ->label(trans('admin/server.make_primary')) + ->action(fn (Allocation $allocation) => $this->getOwnerRecord()->update(['allocation_id' => $allocation->id]) && $this->deselectAllTableRecords()) + ->hidden(fn (Allocation $allocation) => $allocation->id === $this->getOwnerRecord()->allocation_id), + Action::make('lock') + ->label(trans('admin/server.lock')) + ->action(fn (Allocation $allocation) => $allocation->update(['is_locked' => true]) && $this->deselectAllTableRecords()) + ->hidden(fn (Allocation $allocation) => $allocation->is_locked), + Action::make('unlock') + ->label(trans('admin/server.unlock')) + ->action(fn (Allocation $allocation) => $allocation->update(['is_locked' => false]) && $this->deselectAllTableRecords()) + ->visible(fn (Allocation $allocation) => $allocation->is_locked), + DissociateAction::make() + ->after(function (Allocation $allocation) { + $allocation->update([ + 'notes' => null, + 'is_locked' => false, + ]); + + if (!$this->getOwnerRecord()->allocation_id) { + $this->getOwnerRecord()->update(['allocation_id' => $this->getOwnerRecord()->allocations()->first()?->id]); + } + }), + ]) + ->toolbarActions([ + DissociateBulkAction::make() + ->after(function () { + Allocation::whereNull('server_id')->update([ + 'notes' => null, + 'is_locked' => false, + ]); + + if (!$this->getOwnerRecord()->allocation_id) { + $this->getOwnerRecord()->update(['allocation_id' => $this->getOwnerRecord()->allocations()->first()?->id]); + } + }), + CreateAction::make() + ->hiddenLabel() + ->tooltip(trans('admin/server.create_allocation')) + ->icon(TablerIcon::Network) + ->createAnother(false) + ->schema(fn () => [ + Select::make('allocation_ip') + ->options(fn (Get $get) => collect($this->getOwnerRecord()->node->ipAddresses()) + ->when($get('allocation_ip'), fn ($ips, $current) => $ips->push($current)) + ->unique() + ->mapWithKeys(fn (string $ip) => [$ip => $ip])) + ->label(trans('admin/server.ip_address')) + ->inlineLabel() + ->ip() + ->live() + ->hintAction( + Action::make('refresh') + ->icon(TablerIcon::Refresh) + ->tooltip(trans('admin/node.refresh')) + ->action(function () { + cache()->forget("nodes.{$this->getOwnerRecord()->node->id}.ips"); + }) + ) + ->suffixAction( + Action::make('custom_ip') + ->icon(TablerIcon::Keyboard) + ->tooltip(trans('admin/node.custom_ip')) + ->schema([ + TextInput::make('custom_ip') + ->label(trans('admin/node.ip_address')) + ->ip() + ->required(), + ]) + ->action(fn (array $data, Set $set) => $set('allocation_ip', $data['custom_ip'])) + ) + ->afterStateUpdated(fn (Set $set) => $set('allocation_ports', [])) + ->required(), + TextInput::make('allocation_alias') + ->label(trans('admin/server.alias')) + ->inlineLabel() + ->default(null) + ->helperText(trans('admin/server.alias_helper')), + TagsInput::make('allocation_ports') + ->placeholder('27015, 27017-27019') + ->label(trans('admin/server.ports')) + ->inlineLabel() + ->live() + ->disabled(fn (Get $get) => empty($get('allocation_ip'))) + ->afterStateUpdated(fn ($state, Set $set, Get $get) => $set('allocation_ports', CreateServer::retrieveValidPorts($this->getOwnerRecord()->node, $state, $get('allocation_ip')))) + ->splitKeys(['Tab', ' ', ',']) + ->required(), + Hidden::make('is_locked') + ->default(true), + ]) + ->action(fn (array $data, AssignmentService $service) => $service->handle($this->getOwnerRecord()->node, $data, $this->getOwnerRecord())), + AssociateAction::make() + ->icon(TablerIcon::FilePlus) + ->iconButton()->iconSize(IconSize::ExtraLarge) + ->multiple() + ->associateAnother(false) + ->preloadRecordSelect() + ->recordSelectOptionsQuery(fn ($query) => $query->whereBelongsTo($this->getOwnerRecord()->node)->whereNull('server_id')) + ->recordSelectSearchColumns(['ip', 'port']) + ->tooltip(trans('admin/server.add_allocation')) + ->after(function (array $data) { + Allocation::whereIn('id', array_values(array_unique($data['recordId'])))->update(['is_locked' => true]); + + if (!$this->getOwnerRecord()->allocation_id) { + $this->getOwnerRecord()->update(['allocation_id' => $data['recordId'][0]]); + } + }), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Servers/RelationManagers/DatabasesRelationManager.php b/app/Filament/Admin/Resources/Servers/RelationManagers/DatabasesRelationManager.php new file mode 100644 index 0000000000..069e60c326 --- /dev/null +++ b/app/Filament/Admin/Resources/Servers/RelationManagers/DatabasesRelationManager.php @@ -0,0 +1,155 @@ +components([ + TextInput::make('database') + ->columnSpanFull(), + TextInput::make('username') + ->label(trans('admin/databasehost.table.username')), + TextInput::make('password') + ->label(trans('admin/databasehost.table.password')) + ->password() + ->revealable() + ->hintAction(RotateDatabasePasswordAction::make()) + ->formatStateUsing(fn (Database $database) => $database->password), + TextInput::make('remote') + ->label(trans('admin/databasehost.table.remote')) + ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? trans('admin/databasehost.anywhere'). ' ( % )' : $record->remote), + TextInput::make('max_connections') + ->label(trans('admin/databasehost.table.max_connections')) + ->formatStateUsing(fn (Database $record) => $record->max_connections ?: trans('admin/databasehost.unlimited')), + TextInput::make('jdbc') + ->label(trans('admin/databasehost.table.connection_string')) + ->columnSpanFull() + ->password() + ->revealable() + ->formatStateUsing(fn (Database $database) => $database->jdbc), + ]); + } + + public function table(Table $table): Table + { + return $table + ->heading('') + ->recordTitleAttribute('database') + ->columns([ + TextColumn::make('database'), + TextColumn::make('username') + ->label(trans('admin/databasehost.table.username')), + TextColumn::make('remote') + ->label(trans('admin/databasehost.table.remote')) + ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? trans('admin/databasehost.anywhere'). ' ( % )' : $record->remote), + TextColumn::make('server.name') + ->url(fn (Database $database) => route('filament.admin.resources.servers.edit', ['record' => $database->server_id])), + TextColumn::make('max_connections') + ->label(trans('admin/databasehost.table.max_connections')) + ->formatStateUsing(fn ($record) => $record->max_connections ?: trans('admin/databasehost.unlimited')), + DateTimeColumn::make('created_at') + ->label(trans('admin/databasehost.table.created_at')), + ]) + ->recordActions([ + ViewAction::make() + ->color('primary'), + DeleteAction::make() + ->successNotificationTitle(null) + ->using(function (Database $database, DatabaseManagementService $service) { + try { + $service->delete($database); + + Notification::make() + ->title(trans('server/database.delete_notification', ['database' => $database->database])) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('server/database.delete_notification_fail', ['database' => $database->database])) + ->danger() + ->send(); + + report($exception); + } + }), + ]) + ->toolbarActions([ + CreateAction::make() + ->hiddenLabel() + ->disabled(fn () => DatabaseHost::count() < 1) + ->tooltip(fn () => DatabaseHost::count() < 1 ? trans('admin/server.no_db_hosts') : trans('admin/server.create_database')) + ->color(fn () => DatabaseHost::count() < 1 ? 'danger' : 'primary') + ->icon(fn () => DatabaseHost::count() < 1 ? TablerIcon::DatabaseX : TablerIcon::DatabasePlus) + ->createAnother(false) + ->action(function (array $data, DatabaseManagementService $service, RandomWordService $randomWordService) { + $data['database'] ??= $randomWordService->word() . random_int(1, 420); + $data['remote'] ??= '%'; + + $data['database'] = $service->generateUniqueDatabaseName($data['database'], $this->getOwnerRecord()->id); + + try { + return $service->setValidateDatabaseLimit(false)->create($this->getOwnerRecord(), $data); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/server.failed_to_create')) + ->body($exception->getMessage()) + ->danger() + ->persistent()->send(); + + throw new Halt(); + } + }) + ->schema([ + Select::make('database_host_id') + ->label(trans('admin/databasehost.model_label')) + ->required() + ->options(fn () => DatabaseHost::query() + ->whereHas('nodes', fn ($query) => $query->where('nodes.id', $this->getOwnerRecord()->node_id)) + ->pluck('name', 'id') + ) + ->selectablePlaceholder(false) + ->default(fn () => (DatabaseHost::query()->first())?->id), + TextInput::make('database') + ->label(trans('admin/server.name')) + ->alphaDash() + ->prefix(fn () => 's' . $this->getOwnerRecord()->id . '_') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/databasehost.table.name_helper')), + TextInput::make('remote') + ->columnSpan(1) + ->regex('/^[\w\-\/.%:]+$/') + ->label(trans('admin/databasehost.table.remote')) + ->default('%') + ->hintIcon(TablerIcon::QuestionMark, trans('admin/databasehost.table.remote_helper')), + ]), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Servers/ServerResource.php b/app/Filament/Admin/Resources/Servers/ServerResource.php new file mode 100644 index 0000000000..cc0adea0d9 --- /dev/null +++ b/app/Filament/Admin/Resources/Servers/ServerResource.php @@ -0,0 +1,112 @@ +getCustomization(CustomizationKey::TopNavigation) ? false : trans('admin/dashboard.server'); + } + + public static function getNavigationBadge(): ?string + { + return (string) static::getEloquentQuery()->count() ?: null; + } + + /** + * @throws Exception + */ + public static function getMountCheckboxList(Get $get): CheckboxList + { + $allowedMounts = Mount::all(); + $node = $get('node_id'); + $egg = $get('egg_id'); + + if ($node && $egg) { + $allowedMounts = $allowedMounts->filter(fn (Mount $mount) => ($mount->nodes->isEmpty() || $mount->nodes->contains($node)) && + ($mount->eggs->isEmpty() || $mount->eggs->contains($egg)) + ); + } + + return CheckboxList::make('mounts') + ->hiddenLabel() + ->relationship('mounts') + ->live() + ->options(fn () => $allowedMounts->mapWithKeys(fn ($mount) => [$mount->id => $mount->name])) + ->descriptions(fn () => $allowedMounts->mapWithKeys(fn ($mount) => [$mount->id => "$mount->source -> $mount->target"])) + ->helperText(fn () => $allowedMounts->isEmpty() ? trans('admin/server.no_mounts') : null) + ->bulkToggleable() + ->columnSpanFull(); + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return [ + AllocationsRelationManager::class, + DatabasesRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListServers::route('/'), + 'create' => CreateServer::route('/create'), + 'edit' => EditServer::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + $query = parent::getEloquentQuery(); + + return $query->whereIn('node_id', user()?->accessibleNodes()->pluck('id')); + } +} diff --git a/app/Filament/Admin/Resources/Users/Pages/CreateUser.php b/app/Filament/Admin/Resources/Users/Pages/CreateUser.php new file mode 100644 index 0000000000..a0034b3c2e --- /dev/null +++ b/app/Filament/Admin/Resources/Users/Pages/CreateUser.php @@ -0,0 +1,71 @@ +service = $service; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + Action::make('create') + ->hiddenLabel() + ->action('create') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->icon(TablerIcon::UserPlus), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function prepareForValidation($attributes): array + { + $attributes['data']['email'] = mb_strtolower($attributes['data']['email']); + + return $attributes; + } + + protected function handleRecordCreation(array $data): Model + { + $data['root_admin'] = false; + + $roles = $data['roles']; + $roles = collect($roles)->map(fn ($role) => Role::findById($role)); + unset($data['roles']); + + $user = $this->service->handle($data); + + $user->syncRoles($roles); + + return $user; + } +} diff --git a/app/Filament/Admin/Resources/Users/Pages/EditUser.php b/app/Filament/Admin/Resources/Users/Pages/EditUser.php new file mode 100644 index 0000000000..5b575b5d28 --- /dev/null +++ b/app/Filament/Admin/Resources/Users/Pages/EditUser.php @@ -0,0 +1,61 @@ +service = $service; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make() + ->tooltip(fn (User $user) => user()?->id === $user->id ? trans('admin/user.self_delete') : ($user->servers()->count() > 0 ? trans('admin/user.has_servers') : trans('filament-actions::delete.single.modal.actions.delete.label'))) + ->disabled(fn (User $user) => user()?->id === $user->id || $user->servers()->count() > 0), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function handleRecordUpdate(Model $record, array $data): Model + { + if (!$record instanceof User) { + return $record; + } + unset($data['roles'], $data['avatar']); + + return $this->service->handle($record, $data); + } +} diff --git a/app/Filament/Admin/Resources/Users/Pages/ListUsers.php b/app/Filament/Admin/Resources/Users/Pages/ListUsers.php new file mode 100644 index 0000000000..b714fde206 --- /dev/null +++ b/app/Filament/Admin/Resources/Users/Pages/ListUsers.php @@ -0,0 +1,16 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + EditAction::make(), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Users/RelationManagers/ServersRelationManager.php b/app/Filament/Admin/Resources/Users/RelationManagers/ServersRelationManager.php new file mode 100644 index 0000000000..cab9c7a80d --- /dev/null +++ b/app/Filament/Admin/Resources/Users/RelationManagers/ServersRelationManager.php @@ -0,0 +1,92 @@ +getOwnerRecord(); + + return $table + ->searchable(false) + ->heading(trans('admin/user.servers')) + ->headerActions([ + Action::make('toggleSuspend') + ->hidden(fn () => $user->servers() + ->whereNot('status', ServerState::Suspended) + ->orWhereNull('status') + ->count() === 0 + ) + ->label(trans('admin/server.suspend_all')) + ->color('warning') + ->action(function (SuspensionService $suspensionService) use ($user) { + collect($user->servers)->filter(fn ($server) => !$server->isSuspended()) + ->each(fn ($server) => $suspensionService->handle($server, SuspendAction::Suspend)); + }), + Action::make('toggleUnsuspend') + ->hidden(fn () => $user->servers()->where('status', ServerState::Suspended)->count() === 0) + ->label(trans('admin/server.unsuspend_all')) + ->color('primary') + ->action(function (SuspensionService $suspensionService) use ($user) { + collect($user->servers()->get())->filter(fn ($server) => $server->isSuspended()) + ->each(fn ($server) => $suspensionService->handle($server, SuspendAction::Unsuspend)); + }), + ]) + ->columns([ + TextColumn::make('uuid') + ->hidden() + ->label('UUID') + ->searchable(), + TextColumn::make('name') + ->label(trans('admin/server.name')) + ->url(fn (Server $server) => route('filament.admin.resources.servers.edit', ['record' => $server])) + ->searchable() + ->sortable(), + TextColumn::make('node.name') + ->label(trans('admin/server.node')) + ->url(fn (Server $server) => route('filament.admin.resources.nodes.edit', ['record' => $server->node])) + ->sortable(), + TextColumn::make('egg.name') + ->label(trans('admin/server.egg')) + ->url(fn (Server $server) => route('filament.admin.resources.eggs.edit', ['record' => $server->egg])) + ->sortable(), + SelectColumn::make('allocation_id') + ->label(trans('admin/server.primary_allocation')) + ->hidden(fn () => !user()?->can('update server')) // TODO: update to policy check (fn (Server $server) --> $server is empty) + ->disabled(fn (Server $server) => $server->allocations->count() <= 1) + ->options(fn (Server $server) => $server->allocations->mapWithKeys(fn ($allocation) => [$allocation->id => $allocation->address])) + ->selectablePlaceholder(fn (Server $server) => $server->allocations->count() <= 1) + ->placeholder(trans('admin/server.none')) + ->sortable(), + TextColumn::make('allocation_id_readonly') + ->label(trans('admin/server.primary_allocation')) + ->hidden(fn () => user()?->can('update server')) // TODO: update to policy check (fn (Server $server) --> $server is empty) + ->state(fn (Server $server) => $server->allocation->address ?? trans('admin/server.none')), + TextColumn::make('databases_count') + ->counts('databases') + ->label(trans('admin/server.databases')) + ->numeric() + ->sortable(), + TextColumn::make('backups_count') + ->counts('backups') + ->label(trans('admin/server.backups')) + ->numeric() + ->sortable(), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Users/UserResource.php b/app/Filament/Admin/Resources/Users/UserResource.php new file mode 100644 index 0000000000..001ef63ca9 --- /dev/null +++ b/app/Filament/Admin/Resources/Users/UserResource.php @@ -0,0 +1,513 @@ +getCustomization(CustomizationKey::TopNavigation) ? false : trans('admin/dashboard.user'); + } + + public static function getNavigationBadge(): ?string + { + return ($count = static::getModel()::count()) > 0 ? (string) $count : null; + } + + /** + * @throws Exception + */ + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + ImageColumn::make('picture') + ->visibleFrom('lg') + ->label('') + ->circular() + ->alignCenter() + ->defaultImageUrl(fn (User $user) => Filament::getUserAvatarUrl($user)), + TextColumn::make('username') + ->label(trans('admin/user.username')) + ->searchable(), + TextColumn::make('email') + ->label(trans('admin/user.email')) + ->searchable(), + IconColumn::make('mfa_email_enabled') + ->label(trans('profile.tabs.2fa')) + ->visibleFrom('lg') + ->icon(fn (User $user) => filled($user->mfa_app_secret) ? TablerIcon::Qrcode : ($user->mfa_email_enabled ? TablerIcon::Mail : TablerIcon::LockOpenOff)) + ->tooltip(fn (User $user) => filled($user->mfa_app_secret) ? 'App' : ($user->mfa_email_enabled ? 'E-Mail' : 'None')), + TextColumn::make('roles.name') + ->label(trans('admin/user.roles')) + ->badge() + ->placeholder(trans('admin/user.no_roles')), + TextColumn::make('servers_count') + ->counts('servers') + ->label(trans('admin/user.servers')), + TextColumn::make('subusers_count') + ->visibleFrom('sm') + ->label(trans('admin/user.subusers')) + ->counts('subusers'), + ]) + ->recordActions([ + ViewAction::make() + ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make('exclude_bulk_delete'), + ]), + CreateAction::make() + ->hiddenLabel() + ->icon(TablerIcon::UserPlus), + ]) + ->checkIfRecordIsSelectableUsing(fn (User $user) => user()?->id !== $user->id && !$user->servers_count); + } + + public static function defaultForm(Schema $schema): Schema + { + return $schema + ->columns(['default' => 1, 'lg' => 3, 'md' => 2]) + ->components([ + Tabs::make() + ->schema(static::getTabs()) + ->columnSpanFull(), + ]); + } + + /** @return Tab[] */ + protected static function getDefaultTabs(): array + { + return [ + Tab::make('account') + ->label(trans('profile.tabs.account')) + ->icon(TablerIcon::UserCog) + ->columns([ + 'default' => 1, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + TextInput::make('username') + ->label(trans('admin/user.username')) + ->columnSpan([ + 'default' => 1, + 'md' => 1, + 'lg' => 1, + ]) + ->required() + ->unique() + ->maxLength(255), + TextInput::make('email') + ->label(trans('admin/user.email')) + ->columnSpan([ + 'default' => 1, + 'md' => 1, + 'lg' => 1, + ]) + ->email() + ->required() + ->unique() + ->maxLength(255), + TextInput::make('password') + ->label(trans('admin/user.password')) + ->columnSpan([ + 'default' => 1, + 'md' => 1, + 'lg' => 1, + ]) + ->hintIcon(fn ($operation) => $operation === 'create' ? TablerIcon::QuestionMark : null, fn ($operation) => $operation === 'create' ? trans('admin/user.password_help') : null) + ->password() + ->hintAction( + Action::make('hint_password_reset') + ->label(trans('admin/user.password_reset')) + ->hidden(fn (string $operation) => $operation === 'create' || config('mail.default', 'log') === 'log') + ->icon(TablerIcon::Send) + ->action(function (User $user) { + $status = Password::broker(Filament::getPanel('app')->getAuthPasswordBroker())->sendResetLink([ + 'email' => $user->email, + ], + function (User $user, string $token) { + $notification = new ResetPassword($token); + $notification->url = Filament::getPanel('app')->getResetPasswordUrl($token, $user); + + $user->notify($notification); + + event(new PasswordResetLinkSent($user)); + }, + ); + + if ($status === Password::RESET_LINK_SENT) { + Notification::make() + ->title(trans('admin/user.password_reset_sent')) + ->success() + ->send(); + } else { + Notification::make() + ->title(trans('admin/user.password_reset_failed')) + ->body($status) + ->danger() + ->send(); + } + })), + TextInput::make('external_id') + ->label(trans('admin/user.external_id')) + ->columnSpan([ + 'default' => 1, + 'md' => 1, + 'lg' => 1, + ]), + Toggle::make('is_managed_externally') + ->label(trans('admin/user.is_managed_externally')) + ->hintIcon(TablerIcon::QuestionMark, trans('admin/user.is_managed_externally_helper')) + ->inline(false) + ->columnSpan([ + 'default' => 1, + 'md' => 1, + 'lg' => 1, + ]), + Section::make(trans('profile.tabs.customization')) + ->collapsible() + ->columnSpanFull() + ->columns(2) + ->schema([ + Select::make('timezone') + ->label(trans('profile.timezone')) + ->required() + ->prefixIcon(TablerIcon::ClockPin) + ->default(fn () => config('app.timezone', 'UTC')) + ->selectablePlaceholder(false) + ->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz])) + ->searchable(), + Select::make('language') + ->label(trans('profile.language')) + ->required() + ->prefixIcon(TablerIcon::Flag) + ->live() + ->default('en') + ->searchable() + ->selectablePlaceholder(false) + ->options(fn (LanguageService $languageService) => $languageService->getAvailableLanguages()), + FileUpload::make('avatar') + ->visible(fn (?User $user, FileUpload $fileUpload) => $user ? $fileUpload->getDisk()->exists($fileUpload->getDirectory() . '/' . $user->id . '.png') : false) + ->columnSpanFull() + ->avatar() + ->directory('avatars') + ->disk('public') + ->formatStateUsing(function (FileUpload $fileUpload, ?User $user) { + if (!$user) { + return null; + } + $path = $fileUpload->getDirectory() . '/' . $user->id . '.png'; + if ($fileUpload->getDisk()->exists($path)) { + return $path; + } + }) + ->deleteUploadedFileUsing(function (FileUpload $fileUpload, $file) { + if ($file instanceof TemporaryUploadedFile) { + return $file->delete(); + } + + if ($fileUpload->getDisk()->exists($file)) { + return $fileUpload->getDisk()->delete($file); + } + }), + ]), + Section::make(trans('profile.tabs.oauth')) + ->visible(fn (?User $user) => $user) + ->collapsible() + ->columnSpanFull() + ->schema(function (OAuthService $oauthService, ?User $user) { + if (!$user) { + return; + } + + $actions = []; + foreach ($user->oauth ?? [] as $schema => $_) { + $schema = $oauthService->get($schema); + if (!$schema) { + return; + } + + $id = $schema->getId(); + $name = $schema->getName(); + + $color = $schema->getHexColor(); + $color = is_string($color) ? Color::hex($color) : null; + + $actions[] = Action::make("oauth_$id") + ->label(trans('profile.unlink', ['name' => $name])) + ->icon(TablerIcon::Unlink) + ->requiresConfirmation() + ->color($color) + ->action(function ($livewire) use ($oauthService, $user, $name, $schema) { + $oauthService->unlinkUser($user, $schema); + $livewire->form->fill($user->attributesToArray()); + Notification::make() + ->title(trans('profile.unlinked', ['name' => $name])) + ->success() + ->send(); + }); + } + + if (!$actions) { + return [ + TextEntry::make('no_oauth') + ->state(trans('profile.no_oauth')) + ->hiddenLabel(), + ]; + } + + return [Actions::make($actions)]; + }), + ]), + Tab::make('roles') + ->label(trans('admin/user.roles')) + ->icon(TablerIcon::UsersGroup) + ->schema([ + CheckboxList::make('roles') + ->hidden(fn (?User $user) => $user && $user->isRootAdmin()) + ->relationship('roles', 'name', fn (Builder $query) => $query->whereNot('id', Role::getRootAdmin()->id)) + ->saveRelationshipsUsing(fn (User $user, array $state) => $user->syncRoles(collect($state)->map(fn ($role) => Role::findById($role)))) + ->dehydrated() + ->label(trans('admin/user.admin_roles')) + ->columnSpanFull() + ->bulkToggleable(false), + CheckboxList::make('root_admin_role') + ->visible(fn (?User $user) => $user && $user->isRootAdmin()) + ->disabled() + ->options([ + 'root_admin' => Role::ROOT_ADMIN, + ]) + ->descriptions([ + 'root_admin' => trans('admin/role.root_admin', ['role' => Role::ROOT_ADMIN]), + ]) + ->formatStateUsing(fn () => ['root_admin']) + ->dehydrated(false) + ->label(trans('admin/user.admin_roles')) + ->columnSpanFull(), + ]), + Tab::make('keys') + ->visible(fn (?User $user) => $user) + ->label(trans('profile.tabs.keys')) + ->icon(TablerIcon::Key) + ->schema([ + Section::make(trans('profile.api_keys')) + ->columnSpan(2) + ->schema([ + Repeater::make('api_keys') + ->hiddenLabel() + ->inlineLabel(false) + ->relationship('apiKeys') + ->addable(false) + ->itemLabel(fn ($state) => $state['identifier']) + ->deleteAction(function (Action $action) { + $action->requiresConfirmation()->action(function (array $arguments, Repeater $component, ?User $user) { + $items = $component->getState(); + $key = $items[$arguments['item']] ?? null; + + if ($key) { + $apiKey = ApiKey::find($key['id']); + if ($apiKey?->exists()) { + $apiKey->delete(); + + Activity::event('user:api-key.delete') + ->actor(user()) + ->subject($user) + ->subject($apiKey) + ->property('identifier', $apiKey->identifier) + ->log(); + } + + unset($items[$arguments['item']]); + $component->state($items); + $component->callAfterStateUpdated(); + } + }); + }) + ->schema([ + TextEntry::make('memo') + ->hiddenLabel() + ->state(fn (ApiKey $key) => $key->memo), + ]) + ->visible(fn (User $user) => $user->apiKeys()->exists()), + + TextEntry::make('no_api_keys') + ->state(trans('profile.no_api_keys')) + ->hiddenLabel() + ->visible(fn (User $user) => !$user->apiKeys()->exists()), + ]), + Section::make(trans('profile.ssh_keys'))->columnSpan(2) + ->schema([ + Repeater::make('ssh_keys') + ->hiddenLabel() + ->inlineLabel(false) + ->relationship('sshKeys') + ->addable(false) + ->itemLabel(fn ($state) => $state['name']) + ->deleteAction(function (Action $action) { + $action->requiresConfirmation()->action(function (array $arguments, Repeater $component, User $user) { + $items = $component->getState(); + $key = $items[$arguments['item']]; + + $sshKey = UserSSHKey::find($key['id'] ?? null); + if ($sshKey->exists()) { + $sshKey->delete(); + + Activity::event('user:ssh-key.delete') + ->actor(user()) + ->subject($user) + ->subject($sshKey) + ->property('fingerprint', $sshKey->fingerprint) + ->log(); + } + + unset($items[$arguments['item']]); + + $component->state($items); + + $component->callAfterStateUpdated(); + }); + }) + ->schema(fn () => [ + TextEntry::make('fingerprint') + ->hiddenLabel() + ->state(fn (UserSSHKey $key) => "SHA256:{$key->fingerprint}"), + ]) + ->visible(fn (User $user) => $user->sshKeys()->exists()), + + TextEntry::make('no_ssh_keys') + ->state(trans('profile.no_ssh_keys')) + ->hiddenLabel() + ->visible(fn (User $user) => !$user->sshKeys()->exists()), + ]), + ]), + Tab::make('activity') + ->visible(fn (?User $user) => $user) + ->disabledOn('create') + ->label(trans('profile.tabs.activity')) + ->icon(TablerIcon::History) + ->schema([ + Repeater::make('activity') + ->hiddenLabel() + ->inlineLabel(false) + ->deletable(false) + ->addable(false) + ->relationship(null, function (Builder $query) { + $query->orderBy('timestamp', 'desc'); + }) + ->schema([ + TextEntry::make('log') + ->hiddenLabel() + ->state(fn (ActivityLog $log) => new HtmlString($log->htmlable())), + ]), + ]), + ]; + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return [ + ServersRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListUsers::route('/'), + 'create' => CreateUser::route('/create'), + 'view' => ViewUser::route('/{record}'), + 'edit' => EditUser::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Webhooks/Pages/CreateWebhookConfiguration.php b/app/Filament/Admin/Resources/Webhooks/Pages/CreateWebhookConfiguration.php new file mode 100644 index 0000000000..2fdc7375d3 --- /dev/null +++ b/app/Filament/Admin/Resources/Webhooks/Pages/CreateWebhookConfiguration.php @@ -0,0 +1,86 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + $this->getCancelFormAction()->formId('form') + ->hiddenLabel() + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.cancel.label')) + ->icon(TablerIcon::ArrowLeft), + Action::make('create') + ->hiddenLabel() + ->action('create') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->icon(TablerIcon::Plus), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function mutateFormDataBeforeCreate(array $data): array + { + if (($data['type'] ?? null) === WebhookType::Discord->value) { + $embeds = data_get($data, 'embeds', []); + + foreach ($embeds as &$embed) { + $embed['color'] = hexdec(str_replace('#', '', data_get($embed, 'color'))); + $embed = collect($embed)->filter(fn ($key) => is_array($key) ? array_filter($key, fn ($arr_key) => !empty($arr_key)) : !empty($key))->all(); + } + + $flags = collect($data['flags'] ?? [])->reduce(fn ($carry, $bit) => $carry | $bit, 0); + + $tmp = collect([ + 'username' => data_get($data, 'username'), + 'avatar_url' => data_get($data, 'avatar_url'), + 'content' => data_get($data, 'content'), + 'image' => data_get($data, 'image'), + 'thumbnail' => data_get($data, 'thumbnail'), + 'embeds' => $embeds, + 'thread_name' => data_get($data, 'thread_name'), + 'flags' => $flags, + 'allowed_mentions' => data_get($data, 'allowed_mentions', []), + ])->filter(fn ($key) => !empty($key))->all(); + + unset($data['username'], $data['avatar_url'], $data['content'], $data['image'], $data['thumbnail'], $data['embeds'], $data['thread_name'], $data['flags'], $data['allowed_mentions']); + $data['payload'] = $tmp; + } + + return $data; + } + + protected function getRedirectUrl(): string + { + return EditWebhookConfiguration::getUrl(['record' => $this->getRecord()]); + } + + public function mount(): void + { + parent::mount(); + WebhookResource::sendHelpBanner(); + } +} diff --git a/app/Filament/Admin/Resources/Webhooks/Pages/EditWebhookConfiguration.php b/app/Filament/Admin/Resources/Webhooks/Pages/EditWebhookConfiguration.php new file mode 100644 index 0000000000..1a4bc87a65 --- /dev/null +++ b/app/Filament/Admin/Resources/Webhooks/Pages/EditWebhookConfiguration.php @@ -0,0 +1,137 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make(), + Action::make('test_now') + ->tooltip(trans('admin/webhook.test_now')) + ->color('primary') + ->disabled(fn (WebhookConfiguration $webhookConfiguration) => count($webhookConfiguration->events) === 0) + ->action(fn (WebhookConfiguration $webhookConfiguration) => $webhookConfiguration->run()) + ->icon(TablerIcon::TestPipe), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + protected function mutateFormDataBeforeSave(array $data): array + { + if (($data['type'] ?? null) === WebhookType::Discord) { + $embeds = data_get($data, 'embeds', []); + + foreach ($embeds as &$embed) { + $embed['color'] = hexdec(str_replace('#', '', data_get($embed, 'color'))); + $embed = collect($embed)->filter(fn ($key) => is_array($key) ? array_filter($key, fn ($arr_key) => !empty($arr_key)) : !empty($key))->all(); + } + + $flags = collect($data['flags'] ?? [])->reduce(fn ($carry, $bit) => $carry | $bit, 0); + + $tmp = collect([ + 'username' => data_get($data, 'username'), + 'avatar_url' => data_get($data, 'avatar_url'), + 'content' => data_get($data, 'content'), + 'image' => data_get($data, 'image'), + 'thumbnail' => data_get($data, 'thumbnail'), + 'embeds' => $embeds, + 'thread_name' => data_get($data, 'thread_name'), + 'flags' => $flags, + 'allowed_mentions' => data_get($data, 'allowed_mentions', []), + ])->filter(fn ($key) => !empty($key))->all(); + + unset($data['username'], $data['avatar_url'], $data['content'], $data['image'], $data['thumbnail'], $data['embeds'], $data['thread_name'], $data['flags'], $data['allowed_mentions']); + + $data['payload'] = $tmp; + } + + if (($data['type'] ?? null) === WebhookType::Regular && isset($data['headers'])) { + $newHeaders = []; + foreach ($data['headers'] as $key => $value) { + $newKey = str_replace(' ', '-', $key); + $newHeaders[$newKey] = $value; + } + $data['headers'] = $newHeaders; + } + + return $data; + } + + protected function mutateFormDataBeforeFill(array $data): array + { + if (($data['type'] ?? null) === WebhookType::Discord->value) { + $embeds = data_get($data, 'payload.embeds', []); + foreach ($embeds as &$embed) { + $embed['color'] = '#' . dechex(data_get($embed, 'color')); + $embed = collect($embed)->filter(fn ($key) => is_array($key) ? array_filter($key, fn ($arr_key) => !empty($arr_key)) : !empty($key))->all(); + } + + $flags = data_get($data, 'payload.flags'); + $flags = collect(range(0, PHP_INT_SIZE * 8 - 1)) + ->filter(fn ($i) => ($flags & (1 << $i)) !== 0) + ->map(fn ($i) => 1 << $i) + ->values(); + + $tmp = collect([ + 'username' => data_get($data, 'payload.username'), + 'avatar_url' => data_get($data, 'payload.avatar_url'), + 'content' => data_get($data, 'payload.content'), + 'image' => data_get($data, 'payload.image'), + 'thumbnail' => data_get($data, 'payload.thumbnail'), + 'embeds' => $embeds, + 'thread_name' => data_get($data, 'payload.thread_name'), + 'flags' => $flags, + 'allowed_mentions' => data_get($data, 'payload.allowed_mentions'), + ])->filter(fn ($key) => !empty($key))->all(); + + unset($data['payload'], $data['created_at'], $data['updated_at'], $data['deleted_at']); + $data = array_merge($data, $tmp); + } + + if (($data['type'] ?? null) === WebhookType::Regular->value) { + $data['headers'] = $data['headers'] ?? []; + } + + return $data; + } + + protected function afterSave(): void + { + $this->dispatch('refresh-widget'); + } + + public function mount(int|string $record): void + { + parent::mount($record); + WebhookResource::sendHelpBanner(); + } +} diff --git a/app/Filament/Admin/Resources/Webhooks/Pages/ListWebhookConfigurations.php b/app/Filament/Admin/Resources/Webhooks/Pages/ListWebhookConfigurations.php new file mode 100644 index 0000000000..50a1f17b11 --- /dev/null +++ b/app/Filament/Admin/Resources/Webhooks/Pages/ListWebhookConfigurations.php @@ -0,0 +1,16 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + EditAction::make(), + ]; + } +} diff --git a/app/Filament/Admin/Resources/Webhooks/WebhookResource.php b/app/Filament/Admin/Resources/Webhooks/WebhookResource.php new file mode 100644 index 0000000000..a4411f2f43 --- /dev/null +++ b/app/Filament/Admin/Resources/Webhooks/WebhookResource.php @@ -0,0 +1,355 @@ + 0 ? (string) $count : null; + } + + public static function getNavigationGroup(): ?string + { + return trans('admin/dashboard.advanced'); + } + + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + IconColumn::make('type'), + TextColumn::make('endpoint') + ->label(trans('admin/webhook.table.endpoint')) + ->formatStateUsing(fn (string $state) => str($state)->after('://')) + ->limit(60) + ->wrap(), + TextColumn::make('description') + ->label(trans('admin/webhook.table.description')), + TextColumn::make('endpoint') + ->label(trans('admin/webhook.table.endpoint')), + ]) + ->recordActions([ + ViewAction::make() + ->hidden(fn (WebhookConfiguration $record) => static::getEditAuthorizationResponse($record)->allowed()), + EditAction::make(), + ReplicateAction::make() + ->iconButton() + ->tooltip(trans('filament-actions::replicate.single.label')) + ->modal(false) + ->excludeAttributes(['created_at', 'updated_at']) + ->beforeReplicaSaved(fn (WebhookConfiguration $replica) => $replica->description .= ' Copy ' . now()->format('Y-m-d H:i:s')) + ->successRedirectUrl(fn (WebhookConfiguration $replica) => EditWebhookConfiguration::getUrl(['record' => $replica])), + ]) + ->toolbarActions([ + CreateAction::make(), + BulkActionGroup::make([ + DeleteBulkAction::make('exclude_bulk_delete'), + ]), + ]) + ->emptyStateIcon(TablerIcon::Webhook) + ->emptyStateDescription('') + ->emptyStateHeading(trans('admin/webhook.no_webhooks')) + ->persistFiltersInSession() + ->filters([ + SelectFilter::make('type') + ->options(WebhookType::class) + ->attribute('type'), + ]); + } + + public static function defaultForm(Schema $schema): Schema + { + return $schema + ->components([ + ToggleButtons::make('type') + ->live() + ->inline() + ->options(WebhookType::class) + ->default(WebhookType::Regular), + TextInput::make('description') + ->label(trans('admin/webhook.description')) + ->required(), + TextInput::make('endpoint') + ->label(trans('admin/webhook.endpoint')) + ->required() + ->columnSpanFull() + ->afterStateUpdated(fn (string $state, Set $set) => $set('type', str($state)->contains('discord.com') ? WebhookType::Discord : WebhookType::Regular)), + Section::make(trans('admin/webhook.regular')) + ->hidden(fn (Get $get) => $get('type') === WebhookType::Discord) + ->schema(fn () => self::getRegularFields()) + ->headerActions([ + Action::make('reset_headers') + ->tooltip(trans('admin/webhook.reset_headers')) + ->color('danger') + ->icon(TablerIcon::Restore) + ->action(fn (Get $get, Set $set) => $set('headers', [ + 'X-Webhook-Event' => '{{event}}', + ])), + ]) + ->formBefore(), + Section::make(trans('admin/webhook.discord')) + ->hidden(fn (Get $get) => $get('type') === WebhookType::Regular) + ->afterStateUpdated(fn (Livewire $livewire) => $livewire->dispatch('refresh-widget')) + ->schema(fn () => self::getDiscordFields()) + ->view('filament.components.webhooksection') + ->aside() + ->formBefore() + ->columnSpanFull(), + Section::make(trans('admin/webhook.events')) + ->schema([ + CheckboxList::make('events') + ->live() + ->options(fn () => WebhookConfiguration::filamentCheckboxList()) + ->searchable() + ->bulkToggleable() + ->columns(3) + ->columnSpanFull() + ->required(), + ]), + ]); + } + + /** @return Component[] + * @throws Exception + */ + private static function getRegularFields(): array + { + return [ + KeyValue::make('headers') + ->label(trans('admin/webhook.headers')) + ->default(fn () => [ + 'X-Webhook-Event' => '{{event}}', + ]), + ]; + } + + /** @return Component[] + * @throws Exception + */ + private static function getDiscordFields(): array + { + return [ + Section::make(trans('admin/webhook.discord_message.profile')) + ->collapsible() + ->schema([ + TextInput::make('username') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_message.username')), + TextInput::make('avatar_url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_message.avatar_url')), + ]), + Section::make(trans('admin/webhook.discord_message.message')) + ->collapsible() + ->schema([ + TextInput::make('content') + ->label(trans('admin/webhook.discord_message.message')) + ->live(debounce: 500) + ->required(fn (Get $get) => empty($get('embeds'))), + TextInput::make('thread_name') + ->label(trans('admin/webhook.discord_message.forum_thread')), + CheckboxList::make('flags') + ->label(trans('admin/webhook.discord_embed.flags')) + ->options([ + (1 << 2) => trans('admin/webhook.discord_message.supress_embeds'), + (1 << 12) => trans('admin/webhook.discord_message.supress_notifications'), + ]) + ->descriptions([ + (1 << 2) => trans('admin/webhook.discord_message.supress_embeds_text'), + (1 << 12) => trans('admin/webhook.discord_message.supress_notifications_text'), + ]), + CheckboxList::make('allowed_mentions') + ->label(trans('admin/webhook.discord_embed.allowed_mentions')) + ->options([ + 'roles' => trans('admin/webhook.discord_embed.roles'), + 'users' => trans('admin/webhook.discord_embed.users'), + 'everyone' => trans('admin/webhook.discord_embed.everyone'), + ]), + ]), + Repeater::make('embeds') + ->live(debounce: 500) + ->itemLabel(fn (array $state) => $state['title']) + ->addActionLabel(trans('admin/webhook.discord_embed.add_embed')) + ->required(fn (Get $get) => empty($get('content'))) + ->reorderable() + ->collapsible() + ->maxItems(10) + ->schema([ + Section::make(trans('admin/webhook.discord_embed.author')) + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('author.name') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.author')) + ->required(fn (Get $get) => filled($get('author.url')) || filled($get('author.icon_url'))), + TextInput::make('author.url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.author_url')), + TextInput::make('author.icon_url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.author_icon_url')), + ]), + Section::make(trans('admin/webhook.discord_embed.body')) + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('title') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.title')) + ->required(fn (Get $get) => $get('description') === null), + Textarea::make('description') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.body')) + ->required(fn (Get $get) => $get('title') === null), + ColorPicker::make('color') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.color')) + ->hex(), + TextInput::make('url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.url')), + ]), + Section::make(trans('admin/webhook.discord_embed.images')) + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('image.url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.image_url')), + TextInput::make('thumbnail.url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.image_thumbnail')), + ]), + Section::make(trans('admin/webhook.discord_embed.footer')) + ->collapsible() + ->collapsed() + ->schema([ + TextInput::make('footer.text') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.footer')), + Checkbox::make('has_timestamp') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.has_timestamp')), + TextInput::make('footer.icon_url') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.footer_icon_url')), + ]), + Section::make(trans('admin/webhook.discord_embed.fields')) + ->collapsible()->collapsed() + ->schema([ + Repeater::make('fields') + ->reorderable() + ->addActionLabel(trans('admin/webhook.discord_embed.add_field')) + ->collapsible() + ->schema([ + TextInput::make('name') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.field_name')) + ->required(), + Textarea::make('value') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.field_value')) + ->rows(4) + ->required(), + Checkbox::make('inline') + ->live(debounce: 500) + ->label(trans('admin/webhook.discord_embed.inline_field')), + ]), + ]), + ]), + ]; + } + + public static function sendHelpBanner(): void + { + AlertBanner::make('discord_webhook_help') + ->title(trans('admin/webhook.help')) + ->body(trans('admin/webhook.help_text')) + ->icon(TablerIcon::QuestionMark) + ->info() + ->send(); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListWebhookConfigurations::route('/'), + 'create' => CreateWebhookConfiguration::route('/create'), + 'view' => ViewWebhookConfiguration::route('/{record}'), + 'edit' => EditWebhookConfiguration::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Admin/Widgets/CanaryWidget.php b/app/Filament/Admin/Widgets/CanaryWidget.php new file mode 100644 index 0000000000..d73bc01718 --- /dev/null +++ b/app/Filament/Admin/Widgets/CanaryWidget.php @@ -0,0 +1,50 @@ +components([ + Section::make(trans('admin/dashboard.sections.intro-developers.heading')) + ->icon(TablerIcon::Code) + ->iconColor('primary') + ->collapsible() + ->collapsed() + ->persistCollapsed() + ->schema([ + TextEntry::make('info') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-developers.content')), + TextEntry::make('extra') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-developers.extra_note')), + ]) + ->headerActions([ + Action::make('db_issues') + ->label(trans('admin/dashboard.sections.intro-developers.button_issues')) + ->icon(TablerIcon::BrandGithub) + ->url('https://github.com/pelican-dev/panel/issues', true), + ]), + ]); + } +} diff --git a/app/Filament/Admin/Widgets/DiscordPreview.php b/app/Filament/Admin/Widgets/DiscordPreview.php new file mode 100644 index 0000000000..2981c08ea8 --- /dev/null +++ b/app/Filament/Admin/Widgets/DiscordPreview.php @@ -0,0 +1,163 @@ + */ + protected $listeners = [ + 'refresh-widget' => '$refresh', + ]; + + protected static bool $isDiscovered = false; // Without this its shown on every Admin Pages + + protected int|string|array $columnSpan = 1; + + public ?WebhookConfiguration $record = null; + + /** @var string|array|null */ + public string|array|null $payload = null; + + /** + * @return array{ + * link: callable, + * content: mixed, + * sender: array{name: string, avatar: string}, + * embeds: array, + * getTime: mixed + * } + */ + public function getViewData(): array + { + if (!$this->record || !$this->record->payload) { + return [ + 'link' => fn ($href, $child) => $href ? "$child" : $child, + 'content' => null, + 'sender' => [ + 'name' => 'Pelican', + 'avatar' => 'https://raw.githubusercontent.com/pelican-dev/panel/refs/heads/main/public/pelican.ico', + ], + 'embeds' => [], + 'getTime' => 'Today at ' . Carbon::now()->format('h:i A'), + ]; + } + + $data = $this->getWebhookSampleData(); + + if (is_string($this->record->payload)) { + $payload = $this->replaceVarsInStringPayload($this->record->payload, $data); + } else { + $payload = $this->replaceVarsInArrayPayload($this->record->payload, $data); + } + + $embeds = data_get($payload, 'embeds', []); + foreach ($embeds as &$embed) { + if (data_get($embed, 'has_timestamp')) { + unset($embed['has_timestamp']); + $embed['timestamp'] = 'Today at ' . Carbon::now()->format('h:i A'); + } + } + + return [ + 'link' => fn ($href, $child) => $href ? sprintf('%s', $href, $child) : $child, + 'content' => data_get($payload, 'content'), + 'sender' => [ + 'name' => data_get($payload, 'username', 'Pelican'), + 'avatar' => data_get($payload, 'avatar_url', 'https://raw.githubusercontent.com/pelican-dev/panel/refs/heads/main/public/pelican.ico'), + ], + 'embeds' => $embeds, + 'getTime' => 'Today at ' . Carbon::now()->format('h:i A'), + ]; + } + + /** + * @param array $data + */ + private function replaceVarsInStringPayload(?string $payload, array $data): ?string + { + if ($payload === null) { + return null; + } + + return preg_replace_callback('/{{\s*([\w\.]+)\s*}}/', fn ($m) => data_get($data, $m[1], $m[0]), + $payload + ); + } + + /** + * @param array|null $payload + * @param array $data + * @return array|null + */ + private function replaceVarsInArrayPayload(?array $payload, array $data): ?array + { + if ($payload === null) { + return null; + } + + foreach ($payload as $key => $value) { + if (is_string($value)) { + $payload[$key] = $this->replaceVarsInStringPayload($value, $data); + } elseif (is_array($value)) { + $payload[$key] = $this->replaceVarsInArrayPayload($value, $data); + } + } + + return $payload; + } + + /** + * @return array + */ + public function getWebhookSampleData(): array + { + return [ + 'event' => 'updated: server', + 'id' => 2, + 'external_id' => 10, + 'uuid' => '651fgbc1-dee6-4250-814e-10slda13f1e', + 'uuid_short' => '651fgbc1', + 'node_id' => 1, + 'name' => 'Example Server', + 'description' => 'This is an example server description.', + 'status' => 'running', + 'skip_scripts' => false, + 'owner_id' => 1, + 'memory' => 512, + 'swap' => 128, + 'disk' => 10240, + 'io' => 500, + 'cpu' => 500, + 'threads' => '1, 3, 5', + 'oom_killer' => false, + 'allocation_id' => 4, + 'egg_id' => 2, + 'startup' => 'This is a example startup command.', + 'image' => 'Image here', + 'allocation_limit' => 5, + 'database_limit' => 1, + 'backup_limit' => 3, + 'created_at' => '2025-03-17T15:20:32.000000Z', + 'updated_at' => '2025-05-12T17:53:12.000000Z', + 'installed_at' => '2025-04-27T21:06:01.000000Z', + 'docker_labels' => [], + 'allocation' => [ + 'id' => 4, + 'node_id' => 1, + 'ip' => '192.168.0.3', + 'ip_alias' => null, + 'port' => 25567, + 'server_id' => 2, + 'notes' => null, + 'created_at' => '2025-03-17T15:20:09.000000Z', + 'updated_at' => '2025-03-17T15:20:32.000000Z', + ], + ]; + } +} diff --git a/app/Filament/Admin/Widgets/FormWidget.php b/app/Filament/Admin/Widgets/FormWidget.php new file mode 100644 index 0000000000..fe73c7d35f --- /dev/null +++ b/app/Filament/Admin/Widgets/FormWidget.php @@ -0,0 +1,16 @@ +components([ + Section::make(trans('admin/dashboard.sections.intro-help.heading')) + ->icon(TablerIcon::QuestionMark) + ->iconColor('info') + ->collapsible() + ->persistCollapsed() + ->schema([ + TextEntry::make('info') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-help.content')), + ]) + ->headerActions([ + Action::make('db_docs') + ->label(trans('admin/dashboard.sections.intro-help.button_docs')) + ->icon(TablerIcon::Speedboat) + ->url('https://pelican.dev/docs', true), + ]), + ]); + } +} diff --git a/app/Filament/Admin/Widgets/NoNodesWidget.php b/app/Filament/Admin/Widgets/NoNodesWidget.php new file mode 100644 index 0000000000..3cd4588217 --- /dev/null +++ b/app/Filament/Admin/Widgets/NoNodesWidget.php @@ -0,0 +1,48 @@ +components([ + Section::make(trans('admin/dashboard.sections.intro-first-node.heading')) + ->icon(TablerIcon::Server2) + ->iconColor('primary') + ->collapsible() + ->persistCollapsed() + ->schema([ + TextEntry::make('info') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-first-node.content')), + ]) + ->headerActions([ + Action::make('db_create-node') + ->label(trans('admin/dashboard.sections.intro-first-node.button_label')) + ->icon(TablerIcon::Server2) + ->url(CreateNode::getUrl()), + ]), + ]); + } +} diff --git a/app/Filament/Admin/Widgets/SupportWidget.php b/app/Filament/Admin/Widgets/SupportWidget.php new file mode 100644 index 0000000000..1010aed66a --- /dev/null +++ b/app/Filament/Admin/Widgets/SupportWidget.php @@ -0,0 +1,45 @@ +components([ + Section::make(trans('admin/dashboard.sections.intro-support.heading')) + ->icon(TablerIcon::HeartFilled) + ->iconColor('danger') + ->collapsible() + ->persistCollapsed() + ->schema([ + TextEntry::make('info') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-support.content')), + TextEntry::make('extra') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-support.extra_note')), + ]) + ->headerActions([ + Action::make('db_donate') + ->label(trans('admin/dashboard.sections.intro-support.button_donate')) + ->icon(TablerIcon::Cash) + ->url('https://pelican.dev/donate', true) + ->color('success'), + ]), + ]); + } +} diff --git a/app/Filament/Admin/Widgets/UpdateWidget.php b/app/Filament/Admin/Widgets/UpdateWidget.php new file mode 100644 index 0000000000..181de8d364 --- /dev/null +++ b/app/Filament/Admin/Widgets/UpdateWidget.php @@ -0,0 +1,69 @@ +softwareVersionService = $softwareVersionService; + } + + /** + * @throws Exception + */ + public function form(Schema $schema): Schema + { + $isLatest = $this->softwareVersionService->isLatestPanel(); + + return $schema + ->components([ + $isLatest + ? Section::make(trans('admin/dashboard.sections.intro-no-update.heading')) + ->icon(TablerIcon::Checkbox) + ->iconColor('success') + ->schema([ + TextEntry::make('info') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-no-update.content', ['version' => $this->softwareVersionService->currentPanelVersion()])), + ]) + : Section::make(trans('admin/dashboard.sections.intro-update-available.heading')) + ->icon(TablerIcon::InfoCircle) + ->iconColor('warning') + ->schema([ + TextEntry::make('info') + ->hiddenLabel() + ->state(trans('admin/dashboard.sections.intro-update-available.content', ['latestVersion' => $this->softwareVersionService->latestPanelVersion()])), + Section::make(trans('admin/dashboard.sections.intro-update-available.button_changelog')) + ->icon(TablerIcon::Script) + ->collapsible() + ->collapsed() + ->schema([ + TextEntry::make('changelog') + ->hiddenLabel() + ->state($this->softwareVersionService->latestPanelVersionChangelog()) + ->markdown(), + ]), + ]) + ->headerActions([ + Action::make('db_update') + ->label(trans('admin/dashboard.sections.intro-update-available.heading')) + ->icon(TablerIcon::ClipboardText) + ->url('https://pelican.dev/docs/panel/update', true) + ->color('warning'), + ]), + ]); + } +} diff --git a/app/Filament/App/Resources/Servers/Pages/ListServers.php b/app/Filament/App/Resources/Servers/Pages/ListServers.php new file mode 100644 index 0000000000..a5854ba6ae --- /dev/null +++ b/app/Filament/App/Resources/Servers/Pages/ListServers.php @@ -0,0 +1,280 @@ +daemonServerRepository = new DaemonServerRepository(); + } + + /** @return Stack[] + */ + protected function gridColumns(): array + { + return [ + Stack::make([ + ServerEntryColumn::make('server_entry') + ->warningThresholdPercent(static::WARNING_THRESHOLD) + ->dangerThresholdPercent(static::DANGER_THRESHOLD) + ->searchable(['name']), + ]), + ]; + } + + /** @return Column[] */ + protected function tableColumns(): array + { + return [ + ImageColumn::make('icon') + ->label('') + ->imageSize(46) + ->state(fn (Server $server) => $server->icon ?: $server->egg->image), + TextColumn::make('condition') + ->label(trans('server/dashboard.status')) + ->badge() + ->tooltip(fn (Server $server) => $server->formatResource(ServerResourceType::Uptime, 2)) + ->icon(fn (Server $server) => $server->condition->getIcon()) + ->color(fn (Server $server) => $server->condition->getColor()), + TextColumn::make('name') + ->label(trans('server/dashboard.title')) + ->description(fn (Server $server) => $server->description) + ->grow() + ->searchable(), + TextColumn::make('allocation.address') + ->label('') + ->badge() + ->visibleFrom('md') + ->copyable() + ->state(fn (Server $server) => $server->allocation->address ?? 'None'), + ProgressBarColumn::make('cpuUsage') + ->label('') + ->warningThresholdPercent(static::WARNING_THRESHOLD) + ->dangerThresholdPercent(static::DANGER_THRESHOLD) + ->maxValue(fn (Server $server) => ServerResourceType::CPULimit->getResourceAmount($server) === 0 ? (($server->node->systemInformation()['cpu_count'] ?? 0) * 100) : ServerResourceType::CPULimit->getResourceAmount($server)) + ->state(fn (Server $server) => $server->retrieveResources()['cpu_absolute'] ?? 0) + ->helperLabel(fn (Server $server) => $server->formatResource(ServerResourceType::CPU, 0) . ' / ' . $server->formatResource(ServerResourceType::CPULimit, 0)), + ProgressBarColumn::make('memoryUsage') + ->label('') + ->warningThresholdPercent(static::WARNING_THRESHOLD) + ->dangerThresholdPercent(static::DANGER_THRESHOLD) + ->maxValue(fn (Server $server) => ServerResourceType::MemoryLimit->getResourceAmount($server) === 0 ? $server->node->statistics()['memory_total'] : ServerResourceType::MemoryLimit->getResourceAmount($server)) + ->state(fn (Server $server) => $server->retrieveResources()['memory_bytes'] ?? 0) + ->helperLabel(fn (Server $server) => $server->formatResource(ServerResourceType::Memory) . ' / ' . $server->formatResource(ServerResourceType::MemoryLimit)), + ProgressBarColumn::make('diskUsage') + ->label('') + ->warningThresholdPercent(static::WARNING_THRESHOLD) + ->dangerThresholdPercent(static::DANGER_THRESHOLD) + ->maxValue(fn (Server $server) => ServerResourceType::DiskLimit->getResourceAmount($server) === 0 ? $server->node->statistics()['disk_total'] : ServerResourceType::DiskLimit->getResourceAmount($server)) + ->state(fn (Server $server) => $server->retrieveResources()['disk_bytes'] ?? 0) + ->helperLabel(fn (Server $server) => $server->formatResource(ServerResourceType::Disk) . ' / ' . $server->formatResource(ServerResourceType::DiskLimit)), + ]; + } + + public function table(Table $table): Table + { + $baseQuery = user()?->accessibleServers(); + + $usingGrid = user()?->getCustomization(CustomizationKey::DashboardLayout) === 'grid'; + + return $table + ->paginated($usingGrid ? [10, 20, 30, 40] : [10, 20, 50, 100]) + ->defaultPaginationPageOption($usingGrid ? 10 : 20) + ->query(fn () => $baseQuery) + ->poll('15s') + ->columns($usingGrid ? $this->gridColumns() : $this->tableColumns()) + ->recordUrl(!$usingGrid ? (fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)) : null) + ->recordActions(!$usingGrid ? static::getPowerActionGroup() : []) + ->recordActionsAlignment(Alignment::Center->value) + ->contentGrid($usingGrid ? ['default' => 1, 'md' => 2] : null) + ->emptyStateIcon(TablerIcon::BrandDocker) + ->emptyStateDescription('') + ->emptyStateHeading(fn () => $this->activeTab === 'my' ? 'You don\'t own any servers!' : 'You don\'t have access to any servers!') + ->persistFiltersInSession() + ->filters([ + SelectFilter::make('egg') + ->relationship('egg', 'name', fn (Builder $query) => $query->whereIn('id', $baseQuery->pluck('egg_id'))) + ->searchable() + ->preload(), + SelectFilter::make('owner') + ->relationship('user', 'username', fn (Builder $query) => $query->whereIn('id', $baseQuery->pluck('owner_id'))) + ->searchable() + ->hidden(fn () => $this->activeTab === 'my') + ->preload(), + ]); + } + + public function updatedActiveTab(): void + { + $this->resetTable(); + } + + public function getTabs(): array + { + $all = user()?->accessibleServers(); + $my = (clone $all)->where('owner_id', user()?->id); + $other = (clone $all)->whereNot('owner_id', user()?->id); + + return [ + 'my' => Tab::make('my') + ->label(trans('server/dashboard.tabs.my')) + ->badge(fn () => $my->count()) + ->modifyQueryUsing(fn () => $my), + + 'other' => Tab::make('other') + ->label(trans('server/dashboard.tabs.other')) + ->badge(fn () => $other->count()) + ->modifyQueryUsing(fn () => $other), + + 'all' => Tab::make('all') + ->label(trans('server/dashboard.tabs.all')) + ->badge($all->count()), + ]; + } + + protected function getResourceColor(Server $server, string $resource): ?string + { + $current = null; + $limit = null; + + switch ($resource) { + case 'cpu': + $current = $server->retrieveResources()['cpu_absolute'] ?? 0; + $limit = $server->cpu; + if ($server->cpu === 0) { + return null; + } + break; + case 'memory': + $current = $server->retrieveResources()['memory_bytes'] ?? 0; + $limit = $server->memory * 2 ** 20; + if ($server->memory === 0) { + return null; + } + break; + case 'disk': + $current = $server->retrieveResources()['disk_bytes'] ?? 0; + $limit = $server->disk * 2 ** 20; + if ($server->disk === 0) { + return null; + } + break; + default: + return null; + } + + if ($current >= $limit * self::DANGER_THRESHOLD) { + return 'danger'; + } + + if ($current >= $limit * self::WARNING_THRESHOLD) { + return 'warning'; + } + + return null; + } + + #[On('powerAction')] + public function powerAction(Server $server, string $action): void + { + try { + $this->daemonServerRepository->setServer($server)->power($action); + + Notification::make() + ->title(trans('server/dashboard.power_actions')) + ->body(trans('server/dashboard.power_action_sent', ['action' => $action, 'name' => $server->name])) + ->success() + ->send(); + + cache()->forget("servers.$server->uuid.status"); + + $this->redirect(self::getUrl(['tab' => $this->activeTab])); + } catch (ConnectionException) { + Notification::make() + ->title(trans('exceptions.node.error_connecting', ['node' => $server->node->name])) + ->danger() + ->send(); + } + } + + public static function getPowerActionGroup(): ActionGroup + { + return ActionGroup::make([ + Action::make('start') + ->label(trans('server/console.power_actions.start')) + ->color('primary') + ->icon(TablerIcon::PlayerPlayFilled) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStart, $server)) + ->visible(fn (Server $server) => $server->retrieveStatus()->isStartable()) + ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'start']), + Action::make('restart') + ->label(trans('server/console.power_actions.restart')) + ->color('gray') + ->icon(TablerIcon::Reload) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlRestart, $server)) + ->visible(fn (Server $server) => $server->retrieveStatus()->isRestartable()) + ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'restart']), + Action::make('stop') + ->label(trans('server/console.power_actions.stop')) + ->color('danger') + ->icon(TablerIcon::PlayerStopFilled) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) + ->visible(fn (Server $server) => $server->retrieveStatus()->isStoppable() && !$server->retrieveStatus()->isKillable()) + ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'stop']), + Action::make('kill') + ->label(trans('server/console.power_actions.kill')) + ->color('danger') + ->icon(TablerIcon::AlertSquare) + ->tooltip(trans('server/console.power_actions.kill_tooltip')) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) + ->visible(fn (Server $server) => $server->retrieveStatus()->isKillable()) + ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'kill']), + ]) + ->icon(TablerIcon::Power) + ->color('primary') + ->tooltip(trans('server/dashboard.power_actions')) + ->hidden(fn (Server $server) => $server->isInConflictState()) + ->iconSize(IconSize::Large); + } +} diff --git a/app/Filament/App/Resources/Servers/ServerResource.php b/app/Filament/App/Resources/Servers/ServerResource.php new file mode 100644 index 0000000000..f82a0906f3 --- /dev/null +++ b/app/Filament/App/Resources/Servers/ServerResource.php @@ -0,0 +1,43 @@ +directAccessibleServers()->where('owner_id', user()?->id)->count(); + } + + public static function canAccess(): bool + { + return true; + } + + public static function getPages(): array + { + return [ + 'index' => ListServers::route('/'), + ]; + } + + public static function embedServerList(bool $condition = true): void + { + static::$slug = $condition ? null : '/'; + static::$shouldRegisterNavigation = $condition; + } +} diff --git a/app/Filament/Components/Actions/DeleteServerIcon.php b/app/Filament/Components/Actions/DeleteServerIcon.php new file mode 100644 index 0000000000..d2d1e83982 --- /dev/null +++ b/app/Filament/Components/Actions/DeleteServerIcon.php @@ -0,0 +1,48 @@ +visible(fn ($record) => $record->icon); + + $this->hiddenLabel(); + + $this->tooltip(trans('admin/server.import_image')); + + $this->icon(TablerIcon::Trash); + + $this->color('danger'); + + $this->action(function ($record) { + foreach (array_keys(Server::IMAGE_FORMATS) as $ext) { + $path = Server::ICON_STORAGE_PATH . "/$record->uuid.$ext"; + if (Storage::disk('public')->exists($path)) { + Storage::disk('public')->delete($path); + } + } + + Notification::make() + ->title(trans('server/setting.server_info.icon.deleted')) + ->success() + ->send(); + + $record->refresh(); + }); + } +} diff --git a/app/Filament/Components/Actions/ExportEggAction.php b/app/Filament/Components/Actions/ExportEggAction.php new file mode 100644 index 0000000000..94d5e84595 --- /dev/null +++ b/app/Filament/Components/Actions/ExportEggAction.php @@ -0,0 +1,54 @@ +tooltip(trans('filament-actions::export.modal.actions.export.label')); + + $this->icon(TablerIcon::Download); + + $this->tableIcon(TablerIcon::Download); + + $this->authorize(fn () => user()?->can('export egg')); + + $this->modalHeading(fn (Egg $egg) => trans('filament-actions::export.modal.actions.export.label') . ' ' . $egg->name); + + $this->modalIcon($this->icon); + + $this->schema([ + TextEntry::make('label') + ->hiddenLabel() + ->state(fn (Egg $egg) => trans('admin/egg.export.modal', ['egg' => $egg->name])), + ]); + + $this->modalFooterActionsAlignment(Alignment::Center); + + $this->modalFooterActions([ + Action::make('exclude_json') + ->label(trans('admin/egg.export.as', ['format' => 'json'])) + ->url(fn (Egg $egg) => route('api.application.eggs.eggs.export', ['egg' => $egg, 'format' => EggFormat::JSON->value]), true) + ->close(), + Action::make('exclude_yaml') + ->label(trans('admin/egg.export.as', ['format' => 'yaml'])) + ->url(fn (Egg $egg) => route('api.application.eggs.eggs.export', ['egg' => $egg, 'format' => EggFormat::YAML->value]), true) + ->close(), + ]); + } +} diff --git a/app/Filament/Components/Actions/ExportScheduleAction.php b/app/Filament/Components/Actions/ExportScheduleAction.php new file mode 100644 index 0000000000..1e46b666cb --- /dev/null +++ b/app/Filament/Components/Actions/ExportScheduleAction.php @@ -0,0 +1,43 @@ +hiddenLabel(); + + $this->icon(TablerIcon::Download); + + $this->tooltip(trans('server/schedule.export')); + + /** @var Server $server */ + $server = Filament::getTenant(); + + $this->label(trans('filament-actions::export.modal.actions.export.label')); + + $this->authorize(fn () => user()?->can(SubuserPermission::ScheduleRead, $server)); + + $this->action(fn (ScheduleExporterService $service, Schedule $schedule) => response()->streamDownload(function () use ($service, $schedule) { + echo $service->handle($schedule); + }, 'schedule-' . str($schedule->name)->kebab()->lower()->trim() . '.json', [ + 'Content-Type' => 'application/json', + ])); + } +} diff --git a/app/Filament/Components/Actions/ImportEggAction.php b/app/Filament/Components/Actions/ImportEggAction.php new file mode 100644 index 0000000000..e8afc3ce86 --- /dev/null +++ b/app/Filament/Components/Actions/ImportEggAction.php @@ -0,0 +1,225 @@ +tooltip(trans('filament-actions::import.modal.actions.import.label')); + + $this->hiddenLabel(); + + $this->icon(TablerIcon::FileImport); + + $this->modalWidth(Width::ScreenExtraLarge); + + $this->authorize(fn () => user()?->can('import egg')); + + $this->action(function (array $data, EggImporterService $eggImportService): void { + + $gitHubEggs = array_get($this->data, 'eggs', []); + $eggs = array_merge(collect($data['urls'])->flatten()->whereNotNull()->unique()->all(), Arr::wrap($data['files'])); + + if ($gitHubEggs) { + foreach ($gitHubEggs as $category => $sortedEggs) { + foreach ($sortedEggs as $downloadUrl) { + InstallEgg::dispatch($downloadUrl); + } + } + + Notification::make() + ->title(trans('installer.egg.background_install_started')) + ->body(trans('installer.egg.background_install_description', ['count' => array_sum(array_map('count', $gitHubEggs))])) + ->success() + ->persistent() + ->send(); + + } + + if (empty($eggs)) { + return; + } + + [$success, $failed] = [collect(), collect()]; + + foreach ($eggs as $egg) { + if ($egg instanceof TemporaryUploadedFile) { + $originalName = $egg->getClientOriginalName(); + $filename = str($originalName)->afterLast('egg-'); + $ext = str($originalName)->afterLast('.')->lower()->toString(); + + $name = match ($ext) { + 'json' => $filename->before('.json')->headline(), + 'yaml' => $filename->before('.yaml')->headline(), + 'yml' => $filename->before('.yml')->headline(), + default => $filename->headline(), + }; + $method = 'fromFile'; + } else { + $egg = str($egg); + $egg = $egg->contains('github.com') ? $egg->replaceFirst('blob', 'raw') : $egg; + $method = 'fromUrl'; + + $filename = $egg->afterLast('/egg-'); + $ext = $filename->afterLast('.')->lower()->toString(); + + $name = match ($ext) { + 'json' => $filename->before('.json')->headline(), + 'yaml' => $filename->before('.yaml')->headline(), + 'yml' => $filename->before('.yml')->headline(), + default => $filename->headline(), + }; + } + try { + $eggImportService->$method($egg); + $success->push($name); + } catch (Exception $exception) { + $failed->push($name); + report($exception); + } + } + + $bodyParts = collect([ + $success->isNotEmpty() ? trans('admin/egg.import.imported_eggs', ['eggs' => $success->join(', ')]) : null, + $failed->isNotEmpty() ? trans('admin/egg.import.failed_import_eggs', ['eggs' => $failed->join(', ')]) : null, + ])->filter(); + + if ($bodyParts->isNotEmpty()) { + Notification::make() + ->title(trans('admin/egg.import.import_result', [ + 'success' => $success->count(), + 'failed' => $failed->count(), + 'total' => $success->count() + $failed->count(), + ])) + ->body($bodyParts->join(' | ')) + ->status($failed->isEmpty() ? 'success' : ($success->isEmpty() ? 'danger' : 'warning')) + ->send(); + } + }); + } + + public function multiple(bool|Closure $condition = true): static + { + $isMultiple = (bool) $this->evaluate($condition); + $this->schema([ + Tabs::make('Tabs') + ->contained(false) + ->tabs([ + $this->importEggsFromGitHub(), + Tab::make('file') + ->label(trans('admin/egg.import.file')) + ->icon(TablerIcon::FileUpload) + ->schema([ + FileUpload::make('files') + ->label(trans('admin/egg.model_label')) + ->hint(trans('admin/egg.import.egg_help')) + ->acceptedFileTypes(['application/json', 'application/x-yaml', 'text/yaml', '.yaml', '.yml']) + ->preserveFilenames() + ->previewable(false) + ->storeFiles(false) + ->multiple($isMultiple), + ]), + Tab::make('url') + ->label(trans('admin/egg.import.url')) + ->icon(TablerIcon::WorldUpload) + ->schema([ + Repeater::make('urls') + ->hiddenLabel() + ->itemLabel(fn (array $state) => str($state['url'])->afterLast('/egg-')->beforeLast('.')->headline()) + ->hint(trans('admin/egg.import.url_help')) + ->addActionLabel(trans('admin/egg.import.add_url')) + ->grid($isMultiple ? 2 : null) + ->reorderable(false) + ->addable($isMultiple) + ->deletable(fn (array $state) => count($state) > 1) + ->schema([ + TextInput::make('url') + ->default(fn (?Egg $egg) => $egg->update_url ?? '') + ->live() + ->label(trans('admin/egg.import.url')) + ->placeholder('https://github.com/pelican-eggs/generic/blob/main/nodejs/egg-node-js-generic.json') + ->url() + ->endsWith(['.json', '.yaml', '.yml']) + ->validationAttribute(trans('admin/egg.import.url')), + ]), + ]), + ]), + ]); + + return $this; + } + + public function importEggsFromGitHub(): Tab + { + if (!cache()->get('eggs.index')) { + Artisan::call(UpdateEggIndexCommand::class); + } + + $eggs = cache()->get('eggs.index', []); + $categories = array_keys($eggs); + $tabs = array_map(function (string $label) use ($eggs) { + $id = str_slug($label, '_'); + $eggCount = count($eggs[$label]); + + return Tab::make($id) + ->label($label) + ->badge($eggCount) + ->schema([ + CheckboxList::make("eggs.$id") + ->hiddenLabel() + ->options(fn () => array_sort($eggs[$label])) + ->searchable($eggCount > 0) + ->bulkToggleable($eggCount > 0) + ->columns(4), + ]); + }, $categories); + + if (empty($tabs)) { + $tabs[] = Tab::make('no_eggs') + ->label(trans('installer.egg.no_eggs')) + ->schema([ + TextEntry::make('no_eggs') + ->hiddenLabel() + ->state(trans('installer.egg.exceptions.no_eggs')), + ]); + } + + return Tab::make('github') + ->label(trans('admin/egg.import.github')) + ->icon(TablerIcon::BrandGithub) + ->columnSpanFull() + ->schema([ + Tabs::make('egg_tabs') + ->tabs($tabs), + ]); + } +} diff --git a/app/Filament/Components/Actions/ImportScheduleAction.php b/app/Filament/Components/Actions/ImportScheduleAction.php new file mode 100644 index 0000000000..82380fe9fe --- /dev/null +++ b/app/Filament/Components/Actions/ImportScheduleAction.php @@ -0,0 +1,124 @@ +label(trans('filament-actions::import.modal.actions.import.label')); + + $this->authorize(fn () => user()?->can(SubuserPermission::ScheduleCreate, $server)); + + $this->schema([ + Tabs::make('Tabs') + ->contained(false) + ->tabs([ + Tab::make('file') + ->label(trans('server/schedule.import_action.file')) + ->icon(TablerIcon::FileUpload) + ->schema([ + FileUpload::make('files') + ->hiddenLabel() + ->hint(trans('server/schedule.import_action.schedule_help')) + ->acceptedFileTypes(['application/json']) + ->preserveFilenames() + ->previewable(false) + ->storeFiles(false) + ->multiple(true), + ]), + Tab::make('url') + ->label(trans('server/schedule.import_action.url')) + ->icon(TablerIcon::WorldUpload) + ->schema([ + Repeater::make('urls') + ->hiddenLabel() + ->itemLabel(fn (array $state) => str($state['url'])->afterLast('/schedule-')->before('.json')->headline()) + ->hint(trans('server/schedule.import_action.url_help')) + ->addActionLabel(trans('server/schedule.import_action.add_url')) + ->grid(2) + ->reorderable(false) + ->addable(true) + ->deletable(fn (array $state) => count($state) > 1) + ->schema([ + TextInput::make('url') + ->live() + ->label(trans('server/schedule.import_action.url')) + ->url() + ->endsWith('.json') + ->validationAttribute(trans('server/schedule.import_action.url')), + ]), + ]), + ]), + ]); + + $this->action(function (array $data, ScheduleImporterService $service) use ($server) { + $schedules = array_merge(collect($data['urls'])->flatten()->whereNotNull()->unique()->all(), Arr::wrap($data['files'])); + if (empty($schedules)) { + return; + } + + [$success, $failed] = [collect(), collect()]; + + foreach ($schedules as $schedule) { + if ($schedule instanceof TemporaryUploadedFile) { + $name = str($schedule->getClientOriginalName())->afterLast('schedule-')->before('.json')->headline(); + $method = 'fromFile'; + } else { + $schedule = str($schedule); + $schedule = $schedule->contains('github.com') ? $schedule->replaceFirst('blob', 'raw') : $schedule; + $name = $schedule->afterLast('/schedule-')->before('.json')->headline(); + $method = 'fromUrl'; + } + try { + $service->$method($schedule, $server); + $success->push($name); + } catch (Exception $exception) { + $failed->push($name); + report($exception); + } + } + + if ($failed->count() > 0) { + Notification::make() + ->title(trans('server/schedule.import_action.import_failed')) + ->body($failed->join(', ')) + ->danger() + ->send(); + } + if ($success->count() > 0) { + Notification::make() + ->title(trans('server/schedule.import_action.import_success')) + ->body($success->join(', ')) + ->success() + ->send(); + } + }); + } +} diff --git a/app/Filament/Components/Actions/PreviewStartupAction.php b/app/Filament/Components/Actions/PreviewStartupAction.php new file mode 100644 index 0000000000..fde287b007 --- /dev/null +++ b/app/Filament/Components/Actions/PreviewStartupAction.php @@ -0,0 +1,31 @@ +label(fn (Get $get) => $get('previewing') ? trans('server/startup.disable_preview') : trans('server/startup.enable_preview')); + + $this->action(function (Get $get, Set $set, Server $server) { + $previewing = !$get('previewing'); + + $set('previewing', $previewing); + $set('startup', !$previewing ? $server->startup : fn (Server $server, StartupCommandService $service) => $service->handle($server, $server->startup)); + }); + } +} diff --git a/app/Filament/Components/Actions/RotateDatabasePasswordAction.php b/app/Filament/Components/Actions/RotateDatabasePasswordAction.php new file mode 100644 index 0000000000..db738a13ce --- /dev/null +++ b/app/Filament/Components/Actions/RotateDatabasePasswordAction.php @@ -0,0 +1,70 @@ +hiddenLabel(); + + $this->tooltip(trans('admin/databasehost.rotate')); + + $this->icon(TablerIcon::Refresh); + + $this->authorize(fn (Database $database) => user()?->can('update', $database)); + + $this->modalHeading(trans('admin/databasehost.rotate_password')); + + $this->modalIconColor('warning'); + + $this->modalSubmitAction(fn (Action $action) => $action->color('warning')); + + $this->requiresConfirmation(); + + $this->action(function (DatabaseManagementService $service, Database $database, Set $set) { + try { + $service->rotatePassword($database); + $database->refresh(); + + $set('password', $database->password); + $set('jdbc', $database->jdbc); + + Activity::event('server:database.rotate-password') + ->subject($database) + ->property('name', $database->database) + ->log(); + + Notification::make() + ->title(trans('admin/databasehost.rotated')) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/databasehost.rotate_error')) + ->body(fn () => user()?->canAccessPanel(Filament::getPanel('admin')) ? $exception->getMessage() : null) + ->danger() + ->send(); + + report($exception); + } + }); + } +} diff --git a/app/Filament/Components/Actions/UpdateEggAction.php b/app/Filament/Components/Actions/UpdateEggAction.php new file mode 100644 index 0000000000..3f5793a610 --- /dev/null +++ b/app/Filament/Components/Actions/UpdateEggAction.php @@ -0,0 +1,67 @@ +tooltip(trans_choice('admin/egg.update', 1)); + + $this->icon(TablerIcon::CloudDownload); + + $this->color('success'); + + $this->requiresConfirmation(); + + $this->modalHeading(trans_choice('admin/egg.update_question', 1)); + + $this->modalDescription(trans_choice('admin/egg.update_description', 1)); + + $this->modalIconColor('danger'); + + $this->modalSubmitAction(fn (Action $action) => $action->color('danger')); + + $this->action(function (Egg $egg, EggImporterService $eggImporterService) { + try { + $eggImporterService->fromUrl($egg->update_url, $egg); + + cache()->forget("eggs.$egg->uuid.update"); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/egg.update_failed', ['egg' => $egg->name])) + ->body(trans('admin/egg.update_error', ['error' => $exception->getMessage()])) + ->danger() + ->send(); + + report($exception); + + return; + } + + Notification::make() + ->title(trans('admin/egg.update_success', ['egg' => $egg->name])) + ->body(trans('admin/egg.updated_from', ['url' => $egg->update_url])) + ->success() + ->send(); + }); + + $this->authorize(fn () => user()?->can('import egg')); + + $this->visible(fn (Egg $egg) => cache()->get("eggs.$egg->uuid.update", false)); + } +} diff --git a/app/Filament/Components/Actions/UpdateEggBulkAction.php b/app/Filament/Components/Actions/UpdateEggBulkAction.php new file mode 100644 index 0000000000..702300f9d6 --- /dev/null +++ b/app/Filament/Components/Actions/UpdateEggBulkAction.php @@ -0,0 +1,93 @@ +label(trans_choice('admin/egg.update', 2)); + + $this->icon(TablerIcon::CloudDownload); + + $this->color('success'); + + $this->requiresConfirmation(); + + $this->modalHeading(trans_choice('admin/egg.update_question', 2)); + + $this->modalDescription(trans_choice('admin/egg.update_description', 2)); + + $this->modalIconColor('danger'); + + $this->modalSubmitAction(fn (Action $action) => $action->color('danger')); + + $this->action(function (Collection $records, EggImporterService $eggImporterService) { + if ($records->count() === 0) { + Notification::make() + ->title(trans('admin/egg.no_updates')) + ->warning() + ->send(); + + return; + } + + $successEggs = collect(); + $failedEggs = collect(); + $skippedEggs = collect(); + + /** @var Egg $egg */ + foreach ($records as $egg) { + if ($egg->update_url === null) { + $skippedEggs->push($egg->name); + + continue; + } + try { + $eggImporterService->fromUrl($egg->update_url, $egg); + + $successEggs->push($egg->name); + + cache()->forget("eggs.$egg->uuid.update"); + } catch (Exception $exception) { + $failedEggs->push($egg->name); + + report($exception); + } + } + + $bodyParts = collect([ + $successEggs->isNotEmpty() ? trans('admin/egg.updated_eggs', ['eggs' => $successEggs->join(', ')]) : null, + $failedEggs->isNotEmpty() ? trans('admin/egg.failed_eggs', ['eggs' => $failedEggs->join(', ')]) : null, + $skippedEggs->isNotEmpty() ? trans('admin/egg.skipped_eggs', ['eggs' => $skippedEggs->join(', ')]) : null, + ])->filter(); + + Notification::make() + ->title(trans_choice('admin/egg.updated', 2, ['count' => $successEggs->count(), 'total' => $records->count()])) + ->body($bodyParts->join(' | ')) + ->status($failedEggs->isNotEmpty() ? 'warning' : 'success') + ->persistent() + ->send(); + }); + + $this->authorize(fn () => user()?->can('import egg')); + + $this->deselectRecordsAfterCompletion(); + } +} diff --git a/app/Filament/Components/Actions/UpdateNodeAllocations.php b/app/Filament/Components/Actions/UpdateNodeAllocations.php new file mode 100644 index 0000000000..91459f5f48 --- /dev/null +++ b/app/Filament/Components/Actions/UpdateNodeAllocations.php @@ -0,0 +1,107 @@ +tooltip(trans('admin/node.bulk_update_ip')); + + $this->icon(TablerIcon::Replace); + + $this->color('warning'); + + $this->requiresConfirmation(); + + $this->modalHeading(trans('admin/node.bulk_update_ip')); + + $this->modalDescription(trans('admin/node.bulk_update_ip_description')); + + $this->modalIconColor('warning'); + + $this->modalSubmitActionLabel(trans('admin/node.update_ip')); + + $this->schema(function () { + /** @var Node $node */ + $node = $this->record; + + $currentIps = Allocation::where('node_id', $node->id) + ->pluck('ip') + ->unique() + ->values() + ->all(); + + return [ + Select::make('old_ip') + ->label(trans('admin/node.old_ip')) + ->options(array_combine($currentIps, $currentIps)) + ->selectablePlaceholder(false) + ->required() + ->live(), + Select::make('new_ip') + ->label(trans('admin/node.new_ip')) + ->options(fn () => array_combine($node->ipAddresses(), $node->ipAddresses()) ?: []) + ->required() + ->different('old_ip'), + ]; + }); + + $this->action(function (array $data) { + /** @var Node $node */ + $node = $this->record; + $allocations = Allocation::where('node_id', $node->id)->where('ip', $data['old_ip'])->get(); + + if ($allocations->count() === 0) { + Notification::make() + ->title(trans('admin/node.no_allocations_to_update')) + ->warning() + ->send(); + + return; + } + + $updated = 0; + $failed = 0; + + foreach ($allocations as $allocation) { + try { + $allocation->update(['ip' => $data['new_ip']]); + $updated++; + } catch (Exception $exception) { + $failed++; + report($exception); + } + } + + Notification::make() + ->title(trans('admin/node.ip_updated', ['count' => $updated, 'total' => $allocations->count()])) + ->body($failed > 0 ? trans('admin/node.ip_update_failed', ['count' => $failed]) : null) + ->status($failed > 0 ? 'warning' : 'success') + ->persistent() + ->send(); + }); + } + + public function nodeRecord(Node $node): static + { + $this->record = $node; + + return $this; + } +} diff --git a/app/Filament/Components/Forms/Actions/CronPresetAction.php b/app/Filament/Components/Forms/Actions/CronPresetAction.php new file mode 100644 index 0000000000..1884f1265d --- /dev/null +++ b/app/Filament/Components/Forms/Actions/CronPresetAction.php @@ -0,0 +1,53 @@ +disabled(fn (string $operation) => $operation === 'view'); + + $this->color(fn (Get $get) => $get('cron_minute') == $this->minute && + $get('cron_hour') == $this->hour && + $get('cron_day_of_month') == $this->dayOfMonth && + $get('cron_month') == $this->month && + $get('cron_day_of_week') == $this->dayOfWeek + ? 'success' : 'primary'); + + $this->action(function (Set $set) { + $set('cron_minute', $this->minute); + $set('cron_hour', $this->hour); + $set('cron_day_of_month', $this->dayOfMonth); + $set('cron_month', $this->month); + $set('cron_day_of_week', $this->dayOfWeek); + }); + } + + public function cron(string $minute, string $hour, string $dayOfMonth, string $month, string $dayOfWeek): static + { + $this->minute = $minute; + $this->hour = $hour; + $this->dayOfMonth = $dayOfMonth; + $this->month = $month; + $this->dayOfWeek = $dayOfWeek; + + return $this; + } +} diff --git a/app/Filament/Components/Forms/Fields/CopyFrom.php b/app/Filament/Components/Forms/Fields/CopyFrom.php new file mode 100644 index 0000000000..cc3aa6215b --- /dev/null +++ b/app/Filament/Components/Forms/Fields/CopyFrom.php @@ -0,0 +1,73 @@ +label(trans('admin/egg.copy_from')); + + $this->placeholder(trans('admin/egg.none')); + + $this->preload(); + + $this->searchable(); + + $this->live(); + } + + public function process(): static + { + $this->helperText(trans('admin/egg.copy_from_help')); + + $this->relationship('configFrom', 'name', ignoreRecord: true); + + $this->afterStateUpdated(function ($state, Set $set) { + $set('copy_script_from', $state); + if ($state === null) { + $set('config_stop', ''); + $set('config_startup', '{}'); + $set('config_files', '{}'); + $set('config_logs', '{}'); + + return; + } + $egg = Egg::find($state); + $set('config_stop', $egg->config_stop); + $set('config_startup', $egg->config_startup); + $set('config_files', $egg->config_files); + $set('config_logs', $egg->config_logs); + }); + + return $this; + } + + public function script(): static + { + $this->relationship('scriptFrom', 'name', ignoreRecord: true); + + $this->afterStateUpdated(function ($state, Set $set, Component $livewire) { + if ($state === null) { + $set('script_container', 'ghcr.io/pelican-eggs/installers:debian'); + $set('script_entry', 'bash'); + $livewire->dispatch('setContent', content: ''); + + return; + } + $egg = Egg::find($state); + $set('script_container', $egg->script_container); + $set('script_entry', $egg->script_entry); + $livewire->dispatch('setContent', content: $egg->script_install); + }); + + return $this; + } +} diff --git a/app/Filament/Components/Forms/Fields/MonacoEditor.php b/app/Filament/Components/Forms/Fields/MonacoEditor.php new file mode 100644 index 0000000000..78ecb1ad6b --- /dev/null +++ b/app/Filament/Components/Forms/Fields/MonacoEditor.php @@ -0,0 +1,124 @@ +showLoader = config('monaco-editor.general.show-loader'); + $this->fontSize = config('monaco-editor.general.font-size'); + $this->lineNumbersMinChars = config('monaco-editor.general.line-numbers-min-chars'); + $this->automaticLayout = config('monaco-editor.general.automatic-layout'); + $this->theme = config('monaco-editor.general.default-theme'); + } + + public function editorTheme(): string + { + $theme = $this->evaluate($this->theme); + + if (!isset(config('monaco-editor.themes')[$theme])) { + throw new Exception("Theme {$theme} not found in config file."); + } + + return json_encode([ + 'base' => config("monaco-editor.themes.{$theme}.base"), + 'inherit' => config("monaco-editor.themes.{$theme}.inherit"), + 'rules' => config("monaco-editor.themes.{$theme}.rules"), + 'colors' => config("monaco-editor.themes.{$theme}.colors"), + ], JSON_THROW_ON_ERROR); + } + + public function language(EditorLanguages|Closure $lang = EditorLanguages::html): static + { + $this->language = $lang; + + return $this; + } + + public function showLoader(bool|Closure $condition = true): static + { + $this->showLoader = $condition; + + return $this; + } + + public function hideLoader(): static + { + $this->showLoader = false; + + return $this; + } + + public function fontSize(string|Closure $size = '15px'): static + { + $this->fontSize = $size; + + return $this; + } + + public function lineNumbersMinChars(int|Closure $value = 3): static + { + $this->lineNumbersMinChars = $value; + + return $this; + } + + public function automaticLayout(bool|Closure $condition = true): static + { + $this->automaticLayout = $condition; + + return $this; + } + + public function theme(string|Closure $name = 'blackboard'): static + { + $this->theme = $name; + + return $this; + } + + public function getLanguage(): EditorLanguages + { + return $this->evaluate($this->language); + } + + public function getShowLoader(): bool + { + return (bool) $this->evaluate($this->showLoader); + } + + public function getFontSize(): string + { + return $this->evaluate($this->fontSize); + } + + public function getLineNumbersMinChars(): int + { + return (int) $this->evaluate($this->lineNumbersMinChars); + } + + public function getAutomaticLayout(): bool + { + return (bool) $this->evaluate($this->automaticLayout); + } +} diff --git a/app/Filament/Components/Forms/Fields/StartupVariable.php b/app/Filament/Components/Forms/Fields/StartupVariable.php new file mode 100644 index 0000000000..6d277fa077 --- /dev/null +++ b/app/Filament/Components/Forms/Fields/StartupVariable.php @@ -0,0 +1,239 @@ +label(fn (StartupVariable $component) => $component->getVariableName()); + + $this->prefix(fn (StartupVariable $component) => '{{' . $component->getVariableEnv() . '}}'); + + $this->hintIcon(TablerIcon::Code, fn (StartupVariable $component) => implode('|', $component->getVariableRules())); + + $this->helperText(fn (StartupVariable $component) => !$component->getVariableDesc() ? '—' : $component->getVariableDesc()); + + $this->rules(fn (StartupVariable $component) => $component->getVariableRules()); + + $this->placeholder(fn (StartupVariable $component) => $component->getVariableDefault()); + + $this->live(onBlur: true); + } + + /** + * @return StateCast[] + */ + public function getDefaultStateCasts(): array + { + return match ($this->getType()) { + StartupVariableType::Number => [ + ...parent::getDefaultStateCasts(), + new NumberStateCast(false), + ], + StartupVariableType::Toggle => [ + ...parent::getDefaultStateCasts(), + new BooleanStateCast(false), + ], + default => parent::getDefaultStateCasts() + }; + } + + public function fromForm(): static + { + $this->variableName(fn (Get $get) => $get('name')); + $this->variableDesc(fn (Get $get) => $get('description')); + $this->variableEnv(fn (Get $get) => $get('env_variable')); + $this->variableDefault(fn (Get $get) => $get('default_value')); + $this->variableRules(fn (Get $get) => $get('rules')); + + $this->disabled(fn (Get $get) => !$get('user_editable')); + + return $this; + } + + public function fromRecord(): static + { + $this->variableName(fn (?ServerVariable $record) => $record?->variable->name); + $this->variableDesc(fn (?ServerVariable $record) => $record?->variable->description); + $this->variableEnv(fn (?ServerVariable $record) => $record?->variable->env_variable); + $this->variableDefault(fn (?ServerVariable $record) => $record?->variable->default_value); + $this->variableRules(fn (?ServerVariable $record) => $record?->variable->rules); + + $this->disabled(fn (?ServerVariable $record) => !$record?->variable->user_editable); + + return $this; + } + + public function variableName(string|Closure|null $name): static + { + $this->variableName = $name; + + return $this; + } + + public function variableDesc(string|Closure|null $desc): static + { + $this->variableDesc = $desc; + + return $this; + } + + public function variableEnv(string|Closure|null $envVariable): static + { + $this->variableEnv = $envVariable; + + return $this; + } + + public function variableDefault(string|Closure|null $default): static + { + $this->variableDefault = $default; + + return $this; + } + + /** @param string[]|Closure|null $rules */ + public function variableRules(array|Closure|null $rules): static + { + $this->variableRules = $rules; + + return $this; + } + + public function getVariableName(): ?string + { + return $this->evaluate($this->variableName); + } + + public function getVariableDesc(): ?string + { + return $this->evaluate($this->variableDesc); + } + + public function getVariableEnv(): ?string + { + return $this->evaluate($this->variableEnv); + } + + public function getVariableDefault(): ?string + { + return $this->evaluate($this->variableDefault); + } + + /** @return string[] */ + public function getVariableRules(): array + { + return (array) ($this->evaluate($this->variableRules) ?? []); + } + + public function isRequired(): bool + { + $rules = $this->getVariableRules(); + + return in_array('required', $rules); + } + + public function getMinValue(): ?int + { + $rules = $this->getVariableRules(); + + $minRule = Arr::first($rules, fn ($value) => str($value)->startsWith('min:')); + if ($minRule) { + return str($minRule) + ->after('min:') + ->trim() + ->toInteger(); + } + + return null; + } + + public function getMaxValue(): ?int + { + $rules = $this->getVariableRules(); + + $maxRule = Arr::first($rules, fn ($value) => str($value)->startsWith('max:')); + if ($maxRule) { + return str($maxRule) + ->after('max:') + ->trim() + ->toInteger(); + } + + return null; + } + + public function getType(): StartupVariableType + { + $rules = $this->getVariableRules(); + + if (Arr::first($rules, fn ($value) => str($value)->startsWith('in:'), false)) { + return StartupVariableType::Select; + } + + if (in_array('boolean', $rules)) { + return StartupVariableType::Toggle; + } + + if (in_array('numeric', $rules) || in_array('integer', $rules)) { + return StartupVariableType::Number; + } + + return StartupVariableType::Text; + } + + /** @return string[] */ + public function getSelectOptions(): array + { + $rules = $this->getVariableRules(); + + $inRule = Arr::first($rules, fn ($value) => str($value)->startsWith('in:')); + if ($inRule) { + return str($inRule) + ->after('in:') + ->explode(',') + ->each(fn ($value) => Str::trim($value)) + ->all(); + } + + return []; + } +} diff --git a/app/Filament/Components/StateCasts/ServerConditionStateCast.php b/app/Filament/Components/StateCasts/ServerConditionStateCast.php new file mode 100644 index 0000000000..5704b49f24 --- /dev/null +++ b/app/Filament/Components/StateCasts/ServerConditionStateCast.php @@ -0,0 +1,43 @@ +value; + } +} diff --git a/app/Filament/Components/Tables/Columns/BytesColumn.php b/app/Filament/Components/Tables/Columns/BytesColumn.php new file mode 100644 index 0000000000..64c7f9468a --- /dev/null +++ b/app/Filament/Components/Tables/Columns/BytesColumn.php @@ -0,0 +1,15 @@ +formatStateUsing(fn ($state) => $state ? convert_bytes_to_readable($state) : ''); + } +} diff --git a/app/Filament/Components/Tables/Columns/Concerns/HasProgress.php b/app/Filament/Components/Tables/Columns/Concerns/HasProgress.php new file mode 100644 index 0000000000..3494e3c63a --- /dev/null +++ b/app/Filament/Components/Tables/Columns/Concerns/HasProgress.php @@ -0,0 +1,136 @@ + $context = []) + */ +trait HasProgress +{ + protected float|Closure|null $warningThresholdPercent = null; + + protected float|Closure|null $dangerThresholdPercent = null; + + /** + * @var string|array|Closure|Color|null + */ + protected string|array|Closure|Color|null $dangerColor = null; + + /** + * @var string|array|Closure|Color|null + */ + protected string|array|Closure|Color|null $warningColor = null; + + /** + * @var string|array|Closure|Color|null + */ + protected string|array|Closure|Color|null $color = null; + + public function warningThresholdPercent(float|Closure $value): static + { + $this->warningThresholdPercent = $value; + + return $this; + } + + public function getWarningThresholdPercent(): ?float + { + return $this->evaluate($this->warningThresholdPercent); + } + + public function dangerThresholdPercent(float|Closure $value): static + { + $this->dangerThresholdPercent = $value; + + return $this; + } + + public function getDangerThresholdPercent(): ?float + { + return $this->evaluate($this->dangerThresholdPercent); + } + + /** + * @param string|array|Closure|Color $color + */ + public function dangerColor(string|array|Closure|Color $color): static + { + $this->dangerColor = $color; + + return $this; + } + + /** + * @return string|array|Color|null + */ + public function getDangerColor(): string|array|Color|null + { + return $this->evaluate($this->dangerColor); + } + + /** + * @param string|array|Closure|Color $color + */ + public function warningColor(string|array|Closure|Color $color): static + { + $this->warningColor = $color; + + return $this; + } + + /** + * @return string|array|Color|null + */ + public function getWarningColor(): string|array|Color|null + { + return $this->evaluate($this->warningColor); + } + + /** + * @param string|array|Closure|Color $color + */ + public function color(string|array|Closure|Color $color): static + { + $this->color = $color; + + return $this; + } + + /** + * @return string|array|Color|null + */ + public function getColor(): string|array|Color|null + { + return $this->evaluate($this->color); + } + + /** + * Resolve a progress color for a given status string ('danger','warning','success'). + * + * @return string|array|Color + */ + public function getProgressColorForStatus(string $status): string|array|Color + { + $color = match ($status) { + 'danger' => $this->getDangerColor(), + 'warning' => $this->getWarningColor(), + 'success' => $this->getColor(), + default => $this->getColor(), + }; + + if ($color === null) { + $color = $this->getColor(); + } + + if ($color === null) { + return 'gray'; + } + + return $color; + } +} diff --git a/app/Filament/Components/Tables/Columns/DateTimeColumn.php b/app/Filament/Components/Tables/Columns/DateTimeColumn.php new file mode 100644 index 0000000000..7895e652e2 --- /dev/null +++ b/app/Filament/Components/Tables/Columns/DateTimeColumn.php @@ -0,0 +1,29 @@ +dateTime(); + } + + public function since(string|Closure|null $timezone = null): static + { + $this->formatStateUsing(fn ($state) => $state->diffForHumans()); + $this->tooltip(fn ($state) => $state?->timezone($this->getTimezone())); + + return $this; + } + + public function getTimezone(): string + { + return user()->timezone ?? config('app.timezone', 'UTC'); + } +} diff --git a/app/Filament/Components/Tables/Columns/NodeClientHealthColumn.php b/app/Filament/Components/Tables/Columns/NodeClientHealthColumn.php new file mode 100644 index 0000000000..7ed823e3bb --- /dev/null +++ b/app/Filament/Components/Tables/Columns/NodeClientHealthColumn.php @@ -0,0 +1,43 @@ +label(trans('admin/node.table.reachable')); + + $this->alignCenter(); + } + + public function toEmbeddedHtml(): string + { + $alignment = $this->getAlignment(); + + $attributes = $this->getExtraAttributeBag() + ->class([ + 'fi-ta-icon', + 'fi-inline' => $this->isInline(), + 'fi-ta-icon-has-line-breaks' => $this->isListWithLineBreaks(), + 'fi-wrapped' => $this->canWrap(), + ($alignment instanceof Alignment) ? "fi-align-{$alignment->value}" : (is_string($alignment) ? $alignment : ''), + ]) + ->toHtml(); + + return Blade::render(<<<'BLADE' +
> + @livewire('node-client-connectivity', ['node' => $record, 'lazy' => true]) +
+ BLADE, [ + 'attributes' => $attributes, + 'record' => $this->getRecord(), + ]); + } +} diff --git a/app/Filament/Components/Tables/Columns/NodeHealthColumn.php b/app/Filament/Components/Tables/Columns/NodeHealthColumn.php new file mode 100644 index 0000000000..2645396806 --- /dev/null +++ b/app/Filament/Components/Tables/Columns/NodeHealthColumn.php @@ -0,0 +1,44 @@ +label(trans('admin/node.table.health')); + + $this->alignCenter(); + } + + public function toEmbeddedHtml(): string + { + $alignment = $this->getAlignment(); + + $attributes = $this->getExtraAttributeBag() + ->class([ + 'fi-ta-icon', + 'fi-inline' => $this->isInline(), + 'fi-ta-icon-has-line-breaks' => $this->isListWithLineBreaks(), + 'fi-wrapped' => $this->canWrap(), + ($alignment instanceof Alignment) ? "fi-align-{$alignment->value}" : (is_string($alignment) ? $alignment : ''), + ]) + ->toHtml(); + + // TODO: poll every 10 secs + return Blade::render(<<<'BLADE' +
> + @livewire('node-system-information', ['node' => $record, 'lazy' => true]) +
+ BLADE, [ + 'attributes' => $attributes, + 'record' => $this->getRecord(), + ]); + } +} diff --git a/app/Filament/Components/Tables/Columns/ProgressBarColumn.php b/app/Filament/Components/Tables/Columns/ProgressBarColumn.php new file mode 100644 index 0000000000..6f04aba7f9 --- /dev/null +++ b/app/Filament/Components/Tables/Columns/ProgressBarColumn.php @@ -0,0 +1,162 @@ +dangerColor = FilamentColor::getColor('danger'); + $this->warningColor = FilamentColor::getColor('warning'); + $this->color = FilamentColor::getColor('primary'); + + $this->helperLabel = fn ($state) => $state !== null ? (string) $state : '0'; + } + + public function maxValue(int|float|Closure $value): static + { + $this->maxValue = $value; + + return $this; + } + + public function getMaxValue(): ?float + { + return $this->evaluate($this->maxValue); + } + + public function helperLabel(string|Closure $label): static + { + $this->helperLabel = $label; + + return $this; + } + + public function getHelperLabel(mixed $currentValue = null): string + { + $result = $this->evaluate($this->helperLabel, [ + 'state' => $currentValue, + 'percentage' => $this->getProgressPercentage(), + ]); + + return $result !== null ? (string) $result : ''; + } + + public function getProgressPercentage(): float + { + $currentValue = $this->getState(); + $maxValue = $this->getMaxValue(); + + if ($currentValue === null || $maxValue === null || $maxValue <= 0) { + return 0; + } + + return min(100, max(0, ($currentValue / $maxValue) * 100)); + } + + public function getProgressStatus(): string + { + $percentage = $this->getProgressPercentage(); + + $dangerPercent = $this->getDangerThresholdPercent(); + $warningPercent = $this->getWarningThresholdPercent(); + + $dangerThreshold = ($dangerPercent !== null ? $dangerPercent : 0.9) * 100; + $warningThreshold = ($warningPercent !== null ? $warningPercent : 0.7) * 100; + + if ($percentage >= $dangerThreshold) { + return 'danger'; + } + + if ($percentage >= $warningThreshold) { + return 'warning'; + } + + return 'success'; + } + + public function getProgressLabel(): string + { + $currentValue = $this->getState(); + + $label = $this->getHelperLabel($currentValue); + + if ($label !== '') { + return $label; + } + + return sprintf('%d%%', (int) round($this->getProgressPercentage())); + } + + /** + * @return string|array + */ + public function getProgressColor(): string|array + { + $status = $this->getProgressStatus(); + + $color = match ($status) { + 'danger' => $this->getDangerColor(), + 'warning' => $this->getWarningColor(), + 'success' => $this->getColor(), + default => $this->getColor(), + }; + + if ($color === null) { + $color = $this->getColor(); + } + + if ($color === null) { + return 'gray'; + } + + return $color; + } + + public static function resolveColor(mixed $color): ?string + { + $resolvedColor = null; + + if (is_object($color)) { + if (method_exists($color, 'toCss')) { + $resolvedColor = $color->toCss(); + } elseif (method_exists($color, 'toRgb')) { + $resolvedColor = $color->toRgb(); + } elseif (method_exists($color, 'toHex')) { + $resolvedColor = $color->toHex(); + } else { + $resolvedColor = $color; + } + } elseif (is_array($color)) { + $resolvedColor = $color[500] ?? reset($color) ?? null; + } else { + $resolvedColor = (string) $color; + } + + if (is_string($resolvedColor)) { + return $resolvedColor; + } + + return null; + } + + public function getResolvedProgressColor(): ?string + { + return self::resolveColor($this->getProgressColor()); + } +} diff --git a/app/Filament/Components/Tables/Columns/ServerEntryColumn.php b/app/Filament/Components/Tables/Columns/ServerEntryColumn.php new file mode 100644 index 0000000000..4e30abb925 --- /dev/null +++ b/app/Filament/Components/Tables/Columns/ServerEntryColumn.php @@ -0,0 +1,23 @@ +dangerColor = FilamentColor::getColor('danger'); + $this->warningColor = FilamentColor::getColor('warning'); + $this->color = FilamentColor::getColor('primary'); + } +} diff --git a/app/Filament/Components/Tables/Filters/TagsFilter.php b/app/Filament/Components/Tables/Filters/TagsFilter.php new file mode 100644 index 0000000000..2eef04e446 --- /dev/null +++ b/app/Filament/Components/Tables/Filters/TagsFilter.php @@ -0,0 +1,57 @@ +query(fn (Builder $query, array $data) => $query->when($data['tag'], fn (Builder $query, $tag) => $query->whereJsonContains('tags', $tag))); + + $this->indicateUsing(fn (array $data) => $data['tag'] ? 'Tag: ' . $data['tag'] : null); + + $this->resetState(['tag' => null]); + + $this->visible(fn () => $this->getTags()->count() > 0); + } + + private function getTags(): Collection + { + return $this->getModel()::query()->pluck('tags')->flatten()->unique(); + } + + public function getFormField(): Field + { + return Select::make('tag') + ->preload() + ->searchable() + ->options(fn () => $this->getTags()->mapWithKeys(fn ($tag) => [$tag => $tag])); + } + + public function model(string $model): static + { + $this->model = $model; + + return $this; + } + + public function getModel(): string + { + return $this->model; + } +} diff --git a/app/Filament/Pages/Auth/EditProfile.php b/app/Filament/Pages/Auth/EditProfile.php new file mode 100644 index 0000000000..1a261e0456 --- /dev/null +++ b/app/Filament/Pages/Auth/EditProfile.php @@ -0,0 +1,651 @@ +oauthService = $oauthService; + } + + public function getMaxWidth(): Width|string + { + return config('panel.filament.display-width', 'screen-2xl'); + } + + public function content(Schema $schema): Schema + { + return $schema + ->components([ + $this->getFormContentComponent(), + ]); + } + + /** + * @throws Exception + */ + public function form(Schema $schema): Schema + { + return $schema + ->components([ + Tabs::make() + ->persistTabInQueryString() + ->tabs($this->getTabs()), + ]) + ->operation('edit') + ->model($this->getUser()) + ->statePath('data') + ->inlineLabel(!static::isSimple()); + } + + /** @return Tab[] */ + protected function getDefaultTabs(): array + { + $oauthSchemas = $this->oauthService->getEnabled(); + + return [ + Tab::make('account') + ->label(trans('profile.tabs.account')) + ->icon(TablerIcon::UserCog) + ->schema([ + TextInput::make('username') + ->disabled(fn (User $user) => $user->is_managed_externally) + ->prefixIcon(TablerIcon::User) + ->label(trans('profile.username')) + ->required() + ->maxLength(255) + ->unique(), + TextInput::make('email') + ->disabled(fn (User $user) => $user->is_managed_externally) + ->prefixIcon(TablerIcon::Mail) + ->label(trans('profile.email')) + ->email() + ->required() + ->maxLength(255) + ->unique(), + TextInput::make('password') + ->hidden(fn (User $user) => $user->is_managed_externally) + ->label(trans('profile.password')) + ->password() + ->prefixIcon(TablerIcon::Password) + ->revealable(filament()->arePasswordsRevealable()) + ->rule(Password::default()) + ->autocomplete('new-password') + ->dehydrated(fn ($state) => filled($state)) + ->dehydrateStateUsing(fn ($state) => Hash::make($state)) + ->live(debounce: 500) + ->same('passwordConfirmation'), + TextInput::make('passwordConfirmation') + ->label(trans('profile.password_confirmation')) + ->password() + ->prefixIcon(TablerIcon::PasswordFingerprint) + ->revealable(filament()->arePasswordsRevealable()) + ->required() + ->visible(fn (Get $get) => filled($get('password'))) + ->dehydrated(false), + Select::make('timezone') + ->label(trans('profile.timezone')) + ->required() + ->prefixIcon(TablerIcon::ClockPin) + ->default(config('app.timezone', 'UTC')) + ->selectablePlaceholder(false) + ->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz])) + ->searchable(), + Select::make('language') + ->label(trans('profile.language')) + ->required() + ->prefixIcon(TablerIcon::Flag) + ->live() + ->default('en') + ->selectablePlaceholder(false) + ->helperText(fn ($state, LanguageService $languageService) => new HtmlString($languageService->isLanguageTranslated($state) ? '' + : trans('profile.language_help', ['state' => $state]) . ' Update On Crowdin')) + ->options(fn (LanguageService $languageService) => $languageService->getAvailableLanguages()), + FileUpload::make('avatar') + ->visible(fn () => config('panel.filament.uploadable-avatars')) + ->avatar() + ->imageEditor() + ->acceptedFileTypes(['image/png']) + ->directory('avatars') + ->disk('public') + ->getUploadedFileNameForStorageUsing(fn () => $this->getUser()->id . '.png') + ->formatStateUsing(function (FileUpload $fileUpload) { + $path = $fileUpload->getDirectory() . '/' . $this->getUser()->id . '.png'; + if ($fileUpload->getDisk()->exists($path)) { + return $path; + } + }) + ->deleteUploadedFileUsing(function (FileUpload $fileUpload, $file) { + if ($file instanceof TemporaryUploadedFile) { + return $file->delete(); + } + + if ($fileUpload->getDisk()->exists($file)) { + return $fileUpload->getDisk()->delete($file); + } + }), + ]), + Tab::make('oauth') + ->label(trans('profile.tabs.oauth')) + ->icon(TablerIcon::BrandOauth) + ->visible(count($oauthSchemas) > 0) + ->schema(function () use ($oauthSchemas) { + $actions = []; + + foreach ($oauthSchemas as $schema) { + + $id = $schema->getId(); + $name = $schema->getName(); + + $color = $schema->getHexColor(); + $color = is_string($color) ? Color::hex($color) : null; + + $unlink = array_key_exists($id, $this->getUser()->oauth ?? []); + + $actions[] = Action::make("oauth_$id") + ->label(trans('profile.' . ($unlink ? 'unlink' : 'link'), ['name' => $name])) + ->icon($unlink ? TablerIcon::Unlink : TablerIcon::Link) + ->color($color) + ->action(function (UserUpdateService $updateService) use ($id, $name, $unlink) { + if ($unlink) { + $oauth = user()?->oauth; + unset($oauth[$id]); + + $updateService->handle(user(), ['oauth' => $oauth]); + + $this->fillForm(); + + Notification::make() + ->title(trans('profile.unlinked', ['name' => $name])) + ->success() + ->send(); + } else { + redirect(Socialite::with($id)->redirect()->getTargetUrl()); + } + }); + } + + return [Actions::make($actions)]; + }), + Tab::make('2fa') + ->label(trans('profile.tabs.2fa')) + ->icon(TablerIcon::ShieldLock) + ->visible(fn () => Filament::hasMultiFactorAuthentication()) + ->schema(collect(Filament::getMultiFactorAuthenticationProviders()) + ->sort(fn (MultiFactorAuthenticationProvider $multiFactorAuthenticationProvider) => $multiFactorAuthenticationProvider->isEnabled(Filament::auth()->user()) ? 0 : 1) + ->map(fn (MultiFactorAuthenticationProvider $multiFactorAuthenticationProvider) => Group::make($multiFactorAuthenticationProvider->getManagementSchemaComponents()) + ->statePath($multiFactorAuthenticationProvider->getId())) + ->all()), + Tab::make('api_keys') + ->label(trans('profile.tabs.api_keys')) + ->icon(TablerIcon::Key) + ->schema([ + Grid::make(5) + ->schema([ + Section::make(trans('profile.create_api_key'))->columnSpan(3) + ->schema([ + TextInput::make('description') + ->label(trans('profile.description')) + ->live(), + TagsInput::make('allowed_ips') + ->label(trans('profile.allowed_ips')) + ->live() + ->splitKeys([',', ' ', 'Tab']) + ->placeholder('127.0.0.1 or 192.168.1.1') + ->helperText(trans('profile.allowed_ips_help')) + ->columnSpanFull(), + ]) + ->headerActions([ + Action::make('exclude_create_api_key') + ->label(trans('filament-actions::create.single.modal.actions.create.label')) + ->disabled(fn (Get $get) => empty($get('description'))) + ->successRedirectUrl(self::getUrl(['tab' => 'api-keys::data::tab'], panel: 'app')) + ->action(function (Get $get, Action $action, User $user) { + $token = $user->createToken( + $get('description'), + $get('allowed_ips'), + ); + + Activity::event('user:api-key.create') + ->actor($user) + ->subject($user) + ->subject($token->accessToken) + ->property('identifier', $token->accessToken->identifier) + ->log(); + + Notification::make() + ->title(trans('profile.api_key_created')) + ->body($token->accessToken->identifier . $token->plainTextToken) + ->persistent() + ->success() + ->send(); + + $action->success(); + }), + ]), + Section::make(trans('profile.api_keys'))->columnSpan(2) + ->schema([ + Repeater::make('api_keys') + ->hiddenLabel() + ->inlineLabel(false) + ->relationship('apiKeys') + ->addable(false) + ->itemLabel(fn ($state) => $state['identifier']) + ->deleteAction(function (Action $action) { + $action->requiresConfirmation()->action(function (array $arguments, Repeater $component, User $user) { + $items = $component->getState(); + $key = $items[$arguments['item']]; + + $apiKey = ApiKey::find($key['id'] ?? null); + if ($apiKey->exists()) { + $apiKey->delete(); + + Activity::event('user:api-key.delete') + ->actor($user) + ->subject($user) + ->subject($apiKey) + ->property('identifier', $apiKey->identifier) + ->log(); + } + + unset($items[$arguments['item']]); + + $component->state($items); + + $component->callAfterStateUpdated(); + }); + }) + ->schema(fn () => [ + TextEntry::make('memo') + ->hiddenLabel() + ->state(fn (ApiKey $key) => $key->memo), + ]) + ->visible(fn (User $user) => $user->apiKeys()->exists()), + + TextEntry::make('no_api_keys') + ->state(trans('profile.no_api_keys')) + ->hiddenLabel() + ->visible(fn (User $user) => !$user->apiKeys()->exists()), + ]), + ]), + ]), + Tab::make('ssh_keys') + ->label(trans('profile.tabs.ssh_keys')) + ->icon(TablerIcon::LockCode) + ->schema([ + Grid::make(5)->schema([ + Section::make(trans('profile.create_ssh_key'))->columnSpan(3) + ->schema([ + TextInput::make('name') + ->label(trans('profile.name')) + ->live(), + Textarea::make('public_key') + ->label(trans('profile.public_key')) + ->autosize() + ->live(), + ]) + ->headerActions([ + Action::make('exclude_create_ssh_key') + ->label(trans('filament-actions::create.single.modal.actions.create.label')) + ->disabled(fn (Get $get) => empty($get('name')) || empty($get('public_key'))) + ->successRedirectUrl(self::getUrl(['tab' => 'ssh-keys::data::tab'], panel: 'app')) + ->action(function (Get $get, Action $action, User $user, KeyCreationService $service) { + try { + $sshKey = $service->handle($user, $get('name'), $get('public_key')); + + Activity::event('user:ssh-key.create') + ->actor($user) + ->subject($user) + ->subject($sshKey) + ->property('fingerprint', $sshKey->fingerprint) + ->log(); + + Notification::make() + ->title(trans('profile.ssh_key_created')) + ->body("SHA256:{$sshKey->fingerprint}") + ->success() + ->send(); + + $action->success(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('profile.could_not_create_ssh_key')) + ->body($exception->getMessage()) + ->danger() + ->send(); + + $action->failure(); + } + }), + ]), + Section::make(trans('profile.ssh_keys'))->columnSpan(2) + ->schema([ + Repeater::make('ssh_keys') + ->hiddenLabel() + ->inlineLabel(false) + ->relationship('sshKeys') + ->addable(false) + ->itemLabel(fn ($state) => $state['name']) + ->deleteAction(function (Action $action) { + $action->requiresConfirmation()->action(function (array $arguments, Repeater $component, User $user) { + $items = $component->getState(); + $key = $items[$arguments['item']]; + + $sshKey = UserSSHKey::find($key['id'] ?? null); + if ($sshKey->exists()) { + $sshKey->delete(); + + Activity::event('user:ssh-key.delete') + ->actor($user) + ->subject($user) + ->subject($sshKey) + ->property('fingerprint', $sshKey->fingerprint) + ->log(); + } + + unset($items[$arguments['item']]); + + $component->state($items); + + $component->callAfterStateUpdated(); + }); + }) + ->schema(fn () => [ + TextEntry::make('fingerprint') + ->hiddenLabel() + ->state(fn (UserSSHKey $key) => "SHA256:{$key->fingerprint}"), + ]) + ->visible(fn (User $user) => $user->sshKeys()->exists()), + + TextEntry::make('no_ssh_keys') + ->state(trans('profile.no_ssh_keys')) + ->hiddenLabel() + ->visible(fn (User $user) => !$user->sshKeys()->exists()), + ]), + ]), + ]), + Tab::make('activity') + ->label(trans('profile.tabs.activity')) + ->icon(TablerIcon::History) + ->schema([ + Repeater::make('activity') // TODO: move to a table + ->label(trans('profile.activity_info')) + ->inlineLabel(false) + ->deletable(false) + ->addable(false) + ->relationship(null, function (Builder $query) { + $query->orderBy('timestamp', 'desc')->limit(50); + }) + ->schema([ + TextEntry::make('log') + ->hiddenLabel() + ->state(fn (ActivityLog $log) => new HtmlString($log->htmlable())), + ]), + ]), + Tab::make('customization') + ->label(trans('profile.tabs.customization')) + ->icon(TablerIcon::Adjustments) + ->schema([ + Section::make(trans('profile.dashboard')) + ->collapsible() + ->icon(TablerIcon::Dashboard) + ->schema([ + ToggleButtons::make('dashboard_layout') + ->label(trans('profile.dashboard_layout')) + ->inline() + ->required() + ->options([ + 'grid' => trans('profile.grid'), + 'table' => trans('profile.table'), + ]), + ToggleButtons::make('top_navigation') + ->label(trans('profile.navigation')) + ->inline() + ->options([ + 'sidebar' => trans('profile.sidebar'), + 'topbar' => trans('profile.topbar'), + 'mixed' => trans('profile.mixed'), + ]), + ToggleButtons::make('button_style') + ->label('Button Style') + ->inline() + ->default('icon') + + ->options([ + true => 'Icon', + false => 'Icon Button', + ]), + ]), + Section::make(trans('profile.admin')) + ->collapsible() + ->icon(TablerIcon::Shield) + ->visible(fn (User $user) => $user->isAdmin()) + ->schema([ + ToggleButtons::make('redirect_to_admin') + ->label(trans('profile.redirect_to_admin')) + ->helperText(trans('profile.redirect_to_admin_help')) + ->inline() + ->boolean(), + ]), + Section::make(trans('profile.console')) + ->collapsible() + ->icon(TablerIcon::Terminal2) + ->columns(4) + ->schema([ + TextInput::make('console_font_size') + ->label(trans('profile.font_size')) + ->columnSpan(1) + ->minValue(1) + ->numeric() + ->required() + ->live() + ->default(14), + Select::make('console_font') + ->label(trans('profile.font')) + ->required() + ->options(function () { + $fonts = [ + 'monospace' => 'monospace', //default + ]; + + if (!Storage::disk('public')->exists('fonts')) { + Storage::disk('public')->makeDirectory('fonts'); + $this->fillForm(); + } + + foreach (Storage::disk('public')->allFiles('fonts') as $file) { + $fileInfo = pathinfo($file); + + if ($fileInfo['extension'] === 'ttf') { + $fonts[$fileInfo['filename']] = $fileInfo['filename']; + } + } + + return $fonts; + }) + ->live() + ->default('monospace'), + TextEntry::make('font_preview') + ->label(trans('profile.font_preview')) + ->columnSpan(2) + ->state(function (Get $get) { + $fontName = $get('console_font') ?? 'monospace'; + $fontSize = $get('console_font_size') . 'px'; + $style = << + {$style} + + The quick blue pelican jumps over the lazy pterodactyl. :) + HTML); + }), + TextInput::make('console_graph_period') + ->label(trans('profile.graph_period')) + ->suffix(trans('profile.seconds')) + ->hintIcon(TablerIcon::QuestionMark, trans('profile.graph_period_helper')) + ->columnSpan(2) + ->numeric() + ->default(30) + ->minValue(10) + ->maxValue(120) + ->required(), + TextInput::make('console_rows') + ->label(trans('profile.rows')) + ->minValue(1) + ->numeric() + ->required() + ->columnSpan(2) + ->default(30), + ]), + ]), + ]; + } + + protected function getFormActions(): array + { + return []; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + $this->getCancelFormAction()->formId('form') + ->tooltip(trans('filament-panels::auth/pages/edit-profile.actions.cancel.label')) + ->hiddenLabel() + ->icon(TablerIcon::ArrowLeft), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label')) + ->icon(TablerIcon::DeviceFloppy), + ]; + + } + + protected function mutateFormDataBeforeSave(array $data): array + { + $customization = [ + 'console_font' => $data['console_font'], + 'console_font_size' => $data['console_font_size'], + 'console_rows' => $data['console_rows'], + 'console_graph_period' => $data['console_graph_period'], + 'dashboard_layout' => $data['dashboard_layout'], + 'top_navigation' => $data['top_navigation'], + 'button_style' => $data['button_style'], + 'redirect_to_admin' => $data['redirect_to_admin'] ?? $this->getUser()->getCustomization(CustomizationKey::RedirectToAdmin), + ]; + + unset( + $data['console_font'], + $data['console_font_size'], + $data['console_rows'], + $data['dashboard_layout'], + $data['top_navigation'], + $data['button_style'], + $data['redirect_to_admin'], + ); + + $data['customization'] = json_encode($customization); + + return $data; + } + + protected function mutateFormDataBeforeFill(array $data): array + { + $data['console_font'] = $this->getUser()->getCustomization(CustomizationKey::ConsoleFont); + $data['console_font_size'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleFontSize); + $data['console_rows'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleRows); + $data['console_graph_period'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleGraphPeriod); + $data['dashboard_layout'] = $this->getUser()->getCustomization(CustomizationKey::DashboardLayout); + $data['button_style'] = $this->getUser()->getCustomization(CustomizationKey::ButtonStyle); + $data['redirect_to_admin'] = $this->getUser()->getCustomization(CustomizationKey::RedirectToAdmin); + + // Handle migration from boolean to string navigation types + $topNavigation = $this->getUser()->getCustomization(CustomizationKey::TopNavigation); + if (is_bool($topNavigation)) { + $data['top_navigation'] = $topNavigation ? 'topbar' : 'sidebar'; + } else { + $data['top_navigation'] = $topNavigation; + } + + return $data; + } +} diff --git a/app/Filament/Pages/Auth/Login.php b/app/Filament/Pages/Auth/Login.php new file mode 100644 index 0000000000..4ee735fa17 --- /dev/null +++ b/app/Filament/Pages/Auth/Login.php @@ -0,0 +1,123 @@ +oauthService = $oauthService; + $this->captchaService = $captchaService; + $this->iconFactory = $iconFactory; + } + + public function form(Schema $schema): Schema + { + $components = [ + $this->getLoginFormComponent(), + $this->getPasswordFormComponent(), + $this->getRememberFormComponent(), + $this->getOAuthFormComponent(), + ]; + + if ($captchaComponent = $this->getCaptchaComponent()) { + $components[] = $captchaComponent + ->hidden(fn () => filled($this->userUndertakingMultiFactorAuthentication)); + } + + return $schema + ->components($components); + } + + private function getCaptchaComponent(): ?Component + { + return $this->captchaService->getActiveSchema()?->getFormComponent(); + } + + protected function throwFailureValidationException(): never + { + $this->dispatch('reset-captcha'); + + throw ValidationException::withMessages([ + 'data.login' => trans('filament-panels::auth/pages/login.messages.failed')]); + } + + protected function getLoginFormComponent(): Component + { + return TextInput::make('login') + ->label(trans('filament-panels::auth/pages/login.title')) + ->required() + ->autocomplete() + ->autofocus() + ->extraInputAttributes(['tabindex' => 1]); + } + + protected function getPasswordFormComponent(): Component + { + /** @var TextInput $component */ + $component = parent::getPasswordFormComponent(); + + return $component->extraInputAttributes(['tabindex' => 2]); + } + + protected function getOAuthFormComponent(): Component + { + $actions = []; + + $oauthSchemas = $this->oauthService->getEnabled(); + + foreach ($oauthSchemas as $schema) { + + $id = $schema->getId(); + + $color = $schema->getHexColor(); + $color = is_string($color) ? Color::hex($color) : null; + + $icon = $schema->getIcon(); + if (is_string($icon)) { + try { + $this->iconFactory->svg($icon); + } catch (SvgNotFound) { + $icon = null; + } + } + + $actions[] = Action::make("oauth_$id") + ->label($schema->getName()) + ->icon($icon) + ->color($color) + ->url(route('auth.oauth.redirect', ['driver' => $id], false)); + } + + return Actions::make($actions); + } + + protected function getCredentialsFromFormData(array $data): array + { + $loginType = filter_var($data['login'], FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; + + return [ + $loginType => mb_strtolower($data['login']), + 'password' => $data['password'], + ]; + } +} diff --git a/app/Filament/Pages/Dashboard.php b/app/Filament/Pages/Dashboard.php deleted file mode 100644 index af76c00f54..0000000000 --- a/app/Filament/Pages/Dashboard.php +++ /dev/null @@ -1,81 +0,0 @@ - config('app.version') === 'canary', - 'version' => $softwareVersionService->versionData()['version'], - 'latestVersion' => $softwareVersionService->getPanel(), - 'isLatest' => $softwareVersionService->isLatestPanel(), - 'eggsCount' => Egg::query()->count(), - 'nodesList' => ListNodes::getUrl(), - 'nodesCount' => Node::query()->count(), - 'serversCount' => Server::query()->count(), - 'usersCount' => User::query()->count(), - - 'devActions' => [ - CreateAction::make() - ->label('Bugs & Features') - ->icon('tabler-brand-github') - ->url('https://github.com/pelican-dev/panel/discussions', true), - ], - 'updateActions' => [ - CreateAction::make() - ->label('Read Documentation') - ->icon('tabler-clipboard-text') - ->url('https://pelican.dev/docs/panel/update', true) - ->color('warning'), - ], - 'nodeActions' => [ - CreateAction::make() - ->label(trans('dashboard/index.sections.intro-first-node.button_label')) - ->icon('tabler-server-2') - ->url(route('filament.admin.resources.nodes.create')), - ], - 'supportActions' => [ - CreateAction::make() - ->label(trans('dashboard/index.sections.intro-support.button_donate')) - ->icon('tabler-cash') - ->url($softwareVersionService->getDonations(), true) - ->color('success'), - ], - 'helpActions' => [ - CreateAction::make() - ->label(trans('dashboard/index.sections.intro-help.button_docs')) - ->icon('tabler-speedboat') - ->url('https://pelican.dev/docs', true), - ], - ]; - } -} diff --git a/app/Filament/Pages/Installer/PanelInstaller.php b/app/Filament/Pages/Installer/PanelInstaller.php deleted file mode 100644 index 55da7add71..0000000000 --- a/app/Filament/Pages/Installer/PanelInstaller.php +++ /dev/null @@ -1,181 +0,0 @@ -form->fill(); - } - - protected function getFormSchema(): array - { - return [ - Wizard::make([ - RequirementsStep::make(), - EnvironmentStep::make($this), - DatabaseStep::make($this), - RedisStep::make($this) - ->hidden(fn (Get $get) => $get('env_general.SESSION_DRIVER') != 'redis' && $get('env_general.QUEUE_CONNECTION') != 'redis' && $get('env_general.CACHE_STORE') != 'redis'), - AdminUserStep::make($this), - CompletedStep::make(), - ]) - ->persistStepInQueryString() - ->nextAction(fn (Action $action) => $action->keyBindings('enter')) - ->submitAction(new HtmlString(Blade::render(<<<'BLADE' - - Finish - - - BLADE))), - ]; - } - - protected function getFormStatePath(): ?string - { - return 'data'; - } - - public function submit() - { - // Disable installer - $this->writeToEnvironment(['APP_INSTALLED' => 'true']); - - // Login user - $this->user ??= User::all()->filter(fn ($user) => $user->isRootAdmin())->first(); - auth()->guard()->login($this->user, true); - - // Redirect to admin panel - return redirect(Filament::getPanel('admin')->getUrl()); - } - - public function writeToEnv(string $key): void - { - try { - $variables = array_get($this->data, $key); - $this->writeToEnvironment($variables); - } catch (Exception $exception) { - report($exception); - - Notification::make() - ->title('Could not write to .env file') - ->body($exception->getMessage()) - ->danger() - ->persistent() - ->send(); - - throw new Halt('Error while writing .env file'); - } - - Artisan::call('config:clear'); - } - - public function runMigrations(string $driver): void - { - try { - Artisan::call('migrate', [ - '--force' => true, - '--seed' => true, - '--database' => $driver, - ]); - } catch (Exception $exception) { - report($exception); - - Notification::make() - ->title('Migrations failed') - ->body($exception->getMessage()) - ->danger() - ->persistent() - ->send(); - - throw new Halt('Error while running migrations'); - } - - if (!$this->hasCompletedMigrations()) { - Notification::make() - ->title('Migrations failed') - ->danger() - ->persistent() - ->send(); - - throw new Halt('Migrations failed'); - } - } - - public function createAdminUser(): void - { - try { - $userData = array_get($this->data, 'user'); - $userData['root_admin'] = true; - $this->user = app(UserCreationService::class)->handle($userData); - } catch (Exception $exception) { - report($exception); - - Notification::make() - ->title('Could not create admin user') - ->body($exception->getMessage()) - ->danger() - ->persistent() - ->send(); - - throw new Halt('Error while creating admin user'); - } - } -} diff --git a/app/Filament/Pages/Installer/Steps/AdminUserStep.php b/app/Filament/Pages/Installer/Steps/AdminUserStep.php deleted file mode 100644 index f5c2a19b34..0000000000 --- a/app/Filament/Pages/Installer/Steps/AdminUserStep.php +++ /dev/null @@ -1,33 +0,0 @@ -label('Admin User') - ->schema([ - TextInput::make('user.email') - ->label('Admin E-Mail') - ->required() - ->email() - ->placeholder('admin@example.com'), - TextInput::make('user.username') - ->label('Admin Username') - ->required() - ->placeholder('admin'), - TextInput::make('user.password') - ->label('Admin Password') - ->required() - ->password() - ->revealable(), - ]) - ->afterValidation(fn () => $installer->createAdminUser()); - } -} diff --git a/app/Filament/Pages/Installer/Steps/CompletedStep.php b/app/Filament/Pages/Installer/Steps/CompletedStep.php deleted file mode 100644 index 50f9a780cf..0000000000 --- a/app/Filament/Pages/Installer/Steps/CompletedStep.php +++ /dev/null @@ -1,34 +0,0 @@ -label('Setup complete') - ->schema([ - Placeholder::make('') - ->content(new HtmlString('The setup is nearly complete!
As last step you need to create a new cronjob that runs every minute to process specific tasks, such as session cleanup and scheduled tasks, and also create a queue worker.')), - TextInput::make('crontab') - ->label(new HtmlString('Run the following command to setup your crontab. Note that www-data is your webserver user. On some systems this username might be different!')) - ->disabled() - ->hintAction(CopyAction::make()) - ->default('(crontab -l -u www-data 2>/dev/null; echo "* * * * * php ' . base_path() . '/artisan schedule:run >> /dev/null 2>&1") | crontab -u www-data -'), - TextInput::make('queueService') - ->label(new HtmlString('To setup the queue worker service you simply have to run the following command.')) - ->disabled() - ->hintAction(CopyAction::make()) - ->default('sudo php ' . base_path() . '/artisan p:environment:queue-service'), - Placeholder::make('') - ->content('After you finished these two last tasks you can click on "Finish" and use your new panel! Have fun!'), - ]); - } -} diff --git a/app/Filament/Pages/Installer/Steps/DatabaseStep.php b/app/Filament/Pages/Installer/Steps/DatabaseStep.php deleted file mode 100644 index 29c47b3290..0000000000 --- a/app/Filament/Pages/Installer/Steps/DatabaseStep.php +++ /dev/null @@ -1,109 +0,0 @@ -label('Database') - ->columns() - ->schema([ - TextInput::make('env_database.DB_DATABASE') - ->label(fn (Get $get) => $get('env_general.DB_CONNECTION') === 'sqlite' ? 'Database Path' : 'Database Name') - ->columnSpanFull() - ->hintIcon('tabler-question-mark') - ->hintIconTooltip(fn (Get $get) => $get('env_general.DB_CONNECTION') === 'sqlite' ? 'The path of your .sqlite file relative to the database folder.' : 'The name of the panel database.') - ->required() - ->default(fn (Get $get) => env('DB_DATABASE', $get('env_general.DB_CONNECTION') === 'sqlite' ? 'database.sqlite' : 'panel')), - TextInput::make('env_database.DB_HOST') - ->label('Database Host') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The host of your database. Make sure it is reachable.') - ->required() - ->default(env('DB_HOST', '127.0.0.1')) - ->hidden(fn (Get $get) => $get('env_general.DB_CONNECTION') === 'sqlite'), - TextInput::make('env_database.DB_PORT') - ->label('Database Port') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The port of your database.') - ->required() - ->numeric() - ->minValue(1) - ->maxValue(65535) - ->default(env('DB_PORT', 3306)) - ->hidden(fn (Get $get) => $get('env_general.DB_CONNECTION') === 'sqlite'), - TextInput::make('env_database.DB_USERNAME') - ->label('Database Username') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The name of your database user.') - ->required() - ->default(env('DB_USERNAME', 'pelican')) - ->hidden(fn (Get $get) => $get('env_general.DB_CONNECTION') === 'sqlite'), - TextInput::make('env_database.DB_PASSWORD') - ->label('Database Password') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The password of your database user. Can be empty.') - ->password() - ->revealable() - ->default(env('DB_PASSWORD')) - ->hidden(fn (Get $get) => $get('env_general.DB_CONNECTION') === 'sqlite'), - ]) - ->afterValidation(function (Get $get) use ($installer) { - $driver = $get('env_general.DB_CONNECTION'); - - if (!self::testConnection($driver, $get('env_database.DB_HOST'), $get('env_database.DB_PORT'), $get('env_database.DB_DATABASE'), $get('env_database.DB_USERNAME'), $get('env_database.DB_PASSWORD'))) { - throw new Halt('Database connection failed'); - } - - $installer->writeToEnv('env_database'); - - $installer->runMigrations($driver); - }); - } - - private static function testConnection(string $driver, $host, $port, $database, $username, $password): bool - { - if ($driver === 'sqlite') { - return true; - } - - try { - config()->set('database.connections._panel_install_test', [ - 'driver' => $driver, - 'host' => $host, - 'port' => $port, - 'database' => $database, - 'username' => $username, - 'password' => $password, - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'strict' => true, - ]); - - DB::connection('_panel_install_test')->getPdo(); - } catch (Exception $exception) { - DB::disconnect('_panel_install_test'); - - Notification::make() - ->title('Database connection failed') - ->body($exception->getMessage()) - ->danger() - ->send(); - - return false; - } - - return true; - } -} diff --git a/app/Filament/Pages/Installer/Steps/EnvironmentStep.php b/app/Filament/Pages/Installer/Steps/EnvironmentStep.php deleted file mode 100644 index 5df2ecd40a..0000000000 --- a/app/Filament/Pages/Installer/Steps/EnvironmentStep.php +++ /dev/null @@ -1,98 +0,0 @@ - 'Filesystem', - 'redis' => 'Redis', - ]; - - public const SESSION_DRIVERS = [ - 'file' => 'Filesystem', - 'database' => 'Database', - 'cookie' => 'Cookie', - 'redis' => 'Redis', - ]; - - public const QUEUE_DRIVERS = [ - 'database' => 'Database', - 'sync' => 'Sync', - 'redis' => 'Redis', - ]; - - public const DATABASE_DRIVERS = [ - 'sqlite' => 'SQLite', - 'mariadb' => 'MariaDB', - 'mysql' => 'MySQL', - ]; - - public static function make(PanelInstaller $installer): Step - { - return Step::make('environment') - ->label('Environment') - ->columns() - ->schema([ - TextInput::make('env_general.APP_NAME') - ->label('App Name') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('This will be the Name of your Panel.') - ->required() - ->default(config('app.name')), - TextInput::make('env_general.APP_URL') - ->label('App URL') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('This will be the URL you access your Panel from.') - ->required() - ->default(url('')) - ->live() - ->afterStateUpdated(fn ($state, Set $set) => $set('env_general.SESSION_SECURE_COOKIE', str_starts_with($state, 'https://') ? 'true' : 'false')), - TextInput::make('env_general.SESSION_SECURE_COOKIE') - ->hidden() - ->default(str_starts_with(url(''), 'https://') ? 'true' : 'false'), - ToggleButtons::make('env_general.CACHE_STORE') - ->label('Cache Driver') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The driver used for caching. We recommend "Filesystem".') - ->required() - ->inline() - ->options(self::CACHE_DRIVERS) - ->default(config('cache.default', 'file')), - ToggleButtons::make('env_general.SESSION_DRIVER') - ->label('Session Driver') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The driver used for storing sessions. We recommend "Filesystem" or "Database".') - ->required() - ->inline() - ->options(self::SESSION_DRIVERS) - ->default(config('session.driver', 'file')), - ToggleButtons::make('env_general.QUEUE_CONNECTION') - ->label('Queue Driver') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The driver used for handling queues. We recommend "Database".') - ->required() - ->inline() - ->options(self::QUEUE_DRIVERS) - ->default(config('queue.default', 'database')), - ToggleButtons::make('env_general.DB_CONNECTION') - ->label('Database Driver') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The driver used for the panel database. We recommend "SQLite".') - ->required() - ->inline() - ->options(self::DATABASE_DRIVERS) - ->default(config('database.default', 'sqlite')), - ]) - ->afterValidation(fn () => $installer->writeToEnv('env_general')); - } -} diff --git a/app/Filament/Pages/Installer/Steps/RedisStep.php b/app/Filament/Pages/Installer/Steps/RedisStep.php deleted file mode 100644 index 00ecb18afe..0000000000 --- a/app/Filament/Pages/Installer/Steps/RedisStep.php +++ /dev/null @@ -1,82 +0,0 @@ -label('Redis') - ->columns() - ->schema([ - TextInput::make('env_redis.REDIS_HOST') - ->label('Redis Host') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The host of your redis server. Make sure it is reachable.') - ->required() - ->default(config('database.redis.default.host')), - TextInput::make('env_redis.REDIS_PORT') - ->label('Redis Port') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The port of your redis server.') - ->required() - ->default(config('database.redis.default.port')), - TextInput::make('env_redis.REDIS_USERNAME') - ->label('Redis Username') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The name of your redis user. Can be empty') - ->default(config('database.redis.default.username')), - TextInput::make('env_redis.REDIS_PASSWORD') - ->label('Redis Password') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The password for your redis user. Can be empty.') - ->password() - ->revealable() - ->default(config('database.redis.default.password')), - ]) - ->afterValidation(function (Get $get) use ($installer) { - if (!self::testConnection($get('env_redis.REDIS_HOST'), $get('env_redis.REDIS_PORT'), $get('env_redis.REDIS_USERNAME'), $get('env_redis.REDIS_PASSWORD'))) { - throw new Halt('Redis connection failed'); - } - - $installer->writeToEnv('env_redis'); - }); - } - - private static function testConnection($host, $port, $username, $password): bool - { - try { - config()->set('database.redis._panel_install_test', [ - 'host' => $host, - 'port' => $port, - 'username' => $username, - 'password' => $password, - ]); - - Redis::connection('_panel_install_test')->command('ping'); - } catch (Exception $exception) { - Notification::make() - ->title('Redis connection failed') - ->body($exception->getMessage()) - ->danger() - ->send(); - - return false; - } - - return true; - } -} diff --git a/app/Filament/Pages/Installer/Steps/RequirementsStep.php b/app/Filament/Pages/Installer/Steps/RequirementsStep.php deleted file mode 100644 index 5e6d6988d1..0000000000 --- a/app/Filament/Pages/Installer/Steps/RequirementsStep.php +++ /dev/null @@ -1,89 +0,0 @@ -= 0; - - $fields = [ - Section::make('PHP Version') - ->description(self::MIN_PHP_VERSION . ' or newer') - ->icon($correctPhpVersion ? 'tabler-check' : 'tabler-x') - ->iconColor($correctPhpVersion ? 'success' : 'danger') - ->schema([ - Placeholder::make('') - ->content('Your PHP Version is ' . PHP_VERSION . '.'), - ]), - ]; - - $phpExtensions = [ - 'BCMath' => extension_loaded('bcmath'), - 'cURL' => extension_loaded('curl'), - 'GD' => extension_loaded('gd'), - 'intl' => extension_loaded('intl'), - 'mbstring' => extension_loaded('mbstring'), - 'MySQL' => extension_loaded('pdo_mysql'), - 'SQLite3' => extension_loaded('pdo_sqlite'), - 'XML' => extension_loaded('xml'), - 'Zip' => extension_loaded('zip'), - ]; - $allExtensionsInstalled = !in_array(false, $phpExtensions); - - $fields[] = Section::make('PHP Extensions') - ->description(implode(', ', array_keys($phpExtensions))) - ->icon($allExtensionsInstalled ? 'tabler-check' : 'tabler-x') - ->iconColor($allExtensionsInstalled ? 'success' : 'danger') - ->schema([ - Placeholder::make('') - ->content('All needed PHP Extensions are installed.') - ->visible($allExtensionsInstalled), - Placeholder::make('') - ->content('The following PHP Extensions are missing: ' . implode(', ', array_keys($phpExtensions, false))) - ->visible(!$allExtensionsInstalled), - ]); - - $folderPermissions = [ - 'Storage' => substr(sprintf('%o', fileperms(base_path('storage/'))), -4) >= 755, - 'Cache' => substr(sprintf('%o', fileperms(base_path('bootstrap/cache/'))), -4) >= 755, - ]; - $correctFolderPermissions = !in_array(false, $folderPermissions); - - $fields[] = Section::make('Folder Permissions') - ->description(implode(', ', array_keys($folderPermissions))) - ->icon($correctFolderPermissions ? 'tabler-check' : 'tabler-x') - ->iconColor($correctFolderPermissions ? 'success' : 'danger') - ->schema([ - Placeholder::make('') - ->content('All Folders have the correct permissions.') - ->visible($correctFolderPermissions), - Placeholder::make('') - ->content('The following Folders have wrong permissions: ' . implode(', ', array_keys($folderPermissions, false))) - ->visible(!$correctFolderPermissions), - ]); - - return Step::make('requirements') - ->label('Server Requirements') - ->schema($fields) - ->afterValidation(function () use ($correctPhpVersion, $allExtensionsInstalled, $correctFolderPermissions) { - if (!$correctPhpVersion || !$allExtensionsInstalled || !$correctFolderPermissions) { - Notification::make() - ->title('Some requirements are missing!') - ->danger() - ->send(); - - throw new Halt('Some requirements are missing'); - } - }); - } -} diff --git a/app/Filament/Pages/Settings.php b/app/Filament/Pages/Settings.php deleted file mode 100644 index f3ef2c2b9a..0000000000 --- a/app/Filament/Pages/Settings.php +++ /dev/null @@ -1,596 +0,0 @@ -form->fill(); - } - - public static function canAccess(): bool - { - return auth()->user()->can('view settings'); - } - - protected function getFormSchema(): array - { - return [ - Tabs::make('Tabs') - ->columns() - ->persistTabInQueryString() - ->disabled(fn () => !auth()->user()->can('update settings')) - ->tabs([ - Tab::make('general') - ->label('General') - ->icon('tabler-home') - ->schema($this->generalSettings()), - Tab::make('recaptcha') - ->label('reCAPTCHA') - ->icon('tabler-shield') - ->schema($this->recaptchaSettings()), - Tab::make('mail') - ->label('Mail') - ->icon('tabler-mail') - ->schema($this->mailSettings()), - Tab::make('backup') - ->label('Backup') - ->icon('tabler-box') - ->schema($this->backupSettings()), - Tab::make('misc') - ->label('Misc') - ->icon('tabler-tool') - ->schema($this->miscSettings()), - ]), - ]; - } - - private function generalSettings(): array - { - return [ - TextInput::make('APP_NAME') - ->label('App Name') - ->required() - ->default(env('APP_NAME', 'Pelican')), - TextInput::make('APP_FAVICON') - ->label('App Favicon') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('Favicons should be placed in the public folder, located in the root panel directory.') - ->required() - ->default(env('APP_FAVICON', '/pelican.ico')), - Toggle::make('APP_DEBUG') - ->label('Enable Debug Mode?') - ->inline(false) - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('APP_DEBUG', (bool) $state)) - ->default(env('APP_DEBUG', config('app.debug'))), - ToggleButtons::make('FILAMENT_TOP_NAVIGATION') - ->label('Navigation') - ->inline() - ->options([ - false => 'Sidebar', - true => 'Topbar', - ]) - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('FILAMENT_TOP_NAVIGATION', (bool) $state)) - ->default(env('FILAMENT_TOP_NAVIGATION', config('panel.filament.top-navigation'))), - ToggleButtons::make('PANEL_USE_BINARY_PREFIX') - ->label('Unit prefix') - ->inline() - ->options([ - false => 'Decimal Prefix (MB/ GB)', - true => 'Binary Prefix (MiB/ GiB)', - ]) - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_USE_BINARY_PREFIX', (bool) $state)) - ->default(env('PANEL_USE_BINARY_PREFIX', config('panel.use_binary_prefix'))), - ToggleButtons::make('APP_2FA_REQUIRED') - ->label('2FA Requirement') - ->inline() - ->options([ - 0 => 'Not required', - 1 => 'Required for only Admins', - 2 => 'Required for all Users', - ]) - ->formatStateUsing(fn ($state): int => (int) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('APP_2FA_REQUIRED', (int) $state)) - ->default(env('APP_2FA_REQUIRED', config('panel.auth.2fa_required'))), - TagsInput::make('TRUSTED_PROXIES') - ->label('Trusted Proxies') - ->separator() - ->splitKeys(['Tab', ' ']) - ->placeholder('New IP or IP Range') - ->default(env('TRUSTED_PROXIES', config('trustedproxy.proxies'))) - ->hintActions([ - FormAction::make('clear') - ->label('Clear') - ->color('danger') - ->icon('tabler-trash') - ->requiresConfirmation() - ->authorize(fn () => auth()->user()->can('update settings')) - ->action(fn (Set $set) => $set('TRUSTED_PROXIES', [])), - FormAction::make('cloudflare') - ->label('Set to Cloudflare IPs') - ->icon('tabler-brand-cloudflare') - ->authorize(fn () => auth()->user()->can('update settings')) - ->action(fn (Set $set) => $set('TRUSTED_PROXIES', [ - '173.245.48.0/20', - '103.21.244.0/22', - '103.22.200.0/22', - '103.31.4.0/22', - '141.101.64.0/18', - '108.162.192.0/18', - '190.93.240.0/20', - '188.114.96.0/20', - '197.234.240.0/22', - '198.41.128.0/17', - '162.158.0.0/15', - '104.16.0.0/13', - '104.24.0.0/14', - '172.64.0.0/13', - '131.0.72.0/22', - ])), - ]), - ]; - } - - private function recaptchaSettings(): array - { - return [ - Toggle::make('RECAPTCHA_ENABLED') - ->label('Enable reCAPTCHA?') - ->inline(false) - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('RECAPTCHA_ENABLED', (bool) $state)) - ->default(env('RECAPTCHA_ENABLED', config('recaptcha.enabled'))), - TextInput::make('RECAPTCHA_DOMAIN') - ->label('Domain') - ->required() - ->visible(fn (Get $get) => $get('RECAPTCHA_ENABLED')) - ->default(env('RECAPTCHA_DOMAIN', config('recaptcha.domain'))), - TextInput::make('RECAPTCHA_WEBSITE_KEY') - ->label('Website Key') - ->required() - ->visible(fn (Get $get) => $get('RECAPTCHA_ENABLED')) - ->default(env('RECAPTCHA_WEBSITE_KEY', config('recaptcha.website_key'))), - TextInput::make('RECAPTCHA_SECRET_KEY') - ->label('Secret Key') - ->required() - ->visible(fn (Get $get) => $get('RECAPTCHA_ENABLED')) - ->default(env('RECAPTCHA_SECRET_KEY', config('recaptcha.secret_key'))), - ]; - } - - private function mailSettings(): array - { - return [ - ToggleButtons::make('MAIL_MAILER') - ->label('Mail Driver') - ->columnSpanFull() - ->inline() - ->options([ - 'log' => 'Print mails to Log', - 'smtp' => 'SMTP Server', - 'sendmail' => 'sendmail Binary', - 'mailgun' => 'Mailgun', - 'mandrill' => 'Mandrill', - 'postmark' => 'Postmark', - ]) - ->live() - ->default(env('MAIL_MAILER', config('mail.default'))) - ->hintAction( - FormAction::make('test') - ->label('Send Test Mail') - ->icon('tabler-send') - ->hidden(fn (Get $get) => $get('MAIL_MAILER') === 'log') - ->authorize(fn () => auth()->user()->can('update settings')) - ->action(function () { - try { - MailNotification::route('mail', auth()->user()->email) - ->notify(new MailTested(auth()->user())); - - Notification::make() - ->title('Test Mail sent') - ->success() - ->send(); - } catch (Exception $exception) { - Notification::make() - ->title('Test Mail failed') - ->body($exception->getMessage()) - ->danger() - ->send(); - } - }) - ), - Section::make('"From" Settings') - ->description('Set the Address and Name used as "From" in mails.') - ->columns() - ->schema([ - TextInput::make('MAIL_FROM_ADDRESS') - ->label('From Address') - ->required() - ->email() - ->default(env('MAIL_FROM_ADDRESS', config('mail.from.address'))), - TextInput::make('MAIL_FROM_NAME') - ->label('From Name') - ->required() - ->default(env('MAIL_FROM_NAME', config('mail.from.name'))), - ]), - Section::make('SMTP Configuration') - ->columns() - ->visible(fn (Get $get) => $get('MAIL_MAILER') === 'smtp') - ->schema([ - TextInput::make('MAIL_HOST') - ->label('Host') - ->required() - ->default(env('MAIL_HOST', config('mail.mailers.smtp.host'))), - TextInput::make('MAIL_PORT') - ->label('Port') - ->required() - ->numeric() - ->minValue(1) - ->maxValue(65535) - ->default(env('MAIL_PORT', config('mail.mailers.smtp.port'))), - TextInput::make('MAIL_USERNAME') - ->label('Username') - ->default(env('MAIL_USERNAME', config('mail.mailers.smtp.username'))), - TextInput::make('MAIL_PASSWORD') - ->label('Password') - ->password() - ->revealable() - ->default(env('MAIL_PASSWORD')), - ToggleButtons::make('MAIL_ENCRYPTION') - ->label('Encryption') - ->inline() - ->options(['tls' => 'TLS', 'ssl' => 'SSL', '' => 'None']) - ->default(env('MAIL_ENCRYPTION', config('mail.mailers.smtp.encryption', 'tls'))), - ]), - Section::make('Mailgun Configuration') - ->columns() - ->visible(fn (Get $get) => $get('MAIL_MAILER') === 'mailgun') - ->schema([ - TextInput::make('MAILGUN_DOMAIN') - ->label('Domain') - ->required() - ->default(env('MAILGUN_DOMAIN', config('services.mailgun.domain'))), - TextInput::make('MAILGUN_SECRET') - ->label('Secret') - ->required() - ->default(env('MAILGUN_SECRET', config('services.mailgun.secret'))), - TextInput::make('MAILGUN_ENDPOINT') - ->label('Endpoint') - ->required() - ->default(env('MAILGUN_ENDPOINT', config('services.mailgun.endpoint'))), - ]), - ]; - } - - private function backupSettings(): array - { - return [ - ToggleButtons::make('APP_BACKUP_DRIVER') - ->label('Backup Driver') - ->columnSpanFull() - ->inline() - ->options([ - Backup::ADAPTER_DAEMON => 'Wings', - Backup::ADAPTER_AWS_S3 => 'S3', - ]) - ->live() - ->default(env('APP_BACKUP_DRIVER', config('backups.default'))), - Section::make('Throttles') - ->description('Configure how many backups can be created in a period. Set period to 0 to disable this throttle.') - ->columns() - ->schema([ - TextInput::make('BACKUP_THROTTLE_LIMIT') - ->label('Limit') - ->required() - ->numeric() - ->minValue(1) - ->default(config('backups.throttles.limit')), - TextInput::make('BACKUP_THROTTLE_PERIOD') - ->label('Period') - ->required() - ->numeric() - ->minValue(0) - ->suffix('Seconds') - ->default(config('backups.throttles.period')), - ]), - Section::make('S3 Configuration') - ->columns() - ->visible(fn (Get $get) => $get('APP_BACKUP_DRIVER') === Backup::ADAPTER_AWS_S3) - ->schema([ - TextInput::make('AWS_DEFAULT_REGION') - ->label('Default Region') - ->required() - ->default(config('backups.disks.s3.region')), - TextInput::make('AWS_ACCESS_KEY_ID') - ->label('Access Key ID') - ->required() - ->default(config('backups.disks.s3.key')), - TextInput::make('AWS_SECRET_ACCESS_KEY') - ->label('Secret Access Key') - ->required() - ->default(config('backups.disks.s3.secret')), - TextInput::make('AWS_BACKUPS_BUCKET') - ->label('Bucket') - ->required() - ->default(config('backups.disks.s3.bucket')), - TextInput::make('AWS_ENDPOINT') - ->label('Endpoint') - ->required() - ->default(config('backups.disks.s3.endpoint')), - Toggle::make('AWS_USE_PATH_STYLE_ENDPOINT') - ->label('Use path style endpoint?') - ->inline(false) - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('AWS_USE_PATH_STYLE_ENDPOINT', (bool) $state)) - ->default(env('AWS_USE_PATH_STYLE_ENDPOINT', config('backups.disks.s3.use_path_style_endpoint'))), - ]), - ]; - } - - private function miscSettings(): array - { - return [ - Section::make('Automatic Allocation Creation') - ->description('Toggle if Users can create allocations via the client area.') - ->columns() - ->collapsible() - ->collapsed() - ->schema([ - Toggle::make('PANEL_CLIENT_ALLOCATIONS_ENABLED') - ->label('Allow Users to create allocations?') - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->columnSpanFull() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_CLIENT_ALLOCATIONS_ENABLED', (bool) $state)) - ->default(env('PANEL_CLIENT_ALLOCATIONS_ENABLED', config('panel.client_features.allocations.enabled'))), - TextInput::make('PANEL_CLIENT_ALLOCATIONS_RANGE_START') - ->label('Starting Port') - ->required() - ->numeric() - ->minValue(1024) - ->maxValue(65535) - ->visible(fn (Get $get) => $get('PANEL_CLIENT_ALLOCATIONS_ENABLED')) - ->default(env('PANEL_CLIENT_ALLOCATIONS_RANGE_START')), - TextInput::make('PANEL_CLIENT_ALLOCATIONS_RANGE_END') - ->label('Ending Port') - ->required() - ->numeric() - ->minValue(1024) - ->maxValue(65535) - ->visible(fn (Get $get) => $get('PANEL_CLIENT_ALLOCATIONS_ENABLED')) - ->default(env('PANEL_CLIENT_ALLOCATIONS_RANGE_END')), - ]), - Section::make('Mail Notifications') - ->description('Toggle which mail notifications should be sent to Users.') - ->columns() - ->collapsible() - ->collapsed() - ->schema([ - Toggle::make('PANEL_SEND_INSTALL_NOTIFICATION') - ->label('Server Installed') - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->columnSpanFull() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_SEND_INSTALL_NOTIFICATION', (bool) $state)) - ->default(env('PANEL_SEND_INSTALL_NOTIFICATION', config('panel.email.send_install_notification'))), - Toggle::make('PANEL_SEND_REINSTALL_NOTIFICATION') - ->label('Server Reinstalled') - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->columnSpanFull() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_SEND_REINSTALL_NOTIFICATION', (bool) $state)) - ->default(env('PANEL_SEND_REINSTALL_NOTIFICATION', config('panel.email.send_reinstall_notification'))), - ]), - Section::make('Connections') - ->description('Timeouts used when making requests.') - ->columns() - ->collapsible() - ->collapsed() - ->schema([ - TextInput::make('GUZZLE_TIMEOUT') - ->label('Request Timeout') - ->required() - ->numeric() - ->minValue(15) - ->maxValue(60) - ->suffix('Seconds') - ->default(env('GUZZLE_TIMEOUT', config('panel.guzzle.timeout'))), - TextInput::make('GUZZLE_CONNECT_TIMEOUT') - ->label('Connect Timeout') - ->required() - ->numeric() - ->minValue(5) - ->maxValue(60) - ->suffix('Seconds') - ->default(env('GUZZLE_CONNECT_TIMEOUT', config('panel.guzzle.connect_timeout'))), - ]), - Section::make('Activity Logs') - ->description('Configure how often old activity logs should be pruned and whether admin activities should be logged.') - ->columns() - ->collapsible() - ->collapsed() - ->schema([ - TextInput::make('APP_ACTIVITY_PRUNE_DAYS') - ->label('Prune age') - ->required() - ->numeric() - ->minValue(1) - ->maxValue(365) - ->suffix('Days') - ->default(env('APP_ACTIVITY_PRUNE_DAYS', config('activity.prune_days'))), - Toggle::make('APP_ACTIVITY_HIDE_ADMIN') - ->label('Hide admin activities?') - ->inline(false) - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('APP_ACTIVITY_HIDE_ADMIN', (bool) $state)) - ->default(env('APP_ACTIVITY_HIDE_ADMIN', config('activity.hide_admin_activity'))), - ]), - Section::make('API') - ->description('Defines the rate limit for the number of requests per minute that can be executed.') - ->columns() - ->collapsible() - ->collapsed() - ->schema([ - TextInput::make('APP_API_CLIENT_RATELIMIT') - ->label('Client API Rate Limit') - ->required() - ->numeric() - ->minValue(1) - ->suffix('Requests Per Minute') - ->default(env('APP_API_CLIENT_RATELIMIT', config('http.rate_limit.client'))), - TextInput::make('APP_API_APPLICATION_RATELIMIT') - ->label('Application API Rate Limit') - ->required() - ->numeric() - ->minValue(1) - ->suffix('Requests Per Minute') - ->default(env('APP_API_APPLICATION_RATELIMIT', config('http.rate_limit.application'))), - ]), - Section::make('Server') - ->description('Settings for Servers.') - ->columns() - ->collapsible() - ->collapsed() - ->schema([ - Toggle::make('PANEL_EDITABLE_SERVER_DESCRIPTIONS') - ->label('Allow Users to edit Server Descriptions?') - ->onIcon('tabler-check') - ->offIcon('tabler-x') - ->onColor('success') - ->offColor('danger') - ->live() - ->columnSpanFull() - ->formatStateUsing(fn ($state): bool => (bool) $state) - ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_EDITABLE_SERVER_DESCRIPTIONS', (bool) $state)) - ->default(env('PANEL_EDITABLE_SERVER_DESCRIPTIONS', config('panel.editable_server_descriptions'))), - ]), - - ]; - } - - protected function getFormStatePath(): ?string - { - return 'data'; - } - - protected function hasUnsavedDataChangesAlert(): bool - { - return true; - } - - public function save(): void - { - try { - $data = $this->form->getState(); - - // Convert bools to a string, so they are correctly written to the .env file - $data = array_map(fn ($value) => is_bool($value) ? ($value ? 'true' : 'false') : $value, $data); - - $this->writeToEnvironment($data); - - Artisan::call('config:clear'); - Artisan::call('queue:restart'); - - $this->rememberData(); - - $this->redirect($this->getUrl()); - - Notification::make() - ->title('Settings saved') - ->success() - ->send(); - } catch (Exception $exception) { - Notification::make() - ->title('Save failed') - ->body($exception->getMessage()) - ->danger() - ->send(); - } - } - - protected function getHeaderActions(): array - { - return [ - Action::make('save') - ->action('save') - ->authorize(fn () => auth()->user()->can('update settings')) - ->keyBindings(['mod+s']), - ]; - - } -} diff --git a/app/Filament/Resources/ApiKeyResource.php b/app/Filament/Resources/ApiKeyResource.php deleted file mode 100644 index ba2a851cac..0000000000 --- a/app/Filament/Resources/ApiKeyResource.php +++ /dev/null @@ -1,33 +0,0 @@ -count() ?: null; - } - - public static function canEdit($record): bool - { - return false; - } - - public static function getPages(): array - { - return [ - 'index' => Pages\ListApiKeys::route('/'), - 'create' => Pages\CreateApiKey::route('/create'), - ]; - } -} diff --git a/app/Filament/Resources/ApiKeyResource/Pages/CreateApiKey.php b/app/Filament/Resources/ApiKeyResource/Pages/CreateApiKey.php deleted file mode 100644 index 11e1fae032..0000000000 --- a/app/Filament/Resources/ApiKeyResource/Pages/CreateApiKey.php +++ /dev/null @@ -1,90 +0,0 @@ -schema([ - Hidden::make('identifier')->default(ApiKey::generateTokenIdentifier(ApiKey::TYPE_APPLICATION)), - Hidden::make('token')->default(str_random(ApiKey::KEY_LENGTH)), - - Hidden::make('user_id') - ->default(auth()->user()->id) - ->required(), - - Hidden::make('key_type') - ->inlineLabel() - ->default(ApiKey::TYPE_APPLICATION) - ->required(), - - Fieldset::make('Permissions') - ->columns([ - 'default' => 1, - 'sm' => 1, - 'md' => 2, - ]) - ->schema( - collect(ApiKey::RESOURCES)->map(fn ($resource) => ToggleButtons::make("r_$resource") - ->label(str($resource)->replace('_', ' ')->title())->inline() - ->options([ - 0 => 'None', - 1 => 'Read', - // 2 => 'Write', - 3 => 'Read & Write', - ]) - ->icons([ - 0 => 'tabler-book-off', - 1 => 'tabler-book', - 2 => 'tabler-writing', - 3 => 'tabler-writing', - ]) - ->colors([ - 0 => 'success', - 1 => 'warning', - 2 => 'danger', - 3 => 'danger', - ]) - ->required() - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - ]) - ->default(0), - )->all(), - ), - - TagsInput::make('allowed_ips') - ->placeholder('Example: 127.0.0.1 or 192.168.1.1') - ->label('Whitelisted IPv4 Addresses') - ->helperText('Press enter to add a new IP address or leave blank to allow any IP address') - ->columnSpanFull(), - - Textarea::make('memo') - ->required() - ->label('Description') - ->helperText(' - Once you have assigned permissions and created this set of credentials you will be unable to come back and edit it. - If you need to make changes down the road you will need to create a new set of credentials. - ') - ->columnSpanFull(), - ]); - } -} diff --git a/app/Filament/Resources/ApiKeyResource/Pages/ListApiKeys.php b/app/Filament/Resources/ApiKeyResource/Pages/ListApiKeys.php deleted file mode 100644 index aa0b9cdb5c..0000000000 --- a/app/Filament/Resources/ApiKeyResource/Pages/ListApiKeys.php +++ /dev/null @@ -1,74 +0,0 @@ -searchable(false) - ->modifyQueryUsing(fn ($query) => $query->where('key_type', ApiKey::TYPE_APPLICATION)) - ->columns([ - TextColumn::make('key') - ->copyable() - ->icon('tabler-clipboard-text') - ->state(fn (ApiKey $key) => $key->identifier . $key->token), - - TextColumn::make('memo') - ->label('Description') - ->wrap() - ->limit(50), - - TextColumn::make('identifier') - ->hidden() - ->searchable(), - - TextColumn::make('last_used_at') - ->label('Last Used') - ->placeholder('Not Used') - ->dateTime() - ->sortable(), - - TextColumn::make('created_at') - ->label('Created') - ->dateTime() - ->sortable(), - - TextColumn::make('user.username') - ->label('Created By') - ->url(fn (ApiKey $apiKey): string => route('filament.admin.resources.users.edit', ['record' => $apiKey->user])), - ]) - ->actions([ - DeleteAction::make(), - ]) - ->emptyStateIcon('tabler-key') - ->emptyStateDescription('') - ->emptyStateHeading('No API Keys') - ->emptyStateActions([ - CreateAction::make('create') - ->label('Create API Key') - ->button(), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make() - ->label('Create API Key') - ->hidden(fn () => ApiKey::where('key_type', ApiKey::TYPE_APPLICATION)->count() <= 0), - ]; - } -} diff --git a/app/Filament/Resources/DatabaseHostResource.php b/app/Filament/Resources/DatabaseHostResource.php deleted file mode 100644 index 7576fbc3a8..0000000000 --- a/app/Filament/Resources/DatabaseHostResource.php +++ /dev/null @@ -1,31 +0,0 @@ - Pages\ListDatabaseHosts::route('/'), - 'create' => Pages\CreateDatabaseHost::route('/create'), - 'edit' => Pages\EditDatabaseHost::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php b/app/Filament/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php deleted file mode 100644 index d3e07bcb93..0000000000 --- a/app/Filament/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php +++ /dev/null @@ -1,114 +0,0 @@ -schema([ - Section::make() - ->columns([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 4, - ]) - ->schema([ - TextInput::make('host') - ->columnSpan(2) - ->helperText('The IP address or Domain name that should be used when attempting to connect to this MySQL host from this Panel to create new databases.') - ->required() - ->live(onBlur: true) - ->afterStateUpdated(fn ($state, Forms\Set $set) => $set('name', $state)) - ->maxLength(255), - TextInput::make('port') - ->columnSpan(1) - ->helperText('The port that MySQL is running on for this host.') - ->required() - ->numeric() - ->default(3306) - ->minValue(0) - ->maxValue(65535), - TextInput::make('max_databases') - ->label('Max databases') - ->helpertext('Blank is unlimited.') - ->numeric(), - TextInput::make('name') - ->label('Display Name') - ->helperText('A short identifier used to distinguish this location from others. Must be between 1 and 60 characters, for example, us.nyc.lvl3.') - ->required() - ->maxLength(60), - TextInput::make('username') - ->helperText('The username of an account that has enough permissions to create new users and databases on the system.') - ->required() - ->maxLength(255), - TextInput::make('password') - ->helperText('The password for the database user.') - ->password() - ->revealable() - ->maxLength(255) - ->required(), - Select::make('node_id') - ->searchable() - ->preload() - ->helperText('This setting only defaults to this database host when adding a database to a server on the selected node.') - ->label('Linked Node') - ->relationship('node', 'name'), - ]), - ]); - } - - protected function getHeaderActions(): array - { - return [ - $this->getCreateFormAction()->formId('form'), - ]; - } - - protected function getFormActions(): array - { - return []; - } - - protected function handleRecordCreation(array $data): Model - { - return resolve(HostCreationService::class)->handle($data); - } - - public function exception($e, $stopPropagation): void - { - if ($e instanceof PDOException) { - Notification::make() - ->title('Error connecting to database host') - ->body($e->getMessage()) - ->color('danger') - ->icon('tabler-database') - ->danger() - ->send(); - - $stopPropagation(); - } - } -} diff --git a/app/Filament/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php b/app/Filament/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php deleted file mode 100644 index 862c33b8cb..0000000000 --- a/app/Filament/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php +++ /dev/null @@ -1,119 +0,0 @@ -schema([ - Section::make() - ->columns([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 4, - ]) - ->schema([ - TextInput::make('host') - ->columnSpan(2) - ->helperText('The IP address or Domain name that should be used when attempting to connect to this MySQL host from this Panel to create new databases.') - ->required() - ->live(onBlur: true) - ->afterStateUpdated(fn ($state, Forms\Set $set) => $set('name', $state)) - ->maxLength(255), - TextInput::make('port') - ->columnSpan(1) - ->helperText('The port that MySQL is running on for this host.') - ->required() - ->numeric() - ->minValue(0) - ->maxValue(65535), - TextInput::make('max_databases') - ->label('Max databases') - ->helpertext('Blank is unlimited.') - ->numeric(), - TextInput::make('name') - ->label('Display Name') - ->helperText('A short identifier used to distinguish this location from others. Must be between 1 and 60 characters, for example, us.nyc.lvl3.') - ->required() - ->maxLength(60), - TextInput::make('username') - ->helperText('The username of an account that has enough permissions to create new users and databases on the system.') - ->required() - ->maxLength(255), - TextInput::make('password') - ->helperText('The password for the database user.') - ->password() - ->revealable() - ->maxLength(255), - Select::make('node_id') - ->searchable() - ->preload() - ->helperText('This setting only defaults to this database host when adding a database to a server on the selected node.') - ->label('Linked Node') - ->relationship('node', 'name'), - ]), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\DeleteAction::make() - ->label(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0 ? 'Database Host Has Databases' : 'Delete') - ->disabled(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0), - $this->getSaveFormAction()->formId('form'), - ]; - } - - protected function getFormActions(): array - { - return []; - } - - public function getRelationManagers(): array - { - return [ - DatabasesRelationManager::class, - ]; - } - - protected function handleRecordUpdate($record, array $data): Model - { - return resolve(HostUpdateService::class)->handle($record->id, $data); - } - - public function exception($e, $stopPropagation): void - { - if ($e instanceof PDOException) { - Notification::make() - ->title('Error connecting to database host') - ->body($e->getMessage()) - ->color('danger') - ->icon('tabler-database') - ->danger() - ->send(); - - $stopPropagation(); - } - } -} diff --git a/app/Filament/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php b/app/Filament/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php deleted file mode 100644 index 384f9cda63..0000000000 --- a/app/Filament/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php +++ /dev/null @@ -1,69 +0,0 @@ -searchable(false) - ->columns([ - TextColumn::make('name') - ->searchable(), - TextColumn::make('host') - ->searchable(), - TextColumn::make('port') - ->sortable(), - TextColumn::make('username') - ->searchable(), - TextColumn::make('max_databases') - ->numeric() - ->sortable(), - TextColumn::make('node.name') - ->numeric() - ->sortable(), - ]) - ->actions([ - EditAction::make(), - ]) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete databasehost')), - ]), - ]) - ->emptyStateIcon('tabler-database') - ->emptyStateDescription('') - ->emptyStateHeading('No Database Hosts') - ->emptyStateActions([ - CreateAction::make('create') - ->label('Create Database Host') - ->button(), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make('create') - ->label('Create Database Host') - ->hidden(fn () => DatabaseHost::count() <= 0), - ]; - } -} diff --git a/app/Filament/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php b/app/Filament/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php deleted file mode 100644 index 4dfcdd955b..0000000000 --- a/app/Filament/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php +++ /dev/null @@ -1,71 +0,0 @@ -schema([ - TextInput::make('database')->columnSpanFull(), - TextInput::make('username'), - TextInput::make('password') - ->hintAction( - Action::make('rotate') - ->icon('tabler-refresh') - ->requiresConfirmation() - ->action(fn (DatabasePasswordService $service, Database $database, $set, $get) => $this->rotatePassword($service, $database, $set, $get)) - ) - ->formatStateUsing(fn (Database $database) => $database->password), - TextInput::make('remote')->label('Connections From'), - TextInput::make('max_connections'), - TextInput::make('JDBC') - ->label('JDBC Connection String') - ->columnSpanFull() - ->formatStateUsing(fn (Get $get, Database $database) => 'jdbc:mysql://' . $get('username') . ':' . urlencode($database->password) . '@' . $database->host->host . ':' . $database->host->port . '/' . $get('database')), - ]); - } - public function table(Table $table): Table - { - return $table - ->recordTitleAttribute('servers') - ->columns([ - TextColumn::make('database')->icon('tabler-database'), - TextColumn::make('username')->icon('tabler-user'), - TextColumn::make('remote'), - TextColumn::make('server.name') - ->icon('tabler-brand-docker') - ->url(fn (Database $database) => route('filament.admin.resources.servers.edit', ['record' => $database->server_id])), - TextColumn::make('max_connections'), - TextColumn::make('created_at')->dateTime(), - ]) - ->actions([ - DeleteAction::make(), - ViewAction::make()->color('primary'), - ]); - } - - protected function rotatePassword(DatabasePasswordService $service, Database $database, $set, $get): void - { - $newPassword = $service->handle($database); - $jdbcString = 'jdbc:mysql://' . $get('username') . ':' . urlencode($newPassword) . '@' . $database->host->host . ':' . $database->host->port . '/' . $get('database'); - - $set('password', $newPassword); - $set('JDBC', $jdbcString); - } -} diff --git a/app/Filament/Resources/DatabaseResource.php b/app/Filament/Resources/DatabaseResource.php deleted file mode 100644 index 92580dfdff..0000000000 --- a/app/Filament/Resources/DatabaseResource.php +++ /dev/null @@ -1,31 +0,0 @@ - Pages\ListDatabases::route('/'), - 'create' => Pages\CreateDatabase::route('/create'), - 'edit' => Pages\EditDatabase::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/DatabaseResource/Pages/CreateDatabase.php b/app/Filament/Resources/DatabaseResource/Pages/CreateDatabase.php deleted file mode 100644 index 0e85e0a6a0..0000000000 --- a/app/Filament/Resources/DatabaseResource/Pages/CreateDatabase.php +++ /dev/null @@ -1,47 +0,0 @@ -schema([ - Select::make('server_id') - ->relationship('server', 'name') - ->searchable() - ->preload() - ->required(), - TextInput::make('database_host_id') - ->required() - ->numeric(), - TextInput::make('database') - ->required() - ->maxLength(255), - TextInput::make('remote') - ->required() - ->maxLength(255) - ->default('%'), - TextInput::make('username') - ->required() - ->maxLength(255), - TextInput::make('password') - ->password() - ->revealable() - ->required(), - TextInput::make('max_connections') - ->numeric() - ->minValue(0) - ->default(0), - ]); - } -} diff --git a/app/Filament/Resources/DatabaseResource/Pages/EditDatabase.php b/app/Filament/Resources/DatabaseResource/Pages/EditDatabase.php deleted file mode 100644 index 2e1540e989..0000000000 --- a/app/Filament/Resources/DatabaseResource/Pages/EditDatabase.php +++ /dev/null @@ -1,55 +0,0 @@ -schema([ - Select::make('server_id') - ->relationship('server', 'name') - ->searchable() - ->preload() - ->required(), - TextInput::make('database_host_id') - ->required() - ->numeric(), - TextInput::make('database') - ->required() - ->maxLength(255), - TextInput::make('remote') - ->required() - ->maxLength(255) - ->default('%'), - TextInput::make('username') - ->required() - ->maxLength(255), - TextInput::make('password') - ->password() - ->revealable() - ->required(), - TextInput::make('max_connections') - ->numeric() - ->minValue(0) - ->default(0), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\DeleteAction::make(), - ]; - } -} diff --git a/app/Filament/Resources/DatabaseResource/Pages/ListDatabases.php b/app/Filament/Resources/DatabaseResource/Pages/ListDatabases.php deleted file mode 100644 index 6dfe7762a1..0000000000 --- a/app/Filament/Resources/DatabaseResource/Pages/ListDatabases.php +++ /dev/null @@ -1,63 +0,0 @@ -columns([ - TextColumn::make('server.name') - ->numeric() - ->sortable(), - TextColumn::make('database_host_id') - ->numeric() - ->sortable(), - TextColumn::make('database') - ->searchable(), - TextColumn::make('username') - ->searchable(), - TextColumn::make('remote') - ->searchable(), - TextColumn::make('max_connections') - ->numeric() - ->sortable(), - TextColumn::make('created_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - TextColumn::make('updated_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - ]) - ->actions([ - EditAction::make(), - ]) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete database')), - ]), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make(), - ]; - } -} diff --git a/app/Filament/Resources/EggResource.php b/app/Filament/Resources/EggResource.php deleted file mode 100644 index 7540067a76..0000000000 --- a/app/Filament/Resources/EggResource.php +++ /dev/null @@ -1,37 +0,0 @@ - Pages\ListEggs::route('/'), - 'create' => Pages\CreateEgg::route('/create'), - 'edit' => Pages\EditEgg::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/EggResource/Pages/CreateEgg.php b/app/Filament/Resources/EggResource/Pages/CreateEgg.php deleted file mode 100644 index a663540cb5..0000000000 --- a/app/Filament/Resources/EggResource/Pages/CreateEgg.php +++ /dev/null @@ -1,249 +0,0 @@ -schema([ - Tabs::make()->tabs([ - Tab::make('Configuration') - ->columns(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 4]) - ->schema([ - TextInput::make('name') - ->required() - ->maxLength(255) - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->helperText('A simple, human-readable name to use as an identifier for this Egg.'), - TextInput::make('author') - ->maxLength(255) - ->required() - ->email() - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->helperText('The author of this version of the Egg.'), - Textarea::make('description') - ->rows(3) - ->columnSpanFull() - ->helperText('A description of this Egg that will be displayed throughout the Panel as needed.'), - Textarea::make('startup') - ->rows(3) - ->columnSpanFull() - ->required() - ->placeholder(implode("\n", [ - 'java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}', - ])) - ->helperText('The default startup command that should be used for new servers using this Egg.'), - TagsInput::make('features') - ->placeholder('Add Feature') - ->helperText('') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), - Toggle::make('force_outgoing_ip') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip("Forces all outgoing network traffic to have its Source IP NATed to the IP of the server's primary allocation IP. - Required for certain games to work properly when the Node has multiple public IP addresses. - Enabling this option will disable internal networking for any servers using this egg, causing them to be unable to internally access other servers on the same node."), - Hidden::make('script_is_privileged') - ->default(1), - TagsInput::make('tags') - ->placeholder('Add Tags') - ->helperText('') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), - TextInput::make('update_url') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('URLs must point directly to the raw .json file.') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->url(), - KeyValue::make('docker_images') - ->live() - ->columnSpanFull() - ->required() - ->addActionLabel('Add Image') - ->keyLabel('Name') - ->keyPlaceholder('Java 21') - ->valueLabel('Image URI') - ->valuePlaceholder('ghcr.io/parkervcp/yolks:java_21') - ->helperText('The docker images available to servers using this egg.'), - ]), - - Tab::make('Process Management') - ->columns() - ->schema([ - Hidden::make('config_from') - ->default(null) - ->label('Copy Settings From') - // ->placeholder('None') - // ->relationship('configFrom', 'name', ignoreRecord: true) - ->helperText('If you would like to default to settings from another Egg select it from the menu above.'), - TextInput::make('config_stop') - ->required() - ->maxLength(255) - ->label('Stop Command') - ->helperText('The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.'), - Textarea::make('config_startup')->rows(10)->json() - ->label('Start Configuration') - ->default('{}') - ->helperText('List of values the daemon should be looking for when booting a server to determine completion.'), - Textarea::make('config_files')->rows(10)->json() - ->label('Configuration Files') - ->default('{}') - ->helperText('This should be a JSON representation of configuration files to modify and what parts should be changed.'), - Textarea::make('config_logs')->rows(10)->json() - ->label('Log Configuration') - ->default('{}') - ->helperText('This should be a JSON representation of where log files are stored, and whether or not the daemon should be creating custom logs.'), - ]), - Tab::make('Egg Variables') - ->columnSpanFull() - ->schema([ - Repeater::make('variables') - ->label('') - ->addActionLabel('Add New Egg Variable') - ->grid() - ->relationship('variables') - ->name('name') - ->reorderable()->orderColumn() - ->collapsible()->collapsed() - ->columnSpan(2) - ->defaultItems(0) - ->itemLabel(fn (array $state) => $state['name']) - ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { - $data['default_value'] ??= ''; - $data['description'] ??= ''; - $data['rules'] ??= []; - $data['user_viewable'] ??= ''; - $data['user_editable'] ??= ''; - - return $data; - }) - ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { - $data['default_value'] ??= ''; - $data['description'] ??= ''; - $data['rules'] ??= []; - $data['user_viewable'] ??= ''; - $data['user_editable'] ??= ''; - - return $data; - }) - ->schema([ - TextInput::make('name') - ->live() - ->debounce(750) - ->maxLength(255) - ->columnSpanFull() - ->afterStateUpdated(fn (Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString()) - ) - ->required(), - Textarea::make('description')->columnSpanFull(), - TextInput::make('env_variable') - ->label('Environment Variable') - ->maxLength(255) - ->prefix('{{') - ->suffix('}}') - ->hintIcon('tabler-code') - ->hintIconTooltip(fn ($state) => "{{{$state}}}") - ->required(), - TextInput::make('default_value')->maxLength(255), - Fieldset::make('User Permissions') - ->schema([ - Checkbox::make('user_viewable')->label('Viewable'), - Checkbox::make('user_editable')->label('Editable'), - ]), - TagsInput::make('rules') - ->columnSpanFull() - ->placeholder('Add Rule') - ->reorderable() - ->suggestions([ - 'required', - 'nullable', - 'string', - 'integer', - 'numeric', - 'boolean', - 'alpha', - 'alpha_dash', - 'alpha_num', - 'url', - 'email', - 'regex:', - 'min:', - 'max:', - 'between:', - 'between:1024,65535', - 'in:', - 'in:true,false', - ]), - ]), - ]), - Tab::make('Install Script') - ->columns(3) - ->schema([ - - Hidden::make('copy_script_from'), - //->placeholder('None') - //->relationship('scriptFrom', 'name', ignoreRecord: true), - - TextInput::make('script_container') - ->required() - ->maxLength(255) - ->default('ghcr.io/pelican-eggs/installers:debian'), - - Select::make('script_entry') - ->selectablePlaceholder(false) - ->default('bash') - ->options(['bash', 'ash', '/bin/bash']) - ->required(), - - MonacoEditor::make('script_install') - ->columnSpanFull() - ->fontSize('16px') - ->language('shell') - ->lazy() - ->view('filament.plugins.monaco-editor'), - ]), - - ])->columnSpanFull()->persistTabInQueryString(), - ]); - } - - protected function handleRecordCreation(array $data): Model - { - $data['uuid'] ??= Str::uuid()->toString(); - - if (is_array($data['config_startup'])) { - $data['config_startup'] = json_encode($data['config_startup']); - } - - if (is_array($data['config_logs'])) { - $data['config_logs'] = json_encode($data['config_logs']); - } - - logger()->info('new egg', $data); - - return parent::handleRecordCreation($data); - } -} diff --git a/app/Filament/Resources/EggResource/Pages/EditEgg.php b/app/Filament/Resources/EggResource/Pages/EditEgg.php deleted file mode 100644 index d1d59c0640..0000000000 --- a/app/Filament/Resources/EggResource/Pages/EditEgg.php +++ /dev/null @@ -1,344 +0,0 @@ -schema([ - Tabs::make()->tabs([ - Tab::make('Configuration') - ->columns(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 4]) - ->icon('tabler-egg') - ->schema([ - TextInput::make('name') - ->required() - ->maxLength(255) - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 1]) - ->helperText('A simple, human-readable name to use as an identifier for this Egg.'), - TextInput::make('uuid') - ->label('Egg UUID') - ->disabled() - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) - ->helperText('This is the globally unique identifier for this Egg which Wings uses as an identifier.'), - TextInput::make('id') - ->label('Egg ID') - ->disabled(), - Textarea::make('description') - ->rows(3) - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->helperText('A description of this Egg that will be displayed throughout the Panel as needed.'), - TextInput::make('author') - ->required() - ->maxLength(255) - ->email() - ->disabled() - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->helperText('The author of this version of the Egg. Uploading a new Egg configuration from a different author will change this.'), - Textarea::make('startup') - ->rows(2) - ->columnSpanFull() - ->required() - ->helperText('The default startup command that should be used for new servers using this Egg.'), - TagsInput::make('file_denylist') - ->hidden() // latest wings breaks it. - ->placeholder('denied-file.txt') - ->helperText('A list of files that the end user is not allowed to edit.') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), - TagsInput::make('features') - ->placeholder('Add Feature') - ->helperText('') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), - Toggle::make('force_outgoing_ip') - ->inline(false) - ->hintIcon('tabler-question-mark') - ->hintIconTooltip("Forces all outgoing network traffic to have its Source IP NATed to the IP of the server's primary allocation IP. - Required for certain games to work properly when the Node has multiple public IP addresses. - Enabling this option will disable internal networking for any servers using this egg, causing them to be unable to internally access other servers on the same node."), - Hidden::make('script_is_privileged') - ->helperText('The docker images available to servers using this egg.'), - TagsInput::make('tags') - ->placeholder('Add Tags') - ->helperText('') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), - TextInput::make('update_url') - ->label('Update URL') - ->url() - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('URLs must point directly to the raw .json file.') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), - KeyValue::make('docker_images') - ->live() - ->columnSpanFull() - ->required() - ->addActionLabel('Add Image') - ->keyLabel('Name') - ->valueLabel('Image URI') - ->helperText('The docker images available to servers using this egg.'), - ]), - Tab::make('Process Management') - ->columns() - ->icon('tabler-server-cog') - ->schema([ - Select::make('config_from') - ->label('Copy Settings From') - ->placeholder('None') - ->relationship('configFrom', 'name', ignoreRecord: true) - ->helperText('If you would like to default to settings from another Egg select it from the menu above.'), - TextInput::make('config_stop') - ->maxLength(255) - ->label('Stop Command') - ->helperText('The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.'), - Textarea::make('config_startup')->rows(10)->json() - ->label('Start Configuration') - ->helperText('List of values the daemon should be looking for when booting a server to determine completion.'), - Textarea::make('config_files')->rows(10)->json() - ->label('Configuration Files') - ->helperText('This should be a JSON representation of configuration files to modify and what parts should be changed.'), - Textarea::make('config_logs')->rows(10)->json() - ->label('Log Configuration') - ->helperText('This should be a JSON representation of where log files are stored, and whether or not the daemon should be creating custom logs.'), - ]), - Tab::make('Egg Variables') - ->columnSpanFull() - ->icon('tabler-variable') - ->schema([ - Repeater::make('variables') - ->label('') - ->grid() - ->relationship('variables') - ->name('name') - ->reorderable() - ->collapsible()->collapsed() - ->orderColumn() - ->addActionLabel('New Variable') - ->itemLabel(fn (array $state) => $state['name']) - ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { - $data['default_value'] ??= ''; - $data['description'] ??= ''; - $data['rules'] ??= []; - $data['user_viewable'] ??= ''; - $data['user_editable'] ??= ''; - - return $data; - }) - ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { - $data['default_value'] ??= ''; - $data['description'] ??= ''; - $data['rules'] ??= []; - $data['user_viewable'] ??= ''; - $data['user_editable'] ??= ''; - - return $data; - }) - ->schema([ - TextInput::make('name') - ->live() - ->debounce(750) - ->maxLength(255) - ->columnSpanFull() - ->afterStateUpdated(fn (Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString()) - ) - ->required(), - Textarea::make('description')->columnSpanFull(), - TextInput::make('env_variable') - ->label('Environment Variable') - ->maxLength(255) - ->prefix('{{') - ->suffix('}}') - ->hintIcon('tabler-code') - ->hintIconTooltip(fn ($state) => "{{{$state}}}") - ->required(), - TextInput::make('default_value')->maxLength(255), - Fieldset::make('User Permissions') - ->schema([ - Checkbox::make('user_viewable')->label('Viewable'), - Checkbox::make('user_editable')->label('Editable'), - ]), - TagsInput::make('rules') - ->columnSpanFull() - ->placeholder('Add Rule') - ->reorderable() - ->suggestions([ - 'required', - 'nullable', - 'string', - 'integer', - 'numeric', - 'boolean', - 'alpha', - 'alpha_dash', - 'alpha_num', - 'url', - 'email', - 'regex:', - 'min:', - 'max:', - 'between:', - 'between:1024,65535', - 'in:', - 'in:true,false', - ]), - ]), - ]), - Tab::make('Install Script') - ->columns(3) - ->icon('tabler-file-download') - ->schema([ - Select::make('copy_script_from') - ->placeholder('None') - ->relationship('scriptFrom', 'name', ignoreRecord: true), - TextInput::make('script_container') - ->required() - ->maxLength(255) - ->default('alpine:3.4'), - TextInput::make('script_entry') - ->required() - ->maxLength(255) - ->default('ash'), - MonacoEditor::make('script_install') - ->label('Install Script') - ->columnSpanFull() - ->fontSize('16px') - ->language('shell') - ->view('filament.plugins.monaco-editor'), - ]), - ])->columnSpanFull()->persistTabInQueryString(), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\DeleteAction::make('deleteEgg') - ->disabled(fn (Egg $egg): bool => $egg->servers()->count() > 0) - ->label(fn (Egg $egg): string => $egg->servers()->count() <= 0 ? 'Delete' : 'In Use'), - Actions\Action::make('exportEgg') - ->label('Export') - ->color('primary') - ->action(fn (EggExporterService $service, Egg $egg) => response()->streamDownload(function () use ($service, $egg) { - echo $service->handle($egg->id); - }, 'egg-' . $egg->getKebabName() . '.json')) - ->authorize(fn () => auth()->user()->can('export egg')), - Actions\Action::make('importEgg') - ->label('Import') - ->form([ - Placeholder::make('warning') - ->label('This will overwrite the current egg to the one you upload.'), - Tabs::make('Tabs') - ->tabs([ - Tab::make('From File') - ->icon('tabler-file-upload') - ->schema([ - FileUpload::make('egg') - ->label('Egg') - ->hint('eg. minecraft.json') - ->acceptedFileTypes(['application/json']) - ->storeFiles(false), - ]), - Tab::make('From URL') - ->icon('tabler-world-upload') - ->schema([ - TextInput::make('url') - ->label('URL') - ->default(fn (Egg $egg): ?string => $egg->update_url) - ->hint('Link to the egg file (eg. minecraft.json)') - ->url(), - ]), - ]) - ->contained(false), - - ]) - ->action(function (array $data, Egg $egg): void { - /** @var EggImporterService $eggImportService */ - $eggImportService = resolve(EggImporterService::class); - - if (!empty($data['egg'])) { - try { - $eggImportService->fromFile($data['egg'], $egg); - } catch (Exception $exception) { - Notification::make() - ->title('Import Failed') - ->body($exception->getMessage()) - ->danger() // Will Robinson - ->send(); - - report($exception); - - return; - } - } elseif (!empty($data['url'])) { - try { - $eggImportService->fromUrl($data['url'], $egg); - } catch (Exception $exception) { - Notification::make() - ->title('Import Failed') - ->body($exception->getMessage()) - ->danger() - ->send(); - - report($exception); - - return; - } - } - - $this->refreshForm(); - Notification::make() - ->title('Import Success') - ->success() - ->send(); - }) - ->authorize(fn () => auth()->user()->can('import egg')), - $this->getSaveFormAction()->formId('form'), - ]; - } - - public function refreshForm(): void - { - $this->fillForm(); - } - - protected function getFormActions(): array - { - return []; - } - - public function getRelationManagers(): array - { - return [ - ServersRelationManager::class, - ]; - } -} diff --git a/app/Filament/Resources/EggResource/Pages/ListEggs.php b/app/Filament/Resources/EggResource/Pages/ListEggs.php deleted file mode 100644 index 1a6a3b6509..0000000000 --- a/app/Filament/Resources/EggResource/Pages/ListEggs.php +++ /dev/null @@ -1,147 +0,0 @@ -searchable(true) - ->defaultPaginationPageOption(25) - ->checkIfRecordIsSelectableUsing(fn (Egg $egg) => $egg->servers_count <= 0) - ->columns([ - TextColumn::make('id') - ->label('Id') - ->hidden(), - TextColumn::make('name') - ->icon('tabler-egg') - ->description(fn ($record): ?string => (strlen($record->description) > 120) ? substr($record->description, 0, 120).'...' : $record->description) - ->wrap() - ->searchable() - ->sortable(), - TextColumn::make('servers_count') - ->counts('servers') - ->icon('tabler-server') - ->label('Servers'), - ]) - ->actions([ - EditAction::make(), - Tables\Actions\Action::make('export') - ->icon('tabler-download') - ->label('Export') - ->color('primary') - ->action(fn (EggExporterService $service, Egg $egg) => response()->streamDownload(function () use ($service, $egg) { - echo $service->handle($egg->id); - }, 'egg-' . $egg->getKebabName() . '.json')) - ->authorize(fn () => auth()->user()->can('export egg')), - ]) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete egg')), - ]), - ]); - } - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make('create')->label('Create Egg'), - - Actions\Action::make('import') - ->label('Import') - ->form([ - Tabs::make('Tabs') - ->tabs([ - Tab::make('From File') - ->icon('tabler-file-upload') - ->schema([ - FileUpload::make('egg') - ->label('Egg') - ->hint('This should be the json file ( egg-minecraft.json )') - ->acceptedFileTypes(['application/json']) - ->storeFiles(false) - ->multiple(), - ]), - Tab::make('From URL') - ->icon('tabler-world-upload') - ->schema([ - TextInput::make('url') - ->label('URL') - ->hint('This URL should point to a single json file') - ->url(), - ]), - ]) - ->contained(false), - - ]) - ->action(function (array $data): void { - /** @var EggImporterService $eggImportService */ - $eggImportService = resolve(EggImporterService::class); - - if (!empty($data['egg'])) { - /** @var TemporaryUploadedFile[] $eggFile */ - $eggFile = $data['egg']; - - foreach ($eggFile as $file) { - try { - $eggImportService->fromFile($file); - } catch (Exception $exception) { - Notification::make() - ->title('Import Failed') - ->danger() - ->send(); - - report($exception); - - return; - } - } - } - - if (!empty($data['url'])) { - try { - $eggImportService->fromUrl($data['url']); - } catch (Exception $exception) { - Notification::make() - ->title('Import Failed') - ->danger() - ->send(); - - report($exception); - - return; - } - } - - Notification::make() - ->title('Import Success') - ->success() - ->send(); - }) - ->authorize(fn () => auth()->user()->can('import egg')), - ]; - } -} diff --git a/app/Filament/Resources/EggResource/RelationManagers/ServersRelationManager.php b/app/Filament/Resources/EggResource/RelationManagers/ServersRelationManager.php deleted file mode 100644 index 0d7bb5b034..0000000000 --- a/app/Filament/Resources/EggResource/RelationManagers/ServersRelationManager.php +++ /dev/null @@ -1,43 +0,0 @@ -recordTitleAttribute('servers') - ->emptyStateDescription('No Servers')->emptyStateHeading('No servers are assigned to this Egg.') - ->searchable(false) - ->columns([ - TextColumn::make('user.username') - ->label('Owner') - ->icon('tabler-user') - ->url(fn (Server $server): string => route('filament.admin.resources.users.edit', ['record' => $server->user])) - ->sortable(), - TextColumn::make('name') - ->icon('tabler-brand-docker') - ->url(fn (Server $server): string => route('filament.admin.resources.servers.edit', ['record' => $server])) - ->sortable(), - TextColumn::make('node.name') - ->icon('tabler-server-2') - ->url(fn (Server $server): string => route('filament.admin.resources.nodes.edit', ['record' => $server->node])), - TextColumn::make('image') - ->label('Docker Image'), - SelectColumn::make('allocation.id') - ->label('Primary Allocation') - ->options(fn (Server $server) => [$server->allocation->id => $server->allocation->address]) - ->selectablePlaceholder(false) - ->sortable(), - ]); - } -} diff --git a/app/Filament/Resources/MountResource.php b/app/Filament/Resources/MountResource.php deleted file mode 100644 index a2d7a187e3..0000000000 --- a/app/Filament/Resources/MountResource.php +++ /dev/null @@ -1,29 +0,0 @@ - Pages\ListMounts::route('/'), - 'create' => Pages\CreateMount::route('/create'), - 'edit' => Pages\EditMount::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/MountResource/Pages/CreateMount.php b/app/Filament/Resources/MountResource/Pages/CreateMount.php deleted file mode 100644 index c736bf7587..0000000000 --- a/app/Filament/Resources/MountResource/Pages/CreateMount.php +++ /dev/null @@ -1,111 +0,0 @@ -schema([ - Section::make()->schema([ - TextInput::make('name') - ->required() - ->helperText('Unique name used to separate this mount from another.') - ->maxLength(64), - ToggleButtons::make('read_only') - ->label('Read only?') - ->helperText('Is the mount read only inside the container?') - ->options([ - false => 'Writeable', - true => 'Read only', - ]) - ->icons([ - false => 'tabler-writing', - true => 'tabler-writing-off', - ]) - ->colors([ - false => 'warning', - true => 'success', - ]) - ->inline() - ->default(false) - ->required(), - TextInput::make('source') - ->required() - ->helperText('File path on the host system to mount to a container.') - ->maxLength(255), - TextInput::make('target') - ->required() - ->helperText('Where the mount will be accessible inside a container.') - ->maxLength(255), - ToggleButtons::make('user_mountable') - ->hidden() - ->label('User mountable?') - ->options([ - false => 'No', - true => 'Yes', - ]) - ->icons([ - false => 'tabler-user-cancel', - true => 'tabler-user-bolt', - ]) - ->colors([ - false => 'success', - true => 'warning', - ]) - ->default(false) - ->inline() - ->required(), - Textarea::make('description') - ->helperText('A longer description for this mount.') - ->columnSpanFull(), - Hidden::make('user_mountable')->default(1), - ])->columnSpan(1)->columns([ - 'default' => 1, - 'lg' => 2, - ]), - Group::make()->schema([ - Section::make()->schema([ - Select::make('eggs')->multiple() - ->relationship('eggs', 'name') - ->preload(), - Select::make('nodes')->multiple() - ->relationship('nodes', 'name') - ->searchable(['name', 'fqdn']) - ->preload(), - ]), - ])->columns([ - 'default' => 1, - 'lg' => 2, - ]), - ])->columns([ - 'default' => 1, - 'lg' => 2, - ]); - } - - protected function handleRecordCreation(array $data): Model - { - $data['uuid'] ??= Str::uuid()->toString(); - - return parent::handleRecordCreation($data); - } -} diff --git a/app/Filament/Resources/MountResource/Pages/EditMount.php b/app/Filament/Resources/MountResource/Pages/EditMount.php deleted file mode 100644 index 71c6febb5c..0000000000 --- a/app/Filament/Resources/MountResource/Pages/EditMount.php +++ /dev/null @@ -1,111 +0,0 @@ -schema([ - Section::make()->schema([ - TextInput::make('name') - ->required() - ->helperText('Unique name used to separate this mount from another.') - ->maxLength(64), - ToggleButtons::make('read_only') - ->label('Read only?') - ->helperText('Is the mount read only inside the container?') - ->options([ - false => 'Writeable', - true => 'Read only', - ]) - ->icons([ - false => 'tabler-writing', - true => 'tabler-writing-off', - ]) - ->colors([ - false => 'warning', - true => 'success', - ]) - ->inline() - ->default(false) - ->required(), - TextInput::make('source') - ->required() - ->helperText('File path on the host system to mount to a container.') - ->maxLength(255), - TextInput::make('target') - ->required() - ->helperText('Where the mount will be accessible inside a container.') - ->maxLength(255), - ToggleButtons::make('user_mountable') - ->hidden() - ->label('User mountable?') - ->options([ - false => 'No', - true => 'Yes', - ]) - ->icons([ - false => 'tabler-user-cancel', - true => 'tabler-user-bolt', - ]) - ->colors([ - false => 'success', - true => 'warning', - ]) - ->default(false) - ->inline() - ->required(), - Textarea::make('description') - ->helperText('A longer description for this mount.') - ->columnSpanFull(), - ])->columnSpan(1)->columns([ - 'default' => 1, - 'lg' => 2, - ]), - Group::make()->schema([ - Section::make()->schema([ - Select::make('eggs')->multiple() - ->relationship('eggs', 'name') - ->preload(), - Select::make('nodes')->multiple() - ->relationship('nodes', 'name') - ->searchable(['name', 'fqdn']) - ->preload(), - ]), - ])->columns([ - 'default' => 1, - 'lg' => 2, - ]), - ])->columns([ - 'default' => 1, - 'lg' => 2, - ]); - } - protected function getHeaderActions(): array - { - return [ - Actions\DeleteAction::make(), - $this->getSaveFormAction()->formId('form'), - ]; - } - - protected function getFormActions(): array - { - return []; - } -} diff --git a/app/Filament/Resources/MountResource/Pages/ListMounts.php b/app/Filament/Resources/MountResource/Pages/ListMounts.php deleted file mode 100644 index d39c5d972d..0000000000 --- a/app/Filament/Resources/MountResource/Pages/ListMounts.php +++ /dev/null @@ -1,67 +0,0 @@ -searchable(false) - ->columns([ - TextColumn::make('name') - ->searchable(), - TextColumn::make('source') - ->searchable(), - TextColumn::make('target') - ->searchable(), - IconColumn::make('read_only') - ->icon(fn (bool $state) => $state ? 'tabler-circle-check-filled' : 'tabler-circle-x-filled') - ->color(fn (bool $state) => $state ? 'success' : 'danger') - ->sortable(), - IconColumn::make('user_mountable') - ->hidden() - ->icon(fn (bool $state) => $state ? 'tabler-circle-check-filled' : 'tabler-circle-x-filled') - ->color(fn (bool $state) => $state ? 'success' : 'danger') - ->sortable(), - ]) - ->actions([ - EditAction::make(), - ]) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete mount')), - ]), - ]) - ->emptyStateIcon('tabler-layers-linked') - ->emptyStateDescription('') - ->emptyStateHeading('No Mounts') - ->emptyStateActions([ - CreateAction::make('create') - ->label('Create Mount') - ->button(), - ]); - } - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make() - ->label('Create Mount') - ->hidden(fn () => Mount::count() <= 0), - ]; - } -} diff --git a/app/Filament/Resources/NodeResource.php b/app/Filament/Resources/NodeResource.php deleted file mode 100644 index 2b7080c146..0000000000 --- a/app/Filament/Resources/NodeResource.php +++ /dev/null @@ -1,40 +0,0 @@ - Pages\ListNodes::route('/'), - 'create' => Pages\CreateNode::route('/create'), - 'edit' => Pages\EditNode::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/NodeResource/Pages/CreateNode.php b/app/Filament/Resources/NodeResource/Pages/CreateNode.php deleted file mode 100644 index 10fc403280..0000000000 --- a/app/Filament/Resources/NodeResource/Pages/CreateNode.php +++ /dev/null @@ -1,409 +0,0 @@ -schema([ - Wizard::make([ - Step::make('basic') - ->label('Basic Settings') - ->icon('tabler-server') - ->columnSpanFull() - ->columns([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 4, - ]) - ->schema([ - TextInput::make('fqdn') - ->columnSpan(2) - ->required() - ->autofocus() - ->live(debounce: 1500) - ->rule('prohibited', fn ($state) => is_ip($state) && request()->isSecure()) - ->label(fn ($state) => is_ip($state) ? 'IP Address' : 'Domain Name') - ->placeholder(fn ($state) => is_ip($state) ? '192.168.1.1' : 'node.example.com') - ->helperText(function ($state) { - if (is_ip($state)) { - if (request()->isSecure()) { - return ' - Your panel is currently secured via an SSL certificate and that means your nodes require one too. - You must use a domain name, because you cannot get SSL certificates for IP Addresses - '; - } - - return ''; - } - - return " - This is the domain name that points to your node's IP Address. - If you've already set up this, you can verify it by checking the next field! - "; - }) - ->hintColor('danger') - ->hint(function ($state) { - if (is_ip($state) && request()->isSecure()) { - return 'You cannot connect to an IP Address over SSL'; - } - - return ''; - }) - ->afterStateUpdated(function (Set $set, ?string $state) { - $set('dns', null); - $set('ip', null); - - [$subdomain] = str($state)->explode('.', 2); - if (!is_numeric($subdomain)) { - $set('name', $subdomain); - } - - if (!$state || is_ip($state)) { - $set('dns', null); - - return; - } - - $validRecords = gethostbynamel($state); - if ($validRecords) { - $set('dns', true); - - $set('ip', collect($validRecords)->first()); - - return; - } - - $set('dns', false); - }) - ->maxLength(255), - - TextInput::make('ip') - ->disabled() - ->hidden(), - - ToggleButtons::make('dns') - ->label('DNS Record Check') - ->helperText('This lets you know if your DNS record correctly points to an IP Address.') - ->disabled() - ->inline() - ->default(null) - ->hint(fn (Get $get) => $get('ip')) - ->hintColor('success') - ->options([ - true => 'Valid', - false => 'Invalid', - ]) - ->colors([ - true => 'success', - false => 'danger', - ]) - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]), - - TextInput::make('daemon_listen') - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]) - ->label(trans('strings.port')) - ->helperText('If you are running the daemon behind Cloudflare you should set the daemon port to 8443 to allow websocket proxying over SSL.') - ->minValue(1) - ->maxValue(65535) - ->default(8080) - ->required() - ->integer(), - - TextInput::make('name') - ->label('Display Name') - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 2, - ]) - ->required() - ->helperText('This name is for display only and can be changed later.') - ->maxLength(100), - - ToggleButtons::make('scheme') - ->label('Communicate over SSL') - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]) - ->inline() - ->helperText(function (Get $get) { - if (request()->isSecure()) { - return new HtmlString('Your Panel is using a secure SSL connection,
so your Daemon must too.'); - } - - if (is_ip($get('fqdn'))) { - return 'An IP address cannot use SSL.'; - } - - return ''; - }) - ->disableOptionWhen(fn (string $value): bool => $value === 'http' && request()->isSecure()) - ->options([ - 'http' => 'HTTP', - 'https' => 'HTTPS (SSL)', - ]) - ->colors([ - 'http' => 'warning', - 'https' => 'success', - ]) - ->icons([ - 'http' => 'tabler-lock-open-off', - 'https' => 'tabler-lock', - ]) - ->default(fn () => request()->isSecure() ? 'https' : 'http'), - ]), - Step::make('advanced') - ->label('Advanced Settings') - ->icon('tabler-server-cog') - ->columnSpanFull() - ->columns([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 4, - ]) - ->schema([ - ToggleButtons::make('maintenance_mode') - ->label('Maintenance Mode')->inline() - ->columnSpan(1) - ->default(false) - ->hinticon('tabler-question-mark') - ->hintIconTooltip("If the node is marked 'Under Maintenance' users won't be able to access servers that are on this node.") - ->options([ - true => 'Enable', - false => 'Disable', - ]) - ->colors([ - true => 'danger', - false => 'success', - ]), - ToggleButtons::make('public') - ->default(true) - ->columnSpan(1) - ->label('Use Node for deployment?')->inline() - ->options([ - true => 'Yes', - false => 'No', - ]) - ->colors([ - true => 'success', - false => 'danger', - ]), - TagsInput::make('tags') - ->placeholder('Add Tags') - ->columnSpan(2), - TextInput::make('upload_size') - ->label('Upload Limit') - ->helperText('Enter the maximum size of files that can be uploaded through the web-based file manager.') - ->columnSpan(1) - ->numeric()->required() - ->default(256) - ->minValue(1) - ->maxValue(1024) - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'), - TextInput::make('daemon_sftp') - ->columnSpan(1) - ->label('SFTP Port') - ->minValue(1) - ->maxValue(65535) - ->default(2022) - ->required() - ->integer(), - TextInput::make('daemon_sftp_alias') - ->columnSpan(2) - ->label('SFTP Alias') - ->helperText('Display alias for the SFTP address. Leave empty to use the Node FQDN.'), - Grid::make() - ->columns(6) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_mem') - ->label('Memory')->inlineLabel()->inline() - ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) - ->afterStateUpdated(fn (Set $set) => $set('memory_overallocate', 0)) - ->formatStateUsing(fn (Get $get) => $get('memory') == 0) - ->live() - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - TextInput::make('memory') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_mem')) - ->label('Memory Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->columnSpan(2) - ->numeric() - ->minValue(0) - ->default(0) - ->required(), - TextInput::make('memory_overallocate') - ->dehydratedWhenHidden() - ->label('Overallocate')->inlineLabel() - ->hidden(fn (Get $get) => $get('unlimited_mem')) - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The % allowable to go over the set limit.') - ->columnSpan(2) - ->numeric() - ->minValue(-1) - ->maxValue(100) - ->default(0) - ->suffix('%') - ->required(), - ]), - Grid::make() - ->columns(6) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_disk') - ->label('Disk')->inlineLabel()->inline() - ->live() - ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) - ->afterStateUpdated(fn (Set $set) => $set('disk_overallocate', 0)) - ->formatStateUsing(fn (Get $get) => $get('disk') == 0) - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - TextInput::make('disk') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_disk')) - ->label('Disk Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->columnSpan(2) - ->numeric() - ->minValue(0) - ->default(0) - ->required(), - TextInput::make('disk_overallocate') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_disk')) - ->label('Overallocate')->inlineLabel() - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The % allowable to go over the set limit.') - ->columnSpan(2) - ->numeric() - ->minValue(-1) - ->maxValue(100) - ->default(0) - ->suffix('%') - ->required(), - ]), - Grid::make() - ->columns(6) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_cpu') - ->label('CPU')->inlineLabel()->inline() - ->live() - ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) - ->afterStateUpdated(fn (Set $set) => $set('cpu_overallocate', 0)) - ->formatStateUsing(fn (Get $get) => $get('cpu') == 0) - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - TextInput::make('cpu') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_cpu')) - ->label('CPU Limit')->inlineLabel() - ->suffix('%') - ->columnSpan(2) - ->numeric() - ->default(0) - ->minValue(0) - ->required(), - TextInput::make('cpu_overallocate') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_cpu')) - ->label('Overallocate')->inlineLabel() - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The % allowable to go over the set limit.') - ->columnSpan(2) - ->numeric() - ->default(0) - ->minValue(-1) - ->maxValue(100) - ->suffix('%') - ->required(), - ]), - ]), - ])->columnSpanFull() - ->nextAction(fn (Action $action) => $action->label('Next Step')) - ->submitAction(new HtmlString(Blade::render(<<<'BLADE' - - Create Node - - BLADE))), - ]); - } - - protected function getRedirectUrlParameters(): array - { - return [ - 'tab' => '-configuration-tab', - ]; - } - - protected function getFormActions(): array - { - return []; - } -} diff --git a/app/Filament/Resources/NodeResource/Pages/EditNode.php b/app/Filament/Resources/NodeResource/Pages/EditNode.php deleted file mode 100644 index 004c96a205..0000000000 --- a/app/Filament/Resources/NodeResource/Pages/EditNode.php +++ /dev/null @@ -1,474 +0,0 @@ -schema([ - Tabs::make('Tabs') - ->columns([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 4, - ]) - ->persistTabInQueryString() - ->columnSpanFull() - ->tabs([ - Tab::make('') - ->label('Overview') - ->icon('tabler-chart-area-line-filled') - ->columns(6) - ->schema([ - Fieldset::make() - ->label('Node Information') - ->columns(4) - ->schema([ - Placeholder::make('') - ->label('Wings Version') - ->content(fn (Node $node) => $node->systemInformation()['version'] ?? 'Unknown'), - Placeholder::make('') - ->label('CPU Threads') - ->content(fn (Node $node) => $node->systemInformation()['cpu_count'] ?? 0), - Placeholder::make('') - ->label('Architecture') - ->content(fn (Node $node) => $node->systemInformation()['architecture'] ?? 'Unknown'), - Placeholder::make('') - ->label('Kernel') - ->content(fn (Node $node) => $node->systemInformation()['kernel_version'] ?? 'Unknown'), - ]), - View::make('filament.components.node-cpu-chart')->columnSpan(3), - View::make('filament.components.node-memory-chart')->columnSpan(3), - // TODO: Make purdy View::make('filament.components.node-storage-chart')->columnSpan(3), - ]), - Tab::make('Basic Settings') - ->icon('tabler-server') - ->schema([ - TextInput::make('fqdn') - ->columnSpan(2) - ->required() - ->autofocus() - ->live(debounce: 1500) - ->rule('prohibited', fn ($state) => is_ip($state) && request()->isSecure()) - ->label(fn ($state) => is_ip($state) ? 'IP Address' : 'Domain Name') - ->placeholder(fn ($state) => is_ip($state) ? '192.168.1.1' : 'node.example.com') - ->helperText(function ($state) { - if (is_ip($state)) { - if (request()->isSecure()) { - return ' - Your panel is currently secured via an SSL certificate and that means your nodes require one too. - You must use a domain name, because you cannot get SSL certificates for IP Addresses - '; - } - - return ''; - } - - return " - This is the domain name that points to your node's IP Address. - If you've already set up this, you can verify it by checking the next field! - "; - }) - ->hintColor('danger') - ->hint(function ($state) { - if (is_ip($state) && request()->isSecure()) { - return 'You cannot connect to an IP Address over SSL'; - } - - return ''; - }) - ->afterStateUpdated(function (Set $set, ?string $state) { - $set('dns', null); - $set('ip', null); - - [$subdomain] = str($state)->explode('.', 2); - if (!is_numeric($subdomain)) { - $set('name', $subdomain); - } - - if (!$state || is_ip($state)) { - $set('dns', null); - - return; - } - - $validRecords = gethostbynamel($state); - if ($validRecords) { - $set('dns', true); - - $set('ip', collect($validRecords)->first()); - - return; - } - - $set('dns', false); - }) - ->maxLength(255), - - TextInput::make('ip') - ->disabled() - ->hidden(), - - ToggleButtons::make('dns') - ->label('DNS Record Check') - ->helperText('This lets you know if your DNS record correctly points to an IP Address.') - ->disabled() - ->inline() - ->default(null) - ->hint(fn (Get $get) => $get('ip')) - ->hintColor('success') - ->options([ - true => 'Valid', - false => 'Invalid', - ]) - ->colors([ - true => 'success', - false => 'danger', - ]) - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]), - - TextInput::make('daemon_listen') - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]) - ->label(trans('strings.port')) - ->helperText('If you are running the daemon behind Cloudflare you should set the daemon port to 8443 to allow websocket proxying over SSL.') - ->minValue(1) - ->maxValue(65535) - ->default(8080) - ->required() - ->integer(), - - TextInput::make('name') - ->label('Display Name') - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 2, - ]) - ->required() - ->helperText('This name is for display only and can be changed later.') - ->maxLength(100), - - ToggleButtons::make('scheme') - ->label('Communicate over SSL') - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]) - ->inline() - ->helperText(function (Get $get) { - if (request()->isSecure()) { - return new HtmlString('Your Panel is using a secure SSL connection,
so your Daemon must too.'); - } - - if (is_ip($get('fqdn'))) { - return 'An IP address cannot use SSL.'; - } - - return ''; - }) - ->disableOptionWhen(fn (string $value): bool => $value === 'http' && request()->isSecure()) - ->options([ - 'http' => 'HTTP', - 'https' => 'HTTPS (SSL)', - ]) - ->colors([ - 'http' => 'warning', - 'https' => 'success', - ]) - ->icons([ - 'http' => 'tabler-lock-open-off', - 'https' => 'tabler-lock', - ]) - ->default(fn () => request()->isSecure() ? 'https' : 'http'), ]), - Tab::make('Advanced Settings') - ->columns(['default' => 1, 'sm' => 1, 'md' => 4, 'lg' => 6]) - ->icon('tabler-server-cog') - ->schema([ - TextInput::make('id') - ->label('Node ID') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 1]) - ->disabled(), - TextInput::make('uuid') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->label('Node UUID') - ->hintAction(CopyAction::make()) - ->disabled(), - TagsInput::make('tags') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) - ->placeholder('Add Tags'), - TextInput::make('upload_size') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 1]) - ->label('Upload Limit') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('Enter the maximum size of files that can be uploaded through the web-based file manager.') - ->numeric()->required() - ->minValue(1) - ->maxValue(1024) - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'), - TextInput::make('daemon_sftp') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 3]) - ->label('SFTP Port') - ->minValue(1) - ->maxValue(65535) - ->default(2022) - ->required() - ->integer(), - TextInput::make('daemon_sftp_alias') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 3]) - ->label('SFTP Alias') - ->helperText('Display alias for the SFTP address. Leave empty to use the Node FQDN.'), - ToggleButtons::make('public') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 3]) - ->label('Use Node for deployment?')->inline() - ->options([ - true => 'Yes', - false => 'No', - ]) - ->colors([ - true => 'success', - false => 'danger', - ]), - ToggleButtons::make('maintenance_mode') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 3]) - ->label('Maintenance Mode')->inline() - ->hinticon('tabler-question-mark') - ->hintIconTooltip("If the node is marked 'Under Maintenance' users won't be able to access servers that are on this node.") - ->options([ - false => 'Disable', - true => 'Enable', - ]) - ->colors([ - false => 'success', - true => 'danger', - ]), - Grid::make() - ->columns(['default' => 1, 'sm' => 1, 'md' => 3, 'lg' => 6]) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_mem') - ->label('Memory')->inlineLabel()->inline() - ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) - ->afterStateUpdated(fn (Set $set) => $set('memory_overallocate', 0)) - ->formatStateUsing(fn (Get $get) => $get('memory') == 0) - ->live() - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]), - TextInput::make('memory') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_mem')) - ->label('Memory Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->required() - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) - ->numeric() - ->minValue(0), - TextInput::make('memory_overallocate') - ->dehydratedWhenHidden() - ->label('Overallocate')->inlineLabel() - ->required() - ->hidden(fn (Get $get) => $get('unlimited_mem')) - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The % allowable to go over the set limit.') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) - ->numeric() - ->minValue(-1) - ->maxValue(100) - ->suffix('%'), - ]), - Grid::make() - ->columns(['default' => 1, 'sm' => 1, 'md' => 3, 'lg' => 6]) - ->schema([ - ToggleButtons::make('unlimited_disk') - ->label('Disk')->inlineLabel()->inline() - ->live() - ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) - ->afterStateUpdated(fn (Set $set) => $set('disk_overallocate', 0)) - ->formatStateUsing(fn (Get $get) => $get('disk') == 0) - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]), - TextInput::make('disk') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_disk')) - ->label('Disk Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->required() - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) - ->numeric() - ->minValue(0), - TextInput::make('disk_overallocate') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_disk')) - ->label('Overallocate')->inlineLabel() - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The % allowable to go over the set limit.') - ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 2]) - ->required() - ->numeric() - ->minValue(-1) - ->maxValue(100) - ->suffix('%'), - ]), - Grid::make() - ->columns(6) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_cpu') - ->label('CPU')->inlineLabel()->inline() - ->live() - ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) - ->afterStateUpdated(fn (Set $set) => $set('cpu_overallocate', 0)) - ->formatStateUsing(fn (Get $get) => $get('cpu') == 0) - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - TextInput::make('cpu') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_cpu')) - ->label('CPU Limit')->inlineLabel() - ->suffix('%') - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0), - TextInput::make('cpu_overallocate') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_cpu')) - ->label('Overallocate')->inlineLabel() - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('The % allowable to go over the set limit.') - ->columnSpan(2) - ->required() - ->numeric() - ->minValue(-1) - ->maxValue(100) - ->suffix('%'), - ]), - ]), - Tab::make('Configuration File') - ->icon('tabler-code') - ->schema([ - Placeholder::make('instructions') - ->columnSpanFull() - ->content(new HtmlString(' - Save this file to your daemon\'s root directory, named config.yml - ')), - Textarea::make('config') - ->label('/etc/pelican/config.yml') - ->disabled() - ->rows(19) - ->hintAction(CopyAction::make()) - ->columnSpanFull(), - Forms\Components\Actions::make([ - Forms\Components\Actions\Action::make('resetKey') - ->label('Reset Daemon Token') - ->color('danger') - ->requiresConfirmation() - ->modalHeading('Reset Daemon Token?') - ->modalDescription('Resetting the daemon token will void any request coming from the old token. This token is used for all sensitive operations on the daemon including server creation and deletion. We suggest changing this token regularly for security.') - ->action(function (NodeUpdateService $nodeUpdateService, Node $node) { - $nodeUpdateService->handle($node, [], true); - Notification::make()->success()->title('Daemon Key Reset')->send(); - $this->fillForm(); - }), - ]), - ]), - ]), - ]); - } - - protected function mutateFormDataBeforeFill(array $data): array - { - $node = Node::findOrFail($data['id']); - - $data['config'] = $node->getYamlConfiguration(); - - return $data; - } - - protected function getFormActions(): array - { - return []; - } - protected function getHeaderActions(): array - { - return [ - Actions\DeleteAction::make() - ->disabled(fn (Node $node) => $node->servers()->count() > 0) - ->label(fn (Node $node) => $node->servers()->count() > 0 ? 'Node Has Servers' : 'Delete'), - $this->getSaveFormAction()->formId('form'), - ]; - } - - protected function afterSave(): void - { - $this->fillForm(); - } - - protected function getColumnSpan() - { - return null; - } - protected function getColumnStart() - { - return null; - } -} diff --git a/app/Filament/Resources/NodeResource/Pages/ListNodes.php b/app/Filament/Resources/NodeResource/Pages/ListNodes.php deleted file mode 100644 index ab794ca296..0000000000 --- a/app/Filament/Resources/NodeResource/Pages/ListNodes.php +++ /dev/null @@ -1,110 +0,0 @@ -searchable(false) - ->checkIfRecordIsSelectableUsing(fn (Node $node) => $node->servers_count <= 0) - ->columns([ - TextColumn::make('uuid') - ->label('UUID') - ->searchable() - ->hidden(), - IconColumn::make('health') - ->alignCenter() - ->state(fn (Node $node) => $node) - ->view('livewire.columns.version-column'), - TextColumn::make('name') - ->icon('tabler-server-2') - ->sortable() - ->searchable(), - TextColumn::make('fqdn') - ->visibleFrom('md') - ->label('Address') - ->icon('tabler-network') - ->sortable() - ->searchable(), - TextColumn::make('memory') - ->visibleFrom('sm') - ->icon('tabler-device-desktop-analytics') - ->numeric() - ->suffix(config('panel.use_binary_prefix') ? ' GiB' : ' GB') - ->formatStateUsing(fn ($state) => Number::format($state / (config('panel.use_binary_prefix') ? 1024 : 1000), maxPrecision: 2, locale: auth()->user()->language)) - ->sortable(), - TextColumn::make('disk') - ->visibleFrom('sm') - ->icon('tabler-file') - ->numeric() - ->suffix(config('panel.use_binary_prefix') ? ' GiB' : ' GB') - ->formatStateUsing(fn ($state) => Number::format($state / (config('panel.use_binary_prefix') ? 1024 : 1000), maxPrecision: 2, locale: auth()->user()->language)) - ->sortable(), - TextColumn::make('cpu') - ->visibleFrom('sm') - ->icon('tabler-cpu') - ->numeric() - ->suffix(' %') - ->sortable(), - IconColumn::make('scheme') - ->visibleFrom('xl') - ->label('SSL') - ->trueIcon('tabler-lock') - ->falseIcon('tabler-lock-open-off') - ->state(fn (Node $node) => $node->scheme === 'https'), - IconColumn::make('public') - ->visibleFrom('lg') - ->trueIcon('tabler-eye-check') - ->falseIcon('tabler-eye-cancel'), - TextColumn::make('servers_count') - ->visibleFrom('sm') - ->counts('servers') - ->label('Servers') - ->sortable() - ->icon('tabler-brand-docker'), - ]) - ->actions([ - EditAction::make(), - ]) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete node')), - ]), - ]) - ->emptyStateIcon('tabler-server-2') - ->emptyStateDescription('') - ->emptyStateHeading('No Nodes') - ->emptyStateActions([ - CreateAction::make('create') - ->label('Create Node') - ->button(), - ]); - } - - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make() - ->label('Create Node') - ->hidden(fn () => Node::count() <= 0), - ]; - } -} diff --git a/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php b/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php deleted file mode 100644 index 01cc5e50e5..0000000000 --- a/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php +++ /dev/null @@ -1,160 +0,0 @@ -schema([ - TextInput::make('ip') - ->required() - ->maxLength(255), - ]); - } - - public function table(Table $table): Table - { - return $table - ->recordTitleAttribute('ip') - - // Non Primary Allocations - // ->checkIfRecordIsSelectableUsing(fn (Allocation $allocation) => $allocation->id !== $allocation->server?->allocation_id) - - // All assigned allocations - ->checkIfRecordIsSelectableUsing(fn (Allocation $allocation) => $allocation->server_id === null) - ->searchable() - ->columns([ - TextColumn::make('id'), - TextColumn::make('port') - ->searchable() - ->label('Port'), - TextColumn::make('server.name') - ->label('Server') - ->icon('tabler-brand-docker') - ->searchable() - ->url(fn (Allocation $allocation): string => $allocation->server ? route('filament.admin.resources.servers.edit', ['record' => $allocation->server]) : ''), - TextInputColumn::make('ip_alias') - ->searchable() - ->label('Alias'), - TextInputColumn::make('ip') - ->searchable() - ->label('IP'), - ]) - ->filters([ - // - ]) - ->actions([ - // - ]) - ->headerActions([ - Tables\Actions\Action::make('create new allocation')->label('Create Allocations') - ->form(fn () => [ - TextInput::make('allocation_ip') - ->datalist($this->getOwnerRecord()->ipAddresses()) - ->label('IP Address') - ->inlineLabel() - ->ipv4() - ->helperText("Usually your machine's public IP unless you are port forwarding.") - ->required(), - TextInput::make('allocation_alias') - ->label('Alias') - ->inlineLabel() - ->default(null) - ->helperText('Optional display name to help you remember what these are.') - ->required(false), - TagsInput::make('allocation_ports') - ->placeholder('Examples: 27015, 27017-27019') - ->helperText(new HtmlString(' - These are the ports that users can connect to this Server through. -
- You would have to port forward these on your home network. - ')) - ->label('Ports') - ->inlineLabel() - ->live() - ->afterStateUpdated(function ($state, Set $set) { - $ports = collect(); - $update = false; - foreach ($state as $portEntry) { - if (!str_contains($portEntry, '-')) { - if (is_numeric($portEntry)) { - $ports->push((int) $portEntry); - - continue; - } - - // Do not add non numerical ports - $update = true; - - continue; - } - - $update = true; - [$start, $end] = explode('-', $portEntry); - if (!is_numeric($start) || !is_numeric($end)) { - continue; - } - - $start = max((int) $start, 0); - $end = min((int) $end, 2 ** 16 - 1); - foreach (range($start, $end) as $i) { - $ports->push($i); - } - } - - $uniquePorts = $ports->unique()->values(); - if ($ports->count() > $uniquePorts->count()) { - $update = true; - $ports = $uniquePorts; - } - - $sortedPorts = $ports->sort()->values(); - if ($sortedPorts->all() !== $ports->all()) { - $update = true; - $ports = $sortedPorts; - } - - $ports = $ports->filter(fn ($port) => $port > 1024 && $port < 65535)->values(); - - if ($update) { - $set('allocation_ports', $ports->all()); - } - }) - ->splitKeys(['Tab', ' ', ',']) - ->required(), - ]) - ->action(fn (array $data) => resolve(AssignmentService::class)->handle($this->getOwnerRecord(), $data)), - ]) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete allocation')), - ]), - ]); - } -} diff --git a/app/Filament/Resources/NodeResource/RelationManagers/NodesRelationManager.php b/app/Filament/Resources/NodeResource/RelationManagers/NodesRelationManager.php deleted file mode 100644 index 09c6c9854e..0000000000 --- a/app/Filament/Resources/NodeResource/RelationManagers/NodesRelationManager.php +++ /dev/null @@ -1,57 +0,0 @@ -searchable(false) - ->columns([ - TextColumn::make('user.username') - ->label('Owner') - ->icon('tabler-user') - ->url(fn (Server $server): string => route('filament.admin.resources.users.edit', ['record' => $server->user])) - ->searchable(), - TextColumn::make('name') - ->icon('tabler-brand-docker') - ->url(fn (Server $server): string => route('filament.admin.resources.servers.edit', ['record' => $server])) - ->searchable() - ->sortable(), - TextColumn::make('egg.name') - ->icon('tabler-egg') - ->url(fn (Server $server): string => route('filament.admin.resources.eggs.edit', ['record' => $server->user])) - ->sortable(), - SelectColumn::make('allocation.id') - ->label('Primary Allocation') - ->options(fn (Server $server) => [$server->allocation->id => $server->allocation->address]) - ->selectablePlaceholder(false) - ->sortable(), - TextColumn::make('memory')->icon('tabler-device-desktop-analytics'), - TextColumn::make('cpu')->icon('tabler-cpu'), - TextColumn::make('databases_count') - ->counts('databases') - ->label('Databases') - ->icon('tabler-database') - ->numeric() - ->sortable(), - TextColumn::make('backups_count') - ->counts('backups') - ->label('Backups') - ->icon('tabler-file-download') - ->numeric() - ->sortable(), - ]); - } -} diff --git a/app/Filament/Resources/NodeResource/Widgets/NodeCpuChart.php b/app/Filament/Resources/NodeResource/Widgets/NodeCpuChart.php deleted file mode 100644 index 476b8b5336..0000000000 --- a/app/Filament/Resources/NodeResource/Widgets/NodeCpuChart.php +++ /dev/null @@ -1,82 +0,0 @@ -record; - $threads = $node->systemInformation()['cpu_count'] ?? 0; - - $cpu = collect(cache()->get("nodes.$node->id.cpu_percent")) - ->slice(-10) - ->map(fn ($value, $key) => [ - 'cpu' => Number::format($value * $threads, maxPrecision: 2, locale: auth()->user()->language), - 'timestamp' => Carbon::createFromTimestamp($key, (auth()->user()->timezone ?? 'UTC'))->format('H:i:s'), - ]) - ->all(); - - return [ - 'datasets' => [ - [ - 'data' => array_column($cpu, 'cpu'), - 'backgroundColor' => [ - 'rgba(96, 165, 250, 0.3)', - ], - 'tension' => '0.3', - 'fill' => true, - ], - ], - 'labels' => array_column($cpu, 'timestamp'), - ]; - } - - protected function getType(): string - { - return 'line'; - } - - protected function getOptions(): RawJs - { - return RawJs::make(<<<'JS' - { - scales: { - y: { - min: 0, - }, - }, - plugins: { - legend: { - display: false, - } - } - } - JS); - } - - public function getHeading(): string - { - /** @var Node $node */ - $node = $this->record; - $threads = $node->systemInformation()['cpu_count'] ?? 0; - - $cpu = Number::format(collect(cache()->get("nodes.$node->id.cpu_percent"))->last() * $threads, maxPrecision: 2, locale: auth()->user()->language); - $max = Number::format($threads * 100, locale: auth()->user()->language) . '%'; - - return 'CPU - ' . $cpu . '% Of ' . $max; - } -} diff --git a/app/Filament/Resources/NodeResource/Widgets/NodeMemoryChart.php b/app/Filament/Resources/NodeResource/Widgets/NodeMemoryChart.php deleted file mode 100644 index 9d75fd1167..0000000000 --- a/app/Filament/Resources/NodeResource/Widgets/NodeMemoryChart.php +++ /dev/null @@ -1,86 +0,0 @@ -record; - - $memUsed = collect(cache()->get("nodes.$node->id.memory_used"))->slice(-10) - ->map(fn ($value, $key) => [ - 'memory' => Number::format(config('panel.use_binary_prefix') ? $value / 1024 / 1024 / 1024 : $value / 1000 / 1000 / 1000, maxPrecision: 2, locale: auth()->user()->language), - 'timestamp' => Carbon::createFromTimestamp($key, (auth()->user()->timezone ?? 'UTC'))->format('H:i:s'), - ]) - ->all(); - - return [ - 'datasets' => [ - [ - 'data' => array_column($memUsed, 'memory'), - 'backgroundColor' => [ - 'rgba(96, 165, 250, 0.3)', - ], - 'tension' => '0.3', - 'fill' => true, - ], - ], - 'labels' => array_column($memUsed, 'timestamp'), - ]; - } - - protected function getType(): string - { - return 'line'; - } - - protected function getOptions(): RawJs - { - return RawJs::make(<<<'JS' - { - scales: { - y: { - min: 0, - }, - }, - plugins: { - legend: { - display: false, - } - } - } - JS); - } - - public function getHeading(): string - { - /** @var Node $node */ - $node = $this->record; - $latestMemoryUsed = collect(cache()->get("nodes.$node->id.memory_used"))->last(); - $totalMemory = collect(cache()->get("nodes.$node->id.memory_total"))->last(); - - $used = config('panel.use_binary_prefix') - ? Number::format($latestMemoryUsed / 1024 / 1024 / 1024, maxPrecision: 2, locale: auth()->user()->language) .' GiB' - : Number::format($latestMemoryUsed / 1000 / 1000 / 1000, maxPrecision: 2, locale: auth()->user()->language) . ' GB'; - - $total = config('panel.use_binary_prefix') - ? Number::format($totalMemory / 1024 / 1024 / 1024, maxPrecision: 2, locale: auth()->user()->language) .' GiB' - : Number::format($totalMemory / 1000 / 1000 / 1000, maxPrecision: 2, locale: auth()->user()->language) . ' GB'; - - return 'Memory - ' . $used . ' Of ' . $total; - } -} diff --git a/app/Filament/Resources/NodeResource/Widgets/NodeStorageChart.php b/app/Filament/Resources/NodeResource/Widgets/NodeStorageChart.php deleted file mode 100644 index b841d84ef0..0000000000 --- a/app/Filament/Resources/NodeResource/Widgets/NodeStorageChart.php +++ /dev/null @@ -1,66 +0,0 @@ - [ - 'x' => [ - 'grid' => [ - 'display' => false, - ], - 'ticks' => [ - 'display' => false, - ], - ], - 'y' => [ - 'grid' => [ - 'display' => false, - ], - 'ticks' => [ - 'display' => false, - ], - ], - ], - ]; - - protected function getData(): array - { - /** @var Node $node */ - $node = $this->record; - - $total = ($node->statistics()['disk_total'] ?? 0) / 1024 / 1024 / 1024; - $used = ($node->statistics()['disk_used'] ?? 0) / 1024 / 1024 / 1024; - $unused = $total - $used; - - return [ - 'datasets' => [ - [ - 'data' => [$used, $unused], - 'backgroundColor' => [ - 'rgb(255, 99, 132)', - 'rgb(54, 162, 235)', - 'rgb(255, 205, 86)', - ], - ], - ], - 'labels' => ['Used', 'Unused'], - ]; - } - - protected function getType(): string - { - return 'pie'; - } -} diff --git a/app/Filament/Resources/RoleResource.php b/app/Filament/Resources/RoleResource.php deleted file mode 100644 index 306c9676da..0000000000 --- a/app/Filament/Resources/RoleResource.php +++ /dev/null @@ -1,146 +0,0 @@ -value . ' ' . strtolower($model->value)] = Str::headline($prefix->value); - } - - if (array_key_exists($model->value, Role::MODEL_SPECIFIC_PERMISSIONS)) { - foreach (Role::MODEL_SPECIFIC_PERMISSIONS[$model->value] as $permission) { - $options[$permission . ' ' . strtolower($model->value)] = Str::headline($permission); - } - } - - $permissions[] = self::makeSection($model->value, $options); - } - - foreach (Role::SPECIAL_PERMISSIONS as $model => $prefixes) { - $options = []; - - foreach ($prefixes as $prefix) { - $options[$prefix . ' ' . strtolower($model)] = Str::headline($prefix); - } - - $permissions[] = self::makeSection($model, $options); - } - - return $form - ->columns(1) - ->schema([ - TextInput::make('name') - ->label('Role Name') - ->required() - ->disabled(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), - TextInput::make('guard_name') - ->label('Guard Name') - ->default(Filament::getCurrentPanel()?->getAuthGuard() ?? '') - ->nullable() - ->hidden(), - Fieldset::make('Permissions') - ->columns(3) - ->schema($permissions) - ->hidden(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), - Placeholder::make('permissions') - ->content('The Root Admin has all permissions.') - ->visible(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), - ]); - } - - private static function makeSection(string $model, array $options): Section - { - $icon = null; - - if (class_exists('\App\Filament\Resources\\' . $model . 'Resource')) { - $icon = ('\App\Filament\Resources\\' . $model . 'Resource')::getNavigationIcon(); - } elseif (class_exists('\App\Filament\Pages\\' . $model)) { - $icon = ('\App\Filament\Pages\\' . $model)::getNavigationIcon(); - } - - return Section::make(Str::headline(Str::plural($model))) - ->columnSpan(1) - ->collapsible() - ->collapsed() - ->icon($icon) - ->headerActions([ - Action::make('count') - ->label(fn (Get $get) => count($get(strtolower($model) . '_list'))) - ->badge(), - ]) - ->schema([ - CheckboxList::make(strtolower($model) . '_list') - ->label('') - ->options($options) - ->columns() - ->gridDirection('row') - ->bulkToggleable() - ->live() - ->afterStateHydrated( - function (Component $component, string $operation, ?Role $record) use ($options) { - if (in_array($operation, ['edit', 'view'])) { - - if (blank($record)) { - return; - } - - if ($component->isVisible()) { - $component->state( - collect($options) - ->filter(fn ($value, $key) => $record->checkPermissionTo($key)) - ->keys() - ->toArray() - ); - } - } - } - ) - ->dehydrated(fn ($state) => !blank($state)), - ]); - } - - public static function getPages(): array - { - return [ - 'index' => Pages\ListRoles::route('/'), - 'create' => Pages\CreateRole::route('/create'), - 'edit' => Pages\EditRole::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/RoleResource/Pages/CreateRole.php b/app/Filament/Resources/RoleResource/Pages/CreateRole.php deleted file mode 100644 index 2f69bba011..0000000000 --- a/app/Filament/Resources/RoleResource/Pages/CreateRole.php +++ /dev/null @@ -1,48 +0,0 @@ -permissions = collect($data) - ->filter(function ($permission, $key) { - return !in_array($key, ['name', 'guard_name']); - }) - ->values() - ->flatten() - ->unique(); - - return Arr::only($data, ['name', 'guard_name']); - } - - protected function afterCreate(): void - { - $permissionModels = collect(); - $this->permissions->each(function ($permission) use ($permissionModels) { - $permissionModels->push(Permission::firstOrCreate([ - 'name' => $permission, - 'guard_name' => $this->data['guard_name'], - ])); - }); - - $this->record->syncPermissions($permissionModels); - } -} diff --git a/app/Filament/Resources/RoleResource/Pages/EditRole.php b/app/Filament/Resources/RoleResource/Pages/EditRole.php deleted file mode 100644 index c62e126913..0000000000 --- a/app/Filament/Resources/RoleResource/Pages/EditRole.php +++ /dev/null @@ -1,56 +0,0 @@ -permissions = collect($data) - ->filter(function ($permission, $key) { - return !in_array($key, ['name', 'guard_name']); - }) - ->values() - ->flatten() - ->unique(); - - return Arr::only($data, ['name', 'guard_name']); - } - - protected function afterSave(): void - { - $permissionModels = collect(); - $this->permissions->each(function ($permission) use ($permissionModels) { - $permissionModels->push(Permission::firstOrCreate([ - 'name' => $permission, - 'guard_name' => $this->data['guard_name'], - ])); - }); - - $this->record->syncPermissions($permissionModels); - } - - protected function getHeaderActions(): array - { - return [ - DeleteAction::make() - ->disabled(fn (Role $role) => $role->isRootAdmin() || $role->users_count >= 1) - ->label(fn (Role $role) => $role->isRootAdmin() ? 'Can\'t delete Root Admin' : ($role->users_count >= 1 ? 'In Use' : 'Delete')), - ]; - } -} diff --git a/app/Filament/Resources/RoleResource/Pages/ListRoles.php b/app/Filament/Resources/RoleResource/Pages/ListRoles.php deleted file mode 100644 index ac83be15db..0000000000 --- a/app/Filament/Resources/RoleResource/Pages/ListRoles.php +++ /dev/null @@ -1,68 +0,0 @@ -columns([ - TextColumn::make('name') - ->sortable() - ->searchable(), - TextColumn::make('guard_name') - ->hidden() - ->sortable() - ->searchable(), - TextColumn::make('permissions_count') - ->label('Permissions') - ->badge() - ->counts('permissions') - ->formatStateUsing(fn (Role $role, $state) => $role->isRootAdmin() ? 'All' : $state), - TextColumn::make('users_count') - ->label('Users') - ->counts('users') - ->icon('tabler-users'), - ]) - ->actions([ - EditAction::make(), - ]) - ->checkIfRecordIsSelectableUsing(fn (Role $role) => !$role->isRootAdmin() && $role->users_count <= 0) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete role')), - ]), - ]) - ->emptyStateIcon('tabler-users-group') - ->emptyStateDescription('') - ->emptyStateHeading('No Roles') - ->emptyStateActions([ - CreateActionTable::make('create') - ->label('Create Role') - ->button(), - ]); - } - - protected function getHeaderActions(): array - { - return [ - CreateAction::make() - ->label('Create Role'), - ]; - } -} diff --git a/app/Filament/Resources/ServerResource.php b/app/Filament/Resources/ServerResource.php deleted file mode 100644 index 2b414cb286..0000000000 --- a/app/Filament/Resources/ServerResource.php +++ /dev/null @@ -1,30 +0,0 @@ - Pages\ListServers::route('/'), - 'create' => Pages\CreateServer::route('/create'), - 'edit' => Pages\EditServer::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php deleted file mode 100644 index c1f6aa22e6..0000000000 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ /dev/null @@ -1,864 +0,0 @@ -schema([ - Wizard::make([ - Step::make('Information') - ->label('Information') - ->icon('tabler-info-circle') - ->completedIcon('tabler-check') - ->columns([ - 'default' => 1, - 'sm' => 1, - 'md' => 4, - 'lg' => 6, - ]) - ->schema([ - TextInput::make('name') - ->prefixIcon('tabler-server') - ->label('Name') - ->suffixAction(Forms\Components\Actions\Action::make('random') - ->icon('tabler-dice-' . random_int(1, 6)) - ->action(function (Set $set, Get $get) { - $egg = Egg::find($get('egg_id')); - $prefix = $egg ? str($egg->name)->lower()->kebab() . '-' : ''; - - $word = (new RandomWordService())->word(); - - $set('name', $prefix . $word); - })) - ->columnSpan([ - 'default' => 2, - 'sm' => 3, - 'md' => 2, - 'lg' => 3, - ]) - ->required() - ->maxLength(255), - - Select::make('owner_id') - ->preload() - ->prefixIcon('tabler-user') - ->default(auth()->user()->id) - ->label('Owner') - ->columnSpan([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 3, - ]) - ->relationship('user', 'username') - ->searchable(['username', 'email']) - ->getOptionLabelFromRecordUsing(fn (User $user) => "$user->email | $user->username " . ($user->isRootAdmin() ? '(admin)' : '')) - ->createOptionForm([ - TextInput::make('username') - ->alphaNum() - ->required() - ->maxLength(255), - - TextInput::make('email') - ->email() - ->required() - ->unique() - ->maxLength(255), - - TextInput::make('password') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('Providing a user password is optional. New user email will prompt users to create a password the first time they login.') - ->password(), - ]) - ->createOptionUsing(function ($data) { - resolve(UserCreationService::class)->handle($data); - $this->refreshForm(); - }) - ->required(), - - Select::make('node_id') - ->disabledOn('edit') - ->prefixIcon('tabler-server-2') - ->default(fn () => ($this->node = Node::query()->latest()->first())?->id) - ->columnSpan([ - 'default' => 2, - 'sm' => 3, - 'md' => 6, - 'lg' => 6, - ]) - ->live() - ->relationship('node', 'name') - ->searchable() - ->preload() - ->afterStateUpdated(function (Set $set, $state) { - $set('allocation_id', null); - $this->node = Node::find($state); - }) - ->required(), - - Select::make('allocation_id') - ->preload() - ->live() - ->prefixIcon('tabler-network') - ->label('Primary Allocation') - ->columnSpan([ - 'default' => 2, - 'sm' => 3, - 'md' => 2, - 'lg' => 3, - ]) - ->disabled(fn (Get $get) => $get('node_id') === null) - ->searchable(['ip', 'port', 'ip_alias']) - ->afterStateUpdated(function (Set $set) { - $set('allocation_additional', null); - $set('allocation_additional.needstobeastringhere.extra_allocations', null); - }) - ->getOptionLabelFromRecordUsing( - fn (Allocation $allocation) => "$allocation->ip:$allocation->port" . - ($allocation->ip_alias ? " ($allocation->ip_alias)" : '') - ) - ->placeholder(function (Get $get) { - $node = Node::find($get('node_id')); - - if ($node?->allocations) { - return 'Select an Allocation'; - } - - return 'Create a New Allocation'; - }) - ->relationship( - 'allocation', - 'ip', - fn (Builder $query, Get $get) => $query - ->where('node_id', $get('node_id')) - ->whereNull('server_id'), - ) - ->createOptionForm(fn (Get $get) => [ - TextInput::make('allocation_ip') - ->datalist(Node::find($get('node_id'))?->ipAddresses() ?? []) - ->label('IP Address') - ->inlineLabel() - ->ipv4() - ->helperText("Usually your machine's public IP unless you are port forwarding.") - // ->selectablePlaceholder(false) - ->required(), - TextInput::make('allocation_alias') - ->label('Alias') - ->inlineLabel() - ->default(null) - ->datalist([ - $get('name'), - Egg::find($get('egg_id'))?->name, - ]) - ->helperText('Optional display name to help you remember what these are.') - ->required(false), - TagsInput::make('allocation_ports') - ->placeholder('Examples: 27015, 27017-27019') - ->helperText(new HtmlString(' - These are the ports that users can connect to this Server through. -
- You would have to port forward these on your home network. - ')) - ->label('Ports') - ->inlineLabel() - ->live() - ->afterStateUpdated(function ($state, Set $set) { - $ports = collect(); - $update = false; - foreach ($state as $portEntry) { - if (!str_contains($portEntry, '-')) { - if (is_numeric($portEntry)) { - $ports->push((int) $portEntry); - - continue; - } - - // Do not add non-numerical ports - $update = true; - - continue; - } - - $update = true; - [$start, $end] = explode('-', $portEntry); - if (!is_numeric($start) || !is_numeric($end)) { - continue; - } - - $start = max((int) $start, 0); - $end = min((int) $end, 2 ** 16 - 1); - $range = $start <= $end ? range($start, $end) : range($end, $start); - foreach ($range as $i) { - if ($i > 1024 && $i <= 65535) { - $ports->push($i); - } - } - } - - $uniquePorts = $ports->unique()->values(); - if ($ports->count() > $uniquePorts->count()) { - $update = true; - $ports = $uniquePorts; - } - - $sortedPorts = $ports->sort()->values(); - if ($sortedPorts->all() !== $ports->all()) { - $update = true; - $ports = $sortedPorts; - } - - if ($update) { - $set('allocation_ports', $ports->all()); - } - }) - ->splitKeys(['Tab', ' ', ',']) - ->required(), - ]) - ->createOptionUsing(function (array $data, Get $get): int { - return collect( - resolve(AssignmentService::class)->handle(Node::find($get('node_id')), $data) - )->first(); - }) - ->required(), - - Repeater::make('allocation_additional') - ->label('Additional Allocations') - ->columnSpan([ - 'default' => 2, - 'sm' => 3, - 'md' => 3, - 'lg' => 3, - ]) - ->addActionLabel('Add Allocation') - ->disabled(fn (Get $get) => $get('allocation_id') === null) - // ->addable() TODO disable when all allocations are taken - // ->addable() TODO disable until first additional allocation is selected - ->simple( - Select::make('extra_allocations') - ->live() - ->preload() - ->disableOptionsWhenSelectedInSiblingRepeaterItems() - ->prefixIcon('tabler-network') - ->label('Additional Allocations') - ->columnSpan(2) - ->disabled(fn (Get $get) => $get('../../node_id') === null) - ->searchable(['ip', 'port', 'ip_alias']) - ->getOptionLabelFromRecordUsing( - fn (Allocation $allocation) => "$allocation->ip:$allocation->port" . - ($allocation->ip_alias ? " ($allocation->ip_alias)" : '') - ) - ->placeholder('Select additional Allocations') - ->disableOptionsWhenSelectedInSiblingRepeaterItems() - ->relationship( - 'allocations', - 'ip', - fn (Builder $query, Get $get, Select $component, $state) => $query - ->where('node_id', $get('../../node_id')) - ->whereNot('id', $get('../../allocation_id')) - ->whereNull('server_id'), - ), - ), - - Textarea::make('description') - ->placeholder('Description') - ->rows(3) - ->columnSpan([ - 'default' => 2, - 'sm' => 6, - 'md' => 6, - 'lg' => 6, - ]) - ->label('Description'), - ]), - - Step::make('Egg Configuration') - ->label('Egg Configuration') - ->icon('tabler-egg') - ->completedIcon('tabler-check') - ->columns([ - 'default' => 1, - 'sm' => 4, - 'md' => 4, - 'lg' => 6, - ]) - ->schema([ - Select::make('egg_id') - ->prefixIcon('tabler-egg') - ->relationship('egg', 'name') - ->columnSpan([ - 'default' => 1, - 'sm' => 2, - 'md' => 2, - 'lg' => 4, - ]) - ->searchable() - ->preload() - ->live() - ->afterStateUpdated(function ($state, Set $set, Get $get, $old) { - $egg = Egg::query()->find($state); - $set('startup', $egg->startup ?? ''); - $set('image', ''); - - $variables = $egg->variables ?? []; - $serverVariables = collect(); - foreach ($variables as $variable) { - $serverVariables->add($variable->toArray()); - } - - $variables = []; - $set($path = 'server_variables', $serverVariables->sortBy(['sort'])->all()); - for ($i = 0; $i < $serverVariables->count(); $i++) { - $set("$path.$i.variable_value", $serverVariables[$i]['default_value']); - $set("$path.$i.variable_id", $serverVariables[$i]['id']); - $variables[$serverVariables[$i]['env_variable']] = $serverVariables[$i]['default_value']; - } - - $set('environment', $variables); - - $previousEgg = Egg::query()->find($old); - if (!$get('name') || $previousEgg?->getKebabName() === $get('name')) { - $set('name', $egg->getKebabName()); - } - }) - ->required(), - - ToggleButtons::make('skip_scripts') - ->label('Run Egg Install Script?') - ->default(false) - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]) - ->options([ - false => 'Yes', - true => 'Skip', - ]) - ->colors([ - false => 'primary', - true => 'danger', - ]) - ->icons([ - false => 'tabler-code', - true => 'tabler-code-off', - ]) - ->inline() - ->required(), - - ToggleButtons::make('start_on_completion') - ->label('Start Server After Install?') - ->default(true) - ->required() - ->columnSpan([ - 'default' => 1, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]) - ->options([ - true => 'Yes', - false => 'No', - ]) - ->colors([ - true => 'primary', - false => 'danger', - ]) - ->icons([ - true => 'tabler-code', - false => 'tabler-code-off', - ]) - ->inline(), - - Textarea::make('startup') - ->hintIcon('tabler-code') - ->label('Startup Command') - ->hidden(fn (Get $get) => $get('egg_id') === null) - ->required() - ->live() - ->rows(function ($state) { - return str($state)->explode("\n")->reduce( - fn (int $carry, $line) => $carry + floor(strlen($line) / 125), - 1 - ); - }) - ->columnSpan([ - 'default' => 1, - 'sm' => 4, - 'md' => 4, - 'lg' => 6, - ]), - - Hidden::make('environment')->default([]), - - Section::make('Variables') - ->icon('tabler-eggs') - ->iconColor('primary') - ->hidden(fn (Get $get) => $get('egg_id') === null) - ->collapsible() - ->columnSpanFull() - ->schema([ - Placeholder::make('Select an egg first to show its variables!') - ->hidden(fn (Get $get) => $get('egg_id')), - - Placeholder::make('The selected egg has no variables!') - ->hidden(fn (Get $get) => !$get('egg_id') || - Egg::query()->find($get('egg_id'))?->variables()?->count() - ), - - Repeater::make('server_variables') - ->label('') - ->relationship('serverVariables') - ->saveRelationshipsBeforeChildrenUsing(null) - ->saveRelationshipsUsing(null) - ->grid(2) - ->reorderable(false) - ->addable(false) - ->deletable(false) - ->default([]) - ->hidden(fn ($state) => empty($state)) - ->schema(function () { - - $text = TextInput::make('variable_value') - ->hidden($this->shouldHideComponent(...)) - ->required(fn (Get $get) => in_array('required', $get('rules'))) - ->rules( - fn (Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) { - $validator = Validator::make(['validatorkey' => $value], [ - 'validatorkey' => $get('rules'), - ]); - - if ($validator->fails()) { - $message = str($validator->errors()->first())->replace('validatorkey', $get('name'))->toString(); - - $fail($message); - } - }, - ); - - $select = Select::make('variable_value') - ->hidden($this->shouldHideComponent(...)) - ->options($this->getSelectOptionsFromRules(...)) - ->selectablePlaceholder(false); - - $components = [$text, $select]; - - foreach ($components as &$component) { - $component = $component - ->live(onBlur: true) - ->hintIcon('tabler-code') - ->label(fn (Get $get) => $get('name')) - ->hintIconTooltip(fn (Get $get) => implode('|', $get('rules'))) - ->prefix(fn (Get $get) => '{{' . $get('env_variable') . '}}') - ->helperText(fn (Get $get) => empty($get('description')) ? '—' : $get('description')) - ->afterStateUpdated(function (Set $set, Get $get, $state) { - $environment = $get($envPath = '../../environment'); - $environment[$get('env_variable')] = $state; - $set($envPath, $environment); - }); - } - - return $components; - }) - ->columnSpan(2), - ]), - ]), - Step::make('Environment Configuration') - ->label('Environment Configuration') - ->icon('tabler-brand-docker') - ->completedIcon('tabler-check') - ->schema([ - Fieldset::make('Resource Limits') - ->columnSpan(6) - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 3, - ]) - ->schema([ - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_mem') - ->label('Memory')->inlineLabel()->inline() - ->default(true) - ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) - ->live() - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - - TextInput::make('memory') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_mem')) - ->label('Memory Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->default(0) - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0), - ]), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_disk') - ->label('Disk Space')->inlineLabel()->inline() - ->default(true) - ->live() - ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - - TextInput::make('disk') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_disk')) - ->label('Disk Space Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->default(0) - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0), - ]), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_cpu') - ->label('CPU')->inlineLabel()->inline() - ->default(true) - ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) - ->live() - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - - TextInput::make('cpu') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_cpu')) - ->label('CPU Limit')->inlineLabel() - ->suffix('%') - ->default(0) - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0) - ->helperText('100% equals one CPU core.'), - ]), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('swap_support') - ->live() - ->label('Enable Swap Memory') - ->inlineLabel() - ->inline() - ->columnSpan(2) - ->default('disabled') - ->afterStateUpdated(function ($state, Set $set) { - $value = match ($state) { - 'unlimited' => -1, - 'disabled' => 0, - 'limited' => 128, - default => throw new LogicException('Invalid state'), - }; - - $set('swap', $value); - }) - ->options([ - 'unlimited' => 'Unlimited', - 'limited' => 'Limited', - 'disabled' => 'Disabled', - ]) - ->colors([ - 'unlimited' => 'primary', - 'limited' => 'warning', - 'disabled' => 'danger', - ]), - - TextInput::make('swap') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => match ($get('swap_support')) { - 'disabled', 'unlimited' => true, - default => false, - }) - ->label('Swap Memory') - ->default(0) - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->minValue(-1) - ->columnSpan(2) - ->inlineLabel() - ->required() - ->integer(), - ]), - - Hidden::make('io') - ->helperText('The IO performance relative to other running containers') - ->label('Block IO Proportion') - ->default(500), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('oom_killer') - ->label('OOM Killer') - ->inlineLabel()->inline() - ->default(false) - ->columnSpan(2) - ->options([ - false => 'Disabled', - true => 'Enabled', - ]) - ->colors([ - false => 'success', - true => 'danger', - ]), - - TextInput::make('oom_disabled_hidden') - ->hidden(), - ]), - ]), - - Fieldset::make('Feature Limits') - ->inlineLabel() - ->columnSpan(6) - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 3, - ]) - ->schema([ - TextInput::make('allocation_limit') - ->label('Allocations') - ->suffixIcon('tabler-network') - ->required() - ->numeric() - ->minValue(0) - ->default(0), - TextInput::make('database_limit') - ->label('Databases') - ->suffixIcon('tabler-database') - ->required() - ->numeric() - ->minValue(0) - ->default(0), - TextInput::make('backup_limit') - ->label('Backups') - ->suffixIcon('tabler-copy-check') - ->required() - ->numeric() - ->minValue(0) - ->default(0), - ]), - Fieldset::make('Docker Settings') - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 4, - ]) - ->columnSpan(6) - ->schema([ - Select::make('select_image') - ->label('Image Name') - ->afterStateUpdated(fn (Set $set, $state) => $set('image', $state)) - ->options(function ($state, Get $get, Set $set) { - $egg = Egg::query()->find($get('egg_id')); - $images = $egg->docker_images ?? []; - - $currentImage = $get('image'); - if (!$currentImage && $images) { - $defaultImage = collect($images)->first(); - $set('image', $defaultImage); - $set('select_image', $defaultImage); - } - - return array_flip($images) + ['ghcr.io/custom-image' => 'Custom Image']; - }) - ->selectablePlaceholder(false) - ->columnSpan([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 2, - ]), - - TextInput::make('image') - ->label('Image') - ->debounce(500) - ->afterStateUpdated(function ($state, Get $get, Set $set) { - $egg = Egg::query()->find($get('egg_id')); - $images = $egg->docker_images ?? []; - - if (in_array($state, $images)) { - $set('select_image', $state); - } else { - $set('select_image', 'ghcr.io/custom-image'); - } - }) - ->placeholder('Enter a custom Image') - ->columnSpan([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 2, - ]), - - KeyValue::make('docker_labels') - ->label('Container Labels') - ->keyLabel('Title') - ->valueLabel('Description') - ->columnSpanFull(), - - CheckboxList::make('mounts') - ->live() - ->relationship('mounts') - ->options(fn () => $this->node?->mounts->mapWithKeys(fn ($mount) => [$mount->id => $mount->name]) ?? []) - ->descriptions(fn () => $this->node?->mounts->mapWithKeys(fn ($mount) => [$mount->id => "$mount->source -> $mount->target"]) ?? []) - ->label('Mounts') - ->helperText(fn () => $this->node?->mounts->isNotEmpty() ? '' : 'No Mounts exist for this Node') - ->columnSpanFull(), - ]), - ]), - ]) - ->columnSpanFull() - ->nextAction(fn (Action $action) => $action->label('Next Step')) - ->submitAction(new HtmlString(Blade::render(<<<'BLADE' - - Create Server - - BLADE))), - ]); - } - - public function refreshForm(): void - { - $this->fillForm(); - } - - protected function getFormActions(): array - { - return []; - } - - protected function handleRecordCreation(array $data): Model - { - $data['allocation_additional'] = collect($data['allocation_additional'])->filter()->all(); - - /** @var ServerCreationService $service */ - $service = resolve(ServerCreationService::class); - - return $service->handle($data); - } - - private function shouldHideComponent(Get $get, Component $component): bool - { - $containsRuleIn = collect($get('rules'))->reduce( - fn ($result, $value) => $result === true && !str($value)->startsWith('in:'), true - ); - - if ($component instanceof Select) { - return $containsRuleIn; - } - - if ($component instanceof TextInput) { - return !$containsRuleIn; - } - - throw new Exception('Component type not supported: ' . $component::class); - } - - private function getSelectOptionsFromRules(Get $get): array - { - $inRule = collect($get('rules'))->reduce( - fn ($result, $value) => str($value)->startsWith('in:') ? $value : $result, '' - ); - - return str($inRule) - ->after('in:') - ->explode(',') - ->each(fn ($value) => str($value)->trim()) - ->mapWithKeys(fn ($value) => [$value => $value]) - ->all(); - } -} diff --git a/app/Filament/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Resources/ServerResource/Pages/EditServer.php deleted file mode 100644 index 0fdb603fa7..0000000000 --- a/app/Filament/Resources/ServerResource/Pages/EditServer.php +++ /dev/null @@ -1,823 +0,0 @@ -schema([ - Tabs::make('Tabs') - ->persistTabInQueryString() - ->columns([ - 'default' => 2, - 'sm' => 2, - 'md' => 4, - 'lg' => 6, - ]) - ->columnSpanFull() - ->tabs([ - Tab::make('Information') - ->icon('tabler-info-circle') - ->schema([ - TextInput::make('name') - ->prefixIcon('tabler-server') - ->label('Display Name') - ->suffixAction(Action::make('random') - ->icon('tabler-dice-' . random_int(1, 6)) - ->action(function (Set $set, Get $get) { - $egg = Egg::find($get('egg_id')); - $prefix = $egg ? str($egg->name)->lower()->kebab() . '-' : ''; - - $word = (new RandomWordService())->word(); - - $set('name', $prefix . $word); - })) - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 2, - 'lg' => 3, - ]) - ->required() - ->maxLength(255), - - Select::make('owner_id') - ->prefixIcon('tabler-user') - ->label('Owner') - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 2, - 'lg' => 2, - ]) - ->relationship('user', 'username') - ->searchable() - ->preload() - ->required(), - - ToggleButtons::make('condition') - ->label('Server Status') - ->formatStateUsing(fn (Server $server) => $server->condition) - ->options(fn ($state) => collect(array_merge(ContainerStatus::cases(), ServerState::cases())) - ->filter(fn ($condition) => $condition->value === $state) - ->mapWithKeys(fn ($state) => [$state->value => str($state->value)->replace('_', ' ')->ucwords()]) - ) - ->colors(collect(array_merge(ContainerStatus::cases(), ServerState::cases()))->mapWithKeys( - fn ($status) => [$status->value => $status->color()] - )) - ->icons(collect(array_merge(ContainerStatus::cases(), ServerState::cases()))->mapWithKeys( - fn ($status) => [$status->value => $status->icon()] - )) - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 1, - 'lg' => 1, - ]), - - Textarea::make('description') - ->label('Description') - ->columnSpanFull(), - - TextInput::make('uuid') - ->hintAction(CopyAction::make()) - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 2, - 'lg' => 3, - ]) - ->readOnly() - ->dehydrated(false), - TextInput::make('uuid_short') - ->label('Short UUID') - ->hintAction(CopyAction::make()) - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 2, - 'lg' => 3, - ]) - ->readOnly() - ->dehydrated(false), - TextInput::make('external_id') - ->label('External ID') - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 2, - 'lg' => 3, - ]) - ->maxLength(255), - Select::make('node_id') - ->label('Node') - ->relationship('node', 'name') - ->columnSpan([ - 'default' => 2, - 'sm' => 1, - 'md' => 2, - 'lg' => 3, - ]) - ->disabled(), - ]), - Tab::make('Environment') - ->icon('tabler-brand-docker') - ->schema([ - Fieldset::make('Resource Limits') - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 3, - ]) - ->schema([ - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_mem') - ->label('Memory')->inlineLabel()->inline() - ->afterStateUpdated(fn (Set $set) => $set('memory', 0)) - ->formatStateUsing(fn (Get $get) => $get('memory') == 0) - ->live() - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - - TextInput::make('memory') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_mem')) - ->label('Memory Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0), - ]), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_disk') - ->label('Disk Space')->inlineLabel()->inline() - ->live() - ->afterStateUpdated(fn (Set $set) => $set('disk', 0)) - ->formatStateUsing(fn (Get $get) => $get('disk') == 0) - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - - TextInput::make('disk') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_disk')) - ->label('Disk Space Limit')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0), - ]), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('unlimited_cpu') - ->label('CPU')->inlineLabel()->inline() - ->afterStateUpdated(fn (Set $set) => $set('cpu', 0)) - ->formatStateUsing(fn (Get $get) => $get('cpu') == 0) - ->live() - ->options([ - true => 'Unlimited', - false => 'Limited', - ]) - ->colors([ - true => 'primary', - false => 'warning', - ]) - ->columnSpan(2), - - TextInput::make('cpu') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => $get('unlimited_cpu')) - ->label('CPU Limit')->inlineLabel() - ->suffix('%') - ->required() - ->columnSpan(2) - ->numeric() - ->minValue(0), - ]), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('swap_support') - ->live() - ->label('Enable Swap Memory')->inlineLabel()->inline() - ->columnSpan(2) - ->afterStateUpdated(function ($state, Set $set) { - $value = match ($state) { - 'unlimited' => -1, - 'disabled' => 0, - 'limited' => 128, - default => throw new LogicException('Invalid state') - }; - - $set('swap', $value); - }) - ->formatStateUsing(function (Get $get) { - return match (true) { - $get('swap') > 0 => 'limited', - $get('swap') == 0 => 'disabled', - $get('swap') < 0 => 'unlimited', - default => throw new LogicException('Invalid state') - }; - }) - ->options([ - 'unlimited' => 'Unlimited', - 'limited' => 'Limited', - 'disabled' => 'Disabled', - ]) - ->colors([ - 'unlimited' => 'primary', - 'limited' => 'warning', - 'disabled' => 'danger', - ]), - - TextInput::make('swap') - ->dehydratedWhenHidden() - ->hidden(fn (Get $get) => match ($get('swap_support')) { - 'disabled', 'unlimited', true => true, - default => false, - }) - ->label('Swap Memory')->inlineLabel() - ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') - ->minValue(-1) - ->columnSpan(2) - ->required() - ->integer(), - ]), - - Forms\Components\Hidden::make('io') - ->helperText('The IO performance relative to other running containers') - ->label('Block IO Proportion'), - - Grid::make() - ->columns(4) - ->columnSpanFull() - ->schema([ - ToggleButtons::make('oom_killer') - ->label('OOM Killer')->inlineLabel()->inline() - ->columnSpan(2) - ->options([ - false => 'Disabled', - true => 'Enabled', - ]) - ->colors([ - false => 'success', - true => 'danger', - ]), - - TextInput::make('oom_disabled_hidden') - ->hidden(), - ]), - ]), - - Fieldset::make('Feature Limits') - ->inlineLabel() - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 3, - ]) - ->schema([ - TextInput::make('allocation_limit') - ->suffixIcon('tabler-network') - ->required() - ->minValue(0) - ->numeric(), - TextInput::make('database_limit') - ->suffixIcon('tabler-database') - ->required() - ->minValue(0) - ->numeric(), - TextInput::make('backup_limit') - ->suffixIcon('tabler-copy-check') - ->required() - ->minValue(0) - ->numeric(), - ]), - Fieldset::make('Docker Settings') - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 3, - 'lg' => 3, - ]) - ->schema([ - Select::make('select_image') - ->label('Image Name') - ->afterStateUpdated(fn (Set $set, $state) => $set('image', $state)) - ->options(function ($state, Get $get, Set $set) { - $egg = Egg::query()->find($get('egg_id')); - $images = $egg->docker_images ?? []; - - $currentImage = $get('image'); - if (!$currentImage && $images) { - $defaultImage = collect($images)->first(); - $set('image', $defaultImage); - $set('select_image', $defaultImage); - } - - return array_flip($images) + ['ghcr.io/custom-image' => 'Custom Image']; - }) - ->selectablePlaceholder(false) - ->columnSpan(1), - - TextInput::make('image') - ->label('Image') - ->debounce(500) - ->afterStateUpdated(function ($state, Get $get, Set $set) { - $egg = Egg::query()->find($get('egg_id')); - $images = $egg->docker_images ?? []; - - if (in_array($state, $images)) { - $set('select_image', $state); - } else { - $set('select_image', 'ghcr.io/custom-image'); - } - }) - ->placeholder('Enter a custom Image') - ->columnSpan(2), - - Forms\Components\KeyValue::make('docker_labels') - ->label('Container Labels') - ->keyLabel('Label Name') - ->valueLabel('Label Description') - ->columnSpanFull(), - ]), - ]), - Tab::make('Egg') - ->icon('tabler-egg') - ->columns([ - 'default' => 1, - 'sm' => 3, - 'md' => 3, - 'lg' => 5, - ]) - ->schema([ - Select::make('egg_id') - ->disabledOn('edit') - ->prefixIcon('tabler-egg') - ->columnSpan([ - 'default' => 6, - 'sm' => 3, - 'md' => 3, - 'lg' => 4, - ]) - ->relationship('egg', 'name') - ->searchable() - ->preload() - ->required(), - - ToggleButtons::make('skip_scripts') - ->label('Run Egg Install Script?')->inline() - ->columnSpan([ - 'default' => 6, - 'sm' => 1, - 'md' => 1, - 'lg' => 2, - ]) - ->options([ - false => 'Yes', - true => 'Skip', - ]) - ->colors([ - false => 'primary', - true => 'danger', - ]) - ->icons([ - false => 'tabler-code', - true => 'tabler-code-off', - ]) - ->required(), - - Textarea::make('startup') - ->label('Startup Command') - ->required() - ->columnSpan(6) - ->rows(function ($state) { - return str($state)->explode("\n")->reduce( - fn (int $carry, $line) => $carry + floor(strlen($line) / 125), - 0 - ); - }), - - Textarea::make('defaultStartup') - ->hintAction(CopyAction::make()) - ->label('Default Startup Command') - ->disabled() - ->formatStateUsing(function ($state, Get $get) { - $egg = Egg::query()->find($get('egg_id')); - - return $egg->startup; - }) - ->columnSpan(6), - - Repeater::make('server_variables') - ->relationship('serverVariables', function (Builder $query) { - /** @var Server $server */ - $server = $this->getRecord(); - - foreach ($server->variables as $variable) { - ServerVariable::query()->firstOrCreate([ - 'server_id' => $server->id, - 'variable_id' => $variable->id, - ], [ - 'variable_value' => $variable->server_value ?? '', - ]); - } - - return $query; - }) - ->grid() - ->mutateRelationshipDataBeforeSaveUsing(function (array &$data): array { - foreach ($data as $key => $value) { - if (!isset($data['variable_value'])) { - $data['variable_value'] = ''; - } - } - - return $data; - }) - ->reorderable(false)->addable(false)->deletable(false) - ->schema(function () { - - $text = TextInput::make('variable_value') - ->hidden($this->shouldHideComponent(...)) - ->required(fn (ServerVariable $serverVariable) => $serverVariable->variable->getRequiredAttribute()) - ->rules([ - fn (ServerVariable $serverVariable): Closure => function (string $attribute, $value, Closure $fail) use ($serverVariable) { - $validator = Validator::make(['validatorkey' => $value], [ - 'validatorkey' => $serverVariable->variable->rules, - ]); - - if ($validator->fails()) { - $message = str($validator->errors()->first())->replace('validatorkey', $serverVariable->variable->name); - - $fail($message); - } - }, - ]); - - $select = Select::make('variable_value') - ->hidden($this->shouldHideComponent(...)) - ->options($this->getSelectOptionsFromRules(...)) - ->selectablePlaceholder(false); - - $components = [$text, $select]; - - foreach ($components as &$component) { - $component = $component - ->live(onBlur: true) - ->hintIcon('tabler-code') - ->label(fn (ServerVariable $serverVariable) => $serverVariable->variable->name) - ->hintIconTooltip(fn (ServerVariable $serverVariable) => implode('|', $serverVariable->variable->rules)) - ->prefix(fn (ServerVariable $serverVariable) => '{{' . $serverVariable->variable->env_variable . '}}') - ->helperText(fn (ServerVariable $serverVariable) => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description); - } - - return $components; - }) - ->columnSpan(6), - ]), - Tab::make('Mounts') - ->icon('tabler-layers-linked') - ->schema([ - CheckboxList::make('mounts') - ->relationship('mounts') - ->options(fn (Server $server) => $server->node->mounts->mapWithKeys(fn ($mount) => [$mount->id => $mount->name])) - ->descriptions(fn (Server $server) => $server->node->mounts->mapWithKeys(fn ($mount) => [$mount->id => "$mount->source -> $mount->target"])) - ->label('Mounts') - ->helperText(fn (Server $server) => $server->node->mounts->isNotEmpty() ? '' : 'No Mounts exist for this Node') - ->columnSpanFull(), - ]), - Tab::make('Databases') - ->icon('tabler-database') - ->schema([ - Repeater::make('databases') - ->grid() - ->helperText(fn (Server $server) => $server->databases->isNotEmpty() ? '' : 'No Databases exist for this Server') - ->columns(2) - ->schema([ - TextInput::make('database') - ->columnSpan(2) - ->label('Database Name') - ->disabled() - ->formatStateUsing(fn ($record) => $record->database) - ->hintAction( - Action::make('Delete') - ->color('danger') - ->icon('tabler-trash') - ->action(fn (DatabaseManagementService $databaseManagementService, $record) => $databaseManagementService->delete($record)) - ), - TextInput::make('username') - ->disabled() - ->formatStateUsing(fn ($record) => $record->username) - ->columnSpan(2), - TextInput::make('password') - ->disabled() - ->hintAction( - Action::make('rotate') - ->icon('tabler-refresh') - ->requiresConfirmation() - ->action(fn (DatabasePasswordService $service, $record, $set, $get) => $this->rotatePassword($service, $record, $set, $get)) - ) - ->formatStateUsing(fn (Database $database) => $database->password) - ->columnSpan(2), - TextInput::make('remote') - ->disabled() - ->formatStateUsing(fn ($record) => $record->remote) - ->columnSpan(1) - ->label('Connections From'), - TextInput::make('max_connections') - ->disabled() - ->formatStateUsing(fn ($record) => $record->max_connections) - ->columnSpan(1), - TextInput::make('JDBC') - ->disabled() - ->label('JDBC Connection String') - ->columnSpan(2) - ->formatStateUsing(fn (Get $get, $record) => 'jdbc:mysql://' . $get('username') . ':' . urlencode($record->password) . '@' . $record->host->host . ':' . $record->host->port . '/' . $get('database')), - ]) - ->relationship('databases') - ->deletable(false) - ->addable(false) - ->columnSpan(4), - ])->columns(4), - Tab::make('Actions') - ->icon('tabler-settings') - ->schema([ - Fieldset::make('Server Actions') - ->columns([ - 'default' => 1, - 'sm' => 2, - 'md' => 2, - 'lg' => 6, - ]) - ->schema([ - Grid::make() - ->columnSpan(3) - ->schema([ - Forms\Components\Actions::make([ - Action::make('toggleInstall') - ->label('Toggle Install Status') - ->disabled(fn (Server $server) => $server->isSuspended()) - ->action(function (ServersController $serversController, Server $server) { - $serversController->toggleInstall($server); - - $this->refreshFormData(['status', 'docker']); - }), - ])->fullWidth(), - ToggleButtons::make('') - ->hint('If you need to change the install status from uninstalled to installed, or vice versa, you may do so with this button.'), - ]), - Grid::make() - ->columnSpan(3) - ->schema([ - Forms\Components\Actions::make([ - Action::make('toggleSuspend') - ->label('Suspend') - ->color('warning') - ->hidden(fn (Server $server) => $server->isSuspended()) - ->action(function (SuspensionService $suspensionService, Server $server) { - $suspensionService->toggle($server, 'suspend'); - Notification::make()->success()->title('Server Suspended!')->send(); - - $this->refreshFormData(['status', 'docker']); - }), - Action::make('toggleUnsuspend') - ->label('Unsuspend') - ->color('success') - ->hidden(fn (Server $server) => !$server->isSuspended()) - ->action(function (SuspensionService $suspensionService, Server $server) { - $suspensionService->toggle($server, 'unsuspend'); - Notification::make()->success()->title('Server Unsuspended!')->send(); - - $this->refreshFormData(['status', 'docker']); - }), - ])->fullWidth(), - ToggleButtons::make('') - ->hidden(fn (Server $server) => $server->isSuspended()) - ->hint('This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.'), - ToggleButtons::make('') - ->hidden(fn (Server $server) => !$server->isSuspended()) - ->hint('This will unsuspend the server and restore normal user access.'), - ]), - Grid::make() - ->columnSpan(3) - ->schema([ - Forms\Components\Actions::make([ - Action::make('transfer') - ->label('Transfer Soon™') - ->action(fn (TransferServerService $transfer, Server $server) => $transfer->handle($server, [])) - ->disabled() //TODO! - ->form([ //TODO! - Select::make('newNode') - ->label('New Node') - ->required() - ->options([ - true => 'on', - false => 'off', - ]), - Select::make('newMainAllocation') - ->label('New Main Allocation') - ->required() - ->options([ - true => 'on', - false => 'off', - ]), - Select::make('newAdditionalAllocation') - ->label('New Additional Allocations') - ->options([ - true => 'on', - false => 'off', - ]), - ]) - ->modalHeading('Transfer'), - ])->fullWidth(), - ToggleButtons::make('') - ->hint('Transfer this server to another node connected to this panel. Warning! This feature has not been fully tested and may have bugs.'), - ]), - Grid::make() - ->columnSpan(3) - ->schema([ - Forms\Components\Actions::make([ - Action::make('reinstall') - ->label('Reinstall') - ->color('danger') - ->requiresConfirmation() - ->modalHeading('Are you sure you want to reinstall this server?') - ->modalDescription('!! This can result in unrecoverable data loss !!') - ->disabled(fn (Server $server) => $server->isSuspended()) - ->action(fn (ServersController $serversController, Server $server) => $serversController->reinstallServer($server)), - ])->fullWidth(), - ToggleButtons::make('') - ->hint('This will reinstall the server with the assigned egg install script.'), - ]), - ]), - ]), - ]), - ]); - } - - protected function transferServer(Form $form): Form - { - return $form - ->columns() - ->schema([ - Select::make('toNode') - ->label('New Node'), - TextInput::make('newAllocation') - ->label('Allocation'), - ]); - - } - protected function getHeaderActions(): array - { - return [ - Actions\Action::make('Delete') - ->successRedirectUrl(route('filament.admin.resources.servers.index')) - ->color('danger') - ->label('Delete') - ->requiresConfirmation() - ->action(function (Server $server) { - resolve(ServerDeletionService::class)->handle($server); - - return redirect(ListServers::getUrl()); - }), - Actions\Action::make('console') - ->label('Console') - ->icon('tabler-terminal') - ->url(fn (Server $server) => "/server/$server->uuid_short"), - $this->getSaveFormAction()->formId('form'), - ]; - - } - protected function getFormActions(): array - { - return []; - } - - protected function mutateFormDataBeforeSave(array $data): array - { - if (!isset($data['description'])) { - $data['description'] = ''; - } - - unset($data['docker'], $data['status']); - - return $data; - } - - public function getRelationManagers(): array - { - return [ - ServerResource\RelationManagers\AllocationsRelationManager::class, - ]; - } - - private function shouldHideComponent(ServerVariable $serverVariable, Forms\Components\Component $component): bool - { - $containsRuleIn = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:'), false); - - if ($component instanceof Select) { - return !$containsRuleIn; - } - - if ($component instanceof TextInput) { - return $containsRuleIn; - } - - throw new Exception('Component type not supported: ' . $component::class); - } - - private function getSelectOptionsFromRules(ServerVariable $serverVariable): array - { - $inRule = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:')); - - return str($inRule) - ->after('in:') - ->explode(',') - ->each(fn ($value) => str($value)->trim()) - ->mapWithKeys(fn ($value) => [$value => $value]) - ->all(); - } - - protected function rotatePassword(DatabasePasswordService $service, $record, $set, $get): void - { - $newPassword = $service->handle($record); - $jdbcString = 'jdbc:mysql://' . $get('username') . ':' . urlencode($newPassword) . '@' . $record->host->host . ':' . $record->host->port . '/' . $get('database'); - - $set('password', $newPassword); - $set('JDBC', $jdbcString); - } -} diff --git a/app/Filament/Resources/ServerResource/Pages/ListServers.php b/app/Filament/Resources/ServerResource/Pages/ListServers.php deleted file mode 100644 index 326499898a..0000000000 --- a/app/Filament/Resources/ServerResource/Pages/ListServers.php +++ /dev/null @@ -1,107 +0,0 @@ -searchable(false) - ->defaultGroup('node.name') - ->groups([ - Group::make('node.name')->getDescriptionFromRecordUsing(fn (Server $server): string => str($server->node->description)->limit(150)), - Group::make('user.username')->getDescriptionFromRecordUsing(fn (Server $server): string => $server->user->email), - Group::make('egg.name')->getDescriptionFromRecordUsing(fn (Server $server): string => str($server->egg->description)->limit(150)), - ]) - ->columns([ - TextColumn::make('condition') - ->default('unknown') - ->badge() - ->icon(fn (Server $server) => $server->conditionIcon()) - ->color(fn (Server $server) => $server->conditionColor()), - TextColumn::make('uuid') - ->hidden() - ->label('UUID') - ->searchable(), - TextColumn::make('name') - ->icon('tabler-brand-docker') - ->searchable() - ->sortable(), - TextColumn::make('node.name') - ->icon('tabler-server-2') - ->url(fn (Server $server): string => route('filament.admin.resources.nodes.edit', ['record' => $server->node])) - ->hidden(fn (Table $table) => $table->getGrouping()?->getId() === 'node.name') - ->sortable() - ->searchable(), - TextColumn::make('egg.name') - ->icon('tabler-egg') - ->url(fn (Server $server): string => route('filament.admin.resources.eggs.edit', ['record' => $server->egg])) - ->hidden(fn (Table $table) => $table->getGrouping()?->getId() === 'egg.name') - ->sortable() - ->searchable(), - TextColumn::make('user.username') - ->icon('tabler-user') - ->label('Owner') - ->url(fn (Server $server): string => route('filament.admin.resources.users.edit', ['record' => $server->user])) - ->hidden(fn (Table $table) => $table->getGrouping()?->getId() === 'user.username') - ->sortable() - ->searchable(), - SelectColumn::make('allocation_id') - ->label('Primary Allocation') - ->hidden(!auth()->user()->can('update server')) - ->options(fn (Server $server) => $server->allocations->mapWithKeys(fn ($allocation) => [$allocation->id => $allocation->address])) - ->selectablePlaceholder(false) - ->sortable(), - TextColumn::make('allocation_id_readonly') - ->label('Primary Allocation') - ->hidden(auth()->user()->can('update server')) - ->state(fn (Server $server) => $server->allocation->address), - TextColumn::make('image')->hidden(), - TextColumn::make('backups_count') - ->counts('backups') - ->label('Backups') - ->icon('tabler-file-download') - ->numeric() - ->sortable(), - ]) - ->actions([ - Action::make('View') - ->icon('tabler-terminal') - ->url(fn (Server $server) => "/server/$server->uuid_short") - ->authorize(fn () => auth()->user()->can('view server')), - EditAction::make(), - ]) - ->emptyStateIcon('tabler-brand-docker') - ->searchable() - ->emptyStateDescription('') - ->emptyStateHeading('No Servers') - ->emptyStateActions([ - CreateAction::make('create') - ->label('Create Server') - ->button(), - ]); - } - protected function getHeaderActions(): array - { - return [ - Actions\CreateAction::make() - ->label('Create Server') - ->hidden(fn () => Server::count() <= 0), - ]; - } -} diff --git a/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php b/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php deleted file mode 100644 index 2060c127f3..0000000000 --- a/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php +++ /dev/null @@ -1,161 +0,0 @@ -schema([ - TextInput::make('ip') - ->required() - ->maxLength(255), - ]); - } - - public function table(Table $table): Table - { - return $table - ->recordTitleAttribute('ip') - ->recordTitle(fn (Allocation $allocation) => "$allocation->ip:$allocation->port") - ->checkIfRecordIsSelectableUsing(fn (Allocation $record) => $record->id !== $this->getOwnerRecord()->allocation_id) - ->inverseRelationship('server') - ->columns([ - TextColumn::make('ip')->label('IP'), - TextColumn::make('port')->label('Port'), - TextInputColumn::make('ip_alias')->label('Alias'), - IconColumn::make('primary') - ->icon(fn ($state) => match ($state) { - true => 'tabler-star-filled', - default => 'tabler-star', - }) - ->color(fn ($state) => match ($state) { - true => 'warning', - default => 'gray', - }) - ->action(fn (Allocation $allocation) => $this->getOwnerRecord()->update(['allocation_id' => $allocation->id])) - ->default(fn (Allocation $allocation) => $allocation->id === $this->getOwnerRecord()->allocation_id) - ->label('Primary'), - ]) - ->actions([ - Action::make('make-primary') - ->action(fn (Allocation $allocation) => $this->getOwnerRecord()->update(['allocation_id' => $allocation->id])) - ->label(fn (Allocation $allocation) => $allocation->id === $this->getOwnerRecord()->allocation_id ? '' : 'Make Primary'), - ]) - ->headerActions([ - CreateAction::make()->label('Create Allocation') - ->createAnother(false) - ->form(fn () => [ - TextInput::make('allocation_ip') - ->datalist($this->getOwnerRecord()->node->ipAddresses()) - ->label('IP Address') - ->inlineLabel() - ->ipv4() - ->helperText("Usually your machine's public IP unless you are port forwarding.") - ->required(), - TextInput::make('allocation_alias') - ->label('Alias') - ->inlineLabel() - ->default(null) - ->helperText('Optional display name to help you remember what these are.') - ->required(false), - TagsInput::make('allocation_ports') - ->placeholder('Examples: 27015, 27017-27019') - ->helperText(new HtmlString(' - These are the ports that users can connect to this Server through. -
- You would have to port forward these on your home network. - ')) - ->label('Ports') - ->inlineLabel() - ->live() - ->afterStateUpdated(function ($state, Set $set) { - $ports = collect(); - $update = false; - foreach ($state as $portEntry) { - if (!str_contains($portEntry, '-')) { - if (is_numeric($portEntry)) { - $ports->push((int) $portEntry); - - continue; - } - - // Do not add non numerical ports - $update = true; - - continue; - } - - $update = true; - [$start, $end] = explode('-', $portEntry); - if (!is_numeric($start) || !is_numeric($end)) { - continue; - } - - $start = max((int) $start, 0); - $end = min((int) $end, 2 ** 16 - 1); - foreach (range($start, $end) as $i) { - $ports->push($i); - } - } - - $uniquePorts = $ports->unique()->values(); - if ($ports->count() > $uniquePorts->count()) { - $update = true; - $ports = $uniquePorts; - } - - $sortedPorts = $ports->sort()->values(); - if ($sortedPorts->all() !== $ports->all()) { - $update = true; - $ports = $sortedPorts; - } - - $ports = $ports->filter(fn ($port) => $port > 1024 && $port < 65535)->values(); - - if ($update) { - $set('allocation_ports', $ports->all()); - } - }) - ->splitKeys(['Tab', ' ', ',']) - ->required(), - ]) - ->action(fn (array $data) => resolve(AssignmentService::class)->handle($this->getOwnerRecord()->node, $data, $this->getOwnerRecord())), - AssociateAction::make() - ->multiple() - ->associateAnother(false) - ->preloadRecordSelect() - ->recordSelectOptionsQuery(fn ($query) => $query->whereBelongsTo($this->getOwnerRecord()->node)) - ->label('Add Allocation'), - ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DissociateBulkAction::make(), - ]), - ]); - } -} diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/UserResource.php deleted file mode 100644 index f22b42a811..0000000000 --- a/app/Filament/Resources/UserResource.php +++ /dev/null @@ -1,37 +0,0 @@ - Pages\ListUsers::route('/'), - 'edit' => Pages\EditUser::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/Resources/UserResource/Pages/EditProfile.php b/app/Filament/Resources/UserResource/Pages/EditProfile.php deleted file mode 100644 index f5c5f5828d..0000000000 --- a/app/Filament/Resources/UserResource/Pages/EditProfile.php +++ /dev/null @@ -1,315 +0,0 @@ - $this->form( - $this->makeForm() - ->schema([ - Tabs::make()->persistTabInQueryString() - ->schema([ - Tab::make('Account') - ->label(trans('strings.account')) - ->icon('tabler-user') - ->schema([ - TextInput::make('username') - ->label(trans('strings.username')) - ->disabled() - ->readOnly() - ->dehydrated(false) - ->maxLength(255) - ->unique(ignoreRecord: true) - ->autofocus(), - TextInput::make('email') - ->prefixIcon('tabler-mail') - ->label(trans('strings.email')) - ->email() - ->required() - ->maxLength(255) - ->unique(ignoreRecord: true), - TextInput::make('password') - ->label(trans('strings.password')) - ->password() - ->prefixIcon('tabler-password') - ->revealable(filament()->arePasswordsRevealable()) - ->rule(Password::default()) - ->autocomplete('new-password') - ->dehydrated(fn ($state): bool => filled($state)) - ->dehydrateStateUsing(fn ($state): string => Hash::make($state)) - ->live(debounce: 500) - ->same('passwordConfirmation'), - TextInput::make('passwordConfirmation') - ->label(trans('strings.password_confirmation')) - ->password() - ->prefixIcon('tabler-password-fingerprint') - ->revealable(filament()->arePasswordsRevealable()) - ->required() - ->visible(fn (Get $get): bool => filled($get('password'))) - ->dehydrated(false), - Select::make('timezone') - ->required() - ->prefixIcon('tabler-clock-pin') - ->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz])) - ->searchable(), - Select::make('language') - ->label(trans('strings.language')) - ->required() - ->prefixIcon('tabler-flag') - ->live() - ->default('en') - ->helperText(fn (User $user, $state) => new HtmlString($user->isLanguageTranslated($state) ? '' : " - Your language ($state) has not been translated yet! - But never fear, you can help fix that by - contributing directly here. - ") - ) - ->options(fn (User $user) => $user->getAvailableLanguages()), - ]), - - Tab::make('2FA') - ->icon('tabler-shield-lock') - ->schema(function () { - if ($this->getUser()->use_totp) { - return [ - Placeholder::make('2fa-already-enabled') - ->label('Two Factor Authentication is currently enabled!'), - Textarea::make('backup-tokens') - ->hidden(fn () => !cache()->get("users.{$this->getUser()->id}.2fa.tokens")) - ->rows(10) - ->readOnly() - ->dehydrated(false) - ->formatStateUsing(fn () => cache()->get("users.{$this->getUser()->id}.2fa.tokens")) - ->helperText('These will not be shown again!') - ->label('Backup Tokens:'), - TextInput::make('2fa-disable-code') - ->label('Disable 2FA') - ->helperText('Enter your current 2FA code to disable Two Factor Authentication'), - ]; - } - /** @var TwoFactorSetupService */ - $setupService = app(TwoFactorSetupService::class); - - ['image_url_data' => $url, 'secret' => $secret] = cache()->remember( - "users.{$this->getUser()->id}.2fa.state", - now()->addMinutes(5), fn () => $setupService->handle($this->getUser()) - ); - - $options = new QROptions([ - 'svgLogo' => public_path('pelican.svg'), - 'svgLogoScale' => 0.05, - 'addLogoSpace' => true, - 'logoSpaceWidth' => 13, - 'logoSpaceHeight' => 13, - ]); - - // https://github.com/chillerlan/php-qrcode/blob/main/examples/svgWithLogo.php - - // QROptions - // @phpstan-ignore property.protected - $options->version = Version::AUTO; - // $options->outputInterface = QRSvgWithLogo::class; - // @phpstan-ignore property.protected - $options->outputBase64 = false; - // @phpstan-ignore property.protected - $options->eccLevel = EccLevel::H; // ECC level H is necessary when using logos - // @phpstan-ignore property.protected - $options->addQuietzone = true; - // $options->drawLightModules = true; - // @phpstan-ignore property.protected - $options->connectPaths = true; - // @phpstan-ignore property.protected - $options->drawCircularModules = true; - // $options->circleRadius = 0.45; - - // @phpstan-ignore property.protected - $options->svgDefs = ' - - - - - '; - - $image = (new QRCode($options))->render($url); - - return [ - Placeholder::make('qr') - ->label('Scan QR Code') - ->content(fn () => new HtmlString(" -
$image
- ")) - ->helperText('Setup Key: '. $secret), - TextInput::make('2facode') - ->label('Code') - ->requiredWith('2fapassword') - ->helperText('Scan the QR code above using your two-step authentication app, then enter the code generated.'), - TextInput::make('2fapassword') - ->label('Current Password') - ->requiredWith('2facode') - ->currentPassword() - ->password() - ->helperText('Enter your current password to verify.'), - ]; - }), - Tab::make('API Keys') - ->icon('tabler-key') - ->schema([ - Grid::make('asdf')->columns(5)->schema([ - Section::make('Create API Key')->columnSpan(3)->schema([ - TextInput::make('description') - ->live(), - TagsInput::make('allowed_ips') - ->live() - ->splitKeys([',', ' ', 'Tab']) - ->placeholder('Example: 127.0.0.1 or 192.168.1.1') - ->label('Whitelisted IP\'s') - ->helperText('Press enter to add a new IP address or leave blank to allow any IP address') - ->columnSpanFull(), - ])->headerActions([ - Action::make('Create') - ->disabled(fn (Get $get) => $get('description') === null) - ->successRedirectUrl(route('filament.admin.auth.profile', ['tab' => '-api-keys-tab'])) - ->action(function (Get $get, Action $action, User $user) { - $token = $user->createToken( - $get('description'), - $get('allowed_ips'), - ); - Activity::event('user:api-key.create') - ->subject($token->accessToken) - ->property('identifier', $token->accessToken->identifier) - ->log(); - $action->success(); - }), - ]), - Section::make('Keys')->columnSpan(2)->schema([ - Repeater::make('keys') - ->label('') - ->relationship('apiKeys') - ->addable(false) - ->itemLabel(fn ($state) => $state['identifier']) - ->deleteAction(function (Action $action) { - $action->requiresConfirmation()->action(function (array $arguments, Repeater $component) { - $items = $component->getState(); - $key = $items[$arguments['item']]; - ApiKey::find($key['id'] ?? null)?->delete(); - - unset($items[$arguments['item']]); - - $component->state($items); - - $component->callAfterStateUpdated(); - }); - }) - ->schema(fn () => [ - Placeholder::make('adf')->label(fn (ApiKey $key) => $key->memo), - ]), - ]), - ]), - ]), - Tab::make('SSH Keys') - ->icon('tabler-lock-code') - ->schema([ - Placeholder::make('Coming soon!'), - ]), - Tab::make('Activity') - ->icon('tabler-history') - ->schema([ - Repeater::make('activity') - ->deletable(false) - ->addable(false) - ->relationship(null, function (Builder $query) { - $query->orderBy('timestamp', 'desc'); - }) - ->schema([ - Placeholder::make('activity!')->label('')->content(fn (ActivityLog $log) => new HtmlString($log->htmlable())), - ]), - ]), - ]), - ]) - ->operation('edit') - ->model($this->getUser()) - ->statePath('data') - ->inlineLabel(!static::isSimple()), - ), - ]; - } - - protected function handleRecordUpdate($record, $data): Model - { - if ($token = $data['2facode'] ?? null) { - /** @var ToggleTwoFactorService $service */ - $service = resolve(ToggleTwoFactorService::class); - - $tokens = $service->handle($record, $token, true); - cache()->set("users.$record->id.2fa.tokens", implode("\n", $tokens), now()->addSeconds(15)); - - $this->redirectRoute('filament.admin.auth.profile', ['tab' => '-2fa-tab']); - } - - if ($token = $data['2fa-disable-code'] ?? null) { - /** @var ToggleTwoFactorService $service */ - $service = resolve(ToggleTwoFactorService::class); - - $service->handle($record, $token, false); - - cache()->forget("users.$record->id.2fa.state"); - } - - return parent::handleRecordUpdate($record, $data); - } - - public function exception($e, $stopPropagation): void - { - if ($e instanceof TwoFactorAuthenticationTokenInvalid) { - Notification::make() - ->title('Invalid 2FA Code') - ->body($e->getMessage()) - ->color('danger') - ->icon('tabler-2fa') - ->danger() - ->send(); - - $stopPropagation(); - } - } -} diff --git a/app/Filament/Resources/UserResource/Pages/EditUser.php b/app/Filament/Resources/UserResource/Pages/EditUser.php deleted file mode 100644 index 777f20d730..0000000000 --- a/app/Filament/Resources/UserResource/Pages/EditUser.php +++ /dev/null @@ -1,63 +0,0 @@ -schema([ - Section::make()->schema([ - TextInput::make('username')->required()->maxLength(255), - TextInput::make('email')->email()->required()->maxLength(255), - TextInput::make('password') - ->dehydrateStateUsing(fn (string $state): string => Hash::make($state)) - ->dehydrated(fn (?string $state): bool => filled($state)) - ->required(fn (string $operation): bool => $operation === 'create') - ->password(), - Select::make('language') - ->required() - ->hidden() - ->default('en') - ->options(fn (User $user) => $user->getAvailableLanguages()), - Hidden::make('skipValidation')->default(true), - CheckboxList::make('roles') - ->disabled(fn (User $user) => $user->id === auth()->user()->id) - ->disableOptionWhen(fn (string $value): bool => $value == Role::getRootAdmin()->id) - ->relationship('roles', 'name') - ->label('Admin Roles') - ->columnSpanFull() - ->bulkToggleable(false), - ])->columns(), - ]); - } - protected function getHeaderActions(): array - { - return [ - DeleteAction::make() - ->label(fn (User $user) => auth()->user()->id === $user->id ? 'Can\'t Delete Yourself' : ($user->servers()->count() > 0 ? 'User Has Servers' : 'Delete')) - ->disabled(fn (User $user) => auth()->user()->id === $user->id || $user->servers()->count() > 0), - $this->getSaveFormAction()->formId('form'), - ]; - } - - protected function getFormActions(): array - { - return []; - } -} diff --git a/app/Filament/Resources/UserResource/Pages/ListUsers.php b/app/Filament/Resources/UserResource/Pages/ListUsers.php deleted file mode 100644 index 3d9a1af185..0000000000 --- a/app/Filament/Resources/UserResource/Pages/ListUsers.php +++ /dev/null @@ -1,133 +0,0 @@ -searchable(false) - ->columns([ - ImageColumn::make('picture') - ->visibleFrom('lg') - ->label('') - ->extraImgAttributes(['class' => 'rounded-full']) - ->defaultImageUrl(fn (User $user) => 'https://gravatar.com/avatar/' . md5(strtolower($user->email))), - TextColumn::make('external_id') - ->searchable() - ->hidden(), - TextColumn::make('uuid') - ->label('UUID') - ->hidden() - ->searchable(), - TextColumn::make('username') - ->searchable(), - TextColumn::make('email') - ->searchable() - ->icon('tabler-mail'), - IconColumn::make('use_totp') - ->label('2FA') - ->visibleFrom('lg') - ->icon(fn (User $user) => $user->use_totp ? 'tabler-lock' : 'tabler-lock-open-off') - ->boolean()->sortable(), - TextColumn::make('roles_count') - ->counts('roles') - ->icon('tabler-users-group') - ->label('Roles') - ->formatStateUsing(fn (User $user, $state) => $state . ($user->isRootAdmin() ? ' (Root Admin)' : '')), - TextColumn::make('servers_count') - ->counts('servers') - ->icon('tabler-server') - ->label('Servers'), - TextColumn::make('subusers_count') - ->visibleFrom('sm') - ->label('Subusers') - ->counts('subusers') - ->icon('tabler-users'), - // ->formatStateUsing(fn (string $state, $record): string => (string) ($record->servers_count + $record->subusers_count)) - ]) - ->actions([ - EditAction::make(), - ]) - ->checkIfRecordIsSelectableUsing(fn (User $user) => auth()->user()->id !== $user->id && !$user->servers_count) - ->bulkActions([ - BulkActionGroup::make([ - DeleteBulkAction::make() - ->authorize(fn () => auth()->user()->can('delete user')), - ]), - ]); - } - protected function getHeaderActions(): array - { - return [ - CreateAction::make('create') - ->label('Create User') - ->createAnother(false) - ->form([ - Grid::make() - ->schema([ - TextInput::make('username') - ->alphaNum() - ->required() - ->maxLength(255), - TextInput::make('email') - ->email() - ->required() - ->unique() - ->maxLength(255), - TextInput::make('password') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip('Providing a user password is optional. New user email will prompt users to create a password the first time they login.') - ->password(), - CheckboxList::make('roles') - ->disableOptionWhen(fn (string $value): bool => $value == Role::getRootAdmin()->id) - ->relationship('roles', 'name') - ->dehydrated() - ->label('Admin Roles') - ->columnSpanFull() - ->bulkToggleable(false), - ]), - ]) - ->successRedirectUrl(route('filament.admin.resources.users.index')) - ->action(function (array $data) { - $roles = $data['roles']; - $roles = collect($roles)->map(fn ($role) => Role::findById($role)); - unset($data['roles']); - - /** @var UserCreationService $creationService */ - $creationService = resolve(UserCreationService::class); - $user = $creationService->handle($data); - - $user->syncRoles($roles); - - Notification::make() - ->title('User Created!') - ->success() - ->send(); - - return redirect()->route('filament.admin.resources.users.index'); - }), - ]; - } -} diff --git a/app/Filament/Resources/UserResource/RelationManagers/ServersRelationManager.php b/app/Filament/Resources/UserResource/RelationManagers/ServersRelationManager.php deleted file mode 100644 index 98c69ba185..0000000000 --- a/app/Filament/Resources/UserResource/RelationManagers/ServersRelationManager.php +++ /dev/null @@ -1,89 +0,0 @@ -getOwnerRecord(); - - return $table - ->searchable(false) - ->headerActions([ - Actions\Action::make('toggleSuspend') - ->hidden(fn () => $user->servers() - ->whereNot('status', ServerState::Suspended) - ->orWhereNull('status') - ->count() === 0 - ) - ->label('Suspend All Servers') - ->color('warning') - ->action(function () use ($user) { - foreach ($user->servers()->whereNot('status', ServerState::Suspended)->get() as $server) { - resolve(SuspensionService::class)->toggle($server); - } - }), - Actions\Action::make('toggleUnsuspend') - ->hidden(fn () => $user->servers()->where('status', ServerState::Suspended)->count() === 0) - ->label('Unsuspend All Servers') - ->color('primary') - ->action(function () use ($user) { - foreach ($user->servers()->where('status', ServerState::Suspended)->get() as $server) { - resolve(SuspensionService::class)->toggle($server, SuspensionService::ACTION_UNSUSPEND); - } - }), - ]) - ->columns([ - TextColumn::make('uuid') - ->hidden() - ->label('UUID') - ->searchable(), - TextColumn::make('name') - ->icon('tabler-brand-docker') - ->label(trans('strings.name')) - ->url(fn (Server $server): string => route('filament.admin.resources.servers.edit', ['record' => $server])) - ->searchable() - ->sortable(), - TextColumn::make('node.name') - ->icon('tabler-server-2') - ->url(fn (Server $server): string => route('filament.admin.resources.nodes.edit', ['record' => $server->node])) - ->sortable(), - TextColumn::make('egg.name') - ->icon('tabler-egg') - ->url(fn (Server $server): string => route('filament.admin.resources.eggs.edit', ['record' => $server->egg])) - ->sortable(), - SelectColumn::make('allocation.id') - ->label('Primary Allocation') - ->options(fn (Server $server) => [$server->allocation->id => $server->allocation->address]) - ->selectablePlaceholder(false) - ->sortable(), - TextColumn::make('image')->hidden(), - TextColumn::make('databases_count') - ->counts('databases') - ->label('Databases') - ->icon('tabler-database') - ->numeric() - ->sortable(), - TextColumn::make('backups_count') - ->counts('backups') - ->label('Backups') - ->icon('tabler-file-download') - ->numeric() - ->sortable(), - ]); - } -} diff --git a/app/Filament/Server/Components/SmallStatBlock.php b/app/Filament/Server/Components/SmallStatBlock.php new file mode 100644 index 0000000000..6ca5515e63 --- /dev/null +++ b/app/Filament/Server/Components/SmallStatBlock.php @@ -0,0 +1,13 @@ +validateCurrentState(); + } catch (ServerStateConflictException $exception) { + AlertBanner::make('server_conflict') + ->title('Warning') + ->body($exception->getMessage()) + ->warning() + ->send(); + } + } + + public function boot(FeatureService $featureService): void + { + $this->featureService = $featureService; + /** @var Server $server */ + $server = Filament::getTenant(); + foreach ($featureService->getActiveSchemas($server->egg->features) as $feature) { + $this->cacheAction($feature->getAction()); + } + } + + #[On('mount-feature')] + public function mountFeature(string $data): void + { + $data = json_decode($data); + $feature = data_get($data, 'key'); + + $feature = $this->featureService->get($feature); + if (!$feature) { + return; + } + + if ($this->getMountedAction()) { + $this->replaceMountedAction($feature->getId()); + } else { + $this->mountAction($feature->getId()); + } + } + + public function getWidgetData(): array + { + return [ + 'server' => Filament::getTenant(), + 'user' => user(), + ]; + } + + /** @var array>> */ + protected static array $customWidgets = []; + + /** @param class-string[] $customWidgets */ + public static function registerCustomWidgets(ConsoleWidgetPosition $position, array $customWidgets): void + { + static::$customWidgets[$position->value] = array_unique(array_merge(static::$customWidgets[$position->value] ?? [], $customWidgets)); + } + + /** + * @return class-string[] + */ + public function getWidgets(): array + { + $allWidgets = []; + + $allWidgets = array_merge($allWidgets, static::$customWidgets[ConsoleWidgetPosition::Top->value] ?? []); + + $allWidgets[] = ServerOverview::class; + + $allWidgets = array_merge($allWidgets, static::$customWidgets[ConsoleWidgetPosition::AboveConsole->value] ?? []); + + $allWidgets[] = ServerConsole::class; + + $allWidgets = array_merge($allWidgets, static::$customWidgets[ConsoleWidgetPosition::BelowConsole->value] ?? []); + + $allWidgets = array_merge($allWidgets, [ + ServerCpuChart::class, + ServerMemoryChart::class, + ServerNetworkChart::class, + ]); + + $allWidgets = array_merge($allWidgets, static::$customWidgets[ConsoleWidgetPosition::Bottom->value] ?? []); + + return array_unique($allWidgets); + } + + /** + * @return array | WidgetConfiguration> + */ + public function getVisibleWidgets(): array + { + return $this->filterVisibleWidgets($this->getWidgets()); + } + + public function getColumns(): int + { + return 3; + } + + #[On('console-status')] + public function receivedConsoleUpdate(?string $state = null): void + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($state) { + $this->status = ContainerStatus::from($state); + cache()->put("servers.$server->uuid.status", $this->status, now()->addSeconds(15)); + } + + $this->headerActions($this->getHeaderActions()); + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + ActionGroup::make([ + Action::make('start') + ->label(trans('server/console.power_actions.start')) + ->color('primary') + ->icon(TablerIcon::PlayerPlayFilled) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStart, $server)) + ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isStartable()) + ->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'start')) + ->size(Size::ExtraLarge), + Action::make('restart') + ->label(trans('server/console.power_actions.restart')) + ->color('gray') + ->icon(TablerIcon::Reload) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlRestart, $server)) + ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isRestartable()) + ->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'restart')) + ->size(Size::ExtraLarge), + Action::make('stop') + ->label(trans('server/console.power_actions.stop')) + ->color('danger') + ->icon(TablerIcon::PlayerStopFilled) + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) + ->visible(fn () => !$this->status->isKillable()) + ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isStoppable()) + ->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'stop')) + ->size(Size::ExtraLarge), + Action::make('kill') + ->label(trans('server/console.power_actions.kill')) + ->color('danger') + ->icon(TablerIcon::AlertSquare) + ->tooltip(trans('server/console.power_actions.kill_tooltip')) + ->requiresConfirmation() + ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) + ->visible(fn () => $this->status->isKillable()) + ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isKillable()) + ->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'kill')) + ->size(Size::ExtraLarge), + ]) + ->record(function () { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $server; + }) + ->buttonGroup(), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/console.title'); + } + + public function getTitle(): string + { + return trans('server/console.title'); + } +} diff --git a/app/Filament/Server/Pages/ServerFormPage.php b/app/Filament/Server/Pages/ServerFormPage.php new file mode 100644 index 0000000000..c66cd6641b --- /dev/null +++ b/app/Filament/Server/Pages/ServerFormPage.php @@ -0,0 +1,63 @@ +|null */ + public ?array $data = []; + + public function mount(): void + { + $this->authorizeAccess(); + + $this->fillForm(); + } + + public function form(Schema $schema): Schema + { + return $schema + ->statePath('data') + ->model($this->getRecord()); + } + + protected function authorizeAccess(): void {} + + protected function fillForm(): void + { + $data = $this->getRecord()->attributesToArray(); + + $this->form->fill($data); + } + + public function getRecord(): Server + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $server; + } + + public function save(): void {} +} diff --git a/app/Filament/Server/Pages/Settings.php b/app/Filament/Server/Pages/Settings.php new file mode 100644 index 0000000000..9e59f2e8eb --- /dev/null +++ b/app/Filament/Server/Pages/Settings.php @@ -0,0 +1,491 @@ +components([ + Section::make(trans('server/setting.server_info.title')) + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 4, + 'lg' => 6, + ]) + ->schema([ + Fieldset::make() + ->label(trans('server/setting.server_info.information')) + ->columnSpanFull() + ->schema([ + Grid::make() + ->columns(2) + ->columnSpan(5) + ->schema([ + TextInput::make('name') + ->columnStart(1) + ->columnSpanFull() + ->label(trans('server/setting.server_info.name')) + ->disabled(fn (Server $server) => !user()?->can(SubuserPermission::SettingsRename, $server)) + ->required() + ->live(onBlur: true) + ->afterStateUpdated(fn ($state, Server $server) => $this->updateName($state, $server)), + Textarea::make('description') + ->columnStart(1) + ->columnSpanFull() + ->label(trans('server/setting.server_info.description')) + ->hidden(!config('panel.editable_server_descriptions')) + ->disabled(fn (Server $server) => !user()?->can(SubuserPermission::SettingsDescription, $server)) + ->autosize() + ->live(onBlur: true) + ->afterStateUpdated(fn ($state, Server $server) => $this->updateDescription($state ?? '', $server)), + ]), + Grid::make() + ->columns(2) + ->columnStart(6) + ->schema([ + Image::make('', 'icon') + ->hidden(fn ($record) => !$record->icon && !$record->egg->image) + ->url(fn ($record) => $record->icon ?: $record->egg->image) + ->tooltip(fn ($record) => $record->icon ? '' : trans('server/setting.server_info.icon.tooltip')) + ->columnSpan(2) + ->alignJustify(), + Action::make('uploadIcon') + ->hiddenLabel() + ->tooltip(trans('admin/server.import_image')) + ->icon(TablerIcon::PhotoUp) + ->modal() + ->modalSubmitActionLabel(trans('server/setting.server_info.icon.upload')) + ->schema([ + Tabs::make() + ->contained(false) + ->tabs([ + Tab::make(trans('admin/egg.import.url')) + ->schema([ + Hidden::make('imageUrl'), + Hidden::make('imageExtension'), + TextInput::make('image_url') + ->label(trans('admin/egg.import.image_url')) + ->reactive() + ->autocomplete(false) + ->debounce(500) + ->afterStateUpdated(function ($state, Set $set) { + if (!$state) { + $set('image_url_error', null); + $set('imageUrl', null); + $set('imageExtension', null); + + return; + } + + try { + if (!in_array(parse_url($state, PHP_URL_SCHEME), ['http', 'https'], true)) { + throw new \Exception(trans('admin/egg.import.invalid_url')); + } + + if (!filter_var($state, FILTER_VALIDATE_URL)) { + throw new \Exception(trans('admin/egg.import.invalid_url')); + } + + $extension = strtolower(pathinfo(parse_url($state, PHP_URL_PATH), PATHINFO_EXTENSION)); + + if (!array_key_exists($extension, Server::IMAGE_FORMATS)) { + throw new \Exception(trans('admin/egg.import.unsupported_format', ['format' => implode(', ', array_keys(Server::IMAGE_FORMATS))])); + } + + $host = parse_url($state, PHP_URL_HOST); + $ip = gethostbyname($host); + + if ( + filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false + ) { + throw new \Exception(trans('admin/egg.import.no_local_ip')); + } + + $set('imageUrl', $state); + $set('imageExtension', $extension); + $set('image_url_error', null); + + } catch (\Exception $e) { + $set('image_url_error', $e->getMessage()); + $set('imageUrl', null); + $set('imageExtension', null); + } + }), + TextEntry::make('image_url_error') + ->hiddenLabel() + ->visible(fn (Get $get) => $get('image_url_error') !== null) + ->afterStateHydrated(fn (Get $get) => $get('image_url_error')), + Image::make(fn (Get $get) => $get('image_url'), '') + ->imageSize(150) + ->visible(fn (Get $get) => $get('image_url') && !$get('image_url_error')) + ->alignCenter(), + ]), + Tab::make(trans('admin/egg.import.file')) + ->schema([ + FileUpload::make('image') + ->hiddenLabel() + ->previewable() + ->openable(false) + ->downloadable(false) + ->maxSize(256) + ->maxFiles(1) + ->columnSpanFull() + ->alignCenter() + ->imageEditor() + ->image() + ->disk('public') + ->directory(Server::ICON_STORAGE_PATH) + ->acceptedFileTypes([ + 'image/png', + 'image/jpeg', + 'image/webp', + 'image/svg+xml', + ]) + ->getUploadedFileNameForStorageUsing(function (TemporaryUploadedFile $file, $record) { + return $record->uuid . '.' . $file->getClientOriginalExtension(); + }), + ]), + ]), + ]) + ->action(function (array $data, $record): void { + + if (!empty($data['imageUrl']) && !empty($data['imageExtension'])) { + $this->saveIconFromUrl($data['imageUrl'], $data['imageExtension'], $record); + Notification::make() + ->title(trans('server/setting.server_info.icon.updated')) + ->success() + ->send(); + + return; + } + + if (!empty($data['image'])) { + Notification::make() + ->title(trans('server/setting.server_info.icon.updated')) + ->success() + ->send(); + } + + if (empty($data['imageUrl']) && empty($data['image'])) { + Notification::make() + ->title(trans('admin/egg.import.no_image')) + ->warning() + ->send(); + } + }), + DeleteServerIcon::make(), + ]), + TextInput::make('uuid') + ->label(trans('server/setting.server_info.uuid')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 4, + ]) + ->disabled(), + TextInput::make('uuid_short') + ->label(trans('server/setting.server_info.uuid_short')) + ->disabled() + ->columnSpan(1), + TextInput::make('node.name') + ->label(trans('server/setting.server_info.node_name')) + ->formatStateUsing(fn (Server $server) => $server->node->name) + ->disabled() + ->columnSpan(1), + ]), + Fieldset::make() + ->label(trans('server/setting.server_info.limits.title')) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 4, + 'lg' => 6, + ]) + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 2, + 'lg' => 3, + ]) + ->schema([ + TextInput::make('cpu') + ->hiddenLabel() + ->prefix(trans('server/setting.server_info.limits.cpu')) + ->prefixIcon(TablerIcon::Cpu) + ->columnSpan(1) + ->disabled() + ->formatStateUsing(fn ($state, Server $server) => !$state ? trans('server/setting.server_info.limits.unlimited') : format_number($server->cpu) . '%'), + TextInput::make('memory') + ->hiddenLabel() + ->prefix(trans('server/setting.server_info.limits.memory')) + ->prefixIcon(TablerIcon::DeviceDesktopAnalytics) + ->columnSpan(1) + ->disabled() + ->formatStateUsing(fn ($state, Server $server) => !$state ? trans('server/setting.server_info.limits.unlimited') : convert_bytes_to_readable($server->memory * 2 ** 20)), + TextInput::make('disk') + ->hiddenLabel() + ->prefix(trans('server/setting.server_info.limits.disk')) + ->prefixIcon(TablerIcon::DeviceSdCard) + ->columnSpan(1) + ->disabled() + ->formatStateUsing(fn ($state, Server $server) => !$state ? trans('server/setting.server_info.limits.unlimited') : convert_bytes_to_readable($server->disk * 2 ** 20)), + TextInput::make('backup_limit') + ->hiddenLabel() + ->prefix(trans('server/setting.server_info.limits.backups')) + ->prefixIcon(TablerIcon::FileZip) + ->columnSpan(1) + ->disabled() + ->formatStateUsing(fn ($state, Server $server) => !$state ? trans('server/backup.empty') : $server->backups->count() . ' ' .trans('server/setting.server_info.limits.of', ['max' => $state])), + TextInput::make('database_limit') + ->hiddenLabel() + ->prefix(trans('server/setting.server_info.limits.databases')) + ->prefixIcon(TablerIcon::Database) + ->columnSpan(1) + ->disabled() + ->formatStateUsing(fn ($state, Server $server) => !$state ? trans('server/database.empty') : $server->databases->count() . ' ' . trans('server/setting.server_info.limits.of', ['max' => $state])), + TextInput::make('allocation_limit') + ->hiddenLabel() + ->prefix(trans('server/setting.server_info.limits.allocations')) + ->prefixIcon(TablerIcon::Network) + ->columnSpan(1) + ->disabled() + ->formatStateUsing(fn ($state, Server $server) => !$state ? trans('server/setting.server_info.limits.no_allocations') : $server->allocations->count() . ' ' .trans('server/setting.server_info.limits.of', ['max' => $state])), + ]), + Fieldset::make(trans('server/setting.server_info.sftp.title')) + ->columnSpanFull() + ->hidden(fn (Server $server) => !user()?->can(SubuserPermission::FileSftp, $server)) + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 3, + 'lg' => 3, + ]) + ->schema([ + TextInput::make('connection') + ->label(trans('server/setting.server_info.sftp.connection')) + ->columnSpan(1) + ->disabled() + ->copyable() + ->hintAction( + Action::make('hint_connect_sftp') + ->label(trans('server/setting.server_info.sftp.action')) + ->color('success') + ->icon(TablerIcon::Plug) + ->url(function (Server $server) { + $fqdn = $server->node->daemon_sftp_alias ?? $server->node->fqdn; + + return 'sftp://' . rawurlencode(user()?->username) . '.' . $server->uuid_short . '@' . $fqdn . ':' . $server->node->daemon_sftp; + }), + ) + ->formatStateUsing(function (Server $server) { + $fqdn = $server->node->daemon_sftp_alias ?? $server->node->fqdn; + + return 'sftp://' . rawurlencode(user()?->username) . '.' . $server->uuid_short . '@' . $fqdn . ':' . $server->node->daemon_sftp; + }), + TextInput::make('username') + ->label(trans('server/setting.server_info.sftp.username')) + ->columnSpan(1) + ->copyable() + ->disabled() + ->formatStateUsing(fn (Server $server) => user()?->username . '.' . $server->uuid_short), + TextEntry::make('password') + ->label(trans('server/setting.server_info.sftp.password')) + ->columnSpan(1) + ->state(trans('server/setting.server_info.sftp.password_body')), + ]), + ]), + Section::make(trans('server/setting.reinstall.title')) + ->hidden(fn (Server $server) => !user()?->can(SubuserPermission::SettingsReinstall, $server)) + ->columnSpanFull() + ->footerActions([ + Action::make('exclude_reinstall') + ->label(trans('server/setting.reinstall.action')) + ->color('danger') + ->disabled(fn (Server $server) => !user()?->can(SubuserPermission::SettingsReinstall, $server)) + ->requiresConfirmation() + ->modalHeading(trans('server/setting.reinstall.modal')) + ->modalDescription(trans('server/setting.reinstall.modal_description')) + ->modalSubmitActionLabel(trans('server/setting.reinstall.yes')) + ->action(function (Server $server, ReinstallServerService $reinstallService) { + abort_unless(user()?->can(SubuserPermission::SettingsReinstall, $server), 403); + + try { + $reinstallService->handle($server); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->title(trans('server/setting.reinstall.notification_fail')) + ->body($exception->getMessage()) + ->danger() + ->send(); + + return; + } + + Activity::event('server:settings.reinstall') + ->log(); + + Notification::make() + ->title(trans('server/setting.reinstall.notification_start')) + ->success() + ->send(); + + redirect(Console::getUrl()); + }), + ]) + ->footerActionsAlignment(Alignment::Right) + ->schema([ + TextEntry::make('stop_info') + ->label(trans('server/setting.reinstall.body')), + TextEntry::make('files_info') + ->label(trans('server/setting.reinstall.body2')), + ]), + ]); + } + + public function updateName(string $name, Server $server): void + { + abort_unless(user()?->can(SubuserPermission::SettingsRename, $server), 403); + + $original = $server->name; + + try { + $server->forceFill([ + 'name' => $name, + ])->saveOrFail(); + + if ($original !== $name) { + Activity::event('server:settings.rename') + ->property(['old' => $original, 'new' => $name]) + ->log(); + } + + Notification::make() + ->title(trans('server/setting.server_info.notification_name')) + ->body(fn () => $original . ' -> ' . $name) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('server/setting.server_info.failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + } + } + + public function updateDescription(string $description, Server $server): void + { + abort_unless(user()?->can(SubuserPermission::SettingsDescription, $server) && config('panel.editable_server_descriptions'), 403); + + $original = $server->description; + + try { + $server->forceFill([ + 'description' => $description, + ])->saveOrFail(); + + if ($original !== $description) { + Activity::event('server:settings.description') + ->property(['old' => $original, 'new' => $description]) + ->log(); + } + + Notification::make() + ->title(trans('server/setting.server_info.notification_description')) + ->body(fn () => $original . ' -> ' . $description) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('server/setting.server_info.failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + } + } + + /** + * Save an icon from URL download to a file. + * + * @throws Exception + */ + private function saveIconFromUrl(string $imageUrl, string $extension, Server $server): void + { + $context = stream_context_create([ + 'http' => ['timeout' => 3], + 'https' => [ + 'timeout' => 3, + 'verify_peer' => true, + 'verify_peer_name' => true, + ], + ]); + + $normalizedExtension = match ($extension) { + 'svg+xml', 'svg' => 'svg', + 'jpeg', 'jpg' => 'jpg', + 'png' => 'png', + 'webp' => 'webp', + default => throw new Exception(trans('admin/egg.import.unknown_extension')), + }; + + $data = @file_get_contents($imageUrl, false, $context, 0, 262144); //256KB + + if (empty($data)) { + throw new Exception(trans('admin/egg.import.invalid_url')); + } + + Storage::disk('public')->put(Server::ICON_STORAGE_PATH . "/$server->uuid.$normalizedExtension", $data); + } + + public function getTitle(): string + { + return trans('server/setting.title'); + } + + public static function getNavigationLabel(): string + { + return trans('server/setting.title'); + } +} diff --git a/app/Filament/Server/Pages/Startup.php b/app/Filament/Server/Pages/Startup.php new file mode 100644 index 0000000000..3bd714f512 --- /dev/null +++ b/app/Filament/Server/Pages/Startup.php @@ -0,0 +1,216 @@ +columns([ + 'default' => 1, + 'md' => 2, + ]) + ->components([ + Hidden::make('previewing') + ->default(false), + TextInput::make('custom_startup') + ->label(trans('server/startup.command')) + ->readOnly() + ->visible(fn (Server $server) => !in_array($server->startup, $server->egg->startup_commands)) + ->formatStateUsing(fn () => 'Custom Startup') + ->hintAction(PreviewStartupAction::make()), + Select::make('startup_select') + ->label(trans('server/startup.command')) + ->live() + ->visible(fn (Server $server) => in_array($server->startup, $server->egg->startup_commands)) + ->disabled(fn (Server $server) => !user()?->can(SubuserPermission::StartupUpdate, $server)) + ->formatStateUsing(fn (Server $server) => $server->startup) + ->afterStateUpdated(function ($state, Server $server, Set $set) { + $original = $server->startup; + $server->forceFill(['startup' => $state])->saveOrFail(); + + $set('startup', $state); + $set('previewing', false); + + if ($original !== $server->startup) { + $startups = array_flip($server->egg->startup_commands); + Activity::event('server:startup.command') + ->property(['old' => $startups[$original], 'new' => $startups[$state]]) + ->log(); + } + + Notification::make() + ->title(trans('server/startup.notification_startup')) + ->body(trans('server/startup.notification_startup_body')) + ->success() + ->send(); + }) + ->options(fn (Server $server) => array_flip($server->egg->startup_commands)) + ->selectablePlaceholder(false) + ->hintAction(PreviewStartupAction::make()), + TextInput::make('custom_image') + ->label(trans('server/startup.docker_image')) + ->readOnly() + ->visible(fn (Server $server) => !in_array($server->image, $server->egg->docker_images)) + ->formatStateUsing(fn (Server $server) => $server->image), + Select::make('image') + ->label(trans('server/startup.docker_image')) + ->live() + ->visible(fn (Server $server) => in_array($server->image, $server->egg->docker_images)) + ->disabled(fn (Server $server) => !user()?->can(SubuserPermission::StartupDockerImage, $server)) + ->afterStateUpdated(function ($state, Server $server) { + $original = $server->image; + $server->forceFill(['image' => $state])->saveOrFail(); + + if ($original !== $server->image) { + Activity::event('server:startup.image') + ->property(['old' => $original, 'new' => $state]) + ->log(); + } + + Notification::make() + ->title(trans('server/startup.notification_docker')) + ->body(trans('server/startup.notification_docker_body')) + ->success() + ->send(); + }) + ->options(function (Server $server) { + $images = $server->egg->docker_images; + + return array_flip($images); + }), + Textarea::make('startup') + ->hiddenLabel() + ->columnSpanFull() + ->autosize() + ->readOnly(), + Section::make(trans('server/startup.variables')) + ->columnSpanFull() + ->schema([ + Repeater::make('server_variables') + ->hiddenLabel() + ->relationship('serverVariables', function (Builder $query, Server $server) { + $server->ensureVariablesExist(); + + return $query->where('egg_variables.user_viewable', true)->orderByPowerJoins('variable.sort'); + }) + ->grid() + ->disabled(fn (Server $server) => !user()?->can(SubuserPermission::StartupUpdate, $server)) + ->reorderable(false)->addable(false)->deletable(false) + ->schema([ + StartupVariable::make('variable_value') + ->fromRecord() + ->afterStateUpdated(function ($state, ServerVariable $serverVariable) { + $this->update($state, $serverVariable); + }), + ]) + ->columnSpan(6), + ]), + ]); + } + + protected function authorizeAccess(): void + { + abort_unless(user()?->can(SubuserPermission::StartupRead, Filament::getTenant()), 403); + } + + public static function canAccess(): bool + { + return parent::canAccess() && user()?->can(SubuserPermission::StartupRead, Filament::getTenant()); + } + + public function update(?string $state, ServerVariable $serverVariable): void + { + if (!$serverVariable->variable->user_editable) { + return; + } + + $original = $serverVariable->variable_value; + + try { + $validator = Validator::make( + ['variable_value' => $state], + ['variable_value' => $serverVariable->variable->rules] + ); + + if ($validator->fails()) { + Notification::make() + ->title(trans('server/startup.validation_fail', ['variable' => $serverVariable->variable->name])) + ->body(implode(', ', $validator->errors()->all())) + ->danger() + ->send(); + + return; + } + + ServerVariable::query()->updateOrCreate([ + 'server_id' => $this->getRecord()->id, + 'variable_id' => $serverVariable->variable->id, + ], [ + 'variable_value' => $state ?? '', + ]); + + if ($original !== $state) { + Activity::event('server:startup.edit') + ->property([ + 'variable' => $serverVariable->variable->env_variable, + 'old' => $original, + 'new' => $state, + ]) + ->log(); + } + + Notification::make() + ->title(trans('server/startup.update', ['variable' => $serverVariable->variable->name])) + ->body(fn () => $original . ' -> ' . $state) + ->success() + ->send(); + } catch (Exception $e) { + Notification::make() + ->title(trans('server/startup.fail', ['variable' => $serverVariable->variable->name])) + ->body($e->getMessage()) + ->danger() + ->send(); + } + } + + public function getTitle(): string + { + return trans('server/startup.title'); + } + + public static function getNavigationLabel(): string + { + return trans('server/startup.title'); + } +} diff --git a/app/Filament/Server/Resources/Activities/ActivityResource.php b/app/Filament/Server/Resources/Activities/ActivityResource.php new file mode 100644 index 0000000000..f26d9258ab --- /dev/null +++ b/app/Filament/Server/Resources/Activities/ActivityResource.php @@ -0,0 +1,180 @@ +paginated([25, 50]) + ->defaultPaginationPageOption(25) + ->columns([ + TextColumn::make('event') + ->label(trans('server/activity.event')) + ->html() + ->description(fn ($state) => $state) + ->icon(fn (ActivityLog $activityLog) => $activityLog->getIcon()) + ->formatStateUsing(fn (ActivityLog $activityLog) => $activityLog->getLabel()), + TextColumn::make('user') + ->label(trans('server/activity.user')) + ->state(function (ActivityLog $activityLog) use ($server) { + if (!$activityLog->actor instanceof User) { + return $activityLog->actor_id === null ? trans('server/activity.system') : trans('server/activity.deleted_user'); + } + + $user = $activityLog->actor->username; + + // Only show the email if the actor is the server owner/ a subuser or if the viewing user is an admin + if (user()?->isAdmin() || $server->owner_id === $activityLog->actor->id || $server->subusers->where('user_id', $activityLog->actor->id)->first()) { + $user .= " ({$activityLog->actor->email})"; + } + + return $user; + }) + ->tooltip(fn (ActivityLog $activityLog) => user()?->can('seeIps activityLog') ? $activityLog->ip : '') + ->url(fn (ActivityLog $activityLog) => $activityLog->actor instanceof User && user()?->can('update', $activityLog->actor) ? EditUser::getUrl(['record' => $activityLog->actor], panel: 'admin') : '') + ->grow(false), + DateTimeColumn::make('timestamp') + ->label(trans('server/activity.timestamp')) + ->since() + ->sortable() + ->grow(false), + ]) + ->defaultSort('timestamp', 'desc') + ->recordActions([ + ViewAction::make() + //->visible(fn (ActivityLog $activityLog) => $activityLog->hasAdditionalMetadata()) + ->schema([ + TextEntry::make('event') + ->label(trans('server/activity.event')) + ->state(fn (ActivityLog $activityLog) => new HtmlString($activityLog->getLabel())), + TextInput::make('user') + ->label(trans('server/activity.user')) + ->formatStateUsing(function (ActivityLog $activityLog) use ($server) { + if (!$activityLog->actor instanceof User) { + return $activityLog->actor_id === null ? trans('server/activity.system') : trans('server/activity.deleted_user'); + } + + $user = $activityLog->actor->username; + + // Only show the email if the actor is the server owner/ a subuser or if the viewing user is an admin + if (user()?->isAdmin() || $server->owner_id === $activityLog->actor->id || $server->subusers->where('user_id', $activityLog->actor->id)->first()) { + $user .= " ({$activityLog->actor->email})"; + } + + if (user()?->can('seeIps activityLog')) { + $user .= " - $activityLog->ip"; + } + + return $user; + }) + ->hintAction( + Action::make('hint_edit') + ->label(trans('filament-actions::edit.single.label')) + ->icon(TablerIcon::Edit) + ->visible(fn (ActivityLog $activityLog) => $activityLog->actor instanceof User && user()?->can('update', $activityLog->actor)) + ->url(fn (ActivityLog $activityLog) => EditUser::getUrl(['record' => $activityLog->actor], panel: 'admin')) + ), + DateTimePicker::make('timestamp') + ->label(trans('server/activity.timestamp')), + KeyValue::make('properties') + ->label(trans('server/activity.metadata')) + ->formatStateUsing(fn ($state) => Arr::dot($state)), + ]), + ]) + ->filters([ + SelectFilter::make('event') + ->options(fn (Table $table) => $table->getQuery()->pluck('event', 'event')->unique()->sort()) + ->searchable() + ->preload(), + ]); + } + + public static function getEloquentQuery(): Builder + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return ActivityLog::whereHas('subjects', fn (Builder $query) => $query->where('subject_id', $server->id)->where('subject_type', $server->getMorphClass())) + ->whereNotIn('activity_logs.event', ActivityLog::DISABLED_EVENTS) + ->when(config('activity.hide_admin_activity'), function (Builder $builder) use ($server) { + // We could do this with a query and a lot of joins, but that gets pretty + // painful so for now we'll execute a simpler query. + $subusers = $server->subusers()->pluck('user_id')->merge([$server->owner_id]); + $rootAdmins = Role::getRootAdmin()->users()->pluck('id'); + + $builder->select('activity_logs.*') + ->leftJoin('users', function (JoinClause $join) { + $join->on('users.id', 'activity_logs.actor_id') + ->where('activity_logs.actor_type', (new User())->getMorphClass()); + }) + ->where(function (Builder $builder) use ($subusers, $rootAdmins) { + $builder->whereNull('users.id') + ->orWhereNotIn('users.id', $rootAdmins) + ->orWhereIn('users.id', $subusers); + }); + }); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListActivities::route('/'), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/activity.title'); + } +} diff --git a/app/Filament/Server/Resources/Activities/Pages/ListActivities.php b/app/Filament/Server/Resources/Activities/Pages/ListActivities.php new file mode 100644 index 0000000000..bc1a9779c0 --- /dev/null +++ b/app/Filament/Server/Resources/Activities/Pages/ListActivities.php @@ -0,0 +1,26 @@ +columns([ + TextColumn::make('ip') + ->label(trans('server/network.address')) + ->formatStateUsing(fn (Allocation $allocation) => $allocation->alias), + TextColumn::make('alias') + ->hidden(), + TextColumn::make('port') + ->label(trans('server/network.port')), + TextInputColumn::make('notes') + ->label(trans('server/network.notes')) + ->visibleFrom('sm') + ->disabled(fn () => !user()?->can(SubuserPermission::AllocationUpdate, $server)) + ->placeholder(trans('server/network.no_notes')), + IconColumn::make('primary') + ->icon(fn ($state) => match ($state) { + true => TablerIcon::StarFilled, + default => TablerIcon::Star, + }) + ->color(fn ($state) => match ($state) { + true => 'warning', + default => 'gray', + }) + ->tooltip(fn (Allocation $allocation) => $allocation->id === $server->allocation_id ? trans('server/network.primary') : trans('server/network.make_primary')) + ->action(fn (Allocation $allocation) => user()?->can(SubuserPermission::AllocationUpdate, $server) && $server->update(['allocation_id' => $allocation->id])) + ->default(fn (Allocation $allocation) => $allocation->id === $server->allocation_id) + ->label(trans('server/network.primary')), + IconColumn::make('is_locked') + ->label(trans('server/network.locked')) + ->tooltip(trans('server/network.locked_helper')) + ->trueIcon(TablerIcon::Lock) + ->falseIcon(TablerIcon::LockOpen), + ]) + ->recordActions([ + DetachAction::make() + ->visible(fn (Allocation $allocation) => !$allocation->is_locked || user()?->can('update', $allocation->node)) + ->authorize(fn () => user()?->can(SubuserPermission::AllocationDelete, $server)) + ->label(trans('server/network.delete')) + ->action(function (Allocation $allocation) { + Allocation::where('id', $allocation->id)->update([ + 'notes' => null, + 'is_locked' => false, + 'server_id' => null, + ]); + + Activity::event('server:allocation.delete') + ->subject($allocation) + ->property('allocation', $allocation->address) + ->log(); + }) + ->after(fn (Allocation $allocation) => $allocation->id === $server->allocation_id && $server->update(['allocation_id' => $server->allocations()->first()?->id])), + ]) + ->toolbarActions([ + Action::make('add_allocation') + ->hiddenLabel() + ->icon(fn () => $server->allocations()->count() >= $server->allocation_limit ? TablerIcon::NetworkOff : TablerIcon::Network) + ->authorize(fn () => user()?->can(SubuserPermission::AllocationCreate, $server)) + ->tooltip(fn () => $server->allocations()->count() >= $server->allocation_limit ? trans('server/network.limit') : trans('server/network.add')) + ->hidden(fn () => !config('panel.client_features.allocations.enabled') || $server->allocation === null) + ->disabled(fn () => $server->allocations()->count() >= $server->allocation_limit) + ->color(fn () => $server->allocations()->count() >= $server->allocation_limit ? 'danger' : 'primary') + ->action(function (FindAssignableAllocationService $service) use ($server) { + $allocation = $service->handle($server); + + if (!$server->allocation_id) { + $server->update(['allocation_id' => $allocation->id]); + } + + Activity::event('server:allocation.create') + ->subject($allocation) + ->property('allocation', $allocation->address) + ->log(); + }), + ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListAllocations::route('/'), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/network.title'); + } +} diff --git a/app/Filament/Server/Resources/Allocations/Pages/ListAllocations.php b/app/Filament/Server/Resources/Allocations/Pages/ListAllocations.php new file mode 100644 index 0000000000..143c6879d6 --- /dev/null +++ b/app/Filament/Server/Resources/Allocations/Pages/ListAllocations.php @@ -0,0 +1,31 @@ +backups->count(); + } + + protected static function getBadgeLimit(): int + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $server->backup_limit ?? 0; + } + + public static function defaultForm(Schema $schema): Schema + { + return $schema + ->components([ + TextInput::make('name') + ->label(trans('server/backup.actions.create.name')) + ->columnSpanFull(), + Textarea::make('ignored') + ->label(trans('server/backup.actions.create.ignored')) + ->columnSpanFull(), + Toggle::make('is_locked') + ->label(trans('server/backup.actions.create.locked')) + ->helperText(trans('server/backup.actions.create.lock_helper')) + ->columnSpanFull(), + ]); + } + + /** + * @throws Throwable + * @throws ConnectionException + */ + public static function defaultTable(Table $table): Table + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $table + ->columns([ + TextColumn::make('name') + ->label(trans('server/backup.actions.create.name')) + ->searchable(), + BytesColumn::make('bytes') + ->label(trans('server/backup.size')), + DateTimeColumn::make('created_at') + ->label(trans('server/backup.created_at')) + ->since() + ->sortable(), + TextColumn::make('status') + ->label(trans('server/backup.status')) + ->badge(), + IconColumn::make('is_locked') + ->label(trans('server/backup.is_locked')) + ->visibleFrom('md') + ->trueIcon(TablerIcon::Lock) + ->falseIcon(TablerIcon::LockOpen), + ]) + ->recordActions([ + ActionGroup::make([ + Action::make('exclude_rename') + ->icon(TablerIcon::Pencil) + ->authorize(fn () => user()?->can(SubuserPermission::BackupDelete, $server)) + ->label(trans('server/backup.actions.rename.title')) + ->schema([ + TextInput::make('name') + ->label(trans('server/backup.actions.rename.new_name')) + ->required() + ->maxLength(255) + ->default(fn (Backup $backup) => $backup->name), + ]) + ->action(function (Backup $backup, $data) { + $oldName = $backup->name; + $newName = $data['name']; + + $backup->update(['name' => $newName]); + + if ($oldName !== $newName) { + Activity::event('server:backup.rename') + ->subject($backup) + ->property(['old_name' => $oldName, 'new_name' => $newName]) + ->log(); + } + + Notification::make() + ->title(trans('server/backup.actions.rename.notification_success')) + ->success() + ->send(); + }) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), + Action::make('exclude_lock') + ->iconSize(IconSize::Large) + ->icon(fn (Backup $backup) => !$backup->is_locked ? TablerIcon::Lock : TablerIcon::LockOpen) + ->authorize(fn () => user()?->can(SubuserPermission::BackupDelete, $server)) + ->label(fn (Backup $backup) => !$backup->is_locked ? trans('server/backup.actions.lock.lock') : trans('server/backup.actions.lock.unlock')) + ->action(fn (BackupController $backupController, Backup $backup, Request $request) => $backupController->toggleLock($request, $server, $backup)) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), + Action::make('exclude_download') + ->label(trans('server/backup.actions.download')) + ->iconSize(IconSize::Large) + ->color('primary') + ->icon(TablerIcon::Download) + ->authorize(fn () => user()?->can(SubuserPermission::BackupDownload, $server)) + ->url(fn (DownloadLinkService $downloadLinkService, Backup $backup, Request $request) => $downloadLinkService->handle($backup, $request->user()), true) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), + Action::make('exclude_restore') + ->label(trans('server/backup.actions.restore.title')) + ->iconSize(IconSize::Large) + ->color('success') + ->icon(TablerIcon::FolderUp) + ->authorize(fn () => user()?->can(SubuserPermission::BackupRestore, $server)) + ->schema([ + TextEntry::make('stop_info') + ->hiddenLabel() + ->helperText(trans('server/backup.actions.restore.helper')), + Checkbox::make('truncate') + ->label(trans('server/backup.actions.restore.delete_all')), + ]) + ->action(function (Backup $backup, $data, DaemonBackupRepository $daemonRepository, DownloadLinkService $downloadLinkService) use ($server) { + if (!is_null($server->status)) { + return Notification::make() + ->title(trans('server/backup.actions.restore.notification_fail')) + ->body(trans('server/backup.actions.restore.notification_fail_body_1')) + ->danger() + ->send(); + } + + if (!$backup->is_successful && is_null($backup->completed_at)) { + return Notification::make() + ->title(trans('server/backup.actions.restore.notification_fail')) + ->body(trans('server/backup.actions.restore.notification_fail_body_2')) + ->danger() + ->send(); + } + + $log = Activity::event('server:backup.restore') + ->subject($backup) + ->property(['name' => $backup->name, 'truncate' => $data['truncate']]); + + $log->transaction(function () use ($downloadLinkService, $daemonRepository, $backup, $server, $data) { + // If the backup is for an S3 file we need to generate a unique Download link for + // it that will allow daemon to actually access the file. + if ($backup->disk === Backup::ADAPTER_AWS_S3) { + $url = $downloadLinkService->handle($backup, user()); + } + + // Update the status right away for the server so that we know not to allow certain + // actions against it via the Panel API. + $server->update(['status' => ServerState::RestoringBackup]); + + $daemonRepository->setServer($server)->restore($backup, $url ?? null, $data['truncate']); + }); + + return Notification::make() + ->title(trans('server/backup.actions.restore.notification_started')) + ->send(); + }) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), + Action::make('exclude_delete') + ->icon(TablerIcon::Trash) + ->color('danger') + ->requiresConfirmation() + ->authorize(fn () => user()?->can(SubuserPermission::BackupDelete, $server)) + ->label(trans('filament-actions::delete.single.label')) + ->iconSize(IconSize::Large) + ->disabled(fn (Backup $backup) => $backup->is_locked && $backup->status !== BackupStatus::Failed) + ->modalDescription(fn (Backup $backup) => trans('server/backup.actions.delete.description', ['backup' => $backup->name])) + ->modalSubmitActionLabel(trans('server/backup.actions.delete.title')) + ->successNotificationTitle(null) + ->action(function (Backup $backup, DeleteBackupService $deleteBackupService) { + try { + $deleteBackupService->handle($backup); + + Notification::make() + ->title(trans('server/backup.actions.delete.notification_success')) + ->success() + ->send(); + } catch (ConnectionException) { + Notification::make() + ->title(trans('server/backup.actions.delete.notification_fail')) + ->body(trans('server/backup.actions.delete.notification_fail_body')) + ->danger() + ->send(); + + return; + } + + Activity::event('server:backup.delete') + ->subject($backup) + ->property(['name' => $backup->name, 'failed' => !$backup->is_successful]) + ->log(); + }) + ->visible(fn (Backup $backup) => $backup->status !== BackupStatus::InProgress), + ])->iconSize(IconSize::Large), + ]) + ->toolbarActions([ + CreateAction::make() + ->authorize(fn () => user()?->can(SubuserPermission::BackupCreate, $server)) + ->icon(TablerIcon::FileZip) + ->tooltip(fn () => $server->backups()->count() >= $server->backup_limit ? trans('server/backup.actions.create.limit') : trans('server/backup.actions.create.title')) + ->disabled(fn () => $server->backups()->count() >= $server->backup_limit) + ->color(fn () => $server->backups()->count() >= $server->backup_limit ? 'danger' : 'primary') + ->createAnother(false) + ->hiddenLabel() + ->successNotificationTitle(null) + ->action(function (InitiateBackupService $initiateBackupService, $data) use ($server) { + $action = $initiateBackupService->setIgnoredFiles(explode(PHP_EOL, $data['ignored'] ?? '')); + + if (user()?->can(SubuserPermission::BackupDelete, $server)) { + $action->setIsLocked((bool) $data['is_locked']); + } + + try { + $backup = $action->handle($server, $data['name']); + + Activity::event('server:backup.start') + ->subject($backup) + ->property(['name' => $backup->name, 'locked' => (bool) $data['is_locked']]) + ->log(); + + return Notification::make() + ->title(trans('server/backup.actions.create.notification_success')) + ->body(fn () => trans('server/backup.actions.create.created', ['name' => $backup->name])) + ->success() + ->send(); + } catch (HttpException $e) { + return Notification::make() + ->danger() + ->title(trans('server/backup.actions.create.notification_fail')) + ->body($e->getMessage() . ' Try again' . ($e->getHeaders()['Retry-After'] ? ' in ' . $e->getHeaders()['Retry-After'] . ' seconds.' : '')) + ->send(); + } + }), + ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListBackups::route('/'), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/backup.title'); + } +} diff --git a/app/Filament/Server/Resources/Backups/Pages/ListBackups.php b/app/Filament/Server/Resources/Backups/Pages/ListBackups.php new file mode 100644 index 0000000000..effbb70c9b --- /dev/null +++ b/app/Filament/Server/Resources/Backups/Pages/ListBackups.php @@ -0,0 +1,26 @@ +databases->count(); + } + + protected static function getBadgeLimit(): int + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $server->database_limit ?? 0; + } + + /** + * @throws Exception + */ + public static function defaultForm(Schema $schema): Schema + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $schema + ->components([ + TextInput::make('host') + ->label(trans('server/database.host')) + ->formatStateUsing(fn (Database $database) => $database->address()) + ->copyable(), + TextInput::make('database') + ->label(trans('server/database.database')) + ->copyable(), + TextInput::make('username') + ->label(trans('server/database.username')) + ->copyable(), + TextInput::make('password') + ->label(trans('server/database.password')) + ->password()->revealable() + ->hidden(fn () => !user()?->can(SubuserPermission::DatabaseViewPassword, $server)) + ->hintAction( + RotateDatabasePasswordAction::make() + ->authorize(fn () => user()?->can(SubuserPermission::DatabaseUpdate, $server)) + ) + ->copyable() + ->formatStateUsing(fn (Database $database) => $database->password), + TextInput::make('remote') + ->label(trans('server/database.remote')), + TextInput::make('max_connections') + ->label(trans('server/database.max_connections')) + ->formatStateUsing(fn (Database $database) => $database->max_connections ?: trans('server/database.unlimited')), + TextInput::make('jdbc') + ->label(trans('server/database.jdbc')) + ->password()->revealable() + ->hidden(!user()?->can(SubuserPermission::DatabaseViewPassword, $server)) + ->copyable() + ->columnSpanFull() + ->formatStateUsing(fn (Database $database) => $database->jdbc), + ]); + } + + /** + * @throws Exception + */ + public static function defaultTable(Table $table): Table + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $table + ->columns([ + TextColumn::make('host') + ->label(trans('server/database.host')) + ->state(fn (Database $database) => $database->address()) + ->badge(), + TextColumn::make('database') + ->label(trans('server/database.database')), + TextColumn::make('username') + ->label(trans('server/database.username')), + TextColumn::make('remote') + ->label(trans('server/database.remote')), + DateTimeColumn::make('created_at') + ->label(trans('server/database.created_at')) + ->sortable(), + ]) + ->recordActions([ + ViewAction::make() + ->modalHeading(fn (Database $database) => trans('server/database.viewing', ['database' => $database->database])), + DeleteAction::make() + ->successNotificationTitle(null) + ->using(function (Database $database, DatabaseManagementService $service) { + try { + $service->delete($database); + + Notification::make() + ->title(trans('server/database.delete_notification', ['database' => $database->database])) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('server/database.delete_notification_fail', ['database' => $database->database])) + ->danger() + ->send(); + + report($exception); + } + }), + ]) + ->toolbarActions([ + CreateAction::make('new') + ->hiddenLabel() + ->icon(fn () => $server->databases()->count() >= $server->database_limit ? TablerIcon::DatabaseX : TablerIcon::DatabasePlus) + ->tooltip(fn () => $server->databases()->count() >= $server->database_limit ? trans('server/database.limit') : trans('server/database.create_database')) + ->disabled(fn () => $server->databases()->count() >= $server->database_limit) + ->color(fn () => $server->databases()->count() >= $server->database_limit ? 'danger' : 'primary') + ->createAnother(false) + ->successNotificationTitle(null) + ->schema([ + Grid::make() + ->columns(2) + ->schema([ + Select::make('database_host_id') + ->label(trans('server/database.database_host')) + ->columnSpan(2) + ->required() + ->placeholder(trans('server/database.database_host_select')) + ->options(fn () => $server->node->databaseHosts->mapWithKeys(fn (DatabaseHost $databaseHost) => [$databaseHost->id => $databaseHost->name])), + TextInput::make('database') + ->label(trans('server/database.name')) + ->columnSpan(1) + ->prefix('s'. $server->id . '_') + ->hintIcon(TablerIcon::QuestionMark, trans('server/database.name_hint')), + TextInput::make('remote') + ->label(trans('server/database.connections_from')) + ->columnSpan(1) + ->default('%'), + ]), + ]) + ->action(function ($data, DatabaseManagementService $service) use ($server) { + $data['database'] ??= Str::random(12); + $data['database'] = $service->generateUniqueDatabaseName($data['database'], $server->id); + + try { + $service->create($server, $data); + + Notification::make() + ->title(trans('server/database.create_notification', ['database' => $data['database']])) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('server/database.create_notification_fail', ['database' => $data['database']])) + ->danger() + ->send(); + + report($exception); + } + }), + ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListDatabases::route('/'), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/database.title'); + } +} diff --git a/app/Filament/Server/Resources/Databases/Pages/ListDatabases.php b/app/Filament/Server/Resources/Databases/Pages/ListDatabases.php new file mode 100644 index 0000000000..25667cf23b --- /dev/null +++ b/app/Filament/Server/Resources/Databases/Pages/ListDatabases.php @@ -0,0 +1,26 @@ + */ + public static function getDefaultPages(): array + { + return [ + 'edit' => EditFiles::route('/edit/{path}'), + 'search' => SearchFiles::route('/search/{searchTerm}'), // TODO: find better way? + 'download' => DownloadFiles::route('/download/{path}'), + 'index' => ListFiles::route('/{path?}'), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/file.title'); + } +} diff --git a/app/Filament/Server/Resources/Files/Pages/DownloadFiles.php b/app/Filament/Server/Resources/Files/Pages/DownloadFiles.php new file mode 100644 index 0000000000..b84fc10780 --- /dev/null +++ b/app/Filament/Server/Resources/Files/Pages/DownloadFiles.php @@ -0,0 +1,71 @@ +nodeJWTService = $nodeJWTService; + } + + public function mount(string $path): void + { + $this->authorizeAccess(); + + /** @var Server $server */ + $server = Filament::getTenant(); + + $token = $this->nodeJWTService + ->setExpiresAt(CarbonImmutable::now()->addMinutes(15)) + ->setUser(user()) + ->setClaims([ + 'file_path' => rawurldecode($path), + 'server_uuid' => $server->uuid, + ]) + ->handle($server->node, user()?->id . $server->uuid); + + Activity::event('server:file.download') + ->property('file', $path) + ->log(); + + redirect()->away($server->node->getConnectionAddress() . '/download/file?token=' . $token->toString()); + } + + protected function authorizeAccess(): void + { + abort_unless(user()?->can(SubuserPermission::FileReadContent, Filament::getTenant()), 403); + } + + public static function route(string $path): PageRegistration + { + return new PageRegistration( + page: static::class, + route: fn (Panel $panel): Route => RouteFacade::get($path, static::class) + ->middleware(static::getRouteMiddleware($panel)) + ->withoutMiddleware(static::getWithoutRouteMiddleware($panel)) + ->where('path', '.*'), + ); + } +} diff --git a/app/Filament/Server/Resources/Files/Pages/EditFiles.php b/app/Filament/Server/Resources/Files/Pages/EditFiles.php new file mode 100644 index 0000000000..a3108b7c7d --- /dev/null +++ b/app/Filament/Server/Resources/Files/Pages/EditFiles.php @@ -0,0 +1,277 @@ +|null */ + public ?array $data = []; + + /** + * @throws Throwable + */ + public function form(Schema $schema): Schema + { + /** @var Server $server */ + $server = Filament::getTenant(); + + Activity::event('server:file.read') + ->property('file', $this->path) + ->log(); + + return $schema + ->components([ + Section::make(trans('server/file.actions.edit.title', ['file' => $this->path])) + ->footerActions([ + Action::make('fm_save_and_close') + ->label(trans('server/file.actions.edit.save_close')) + ->authorize(fn () => user()?->can(SubuserPermission::FileUpdate, $server)) + ->icon(TablerIcon::DeviceFloppy) + ->keyBindings('mod+shift+s') + ->action(function () { + $this->getDaemonFileRepository()->putContent($this->path, $this->data['editor'] ?? ''); + + Activity::event('server:file.write') + ->property('file', $this->path) + ->log(); + + Notification::make() + ->success() + ->title(trans('server/file.actions.edit.notification')) + ->body(fn () => $this->path) + ->send(); + + $this->redirectToList(); + }), + Action::make('fm_save') + ->label(trans('server/file.actions.edit.save')) + ->authorize(fn () => user()?->can(SubuserPermission::FileUpdate, $server)) + ->icon(TablerIcon::DeviceFloppy) + ->keyBindings('mod+s') + ->action(function () { + $this->getDaemonFileRepository()->putContent($this->path, $this->data['editor'] ?? ''); + + Activity::event('server:file.write') + ->property('file', $this->path) + ->log(); + + Notification::make() + ->success() + ->title(trans('server/file.actions.edit.notification')) + ->body(fn () => $this->path) + ->send(); + }), + Action::make('fm_cancel') + ->label(trans('server/file.actions.edit.cancel')) + ->color('danger') + ->icon(TablerIcon::X) + ->alpineClickHandler(function () { + $url = $this->previousUrl ?? ListFiles::getUrl(['path' => dirname($this->path)]); + + return FilamentView::hasSpaMode($url) + ? 'document.referrer ? window.history.back() : Livewire.navigate(' . Js::from($url) . ')' + : 'document.referrer ? window.history.back() : (window.location.href = ' . Js::from($url) . ')'; + }), + ]) + ->footerActionsAlignment(Alignment::End) + ->schema([ + Select::make('lang') + ->label(trans('server/file.actions.new_file.syntax')) + ->searchable() + ->live() + ->options(EditorLanguages::class) + ->selectablePlaceholder(false) + ->afterStateUpdated(fn ($state) => $this->dispatch('setLanguage', lang: $state)) + ->default(fn () => EditorLanguages::fromWithAlias(pathinfo($this->path, PATHINFO_EXTENSION))), + MonacoEditor::make('editor') + ->hiddenLabel() + ->language(fn (Get $get) => $get('lang')) + ->default(function () { + try { + $contents = $this->getDaemonFileRepository()->getContent($this->path, config('panel.files.max_edit_size')); + + return mb_convert_encoding($contents, 'UTF-8', ['UTF-8', 'UTF-16', 'ISO-8859-1', 'ASCII']); + } catch (FileSizeTooLargeException) { + AlertBanner::make('file_too_large') + ->title(trans('server/file.alerts.file_too_large.title', ['name' => basename($this->path)])) + ->body(trans('server/file.alerts.file_too_large.body', ['max' => convert_bytes_to_readable(config('panel.files.max_edit_size'))])) + ->danger() + ->closable() + ->send(); + } catch (FileNotFoundException) { + AlertBanner::make('file_not_found') + ->title(trans('server/file.alerts.file_not_found.title', ['name' => basename($this->path)])) + ->danger() + ->closable() + ->send(); + } catch (FileNotEditableException) { + AlertBanner::make('file_is_directory') + ->title(trans('server/file.alerts.file_not_found.title', ['name' => basename($this->path)])) + ->danger() + ->closable() + ->send(); + } catch (ConnectionException) { + // Alert banner for this one will be handled by ListFiles + } + + $this->redirectToList(); + }), + ]) + ->columnSpanFull(), + ]); + } + + private function redirectToList(): void + { + $url = ListFiles::getUrl(['path' => dirname($this->path)]); + $this->redirect($url, FilamentView::hasSpaMode($url)); + } + + public function mount(string $path): void + { + $this->authorizeAccess(); + + $this->path = $path; + + $this->form->fill(); + + $this->previousUrl = url()->previous(); + + foreach (File::getSpecialFiles() as $fileName => $data) { + if ($data['check'] instanceof Closure && $data['check']($path)) { + AlertBanner::make($fileName . '_info') + ->title($data['title']) + ->body($data['body']) + ->info() + ->closable() + ->send(); + } + } + } + + protected function authorizeAccess(): void + { + abort_unless(user()?->can(SubuserPermission::FileReadContent, Filament::getTenant()), 403); + } + + /** + * @return array + */ + protected function getForms(): array + { + return [ + 'form' => $this->form(static::getResource()::form( + $this->makeSchema() + ->statePath($this->getFormStatePath()) + ->columns($this->hasInlineLabels() ? 1 : 2) + ->inlineLabel($this->hasInlineLabels()), + )), + ]; + } + + public function getFormStatePath(): ?string + { + return 'data'; + } + + public function getBreadcrumbs(): array + { + $resource = static::getResource(); + + $breadcrumbs = [ + $resource::getUrl() => $resource::getBreadcrumb(), + ]; + + $previousParts = ''; + foreach (explode('/', $this->path) as $part) { + $previousParts = $previousParts . '/' . $part; + $breadcrumbs[ListFiles::getUrl(['path' => ltrim($previousParts, '/')])] = $part; + } + + return $breadcrumbs; + } + + private function getDaemonFileRepository(): DaemonFileRepository + { + /** @var Server $server */ + $server = Filament::getTenant(); + $this->fileRepository ??= (new DaemonFileRepository())->setServer($server); + + return $this->fileRepository; + } + + public static function getUrl(array $parameters = [], bool $isAbsolute = true, ?string $panel = null, ?Model $tenant = null, bool $shouldGuessMissingParameters = false): string + { + return parent::getUrl($parameters, $isAbsolute, $panel, $tenant) . '/'; + } + + public static function route(string $path): PageRegistration + { + return new PageRegistration( + page: static::class, + route: fn (Panel $panel): Route => RouteFacade::get($path, static::class) + ->middleware(static::getRouteMiddleware($panel)) + ->withoutMiddleware(static::getWithoutRouteMiddleware($panel)) + ->where('path', '.*'), + ); + } +} diff --git a/app/Filament/Server/Resources/Files/Pages/ListFiles.php b/app/Filament/Server/Resources/Files/Pages/ListFiles.php new file mode 100644 index 0000000000..9cfa9c7976 --- /dev/null +++ b/app/Filament/Server/Resources/Files/Pages/ListFiles.php @@ -0,0 +1,733 @@ + $resource::getBreadcrumb(), + ]; + + $previousParts = ''; + foreach (explode('/', $this->path) as $part) { + $previousParts = $previousParts . '/' . $part; + $breadcrumbs[self::getUrl(['path' => ltrim($previousParts, '/')])] = $part; + } + + return $breadcrumbs; + } + + /** + * @throws Exception + */ + public function table(Table $table): Table + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $table + ->paginated([25, 50, 100, 150, 200]) + ->paginationMode(PaginationMode::Simple) + ->defaultPaginationPageOption(50) + ->deferLoading() + ->searchable() + ->query(fn () => File::get($server, $this->path)->orderByDesc('is_directory')) + ->defaultSort('name') + ->columns([ + TextColumn::make('name') + ->label(trans('server/file.name')) + ->searchable() + ->sortable() + ->icon(fn (File $file) => $file->getIcon()), + BytesColumn::make('size') + ->label(trans('server/file.size')) + ->visibleFrom('md') + ->state(fn (File $file) => $file->is_directory ? null : $file->size) + ->sortable(), + DateTimeColumn::make('modified_at') + ->label(trans('server/file.modified_at')) + ->visibleFrom('md') + ->since() + ->sortable(), + ]) + ->recordUrl(function (File $file) use ($server) { + if ($file->is_directory) { + return self::getUrl(['path' => encode_path(join_paths($this->path, $file->name))]); + } + + if (!user()?->can(SubuserPermission::FileReadContent, $server)) { + return null; + } + + return $file->canEdit() ? EditFiles::getUrl(['path' => encode_path(join_paths($this->path, $file->name))]) : null; + }) + ->recordActions([ + Action::make('view') + ->authorize(fn () => user()?->can(SubuserPermission::FileRead, $server)) + ->label(trans('server/file.actions.open')) + ->icon(TablerIcon::Eye) + ->visible(fn (File $file) => $file->is_directory) + ->url(fn (File $file) => self::getUrl(['path' => encode_path(join_paths($this->path, $file->name))])), + EditAction::make('edit') + ->authorize(fn () => user()?->can(SubuserPermission::FileReadContent, $server)) + ->visible(fn (File $file) => $file->canEdit()) + ->url(fn (File $file) => EditFiles::getUrl(['path' => encode_path(join_paths($this->path, $file->name))])), + ActionGroup::make([ + Action::make('fm_rename') + ->authorize(fn () => user()?->can(SubuserPermission::FileUpdate, $server)) + ->label(trans('server/file.actions.rename.title')) + ->icon(TablerIcon::Forms)->iconSize(IconSize::Large) + ->schema([ + TextInput::make('name') + ->label(trans('server/file.actions.rename.file_name')) + ->default(fn (File $file) => $file->name) + ->required(), + ]) + ->action(function ($data, File $file) { + $files = [['to' => $data['name'], 'from' => $file->name]]; + + $this->getDaemonFileRepository()->renameFiles($this->path, $files); + + Activity::event('server:file.rename') + ->property('directory', $this->path) + ->property('files', $files) + ->property('to', $data['name']) + ->property('from', $file->name) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.rename.notification')) + ->body(fn () => $file->name . ' -> ' . $data['name']) + ->success() + ->send(); + + $this->refreshPage(); + }), + Action::make('fm_copy') + ->authorize(fn () => user()?->can(SubuserPermission::FileCreate, $server)) + ->label(trans('server/file.actions.copy.title')) + ->icon(TablerIcon::Copy)->iconSize(IconSize::Large) + ->visible(fn (File $file) => $file->is_file) + ->action(function (File $file) { + $this->getDaemonFileRepository()->copyFile(join_paths($this->path, $file->name)); + + Activity::event('server:file.copy') + ->property('file', join_paths($this->path, $file->name)) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.copy.notification')) + ->success() + ->send(); + + $this->refreshPage(); + }), + Action::make('fm_download') + ->authorize(fn () => user()?->can(SubuserPermission::FileReadContent, $server)) + ->label(trans('server/file.actions.download')) + ->icon(TablerIcon::Download)->iconSize(IconSize::Large) + ->visible(fn (File $file) => $file->is_file) + ->url(fn (File $file) => DownloadFiles::getUrl(['path' => encode_path(join_paths($this->path, $file->name))]), true), + Action::make('fm_move') + ->authorize(fn () => user()?->can(SubuserPermission::FileUpdate, $server)) + ->label(trans('server/file.actions.move.title')) + ->icon(TablerIcon::Replace)->iconSize(IconSize::Large) + ->schema([ + TextInput::make('location') + ->label(trans('server/file.actions.move.new_location')) + ->hint(trans('server/file.actions.move.new_location_hint')) + ->required() + ->live(), + TextEntry::make('new_location') + ->state(fn (Get $get, File $file) => resolve_path(join_paths($this->path, str_ends_with($get('location') ?? '/', '/') ? join_paths($get('location') ?? '/', $file->name) : $get('location') ?? '/'))), + ]) + ->action(function ($data, File $file) { + $location = $data['location']; + $endsWithSlash = str_ends_with($location, '/'); + $to = $endsWithSlash ? join_paths($location, $file->name) : $location; + $files = [['to' => $to, 'from' => $file->name]]; + + $this->getDaemonFileRepository()->renameFiles($this->path, $files); + + $oldLocation = join_paths($this->path, $file->name); + $newLocation = resolve_path(join_paths($this->path, $to)); + + Activity::event('server:file.rename') + ->property('directory', $this->path) + ->property('files', $files) + ->property('to', $newLocation) + ->property('from', $oldLocation) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.move.notification')) + ->body($oldLocation . ' -> ' . $newLocation) + ->success() + ->send(); + + $this->refreshPage(); + }), + Action::make('fm_permissions') + ->authorize(fn () => user()?->can(SubuserPermission::FileUpdate, $server)) + ->label(trans('server/file.actions.permissions.title')) + ->icon(TablerIcon::License)->iconSize(IconSize::Large) + ->schema([ + CheckboxList::make('owner') + ->label(trans('server/file.actions.permissions.owner')) + ->bulkToggleable() + ->columns(3) + ->options([ + 'read' => trans('server/file.actions.permissions.read'), + 'write' => trans('server/file.actions.permissions.write'), + 'execute' => trans('server/file.actions.permissions.execute'), + ]) + ->formatStateUsing(function ($state, File $file) { + $mode = (int) substr((string) $file->mode_bits, 0, 1); + + return $this->getPermissionsFromModeBit($mode); + }), + CheckboxList::make('group') + ->label(trans('server/file.actions.permissions.group')) + ->bulkToggleable() + ->columns(3) + ->options([ + 'read' => trans('server/file.actions.permissions.read'), + 'write' => trans('server/file.actions.permissions.write'), + 'execute' => trans('server/file.actions.permissions.execute'), + ]) + ->formatStateUsing(function ($state, File $file) { + $mode = (int) substr((string) $file->mode_bits, 1, 1); + + return $this->getPermissionsFromModeBit($mode); + }), + CheckboxList::make('public') + ->label(trans('server/file.actions.permissions.public')) + ->bulkToggleable() + ->columns(3) + ->options([ + 'read' => trans('server/file.actions.permissions.read'), + 'write' => trans('server/file.actions.permissions.write'), + 'execute' => trans('server/file.actions.permissions.execute'), + ]) + ->formatStateUsing(function ($state, File $file) { + $mode = (int) substr((string) $file->mode_bits, 2, 1); + + return $this->getPermissionsFromModeBit($mode); + }), + ]) + ->action(function ($data, File $file) { + $owner = (in_array('read', $data['owner']) ? 4 : 0) | (in_array('write', $data['owner']) ? 2 : 0) | (in_array('execute', $data['owner']) ? 1 : 0); + $group = (in_array('read', $data['group']) ? 4 : 0) | (in_array('write', $data['group']) ? 2 : 0) | (in_array('execute', $data['group']) ? 1 : 0); + $public = (in_array('read', $data['public']) ? 4 : 0) | (in_array('write', $data['public']) ? 2 : 0) | (in_array('execute', $data['public']) ? 1 : 0); + + $mode = $owner . $group . $public; + + $this->getDaemonFileRepository()->chmodFiles($this->path, [['file' => $file->name, 'mode' => $mode]]); + + Notification::make() + ->title(trans('server/file.actions.permissions.notification', ['mode' => $mode])) + ->success() + ->send(); + }), + Action::make('fm_archive') + ->authorize(fn () => user()?->can(SubuserPermission::FileArchive, $server)) + ->label(trans('server/file.actions.archive.title')) + ->icon(TablerIcon::Archive)->iconSize(IconSize::Large) + ->schema([ + Grid::make(3) + ->schema([ + TextInput::make('name') + ->label(trans('server/file.actions.archive.archive_name')) + ->placeholder(fn () => 'archive-' . str(Carbon::now()->toRfc3339String())->replace(':', '')->before('+0000') . 'Z') + ->columnSpan(2), + Select::make('extension') + ->label(trans('server/file.actions.archive.extension')) + ->selectablePlaceholder(false) + ->options([ + 'tar.gz' => 'tar.gz', + 'zip' => 'zip', + 'tar.bz2' => 'tar.bz2', + 'tar.xz' => 'tar.xz', + ]) + ->columnSpan(1), + ]), + ]) + ->action(function ($data, File $file) { + $archive = $this->getDaemonFileRepository()->compressFiles($this->path, [$file->name], $data['name'], $data['extension']); + + Activity::event('server:file.compress') + ->property('name', $archive['name']) + ->property('directory', $this->path) + ->property('files', [$file->name]) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.archive.notification')) + ->body($archive['name']) + ->success() + ->send(); + + $this->refreshPage(); + }), + Action::make('fm_unarchive') + ->authorize(fn () => user()?->can(SubuserPermission::FileArchive, $server)) + ->label(trans('server/file.actions.unarchive.title')) + ->icon(TablerIcon::Archive)->iconSize(IconSize::Large) + ->visible(fn (File $file) => $file->isArchive()) + ->action(function (File $file) { + $this->getDaemonFileRepository()->decompressFile($this->path, $file->name); + + Activity::event('server:file.decompress') + ->property('directory', $this->path) + ->property('file', $file->name) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.unarchive.notification')) + ->success() + ->send(); + + $this->refreshPage(); + }), + ])->iconSize(IconSize::Large), + DeleteAction::make() + ->authorize(fn () => user()?->can(SubuserPermission::FileDelete, $server)) + ->requiresConfirmation() + ->modalHeading(fn (File $file) => trans('filament-actions::delete.single.modal.heading', ['label' => $file->name . ' ' . ($file->is_directory ? 'folder' : 'file')])) + ->action(function (File $file) { + $this->deselectAllTableRecords(); + $this->getDaemonFileRepository()->deleteFiles($this->path, [$file->name]); + + Activity::event('server:file.delete') + ->property('directory', $this->path) + ->property('files', $file->name) + ->log(); + + $this->refreshPage(); + }), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + BulkAction::make('fm_move') + ->label(trans('server/file.actions.move.title')) + ->icon(TablerIcon::Replace)->iconSize(IconSize::Large) + ->authorize(fn () => user()?->can(SubuserPermission::FileUpdate, $server)) + ->schema([ + TextInput::make('location') + ->label(trans('server/file.actions.move.directory')) + ->hint(trans('server/file.actions.move.directory_hint')) + ->required() + ->live(), + TextEntry::make('new_location') + ->state(fn (Get $get) => resolve_path('./' . join_paths($this->path, $get('location') ?? ''))), + ]) + ->action(function (Collection $files, $data) { + $location = $data['location']; + + $files = $files->map(fn ($file) => ['to' => join_paths($location, $file['name']), 'from' => $file['name']])->toArray(); + $this->getDaemonFileRepository()->renameFiles($this->path, $files); + + Activity::event('server:file.rename') + ->property('directory', $this->path) + ->property('files', $files) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.move.bulk_notification', ['count' => count($files), 'directory' => resolve_path(join_paths($this->path, $location))])) + ->success() + ->send(); + + $this->refreshPage(); + }), + BulkAction::make('fm_archive') + ->label(trans('server/file.actions.archive.title')) + ->icon(TablerIcon::Archive)->iconSize(IconSize::Large) + ->authorize(fn () => user()?->can(SubuserPermission::FileArchive, $server)) + ->schema([ + Grid::make(3) + ->schema([ + TextInput::make('name') + ->label(trans('server/file.actions.archive.archive_name')) + ->placeholder(fn () => 'archive-' . str(Carbon::now()->toRfc3339String())->replace(':', '')->before('+0000') . 'Z') + ->columnSpan(2), + Select::make('extension') + ->label(trans('server/file.actions.archive.extension')) + ->selectablePlaceholder(false) + ->options([ + 'tar.gz' => 'tar.gz', + 'zip' => 'zip', + 'tar.bz2' => 'tar.bz2', + 'tar.xz' => 'tar.xz', + ]) + ->columnSpan(1), + ]), + ]) + ->action(function ($data, Collection $files) { + $files = $files->map(fn ($file) => $file['name'])->toArray(); + + $archive = $this->getDaemonFileRepository()->compressFiles($this->path, $files, $data['name'], $data['extension']); + + Activity::event('server:file.compress') + ->property('name', $archive['name']) + ->property('directory', $this->path) + ->property('files', $files) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.archive.notification')) + ->body($archive['name']) + ->success() + ->send(); + + $this->refreshPage(); + }), + DeleteBulkAction::make('fm_delete') + ->successNotificationTitle(null) + ->authorize(fn () => user()?->can(SubuserPermission::FileDelete, $server)) + ->action(function (Collection $files) { + $files = $files->map(fn ($file) => $file['name'])->toArray(); + $this->getDaemonFileRepository()->deleteFiles($this->path, $files); + + Activity::event('server:file.delete') + ->property('directory', $this->path) + ->property('files', $files) + ->log(); + + Notification::make() + ->title(trans('server/file.actions.delete.bulk_notification', ['count' => count($files)])) + ->success() + ->send(); + + $this->refreshPage(); + }), + ]), + + Action::make('new_file') + ->authorize(fn () => user()?->can(SubuserPermission::FileCreate, $server)) + ->tooltip(trans('server/file.actions.new_file.title')) + ->hiddenLabel()->icon(TablerIcon::FilePlus) + ->color('primary') + ->modalSubmitActionLabel(trans('server/file.actions.new_file.create')) + ->action(function ($data) { + $path = join_paths($this->path, $data['name']); + try { + $this->getDaemonFileRepository()->putContent($path, $data['editor'] ?? ''); + + Activity::event('server:file.write') + ->property('file', $path) + ->log(); + + $this->refreshPage(); + } catch (FileExistsException) { + AlertBanner::make('file_already_exists') + ->title(trans('server/file.alerts.file_already_exists.title', ['name' => $path])) + ->danger() + ->closable() + ->send(); + + $this->refreshPage(true); + } + }) + ->schema([ + TextInput::make('name') + ->label(trans('server/file.actions.new_file.file_name')) + ->required(), + Select::make('lang') + ->label(trans('server/file.actions.new_file.syntax')) + ->searchable() + ->live() + ->options(EditorLanguages::class) + ->selectablePlaceholder(false) + ->afterStateUpdated(fn ($state) => $this->dispatch('setLanguage', lang: $state)) + ->default(EditorLanguages::plaintext->value), + MonacoEditor::make('editor') + ->hiddenLabel() + ->language(fn (Get $get) => $get('lang') ?? 'plaintext'), + ]), + Action::make('new_folder') + ->authorize(fn () => user()?->can(SubuserPermission::FileCreate, $server)) + ->hiddenLabel()->icon(TablerIcon::FolderPlus) + ->tooltip(trans('server/file.actions.new_folder.title')) + ->color('primary') + ->action(function ($data) { + try { + $this->createFolder($data['name']); + + Activity::event('server:file.create-directory') + ->property(['directory' => $this->path, 'name' => $data['name']]) + ->log(); + + $this->refreshPage(); + } catch (FileExistsException) { + $path = join_paths($this->path, $data['name']); + + AlertBanner::make('folder_already_exists') + ->title(trans('server/file.alerts.file_already_exists.title', ['name' => $path])) + ->danger() + ->closable() + ->send(); + + $this->refreshPage(true); + } + }) + ->schema([ + TextInput::make('name') + ->label(trans('server/file.actions.new_folder.folder_name')) + ->required(), + ]), + Action::make('uploadFile') + ->authorize(fn () => user()?->can(SubuserPermission::FileCreate, $server)) + ->view('filament.server.pages.file-upload'), + Action::make('uploadURL') + ->authorize(fn () => user()?->can(SubuserPermission::FileCreate, $server)) + ->hiddenLabel()->icon(TablerIcon::WorldDownload) + ->tooltip(trans('server/file.actions.upload.from_url')) + ->modalHeading(trans('server/file.actions.upload.from_url')) + ->color('success') + ->action(function ($data) { + $this->getDaemonFileRepository()->pull($data['url'], $this->path); + + Activity::event('server:file.pull') + ->property('url', $data['url']) + ->property('directory', $this->path) + ->log(); + + $this->refreshPage(); + }) + ->schema([ + TextInput::make('url') + ->label(trans('server/file.actions.upload.url')) + ->required() + ->url(), + ]), + Action::make('search') + ->authorize(fn () => user()?->can(SubuserPermission::FileRead, $server)) + ->hiddenLabel() + ->tooltip(trans('server/file.actions.nested_search.title')) + ->color('primary') + ->icon(TablerIcon::FolderSearch) + ->modalHeading(trans('server/file.actions.nested_search.title')) + ->modalSubmitActionLabel(trans('server/file.actions.nested_search.search')) + ->schema([ + TextInput::make('searchTerm') + ->label(trans('server/file.actions.nested_search.search_term')) + ->placeholder(trans('server/file.actions.nested_search.search_term_placeholder')) + ->required() + ->regex('/^[^*]*\*?[^*]*$/') + ->minValue(3), + ]) + ->action(fn ($data) => redirect(SearchFiles::getUrl([ + 'searchTerm' => $data['searchTerm'], + 'path' => $this->path, + ]))), + ]); + } + + private function refreshPage(bool $oneBack = false): void + { + $url = self::getUrl(['path' => $oneBack ? dirname($this->path) : $this->path]); + $this->redirect($url, FilamentView::hasSpaMode($url)); + } + + /** + * @return string[] + */ + private function getPermissionsFromModeBit(int $mode): array + { + return match ($mode) { + 1 => ['execute'], + 2 => ['write'], + 3 => ['write', 'execute'], + 4 => ['read'], + 5 => ['read', 'execute'], + 6 => ['read', 'write'], + 7 => ['read', 'write', 'execute'], + default => [], + }; + } + + public function getUploadUrl(NodeJWTService $jwtService): string + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if (!user()?->can(SubuserPermission::FileCreate, $server)) { + abort(403, 'You do not have permission to upload files.'); + } + + $token = $jwtService + ->setExpiresAt(CarbonImmutable::now()->addMinutes(15)) + ->setUser(user()) + ->setClaims(['server_uuid' => $server->uuid]) + ->handle($server->node, user()->id . $server->uuid); + + return sprintf( + '%s/upload/file?token=%s', + $server->node->getConnectionAddress(), + $token->toString() + ); + } + + public function getUploadSizeLimit(): int + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $server->node->upload_size * 1024 * 1024; + } + + /** + * @throws ConnectionException + * @throws FileExistsException + * @throws \Throwable + */ + public function createFolder(string $folderPath): void + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if (!user()?->can(SubuserPermission::FileCreate, $server)) { + abort(403, 'You do not have permission to create folders.'); + } + + try { + $this->getDaemonFileRepository()->createDirectory($folderPath, $this->path); + + Activity::event('server:file.create-directory') + ->property(['directory' => $this->path, 'name' => $folderPath]) + ->log(); + + } catch (FileExistsException) { + // Ignore if the folder already exists. + } catch (ConnectionException $e) { + Notification::make() + ->body($e->getMessage()) + ->danger() + ->send(); + + } + } + + /** + * @param string[] $files + */ + public function logUploadedFiles(array $files): void + { + $filesCollection = collect($files); + + Activity::event('server:files.uploaded') + ->property('directory', $this->path) + ->property('files', $filesCollection) + ->log(); + } + + private function getDaemonFileRepository(): DaemonFileRepository + { + /** @var Server $server */ + $server = Filament::getTenant(); + $this->fileRepository ??= (new DaemonFileRepository())->setServer($server); + + return $this->fileRepository; + } + + public static function route(string $path): PageRegistration + { + return new PageRegistration( + page: static::class, + route: fn (Panel $panel): Route => RouteFacade::get($path, static::class) + ->middleware(static::getRouteMiddleware($panel)) + ->withoutMiddleware(static::getWithoutRouteMiddleware($panel)) + ->where('path', '.*'), + ); + } + + public function fileUploadAction(): Action + { + if (user()?->getCustomization(CustomizationKey::ButtonStyle)) { + return Action::make('fileUpload') + ->iconSize(IconSize::ExtraLarge) + ->iconButton() + ->color('success') + ->icon(TablerIcon::Upload) + ->tooltip(trans('server/file.actions.upload.title')) + ->extraAttributes(['@click' => 'triggerBrowse']); + } + + return Action::make('fileUpload') + ->hiddenLabel() + ->color('success') + ->icon(TablerIcon::Upload) + ->tooltip(trans('server/file.actions.upload.title')) + ->extraAttributes(['@click' => 'triggerBrowse']); + } +} diff --git a/app/Filament/Server/Resources/Files/Pages/SearchFiles.php b/app/Filament/Server/Resources/Files/Pages/SearchFiles.php new file mode 100644 index 0000000000..713d3cc9fb --- /dev/null +++ b/app/Filament/Server/Resources/Files/Pages/SearchFiles.php @@ -0,0 +1,81 @@ + $resource::getBreadcrumb(), + self::getUrl(['searchTerm' => $this->searchTerm]) => trans('server/file.actions.nested_search.search_for_term', ['term' => ' "' . $this->searchTerm . '"']), + ]; + } + + public function table(Table $table): Table + { + /** @var Server $server */ + $server = Filament::getTenant(); + + return $table + ->paginated(false) + ->query(fn () => File::get($server, $this->path, $this->searchTerm)->orderByDesc('is_directory')->orderBy('name')) + ->columns([ + TextColumn::make('name') + ->label(trans('server/file.name')) + ->searchable() + ->sortable() + ->icon(fn (File $file) => $file->getIcon()), + BytesColumn::make('size') + ->label(trans('server/file.size')) + ->visibleFrom('md') + ->state(fn (File $file) => $file->size) + ->sortable(), + DateTimeColumn::make('modified_at') + ->label(trans('server/file.modified_at')) + ->visibleFrom('md') + ->since() + ->sortable(), + ]) + ->recordUrl(function (File $file) { + if ($file->is_directory) { + return ListFiles::getUrl(['path' => $file->name]); + } + + return $file->canEdit() ? EditFiles::getUrl(['path' => $file->name]) : null; + }); + } + + public function getTitle(): string|Htmlable + { + return trans('server/file.actions.nested_search.title'); + } +} diff --git a/app/Filament/Server/Resources/Schedules/Pages/CreateSchedule.php b/app/Filament/Server/Resources/Schedules/Pages/CreateSchedule.php new file mode 100644 index 0000000000..b5c0385eb0 --- /dev/null +++ b/app/Filament/Server/Resources/Schedules/Pages/CreateSchedule.php @@ -0,0 +1,71 @@ +hasFormWrapper(); + + return Action::make('exclude_create') + ->label(__('filament-panels::resources/pages/create-record.form.actions.create.label')) + ->submit($hasFormWrapper ? $this->getSubmitFormLivewireMethodName() : null) + ->action($hasFormWrapper ? null : $this->getSubmitFormLivewireMethodName()) + ->keyBindings(['mod+s']); + } + + protected function afterCreate(): void + { + /** @var Schedule $schedule */ + $schedule = $this->record; + + Activity::event('server:schedule.create') + ->property('name', $schedule->name) + ->log(); + } + + protected function mutateFormDataBeforeCreate(array $data): array + { + if (!isset($data['server_id'])) { + /** @var Server $server */ + $server = Filament::getTenant(); + + $data['server_id'] = $server->id; + } + + if (!isset($data['next_run_at'])) { + $data['next_run_at'] = ScheduleResource::getNextRun( + $data['cron_minute'], + $data['cron_hour'], + $data['cron_day_of_month'], + $data['cron_month'], + $data['cron_day_of_week'] + ); + } + + return $data; + } + + public function getBreadcrumbs(): array + { + return []; + } +} diff --git a/app/Filament/Server/Resources/Schedules/Pages/EditSchedule.php b/app/Filament/Server/Resources/Schedules/Pages/EditSchedule.php new file mode 100644 index 0000000000..eff631ff93 --- /dev/null +++ b/app/Filament/Server/Resources/Schedules/Pages/EditSchedule.php @@ -0,0 +1,97 @@ +record; + + Activity::event('server:schedule.update') + ->property('name', $schedule->name) + ->log(); + } + + protected function mutateFormDataBeforeSave(array $data): array + { + $data['next_run_at'] = ScheduleResource::getNextRun( + $data['cron_minute'], + $data['cron_hour'], + $data['cron_day_of_month'], + $data['cron_month'], + $data['cron_day_of_week'] + ); + + return $data; + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return [ + DeleteAction::make() + ->after(function ($record) { + Activity::event('server:schedule.delete') + ->property('name', $record->name) + ->log(); + }), + Action::make('run_now') + ->hiddenLabel() + ->icon(TablerIcon::Run) + ->authorize(fn () => user()?->can(SubuserPermission::ScheduleUpdate, Filament::getTenant())) + ->tooltip(fn (Schedule $schedule) => $schedule->tasks->count() === 0 ? trans('server/schedule.no_tasks') : ($schedule->status === ScheduleStatus::Processing ? ScheduleStatus::Processing->getLabel() : trans('server/schedule.run_now'))) + ->color(fn (Schedule $schedule) => $schedule->tasks->count() === 0 || $schedule->status === ScheduleStatus::Processing ? 'warning' : 'primary') + ->disabled(fn (Schedule $schedule) => $schedule->tasks->count() === 0 || $schedule->status === ScheduleStatus::Processing) + ->action(function (ProcessScheduleService $service, Schedule $schedule) { + $service->handle($schedule, true); + + Activity::event('server:schedule.execute') + ->subject($schedule) + ->property('name', $schedule->name) + ->log(); + + $this->fillForm(); + }), + ExportScheduleAction::make(), + Action::make('save') + ->hiddenLabel() + ->action('save') + ->keyBindings(['mod+s']) + ->icon(TablerIcon::DeviceFloppy) + ->tooltip(trans('server/schedule.save')), + ]; + } + + public function getBreadcrumbs(): array + { + return []; + } + + protected function getFormActions(): array + { + return []; + } +} diff --git a/app/Filament/Server/Resources/Schedules/Pages/ListSchedules.php b/app/Filament/Server/Resources/Schedules/Pages/ListSchedules.php new file mode 100644 index 0000000000..94920db255 --- /dev/null +++ b/app/Filament/Server/Resources/Schedules/Pages/ListSchedules.php @@ -0,0 +1,26 @@ + */ + protected function getDefaultHeaderActions(): array + { + return [ + EditAction::make() + ->hiddenLabel() + ->icon(TablerIcon::CalendarCode) + ->tooltip(trans('server/schedule.edit')), + ]; + } + + public function getBreadcrumbs(): array + { + return []; + } +} diff --git a/app/Filament/Server/Resources/Schedules/RelationManagers/TasksRelationManager.php b/app/Filament/Server/Resources/Schedules/RelationManagers/TasksRelationManager.php new file mode 100644 index 0000000000..91af2a7a89 --- /dev/null +++ b/app/Filament/Server/Resources/Schedules/RelationManagers/TasksRelationManager.php @@ -0,0 +1,153 @@ +getAll(); + + return [ + Select::make('action') + ->label(trans('server/schedule.tasks.actions.title')) + ->required() + ->live() + ->disableOptionWhen(fn (string $value) => !$tasks[$value]->canCreate($schedule)) + ->options($taskService->getMappings()) + ->selectablePlaceholder(false) + ->default(array_key_first($tasks)) + ->afterStateUpdated(fn ($state, Set $set) => $set('payload', $tasks[$state]->getDefaultPayload())), + Group::make(fn (Get $get) => array_key_exists($get('action'), $tasks) ? $tasks[$get('action')]->getPayloadForm() : []), + TextInput::make('time_offset') + ->label(trans('server/schedule.tasks.time_offset')) + ->hidden(fn (Get $get, ?Task $task) => config('queue.default') === 'sync' || $schedule->tasks->isEmpty() || $task?->isFirst()) + ->default(0) + ->numeric() + ->minValue(0) + ->maxValue(900) + ->suffix(trans_choice('server/schedule.tasks.seconds', 2)), + Toggle::make('continue_on_failure') + ->label(trans('server/schedule.tasks.continue_on_failure')), + ]; + } + + /** + * @throws Exception + */ + public function table(Table $table): Table + { + /** @var Schedule $schedule */ + $schedule = $this->getOwnerRecord(); + + return $table + ->reorderable('sequence_id') + ->defaultSort('sequence_id') + ->reorderRecordsTriggerAction(fn (Action $action, bool $isReordering) => $action->hiddenLabel()->tooltip(fn () => $action->getLabel())) + ->columns([ + TextColumn::make('action') + ->label(trans('server/schedule.tasks.actions.title')) + ->state(fn (Task $task) => $task->getSchema()?->getName() ?? $task->action), + TextColumn::make('payload') + ->label(trans('server/schedule.tasks.payload')) + ->state(fn (Task $task) => $task->getSchema()?->formatPayload($task->payload) ?? $task->payload) + ->tooltip(fn (Task $task) => $task->getSchema()?->getPayloadLabel()) + ->placeholder(trans('server/schedule.tasks.no_payload')) + ->badge(), + TextColumn::make('time_offset') + ->label(trans('server/schedule.tasks.time_offset')) + ->hidden(fn () => config('queue.default') === 'sync') + ->state(fn (Task $task) => $task->isFirst() ? null : $task->time_offset) + ->suffix(fn ($state) => ' ' . trans_choice('server/schedule.tasks.seconds', $state)) + ->placeholder(trans('server/schedule.tasks.first_task')), + IconColumn::make('continue_on_failure') + ->label(trans('server/schedule.tasks.continue_on_failure')) + ->boolean(), + ]) + ->recordActions([ + EditAction::make() + ->schema($this->getTaskForm($schedule)) + ->mutateDataUsing(function ($data) { + $data['payload'] ??= ''; + + return $data; + }) + ->after(function ($data) { + /** @var Schedule $schedule */ + $schedule = $this->getOwnerRecord(); + + Activity::event('server:task.update') + ->subject($schedule) + ->property(['name' => $schedule->name, 'action' => $data['action'], 'payload' => $data['payload']]) + ->log(); + + }), + DeleteAction::make() + ->action(function (Task $task) { + /** @var Schedule $schedule */ + $schedule = $this->getOwnerRecord(); + $task->delete(); + + Activity::event('server:task.delete') + ->subject($schedule) + ->property(['name' => $schedule->name, 'action' => $task->action, 'payload' => $task->payload]) + ->log(); + }), + ]) + ->headerActions([ + CreateAction::make() + ->createAnother(false) + ->label(fn () => $schedule->tasks()->count() >= config('panel.client_features.schedules.per_schedule_task_limit', 10) ? trans('server/schedule.tasks.limit') : trans('server/schedule.tasks.create')) + ->disabled(fn () => $schedule->tasks()->count() >= config('panel.client_features.schedules.per_schedule_task_limit', 10)) + ->schema($this->getTaskForm($schedule)) + ->action(function ($data) use ($schedule) { + $sequenceId = ($schedule->tasks()->orderByDesc('sequence_id')->first()->sequence_id ?? 0) + 1; + + $task = Task::query()->create([ + 'schedule_id' => $schedule->id, + 'sequence_id' => $sequenceId, + 'action' => $data['action'], + 'payload' => $data['payload'] ?? '', + 'time_offset' => $data['time_offset'] ?? 0, + 'continue_on_failure' => (bool) $data['continue_on_failure'], + ]); + + Activity::event('server:task.create') + ->subject($schedule, $task) + ->property(['name' => $schedule->name, 'action' => $task->action, 'payload' => $task->payload]) + ->log(); + }), + ]); + } +} diff --git a/app/Filament/Server/Resources/Schedules/ScheduleResource.php b/app/Filament/Server/Resources/Schedules/ScheduleResource.php new file mode 100644 index 0000000000..ed33414fcd --- /dev/null +++ b/app/Filament/Server/Resources/Schedules/ScheduleResource.php @@ -0,0 +1,399 @@ +columns([ + 'default' => 1, + 'lg' => 2, + ]) + ->components([ + TextInput::make('name') + ->label(trans('server/schedule.name')) + ->columnSpanFull() + ->autocomplete(false) + ->columnSpanFull() + ->required(), + Toggle::make('only_when_online') + ->label(trans('server/schedule.only_online')) + ->hintIcon(TablerIcon::QuestionMark, trans('server/schedule.only_online_hint')) + ->inline(false) + ->required() + ->default(1), + Toggle::make('is_active') + ->label(trans('server/schedule.enabled')) + ->hintIcon(TablerIcon::QuestionMark, trans('server/schedule.enabled_hint')) + ->inline(false) + ->hiddenOn('view') + ->required() + ->default(1), + ToggleButtons::make('status') + ->enum(ScheduleStatus::class) + ->formatStateUsing(fn (?Schedule $schedule) => $schedule?->status->value ?? 'new') + ->options(fn (?Schedule $schedule) => [$schedule?->status->value ?? 'new' => $schedule?->status->getLabel() ?? 'New']) + ->visibleOn('view'), + Section::make(trans('server/schedule.cron')) + ->description(function (Get $get) { + try { + $nextRun = Utilities::getScheduleNextRunDate($get('cron_minute'), $get('cron_hour'), $get('cron_day_of_month'), $get('cron_month'), $get('cron_day_of_week'))->timezone(user()->timezone ?? 'UTC'); + } catch (Exception) { + $nextRun = trans('server/schedule.invalid'); + } + + return new HtmlString(trans('server/schedule.cron_body') . '
' . trans('server/schedule.cron_timezone', ['timezone' => user()->timezone ?? 'UTC', 'next_run' => $nextRun])); + }) + ->schema([ + Actions::make([ + CronPresetAction::make('exclude_hourly') + ->label(trans('server/schedule.time.hourly')) + ->cron('0', '*', '*', '*', '*'), + CronPresetAction::make('exclude_daily') + ->label(trans('server/schedule.time.daily')) + ->cron('0', '0', '*', '*', '*'), + CronPresetAction::make('exclude_weekly_monday') + ->label(trans('server/schedule.time.weekly_mon')) + ->cron('0', '0', '*', '*', '1'), + CronPresetAction::make('exclude_weekly_sunday') + ->label(trans('server/schedule.time.weekly_sun')) + ->cron('0', '0', '*', '*', '0'), + CronPresetAction::make('exclude_monthly') + ->label(trans('server/schedule.time.monthly')) + ->cron('0', '0', '1', '*', '*'), + CronPresetAction::make('exclude_every_x_minutes') + ->label(trans('server/schedule.time.every_min')) + ->color(fn (Get $get) => str($get('cron_minute'))->startsWith('*/') + && $get('cron_hour') == '*' + && $get('cron_day_of_month') == '*' + && $get('cron_month') == '*' + && $get('cron_day_of_week') == '*' ? 'success' : 'primary') + ->schema([ + TextInput::make('x') + ->hiddenLabel() + ->numeric() + ->minValue(1) + ->maxValue(60) + ->prefix(trans('server/schedule.time.every')) + ->suffix(trans('server/schedule.time.minutes')), + ]) + ->action(function (Set $set, $data) { + $set('cron_minute', '*/' . $data['x']); + $set('cron_hour', '*'); + $set('cron_day_of_month', '*'); + $set('cron_month', '*'); + $set('cron_day_of_week', '*'); + }), + CronPresetAction::make('exclude_every_x_hours') + ->color(fn (Get $get) => $get('cron_minute') == '0' + && str($get('cron_hour'))->startsWith('*/') + && $get('cron_day_of_month') == '*' + && $get('cron_month') == '*' + && $get('cron_day_of_week') == '*' ? 'success' : 'primary') + ->schema([ + TextInput::make('x') + ->hiddenLabel() + ->numeric() + ->minValue(1) + ->maxValue(24) + ->prefix(trans('server/schedule.time.every')) + ->suffix(trans('server/schedule.time.hours')), + ]) + ->action(function (Set $set, $data) { + $set('cron_minute', '0'); + $set('cron_hour', '*/' . $data['x']); + $set('cron_day_of_month', '*'); + $set('cron_month', '*'); + $set('cron_day_of_week', '*'); + }), + CronPresetAction::make('exclude_every_x_days') + ->color(fn (Get $get) => $get('cron_minute') == '0' + && $get('cron_hour') == '0' + && str($get('cron_day_of_month'))->startsWith('*/') + && $get('cron_month') == '*' + && $get('cron_day_of_week') == '*' ? 'success' : 'primary') + ->schema([ + TextInput::make('x') + ->hiddenLabel() + ->numeric() + ->minValue(1) + ->maxValue(24) + ->prefix(trans('server/schedule.time.every')) + ->suffix(trans('server/schedule.time.days')), + ]) + ->action(function (Set $set, $data) { + $set('cron_minute', '0'); + $set('cron_hour', '0'); + $set('cron_day_of_month', '*/' . $data['x']); + $set('cron_month', '*'); + $set('cron_day_of_week', '*'); + }), + CronPresetAction::make('exclude_every_x_months') + ->color(fn (Get $get) => $get('cron_minute') == '0' + && $get('cron_hour') == '0' + && $get('cron_day_of_month') == '1' + && str($get('cron_month'))->startsWith('*/') + && $get('cron_day_of_week') == '*' ? 'success' : 'primary') + ->schema([ + TextInput::make('x') + ->hiddenLabel() + ->numeric() + ->minValue(1) + ->maxValue(24) + ->prefix(trans('server/schedule.time.every')) + ->suffix(trans('server/schedule.time.months')), + ]) + ->action(function (Set $set, $data) { + $set('cron_minute', '0'); + $set('cron_hour', '0'); + $set('cron_day_of_month', '1'); + $set('cron_month', '*/' . $data['x']); + $set('cron_day_of_week', '*'); + }), + CronPresetAction::make('exclude_every_x_day_of_week') + ->color(fn (Get $get) => $get('cron_minute') == '0' + && $get('cron_hour') == '0' + && $get('cron_day_of_month') == '*' + && $get('cron_month') == '*' + && $get('cron_day_of_week') != '*' ? 'success' : 'primary') + ->schema([ + Select::make('x') + ->hiddenLabel() + ->prefix(trans('server/schedule.time.every')) + ->options([ + '1' => trans('server/schedule.time.monday'), + '2' => trans('server/schedule.time.tuesday'), + '3' => trans('server/schedule.time.wednesday'), + '4' => trans('server/schedule.time.thursday'), + '5' => trans('server/schedule.time.friday'), + '6' => trans('server/schedule.time.saturday'), + '0' => trans('server/schedule.time.sunday'), + ]) + ->selectablePlaceholder(false), + ]) + ->action(function (Set $set, $data) { + $set('cron_minute', '0'); + $set('cron_hour', '0'); + $set('cron_day_of_month', '*'); + $set('cron_month', '*'); + $set('cron_day_of_week', $data['x']); + }), + ]) + ->hiddenOn('view'), + Group::make([ + TextInput::make('cron_minute') + ->label(trans('server/schedule.time.minute')) + ->columnSpan([ + 'default' => 2, + 'lg' => 1, + ]) + ->default('*/5') + ->required() + ->live(), + TextInput::make('cron_hour') + ->label(trans('server/schedule.time.hour')) + ->columnSpan([ + 'default' => 2, + 'lg' => 1, + ]) + ->default('*') + ->required() + ->live(), + TextInput::make('cron_day_of_month') + ->label(trans('server/schedule.time.day_of_month')) + ->columnSpan([ + 'default' => 2, + 'lg' => 1, + ]) + ->default('*') + ->required() + ->live(), + TextInput::make('cron_month') + ->label(trans('server/schedule.time.month')) + ->columnSpan([ + 'default' => 2, + 'lg' => 1, + ]) + ->default('*') + ->required() + ->live(), + TextInput::make('cron_day_of_week') + ->label(trans('server/schedule.time.day_of_week')) + ->columnSpan([ + 'default' => 2, + 'lg' => 1, + ]) + ->default('*') + ->required() + ->live(), + ]) + ->columns([ + 'default' => 4, + 'lg' => 5, + ]), + ]) + ->columnSpanFull(), + ]); + } + + /** + * @throws Throwable + */ + public static function defaultTable(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('name') + ->label(trans('server/schedule.name')) + ->searchable(), + TextColumn::make('cron') + ->label(trans('server/schedule.cron')) + ->state(fn (Schedule $schedule) => $schedule->cron_minute . ' ' . $schedule->cron_hour . ' ' . $schedule->cron_day_of_month . ' ' . $schedule->cron_month . ' ' . $schedule->cron_day_of_week), + TextColumn::make('status') + ->label(trans('server/schedule.status')) + ->state(fn (Schedule $schedule) => $schedule->status->getLabel()) + ->color(fn (Schedule $schedule) => $schedule->status->getColor()) + ->badge(), + IconColumn::make('only_when_online') + ->label(trans('server/schedule.online_only')) + ->boolean() + ->sortable(), + DateTimeColumn::make('last_run_at') + ->label(trans('server/schedule.last_run')) + ->placeholder(trans('server/schedule.never')) + ->since() + ->sortable(), + DateTimeColumn::make('next_run_at') + ->label(trans('server/schedule.next_run')) + ->placeholder(trans('server/schedule.never')) + ->since() + ->sortable() + ->state(fn (Schedule $schedule) => $schedule->status === ScheduleStatus::Active ? $schedule->next_run_at : null), + ]) + ->recordActions([ + ViewAction::make() + ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), + EditAction::make(), + DeleteAction::make() + ->after(function (Schedule $schedule) { + Activity::event('server:schedule.delete') + ->subject($schedule) + ->property('name', $schedule->name) + ->log(); + }), + ]) + ->toolbarActions([ + CreateAction::make() + ->hiddenLabel() + ->icon(TablerIcon::CalendarPlus) + ->color('primary') + ->tooltip(trans('server/schedule.new')), + ImportScheduleAction::make() + ->hiddenLabel() + ->icon(TablerIcon::FileImport) + ->color('success') + ->tooltip(trans('server/schedule.import')), + ]); + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return [ + TasksRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListSchedules::route('/'), + 'create' => CreateSchedule::route('/create'), + 'view' => ViewSchedule::route('/{record}'), + 'edit' => EditSchedule::route('/{record}/edit'), + ]; + } + + public static function getNextRun(string $minute, string $hour, string $dayOfMonth, string $month, string $dayOfWeek): Carbon + { + try { + return Utilities::getScheduleNextRunDate($minute, $hour, $dayOfMonth, $month, $dayOfWeek); + } catch (Exception) { + Notification::make() + ->title(trans('server/schedule.notification_invalid_cron')) + ->danger() + ->send(); + + throw new Halt(); + } + } + + public static function getNavigationLabel(): string + { + return trans('server/schedule.title'); + } +} diff --git a/app/Filament/Server/Resources/Subusers/Pages/ListSubusers.php b/app/Filament/Server/Resources/Subusers/Pages/ListSubusers.php new file mode 100644 index 0000000000..d42c995294 --- /dev/null +++ b/app/Filament/Server/Resources/Subusers/Pages/ListSubusers.php @@ -0,0 +1,27 @@ +subusers->count(); + } + + public static function defaultTable(Table $table): Table + { + /** @var Server $server */ + $server = Filament::getTenant(); + + $tabs = []; + $permissionsArray = []; + + foreach (Subuser::allPermissionData() as $data) { + if ($data['hidden']) { + continue; + } + + $options = []; + $descriptions = []; + + foreach ($data['permissions'] as $permission) { + $options[$permission] = str($permission)->headline(); + $descriptions[$permission] = trans('server/user.permissions.' . $data['name'] . '_' . str($permission)->replace('-', '_')); + $permissionsArray[$data['name']][] = $permission; + } + + $tabs[] = Tab::make($data['name']) + ->label(str($data['name'])->headline()) + ->schema([ + Section::make() + ->description(trans('server/user.permissions.' . $data['name'] . '_desc')) + ->icon($data['icon']) + ->contained(false) + ->schema([ + CheckboxList::make($data['name']) + ->hiddenLabel() + ->bulkToggleable() + ->columns(2) + ->options($options) + ->descriptions($descriptions), + ]), + ]); + } + + return $table + ->paginated(false) + ->columns([ + ImageColumn::make('picture') + ->visibleFrom('lg') + ->label('') + ->alignCenter()->circular() + ->defaultImageUrl(fn (Subuser $subuser) => Filament::getUserAvatarUrl($subuser->user)), + TextColumn::make('user.username') + ->label(trans('server/user.username')) + ->searchable(), + TextColumn::make('user.email') + ->label(trans('server/user.email')) + ->searchable(), + TextColumn::make('permissions_count') + ->label(trans('server/user.permissions.title')) + ->state(fn (Subuser $subuser) => collect($subuser->permissions) + ->reject(fn (string $permission) => SubuserPermission::tryFrom($permission)?->isHidden() ?? false) + ->count() + ), + ]) + ->recordActions([ + EditAction::make() + ->label(trans('server/user.edit')) + ->hidden(fn (Subuser $subuser) => user()?->id === $subuser->user->id) + ->authorize(fn () => user()?->can(SubuserPermission::UserUpdate, $server)) + ->modalHeading(fn (Subuser $subuser) => trans('server/user.editing', ['user' => $subuser->user->email])) + ->successNotificationTitle(null) + ->action(function (array $data, SubuserUpdateService $subuserUpdateService, Subuser $subuser) use ($server) { + $permissions = collect($data) + ->forget('email') + ->flatMap(fn ($permissions, $key) => collect($permissions)->map(fn ($permission) => "$key.$permission")) + ->push(SubuserPermission::WebsocketConnect->value) + ->unique() + ->all(); + + $subuserUpdateService->handle($subuser, $server, $permissions); + + Notification::make() + ->title(trans('server/user.notification_edit')) + ->success() + ->send(); + + return redirect(self::getUrl(tenant: $server)); + }) + ->schema([ + Grid::make() + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 5, + 'lg' => 6, + ]) + ->schema([ + TextInput::make('email') + ->inlineLabel() + ->disabled() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 4, + 'lg' => 5, + ]) + ->formatStateUsing(fn (Subuser $subuser) => $subuser->user->email), + Actions::make([ + Action::make('exclude_assignAll') + ->label(trans('server/user.assign_all')) + ->action(function (Set $set) use ($permissionsArray) { + $permissions = $permissionsArray; + foreach ($permissions as $key => $value) { + $allValues = array_unique($value); + $set($key, $allValues); + } + }), + ]) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]), + Tabs::make() + ->columnSpanFull() + ->schema($tabs), + ]), + ]) + ->mutateRecordDataUsing(function ($data, Subuser $subuser) { + $transformedPermissions = []; + + foreach ($subuser->permissions as $permission) { + [$group, $action] = explode('.', $permission, 2); + $transformedPermissions[$group][] = $action; + } + + foreach ($transformedPermissions as $key => $value) { + $data[$key] = $value; + } + + return $data; + }), + DeleteAction::make() + ->label(trans('server/user.delete')) + ->hidden(fn (Subuser $subuser) => user()?->id === $subuser->user->id) + ->authorize(fn () => user()?->can(SubuserPermission::UserDelete, $server)) + ->successNotificationTitle(null) + ->action(function (Subuser $subuser, SubuserDeletionService $subuserDeletionService) use ($server) { + $subuserDeletionService->handle($subuser, $server); + + Notification::make() + ->title(trans('server/user.notification_delete')) + ->success() + ->send(); + }), + ]) + ->toolbarActions([ + CreateAction::make('invite') + ->hiddenLabel() + ->icon(TablerIcon::UserPlus) + ->tooltip(trans('server/user.invite_user')) + ->createAnother(false) + ->authorize(fn () => user()?->can(SubuserPermission::UserCreate, $server)) + ->schema([ + Grid::make() + ->columnSpanFull() + ->columns([ + 'default' => 1, + 'sm' => 1, + 'md' => 5, + 'lg' => 6, + ]) + ->schema([ + TextInput::make('email') + ->email() + ->inlineLabel() + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 4, + 'lg' => 5, + ]) + ->required(), + Actions::make([ + Action::make('exclude_assignAll') + ->label(trans('server/user.assign_all')) + ->action(function (Set $set, Get $get) use ($permissionsArray) { + $permissions = $permissionsArray; + foreach ($permissions as $key => $value) { + $allValues = array_unique($value); + $set($key, $allValues); + } + }), + ]) + ->columnSpan([ + 'default' => 1, + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ]), + Tabs::make() + ->columnSpanFull() + ->schema($tabs), + ]), + ]) + ->modalHeading(trans('server/user.invite_user')) + ->modalIcon(TablerIcon::UserPlus) + ->modalSubmitActionLabel(trans('server/user.action')) + ->successNotificationTitle(null) + ->failureNotificationTitle(null) + ->action(function (Action $action, array $data, SubuserCreationService $service) use ($server) { + $email = strtolower($data['email']); + + $permissions = collect($data) + ->forget('email') + ->flatMap(fn ($permissions, $key) => collect($permissions)->map(fn ($permission) => "$key.$permission")) + ->push(SubuserPermission::WebsocketConnect->value) + ->unique() + ->all(); + + try { + $subuser = $service->handle($server, $email, $permissions); + + Activity::event('server:subuser.create') + ->subject($subuser->user) + ->property([ + 'email' => $data['email'], + 'permissions' => $permissions, + ]); + + Notification::make() + ->title(trans('server/user.notification_add')) + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title(trans('server/user.notification_failed')) + ->body($exception->getMessage()) + ->danger() + ->send(); + + $action->failure(); + + return; + } + + $action->success(); + + return redirect(self::getUrl(tenant: $server)); + }), ]); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return [ + 'index' => ListSubusers::route('/'), + ]; + } + + public static function getNavigationLabel(): string + { + return trans('server/user.title'); + } +} diff --git a/app/Filament/Server/Widgets/ServerConsole.php b/app/Filament/Server/Widgets/ServerConsole.php new file mode 100644 index 0000000000..3a2ec30a26 --- /dev/null +++ b/app/Filament/Server/Widgets/ServerConsole.php @@ -0,0 +1,141 @@ +getUserPermissionsService = $getUserPermissionsService; + $this->nodeJWTService = $nodeJWTService; + } + + protected function getToken(): string + { + if (!$this->user || !$this->server || $this->user->cannot(SubuserPermission::WebsocketConnect, $this->server)) { + throw new HttpForbiddenException('You do not have permission to connect to this server\'s websocket.'); + } + + $permissions = $this->getUserPermissionsService->handle($this->server, $this->user); + + return $this->nodeJWTService + ->setExpiresAt(now()->addMinutes(10)->toImmutable()) + ->setUser($this->user) + ->setClaims([ + 'server_uuid' => $this->server->uuid, + 'permissions' => $permissions, + ]) + ->handle($this->server->node, $this->user->id . $this->server->uuid)->toString(); + } + + protected function getSocket(): string + { + $socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $this->server->node->getConnectionAddress()); + $socket .= sprintf('/api/servers/%s/ws', $this->server->uuid); + + return $socket; + } + + protected function authorizeSendCommand(): bool + { + return $this->user->can(SubuserPermission::ControlConsole, $this->server); + } + + protected function canSendCommand(): bool + { + return $this->authorizeSendCommand() && !$this->server->isInConflictState() && $this->server->retrieveStatus()->isStartingOrRunning(); + } + + public function up(): void + { + $this->historyIndex = min($this->historyIndex + 1, count($this->history) - 1); + + $this->input = $this->history[$this->historyIndex] ?? ''; + } + + public function down(): void + { + $this->historyIndex = max($this->historyIndex - 1, -1); + + $this->input = $this->history[$this->historyIndex] ?? ''; + } + + public function enter(): void + { + if (!empty($this->input) && $this->canSendCommand()) { + $this->dispatch('sendServerCommand', command: $this->input); + + $this->history = Arr::prepend($this->history, $this->input); + $this->historyIndex = -1; + + $this->input = ''; + } + } + + #[On('token-request')] + public function tokenRequest(): void + { + $this->dispatch('sendAuthRequest', token: $this->getToken()); + } + + #[On('store-stats')] + public function storeStats(string $data): void + { + $data = json_decode($data); + + $timestamp = now()->getTimestamp(); + + foreach ($data as $key => $value) { + $cacheKey = "servers.{$this->server->id}.$key"; + $cachedStats = cache()->get($cacheKey, []); + + $cachedStats[$timestamp] = $value; + + cache()->put($cacheKey, array_slice($cachedStats, -120), now()->addMinute()); + } + } + + #[On('websocket-error')] + public function websocketError(): void + { + AlertBanner::make('websocket_error') + ->title(trans('server/console.websocket_error.title')) + ->body(trans('server/console.websocket_error.body')) + ->danger() + ->send(); + } +} diff --git a/app/Filament/Server/Widgets/ServerCpuChart.php b/app/Filament/Server/Widgets/ServerCpuChart.php new file mode 100644 index 0000000000..8b0f0c36bb --- /dev/null +++ b/app/Filament/Server/Widgets/ServerCpuChart.php @@ -0,0 +1,85 @@ +isInConflictState() && !$server->retrieveStatus()->isOffline(); + } + + protected function getData(): array + { + $period = (int) user()?->getCustomization(CustomizationKey::ConsoleGraphPeriod); + $cpu = collect(cache()->get("servers.{$this->server->id}.cpu_absolute")) + ->slice(-$period) + ->map(fn ($value, $key) => [ + 'cpu' => round($value, 2), + 'timestamp' => Carbon::createFromTimestamp($key, user()->timezone ?? 'UTC')->format('H:i:s'), + ]) + ->all(); + + return [ + 'datasets' => [ + [ + 'data' => array_column($cpu, 'cpu'), + 'backgroundColor' => [ + 'rgba(96, 165, 250, 0.3)', + ], + 'tension' => '0.3', + 'fill' => true, + ], + ], + 'labels' => array_column($cpu, 'timestamp'), + 'locale' => user()->language ?? 'en', + ]; + } + + protected function getType(): string + { + return 'line'; + } + + protected function getOptions(): RawJs + { + return RawJs::make(<<<'JS' + { + scales: { + y: { + min: 0, + }, + x: { + display: false, + } + }, + plugins: { + legend: { + display: false, + } + } + } + JS); + } + + public function getHeading(): string + { + return trans('server/console.labels.cpu'); + } +} diff --git a/app/Filament/Server/Widgets/ServerMemoryChart.php b/app/Filament/Server/Widgets/ServerMemoryChart.php new file mode 100644 index 0000000000..5fb787e9a1 --- /dev/null +++ b/app/Filament/Server/Widgets/ServerMemoryChart.php @@ -0,0 +1,85 @@ +isInConflictState() && !$server->retrieveStatus()->isOffline(); + } + + protected function getData(): array + { + $period = (int) user()?->getCustomization(CustomizationKey::ConsoleGraphPeriod); + $memUsed = collect(cache()->get("servers.{$this->server->id}.memory_bytes")) + ->slice(-$period) + ->map(fn ($value, $key) => [ + 'memory' => round(config('panel.use_binary_prefix') ? $value / 1024 / 1024 / 1024 : $value / 1000 / 1000 / 1000, 2), + 'timestamp' => Carbon::createFromTimestamp($key, user()->timezone ?? 'UTC')->format('H:i:s'), + ]) + ->all(); + + return [ + 'datasets' => [ + [ + 'data' => array_column($memUsed, 'memory'), + 'backgroundColor' => [ + 'rgba(96, 165, 250, 0.3)', + ], + 'tension' => '0.3', + 'fill' => true, + ], + ], + 'labels' => array_column($memUsed, 'timestamp'), + 'locale' => user()->language ?? 'en', + ]; + } + + protected function getType(): string + { + return 'line'; + } + + protected function getOptions(): RawJs + { + return RawJs::make(<<<'JS' + { + scales: { + y: { + min: 0, + }, + x: { + display: false, + } + }, + plugins: { + legend: { + display: false, + } + } + } + JS); + } + + public function getHeading(): string + { + return trans('server/console.labels.memory'); + } +} diff --git a/app/Filament/Server/Widgets/ServerNetworkChart.php b/app/Filament/Server/Widgets/ServerNetworkChart.php new file mode 100644 index 0000000000..10d0cc632d --- /dev/null +++ b/app/Filament/Server/Widgets/ServerNetworkChart.php @@ -0,0 +1,118 @@ +isInConflictState() && !$server->retrieveStatus()->isOffline(); + } + + protected function getData(): array + { + $previous = null; + + $period = (int) user()?->getCustomization(CustomizationKey::ConsoleGraphPeriod); + $net = collect(cache()->get("servers.{$this->server->id}.network")) + ->slice(-$period) + ->map(function ($current, $timestamp) use (&$previous) { + $net = null; + + if ($previous !== null) { + $net = [ + 'rx' => max(0, $current->rx_bytes - $previous->rx_bytes), + 'tx' => max(0, $current->tx_bytes - $previous->tx_bytes), + 'timestamp' => Carbon::createFromTimestamp($timestamp, user()->timezone ?? 'UTC')->format('H:i:s'), + ]; + } + + $previous = $current; + + return $net; + }) + ->all(); + + return [ + 'datasets' => [ + [ + 'label' => 'Inbound', + 'data' => array_column($net, 'rx'), + 'backgroundColor' => [ + 'rgba(100, 255, 105, 0.5)', + ], + 'tension' => '0.3', + 'fill' => true, + ], + [ + 'label' => 'Outbound', + 'data' => array_column($net, 'tx'), + 'backgroundColor' => [ + 'rgba(96, 165, 250, 0.3)', + ], + 'tension' => '0.3', + 'fill' => true, + ], + ], + 'labels' => array_column($net, 'timestamp'), + ]; + } + + protected function getType(): string + { + return 'line'; + } + + protected function getOptions(): RawJs + { + // TODO: use "panel.use_binary_prefix" config value + return RawJs::make(<<<'JS' + { + scales: { + x: { + display: false, + }, + y: { + min: 0, + ticks: { + display: true, + callback(value) { + const bytes = typeof value === 'string' ? parseInt(value, 10) : value; + + if (bytes < 1) return '0 Bytes'; + + const i = Math.floor(Math.log(bytes) / Math.log(1024)); + const number = Number((bytes / Math.pow(1024, i)).toFixed(2)); + + return `${number} ${['Bytes', 'KiB', 'MiB', 'GiB', 'TiB'][i]}`; + }, + }, + }, + } + } + JS); + } + + public function getHeading(): string + { + $lastData = collect(cache()->get("servers.{$this->server->id}.network"))->last(); + + return trans('server/console.labels.network') . ' - ↓' . convert_bytes_to_readable($lastData->rx_bytes ?? 0) . ' - ↑' . convert_bytes_to_readable($lastData->tx_bytes ?? 0); + } +} diff --git a/app/Filament/Server/Widgets/ServerOverview.php b/app/Filament/Server/Widgets/ServerOverview.php new file mode 100644 index 0000000000..3bbffac6dd --- /dev/null +++ b/app/Filament/Server/Widgets/ServerOverview.php @@ -0,0 +1,91 @@ +server->name) + ->copyable(), + SmallStatBlock::make(trans('server/console.labels.status'), $this->status()), + SmallStatBlock::make(trans('server/console.labels.address'), $this->server?->allocation->address ?? 'None') + ->copyable(), + SmallStatBlock::make(trans('server/console.labels.cpu'), $this->cpuUsage()), + SmallStatBlock::make(trans('server/console.labels.memory'), $this->memoryUsage()), + SmallStatBlock::make(trans('server/console.labels.disk'), $this->diskUsage()), + ]; + } + + private function status(): string + { + $status = $this->server->condition->getLabel(); + $uptime = collect(cache()->get("servers.{$this->server->id}.uptime"))->last() ?? 0; + + if ($uptime === 0) { + return $status; + } + + $uptime = now()->subMillis($uptime)->diffForHumans(syntax: CarbonInterface::DIFF_ABSOLUTE, short: true, parts: 2); + + return "$status ($uptime)"; + } + + public function cpuUsage(): string + { + $status = $this->server->retrieveStatus(); + + if ($status->isOffline()) { + return ContainerStatus::Offline->getLabel(); + } + + $data = collect(cache()->get("servers.{$this->server->id}.cpu_absolute"))->last(default: 0); + $cpu = format_number($data, maxPrecision: 2) . ' %'; + + return $cpu . ($this->server->cpu > 0 ? ' / ' . format_number($this->server->cpu) . ' %' : ' / ∞'); + } + + public function memoryUsage(): string + { + $status = $this->server->retrieveStatus(); + + if ($status->isOffline()) { + return ContainerStatus::Offline->getLabel(); + } + + $latestMemoryUsed = collect(cache()->get("servers.{$this->server->id}.memory_bytes"))->last(default: 0); + $totalMemory = $this->server->memory * (config('panel.use_binary_prefix') ? 1024 * 1024 : 1000 * 1000); + + $used = convert_bytes_to_readable($latestMemoryUsed); + $total = convert_bytes_to_readable($totalMemory); + + return $used . ($this->server->memory > 0 ? ' / ' . $total : ' / ∞'); + } + + public function diskUsage(): string + { + $disk = collect(cache()->get("servers.{$this->server->id}.disk_bytes"))->last(default: 0); + + if ($disk === 0) { + return 'Unavailable'; + } + + $totalBytes = $this->server->disk * (config('panel.use_binary_prefix') ? 1024 * 1024 : 1000 * 1000); + + $used = convert_bytes_to_readable($disk); + $total = convert_bytes_to_readable($totalBytes); + + return $used . ($this->server->disk > 0 ? ' / ' . $total : ' / ∞'); + } +} diff --git a/app/Helpers/Time.php b/app/Helpers/Time.php deleted file mode 100644 index 62b829df4a..0000000000 --- a/app/Helpers/Time.php +++ /dev/null @@ -1,20 +0,0 @@ -getTimezone()->toOffsetName(); - } -} diff --git a/app/Helpers/Utilities.php b/app/Helpers/Utilities.php index e0c824d01a..cef0ccff26 100644 --- a/app/Helpers/Utilities.php +++ b/app/Helpers/Utilities.php @@ -4,6 +4,8 @@ use Carbon\Carbon; use Cron\CronExpression; +use Exception; +use Illuminate\Support\Str; use Illuminate\Support\ViewErrorBag; class Utilities @@ -14,7 +16,7 @@ class Utilities */ public static function randomStringWithSpecialCharacters(int $length = 16): string { - $string = str_random($length); + $string = Str::random($length); // Given a random string of characters, randomly loop through the characters and replace some // with special characters to avoid issues with MySQL password requirements on some servers. try { @@ -23,7 +25,7 @@ public static function randomStringWithSpecialCharacters(int $length = 16): stri $string = substr_replace($string, $character, random_int(0, $length - 1), 1); } - } catch (\Exception $exception) { + } catch (Exception $exception) { // Just log the error and hope for the best at this point. logger()->error($exception); } @@ -34,13 +36,13 @@ public static function randomStringWithSpecialCharacters(int $length = 16): stri /** * Converts schedule cron data into a carbon object. * - * @throws \Exception + * @throws Exception */ public static function getScheduleNextRunDate(string $minute, string $hour, string $dayOfMonth, string $month, string $dayOfWeek): Carbon { return Carbon::instance((new CronExpression( sprintf('%s %s %s %s %s', $minute, $hour, $dayOfMonth, $month, $dayOfWeek) - ))->getNextRunDate()); + ))->getNextRunDate(now('UTC'))); } public static function checked(string $name, mixed $default): string diff --git a/app/Http/Controllers/Admin/ApiController.php b/app/Http/Controllers/Admin/ApiController.php deleted file mode 100644 index e74dcc9918..0000000000 --- a/app/Http/Controllers/Admin/ApiController.php +++ /dev/null @@ -1,90 +0,0 @@ -user()->apiKeys() - ->where('key_type', ApiKey::TYPE_APPLICATION) - ->get(); - - return view('admin.api.index', [ - 'keys' => $keys, - ]); - } - - /** - * Render view allowing an admin to create a new application API key. - * - * @throws \ReflectionException - */ - public function create(): View - { - $resources = AdminAcl::getResourceList(); - sort($resources); - - return view('admin.api.new', [ - 'resources' => $resources, - 'permissions' => [ - 'r' => AdminAcl::READ, - 'rw' => AdminAcl::READ | AdminAcl::WRITE, - 'n' => AdminAcl::NONE, - ], - ]); - } - - /** - * Store the new key and redirect the user back to the application key listing. - * - * @throws \App\Exceptions\Model\DataValidationException - */ - public function store(StoreApplicationApiKeyRequest $request): RedirectResponse - { - $this->keyCreationService->setKeyType(ApiKey::TYPE_APPLICATION)->handle([ - 'memo' => $request->input('memo'), - 'user_id' => $request->user()->id, - ], $request->getKeyPermissions()); - - $this->alert->success('A new application API key has been generated for your account.')->flash(); - - return redirect()->route('admin.api.index'); - } - - /** - * Delete an application API key from the database. - */ - public function delete(Request $request, string $identifier): Response - { - $request->user()->apiKeys() - ->where('key_type', ApiKey::TYPE_APPLICATION) - ->where('identifier', $identifier) - ->delete(); - - return response('', 204); - } -} diff --git a/app/Http/Controllers/Admin/BaseController.php b/app/Http/Controllers/Admin/BaseController.php deleted file mode 100644 index 3db8aa1453..0000000000 --- a/app/Http/Controllers/Admin/BaseController.php +++ /dev/null @@ -1,25 +0,0 @@ - $this->version]); - } -} diff --git a/app/Http/Controllers/Admin/DatabaseController.php b/app/Http/Controllers/Admin/DatabaseController.php deleted file mode 100644 index a30b58feea..0000000000 --- a/app/Http/Controllers/Admin/DatabaseController.php +++ /dev/null @@ -1,126 +0,0 @@ -withCount('databases') - ->with('node') - ->get(); - - return view('admin.databases.index', [ - 'nodes' => Node::all(), - 'hosts' => $hosts, - ]); - } - - /** - * Display database host to user. - */ - public function view(DatabaseHost $host): View - { - $databases = $host->databases()->with('server')->paginate(25); - - return view('admin.databases.view', [ - 'nodes' => Node::all(), - 'host' => $host, - 'databases' => $databases, - ]); - } - - /** - * Handle request to create a new database host. - * - * @throws \Throwable - */ - public function create(DatabaseHostFormRequest $request): RedirectResponse - { - try { - $host = $this->creationService->handle($request->normalize()); - } catch (\Exception $exception) { - if ($exception instanceof \PDOException || $exception->getPrevious() instanceof \PDOException) { - $this->alert->danger( - sprintf('There was an error while trying to connect to the host or while executing a query: "%s"', $exception->getMessage()) - )->flash(); - - return redirect()->route('admin.databases')->withInput($request->validated()); - } else { - throw $exception; - } - } - - $this->alert->success('Successfully created a new database host on the system.')->flash(); - - return redirect()->route('admin.databases.view', $host->id); - } - - /** - * Handle updating database host. - * - * @throws \Throwable - */ - public function update(DatabaseHostFormRequest $request, DatabaseHost $host): RedirectResponse - { - $redirect = redirect()->route('admin.databases.view', $host->id); - - try { - $this->updateService->handle($host->id, $request->normalize()); - $this->alert->success('Database host was updated successfully.')->flash(); - } catch (\Exception $exception) { - // Catch any SQL related exceptions and display them back to the user, otherwise just - // throw the exception like normal and move on with it. - if ($exception instanceof \PDOException || $exception->getPrevious() instanceof \PDOException) { - $this->alert->danger( - sprintf('There was an error while trying to connect to the host or while executing a query: "%s"', $exception->getMessage()) - )->flash(); - - return $redirect->withInput($request->normalize()); - } else { - throw $exception; - } - } - - return $redirect; - } - - /** - * Handle request to delete a database host. - * - * @throws \App\Exceptions\Service\HasActiveServersException - */ - public function delete(int $host): RedirectResponse - { - $this->deletionService->handle($host); - $this->alert->success('The requested database host has been deleted from the system.')->flash(); - - return redirect()->route('admin.databases'); - } -} diff --git a/app/Http/Controllers/Admin/Eggs/EggController.php b/app/Http/Controllers/Admin/Eggs/EggController.php deleted file mode 100644 index 692ff79424..0000000000 --- a/app/Http/Controllers/Admin/Eggs/EggController.php +++ /dev/null @@ -1,144 +0,0 @@ - Egg::all(), - ]); - } - - /** - * Handle a request to display the Egg creation page. - */ - public function create(): View - { - $eggs = Egg::all(); - \JavaScript::put(['eggs' => $eggs->keyBy('id')]); - - return view('admin.eggs.new', ['eggs' => $eggs]); - } - - /** - * Handle request to store a new Egg. - * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\NoParentConfigurationFoundException - */ - public function store(EggFormRequest $request): RedirectResponse - { - $data = $request->validated(); - $data['docker_images'] = $this->normalizeDockerImages($data['docker_images'] ?? null); - $data['author'] = $request->user()->email; - - $data['config_from'] = array_get($data, 'config_from'); - if (!is_null($data['config_from'])) { - $parentEgg = Egg::query()->find(array_get($data, 'config_from')); - throw_unless($parentEgg, new NoParentConfigurationFoundException(trans('exceptions.egg.invalid_copy_id'))); - } - - $egg = Egg::query()->create(array_merge($data, [ - 'uuid' => Uuid::uuid4()->toString(), - ])); - - $this->alert->success(trans('admin/eggs.notices.egg_created'))->flash(); - - return redirect()->route('admin.eggs.view', $egg->id); - } - - /** - * Handle request to view a single Egg. - */ - public function view(Egg $egg): View - { - return view('admin.eggs.view', [ - 'egg' => $egg, - 'images' => array_map( - fn ($key, $value) => $key === $value ? $value : "$key|$value", - array_keys($egg->docker_images), - $egg->docker_images, - ), - ]); - } - - /** - * Handle request to update an Egg. - * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\NoParentConfigurationFoundException - */ - public function update(EggFormRequest $request, Egg $egg): RedirectResponse - { - $data = $request->validated(); - $data['docker_images'] = $this->normalizeDockerImages($data['docker_images'] ?? null); - - $eggId = array_get($data, 'config_from'); - $copiedFromEgg = Egg::query()->find($eggId); - - throw_unless($copiedFromEgg, new NoParentConfigurationFoundException(trans('exceptions.egg.invalid_copy_id'))); - - $egg->update($data); - - $this->alert->success(trans('admin/eggs.notices.updated'))->flash(); - - return redirect()->route('admin.eggs.view', $egg->id); - } - - /** - * Handle request to destroy an egg. - * - * @throws \App\Exceptions\Service\Egg\HasChildrenException - * @throws \App\Exceptions\Service\HasActiveServersException - */ - public function destroy(Egg $egg): RedirectResponse - { - $egg->delete(); - - $this->alert->success(trans('admin/eggs.notices.deleted'))->flash(); - - return redirect()->route('admin.eggs.view', $egg->id); - } - - /** - * Normalizes a string of docker image data into the expected egg format. - */ - protected function normalizeDockerImages(string $input = null): array - { - $data = array_map(fn ($value) => trim($value), explode("\n", $input ?? '')); - - $images = []; - // Iterate over the image data provided and convert it into a name => image - // pairing that is used to improve the display on the front-end. - foreach ($data as $value) { - $parts = explode('|', $value, 2); - $images[$parts[0]] = empty($parts[1]) ? $parts[0] : $parts[1]; - } - - return $images; - } -} diff --git a/app/Http/Controllers/Admin/Eggs/EggScriptController.php b/app/Http/Controllers/Admin/Eggs/EggScriptController.php deleted file mode 100644 index e12fde407f..0000000000 --- a/app/Http/Controllers/Admin/Eggs/EggScriptController.php +++ /dev/null @@ -1,61 +0,0 @@ -where('id', $egg) - ->firstOrFail(); - - $copy = Egg::query() - ->whereNull('copy_script_from') - ->whereNot('id', $egg->id) - ->firstOrFail(); - - $rely = Egg::query()->where('copy_script_from', $egg->id)->firstOrFail(); - - return view('admin.eggs.scripts', [ - 'copyFromOptions' => $copy, - 'relyOnScript' => $rely, - 'egg' => $egg, - ]); - } - - /** - * Handle a request to update the installation script for an Egg. - * - * @throws \App\Exceptions\Model\DataValidationException - */ - public function update(EggScriptFormRequest $request, Egg $egg): RedirectResponse - { - $this->installScriptService->handle($egg, $request->normalize()); - $this->alert->success(trans('admin/eggs.notices.script_updated'))->flash(); - - return redirect()->route('admin.eggs.scripts', $egg); - } -} diff --git a/app/Http/Controllers/Admin/Eggs/EggShareController.php b/app/Http/Controllers/Admin/Eggs/EggShareController.php deleted file mode 100644 index 993064b65c..0000000000 --- a/app/Http/Controllers/Admin/Eggs/EggShareController.php +++ /dev/null @@ -1,67 +0,0 @@ -name)), '-'); - - return response($this->exporterService->handle($egg->id), 200, [ - 'Content-Transfer-Encoding' => 'binary', - 'Content-Description' => 'File Transfer', - 'Content-Disposition' => 'attachment; filename=egg-' . $filename . '.json', - 'Content-Type' => 'application/json', - ]); - } - - /** - * Import a new egg using an XML file. - * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\BadJsonFormatException - * @throws \App\Exceptions\Service\InvalidFileUploadException - */ - public function import(EggImportFormRequest $request): RedirectResponse - { - $egg = $this->importerService->fromFile($request->file('import_file')); - $this->alert->success(trans('admin/eggs.notices.imported'))->flash(); - - return redirect()->route('admin.eggs.view', ['egg' => $egg->id]); - } - - /** - * Update an existing Egg using a new imported file. - * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\BadJsonFormatException - * @throws \App\Exceptions\Service\InvalidFileUploadException - */ - public function update(EggImportFormRequest $request, Egg $egg): RedirectResponse - { - $this->importerService->fromFile($request->file('import_file'), $egg); - $this->alert->success(trans('admin/eggs.notices.updated_via_import'))->flash(); - - return redirect()->route('admin.eggs.view', ['egg' => $egg]); - } -} diff --git a/app/Http/Controllers/Admin/Eggs/EggVariableController.php b/app/Http/Controllers/Admin/Eggs/EggVariableController.php deleted file mode 100644 index db49874716..0000000000 --- a/app/Http/Controllers/Admin/Eggs/EggVariableController.php +++ /dev/null @@ -1,83 +0,0 @@ -findOrFail($egg); - - return view('admin.eggs.variables', ['egg' => $egg]); - } - - /** - * Handle a request to create a new Egg variable. - * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\Variable\BadValidationRuleException - * @throws \App\Exceptions\Service\Egg\Variable\ReservedVariableNameException - */ - public function store(EggVariableFormRequest $request, Egg $egg): RedirectResponse - { - $this->creationService->handle($egg->id, $request->normalize()); - $this->alert->success(trans('admin/eggs.variables.notices.variable_created'))->flash(); - - return redirect()->route('admin.eggs.variables', $egg->id); - } - - /** - * Handle a request to update an existing Egg variable. - * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\Variable\ReservedVariableNameException - */ - public function update(EggVariableFormRequest $request, Egg $egg, EggVariable $variable): RedirectResponse - { - $this->updateService->handle($variable, $request->normalize()); - $this->alert->success(trans('admin/eggs.variables.notices.variable_updated', [ - 'variable' => $variable->name, - ]))->flash(); - - return redirect()->route('admin.eggs.variables', $egg->id); - } - - /** - * Handle a request to delete an existing Egg variable from the Panel. - */ - public function destroy(int $egg, EggVariable $variable): RedirectResponse - { - $variable->delete(); - $this->alert->success(trans('admin/eggs.variables.notices.variable_deleted', [ - 'variable' => $variable->name, - ]))->flash(); - - return redirect()->route('admin.eggs.variables', $egg); - } -} diff --git a/app/Http/Controllers/Admin/NodeAutoDeployController.php b/app/Http/Controllers/Admin/NodeAutoDeployController.php deleted file mode 100644 index 1029706c35..0000000000 --- a/app/Http/Controllers/Admin/NodeAutoDeployController.php +++ /dev/null @@ -1,62 +0,0 @@ -user()->apiKeys() - ->where('key_type', ApiKey::TYPE_APPLICATION) - ->get(); - - /** @var ApiKey|null $key */ - $key = $keys - ->filter(function (ApiKey $key) { - foreach ($key->getAttributes() as $permission => $value) { - if ($permission === 'r_nodes' && $value === 1) { - return true; - } - } - - return false; - }) - ->first(); - - // We couldn't find a key that exists for this user with only permission for - // reading nodes. Go ahead and create it now. - if (!$key) { - $key = $this->keyCreationService->setKeyType(ApiKey::TYPE_APPLICATION)->handle([ - 'user_id' => $request->user()->id, - 'memo' => 'Automatically generated node deployment key.', - 'allowed_ips' => [], - ], ['r_nodes' => 1]); - } - - return new JsonResponse([ - 'node' => $node->id, - 'token' => $key->identifier . $key->token, - ]); - } -} diff --git a/app/Http/Controllers/Admin/Nodes/NodeController.php b/app/Http/Controllers/Admin/Nodes/NodeController.php deleted file mode 100644 index f4d7982cf9..0000000000 --- a/app/Http/Controllers/Admin/Nodes/NodeController.php +++ /dev/null @@ -1,26 +0,0 @@ -withCount('servers') - ) - ->allowedFilters(['uuid', 'name']) - ->allowedSorts(['id']) - ->paginate(25); - - return view('admin.nodes.index', ['nodes' => $nodes]); - } -} diff --git a/app/Http/Controllers/Admin/Nodes/NodeViewController.php b/app/Http/Controllers/Admin/Nodes/NodeViewController.php deleted file mode 100644 index 95dc7ede0a..0000000000 --- a/app/Http/Controllers/Admin/Nodes/NodeViewController.php +++ /dev/null @@ -1,100 +0,0 @@ -loadCount('servers'); - - return view('admin.nodes.view.index', [ - 'node' => $node, - 'version' => $this->versionService, - ]); - } - - /** - * Returns the settings page for a specific node. - */ - public function settings(Node $node): View - { - return view('admin.nodes.view.settings', [ - 'node' => $node, - ]); - } - - /** - * Return the node configuration page for a specific node. - */ - public function configuration(Node $node): View - { - return view('admin.nodes.view.configuration', compact('node')); - } - - /** - * Return the node allocation management page. - */ - public function allocations(Node $node): View - { - $node->setRelation( - 'allocations', - $node->allocations() - ->orderByRaw('server_id IS NOT NULL DESC, server_id IS NULL') - ->orderByRaw('INET_ATON(ip) ASC') - ->orderBy('port') - ->with('server:id,name') - ->paginate(50) - ); - - $this->plainInject(['node' => Collection::wrap($node)->only(['id'])]); - - return view('admin.nodes.view.allocation', [ - 'node' => $node, - 'allocations' => Allocation::query()->where('node_id', $node->id) - ->groupBy('ip') - ->orderByRaw('INET_ATON(ip) ASC') - ->get(['ip']), - ]); - } - - /** - * Return a listing of servers that exist for this specific node. - */ - public function servers(Node $node): View - { - $this->plainInject([ - 'node' => Collection::wrap($node->makeVisible(['daemon_token_id', 'daemon_token'])) - ->only(['scheme', 'fqdn', 'daemon_listen', 'daemon_token_id', 'daemon_token']), - ]); - - return view('admin.nodes.view.servers', [ - 'node' => $node, - 'servers' => $node->servers()->with(['user', 'egg'])->paginate(25), - ]); - } -} diff --git a/app/Http/Controllers/Admin/Nodes/SystemInformationController.php b/app/Http/Controllers/Admin/Nodes/SystemInformationController.php deleted file mode 100644 index 33c1264046..0000000000 --- a/app/Http/Controllers/Admin/Nodes/SystemInformationController.php +++ /dev/null @@ -1,40 +0,0 @@ -repository->setNode($node)->getSystemInformation(); - - return new JsonResponse([ - 'version' => $data['version'] ?? '', - 'system' => [ - 'type' => Str::title($data['os'] ?? 'Unknown'), - 'arch' => $data['architecture'] ?? '--', - 'release' => $data['kernel_version'] ?? '--', - 'cpus' => $data['cpu_count'] ?? 0, - ], - ]); - } -} diff --git a/app/Http/Controllers/Admin/NodesController.php b/app/Http/Controllers/Admin/NodesController.php deleted file mode 100644 index 66ba487f6d..0000000000 --- a/app/Http/Controllers/Admin/NodesController.php +++ /dev/null @@ -1,165 +0,0 @@ -creationService->handle($request->normalize()); - $this->alert->info(trans('admin/node.notices.node_created'))->flash(); - - return redirect()->route('admin.nodes.view.allocation', $node->id); - } - - /** - * Updates settings for a node. - * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - */ - public function updateSettings(NodeFormRequest $request, Node $node): RedirectResponse - { - $this->updateService->handle($node, $request->normalize(), $request->input('reset_secret') === 'on'); - $this->alert->success(trans('admin/node.notices.node_updated'))->flash(); - - return redirect()->route('admin.nodes.view.settings', $node->id)->withInput(); - } - - /** - * Removes a single allocation from a node. - * - * @throws \App\Exceptions\Service\Allocation\ServerUsingAllocationException - */ - public function allocationRemoveSingle(int $node, Allocation $allocation): Response - { - $allocation->delete(); - - return response('', 204); - } - - /** - * Removes multiple individual allocations from a node. - * - * @throws \App\Exceptions\Service\Allocation\ServerUsingAllocationException - */ - public function allocationRemoveMultiple(Request $request, int $node): Response - { - $allocations = $request->input('allocations'); - foreach ($allocations as $rawAllocation) { - $allocation = new Allocation(); - $allocation->id = $rawAllocation['id']; - $this->allocationRemoveSingle($node, $allocation); - } - - return response('', 204); - } - - /** - * Remove all allocations for a specific IP at once on a node. - */ - public function allocationRemoveBlock(Request $request, int $node): RedirectResponse - { - /** @var Node $node */ - $node = Node::query()->findOrFail($node); - $node->allocations() - ->where('ip', $request->input('ip')) - ->whereNull('server_id') - ->delete(); - - $this->alert->success(trans('admin/node.notices.unallocated_deleted', ['ip' => $request->input('ip')])) - ->flash(); - - return redirect()->route('admin.nodes.view.allocation', $node); - } - - /** - * Sets an alias for a specific allocation on a node. - * - * @throws \App\Exceptions\Model\DataValidationException - */ - public function allocationSetAlias(AllocationAliasFormRequest $request): \Symfony\Component\HttpFoundation\Response - { - $allocation = Allocation::query()->findOrFail($request->input('allocation_id')); - $alias = (empty($request->input('alias'))) ? null : $request->input('alias'); - $allocation->update(['ip_alias' => $alias]); - - return response('', 204); - } - - /** - * Creates new allocations on a node. - * - * @throws \App\Exceptions\Service\Allocation\CidrOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\InvalidPortMappingException - * @throws \App\Exceptions\Service\Allocation\PortOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\TooManyPortsInRangeException - */ - public function createAllocation(AllocationFormRequest $request, Node $node): RedirectResponse - { - $this->assignmentService->handle($node, $request->normalize()); - $this->alert->success(trans('admin/node.notices.allocations_added'))->flash(); - - return redirect()->route('admin.nodes.view.allocation', $node->id); - } - - /** - * Deletes a node from the system. - * - * @throws \App\Exceptions\DisplayException - */ - public function delete(int|Node $node): RedirectResponse - { - $this->deletionService->handle($node); - $this->alert->success(trans('admin/node.notices.node_deleted'))->flash(); - - return redirect()->route('admin.nodes'); - } -} diff --git a/app/Http/Controllers/Admin/Servers/CreateServerController.php b/app/Http/Controllers/Admin/Servers/CreateServerController.php deleted file mode 100644 index c59e22fbeb..0000000000 --- a/app/Http/Controllers/Admin/Servers/CreateServerController.php +++ /dev/null @@ -1,72 +0,0 @@ -alert->warning(trans('admin/server.alerts.node_required'))->flash(); - - return redirect()->route('admin.nodes'); - } - - $eggs = Egg::with('variables')->get(); - - \JavaScript::put([ - 'nodeData' => Node::getForServerCreation(), - 'eggs' => $eggs->keyBy('id'), - ]); - - return view('admin.servers.new', [ - 'eggs' => $eggs, - 'nodes' => Node::all(), - ]); - } - - /** - * Create a new server on the remote system. - * - * @throws \Illuminate\Validation\ValidationException - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Service\Deployment\NoViableAllocationException - * @throws \Throwable - */ - public function store(ServerFormRequest $request): RedirectResponse - { - $data = $request->except(['_token']); - if (!empty($data['custom_image'])) { - $data['image'] = $data['custom_image']; - unset($data['custom_image']); - } - - $server = $this->creationService->handle($data); - - $this->alert->success(trans('admin/server.alerts.server_created'))->flash(); - - return new RedirectResponse('/admin/servers/view/' . $server->id); - } -} diff --git a/app/Http/Controllers/Admin/Servers/ServerController.php b/app/Http/Controllers/Admin/Servers/ServerController.php deleted file mode 100644 index 5e4595225a..0000000000 --- a/app/Http/Controllers/Admin/Servers/ServerController.php +++ /dev/null @@ -1,29 +0,0 @@ -with('node', 'user', 'allocation')) - ->allowedFilters([ - AllowedFilter::exact('owner_id'), - AllowedFilter::custom('*', new AdminServerFilter()), - ]) - ->paginate(config()->get('panel.paginate.admin.servers')); - - return view('admin.servers.index', ['servers' => $servers]); - } -} diff --git a/app/Http/Controllers/Admin/Servers/ServerTransferController.php b/app/Http/Controllers/Admin/Servers/ServerTransferController.php deleted file mode 100644 index 9fdaa7bf8e..0000000000 --- a/app/Http/Controllers/Admin/Servers/ServerTransferController.php +++ /dev/null @@ -1,44 +0,0 @@ -validate([ - 'node_id' => 'required|exists:nodes,id', - 'allocation_id' => 'required|bail|unique:servers|exists:allocations,id', - 'allocation_additional' => 'nullable', - ]); - - if ($this->transferServerService->handle($server, $validatedData)) { - $this->alert->success(trans('admin/server.alerts.transfer_started'))->flash(); - } else { - $this->alert->danger(trans('admin/server.alerts.transfer_not_viable'))->flash(); - } - - return redirect()->route('admin.servers.view.manage', $server->id); - } -} diff --git a/app/Http/Controllers/Admin/Servers/ServerViewController.php b/app/Http/Controllers/Admin/Servers/ServerViewController.php deleted file mode 100644 index 594022a978..0000000000 --- a/app/Http/Controllers/Admin/Servers/ServerViewController.php +++ /dev/null @@ -1,142 +0,0 @@ -node->allocations->toBase(); - - return view('admin.servers.view.build', [ - 'server' => $server, - 'assigned' => $allocations->where('server_id', $server->id)->sortBy('port')->sortBy('ip'), - 'unassigned' => $allocations->where('server_id', null)->sortBy('port')->sortBy('ip'), - ]); - } - - /** - * Returns the server startup management page. - */ - public function startup(Server $server): View - { - $variables = $this->environmentService->handle($server); - $eggs = Egg::all()->keyBy('id'); - - $this->plainInject([ - 'server' => $server, - 'server_variables' => $variables, - 'eggs' => $eggs, - ]); - - return view('admin.servers.view.startup', compact('server', 'eggs')); - } - - /** - * Returns all the databases that exist for the server. - */ - public function database(Server $server): View - { - return view('admin.servers.view.database', [ - 'hosts' => DatabaseHost::all(), - 'server' => $server, - ]); - } - - /** - * Returns all the mounts that exist for the server. - */ - public function mounts(Server $server): View - { - $server->load('mounts'); - - $mounts = Mount::query() - ->whereHas('eggs', fn ($q) => $q->where('id', $server->egg_id)) - ->whereHas('nodes', fn ($q) => $q->where('id', $server->node_id)) - ->get(); - - return view('admin.servers.view.mounts', [ - 'mounts' => $mounts, - 'server' => $server, - ]); - } - - /** - * Returns the base server management page, or an exception if the server - * is in a state that cannot be recovered from. - * - * @throws \App\Exceptions\DisplayException - */ - public function manage(Server $server): View - { - if ($server->status === ServerState::InstallFailed) { - throw new DisplayException('This server is in a failed install state and cannot be recovered. Please delete and re-create the server.'); - } - - // Check if the panel doesn't have at least 2 nodes configured. - $nodeCount = Node::query()->count(); - $canTransfer = false; - if ($nodeCount >= 2) { - $canTransfer = true; - } - - \JavaScript::put([ - 'nodeData' => Node::getForServerCreation(), - ]); - - return view('admin.servers.view.manage', [ - 'nodes' => Node::all(), - 'server' => $server, - 'canTransfer' => $canTransfer, - ]); - } - - /** - * Returns the server deletion page. - */ - public function delete(Server $server): View - { - return view('admin.servers.view.delete', compact('server')); - } -} diff --git a/app/Http/Controllers/Admin/ServersController.php b/app/Http/Controllers/Admin/ServersController.php deleted file mode 100644 index 9ddd9c7e61..0000000000 --- a/app/Http/Controllers/Admin/ServersController.php +++ /dev/null @@ -1,256 +0,0 @@ -detailsModificationService->handle($server, $request->only([ - 'owner_id', 'external_id', 'name', 'description', - ])); - - $this->alert->success(trans('admin/server.alerts.details_updated'))->flash(); - - return redirect()->route('admin.servers.view.details', $server->id); - } - - /** - * Toggles the installation status for a server. - * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - */ - public function toggleInstall(Server $server) - { - if ($server->status === ServerState::InstallFailed) { - throw new DisplayException(trans('admin/server.exceptions.marked_as_failed')); - } - - $server->status = $server->isInstalled() ? ServerState::Installing : null; - $server->save(); - - Notification::make() - ->title('Success!') - ->body(trans('admin/server.alerts.install_toggled')) - ->success() - ->send(); - - return null; - } - - /** - * Reinstalls the server with the currently assigned service. - * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - */ - public function reinstallServer(Server $server) - { - $this->reinstallService->handle($server); - - Notification::make() - ->title('Success!') - ->body(trans('admin/server.alerts.server_reinstalled')) - ->success() - ->send(); - } - - /** - * Manage the suspension status for a server. - * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - */ - public function manageSuspension(Request $request, Server $server): RedirectResponse - { - $this->suspensionService->toggle($server, $request->input('action')); - $this->alert->success(trans('admin/server.alerts.suspension_toggled', [ - 'status' => $request->input('action') . 'ed', - ]))->flash(); - - return redirect()->route('admin.servers.view.manage', $server->id); - } - - /** - * Update the build configuration for a server. - * - * @throws \App\Exceptions\DisplayException - * @throws \Illuminate\Validation\ValidationException - */ - public function updateBuild(Request $request, Server $server): RedirectResponse - { - try { - $this->buildModificationService->handle($server, $request->only([ - 'allocation_id', 'add_allocations', 'remove_allocations', - 'memory', 'swap', 'io', 'cpu', 'threads', 'disk', - 'database_limit', 'allocation_limit', 'backup_limit', 'oom_killer', - ])); - } catch (DataValidationException $exception) { - throw new ValidationException($exception->getValidator()); - } - - $this->alert->success(trans('admin/server.alerts.build_updated'))->flash(); - - return redirect()->route('admin.servers.view.build', $server->id); - } - - /** - * Start the server deletion process. - * - * @throws \App\Exceptions\DisplayException - * @throws \Throwable - */ - public function delete(Request $request, Server $server): RedirectResponse - { - $this->deletionService->withForce($request->filled('force_delete'))->handle($server); - $this->alert->success(trans('admin/server.alerts.server_deleted'))->flash(); - - return redirect()->route('admin.servers'); - } - - /** - * Update the startup command as well as variables. - * - * @throws \Illuminate\Validation\ValidationException - */ - public function saveStartup(Request $request, Server $server): RedirectResponse - { - $data = $request->except('_token'); - if (!empty($data['custom_docker_image'])) { - $data['docker_image'] = $data['custom_docker_image']; - unset($data['custom_docker_image']); - } - - try { - $this->startupModificationService - ->setUserLevel(User::USER_LEVEL_ADMIN) - ->handle($server, $data); - } catch (DataValidationException $exception) { - throw new ValidationException($exception->getValidator()); - } - - $this->alert->success(trans('admin/server.alerts.startup_changed'))->flash(); - - return redirect()->route('admin.servers.view.startup', $server->id); - } - - /** - * Creates a new database assigned to a specific server. - * - * @throws \Throwable - */ - public function newDatabase(StoreServerDatabaseRequest $request, Server $server): RedirectResponse - { - $this->databaseManagementService->create($server, [ - 'database' => DatabaseManagementService::generateUniqueDatabaseName($request->input('database'), $server->id), - 'remote' => $request->input('remote'), - 'database_host_id' => $request->input('database_host_id'), - 'max_connections' => $request->input('max_connections'), - ]); - - return redirect()->route('admin.servers.view.database', $server->id)->withInput(); - } - - /** - * Resets the database password for a specific database on this server. - * - * @throws \Throwable - */ - public function resetDatabasePassword(Request $request, Server $server): Response - { - /** @var \App\Models\Database $database */ - $database = $server->databases()->findOrFail($request->input('database')); - - $this->databasePasswordService->handle($database); - - return response('', 204); - } - - /** - * Deletes a database from a server. - * - * @throws \Exception - */ - public function deleteDatabase(Server $server, Database $database): Response - { - $this->databaseManagementService->delete($database); - - return response('', 204); - } - - /** - * Add a mount to a server. - * - * @throws \Throwable - */ - public function addMount(Request $request, Server $server): RedirectResponse - { - $server->mounts()->attach($request->input('mount_id')); - - $this->alert->success('Mount was added successfully.')->flash(); - - return redirect()->route('admin.servers.view.mounts', $server->id); - } - - /** - * Remove a mount from a server. - */ - public function deleteMount(Server $server, Mount $mount): RedirectResponse - { - $server->mounts()->detach($mount); - - $this->alert->success('Mount was removed successfully.')->flash(); - - return redirect()->route('admin.servers.view.mounts', $server->id); - } -} diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php deleted file mode 100644 index d69dc4301c..0000000000 --- a/app/Http/Controllers/Admin/UserController.php +++ /dev/null @@ -1,146 +0,0 @@ -select('users.*') - ->selectRaw('COUNT(DISTINCT(subusers.id)) as subuser_of_count') - ->selectRaw('COUNT(DISTINCT(servers.id)) as servers_count') - ->leftJoin('subusers', 'subusers.user_id', '=', 'users.id') - ->leftJoin('servers', 'servers.owner_id', '=', 'users.id') - ->groupBy('users.id') - ) - ->allowedFilters(['username', 'email', 'uuid']) - ->allowedSorts(['id', 'uuid']) - ->paginate(50); - - return view('admin.users.index', ['users' => $users]); - } - - /** - * Display new user page. - */ - public function create(): View - { - return view('admin.users.new', [ - 'languages' => $this->getAvailableLanguages(), - ]); - } - - /** - * Display user view page. - */ - public function view(User $user): View - { - return view('admin.users.view', [ - 'user' => $user, - 'languages' => $this->getAvailableLanguages(), - ]); - } - - /** - * Delete a user from the system. - * - * @throws \Exception - * @throws \App\Exceptions\DisplayException - */ - public function delete(User $user): RedirectResponse - { - $user->delete(); - - return redirect()->route('admin.users'); - } - - /** - * Create a user. - * - * @throws \Exception - * @throws \Throwable - */ - public function store(NewUserFormRequest $request): RedirectResponse - { - $user = $this->creationService->handle($request->normalize()); - $this->alert->success($this->translator->get('admin/user.notices.account_created'))->flash(); - - return redirect()->route('admin.users.view', $user->id); - } - - /** - * Update a user on the system. - * - * @throws \App\Exceptions\Model\DataValidationException - */ - public function update(UserFormRequest $request, User $user): RedirectResponse - { - $this->updateService - ->setUserLevel(User::USER_LEVEL_ADMIN) - ->handle($user, $request->normalize()); - - $this->alert->success(trans('admin/user.notices.account_updated'))->flash(); - - return redirect()->route('admin.users.view', $user->id); - } - - /** - * Get a JSON response of users on the system. - */ - public function json(Request $request): JsonResponse - { - // Handle single user requests | TODO: Separate this out into its own method - if ($userId = $request->query('user_id')) { - $user = User::query()->findOrFail($userId); - $user['md5'] = md5(strtolower($user->email)); - - return response()->json($user); - } - - // Handle all users list - $userPaginator = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25); - - /** @var User[] $users */ - $users = $userPaginator->items(); - - return response()->json(collect($users)->map(function (User $user) { - $user['md5'] = md5(strtolower($user->email)); - - return $user; - })); - } -} diff --git a/app/Http/Controllers/Api/Application/ApplicationApiController.php b/app/Http/Controllers/Api/Application/ApplicationApiController.php index 174e6243a4..9caac19822 100644 --- a/app/Http/Controllers/Api/Application/ApplicationApiController.php +++ b/app/Http/Controllers/Api/Application/ApplicationApiController.php @@ -2,14 +2,14 @@ namespace App\Http\Controllers\Api\Application; +use App\Extensions\Spatie\Fractalistic\Fractal; +use App\Http\Controllers\Controller; +use App\Transformers\Api\Application\BaseTransformer; +use Illuminate\Container\Container; use Illuminate\Http\Request; -use Webmozart\Assert\Assert; use Illuminate\Http\Response; use Illuminate\Support\Collection; -use Illuminate\Container\Container; -use App\Http\Controllers\Controller; -use App\Extensions\Spatie\Fractalistic\Fractal; -use App\Transformers\Api\Application\BaseTransformer; +use Webmozart\Assert\Assert; abstract class ApplicationApiController extends Controller { @@ -40,7 +40,7 @@ public function __construct() * Perform dependency injection of certain classes needed for core functionality * without littering the constructors of classes that extend this abstract. */ - public function loadDependencies(Fractal $fractal, Request $request) + public function loadDependencies(Fractal $fractal, Request $request): void { $this->fractal = $fractal; $this->request = $request; @@ -51,8 +51,7 @@ public function loadDependencies(Fractal $fractal, Request $request) * * @template T of \App\Transformers\Api\Application\BaseTransformer * - * @param class-string $abstract - * + * @param class-string $abstract * @return T * * @noinspection PhpDocSignatureInspection @@ -71,4 +70,12 @@ protected function returnNoContent(): Response { return new Response('', Response::HTTP_NO_CONTENT); } + + /** + * Return an HTTP/406 response for the API. + */ + protected function returnNotAcceptable(): Response + { + return new Response('', Response::HTTP_NOT_ACCEPTABLE); + } } diff --git a/app/Http/Controllers/Api/Application/DatabaseHosts/DatabaseHostController.php b/app/Http/Controllers/Api/Application/DatabaseHosts/DatabaseHostController.php index 58c46c4940..08e01a3545 100644 --- a/app/Http/Controllers/Api/Application/DatabaseHosts/DatabaseHostController.php +++ b/app/Http/Controllers/Api/Application/DatabaseHosts/DatabaseHostController.php @@ -2,18 +2,20 @@ namespace App\Http\Controllers\Api\Application\DatabaseHosts; -use Illuminate\Http\Response; -use Illuminate\Http\JsonResponse; -use App\Models\DatabaseHost; -use Spatie\QueryBuilder\QueryBuilder; -use App\Services\Databases\Hosts\HostUpdateService; -use App\Services\Databases\Hosts\HostCreationService; -use App\Transformers\Api\Application\DatabaseHostTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\DatabaseHosts\DeleteDatabaseHostRequest; use App\Http\Requests\Api\Application\DatabaseHosts\GetDatabaseHostRequest; use App\Http\Requests\Api\Application\DatabaseHosts\StoreDatabaseHostRequest; -use App\Http\Requests\Api\Application\DatabaseHosts\DeleteDatabaseHostRequest; use App\Http\Requests\Api\Application\DatabaseHosts\UpdateDatabaseHostRequest; +use App\Models\DatabaseHost; +use App\Services\Databases\Hosts\HostCreationService; +use App\Services\Databases\Hosts\HostUpdateService; +use App\Transformers\Api\Application\DatabaseHostTransformer; +use Exception; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Spatie\QueryBuilder\QueryBuilder; +use Throwable; class DatabaseHostController extends ApplicationApiController { @@ -28,11 +30,15 @@ public function __construct( } /** + * List database hosts + * * Return all the database hosts currently registered on the Panel. + * + * @return array */ public function index(GetDatabaseHostRequest $request): array { - $databases = QueryBuilder::for(DatabaseHost::query()) + $databases = QueryBuilder::for(DatabaseHost::class) ->allowedFilters(['name', 'host']) ->allowedSorts(['id', 'name', 'host']) ->paginate($request->query('per_page') ?? 10); @@ -43,7 +49,11 @@ public function index(GetDatabaseHostRequest $request): array } /** + * View database host + * * Return a single database host. + * + * @return array */ public function view(GetDatabaseHostRequest $request, DatabaseHost $databaseHost): array { @@ -53,10 +63,12 @@ public function view(GetDatabaseHostRequest $request, DatabaseHost $databaseHost } /** + * Create database host + * * Store a new database host on the Panel and return an HTTP/201 response code with the * new database host attached. * - * @throws \Throwable + * @throws Throwable */ public function store(StoreDatabaseHostRequest $request): JsonResponse { @@ -65,7 +77,7 @@ public function store(StoreDatabaseHostRequest $request): JsonResponse return $this->fractal->item($databaseHost) ->transformWith($this->getTransformer(DatabaseHostTransformer::class)) ->addMeta([ - 'resource' => route('api.application.databases.view', [ + 'resource' => route('api.application.databasehosts.view', [ 'database_host' => $databaseHost->id, ]), ]) @@ -73,9 +85,13 @@ public function store(StoreDatabaseHostRequest $request): JsonResponse } /** + * Update database host + * * Update a database host on the Panel and return the updated record to the user. * - * @throws \Throwable + * @return array + * + * @throws Throwable */ public function update(UpdateDatabaseHostRequest $request, DatabaseHost $databaseHost): array { @@ -87,9 +103,11 @@ public function update(UpdateDatabaseHostRequest $request, DatabaseHost $databas } /** + * Delete database host + * * Delete a database host from the Panel. * - * @throws \Exception + * @throws Exception */ public function delete(DeleteDatabaseHostRequest $request, DatabaseHost $databaseHost): Response { diff --git a/app/Http/Controllers/Api/Application/Eggs/EggController.php b/app/Http/Controllers/Api/Application/Eggs/EggController.php index a1b3ca9d0d..c3ce0c0266 100644 --- a/app/Http/Controllers/Api/Application/Eggs/EggController.php +++ b/app/Http/Controllers/Api/Application/Eggs/EggController.php @@ -2,16 +2,37 @@ namespace App\Http\Controllers\Api\Application\Eggs; +use App\Enums\EggFormat; use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Eggs\ExportEggRequest; use App\Http\Requests\Api\Application\Eggs\GetEggRequest; use App\Http\Requests\Api\Application\Eggs\GetEggsRequest; +use App\Http\Requests\Api\Application\Eggs\ImportEggRequest; use App\Models\Egg; +use App\Services\Eggs\Sharing\EggExporterService; +use App\Services\Eggs\Sharing\EggImporterService; use App\Transformers\Api\Application\EggTransformer; +use Exception; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Symfony\Component\HttpFoundation\StreamedResponse; +use Throwable; class EggController extends ApplicationApiController { + public function __construct( + private EggExporterService $exporterService, + private EggImporterService $importService + ) { + parent::__construct(); + } + /** + * List eggs + * * Return all eggs + * + * @return array */ public function index(GetEggsRequest $request): array { @@ -21,7 +42,11 @@ public function index(GetEggsRequest $request): array } /** + * View egg + * * Return a single egg that exists + * + * @return array */ public function view(GetEggRequest $request, Egg $egg): array { @@ -29,4 +54,52 @@ public function view(GetEggRequest $request, Egg $egg): array ->transformWith($this->getTransformer(EggTransformer::class)) ->toArray(); } + + /** + * Delete egg + * + * Delete an egg from the Panel. + * + * @throws Exception + */ + public function delete(GetEggRequest $request, Egg $egg): Response + { + $egg->delete(); + + return $this->returnNoContent(); + } + + /** + * Export egg + * + * Return a single egg as yaml or json file (defaults to YAML) + */ + public function export(ExportEggRequest $request, Egg $egg): StreamedResponse + { + $format = EggFormat::tryFrom($request->input('format')) ?? EggFormat::YAML; + + return response()->streamDownload(function () use ($egg, $format) { + echo $this->exporterService->handle($egg->id, $format); + }, 'egg-' . $egg->getKebabName() . '.' . $format->value, [ + 'Content-Type' => 'application/' . $format->value, + ]); + } + + /** + * Import egg + * + * Create a new egg on the Panel. Returns the created egg and an HTTP/201 status response on success + * If no uuid is supplied a new one will be generated + * If an uuid is supplied, and it already exists the old configuration get overwritten + * + * @throws Exception|Throwable + */ + public function import(ImportEggRequest $request): JsonResponse + { + $egg = $this->importService->fromContent($request->getContent()); + + return $this->fractal->item($egg) + ->transformWith($this->getTransformer(EggTransformer::class)) + ->respond(201); + } } diff --git a/app/Http/Controllers/Api/Application/Mounts/MountController.php b/app/Http/Controllers/Api/Application/Mounts/MountController.php index 55bcc16040..fe55b5f355 100644 --- a/app/Http/Controllers/Api/Application/Mounts/MountController.php +++ b/app/Http/Controllers/Api/Application/Mounts/MountController.php @@ -2,37 +2,39 @@ namespace App\Http\Controllers\Api\Application\Mounts; -use Ramsey\Uuid\Uuid; -use Illuminate\Http\Request; -use Illuminate\Http\JsonResponse; -use Illuminate\Contracts\Translation\Translator; -use Spatie\QueryBuilder\QueryBuilder; -use App\Models\Mount; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\HasActiveServersException; use App\Http\Controllers\Api\Application\ApplicationApiController; -use App\Transformers\Api\Application\MountTransformer; +use App\Http\Requests\Api\Application\Eggs\GetEggsRequest; +use App\Http\Requests\Api\Application\Mounts\DeleteMountRequest; use App\Http\Requests\Api\Application\Mounts\GetMountRequest; use App\Http\Requests\Api\Application\Mounts\StoreMountRequest; -use App\Http\Requests\Api\Application\Mounts\DeleteMountRequest; use App\Http\Requests\Api\Application\Mounts\UpdateMountRequest; -use App\Exceptions\Service\HasActiveServersException; +use App\Http\Requests\Api\Application\Nodes\GetNodesRequest; +use App\Http\Requests\Api\Application\Servers\GetServerRequest; +use App\Models\Mount; +use App\Transformers\Api\Application\EggTransformer; +use App\Transformers\Api\Application\MountTransformer; +use App\Transformers\Api\Application\NodeTransformer; +use App\Transformers\Api\Application\ServerTransformer; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Ramsey\Uuid\Uuid; +use Spatie\QueryBuilder\QueryBuilder; +use Throwable; class MountController extends ApplicationApiController { /** - * MountController constructor. - */ - public function __construct( - protected Translator $translator - ) { - parent::__construct(); - } - - /** + * List mounts + * * Return all the mounts currently available on the Panel. + * + * @return array */ public function index(GetMountRequest $request): array { - $mounts = QueryBuilder::for(Mount::query()) + $mounts = QueryBuilder::for(Mount::class) ->allowedFilters(['uuid', 'name']) ->allowedSorts(['id', 'uuid']) ->paginate($request->query('per_page') ?? 50); @@ -43,7 +45,11 @@ public function index(GetMountRequest $request): array } /** + * View mount + * * Return data for a single instance of a mount. + * + * @return array */ public function view(GetMountRequest $request, Mount $mount): array { @@ -53,10 +59,12 @@ public function view(GetMountRequest $request, Mount $mount): array } /** + * Create mount + * * Create a new mount on the Panel. Returns the created mount and an HTTP/201 * status response on success. * - * @throws \App\Exceptions\Model\DataValidationException + * @throws DataValidationException */ public function store(StoreMountRequest $request): JsonResponse { @@ -77,9 +85,13 @@ public function store(StoreMountRequest $request): JsonResponse } /** + * Update mount + * * Update an existing mount on the Panel. * - * @throws \Throwable + * @return array + * + * @throws Throwable */ public function update(UpdateMountRequest $request, Mount $mount): array { @@ -91,15 +103,17 @@ public function update(UpdateMountRequest $request, Mount $mount): array } /** + * Delete mount + * * Deletes a given mount from the Panel as long as there are no servers * currently attached to it. * - * @throws \App\Exceptions\Service\HasActiveServersException + * @throws HasActiveServersException */ public function delete(DeleteMountRequest $request, Mount $mount): JsonResponse { if ($mount->servers()->count() > 0) { - throw new HasActiveServersException($this->translator->get('exceptions.mount.servers_attached')); + throw new HasActiveServersException(trans('exceptions.mount.servers_attached')); } $mount->delete(); @@ -108,18 +122,56 @@ public function delete(DeleteMountRequest $request, Mount $mount): JsonResponse } /** + * List assigned eggs + * + * @return array + */ + public function getEggs(GetEggsRequest $request, Mount $mount): array + { + return $this->fractal->collection($mount->eggs) + ->transformWith($this->getTransformer(EggTransformer::class)) + ->toArray(); + } + + /** + * List assigned nodes + * + * @return array + */ + public function getNodes(GetNodesRequest $request, Mount $mount): array + { + return $this->fractal->collection($mount->nodes) + ->transformWith($this->getTransformer(NodeTransformer::class)) + ->toArray(); + } + + /** + * List assigned servers + * + * @return array + */ + public function getServers(GetServerRequest $request, Mount $mount): array + { + return $this->fractal->collection($mount->servers) + ->transformWith($this->getTransformer(ServerTransformer::class)) + ->toArray(); + } + + /** + * Assign eggs to mount + * * Adds eggs to the mount's many-to-many relation. + * + * @return array */ public function addEggs(Request $request, Mount $mount): array { $validatedData = $request->validate([ - 'eggs' => 'required|exists:eggs,id', + 'eggs' => 'required|array|exists:eggs,id', + 'eggs.*' => 'integer', ]); - $eggs = $validatedData['eggs'] ?? []; - if (count($eggs) > 0) { - $mount->eggs()->attach($eggs); - } + $mount->eggs()->attach($validatedData['eggs']); return $this->fractal->item($mount) ->transformWith($this->getTransformer(MountTransformer::class)) @@ -127,16 +179,41 @@ public function addEggs(Request $request, Mount $mount): array } /** + * Assign nodes to mount + * * Adds nodes to the mount's many-to-many relation. + * + * @return array */ public function addNodes(Request $request, Mount $mount): array { - $data = $request->validate(['nodes' => 'required|exists:nodes,id']); + $validatedData = $request->validate([ + 'nodes' => 'required|array|exists:nodes,id', + 'nodes.*' => 'integer', + ]); - $nodes = $data['nodes'] ?? []; - if (count($nodes) > 0) { - $mount->nodes()->attach($nodes); - } + $mount->nodes()->attach($validatedData['nodes']); + + return $this->fractal->item($mount) + ->transformWith($this->getTransformer(MountTransformer::class)) + ->toArray(); + } + + /** + * Assign servers to mount + * + * Adds servers to the mount's many-to-many relation. + * + * @return array + */ + public function addServers(Request $request, Mount $mount): array + { + $validatedData = $request->validate([ + 'servers' => 'required|array|exists:servers,id', + 'servers.*' => 'integer', + ]); + + $mount->servers()->attach($validatedData['servers']); return $this->fractal->item($mount) ->transformWith($this->getTransformer(MountTransformer::class)) @@ -144,6 +221,8 @@ public function addNodes(Request $request, Mount $mount): array } /** + * Unassign egg from mount + * * Deletes an egg from the mount's many-to-many relation. */ public function deleteEgg(Mount $mount, int $egg_id): JsonResponse @@ -154,6 +233,8 @@ public function deleteEgg(Mount $mount, int $egg_id): JsonResponse } /** + * Unassign node from mount + * * Deletes a node from the mount's many-to-many relation. */ public function deleteNode(Mount $mount, int $node_id): JsonResponse @@ -162,4 +243,16 @@ public function deleteNode(Mount $mount, int $node_id): JsonResponse return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } + + /** + * Unassign server from mount + * + * Deletes a server from the mount's many-to-many relation. + */ + public function deleteServer(Mount $mount, int $server_id): JsonResponse + { + $mount->servers()->detach($server_id); + + return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); + } } diff --git a/app/Http/Controllers/Api/Application/Nodes/AllocationController.php b/app/Http/Controllers/Api/Application/Nodes/AllocationController.php index 18e2f5cfce..2654dd0a4e 100644 --- a/app/Http/Controllers/Api/Application/Nodes/AllocationController.php +++ b/app/Http/Controllers/Api/Application/Nodes/AllocationController.php @@ -2,19 +2,26 @@ namespace App\Http\Controllers\Api\Application\Nodes; -use App\Models\Node; -use Illuminate\Http\JsonResponse; -use App\Models\Allocation; -use Spatie\QueryBuilder\QueryBuilder; -use Spatie\QueryBuilder\AllowedFilter; -use Illuminate\Database\Eloquent\Builder; -use App\Services\Allocations\AssignmentService; -use App\Transformers\Api\Application\AllocationTransformer; +use App\Exceptions\DisplayException; +use App\Exceptions\Service\Allocation\CidrOutOfRangeException; +use App\Exceptions\Service\Allocation\InvalidPortMappingException; +use App\Exceptions\Service\Allocation\PortOutOfRangeException; +use App\Exceptions\Service\Allocation\TooManyPortsInRangeException; use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Allocations\DeleteAllocationRequest; use App\Http\Requests\Api\Application\Allocations\GetAllocationsRequest; use App\Http\Requests\Api\Application\Allocations\StoreAllocationRequest; -use App\Http\Requests\Api\Application\Allocations\DeleteAllocationRequest; +use App\Models\Allocation; +use App\Models\Node; +use App\Services\Allocations\AssignmentService; +use App\Transformers\Api\Application\AllocationTransformer; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Http\JsonResponse; +use Spatie\QueryBuilder\AllowedFilter; +use Spatie\QueryBuilder\QueryBuilder; +#[Group('Node - Allocation')] class AllocationController extends ApplicationApiController { /** @@ -27,7 +34,11 @@ public function __construct( } /** + * List allocations + * * Return all the allocations that exist for a given node. + * + * @return array */ public function index(GetAllocationsRequest $request, Node $node): array { @@ -52,13 +63,15 @@ public function index(GetAllocationsRequest $request, Node $node): array } /** + * Create allocation + * * Store new allocations for a given node. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Service\Allocation\CidrOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\InvalidPortMappingException - * @throws \App\Exceptions\Service\Allocation\PortOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\TooManyPortsInRangeException + * @throws DisplayException + * @throws CidrOutOfRangeException + * @throws InvalidPortMappingException + * @throws PortOutOfRangeException + * @throws TooManyPortsInRangeException */ public function store(StoreAllocationRequest $request, Node $node): JsonResponse { @@ -68,6 +81,8 @@ public function store(StoreAllocationRequest $request, Node $node): JsonResponse } /** + * Delete allocation + * * Delete a specific allocation from the Panel. */ public function delete(DeleteAllocationRequest $request, Node $node, Allocation $allocation): JsonResponse diff --git a/app/Http/Controllers/Api/Application/Nodes/NodeConfigurationController.php b/app/Http/Controllers/Api/Application/Nodes/NodeConfigurationController.php index 5638ff82f9..e54e7e5099 100644 --- a/app/Http/Controllers/Api/Application/Nodes/NodeConfigurationController.php +++ b/app/Http/Controllers/Api/Application/Nodes/NodeConfigurationController.php @@ -2,14 +2,18 @@ namespace App\Http\Controllers\Api\Application\Nodes; +use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Nodes\GetNodeRequest; use App\Models\Node; +use Dedoc\Scramble\Attributes\Group; use Illuminate\Http\JsonResponse; -use App\Http\Requests\Api\Application\Nodes\GetNodeRequest; -use App\Http\Controllers\Api\Application\ApplicationApiController; +#[Group('Node', weight: 1)] class NodeConfigurationController extends ApplicationApiController { /** + * Get node configuration + * * Returns the configuration information for a node. This allows for automated deployments * to remote machines so long as an API key is provided to the machine to make the request * with, and the node is known. diff --git a/app/Http/Controllers/Api/Application/Nodes/NodeController.php b/app/Http/Controllers/Api/Application/Nodes/NodeController.php index 8ca10f249e..cda25179e1 100644 --- a/app/Http/Controllers/Api/Application/Nodes/NodeController.php +++ b/app/Http/Controllers/Api/Application/Nodes/NodeController.php @@ -2,27 +2,31 @@ namespace App\Http\Controllers\Api\Application\Nodes; -use App\Models\Node; -use Illuminate\Http\JsonResponse; -use Spatie\QueryBuilder\QueryBuilder; -use App\Services\Nodes\NodeUpdateService; -use App\Services\Nodes\NodeCreationService; -use App\Services\Nodes\NodeDeletionService; -use App\Transformers\Api\Application\NodeTransformer; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\HasActiveServersException; +use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Nodes\DeleteNodeRequest; use App\Http\Requests\Api\Application\Nodes\GetNodeRequest; use App\Http\Requests\Api\Application\Nodes\GetNodesRequest; use App\Http\Requests\Api\Application\Nodes\StoreNodeRequest; -use App\Http\Requests\Api\Application\Nodes\DeleteNodeRequest; use App\Http\Requests\Api\Application\Nodes\UpdateNodeRequest; -use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Models\Node; +use App\Services\Nodes\NodeDeletionService; +use App\Services\Nodes\NodeUpdateService; +use App\Transformers\Api\Application\NodeTransformer; +use Dedoc\Scramble\Attributes\Group; +use Exception; +use Illuminate\Http\JsonResponse; +use Spatie\QueryBuilder\QueryBuilder; +use Throwable; +#[Group('Node', weight: 0)] class NodeController extends ApplicationApiController { /** * NodeController constructor. */ public function __construct( - private NodeCreationService $creationService, private NodeDeletionService $deletionService, private NodeUpdateService $updateService ) { @@ -30,11 +34,15 @@ public function __construct( } /** + * List nodes + * * Return all the nodes currently available on the Panel. + * + * @return array */ public function index(GetNodesRequest $request): array { - $nodes = QueryBuilder::for(Node::query()) + $nodes = QueryBuilder::for(Node::class) ->allowedFilters(['uuid', 'name', 'fqdn', 'daemon_token_id']) ->allowedSorts(['id', 'uuid', 'memory', 'disk', 'cpu']) ->paginate($request->query('per_page') ?? 50); @@ -45,7 +53,11 @@ public function index(GetNodesRequest $request): array } /** + * View node + * * Return data for a single instance of a node. + * + * @return array */ public function view(GetNodeRequest $request, Node $node): array { @@ -55,14 +67,16 @@ public function view(GetNodeRequest $request, Node $node): array } /** + * Create node + * * Create a new node on the Panel. Returns the created node and an HTTP/201 * status response on success. * - * @throws \App\Exceptions\Model\DataValidationException + * @throws DataValidationException */ public function store(StoreNodeRequest $request): JsonResponse { - $node = $this->creationService->handle($request->validated()); + $node = Node::create($request->validated()); return $this->fractal->item($node) ->transformWith($this->getTransformer(NodeTransformer::class)) @@ -75,17 +89,25 @@ public function store(StoreNodeRequest $request): JsonResponse } /** + * Update node + * * Update an existing node on the Panel. * - * @throws \Throwable + * @return array + * + * @throws Throwable */ public function update(UpdateNodeRequest $request, Node $node): array { - $node = $this->updateService->handle( - $node, - $request->validated(), - $request->input('reset_secret') === true - ); + try { + $node = $this->updateService->handle( + $node, + $request->validated(), + $request->input('reset_secret') === true + ); + } catch (Exception $exception) { + report($exception); + } return $this->fractal->item($node) ->transformWith($this->getTransformer(NodeTransformer::class)) @@ -93,10 +115,12 @@ public function update(UpdateNodeRequest $request, Node $node): array } /** + * Delete node + * * Deletes a given node from the Panel as long as there are no servers * currently attached to it. * - * @throws \App\Exceptions\Service\HasActiveServersException + * @throws HasActiveServersException */ public function delete(DeleteNodeRequest $request, Node $node): JsonResponse { diff --git a/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php b/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php index 7a16fab01f..b61d079f98 100644 --- a/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php +++ b/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php @@ -2,11 +2,13 @@ namespace App\Http\Controllers\Api\Application\Nodes; -use App\Services\Deployment\FindViableNodesService; -use App\Transformers\Api\Application\NodeTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; use App\Http\Requests\Api\Application\Nodes\GetDeployableNodesRequest; +use App\Services\Deployment\FindViableNodesService; +use App\Transformers\Api\Application\NodeTransformer; +use Dedoc\Scramble\Attributes\Group; +#[Group('Node', weight: 2)] class NodeDeploymentController extends ApplicationApiController { public function __construct(private FindViableNodesService $viableNodesService) @@ -15,9 +17,13 @@ public function __construct(private FindViableNodesService $viableNodesService) } /** + * Get deployable nodes + * * Finds any nodes that are available using the given deployment criteria. This works * similarly to the server creation process, but allows you to pass the deployment object * to this endpoint and get back a list of all Nodes satisfying the requirements. + * + * @return array */ public function __invoke(GetDeployableNodesRequest $request): array { diff --git a/app/Http/Controllers/Api/Application/Plugins/PluginController.php b/app/Http/Controllers/Api/Application/Plugins/PluginController.php new file mode 100644 index 0000000000..8697414e22 --- /dev/null +++ b/app/Http/Controllers/Api/Application/Plugins/PluginController.php @@ -0,0 +1,203 @@ + + */ + public function index(ReadPluginRequest $request): array + { + $plugins = QueryBuilder::for(Plugin::class) + ->allowedFilters(['id', 'name', 'author', 'category']) + ->allowedSorts(['id', 'name', 'author', 'category']) + ->paginate($request->query('per_page') ?? 10); + + return $this->fractal->collection($plugins) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } + + /** + * View plugin + * + * Return a single plugin. + * + * @return array + */ + public function view(ReadPluginRequest $request, Plugin $plugin): array + { + return $this->fractal->item($plugin) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } + + /** + * Import plugin (file) + * + * Imports a new plugin file. + * + * @throws Exception + */ + public function importFile(WritePluginRequest $request): Response + { + if (!$request->hasFile('plugin')) { + throw new PanelException("No 'plugin' file in request"); + } + + $this->pluginService->downloadPluginFromFile($request->file('plugin')); + + return new Response('', Response::HTTP_CREATED); + } + + /** + * Import plugin (url) + * + * Imports a new plugin from an url. + * + * @throws Exception + */ + public function importUrl(ImportFilePluginRequest $request): Response + { + $this->pluginService->downloadPluginFromUrl($request->input('url')); + + return new Response('', Response::HTTP_CREATED); + } + + /** + * Install plugin + * + * Installs and enables a plugin. + * + * @return array + * + * @throws Exception + */ + public function install(WritePluginRequest $request, Plugin $plugin): array + { + if ($plugin->status !== PluginStatus::NotInstalled) { + throw new PanelException('Plugin is already installed'); + } + + $this->pluginService->installPlugin($plugin); + + return $this->fractal->item($plugin) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } + + /** + * Update plugin + * + * Downloads and installs an update for a plugin. Will throw if no update is available. + * + * @return array + * + * @throws Exception + */ + public function update(WritePluginRequest $request, Plugin $plugin): array + { + if (!$plugin->isUpdateAvailable()) { + throw new PanelException("Plugin doesn't need updating"); + } + + $this->pluginService->updatePlugin($plugin); + + return $this->fractal->item($plugin) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } + + /** + * Uninstall plugin + * + * Uninstalls a plugin. Optionally it will delete the plugin folder too. + * + * @return array + * + * @throws Exception + */ + public function uninstall(UninstallPluginRequest $request, Plugin $plugin): array + { + if ($plugin->status === PluginStatus::NotInstalled) { + throw new PanelException('Plugin is not installed'); + } + + $this->pluginService->uninstallPlugin($plugin, $request->boolean('delete')); + + return $this->fractal->item($plugin) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } + + /** + * Enable plugin + * + * Enables a plugin. + * + * @return array + * + * @throws Exception + */ + public function enable(WritePluginRequest $request, Plugin $plugin): array + { + if (!$plugin->canEnable()) { + throw new PanelException("Plugin can't be enabled"); + } + + $this->pluginService->enablePlugin($plugin); + + return $this->fractal->item($plugin) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } + + /** + * Disable plugin + * + * Disables a plugin. + * + * @return array + * + * @throws Exception + */ + public function disable(WritePluginRequest $request, Plugin $plugin): array + { + if (!$plugin->canDisable()) { + throw new PanelException("Plugin can't be disabled"); + } + + $this->pluginService->disablePlugin($plugin); + + return $this->fractal->item($plugin) + ->transformWith($this->getTransformer(PluginTransformer::class)) + ->toArray(); + } +} diff --git a/app/Http/Controllers/Api/Application/Roles/RoleController.php b/app/Http/Controllers/Api/Application/Roles/RoleController.php index 82fd99edd6..31cc97b408 100644 --- a/app/Http/Controllers/Api/Application/Roles/RoleController.php +++ b/app/Http/Controllers/Api/Application/Roles/RoleController.php @@ -3,25 +3,31 @@ namespace App\Http\Controllers\Api\Application\Roles; use App\Exceptions\PanelException; -use Illuminate\Http\Response; -use Illuminate\Http\JsonResponse; -use App\Models\Role; -use Spatie\QueryBuilder\QueryBuilder; -use App\Transformers\Api\Application\RoleTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Roles\DeleteRoleRequest; use App\Http\Requests\Api\Application\Roles\GetRoleRequest; use App\Http\Requests\Api\Application\Roles\StoreRoleRequest; -use App\Http\Requests\Api\Application\Roles\DeleteRoleRequest; use App\Http\Requests\Api\Application\Roles\UpdateRoleRequest; +use App\Models\Role; +use App\Transformers\Api\Application\RoleTransformer; +use Exception; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Spatie\QueryBuilder\QueryBuilder; +use Throwable; class RoleController extends ApplicationApiController { /** + * List roles + * * Return all the roles currently registered on the Panel. + * + * @return array */ public function index(GetRoleRequest $request): array { - $roles = QueryBuilder::for(Role::query()) + $roles = QueryBuilder::for(Role::class) ->allowedFilters(['id', 'name']) ->allowedSorts(['id', 'name']) ->paginate($request->query('per_page') ?? 10); @@ -32,7 +38,11 @@ public function index(GetRoleRequest $request): array } /** + * View role + * * Return a single role. + * + * @return array */ public function view(GetRoleRequest $request, Role $role): array { @@ -42,10 +52,12 @@ public function view(GetRoleRequest $request, Role $role): array } /** + * Create role + * * Store a new role on the Panel and return an HTTP/201 response code with the * new role attached. * - * @throws \Throwable + * @throws Throwable */ public function store(StoreRoleRequest $request): JsonResponse { @@ -62,9 +74,13 @@ public function store(StoreRoleRequest $request): JsonResponse } /** + * Update role + * * Update a role on the Panel and return the updated record to the user. * - * @throws \Throwable + * @return array + * + * @throws Throwable */ public function update(UpdateRoleRequest $request, Role $role): array { @@ -80,9 +96,11 @@ public function update(UpdateRoleRequest $request, Role $role): array } /** + * Delete role + * * Delete a role from the Panel. * - * @throws \Exception + * @throws Exception */ public function delete(DeleteRoleRequest $request, Role $role): Response { diff --git a/app/Http/Controllers/Api/Application/Servers/DatabaseController.php b/app/Http/Controllers/Api/Application/Servers/DatabaseController.php index 32cffde27a..f65c420bbb 100644 --- a/app/Http/Controllers/Api/Application/Servers/DatabaseController.php +++ b/app/Http/Controllers/Api/Application/Servers/DatabaseController.php @@ -2,19 +2,21 @@ namespace App\Http\Controllers\Api\Application\Servers; -use Illuminate\Http\Response; -use App\Models\Server; -use App\Models\Database; -use Illuminate\Http\JsonResponse; -use App\Services\Databases\DatabasePasswordService; -use App\Services\Databases\DatabaseManagementService; -use App\Transformers\Api\Application\ServerDatabaseTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; use App\Http\Requests\Api\Application\Servers\Databases\GetServerDatabaseRequest; use App\Http\Requests\Api\Application\Servers\Databases\GetServerDatabasesRequest; use App\Http\Requests\Api\Application\Servers\Databases\ServerDatabaseWriteRequest; use App\Http\Requests\Api\Application\Servers\Databases\StoreServerDatabaseRequest; +use App\Models\Database; +use App\Models\Server; +use App\Services\Databases\DatabaseManagementService; +use App\Transformers\Api\Application\ServerDatabaseTransformer; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Throwable; +#[Group('Server - Database')] class DatabaseController extends ApplicationApiController { /** @@ -22,14 +24,16 @@ class DatabaseController extends ApplicationApiController */ public function __construct( private DatabaseManagementService $databaseManagementService, - private DatabasePasswordService $databasePasswordService ) { parent::__construct(); } /** - * Return a listing of all databases currently available to a single - * server. + * List databases + * + * Return a listing of all databases currently available to a single server. + * + * @return array */ public function index(GetServerDatabasesRequest $request, Server $server): array { @@ -39,7 +43,11 @@ public function index(GetServerDatabasesRequest $request, Server $server): array } /** + * View database + * * Return a single server database. + * + * @return array */ public function view(GetServerDatabaseRequest $request, Server $server, Database $database): array { @@ -49,21 +57,25 @@ public function view(GetServerDatabaseRequest $request, Server $server, Database } /** + * Reset password + * * Reset the password for a specific server database. * - * @throws \Throwable + * @throws Throwable */ public function resetPassword(ServerDatabaseWriteRequest $request, Server $server, Database $database): JsonResponse { - $this->databasePasswordService->handle($database); + $this->databaseManagementService->rotatePassword($database); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } /** + * Create database + * * Create a new database on the Panel for a given server. * - * @throws \Throwable + * @throws Throwable */ public function store(StoreServerDatabaseRequest $request, Server $server): JsonResponse { @@ -83,6 +95,8 @@ public function store(StoreServerDatabaseRequest $request, Server $server): Json } /** + * Delete database + * * Handle a request to delete a specific server database from the Panel. */ public function delete(ServerDatabaseWriteRequest $request, Server $server, Database $database): Response diff --git a/app/Http/Controllers/Api/Application/Servers/ExternalServerController.php b/app/Http/Controllers/Api/Application/Servers/ExternalServerController.php index 18b4d224cb..0130212a63 100644 --- a/app/Http/Controllers/Api/Application/Servers/ExternalServerController.php +++ b/app/Http/Controllers/Api/Application/Servers/ExternalServerController.php @@ -2,15 +2,21 @@ namespace App\Http\Controllers\Api\Application\Servers; -use App\Models\Server; -use App\Transformers\Api\Application\ServerTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; use App\Http\Requests\Api\Application\Servers\GetExternalServerRequest; +use App\Models\Server; +use App\Transformers\Api\Application\ServerTransformer; +use Dedoc\Scramble\Attributes\Group; +#[Group('Server', weight: 1)] class ExternalServerController extends ApplicationApiController { /** + * View server (external id) + * * Retrieve a specific server from the database using its external ID. + * + * @return array */ public function index(GetExternalServerRequest $request, string $external_id): array { diff --git a/app/Http/Controllers/Api/Application/Servers/ServerController.php b/app/Http/Controllers/Api/Application/Servers/ServerController.php index 230d19794d..096f034467 100644 --- a/app/Http/Controllers/Api/Application/Servers/ServerController.php +++ b/app/Http/Controllers/Api/Application/Servers/ServerController.php @@ -2,19 +2,26 @@ namespace App\Http\Controllers\Api\Application\Servers; -use Illuminate\Http\Response; -use App\Models\Server; -use Illuminate\Http\JsonResponse; -use Spatie\QueryBuilder\QueryBuilder; -use App\Services\Servers\ServerCreationService; -use App\Services\Servers\ServerDeletionService; -use App\Transformers\Api\Application\ServerTransformer; +use App\Exceptions\DisplayException; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\Deployment\NoViableAllocationException; +use App\Http\Controllers\Api\Application\ApplicationApiController; use App\Http\Requests\Api\Application\Servers\GetServerRequest; use App\Http\Requests\Api\Application\Servers\GetServersRequest; use App\Http\Requests\Api\Application\Servers\ServerWriteRequest; use App\Http\Requests\Api\Application\Servers\StoreServerRequest; -use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Models\Server; +use App\Services\Servers\ServerCreationService; +use App\Services\Servers\ServerDeletionService; +use App\Transformers\Api\Application\ServerTransformer; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Illuminate\Validation\ValidationException; +use Spatie\QueryBuilder\QueryBuilder; +use Throwable; +#[Group('Server', weight: 0)] class ServerController extends ApplicationApiController { /** @@ -28,11 +35,15 @@ public function __construct( } /** + * List servers + * * Return all the servers that currently exist on the Panel. + * + * @return array */ public function index(GetServersRequest $request): array { - $servers = QueryBuilder::for(Server::query()) + $servers = QueryBuilder::for(Server::class) ->allowedFilters(['uuid', 'uuid_short', 'name', 'description', 'image', 'external_id']) ->allowedSorts(['id', 'uuid']) ->paginate($request->query('per_page') ?? 50); @@ -43,13 +54,15 @@ public function index(GetServersRequest $request): array } /** + * Create server + * * Create a new server on the system. * - * @throws \Throwable - * @throws \Illuminate\Validation\ValidationException - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Deployment\NoViableAllocationException + * @throws Throwable + * @throws ValidationException + * @throws DisplayException + * @throws DataValidationException + * @throws NoViableAllocationException */ public function store(StoreServerRequest $request): JsonResponse { @@ -61,7 +74,11 @@ public function store(StoreServerRequest $request): JsonResponse } /** + * View server + * * Show a single server transformed for the application API. + * + * @return array */ public function view(GetServerRequest $request, Server $server): array { @@ -71,9 +88,11 @@ public function view(GetServerRequest $request, Server $server): array } /** + * Delete server + * * Deletes a server. * - * @throws \App\Exceptions\DisplayException + * @throws DisplayException */ public function delete(ServerWriteRequest $request, Server $server, string $force = ''): Response { diff --git a/app/Http/Controllers/Api/Application/Servers/ServerDetailsController.php b/app/Http/Controllers/Api/Application/Servers/ServerDetailsController.php index 0c4657892c..f5aaede210 100644 --- a/app/Http/Controllers/Api/Application/Servers/ServerDetailsController.php +++ b/app/Http/Controllers/Api/Application/Servers/ServerDetailsController.php @@ -2,14 +2,18 @@ namespace App\Http\Controllers\Api\Application\Servers; +use App\Exceptions\DisplayException; +use App\Exceptions\Model\DataValidationException; +use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Servers\UpdateServerBuildConfigurationRequest; +use App\Http\Requests\Api\Application\Servers\UpdateServerDetailsRequest; use App\Models\Server; use App\Services\Servers\BuildModificationService; use App\Services\Servers\DetailsModificationService; use App\Transformers\Api\Application\ServerTransformer; -use App\Http\Controllers\Api\Application\ApplicationApiController; -use App\Http\Requests\Api\Application\Servers\UpdateServerDetailsRequest; -use App\Http\Requests\Api\Application\Servers\UpdateServerBuildConfigurationRequest; +use Dedoc\Scramble\Attributes\Group; +#[Group('Server', weight: 2)] class ServerDetailsController extends ApplicationApiController { /** @@ -23,16 +27,23 @@ public function __construct( } /** + * Update details + * * Update the details for a specific server. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DisplayException + * @throws DataValidationException */ public function details(UpdateServerDetailsRequest $request, Server $server): array { + /** @var array $validated */ + $validated = $request->validated(); + $updated = $this->detailsModificationService->returnUpdatedModel()->handle( $server, - $request->validated() + $validated, ); return $this->fractal->item($updated) @@ -41,10 +52,14 @@ public function details(UpdateServerDetailsRequest $request, Server $server): ar } /** + * Update build + * * Update the build details for a specific server. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DisplayException + * @throws DataValidationException */ public function build(UpdateServerBuildConfigurationRequest $request, Server $server): array { diff --git a/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php b/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php index 4c9b512aeb..e4e0a97b64 100644 --- a/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php +++ b/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php @@ -2,6 +2,9 @@ namespace App\Http\Controllers\Api\Application\Servers; +use App\Enums\SuspendAction; +use App\Exceptions\DisplayException; +use App\Exceptions\Model\DataValidationException; use App\Http\Controllers\Api\Application\ApplicationApiController; use App\Http\Requests\Api\Application\Servers\ServerWriteRequest; use App\Models\Server; @@ -9,8 +12,13 @@ use App\Services\Servers\ReinstallServerService; use App\Services\Servers\SuspensionService; use App\Services\Servers\TransferServerService; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Response; +use Illuminate\Support\Arr; +use Throwable; +#[Group('Server', weight: 4)] class ServerManagementController extends ApplicationApiController { /** @@ -26,34 +34,40 @@ public function __construct( } /** + * Suspend + * * Suspend a server on the Panel. * - * @throws \Throwable + * @throws Throwable */ public function suspend(ServerWriteRequest $request, Server $server): Response { - $this->suspensionService->toggle($server); + $this->suspensionService->handle($server, SuspendAction::Suspend); return $this->returnNoContent(); } /** + * Unsuspsend + * * Unsuspend a server on the Panel. * - * @throws \Throwable + * @throws Throwable */ public function unsuspend(ServerWriteRequest $request, Server $server): Response { - $this->suspensionService->toggle($server, SuspensionService::ACTION_UNSUSPEND); + $this->suspensionService->handle($server, SuspendAction::Unsuspend); return $this->returnNoContent(); } /** + * Reinstall + * * Mark a server as needing to be reinstalled. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException + * @throws DisplayException + * @throws DataValidationException */ public function reinstall(ServerWriteRequest $request, Server $server): Response { @@ -63,6 +77,8 @@ public function reinstall(ServerWriteRequest $request, Server $server): Response } /** + * Start transfer + * * Starts a transfer of a server to a new node. */ public function startTransfer(ServerWriteRequest $request, Server $server): Response @@ -70,28 +86,43 @@ public function startTransfer(ServerWriteRequest $request, Server $server): Resp $validatedData = $request->validate([ 'node_id' => 'required|exists:nodes,id', 'allocation_id' => 'required|bail|unique:servers|exists:allocations,id', - 'allocation_additional' => 'nullable', + 'allocation_additional' => 'nullable|array', + 'allocation_additional.*' => 'integer|exists:allocations,id', ]); - if ($this->transferServerService->handle($server, $validatedData)) { - // Transfer started + if ($this->transferServerService->handle($server, Arr::get($validatedData, 'node_id'), Arr::get($validatedData, 'allocation_id'), Arr::get($validatedData, 'allocation_additional', []))) { + /** + * Transfer started + * + * @status 204 + */ return $this->returnNoContent(); } - // Node was not viable - return new Response('', Response::HTTP_NOT_ACCEPTABLE); + /** + * Node was not viable + * + * @status 406 + */ + return $this->returnNotAcceptable(); } /** + * Cancel transfer + * * Cancels a transfer of a server to a new node. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function cancelTransfer(ServerWriteRequest $request, Server $server): Response { if (!$transfer = $server->transfer) { - // Server is not transferring - return new Response('', Response::HTTP_NOT_ACCEPTABLE); + /** + * Server is not transferring + * + * @status 406 + */ + return $this->returnNotAcceptable(); } $transfer->successful = true; @@ -99,6 +130,11 @@ public function cancelTransfer(ServerWriteRequest $request, Server $server): Res $this->daemonServerRepository->setServer($server)->cancelTransfer(); + /** + * Transfer cancelled + * + * @status 204 + */ return $this->returnNoContent(); } } diff --git a/app/Http/Controllers/Api/Application/Servers/StartupController.php b/app/Http/Controllers/Api/Application/Servers/StartupController.php index 110be675f1..68d8bcf88d 100644 --- a/app/Http/Controllers/Api/Application/Servers/StartupController.php +++ b/app/Http/Controllers/Api/Application/Servers/StartupController.php @@ -2,13 +2,18 @@ namespace App\Http\Controllers\Api\Application\Servers; -use App\Models\User; +use App\Exceptions\Model\DataValidationException; +use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Servers\UpdateServerStartupRequest; use App\Models\Server; +use App\Models\User; use App\Services\Servers\StartupModificationService; use App\Transformers\Api\Application\ServerTransformer; -use App\Http\Controllers\Api\Application\ApplicationApiController; -use App\Http\Requests\Api\Application\Servers\UpdateServerStartupRequest; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Validation\ValidationException; +#[Group('Server', weight: 3)] class StartupController extends ApplicationApiController { /** @@ -20,11 +25,15 @@ public function __construct(private StartupModificationService $modificationServ } /** + * Update startup + * * Update the startup and environment settings for a specific server. * - * @throws \Illuminate\Validation\ValidationException - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws ValidationException + * @throws ConnectionException + * @throws DataValidationException */ public function index(UpdateServerStartupRequest $request, Server $server): array { diff --git a/app/Http/Controllers/Api/Application/Users/ExternalUserController.php b/app/Http/Controllers/Api/Application/Users/ExternalUserController.php index 801022e6b2..c376c5cb4e 100644 --- a/app/Http/Controllers/Api/Application/Users/ExternalUserController.php +++ b/app/Http/Controllers/Api/Application/Users/ExternalUserController.php @@ -2,19 +2,25 @@ namespace App\Http\Controllers\Api\Application\Users; -use App\Models\User; -use App\Transformers\Api\Application\UserTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; use App\Http\Requests\Api\Application\Users\GetExternalUserRequest; +use App\Models\User; +use App\Transformers\Api\Application\UserTransformer; +use Dedoc\Scramble\Attributes\Group; +#[Group('User', weight: 1)] class ExternalUserController extends ApplicationApiController { /** + * View user (external id) + * * Retrieve a specific user from the database using their external ID. + * + * @return array */ - public function index(GetExternalUserRequest $request, string $external_id): array + public function index(GetExternalUserRequest $request, string $externalId): array { - $user = User::query()->where('external_id', $external_id)->firstOrFail(); + $user = User::query()->where('external_id', $externalId)->firstOrFail(); return $this->fractal->item($user) ->transformWith($this->getTransformer(UserTransformer::class)) diff --git a/app/Http/Controllers/Api/Application/Users/UserController.php b/app/Http/Controllers/Api/Application/Users/UserController.php index 32bfca7306..6a3b722180 100644 --- a/app/Http/Controllers/Api/Application/Users/UserController.php +++ b/app/Http/Controllers/Api/Application/Users/UserController.php @@ -2,20 +2,24 @@ namespace App\Http\Controllers\Api\Application\Users; -use App\Models\User; -use Illuminate\Http\JsonResponse; -use Spatie\QueryBuilder\QueryBuilder; -use App\Services\Users\UserUpdateService; -use App\Services\Users\UserCreationService; -use App\Transformers\Api\Application\UserTransformer; +use App\Exceptions\Model\DataValidationException; +use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Http\Requests\Api\Application\Users\AssignUserRolesRequest; +use App\Http\Requests\Api\Application\Users\DeleteUserRequest; use App\Http\Requests\Api\Application\Users\GetUsersRequest; use App\Http\Requests\Api\Application\Users\StoreUserRequest; -use App\Http\Requests\Api\Application\Users\DeleteUserRequest; use App\Http\Requests\Api\Application\Users\UpdateUserRequest; -use App\Http\Controllers\Api\Application\ApplicationApiController; -use App\Http\Requests\Api\Application\Users\AssignUserRolesRequest; use App\Models\Role; +use App\Models\User; +use App\Services\Users\UserCreationService; +use App\Services\Users\UserUpdateService; +use App\Transformers\Api\Application\UserTransformer; +use Dedoc\Scramble\Attributes\Group; +use Exception; +use Illuminate\Http\JsonResponse; +use Spatie\QueryBuilder\QueryBuilder; +#[Group('User', weight: 0)] class UserController extends ApplicationApiController { /** @@ -29,13 +33,17 @@ public function __construct( } /** + * List users + * * Handle request to list all users on the panel. Returns a JSON-API representation * of a collection of users including any defined relations passed in * the request. + * + * @return array */ public function index(GetUsersRequest $request): array { - $users = QueryBuilder::for(User::query()) + $users = QueryBuilder::for(User::class) ->allowedFilters(['email', 'uuid', 'username', 'external_id']) ->allowedSorts(['id', 'uuid']) ->paginate($request->query('per_page') ?? 50); @@ -46,8 +54,12 @@ public function index(GetUsersRequest $request): array } /** + * View user + * * Handle a request to view a single user. Includes any relations that * were defined in the request. + * + * @return array */ public function view(GetUsersRequest $request, User $user): array { @@ -57,6 +69,8 @@ public function view(GetUsersRequest $request, User $user): array } /** + * Update user + * * Update an existing user on the system and return the response. Returns the * updated user model response on success. Supports handling of token revocation * errors when switching a user from an admin to a normal user. @@ -64,7 +78,9 @@ public function view(GetUsersRequest $request, User $user): array * Revocation errors are returned under the 'revocation_errors' key in the response * meta. If there are no errors this is an empty array. * - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DataValidationException */ public function update(UpdateUserRequest $request, User $user): array { @@ -78,16 +94,23 @@ public function update(UpdateUserRequest $request, User $user): array } /** + * Assign role to user + * * Assign roles to a user. + * + * @return array */ public function assignRoles(AssignUserRolesRequest $request, User $user): array { - foreach ($request->input('roles') as $role) { - if ($role === Role::getRootAdmin()->id) { - continue; + if (!$user->isRootAdmin()) { + $rootAdminId = Role::getRootAdmin()->id; + foreach ($request->input('roles') as $role) { + if ($role === $rootAdminId) { + continue; + } + + $user->assignRole($role); } - - $user->assignRole($role); } $response = $this->fractal->item($user) @@ -97,16 +120,23 @@ public function assignRoles(AssignUserRolesRequest $request, User $user): array } /** + * Unassign role from user + * * Removes roles from a user. + * + * @return array */ public function removeRoles(AssignUserRolesRequest $request, User $user): array { - foreach ($request->input('roles') as $role) { - if ($role === Role::getRootAdmin()->id) { - continue; + if (!$user->isRootAdmin()) { + $rootAdminId = Role::getRootAdmin()->id; + foreach ($request->input('roles') as $role) { + if ($role === $rootAdminId) { + continue; + } + + $user->removeRole($role); } - - $user->removeRole($role); } $response = $this->fractal->item($user) @@ -116,11 +146,13 @@ public function removeRoles(AssignUserRolesRequest $request, User $user): array } /** + * Create user + * * Store a new user on the system. Returns the created user and an HTTP/201 * header on successful creation. * - * @throws \Exception - * @throws \App\Exceptions\Model\DataValidationException + * @throws Exception + * @throws DataValidationException */ public function store(StoreUserRequest $request): JsonResponse { @@ -137,12 +169,18 @@ public function store(StoreUserRequest $request): JsonResponse } /** + * Delete user + * * Handle a request to delete a user from the Panel. Returns a HTTP/204 response on successful deletion. */ public function delete(DeleteUserRequest $request, User $user): JsonResponse { - $user->delete(); + if (!$user->isRootAdmin()) { + $user->delete(); + + return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); + } - return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); + return new JsonResponse([], JsonResponse::HTTP_FORBIDDEN); } } diff --git a/app/Http/Controllers/Api/Client/AccountController.php b/app/Http/Controllers/Api/Client/AccountController.php index 6a0862d6b5..627c493ee6 100644 --- a/app/Http/Controllers/Api/Client/AccountController.php +++ b/app/Http/Controllers/Api/Client/AccountController.php @@ -2,15 +2,18 @@ namespace App\Http\Controllers\Api\Client; -use Illuminate\Http\Request; -use Illuminate\Http\Response; -use Illuminate\Auth\AuthManager; -use Illuminate\Http\JsonResponse; use App\Facades\Activity; -use App\Services\Users\UserUpdateService; use App\Http\Requests\Api\Client\Account\UpdateEmailRequest; use App\Http\Requests\Api\Client\Account\UpdatePasswordRequest; +use App\Http\Requests\Api\Client\Account\UpdateUsernameRequest; +use App\Services\Users\UserUpdateService; use App\Transformers\Api\Client\UserTransformer; +use Illuminate\Auth\AuthManager; +use Illuminate\Auth\SessionGuard; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Http\Response; +use Throwable; class AccountController extends ClientApiController { @@ -22,6 +25,11 @@ public function __construct(private AuthManager $manager, private UserUpdateServ parent::__construct(); } + /** + * View account + * + * @return array + */ public function index(Request $request): array { return $this->fractal->item($request->user()) @@ -30,6 +38,27 @@ public function index(Request $request): array } /** + * Update username + * + * Update the authenticated user's username. + */ + public function updateUsername(UpdateUsernameRequest $request): JsonResponse + { + $original = $request->user()->username; + $this->updateService->handle($request->user(), $request->validated()); + + if ($original !== $request->input('username')) { + Activity::event('user:account.username-changed') + ->property(['old' => $original, 'new' => $request->input('username')]) + ->log(); + } + + return new JsonResponse([], Response::HTTP_NO_CONTENT); + } + + /** + * Update email + * * Update the authenticated user's email address. */ public function updateEmail(UpdateEmailRequest $request): JsonResponse @@ -47,10 +76,12 @@ public function updateEmail(UpdateEmailRequest $request): JsonResponse } /** + * Update password + * * Update the authenticated user's password. All existing sessions will be logged * out immediately. * - * @throws \Throwable + * @throws Throwable */ public function updatePassword(UpdatePasswordRequest $request): JsonResponse { @@ -63,8 +94,7 @@ public function updatePassword(UpdatePasswordRequest $request): JsonResponse // other devices functionality to work. $guard->setUser($user); - // This method doesn't exist in the stateless Sanctum world. - if (method_exists($guard, 'logoutOtherDevices')) { + if ($guard instanceof SessionGuard) { $guard->logoutOtherDevices($request->input('password')); } diff --git a/app/Http/Controllers/Api/Client/ActivityLogController.php b/app/Http/Controllers/Api/Client/ActivityLogController.php index ae9af248e1..fdbd626343 100644 --- a/app/Http/Controllers/Api/Client/ActivityLogController.php +++ b/app/Http/Controllers/Api/Client/ActivityLogController.php @@ -2,16 +2,20 @@ namespace App\Http\Controllers\Api\Client; -use App\Models\ActivityLog; -use Spatie\QueryBuilder\QueryBuilder; -use Spatie\QueryBuilder\AllowedFilter; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\ActivityLog; use App\Transformers\Api\Client\ActivityLogTransformer; +use Spatie\QueryBuilder\AllowedFilter; +use Spatie\QueryBuilder\QueryBuilder; class ActivityLogController extends ClientApiController { /** + * List activity logs + * * Returns a paginated set of the user's activity logs. + * + * @return array */ public function __invoke(ClientApiRequest $request): array { diff --git a/app/Http/Controllers/Api/Client/ApiKeyController.php b/app/Http/Controllers/Api/Client/ApiKeyController.php index 0a1026ad59..04e1a91e85 100644 --- a/app/Http/Controllers/Api/Client/ApiKeyController.php +++ b/app/Http/Controllers/Api/Client/ApiKeyController.php @@ -2,18 +2,22 @@ namespace App\Http\Controllers\Api\Client; -use App\Models\ApiKey; -use Illuminate\Http\JsonResponse; -use App\Facades\Activity; use App\Exceptions\DisplayException; +use App\Facades\Activity; +use App\Http\Requests\Api\Client\Account\StoreApiKeyRequest; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\ApiKey; use App\Transformers\Api\Client\ApiKeyTransformer; -use App\Http\Requests\Api\Client\Account\StoreApiKeyRequest; +use Illuminate\Http\JsonResponse; class ApiKeyController extends ClientApiController { /** + * List api keys + * * Returns all the API keys that exist for the given client. + * + * @return array */ public function index(ClientApiRequest $request): array { @@ -23,13 +27,17 @@ public function index(ClientApiRequest $request): array } /** + * Create api key + * * Store a new API key for a user's account. * - * @throws \App\Exceptions\DisplayException + * @return array + * + * @throws DisplayException */ public function store(StoreApiKeyRequest $request): array { - if ($request->user()->apiKeys->count() >= 25) { + if ($request->user()->apiKeys->count() >= config('panel.api.key_limit')) { throw new DisplayException('You have reached the account limit for number of API keys.'); } @@ -50,11 +58,13 @@ public function store(StoreApiKeyRequest $request): array } /** + * Delete api key + * * Deletes a given API key. */ public function delete(ClientApiRequest $request, string $identifier): JsonResponse { - /** @var \App\Models\ApiKey $key */ + /** @var ApiKey $key */ $key = $request->user()->apiKeys() ->where('key_type', ApiKey::TYPE_ACCOUNT) ->where('identifier', $identifier) diff --git a/app/Http/Controllers/Api/Client/ClientApiController.php b/app/Http/Controllers/Api/Client/ClientApiController.php index 4cf081fec3..ce7d4d0a2a 100644 --- a/app/Http/Controllers/Api/Client/ClientApiController.php +++ b/app/Http/Controllers/Api/Client/ClientApiController.php @@ -2,14 +2,17 @@ namespace App\Http\Controllers\Api\Client; -use Webmozart\Assert\Assert; -use App\Transformers\Api\Client\BaseClientTransformer; use App\Http\Controllers\Api\Application\ApplicationApiController; +use App\Transformers\Api\Client\BaseClientTransformer; +use Webmozart\Assert\Assert; abstract class ClientApiController extends ApplicationApiController { /** * Returns only the includes which are valid for the given transformer. + * + * @param array $merge + * @return array */ protected function getIncludesForTransformer(BaseClientTransformer $transformer, array $merge = []): array { @@ -22,6 +25,8 @@ protected function getIncludesForTransformer(BaseClientTransformer $transformer, /** * Returns the parsed includes for this request. + * + * @return array */ protected function parseIncludes(): array { @@ -41,8 +46,7 @@ protected function parseIncludes(): array * * @template T of \App\Transformers\Api\Client\BaseClientTransformer * - * @param class-string $abstract - * + * @param class-string $abstract * @return T * * @noinspection PhpDocSignatureInspection diff --git a/app/Http/Controllers/Api/Client/ClientController.php b/app/Http/Controllers/Api/Client/ClientController.php index 7ac7562f17..42327ca182 100644 --- a/app/Http/Controllers/Api/Client/ClientController.php +++ b/app/Http/Controllers/Api/Client/ClientController.php @@ -2,14 +2,18 @@ namespace App\Http\Controllers\Api\Client; -use App\Models\Server; -use App\Models\Permission; -use Spatie\QueryBuilder\QueryBuilder; -use Spatie\QueryBuilder\AllowedFilter; +use App\Http\Requests\Api\Client\GetServersRequest; use App\Models\Filters\MultiFieldServerFilter; +use App\Models\Server; +use App\Models\Subuser; use App\Transformers\Api\Client\ServerTransformer; -use App\Http\Requests\Api\Client\GetServersRequest; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; +use Spatie\QueryBuilder\AllowedFilter; +use Spatie\QueryBuilder\QueryBuilder; +#[Group('Base')] class ClientController extends ClientApiController { /** @@ -21,18 +25,23 @@ public function __construct() } /** + * List servers + * * Return all the servers available to the client making the API * request, including servers the user has access to as a subuser. + * + * @return array */ public function index(GetServersRequest $request): array { $user = $request->user(); $transformer = $this->getTransformer(ServerTransformer::class); + /** @var Builder $query */ + $query = Server::query()->with($this->getIncludesForTransformer($transformer, ['node'])); + // Start the query builder and ensure we eager load any requested relationships from the request. - $builder = QueryBuilder::for( - Server::query()->with($this->getIncludesForTransformer($transformer, ['node'])) - )->allowedFilters([ + $builder = QueryBuilder::for($query)->allowedFilters([ 'uuid', 'name', 'description', @@ -53,12 +62,12 @@ public function index(GetServersRequest $request): array } else { $builder = $type === 'admin-all' ? $builder - : $builder->whereNotIn('servers.id', $user->accessibleServers()->pluck('id')->all()); + : $builder->whereNotIn('servers.id', $user->directAccessibleServers()->pluck('id')->all()); } } elseif ($type === 'owner') { $builder = $builder->where('servers.owner_id', $user->id); } else { - $builder = $builder->whereIn('servers.id', $user->accessibleServers()->pluck('id')->all()); + $builder = $builder->whereIn('servers.id', $user->directAccessibleServers()->pluck('id')->all()); } $servers = $builder->paginate(min($request->query('per_page', '50'), 100))->appends($request->query()); @@ -67,14 +76,18 @@ public function index(GetServersRequest $request): array } /** + * List subuser permissions + * * Returns all the subuser permissions available on the system. + * + * @return array{object: string, attributes: array{permissions: string[]}} */ public function permissions(): array { return [ 'object' => 'system_permissions', 'attributes' => [ - 'permissions' => Permission::permissions(), + 'permissions' => Subuser::allPermissionKeys(), ], ]; } diff --git a/app/Http/Controllers/Api/Client/SSHKeyController.php b/app/Http/Controllers/Api/Client/SSHKeyController.php index e5abe4ad8a..445c2c7b84 100644 --- a/app/Http/Controllers/Api/Client/SSHKeyController.php +++ b/app/Http/Controllers/Api/Client/SSHKeyController.php @@ -2,17 +2,21 @@ namespace App\Http\Controllers\Api\Client; -use Illuminate\Http\JsonResponse; use App\Facades\Activity; +use App\Http\Requests\Api\Client\Account\StoreSSHKeyRequest; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\UserSSHKey; use App\Transformers\Api\Client\UserSSHKeyTransformer; -use App\Http\Requests\Api\Client\Account\StoreSSHKeyRequest; +use Illuminate\Http\JsonResponse; class SSHKeyController extends ClientApiController { /** - * Returns all the SSH keys that have been configured for the logged-in - * user account. + * List ssh keys + * + * Returns all the SSH keys that have been configured for the logged-in user account. + * + * @return array */ public function index(ClientApiRequest $request): array { @@ -22,7 +26,11 @@ public function index(ClientApiRequest $request): array } /** + * Create ssh keys + * * Stores a new SSH key for the authenticated user's account. + * + * @return array */ public function store(StoreSSHKeyRequest $request): array { @@ -43,24 +51,23 @@ public function store(StoreSSHKeyRequest $request): array } /** + * Delete ssh keys + * * Deletes an SSH key from the user's account. */ - public function delete(ClientApiRequest $request): JsonResponse + public function delete(ClientApiRequest $request, string $fingerprint): JsonResponse { - $this->validate($request, ['fingerprint' => ['required', 'string']]); - + /** @var UserSSHKey $key */ $key = $request->user()->sshKeys() - ->where('fingerprint', $request->input('fingerprint')) - ->first(); + ->where('fingerprint', $fingerprint) + ->firstOrFail(); - if (!is_null($key)) { - $key->delete(); + Activity::event('user:ssh-key.delete') + ->subject($key) + ->property('fingerprint', $key->fingerprint) + ->log(); - Activity::event('user:ssh-key.delete') - ->subject($key) - ->property('fingerprint', $key->fingerprint) - ->log(); - } + $key->delete(); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } diff --git a/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php b/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php index 53272eb70d..4fcdf1e73f 100644 --- a/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php +++ b/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php @@ -2,27 +2,34 @@ namespace App\Http\Controllers\Api\Client\Servers; -use App\Models\User; -use App\Models\Server; -use App\Models\Permission; +use App\Enums\SubuserPermission; +use App\Http\Controllers\Api\Client\ClientApiController; +use App\Http\Requests\Api\Client\ClientApiRequest; use App\Models\ActivityLog; -use Spatie\QueryBuilder\QueryBuilder; -use Spatie\QueryBuilder\AllowedFilter; +use App\Models\Role; +use App\Models\Server; +use App\Models\User; +use App\Transformers\Api\Client\ActivityLogTransformer; +use Dedoc\Scramble\Attributes\Group; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Query\JoinClause; -use App\Http\Requests\Api\Client\ClientApiRequest; -use App\Transformers\Api\Client\ActivityLogTransformer; -use App\Http\Controllers\Api\Client\ClientApiController; -use App\Models\Role; +use Illuminate\Support\Facades\Gate; +use Spatie\QueryBuilder\AllowedFilter; +use Spatie\QueryBuilder\QueryBuilder; +#[Group('Server - Activity log')] class ActivityLogController extends ClientApiController { /** + * List activity logs + * * Returns the activity logs for a server. + * + * @return array */ public function __invoke(ClientApiRequest $request, Server $server): array { - $this->authorize(Permission::ACTION_ACTIVITY_READ, $server); + Gate::authorize(SubuserPermission::ActivityRead, $server); $activity = QueryBuilder::for($server->activity()) ->allowedSorts(['timestamp']) diff --git a/app/Http/Controllers/Api/Client/Servers/BackupController.php b/app/Http/Controllers/Api/Client/Servers/BackupController.php index ab1e441e24..d5492cbcd8 100644 --- a/app/Http/Controllers/Api/Client/Servers/BackupController.php +++ b/app/Http/Controllers/Api/Client/Servers/BackupController.php @@ -3,46 +3,52 @@ namespace App\Http\Controllers\Api\Client\Servers; use App\Enums\ServerState; -use Illuminate\Http\Request; +use App\Enums\SubuserPermission; +use App\Facades\Activity; +use App\Http\Controllers\Api\Client\ClientApiController; +use App\Http\Requests\Api\Client\Servers\Backups\RenameBackupRequest; +use App\Http\Requests\Api\Client\Servers\Backups\RestoreBackupRequest; +use App\Http\Requests\Api\Client\Servers\Backups\StoreBackupRequest; use App\Models\Backup; use App\Models\Server; -use Illuminate\Http\JsonResponse; -use App\Facades\Activity; -use App\Models\Permission; -use Illuminate\Auth\Access\AuthorizationException; +use App\Repositories\Daemon\DaemonBackupRepository; use App\Services\Backups\DeleteBackupService; use App\Services\Backups\DownloadLinkService; use App\Services\Backups\InitiateBackupService; -use App\Repositories\Daemon\DaemonBackupRepository; use App\Transformers\Api\Client\BackupTransformer; -use App\Http\Controllers\Api\Client\ClientApiController; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Spatie\Fractalistic\Exceptions\InvalidTransformation; +use Spatie\Fractalistic\Exceptions\NoTransformerSpecified; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -use App\Http\Requests\Api\Client\Servers\Backups\StoreBackupRequest; -use App\Http\Requests\Api\Client\Servers\Backups\RestoreBackupRequest; +use Throwable; +#[Group('Server - Backup')] class BackupController extends ClientApiController { - /** - * BackupController constructor. - */ public function __construct( - private DaemonBackupRepository $daemonRepository, - private DeleteBackupService $deleteBackupService, - private InitiateBackupService $initiateBackupService, - private DownloadLinkService $downloadLinkService, + private readonly DaemonBackupRepository $daemonRepository, + private readonly DeleteBackupService $deleteBackupService, + private readonly InitiateBackupService $initiateBackupService, + private readonly DownloadLinkService $downloadLinkService, ) { parent::__construct(); } /** - * Returns all the backups for a given server instance in a paginated - * result set. + * List backups + * + * Returns all the backups for a given server instance in a paginated result set. * - * @throws \Illuminate\Auth\Access\AuthorizationException + * @return array + * + * @throws AuthorizationException */ public function index(Request $request, Server $server): array { - if (!$request->user()->can(Permission::ACTION_BACKUP_READ, $server)) { + if (!$request->user()->can(SubuserPermission::BackupRead, $server)) { throw new AuthorizationException(); } @@ -57,11 +63,15 @@ public function index(Request $request, Server $server): array } /** + * Create backup + * * Starts the backup process for a server. * - * @throws \Spatie\Fractalistic\Exceptions\InvalidTransformation - * @throws \Spatie\Fractalistic\Exceptions\NoTransformerSpecified - * @throws \Throwable + * @return array + * + * @throws InvalidTransformation + * @throws NoTransformerSpecified + * @throws Throwable */ public function store(StoreBackupRequest $request, Server $server): array { @@ -72,16 +82,22 @@ public function store(StoreBackupRequest $request, Server $server): array // otherwise ignore this status. This gets a little funky since it isn't clear // how best to allow a user to create a backup that is locked without also preventing // them from just filling up a server with backups that can never be deleted? - if ($request->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) { - $action->setIsLocked((bool) $request->input('is_locked')); + if ($request->user()->can(SubuserPermission::BackupDelete, $server)) { + $action->setIsLocked($request->boolean('is_locked')); } - $backup = $action->handle($server, $request->input('name')); + $backup = Activity::event('server:backup.start')->transaction(function ($log) use ($action, $server, $request) { + $server->backups()->lockForUpdate(); - Activity::event('server:backup.start') - ->subject($backup) - ->property(['name' => $backup->name, 'locked' => (bool) $request->input('is_locked')]) - ->log(); + $backup = $action->handle($server, $request->input('name')); + + $log->subject($backup)->property([ + 'name' => $backup->name, + 'locked' => $request->boolean('is_locked'), + ]); + + return $backup; + }); return $this->fractal->item($backup) ->transformWith($this->getTransformer(BackupTransformer::class)) @@ -89,14 +105,18 @@ public function store(StoreBackupRequest $request, Server $server): array } /** + * Toggle lock + * * Toggles the lock status of a given backup for a server. * - * @throws \Throwable - * @throws \Illuminate\Auth\Access\AuthorizationException + * @return array + * + * @throws Throwable + * @throws AuthorizationException */ public function toggleLock(Request $request, Server $server, Backup $backup): array { - if (!$request->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) { + if (!$request->user()->can(SubuserPermission::BackupDelete, $server)) { throw new AuthorizationException(); } @@ -112,13 +132,17 @@ public function toggleLock(Request $request, Server $server, Backup $backup): ar } /** + * View backup + * * Returns information about a single backup. * - * @throws \Illuminate\Auth\Access\AuthorizationException + * @return array + * + * @throws AuthorizationException */ public function view(Request $request, Server $server, Backup $backup): array { - if (!$request->user()->can(Permission::ACTION_BACKUP_READ, $server)) { + if (!$request->user()->can(SubuserPermission::BackupRead, $server)) { throw new AuthorizationException(); } @@ -128,14 +152,16 @@ public function view(Request $request, Server $server, Backup $backup): array } /** + * Delete backup + * * Deletes a backup from the panel as well as the remote source where it is currently * being stored. * - * @throws \Throwable + * @throws Throwable */ public function delete(Request $request, Server $server, Backup $backup): JsonResponse { - if (!$request->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) { + if (!$request->user()->can(SubuserPermission::BackupDelete, $server)) { throw new AuthorizationException(); } @@ -150,16 +176,18 @@ public function delete(Request $request, Server $server, Backup $backup): JsonRe } /** + * Download backup + * * Download the backup for a given server instance. For daemon local files, the file * will be streamed back through the Panel. For AWS S3 files, a signed URL will be generated * which the user is redirected to. * - * @throws \Throwable - * @throws \Illuminate\Auth\Access\AuthorizationException + * @throws Throwable + * @throws AuthorizationException */ public function download(Request $request, Server $server, Backup $backup): JsonResponse { - if (!$request->user()->can(Permission::ACTION_BACKUP_DOWNLOAD, $server)) { + if (!$request->user()->can(SubuserPermission::BackupDownload, $server)) { throw new AuthorizationException(); } @@ -178,6 +206,37 @@ public function download(Request $request, Server $server, Backup $backup): Json } /** + * Rename backup + * + * Updates the name of a backup for a server instance. + * + * @return array + * + * @throws Throwable + * @throws AuthorizationException + */ + public function rename(RenameBackupRequest $request, Server $server, Backup $backup): array + { + $oldName = $backup->name; + $newName = $request->input('name'); + + $backup->update(['name' => $newName]); + + if ($oldName !== $newName) { + Activity::event('server:backup.rename') + ->subject($backup) + ->property(['old_name' => $oldName, 'new_name' => $newName]) + ->log(); + } + + return $this->fractal->item($backup) + ->transformWith($this->getTransformer(BackupTransformer::class)) + ->toArray(); + } + + /** + * Restore backup + * * Handles restoring a backup by making a request to the daemon instance telling it * to begin the process of finding (or downloading) the backup and unpacking it * over the server files. @@ -186,7 +245,7 @@ public function download(Request $request, Server $server, Backup $backup): Json * files that currently exist on the server will be deleted before restoring. * Otherwise, the archive will simply be unpacked over the existing files. * - * @throws \Throwable + * @throws Throwable */ public function restore(RestoreBackupRequest $request, Server $server, Backup $backup): JsonResponse { diff --git a/app/Http/Controllers/Api/Client/Servers/CommandController.php b/app/Http/Controllers/Api/Client/Servers/CommandController.php index 2651513c9e..87490402ea 100644 --- a/app/Http/Controllers/Api/Client/Servers/CommandController.php +++ b/app/Http/Controllers/Api/Client/Servers/CommandController.php @@ -2,35 +2,36 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Illuminate\Http\Response; -use App\Models\Server; use App\Facades\Activity; -use Psr\Http\Message\ResponseInterface; -use GuzzleHttp\Exception\BadResponseException; -use Symfony\Component\HttpKernel\Exception\HttpException; use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\Servers\SendCommandRequest; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use App\Models\Server; +use Dedoc\Scramble\Attributes\Group; +use Exception; +use GuzzleHttp\Exception\BadResponseException; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\Response; +use Symfony\Component\HttpKernel\Exception\HttpException; +#[Group('Server', weight: 1)] class CommandController extends ClientApiController { /** + * Send command + * * Send a command to a running server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function index(SendCommandRequest $request, Server $server): Response { try { $server->send($request->input('command')); - } catch (DaemonConnectionException $exception) { + } catch (Exception $exception) { $previous = $exception->getPrevious(); if ($previous instanceof BadResponseException) { - if ( - $previous->getResponse() instanceof ResponseInterface - && $previous->getResponse()->getStatusCode() === Response::HTTP_BAD_GATEWAY - ) { + if ($previous->getResponse()->getStatusCode() === Response::HTTP_BAD_GATEWAY) { throw new HttpException(Response::HTTP_BAD_GATEWAY, 'Server must be online in order to send commands.', $exception); } } @@ -38,7 +39,9 @@ public function index(SendCommandRequest $request, Server $server): Response throw $exception; } - Activity::event('server:console.command')->property('command', $request->input('command'))->log(); + Activity::event('server:console.command') + ->property('command', $request->input('command')) + ->log(); return $this->returnNoContent(); } diff --git a/app/Http/Controllers/Api/Client/Servers/DatabaseController.php b/app/Http/Controllers/Api/Client/Servers/DatabaseController.php index a441bd91b3..445c8b2bcc 100644 --- a/app/Http/Controllers/Api/Client/Servers/DatabaseController.php +++ b/app/Http/Controllers/Api/Client/Servers/DatabaseController.php @@ -2,20 +2,24 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Illuminate\Http\Response; -use App\Models\Server; -use App\Models\Database; +use App\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException; +use App\Exceptions\Service\Database\TooManyDatabasesException; use App\Facades\Activity; -use App\Services\Databases\DatabasePasswordService; -use App\Transformers\Api\Client\DatabaseTransformer; -use App\Services\Databases\DatabaseManagementService; -use App\Services\Databases\DeployServerDatabaseService; use App\Http\Controllers\Api\Client\ClientApiController; -use App\Http\Requests\Api\Client\Servers\Databases\GetDatabasesRequest; -use App\Http\Requests\Api\Client\Servers\Databases\StoreDatabaseRequest; use App\Http\Requests\Api\Client\Servers\Databases\DeleteDatabaseRequest; +use App\Http\Requests\Api\Client\Servers\Databases\GetDatabasesRequest; use App\Http\Requests\Api\Client\Servers\Databases\RotatePasswordRequest; +use App\Http\Requests\Api\Client\Servers\Databases\StoreDatabaseRequest; +use App\Models\Database; +use App\Models\Server; +use App\Services\Databases\DatabaseManagementService; +use App\Services\Databases\DeployServerDatabaseService; +use App\Transformers\Api\Client\DatabaseTransformer; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\Response; +use Throwable; +#[Group('Server - Database')] class DatabaseController extends ClientApiController { /** @@ -24,13 +28,16 @@ class DatabaseController extends ClientApiController public function __construct( private DeployServerDatabaseService $deployDatabaseService, private DatabaseManagementService $managementService, - private DatabasePasswordService $passwordService ) { parent::__construct(); } /** + * List databases + * * Return all the databases that belong to the given server. + * + * @return array */ public function index(GetDatabasesRequest $request, Server $server): array { @@ -40,20 +47,27 @@ public function index(GetDatabasesRequest $request, Server $server): array } /** + * Create database + * * Create a new database for the given server and return it. * - * @throws \Throwable - * @throws \App\Exceptions\Service\Database\TooManyDatabasesException - * @throws \App\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException + * @return array + * + * @throws Throwable + * @throws TooManyDatabasesException + * @throws DatabaseClientFeatureNotEnabledException */ public function store(StoreDatabaseRequest $request, Server $server): array { - $database = $this->deployDatabaseService->handle($server, $request->validated()); + $database = Activity::event('server:database.create')->transaction(function ($log) use ($request, $server) { + $server->databases()->lockForUpdate(); - Activity::event('server:database.create') - ->subject($database) - ->property('name', $database->database) - ->log(); + $database = $this->deployDatabaseService->handle($server, $request->validated()); + + $log->subject($database)->property('name', $database->database); + + return $database; + }); return $this->fractal->item($database) ->parseIncludes(['password']) @@ -62,14 +76,18 @@ public function store(StoreDatabaseRequest $request, Server $server): array } /** + * Rotate password + * * Rotates the password for the given server model and returns a fresh instance to * the caller. * - * @throws \Throwable + * @return array + * + * @throws Throwable */ public function rotatePassword(RotatePasswordRequest $request, Server $server, Database $database): array { - $this->passwordService->handle($database); + $this->managementService->rotatePassword($database); $database->refresh(); Activity::event('server:database.rotate-password') @@ -84,6 +102,8 @@ public function rotatePassword(RotatePasswordRequest $request, Server $server, D } /** + * Delete database + * * Removes a database from the server. */ public function delete(DeleteDatabaseRequest $request, Server $server, Database $database): Response diff --git a/app/Http/Controllers/Api/Client/Servers/FileController.php b/app/Http/Controllers/Api/Client/Servers/FileController.php index 09d354a362..f9da65caa9 100644 --- a/app/Http/Controllers/Api/Client/Servers/FileController.php +++ b/app/Http/Controllers/Api/Client/Servers/FileController.php @@ -2,27 +2,31 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Carbon\CarbonImmutable; -use Illuminate\Http\Response; -use App\Models\Server; -use Illuminate\Http\JsonResponse; use App\Facades\Activity; -use App\Services\Nodes\NodeJWTService; -use App\Repositories\Daemon\DaemonFileRepository; -use App\Transformers\Api\Client\FileObjectTransformer; use App\Http\Controllers\Api\Client\ClientApiController; -use App\Http\Requests\Api\Client\Servers\Files\CopyFileRequest; -use App\Http\Requests\Api\Client\Servers\Files\PullFileRequest; -use App\Http\Requests\Api\Client\Servers\Files\ListFilesRequest; use App\Http\Requests\Api\Client\Servers\Files\ChmodFilesRequest; -use App\Http\Requests\Api\Client\Servers\Files\DeleteFileRequest; -use App\Http\Requests\Api\Client\Servers\Files\RenameFileRequest; -use App\Http\Requests\Api\Client\Servers\Files\CreateFolderRequest; use App\Http\Requests\Api\Client\Servers\Files\CompressFilesRequest; +use App\Http\Requests\Api\Client\Servers\Files\CopyFileRequest; +use App\Http\Requests\Api\Client\Servers\Files\CreateFolderRequest; use App\Http\Requests\Api\Client\Servers\Files\DecompressFilesRequest; +use App\Http\Requests\Api\Client\Servers\Files\DeleteFileRequest; use App\Http\Requests\Api\Client\Servers\Files\GetFileContentsRequest; +use App\Http\Requests\Api\Client\Servers\Files\ListFilesRequest; +use App\Http\Requests\Api\Client\Servers\Files\PullFileRequest; +use App\Http\Requests\Api\Client\Servers\Files\RenameFileRequest; use App\Http\Requests\Api\Client\Servers\Files\WriteFileContentRequest; +use App\Models\Server; +use App\Repositories\Daemon\DaemonFileRepository; +use App\Services\Nodes\NodeJWTService; +use App\Transformers\Api\Client\FileObjectTransformer; +use Carbon\CarbonImmutable; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Throwable; +#[Group('Server - File', weight: 0)] class FileController extends ClientApiController { /** @@ -36,9 +40,13 @@ public function __construct( } /** + * List files + * * Returns a listing of files in a given directory. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @return array + * + * @throws ConnectionException */ public function directory(ListFilesRequest $request, Server $server): array { @@ -52,9 +60,11 @@ public function directory(ListFilesRequest $request, Server $server): array } /** + * View file + * * Return the contents of a specified file for the user. * - * @throws \Throwable + * @throws Throwable */ public function contents(GetFileContentsRequest $request, Server $server): Response { @@ -63,16 +73,21 @@ public function contents(GetFileContentsRequest $request, Server $server): Respo config('panel.files.max_edit_size') ); - Activity::event('server:file.read')->property('file', $request->get('file'))->log(); + Activity::event('server:file.read') + ->property('file', $request->get('file')) + ->log(); return new Response($response, Response::HTTP_OK, ['Content-Type' => 'text/plain']); } /** - * Generates a one-time token with a link that the user can use to - * download a given file. + * Download file + * + * Generates a one-time token with a link that the user can use to download a given file. * - * @throws \Throwable + * @return array + * + * @throws Throwable */ public function download(GetFileContentsRequest $request, Server $server): array { @@ -100,23 +115,31 @@ public function download(GetFileContentsRequest $request, Server $server): array } /** + * Write file + * * Writes the contents of the specified file to the server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function write(WriteFileContentRequest $request, Server $server): JsonResponse { - $this->fileRepository->setServer($server)->putContent($request->get('file'), $request->getContent()); + $this->fileRepository + ->setServer($server) + ->putContent($request->get('file'), $request->getContent()); - Activity::event('server:file.write')->property('file', $request->get('file'))->log(); + Activity::event('server:file.write') + ->property('file', $request->get('file')) + ->log(); return new JsonResponse([], Response::HTTP_NO_CONTENT); } /** + * Create directory + * * Creates a new folder on the server. * - * @throws \Throwable + * @throws Throwable */ public function create(CreateFolderRequest $request, Server $server): JsonResponse { @@ -133,28 +156,36 @@ public function create(CreateFolderRequest $request, Server $server): JsonRespon } /** + * Rename file + * * Renames a file on the remote machine. * - * @throws \Throwable + * @throws Throwable */ public function rename(RenameFileRequest $request, Server $server): JsonResponse { + $files = $request->input('files'); + $this->fileRepository ->setServer($server) - ->renameFiles($request->input('root'), $request->input('files')); + ->renameFiles($request->input('root'), $files); Activity::event('server:file.rename') ->property('directory', $request->input('root')) - ->property('files', $request->input('files')) + ->property('files', $files) + ->property('to', $files[0]['to']) + ->property('from', $files[0]['from']) ->log(); return new JsonResponse([], Response::HTTP_NO_CONTENT); } /** + * Copy file + * * Copies a file on the server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function copy(CopyFileRequest $request, Server $server): JsonResponse { @@ -162,22 +193,31 @@ public function copy(CopyFileRequest $request, Server $server): JsonResponse ->setServer($server) ->copyFile($request->input('location')); - Activity::event('server:file.copy')->property('file', $request->input('location'))->log(); + Activity::event('server:file.copy') + ->property('file', $request->input('location')) + ->log(); return new JsonResponse([], Response::HTTP_NO_CONTENT); } /** - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * Compress files + * + * @return array + * + * @throws ConnectionException */ public function compress(CompressFilesRequest $request, Server $server): array { $file = $this->fileRepository->setServer($server)->compressFiles( $request->input('root'), - $request->input('files') + $request->input('files'), + $request->input('name'), + $request->input('extension') ); Activity::event('server:file.compress') + ->property('name', $file['name']) ->property('directory', $request->input('root')) ->property('files', $request->input('files')) ->log(); @@ -188,7 +228,9 @@ public function compress(CompressFilesRequest $request, Server $server): array } /** - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * Decompress files + * + * @throws ConnectionException */ public function decompress(DecompressFilesRequest $request, Server $server): JsonResponse { @@ -201,16 +243,18 @@ public function decompress(DecompressFilesRequest $request, Server $server): Jso Activity::event('server:file.decompress') ->property('directory', $request->input('root')) - ->property('files', $request->input('file')) + ->property('file', $request->input('file')) ->log(); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } /** + * Delete files/ folders + * * Deletes files or folders for the server in the given root directory. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function delete(DeleteFileRequest $request, Server $server): JsonResponse { @@ -228,9 +272,11 @@ public function delete(DeleteFileRequest $request, Server $server): JsonResponse } /** + * Update file permissions + * * Updates file permissions for file(s) in the given root directory. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function chmod(ChmodFilesRequest $request, Server $server): JsonResponse { @@ -243,9 +289,11 @@ public function chmod(ChmodFilesRequest $request, Server $server): JsonResponse } /** + * Pull remote file + * * Requests that a file be downloaded from a remote location by daemon. * - * @throws \Throwable + * @throws Throwable */ public function pull(PullFileRequest $request, Server $server): JsonResponse { diff --git a/app/Http/Controllers/Api/Client/Servers/FileUploadController.php b/app/Http/Controllers/Api/Client/Servers/FileUploadController.php index e48dd75bdf..3e4ba47e79 100644 --- a/app/Http/Controllers/Api/Client/Servers/FileUploadController.php +++ b/app/Http/Controllers/Api/Client/Servers/FileUploadController.php @@ -2,14 +2,16 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Carbon\CarbonImmutable; -use App\Models\User; -use App\Models\Server; -use Illuminate\Http\JsonResponse; -use App\Services\Nodes\NodeJWTService; use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\Servers\Files\UploadFileRequest; +use App\Models\Server; +use App\Models\User; +use App\Services\Nodes\NodeJWTService; +use Carbon\CarbonImmutable; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\JsonResponse; +#[Group('Server - File', weight: 1)] class FileUploadController extends ClientApiController { /** @@ -22,6 +24,8 @@ public function __construct( } /** + * Get upload url + * * Returns an url where files can be uploaded to. */ public function __invoke(UploadFileRequest $request, Server $server): JsonResponse diff --git a/app/Http/Controllers/Api/Client/Servers/NetworkAllocationController.php b/app/Http/Controllers/Api/Client/Servers/NetworkAllocationController.php index 948fbbaced..fc8ae338d9 100644 --- a/app/Http/Controllers/Api/Client/Servers/NetworkAllocationController.php +++ b/app/Http/Controllers/Api/Client/Servers/NetworkAllocationController.php @@ -2,20 +2,23 @@ namespace App\Http\Controllers\Api\Client\Servers; -use App\Models\Server; -use Illuminate\Http\JsonResponse; -use App\Facades\Activity; -use App\Models\Allocation; use App\Exceptions\DisplayException; -use App\Transformers\Api\Client\AllocationTransformer; +use App\Exceptions\Model\DataValidationException; +use App\Facades\Activity; use App\Http\Controllers\Api\Client\ClientApiController; -use App\Services\Allocations\FindAssignableAllocationService; +use App\Http\Requests\Api\Client\Servers\Network\DeleteAllocationRequest; use App\Http\Requests\Api\Client\Servers\Network\GetNetworkRequest; use App\Http\Requests\Api\Client\Servers\Network\NewAllocationRequest; -use App\Http\Requests\Api\Client\Servers\Network\DeleteAllocationRequest; -use App\Http\Requests\Api\Client\Servers\Network\UpdateAllocationRequest; use App\Http\Requests\Api\Client\Servers\Network\SetPrimaryAllocationRequest; +use App\Http\Requests\Api\Client\Servers\Network\UpdateAllocationRequest; +use App\Models\Allocation; +use App\Models\Server; +use App\Services\Allocations\FindAssignableAllocationService; +use App\Transformers\Api\Client\AllocationTransformer; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\JsonResponse; +#[Group('Server - Allocation')] class NetworkAllocationController extends ClientApiController { /** @@ -28,8 +31,12 @@ public function __construct( } /** + * List allocations + * * Lists all the allocations available to a server and whether * they are currently assigned as the primary for this server. + * + * @return array */ public function index(GetNetworkRequest $request, Server $server): array { @@ -39,9 +46,13 @@ public function index(GetNetworkRequest $request, Server $server): array } /** + * Update allocation + * * Set the primary allocation for a server. * - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DataValidationException */ public function update(UpdateAllocationRequest $request, Server $server, Allocation $allocation): array { @@ -52,7 +63,7 @@ public function update(UpdateAllocationRequest $request, Server $server, Allocat if ($original !== $allocation->notes) { Activity::event('server:allocation.notes') ->subject($allocation) - ->property(['allocation' => $allocation->toString(), 'old' => $original, 'new' => $allocation->notes]) + ->property(['allocation' => $allocation->address, 'old' => $original, 'new' => $allocation->notes]) ->log(); } @@ -62,9 +73,13 @@ public function update(UpdateAllocationRequest $request, Server $server, Allocat } /** + * Set primary allocation + * * Set the primary allocation for a server. * - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DataValidationException */ public function setPrimary(SetPrimaryAllocationRequest $request, Server $server, Allocation $allocation): array { @@ -73,7 +88,7 @@ public function setPrimary(SetPrimaryAllocationRequest $request, Server $server, Activity::event('server:allocation.primary') ->subject($allocation) - ->property('allocation', $allocation->toString()) + ->property('allocation', $allocation->address) ->log(); return $this->fractal->item($allocation) @@ -82,23 +97,29 @@ public function setPrimary(SetPrimaryAllocationRequest $request, Server $server, } /** + * Create allocation + * * Set the notes for the allocation for a server. - *s. * - * @throws \App\Exceptions\DisplayException + * @return array + * + * @throws DisplayException */ public function store(NewAllocationRequest $request, Server $server): array { - if ($server->allocations()->count() >= $server->allocation_limit) { - throw new DisplayException('Cannot assign additional allocations to this server: limit has been reached.'); - } + $allocation = Activity::event('server:allocation.create')->transaction(function ($log) use ($server) { + $server->allocations()->lockForUpdate(); - $allocation = $this->assignableAllocationService->handle($server); + if ($server->allocations->count() >= $server->allocation_limit) { + throw new DisplayException('Cannot assign additional allocations to this server: limit has been reached.'); + } - Activity::event('server:allocation.create') - ->subject($allocation) - ->property('allocation', $allocation->toString()) - ->log(); + $allocation = $this->assignableAllocationService->handle($server); + + $log->subject($allocation)->property('allocation', $allocation->address); + + return $allocation; + }); return $this->fractal->item($allocation) ->transformWith($this->getTransformer(AllocationTransformer::class)) @@ -106,9 +127,11 @@ public function store(NewAllocationRequest $request, Server $server): array } /** + * Delete allocation + * * Delete an allocation from a server. * - * @throws \App\Exceptions\DisplayException + * @throws DisplayException */ public function delete(DeleteAllocationRequest $request, Server $server, Allocation $allocation): JsonResponse { @@ -118,10 +141,6 @@ public function delete(DeleteAllocationRequest $request, Server $server, Allocat throw new DisplayException('You cannot delete allocations for this server: no allocation limit is set.'); } - if ($allocation->id === $server->allocation_id) { - throw new DisplayException('You cannot delete the primary allocation for this server.'); - } - Allocation::query()->where('id', $allocation->id)->update([ 'notes' => null, 'server_id' => null, @@ -129,7 +148,7 @@ public function delete(DeleteAllocationRequest $request, Server $server, Allocat Activity::event('server:allocation.delete') ->subject($allocation) - ->property('allocation', $allocation->toString()) + ->property('allocation', $allocation->address) ->log(); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); diff --git a/app/Http/Controllers/Api/Client/Servers/PowerController.php b/app/Http/Controllers/Api/Client/Servers/PowerController.php index 2b4a5993d8..2d67b4b1b7 100644 --- a/app/Http/Controllers/Api/Client/Servers/PowerController.php +++ b/app/Http/Controllers/Api/Client/Servers/PowerController.php @@ -2,29 +2,36 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Illuminate\Http\Response; -use App\Models\Server; use App\Facades\Activity; -use App\Repositories\Daemon\DaemonPowerRepository; use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\Servers\SendPowerRequest; +use App\Models\Server; +use App\Repositories\Daemon\DaemonServerRepository; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\Response; +#[Group('Server', weight: 2)] class PowerController extends ClientApiController { /** * PowerController constructor. */ - public function __construct(private DaemonPowerRepository $repository) + public function __construct(private DaemonServerRepository $repository) { parent::__construct(); } /** + * Send power action + * * Send a power action to a server. + * + * @throws ConnectionException */ public function index(SendPowerRequest $request, Server $server): Response { - $this->repository->setServer($server)->send( + $this->repository->setServer($server)->power( $request->input('signal') ); diff --git a/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php b/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php index 26bfcf1273..b9c3d8520f 100644 --- a/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php +++ b/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php @@ -2,14 +2,17 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Carbon\Carbon; -use App\Models\Server; -use Illuminate\Cache\Repository; -use App\Transformers\Api\Client\StatsTransformer; -use App\Repositories\Daemon\DaemonServerRepository; use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\Servers\GetServerRequest; +use App\Models\Server; +use App\Repositories\Daemon\DaemonServerRepository; +use App\Transformers\Api\Client\StatsTransformer; +use Carbon\Carbon; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Cache\Repository; +use Illuminate\Http\Client\ConnectionException; +#[Group('Server', weight: 3)] class ResourceUtilizationController extends ClientApiController { /** @@ -21,11 +24,15 @@ public function __construct(private Repository $cache, private DaemonServerRepos } /** + * View resources + * * Return the current resource utilization for a server. This value is cached for up to * 20 seconds at a time to ensure that repeated requests to this endpoint do not cause * a flood of unnecessary API calls. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @return array + * + * @throws ConnectionException */ public function __invoke(GetServerRequest $request, Server $server): array { diff --git a/app/Http/Controllers/Api/Client/Servers/ScheduleController.php b/app/Http/Controllers/Api/Client/Servers/ScheduleController.php index 3cd1329d73..9308d4ae37 100644 --- a/app/Http/Controllers/Api/Client/Servers/ScheduleController.php +++ b/app/Http/Controllers/Api/Client/Servers/ScheduleController.php @@ -2,26 +2,30 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Carbon\Carbon; -use Exception; -use Illuminate\Http\Request; -use Illuminate\Http\Response; -use App\Models\Server; -use App\Models\Schedule; -use Illuminate\Http\JsonResponse; +use App\Exceptions\DisplayException; +use App\Exceptions\Model\DataValidationException; use App\Facades\Activity; use App\Helpers\Utilities; -use App\Exceptions\DisplayException; -use App\Services\Schedules\ProcessScheduleService; -use App\Transformers\Api\Client\ScheduleTransformer; use App\Http\Controllers\Api\Client\ClientApiController; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use App\Http\Requests\Api\Client\Servers\Schedules\ViewScheduleRequest; -use App\Http\Requests\Api\Client\Servers\Schedules\StoreScheduleRequest; use App\Http\Requests\Api\Client\Servers\Schedules\DeleteScheduleRequest; -use App\Http\Requests\Api\Client\Servers\Schedules\UpdateScheduleRequest; +use App\Http\Requests\Api\Client\Servers\Schedules\StoreScheduleRequest; use App\Http\Requests\Api\Client\Servers\Schedules\TriggerScheduleRequest; +use App\Http\Requests\Api\Client\Servers\Schedules\UpdateScheduleRequest; +use App\Http\Requests\Api\Client\Servers\Schedules\ViewScheduleRequest; +use App\Models\Schedule; +use App\Models\Server; +use App\Services\Schedules\ProcessScheduleService; +use App\Transformers\Api\Client\ScheduleTransformer; +use Carbon\Carbon; +use Dedoc\Scramble\Attributes\Group; +use Exception; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Http\Response; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Throwable; +#[Group('Server - Schedule', weight: 0)] class ScheduleController extends ClientApiController { /** @@ -33,7 +37,11 @@ public function __construct(private ProcessScheduleService $service) } /** + * List schedules + * * Returns all the schedules belonging to a given server. + * + * @return array */ public function index(ViewScheduleRequest $request, Server $server): array { @@ -45,14 +53,18 @@ public function index(ViewScheduleRequest $request, Server $server): array } /** + * Create schedule + * * Store a new schedule for a server. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DisplayException + * @throws DataValidationException */ public function store(StoreScheduleRequest $request, Server $server): array { - /** @var \App\Models\Schedule $model */ + /** @var Schedule $model */ $model = Schedule::query()->create([ 'server_id' => $server->id, 'name' => $request->input('name'), @@ -77,7 +89,11 @@ public function store(StoreScheduleRequest $request, Server $server): array } /** + * View schedule + * * Returns a specific schedule for the server. + * + * @return array */ public function view(ViewScheduleRequest $request, Server $server, Schedule $schedule): array { @@ -93,10 +109,14 @@ public function view(ViewScheduleRequest $request, Server $server, Schedule $sch } /** + * Update schedule + * * Updates a given schedule with the new data provided. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DisplayException + * @throws DataValidationException */ public function update(UpdateScheduleRequest $request, Server $server, Schedule $schedule): array { @@ -133,10 +153,12 @@ public function update(UpdateScheduleRequest $request, Server $server, Schedule } /** + * Run schedule + * * Executes a given schedule immediately rather than waiting on it's normally scheduled time * to pass. This does not care about the schedule state. * - * @throws \Throwable + * @throws Throwable */ public function execute(TriggerScheduleRequest $request, Server $server, Schedule $schedule): JsonResponse { @@ -148,6 +170,8 @@ public function execute(TriggerScheduleRequest $request, Server $server, Schedul } /** + * Delete schedule + * * Deletes a schedule and it's associated tasks. */ public function delete(DeleteScheduleRequest $request, Server $server, Schedule $schedule): JsonResponse @@ -162,7 +186,7 @@ public function delete(DeleteScheduleRequest $request, Server $server, Schedule /** * Get the next run timestamp based on the cron data provided. * - * @throws \App\Exceptions\DisplayException + * @throws DisplayException */ protected function getNextRunAt(Request $request): Carbon { diff --git a/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php b/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php index 51658bf128..ed817cc3b4 100644 --- a/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php +++ b/app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php @@ -2,22 +2,26 @@ namespace App\Http\Controllers\Api\Client\Servers; -use App\Models\Task; -use Illuminate\Http\Response; -use App\Models\Server; -use App\Models\Schedule; -use Illuminate\Http\JsonResponse; -use App\Facades\Activity; -use App\Models\Permission; -use Illuminate\Database\ConnectionInterface; +use App\Enums\SubuserPermission; use App\Exceptions\Http\HttpForbiddenException; -use App\Transformers\Api\Client\TaskTransformer; -use App\Http\Requests\Api\Client\ClientApiRequest; -use App\Http\Controllers\Api\Client\ClientApiController; +use App\Exceptions\Model\DataValidationException; use App\Exceptions\Service\ServiceLimitExceededException; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use App\Facades\Activity; +use App\Http\Controllers\Api\Client\ClientApiController; +use App\Http\Requests\Api\Client\ClientApiRequest; use App\Http\Requests\Api\Client\Servers\Schedules\StoreTaskRequest; +use App\Models\Schedule; +use App\Models\Server; +use App\Models\Task; +use App\Transformers\Api\Client\TaskTransformer; +use Dedoc\Scramble\Attributes\Group; +use Exception; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +#[Group('Server - Schedule', weight: 1)] class ScheduleTaskController extends ClientApiController { /** @@ -30,10 +34,14 @@ public function __construct( } /** + * Create task + * * Create a new task for a given schedule and store it in the database. * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\ServiceLimitExceededException + * @return array + * + * @throws DataValidationException + * @throws ServiceLimitExceededException */ public function store(StoreTaskRequest $request, Server $server, Schedule $schedule): array { @@ -46,10 +54,10 @@ public function store(StoreTaskRequest $request, Server $server, Schedule $sched throw new HttpForbiddenException("A backup task cannot be created when the server's backup limit is set to 0."); } - /** @var \App\Models\Task|null $lastTask */ + /** @var Task|null $lastTask */ $lastTask = $schedule->tasks()->orderByDesc('sequence_id')->first(); - /** @var \App\Models\Task $task */ + /** @var Task $task */ $task = $this->connection->transaction(function () use ($request, $schedule, $lastTask) { $sequenceId = ($lastTask->sequence_id ?? 0) + 1; $requestSequenceId = $request->integer('sequence_id', $sequenceId); @@ -91,9 +99,13 @@ public function store(StoreTaskRequest $request, Server $server, Schedule $sched } /** + * Update task + * * Updates a given task for a server. * - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DataValidationException */ public function update(StoreTaskRequest $request, Server $server, Schedule $schedule, Task $task): array { @@ -145,10 +157,12 @@ public function update(StoreTaskRequest $request, Server $server, Schedule $sche } /** + * Delete task + * * Delete a given task for a schedule. If there are subsequent tasks stored in the database * for this schedule their sequence IDs are decremented properly. * - * @throws \Exception + * @throws Exception */ public function delete(ClientApiRequest $request, Server $server, Schedule $schedule, Task $task): JsonResponse { @@ -156,7 +170,7 @@ public function delete(ClientApiRequest $request, Server $server, Schedule $sche throw new NotFoundHttpException(); } - if (!$request->user()->can(Permission::ACTION_SCHEDULE_UPDATE, $server)) { + if (!$request->user()->can(SubuserPermission::ScheduleDelete, $server)) { throw new HttpForbiddenException('You do not have permission to perform this action.'); } diff --git a/app/Http/Controllers/Api/Client/Servers/ServerController.php b/app/Http/Controllers/Api/Client/Servers/ServerController.php index 71ac187b71..b524c59bca 100644 --- a/app/Http/Controllers/Api/Client/Servers/ServerController.php +++ b/app/Http/Controllers/Api/Client/Servers/ServerController.php @@ -2,25 +2,27 @@ namespace App\Http\Controllers\Api\Client\Servers; -use App\Models\Server; -use App\Transformers\Api\Client\ServerTransformer; -use App\Services\Servers\GetUserPermissionsService; use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\Servers\GetServerRequest; +use App\Models\Server; +use App\Services\Servers\GetUserPermissionsService; +use App\Transformers\Api\Client\ServerTransformer; +use Dedoc\Scramble\Attributes\Group; +#[Group('Server', weight: 0)] class ServerController extends ClientApiController { - /** - * ServerController constructor. - */ public function __construct(private GetUserPermissionsService $permissionsService) { parent::__construct(); } /** - * Transform an individual server into a response that can be consumed by a - * client using the API. + * View server + * + * Transform an individual server into a response that can be consumed by a client using the API. + * + * @return array */ public function index(GetServerRequest $request, Server $server): array { diff --git a/app/Http/Controllers/Api/Client/Servers/SettingsController.php b/app/Http/Controllers/Api/Client/Servers/SettingsController.php index af82794fd9..8b60e8935a 100644 --- a/app/Http/Controllers/Api/Client/Servers/SettingsController.php +++ b/app/Http/Controllers/Api/Client/Servers/SettingsController.php @@ -4,15 +4,19 @@ use App\Facades\Activity; use App\Http\Controllers\Api\Client\ClientApiController; +use App\Http\Requests\Api\Client\Servers\Settings\DescriptionServerRequest; use App\Http\Requests\Api\Client\Servers\Settings\ReinstallServerRequest; use App\Http\Requests\Api\Client\Servers\Settings\RenameServerRequest; use App\Http\Requests\Api\Client\Servers\Settings\SetDockerImageRequest; use App\Models\Server; use App\Services\Servers\ReinstallServerService; +use Dedoc\Scramble\Attributes\Group; use Illuminate\Http\JsonResponse; use Illuminate\Http\Response; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Throwable; +#[Group('Server - Settings')] class SettingsController extends ClientApiController { /** @@ -25,30 +29,42 @@ public function __construct( } /** + * Rename + * * Renames a server. */ public function rename(RenameServerRequest $request, Server $server): JsonResponse { + $originalName = $server->name; $name = $request->input('name'); - $description = $request->has('description') ? (string) $request->input('description') : $server->description; - $server->name = $name; + $server->update(['name' => $name]); - if (config('panel.editable_server_descriptions')) { - $server->description = $description; + if ($server->wasChanged('name')) { + Activity::event('server:settings.rename') + ->property(['old' => $originalName, 'new' => $name]) + ->log(); } - $server->save(); + return new JsonResponse([], Response::HTTP_NO_CONTENT); + } - if ($server->name !== $name) { - Activity::event('server:settings.rename') - ->property(['old' => $server->name, 'new' => $name]) - ->log(); + /** + * Update server description + */ + public function description(DescriptionServerRequest $request, Server $server): JsonResponse + { + if (!config('panel.editable_server_descriptions')) { + return new JsonResponse([], Response::HTTP_FORBIDDEN); } - if ($server->description !== $description) { + $originalDescription = $server->description; + $description = $request->input('description'); + $server->update(['description' => $description ?? '']); + + if ($server->wasChanged('description')) { Activity::event('server:settings.description') - ->property(['old' => $server->description, 'new' => $description]) + ->property(['old' => $originalDescription, 'new' => $description]) ->log(); } @@ -56,9 +72,11 @@ public function rename(RenameServerRequest $request, Server $server): JsonRespon } /** + * Reinstall + * * Reinstalls the server on the daemon. * - * @throws \Throwable + * @throws Throwable */ public function reinstall(ReinstallServerRequest $request, Server $server): JsonResponse { @@ -70,13 +88,15 @@ public function reinstall(ReinstallServerRequest $request, Server $server): Json } /** + * Change docker image + * * Changes the Docker image in use by the server. * - * @throws \Throwable + * @throws Throwable */ public function dockerImage(SetDockerImageRequest $request, Server $server): JsonResponse { - if (!in_array($server->image, array_values($server->egg->docker_images))) { + if (!in_array($server->image, $server->egg->docker_images)) { throw new BadRequestHttpException('This server\'s Docker image has been manually set by an administrator and cannot be updated.'); } diff --git a/app/Http/Controllers/Api/Client/Servers/StartupController.php b/app/Http/Controllers/Api/Client/Servers/StartupController.php index abfc2686ac..36f485b746 100644 --- a/app/Http/Controllers/Api/Client/Servers/StartupController.php +++ b/app/Http/Controllers/Api/Client/Servers/StartupController.php @@ -2,16 +2,20 @@ namespace App\Http\Controllers\Api\Client\Servers; -use App\Models\Server; +use App\Exceptions\Model\DataValidationException; use App\Facades\Activity; +use App\Http\Controllers\Api\Client\ClientApiController; +use App\Http\Requests\Api\Client\Servers\Startup\GetStartupRequest; +use App\Http\Requests\Api\Client\Servers\Startup\UpdateStartupVariableRequest; +use App\Models\Server; use App\Models\ServerVariable; use App\Services\Servers\StartupCommandService; use App\Transformers\Api\Client\EggVariableTransformer; -use App\Http\Controllers\Api\Client\ClientApiController; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -use App\Http\Requests\Api\Client\Servers\Startup\GetStartupRequest; -use App\Http\Requests\Api\Client\Servers\Startup\UpdateStartupVariableRequest; +#[Group('Server - Startup')] class StartupController extends ClientApiController { /** @@ -24,14 +28,18 @@ public function __construct( } /** + * List startup variables + * * Returns the startup information for the server including all the variables. + * + * @return array */ public function index(GetStartupRequest $request, Server $server): array { $startup = $this->startupCommandService->handle($server); return $this->fractal->collection( - $server->variables()->orderBy('sort')->where('user_viewable', true)->get() + $server->variables()->where('user_viewable', true)->orderBy('sort')->get() ) ->transformWith($this->getTransformer(EggVariableTransformer::class)) ->addMeta([ @@ -43,10 +51,14 @@ public function index(GetStartupRequest $request, Server $server): array } /** + * Update startup variable + * * Updates a single variable for a server. * - * @throws \Illuminate\Validation\ValidationException - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws ValidationException + * @throws DataValidationException */ public function update(UpdateStartupVariableRequest $request, Server $server): array { @@ -61,7 +73,7 @@ public function update(UpdateStartupVariableRequest $request, Server $server): a $original = $variable->server_value; // Revalidate the variable value using the egg variable specific validation rules for it. - $this->validate($request, ['value' => $variable->rules]); + $request->validate(['value' => $variable->rules]); ServerVariable::query()->updateOrCreate([ 'server_id' => $server->id, diff --git a/app/Http/Controllers/Api/Client/Servers/SubuserController.php b/app/Http/Controllers/Api/Client/Servers/SubuserController.php index 82c73b5bf2..2a19a35a98 100644 --- a/app/Http/Controllers/Api/Client/Servers/SubuserController.php +++ b/app/Http/Controllers/Api/Client/Servers/SubuserController.php @@ -2,22 +2,29 @@ namespace App\Http\Controllers\Api\Client\Servers; -use App\Models\User; -use Illuminate\Http\Request; -use App\Models\Server; -use Illuminate\Http\JsonResponse; +use App\Enums\SubuserPermission; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\Subuser\ServerSubuserExistsException; +use App\Exceptions\Service\Subuser\UserIsServerOwnerException; use App\Facades\Activity; -use App\Models\Permission; -use App\Services\Subusers\SubuserCreationService; -use App\Repositories\Daemon\DaemonServerRepository; -use App\Transformers\Api\Client\SubuserTransformer; use App\Http\Controllers\Api\Client\ClientApiController; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use App\Http\Requests\Api\Client\Servers\Subusers\DeleteSubuserRequest; use App\Http\Requests\Api\Client\Servers\Subusers\GetSubuserRequest; use App\Http\Requests\Api\Client\Servers\Subusers\StoreSubuserRequest; -use App\Http\Requests\Api\Client\Servers\Subusers\DeleteSubuserRequest; use App\Http\Requests\Api\Client\Servers\Subusers\UpdateSubuserRequest; +use App\Models\Server; +use App\Models\Subuser; +use App\Models\User; +use App\Services\Subusers\SubuserCreationService; +use App\Services\Subusers\SubuserDeletionService; +use App\Services\Subusers\SubuserUpdateService; +use App\Transformers\Api\Client\SubuserTransformer; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Throwable; +#[Group('Server - Subuser')] class SubuserController extends ClientApiController { /** @@ -25,13 +32,18 @@ class SubuserController extends ClientApiController */ public function __construct( private SubuserCreationService $creationService, - private DaemonServerRepository $serverRepository + private SubuserUpdateService $updateService, + private SubuserDeletionService $deletionService ) { parent::__construct(); } /** + * List subusers + * * Return the users associated with this server instance. + * + * @return array */ public function index(GetSubuserRequest $request, Server $server): array { @@ -41,7 +53,11 @@ public function index(GetSubuserRequest $request, Server $server): array } /** + * View subusers + * * Returns a single subuser associated with this server instance. + * + * @return array */ public function view(GetSubuserRequest $request, Server $server, User $user): array { @@ -53,75 +69,49 @@ public function view(GetSubuserRequest $request, Server $server, User $user): ar } /** + * Create subuser + * * Create a new subuser for the given server. * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Subuser\ServerSubuserExistsException - * @throws \App\Exceptions\Service\Subuser\UserIsServerOwnerException - * @throws \Throwable + * @return array + * + * @throws DataValidationException + * @throws ServerSubuserExistsException + * @throws UserIsServerOwnerException + * @throws Throwable */ public function store(StoreSubuserRequest $request, Server $server): array { - $response = $this->creationService->handle( - $server, - $request->input('email'), - $this->getDefaultPermissions($request) - ); + $email = $request->input('email'); + $permissions = $this->getCleanedPermissions($request); + + $subuser = $this->creationService->handle($server, $email, $permissions); Activity::event('server:subuser.create') - ->subject($response->user) - ->property(['email' => $request->input('email'), 'permissions' => $this->getDefaultPermissions($request)]) + ->subject($subuser->user) + ->property(['email' => $email, 'permissions' => $subuser->permissions]) ->log(); - return $this->fractal->item($response) + return $this->fractal->item($subuser) ->transformWith($this->getTransformer(SubuserTransformer::class)) ->toArray(); } /** + * Update subuser + * * Update a given subuser in the system for the server. * - * @throws \App\Exceptions\Model\DataValidationException + * @return array + * + * @throws DataValidationException */ public function update(UpdateSubuserRequest $request, Server $server, User $user): array { - /** @var \App\Models\Subuser $subuser */ + /** @var Subuser $subuser */ $subuser = $request->attributes->get('subuser'); - $permissions = $this->getDefaultPermissions($request); - $current = $subuser->permissions; - - sort($permissions); - sort($current); - - $log = Activity::event('server:subuser.update') - ->subject($subuser->user) - ->property([ - 'email' => $subuser->user->email, - 'old' => $current, - 'new' => $permissions, - 'revoked' => true, - ]); - - // Only update the database and hit up the daemon instance to invalidate JTI's if the permissions - // have actually changed for the user. - if ($permissions !== $current) { - $log->transaction(function ($instance) use ($request, $subuser, $server) { - $subuser->update(['permissions' => $this->getDefaultPermissions($request)]); - - try { - $this->serverRepository->setServer($server)->revokeUserJTI($subuser->user_id); - } catch (DaemonConnectionException $exception) { - // Don't block this request if we can't connect to the daemon instance. Chances are it is - // offline and the token will be invalid once daemon boots back. - logger()->warning($exception, ['user_id' => $subuser->user_id, 'server_id' => $server->id]); - - $instance->property('revoked', false); - } - }); - } - - $log->reset(); + $this->updateService->handle($subuser, $server, $this->getCleanedPermissions($request)); return $this->fractal->item($subuser->refresh()) ->transformWith($this->getTransformer(SubuserTransformer::class)) @@ -129,52 +119,34 @@ public function update(UpdateSubuserRequest $request, Server $server, User $user } /** + * Delete subuser + * * Removes a subusers from a server's assignment. */ public function delete(DeleteSubuserRequest $request, Server $server, User $user): JsonResponse { - /** @var \App\Models\Subuser $subuser */ + /** @var Subuser $subuser */ $subuser = $request->attributes->get('subuser'); - $log = Activity::event('server:subuser.delete') - ->subject($subuser->user) - ->property('email', $subuser->user->email) - ->property('revoked', true); - - $log->transaction(function ($instance) use ($server, $subuser) { - $subuser->delete(); - - try { - $this->serverRepository->setServer($server)->revokeUserJTI($subuser->user_id); - } catch (DaemonConnectionException $exception) { - // Don't block this request if we can't connect to the daemon instance. - logger()->warning($exception, ['user_id' => $subuser->user_id, 'server_id' => $server->id]); - - $instance->property('revoked', false); - } - }); + $this->deletionService->handle($subuser, $server); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } /** - * Returns the default permissions for subusers and parses out any permissions + * Returns the "cleaned" permissions for subusers and parses out any permissions * that were passed that do not also exist in the internally tracked list of * permissions. + * + * @return string[] */ - protected function getDefaultPermissions(Request $request): array + protected function getCleanedPermissions(Request $request): array { - $allowed = Permission::permissions() - ->map(function ($value, $prefix) { - return array_map(function ($value) use ($prefix) { - return "$prefix.$value"; - }, array_keys($value['keys'])); - }) - ->flatten() - ->all(); - - $cleaned = array_intersect($request->input('permissions') ?? [], $allowed); - - return array_unique(array_merge($cleaned, [Permission::ACTION_WEBSOCKET_CONNECT])); + return collect($request->input('permissions') ?? []) + ->intersect(Subuser::allPermissionKeys()) + ->push(SubuserPermission::WebsocketConnect->value) + ->unique() + ->values() + ->toArray(); } } diff --git a/app/Http/Controllers/Api/Client/Servers/WebsocketController.php b/app/Http/Controllers/Api/Client/Servers/WebsocketController.php index 0fb062e962..baf5493ec4 100644 --- a/app/Http/Controllers/Api/Client/Servers/WebsocketController.php +++ b/app/Http/Controllers/Api/Client/Servers/WebsocketController.php @@ -2,16 +2,18 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Carbon\CarbonImmutable; -use App\Models\Server; -use Illuminate\Http\JsonResponse; -use App\Models\Permission; -use App\Services\Nodes\NodeJWTService; +use App\Enums\SubuserPermission; use App\Exceptions\Http\HttpForbiddenException; +use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Server; +use App\Services\Nodes\NodeJWTService; use App\Services\Servers\GetUserPermissionsService; -use App\Http\Controllers\Api\Client\ClientApiController; +use Carbon\CarbonImmutable; +use Dedoc\Scramble\Attributes\Group; +use Illuminate\Http\JsonResponse; +#[Group('Server - Websocket')] class WebsocketController extends ClientApiController { /** @@ -25,6 +27,8 @@ public function __construct( } /** + * Get websocket token + * * Generates a one-time token that is sent along in every websocket call to the Daemon. * This is a signed JWT that the Daemon then uses to verify the user's identity, and * allows us to continually renew this token and avoid users maintaining sessions wrongly, @@ -33,7 +37,7 @@ public function __construct( public function __invoke(ClientApiRequest $request, Server $server): JsonResponse { $user = $request->user(); - if ($user->cannot(Permission::ACTION_WEBSOCKET_CONNECT, $server)) { + if ($user->cannot(SubuserPermission::WebsocketConnect, $server)) { throw new HttpForbiddenException('You do not have permission to connect to this server\'s websocket.'); } diff --git a/app/Http/Controllers/Api/Client/TwoFactorController.php b/app/Http/Controllers/Api/Client/TwoFactorController.php deleted file mode 100644 index 62340e515b..0000000000 --- a/app/Http/Controllers/Api/Client/TwoFactorController.php +++ /dev/null @@ -1,100 +0,0 @@ -user()->use_totp) { - throw new BadRequestHttpException('Two-factor authentication is already enabled on this account.'); - } - - return new JsonResponse([ - 'data' => $this->setupService->handle($request->user()), - ]); - } - - /** - * Updates a user's account to have two-factor enabled. - * - * @throws \Throwable - * @throws \Illuminate\Validation\ValidationException - */ - public function store(Request $request): JsonResponse - { - $validator = $this->validation->make($request->all(), [ - 'code' => ['required', 'string', 'size:6'], - 'password' => ['required', 'string'], - ]); - - $data = $validator->validate(); - if (!password_verify($data['password'], $request->user()->password)) { - throw new BadRequestHttpException('The password provided was not valid.'); - } - - $tokens = $this->toggleTwoFactorService->handle($request->user(), $data['code'], true); - - Activity::event('user:two-factor.create')->log(); - - return new JsonResponse([ - 'object' => 'recovery_tokens', - 'attributes' => [ - 'tokens' => $tokens, - ], - ]); - } - - /** - * Disables two-factor authentication on an account if the password provided - * is valid. - * - * @throws \Throwable - */ - public function delete(Request $request): JsonResponse - { - if (!password_verify($request->input('password') ?? '', $request->user()->password)) { - throw new BadRequestHttpException('The password provided was not valid.'); - } - - /** @var \App\Models\User $user */ - $user = $request->user(); - - $user->update([ - 'totp_authenticated_at' => Carbon::now(), - 'use_totp' => false, - ]); - - Activity::event('user:two-factor.delete')->log(); - - return new JsonResponse([], Response::HTTP_NO_CONTENT); - } -} diff --git a/app/Http/Controllers/Api/Remote/ActivityProcessingController.php b/app/Http/Controllers/Api/Remote/ActivityProcessingController.php index e07584d23f..6c4c92c749 100644 --- a/app/Http/Controllers/Api/Remote/ActivityProcessingController.php +++ b/app/Http/Controllers/Api/Remote/ActivityProcessingController.php @@ -2,23 +2,22 @@ namespace App\Http\Controllers\Api\Remote; -use Carbon\Carbon; -use Illuminate\Support\Str; -use App\Models\User; -use Webmozart\Assert\Assert; -use App\Models\Server; -use App\Models\ActivityLog; -use App\Models\ActivityLogSubject; use App\Http\Controllers\Controller; use App\Http\Requests\Api\Remote\ActivityEventRequest; +use App\Models\ActivityLog; +use App\Models\Node; +use App\Models\Server; +use App\Models\User; +use Carbon\Carbon; +use DateTimeInterface; +use Exception; +use Illuminate\Support\Str; class ActivityProcessingController extends Controller { - public function __invoke(ActivityEventRequest $request) + public function __invoke(ActivityEventRequest $request): void { - $tz = Carbon::now()->getTimezone(); - - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = $request->attributes->get('node'); $servers = $node->servers()->whereIn('uuid', $request->servers())->get()->keyBy('uuid'); @@ -26,7 +25,7 @@ public function __invoke(ActivityEventRequest $request) $logs = []; foreach ($request->input('data') as $datum) { - /** @var \App\Models\Server|null $server */ + /** @var Server|null $server */ $server = $servers->get($datum['server']); if (is_null($server) || !Str::startsWith($datum['event'], 'server:')) { continue; @@ -34,11 +33,11 @@ public function __invoke(ActivityEventRequest $request) try { $when = Carbon::createFromFormat( - \DateTimeInterface::RFC3339, + DateTimeInterface::RFC3339, preg_replace('/(\.\d+)Z$/', 'Z', $datum['timestamp']), 'UTC' ); - } catch (\Exception $exception) { + } catch (Exception $exception) { logger()->warning($exception, ['timestamp' => $datum['timestamp']]); // If we cannot parse the value for some reason don't blow up this request, just go ahead @@ -51,11 +50,8 @@ public function __invoke(ActivityEventRequest $request) $log = [ 'ip' => empty($datum['ip']) ? '127.0.0.1' : $datum['ip'], 'event' => $datum['event'], - 'properties' => json_encode($datum['metadata'] ?? []), - // We have to change the time to the current timezone due to the way Laravel is handling - // the date casting internally. If we just leave it in UTC it ends up getting double-cast - // and the time is way off. - 'timestamp' => $when->setTimezone($tz), + 'properties' => $datum['metadata'] ?? [], + 'timestamp' => $when, ]; if ($user = $users->get($datum['user'])) { @@ -71,19 +67,17 @@ public function __invoke(ActivityEventRequest $request) } foreach ($logs as $key => $data) { - Assert::isInstanceOf($server = $servers->get($key), Server::class); + $server = $servers->get($key); + assert($server instanceof Server); - $batch = []; foreach ($data as $datum) { - $id = ActivityLog::insertGetId($datum); - $batch[] = [ - 'activity_log_id' => $id, + /** @var ActivityLog $activityLog */ + $activityLog = ActivityLog::forceCreate($datum); + $activityLog->subjects()->create([ 'subject_id' => $server->id, 'subject_type' => $server->getMorphClass(), - ]; + ]); } - - ActivityLogSubject::insert($batch); } } } diff --git a/app/Http/Controllers/Api/Remote/Backups/BackupRemoteUploadController.php b/app/Http/Controllers/Api/Remote/Backups/BackupRemoteUploadController.php index 5c72b772f5..fa149c31e6 100644 --- a/app/Http/Controllers/Api/Remote/Backups/BackupRemoteUploadController.php +++ b/app/Http/Controllers/Api/Remote/Backups/BackupRemoteUploadController.php @@ -2,16 +2,21 @@ namespace App\Http\Controllers\Api\Remote\Backups; -use Carbon\CarbonImmutable; -use Illuminate\Http\Request; -use App\Models\Backup; -use Illuminate\Http\JsonResponse; -use App\Http\Controllers\Controller; +use App\Exceptions\Http\HttpForbiddenException; use App\Extensions\Backups\BackupManager; use App\Extensions\Filesystem\S3Filesystem; -use Symfony\Component\HttpKernel\Exception\ConflictHttpException; +use App\Http\Controllers\Controller; +use App\Models\Backup; +use App\Models\Node; +use App\Models\Server; +use Carbon\CarbonImmutable; +use Exception; +use Illuminate\Database\Eloquent\ModelNotFoundException; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -use App\Exceptions\Http\HttpForbiddenException; +use Symfony\Component\HttpKernel\Exception\ConflictHttpException; +use Throwable; class BackupRemoteUploadController extends Controller { @@ -20,21 +25,19 @@ class BackupRemoteUploadController extends Controller /** * BackupRemoteUploadController constructor. */ - public function __construct(private BackupManager $backupManager) - { - } + public function __construct(private BackupManager $backupManager) {} /** * Returns the required presigned urls to upload a backup to S3 cloud storage. * - * @throws \Exception - * @throws \Throwable - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws Exception + * @throws Throwable + * @throws ModelNotFoundException */ public function __invoke(Request $request, string $backup): JsonResponse { // Get the node associated with the request. - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = $request->attributes->get('node'); // Get the size query parameter. @@ -43,14 +46,14 @@ public function __invoke(Request $request, string $backup): JsonResponse throw new BadRequestHttpException('A non-empty "size" query parameter must be provided.'); } - /** @var \App\Models\Backup $model */ + /** @var Backup $model */ $model = Backup::query() ->where('uuid', $backup) ->firstOrFail(); // Check that the backup is "owned" by the node making the request. This avoids other nodes // from messing with backups that they don't own. - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $model->server; if ($server->node_id !== $node->id) { throw new HttpForbiddenException('You do not have permission to access that backup.'); @@ -128,7 +131,7 @@ public function __invoke(Request $request, string $backup): JsonResponse */ private function getConfiguredMaxPartSize(): int { - $maxPartSize = (int) config('backups.max_part_size', self::DEFAULT_MAX_PART_SIZE); + $maxPartSize = config('backups.max_part_size', self::DEFAULT_MAX_PART_SIZE); if ($maxPartSize <= 0) { $maxPartSize = self::DEFAULT_MAX_PART_SIZE; } diff --git a/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php b/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php index 4f32689ecf..ba69fd0047 100644 --- a/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php +++ b/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php @@ -2,47 +2,49 @@ namespace App\Http\Controllers\Api\Remote\Backups; -use Carbon\CarbonImmutable; -use Illuminate\Http\Request; -use App\Models\Backup; -use Illuminate\Http\JsonResponse; -use App\Facades\Activity; use App\Exceptions\DisplayException; -use App\Http\Controllers\Controller; +use App\Exceptions\Http\HttpForbiddenException; use App\Extensions\Backups\BackupManager; use App\Extensions\Filesystem\S3Filesystem; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use App\Facades\Activity; +use App\Http\Controllers\Controller; use App\Http\Requests\Api\Remote\ReportBackupCompleteRequest; -use App\Exceptions\Http\HttpForbiddenException; +use App\Models\Backup; +use App\Models\Node; +use App\Models\Server; +use Carbon\CarbonImmutable; +use Exception; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Throwable; class BackupStatusController extends Controller { /** * BackupStatusController constructor. */ - public function __construct(private BackupManager $backupManager) - { - } + public function __construct(private BackupManager $backupManager) {} /** * Handles updating the state of a backup. * - * @throws \Throwable + * @throws Throwable */ public function index(ReportBackupCompleteRequest $request, string $backup): JsonResponse { // Get the node associated with the request. - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = $request->attributes->get('node'); - /** @var \App\Models\Backup $model */ + /** @var Backup $model */ $model = Backup::query() ->where('uuid', $backup) ->firstOrFail(); // Check that the backup is "owned" by the node making the request. This avoids other nodes // from messing with backups that they don't own. - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $model->server; if ($server->node_id !== $node->id) { throw new HttpForbiddenException('You do not have permission to access that backup.'); @@ -88,11 +90,11 @@ public function index(ReportBackupCompleteRequest $request, string $backup): Jso * The only thing the successful field does is update the entry value for the audit logs * table tracking for this restoration. * - * @throws \Throwable + * @throws Throwable */ public function restore(Request $request, string $backup): JsonResponse { - /** @var \App\Models\Backup $model */ + /** @var Backup $model */ $model = Backup::query()->where('uuid', $backup)->firstOrFail(); $model->server->update(['status' => null]); @@ -106,11 +108,12 @@ public function restore(Request $request, string $backup): JsonResponse } /** - * Marks a multipart upload in a given S3-compatible instance as failed or successful for - * the given backup. + * Marks a multipart upload in a given S3-compatible instance as failed or successful for the given backup. + * + * @param ?array $parts * - * @throws \Exception - * @throws \App\Exceptions\DisplayException + * @throws Exception + * @throws DisplayException */ protected function completeMultipartUpload(Backup $backup, S3Filesystem $adapter, bool $successful, ?array $parts): void { diff --git a/app/Http/Controllers/Api/Remote/EggInstallController.php b/app/Http/Controllers/Api/Remote/EggInstallController.php deleted file mode 100644 index 27de437b22..0000000000 --- a/app/Http/Controllers/Api/Remote/EggInstallController.php +++ /dev/null @@ -1,48 +0,0 @@ -attributes->get('node'); - - $server = Server::query() - ->with('egg.scriptFrom') - ->where('uuid', $uuid) - ->where('node_id', $node->id) - ->firstOrFail(); - - $egg = $server->egg; - - return response()->json([ - 'scripts' => [ - 'install' => !$egg->copy_script_install ? null : str_replace(["\r\n", "\n", "\r"], "\n", $egg->copy_script_install), - 'privileged' => $egg->script_is_privileged, - ], - 'config' => [ - 'container' => $egg->copy_script_container, - 'entry' => $egg->copy_script_entry, - ], - 'env' => $this->environment->handle($server), - ]); - } -} diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php b/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php index cd59c3d2cc..ee24ee7dc0 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php @@ -2,21 +2,22 @@ namespace App\Http\Controllers\Api\Remote\Servers; -use Illuminate\Http\Request; +use App\Enums\ContainerStatus; +use App\Http\Controllers\Controller; +use App\Http\Requests\Api\Remote\ServerRequest; use App\Models\Server; use Illuminate\Http\JsonResponse; -use App\Http\Controllers\Controller; class ServerContainersController extends Controller { /** * Updates the server container's status on the Panel */ - public function status(Server $server, Request $request): JsonResponse + public function status(ServerRequest $request, Server $server): JsonResponse { - $status = fluent($request->json()->all())->get('data.new_state'); + $status = ContainerStatus::tryFrom($request->json('data.new_state')) ?? ContainerStatus::Missing; - cache()->set("servers.$server->uuid.container.status", $status, now()->addHour()); + cache()->put("servers.$server->uuid.status", $status, now()->addHour()); return new JsonResponse([]); } diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php b/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php index 8244530453..0d1a18a16b 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php @@ -3,16 +3,20 @@ namespace App\Http\Controllers\Api\Remote\Servers; use App\Enums\ServerState; -use App\Models\Backup; -use Illuminate\Http\Request; -use App\Models\Server; -use Illuminate\Http\JsonResponse; use App\Facades\Activity; -use Illuminate\Database\ConnectionInterface; use App\Http\Controllers\Controller; -use App\Services\Eggs\EggConfigurationService; +use App\Http\Requests\Api\Remote\ServerRequest; use App\Http\Resources\Daemon\ServerConfigurationCollection; +use App\Models\ActivityLog; +use App\Models\Backup; +use App\Models\Node; +use App\Models\Server; +use App\Services\Eggs\EggConfigurationService; use App\Services\Servers\ServerConfigurationStructureService; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Throwable; class ServerDetailsController extends Controller { @@ -23,14 +27,13 @@ public function __construct( protected ConnectionInterface $connection, private ServerConfigurationStructureService $configurationStructureService, private EggConfigurationService $eggConfigurationService - ) { - } + ) {} /** * Returns details about the server that allows daemon to self-recover and ensure * that the state of the server matches the Panel at all times. */ - public function __invoke(Server $server): JsonResponse + public function __invoke(ServerRequest $request, Server $server): JsonResponse { return new JsonResponse([ 'settings' => $this->configurationStructureService->handle($server), @@ -43,7 +46,7 @@ public function __invoke(Server $server): JsonResponse */ public function list(Request $request): ServerConfigurationCollection { - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = $request->attributes->get('node'); // Avoid run-away N+1 SQL queries by preloading the relationships that are used @@ -63,7 +66,7 @@ public function list(Request $request): ServerConfigurationCollection * do not get incorrectly stuck in installing/restoring from backup states since * a daemon reboot would completely stop those processes. * - * @throws \Throwable + * @throws Throwable */ public function resetState(Request $request): JsonResponse { @@ -86,9 +89,9 @@ public function resetState(Request $request): JsonResponse ->get(); $this->connection->transaction(function () use ($node, $servers) { - /** @var \App\Models\Server $server */ + /** @var Server $server */ foreach ($servers as $server) { - /** @var \App\Models\ActivityLog|null $activity */ + /** @var ActivityLog|null $activity */ $activity = $server->activity->first(); if (!$activity) { continue; diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php b/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php index 49eaf2c514..a6b8cf1ca8 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php @@ -3,45 +3,43 @@ namespace App\Http\Controllers\Api\Remote\Servers; use App\Enums\ServerState; -use Illuminate\Http\Response; -use App\Models\Server; -use Illuminate\Http\JsonResponse; -use App\Http\Controllers\Controller; use App\Events\Server\Installed as ServerInstalled; +use App\Exceptions\Model\DataValidationException; +use App\Http\Controllers\Controller; use App\Http\Requests\Api\Remote\InstallationDataRequest; +use App\Http\Requests\Api\Remote\ServerRequest; +use App\Models\Server; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; class ServerInstallController extends Controller { /** * Returns installation information for a server. */ - public function index(Server $server): JsonResponse + public function index(ServerRequest $request, Server $server): JsonResponse { - $egg = $server->egg; - return new JsonResponse([ - 'container_image' => $egg->copy_script_container, - 'entrypoint' => $egg->copy_script_entry, - 'script' => $egg->copy_script_install, + 'container_image' => $server->egg->copy_script_container, + 'entrypoint' => $server->egg->copy_script_entry, + 'script' => $server->egg->copy_script_install, ]); } /** * Updates the installation state of a server. * - * @throws \App\Exceptions\Model\DataValidationException + * @throws DataValidationException */ public function store(InstallationDataRequest $request, Server $server): JsonResponse { $status = null; - // Make sure the type of failure is accurate - if (!$request->boolean('successful')) { - $status = ServerState::InstallFailed; + $successful = $request->boolean('successful'); - if ($request->boolean('reinstall')) { - $status = ServerState::ReinstallFailed; - } + // Make sure the type of failure is accurate + if (!$successful) { + $status = $request->boolean('reinstall') ? ServerState::ReinstallFailed : ServerState::InstallFailed; } // Keep the server suspended if it's already suspended @@ -55,16 +53,8 @@ public function store(InstallationDataRequest $request, Server $server): JsonRes $server->installed_at = now(); $server->save(); - // If the server successfully installed, fire installed event. - // This logic allows individually disabling install and reinstall notifications separately. $isInitialInstall = is_null($previouslyInstalledAt); - if ($isInitialInstall && config()->get('panel.email.send_install_notification', true)) { - event(new ServerInstalled($server)); - } - - if (!$isInitialInstall && config()->get('panel.email.send_reinstall_notification', true)) { - event(new ServerInstalled($server)); - } + event(new ServerInstalled($server, $successful, $isInitialInstall)); return new JsonResponse([], Response::HTTP_NO_CONTENT); } diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php b/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php index 6a74521f94..6423d532a1 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php @@ -2,16 +2,17 @@ namespace App\Http\Controllers\Api\Remote\Servers; +use App\Http\Controllers\Controller; +use App\Http\Requests\Api\Remote\ServerRequest; +use App\Models\Allocation; use App\Models\Server; use App\Repositories\Daemon\DaemonServerRepository; -use Illuminate\Http\Response; -use Illuminate\Http\JsonResponse; -use App\Models\Allocation; -use App\Models\ServerTransfer; use Illuminate\Database\ConnectionInterface; -use App\Http\Controllers\Controller; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; use Symfony\Component\HttpKernel\Exception\ConflictHttpException; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Throwable; class ServerTransferController extends Controller { @@ -21,47 +22,58 @@ class ServerTransferController extends Controller public function __construct( private ConnectionInterface $connection, private DaemonServerRepository $daemonServerRepository, - ) { - } + ) {} /** * The daemon notifies us about a transfer failure. * - * @throws \Throwable + * @throws Throwable */ - public function failure(Server $server): JsonResponse + public function failure(ServerRequest $request, Server $server): JsonResponse { $transfer = $server->transfer; if (is_null($transfer)) { throw new ConflictHttpException('Server is not being transferred.'); } - return $this->processFailedTransfer($transfer); + $this->connection->transaction(function () use ($transfer) { + $transfer->forceFill(['successful' => false])->saveOrFail(); + + if ($transfer->new_allocation || $transfer->new_additional_allocations) { + $allocations = array_merge([$transfer->new_allocation], $transfer->new_additional_allocations); + Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); + } + }); + + return new JsonResponse([], Response::HTTP_NO_CONTENT); } /** * The daemon notifies us about a transfer success. * - * @throws \Throwable + * @throws Throwable */ - public function success(Server $server): JsonResponse + public function success(ServerRequest $request, Server $server): JsonResponse { $transfer = $server->transfer; if (is_null($transfer)) { throw new ConflictHttpException('Server is not being transferred.'); } - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $this->connection->transaction(function () use ($server, $transfer) { - $allocations = array_merge([$transfer->old_allocation], $transfer->old_additional_allocations); + $data = []; + + if ($transfer->old_allocation || $transfer->old_additional_allocations) { + $allocations = array_merge([$transfer->old_allocation], $transfer->old_additional_allocations); + // Remove the old allocations for the server and re-assign the server to the new + // primary allocation and node. + Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); + $data['allocation_id'] = $transfer->new_allocation; + } - // Remove the old allocations for the server and re-assign the server to the new - // primary allocation and node. - Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); - $server->update([ - 'allocation_id' => $transfer->new_allocation, - 'node_id' => $transfer->new_node, - ]); + $data['node_id'] = $transfer->new_node; + $server->update($data); $server = $server->fresh(); $server->transfer->update(['successful' => true]); @@ -76,28 +88,10 @@ public function success(Server $server): JsonResponse ->setServer($server) ->setNode($transfer->oldNode) ->delete(); - } catch (DaemonConnectionException $exception) { + } catch (ConnectionException $exception) { logger()->warning($exception, ['transfer_id' => $server->transfer->id]); } return new JsonResponse([], Response::HTTP_NO_CONTENT); } - - /** - * Release all the reserved allocations for this transfer and mark it as failed in - * the database. - * - * @throws \Throwable - */ - protected function processFailedTransfer(ServerTransfer $transfer): JsonResponse - { - $this->connection->transaction(function () use (&$transfer) { - $transfer->forceFill(['successful' => false])->saveOrFail(); - - $allocations = array_merge([$transfer->new_allocation], $transfer->new_additional_allocations); - Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); - }); - - return new JsonResponse([], Response::HTTP_NO_CONTENT); - } } diff --git a/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php b/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php index 9b59704f15..a0c39c5087 100644 --- a/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php +++ b/app/Http/Controllers/Api/Remote/SftpAuthenticationController.php @@ -2,29 +2,27 @@ namespace App\Http\Controllers\Api\Remote; -use Illuminate\Http\Request; -use App\Models\User; +use App\Enums\SubuserPermission; +use App\Exceptions\Http\HttpForbiddenException; +use App\Facades\Activity; +use App\Http\Controllers\Controller; +use App\Http\Requests\Api\Remote\SftpAuthenticationFormRequest; use App\Models\Server; +use App\Models\User; +use App\Services\Servers\GetUserPermissionsService; +use Illuminate\Foundation\Auth\ThrottlesLogins; use Illuminate\Http\JsonResponse; -use App\Facades\Activity; -use App\Models\Permission; +use Illuminate\Http\Request; use phpseclib3\Crypt\PublicKeyLoader; -use App\Http\Controllers\Controller; use phpseclib3\Exception\NoKeyLoadedException; -use Illuminate\Foundation\Auth\ThrottlesLogins; -use App\Exceptions\Http\HttpForbiddenException; -use App\Services\Servers\GetUserPermissionsService; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -use App\Http\Requests\Api\Remote\SftpAuthenticationFormRequest; use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; class SftpAuthenticationController extends Controller { use ThrottlesLogins; - public function __construct(protected GetUserPermissionsService $permissions) - { - } + public function __construct(protected GetUserPermissionsService $permissions) {} /** * Authenticate a set of credentials and return the associated server details @@ -101,7 +99,7 @@ protected function getServer(Request $request, string $uuid): Server */ protected function getUser(Request $request, string $username): User { - return User::query()->where('username', $username)->firstOr(function () use ($request) { + return User::where('username', str($username)->lower()->trim())->firstOr(function () use ($request) { $this->reject($request); }); } @@ -140,10 +138,10 @@ protected function reject(Request $request, bool $increment = true): void */ protected function validateSftpAccess(User $user, Server $server): void { - if (!$user->isRootAdmin() && $server->owner_id !== $user->id) { + if ($user->cannot('update server', $server) && $server->owner_id !== $user->id) { $permissions = $this->permissions->handle($server, $user); - if (!in_array(Permission::ACTION_FILE_SFTP, $permissions)) { + if (!in_array(SubuserPermission::FileSftp->value, $permissions)) { Activity::event('server:sftp.denied')->actor($user)->subject($server)->log(); throw new HttpForbiddenException('You do not have permission to access SFTP for this server.'); @@ -160,6 +158,6 @@ protected function throttleKey(Request $request): string { $username = explode('.', strrev($request->input('username', ''))); - return strtolower(strrev($username[0] ?? '') . '|' . $request->ip()); + return strtolower(strrev($username[0]) . '|' . $request->ip()); } } diff --git a/app/Http/Controllers/Auth/AbstractLoginController.php b/app/Http/Controllers/Auth/AbstractLoginController.php deleted file mode 100644 index e5b50d0adf..0000000000 --- a/app/Http/Controllers/Auth/AbstractLoginController.php +++ /dev/null @@ -1,106 +0,0 @@ -lockoutTime = config('auth.lockout.time'); - $this->maxLoginAttempts = config('auth.lockout.attempts'); - $this->auth = Container::getInstance()->make(AuthManager::class); - } - - /** - * Get the failed login response instance. - * - * @throws \App\Exceptions\DisplayException - */ - protected function sendFailedLoginResponse(Request $request, Authenticatable $user = null, string $message = null) - { - $this->incrementLoginAttempts($request); - $this->fireFailedLoginEvent($user, [ - $this->getField($request->input('user')) => $request->input('user'), - ]); - - if ($request->route()->named('auth.login-checkpoint')) { - throw new DisplayException($message ?? trans('auth.two_factor.checkpoint_failed')); - } - - throw new DisplayException(trans('auth.failed')); - } - - /** - * Send the response after the user was authenticated. - */ - protected function sendLoginResponse(User $user, Request $request): JsonResponse - { - $request->session()->remove('auth_confirmation_token'); - $request->session()->regenerate(); - - $this->clearLoginAttempts($request); - - $this->auth->guard()->login($user, true); - - Event::dispatch(new DirectLogin($user, true)); - - return new JsonResponse([ - 'data' => [ - 'complete' => true, - 'intended' => $this->redirectPath(), - 'user' => $user->toReactObject(), - ], - ]); - } - - /** - * Determine if the user is logging in using an email or username. - */ - protected function getField(string $input = null): string - { - return ($input && str_contains($input, '@')) ? 'email' : 'username'; - } - - /** - * Fire a failed login event. - */ - protected function fireFailedLoginEvent(Authenticatable $user = null, array $credentials = []) - { - Event::dispatch(new Failed('auth', $user, $credentials)); - } -} diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php deleted file mode 100644 index 21ef4fee85..0000000000 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ /dev/null @@ -1,40 +0,0 @@ -ip(), $request->input('email'))); - - return $this->sendResetLinkResponse($request, Password::RESET_LINK_SENT); - } - - /** - * Get the response for a successful password reset link. - * - * @param string $response - */ - protected function sendResetLinkResponse(Request $request, $response): JsonResponse - { - return response()->json([ - 'status' => trans($response), - ]); - } -} diff --git a/app/Http/Controllers/Auth/LoginCheckpointController.php b/app/Http/Controllers/Auth/LoginCheckpointController.php deleted file mode 100644 index 540aca5a00..0000000000 --- a/app/Http/Controllers/Auth/LoginCheckpointController.php +++ /dev/null @@ -1,124 +0,0 @@ -hasTooManyLoginAttempts($request)) { - $this->sendLockoutResponse($request); - } - - $details = $request->session()->get('auth_confirmation_token'); - if (!$this->hasValidSessionData($details)) { - $this->sendFailedLoginResponse($request, null, self::TOKEN_EXPIRED_MESSAGE); - } - - if (!hash_equals($request->input('confirmation_token') ?? '', $details['token_value'])) { - $this->sendFailedLoginResponse($request); - } - - $user = User::query()->find($details['user_id']); - if (!$user) { - $this->sendFailedLoginResponse($request, null, self::TOKEN_EXPIRED_MESSAGE); - } - - // Recovery tokens go through a slightly different pathway for usage. - if (!is_null($recoveryToken = $request->input('recovery_token'))) { - if ($this->isValidRecoveryToken($user, $recoveryToken)) { - Event::dispatch(new ProvidedAuthenticationToken($user, true)); - - return $this->sendLoginResponse($user, $request); - } - } else { - if ($this->google2FA->verifyKey($user->totp_secret, (string) $request->input('authentication_code'), config('panel.auth.2fa.window'))) { - Event::dispatch(new ProvidedAuthenticationToken($user)); - - return $this->sendLoginResponse($user, $request); - } - } - - return $this->sendFailedLoginResponse($request, $user, !empty($recoveryToken) ? 'The recovery token provided is not valid.' : null); - } - - /** - * Determines if a given recovery token is valid for the user account. If we find a matching token - * it will be deleted from the database. - * - * @throws \Exception - */ - protected function isValidRecoveryToken(User $user, string $value): bool - { - foreach ($user->recoveryTokens as $token) { - if (password_verify($value, $token->token)) { - $token->delete(); - - return true; - } - } - - return false; - } - - /** - * Determines if the data provided from the session is valid or not. This - * will return false if the data is invalid, or if more time has passed than - * was configured when the session was written. - */ - protected function hasValidSessionData(array $data): bool - { - $validator = $this->validation->make($data, [ - 'user_id' => 'required|integer|min:1', - 'token_value' => 'required|string', - 'expires_at' => 'required', - ]); - - if ($validator->fails()) { - return false; - } - - if (!$data['expires_at'] instanceof CarbonInterface) { - return false; - } - - if ($data['expires_at']->isBefore(CarbonImmutable::now())) { - return false; - } - - return true; - } -} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php deleted file mode 100644 index 28c3c4f5ee..0000000000 --- a/app/Http/Controllers/Auth/LoginController.php +++ /dev/null @@ -1,75 +0,0 @@ -hasTooManyLoginAttempts($request)) { - $this->fireLockoutEvent($request); - $this->sendLockoutResponse($request); - } - - $username = $request->input('user'); - $user = User::query()->where($this->getField($username), $username)->first(); - if (!$user) { - $this->sendFailedLoginResponse($request); - } - - // Ensure that the account is using a valid username and password before trying to - // continue. Previously this was handled in the 2FA checkpoint, however that has - // a flaw in which you can discover if an account exists simply by seeing if you - // can proceed to the next step in the login process. - if (!password_verify($request->input('password'), $user->password)) { - $this->sendFailedLoginResponse($request, $user); - } - - if (!$user->use_totp) { - return $this->sendLoginResponse($user, $request); - } - - Activity::event('auth:checkpoint')->withRequestMetadata()->subject($user)->log(); - - $request->session()->put('auth_confirmation_token', [ - 'user_id' => $user->id, - 'token_value' => $token = Str::random(64), - 'expires_at' => CarbonImmutable::now()->addMinutes(5), - ]); - - return new JsonResponse([ - 'data' => [ - 'complete' => false, - 'confirmation_token' => $token, - ], - ]); - } -} diff --git a/app/Http/Controllers/Auth/OAuthController.php b/app/Http/Controllers/Auth/OAuthController.php index 2989761efc..edbd7e7595 100644 --- a/app/Http/Controllers/Auth/OAuthController.php +++ b/app/Http/Controllers/Auth/OAuthController.php @@ -2,60 +2,127 @@ namespace App\Http\Controllers\Auth; -use Illuminate\Auth\AuthManager; -use Illuminate\Http\RedirectResponse; -use Laravel\Socialite\Facades\Socialite; +use App\Extensions\OAuth\OAuthSchemaInterface; +use App\Extensions\OAuth\OAuthService; +use App\Filament\Pages\Auth\EditProfile; use App\Http\Controllers\Controller; use App\Models\User; -use App\Services\Users\UserUpdateService; +use App\Services\Users\UserCreationService; use Exception; +use Filament\Notifications\Notification; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Laravel\Socialite\Contracts\User as OAuthUser; +use Laravel\Socialite\Facades\Socialite; +use Symfony\Component\HttpFoundation\RedirectResponse as SymfonyRedirectResponse; class OAuthController extends Controller { - /** - * OAuthController constructor. - */ public function __construct( - private AuthManager $auth, - private UserUpdateService $updateService - ) { - } + private readonly UserCreationService $userCreation, + private readonly OAuthService $oauthService, + ) {} /** * Redirect user to the OAuth provider */ - protected function redirect(string $driver): RedirectResponse + public function redirect(string $driver): SymfonyRedirectResponse|RedirectResponse { - return Socialite::with($driver)->redirect(); + if (!$this->oauthService->get($driver)->isEnabled()) { + return redirect()->route('auth.login'); + } + + return Socialite::driver($driver)->redirect(); } /** * Callback from OAuth provider. */ - protected function callback(Request $request, string $driver): RedirectResponse + public function callback(Request $request, string $driver): RedirectResponse { - $oauthUser = Socialite::driver($driver)->user(); + $driver = $this->oauthService->get($driver); + + if (!$driver || !$driver->isEnabled()) { + return redirect()->route('auth.login'); + } + + // Check for errors (https://www.oauth.com/oauth2-servers/server-side-apps/possible-errors/) + if ($request->get('error')) { + report($request->get('error_description') ?? $request->get('error')); + + return $this->errorRedirect($request->get('error')); + } + + $oauthUser = Socialite::driver($driver->getId())->user(); - // User is already logged in and wants to link a new OAuth Provider if ($request->user()) { - $oauth = $request->user()->oauth; - $oauth[$driver] = $oauthUser->getId(); + $this->oauthService->linkUser($request->user(), $driver, $oauthUser); - $this->updateService->handle($request->user(), ['oauth' => $oauth]); + return redirect(EditProfile::getUrl(['tab' => 'oauth::data::tab'], panel: 'app')); + } - return redirect()->route('account'); + $user = User::whereJsonContains('oauth->'. $driver->getId(), $oauthUser->getId())->first(); + if ($user) { + return $this->loginUser($user); } - try { - $user = User::query()->whereJsonContains('oauth->'. $driver, $oauthUser->getId())->firstOrFail(); + return $this->handleMissingUser($driver, $oauthUser); + } - $this->auth->guard()->login($user, true); - } catch (Exception $e) { - // No user found - redirect to normal login - return redirect()->route('auth.login'); + private function handleMissingUser(OAuthSchemaInterface $driver, OAuthUser $oauthUser): RedirectResponse + { + $email = $oauthUser->getEmail(); + + if (!$email) { + return $this->errorRedirect('No email was linked to your account on the OAuth provider.'); + } + + $user = User::whereEmail($email)->first(); + if ($user) { + if (!$driver->shouldLinkMissingUser($user, $oauthUser)) { + return $this->errorRedirect(); + } + + $user = $this->oauthService->linkUser($user, $driver, $oauthUser); + } else { + if (!$driver->shouldCreateMissingUser($oauthUser)) { + return $this->errorRedirect(); + } + + try { + $user = $this->userCreation->handle([ + 'username' => $oauthUser->getNickname(), + 'email' => $email, + 'oauth' => [ + $driver->getId() => $oauthUser->getId(), + ], + ]); + } catch (Exception $exception) { + report($exception); + + return $this->errorRedirect(); + } } + return $this->loginUser($user); + } + + private function loginUser(User $user): RedirectResponse + { + auth()->guard()->login($user, true); + return redirect('/'); } + + private function errorRedirect(?string $error = null): RedirectResponse + { + Notification::make() + ->title($error ? 'Something went wrong' : 'No linked User found') + ->body($error) + ->danger() + ->persistent() + ->send(); + + return redirect()->route('auth.login'); + } } diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php deleted file mode 100644 index b4c338ee98..0000000000 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ /dev/null @@ -1,101 +0,0 @@ -broker()->reset( - $this->credentials($request), - function ($user, $password) { - $this->resetPassword($user, $password); - } - ); - - // If the password was successfully reset, we will redirect the user back to - // the application's home authenticated view. If there is an error we can - // redirect them back to where they came from with their error message. - if ($response === Password::PASSWORD_RESET) { - return $this->sendResetResponse(); - } - - throw new DisplayException(trans($response)); - } - - /** - * Reset the given user's password. If the user has two-factor authentication enabled on their - * account do not automatically log them in. In those cases, send the user back to the login - * form with a note telling them their password was changed and to log back in. - * - * @param \Illuminate\Contracts\Auth\CanResetPassword|\App\Models\User $user - * @param string $password - * - * @throws \App\Exceptions\Model\DataValidationException - */ - protected function resetPassword($user, $password) - { - /** @var User $user */ - $user->password = $this->hasher->make($password); - $user->setRememberToken(Str::random(60)); - $user->save(); - - event(new PasswordReset($user)); - - // If the user is not using 2FA log them in, otherwise skip this step and force a - // fresh login where they'll be prompted to enter a token. - if (!$user->use_totp) { - $this->guard()->login($user); - } - - $this->hasTwoFactor = $user->use_totp; - } - - /** - * Send a successful password reset response back to the callee. - */ - protected function sendResetResponse(): JsonResponse - { - return response()->json([ - 'success' => true, - 'redirect_to' => $this->redirectTo, - 'send_to_login' => $this->hasTwoFactor, - ]); - } -} diff --git a/app/Http/Controllers/Base/IndexController.php b/app/Http/Controllers/Base/IndexController.php deleted file mode 100644 index 1c0bdd35a8..0000000000 --- a/app/Http/Controllers/Base/IndexController.php +++ /dev/null @@ -1,25 +0,0 @@ -loader = $translator->getLoader(); - } - - /** - * Returns translation data given a specific locale and namespace. - */ - public function __invoke(Request $request): JsonResponse - { - $locales = explode(' ', $request->input('locale') ?? ''); - $namespaces = explode(' ', $request->input('namespace') ?? ''); - - $response = []; - foreach ($locales as $locale) { - $response[$locale] = []; - foreach ($namespaces as $namespace) { - $response[$locale][$namespace] = $this->i18n( - $this->loader->load($locale, str_replace('.', '/', $namespace)) - ); - } - } - - return new JsonResponse($response, 200, [ - // Cache this in the browser for an hour, and allow the browser to use a stale - // cache for up to a day after it was created while it fetches an updated set - // of translation keys. - 'Cache-Control' => 'public, max-age=3600, stale-while-revalidate=86400', - 'ETag' => md5(json_encode($response, JSON_THROW_ON_ERROR)), - ]); - } - - /** - * Convert standard Laravel translation keys that look like ":foo" - * into key structures that are supported by the front-end i18n - * library, like "{{foo}}". - */ - protected function i18n(array $data): array - { - foreach ($data as $key => $value) { - if (is_array($value)) { - $data[$key] = $this->i18n($value); - } else { - // Find a Laravel style translation replacement in the string and replace it with - // one that the front-end is able to use. This won't always be present, especially - // for complex strings or things where we'd never have a backend component anyways. - // - // For example: - // "Hello :name, the :notifications.0.title notification needs :count actions :foo.0.bar." - // - // Becomes: - // "Hello {{name}}, the {{notifications.0.title}} notification needs {{count}} actions {{foo.0.bar}}." - $data[$key] = preg_replace('/:([\w.-]+\w)([^\w:]?|$)/m', '{{$1}}$2', $value); - } - } - - return $data; - } -} diff --git a/app/Http/Controllers/Base/OAuthController.php b/app/Http/Controllers/Base/OAuthController.php deleted file mode 100644 index bb078a3c8a..0000000000 --- a/app/Http/Controllers/Base/OAuthController.php +++ /dev/null @@ -1,44 +0,0 @@ -get('driver'); - - return Socialite::with($driver)->redirect(); - } - - /** - * Remove a OAuth link - */ - protected function unlink(Request $request): Response - { - $oauth = $request->user()->oauth; - unset($oauth[$request->get('driver')]); - - $this->updateService->handle($request->user(), ['oauth' => $oauth]); - - return new Response('', Response::HTTP_NO_CONTENT); - } -} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 02676faf82..2e8af07a45 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,14 +2,4 @@ namespace App\Http\Controllers; -use Illuminate\Foundation\Bus\DispatchesJobs; -use Illuminate\Routing\Controller as BaseController; -use Illuminate\Foundation\Validation\ValidatesRequests; -use Illuminate\Foundation\Auth\Access\AuthorizesRequests; - -abstract class Controller extends BaseController -{ - use AuthorizesRequests; - use DispatchesJobs; - use ValidatesRequests; -} +abstract class Controller {} diff --git a/app/Http/Middleware/Activity/AccountSubject.php b/app/Http/Middleware/Activity/AccountSubject.php index a538cd81cc..544e41482d 100644 --- a/app/Http/Middleware/Activity/AccountSubject.php +++ b/app/Http/Middleware/Activity/AccountSubject.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware\Activity; use App\Facades\LogTarget; +use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; @@ -12,7 +13,7 @@ class AccountSubject * Sets the actor and default subject for all requests passing through this * middleware to be the currently logged in user. */ - public function handle(Request $request, \Closure $next): Response + public function handle(Request $request, Closure $next): Response { LogTarget::setActor($request->user()); LogTarget::setSubject($request->user()); diff --git a/app/Http/Middleware/Activity/ServerSubject.php b/app/Http/Middleware/Activity/ServerSubject.php index 3f0c45f132..b4ff966342 100644 --- a/app/Http/Middleware/Activity/ServerSubject.php +++ b/app/Http/Middleware/Activity/ServerSubject.php @@ -2,8 +2,10 @@ namespace App\Http\Middleware\Activity; -use App\Models\Server; use App\Facades\LogTarget; +use App\Models\Server; +use Closure; +use Filament\Facades\Filament; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; @@ -17,9 +19,11 @@ class ServerSubject * If no server is found this is a no-op as the activity log service can always * set the user based on the authmanager response. */ - public function handle(Request $request, \Closure $next): Response + public function handle(Request $request, Closure $next): Response { $server = $request->route()->parameter('server'); + $server ??= Filament::getTenant(); + if ($server instanceof Server) { LogTarget::setActor($request->user()); LogTarget::setSubject($server); diff --git a/app/Http/Middleware/Activity/TrackAPIKey.php b/app/Http/Middleware/Activity/TrackAPIKey.php index 1ea336f04e..7e43c099b9 100644 --- a/app/Http/Middleware/Activity/TrackAPIKey.php +++ b/app/Http/Middleware/Activity/TrackAPIKey.php @@ -2,9 +2,10 @@ namespace App\Http\Middleware\Activity; -use Illuminate\Http\Request; -use App\Models\ApiKey; use App\Facades\LogTarget; +use App\Models\ApiKey; +use Closure; +use Illuminate\Http\Request; class TrackAPIKey { @@ -14,7 +15,7 @@ class TrackAPIKey * request singleton so that all tracked activity log events are properly associated * with the given API key. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { if ($request->user()) { $token = $request->user()->currentAccessToken(); diff --git a/app/Http/Middleware/Admin/Servers/ServerInstalled.php b/app/Http/Middleware/Admin/Servers/ServerInstalled.php deleted file mode 100644 index ac419c847c..0000000000 --- a/app/Http/Middleware/Admin/Servers/ServerInstalled.php +++ /dev/null @@ -1,31 +0,0 @@ -route()->parameter('server'); - - if (!$server instanceof Server) { - throw new NotFoundHttpException('No server resource was located in the request parameters.'); - } - - if (!$server->isInstalled()) { - throw new HttpException(Response::HTTP_FORBIDDEN, 'Access to this resource is not allowed due to the current installation state.'); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/AdminAuthenticate.php b/app/Http/Middleware/AdminAuthenticate.php deleted file mode 100644 index 6b86a86ee0..0000000000 --- a/app/Http/Middleware/AdminAuthenticate.php +++ /dev/null @@ -1,23 +0,0 @@ -user() || !$request->user()->isRootAdmin()) { - throw new AccessDeniedHttpException(); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php b/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php index 054739d27a..c53807afcd 100644 --- a/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php +++ b/app/Http/Middleware/Api/Application/AuthenticateApplicationUser.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware\Api\Application; +use App\Models\User; +use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -11,11 +13,11 @@ class AuthenticateApplicationUser * Authenticate that the currently authenticated user is an administrator * and should be allowed to proceed through the application API. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { - /** @var \App\Models\User|null $user */ + /** @var User|null $user */ $user = $request->user(); - if (!$user || !$user->isRootAdmin()) { + if (!$user || !$user->isAdmin()) { throw new AccessDeniedHttpException('This account does not have permission to access the API.'); } diff --git a/app/Http/Middleware/Api/AuthenticateIPAccess.php b/app/Http/Middleware/Api/AuthenticateIPAccess.php index c9f3bf7dc4..2cf6a1cc8c 100644 --- a/app/Http/Middleware/Api/AuthenticateIPAccess.php +++ b/app/Http/Middleware/Api/AuthenticateIPAccess.php @@ -2,10 +2,13 @@ namespace App\Http\Middleware\Api; +use App\Facades\Activity; +use App\Models\ApiKey; +use Closure; +use Exception; +use Illuminate\Http\Request; use IPTools\IP; use IPTools\Range; -use Illuminate\Http\Request; -use App\Facades\Activity; use Laravel\Sanctum\TransientToken; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -14,12 +17,12 @@ class AuthenticateIPAccess /** * Determine if a request IP has permission to access the API. * - * @throws \Exception - * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException + * @throws Exception + * @throws AccessDeniedHttpException */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { - /** @var \Laravel\Sanctum\TransientToken|\App\Models\ApiKey $token */ + /** @var TransientToken|ApiKey $token */ $token = $request->user()->currentAccessToken(); // If this is a stateful request just push the request through to the next diff --git a/app/Http/Middleware/Api/Client/RequireClientApiKey.php b/app/Http/Middleware/Api/Client/RequireClientApiKey.php index 8b542e2f23..63a92e95ee 100644 --- a/app/Http/Middleware/Api/Client/RequireClientApiKey.php +++ b/app/Http/Middleware/Api/Client/RequireClientApiKey.php @@ -2,8 +2,9 @@ namespace App\Http\Middleware\Api\Client; -use Illuminate\Http\Request; use App\Models\ApiKey; +use Closure; +use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; class RequireClientApiKey @@ -12,7 +13,7 @@ class RequireClientApiKey * Blocks a request to the Client API endpoints if the user is providing an API token * that was created for the application API. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { $token = $request->user()->currentAccessToken(); diff --git a/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php b/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php index a8ef5d0f38..bfdb24a8dd 100644 --- a/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php +++ b/app/Http/Middleware/Api/Client/Server/AuthenticateServerAccess.php @@ -2,15 +2,19 @@ namespace App\Http\Middleware\Api\Client\Server; -use Illuminate\Http\Request; +use App\Exceptions\Http\Server\ServerStateConflictException; use App\Models\Server; +use App\Models\User; +use Closure; +use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use App\Exceptions\Http\Server\ServerStateConflictException; class AuthenticateServerAccess { /** * Routes that this middleware should not apply to if the user is an admin. + * + * @var string[] */ protected array $except = [ 'api:client:server.ws', @@ -19,16 +23,14 @@ class AuthenticateServerAccess /** * AuthenticateServerAccess constructor. */ - public function __construct() - { - } + public function __construct() {} /** * Authenticate that this server exists and is not suspended or marked as installing. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { - /** @var \App\Models\User $user */ + /** @var User $user */ $user = $request->user(); $server = $request->route()->parameter('server'); @@ -37,9 +39,9 @@ public function handle(Request $request, \Closure $next): mixed } // At the very least, ensure that the user trying to make this request is the - // server owner, a subuser, or a root admin. We'll leave it up to the controllers + // server owner, a subuser, or an admin. We'll leave it up to the controllers // to authenticate more detailed permissions if needed. - if ($user->id !== $server->owner_id && !$user->isRootAdmin()) { + if ($user->id !== $server->owner_id && $user->cannot('update server', $server)) { // Check for subuser status. if (!$server->subusers->contains('user_id', $user->id)) { throw new NotFoundHttpException(trans('exceptions.api.resource_not_found')); @@ -55,7 +57,7 @@ public function handle(Request $request, \Closure $next): mixed if (($server->isSuspended() || $server->node->isUnderMaintenance()) && !$request->routeIs('api:client:server.resources')) { throw $exception; } - if (!$user->isRootAdmin() || !$request->routeIs($this->except)) { + if ($user->cannot('update server', $server) || !$request->routeIs($this->except)) { throw $exception; } } diff --git a/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php b/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php index 0ead01f1d5..7b3073920f 100644 --- a/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php +++ b/app/Http/Middleware/Api/Client/Server/ResourceBelongsToServer.php @@ -2,16 +2,18 @@ namespace App\Http\Middleware\Api\Client\Server; -use Illuminate\Http\Request; -use App\Models\Task; -use App\Models\User; +use App\Models\Allocation; use App\Models\Backup; -use App\Models\Server; -use App\Models\Subuser; use App\Models\Database; use App\Models\Schedule; -use App\Models\Allocation; +use App\Models\Server; +use App\Models\Subuser; +use App\Models\Task; +use App\Models\User; +use Closure; use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Request; +use InvalidArgumentException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class ResourceBelongsToServer @@ -24,20 +26,20 @@ class ResourceBelongsToServer * server that is expected, and that we're not accessing a resource completely * unrelated to the server provided in the request. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { $params = $request->route()->parameters(); $server = $params['server'] ?? null; if (!$server instanceof Server) { - throw new \InvalidArgumentException('This middleware cannot be used in a context that is missing a server in the parameters.'); + throw new InvalidArgumentException('This middleware cannot be used in a context that is missing a server in the parameters.'); } - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $request->route()->parameter('server'); $exception = new NotFoundHttpException('The requested resource was not found for this server.'); foreach ($params as $key => $model) { - // Specifically skip the server, we're just trying to see if all of the + // Specifically skip the server, we're just trying to see if all the // other resources are assigned to this server. Also skip anything that // is not currently a Model instance since those will just end up being // a 404 down the road. @@ -46,7 +48,7 @@ public function handle(Request $request, \Closure $next): mixed } switch (get_class($model)) { - // All of these models use "server_id" as the field key for the server + // all these models use "server_id" as the field key for the server // they are assigned to, so the logic is identical for them all. case Allocation::class: case Backup::class: @@ -80,7 +82,7 @@ public function handle(Request $request, \Closure $next): mixed default: // Don't return a 404 here since we want to make sure no one relies // on this middleware in a context in which it will not work. Fail safe. - throw new \InvalidArgumentException('There is no handler configured for a resource of this type: ' . get_class($model)); + throw new InvalidArgumentException('There is no handler configured for a resource of this type: ' . get_class($model)); } } diff --git a/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php b/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php index 5bacb25b65..a9fd6c6463 100644 --- a/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php +++ b/app/Http/Middleware/Api/Daemon/DaemonAuthenticate.php @@ -3,15 +3,18 @@ namespace App\Http\Middleware\Api\Daemon; use App\Models\Node; +use Closure; use Illuminate\Http\Request; -use Symfony\Component\HttpKernel\Exception\HttpException; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\Exception\HttpException; class DaemonAuthenticate { /** * Daemon routes that this middleware should be skipped on. + * + * @var string[] */ protected array $except = [ 'daemon.configuration', @@ -20,9 +23,9 @@ class DaemonAuthenticate /** * Check if a request from the daemon can be properly attributed back to a single node instance. * - * @throws \Symfony\Component\HttpKernel\Exception\HttpException + * @throws HttpException */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { if (in_array($request->route()->getName(), $this->except)) { return $next($request); diff --git a/app/Http/Middleware/Api/IsValidJson.php b/app/Http/Middleware/Api/IsValidJson.php index 86bb34ff28..2d4ac5dd3c 100644 --- a/app/Http/Middleware/Api/IsValidJson.php +++ b/app/Http/Middleware/Api/IsValidJson.php @@ -2,7 +2,9 @@ namespace App\Http\Middleware\Api; +use Closure; use Illuminate\Http\Request; +use JsonException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class IsValidJson @@ -12,12 +14,12 @@ class IsValidJson * parsing the data. This avoids confusing validation errors where every field is flagged and * it is not immediately clear that there is an issue with the JSON being passed. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { if ($request->isJson() && !empty($request->getContent())) { try { json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR); - } catch (\JsonException $exception) { + } catch (JsonException $exception) { throw new BadRequestHttpException('The JSON data passed in the request appears to be malformed: ' . $exception->getMessage()); } } diff --git a/app/Http/Middleware/EnsureStatefulRequests.php b/app/Http/Middleware/EnsureStatefulRequests.php index 66689fe11e..35c1795cc5 100644 --- a/app/Http/Middleware/EnsureStatefulRequests.php +++ b/app/Http/Middleware/EnsureStatefulRequests.php @@ -15,7 +15,7 @@ class EnsureStatefulRequests extends EnsureFrontendRequestsAreStateful * We don't want to support API usage using the cookies, except for requests stemming * from the front-end we control. */ - public static function fromFrontend($request) + public static function fromFrontend($request): bool { if (parent::fromFrontend($request)) { return true; diff --git a/app/Http/Middleware/LanguageMiddleware.php b/app/Http/Middleware/LanguageMiddleware.php index d8f3bac3c3..252e26b10f 100644 --- a/app/Http/Middleware/LanguageMiddleware.php +++ b/app/Http/Middleware/LanguageMiddleware.php @@ -2,22 +2,21 @@ namespace App\Http\Middleware; -use Illuminate\Http\Request; +use Closure; use Illuminate\Foundation\Application; +use Illuminate\Http\Request; class LanguageMiddleware { /** * LanguageMiddleware constructor. */ - public function __construct(private Application $app) - { - } + public function __construct(private Application $app) {} /** * Handle an incoming request and set the user's preferred language. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { $this->app->setLocale($request->user()->language ?? config('app.locale', 'en')); diff --git a/app/Http/Middleware/MaintenanceMiddleware.php b/app/Http/Middleware/MaintenanceMiddleware.php index 03229a45f3..509b3a9d91 100644 --- a/app/Http/Middleware/MaintenanceMiddleware.php +++ b/app/Http/Middleware/MaintenanceMiddleware.php @@ -2,24 +2,24 @@ namespace App\Http\Middleware; -use Illuminate\Http\Request; +use App\Models\Server; +use Closure; use Illuminate\Contracts\Routing\ResponseFactory; +use Illuminate\Http\Request; class MaintenanceMiddleware { /** * MaintenanceMiddleware constructor. */ - public function __construct(private ResponseFactory $response) - { - } + public function __construct(private ResponseFactory $response) {} /** * Handle an incoming request. */ - public function handle(Request $request, \Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $request->attributes->get('server'); $node = $server->getRelation('node'); diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 38af84f7e0..e4ee83d7aa 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,25 +2,18 @@ namespace App\Http\Middleware; -use Illuminate\Http\Request; +use Closure; use Illuminate\Auth\AuthManager; +use Illuminate\Http\Request; -class RedirectIfAuthenticated +readonly class RedirectIfAuthenticated { - /** - * RedirectIfAuthenticated constructor. - */ - public function __construct(private AuthManager $authManager) - { - } + public function __construct(private AuthManager $authManager) {} - /** - * Handle an incoming request. - */ - public function handle(Request $request, \Closure $next, string $guard = null): mixed + public function handle(Request $request, Closure $next, ?string $guard = null): mixed { if ($this->authManager->guard($guard)->check()) { - return redirect()->route('index'); + return redirect('/'); } return $next($request); diff --git a/app/Http/Middleware/RequireTwoFactorAuthentication.php b/app/Http/Middleware/RequireTwoFactorAuthentication.php index 470cc73b30..cbe086d6ea 100644 --- a/app/Http/Middleware/RequireTwoFactorAuthentication.php +++ b/app/Http/Middleware/RequireTwoFactorAuthentication.php @@ -2,28 +2,20 @@ namespace App\Http\Middleware; -use Illuminate\Support\Str; -use Illuminate\Http\Request; -use Prologue\Alerts\AlertsMessageBag; use App\Exceptions\Http\TwoFactorAuthRequiredException; +use App\Filament\Pages\Auth\EditProfile; +use App\Livewire\AlertBanner; +use App\Models\User; +use Illuminate\Http\Request; +use Illuminate\Support\Str; class RequireTwoFactorAuthentication { public const LEVEL_NONE = 0; - public const LEVEL_ADMIN = 1; - public const LEVEL_ALL = 2; - /** - * The route to redirect a user to enable 2FA. - */ - protected string $redirectRoute = '/account'; + public const LEVEL_ADMIN = 1; - /** - * RequireTwoFactorAuthentication constructor. - */ - public function __construct(private AlertsMessageBag $alert) - { - } + public const LEVEL_ALL = 2; /** * Check the user state on the incoming request to determine if they should be allowed to @@ -35,33 +27,38 @@ public function __construct(private AlertsMessageBag $alert) */ public function handle(Request $request, \Closure $next): mixed { + /** @var ?User $user */ $user = $request->user(); - $uri = rtrim($request->getRequestUri(), '/') . '/'; - $current = $request->route()->getName(); - if (!$user || Str::startsWith($uri, ['/auth/']) || Str::startsWith($current, ['auth.', 'account.'])) { + // Auth and profile endpoints should always be available + if (!$user || $request->routeIs('*auth.*')) { return $next($request); } - /** @var \App\Models\User $user */ $level = (int) config('panel.auth.2fa_required'); - // If this setting is not configured, or the user is already using 2FA then we can just - // send them right through, nothing else needs to be checked. - // - // If the level is set as admin and the user is not an admin, pass them through as well. - if ($level === self::LEVEL_NONE || $user->use_totp) { + + $has2fa = $user->hasEmailAuthentication() || filled($user->getAppAuthenticationSecret()); + if ($level === self::LEVEL_NONE || $has2fa) { + // If this setting is not configured, or the user is already using 2FA then we can just send them right through, nothing else needs to be checked. return $next($request); - } elseif ($level === self::LEVEL_ADMIN && !$user->isRootAdmin()) { + } + + if ($level === self::LEVEL_ADMIN && !$user->isAdmin()) { + // If the level is set as admin and the user is not an admin, pass them through as well. return $next($request); } - // For API calls return an exception which gets rendered nicely in the API response. - if ($request->isJson() || Str::startsWith($uri, '/api/')) { + // For API calls return an exception which gets rendered nicely in the API response... + if ($request->isJson() || Str::startsWith($request->path(), '/api')) { throw new TwoFactorAuthRequiredException(); } - $this->alert->danger(trans('auth.2fa_must_be_enabled'))->flash(); + // ... otherwise display banner and redirect to profile + AlertBanner::make('2fa_must_be_enabled') + ->body(trans('auth.2fa_must_be_enabled')) + ->warning() + ->send(); - return redirect()->to($this->redirectRoute); + return redirect(EditProfile::getUrl(['tab' => '2fa::data::tab'], panel: 'app')); } } diff --git a/app/Http/Middleware/VerifyReCaptcha.php b/app/Http/Middleware/VerifyReCaptcha.php deleted file mode 100644 index bfe09ce984..0000000000 --- a/app/Http/Middleware/VerifyReCaptcha.php +++ /dev/null @@ -1,62 +0,0 @@ -isLocal()) { - return $next($request); - } - - if ($request->filled('g-recaptcha-response')) { - $client = new Client(); - $res = $client->post(config('recaptcha.domain'), [ - 'form_params' => [ - 'secret' => config('recaptcha.secret_key'), - 'response' => $request->input('g-recaptcha-response'), - ], - ]); - - if ($res->getStatusCode() === 200) { - $result = json_decode($res->getBody()); - - if ($result->success && (!config('recaptcha.verify_domain') || $this->isResponseVerified($result, $request))) { - return $next($request); - } - } - } - - event(new FailedCaptcha($request->ip(), $result->hostname ?? null)); - - throw new HttpException(Response::HTTP_BAD_REQUEST, 'Failed to validate reCAPTCHA data.'); - } - - /** - * Determine if the response from the recaptcha servers was valid. - */ - private function isResponseVerified(\stdClass $result, Request $request): bool - { - if (!config('recaptcha.verify_domain')) { - return false; - } - - $url = parse_url($request->url()); - - return $result->hostname === array_get($url, 'host'); - } -} diff --git a/app/Http/Requests/Admin/AdminFormRequest.php b/app/Http/Requests/Admin/AdminFormRequest.php deleted file mode 100644 index 54e9f5e92c..0000000000 --- a/app/Http/Requests/Admin/AdminFormRequest.php +++ /dev/null @@ -1,35 +0,0 @@ -user())) { - return false; - } - - return $this->user()->isRootAdmin(); - } - - /** - * Return only the fields that we are interested in from the request. - * This will include empty fields as a null value. - */ - public function normalize(array $only = null): array - { - return $this->only($only ?? array_keys($this->rules())); - } -} diff --git a/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php b/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php deleted file mode 100644 index 83f80f267d..0000000000 --- a/app/Http/Requests/Admin/Api/StoreApplicationApiKeyRequest.php +++ /dev/null @@ -1,37 +0,0 @@ -mapWithKeys(function ($resource) use ($modelRules) { - return [AdminAcl::COLUMN_IDENTIFIER . $resource => $modelRules['r_' . $resource]]; - })->merge(['memo' => $modelRules['memo']])->toArray(); - } - - public function attributes(): array - { - return [ - 'memo' => 'Description', - ]; - } - - public function getKeyPermissions(): array - { - return collect($this->validated())->filter(function ($value, $key) { - return substr($key, 0, strlen(AdminAcl::COLUMN_IDENTIFIER)) === AdminAcl::COLUMN_IDENTIFIER; - })->toArray(); - } -} diff --git a/app/Http/Requests/Admin/BaseFormRequest.php b/app/Http/Requests/Admin/BaseFormRequest.php deleted file mode 100644 index b33562af2d..0000000000 --- a/app/Http/Requests/Admin/BaseFormRequest.php +++ /dev/null @@ -1,13 +0,0 @@ - 'required|between:1,256', - ]; - } -} diff --git a/app/Http/Requests/Admin/DatabaseHostFormRequest.php b/app/Http/Requests/Admin/DatabaseHostFormRequest.php deleted file mode 100644 index 43bcd6c2bf..0000000000 --- a/app/Http/Requests/Admin/DatabaseHostFormRequest.php +++ /dev/null @@ -1,30 +0,0 @@ -method() !== 'POST') { - return DatabaseHost::getRulesForUpdate($this->route()->parameter('host')); - } - - return DatabaseHost::getRules(); - } - - /** - * Modify submitted data before it is passed off to the validator. - */ - protected function getValidatorInstance(): Validator - { - if (!$this->filled('node_id')) { - $this->merge(['node_id' => null]); - } - - return parent::getValidatorInstance(); - } -} diff --git a/app/Http/Requests/Admin/Egg/EggFormRequest.php b/app/Http/Requests/Admin/Egg/EggFormRequest.php deleted file mode 100644 index d1af8a0852..0000000000 --- a/app/Http/Requests/Admin/Egg/EggFormRequest.php +++ /dev/null @@ -1,43 +0,0 @@ - 'required|string|max:255', - 'description' => 'nullable|string', - 'docker_images' => 'required|string', - 'force_outgoing_ip' => 'sometimes|boolean', - 'file_denylist' => 'array', - 'startup' => 'required|string', - 'config_from' => 'sometimes|bail|nullable|numeric', - 'config_stop' => 'required_without:config_from|nullable|string|max:255', - 'config_startup' => 'required_without:config_from|nullable|json', - 'config_logs' => 'required_without:config_from|nullable|json', - 'config_files' => 'required_without:config_from|nullable|json', - ]; - - return $rules; - } - - public function withValidator($validator) - { - $validator->sometimes('config_from', 'exists:eggs,id', function () { - return (int) $this->input('config_from') !== 0; - }); - } - - public function validated($key = null, $default = null): array - { - $data = parent::validated(); - - return array_merge($data, [ - 'force_outgoing_ip' => array_get($data, 'force_outgoing_ip', false), - ]); - } -} diff --git a/app/Http/Requests/Admin/Egg/EggImportFormRequest.php b/app/Http/Requests/Admin/Egg/EggImportFormRequest.php deleted file mode 100644 index 81b455a7b2..0000000000 --- a/app/Http/Requests/Admin/Egg/EggImportFormRequest.php +++ /dev/null @@ -1,15 +0,0 @@ - 'bail|required|file|max:1000|mimetypes:application/json,text/plain', - ]; - } -} diff --git a/app/Http/Requests/Admin/Egg/EggScriptFormRequest.php b/app/Http/Requests/Admin/Egg/EggScriptFormRequest.php deleted file mode 100644 index 1684768034..0000000000 --- a/app/Http/Requests/Admin/Egg/EggScriptFormRequest.php +++ /dev/null @@ -1,22 +0,0 @@ - 'sometimes|nullable|string', - 'script_is_privileged' => 'sometimes|required|boolean', - 'script_entry' => 'sometimes|required|string', - 'script_container' => 'sometimes|required|string', - 'copy_script_from' => 'sometimes|nullable|numeric', - ]; - } -} diff --git a/app/Http/Requests/Admin/Egg/EggVariableFormRequest.php b/app/Http/Requests/Admin/Egg/EggVariableFormRequest.php deleted file mode 100644 index c6720aa2cc..0000000000 --- a/app/Http/Requests/Admin/Egg/EggVariableFormRequest.php +++ /dev/null @@ -1,24 +0,0 @@ - 'required|string|min:1|max:255', - 'description' => 'sometimes|nullable|string', - 'env_variable' => 'required|regex:/^[\w]{1,255}$/|notIn:' . EggVariable::RESERVED_ENV_NAMES, - 'options' => 'sometimes|required|array', - 'rules' => 'bail|required|string', - 'default_value' => 'present', - ]; - } -} diff --git a/app/Http/Requests/Admin/NewUserFormRequest.php b/app/Http/Requests/Admin/NewUserFormRequest.php deleted file mode 100644 index e3b91f597f..0000000000 --- a/app/Http/Requests/Admin/NewUserFormRequest.php +++ /dev/null @@ -1,27 +0,0 @@ -only([ - 'email', - 'username', - 'name_first', - 'name_last', - 'password', - 'language', - ])->toArray(); - } -} diff --git a/app/Http/Requests/Admin/Node/AllocationAliasFormRequest.php b/app/Http/Requests/Admin/Node/AllocationAliasFormRequest.php deleted file mode 100644 index 3da9f1896e..0000000000 --- a/app/Http/Requests/Admin/Node/AllocationAliasFormRequest.php +++ /dev/null @@ -1,16 +0,0 @@ - 'present|nullable|string', - 'allocation_id' => 'required|numeric|exists:allocations,id', - ]; - } -} diff --git a/app/Http/Requests/Admin/Node/AllocationFormRequest.php b/app/Http/Requests/Admin/Node/AllocationFormRequest.php deleted file mode 100644 index 720488e188..0000000000 --- a/app/Http/Requests/Admin/Node/AllocationFormRequest.php +++ /dev/null @@ -1,17 +0,0 @@ - 'required|string', - 'allocation_alias' => 'sometimes|nullable|string|max:255', - 'allocation_ports' => 'required|array', - ]; - } -} diff --git a/app/Http/Requests/Admin/Node/NodeFormRequest.php b/app/Http/Requests/Admin/Node/NodeFormRequest.php deleted file mode 100644 index 9fc27e99b1..0000000000 --- a/app/Http/Requests/Admin/Node/NodeFormRequest.php +++ /dev/null @@ -1,21 +0,0 @@ -method() === 'PATCH') { - return Node::getRulesForUpdate($this->route()->parameter('node')); - } - - return Node::getRules(); - } -} diff --git a/app/Http/Requests/Admin/ServerFormRequest.php b/app/Http/Requests/Admin/ServerFormRequest.php deleted file mode 100644 index d3f9781288..0000000000 --- a/app/Http/Requests/Admin/ServerFormRequest.php +++ /dev/null @@ -1,58 +0,0 @@ -after(function ($validator) { - $validator->sometimes('node_id', 'required|numeric|bail|exists:nodes,id', function ($input) { - return !$input->auto_deploy; - }); - - $validator->sometimes('allocation_id', [ - 'required', - 'numeric', - 'bail', - Rule::exists('allocations', 'id')->where(function ($query) { - $query->where('node_id', $this->input('node_id')); - $query->whereNull('server_id'); - }), - ], function ($input) { - return !$input->auto_deploy; - }); - - $validator->sometimes('allocation_additional.*', [ - 'sometimes', - 'required', - 'numeric', - Rule::exists('allocations', 'id')->where(function ($query) { - $query->where('node_id', $this->input('node_id')); - $query->whereNull('server_id'); - }), - ], function ($input) { - return !$input->auto_deploy; - }); - }); - } -} diff --git a/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php b/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php deleted file mode 100644 index 3ee2056f55..0000000000 --- a/app/Http/Requests/Admin/Servers/Databases/StoreServerDatabaseRequest.php +++ /dev/null @@ -1,31 +0,0 @@ - [ - 'required', - 'string', - 'min:1', - 'max:24', - Rule::unique('databases')->where(function (Builder $query) { - $query->where('database_host_id', $this->input('database_host_id') ?? 0); - }), - ], - 'max_connections' => 'nullable', - 'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/', - 'database_host_id' => 'required|integer|exists:database_hosts,id', - ]; - } -} diff --git a/app/Http/Requests/Admin/Settings/AdvancedSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/AdvancedSettingsFormRequest.php deleted file mode 100644 index f02f60d013..0000000000 --- a/app/Http/Requests/Admin/Settings/AdvancedSettingsFormRequest.php +++ /dev/null @@ -1,50 +0,0 @@ - 'required|in:true,false', - 'recaptcha:secret_key' => 'required|string|max:255', - 'recaptcha:website_key' => 'required|string|max:255', - 'panel:guzzle:timeout' => 'required|integer|between:1,60', - 'panel:guzzle:connect_timeout' => 'required|integer|between:1,60', - 'panel:client_features:allocations:enabled' => 'required|in:true,false', - 'panel:client_features:allocations:range_start' => [ - 'nullable', - 'required_if:panel:client_features:allocations:enabled,true', - 'integer', - 'between:1024,65535', - ], - 'panel:client_features:allocations:range_end' => [ - 'nullable', - 'required_if:panel:client_features:allocations:enabled,true', - 'integer', - 'between:1024,65535', - 'gt:panel:client_features:allocations:range_start', - ], - ]; - } - - public function attributes(): array - { - return [ - 'recaptcha:enabled' => 'reCAPTCHA Enabled', - 'recaptcha:secret_key' => 'reCAPTCHA Secret Key', - 'recaptcha:website_key' => 'reCAPTCHA Website Key', - 'panel:guzzle:timeout' => 'HTTP Request Timeout', - 'panel:guzzle:connect_timeout' => 'HTTP Connection Timeout', - 'panel:client_features:allocations:enabled' => 'Auto Create Allocations Enabled', - 'panel:client_features:allocations:range_start' => 'Starting Port', - 'panel:client_features:allocations:range_end' => 'Ending Port', - ]; - } -} diff --git a/app/Http/Requests/Admin/Settings/BaseSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/BaseSettingsFormRequest.php deleted file mode 100644 index eb84e25cf9..0000000000 --- a/app/Http/Requests/Admin/Settings/BaseSettingsFormRequest.php +++ /dev/null @@ -1,30 +0,0 @@ - 'required|string|max:255', - 'panel:auth:2fa_required' => 'required|integer|in:0,1,2', - 'app:locale' => ['required', 'string', Rule::in(array_keys($this->getAvailableLanguages()))], - ]; - } - - public function attributes(): array - { - return [ - 'app:name' => 'Company Name', - 'panel:auth:2fa_required' => 'Require 2-Factor Authentication', - 'app:locale' => 'Default Language', - ]; - } -} diff --git a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php b/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php deleted file mode 100644 index 9e62869d83..0000000000 --- a/app/Http/Requests/Admin/Settings/MailSettingsFormRequest.php +++ /dev/null @@ -1,40 +0,0 @@ - 'required|string', - 'mail:mailers:smtp:port' => 'required|integer|between:1,65535', - 'mail:mailers:smtp:encryption' => ['present', Rule::in([null, 'tls', 'ssl'])], - 'mail:mailers:smtp:username' => 'nullable|string|max:255', - 'mail:mailers:smtp:password' => 'nullable|string|max:255', - 'mail:from:address' => 'required|string|email', - 'mail:from:name' => 'nullable|string|max:255', - ]; - } - - /** - * Override the default normalization function for this type of request - * as we need to accept empty values on the keys. - */ - public function normalize(array $only = null): array - { - $keys = array_flip(array_keys($this->rules())); - - if (empty($this->input('mail:mailers:smtp:password'))) { - unset($keys['mail:mailers:smtp:password']); - } - - return $this->only(array_flip($keys)); - } -} diff --git a/app/Http/Requests/Admin/UserFormRequest.php b/app/Http/Requests/Admin/UserFormRequest.php deleted file mode 100644 index 78a0a1bbd2..0000000000 --- a/app/Http/Requests/Admin/UserFormRequest.php +++ /dev/null @@ -1,27 +0,0 @@ -route()->parameter('user')) - )->only([ - 'email', - 'username', - 'name_first', - 'name_last', - 'password', - 'language', - ])->toArray(); - } -} diff --git a/app/Http/Requests/Api/Application/Allocations/DeleteAllocationRequest.php b/app/Http/Requests/Api/Application/Allocations/DeleteAllocationRequest.php index 74077965e5..9e05922eaa 100644 --- a/app/Http/Requests/Api/Application/Allocations/DeleteAllocationRequest.php +++ b/app/Http/Requests/Api/Application/Allocations/DeleteAllocationRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Allocations; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Allocation; +use App\Services\Acl\Api\AdminAcl; class DeleteAllocationRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_ALLOCATIONS; + protected ?string $resource = Allocation::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; } diff --git a/app/Http/Requests/Api/Application/Allocations/GetAllocationsRequest.php b/app/Http/Requests/Api/Application/Allocations/GetAllocationsRequest.php index c59a66374c..85cfbb1c9b 100644 --- a/app/Http/Requests/Api/Application/Allocations/GetAllocationsRequest.php +++ b/app/Http/Requests/Api/Application/Allocations/GetAllocationsRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Allocations; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Allocation; +use App\Services\Acl\Api\AdminAcl; class GetAllocationsRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_ALLOCATIONS; + protected ?string $resource = Allocation::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Allocations/StoreAllocationRequest.php b/app/Http/Requests/Api/Application/Allocations/StoreAllocationRequest.php index 397f720935..9cde1674a4 100644 --- a/app/Http/Requests/Api/Application/Allocations/StoreAllocationRequest.php +++ b/app/Http/Requests/Api/Application/Allocations/StoreAllocationRequest.php @@ -2,15 +2,17 @@ namespace App\Http\Requests\Api\Application\Allocations; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Allocation; +use App\Services\Acl\Api\AdminAcl; class StoreAllocationRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_ALLOCATIONS; + protected ?string $resource = Allocation::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; + /** @return array */ public function rules(): array { return [ @@ -21,6 +23,9 @@ public function rules(): array ]; } + /** + * @return array + */ public function validated($key = null, $default = null): array { $data = parent::validated(); diff --git a/app/Http/Requests/Api/Application/ApplicationApiRequest.php b/app/Http/Requests/Api/Application/ApplicationApiRequest.php index a0e17c15dd..561c9f1e46 100644 --- a/app/Http/Requests/Api/Application/ApplicationApiRequest.php +++ b/app/Http/Requests/Api/Application/ApplicationApiRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Application; -use Webmozart\Assert\Assert; +use App\Exceptions\PanelException; use App\Models\ApiKey; -use Laravel\Sanctum\TransientToken; -use Illuminate\Validation\Validator; -use Illuminate\Database\Eloquent\Model; use App\Services\Acl\Api\AdminAcl; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Http\FormRequest; -use App\Exceptions\PanelException; +use Illuminate\Validation\Validator; +use Laravel\Sanctum\TransientToken; +use Webmozart\Assert\Assert; abstract class ApplicationApiRequest extends FormRequest { @@ -29,7 +29,7 @@ abstract class ApplicationApiRequest extends FormRequest * Determine if the current user is authorized to perform * the requested action against the API. * - * @throws \App\Exceptions\PanelException + * @throws PanelException */ public function authorize(): bool { @@ -37,22 +37,25 @@ public function authorize(): bool throw new PanelException('An ACL resource must be defined on API requests.'); } + /** @var TransientToken|ApiKey $token */ $token = $this->user()->currentAccessToken(); + if ($token instanceof TransientToken) { - return true; + return match ($this->permission) { + default => false, + AdminAcl::READ => $this->user()->can('viewList ' . $this->resource) && $this->user()->can('view ' . $this->resource), + AdminAcl::WRITE => $this->user()->can('update ' . $this->resource), + }; } - /** @var ApiKey $token */ - if ($token->key_type === ApiKey::TYPE_ACCOUNT) { + if ($this->user()->isRootAdmin() && $token->key_type === ApiKey::TYPE_ACCOUNT) { return true; } return AdminAcl::check($token, $this->resource, $this->permission); } - /** - * Default set of rules to apply to API requests. - */ + /** @return array */ public function rules(): array { return []; @@ -74,8 +77,7 @@ public function withValidator(Validator $validator): void * * @template T of \Illuminate\Database\Eloquent\Model * - * @param class-string $expect - * + * @param class-string $expect * @return T * * @noinspection PhpDocSignatureInspection diff --git a/app/Http/Requests/Api/Application/DatabaseHosts/DeleteDatabaseHostRequest.php b/app/Http/Requests/Api/Application/DatabaseHosts/DeleteDatabaseHostRequest.php index b920790679..7c2cff3565 100644 --- a/app/Http/Requests/Api/Application/DatabaseHosts/DeleteDatabaseHostRequest.php +++ b/app/Http/Requests/Api/Application/DatabaseHosts/DeleteDatabaseHostRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\DatabaseHosts; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\DatabaseHost; +use App\Services\Acl\Api\AdminAcl; class DeleteDatabaseHostRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_DATABASE_HOSTS; + protected ?string $resource = DatabaseHost::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; } diff --git a/app/Http/Requests/Api/Application/DatabaseHosts/GetDatabaseHostRequest.php b/app/Http/Requests/Api/Application/DatabaseHosts/GetDatabaseHostRequest.php index 8cd876fc11..8868409741 100644 --- a/app/Http/Requests/Api/Application/DatabaseHosts/GetDatabaseHostRequest.php +++ b/app/Http/Requests/Api/Application/DatabaseHosts/GetDatabaseHostRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\DatabaseHosts; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\DatabaseHost; +use App\Services\Acl\Api\AdminAcl; class GetDatabaseHostRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_DATABASE_HOSTS; + protected ?string $resource = DatabaseHost::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/DatabaseHosts/StoreDatabaseHostRequest.php b/app/Http/Requests/Api/Application/DatabaseHosts/StoreDatabaseHostRequest.php index aedd5109ba..8e1db9ab02 100644 --- a/app/Http/Requests/Api/Application/DatabaseHosts/StoreDatabaseHostRequest.php +++ b/app/Http/Requests/Api/Application/DatabaseHosts/StoreDatabaseHostRequest.php @@ -2,17 +2,21 @@ namespace App\Http\Requests\Api\Application\DatabaseHosts; +use App\Http\Requests\Api\Application\ApplicationApiRequest; use App\Models\DatabaseHost; use App\Services\Acl\Api\AdminAcl; -use App\Http\Requests\Api\Application\ApplicationApiRequest; class StoreDatabaseHostRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_DATABASE_HOSTS; + protected ?string $resource = DatabaseHost::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; - public function rules(array $rules = null): array + /** + * @param array|null $rules + * @return array + */ + public function rules(?array $rules = null): array { return $rules ?? DatabaseHost::getRules(); } diff --git a/app/Http/Requests/Api/Application/DatabaseHosts/UpdateDatabaseHostRequest.php b/app/Http/Requests/Api/Application/DatabaseHosts/UpdateDatabaseHostRequest.php index 111560bbfd..128188ed99 100644 --- a/app/Http/Requests/Api/Application/DatabaseHosts/UpdateDatabaseHostRequest.php +++ b/app/Http/Requests/Api/Application/DatabaseHosts/UpdateDatabaseHostRequest.php @@ -6,11 +6,12 @@ class UpdateDatabaseHostRequest extends StoreDatabaseHostRequest { - public function rules(array $rules = null): array + /** @return array */ + public function rules(?array $rules = null): array { /** @var DatabaseHost $databaseHost */ $databaseHost = $this->route()->parameter('database_host'); - return $rules ?? DatabaseHost::getRulesForUpdate($databaseHost->id); + return $rules ?? DatabaseHost::getRulesForUpdate($databaseHost); } } diff --git a/app/Http/Requests/Api/Application/Eggs/ExportEggRequest.php b/app/Http/Requests/Api/Application/Eggs/ExportEggRequest.php new file mode 100644 index 0000000000..be83a88097 --- /dev/null +++ b/app/Http/Requests/Api/Application/Eggs/ExportEggRequest.php @@ -0,0 +1,13 @@ + 'nullable|string|in:yaml,json', + ]; + } +} diff --git a/app/Http/Requests/Api/Application/Eggs/GetEggRequest.php b/app/Http/Requests/Api/Application/Eggs/GetEggRequest.php index c5249b2cea..c94d33ba70 100644 --- a/app/Http/Requests/Api/Application/Eggs/GetEggRequest.php +++ b/app/Http/Requests/Api/Application/Eggs/GetEggRequest.php @@ -3,11 +3,12 @@ namespace App\Http\Requests\Api\Application\Eggs; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Egg; use App\Services\Acl\Api\AdminAcl; class GetEggRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_EGGS; + protected ?string $resource = Egg::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Eggs/GetEggsRequest.php b/app/Http/Requests/Api/Application/Eggs/GetEggsRequest.php index 1d4ebe3616..fb46d30628 100644 --- a/app/Http/Requests/Api/Application/Eggs/GetEggsRequest.php +++ b/app/Http/Requests/Api/Application/Eggs/GetEggsRequest.php @@ -3,11 +3,12 @@ namespace App\Http\Requests\Api\Application\Eggs; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Egg; use App\Services\Acl\Api\AdminAcl; class GetEggsRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_EGGS; + protected ?string $resource = Egg::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Eggs/ImportEggRequest.php b/app/Http/Requests/Api/Application/Eggs/ImportEggRequest.php new file mode 100644 index 0000000000..a1980f04f1 --- /dev/null +++ b/app/Http/Requests/Api/Application/Eggs/ImportEggRequest.php @@ -0,0 +1,14 @@ +|null $rules + * @return array */ - public function rules(array $rules = null): array + public function rules(?array $rules = null): array { /** @var Mount $mount */ $mount = $this->route()->parameter('mount'); - return Mount::getRulesForUpdate($mount->id); + return Mount::getRulesForUpdate($mount); } } diff --git a/app/Http/Requests/Api/Application/Nodes/DeleteNodeRequest.php b/app/Http/Requests/Api/Application/Nodes/DeleteNodeRequest.php index 5a00f5831a..8cd7a50a32 100644 --- a/app/Http/Requests/Api/Application/Nodes/DeleteNodeRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/DeleteNodeRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Nodes; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Node; +use App\Services\Acl\Api\AdminAcl; class DeleteNodeRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_NODES; + protected ?string $resource = Node::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; } diff --git a/app/Http/Requests/Api/Application/Nodes/GetNodeRequest.php b/app/Http/Requests/Api/Application/Nodes/GetNodeRequest.php index f4b1836ca5..19e05bf22c 100644 --- a/app/Http/Requests/Api/Application/Nodes/GetNodeRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/GetNodeRequest.php @@ -2,6 +2,4 @@ namespace App\Http\Requests\Api\Application\Nodes; -class GetNodeRequest extends GetNodesRequest -{ -} +class GetNodeRequest extends GetNodesRequest {} diff --git a/app/Http/Requests/Api/Application/Nodes/GetNodesRequest.php b/app/Http/Requests/Api/Application/Nodes/GetNodesRequest.php index 2409023102..9227f050af 100644 --- a/app/Http/Requests/Api/Application/Nodes/GetNodesRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/GetNodesRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Nodes; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Node; +use App\Services\Acl\Api\AdminAcl; class GetNodesRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_NODES; + protected ?string $resource = Node::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php b/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php index 913204b836..18e95edb2a 100644 --- a/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/StoreNodeRequest.php @@ -2,47 +2,31 @@ namespace App\Http\Requests\Api\Application\Nodes; +use App\Http\Requests\Api\Application\ApplicationApiRequest; use App\Models\Node; use App\Services\Acl\Api\AdminAcl; -use App\Http\Requests\Api\Application\ApplicationApiRequest; class StoreNodeRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_NODES; + protected ?string $resource = Node::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; /** - * Validation rules to apply to this request. + * @param array|null $rules + * @return array */ - public function rules(array $rules = null): array + public function rules(?array $rules = null): array { - return collect($rules ?? Node::getRules())->only([ - 'public', - 'name', - 'description', - 'fqdn', - 'scheme', - 'behind_proxy', - 'maintenance_mode', - 'memory', - 'memory_overallocate', - 'disk', - 'disk_overallocate', - 'cpu', - 'cpu_overallocate', - 'upload_size', - 'daemon_listen', - 'daemon_sftp', - 'daemon_sftp_alias', - 'daemon_base', - ])->mapWithKeys(function ($value, $key) { + return collect($rules ?? Node::getRules())->mapWithKeys(function ($value, $key) { return [snake_case($key) => $value]; })->toArray(); } /** * Fields to rename for clarity in the API response. + * + * @return array */ public function attributes(): array { @@ -56,6 +40,8 @@ public function attributes(): array /** * Change the formatting of some data keys in the validated response data * to match what the application expects in the services. + * + * @return array */ public function validated($key = null, $default = null): array { diff --git a/app/Http/Requests/Api/Application/Nodes/UpdateNodeRequest.php b/app/Http/Requests/Api/Application/Nodes/UpdateNodeRequest.php index ab636dff02..24a7186e1b 100644 --- a/app/Http/Requests/Api/Application/Nodes/UpdateNodeRequest.php +++ b/app/Http/Requests/Api/Application/Nodes/UpdateNodeRequest.php @@ -7,14 +7,14 @@ class UpdateNodeRequest extends StoreNodeRequest { /** - * Apply validation rules to this request. Uses the parent class rules() - * function but passes in the rules for updating rather than creating. + * @param array|null $rules + * @return array */ - public function rules(array $rules = null): array + public function rules(?array $rules = null): array { /** @var Node $node */ $node = $this->route()->parameter('node'); - return parent::rules(Node::getRulesForUpdate($node->id)); + return parent::rules(Node::getRulesForUpdate($node)); } } diff --git a/app/Http/Requests/Api/Application/Plugins/ImportFilePluginRequest.php b/app/Http/Requests/Api/Application/Plugins/ImportFilePluginRequest.php new file mode 100644 index 0000000000..99e888912d --- /dev/null +++ b/app/Http/Requests/Api/Application/Plugins/ImportFilePluginRequest.php @@ -0,0 +1,13 @@ + 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Api/Application/Plugins/ReadPluginRequest.php b/app/Http/Requests/Api/Application/Plugins/ReadPluginRequest.php new file mode 100644 index 0000000000..798d3cab09 --- /dev/null +++ b/app/Http/Requests/Api/Application/Plugins/ReadPluginRequest.php @@ -0,0 +1,14 @@ +|null $rules + * @return array + */ + public function rules(?array $rules = null): array + { + return [ + 'delete' => 'boolean', + ]; + } +} diff --git a/app/Http/Requests/Api/Application/Plugins/WritePluginRequest.php b/app/Http/Requests/Api/Application/Plugins/WritePluginRequest.php new file mode 100644 index 0000000000..8c4c7a8155 --- /dev/null +++ b/app/Http/Requests/Api/Application/Plugins/WritePluginRequest.php @@ -0,0 +1,14 @@ +|null $rules + * @return array + */ + public function rules(?array $rules = null): array { return [ 'name' => 'required|string', diff --git a/app/Http/Requests/Api/Application/Roles/UpdateRoleRequest.php b/app/Http/Requests/Api/Application/Roles/UpdateRoleRequest.php index 48dc3d04e9..cad334b8f1 100644 --- a/app/Http/Requests/Api/Application/Roles/UpdateRoleRequest.php +++ b/app/Http/Requests/Api/Application/Roles/UpdateRoleRequest.php @@ -2,6 +2,4 @@ namespace App\Http\Requests\Api\Application\Roles; -class UpdateRoleRequest extends StoreRoleRequest -{ -} +class UpdateRoleRequest extends StoreRoleRequest {} diff --git a/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabaseRequest.php b/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabaseRequest.php index 1b1c42aaa2..c90f1b961b 100644 --- a/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabaseRequest.php +++ b/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabaseRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Servers\Databases; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Database; +use App\Services\Acl\Api\AdminAcl; class GetServerDatabaseRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVER_DATABASES; + protected ?string $resource = Database::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabasesRequest.php b/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabasesRequest.php index 9296ea3d47..1f81eb24f0 100644 --- a/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabasesRequest.php +++ b/app/Http/Requests/Api/Application/Servers/Databases/GetServerDatabasesRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Servers\Databases; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Database; +use App\Services\Acl\Api\AdminAcl; class GetServerDatabasesRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVER_DATABASES; + protected ?string $resource = Database::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php b/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php index 558834011d..14788bc4a0 100644 --- a/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php +++ b/app/Http/Requests/Api/Application/Servers/Databases/StoreServerDatabaseRequest.php @@ -2,17 +2,18 @@ namespace App\Http\Requests\Api\Application\Servers\Databases; -use Webmozart\Assert\Assert; +use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Database; use App\Models\Server; -use Illuminate\Validation\Rule; -use Illuminate\Database\Query\Builder; use App\Services\Acl\Api\AdminAcl; use App\Services\Databases\DatabaseManagementService; -use App\Http\Requests\Api\Application\ApplicationApiRequest; +use Illuminate\Database\Query\Builder; +use Illuminate\Validation\Rule; +use Webmozart\Assert\Assert; class StoreServerDatabaseRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVER_DATABASES; + protected ?string $resource = Database::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; @@ -41,6 +42,12 @@ public function rules(): array /** * Return data formatted in the correct format for the service to consume. + * + * @return array{ + * database: string, + * remote: string, + * database_host_id: int, + * } */ public function validated($key = null, $default = null): array { @@ -53,6 +60,8 @@ public function validated($key = null, $default = null): array /** * Format error messages in a more understandable format for API output. + * + * @return array */ public function attributes(): array { diff --git a/app/Http/Requests/Api/Application/Servers/GetExternalServerRequest.php b/app/Http/Requests/Api/Application/Servers/GetExternalServerRequest.php index f49672c5b3..717adfee88 100644 --- a/app/Http/Requests/Api/Application/Servers/GetExternalServerRequest.php +++ b/app/Http/Requests/Api/Application/Servers/GetExternalServerRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Servers; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Server; +use App\Services\Acl\Api\AdminAcl; class GetExternalServerRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVERS; + protected ?string $resource = Server::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Servers/GetServerRequest.php b/app/Http/Requests/Api/Application/Servers/GetServerRequest.php index 4060ced803..faefbdc7b2 100644 --- a/app/Http/Requests/Api/Application/Servers/GetServerRequest.php +++ b/app/Http/Requests/Api/Application/Servers/GetServerRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Servers; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Server; +use App\Services\Acl\Api\AdminAcl; class GetServerRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVERS; + protected ?string $resource = Server::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Servers/ServerWriteRequest.php b/app/Http/Requests/Api/Application/Servers/ServerWriteRequest.php index 7f083364e4..8bfdf65d1e 100644 --- a/app/Http/Requests/Api/Application/Servers/ServerWriteRequest.php +++ b/app/Http/Requests/Api/Application/Servers/ServerWriteRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Servers; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Server; +use App\Services\Acl\Api\AdminAcl; class ServerWriteRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVERS; + protected ?string $resource = Server::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; } diff --git a/app/Http/Requests/Api/Application/Servers/StoreServerRequest.php b/app/Http/Requests/Api/Application/Servers/StoreServerRequest.php index 86ac941fd6..a944b61775 100644 --- a/app/Http/Requests/Api/Application/Servers/StoreServerRequest.php +++ b/app/Http/Requests/Api/Application/Servers/StoreServerRequest.php @@ -2,16 +2,16 @@ namespace App\Http\Requests\Api\Application\Servers; +use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Objects\DeploymentObject; use App\Models\Server; +use App\Services\Acl\Api\AdminAcl; use Illuminate\Validation\Rule; use Illuminate\Validation\Validator; -use App\Services\Acl\Api\AdminAcl; -use App\Models\Objects\DeploymentObject; -use App\Http\Requests\Api\Application\ApplicationApiRequest; class StoreServerRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVERS; + protected ?string $resource = Server::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; @@ -55,9 +55,12 @@ public function rules(): array // Automatic deployment rules 'deploy' => 'sometimes|required|array', - 'deploy.locations' => 'array', - 'deploy.locations.*' => 'required_with:deploy.locations,integer|min:1', - 'deploy.dedicated_ip' => 'required_with:deploy,boolean', + // Locations are deprecated, use tags + 'deploy.locations' => 'sometimes|array', + 'deploy.locations.*' => 'required_with:deploy.locations|integer|min:1', + 'deploy.tags' => 'array', + 'deploy.tags.*' => 'required_with:deploy.tags|string|min:1', + 'deploy.dedicated_ip' => 'required_with:deploy|boolean', 'deploy.port_range' => 'array', 'deploy.port_range.*' => 'string', 'start_on_completion' => 'sometimes|boolean', @@ -66,6 +69,31 @@ public function rules(): array /** * Normalize the data into a format that can be consumed by the service. + * + * @return array{ + * external_id: int, + * name: string, + * description: string, + * owner_id: int, + * egg_id: int, + * image: string, + * startup: string, + * environment: string, + * memory: int, + * swap: int, + * disk: int, + * io: int, + * cpu: int, + * threads: int, + * skip_scripts: bool, + * allocation_id: int, + * allocation_additional: int[], + * start_on_completion: bool, + * database_limit: int, + * allocation_limit: int, + * backup_limit: int, + * oom_killer: bool, + * } */ public function validated($key = null, $default = null): array { diff --git a/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php b/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php index 7b0fcad10b..052ae1d4b7 100644 --- a/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php +++ b/app/Http/Requests/Api/Application/Servers/UpdateServerBuildConfigurationRequest.php @@ -12,7 +12,7 @@ class UpdateServerBuildConfigurationRequest extends ServerWriteRequest */ public function rules(): array { - $rules = Server::getRulesForUpdate($this->parameter('server', Server::class)); + $rules = $this->route() ? Server::getRulesForUpdate($this->parameter('server', Server::class)) : Server::getRules(); return [ 'allocation' => $rules['allocation_id'], @@ -26,13 +26,17 @@ public function rules(): array 'limits.threads' => $this->requiredToOptional('threads', $rules['threads'], true), 'limits.disk' => $this->requiredToOptional('disk', $rules['disk'], true), - // Legacy rules to maintain backwards compatable API support without requiring - // a major version bump. + // Deprecated - use limits.memory 'memory' => $this->requiredToOptional('memory', $rules['memory']), + // Deprecated - use limits.swap 'swap' => $this->requiredToOptional('swap', $rules['swap']), + // Deprecated - use limits.io 'io' => $this->requiredToOptional('io', $rules['io']), + // Deprecated - use limits.cpu 'cpu' => $this->requiredToOptional('cpu', $rules['cpu']), + // Deprecated - use limits.threads 'threads' => $this->requiredToOptional('threads', $rules['threads']), + // Deprecated - use limits.disk 'disk' => $this->requiredToOptional('disk', $rules['disk']), 'add_allocations' => 'bail|array', @@ -49,6 +53,8 @@ public function rules(): array /** * Convert the allocation field into the expected format for the service handler. + * + * @return array */ public function validated($key = null, $default = null): array { @@ -74,6 +80,8 @@ public function validated($key = null, $default = null): array /** * Custom attributes to use in error message responses. + * + * @return array */ public function attributes(): array { @@ -92,6 +100,9 @@ public function attributes(): array * Converts existing rules for certain limits into a format that maintains backwards * compatability with the old API endpoint while also supporting a more correct API * call. + * + * @param array $rules + * @return array */ protected function requiredToOptional(string $field, array $rules, bool $limits = false): array { diff --git a/app/Http/Requests/Api/Application/Servers/UpdateServerDetailsRequest.php b/app/Http/Requests/Api/Application/Servers/UpdateServerDetailsRequest.php index 45a05c7e3b..ad419e8ac8 100644 --- a/app/Http/Requests/Api/Application/Servers/UpdateServerDetailsRequest.php +++ b/app/Http/Requests/Api/Application/Servers/UpdateServerDetailsRequest.php @@ -11,7 +11,7 @@ class UpdateServerDetailsRequest extends ServerWriteRequest */ public function rules(): array { - $rules = Server::getRulesForUpdate($this->parameter('server', Server::class)); + $rules = $this->route() ? Server::getRulesForUpdate($this->parameter('server', Server::class)) : Server::getRules(); return [ 'external_id' => $rules['external_id'], @@ -22,8 +22,9 @@ public function rules(): array } /** - * Convert the posted data into the correct format that is expected - * by the application. + * Convert the posted data into the correct format that is expected by the application. + * + * @return array */ public function validated($key = null, $default = null): array { @@ -38,6 +39,8 @@ public function validated($key = null, $default = null): array /** * Rename some attributes in error messages to clarify the field * being discussed. + * + * @return array */ public function attributes(): array { diff --git a/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php b/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php index 47b74f8863..b6963aad54 100644 --- a/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php +++ b/app/Http/Requests/Api/Application/Servers/UpdateServerStartupRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Application\Servers; +use App\Http\Requests\Api\Application\ApplicationApiRequest; use App\Models\Server; use App\Services\Acl\Api\AdminAcl; -use App\Http\Requests\Api\Application\ApplicationApiRequest; class UpdateServerStartupRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_SERVERS; + protected ?string $resource = Server::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; @@ -17,12 +17,12 @@ class UpdateServerStartupRequest extends ApplicationApiRequest */ public function rules(): array { - $data = Server::getRulesForUpdate($this->parameter('server', Server::class)); + $rules = $this->route() ? Server::getRulesForUpdate($this->parameter('server', Server::class)) : Server::getRules(); return [ 'startup' => 'sometimes|string', 'environment' => 'present|array', - 'egg' => $data['egg_id'], + 'egg' => $rules['egg_id'], 'image' => 'sometimes|string', 'skip_scripts' => 'present|boolean', ]; @@ -30,6 +30,8 @@ public function rules(): array /** * Return the validated data in a format that is expected by the service. + * + * @return array */ public function validated($key = null, $default = null): array { diff --git a/app/Http/Requests/Api/Application/Users/AssignUserRolesRequest.php b/app/Http/Requests/Api/Application/Users/AssignUserRolesRequest.php index c0af95102b..f05e0f08bf 100644 --- a/app/Http/Requests/Api/Application/Users/AssignUserRolesRequest.php +++ b/app/Http/Requests/Api/Application/Users/AssignUserRolesRequest.php @@ -4,14 +4,12 @@ class AssignUserRolesRequest extends StoreUserRequest { - /** - * Return the validation rules for this request. - */ - public function rules(array $rules = null): array + /** @return array */ + public function rules(?array $rules = null): array { return [ - 'roles' => 'array', - 'roles.*' => 'int', + 'roles' => 'required|array', + 'roles.*' => 'integer|exists:roles,id', ]; } } diff --git a/app/Http/Requests/Api/Application/Users/DeleteUserRequest.php b/app/Http/Requests/Api/Application/Users/DeleteUserRequest.php index 85ddcc955e..40d204f0d9 100644 --- a/app/Http/Requests/Api/Application/Users/DeleteUserRequest.php +++ b/app/Http/Requests/Api/Application/Users/DeleteUserRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Users; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\User; +use App\Services\Acl\Api\AdminAcl; class DeleteUserRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_USERS; + protected ?string $resource = User::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; } diff --git a/app/Http/Requests/Api/Application/Users/GetExternalUserRequest.php b/app/Http/Requests/Api/Application/Users/GetExternalUserRequest.php index eeba4819aa..f18e4d56ce 100644 --- a/app/Http/Requests/Api/Application/Users/GetExternalUserRequest.php +++ b/app/Http/Requests/Api/Application/Users/GetExternalUserRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Users; -use App\Services\Acl\Api\AdminAcl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\User; +use App\Services\Acl\Api\AdminAcl; class GetExternalUserRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_USERS; + protected ?string $resource = User::RESOURCE_NAME; protected int $permission = AdminAcl::READ; } diff --git a/app/Http/Requests/Api/Application/Users/GetUsersRequest.php b/app/Http/Requests/Api/Application/Users/GetUsersRequest.php index be590e24bb..5e5c501a3f 100644 --- a/app/Http/Requests/Api/Application/Users/GetUsersRequest.php +++ b/app/Http/Requests/Api/Application/Users/GetUsersRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\Api\Application\Users; -use App\Services\Acl\Api\AdminAcl as Acl; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\User; +use App\Services\Acl\Api\AdminAcl as Acl; class GetUsersRequest extends ApplicationApiRequest { - protected ?string $resource = Acl::RESOURCE_USERS; + protected ?string $resource = User::RESOURCE_NAME; protected int $permission = Acl::READ; } diff --git a/app/Http/Requests/Api/Application/Users/StoreUserRequest.php b/app/Http/Requests/Api/Application/Users/StoreUserRequest.php index 43603639c4..520e36c6b3 100644 --- a/app/Http/Requests/Api/Application/Users/StoreUserRequest.php +++ b/app/Http/Requests/Api/Application/Users/StoreUserRequest.php @@ -2,59 +2,45 @@ namespace App\Http\Requests\Api\Application\Users; +use App\Http\Requests\Api\Application\ApplicationApiRequest; use App\Models\User; use App\Services\Acl\Api\AdminAcl; -use App\Http\Requests\Api\Application\ApplicationApiRequest; class StoreUserRequest extends ApplicationApiRequest { - protected ?string $resource = AdminAcl::RESOURCE_USERS; + protected ?string $resource = User::RESOURCE_NAME; protected int $permission = AdminAcl::WRITE; /** - * Return the validation rules for this request. + * @param array |null $rules + * @return array */ - public function rules(array $rules = null): array + public function rules(?array $rules = null): array { $rules = $rules ?? User::getRules(); - $response = collect($rules)->only([ + return collect($rules)->only([ 'external_id', + 'is_managed_externally', 'email', 'username', 'password', 'language', 'timezone', ])->toArray(); - - $response['first_name'] = $rules['name_first']; - $response['last_name'] = $rules['name_last']; - - return $response; - } - - public function validated($key = null, $default = null): array - { - $data = parent::validated(); - - $data['name_first'] = $data['first_name']; - $data['name_last'] = $data['last_name']; - - unset($data['first_name'], $data['last_name']); - - return $data; } /** - * Rename some fields to be more user friendly. + * Rename some fields to be more user-friendly. + * + * @return array */ public function attributes(): array { return [ 'external_id' => 'Third Party Identifier', - 'name_first' => 'First Name', - 'name_last' => 'Last Name', + 'is_managed_externally' => 'Is managed by Third Party?', ]; } } diff --git a/app/Http/Requests/Api/Application/Users/UpdateUserRequest.php b/app/Http/Requests/Api/Application/Users/UpdateUserRequest.php index ecccbdd5aa..6c2a8c2bb2 100644 --- a/app/Http/Requests/Api/Application/Users/UpdateUserRequest.php +++ b/app/Http/Requests/Api/Application/Users/UpdateUserRequest.php @@ -7,12 +7,13 @@ class UpdateUserRequest extends StoreUserRequest { /** - * Return the validation rules for this request. + * @param array |null $rules + * @return array */ - public function rules(array $rules = null): array + public function rules(?array $rules = null): array { - $userId = $this->parameter('user', User::class)->id; + $user = $this->parameter('user', User::class); - return parent::rules(User::getRulesForUpdate($userId)); + return parent::rules(User::getRulesForUpdate($user)); } } diff --git a/app/Http/Requests/Api/Client/Account/StoreApiKeyRequest.php b/app/Http/Requests/Api/Client/Account/StoreApiKeyRequest.php index e0034fcfed..d34a2e5709 100644 --- a/app/Http/Requests/Api/Client/Account/StoreApiKeyRequest.php +++ b/app/Http/Requests/Api/Client/Account/StoreApiKeyRequest.php @@ -2,13 +2,15 @@ namespace App\Http\Requests\Api\Client\Account; -use IPTools\Range; +use App\Http\Requests\Api\Client\ClientApiRequest; use App\Models\ApiKey; +use Exception; use Illuminate\Validation\Validator; -use App\Http\Requests\Api\Client\ClientApiRequest; +use IPTools\Range; class StoreApiKeyRequest extends ClientApiRequest { + /** @return array */ public function rules(): array { $rules = ApiKey::getRules(); @@ -34,7 +36,7 @@ public function withValidator(Validator $validator): void $valid = false; try { $valid = Range::parse($ip)->valid(); - } catch (\Exception $exception) { + } catch (Exception $exception) { if ($exception->getMessage() !== 'Invalid IP address format') { throw $exception; } diff --git a/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php b/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php index 132555eb4d..fa7766315a 100644 --- a/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php +++ b/app/Http/Requests/Api/Client/Account/StoreSSHKeyRequest.php @@ -2,22 +2,21 @@ namespace App\Http\Requests\Api\Client\Account; -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\RSA; +use App\Http\Requests\Api\Client\ClientApiRequest; use App\Models\UserSSHKey; +use Exception; use Illuminate\Validation\Validator; -use phpseclib3\Crypt\PublicKeyLoader; use phpseclib3\Crypt\Common\PublicKey; +use phpseclib3\Crypt\DSA; +use phpseclib3\Crypt\PublicKeyLoader; +use phpseclib3\Crypt\RSA; use phpseclib3\Exception\NoKeyLoadedException; -use App\Http\Requests\Api\Client\ClientApiRequest; class StoreSSHKeyRequest extends ClientApiRequest { protected ?PublicKey $key; - /** - * Returns the rules for this request. - */ + /** @return array */ public function rules(): array { return [ @@ -70,7 +69,7 @@ public function getPublicKey(): string public function getKeyFingerprint(): string { if (!$this->key) { - throw new \Exception('The public key was not properly loaded for this request.'); + throw new Exception('The public key was not properly loaded for this request.'); } return $this->key->getFingerprint('sha256'); diff --git a/app/Http/Requests/Api/Client/Account/UpdateEmailRequest.php b/app/Http/Requests/Api/Client/Account/UpdateEmailRequest.php index 69c070dca3..68bdb31d7a 100644 --- a/app/Http/Requests/Api/Client/Account/UpdateEmailRequest.php +++ b/app/Http/Requests/Api/Client/Account/UpdateEmailRequest.php @@ -2,16 +2,16 @@ namespace App\Http\Requests\Api\Client\Account; +use App\Exceptions\Http\Base\InvalidPasswordProvidedException; +use App\Http\Requests\Api\Client\ClientApiRequest; use App\Models\User; use Illuminate\Container\Container; use Illuminate\Contracts\Hashing\Hasher; -use App\Http\Requests\Api\Client\ClientApiRequest; -use App\Exceptions\Http\Base\InvalidPasswordProvidedException; class UpdateEmailRequest extends ClientApiRequest { /** - * @throws \App\Exceptions\Http\Base\InvalidPasswordProvidedException + * @throws InvalidPasswordProvidedException */ public function authorize(): bool { @@ -26,7 +26,7 @@ public function authorize(): bool throw new InvalidPasswordProvidedException(trans('validation.internal.invalid_password')); } - return true; + return !$this->user()->is_managed_externally; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Account/UpdatePasswordRequest.php b/app/Http/Requests/Api/Client/Account/UpdatePasswordRequest.php index fa5dd141d5..afbbc1f2f5 100644 --- a/app/Http/Requests/Api/Client/Account/UpdatePasswordRequest.php +++ b/app/Http/Requests/Api/Client/Account/UpdatePasswordRequest.php @@ -2,15 +2,15 @@ namespace App\Http\Requests\Api\Client\Account; +use App\Exceptions\Http\Base\InvalidPasswordProvidedException; +use App\Http\Requests\Api\Client\ClientApiRequest; use Illuminate\Container\Container; use Illuminate\Contracts\Hashing\Hasher; -use App\Http\Requests\Api\Client\ClientApiRequest; -use App\Exceptions\Http\Base\InvalidPasswordProvidedException; class UpdatePasswordRequest extends ClientApiRequest { /** - * @throws \App\Exceptions\Http\Base\InvalidPasswordProvidedException + * @throws InvalidPasswordProvidedException */ public function authorize(): bool { @@ -25,7 +25,7 @@ public function authorize(): bool throw new InvalidPasswordProvidedException(trans('validation.internal.invalid_password')); } - return true; + return !$this->user()->is_managed_externally; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Account/UpdateUsernameRequest.php b/app/Http/Requests/Api/Client/Account/UpdateUsernameRequest.php new file mode 100644 index 0000000000..ac2ba0b59a --- /dev/null +++ b/app/Http/Requests/Api/Client/Account/UpdateUsernameRequest.php @@ -0,0 +1,38 @@ +make(Hasher::class); + + // Verify password matches when changing password or email. + if (!$hasher->check($this->input('password'), $this->user()->password)) { + throw new InvalidPasswordProvidedException(trans('validation.internal.invalid_password')); + } + + return !$this->user()->is_managed_externally; + } + + public function rules(): array + { + $rules = User::getRulesForUpdate($this->user()); + + return ['username' => $rules['username']]; + } +} diff --git a/app/Http/Requests/Api/Client/ClientApiRequest.php b/app/Http/Requests/Api/Client/ClientApiRequest.php index e5cb13e0a1..91cdf11e89 100644 --- a/app/Http/Requests/Api/Client/ClientApiRequest.php +++ b/app/Http/Requests/Api/Client/ClientApiRequest.php @@ -2,13 +2,10 @@ namespace App\Http\Requests\Api\Client; -use App\Models\Server; use App\Contracts\Http\ClientPermissionsRequest; use App\Http\Requests\Api\Application\ApplicationApiRequest; +use App\Models\Server; -/** - * @method \App\Models\User user($guard = null) - */ class ClientApiRequest extends ApplicationApiRequest { /** @@ -23,7 +20,7 @@ public function authorize(): bool return $this->user()->can($this->permission(), $server); } - // If there is no server available on the reqest, trigger a failure since + // If there is no server available on the request, trigger a failure since // we expect there to be one at this point. return false; } diff --git a/app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php b/app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php new file mode 100644 index 0000000000..ceaaecda95 --- /dev/null +++ b/app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php @@ -0,0 +1,21 @@ + 'required|string|max:255', + ]; + } +} diff --git a/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php b/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php index 7fbe7b3b6d..4879fa6f90 100644 --- a/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Backups/RestoreBackupRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Backups; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class RestoreBackupRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_BACKUP_RESTORE; + return SubuserPermission::BackupRestore; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Backups/StoreBackupRequest.php b/app/Http/Requests/Api/Client/Servers/Backups/StoreBackupRequest.php index d028bd3e8f..0ae91ab5f2 100644 --- a/app/Http/Requests/Api/Client/Servers/Backups/StoreBackupRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Backups/StoreBackupRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Backups; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class StoreBackupRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_BACKUP_CREATE; + return SubuserPermission::BackupCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Databases/DeleteDatabaseRequest.php b/app/Http/Requests/Api/Client/Servers/Databases/DeleteDatabaseRequest.php index a7e6ea4034..df4792525a 100644 --- a/app/Http/Requests/Api/Client/Servers/Databases/DeleteDatabaseRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Databases/DeleteDatabaseRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Databases; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class DeleteDatabaseRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_DATABASE_DELETE; + return SubuserPermission::DatabaseDelete; } } diff --git a/app/Http/Requests/Api/Client/Servers/Databases/GetDatabasesRequest.php b/app/Http/Requests/Api/Client/Servers/Databases/GetDatabasesRequest.php index 7f7e266ee4..c51d5f8d99 100644 --- a/app/Http/Requests/Api/Client/Servers/Databases/GetDatabasesRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Databases/GetDatabasesRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Databases; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class GetDatabasesRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_DATABASE_READ; + return SubuserPermission::DatabaseRead; } } diff --git a/app/Http/Requests/Api/Client/Servers/Databases/RotatePasswordRequest.php b/app/Http/Requests/Api/Client/Servers/Databases/RotatePasswordRequest.php index f095895c90..0c140eda56 100644 --- a/app/Http/Requests/Api/Client/Servers/Databases/RotatePasswordRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Databases/RotatePasswordRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Databases; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class RotatePasswordRequest extends ClientApiRequest @@ -10,8 +10,8 @@ class RotatePasswordRequest extends ClientApiRequest /** * Check that the user has permission to rotate the password. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_DATABASE_UPDATE; + return SubuserPermission::DatabaseUpdate; } } diff --git a/app/Http/Requests/Api/Client/Servers/Databases/StoreDatabaseRequest.php b/app/Http/Requests/Api/Client/Servers/Databases/StoreDatabaseRequest.php index 14eb3d9709..96ae3e7e84 100644 --- a/app/Http/Requests/Api/Client/Servers/Databases/StoreDatabaseRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Databases/StoreDatabaseRequest.php @@ -2,21 +2,21 @@ namespace App\Http\Requests\Api\Client\Servers\Databases; -use Webmozart\Assert\Assert; -use App\Models\Server; -use Illuminate\Validation\Rule; -use App\Models\Database; -use App\Models\Permission; -use Illuminate\Database\Query\Builder; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Database; +use App\Models\Server; use App\Services\Databases\DatabaseManagementService; +use Illuminate\Database\Query\Builder; +use Illuminate\Validation\Rule; +use Webmozart\Assert\Assert; class StoreDatabaseRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_DATABASE_CREATE; + return SubuserPermission::DatabaseCreate; } public function rules(): array @@ -43,6 +43,9 @@ public function rules(): array ]; } + /** + * @return array + */ public function messages(): array { return [ diff --git a/app/Http/Requests/Api/Client/Servers/Files/ChmodFilesRequest.php b/app/Http/Requests/Api/Client/Servers/Files/ChmodFilesRequest.php index 4c747f306e..1d31c24140 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/ChmodFilesRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/ChmodFilesRequest.php @@ -2,15 +2,15 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class ChmodFilesRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_UPDATE; + return SubuserPermission::FileUpdate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/CompressFilesRequest.php b/app/Http/Requests/Api/Client/Servers/Files/CompressFilesRequest.php index 6e060a6d36..86af93e242 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/CompressFilesRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/CompressFilesRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class CompressFilesRequest extends ClientApiRequest @@ -10,9 +10,9 @@ class CompressFilesRequest extends ClientApiRequest /** * Checks that the authenticated user is allowed to create archives for this server. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_ARCHIVE; + return SubuserPermission::FileArchive; } public function rules(): array @@ -21,6 +21,8 @@ public function rules(): array 'root' => 'sometimes|nullable|string', 'files' => 'required|array', 'files.*' => 'string', + 'name' => 'sometimes|nullable|string', + 'extension' => 'sometimes|in:zip,tgz,tar.gz,txz,tar.xz,tbz2,tar.bz2', ]; } } diff --git a/app/Http/Requests/Api/Client/Servers/Files/CopyFileRequest.php b/app/Http/Requests/Api/Client/Servers/Files/CopyFileRequest.php index 4ec72a8314..2a899aedb2 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/CopyFileRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/CopyFileRequest.php @@ -2,15 +2,15 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class CopyFileRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_CREATE; + return SubuserPermission::FileCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/CreateFolderRequest.php b/app/Http/Requests/Api/Client/Servers/Files/CreateFolderRequest.php index ea54787bd7..ec6d0a97cd 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/CreateFolderRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/CreateFolderRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class CreateFolderRequest extends ClientApiRequest @@ -10,9 +10,9 @@ class CreateFolderRequest extends ClientApiRequest /** * Checks that the authenticated user is allowed to create files on the server. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_CREATE; + return SubuserPermission::FileCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/DecompressFilesRequest.php b/app/Http/Requests/Api/Client/Servers/Files/DecompressFilesRequest.php index 19a37f7dee..949e2051ae 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/DecompressFilesRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/DecompressFilesRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class DecompressFilesRequest extends ClientApiRequest @@ -12,9 +12,9 @@ class DecompressFilesRequest extends ClientApiRequest * rely on the archive permission here as it makes more sense to make sure the user can create * additional files rather than make an archive. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_CREATE; + return SubuserPermission::FileCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/DeleteFileRequest.php b/app/Http/Requests/Api/Client/Servers/Files/DeleteFileRequest.php index 880f61790f..adf55d2a5a 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/DeleteFileRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/DeleteFileRequest.php @@ -2,17 +2,20 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class DeleteFileRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_DELETE; + return SubuserPermission::FileDelete; } + /** + * @return string[] + */ public function rules(): array { return [ diff --git a/app/Http/Requests/Api/Client/Servers/Files/DownloadFileRequest.php b/app/Http/Requests/Api/Client/Servers/Files/DownloadFileRequest.php deleted file mode 100644 index 0cede429d6..0000000000 --- a/app/Http/Requests/Api/Client/Servers/Files/DownloadFileRequest.php +++ /dev/null @@ -1,18 +0,0 @@ -user()->can('file.read', $this->parameter('server', Server::class)); - } -} diff --git a/app/Http/Requests/Api/Client/Servers/Files/GetFileContentsRequest.php b/app/Http/Requests/Api/Client/Servers/Files/GetFileContentsRequest.php index b6c0fa51c8..55931f65c3 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/GetFileContentsRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/GetFileContentsRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class GetFileContentsRequest extends ClientApiRequest implements ClientPermissionsRequest @@ -13,9 +13,9 @@ class GetFileContentsRequest extends ClientApiRequest implements ClientPermissio * validate that the authenticated user has permission to perform this action aganist * the given resource (server). */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_READ_CONTENT; + return SubuserPermission::FileReadContent; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/ListFilesRequest.php b/app/Http/Requests/Api/Client/Servers/Files/ListFilesRequest.php index 554df5c98e..d1fbcb0c31 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/ListFilesRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/ListFilesRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class ListFilesRequest extends ClientApiRequest @@ -11,9 +11,9 @@ class ListFilesRequest extends ClientApiRequest * Check that the user making this request to the API is authorized to list all * the files that exist for a given server. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_READ; + return SubuserPermission::FileRead; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/PullFileRequest.php b/app/Http/Requests/Api/Client/Servers/Files/PullFileRequest.php index 016b73a4aa..2bd88ffc73 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/PullFileRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/PullFileRequest.php @@ -2,15 +2,15 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class PullFileRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_CREATE; + return SubuserPermission::FileCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/RenameFileRequest.php b/app/Http/Requests/Api/Client/Servers/Files/RenameFileRequest.php index 4d4077f56f..6eb75a033a 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/RenameFileRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/RenameFileRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class RenameFileRequest extends ClientApiRequest implements ClientPermissionsRequest @@ -12,9 +12,9 @@ class RenameFileRequest extends ClientApiRequest implements ClientPermissionsReq * The permission the user is required to have in order to perform this * request action. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_UPDATE; + return SubuserPermission::FileUpdate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Files/UploadFileRequest.php b/app/Http/Requests/Api/Client/Servers/Files/UploadFileRequest.php index 5df5e179b3..0254de35b7 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/UploadFileRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/UploadFileRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class UploadFileRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_CREATE; + return SubuserPermission::FileCreate; } } diff --git a/app/Http/Requests/Api/Client/Servers/Files/WriteFileContentRequest.php b/app/Http/Requests/Api/Client/Servers/Files/WriteFileContentRequest.php index 66fddef9fc..eb8f85ef62 100644 --- a/app/Http/Requests/Api/Client/Servers/Files/WriteFileContentRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Files/WriteFileContentRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests\Api\Client\Servers\Files; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class WriteFileContentRequest extends ClientApiRequest implements ClientPermissionsRequest @@ -13,9 +13,9 @@ class WriteFileContentRequest extends ClientApiRequest implements ClientPermissi * validate that the authenticated user has permission to perform this action aganist * the given resource (server). */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_FILE_CREATE; + return SubuserPermission::FileCreate; } /** diff --git a/app/Http/Requests/Api/Client/Servers/Network/DeleteAllocationRequest.php b/app/Http/Requests/Api/Client/Servers/Network/DeleteAllocationRequest.php index a5d76472d6..0daacd8541 100644 --- a/app/Http/Requests/Api/Client/Servers/Network/DeleteAllocationRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Network/DeleteAllocationRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Network; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class DeleteAllocationRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_ALLOCATION_DELETE; + return SubuserPermission::AllocationDelete; } } diff --git a/app/Http/Requests/Api/Client/Servers/Network/GetNetworkRequest.php b/app/Http/Requests/Api/Client/Servers/Network/GetNetworkRequest.php index 05c86ed686..5d523ff275 100644 --- a/app/Http/Requests/Api/Client/Servers/Network/GetNetworkRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Network/GetNetworkRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Network; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class GetNetworkRequest extends ClientApiRequest @@ -11,8 +11,8 @@ class GetNetworkRequest extends ClientApiRequest * Check that the user has permission to view the allocations for * this server. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_ALLOCATION_READ; + return SubuserPermission::AllocationRead; } } diff --git a/app/Http/Requests/Api/Client/Servers/Network/NewAllocationRequest.php b/app/Http/Requests/Api/Client/Servers/Network/NewAllocationRequest.php index c3dbf02e5e..32c50ca86b 100644 --- a/app/Http/Requests/Api/Client/Servers/Network/NewAllocationRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Network/NewAllocationRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Network; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class NewAllocationRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_ALLOCATION_CREATE; + return SubuserPermission::AllocationCreate; } } diff --git a/app/Http/Requests/Api/Client/Servers/Network/UpdateAllocationRequest.php b/app/Http/Requests/Api/Client/Servers/Network/UpdateAllocationRequest.php index 18dfd312bc..6752d2fb0c 100644 --- a/app/Http/Requests/Api/Client/Servers/Network/UpdateAllocationRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Network/UpdateAllocationRequest.php @@ -2,15 +2,15 @@ namespace App\Http\Requests\Api\Client\Servers\Network; -use App\Models\Allocation; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Allocation; class UpdateAllocationRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_ALLOCATION_UPDATE; + return SubuserPermission::AllocationUpdate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/DeleteScheduleRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/DeleteScheduleRequest.php index 6cda70dbb2..dd1ca68967 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/DeleteScheduleRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/DeleteScheduleRequest.php @@ -2,12 +2,12 @@ namespace App\Http\Requests\Api\Client\Servers\Schedules; -use App\Models\Permission; +use App\Enums\SubuserPermission; class DeleteScheduleRequest extends ViewScheduleRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SCHEDULE_DELETE; + return SubuserPermission::ScheduleDelete; } } diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/StoreScheduleRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/StoreScheduleRequest.php index a74602ea12..6fcc821bbc 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/StoreScheduleRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/StoreScheduleRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Schedules; +use App\Enums\SubuserPermission; use App\Models\Schedule; -use App\Models\Permission; class StoreScheduleRequest extends ViewScheduleRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SCHEDULE_CREATE; + return SubuserPermission::ScheduleCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php index 190d3e54f8..cda7b39faa 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers\Schedules; -use App\Models\Permission; +use App\Enums\SubuserPermission; class StoreTaskRequest extends ViewScheduleRequest { @@ -11,9 +11,9 @@ class StoreTaskRequest extends ViewScheduleRequest * check if they can modify a schedule to determine if they're able to do this. There * are no task specific permissions. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SCHEDULE_UPDATE; + return SubuserPermission::ScheduleUpdate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/TriggerScheduleRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/TriggerScheduleRequest.php index 989b298896..9974a70304 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/TriggerScheduleRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/TriggerScheduleRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Schedules; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class TriggerScheduleRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SCHEDULE_UPDATE; + return SubuserPermission::ScheduleUpdate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/UpdateScheduleRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/UpdateScheduleRequest.php index a9937cd8d9..b6444204ce 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/UpdateScheduleRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/UpdateScheduleRequest.php @@ -2,12 +2,12 @@ namespace App\Http\Requests\Api\Client\Servers\Schedules; -use App\Models\Permission; +use App\Enums\SubuserPermission; class UpdateScheduleRequest extends StoreScheduleRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SCHEDULE_UPDATE; + return SubuserPermission::ScheduleUpdate; } } diff --git a/app/Http/Requests/Api/Client/Servers/Schedules/ViewScheduleRequest.php b/app/Http/Requests/Api/Client/Servers/Schedules/ViewScheduleRequest.php index 2dbfb00b23..ae8264dd22 100644 --- a/app/Http/Requests/Api/Client/Servers/Schedules/ViewScheduleRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Schedules/ViewScheduleRequest.php @@ -2,11 +2,11 @@ namespace App\Http\Requests\Api\Client\Servers\Schedules; -use App\Models\Task; -use App\Models\Server; -use App\Models\Schedule; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Schedule; +use App\Models\Server; +use App\Models\Task; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class ViewScheduleRequest extends ClientApiRequest @@ -36,8 +36,8 @@ public function authorize(): bool return true; } - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SCHEDULE_READ; + return SubuserPermission::ScheduleRead; } } diff --git a/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php b/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php index 9de92ba258..4b441eaa9b 100644 --- a/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php +++ b/app/Http/Requests/Api/Client/Servers/SendCommandRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class SendCommandRequest extends ClientApiRequest @@ -10,9 +10,9 @@ class SendCommandRequest extends ClientApiRequest /** * Determine if the API user has permission to perform this action. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_CONTROL_CONSOLE; + return SubuserPermission::ControlConsole; } /** diff --git a/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php b/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php index 517c2c06d9..942e2b507b 100644 --- a/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php +++ b/app/Http/Requests/Api/Client/Servers/SendPowerRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests\Api\Client\Servers; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class SendPowerRequest extends ClientApiRequest @@ -10,19 +10,20 @@ class SendPowerRequest extends ClientApiRequest /** * Determine if the user has permission to send a power command to a server. */ - public function permission(): string + public function permission(): SubuserPermission { switch ($this->input('signal')) { case 'start': - return Permission::ACTION_CONTROL_START; + return SubuserPermission::ControlStart; case 'stop': case 'kill': - return Permission::ACTION_CONTROL_STOP; + return SubuserPermission::ControlStop; case 'restart': - return Permission::ACTION_CONTROL_RESTART; + return SubuserPermission::ControlRestart; } - return '__invalid'; + // Fallback for invalid signals + return SubuserPermission::WebsocketConnect; } /** diff --git a/app/Http/Requests/Api/Client/Servers/Settings/DescriptionServerRequest.php b/app/Http/Requests/Api/Client/Servers/Settings/DescriptionServerRequest.php new file mode 100644 index 0000000000..abed89d2f1 --- /dev/null +++ b/app/Http/Requests/Api/Client/Servers/Settings/DescriptionServerRequest.php @@ -0,0 +1,30 @@ + 'string|nullable', + ]; + } +} diff --git a/app/Http/Requests/Api/Client/Servers/Settings/ReinstallServerRequest.php b/app/Http/Requests/Api/Client/Servers/Settings/ReinstallServerRequest.php index e5c2ab6bce..963da003ec 100644 --- a/app/Http/Requests/Api/Client/Servers/Settings/ReinstallServerRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Settings/ReinstallServerRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Settings; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class ReinstallServerRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SETTINGS_REINSTALL; + return SubuserPermission::SettingsReinstall; } } diff --git a/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php b/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php index c68e0d4444..6a16f9b88c 100644 --- a/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Settings/RenameServerRequest.php @@ -2,10 +2,10 @@ namespace App\Http\Requests\Api\Client\Servers\Settings; -use App\Models\Server; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Server; class RenameServerRequest extends ClientApiRequest implements ClientPermissionsRequest { @@ -14,9 +14,9 @@ class RenameServerRequest extends ClientApiRequest implements ClientPermissionsR * validate that the authenticated user has permission to perform this action against * the given resource (server). */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_SETTINGS_RENAME; + return SubuserPermission::SettingsRename; } /** @@ -26,7 +26,6 @@ public function rules(): array { return [ 'name' => Server::getRules()['name'], - 'description' => 'string|nullable', ]; } } diff --git a/app/Http/Requests/Api/Client/Servers/Settings/SetDockerImageRequest.php b/app/Http/Requests/Api/Client/Servers/Settings/SetDockerImageRequest.php index 762b91ffd8..dcdb2516f0 100644 --- a/app/Http/Requests/Api/Client/Servers/Settings/SetDockerImageRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Settings/SetDockerImageRequest.php @@ -2,23 +2,23 @@ namespace App\Http\Requests\Api\Client\Servers\Settings; -use Webmozart\Assert\Assert; -use App\Models\Server; -use Illuminate\Validation\Rule; -use App\Models\Permission; use App\Contracts\Http\ClientPermissionsRequest; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Server; +use Illuminate\Validation\Rule; +use Webmozart\Assert\Assert; class SetDockerImageRequest extends ClientApiRequest implements ClientPermissionsRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_STARTUP_DOCKER_IMAGE; + return SubuserPermission::StartupDockerImage; } public function rules(): array { - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $this->route()->parameter('server'); Assert::isInstanceOf($server, Server::class); diff --git a/app/Http/Requests/Api/Client/Servers/Startup/GetStartupRequest.php b/app/Http/Requests/Api/Client/Servers/Startup/GetStartupRequest.php index a20ef49a9f..29cf528e06 100644 --- a/app/Http/Requests/Api/Client/Servers/Startup/GetStartupRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Startup/GetStartupRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Startup; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class GetStartupRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_STARTUP_READ; + return SubuserPermission::StartupRead; } } diff --git a/app/Http/Requests/Api/Client/Servers/Startup/UpdateStartupVariableRequest.php b/app/Http/Requests/Api/Client/Servers/Startup/UpdateStartupVariableRequest.php index 5f3f38e7c2..fe5dcc0d91 100644 --- a/app/Http/Requests/Api/Client/Servers/Startup/UpdateStartupVariableRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Startup/UpdateStartupVariableRequest.php @@ -2,14 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Startup; -use App\Models\Permission; +use App\Enums\SubuserPermission; use App\Http\Requests\Api\Client\ClientApiRequest; class UpdateStartupVariableRequest extends ClientApiRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_STARTUP_UPDATE; + return SubuserPermission::StartupUpdate; } /** diff --git a/app/Http/Requests/Api/Client/Servers/Subusers/DeleteSubuserRequest.php b/app/Http/Requests/Api/Client/Servers/Subusers/DeleteSubuserRequest.php index d6906f3f15..0bbe62b292 100644 --- a/app/Http/Requests/Api/Client/Servers/Subusers/DeleteSubuserRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Subusers/DeleteSubuserRequest.php @@ -2,12 +2,12 @@ namespace App\Http\Requests\Api\Client\Servers\Subusers; -use App\Models\Permission; +use App\Enums\SubuserPermission; class DeleteSubuserRequest extends SubuserRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_USER_DELETE; + return SubuserPermission::UserDelete; } } diff --git a/app/Http/Requests/Api/Client/Servers/Subusers/GetSubuserRequest.php b/app/Http/Requests/Api/Client/Servers/Subusers/GetSubuserRequest.php index 6477e43481..99f92ed6c4 100644 --- a/app/Http/Requests/Api/Client/Servers/Subusers/GetSubuserRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Subusers/GetSubuserRequest.php @@ -2,15 +2,15 @@ namespace App\Http\Requests\Api\Client\Servers\Subusers; -use App\Models\Permission; +use App\Enums\SubuserPermission; class GetSubuserRequest extends SubuserRequest { /** * Confirm that a user is able to view subusers for the specified server. */ - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_USER_READ; + return SubuserPermission::UserRead; } } diff --git a/app/Http/Requests/Api/Client/Servers/Subusers/StoreSubuserRequest.php b/app/Http/Requests/Api/Client/Servers/Subusers/StoreSubuserRequest.php index e04a95c548..969d5fc06f 100644 --- a/app/Http/Requests/Api/Client/Servers/Subusers/StoreSubuserRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Subusers/StoreSubuserRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Subusers; -use App\Models\Permission; +use App\Enums\SubuserPermission; class StoreSubuserRequest extends SubuserRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_USER_CREATE; + return SubuserPermission::UserCreate; } public function rules(): array diff --git a/app/Http/Requests/Api/Client/Servers/Subusers/SubuserRequest.php b/app/Http/Requests/Api/Client/Servers/Subusers/SubuserRequest.php index bd68fb8908..1a5d212740 100644 --- a/app/Http/Requests/Api/Client/Servers/Subusers/SubuserRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Subusers/SubuserRequest.php @@ -2,12 +2,14 @@ namespace App\Http\Requests\Api\Client\Servers\Subusers; -use Illuminate\Http\Request; -use App\Models\User; -use App\Models\Subuser; use App\Exceptions\Http\HttpForbiddenException; use App\Http\Requests\Api\Client\ClientApiRequest; +use App\Models\Server; +use App\Models\Subuser; +use App\Models\User; use App\Services\Servers\GetUserPermissionsService; +use Illuminate\Contracts\Container\BindingResolutionException; +use Illuminate\Http\Request; abstract class SubuserRequest extends ClientApiRequest { @@ -16,7 +18,7 @@ abstract class SubuserRequest extends ClientApiRequest /** * Authorize the request and ensure that a user is not trying to modify themselves. * - * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws BindingResolutionException */ public function authorize(): bool { @@ -47,23 +49,25 @@ public function authorize(): bool * Validates that the permissions we are trying to assign can actually be assigned * by the user making the request. * - * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @param string[] $permissions + * + * @throws BindingResolutionException */ - protected function validatePermissionsCanBeAssigned(array $permissions) + protected function validatePermissionsCanBeAssigned(array $permissions): void { $user = $this->user(); - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $this->route()->parameter('server'); - // If we are a root admin or the server owner, no need to perform these checks. - if ($user->isRootAdmin() || $user->id === $server->owner_id) { + // If we are an admin or the server owner, no need to perform these checks. + if ($user->can('update', $server) || $user->id === $server->owner_id) { return; } // Otherwise, get the current subuser's permission set, and ensure that the // permissions they are trying to assign are not _more_ than the ones they // already have. - /** @var \App\Services\Servers\GetUserPermissionsService $service */ + /** @var GetUserPermissionsService $service */ $service = $this->container->make(GetUserPermissionsService::class); if (count(array_diff($permissions, $service->handle($server, $user))) > 0) { diff --git a/app/Http/Requests/Api/Client/Servers/Subusers/UpdateSubuserRequest.php b/app/Http/Requests/Api/Client/Servers/Subusers/UpdateSubuserRequest.php index 90899dfd54..d3efbc328c 100644 --- a/app/Http/Requests/Api/Client/Servers/Subusers/UpdateSubuserRequest.php +++ b/app/Http/Requests/Api/Client/Servers/Subusers/UpdateSubuserRequest.php @@ -2,13 +2,13 @@ namespace App\Http\Requests\Api\Client\Servers\Subusers; -use App\Models\Permission; +use App\Enums\SubuserPermission; class UpdateSubuserRequest extends SubuserRequest { - public function permission(): string + public function permission(): SubuserPermission { - return Permission::ACTION_USER_UPDATE; + return SubuserPermission::UserUpdate; } public function rules(): array diff --git a/app/Http/Requests/Api/Remote/ActivityEventRequest.php b/app/Http/Requests/Api/Remote/ActivityEventRequest.php index 8963a1a3dc..2eedfcc625 100644 --- a/app/Http/Requests/Api/Remote/ActivityEventRequest.php +++ b/app/Http/Requests/Api/Remote/ActivityEventRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests\Api\Remote; -use Illuminate\Support\Collection; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Collection; class ActivityEventRequest extends FormRequest { @@ -12,6 +12,9 @@ public function authorize(): bool return true; } + /** + * @return array + */ public function rules(): array { return [ @@ -28,6 +31,8 @@ public function rules(): array /** * Returns all the unique server UUIDs that were received in this request. + * + * @return string[] */ public function servers(): array { @@ -36,6 +41,8 @@ public function servers(): array /** * Returns all the unique user UUIDs that were submitted in this request. + * + * @return string[] */ public function users(): array { diff --git a/app/Http/Requests/Api/Remote/AuthenticateWebsocketDetailsRequest.php b/app/Http/Requests/Api/Remote/AuthenticateWebsocketDetailsRequest.php deleted file mode 100644 index d436f57888..0000000000 --- a/app/Http/Requests/Api/Remote/AuthenticateWebsocketDetailsRequest.php +++ /dev/null @@ -1,20 +0,0 @@ - 'required|string', - ]; - } -} diff --git a/app/Http/Requests/Api/Remote/InstallationDataRequest.php b/app/Http/Requests/Api/Remote/InstallationDataRequest.php index 5f3bff1a16..59d52c9780 100644 --- a/app/Http/Requests/Api/Remote/InstallationDataRequest.php +++ b/app/Http/Requests/Api/Remote/InstallationDataRequest.php @@ -2,15 +2,11 @@ namespace App\Http\Requests\Api\Remote; -use Illuminate\Foundation\Http\FormRequest; - -class InstallationDataRequest extends FormRequest +class InstallationDataRequest extends ServerRequest { - public function authorize(): bool - { - return true; - } - + /** + * @return array + */ public function rules(): array { return [ diff --git a/app/Http/Requests/Api/Remote/ReportBackupCompleteRequest.php b/app/Http/Requests/Api/Remote/ReportBackupCompleteRequest.php index b1a96a2d66..246c07ff4e 100644 --- a/app/Http/Requests/Api/Remote/ReportBackupCompleteRequest.php +++ b/app/Http/Requests/Api/Remote/ReportBackupCompleteRequest.php @@ -6,6 +6,7 @@ class ReportBackupCompleteRequest extends FormRequest { + /** @return array */ public function rules(): array { return [ diff --git a/app/Http/Requests/Api/Remote/ServerRequest.php b/app/Http/Requests/Api/Remote/ServerRequest.php new file mode 100644 index 0000000000..12da385f1e --- /dev/null +++ b/app/Http/Requests/Api/Remote/ServerRequest.php @@ -0,0 +1,29 @@ +attributes->get('node'); + + /** @var ?Server $server */ + $server = $this->route()->parameter('server'); + + if ($server) { + if ($server->transfer) { + return $server->transfer->old_node === $node->id || $server->transfer->new_node === $node->id; + } + + return $server->node_id === $node->id; + } + + return false; + } +} diff --git a/app/Http/Requests/Api/Remote/SftpAuthenticationFormRequest.php b/app/Http/Requests/Api/Remote/SftpAuthenticationFormRequest.php index aacd145f17..d2fb47e489 100644 --- a/app/Http/Requests/Api/Remote/SftpAuthenticationFormRequest.php +++ b/app/Http/Requests/Api/Remote/SftpAuthenticationFormRequest.php @@ -16,6 +16,8 @@ public function authorize(): bool /** * Rules to apply to the request. + * + * @return array */ public function rules(): array { @@ -29,6 +31,8 @@ public function rules(): array /** * Return only the fields that we are interested in from the request. * This will include empty fields as a null value. + * + * @return array */ public function normalize(): array { diff --git a/app/Http/Requests/Auth/LoginCheckpointRequest.php b/app/Http/Requests/Auth/LoginCheckpointRequest.php deleted file mode 100644 index ddd97ee241..0000000000 --- a/app/Http/Requests/Auth/LoginCheckpointRequest.php +++ /dev/null @@ -1,41 +0,0 @@ - 'required|string', - 'authentication_code' => [ - 'nullable', - 'numeric', - Rule::requiredIf(function () { - return empty($this->input('recovery_token')); - }), - ], - 'recovery_token' => [ - 'nullable', - 'string', - Rule::requiredIf(function () { - return empty($this->input('authentication_code')); - }), - ], - ]; - } -} diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php deleted file mode 100644 index 4206a2c52b..0000000000 --- a/app/Http/Requests/Auth/LoginRequest.php +++ /dev/null @@ -1,21 +0,0 @@ - 'required|string|min:1', - 'password' => 'required|string', - ]; - } -} diff --git a/app/Http/Requests/Auth/ResetPasswordRequest.php b/app/Http/Requests/Auth/ResetPasswordRequest.php deleted file mode 100644 index cf262afb9e..0000000000 --- a/app/Http/Requests/Auth/ResetPasswordRequest.php +++ /dev/null @@ -1,22 +0,0 @@ - 'required|string', - 'email' => 'required|email', - 'password' => 'required|string|confirmed|min:8', - ]; - } -} diff --git a/app/Http/Requests/FrontendUserFormRequest.php b/app/Http/Requests/FrontendUserFormRequest.php deleted file mode 100644 index 55313eb5ec..0000000000 --- a/app/Http/Requests/FrontendUserFormRequest.php +++ /dev/null @@ -1,29 +0,0 @@ -user()); - } - - /** - * Return only the fields that we are interested in from the request. - * This will include empty fields as a null value. - */ - public function normalize(): array - { - return $this->only( - array_keys($this->rules()) - ); - } -} diff --git a/app/Http/Resources/Daemon/ServerConfigurationCollection.php b/app/Http/Resources/Daemon/ServerConfigurationCollection.php index 81ae5daf45..10bd79961d 100644 --- a/app/Http/Resources/Daemon/ServerConfigurationCollection.php +++ b/app/Http/Resources/Daemon/ServerConfigurationCollection.php @@ -3,10 +3,10 @@ namespace App\Http\Resources\Daemon; use App\Models\Server; -use Illuminate\Container\Container; -use Illuminate\Http\Resources\Json\ResourceCollection; use App\Services\Eggs\EggConfigurationService; use App\Services\Servers\ServerConfigurationStructureService; +use Illuminate\Container\Container; +use Illuminate\Http\Resources\Json\ResourceCollection; class ServerConfigurationCollection extends ResourceCollection { @@ -15,10 +15,15 @@ class ServerConfigurationCollection extends ResourceCollection * that can be understood by daemon. Make sure you've properly loaded the required * relationships on the Server models before calling this function, otherwise you'll * have some serious performance issues from all the N+1 queries. + * + * @return array */ public function toArray($request): array { + /** @var EggConfigurationService $egg */ $egg = Container::getInstance()->make(EggConfigurationService::class); + + /** @var ServerConfigurationStructureService $configuration */ $configuration = Container::getInstance()->make(ServerConfigurationStructureService::class); return $this->collection->map(function (Server $server) use ($configuration, $egg) { diff --git a/app/Http/Responses/LoginResponse.php b/app/Http/Responses/LoginResponse.php new file mode 100644 index 0000000000..de069dd3c6 --- /dev/null +++ b/app/Http/Responses/LoginResponse.php @@ -0,0 +1,25 @@ +user(); + + if ($user?->getCustomization(CustomizationKey::RedirectToAdmin) && $user->canAccessPanel(Filament::getPanel('admin'))) { + return redirect()->intended(Filament::getPanel('admin')->getUrl()); + } + + return redirect()->intended(Filament::getUrl()); + } +} diff --git a/app/Http/ViewComposers/AssetComposer.php b/app/Http/ViewComposers/AssetComposer.php deleted file mode 100644 index 6908f41395..0000000000 --- a/app/Http/ViewComposers/AssetComposer.php +++ /dev/null @@ -1,34 +0,0 @@ -with('asset', $this->assetHashService); - $view->with('siteConfiguration', [ - 'name' => config('app.name', 'Panel'), - 'locale' => config('app.locale') ?? 'en', - 'recaptcha' => [ - 'enabled' => config('recaptcha.enabled', false), - 'siteKey' => config('recaptcha.website_key') ?? '', - ], - 'usesSyncDriver' => config('queue.default') === 'sync', - 'serverDescriptionsEditable' => config('panel.editable_server_descriptions'), - ]); - } -} diff --git a/app/Jobs/InstallEgg.php b/app/Jobs/InstallEgg.php new file mode 100644 index 0000000000..1ae8694032 --- /dev/null +++ b/app/Jobs/InstallEgg.php @@ -0,0 +1,33 @@ +fromUrl($this->downloadUrl); + } catch (Throwable $e) { + Log::error('Failed to install egg from URL: ' . $this->downloadUrl, ['exception' => $e]); + } + } +} diff --git a/app/Jobs/NodeStatistics.php b/app/Jobs/NodeStatistics.php deleted file mode 100644 index 19fae9b9db..0000000000 --- a/app/Jobs/NodeStatistics.php +++ /dev/null @@ -1,46 +0,0 @@ -statistics(); - $timestamp = now()->getTimestamp(); - - foreach ($stats as $key => $value) { - $cacheKey = "nodes.{$node->id}.$key"; - $data = cache()->get($cacheKey, []); - - // Add current timestamp and value to the data array - $data[$timestamp] = $value; - - // Update the cache with the new data, expires in 1 minute - cache()->put($cacheKey, $data, now()->addMinute()); - } - } - } - -} diff --git a/app/Jobs/ProcessWebhook.php b/app/Jobs/ProcessWebhook.php new file mode 100644 index 0000000000..59f8a4ef99 --- /dev/null +++ b/app/Jobs/ProcessWebhook.php @@ -0,0 +1,85 @@ + $data + */ + public function __construct( + private WebhookConfiguration $webhookConfiguration, + private string $eventName, + private array $data + ) {} + + public function handle(): void + { + $data = $this->data[0] ?? []; + if (count($data) === 1) { + $data = reset($data); + } + + if (is_object($data)) { + $data = get_object_vars($data); + } + + if (is_string($data)) { + $data = Arr::wrap(json_decode($data, true) ?? []); + } + $data['event'] = $this->webhookConfiguration->transformClassName($this->eventName); + + if ($this->webhookConfiguration->type === WebhookType::Discord) { + $payload = json_encode($this->webhookConfiguration->payload); + $tmp = $this->webhookConfiguration->replaceVars($data, $payload); + $data = json_decode($tmp, true); + + $embeds = data_get($data, 'embeds'); + if ($embeds) { + foreach ($embeds as &$embed) { + if (data_get($embed, 'has_timestamp')) { + $embed['timestamp'] = Carbon::now(); + unset($embed['has_timestamp']); + } + } + $data['embeds'] = $embeds; + } + } + + try { + $headers = []; + + if ($this->webhookConfiguration->type === WebhookType::Regular) { + foreach ($this->webhookConfiguration->headers as $key => $value) { + $headers[$key] = $this->webhookConfiguration->replaceVars($data, $value); + } + } + Http::withHeaders($headers)->post($this->webhookConfiguration->endpoint, $data)->throw(); + $successful = now(); + } catch (Exception $exception) { + report($exception->getMessage()); + $successful = null; + } + + $this->webhookConfiguration->webhooks()->create([ + 'payload' => $data, + 'successful_at' => $successful, + 'event' => $this->eventName, + 'endpoint' => $this->webhookConfiguration->endpoint, + ]); + } +} diff --git a/app/Jobs/Schedule/RunTaskJob.php b/app/Jobs/Schedule/RunTaskJob.php index 6a660e5c05..476222a5f9 100644 --- a/app/Jobs/Schedule/RunTaskJob.php +++ b/app/Jobs/Schedule/RunTaskJob.php @@ -2,42 +2,35 @@ namespace App\Jobs\Schedule; +use App\Extensions\Tasks\TaskService; use App\Jobs\Job; -use Carbon\CarbonImmutable; use App\Models\Task; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; +use Carbon\CarbonImmutable; +use Exception; use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\DispatchesJobs; -use App\Services\Backups\InitiateBackupService; -use App\Repositories\Daemon\DaemonPowerRepository; -use App\Exceptions\Http\Connection\DaemonConnectionException; -use App\Services\Files\DeleteFilesService; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; +use InvalidArgumentException; +use Throwable; class RunTaskJob extends Job implements ShouldQueue { - use DispatchesJobs; use InteractsWithQueue; use SerializesModels; /** * RunTaskJob constructor. */ - public function __construct(public Task $task, public bool $manualRun = false) - { - - } + public function __construct(public Task $task, public bool $manualRun = false) {} /** * Run the job and send actions to the daemon running the server. * - * @throws \Throwable + * @throws Throwable */ - public function handle( - InitiateBackupService $backupService, - DaemonPowerRepository $powerRepository, - DeleteFilesService $deleteFilesService - ): void { + public function handle(TaskService $taskService): void + { // Do not process a task that is not set to active, unless it's been manually triggered. if (!$this->task->schedule->is_active && !$this->manualRun) { $this->markTaskNotQueued(); @@ -59,26 +52,17 @@ public function handle( // Perform the provided task against the daemon. try { - switch ($this->task->action) { - case Task::ACTION_POWER: - $powerRepository->setServer($server)->send($this->task->payload); - break; - case Task::ACTION_COMMAND: - $server->send($this->task->payload); - break; - case Task::ACTION_BACKUP: - $backupService->setIgnoredFiles(explode(PHP_EOL, $this->task->payload))->handle($server, null, true); - break; - case Task::ACTION_DELETE_FILES: - $deleteFilesService->handle($server, explode(PHP_EOL, $this->task->payload)); - break; - default: - throw new \InvalidArgumentException('Invalid task action provided: ' . $this->task->action); + $taskSchema = $taskService->get($this->task->action); + + if (!$taskSchema) { + throw new InvalidArgumentException('Invalid task action provided: ' . $this->task->action); } - } catch (\Exception $exception) { - // If this isn't a DaemonConnectionException on a task that allows for failures + + $taskSchema->runTask($this->task); + } catch (Exception $exception) { + // If this isn't a ConnectionException on a task that allows for failures // throw the exception back up the chain so that the task is stopped. - if (!($this->task->continue_on_failure && $exception instanceof DaemonConnectionException)) { + if (!($this->task->continue_on_failure && $exception instanceof ConnectionException)) { throw $exception; } } @@ -90,7 +74,7 @@ public function handle( /** * Handle a failure while sending the action to the daemon or otherwise processing the job. */ - public function failed(\Exception $exception = null) + public function failed(): void { $this->markTaskNotQueued(); $this->markScheduleComplete(); @@ -99,9 +83,9 @@ public function failed(\Exception $exception = null) /** * Get the next task in the schedule and queue it for running after the defined period of wait time. */ - private function queueNextTask() + private function queueNextTask(): void { - /** @var \App\Models\Task|null $nextTask */ + /** @var Task|null $nextTask */ $nextTask = Task::query()->where('schedule_id', $this->task->schedule_id) ->orderBy('sequence_id', 'asc') ->where('sequence_id', '>', $this->task->sequence_id) @@ -115,13 +99,13 @@ private function queueNextTask() $nextTask->update(['is_queued' => true]); - $this->dispatch((new self($nextTask, $this->manualRun))->delay($nextTask->time_offset)); + dispatch((new self($nextTask, $this->manualRun))->delay($nextTask->time_offset)); } /** * Marks the parent schedule as being complete. */ - private function markScheduleComplete() + private function markScheduleComplete(): void { $this->task->schedule()->update([ 'is_processing' => false, @@ -132,7 +116,7 @@ private function markScheduleComplete() /** * Mark a specific task as no longer being queued. */ - private function markTaskNotQueued() + private function markTaskNotQueued(): void { $this->task->update(['is_queued' => false]); } diff --git a/app/Listeners/Auth/AuthenticationListener.php b/app/Listeners/Auth/AuthenticationListener.php index b06428bd2b..5176da59f8 100644 --- a/app/Listeners/Auth/AuthenticationListener.php +++ b/app/Listeners/Auth/AuthenticationListener.php @@ -4,24 +4,31 @@ use App\Facades\Activity; use Illuminate\Auth\Events\Failed; -use App\Events\Auth\DirectLogin; +use Illuminate\Auth\Events\Login; class AuthenticationListener { + private const PROTECTED_FIELDS = [ + 'password', 'token', 'secret', + ]; + /** * Handles an authentication event by logging the user and information about * the request. */ - public function handle(Failed|DirectLogin $event): void + public function handle(Failed|Login $event): void { $activity = Activity::withRequestMetadata(); + if ($event->user) { $activity = $activity->subject($event->user); } if ($event instanceof Failed) { foreach ($event->credentials as $key => $value) { - $activity = $activity->property($key, $value); + if (!in_array($key, self::PROTECTED_FIELDS, true)) { + $activity = $activity->property($key, $value); + } } } diff --git a/app/Listeners/Auth/PasswordResetListener.php b/app/Listeners/Auth/PasswordResetListener.php index 5daa849735..e64a96bee1 100644 --- a/app/Listeners/Auth/PasswordResetListener.php +++ b/app/Listeners/Auth/PasswordResetListener.php @@ -2,22 +2,14 @@ namespace App\Listeners\Auth; -use Illuminate\Http\Request; use App\Facades\Activity; use Illuminate\Auth\Events\PasswordReset; class PasswordResetListener { - protected Request $request; - - public function __construct(Request $request) - { - $this->request = $request; - } - public function handle(PasswordReset $event): void { - Activity::event('event:password-reset') + Activity::event('auth:password-reset') ->withRequestMetadata() ->subject($event->user) ->log(); diff --git a/app/Listeners/Auth/TwoFactorListener.php b/app/Listeners/Auth/TwoFactorListener.php index 9491ca7677..a322e8804b 100644 --- a/app/Listeners/Auth/TwoFactorListener.php +++ b/app/Listeners/Auth/TwoFactorListener.php @@ -2,11 +2,12 @@ namespace App\Listeners\Auth; -use App\Facades\Activity; use App\Events\Auth\ProvidedAuthenticationToken; +use App\Facades\Activity; class TwoFactorListener { + // TODO: add event to filament public function handle(ProvidedAuthenticationToken $event): void { Activity::event($event->recovery ? 'auth:recovery-token' : 'auth:token') diff --git a/app/Listeners/DispatchWebhooks.php b/app/Listeners/DispatchWebhooks.php new file mode 100644 index 0000000000..3332d0a5b0 --- /dev/null +++ b/app/Listeners/DispatchWebhooks.php @@ -0,0 +1,42 @@ + $data + */ + public function handle(string $eventName, array $data): void + { + if (!$this->eventIsWatched($eventName)) { + return; + } + + $matchingHooks = cache()->rememberForever("webhooks.$eventName", function () use ($eventName) { + return WebhookConfiguration::query()->whereJsonContains('events', $eventName)->get(); + }); + + /** @var WebhookConfiguration $webhookConfig */ + foreach ($matchingHooks as $webhookConfig) { + if (in_array($eventName, $webhookConfig->events)) { + $webhookConfig->run($eventName, $data); + } + } + } + + protected function eventIsWatched(string $eventName): bool + { + $watchedEvents = cache()->rememberForever('watchedWebhooks', function () { + return WebhookConfiguration::pluck('events') + ->flatten() + ->unique() + ->values() + ->all(); + }); + + return in_array($eventName, $watchedEvents); + } +} diff --git a/app/Listeners/Server/ServerInstalledListener.php b/app/Listeners/Server/ServerInstalledListener.php new file mode 100644 index 0000000000..9f9ca262df --- /dev/null +++ b/app/Listeners/Server/ServerInstalledListener.php @@ -0,0 +1,37 @@ +server->loadMissing('user'); + + $locale = $event->server->user->language ?? 'en'; + + Notification::make() + ->status($event->successful ? 'success' : 'danger') + ->title(trans('notifications.' . ($event->initialInstall ? 'installation' : 'reinstallation') . '_' . ($event->successful ? 'completed' : 'failed'), locale: $locale)) + ->body(trans('server/setting.server_info.server_name', ['name' => $event->server->name], $locale)) + ->actions([ + Action::make('exclude_view') + ->button() + ->label(trans('notifications.open_server', locale: $locale)) + ->markAsRead() + ->url(fn () => Console::getUrl(panel: 'server', tenant: $event->server)), + ]) + ->sendToDatabase($event->server->user); + + if (($event->initialInstall && config()->get('panel.email.send_install_notification', true)) || + (!$event->initialInstall && config()->get('panel.email.send_reinstall_notification', true))) { + $event->server->user->notify(new ServerInstalled($event->server)); + } + } +} diff --git a/app/Listeners/Server/SubUserAddedListener.php b/app/Listeners/Server/SubUserAddedListener.php new file mode 100644 index 0000000000..22121e9cbc --- /dev/null +++ b/app/Listeners/Server/SubUserAddedListener.php @@ -0,0 +1,34 @@ +subuser->loadMissing('server'); + $event->subuser->loadMissing('user'); + + $locale = $event->subuser->user->language ?? 'en'; + + Notification::make() + ->title(trans('notifications.user_added.title', locale: $locale)) + ->body(trans('notifications.user_added.body', ['server' => $event->subuser->server->name], $locale)) + ->actions([ + Action::make('exclude_view') + ->button() + ->label(trans('notifications.open_server', locale: $locale)) + ->markAsRead() + ->url(fn () => Console::getUrl(panel: 'server', tenant: $event->subuser->server)), + ]) + ->sendToDatabase($event->subuser->user); + + $event->subuser->user->notify(new AddedToServer($event->subuser->server)); + } +} diff --git a/app/Listeners/Server/SubUserRemovedListener.php b/app/Listeners/Server/SubUserRemovedListener.php new file mode 100644 index 0000000000..1ad964afcb --- /dev/null +++ b/app/Listeners/Server/SubUserRemovedListener.php @@ -0,0 +1,22 @@ +user->language ?? 'en'; + + Notification::make() + ->title(trans('notifications.user_removed.title', locale: $locale)) + ->body(trans('notifications.user_removed.body', ['server' => $event->server->name], $locale)) + ->sendToDatabase($event->user); + + $event->user->notify(new RemovedFromServer($event->server)); + } +} diff --git a/app/Livewire/AlertBanner.php b/app/Livewire/AlertBanner.php new file mode 100644 index 0000000000..f9a19e53b0 --- /dev/null +++ b/app/Livewire/AlertBanner.php @@ -0,0 +1,107 @@ +id($id); + } + + public static function make(string $id): AlertBanner + { + $static = new self($id); + $static->configure(); + + return $static; + } + + /** + * @return array{id: string, title: ?string, body: ?string, status: ?string, icon: ?string, closeable: bool} + */ + public function toArray(): array + { + return [ + 'id' => $this->getId(), + 'title' => $this->getTitle(), + 'body' => $this->getBody(), + 'status' => $this->getStatus(), + 'icon' => $this->getIcon(), + 'closeable' => $this->isCloseable(), + ]; + } + + /** + * @param array{id: string, title: ?string, body: ?string, status: ?string, icon: ?string, closeable: bool} $data + */ + public static function fromArray(array $data): AlertBanner + { + $static = AlertBanner::make($data['id']); + + $static->title($data['title']); + $static->body($data['body']); + $static->status($data['status']); + $static->icon($data['icon']); + $static->closable($data['closeable']); + + return $static; + } + + public function closable(bool|Closure $closable = true): AlertBanner + { + $this->closable = $closable; + + return $this; + } + + public function isCloseable(): bool + { + return $this->evaluate($this->closable); + } + + public function send(): AlertBanner + { + $data = $this->toArray(); + + if (Livewire::isLivewireRequest()) { + $data['from_livewire'] = true; + } + + session()->push('alert-banners', $data); + + return $this; + } + + public function getColorClasses(): string + { + return match ($this->getStatus()) { + 'success' => 'text-success-600 dark:text-success-500', + 'warning' => 'text-warning-600 dark:text-warning-500', + 'danger' => 'text-danger-600 dark:text-danger-500', + default => 'text-info-600 dark:text-info-500', + }; + } +} diff --git a/app/Livewire/AlertBannerCollection.php b/app/Livewire/AlertBannerCollection.php new file mode 100644 index 0000000000..ab9550fb61 --- /dev/null +++ b/app/Livewire/AlertBannerCollection.php @@ -0,0 +1,15 @@ +transform( + fn (array $alertBanner): AlertBanner => AlertBanner::fromArray($alertBanner), + ); + } +} diff --git a/app/Livewire/AlertBannerContainer.php b/app/Livewire/AlertBannerContainer.php new file mode 100644 index 0000000000..1202975b33 --- /dev/null +++ b/app/Livewire/AlertBannerContainer.php @@ -0,0 +1,50 @@ +alertBanners = new AlertBannerCollection(); + + foreach (session()->pull('alert-banners', []) as $alertBanner) { + // Alerts created during Livewire requests should have been consumed by the event handler on the same page. + if (!empty($alertBanner['from_livewire'])) { + // If they weren't, then discard them instead of showing on the wrong page. + continue; + } + + $alertBanner = AlertBanner::fromArray($alertBanner); + $this->alertBanners->put($alertBanner->getId(), $alertBanner); + } + } + + #[On('alertBannerSent')] + public function pullFromSession(): void + { + foreach (session()->pull('alert-banners', []) as $alertBanner) { + unset($alertBanner['from_livewire']); + $alertBanner = AlertBanner::fromArray($alertBanner); + $this->alertBanners->put($alertBanner->getId(), $alertBanner); + } + } + + public function remove(string $id): void + { + if ($this->alertBanners->has($id)) { + $this->alertBanners->forget($id); + } + } + + public function render(): View + { + return view('livewire.alerts.alert-banner-container'); + } +} diff --git a/app/Livewire/Installer/PanelInstaller.php b/app/Livewire/Installer/PanelInstaller.php new file mode 100644 index 0000000000..d79f1cd352 --- /dev/null +++ b/app/Livewire/Installer/PanelInstaller.php @@ -0,0 +1,267 @@ + */ + public array $data = []; + + protected string $view = 'filament.pages.installer'; + + public function getTitle(): string + { + return trans('installer.title'); + } + + public function getMaxContentWidth(): Width|string + { + return Width::ScreenTwoExtraLarge; + } + + public static function isInstalled(): bool + { + return config('app.installed'); + } + + public function mount(): void + { + abort_if(self::isInstalled(), 404); + + $this->form->fill(); + } + + /** @return Component[] */ + protected function getFormSchema(): array + { + return [ + Grid::make() + ->schema([ + $this->getLanguageComponent(), + ]), + Wizard::make($this->getSteps()) + ->persistStepInQueryString() + ->nextAction(fn (Action $action) => $action->keyBindings('enter')) + ->submitAction(new HtmlString(Blade::render(<<<'BLADE' + + {{ trans('installer.finish') }} + + + BLADE))), + ]; + } + + /** + * @return Step[] + * + * @throws Exception + */ + protected function getDefaultSteps(): array + { + return [ + RequirementsStep::make(), + EnvironmentStep::make($this), + DatabaseStep::make($this), + EggSelectionStep::make(), + CacheStep::make($this), + QueueStep::make($this), + SessionStep::make(), + ]; + } + + protected function getLanguageComponent(): Component + { + return Select::make('language') + ->hiddenLabel() + ->prefix(trans('profile.language')) + ->prefixIcon(TablerIcon::Flag) + ->required() + ->live() + ->default('en') + ->selectablePlaceholder(false) + ->options(fn (LanguageService $languageService) => $languageService->getAvailableLanguages()) + ->afterStateUpdated(fn ($state, Application $app) => $app->setLocale($state ?? config('app.locale'))) + ->columnStart(4); + } + + protected function getFormStatePath(): ?string + { + return 'data'; + } + + public function submit(UserCreationService $userCreationService): void + { + try { + // Disable installer + $this->writeToEnvironment(['APP_INSTALLED' => 'true']); + + // Run migrations + $this->runMigrations(); + + // Create admin user & login + $user = $this->createAdminUser($userCreationService); + auth()->guard()->login($user, true); + + // Write session data at the very end to avoid "page expired" errors + $this->writeToEnv('env_session'); + + // Install selected eggs + $this->installEggs(); + + // Redirect to admin panel + $this->redirect(Filament::getPanel('admin')->getUrl()); + } catch (Halt) { + } + } + + public function writeToEnv(string $key): void + { + try { + $variables = array_get($this->data, $key); + $variables = array_filter($variables); // Filter array to remove NULL values + $this->writeToEnvironment($variables); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->title(trans('installer.exceptions.write_env')) + ->body($exception->getMessage()) + ->danger() + ->persistent() + ->send(); + + throw new Halt(trans('installer.exceptions.write_env')); + } + } + + public function runMigrations(): void + { + try { + Artisan::call('migrate', [ + '--force' => true, + '--seed' => true, + ]); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->title(trans('installer.database.exceptions.migration')) + ->body($exception->getMessage()) + ->danger() + ->persistent() + ->send(); + + throw new Halt(trans('installer.exceptions.migration')); + } + + if (!$this->hasCompletedMigrations()) { + Notification::make() + ->title(trans('installer.database.exceptions.migration')) + ->danger() + ->persistent() + ->send(); + + throw new Halt(trans('installer.database.exceptions.migration')); + } + } + + public function createAdminUser(UserCreationService $userCreationService): User + { + try { + $userData = array_get($this->data, 'user'); + $userData['root_admin'] = true; + + return $userCreationService->handle($userData); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->title(trans('installer.exceptions.create_user')) + ->body($exception->getMessage()) + ->danger() + ->persistent() + ->send(); + + throw new Halt(trans('installer.exceptions.create_user')); + } + } + + public function installEggs(): void + { + try { + $selectedEggs = array_get($this->data, 'eggs', []); + if (!$selectedEggs) { + return; + } + + foreach ($selectedEggs as $category => $eggs) { + foreach ($eggs as $downloadUrl) { + InstallEgg::dispatch($downloadUrl); + } + } + + Notification::make() + ->title(trans('installer.egg.background_install_started')) + ->body(trans('installer.egg.background_install_description', ['count' => array_sum(array_map('count', $selectedEggs))])) + ->success() + ->persistent() + ->send(); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->title(trans('installer.egg.exceptions.installation_failed')) + ->body($exception->getMessage()) + ->danger() + ->persistent() + ->send(); + } + } +} diff --git a/app/Livewire/Installer/Steps/CacheStep.php b/app/Livewire/Installer/Steps/CacheStep.php new file mode 100644 index 0000000000..0e0c5239f2 --- /dev/null +++ b/app/Livewire/Installer/Steps/CacheStep.php @@ -0,0 +1,119 @@ + 'Filesystem', + 'redis' => 'Redis', + ]; + + public static function make(PanelInstaller $installer): Step + { + return Step::make('cache') + ->label(trans('installer.cache.title')) + ->columns() + ->schema([ + ToggleButtons::make('env_cache.CACHE_STORE') + ->label(trans('installer.cache.driver')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.cache.driver_help')) + ->required() + ->inline() + ->options(self::CACHE_DRIVERS) + ->default(config('cache.default')) + ->columnSpanFull() + ->live() + ->afterStateUpdated(function ($state, Set $set, Get $get) { + if ($state !== 'redis') { + $set('env_cache.REDIS_HOST', null); + $set('env_cache.REDIS_PORT', null); + $set('env_cache.REDIS_USERNAME', null); + $set('env_cache.REDIS_PASSWORD', null); + } else { + $set('env_cache.REDIS_HOST', $get('env_cache.REDIS_HOST') ?? '127.0.0.1'); + $set('env_cache.REDIS_PORT', $get('env_cache.REDIS_PORT') ?? '6379'); + $set('env_cache.REDIS_USERNAME', null); + } + }), + TextInput::make('env_cache.REDIS_HOST') + ->label(trans('installer.cache.fields.host')) + ->placeholder('127.0.0.1') + ->hintIcon(TablerIcon::QuestionMark, trans('installer.cache.fields.host_help')) + ->required(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis') + ->default(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis' ? config('database.redis.default.host') : null) + ->visible(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis'), + TextInput::make('env_cache.REDIS_PORT') + ->label(trans('installer.cache.fields.port')) + ->placeholder('6379') + ->hintIcon(TablerIcon::QuestionMark, trans('installer.cache.fields.port_help')) + ->required(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis') + ->default(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis' ? config('database.redis.default.port') : null) + ->visible(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis'), + TextInput::make('env_cache.REDIS_USERNAME') + ->label(trans('installer.cache.fields.username')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.cache.fields.username_help')) + ->default(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis' ? config('database.redis.default.username') : null) + ->visible(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis'), + TextInput::make('env_cache.REDIS_PASSWORD') + ->label(trans('installer.cache.fields.password')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.cache.fields.password_help')) + ->password() + ->revealable() + ->default(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis' ? config('database.redis.default.password') : null) + ->visible(fn (Get $get) => $get('env_cache.CACHE_STORE') === 'redis'), + ]) + ->afterValidation(function (Get $get, Application $app) use ($installer) { + $driver = $get('env_cache.CACHE_STORE'); + + if (!self::testConnection($app, $driver, $get('env_cache.REDIS_HOST'), $get('env_cache.REDIS_PORT'), $get('env_cache.REDIS_USERNAME'), $get('env_cache.REDIS_PASSWORD'))) { + throw new Halt('Redis connection failed'); + } + + $installer->writeToEnv('env_cache'); + }); + } + + private static function testConnection(Application $app, string $driver, ?string $host, null|string|int $port, ?string $username, ?string $password): bool + { + if ($driver !== 'redis') { + return true; + } + + try { + $redis = new RedisManager($app, 'predis', [ + 'default' => [ + 'host' => $host, + 'port' => $port, + 'username' => $username, + 'password' => $password, + ], + ]); + + $redis->connection()->command('ping'); + } catch (Exception $exception) { + Notification::make() + ->title(trans('installer.cache.exception')) + ->body($exception->getMessage()) + ->danger() + ->send(); + + return false; + } + + return true; + } +} diff --git a/app/Livewire/Installer/Steps/DatabaseStep.php b/app/Livewire/Installer/Steps/DatabaseStep.php new file mode 100644 index 0000000000..ef5606ab92 --- /dev/null +++ b/app/Livewire/Installer/Steps/DatabaseStep.php @@ -0,0 +1,141 @@ + 'SQLite', + 'mariadb' => 'MariaDB', + 'mysql' => 'MySQL', + 'pgsql' => 'PostgreSQL', + ]; + + public static function make(PanelInstaller $installer): Step + { + return Step::make('database') + ->label(trans('installer.database.title')) + ->columns() + ->schema([ + ToggleButtons::make('env_database.DB_CONNECTION') + ->label(trans('installer.database.driver')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.database.driver_help')) + ->required() + ->inline() + ->options(self::DATABASE_DRIVERS) + ->default(config('database.default')) + ->live() + ->afterStateUpdated(function ($state, Set $set, Get $get) { + $set('env_database.DB_DATABASE', $state === 'sqlite' ? 'database.sqlite' : 'panel'); + + switch ($state) { + case 'sqlite': + $set('env_database.DB_HOST', null); + $set('env_database.DB_PORT', null); + $set('env_database.DB_USERNAME', null); + $set('env_database.DB_PASSWORD', null); + break; + case 'mariadb': + case 'mysql': + $set('env_database.DB_HOST', $get('env_database.DB_HOST') ?? '127.0.0.1'); + $set('env_database.DB_USERNAME', $get('env_database.DB_USERNAME') ?? 'pelican'); + $set('env_database.DB_PORT', '3306'); + break; + case 'pgsql': + $set('env_database.DB_HOST', $get('env_database.DB_HOST') ?? '127.0.0.1'); + $set('env_database.DB_USERNAME', $get('env_database.DB_USERNAME') ?? 'pelican'); + $set('env_database.DB_PORT', '5432'); + break; + } + }), + TextInput::make('env_database.DB_DATABASE') + ->label(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite' ? trans('installer.database.fields.path') : trans('installer.database.fields.name')) + ->placeholder(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite' ? 'database.sqlite' : 'panel') + ->hintIcon(TablerIcon::QuestionMark, fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite' ? trans('installer.database.fields.path_help') : trans('installer.database.fields.name_help')) + ->required() + ->default('database.sqlite'), + TextInput::make('env_database.DB_HOST') + ->label(trans('installer.database.fields.host')) + ->placeholder('127.0.0.1') + ->hintIcon(TablerIcon::QuestionMark, trans('installer.database.fields.host_help')) + ->required(fn (Get $get) => $get('env_database.DB_CONNECTION') !== 'sqlite') + ->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'), + TextInput::make('env_database.DB_PORT') + ->label(trans('installer.database.fields.port')) + ->placeholder('3306') + ->hintIcon(TablerIcon::QuestionMark, trans('installer.database.fields.port_help')) + ->numeric() + ->minValue(1) + ->maxValue(65535) + ->required(fn (Get $get) => $get('env_database.DB_CONNECTION') !== 'sqlite') + ->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'), + TextInput::make('env_database.DB_USERNAME') + ->label(trans('installer.database.fields.username')) + ->placeholder('pelican') + ->hintIcon(TablerIcon::QuestionMark, trans('installer.database.fields.username_help')) + ->required(fn (Get $get) => $get('env_database.DB_CONNECTION') !== 'sqlite') + ->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'), + TextInput::make('env_database.DB_PASSWORD') + ->label(trans('installer.database.fields.password')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.database.fields.password_help')) + ->password() + ->revealable() + ->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'), + ]) + ->afterValidation(function (Get $get) use ($installer) { + $driver = $get('env_database.DB_CONNECTION'); + + if (!self::testConnection($driver, $get('env_database.DB_HOST'), $get('env_database.DB_PORT'), $get('env_database.DB_DATABASE'), $get('env_database.DB_USERNAME'), $get('env_database.DB_PASSWORD'))) { + throw new Halt(trans('installer.database.exceptions.connection')); + } + + $installer->writeToEnv('env_database'); + }); + } + + private static function testConnection(string $driver, ?string $host, null|string|int $port, ?string $database, ?string $username, ?string $password): bool + { + if ($driver === 'sqlite') { + return true; + } + + try { + config()->set('database.connections._panel_install_test', [ + 'driver' => $driver, + 'host' => $host, + 'port' => $port, + 'database' => $database, + 'username' => $username, + 'password' => $password, + 'collation' => 'utf8mb4_unicode_ci', + 'strict' => true, + ]); + + DB::connection('_panel_install_test')->getPdo(); + } catch (Exception $exception) { + DB::disconnect('_panel_install_test'); + + Notification::make() + ->title(trans('installer.database.exceptions.connection')) + ->body($exception->getMessage()) + ->danger() + ->send(); + + return false; + } + + return true; + } +} diff --git a/app/Livewire/Installer/Steps/EggSelectionStep.php b/app/Livewire/Installer/Steps/EggSelectionStep.php new file mode 100644 index 0000000000..9381d8bd15 --- /dev/null +++ b/app/Livewire/Installer/Steps/EggSelectionStep.php @@ -0,0 +1,71 @@ +title(trans('installer.egg.exceptions.failed_to_update')) + ->icon(TablerIcon::Egg) + ->body($exception->getMessage()) + ->danger() + ->persistent() + ->send(); + } + + $eggs = cache()->get('eggs.index', []); + + $categories = array_keys($eggs); + + $tabs = array_map(function (string $label) use ($eggs) { + $id = str_slug($label, '_'); + $eggCount = count($eggs[$label]); + + return Tab::make($id) + ->label($label) + ->badge($eggCount) + ->schema([ + CheckboxList::make("eggs.$id") + ->hiddenLabel() + ->options(fn () => array_sort($eggs[$label])) + ->searchable($eggCount > 0) + ->bulkToggleable($eggCount > 0) + ->columns(4), + ]); + }, $categories); + + if (empty($tabs)) { + $tabs[] = Tab::make('no_eggs') + ->label(trans('installer.egg.no_eggs')) + ->schema([ + TextEntry::make('no_eggs') + ->hiddenLabel() + ->state(trans('installer.egg.exceptions.no_eggs')), + ]); + } + + return Step::make('egg') + ->label(trans('installer.egg.title')) + ->columnSpanFull() + ->schema([ + Tabs::make('egg_tabs') + ->tabs($tabs), + ]); + } +} diff --git a/app/Livewire/Installer/Steps/EnvironmentStep.php b/app/Livewire/Installer/Steps/EnvironmentStep.php new file mode 100644 index 0000000000..760f4896c6 --- /dev/null +++ b/app/Livewire/Installer/Steps/EnvironmentStep.php @@ -0,0 +1,52 @@ +label(trans('installer.environment.title')) + ->columns() + ->schema([ + TextInput::make('env_general.APP_NAME') + ->label(trans('installer.environment.fields.app_name')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.environment.fields.app_name_help')) + ->required() + ->default(config('app.name')), + TextInput::make('env_general.APP_URL') + ->label(trans('installer.environment.fields.app_url')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.environment.fields.app_url_help')) + ->required() + ->default(url('')), + Fieldset::make('admin_user') + ->label(trans('installer.environment.fields.account.section')) + ->columns(3) + ->columnSpanFull() + ->schema([ + TextInput::make('user.email') + ->label(trans('installer.environment.fields.account.email')) + ->required() + ->email() + ->placeholder('admin@example.com'), + TextInput::make('user.username') + ->label(trans('installer.environment.fields.account.username')) + ->required() + ->placeholder('admin'), + TextInput::make('user.password') + ->label(trans('installer.environment.fields.account.password')) + ->required() + ->password() + ->revealable(), + ]), + ]) + ->afterValidation(fn () => $installer->writeToEnv('env_general')); + } +} diff --git a/app/Livewire/Installer/Steps/QueueStep.php b/app/Livewire/Installer/Steps/QueueStep.php new file mode 100644 index 0000000000..8a5ae2d784 --- /dev/null +++ b/app/Livewire/Installer/Steps/QueueStep.php @@ -0,0 +1,65 @@ + 'Database', + 'redis' => 'Redis', + 'sync' => 'Sync', + ]; + + /** + * @throws Exception + */ + public static function make(PanelInstaller $installer): Step + { + return Step::make('queue') + ->label(trans('installer.queue.title')) + ->columns() + ->schema([ + ToggleButtons::make('env_queue.QUEUE_CONNECTION') + ->label(trans('installer.queue.driver')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.queue.driver_help')) + ->required() + ->inline() + ->options(self::QUEUE_DRIVERS) + ->disableOptionWhen(fn ($value, Get $get) => $value === 'redis' && $get('env_cache.CACHE_STORE') !== 'redis') + ->default(config('queue.default')), + Toggle::make('done') + ->label(trans('installer.queue.fields.done')) + ->accepted(fn () => !@file_exists('/.dockerenv')) + ->inline(false) + ->validationMessages([ + 'accepted' => trans('installer.queue.fields.done_validation'), + ]) + ->hidden(fn () => @file_exists('/.dockerenv')), + TextInput::make('crontab') + ->label(new HtmlString(trans('installer.queue.fields.crontab'))) + ->disabled() + ->hintCopy() + ->default('(sudo crontab -l -u www-data 2>/dev/null; echo "* * * * * php ' . base_path() . '/artisan schedule:run >> /dev/null 2>&1") | sudo crontab -u www-data -') + ->hidden(fn () => @file_exists('/.dockerenv')) + ->columnSpanFull(), + TextInput::make('queueService') + ->label(new HtmlString(trans('installer.queue.fields.service'))) + ->disabled() + ->hintCopy() + ->default('sudo php ' . base_path() . '/artisan p:environment:queue-service') + ->hidden(fn () => @file_exists('/.dockerenv')) + ->columnSpanFull(), + ]) + ->afterValidation(fn () => $installer->writeToEnv('env_queue')); + } +} diff --git a/app/Livewire/Installer/Steps/RequirementsStep.php b/app/Livewire/Installer/Steps/RequirementsStep.php new file mode 100644 index 0000000000..a038f23954 --- /dev/null +++ b/app/Livewire/Installer/Steps/RequirementsStep.php @@ -0,0 +1,96 @@ += 0; + + $fields = [ + Section::make(trans('installer.requirements.sections.version.title')) + ->description(trans('installer.requirements.sections.version.or_newer', ['version' => self::MIN_PHP_VERSION])) + ->icon($correctPhpVersion ? TablerIcon::Check : TablerIcon::X) + ->iconColor($correctPhpVersion ? 'success' : 'danger') + ->schema([ + TextEntry::make('php_version') + ->hiddenLabel() + ->state(trans('installer.requirements.sections.version.content', ['version' => PHP_VERSION])), + ]), + ]; + + $phpExtensions = [ + 'BCMath' => extension_loaded('bcmath'), + 'cURL' => extension_loaded('curl'), + 'GD' => extension_loaded('gd'), + 'intl' => extension_loaded('intl'), + 'mbstring' => extension_loaded('mbstring'), + 'MySQL' => extension_loaded('pdo_mysql'), + 'SQLite3' => extension_loaded('pdo_sqlite'), + 'XML' => extension_loaded('xml'), + 'Zip' => extension_loaded('zip'), + ]; + $allExtensionsInstalled = !in_array(false, $phpExtensions); + + $fields[] = Section::make(trans('installer.requirements.sections.extensions.title')) + ->description(implode(', ', array_keys($phpExtensions))) + ->icon($allExtensionsInstalled ? TablerIcon::Check : TablerIcon::X) + ->iconColor($allExtensionsInstalled ? 'success' : 'danger') + ->schema([ + TextEntry::make('all_extensions_installed') + ->hiddenLabel() + ->state(trans('installer.requirements.sections.extensions.good')) + ->visible($allExtensionsInstalled), + TextEntry::make('extensions_missing') + ->hiddenLabel() + ->state(trans('installer.requirements.sections.extensions.bad', ['extensions' => implode(', ', array_keys($phpExtensions, false))])) + ->visible(!$allExtensionsInstalled), + ]); + + $folderPermissions = [ + 'Storage' => substr(sprintf('%o', fileperms(base_path('storage/'))), -4) >= 755, + 'Cache' => substr(sprintf('%o', fileperms(base_path('bootstrap/cache/'))), -4) >= 755, + ]; + $correctFolderPermissions = !in_array(false, $folderPermissions); + + $fields[] = Section::make(trans('installer.requirements.sections.permissions.title')) + ->description(implode(', ', array_keys($folderPermissions))) + ->icon($correctFolderPermissions ? TablerIcon::Check : TablerIcon::X) + ->iconColor($correctFolderPermissions ? 'success' : 'danger') + ->schema([ + TextEntry::make('correct_folder_permissions') + ->hiddenLabel() + ->state(trans('installer.requirements.sections.permissions.good')) + ->visible($correctFolderPermissions), + TextEntry::make('wrong_folder_permissions') + ->hiddenLabel() + ->state(trans('installer.requirements.sections.permissions.bad', ['folders' => implode(', ', array_keys($folderPermissions, false))])) + ->visible(!$correctFolderPermissions), + ]); + + return Step::make('requirements') + ->label(trans('installer.requirements.title')) + ->schema($fields) + ->afterValidation(function () use ($correctPhpVersion, $allExtensionsInstalled, $correctFolderPermissions) { + if (!$correctPhpVersion || !$allExtensionsInstalled || !$correctFolderPermissions) { + Notification::make() + ->title(trans('installer.requirements.exception')) + ->danger() + ->send(); + + throw new Halt(trans('installer.requirements.title')); + } + }); + } +} diff --git a/app/Livewire/Installer/Steps/SessionStep.php b/app/Livewire/Installer/Steps/SessionStep.php new file mode 100644 index 0000000000..e6a31d4ecc --- /dev/null +++ b/app/Livewire/Installer/Steps/SessionStep.php @@ -0,0 +1,38 @@ + 'Filesystem', + 'database' => 'Database', + 'cookie' => 'Cookie', + 'redis' => 'Redis', + ]; + + public static function make(): Step + { + return Step::make('session') + ->label(trans('installer.session.title')) + ->schema([ + ToggleButtons::make('env_session.SESSION_DRIVER') + ->label(trans('installer.session.driver')) + ->hintIcon(TablerIcon::QuestionMark, trans('installer.session.driver_help')) + ->required() + ->inline() + ->options(self::SESSION_DRIVERS) + ->disableOptionWhen(fn ($value, Get $get) => $value === 'redis' && $get('env_cache.CACHE_STORE') !== 'redis') + ->default(config('session.driver')), + TextInput::make('env_session.SESSION_SECURE_COOKIE') + ->hidden() + ->default(request()->isSecure()), + ]); + } +} diff --git a/app/Livewire/NodeClientConnectivity.php b/app/Livewire/NodeClientConnectivity.php new file mode 100644 index 0000000000..79de8a8ec8 --- /dev/null +++ b/app/Livewire/NodeClientConnectivity.php @@ -0,0 +1,94 @@ +getUserPermissionsService = $getUserPermissionsService; + $this->nodeJWTService = $nodeJWTService; + } + + public function render(): \Illuminate\Contracts\View\View + { + $httpUrl = $this->node->getConnectionAddress(); + + $wsUrl = null; + $wsToken = null; + + $server = $this->node->servers()->first(); + + if ($server) { + $user = Auth::user(); + + $permissions = $this->getUserPermissionsService->handle($server, $user); + + $wsToken = $this->nodeJWTService + ->setExpiresAt(now()->addMinute()->toImmutable()) + ->setUser($user) + ->setClaims([ + 'server_uuid' => $server->uuid, + 'permissions' => $permissions, + ]) + ->handle($this->node, $user->id . $server->uuid)->toString(); + + $wsUrl = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $this->node->getConnectionAddress()); + $wsUrl .= sprintf('/api/servers/%s/ws', $server->uuid); + } + + return view('livewire.node-client-connectivity', [ + 'httpUrl' => $httpUrl, + 'wsUrl' => $wsUrl, + 'wsToken' => $wsToken, + 'loadingIcon' => $this->makeIcon(TablerIcon::WorldQuestion, 'warning', 'Checking...'), + 'offlineIcon' => $this->makeIcon(TablerIcon::WorldX, 'danger', 'Node is not reachable from your browser'), + 'onlineIcon' => $this->makeIcon(TablerIcon::WorldCheck, 'success', 'Node is reachable'), + 'warningIcon' => $this->makeIcon(TablerIcon::WorldExclamation, 'warning', 'Node is reachable, but WebSocket failed. Check reverse proxy config.'), + 'onlineNoWsIcon' => $this->makeIcon(TablerIcon::WorldCheck, 'success', 'Node is reachable (WebSocket not tested — no servers)'), + ]); + } + + private function makeIcon(TablerIcon $icon, string $color, string $tooltip): string + { + return generate_icon_html($icon, attributes: (new ComponentAttributeBag()) + ->merge([ + 'x-tooltip' => '{ + content: "' . $tooltip . '", + theme: $store.theme, + allowHTML: true, + placement: "bottom", + }', + 'style' => 'color: var(--dark-text, var(--text))', + ], escape: false) + ->color(IconComponent::class, $color), size: IconSize::Large) + ->toHtml(); + } + + public function placeholder(): string + { + return generate_icon_html(TablerIcon::WorldQuestion, attributes: (new ComponentAttributeBag()) + ->color(IconComponent::class, 'warning'), size: IconSize::Large) + ->toHtml(); + } +} diff --git a/app/Livewire/NodeSystemInformation.php b/app/Livewire/NodeSystemInformation.php index b291902510..85c4ad45d2 100644 --- a/app/Livewire/NodeSystemInformation.php +++ b/app/Livewire/NodeSystemInformation.php @@ -2,29 +2,53 @@ namespace App\Livewire; +use App\Enums\TablerIcon; use App\Models\Node; +use Filament\Support\Enums\IconSize; +use Filament\Tables\View\Components\Columns\IconColumnComponent\IconComponent; +use Illuminate\View\ComponentAttributeBag; +use Livewire\Attributes\Locked; use Livewire\Component; +use function Filament\Support\generate_icon_html; + class NodeSystemInformation extends Component { + #[Locked] public Node $node; - public string $sizeClasses; - public function render() + public function render(): string { - return view('livewire.node-system-information'); + $systemInformation = $this->node->systemInformation(); + $exception = $systemInformation['exception'] ?? null; + $version = $systemInformation['version'] ?? null; + + if ($exception) { + $this->js('console.error("' . $exception . '");'); + } + + $tooltip = $exception ? 'Error connecting to node!
Check browser console for details.' : $version; + + $icon = $exception ? TablerIcon::HeartOff : TablerIcon::Heartbeat; + $color = $exception ? 'danger' : 'success'; + + return generate_icon_html($icon, attributes: (new ComponentAttributeBag()) + ->merge([ + 'x-tooltip' => '{ + content: "' . $tooltip . '", + theme: $store.theme, + allowHTML: true, + placement: "bottom", + }', + ], escape: false) + ->color(IconComponent::class, $color), size: IconSize::Large) + ->toHtml(); } - public function placeholder() + public function placeholder(): string { - return <<<'HTML' -
- -
- HTML; + return generate_icon_html(TablerIcon::HeartQuestion, attributes: (new ComponentAttributeBag()) + ->color(IconComponent::class, 'warning'), size: IconSize::Large) + ->toHtml(); } } diff --git a/app/Livewire/ServerEntry.php b/app/Livewire/ServerEntry.php new file mode 100644 index 0000000000..3f691084eb --- /dev/null +++ b/app/Livewire/ServerEntry.php @@ -0,0 +1,36 @@ + $this]); + } + + public function placeholder(): View + { + return view('livewire.server-entry-placeholder', ['server' => $this->server, 'component' => $this]); + } + + public function redirectUrl(?bool $shouldOpenUrlInNewTab = false): string + { + $url = Console::getUrl(panel: 'server', tenant: $this->server); + $target = $shouldOpenUrlInNewTab ? '_blank' : '_self'; + + if (!$shouldOpenUrlInNewTab && FilamentView::hasSpaMode($url)) { + return sprintf("Livewire.navigate('%s')", $url); + } + + return sprintf("window.open('%s', '%s')", $url, $target); + } +} diff --git a/app/Models/APILog.php b/app/Models/APILog.php deleted file mode 100644 index a43624cce1..0000000000 --- a/app/Models/APILog.php +++ /dev/null @@ -1,30 +0,0 @@ - 'boolean', - ]; - } -} diff --git a/app/Models/ActivityLog.php b/app/Models/ActivityLog.php index bb6149c142..31d2cc094e 100644 --- a/app/Models/ActivityLog.php +++ b/app/Models/ActivityLog.php @@ -2,35 +2,44 @@ namespace App\Models; -use Carbon\Carbon; -use Illuminate\Support\Facades\Event; +use App\Enums\TablerIcon; use App\Events\ActivityLogged; +use App\Traits\HasValidation; +use BackedEnum; +use Carbon\Carbon; +use Filament\Facades\Filament; +use Filament\Support\Contracts\HasIcon; +use Filament\Support\Contracts\HasLabel; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\MassPrunable; -use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\MorphTo; -use Illuminate\Database\Eloquent\Model as IlluminateModel; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Event; +use Illuminate\Support\Str; +use LogicException; /** * \App\Models\ActivityLog. * * @property int $id - * @property string|null $batch * @property string $event * @property string $ip * @property string|null $description * @property string|null $actor_type * @property int|null $actor_id * @property int|null $api_key_id - * @property \Illuminate\Support\Collection|null $properties + * @property Collection|null $properties * @property \Carbon\Carbon $timestamp - * @property IlluminateModel|\Eloquent $actor - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\ActivityLogSubject[] $subjects + * @property Model|\Eloquent $actor + * @property \Illuminate\Database\Eloquent\Collection|ActivityLogSubject[] $subjects * @property int|null $subjects_count - * @property \App\Models\ApiKey|null $apiKey + * @property ApiKey|null $apiKey * - * @method static Builder|ActivityLog forActor(\Illuminate\Database\Eloquent\Model $actor) + * @method static Builder|ActivityLog forActor(Model $actor) * @method static Builder|ActivityLog forEvent(string $action) * @method static Builder|ActivityLog newModelQuery() * @method static Builder|ActivityLog newQuery() @@ -38,18 +47,16 @@ * @method static Builder|ActivityLog whereActorId($value) * @method static Builder|ActivityLog whereActorType($value) * @method static Builder|ActivityLog whereApiKeyId($value) - * @method static Builder|ActivityLog whereBatch($value) * @method static Builder|ActivityLog whereDescription($value) * @method static Builder|ActivityLog whereEvent($value) * @method static Builder|ActivityLog whereId($value) * @method static Builder|ActivityLog whereIp($value) * @method static Builder|ActivityLog whereProperties($value) * @method static Builder|ActivityLog whereTimestamp($value) - * - * @mixin \Eloquent */ -class ActivityLog extends Model +class ActivityLog extends Model implements HasIcon, HasLabel { + use HasValidation; use MassPrunable; public const RESOURCE_NAME = 'activity_log'; @@ -69,9 +76,9 @@ class ActivityLog extends Model protected $with = ['subjects']; + /** @var array */ public static array $validationRules = [ 'event' => ['required', 'string'], - 'batch' => ['nullable', 'uuid'], 'ip' => ['required', 'string'], 'description' => ['nullable', 'string'], 'properties' => ['array'], @@ -87,14 +94,12 @@ protected function casts(): array public function actor(): MorphTo { - $morph = $this->morphTo(); - if (method_exists($morph, 'withTrashed')) { - return $morph->withTrashed(); - } - - return $morph; + return $this->morphTo()->withTrashed()->withoutGlobalScopes(); } + /** + * @return HasMany + */ public function subjects(): HasMany { return $this->hasMany(ActivityLogSubject::class); @@ -113,30 +118,21 @@ public function scopeForEvent(Builder $builder, string $action): Builder /** * Scopes a query to only return results where the actor is a given model. */ - public function scopeForActor(Builder $builder, IlluminateModel $actor): Builder + public function scopeForActor(Builder $builder, Model $actor): Builder { return $builder->whereMorphedTo('actor', $actor); } - /** - * Returns models to be pruned. - * - * @see https://laravel.com/docs/9.x/eloquent#pruning-models - */ - public function prunable() + public function prunable(): Builder { if (is_null(config('activity.prune_days'))) { - throw new \LogicException('Cannot prune activity logs: no "prune_days" configuration value is set.'); + throw new LogicException('Cannot prune activity logs: no "prune_days" configuration value is set.'); } return static::where('timestamp', '<=', Carbon::now()->subDays(config('activity.prune_days'))); } - /** - * Boots the model event listeners. This will trigger an activity log event every - * time a new model is inserted which can then be captured and worked with as needed. - */ - protected static function boot() + protected static function boot(): void { parent::boot(); @@ -149,7 +145,32 @@ protected static function boot() }); } - public function htmlable() + public function getIcon(): BackedEnum + { + if ($this->apiKey) { + return TablerIcon::Api; + } + + if ($this->actor instanceof User) { + return TablerIcon::User; + } + + return $this->actor_id === null ? TablerIcon::DeviceDesktop : TablerIcon::UserOff; + } + + public function getLabel(): string + { + $properties = $this->wrapProperties(); + + return trans_choice('activity.'.str($this->event)->replace(':', '.'), array_key_exists('count', $properties) ? $properties['count'] : 1, $properties); + } + + public function getIp(): ?string + { + return user()?->can('seeIps activityLog') ? $this->ip : null; + } + + public function htmlable(): string { $user = $this->actor; if (!$user instanceof User) { @@ -159,18 +180,88 @@ public function htmlable() ]); } - $event = __('activity.'.str($this->event)->replace(':', '.')); + $avatarUrl = Filament::getUserAvatarUrl($user); + $username = str($user->username)->stripTags(); + $ip = $this->getIp(); + $ip = $ip ? $ip . ' — ' : ''; return "
- +
-

$user->username — $this->event

-

$event

-

$this->ip — {$this->timestamp->diffForHumans()}

+

$username — $this->event

+

{$this->getLabel()}

+

$ip{$this->timestamp->diffForHumans()}

"; } + + /** + * @return array + */ + public function wrapProperties(): array + { + if (!$this->properties || $this->properties->isEmpty()) { + return []; + } + + $properties = $this->properties->mapWithKeys(function ($value, $key) { + if (!is_array($value)) { + // Perform some directory normalization at this point. + if ($key === 'directory') { + $value = str_replace('//', '/', '/' . trim($value, '/') . '/'); + } + + return [$key => str($value)->stripTags()->toString()]; + } + + $first = Arr::first($value); + + // Backwards compatibility for old logs + if (is_array($first)) { + return ["{$key}_count" => count($value)]; + } + + return [$key => str($first)->stripTags()->toString(), "{$key}_count" => count($value)]; + }); + + $keys = $properties->keys()->filter(fn ($key) => Str::endsWith($key, '_count'))->values(); + if ($keys->containsOneItem()) { + $properties = $properties->merge(['count' => $properties->get($keys[0])])->except([$keys[0]]); + } + + return $properties->toArray(); + } + + /** + * Determines if there are any log properties that we've not already exposed + * in the response language string and that are not just the IP address or + * the browser useragent. + * + * This is used by the front-end to selectively display an "additional metadata" + * button that is pointless if there is nothing the user can't already see from + * the event description. + */ + public function hasAdditionalMetadata(): bool + { + if (!$this->properties || $this->properties->isEmpty()) { + return false; + } + + $properties = $this->wrapProperties(); + $event = trans_choice('activity.'.str($this->event)->replace(':', '.'), array_key_exists('count', $properties) ? $properties['count'] : 1); + + preg_match_all('/:(?[\w.-]+\w)(?:[^\w:]?|$)/', $event, $matches); + + $exclude = array_merge($matches['key'], ['ip', 'useragent', 'using_sftp']); + foreach ($this->properties->keys() as $key) { + if (!in_array($key, $exclude, true)) { + return true; + } + } + + return false; + } } diff --git a/app/Models/ActivityLogSubject.php b/app/Models/ActivityLogSubject.php index 037d344f05..7a2fe46a69 100644 --- a/app/Models/ActivityLogSubject.php +++ b/app/Models/ActivityLogSubject.php @@ -2,9 +2,12 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\Pivot; -use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Eloquent\SoftDeletingScope; /** * \App\Models\ActivityLogSubject. @@ -13,18 +16,17 @@ * @property int $activity_log_id * @property int $subject_id * @property string $subject_type - * @property \App\Models\ActivityLog|null $activityLog - * @property \Illuminate\Database\Eloquent\Model|\Eloquent $subject + * @property ActivityLog|null $activityLog + * @property Model|\Eloquent $subject * - * @method static \Illuminate\Database\Eloquent\Builder|ActivityLogSubject newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ActivityLogSubject newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ActivityLogSubject query() - * - * @mixin \Eloquent + * @method static Builder|ActivityLogSubject newModelQuery() + * @method static Builder|ActivityLogSubject newQuery() + * @method static Builder|ActivityLogSubject query() */ class ActivityLogSubject extends Pivot { public $incrementing = true; + public $timestamps = false; protected $table = 'activity_log_subjects'; @@ -36,15 +38,8 @@ public function activityLog(): BelongsTo return $this->belongsTo(ActivityLog::class); } - public function subject() + public function subject(): MorphTo { - $morph = $this->morphTo(); - - if (in_array(SoftDeletes::class, class_uses_recursive($morph::class))) { - /** @var self|Backup|UserSSHKey $morph - cannot use traits in doc blocks */ - return $morph->withTrashed(); - } - - return $morph; + return $this->morphTo()->withoutGlobalScope(SoftDeletingScope::class); } } diff --git a/app/Models/Allocation.php b/app/Models/Allocation.php index abd60bfba8..fc529829c8 100644 --- a/app/Models/Allocation.php +++ b/app/Models/Allocation.php @@ -3,7 +3,13 @@ namespace App\Models; use App\Exceptions\Service\Allocation\ServerUsingAllocationException; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Database\Factories\AllocationFactory; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; /** @@ -16,58 +22,68 @@ * @property int $port * @property int|null $server_id * @property string|null $notes - * @property \Carbon\Carbon|null $created_at - * @property \Carbon\Carbon|null $updated_at + * @property Carbon|null $created_at + * @property Carbon|null $updated_at * @property string $alias * @property bool $has_alias - * @property \App\Models\Server|null $server - * @property \App\Models\Node $node + * @property string $address + * @property Server|null $server + * @property Node $node + * @property bool $is_locked * - * @method static \Database\Factories\AllocationFactory factory(...$parameters) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Allocation newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Allocation query() - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereIp($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereIpAlias($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereNodeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation wherePort($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereServerId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Allocation whereUpdatedAt($value) - * - * @mixin \Eloquent + * @method static AllocationFactory factory(...$parameters) + * @method static Builder|Allocation newModelQuery() + * @method static Builder|Allocation newQuery() + * @method static Builder|Allocation query() + * @method static Builder|Allocation whereCreatedAt($value) + * @method static Builder|Allocation whereId($value) + * @method static Builder|Allocation whereIp($value) + * @method static Builder|Allocation whereIpAlias($value) + * @method static Builder|Allocation whereNodeId($value) + * @method static Builder|Allocation whereNotes($value) + * @method static Builder|Allocation wherePort($value) + * @method static Builder|Allocation whereServerId($value) + * @method static Builder|Allocation whereUpdatedAt($value) */ class Allocation extends Model { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an - * API representation using fractal. + * API representation using fractal. Also used as name for api key permissions. */ public const RESOURCE_NAME = 'allocation'; - /** - * The table associated with the model. - */ - protected $table = 'allocations'; + protected $attributes = [ + 'is_locked' => false, + ]; /** * Fields that are not mass assignable. */ protected $guarded = ['id', 'created_at', 'updated_at']; + /** @var array */ public static array $validationRules = [ - 'node_id' => 'required|exists:nodes,id', - 'ip' => 'required|ip', - 'port' => 'required|numeric|between:1024,65535', - 'ip_alias' => 'nullable|string', - 'server_id' => 'nullable|exists:servers,id', - 'notes' => 'nullable|string|max:256', + 'node_id' => ['required', 'exists:nodes,id'], + 'ip' => ['required', 'ip'], + 'port' => ['required', 'numeric', 'between:1024,65535'], + 'ip_alias' => ['nullable', 'string'], + 'server_id' => ['nullable', 'exists:servers,id'], + 'notes' => ['nullable', 'string', 'max:256'], + 'is_locked' => ['boolean'], ]; protected static function booted(): void { + static::updating(function (self $allocation) { + if (is_null($allocation->server_id)) { + $allocation->is_locked = false; + } + }); + static::deleting(function (self $allocation) { throw_if($allocation->server_id, new ServerUsingAllocationException(trans('exceptions.allocations.server_using'))); }); @@ -79,14 +95,10 @@ protected function casts(): array 'node_id' => 'integer', 'port' => 'integer', 'server_id' => 'integer', + 'is_locked' => 'bool', ]; } - public function getRouteKeyName(): string - { - return $this->getKeyName(); - } - /** * Accessor to automatically provide the IP alias if defined. */ @@ -107,15 +119,10 @@ public function getHasAliasAttribute(?string $value): bool protected function address(): Attribute { return Attribute::make( - get: fn () => "$this->ip:$this->port", + get: fn () => (is_ipv6($this->alias) ? "[$this->alias]" : $this->alias) . ":$this->port", ); } - public function toString(): string - { - return $this->address; - } - /** * Gets information for the server associated with this allocation. */ diff --git a/app/Models/ApiKey.php b/app/Models/ApiKey.php index 52d78a97bb..a4d6b5cfab 100644 --- a/app/Models/ApiKey.php +++ b/app/Models/ApiKey.php @@ -2,10 +2,16 @@ namespace App\Models; -use Illuminate\Support\Str; -use Webmozart\Assert\Assert; use App\Services\Acl\Api\AdminAcl; +use App\Traits\HasValidation; +use Database\Factories\ApiKeyFactory; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; +use Illuminate\Support\Str; +use Laravel\Sanctum\PersonalAccessToken; +use Webmozart\Assert\Assert; /** * App\Models\ApiKey. @@ -15,82 +21,69 @@ * @property int $key_type * @property string $identifier * @property string $token - * @property array $allowed_ips + * @property string[]|null $permissions + * @property string[]|null $allowed_ips * @property string|null $memo - * @property \Illuminate\Support\Carbon|null $last_used_at - * @property \Illuminate\Support\Carbon|null $expires_at - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property int $r_servers - * @property int $r_nodes - * @property int $r_allocations - * @property int $r_users - * @property int $r_eggs - * @property int $r_database_hosts - * @property int $r_server_databases - * @property int $r_mounts - * @property \App\Models\User $tokenable - * @property \App\Models\User $user - * - * @method static \Database\Factories\ApiKeyFactory factory(...$parameters) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey query() - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereAllowedIps($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereIdentifier($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereKeyType($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereLastUsedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereMemo($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereRAllocations($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereRDatabaseHosts($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereREggs($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereRNodes($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereRServerDatabases($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereRServers($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereRUsers($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereToken($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ApiKey whereUserId($value) + * @property Carbon|null $last_used_at + * @property Carbon|null $expires_at + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property User $tokenable + * @property User $user * - * @mixin \Eloquent + * @method static ApiKeyFactory factory(...$parameters) + * @method static Builder|ApiKey newModelQuery() + * @method static Builder|ApiKey newQuery() + * @method static Builder|ApiKey query() + * @method static Builder|ApiKey whereAllowedIps($value) + * @method static Builder|ApiKey whereCreatedAt($value) + * @method static Builder|ApiKey whereId($value) + * @method static Builder|ApiKey whereIdentifier($value) + * @method static Builder|ApiKey whereKeyType($value) + * @method static Builder|ApiKey whereLastUsedAt($value) + * @method static Builder|ApiKey whereMemo($value) + * @method static Builder|ApiKey whereRAllocations($value) + * @method static Builder|ApiKey whereRDatabaseHosts($value) + * @method static Builder|ApiKey whereREggs($value) + * @method static Builder|ApiKey whereRNodes($value) + * @method static Builder|ApiKey whereRServerDatabases($value) + * @method static Builder|ApiKey whereRServers($value) + * @method static Builder|ApiKey whereRUsers($value) + * @method static Builder|ApiKey whereToken($value) + * @method static Builder|ApiKey whereUpdatedAt($value) + * @method static Builder|ApiKey whereUserId($value) */ -class ApiKey extends Model +class ApiKey extends PersonalAccessToken { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'api_key'; + /** * Different API keys that can exist on the system. */ public const TYPE_NONE = 0; + public const TYPE_ACCOUNT = 1; - /* @deprecated */ + public const TYPE_APPLICATION = 2; - /* @deprecated */ - public const TYPE_DAEMON_USER = 3; - /* @deprecated */ - public const TYPE_DAEMON_APPLICATION = 4; + /** * The length of API key identifiers. */ public const IDENTIFIER_LENGTH = 16; + /** * The length of the actual API key that is encrypted and stored * in the database. */ public const KEY_LENGTH = 32; - public const RESOURCES = ['servers', 'nodes', 'allocations', 'users', 'eggs', 'database_hosts', 'server_databases', 'mounts']; - - /** - * The table associated with the model. - */ - protected $table = 'api_keys'; - /** * Fields that are mass assignable. */ @@ -99,18 +92,11 @@ class ApiKey extends Model 'key_type', 'identifier', 'token', + 'permissions', 'allowed_ips', 'memo', 'last_used_at', 'expires_at', - 'r_' . AdminAcl::RESOURCE_USERS, - 'r_' . AdminAcl::RESOURCE_ALLOCATIONS, - 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS, - 'r_' . AdminAcl::RESOURCE_SERVER_DATABASES, - 'r_' . AdminAcl::RESOURCE_EGGS, - 'r_' . AdminAcl::RESOURCE_NODES, - 'r_' . AdminAcl::RESOURCE_SERVERS, - 'r_' . AdminAcl::RESOURCE_MOUNTS, ]; /** @@ -118,6 +104,7 @@ class ApiKey extends Model */ protected $attributes = [ 'allowed_ips' => '[]', + 'permissions' => '[]', ]; /** @@ -126,32 +113,25 @@ class ApiKey extends Model */ protected $hidden = ['token']; - /** - * Rules to protect against invalid data entry to DB. - */ + /** @var array */ public static array $validationRules = [ - 'user_id' => 'required|exists:users,id', - 'key_type' => 'present|integer|min:0|max:4', - 'identifier' => 'required|string|size:16|unique:api_keys,identifier', - 'token' => 'required|string', - 'memo' => 'required|nullable|string|max:500', - 'allowed_ips' => 'array', - 'allowed_ips.*' => 'string', - 'last_used_at' => 'nullable|date', - 'expires_at' => 'nullable|date', - 'r_' . AdminAcl::RESOURCE_USERS => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_ALLOCATIONS => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_SERVER_DATABASES => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_EGGS => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_NODES => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_SERVERS => 'integer|min:0|max:3', - 'r_' . AdminAcl::RESOURCE_MOUNTS => 'integer|min:0|max:3', + 'user_id' => ['required', 'exists:users,id'], + 'key_type' => ['present', 'integer', 'min:0', 'max:2'], + 'identifier' => ['required', 'string', 'size:16', 'unique:api_keys,identifier'], + 'token' => ['required', 'string'], + 'permissions' => ['array'], + 'permissions.*' => ['integer', 'min:0', 'max:3'], + 'memo' => ['required', 'nullable', 'string', 'max:500'], + 'allowed_ips' => ['array'], + 'allowed_ips.*' => ['string'], + 'last_used_at' => ['nullable', 'date'], + 'expires_at' => ['nullable', 'date'], ]; protected function casts(): array { return [ + 'permissions' => 'array', 'allowed_ips' => 'array', 'user_id' => 'int', 'last_used_at' => 'datetime', @@ -159,14 +139,6 @@ protected function casts(): array 'token' => 'encrypted', self::CREATED_AT => 'datetime', self::UPDATED_AT => 'datetime', - 'r_' . AdminAcl::RESOURCE_USERS => 'int', - 'r_' . AdminAcl::RESOURCE_ALLOCATIONS => 'int', - 'r_' . AdminAcl::RESOURCE_DATABASE_HOSTS => 'int', - 'r_' . AdminAcl::RESOURCE_SERVER_DATABASES => 'int', - 'r_' . AdminAcl::RESOURCE_EGGS => 'int', - 'r_' . AdminAcl::RESOURCE_NODES => 'int', - 'r_' . AdminAcl::RESOURCE_SERVERS => 'int', - 'r_' . AdminAcl::RESOURCE_MOUNTS => 'int', ]; } @@ -178,23 +150,61 @@ public function user(): BelongsTo return $this->belongsTo(User::class); } + public function tokenable() + { + // @phpstan-ignore return.type + return $this->user(); + } + /** - * Required for support with Laravel Sanctum. + * Returns the permission for the given resource. + */ + public function getPermission(string $resource): int + { + return $this->permissions[$resource] ?? AdminAcl::NONE; + } + + public const DEFAULT_RESOURCE_NAMES = [ + Server::RESOURCE_NAME, + Node::RESOURCE_NAME, + Allocation::RESOURCE_NAME, + User::RESOURCE_NAME, + Egg::RESOURCE_NAME, + DatabaseHost::RESOURCE_NAME, + Database::RESOURCE_NAME, + Mount::RESOURCE_NAME, + Role::RESOURCE_NAME, + Plugin::RESOURCE_NAME, + ]; + + /** @var string[] */ + protected static array $customResourceNames = []; + + public static function registerCustomResourceName(string $resourceName): void + { + static::$customResourceNames[] = $resourceName; + } + + /** + * Returns a list of all possible permission keys. * - * @see \Laravel\Sanctum\Guard::supportsTokens() + * @return string[] */ - public function tokenable(): BelongsTo + public static function getPermissionList(): array { - return $this->user(); + return array_unique(array_merge(self::DEFAULT_RESOURCE_NAMES, self::$customResourceNames)); } /** * Finds the model matching the provided token. + * + * @param string $token */ - public static function findToken(string $token): ?self + public static function findToken($token): ?self { $identifier = substr($token, 0, self::IDENTIFIER_LENGTH); + /** @var static|null $model */ $model = static::where('identifier', $identifier)->first(); if (!is_null($model) && $model->token === substr($token, strlen($identifier))) { return $model; @@ -210,7 +220,7 @@ public static function getPrefixForType(int $type): string { Assert::oneOf($type, [self::TYPE_ACCOUNT, self::TYPE_APPLICATION]); - return $type === self::TYPE_ACCOUNT ? 'plcn_' : 'peli_'; + return $type === self::TYPE_ACCOUNT ? 'pacc_' : 'papp_'; } /** diff --git a/app/Models/AuditLog.php b/app/Models/AuditLog.php deleted file mode 100644 index d091773eae..0000000000 --- a/app/Models/AuditLog.php +++ /dev/null @@ -1,82 +0,0 @@ - 'required|uuid', - 'action' => 'required|string|max:255', - 'subaction' => 'nullable|string|max:255', - 'device' => 'array', - 'device.ip_address' => 'ip', - 'device.user_agent' => 'string', - 'metadata' => 'array', - ]; - - protected $table = 'audit_logs'; - - protected $guarded = [ - 'id', - 'created_at', - ]; - - protected function casts(): array - { - return [ - 'is_system' => 'bool', - 'device' => 'array', - 'metadata' => 'array', - 'created_at' => 'immutable_datetime', - ]; - } - - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } - - public function server(): BelongsTo - { - return $this->belongsTo(Server::class); - } - - /** - * Creates a new AuditLog model and returns it, attaching device information and the - * currently authenticated user if available. This model is not saved at this point, so - * you can always make modifications to it as needed before saving. - * - * @deprecated - */ - public static function instance(string $action, array $metadata, bool $isSystem = false): self - { - /** @var \Illuminate\Http\Request $request */ - $request = Container::getInstance()->make('request'); - if ($isSystem || !$request instanceof Request) { - $request = null; - } - - return (new self())->fill([ - 'uuid' => Uuid::uuid4()->toString(), - 'is_system' => $isSystem, - 'user_id' => ($request && $request->user()) ? $request->user()->id : null, - 'server_id' => null, - 'action' => $action, - 'device' => $request ? [ - 'ip_address' => $request->getClientIp() ?? '127.0.0.1', - 'user_agent' => $request->userAgent() ?? '', - ] : [], - 'metadata' => $metadata, - ]); - } -} diff --git a/app/Models/Backup.php b/app/Models/Backup.php index 3f2a931d1e..3cfc8f67c3 100644 --- a/app/Models/Backup.php +++ b/app/Models/Backup.php @@ -2,9 +2,17 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\SoftDeletes; +use App\Contracts\Validatable; +use App\Eloquent\BackupQueryBuilder; +use App\Enums\BackupStatus; +use App\Traits\HasValidation; +use Carbon\CarbonImmutable; +use Illuminate\Database\Eloquent\Casts\Attribute; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Query\Builder; /** * @property int $id @@ -18,23 +26,24 @@ * @property string|null $checksum * @property int $bytes * @property string|null $upload_id - * @property \Carbon\CarbonImmutable|null $completed_at - * @property \Carbon\CarbonImmutable $created_at - * @property \Carbon\CarbonImmutable $updated_at - * @property \Carbon\CarbonImmutable|null $deleted_at - * @property \App\Models\Server $server - * @property \App\Models\AuditLog[] $audits + * @property CarbonImmutable|null $completed_at + * @property BackupStatus $status + * @property CarbonImmutable $created_at + * @property CarbonImmutable $updated_at + * @property CarbonImmutable|null $deleted_at + * @property Server $server */ -class Backup extends Model +class Backup extends Model implements Validatable { + use HasFactory; + use HasValidation; use SoftDeletes; public const RESOURCE_NAME = 'backup'; public const ADAPTER_DAEMON = 'wings'; - public const ADAPTER_AWS_S3 = 's3'; - protected $table = 'backups'; + public const ADAPTER_AWS_S3 = 's3'; protected $attributes = [ 'is_successful' => false, @@ -46,17 +55,18 @@ class Backup extends Model protected $guarded = ['id', 'created_at', 'updated_at', 'deleted_at']; + /** @var array */ public static array $validationRules = [ - 'server_id' => 'bail|required|numeric|exists:servers,id', - 'uuid' => 'required|uuid', - 'is_successful' => 'boolean', - 'is_locked' => 'boolean', - 'name' => 'required|string', - 'ignored_files' => 'array', - 'disk' => 'required|string', - 'checksum' => 'nullable|string', - 'bytes' => 'numeric', - 'upload_id' => 'nullable|string', + 'server_id' => ['bail', 'required', 'numeric', 'exists:servers,id'], + 'uuid' => ['required', 'uuid'], + 'is_successful' => ['boolean'], + 'is_locked' => ['boolean'], + 'name' => ['required', 'string'], + 'ignored_files' => ['array'], + 'disk' => ['required', 'string'], + 'checksum' => ['nullable', 'string'], + 'bytes' => ['numeric'], + 'upload_id' => ['nullable', 'string'], ]; protected function casts(): array @@ -74,16 +84,24 @@ protected function casts(): array ]; } + protected function status(): Attribute + { + return Attribute::make( + get: fn () => !$this->completed_at ? BackupStatus::InProgress : ($this->is_successful ? BackupStatus::Successful : BackupStatus::Failed), + ); + } + public function server(): BelongsTo { return $this->belongsTo(Server::class); } /** - * Returns a query filtering only non-failed backups for a specific server. + * @param Builder $query + * @return BackupQueryBuilder */ - public function scopeNonFailed(Builder $query): void + public function newEloquentBuilder($query): BackupQueryBuilder { - $query->whereNull('completed_at')->orWhere('is_successful', true); + return new BackupQueryBuilder($query); } } diff --git a/app/Models/Database.php b/app/Models/Database.php index bd6bc6de34..4c2acbcf58 100644 --- a/app/Models/Database.php +++ b/app/Models/Database.php @@ -2,8 +2,14 @@ namespace App\Models; +use App\Contracts\Validatable; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Casts\Attribute; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Support\Facades\DB; +use PDOException; /** * @property int $id @@ -13,27 +19,24 @@ * @property string $username * @property string $remote * @property string $password - * @property int $max_connections - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \App\Models\Server $server - * @property \App\Models\DatabaseHost $host + * @property ?int $max_connections + * @property string $jdbc + * @property Carbon $created_at + * @property Carbon $updated_at + * @property Server $server + * @property DatabaseHost $host */ -class Database extends Model +class Database extends Model implements Validatable { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an - * API representation using fractal. + * API representation using fractal. Also used as name for api key permissions. */ public const RESOURCE_NAME = 'server_database'; - public const DEFAULT_CONNECTION_NAME = 'dynamic'; - - /** - * The table associated with the model. - */ - protected $table = 'databases'; - /** * The attributes excluded from the model's JSON form. */ @@ -46,14 +49,15 @@ class Database extends Model 'server_id', 'database_host_id', 'database', 'username', 'password', 'remote', 'max_connections', ]; + /** @var array */ public static array $validationRules = [ - 'server_id' => 'required|numeric|exists:servers,id', - 'database_host_id' => 'required|exists:database_hosts,id', - 'database' => 'required|string|alpha_dash|between:3,48', - 'username' => 'string|alpha_dash|between:3,100', - 'max_connections' => 'nullable|integer', - 'remote' => 'required|string|regex:/^[\w\-\/.%:]+$/', - 'password' => 'string', + 'server_id' => ['required', 'numeric', 'exists:servers,id'], + 'database_host_id' => ['required', 'exists:database_hosts,id'], + 'database' => ['required', 'string', 'alpha_dash', 'between:3,48'], + 'username' => ['string', 'alpha_dash', 'between:3,100'], + 'max_connections' => ['nullable', 'integer'], + 'remote' => ['required', 'string', 'regex:/^[\w\-\/.%:]+$/'], + 'password' => ['string'], ]; protected function casts(): array @@ -66,11 +70,6 @@ protected function casts(): array ]; } - public function getRouteKeyName(): string - { - return $this->getKeyName(); - } - /** * Gets the host database server associated with a database. */ @@ -87,72 +86,110 @@ public function server(): BelongsTo return $this->belongsTo(Server::class); } + public function address(): string + { + return $this->host->name . ':' . $this->host->port; + } + + protected function jdbc(): Attribute + { + return Attribute::make( + get: fn () => 'jdbc:mysql://' . $this->username . ':' . urlencode($this->password) . '@' . $this->address() . '/' . $this->database, + ); + } + /** + * @throws PDOException + * * Run the provided statement against the database on a given connection. */ - private function run(string $statement): bool + private function run(string $statement): void { - return DB::connection(self::DEFAULT_CONNECTION_NAME)->statement($statement); + $this->host->buildConnection()->statement($statement); } /** + * @throws PDOException + * * Create a new database on a given connection. */ - public function createDatabase(string $database): bool + public function createDatabase(): self { - return $this->run(sprintf('CREATE DATABASE IF NOT EXISTS `%s`', $database)); + $this->run(sprintf('CREATE DATABASE IF NOT EXISTS `%s`', $this->database)); + + return $this; } /** + * @throws PDOException + * * Create a new database user on a given connection. */ - public function createUser(string $username, string $remote, string $password, ?int $max_connections): bool + public function createUser(): self { - $args = [$username, $remote, $password]; + $args = [$this->username, $this->remote, $this->password]; $command = 'CREATE USER `%s`@`%s` IDENTIFIED BY \'%s\''; - if (!empty($max_connections)) { - $args[] = $max_connections; + if (!empty($this->max_connections)) { + $args[] = $this->max_connections; $command .= ' WITH MAX_USER_CONNECTIONS %s'; } - return $this->run(sprintf($command, ...$args)); + $this->run(sprintf($command, ...$args)); + + return $this; } /** + * @throws PDOException + * * Give a specific user access to a given database. */ - public function assignUserToDatabase(string $database, string $username, string $remote): bool + public function assignUserToDatabase(): self { - return $this->run(sprintf( + $this->run(sprintf( 'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, REFERENCES, INDEX, LOCK TABLES, CREATE ROUTINE, ALTER ROUTINE, EXECUTE, CREATE TEMPORARY TABLES, CREATE VIEW, SHOW VIEW, EVENT, TRIGGER ON `%s`.* TO `%s`@`%s`', - $database, - $username, - $remote + $this->database, + $this->username, + $this->remote )); + + return $this; } /** + * @throws PDOException + * * Flush the privileges for a given connection. */ - public function flush(): bool + public function flushPrivileges(): self { - return $this->run('FLUSH PRIVILEGES'); + $this->run('FLUSH PRIVILEGES'); + + return $this; } /** + * @throws PDOException + * * Drop a given database on a specific connection. */ - public function dropDatabase(string $database): bool + public function dropDatabase(): self { - return $this->run(sprintf('DROP DATABASE IF EXISTS `%s`', $database)); + $this->run(sprintf('DROP DATABASE IF EXISTS `%s`', $this->database)); + + return $this; } /** + * @throws PDOException + * * Drop a given user on a specific connection. */ - public function dropUser(string $username, string $remote): bool + public function dropUser(): self { - return $this->run(sprintf('DROP USER IF EXISTS `%s`@`%s`', $username, $remote)); + $this->run(sprintf('DROP USER IF EXISTS `%s`@`%s`', $this->username, $this->remote)); + + return $this; } } diff --git a/app/Models/DatabaseHost.php b/app/Models/DatabaseHost.php index 278cee9b4d..c2078b5b79 100644 --- a/app/Models/DatabaseHost.php +++ b/app/Models/DatabaseHost.php @@ -2,8 +2,16 @@ namespace App\Models; +use App\Contracts\Validatable; +use App\Traits\HasValidation; +use Carbon\CarbonImmutable; +use Illuminate\Database\Connection; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Facades\DB; /** * @property int $id @@ -14,22 +22,24 @@ * @property string $password * @property int|null $max_databases * @property int|null $node_id - * @property \Carbon\CarbonImmutable $created_at - * @property \Carbon\CarbonImmutable $updated_at + * @property CarbonImmutable $created_at + * @property CarbonImmutable $updated_at + * @property Collection|Node[] $nodes + * @property int|null $nodes_count + * @property Collection|Database[] $databases + * @property int|null $databases_count */ -class DatabaseHost extends Model +class DatabaseHost extends Model implements Validatable { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an - * API representation using fractal. + * API representation using fractal. Also used as name for api key permissions. */ public const RESOURCE_NAME = 'database_host'; - /** - * The table associated with the model. - */ - protected $table = 'database_hosts'; - /** * The attributes excluded from the model's JSON form. */ @@ -39,19 +49,18 @@ class DatabaseHost extends Model * Fields that are mass assignable. */ protected $fillable = [ - 'name', 'host', 'port', 'username', 'password', 'max_databases', 'node_id', + 'name', 'host', 'port', 'username', 'password', 'max_databases', ]; - /** - * Validation rules to assign to this model. - */ + /** @var array */ public static array $validationRules = [ - 'name' => 'required|string|max:255', - 'host' => 'required|string', - 'port' => 'required|numeric|between:1,65535', - 'username' => 'required|string|max:32', - 'password' => 'nullable|string', - 'node_id' => 'sometimes|nullable|integer|exists:nodes,id', + 'name' => ['required', 'string', 'max:255'], + 'host' => ['required', 'string'], + 'port' => ['required', 'numeric', 'between:1,65535'], + 'username' => ['required', 'string', 'max:32'], + 'password' => ['nullable', 'string'], + 'node_ids' => ['nullable', 'array'], + 'node_ids.*' => ['required', 'integer', 'exists:nodes,id'], ]; protected function casts(): array @@ -59,24 +68,15 @@ protected function casts(): array return [ 'id' => 'integer', 'max_databases' => 'integer', - 'node_id' => 'integer', 'password' => 'encrypted', 'created_at' => 'immutable_datetime', 'updated_at' => 'immutable_datetime', ]; } - public function getRouteKeyName(): string + public function nodes(): BelongsToMany { - return 'id'; - } - - /** - * Gets the node associated with a database host. - */ - public function node(): BelongsTo - { - return $this->belongsTo(Node::class); + return $this->belongsToMany(Node::class); } /** @@ -86,4 +86,21 @@ public function databases(): HasMany { return $this->hasMany(Database::class); } + + public function buildConnection(string $database = 'mysql', string $charset = 'utf8', string $collation = 'utf8_unicode_ci'): Connection + { + /** @var Connection $connection */ + $connection = DB::build([ + 'driver' => 'mysql', + 'host' => $this->host, + 'port' => $this->port, + 'database' => $database, + 'username' => $this->username, + 'password' => $this->password, + 'charset' => $charset, + 'collation' => $collation, + ]); + + return $connection; + } } diff --git a/app/Models/Egg.php b/app/Models/Egg.php index e8c672064f..adc0c7e30f 100644 --- a/app/Models/Egg.php +++ b/app/Models/Egg.php @@ -2,10 +2,18 @@ namespace App\Models; +use App\Contracts\Validatable; use App\Exceptions\Service\Egg\HasChildrenException; use App\Exceptions\Service\HasActiveServersException; -use Illuminate\Database\Eloquent\Relations\HasMany; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\MorphToMany; +use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; /** @@ -14,25 +22,25 @@ * @property string $author * @property string $name * @property string|null $description - * @property array|null $features - * @property string $docker_image -- deprecated, use $docker_images + * @property string|null $image + * @property string[]|null $features * @property array $docker_images * @property string|null $update_url * @property bool $force_outgoing_ip - * @property array|null $file_denylist + * @property string[]|null $file_denylist * @property string|null $config_files * @property string|null $config_startup * @property string|null $config_logs * @property string|null $config_stop * @property int|null $config_from - * @property string|null $startup + * @property array $startup_commands * @property bool $script_is_privileged * @property string|null $script_install * @property string $script_entry * @property string $script_container * @property int|null $copy_script_from - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at + * @property Carbon $created_at + * @property Carbon $updated_at * @property string|null $copy_script_install * @property string $copy_script_entry * @property string $copy_script_container @@ -41,41 +49,46 @@ * @property string|null $inherit_config_logs * @property string|null $inherit_config_stop * @property string $inherit_file_denylist - * @property array|null $inherit_features - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Server[] $servers - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\EggVariable[] $variables + * @property string[]|null $inherit_features + * @property string[] $tags + * @property Collection|Server[] $servers + * @property int|null $servers_count + * @property Collection|EggVariable[] $variables + * @property int|null $variables_count * @property \App\Models\Egg|null $scriptFrom * @property \App\Models\Egg|null $configFrom */ -class Egg extends Model +class Egg extends Model implements Validatable { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an - * API representation using fractal. + * API representation using fractal. Also used as name for api key permissions. */ public const RESOURCE_NAME = 'egg'; /** * Defines the current egg export version. */ - public const EXPORT_VERSION = 'PTDL_v2'; + public const EXPORT_VERSION = 'PLCN_v3'; /** - * Different features that can be enabled on any given egg. These are used internally - * to determine which types of frontend functionality should be shown to the user. Eggs - * will automatically inherit features from a parent egg if they are already configured - * to copy configuration values from said egg. - * - * To skip copying the features, an empty array value should be passed in ("[]") rather - * than leaving it null. + * Path to store egg icons relative to storage path. */ - public const FEATURE_EULA_POPUP = 'eula'; - public const FEATURE_FASTDL = 'fastdl'; + public const ICON_STORAGE_PATH = 'icons/egg'; /** - * The table associated with the model. + * Supported image formats: file extension => MIME type */ - protected $table = 'eggs'; + public const IMAGE_FORMATS = [ + 'png' => 'image/png', + 'jpg' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'webp' => 'image/webp', + 'svg' => 'image/svg+xml', + ]; /** * Fields that are not mass assignable. @@ -94,7 +107,7 @@ class Egg extends Model 'config_logs', 'config_stop', 'config_from', - 'startup', + 'startup_commands', 'update_url', 'script_is_privileged', 'script_install', @@ -104,24 +117,27 @@ class Egg extends Model 'tags', ]; + /** @var array */ public static array $validationRules = [ - 'uuid' => 'required|string|size:36', - 'name' => 'required|string|max:255', - 'description' => 'string|nullable', - 'features' => 'array|nullable', - 'author' => 'required|string|email', - 'file_denylist' => 'array|nullable', - 'file_denylist.*' => 'string', - 'docker_images' => 'required|array|min:1', - 'docker_images.*' => 'required|string', - 'startup' => 'required|nullable|string', - 'config_from' => 'sometimes|bail|nullable|numeric|exists:eggs,id', - 'config_stop' => 'required_without:config_from|nullable|string|max:255', - 'config_startup' => 'required_without:config_from|nullable|json', - 'config_logs' => 'required_without:config_from|nullable|json', - 'config_files' => 'required_without:config_from|nullable|json', - 'update_url' => 'sometimes|nullable|string', - 'force_outgoing_ip' => 'sometimes|boolean', + 'uuid' => ['required', 'string', 'size:36'], + 'name' => ['required', 'string', 'max:255'], + 'description' => ['string', 'nullable'], + 'features' => ['array', 'nullable'], + 'author' => ['required', 'string', 'email'], + 'file_denylist' => ['array', 'nullable'], + 'file_denylist.*' => ['string'], + 'docker_images' => ['required', 'array', 'min:1'], + 'docker_images.*' => ['required', 'string'], + 'startup_commands' => ['required', 'array', 'min:1'], + 'startup_commands.*' => ['required', 'string', 'distinct'], + 'config_from' => ['sometimes', 'bail', 'nullable', 'numeric', 'exists:eggs,id'], + 'config_stop' => ['required_without:config_from', 'nullable', 'string', 'max:255'], + 'config_startup' => ['required_without:config_from', 'nullable', 'json'], + 'config_logs' => ['required_without:config_from', 'nullable', 'json'], + 'config_files' => ['required_without:config_from', 'nullable', 'json'], + 'update_url' => ['sometimes', 'nullable', 'string'], + 'force_outgoing_ip' => ['sometimes', 'boolean'], + 'tags' => ['array'], ]; protected $attributes = [ @@ -145,6 +161,7 @@ protected function casts(): array 'features' => 'array', 'docker_images' => 'array', 'file_denylist' => 'array', + 'startup_commands' => 'array', 'tags' => 'array', ]; } @@ -164,11 +181,6 @@ protected static function booted(): void }); } - public function getRouteKeyName(): string - { - return 'id'; - } - /** * Returns the install script for the egg; if egg is copying from another * it will return the copied script. @@ -259,6 +271,8 @@ public function getInheritConfigStopAttribute(): ?string /** * Returns the features available to this egg from the parent configuration if there are * no features defined for this egg specifically and there is a parent egg configured. + * + * @return ?string[] */ public function getInheritFeaturesAttribute(): ?array { @@ -272,6 +286,8 @@ public function getInheritFeaturesAttribute(): ?array /** * Returns the features available to this egg from the parent configuration if there are * no features defined for this egg specifically and there is a parent egg configured. + * + * @return ?string[] */ public function getInheritFileDenylistAttribute(): ?array { @@ -282,6 +298,11 @@ public function getInheritFileDenylistAttribute(): ?array return $this->configFrom->file_denylist; } + public function mounts(): MorphToMany + { + return $this->morphToMany(Mount::class, 'mountable'); + } + /** * Gets all servers associated with this egg. */ @@ -323,4 +344,16 @@ public function getKebabName(): string { return str($this->name)->kebab()->lower()->trim()->split('/[^\w\-]/')->join(''); } + + public function getImageAttribute(): ?string + { + foreach (array_keys(static::IMAGE_FORMATS) as $ext) { + $path = static::ICON_STORAGE_PATH . "/$this->uuid.$ext"; + if (Storage::disk('public')->exists($path)) { + return Storage::disk('public')->url($path); + } + } + + return null; + } } diff --git a/app/Models/EggMount.php b/app/Models/EggMount.php deleted file mode 100644 index f28363bcd5..0000000000 --- a/app/Models/EggMount.php +++ /dev/null @@ -1,12 +0,0 @@ - */ public static array $validationRules = [ - 'egg_id' => 'exists:eggs,id', - 'sort' => 'nullable', - 'name' => 'required|string|between:1,255', - 'description' => 'string', - 'env_variable' => 'required|alphaDash|between:1,255|notIn:' . self::RESERVED_ENV_NAMES, - 'default_value' => 'string', - 'user_viewable' => 'boolean', - 'user_editable' => 'boolean', - 'rules' => 'array', - 'rules.*' => 'string', + 'egg_id' => ['exists:eggs,id'], + 'sort' => ['nullable'], + 'name' => ['required', 'string', 'between:1,255'], + 'description' => ['string'], + 'default_value' => ['string'], + 'user_viewable' => ['boolean'], + 'user_editable' => ['boolean'], + 'rules' => ['array'], + 'rules.*' => ['string'], ]; + /** + * Implement language verification by overriding Eloquence's gather rules function. + * + * @return array + */ + public static function getRules(): array + { + $rules = self::getValidationRules(); + + $rules['env_variable'] = ['required', 'alphaDash', 'between:1,255', 'notIn:' . implode(',', EggVariable::RESERVED_ENV_NAMES)]; + + return $rules; + } + protected $attributes = [ 'user_editable' => 0, 'user_viewable' => 0, diff --git a/app/Models/File.php b/app/Models/File.php new file mode 100644 index 0000000000..2e3170eb9f --- /dev/null +++ b/app/Models/File.php @@ -0,0 +1,244 @@ +> */ + protected static array $customSpecialFiles = []; + + public static function registerSpecialFile(string $fileName, string|Closure $bannerTitle, string|Closure|null $bannerBody = null, ?Closure $nameCheck = null): void + { + static::$customSpecialFiles[$fileName] = [ + 'title' => $bannerTitle, + 'body' => $bannerBody, + 'check' => $nameCheck ?? fn (string $path) => str($path)->endsWith($fileName), + ]; + } + + /** @return array> */ + public static function getSpecialFiles(): array + { + $specialFiles = [ + '.pelicanignore' => [ + 'title' => fn () => trans('server/file.alerts.pelicanignore.title'), + 'body' => fn () => trans('server/file.alerts.pelicanignore.body'), + 'check' => fn (string $path) => str($path)->endsWith('.pelicanignore'), + ], + ]; + + return array_merge($specialFiles, static::$customSpecialFiles); + } + + public static function get(Server $server, string $path = '/', ?string $searchTerm = null): Builder + { + self::$server = $server; + self::$path = $path; + self::$searchTerm = $searchTerm; + + return self::query(); + } + + public function isArchive(): bool + { + return $this->is_file && in_array($this->mime_type, self::ARCHIVE_MIMES); + } + + public function isImage(): bool + { + return preg_match('/^image\/(?!svg\+xml)/', $this->mime_type); + } + + public function getIcon(): BackedEnum + { + if ($this->is_directory) { + return TablerIcon::Folder; + } + + if ($this->isArchive()) { + return TablerIcon::FileZip; + } + + if ($this->isImage()) { + return TablerIcon::Photo; + } + + return $this->is_symlink ? TablerIcon::FileSymlink : TablerIcon::File; + } + + public function canEdit(): bool + { + if ($this->is_directory || $this->isArchive() || $this->is_symlink || $this->isImage()) { + return false; + } + + return $this->is_file && !in_array($this->mime_type, ['application/java-archive', 'application/octet-stream', 'inode/directory']); + } + + public function server(): Server + { + return self::$server; + } + + protected function casts(): array + { + return [ + 'created_at' => 'datetime', + 'modified_at' => 'datetime', + ]; + } + + /** + * @return string[] + */ + public function getSchema(): array + { + return [ + 'name' => 'string', + 'created_at' => 'string', + 'modified_at' => 'string', + 'mode' => 'string', + 'mode_bits' => 'integer', + 'size' => 'integer', + 'is_directory' => 'boolean', + 'is_file' => 'boolean', + 'is_symlink' => 'boolean', + 'mime_type' => 'string', + ]; + } + + /** + * @return array + */ + public function getRows(): array + { + if (!isset(self::$server)) { + return []; + } + + try { + $fileRepository = (new DaemonFileRepository())->setServer(self::$server); + + if (!is_null(self::$searchTerm)) { + $contents = cache()->remember('file_search_' . self::$path . '_' . self::$searchTerm, now()->addMinute(), fn () => $fileRepository->search(self::$searchTerm, self::$path)); + } else { + $contents = $fileRepository->getDirectory(self::$path ?? '/'); + } + + if (isset($contents['error'])) { + throw new Exception($contents['error']); + } + + $rows = array_map(function ($file) { + return [ + 'name' => $file['name'], + 'created_at' => Carbon::parse($file['created'])->timezone('UTC'), + 'modified_at' => Carbon::parse($file['modified'])->timezone('UTC'), + 'mode' => $file['mode'], + 'mode_bits' => (int) $file['mode_bits'], + 'size' => (int) $file['size'], + 'is_directory' => $file['directory'], + 'is_file' => $file['file'], + 'is_symlink' => $file['symlink'], + 'mime_type' => $file['file'] && str($file['name'])->lower()->endsWith('.jar') && in_array($file['mime'], self::ARCHIVE_MIMES) ? 'application/java-archive' : $file['mime'], + ]; + }, $contents); + + $rowCount = count($rows); + $limit = 999; + if ($rowCount > $limit) { + $this->sushiInsertChunkSize = min(floor($limit / count($this->getSchema())), $rowCount); + } + + return $rows; + } catch (Exception $exception) { + report($exception); + + $message = str($exception->getMessage()); + if ($message->startsWith('cURL error 7: ')) { + $message = $message->after('cURL error 7: ')->before(' after '); + } + + if ($exception instanceof ConnectionException) { + $message = str('Node connection failed'); + } + + AlertBanner::make('files_node_error') + ->title(trans('server/file.alerts.files_node_error.title')) + ->body($message->toString()) + ->danger() + ->send(); + + return []; + } + } + + protected function sushiShouldCache(): bool + { + return false; + } +} diff --git a/app/Models/Filters/AdminServerFilter.php b/app/Models/Filters/AdminServerFilter.php deleted file mode 100644 index d3c1eea606..0000000000 --- a/app/Models/Filters/AdminServerFilter.php +++ /dev/null @@ -1,35 +0,0 @@ -getQuery()->from !== 'servers') { - throw new \BadMethodCallException('Cannot use the AdminServerFilter against a non-server model.'); - } - $query - ->select('servers.*') - ->leftJoin('users', 'users.id', '=', 'servers.owner_id') - ->where(function (Builder $builder) use ($value) { - $builder->where('servers.uuid', $value) - ->orWhere('servers.uuid', 'LIKE', "$value%") - ->orWhere('servers.uuid_short', $value) - ->orWhere('servers.external_id', $value) - ->orWhereRaw('LOWER(users.username) LIKE ?', ["%$value%"]) - ->orWhereRaw('LOWER(users.email) LIKE ?', ["$value%"]) - ->orWhereRaw('LOWER(servers.name) LIKE ?', ["%$value%"]); - }) - ->groupBy('servers.id'); - } -} diff --git a/app/Models/Filters/MultiFieldServerFilter.php b/app/Models/Filters/MultiFieldServerFilter.php index da3f91f6d5..33d7eb58df 100644 --- a/app/Models/Filters/MultiFieldServerFilter.php +++ b/app/Models/Filters/MultiFieldServerFilter.php @@ -2,10 +2,15 @@ namespace App\Models\Filters; +use BadMethodCallException; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; use Spatie\QueryBuilder\Filters\Filter; -use Illuminate\Database\Eloquent\Builder; +/** + * @template-implements Filter + */ class MultiFieldServerFilter implements Filter { /** @@ -19,12 +24,12 @@ class MultiFieldServerFilter implements Filter * search across multiple columns. This allows us to provide a very generic search ability for * the frontend. * - * @param string $value + * @param string $value */ - public function __invoke(Builder $query, $value, string $property) + public function __invoke(Builder $query, $value, string $property): void { if ($query->getQuery()->from !== 'servers') { - throw new \BadMethodCallException('Cannot use the MultiFieldServerFilter against a non-server model.'); + throw new BadMethodCallException('Cannot use the MultiFieldServerFilter against a non-server model.'); } if (preg_match(self::IPV4_REGEX, $value) || preg_match('/^:\d{1,5}$/', $value)) { diff --git a/app/Models/Model.php b/app/Models/Model.php deleted file mode 100644 index 536edf9b57..0000000000 --- a/app/Models/Model.php +++ /dev/null @@ -1,191 +0,0 @@ -make(ValidationFactory::class); - - static::saving(function (Model $model) { - try { - $model->validate(); - } catch (ValidationException $exception) { - throw new DataValidationException($exception->validator, $model); - } - - return true; - }); - } - - /** - * Returns the model key to use for route model binding. By default, we'll - * assume every model uses a UUID field for this. If the model does not have - * a UUID and is using a different key it should be specified on the model - * itself. - * - * You may also optionally override this on a per-route basis by declaring - * the key name in the URL definition, like "{user:id}". - */ - public function getRouteKeyName(): string - { - return 'uuid'; - } - - protected function asDateTime($value) - { - $timezone = auth()->user()?->timezone ?? config('app.timezone', 'UTC'); - - if ($value instanceof CarbonInterface) { - return Date::instance($value->timezone($timezone)); - } - - if ($value instanceof DateTimeInterface) { - return Date::parse($value->format('Y-m-d H:i:s.u'), $timezone); - } - - if (is_numeric($value)) { - return Date::createFromTimestamp($value, $timezone); - } - - if ($this->isStandardDateFormat($value)) { - return Date::instance(Carbon::createFromFormat('Y-m-d', $value)->timezone($timezone)->startOfDay()); - } - - $format = $this->getDateFormat(); - try { - $date = Date::createFromFormat($format, $value)->timezone($timezone); - } catch (InvalidArgumentException) { - $date = false; - } - - return $date ?: Date::parse($value); - } - - /** - * Returns the validator instance used by this model. - */ - public function getValidator(): Validator - { - $rules = $this->exists ? static::getRulesForUpdate($this) : static::getRules(); - - return static::$validatorFactory->make([], $rules); - } - - /** - * Returns the rules associated with this model. - */ - public static function getRules(): array - { - $rules = static::$validationRules; - foreach ($rules as &$rule) { - $rule = is_array($rule) ? $rule : explode('|', $rule); - } - - return $rules; - } - - /** - * Returns the rules for a specific field. If the field is not found an empty - * array is returned. - */ - public static function getRulesForField(string $field): array - { - return Arr::get(static::getRules(), $field) ?? []; - } - - /** - * Returns the rules associated with the model, specifically for updating the given model - * rather than just creating it. - */ - public static function getRulesForUpdate($model, string $column = 'id'): array - { - if ($model instanceof Model) { - [$id, $column] = [$model->getKey(), $model->getKeyName()]; - } - - $rules = static::getRules(); - foreach ($rules as $key => &$data) { - // For each rule in a given field, iterate over it and confirm if the rule - // is one for a unique field. If that is the case, append the ID of the current - // working model, so we don't run into errors due to the way that field validation - // works. - foreach ($data as &$datum) { - if (!is_string($datum) || !Str::startsWith($datum, 'unique')) { - continue; - } - - [, $args] = explode(':', $datum); - $args = explode(',', $args); - - $datum = Rule::unique($args[0], $args[1] ?? $key)->ignore($id ?? $model, $column); - } - } - - return $rules; - } - - /** - * Determines if the model is in a valid state or not. - * - * @throws \Illuminate\Validation\ValidationException - */ - public function validate(): void - { - if ($this->skipValidation) { - return; - } - - $validator = $this->getValidator(); - $validator->setData( - // Trying to do self::toArray() here will leave out keys based on the whitelist/blacklist - // for that model. Doing this will return all the attributes in a format that can - // properly be validated. - $this->addCastAttributesToArray( - $this->getAttributes(), - $this->getMutatedAttributes() - ) - ); - - if (!$validator->passes()) { - throw new ValidationException($validator); - } - } -} diff --git a/app/Models/Mount.php b/app/Models/Mount.php index 2236038059..52319e91ed 100644 --- a/app/Models/Mount.php +++ b/app/Models/Mount.php @@ -2,8 +2,11 @@ namespace App\Models; -use Illuminate\Validation\Rules\NotIn; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use App\Contracts\Validatable; +use App\Traits\HasValidation; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\MorphToMany; /** * @property int $id @@ -14,50 +17,51 @@ * @property string $target * @property bool $read_only * @property bool $user_mountable - * @property \App\Models\Egg[]|\Illuminate\Database\Eloquent\Collection $eggs - * @property \App\Models\Node[]|\Illuminate\Database\Eloquent\Collection $nodes - * @property \App\Models\Server[]|\Illuminate\Database\Eloquent\Collection $servers + * @property Egg[]|Collection $eggs + * @property Node[]|Collection $nodes + * @property Server[]|Collection $servers */ -class Mount extends Model +class Mount extends Model implements Validatable { + use HasValidation { getRules as getValidationRules; } + /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'mount'; - /** - * The table associated with the model. - */ - protected $table = 'mounts'; - /** * Fields that are not mass assignable. + * + * @var string[] */ protected $guarded = ['id']; /** * Rules verifying that the data being stored matches the expectations of the database. + * + * @var array */ public static array $validationRules = [ - 'name' => 'required|string|min:2|max:64|unique:mounts,name', - 'description' => 'nullable|string|max:255', - 'source' => 'required|string', - 'target' => 'required|string', - 'read_only' => 'sometimes|boolean', - 'user_mountable' => 'sometimes|boolean', + 'name' => ['required', 'string', 'min:2', 'max:64', 'unique:mounts,name'], + 'description' => ['nullable', 'string', 'max:255'], + 'source' => ['required', 'string'], + 'target' => ['required', 'string'], + 'read_only' => ['sometimes', 'boolean'], + 'user_mountable' => ['sometimes', 'boolean'], ]; /** - * Implement language verification by overriding Eloquence's gather - * rules function. + * Implement language verification by overriding Eloquence's gather rules function. + * + * @return array */ public static function getRules(): array { - $rules = parent::getRules(); - - $rules['source'][] = new NotIn(Mount::$invalidSourcePaths); - $rules['target'][] = new NotIn(Mount::$invalidTargetPaths); + $rules = self::getValidationRules(); + $rules['source'][] = 'not_in:' . implode(',', Mount::$invalidSourcePaths); + $rules['target'][] = 'not_in:' . implode(',', Mount::$invalidTargetPaths); return $rules; } @@ -69,8 +73,10 @@ public static function getRules(): array /** * Blacklisted source paths. + * + * @var string[] */ - public static $invalidSourcePaths = [ + public static array $invalidSourcePaths = [ '/etc/pelican', '/var/lib/pelican/volumes', '/srv/daemon-data', @@ -78,8 +84,10 @@ public static function getRules(): array /** * Blacklisted target paths. + * + * @var string[] */ - public static $invalidTargetPaths = [ + public static array $invalidTargetPaths = [ '/home/container', ]; @@ -95,29 +103,24 @@ protected function casts(): array /** * Returns all eggs that have this mount assigned. */ - public function eggs(): BelongsToMany + public function eggs(): MorphToMany { - return $this->belongsToMany(Egg::class); + return $this->morphedByMany(Egg::class, 'mountable'); } /** * Returns all nodes that have this mount assigned. */ - public function nodes(): BelongsToMany + public function nodes(): MorphToMany { - return $this->belongsToMany(Node::class); + return $this->morphedByMany(Node::class, 'mountable'); } /** * Returns all servers that have this mount assigned. */ - public function servers(): BelongsToMany - { - return $this->belongsToMany(Server::class); - } - - public function getRouteKeyName(): string + public function servers(): MorphToMany { - return 'id'; + return $this->morphedByMany(Server::class, 'mountable'); } } diff --git a/app/Models/MountNode.php b/app/Models/MountNode.php deleted file mode 100644 index 9c011a3b95..0000000000 --- a/app/Models/MountNode.php +++ /dev/null @@ -1,14 +0,0 @@ - */ public static array $validationRules = [ - 'name' => 'required|string|min:1|max:100', - 'description' => 'string|nullable', - 'public' => 'boolean', - 'fqdn' => 'required|string', - 'scheme' => 'required|string|in:http,https', - 'behind_proxy' => 'boolean', - 'memory' => 'required|numeric|min:0', - 'memory_overallocate' => 'required|numeric|min:-1', - 'disk' => 'required|numeric|min:0', - 'disk_overallocate' => 'required|numeric|min:-1', - 'cpu' => 'required|numeric|min:0', - 'cpu_overallocate' => 'required|numeric|min:-1', - 'daemon_base' => 'sometimes|required|regex:/^([\/][\d\w.\-\/]+)$/', - 'daemon_sftp' => 'required|numeric|between:1,65535', - 'daemon_sftp_alias' => 'nullable|string', - 'daemon_listen' => 'required|numeric|between:1,65535', - 'maintenance_mode' => 'boolean', - 'upload_size' => 'int|between:1,1024', + 'name' => ['required', 'string', 'min:1', 'max:100'], + 'description' => ['string', 'nullable'], + 'public' => ['boolean'], + 'fqdn' => ['required', 'string', 'notIn:0.0.0.0,127.0.0.1,localhost'], + 'scheme' => ['required', 'string', 'in:http,https'], + 'behind_proxy' => ['boolean'], + 'memory' => ['required', 'numeric', 'min:0'], + 'memory_overallocate' => ['required', 'numeric', 'min:-1'], + 'disk' => ['required', 'numeric', 'min:0'], + 'disk_overallocate' => ['required', 'numeric', 'min:-1'], + 'cpu' => ['required', 'numeric', 'min:0'], + 'cpu_overallocate' => ['required', 'numeric', 'min:-1'], + 'daemon_base' => ['sometimes', 'required', 'regex:/^([\/][\d\w.\-\/]+)$/'], + 'daemon_sftp' => ['required', 'numeric', 'between:1,65535'], + 'daemon_sftp_alias' => ['nullable', 'string'], + 'daemon_listen' => ['required', 'numeric', 'between:1,65535'], + 'daemon_connect' => ['required', 'numeric', 'between:1,65535'], + 'maintenance_mode' => ['boolean'], + 'upload_size' => ['int', 'min:1'], + 'tags' => ['array'], ]; /** @@ -114,6 +129,7 @@ class Node extends Model 'daemon_base' => '/var/lib/pelican/volumes', 'daemon_sftp' => 2022, 'daemon_listen' => 8080, + 'daemon_connect' => 8080, 'maintenance_mode' => false, 'tags' => '[]', ]; @@ -125,6 +141,7 @@ protected function casts(): array 'disk' => 'integer', 'cpu' => 'integer', 'daemon_listen' => 'integer', + 'daemon_connect' => 'integer', 'daemon_sftp' => 'integer', 'daemon_token' => 'encrypted', 'behind_proxy' => 'boolean', @@ -135,13 +152,10 @@ protected function casts(): array } public int $servers_sum_memory = 0; + public int $servers_sum_disk = 0; - public int $servers_sum_cpu = 0; - public function getRouteKeyName(): string - { - return 'id'; - } + public int $servers_sum_cpu = 0; protected static function booted(): void { @@ -163,11 +177,27 @@ protected static function booted(): void */ public function getConnectionAddress(): string { - return "$this->scheme://$this->fqdn:$this->daemon_listen"; + return "$this->scheme://$this->fqdn:$this->daemon_connect"; } /** * Returns the configuration as an array. + * + * @return array{ + * debug: bool, + * uuid: string, + * token_id: string, + * token: string, + * api: array{ + * host: string, + * port: int, + * ssl: array{enabled: bool, cert: string, key: string}, + * upload_limit: int + * }, + * system: array{data: string, sftp: array{bind_port: int}}, + * allowed_mounts: string[], + * remote: string, + * } */ public function getConfiguration(): array { @@ -193,7 +223,7 @@ public function getConfiguration(): array ], ], 'allowed_mounts' => $this->mounts->pluck('source')->toArray(), - 'remote' => route('index'), + 'remote' => config('app.url'), ]; } @@ -218,13 +248,15 @@ public function isUnderMaintenance(): bool return $this->maintenance_mode; } - public function mounts(): HasManyThrough + public function mounts(): MorphToMany { - return $this->hasManyThrough(Mount::class, MountNode::class, 'node_id', 'id', 'id', 'mount_id'); + return $this->morphToMany(Mount::class, 'mountable'); } /** * Gets the servers associated with a node. + * + * @return HasMany */ public function servers(): HasMany { @@ -239,6 +271,19 @@ public function allocations(): HasMany return $this->hasMany(Allocation::class); } + /** + * @return BelongsToMany + */ + public function databaseHosts(): BelongsToMany + { + return $this->belongsToMany(DatabaseHost::class); + } + + public function roles(): HasManyThrough + { + return $this->hasManyThrough(Role::class, NodeRole::class, 'node_id', 'id', 'id', 'role_id'); + } + /** * Returns a boolean if the node is viable for an additional server to be placed on it. */ @@ -268,35 +313,14 @@ public function isViable(int $memory, int $disk, int $cpu): bool return true; } - public static function getForServerCreation() - { - return self::with('allocations')->get()->map(function (Node $item) { - $filtered = $item->getRelation('allocations')->where('server_id', null)->map(function ($map) { - return collect($map)->only(['id', 'ip', 'port']); - }); - - $ports = $filtered->map(function ($map) { - return [ - 'id' => $map['id'], - 'text' => sprintf('%s:%s', $map['ip'], $map['port']), - ]; - })->values(); - - return [ - 'id' => $item->id, - 'text' => $item->name, - 'allocations' => $ports, - ]; - })->values(); - } - + /** @return array */ public function systemInformation(): array { - return once(function () { + return cache()->remember("nodes.$this->id.system_information", now()->addSeconds(360), function () { try { - return resolve(DaemonConfigurationRepository::class) + return (new DaemonSystemRepository()) ->setNode($this) - ->getSystemInformation(connectTimeout: 3); + ->getSystemInformation(); } catch (Exception $exception) { $message = str($exception->getMessage()); @@ -313,24 +337,15 @@ public function systemInformation(): array }); } - public function serverStatuses(): array - { - $statuses = []; - try { - $statuses = Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers')->json() ?? []; - } catch (Exception $exception) { - report($exception); - } - - foreach ($statuses as $status) { - $uuid = fluent($status)->get('configuration.uuid'); - cache()->remember("servers.$uuid.container.status", now()->addMinute(), fn () => fluent($status)->get('state')); - } - - return $statuses; - } - - public function statistics() + /** @return array{ + * memory_total: int, memory_used: int, + * swap_total: int, swap_used: int, + * load_average1: float, load_average5: float, load_average15: float, + * cpu_percent: float, + * disk_total: int, disk_used: int, + * } + */ + public function statistics(): array { $default = [ 'memory_total' => 0, @@ -345,35 +360,47 @@ public function statistics() 'disk_used' => 0, ]; - try { - return Http::daemon($this) - ->connectTimeout(1) - ->timeout(1) - ->get('/api/system/utilization') - ->json() ?? $default; - } catch (Exception) { + return cache()->flexible("nodes.$this->id.statistics", [5, 30], function () use ($default) { + try { + + $data = Http::daemon($this) + ->connectTimeout(1) + ->timeout(1) + ->get('/api/system/utilization') + ->json(); + + if (!empty($data['memory_total'])) { + return $data; + } + } catch (Exception) { + } + return $default; - } + }); } + /** @return string[] */ public function ipAddresses(): array { return cache()->remember("nodes.$this->id.ips", now()->addHour(), function () { $ips = collect(); - if (is_ip($this->fqdn)) { - $ips = $ips->push($this->fqdn); - } elseif ($dnsRecords = gethostbynamel($this->fqdn)) { - $ips = $ips->concat($dnsRecords); - } try { $addresses = Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/system/ips')->json(); $ips = $ips->concat(fluent($addresses)->get('ip_addresses')); } catch (Exception) { - // pass + if (is_ip($this->fqdn)) { + $ips->push($this->fqdn); + } } - return $ips->all(); + $ips = $ips->filter(fn (string $ip) => is_ip($ip)); + + // TODO: remove later + $ips->push('0.0.0.0'); + $ips->push('::'); + + return $ips->unique()->all(); }); } } diff --git a/app/Models/NodeRole.php b/app/Models/NodeRole.php new file mode 100644 index 0000000000..f9fe1e85cb --- /dev/null +++ b/app/Models/NodeRole.php @@ -0,0 +1,12 @@ + */ private array $ports = []; public function isDedicated(): bool @@ -22,11 +24,13 @@ public function setDedicated(bool $dedicated): self return $this; } + /** @return array */ public function getPorts(): array { return $this->ports; } + /** @param array $ports */ public function setPorts(array $ports): self { $this->ports = $ports; @@ -34,16 +38,22 @@ public function setPorts(array $ports): self return $this; } + /** + * @return string[] + */ public function getTags(): array { return $this->tags; } + /** + * @param string[] $tags + * @return $this + */ public function setTags(array $tags): self { $this->tags = $tags; return $this; } - } diff --git a/app/Models/Permission.php b/app/Models/Permission.php deleted file mode 100644 index ab9fef2607..0000000000 --- a/app/Models/Permission.php +++ /dev/null @@ -1,219 +0,0 @@ - 'required|numeric|min:1', - 'permission' => 'required|string', - ]; - - /** - * All the permissions available on the system. You should use self::permissions() - * to retrieve them, and not directly access this array as it is subject to change. - * - * @see \App\Models\Permission::permissions() - */ - protected static array $permissions = [ - 'websocket' => [ - 'description' => 'Allows the user to connect to the server websocket, giving them access to view console output and realtime server stats.', - 'keys' => [ - 'connect' => 'Allows a user to connect to the websocket instance for a server to stream the console.', - ], - ], - - 'control' => [ - 'description' => 'Permissions that control a user\'s ability to control the power state of a server, or send commands.', - 'keys' => [ - 'console' => 'Allows a user to send commands to the server instance via the console.', - 'start' => 'Allows a user to start the server if it is stopped.', - 'stop' => 'Allows a user to stop a server if it is running.', - 'restart' => 'Allows a user to perform a server restart. This allows them to start the server if it is offline, but not put the server in a completely stopped state.', - ], - ], - - 'user' => [ - 'description' => 'Permissions that allow a user to manage other subusers on a server. They will never be able to edit their own account, or assign permissions they do not have themselves.', - 'keys' => [ - 'create' => 'Allows a user to create new subusers for the server.', - 'read' => 'Allows the user to view subusers and their permissions for the server.', - 'update' => 'Allows a user to modify other subusers.', - 'delete' => 'Allows a user to delete a subuser from the server.', - ], - ], - - 'file' => [ - 'description' => 'Permissions that control a user\'s ability to modify the filesystem for this server.', - 'keys' => [ - 'create' => 'Allows a user to create additional files and folders via the Panel or direct upload.', - 'read' => 'Allows a user to view the contents of a directory, but not view the contents of or download files.', - 'read-content' => 'Allows a user to view the contents of a given file. This will also allow the user to download files.', - 'update' => 'Allows a user to update the contents of an existing file or directory.', - 'delete' => 'Allows a user to delete files or directories.', - 'archive' => 'Allows a user to archive the contents of a directory as well as decompress existing archives on the system.', - 'sftp' => 'Allows a user to connect to SFTP and manage server files using the other assigned file permissions.', - ], - ], - - 'backup' => [ - 'description' => 'Permissions that control a user\'s ability to generate and manage server backups.', - 'keys' => [ - 'create' => 'Allows a user to create new backups for this server.', - 'read' => 'Allows a user to view all backups that exist for this server.', - 'delete' => 'Allows a user to remove backups from the system.', - 'download' => 'Allows a user to download a backup for the server. Danger: this allows a user to access all files for the server in the backup.', - 'restore' => 'Allows a user to restore a backup for the server. Danger: this allows the user to delete all of the server files in the process.', - ], - ], - - // Controls permissions for editing or viewing a server's allocations. - 'allocation' => [ - 'description' => 'Permissions that control a user\'s ability to modify the port allocations for this server.', - 'keys' => [ - 'read' => 'Allows a user to view all allocations currently assigned to this server. Users with any level of access to this server can always view the primary allocation.', - 'create' => 'Allows a user to assign additional allocations to the server.', - 'update' => 'Allows a user to change the primary server allocation and attach notes to each allocation.', - 'delete' => 'Allows a user to delete an allocation from the server.', - ], - ], - - // Controls permissions for editing or viewing a server's startup parameters. - 'startup' => [ - 'description' => 'Permissions that control a user\'s ability to view this server\'s startup parameters.', - 'keys' => [ - 'read' => 'Allows a user to view the startup variables for a server.', - 'update' => 'Allows a user to modify the startup variables for the server.', - 'docker-image' => 'Allows a user to modify the Docker image used when running the server.', - ], - ], - - 'database' => [ - 'description' => 'Permissions that control a user\'s access to the database management for this server.', - 'keys' => [ - 'create' => 'Allows a user to create a new database for this server.', - 'read' => 'Allows a user to view the database associated with this server.', - 'update' => 'Allows a user to rotate the password on a database instance. If the user does not have the view_password permission they will not see the updated password.', - 'delete' => 'Allows a user to remove a database instance from this server.', - 'view_password' => 'Allows a user to view the password associated with a database instance for this server.', - ], - ], - - 'schedule' => [ - 'description' => 'Permissions that control a user\'s access to the schedule management for this server.', - 'keys' => [ - 'create' => 'Allows a user to create new schedules for this server.', // task.create-schedule - 'read' => 'Allows a user to view schedules and the tasks associated with them for this server.', // task.view-schedule, task.list-schedules - 'update' => 'Allows a user to update schedules and schedule tasks for this server.', // task.edit-schedule, task.queue-schedule, task.toggle-schedule - 'delete' => 'Allows a user to delete schedules for this server.', // task.delete-schedule - ], - ], - - 'settings' => [ - 'description' => 'Permissions that control a user\'s access to the settings for this server.', - 'keys' => [ - 'rename' => 'Allows a user to rename this server and change the description of it.', - 'reinstall' => 'Allows a user to trigger a reinstall of this server.', - ], - ], - - 'activity' => [ - 'description' => 'Permissions that control a user\'s access to the server activity logs.', - 'keys' => [ - 'read' => 'Allows a user to view the activity logs for the server.', - ], - ], - ]; - - protected function casts(): array - { - return [ - 'subuser_id' => 'integer', - ]; - } - - /** - * Returns all the permissions available on the system for a user to - * have when controlling a server. - */ - public static function permissions(): Collection - { - return Collection::make(self::$permissions); - } -} diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php new file mode 100644 index 0000000000..09a45706e2 --- /dev/null +++ b/app/Models/Plugin.php @@ -0,0 +1,394 @@ + 'string', + 'name' => 'string', + 'author' => 'string', + 'version' => 'string', + 'description' => 'string', + 'category' => 'string', + 'url' => 'string', + 'update_url' => 'string', + 'namespace' => 'string', + 'class' => 'string', + 'panels' => 'string', + 'panel_version' => 'string', + 'composer_packages' => 'string', + 'status' => 'string', + 'status_message' => 'string', + 'load_order' => 'integer', + ]; + } + + /** + * @return array + */ + public function getRows(): array + { + $plugins = []; + + $directories = File::directories(base_path('plugins/')); + foreach ($directories as $directory) { + $plugin = File::basename($directory); + + $path = plugin_path($plugin, 'plugin.json'); + if (!file_exists($path)) { + continue; + } + + try { + $data = File::json($path, JSON_THROW_ON_ERROR); + $data['id'] = Str::lower($data['id']); + + if ($data['id'] !== Str::lower($plugin)) { + throw new PluginIdMismatchException("Plugin id mismatch for folder name ($plugin) and id in plugin.json ({$data['id']})!"); + } + + $panels = null; + if (array_key_exists('panels', $data)) { + $panels = $data['panels']; + $panels = is_array($panels) ? implode(',', $panels) : $panels; + } + + $composerPackages = null; + if (array_key_exists('composer_packages', $data)) { + $composerPackages = $data['composer_packages']; + $composerPackages = is_array($composerPackages) ? json_encode($composerPackages, JSON_THROW_ON_ERROR) : $composerPackages; + } + + $data = [ + 'id' => $data['id'], + 'name' => $data['name'], + 'author' => $data['author'], + 'version' => Arr::get($data, 'version', '1.0.0'), + 'description' => Arr::get($data, 'description', null), + 'category' => $data['category'], + 'url' => Arr::get($data, 'url', null), + 'update_url' => Arr::get($data, 'update_url', null), + 'namespace' => $data['namespace'], + 'class' => $data['class'], + 'panels' => $panels, + 'panel_version' => Arr::get($data, 'panel_version', null), + 'composer_packages' => $composerPackages, + + 'status' => Str::lower(Arr::get($data, 'meta.status', PluginStatus::NotInstalled->value)), + 'status_message' => Arr::get($data, 'meta.status_message', null), + 'load_order' => Arr::integer($data, 'meta.load_order', 0), + ]; + + $plugins[] = $data; + } catch (Exception $exception) { + if (config('panel.plugin.dev_mode', false)) { + throw ($exception); + } + + report($exception); + + if (!$exception instanceof JsonException) { + $plugins[] = [ + 'id' => $exception instanceof PluginIdMismatchException ? $plugin : ($data['id'] ?? Str::uuid()), + 'name' => $data['name'] ?? Str::headline($plugin), + 'author' => $data['author'] ?? 'Unknown', + 'version' => $data['version'] ?? '0.0.0', + 'description' => $exception instanceof PluginIdMismatchException ? $exception->getMessage() : 'Plugin.json is invalid!', + 'category' => PluginCategory::Plugin->value, + 'url' => $data['url'] ?? null, + 'update_url' => null, + 'namespace' => 'Error', + 'class' => 'Error', + 'panels' => null, + 'panel_version' => null, + 'composer_packages' => null, + + 'status' => PluginStatus::Errored->value, + 'status_message' => $exception->getMessage(), + 'load_order' => 0, + ]; + } + } + } + + return $plugins; + } + + protected function casts(): array + { + return [ + 'status' => PluginStatus::class, + 'category' => PluginCategory::class, + ]; + } + + public function fullClass(): string + { + return '\\' . $this->namespace . '\\' . $this->class; + } + + public function shouldLoad(?string $panelId = null): bool + { + return $this->fullClass() !== '\\Error\\Error' && ($this->status === PluginStatus::Enabled || $this->status === PluginStatus::Errored) && (is_null($panelId) || !$this->panels || in_array($panelId, explode(',', $this->panels))); + } + + public function canEnable(): bool + { + return $this->status === PluginStatus::Disabled && $this->isCompatible(); + } + + public function canDisable(): bool + { + return $this->status === PluginStatus::Enabled || $this->status === PluginStatus::Incompatible; + } + + public function isCompatible(): bool + { + $currentPanelVersion = config('app.version', 'canary'); + + return !$this->panel_version || $currentPanelVersion === 'canary' || version_compare($currentPanelVersion, str($this->panel_version)->trim('^'), $this->isPanelVersionStrict() ? '=' : '>='); + } + + public function isPanelVersionStrict(): bool + { + if (!$this->panel_version) { + return false; + } + + return !str($this->panel_version)->startsWith('^'); + } + + public function isTheme(): bool + { + return $this->category === PluginCategory::Theme; + } + + public function isLanguage(): bool + { + return $this->category === PluginCategory::Language; + } + + /** @return null|array */ + private function getUpdateData(): ?array + { + if (!$this->update_url) { + return null; + } + + return cache()->remember("plugins.$this->id.update", now()->addMinutes(10), function () { + try { + $data = Http::timeout(5)->connectTimeout(1)->get($this->update_url)->throw()->json(); + + // Support update jsons that cover multiple plugins + if (array_key_exists($this->id, $data)) { + $data = $data[$this->id]; + } + + return $data; + } catch (Exception $exception) { + report($exception); + } + + return null; + }); + } + + public function isUpdateAvailable(): bool + { + $panelVersion = config('app.version', 'canary'); + + if ($panelVersion === 'canary') { + return false; + } + + $updateData = $this->getUpdateData(); + if ($updateData) { + if (array_key_exists($panelVersion, $updateData)) { + return version_compare($updateData[$panelVersion]['version'], $this->version, '>'); + } + + if (array_key_exists('*', $updateData)) { + return version_compare($updateData['*']['version'], $this->version, '>'); + } + } + + return false; + } + + public function getDownloadUrlForUpdate(): ?string + { + $panelVersion = config('app.version', 'canary'); + + if ($panelVersion === 'canary') { + return null; + } + + $updateData = $this->getUpdateData(); + if ($updateData) { + if (array_key_exists($panelVersion, $updateData)) { + return $updateData[$panelVersion]['download_url']; + } + + if (array_key_exists('*', $updateData)) { + return $updateData['*']['download_url']; + } + } + + return null; + } + + public function hasSettings(): bool + { + try { + $pluginObject = new ($this->fullClass()); + + return $pluginObject instanceof HasPluginSettings; + } catch (Exception) { + } + + return false; + } + + /** @return Component[] */ + public function getSettingsForm(): array + { + try { + $pluginObject = new ($this->fullClass()); + + if ($pluginObject instanceof HasPluginSettings) { + return $pluginObject->getSettingsForm(); + } + } catch (Exception) { + } + + return []; + } + + /** @param array $data */ + public function saveSettings(array $data): void + { + try { + $pluginObject = new ($this->fullClass()); + + if ($pluginObject instanceof HasPluginSettings) { + $pluginObject->saveSettings($data); + } + } catch (Exception) { + } + } + + /** @return string[] */ + public function getProviders(): array + { + $path = plugin_path($this->id, 'src', 'Providers'); + + if (File::missing($path)) { + return []; + } + + return array_map(fn ($provider) => $this->namespace . '\\Providers\\' . str($provider->getRelativePathname())->remove('.php', false), File::allFiles($path)); + } + + /** @return string[] */ + public function getCommands(): array + { + $path = plugin_path($this->id, 'src', 'Console', 'Commands'); + + if (File::missing($path)) { + return []; + } + + return array_map(fn ($provider) => $this->namespace . '\\Console\\Commands\\' . str($provider->getRelativePathname())->remove('.php', false), File::allFiles($path)); + } + + public function getSeeder(): ?string + { + $name = Str::studly($this->name); + $seeder = "\Database\Seeders\\{$name}Seeder"; + + return class_exists($seeder) ? $seeder : null; + } + + public function getReadme(): ?string + { + return cache()->remember("plugins.$this->id.readme", now()->addMinutes(5), function () { + $path = plugin_path($this->id, 'README.md'); + + if (File::missing($path)) { + return null; + } + + return File::get($path); + }); + } +} diff --git a/app/Models/RecoveryToken.php b/app/Models/RecoveryToken.php deleted file mode 100644 index c4fe8c8ae1..0000000000 --- a/app/Models/RecoveryToken.php +++ /dev/null @@ -1,35 +0,0 @@ - 'required|string', - ]; - - protected $casts = [ - 'created_at' => 'immutable_datetime', - ]; - - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } -} diff --git a/app/Models/Role.php b/app/Models/Role.php index 1274b2d6c3..00afe267cf 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -2,23 +2,37 @@ namespace App\Models; +use App\Enums\RolePermissionModels; +use App\Enums\RolePermissionPrefixes; +use App\Enums\TablerIcon; +use BackedEnum; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role as BaseRole; /** * @property int $id * @property string $name * @property string $guard_name - * @property \Illuminate\Database\Eloquent\Collection|\Spatie\Permission\Models\Permission[] $permissions + * @property Collection|Permission[] $permissions * @property int|null $permissions_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\User[] $users + * @property Collection|User[] $users * @property int|null $users_count + * @property Collection|Node[] $nodes + * @property int|null $nodes_count */ class Role extends BaseRole { + use HasFactory; + public const RESOURCE_NAME = 'role'; public const ROOT_ADMIN = 'Root Admin'; + public const DEFAULT_GUARD_NAME = 'web'; + public const MODEL_SPECIFIC_PERMISSIONS = [ 'egg' => [ 'import', @@ -31,8 +45,132 @@ class Role extends BaseRole 'view', 'update', ], + 'health' => [ + 'view', + ], + 'activityLog' => [ + 'seeIps', + ], + 'panelLog' => [ + 'view', + ], + 'plugin' => [ + 'viewList', + 'create', + 'update', + 'delete', + ], ]; + public const MODEL_ICONS = [ + 'health' => TablerIcon::Heart, + 'activityLog' => TablerIcon::Stack, + 'panelLog' => TablerIcon::FileInfo, + ]; + + /** @var array> */ + protected static array $customPermissions = []; + + /** @param array> $customPermissions */ + public static function registerCustomPermissions(array $customPermissions): void + { + static::$customPermissions = [ + ...static::$customPermissions, + ...$customPermissions, + ]; + } + + public static function registerCustomDefaultPermissions(string $model): void + { + $permissions = []; + + foreach (RolePermissionPrefixes::cases() as $prefix) { + $permissions[] = $prefix->value; + } + + static::registerCustomPermissions([ + $model => $permissions, + ]); + } + + /** @var array */ + protected static array $customModelIcons = []; + + public static function registerCustomModelIcon(string $model, string|BackedEnum $icon): void + { + static::$customModelIcons[$model] = $icon; + } + + /** @return array> */ + public static function getPermissionList(): array + { + $allPermissions = []; + + // Standard permissions for our default model + foreach (RolePermissionModels::cases() as $model) { + $allPermissions[$model->value] ??= []; + + foreach (RolePermissionPrefixes::cases() as $prefix) { + array_push($allPermissions[$model->value], $prefix->value); + } + + if (array_key_exists($model->value, Role::MODEL_SPECIFIC_PERMISSIONS)) { + foreach (static::MODEL_SPECIFIC_PERMISSIONS[$model->value] as $permission) { + array_push($allPermissions[$model->value], $permission); + } + } + } + + // Special permissions for our default models + foreach (static::SPECIAL_PERMISSIONS as $model => $prefixes) { + $allPermissions[$model] ??= []; + + foreach ($prefixes as $prefix) { + array_push($allPermissions[$model], $prefix); + } + } + + // Custom third party permissions + foreach (static::$customPermissions as $model => $prefixes) { + $allPermissions[$model] ??= []; + + foreach ($prefixes as $prefix) { + array_push($allPermissions[$model], $prefix); + } + } + + foreach ($allPermissions as $model => $permissions) { + $allPermissions[$model] = array_unique($permissions); + } + + return $allPermissions; + } + + public static function getModelIcon(string $model): null|string|BackedEnum + { + $customModels = array_merge(static::MODEL_ICONS, static::$customModelIcons); + + if (array_key_exists($model, $customModels)) { + return $customModels[$model]; + } + + $model = ucwords($model); + + if (class_exists($class = '\\App\\Filament\\Admin\\Resources\\' . $model . 's\\' . $model . 'Resource')) { + return $class::getNavigationIcon(); + } + + if (class_exists($class = '\\App\\Filament\\Admin\\Pages\\' . $model)) { + return $class::getNavigationIcon(); + } + + if (class_exists($class = '\\App\\Filament\\Server\\Resources\\' . $model . 's\\' . $model . 'Resource')) { + return $class::getNavigationIcon(); + } + + return null; + } + public function isRootAdmin(): bool { return $this->name === self::ROOT_ADMIN; @@ -41,8 +179,13 @@ public function isRootAdmin(): bool public static function getRootAdmin(): self { /** @var self $role */ - $role = self::findOrCreate(self::ROOT_ADMIN); + $role = self::findOrCreate(self::ROOT_ADMIN, self::DEFAULT_GUARD_NAME); return $role; } + + public function nodes(): BelongsToMany + { + return $this->belongsToMany(Node::class, NodeRole::class); + } } diff --git a/app/Models/Schedule.php b/app/Models/Schedule.php index ae7b9baecf..24d4aea643 100644 --- a/app/Models/Schedule.php +++ b/app/Models/Schedule.php @@ -2,10 +2,18 @@ namespace App\Models; -use Cron\CronExpression; -use Carbon\CarbonImmutable; -use Illuminate\Database\Eloquent\Relations\HasMany; +use App\Contracts\Validatable; +use App\Enums\ScheduleStatus; +use App\Helpers\Utilities; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Exception; +use Illuminate\Database\Eloquent\Casts\Attribute; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Collection; /** * @property int $id @@ -19,26 +27,25 @@ * @property bool $is_active * @property bool $is_processing * @property bool $only_when_online - * @property \Carbon\Carbon|null $last_run_at - * @property \Carbon\Carbon|null $next_run_at - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \App\Models\Server $server - * @property \App\Models\Task[]|\Illuminate\Support\Collection $tasks + * @property Carbon|null $last_run_at + * @property Carbon|null $next_run_at + * @property ScheduleStatus $status + * @property Carbon $created_at + * @property Carbon $updated_at + * @property Server $server + * @property Task[]|Collection $tasks */ -class Schedule extends Model +class Schedule extends Model implements Validatable { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'server_schedule'; - /** - * The table associated with the model. - */ - protected $table = 'schedules'; - /** * Always return the tasks associated with this schedule. */ @@ -74,19 +81,20 @@ class Schedule extends Model 'only_when_online' => false, ]; + /** @var array */ public static array $validationRules = [ - 'server_id' => 'required|exists:servers,id', - 'name' => 'required|string|max:255', - 'cron_day_of_week' => 'required|string', - 'cron_month' => 'required|string', - 'cron_day_of_month' => 'required|string', - 'cron_hour' => 'required|string', - 'cron_minute' => 'required|string', - 'is_active' => 'boolean', - 'is_processing' => 'boolean', - 'only_when_online' => 'boolean', - 'last_run_at' => 'nullable|date', - 'next_run_at' => 'nullable|date', + 'server_id' => ['required', 'exists:servers,id'], + 'name' => ['required', 'string', 'max:255'], + 'cron_day_of_week' => ['required', 'string'], + 'cron_month' => ['required', 'string'], + 'cron_day_of_month' => ['required', 'string'], + 'cron_hour' => ['required', 'string'], + 'cron_minute' => ['required', 'string'], + 'is_active' => ['boolean'], + 'is_processing' => ['boolean'], + 'only_when_online' => ['boolean'], + 'last_run_at' => ['nullable', 'date'], + 'next_run_at' => ['nullable', 'date'], ]; protected function casts(): array @@ -102,23 +110,21 @@ protected function casts(): array ]; } - public function getRouteKeyName(): string + protected function status(): Attribute { - return $this->getKeyName(); + return Attribute::make( + get: fn () => !$this->is_active ? ScheduleStatus::Inactive : ($this->is_processing ? ScheduleStatus::Processing : ScheduleStatus::Active), + ); } /** * Returns the schedule's execution crontab entry as a string. * - * @throws \Exception + * @throws Exception */ - public function getNextRunDate(): CarbonImmutable + public function getNextRunDate(): string { - $formatted = sprintf('%s %s %s %s %s', $this->cron_minute, $this->cron_hour, $this->cron_day_of_month, $this->cron_month, $this->cron_day_of_week); - - return CarbonImmutable::createFromTimestamp( - (new CronExpression($formatted))->getNextRunDate()->getTimestamp() - ); + return Utilities::getScheduleNextRunDate($this->cron_minute, $this->cron_hour, $this->cron_day_of_month, $this->cron_month, $this->cron_day_of_week)->toDateTimeString(); } /** @@ -136,4 +142,12 @@ public function server(): BelongsTo { return $this->belongsTo(Server::class); } + + public function firstTask(): ?Task + { + /** @var ?Task $task */ + $task = $this->tasks()->orderBy('sequence_id')->first(); + + return $task; + } } diff --git a/app/Models/Server.php b/app/Models/Server.php index a0c341c6d4..5934daa269 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -2,21 +2,36 @@ namespace App\Models; +use App\Contracts\Validatable; use App\Enums\ContainerStatus; +use App\Enums\ServerResourceType; use App\Enums\ServerState; -use App\Exceptions\Http\Connection\DaemonConnectionException; -use GuzzleHttp\Exception\GuzzleException; +use App\Exceptions\Http\Server\ServerStateConflictException; +use App\Repositories\Daemon\DaemonServerRepository; +use App\Services\Subusers\SubuserDeletionService; +use App\Traits\HasValidation; +use Carbon\CarbonInterface; +use Database\Factories\ServerFactory; +use Filament\Models\Contracts\HasAvatar; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; -use Illuminate\Notifications\Notifiable; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Query\JoinClause; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Notifications\DatabaseNotification; +use Illuminate\Notifications\DatabaseNotificationCollection; +use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Arr; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Storage; use Psr\Http\Message\ResponseInterface; -use Illuminate\Database\Eloquent\Relations\HasOne; -use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\MorphToMany; -use App\Exceptions\Http\Server\ServerStateConflictException; /** * \App\Models\Server. @@ -38,96 +53,112 @@ * @property int $cpu * @property string|null $threads * @property bool $oom_killer - * @property int $allocation_id + * @property int|null $allocation_id * @property int $egg_id * @property string $startup * @property string $image + * @property string|null $icon * @property int|null $allocation_limit * @property int|null $database_limit - * @property int $backup_limit - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property \Illuminate\Support\Carbon|null $installed_at - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\ActivityLog[] $activity + * @property int|null $backup_limit + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property Carbon|null $installed_at + * @property Collection|ActivityLog[] $activity * @property int|null $activity_count - * @property \App\Models\Allocation|null $allocation - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Allocation[] $allocations + * @property Allocation|null $allocation + * @property Collection|Allocation[] $allocations * @property int|null $allocations_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Backup[] $backups + * @property Collection|Backup[] $backups * @property int|null $backups_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Database[] $databases + * @property Collection|Database[] $databases * @property int|null $databases_count - * @property \App\Models\Egg|null $egg - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Mount[] $mounts + * @property Egg $egg + * @property Collection|Mount[] $mounts * @property int|null $mounts_count - * @property \App\Models\Node $node - * @property \Illuminate\Notifications\DatabaseNotificationCollection|\Illuminate\Notifications\DatabaseNotification[] $notifications + * @property Node $node + * @property DatabaseNotificationCollection|DatabaseNotification[] $notifications * @property int|null $notifications_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Schedule[] $schedules + * @property Collection|Schedule[] $schedules * @property int|null $schedules_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Subuser[] $subusers + * @property Collection|Subuser[] $subusers * @property int|null $subusers_count - * @property \App\Models\ServerTransfer|null $transfer - * @property \App\Models\User $user - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\EggVariable[] $variables + * @property ServerTransfer|null $transfer + * @property User $user + * @property Collection|EggVariable[] $variables * @property int|null $variables_count - * @method static \Database\Factories\ServerFactory factory(...$parameters) - * @method static \Illuminate\Database\Eloquent\Builder|Server newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Server newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Server query() - * @method static \Illuminate\Database\Eloquent\Builder|Server whereAllocationId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereAllocationLimit($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereBackupLimit($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereCpu($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereDatabaseLimit($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereDescription($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereDisk($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereEggId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereExternalId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereImage($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereIo($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereMemory($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereNodeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereOomKiller($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereOwnerId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereSkipScripts($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereStartup($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereStatus($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereSwap($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereThreads($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereUuid($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereuuid_short($value) - * @property array|null $docker_labels + * + * @method static ServerFactory factory(...$parameters) + * @method static Builder|Server newModelQuery() + * @method static Builder|Server newQuery() + * @method static Builder|Server query() + * @method static Builder|Server whereAllocationId($value) + * @method static Builder|Server whereAllocationLimit($value) + * @method static Builder|Server whereBackupLimit($value) + * @method static Builder|Server whereCpu($value) + * @method static Builder|Server whereCreatedAt($value) + * @method static Builder|Server whereDatabaseLimit($value) + * @method static Builder|Server whereDescription($value) + * @method static Builder|Server whereDisk($value) + * @method static Builder|Server whereEggId($value) + * @method static Builder|Server whereExternalId($value) + * @method static Builder|Server whereId($value) + * @method static Builder|Server whereImage($value) + * @method static Builder|Server whereIo($value) + * @method static Builder|Server whereMemory($value) + * @method static Builder|Server whereName($value) + * @method static Builder|Server whereNodeId($value) + * @method static Builder|Server whereOomKiller($value) + * @method static Builder|Server whereOwnerId($value) + * @method static Builder|Server whereSkipScripts($value) + * @method static Builder|Server whereStartup($value) + * @method static Builder|Server whereStatus($value) + * @method static Builder|Server whereSwap($value) + * @method static Builder|Server whereThreads($value) + * @method static Builder|Server whereUpdatedAt($value) + * @method static Builder|Server whereUuid($value) + * @method static Builder|Server whereuuid_short($value) + * + * @property string[]|null $docker_labels * @property string|null $ports - * @property-read mixed $condition - * @property-read \Illuminate\Database\Eloquent\Collection $eggVariables + * @property-read ContainerStatus|ServerState $condition + * @property-read Collection $eggVariables * @property-read int|null $egg_variables_count - * @property-read \Illuminate\Database\Eloquent\Collection $serverVariables + * @property-read Collection $serverVariables * @property-read int|null $server_variables_count - * @method static \Illuminate\Database\Eloquent\Builder|Server whereDockerLabels($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereInstalledAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server wherePorts($value) - * @method static \Illuminate\Database\Eloquent\Builder|Server whereUuidShort($value) - * @mixin \Eloquent + * + * @method static Builder|Server whereDockerLabels($value) + * @method static Builder|Server whereInstalledAt($value) + * @method static Builder|Server wherePorts($value) + * @method static Builder|Server whereUuidShort($value) */ -class Server extends Model +class Server extends Model implements HasAvatar, Validatable { + use HasFactory; + use HasValidation; use Notifiable; /** * The resource name for this model when it is transformed into an - * API representation using fractal. + * API representation using fractal. Also used as name for api key permissions. */ public const RESOURCE_NAME = 'server'; /** - * The table associated with the model. + * Path to store server icons relative to storage path. */ - protected $table = 'servers'; + public const ICON_STORAGE_PATH = 'icons/server'; + + /** + * Supported image formats: file extension => MIME type + */ + public const IMAGE_FORMATS = [ + 'png' => 'image/png', + 'jpg' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'webp' => 'image/webp', + 'svg' => 'image/svg+xml', + ]; /** * Default values when creating the model. We want to switch to disabling OOM killer @@ -147,30 +178,31 @@ class Server extends Model /** * Fields that are not mass assignable. */ - protected $guarded = ['id', self::CREATED_AT, self::UPDATED_AT, 'deleted_at', 'installed_at']; + protected $guarded = ['id', self::CREATED_AT, self::UPDATED_AT, 'installed_at']; + /** @var array */ public static array $validationRules = [ - 'external_id' => 'sometimes|nullable|string|between:1,255|unique:servers', - 'owner_id' => 'required|integer|exists:users,id', - 'name' => 'required|string|min:1|max:255', - 'node_id' => 'required|exists:nodes,id', - 'description' => 'string', - 'status' => 'nullable|string', - 'memory' => 'required|numeric|min:0', - 'swap' => 'required|numeric|min:-1', - 'io' => 'required|numeric|between:0,1000', - 'cpu' => 'required|numeric|min:0', - 'threads' => 'nullable|regex:/^[0-9-,]+$/', - 'oom_killer' => 'sometimes|boolean', - 'disk' => 'required|numeric|min:0', - 'allocation_id' => 'required|bail|unique:servers|exists:allocations,id', - 'egg_id' => 'required|exists:eggs,id', - 'startup' => 'required|string', - 'skip_scripts' => 'sometimes|boolean', - 'image' => 'required|string|max:255', - 'database_limit' => 'present|nullable|integer|min:0', - 'allocation_limit' => 'sometimes|nullable|integer|min:0', - 'backup_limit' => 'present|nullable|integer|min:0', + 'external_id' => ['sometimes', 'nullable', 'string', 'between:1,255', 'unique:servers'], + 'owner_id' => ['required', 'integer', 'exists:users,id'], + 'name' => ['required', 'string', 'min:1', 'max:255'], + 'node_id' => ['required', 'exists:nodes,id'], + 'description' => ['string'], + 'status' => ['nullable', 'string'], + 'memory' => ['required', 'numeric', 'min:0'], + 'swap' => ['required', 'numeric', 'min:-1'], + 'io' => ['required', 'numeric', 'between:0,1000'], + 'cpu' => ['required', 'numeric', 'min:0'], + 'threads' => ['nullable', 'regex:/^[0-9-,]+$/'], + 'oom_killer' => ['sometimes', 'boolean'], + 'disk' => ['required', 'numeric', 'min:0'], + 'allocation_id' => ['sometimes', 'nullable', 'unique:servers', 'exists:allocations,id'], + 'egg_id' => ['required', 'exists:eggs,id'], + 'startup' => ['required', 'string'], + 'skip_scripts' => ['sometimes', 'boolean'], + 'image' => ['required', 'string', 'max:255'], + 'database_limit' => ['present', 'nullable', 'integer', 'min:0'], + 'allocation_limit' => ['sometimes', 'nullable', 'integer', 'min:0'], + 'backup_limit' => ['present', 'nullable', 'integer', 'min:0'], ]; protected function casts(): array @@ -193,17 +225,33 @@ protected function casts(): array 'backup_limit' => 'integer', self::CREATED_AT => 'datetime', self::UPDATED_AT => 'datetime', - 'deleted_at' => 'datetime', 'installed_at' => 'datetime', 'docker_labels' => 'array', ]; } + protected static function booted(): void + { + static::saved(function (self $server) { + $subuser = $server->subusers()->where('user_id', $server->owner_id)->first(); + if ($subuser) { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + app(SubuserDeletionService::class)->handle($subuser, $server); + } + }); + } + /** * Returns the format for server allocations when communicating with the Daemon. + * + * @return array> */ public function getAllocationMappings(): array { + if (!$this->allocation) { + return ['' => []]; + } + return $this->allocations->where('node_id', $this->node_id)->groupBy('ip')->map(function ($item) { return $item->pluck('port'); })->toArray(); @@ -211,7 +259,12 @@ public function getAllocationMappings(): array public function isInstalled(): bool { - return $this->status !== ServerState::Installing && $this->status !== ServerState::InstallFailed; + return $this->status !== ServerState::Installing && !$this->isFailedInstall(); + } + + public function isFailedInstall(): bool + { + return $this->status === ServerState::InstallFailed || $this->status === ServerState::ReinstallFailed; } public function isSuspended(): bool @@ -229,6 +282,8 @@ public function user(): BelongsTo /** * Gets the subusers associated with a server. + * + * @return HasMany */ public function subusers(): HasMany { @@ -245,6 +300,8 @@ public function allocation(): BelongsTo /** * Gets all allocations associated with this server. + * + * @return HasMany */ public function allocations(): HasMany { @@ -254,9 +311,9 @@ public function allocations(): HasMany /** * Gets information for the egg associated with this server. */ - public function egg(): HasOne + public function egg(): BelongsTo { - return $this->hasOne(Egg::class, 'id', 'egg_id'); + return $this->belongsTo(Egg::class); } public function eggVariables(): HasMany @@ -266,6 +323,8 @@ public function eggVariables(): HasMany /** * Gets information for the egg variables associated with this server. + * + * @return HasMany */ public function variables(): HasMany { @@ -285,6 +344,18 @@ public function serverVariables(): HasMany return $this->hasMany(ServerVariable::class); } + public function ensureVariablesExist(): void + { + foreach ($this->eggVariables as $variable) { + ServerVariable::firstOrCreate([ + 'server_id' => $this->id, + 'variable_id' => $variable->id, + ], [ + 'variable_value' => $variable->default_value, + ]); + } + } + /** * Gets information for the node associated with this server. */ @@ -317,14 +388,17 @@ public function transfer(): HasOne return $this->hasOne(ServerTransfer::class)->whereNull('successful')->orderByDesc('id'); } + /** + * @return HasMany + */ public function backups(): HasMany { return $this->hasMany(Backup::class); } - public function mounts(): BelongsToMany + public function mounts(): MorphToMany { - return $this->belongsToMany(Mount::class); + return $this->morphToMany(Mount::class, 'mountable'); } /** @@ -335,15 +409,10 @@ public function activity(): MorphToMany return $this->morphToMany(ActivityLog::class, 'subject', 'activity_log_subjects'); } - public function getRouteKeyName(): string - { - return 'id'; - } - public function resolveRouteBinding($value, $field = null): ?self { return match ($field) { - 'uuid' => $this->where('uuid_short', $value)->orWhere('uuid', $value)->firstOrFail(), + 'uuid', 'uuid_short' => $this->where('uuid_short', $value)->orWhere('uuid', $value)->firstOrFail(), default => $this->where('id', $value)->firstOrFail(), }; } @@ -356,6 +425,11 @@ public function resolveChildRouteBinding($childType, $value, $field) }; } + public function isInConflictState(): bool + { + return $this->isSuspended() || $this->node->isUnderMaintenance() || !$this->isInstalled() || $this->status === ServerState::RestoringBackup || !is_null($this->transfer); + } + /** * Checks if the server is currently in a user-accessible state. If not, an * exception is raised. This should be called whenever something needs to make @@ -363,15 +437,9 @@ public function resolveChildRouteBinding($childType, $value, $field) * * @throws ServerStateConflictException */ - public function validateCurrentState() + public function validateCurrentState(): void { - if ( - $this->isSuspended() || - $this->node->isUnderMaintenance() || - !$this->isInstalled() || - $this->status === ServerState::RestoringBackup || - !is_null($this->transfer) - ) { + if ($this->isInConflictState()) { throw new ServerStateConflictException($this); } } @@ -382,7 +450,7 @@ public function validateCurrentState() * sure the server can be transferred and is not currently being transferred * or installed. */ - public function validateTransferState() + public function validateTransferState(): void { if ( !$this->isInstalled() || @@ -396,58 +464,89 @@ public function validateTransferState() /** * Sends a command or multiple commands to a running server instance. * - * @throws DaemonConnectionException|GuzzleException + * @param string[]|string $command + * + * @throws ConnectionException */ public function send(array|string $command): ResponseInterface { - try { - return Http::daemon($this->node)->post("/api/servers/{$this->uuid}/commands", [ - 'commands' => is_array($command) ? $command : [$command], - ])->toPsrResponse(); - } catch (GuzzleException $exception) { - throw new DaemonConnectionException($exception); - } + return Http::daemon($this->node)->post("/api/servers/{$this->uuid}/commands", [ + 'commands' => is_array($command) ? $command : [$command], + ])->toPsrResponse(); + } + + public function retrieveStatus(): ContainerStatus + { + return cache()->remember("servers.$this->uuid.status", now()->addSeconds(15), function () { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + $details = app(DaemonServerRepository::class)->setServer($this)->getDetails(); + + return ContainerStatus::tryFrom(Arr::get($details, 'state')) ?? ContainerStatus::Missing; + }); } - public function retrieveStatus(): string + /** + * @return array + */ + public function retrieveResources(): array { - $status = cache()->get("servers.$this->uuid.container.status"); + return cache()->remember("servers.$this->uuid.resources", now()->addSeconds(15), function () { + // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + $details = app(DaemonServerRepository::class)->setServer($this)->getDetails(); + + return Arr::get($details, 'utilization', []); + }); + } + + public function formatResource(ServerResourceType $resourceType, int $precision = 2): string + { + $resourceAmount = $resourceType->getResourceAmount($this); + + if ($resourceType->isTime()) { + if (!is_null($this->status)) { + return $this->status->getLabel(); + } - if ($status) { - return $status; + if ($resourceAmount === 0) { + return ContainerStatus::Offline->getLabel(); + } + + return now()->subMillis($resourceAmount)->diffForHumans(syntax: CarbonInterface::DIFF_ABSOLUTE, short: true, parts: 4); + } + + if ($resourceAmount === 0 & $resourceType->isLimit()) { + // Unlimited symbol + return "\u{221E}"; } - $this->node->serverStatuses(); + if ($resourceType->isPercentage()) { + return format_number($resourceAmount, precision: $precision) . '%'; + } - return cache()->get("servers.$this->uuid.container.status") ?? 'missing'; + return convert_bytes_to_readable($resourceAmount, decimals: $precision, base: 3); } public function condition(): Attribute { return Attribute::make( - get: fn () => $this->status?->value ?? $this->retrieveStatus(), + get: fn () => $this->status ?? $this->retrieveStatus(), ); } - public function conditionIcon(): string + public function getIconAttribute(): ?string { - if ($this->status === null) { - $containerStatus = ContainerStatus::from($this->retrieveStatus()); - - return $containerStatus->icon(); + foreach (array_keys(static::IMAGE_FORMATS) as $ext) { + $path = static::ICON_STORAGE_PATH . "/$this->uuid.$ext"; + if (Storage::disk('public')->exists($path)) { + return Storage::disk('public')->url($path); + } } - return $this->status->icon(); + return null; } - public function conditionColor(): string + public function getFilamentAvatarUrl(): ?string { - if ($this->status === null) { - $containerStatus = ContainerStatus::from($this->retrieveStatus()); - - return $containerStatus->color(); - } - - return $this->status->color(); + return $this->icon ?? $this->egg->image; } } diff --git a/app/Models/ServerTransfer.php b/app/Models/ServerTransfer.php index abfef3eb67..2be4689c32 100644 --- a/app/Models/ServerTransfer.php +++ b/app/Models/ServerTransfer.php @@ -2,55 +2,57 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Relations\HasOne; +use App\Contracts\Validatable; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOne; /** * @property int $id * @property int $server_id * @property int $old_node * @property int $new_node - * @property int $old_allocation - * @property int $new_allocation - * @property array|null $old_additional_allocations - * @property array|null $new_additional_allocations + * @property int|null $old_allocation + * @property int|null $new_allocation + * @property array|null $old_additional_allocations array of allocation.id's + * @property array|null $new_additional_allocations array of allocation.id's * @property bool|null $successful * @property bool $archived - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \App\Models\Server $server - * @property \App\Models\Node $oldNode - * @property \App\Models\Node $newNode + * @property Carbon $created_at + * @property Carbon $updated_at + * @property Server $server + * @property Node $oldNode + * @property Node $newNode */ -class ServerTransfer extends Model +class ServerTransfer extends Model implements Validatable { + use HasValidation; + /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'server_transfer'; - /** - * The table associated with the model. - */ - protected $table = 'server_transfers'; - /** * Fields that are not mass assignable. */ protected $guarded = ['id', 'created_at', 'updated_at']; + /** @var array */ public static array $validationRules = [ - 'server_id' => 'required|numeric|exists:servers,id', - 'old_node' => 'required|numeric', - 'new_node' => 'required|numeric', - 'old_allocation' => 'required|numeric', - 'new_allocation' => 'required|numeric', - 'old_additional_allocations' => 'nullable|array', - 'old_additional_allocations.*' => 'numeric', - 'new_additional_allocations' => 'nullable|array', - 'new_additional_allocations.*' => 'numeric', - 'successful' => 'sometimes|nullable|boolean', + 'server_id' => ['required', 'numeric', 'exists:servers,id'], + 'old_node' => ['required', 'numeric'], + 'new_node' => ['required', 'numeric'], + 'old_allocation' => ['nullable', 'numeric'], + 'new_allocation' => ['nullable', 'numeric'], + 'old_additional_allocations' => ['nullable', 'array'], + 'old_additional_allocations.*' => ['numeric'], + 'new_additional_allocations' => ['nullable', 'array'], + 'new_additional_allocations.*' => ['numeric'], + 'successful' => ['sometimes', 'nullable', 'boolean'], ]; protected function casts(): array diff --git a/app/Models/ServerVariable.php b/app/Models/ServerVariable.php index 0c7eeffc56..767af78df8 100644 --- a/app/Models/ServerVariable.php +++ b/app/Models/ServerVariable.php @@ -2,6 +2,10 @@ namespace App\Models; +use App\Contracts\Validatable; +use App\Traits\HasValidation; +use Carbon\CarbonImmutable; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; /** @@ -9,27 +13,28 @@ * @property int $server_id * @property int $variable_id * @property string $variable_value - * @property \Carbon\CarbonImmutable|null $created_at - * @property \Carbon\CarbonImmutable|null $updated_at - * @property \App\Models\EggVariable $variable - * @property \App\Models\Server $server + * @property CarbonImmutable|null $created_at + * @property CarbonImmutable|null $updated_at + * @property EggVariable $variable + * @property Server $server */ -class ServerVariable extends Model +class ServerVariable extends Model implements Validatable { + use HasValidation; + /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'server_variable'; - protected $table = 'server_variables'; - protected $guarded = ['id', 'created_at', 'updated_at']; + /** @var array */ public static array $validationRules = [ - 'server_id' => 'required|int', - 'variable_id' => 'required|int', - 'variable_value' => 'string', + 'server_id' => ['required', 'int'], + 'variable_id' => ['required', 'int'], + 'variable_value' => ['string'], ]; protected function casts(): array diff --git a/app/Models/Session.php b/app/Models/Session.php deleted file mode 100644 index e04d98d399..0000000000 --- a/app/Models/Session.php +++ /dev/null @@ -1,21 +0,0 @@ - 'string', - 'user_id' => 'integer', - ]; - } -} diff --git a/app/Models/Setting.php b/app/Models/Setting.php deleted file mode 100644 index 9efad2b080..0000000000 --- a/app/Models/Setting.php +++ /dev/null @@ -1,27 +0,0 @@ - 'required|string|between:1,255', - 'value' => 'string', - ]; -} diff --git a/app/Models/Subuser.php b/app/Models/Subuser.php index 566c8a7412..80d74242f9 100644 --- a/app/Models/Subuser.php +++ b/app/Models/Subuser.php @@ -2,22 +2,29 @@ namespace App\Models; -use Illuminate\Notifications\Notifiable; -use Illuminate\Database\Eloquent\Relations\HasMany; +use App\Contracts\Validatable; +use App\Enums\SubuserPermission; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Notifications\Notifiable; /** * @property int $id * @property int $user_id * @property int $server_id - * @property array $permissions - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \App\Models\User $user - * @property \App\Models\Server $server + * @property string[] $permissions + * @property Carbon $created_at + * @property Carbon $updated_at + * @property User $user + * @property Server $server */ -class Subuser extends Model +class Subuser extends Model implements Validatable { + use HasFactory; + use HasValidation; use Notifiable; /** @@ -26,21 +33,39 @@ class Subuser extends Model */ public const RESOURCE_NAME = 'server_subuser'; - /** - * The table associated with the model. - */ - protected $table = 'subusers'; + /** @var array */ + protected static array $customPermissions = []; + + /** @param string[] $permissions */ + public static function registerCustomPermissions(string $name, array $permissions, ?string $icon = null, ?bool $hidden = null): void + { + $customPermission = static::$customPermissions[$name] ?? []; + + $customPermission['name'] = $name; + $customPermission['permissions'] = array_merge($customPermission['permissions'] ?? [], $permissions); + + if (!is_null($icon)) { + $customPermission['icon'] = $icon; + } + + if (!is_null($hidden)) { + $customPermission['hidden'] = $hidden; + } + + static::$customPermissions[$name] = $customPermission; + } /** * Fields that are not mass assignable. */ protected $guarded = ['id', 'created_at', 'updated_at']; + /** @var array */ public static array $validationRules = [ - 'user_id' => 'required|numeric|exists:users,id', - 'server_id' => 'required|numeric|exists:servers,id', - 'permissions' => 'nullable|array', - 'permissions.*' => 'string', + 'user_id' => ['required', 'numeric', 'exists:users,id'], + 'server_id' => ['required', 'numeric', 'exists:servers,id'], + 'permissions' => ['nullable', 'array'], + 'permissions.*' => ['string'], ]; protected function casts(): array @@ -68,11 +93,56 @@ public function user(): BelongsTo return $this->belongsTo(User::class); } - /** - * Gets the permissions associated with a subuser. - */ - public function permissions(): HasMany + /** @return array */ + public static function allPermissionData(): array { - return $this->hasMany(Permission::class); + $allPermissions = []; + + foreach (SubuserPermission::cases() as $subuserPermission) { + [$group, $permission] = $subuserPermission->split(); + + $allPermissions[$group] = [ + 'name' => $group, + 'hidden' => $subuserPermission->isHidden(), + 'icon' => $subuserPermission->getIcon(), + 'permissions' => array_merge($allPermissions[$group]['permissions'] ?? [], [$permission]), + ]; + } + + foreach (static::$customPermissions as $customPermission) { + $name = $customPermission['name']; + + $groupData = $allPermissions[$name] ?? []; + + $groupData = [ + 'name' => $name, + 'hidden' => $customPermission['hidden'] ?? $groupData['hidden'] ?? false, + 'icon' => $customPermission['icon'] ?? $groupData['icon'], + 'permissions' => array_unique(array_merge($groupData['permissions'] ?? [], $customPermission['permissions'])), + ]; + + $allPermissions[$name] = $groupData; + } + + return array_values($allPermissions); + } + + /** @return string[] */ + public static function allPermissionKeys(): array + { + return collect(static::allPermissionData()) + ->map(fn ($data) => array_map(fn ($permission) => $data['name'] . '.' . $permission, $data['permissions'])) + ->flatten() + ->unique() + ->toArray(); + } + + public static function doesPermissionExist(string|SubuserPermission $permission): bool + { + if ($permission instanceof SubuserPermission) { + $permission = $permission->value; + } + + return str_contains($permission, '.') && in_array($permission, static::allPermissionKeys()); } } diff --git a/app/Models/Task.php b/app/Models/Task.php index 254d38ece8..c2b086644c 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -2,8 +2,15 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Relations\HasOneThrough; +use App\Contracts\Validatable; +use App\Extensions\Tasks\TaskSchemaInterface; +use App\Extensions\Tasks\TaskService; +use App\Traits\HasValidation; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOneThrough; /** * @property int $id @@ -14,34 +21,26 @@ * @property int $time_offset * @property bool $is_queued * @property bool $continue_on_failure - * @property \Carbon\Carbon $created_at - * @property \Carbon\Carbon $updated_at - * @property \App\Models\Schedule $schedule - * @property \App\Models\Server $server + * @property Carbon $created_at + * @property Carbon $updated_at + * @property Schedule $schedule + * @property Server $server */ -class Task extends Model +class Task extends Model implements Validatable { + use HasFactory; + use HasValidation; + /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'schedule_task'; - /** - * The default actions that can exist for a task - */ - public const ACTION_POWER = 'power'; - public const ACTION_COMMAND = 'command'; - public const ACTION_BACKUP = 'backup'; - public const ACTION_DELETE_FILES = 'delete_files'; - - /** - * The table associated with the model. - */ - protected $table = 'tasks'; - /** * Relationships to be updated when this model is updated. + * + * @var string[] */ protected $touches = ['schedule']; @@ -67,14 +66,15 @@ class Task extends Model 'continue_on_failure' => false, ]; + /** @var array */ public static array $validationRules = [ - 'schedule_id' => 'required|numeric|exists:schedules,id', - 'sequence_id' => 'required|numeric|min:1', - 'action' => 'required|string', - 'payload' => 'required_unless:action,backup|string', - 'time_offset' => 'required|numeric|between:0,900', - 'is_queued' => 'boolean', - 'continue_on_failure' => 'boolean', + 'schedule_id' => ['required', 'numeric', 'exists:schedules,id'], + 'sequence_id' => ['required', 'numeric', 'min:1'], + 'action' => ['required', 'string'], + 'payload' => ['required_unless:action,backup', 'string'], + 'time_offset' => ['required', 'numeric', 'between:0,900'], + 'is_queued' => ['boolean'], + 'continue_on_failure' => ['boolean'], ]; protected function casts(): array @@ -89,11 +89,6 @@ protected function casts(): array ]; } - public function getRouteKeyName(): string - { - return $this->getKeyName(); - } - /** * Return the schedule that a task belongs to. */ @@ -116,4 +111,17 @@ public function server(): HasOneThrough 'server_id' // schedules.server_id ); } + + public function isFirst(): bool + { + return $this->schedule->firstTask()?->id === $this->id; + } + + public function getSchema(): ?TaskSchemaInterface + { + /** @var TaskService $taskService */ + $taskService = app(TaskService::class); // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + + return $taskService->get($this->action); + } } diff --git a/app/Models/TaskLog.php b/app/Models/TaskLog.php deleted file mode 100644 index 0c272c7f26..0000000000 --- a/app/Models/TaskLog.php +++ /dev/null @@ -1,30 +0,0 @@ - 'integer', - 'task_id' => 'integer', - 'run_status' => 'integer', - 'run_time' => 'datetime', - 'created_at' => 'datetime', - 'updated_at' => 'datetime', - ]; - } -} diff --git a/app/Models/Traits/HasAccessTokens.php b/app/Models/Traits/HasAccessTokens.php index 14a0f685bd..8e0e9b1e9c 100644 --- a/app/Models/Traits/HasAccessTokens.php +++ b/app/Models/Traits/HasAccessTokens.php @@ -2,12 +2,12 @@ namespace App\Models\Traits; -use Illuminate\Support\Str; -use Laravel\Sanctum\Sanctum; +use App\Extensions\Laravel\Sanctum\NewAccessToken; use App\Models\ApiKey; -use Laravel\Sanctum\HasApiTokens; use Illuminate\Database\Eloquent\Relations\HasMany; -use App\Extensions\Laravel\Sanctum\NewAccessToken; +use Illuminate\Support\Str; +use Laravel\Sanctum\HasApiTokens; +use Laravel\Sanctum\Sanctum; /** * @mixin \App\Models\Model @@ -24,9 +24,12 @@ public function tokens(): HasMany return $this->hasMany(Sanctum::$personalAccessTokenModel); } + /** + * @param ?string[] $ips + */ public function createToken(?string $memo, ?array $ips): NewAccessToken { - /** @var \App\Models\ApiKey $token */ + /** @var ApiKey $token */ $token = $this->tokens()->forceCreate([ 'user_id' => $this->id, 'key_type' => ApiKey::TYPE_ACCOUNT, diff --git a/app/Models/User.php b/app/Models/User.php index 395f4994fa..57b42d45ae 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,31 +2,47 @@ namespace App\Models; +use App\Contracts\Validatable; +use App\Enums\CustomizationKey; +use App\Enums\SubuserPermission; use App\Exceptions\DisplayException; -use App\Rules\Username; -use App\Facades\Activity; +use App\Extensions\Avatar\AvatarService; +use App\Models\Traits\HasAccessTokens; +use App\Traits\HasValidation; +use BackedEnum; +use Database\Factories\UserFactory; use DateTimeZone; +use Filament\Auth\MultiFactor\App\Contracts\HasAppAuthentication; +use Filament\Auth\MultiFactor\App\Contracts\HasAppAuthenticationRecovery; +use Filament\Auth\MultiFactor\Email\Contracts\HasEmailAuthentication; use Filament\Models\Contracts\FilamentUser; use Filament\Models\Contracts\HasAvatar; use Filament\Models\Contracts\HasName; +use Filament\Models\Contracts\HasTenants; use Filament\Panel; -use Illuminate\Support\Str; -use Illuminate\Validation\Rules\In; use Illuminate\Auth\Authenticatable; -use Illuminate\Notifications\Notifiable; -use Illuminate\Database\Eloquent\Builder; -use App\Models\Traits\HasAccessTokens; use Illuminate\Auth\Passwords\CanResetPassword; -use App\Traits\Helpers\AvailableLanguages; -use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Foundation\Auth\Access\Authorizable; -use Illuminate\Database\Eloquent\Relations\MorphToMany; -use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; +use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; -use App\Notifications\SendPasswordReset as ResetPasswordNotification; -use Filament\Facades\Filament; -use Illuminate\Database\Eloquent\Model as IlluminateModel; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Casts\Attribute; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\MorphToMany; +use Illuminate\Foundation\Auth\Access\Authorizable; +use Illuminate\Notifications\DatabaseNotification; +use Illuminate\Notifications\DatabaseNotificationCollection; +use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Carbon; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Context; +use Illuminate\Support\Str; +use Illuminate\Validation\Rules\In; +use ResourceBundle; use Spatie\Permission\Traits\HasRoles; /** @@ -34,235 +50,197 @@ * * @property int $id * @property string|null $external_id + * @property bool $is_managed_externally * @property string $uuid * @property string $username * @property string $email - * @property string|null $name_first - * @property string|null $name_last * @property string $password * @property string|null $remember_token * @property string $language * @property string $timezone - * @property bool $use_totp - * @property string|null $totp_secret - * @property \Illuminate\Support\Carbon|null $totp_authenticated_at - * @property array|null $oauth - * @property bool $gravatar - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\ApiKey[] $apiKeys + * @property string[]|null $oauth + * @property string|null $mfa_app_secret + * @property string[]|null $mfa_app_recovery_codes + * @property bool $mfa_email_enabled + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property \Illuminate\Database\Eloquent\Collection|ApiKey[] $apiKeys * @property int|null $api_keys_count - * @property string $name - * @property \Illuminate\Notifications\DatabaseNotificationCollection|\Illuminate\Notifications\DatabaseNotification[] $notifications + * @property DatabaseNotificationCollection|DatabaseNotification[] $notifications * @property int|null $notifications_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\RecoveryToken[] $recoveryTokens - * @property int|null $recovery_tokens_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Server[] $servers + * @property \Illuminate\Database\Eloquent\Collection|Server[] $servers * @property int|null $servers_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\UserSSHKey[] $sshKeys + * @property \Illuminate\Database\Eloquent\Collection|UserSSHKey[] $sshKeys * @property int|null $ssh_keys_count - * @property \Illuminate\Database\Eloquent\Collection|\App\Models\ApiKey[] $tokens + * @property \Illuminate\Database\Eloquent\Collection|ApiKey[] $tokens * @property int|null $tokens_count + * @property \Illuminate\Database\Eloquent\Collection|Role[] $roles + * @property int|null $roles_count + * @property string|array|null $customization * - * @method static \Database\Factories\UserFactory factory(...$parameters) + * @method static UserFactory factory(...$parameters) * @method static Builder|User newModelQuery() * @method static Builder|User newQuery() * @method static Builder|User query() * @method static Builder|User whereCreatedAt($value) * @method static Builder|User whereEmail($value) * @method static Builder|User whereExternalId($value) - * @method static Builder|User whereGravatar($value) * @method static Builder|User whereId($value) * @method static Builder|User whereLanguage($value) * @method static Builder|User whereTimezone($value) - * @method static Builder|User whereNameFirst($value) - * @method static Builder|User whereNameLast($value) * @method static Builder|User wherePassword($value) * @method static Builder|User whereRememberToken($value) - * @method static Builder|User whereTotpAuthenticatedAt($value) - * @method static Builder|User whereTotpSecret($value) * @method static Builder|User whereUpdatedAt($value) - * @method static Builder|User whereUseTotp($value) * @method static Builder|User whereUsername($value) * @method static Builder|User whereUuid($value) - * - * @mixin \Eloquent */ -class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract, FilamentUser, HasAvatar, HasName +class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract, FilamentUser, HasAppAuthentication, HasAppAuthenticationRecovery, HasAvatar, HasEmailAuthentication, HasName, HasTenants, Validatable { use Authenticatable; - use Authorizable {can as protected canned; } - use AvailableLanguages; + use Authorizable { can as protected canned; } use CanResetPassword; use HasAccessTokens; + use HasFactory; use HasRoles; + use HasValidation { getRules as getValidationRules; } use Notifiable; public const USER_LEVEL_USER = 0; + public const USER_LEVEL_ADMIN = 1; /** * The resource name for this model when it is transformed into an - * API representation using fractal. + * API representation using fractal. Also used as name for api key permissions. */ public const RESOURCE_NAME = 'user'; - /** - * Level of servers to display when using access() on a user. - */ - protected string $accessLevel = 'all'; - - /** - * The table associated with the model. - */ - protected $table = 'users'; - /** * A list of mass-assignable variables. */ protected $fillable = [ 'external_id', + 'is_managed_externally', 'username', 'email', - 'name_first', - 'name_last', 'password', 'language', 'timezone', - 'use_totp', - 'totp_secret', - 'totp_authenticated_at', - 'gravatar', + 'mfa_app_secret', + 'mfa_app_recovery_codes', + 'mfa_email_enabled', 'oauth', + 'customization', ]; /** * The attributes excluded from the model's JSON form. */ - protected $hidden = ['password', 'remember_token', 'totp_secret', 'totp_authenticated_at', 'oauth']; + protected $hidden = ['password', 'remember_token', 'mfa_app_secret', 'mfa_app_recovery_codes', 'oauth']; /** * Default values for specific fields in the database. */ protected $attributes = [ 'external_id' => null, + 'is_managed_externally' => false, 'language' => 'en', 'timezone' => 'UTC', - 'use_totp' => false, - 'totp_secret' => null, - 'name_first' => '', - 'name_last' => '', + 'mfa_app_secret' => null, + 'mfa_app_recovery_codes' => null, + 'mfa_email_enabled' => false, 'oauth' => '[]', + 'customization' => null, ]; - /** - * Rules verifying that the data being stored matches the expectations of the database. - */ + /** @var array */ public static array $validationRules = [ - 'uuid' => 'nullable|string|size:36|unique:users,uuid', - 'email' => 'required|email|between:1,255|unique:users,email', - 'external_id' => 'sometimes|nullable|string|max:255|unique:users,external_id', - 'username' => 'required|between:1,255|unique:users,username', - 'name_first' => 'nullable|string|between:0,255', - 'name_last' => 'nullable|string|between:0,255', - 'password' => 'sometimes|nullable|string', - 'language' => 'string', - 'timezone' => 'string', - 'use_totp' => 'boolean', - 'totp_secret' => 'nullable|string', - 'oauth' => 'array|nullable', + 'uuid' => ['nullable', 'string', 'size:36', 'unique:users,uuid'], + 'email' => ['required', 'email', 'between:1,255', 'unique:users,email'], + 'external_id' => ['sometimes', 'nullable', 'string', 'max:255', 'unique:users,external_id'], + 'is_managed_externally' => ['boolean'], + 'username' => ['required', 'between:1,255', 'unique:users,username'], + 'password' => ['sometimes', 'nullable', 'string'], + 'language' => ['string'], + 'timezone' => ['string'], + 'mfa_app_secret' => ['nullable', 'string'], + 'mfa_app_recovery_codes' => ['nullable', 'array'], + 'mfa_app_recovery_codes.*' => ['string'], + 'mfa_email_enabled' => ['boolean'], + 'oauth' => ['array', 'nullable'], + 'customization' => ['array', 'nullable'], + 'customization.console_rows' => ['integer', 'min:1'], + 'customization.console_font' => ['string'], + 'customization.console_font_size' => ['integer', 'min:1'], + 'customization.console_graph_period' => ['integer', 'min:1'], + 'customization.top_navigation' => ['boolean'], + 'customization.dashboard_layout' => ['string', 'in:grid,table'], ]; protected function casts(): array { return [ - 'use_totp' => 'boolean', - 'gravatar' => 'boolean', - 'totp_authenticated_at' => 'datetime', - 'totp_secret' => 'encrypted', + 'is_managed_externally' => 'boolean', + 'mfa_app_secret' => 'encrypted', + 'mfa_app_recovery_codes' => 'encrypted:array', 'oauth' => 'array', + 'customization' => 'array', ]; } protected static function booted(): void { static::creating(function (self $user) { - $user->uuid = Str::uuid()->toString(); + $user->uuid ??= Str::uuid()->toString(); + $user->timezone ??= config('app.timezone'); return true; }); + static::saving(function (self $user) { + $user->username = str($user->username)->lower()->toString(); + $user->email = str($user->email)->lower()->toString(); + }); + static::deleting(function (self $user) { - throw_if($user->servers()->count() > 0, new DisplayException(__('admin/user.exceptions.user_has_servers'))); + throw_if($user->servers()->count() > 0, new DisplayException(trans('exceptions.users.has_servers'))); - throw_if(request()->user()?->id === $user->id, new DisplayException(__('admin/user.exceptions.user_is_self'))); + throw_if(request()->user()?->id === $user->id, new DisplayException(trans('exceptions.users.is_self'))); }); } - public function getRouteKeyName(): string - { - return 'id'; - } - /** * Implement language verification by overriding Eloquence's gather * rules function. */ public static function getRules(): array { - $rules = parent::getRules(); + $rules = self::getValidationRules(); - $rules['language'][] = new In(array_keys((new self())->getAvailableLanguages())); - $rules['timezone'][] = new In(array_values(DateTimeZone::listIdentifiers())); - $rules['username'][] = new Username(); + $rules['language'][] = new In(ResourceBundle::getLocales('')); + $rules['timezone'][] = new In(DateTimeZone::listIdentifiers()); return $rules; } - /** - * Return the user model in a format that can be passed over to React templates. - */ - public function toReactObject(): array - { - return array_merge(collect($this->toArray())->except(['id', 'external_id'])->toArray(), [ - 'root_admin' => $this->isRootAdmin(), - 'admin' => $this->canAccessPanel(Filament::getPanel('admin')), - ]); - } - - /** - * Send the password reset notification. - * - * @param string $token - */ - public function sendPasswordResetNotification($token) + public function username(): Attribute { - Activity::event('auth:reset-password') - ->withRequestMetadata() - ->subject($this) - ->log('sending password reset email'); - - $this->notify(new ResetPasswordNotification($token)); - } - - /** - * Store the username as a lowercase string. - */ - public function setUsernameAttribute(string $value) - { - $this->attributes['username'] = mb_strtolower($value); + return Attribute::make( + set: fn (string $value) => str($value)->lower()->trim()->toString(), + ); } - /** - * Return a concatenated result for the accounts full name. - */ - public function getNameAttribute(): string + public function email(): Attribute { - return trim($this->name_first . ' ' . $this->name_last); + return Attribute::make( + set: fn (string $value) => str($value)->lower()->trim()->toString(), + ); } /** * Returns all servers that a user owns. + * + * @return HasMany */ public function servers(): HasMany { @@ -275,11 +253,6 @@ public function apiKeys(): HasMany ->where('key_type', ApiKey::TYPE_ACCOUNT); } - public function recoveryTokens(): HasMany - { - return $this->hasMany(RecoveryToken::class); - } - public function sshKeys(): HasMany { return $this->hasMany(UserSSHKey::class); @@ -295,18 +268,52 @@ public function activity(): MorphToMany } /** - * Returns all the servers that a user can access by way of being the owner of the - * server, or because they are assigned as a subuser for that server. + * Returns all the servers that a user can access. + * Either because they are an admin or because they are the owner/ a subuser of the server. */ public function accessibleServers(): Builder { - return Server::query() - ->select('servers.*') + if ($this->canned('viewAny', Server::class)) { + return Server::select('servers.*') + ->leftJoin('subusers', 'subusers.server_id', '=', 'servers.id') + ->where(function (Builder $builder) { + $builder->where('servers.owner_id', $this->id)->orWhere('subusers.user_id', $this->id)->orWhereIn('servers.node_id', $this->accessibleNodes()->pluck('id')); + }) + ->distinct('servers.id'); + } + + return $this->directAccessibleServers(); + } + + /** + * Returns all the servers that a user can access "directly". + * This means either because they are the owner or a subuser of the server. + */ + public function directAccessibleServers(): Builder + { + return Server::select('servers.*') ->leftJoin('subusers', 'subusers.server_id', '=', 'servers.id') ->where(function (Builder $builder) { $builder->where('servers.owner_id', $this->id)->orWhere('subusers.user_id', $this->id); }) - ->groupBy('servers.id'); + ->distinct('servers.id'); + } + + /** @return Builder */ + public function accessibleNodes(): Builder + { + // Root admins can access all nodes + if ($this->isRootAdmin()) { + return Node::query(); + } + + // Check if there are no restrictions from any role + $roleIds = $this->roles()->pluck('id'); + if (!NodeRole::whereIn('role_id', $roleIds)->exists()) { + return Node::query(); + } + + return Node::whereHas('roles', fn (Builder $builder) => $builder->whereIn('roles.id', $roleIds)); } public function subusers(): HasMany @@ -314,9 +321,28 @@ public function subusers(): HasMany return $this->hasMany(Subuser::class); } - protected function checkPermission(Server $server, string $permission = ''): bool + public function subServers(): BelongsToMany { - if ($this->isRootAdmin() || $server->owner_id === $this->id) { + return $this->belongsToMany(Server::class, 'subusers'); + } + + /** @return ($key is null ? array : string|int|bool) */ + public function getCustomization(?CustomizationKey $key = null): array|string|int|bool|null + { + $customization = (is_string($this->customization) ? json_decode($this->customization, true) : $this->customization) ?? []; + $customization = array_merge(CustomizationKey::getDefaultCustomization(), $customization); + + return !$key ? $customization : $customization[$key->value]; + } + + protected function hasPermission(Server $server, string $permission = ''): bool + { + if ($this->canned('update', $server) || $server->owner_id === $this->id) { + return true; + } + + // If the user only has "view" permissions allow viewing the console + if ($permission === SubuserPermission::WebsocketConnect->value && $this->canned('view', $server)) { return true; } @@ -325,25 +351,33 @@ protected function checkPermission(Server $server, string $permission = ''): boo return false; } - $check = in_array($permission, $subuser->permissions); + return in_array($permission, $subuser->permissions); + } + + protected function checkPermission(Server $server, string|SubuserPermission $permission = ''): bool + { + if ($permission instanceof SubuserPermission) { + $permission = $permission->value; + } - return $check; + $contextKey = "users.$this->id.servers.$server->id.$permission"; + + return Context::remember($contextKey, fn () => $this->hasPermission($server, $permission)); } /** * Laravel's policies strictly check for the existence of a real method, * this checks if the ability is one of our permissions and then checks if the user can do it or not * Otherwise it calls the Authorizable trait's parent method + * + * @param iterable|BackedEnum|string $abilities + * @param array|mixed $arguments */ public function can($abilities, mixed $arguments = []): bool { - if (is_string($abilities) && str_contains($abilities, '.')) { - [$permission, $key] = str($abilities)->explode('.', 2); - - if (isset(Permission::permissions()[$permission]['keys'][$key])) { - if ($arguments instanceof Server) { - return $this->checkPermission($arguments, $abilities); - } + if ($arguments instanceof Server) { + if ($abilities instanceof SubuserPermission || Subuser::doesPermissionExist($abilities)) { + return $this->checkPermission($arguments, $abilities); } } @@ -362,31 +396,112 @@ public function isRootAdmin(): bool return $this->hasRole(Role::ROOT_ADMIN); } + public function isAdmin(): bool + { + return $this->isRootAdmin() || ($this->roles()->count() >= 1 && $this->getAllPermissions()->count() >= 1); + } + public function canAccessPanel(Panel $panel): bool { if ($this->isRootAdmin()) { return true; } - return $this->roles()->count() >= 1 && $this->getAllPermissions()->count() >= 1; + if ($panel->getId() === 'admin') { + return $this->isAdmin(); + } + + return true; } public function getFilamentName(): string { - return $this->name_first ?: $this->username; + return $this->username; } public function getFilamentAvatarUrl(): ?string { - return 'https://gravatar.com/avatar/' . md5(strtolower($this->email)); + return App::call(fn (AvatarService $service) => $service->getAvatarUrl($this)); } - public function canTarget(IlluminateModel $user): bool + public function canTarget(Model $model): bool { + // Root admins can target everyone and everything if ($this->isRootAdmin()) { return true; } - return $user instanceof User && !$user->isRootAdmin(); + // Make sure normal admins can't target root admins + if ($model instanceof User) { + return !$model->isRootAdmin(); + } + + // Make sure the user can only target accessible nodes + if ($model instanceof Node) { + return $this->accessibleNodes()->where('id', $model->id)->exists(); + } + + return false; + } + + public function getTenants(Panel $panel): array|Collection + { + return $this->accessibleServers()->get(); + } + + public function canAccessTenant(Model $tenant): bool + { + if ($tenant instanceof Server) { + if ($this->canned('view', $tenant) || $tenant->owner_id === $this->id) { + return true; + } + + $subuser = $tenant->subusers->where('user_id', $this->id)->first(); + + return $subuser !== null; + } + + return false; + } + + public function getAppAuthenticationSecret(): ?string + { + return $this->mfa_app_secret; + } + + public function saveAppAuthenticationSecret(?string $secret): void + { + $this->update(['mfa_app_secret' => $secret]); + } + + public function getAppAuthenticationHolderName(): string + { + return $this->email; + } + + /** + * @return array|null + */ + public function getAppAuthenticationRecoveryCodes(): ?array + { + return $this->mfa_app_recovery_codes; + } + + /** + * @param array|null $codes + */ + public function saveAppAuthenticationRecoveryCodes(?array $codes): void + { + $this->update(['mfa_app_recovery_codes' => $codes]); + } + + public function hasEmailAuthentication(): bool + { + return $this->mfa_email_enabled; + } + + public function toggleEmailAuthentication(bool $condition): void + { + $this->update(['mfa_email_enabled' => $condition]); } } diff --git a/app/Models/UserSSHKey.php b/app/Models/UserSSHKey.php index 1cafb2d8bb..20043cfb41 100644 --- a/app/Models/UserSSHKey.php +++ b/app/Models/UserSSHKey.php @@ -2,8 +2,14 @@ namespace App\Models; -use Illuminate\Database\Eloquent\SoftDeletes; +use App\Traits\HasValidation; +use Database\Factories\UserSSHKeyFactory; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Carbon; /** * \App\Models\UserSSHKey. @@ -13,32 +19,31 @@ * @property string $name * @property string $fingerprint * @property string $public_key - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property \Illuminate\Support\Carbon|null $deleted_at - * @property \App\Models\User $user + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property Carbon|null $deleted_at + * @property User $user * - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey newQuery() + * @method static Builder|UserSSHKey newModelQuery() + * @method static Builder|UserSSHKey newQuery() * @method static \Illuminate\Database\Query\Builder|UserSSHKey onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey query() - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereFingerprint($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey wherePublicKey($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|UserSSHKey whereUserId($value) + * @method static Builder|UserSSHKey query() + * @method static Builder|UserSSHKey whereCreatedAt($value) + * @method static Builder|UserSSHKey whereDeletedAt($value) + * @method static Builder|UserSSHKey whereFingerprint($value) + * @method static Builder|UserSSHKey whereId($value) + * @method static Builder|UserSSHKey whereName($value) + * @method static Builder|UserSSHKey wherePublicKey($value) + * @method static Builder|UserSSHKey whereUpdatedAt($value) + * @method static Builder|UserSSHKey whereUserId($value) * @method static \Illuminate\Database\Query\Builder|UserSSHKey withTrashed() * @method static \Illuminate\Database\Query\Builder|UserSSHKey withoutTrashed() - * - * @mixin \Eloquent - * - * @method static \Database\Factories\UserSSHKeyFactory factory(...$parameters) + * @method static UserSSHKeyFactory factory(...$parameters) */ class UserSSHKey extends Model { + use HasFactory; + use HasValidation; use SoftDeletes; public const RESOURCE_NAME = 'ssh_key'; @@ -51,6 +56,7 @@ class UserSSHKey extends Model 'fingerprint', ]; + /** @var array */ public static array $validationRules = [ 'name' => ['required', 'string'], 'fingerprint' => ['required', 'string'], diff --git a/app/Models/Webhook.php b/app/Models/Webhook.php new file mode 100644 index 0000000000..56f2b3da28 --- /dev/null +++ b/app/Models/Webhook.php @@ -0,0 +1,37 @@ + $payload + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + */ +class Webhook extends Model +{ + use HasFactory, MassPrunable; + + protected $fillable = ['payload', 'successful_at', 'event', 'endpoint']; + + public function casts() + { + return [ + 'payload' => 'array', + 'successful_at' => 'datetime', + ]; + } + + public function prunable(): Builder + { + return static::where('created_at', '<=', Carbon::now()->subDays(config('panel.webhook.prune_days'))); + } +} diff --git a/app/Models/WebhookConfiguration.php b/app/Models/WebhookConfiguration.php new file mode 100644 index 0000000000..7633a5648b --- /dev/null +++ b/app/Models/WebhookConfiguration.php @@ -0,0 +1,402 @@ +|null $payload + * @property string $endpoint + * @property string $description + * @property string[] $events + * @property WebhookType|string|null $type + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property Carbon|null $deleted_at + * @property array|null $headers + */ +class WebhookConfiguration extends Model +{ + use HandlesEvents, HasFactory, SoftDeletes; + + /** @var string[] */ + protected static array $eventBlacklist = [ + 'eloquent.created: App\Models\Webhook', + ]; + + protected $fillable = [ + 'type', + 'payload', + 'endpoint', + 'description', + 'events', + 'headers', + ]; + + /** + * Default values for specific fields in the database. + */ + protected $attributes = [ + 'type' => WebhookType::Regular, + 'payload' => null, + ]; + + protected function casts(): array + { + return [ + 'events' => 'array', + 'payload' => 'array', + 'type' => WebhookType::class, + 'headers' => 'array', + ]; + } + + protected static function booted(): void + { + self::saved(static function (self $webhookConfiguration): void { + $changedEvents = collect([ + ...($webhookConfiguration->events), + ...$webhookConfiguration->getOriginal('events', '[]'), + ])->unique(); + + self::updateCache($changedEvents); + }); + + self::deleted(static function (self $webhookConfiguration): void { + self::updateCache(collect($webhookConfiguration->events)); + }); + } + + private static function updateCache(Collection $eventList): void + { + $eventList->each(function (string $event) { + cache()->forever("webhooks.$event", WebhookConfiguration::query()->whereJsonContains('events', $event)->get()); + }); + + cache()->forever('watchedWebhooks', WebhookConfiguration::pluck('events')->flatten()->unique()->values()->all()); + } + + public function webhooks(): HasMany + { + return $this->hasMany(Webhook::class); + } + + /** @return string[] */ + public static function allPossibleEvents(): array + { + return collect(static::discoverCustomEvents()) + ->merge(static::allModelEvents()) + ->unique() + ->filter(fn ($event) => !in_array($event, static::$eventBlacklist)) + ->all(); + } + + /** @return array */ + public static function filamentCheckboxList(): array + { + $list = []; + $events = static::allPossibleEvents(); + foreach ($events as $event) { + $list[$event] = static::transformClassName($event); + } + + return $list; + } + + public static function transformClassName(string $event): string + { + return str($event) + ->after('eloquent.') + ->replace('App\\Models\\', '') + ->replace('App\\Events\\', 'event: ') + ->toString(); + } + + /** @return string[] */ + public static function allModelEvents(): array + { + $eventTypes = ['created', 'updated', 'deleted']; + $models = static::discoverModels(); + + $events = []; + foreach ($models as $model) { + foreach ($eventTypes as $eventType) { + $events[] = "eloquent.$eventType: $model"; + } + } + + return $events; + } + + /** @return string[] */ + public static function discoverModels(): array + { + $namespace = 'App\\Models\\'; + $directory = app_path('Models'); + + $models = []; + foreach (File::allFiles($directory) as $file) { + $models[] = $namespace . str($file->getFilename()) + ->replace([DIRECTORY_SEPARATOR, '.php'], ['\\', '']); + } + + return $models; + } + + /** @return string[] */ + public static function discoverCustomEvents(): array + { + $directory = app_path('Events'); + + $events = []; + foreach (File::allFiles($directory) as $file) { + $namespace = str($file->getPath()) + ->after(base_path()) + ->replace([DIRECTORY_SEPARATOR, '\\app\\'], ['\\', 'App\\']); + + $events[] = $namespace . '\\' . str($file->getFilename()) + ->replace([DIRECTORY_SEPARATOR, '.php'], ['\\', '']); + } + + return $events; + } + + /** + * @param array|object $replacement + * */ + public function replaceVars(array|object $replacement, string $subject): string + { + if (is_object($replacement)) { + $replacement = $replacement->toArray(); + } + + return preg_replace_callback( + '/{{(.*?)}}/', + function ($matches) use ($replacement) { + $trimmed = trim($matches[1]); + + return data_get($replacement, $trimmed, $trimmed); + }, + $subject + ); + } + + /** @param array $eventData */ + public function run(?string $eventName = null, ?array $eventData = null): void + { + $eventName ??= 'eloquent.created: '.Server::class; + $eventData ??= static::getWebhookSampleData(); + + ProcessWebhook::dispatch($this, $eventName, [$eventData]); + } + + /** + * @return array + */ + public static function getWebhookSampleData(): array + { + return [ + 'id' => 4, + 'uuid' => '4864a058-9a3b-44a9-a6cf-c1355e89406e', + 'uuid_short' => '4864a058', + 'node_id' => 1, + 'name' => 'Example Server', + 'owner_id' => 1, + 'memory' => 6144, + 'swap' => 0, + 'disk' => 20480, + 'io' => 500, + 'cpu' => 300, + 'egg_id' => 1, + 'startup' => 'java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}', + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-11T22:45:14.000000Z', + 'allocation_id' => 4, + 'image' => 'ghcr.io/pelican-eggs/yolks:java_21', + 'description' => 'This is an example server description.', + 'skip_scripts' => false, + 'external_id' => null, + 'database_limit' => 5, + 'allocation_limit' => 5, + 'threads' => null, + 'backup_limit' => 5, + 'status' => null, + 'installed_at' => '2025-09-06T03:02:31.000000Z', + 'oom_killer' => false, + 'docker_labels' => [], + 'allocation' => [ + 'id' => 4, + 'node_id' => 1, + 'ip' => '0.0.0.0', + 'port' => 25565, + 'server_id' => 4, + 'created_at' => '2025-07-01T20:12:41.000000Z', + 'updated_at' => '2025-09-09T17:47:22.000000Z', + 'ip_alias' => null, + 'notes' => null, + ], + 'variables' => [ + [ + 'id' => 1, + 'egg_id' => 1, + 'name' => 'Build Number', + 'description' => 'The build number for the paper release.\r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.', + 'env_variable' => 'BUILD_NUMBER', + 'default_value' => 'latest', + 'user_viewable' => true, + 'user_editable' => true, + 'rules' => ['required', 'string', 'max:20'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 4, + 'server_value' => 'latest', + ], + [ + 'id' => 2, + 'egg_id' => 1, + 'name' => 'Download Path', + 'description' => 'A URL to use to download a server.jar rather than the ones in the install script. This is not user\nviewable.', + 'env_variable' => 'DL_PATH', + 'default_value' => '', + 'user_viewable' => false, + 'user_editable' => false, + 'rules' => ['nullable', 'string'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 3, + 'server_value' => '', + ], + [ + 'id' => 3, + 'egg_id' => 1, + 'name' => 'Minecraft Version', + 'description' => 'The version of minecraft to download. \r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.', + 'env_variable' => 'MINECRAFT_VERSION', + 'default_value' => 'latest', + 'user_viewable' => true, + 'user_editable' => true, + 'rules' => ['nullable', 'string', 'max:20'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 1, + 'server_value' => '1.21.8', + ], + [ + 'id' => 4, + 'egg_id' => 1, + 'name' => 'Server Jar File', + 'description' => 'The name of the server jarfile to run the server with.', + 'env_variable' => 'SERVER_JARFILE', + 'default_value' => 'server.jar', + 'user_viewable' => true, + 'user_editable' => true, + 'rules' => ['required', 'regex:/^([\w\d._-]+)(\.jar)$/'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 2, + 'server_value' => 'server.jar', + ], + ], + 'server_variables' => [ + 'record-21' => [ + 'id' => 21, + 'server_id' => 4, + 'variable_id' => 3, + 'variable_value' => '1.21.8', + 'created_at' => '2025-09-06T06:00:58.000000Z', + 'updated_at' => '2025-09-09T17:59:40.000000Z', + 'variable' => [ + 'id' => 3, + 'egg_id' => 1, + 'name' => 'Minecraft Version', + 'description' => 'The version of minecraft to download. \r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.', + 'env_variable' => 'MINECRAFT_VERSION', + 'default_value' => 'latest', + 'user_viewable' => true, + 'user_editable' => true, + 'rules' => ['nullable', 'string', 'max:20'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 1, + ], + ], + 'record-22' => [ + 'id' => 22, + 'server_id' => 4, + 'variable_id' => 4, + 'variable_value' => 'server.jar', + 'created_at' => '2025-09-06T06:00:58.000000Z', + 'updated_at' => '2025-09-06T06:01:05.000000Z', + 'variable' => [ + 'id' => 4, + 'egg_id' => 1, + 'name' => 'Server Jar File', + 'description' => 'The name of the server jarfile to run the server with.', + 'env_variable' => 'SERVER_JARFILE', + 'default_value' => 'server.jar', + 'user_viewable' => true, + 'user_editable' => true, + 'rules' => ['required', 'regex:/^([\w\d._-]+)(\.jar)$/'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 2, + ], + ], + 'record-20' => [ + 'id' => 20, + 'server_id' => 4, + 'variable_id' => 2, + 'variable_value' => '', + 'created_at' => '2025-09-06T06:00:58.000000Z', + 'updated_at' => '2025-09-06T06:00:58.000000Z', + 'variable' => [ + 'id' => 2, + 'egg_id' => 1, + 'name' => 'Download Path', + 'description' => 'A URL to use to download a server.jar rather than the ones in the install script. This is not user\nviewable.', + 'env_variable' => 'DL_PATH', + 'default_value' => '', + 'user_viewable' => false, + 'user_editable' => false, + 'rules' => ['nullable', 'string'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 3, + ], + ], + 'record-19' => [ + 'id' => 19, + 'server_id' => 4, + 'variable_id' => 1, + 'variable_value' => 'latest', + 'created_at' => '2025-09-06T06:00:58.000000Z', + 'updated_at' => '2025-09-06T06:00:58.000000Z', + 'variable' => [ + 'id' => 1, + 'egg_id' => 1, + 'name' => 'Build Number', + 'description' => 'The build number for the paper release.\r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.', + 'env_variable' => 'BUILD_NUMBER', + 'default_value' => 'latest', + 'user_viewable' => true, + 'user_editable' => true, + 'rules' => ['required', 'string', 'max:20'], + 'created_at' => '2025-09-05T01:15:43.000000Z', + 'updated_at' => '2025-09-05T01:15:43.000000Z', + 'sort' => 4, + ], + ], + ], + 'event' => 'updated: Server', + ]; + } +} diff --git a/app/Notifications/AccountCreated.php b/app/Notifications/AccountCreated.php index 0123435f7f..0692b104ca 100644 --- a/app/Notifications/AccountCreated.php +++ b/app/Notifications/AccountCreated.php @@ -3,43 +3,36 @@ namespace App\Notifications; use App\Models\User; +use Filament\Facades\Filament; use Illuminate\Bus\Queueable; -use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; class AccountCreated extends Notification implements ShouldQueue { use Queueable; - /** - * Create a new notification instance. - */ - public function __construct(public User $user, public ?string $token = null) - { - } + public function __construct(public ?string $token = null) {} - /** - * Get the notification's delivery channels. - */ + /** @return string[] */ public function via(): array { return ['mail']; } - /** - * Get the mail representation of the notification. - */ - public function toMail(): MailMessage + public function toMail(User $notifiable): MailMessage { + $locale = $notifiable->language ?? 'en'; + $message = (new MailMessage()) - ->greeting('Hello ' . $this->user->name . '!') - ->line('You are receiving this email because an account has been created for you on ' . config('app.name') . '.') - ->line('Username: ' . $this->user->username) - ->line('Email: ' . $this->user->email); + ->greeting(trans('mail.greeting', ['name' => $notifiable->username], $locale)) + ->line(trans('mail.account_created.body', ['app' => config('app.name')], $locale)) + ->line(trans('mail.account_created.username', ['username' => $notifiable->username], $locale)) + ->line(trans('mail.account_created.email', ['email' => $notifiable->email], $locale)); if (!is_null($this->token)) { - return $message->action('Setup Your Account', url('/auth/password/reset/' . $this->token . '?email=' . urlencode($this->user->email))); + return $message->action(trans('mail.account_created.action', locale: $locale), Filament::getPanel('app')->getResetPasswordUrl($this->token, $notifiable)); } return $message; diff --git a/app/Notifications/AddedToServer.php b/app/Notifications/AddedToServer.php index 647c338229..a328737bf9 100644 --- a/app/Notifications/AddedToServer.php +++ b/app/Notifications/AddedToServer.php @@ -2,42 +2,34 @@ namespace App\Notifications; +use App\Filament\Server\Pages\Console; +use App\Models\Server; +use App\Models\User; use Illuminate\Bus\Queueable; -use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; class AddedToServer extends Notification implements ShouldQueue { use Queueable; - public object $server; - - /** - * Create a new notification instance. - */ - public function __construct(array $server) - { - $this->server = (object) $server; - } + public function __construct(public Server $server) {} - /** - * Get the notification's delivery channels. - */ + /** @return string[] */ public function via(): array { return ['mail']; } - /** - * Get the mail representation of the notification. - */ - public function toMail(): MailMessage + public function toMail(User $notifiable): MailMessage { + $locale = $notifiable->language ?? 'en'; + return (new MailMessage()) - ->greeting('Hello ' . $this->server->user . '!') - ->line('You have been added as a subuser for the following server, allowing you certain control over the server.') - ->line('Server Name: ' . $this->server->name) - ->action('Visit Server', url('/server/' . $this->server->uuid_short)); + ->greeting(trans('mail.greeting', ['name' => $notifiable->username], $locale)) + ->line(trans('mail.added_to_server.body', locale: $locale)) + ->line(trans('mail.added_to_server.server_name', ['name' => $this->server->name], $locale)) + ->action(trans('mail.added_to_server.action', locale: $locale), Console::getUrl(panel: 'server', tenant: $this->server)); } } diff --git a/app/Notifications/MailTested.php b/app/Notifications/MailTested.php index 3bb816bf79..f44566b4ac 100644 --- a/app/Notifications/MailTested.php +++ b/app/Notifications/MailTested.php @@ -3,15 +3,16 @@ namespace App\Notifications; use App\Models\User; -use Illuminate\Notifications\Notification; use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; class MailTested extends Notification { - public function __construct(private User $user) - { - } + public function __construct(private User $user) {} + /** + * @return string[] + */ public function via(): array { return ['mail']; @@ -19,9 +20,11 @@ public function via(): array public function toMail(): MailMessage { + $locale = $this->user->language ?? 'en'; + return (new MailMessage()) - ->subject('Panel Test Message') - ->greeting('Hello ' . $this->user->name . '!') - ->line('This is a test of the Panel mail system. You\'re good to go!'); + ->subject(trans('mail.mail_tested.subject', locale: $locale)) + ->greeting(trans('mail.greeting', ['name' => $this->user->username], $locale)) + ->line(trans('mail.mail_tested.body', locale: $locale)); } } diff --git a/app/Notifications/RemovedFromServer.php b/app/Notifications/RemovedFromServer.php index 668d8f28a5..1ff2e2f519 100644 --- a/app/Notifications/RemovedFromServer.php +++ b/app/Notifications/RemovedFromServer.php @@ -2,43 +2,34 @@ namespace App\Notifications; +use App\Models\Server; +use App\Models\User; use Illuminate\Bus\Queueable; -use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; class RemovedFromServer extends Notification implements ShouldQueue { use Queueable; - public object $server; - - /** - * Create a new notification instance. - */ - public function __construct(array $server) - { - $this->server = (object) $server; - } + public function __construct(public Server $server) {} - /** - * Get the notification's delivery channels. - */ + /** @return string[] */ public function via(): array { return ['mail']; } - /** - * Get the mail representation of the notification. - */ - public function toMail(): MailMessage + public function toMail(User $notifiable): MailMessage { + $locale = $notifiable->language ?? 'en'; + return (new MailMessage()) ->error() - ->greeting('Hello ' . $this->server->user . '.') - ->line('You have been removed as a subuser for the following server.') - ->line('Server Name: ' . $this->server->name) - ->action('Visit Panel', route('index')); + ->greeting(trans('mail.greeting', ['name' => $notifiable->username], $locale)) + ->line(trans('mail.removed_from_server.body', locale: $locale)) + ->line(trans('mail.removed_from_server.server_name', ['name' => $this->server->name], $locale)) + ->action(trans('mail.removed_from_server.action', locale: $locale), url('')); } } diff --git a/app/Notifications/SendPasswordReset.php b/app/Notifications/SendPasswordReset.php deleted file mode 100644 index 434d1dd489..0000000000 --- a/app/Notifications/SendPasswordReset.php +++ /dev/null @@ -1,40 +0,0 @@ -subject('Reset Password') - ->line('You are receiving this email because we received a password reset request for your account.') - ->action('Reset Password', url('/auth/password/reset/' . $this->token . '?email=' . urlencode($notifiable->email))) - ->line('If you did not request a password reset, no further action is required.'); - } -} diff --git a/app/Notifications/ServerInstalled.php b/app/Notifications/ServerInstalled.php index fa6500afab..40f894b0b1 100644 --- a/app/Notifications/ServerInstalled.php +++ b/app/Notifications/ServerInstalled.php @@ -2,58 +2,34 @@ namespace App\Notifications; +use App\Filament\Server\Pages\Console; +use App\Models\Server; use App\Models\User; use Illuminate\Bus\Queueable; -use App\Events\Event; -use App\Models\Server; -use Illuminate\Container\Container; -use App\Events\Server\Installed; -use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Contracts\Notifications\Dispatcher; use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; class ServerInstalled extends Notification implements ShouldQueue { use Queueable; - public Server $server; - - public User $user; + public function __construct(public Server $server) {} - /** - * Handle a direct call to this notification from the server installed event. This is configured - * in the event service provider. - */ - public function handle(Installed $event): void - { - $event->server->loadMissing('user'); - - $this->server = $event->server; - $this->user = $event->server->user; - - // Since we are calling this notification directly from an event listener we need to fire off the dispatcher - // to send the email now. Don't use send() or you'll end up firing off two different events. - Container::getInstance()->make(Dispatcher::class)->sendNow($this->user, $this); - } - - /** - * Get the notification's delivery channels. - */ + /** @return string[] */ public function via(): array { return ['mail']; } - /** - * Get the mail representation of the notification. - */ - public function toMail(): MailMessage + public function toMail(User $notifiable): MailMessage { + $locale = $notifiable->language ?? 'en'; + return (new MailMessage()) - ->greeting('Hello ' . $this->user->username . '.') - ->line('Your server has finished installing and is now ready for you to use.') - ->line('Server Name: ' . $this->server->name) - ->action('Login and Begin Using', route('index')); + ->greeting(trans('mail.greeting', ['name' => $notifiable->username], $locale)) + ->line(trans('mail.server_installed.body', locale: $locale)) + ->line(trans('mail.server_installed.server_name', ['name' => $this->server->name], $locale)) + ->action(trans('mail.server_installed.action', locale: $locale), Console::getUrl(panel: 'server', tenant: $this->server)); } } diff --git a/app/Observers/EggVariableObserver.php b/app/Observers/EggVariableObserver.php deleted file mode 100644 index 6fd6b12e6d..0000000000 --- a/app/Observers/EggVariableObserver.php +++ /dev/null @@ -1,22 +0,0 @@ -field_type)) { - unset($variable->field_type); - } - } - - public function updating(EggVariable $variable): void - { - if (isset($variable->field_type)) { - unset($variable->field_type); - } - } -} diff --git a/app/Observers/ServerObserver.php b/app/Observers/ServerObserver.php deleted file mode 100644 index 1804511a0c..0000000000 --- a/app/Observers/ServerObserver.php +++ /dev/null @@ -1,76 +0,0 @@ -user->notify(new AddedToServer([ - 'user' => $subuser->user->name_first, - 'name' => $subuser->server->name, - 'uuid_short' => $subuser->server->uuid_short, - ])); - } - - /** - * Listen to the Subuser deleting event. - */ - public function deleting(Subuser $subuser): void - { - event(new Events\Subuser\Deleting($subuser)); - } - - /** - * Listen to the Subuser deleted event. - */ - public function deleted(Subuser $subuser): void - { - event(new Events\Subuser\Deleted($subuser)); - - $subuser->user->notify(new RemovedFromServer([ - 'user' => $subuser->user->name_first, - 'name' => $subuser->server->name, - ])); - } -} diff --git a/app/Observers/UserObserver.php b/app/Observers/UserObserver.php deleted file mode 100644 index 6ec0888303..0000000000 --- a/app/Observers/UserObserver.php +++ /dev/null @@ -1,43 +0,0 @@ -validate(); + } catch (ValidationException $exception) { + throw new DataValidationException($exception->validator, $model); + } + } +} diff --git a/app/PHPStan/ForbiddenGlobalFunctionsRule.php b/app/PHPStan/ForbiddenGlobalFunctionsRule.php new file mode 100644 index 0000000000..44836cb64a --- /dev/null +++ b/app/PHPStan/ForbiddenGlobalFunctionsRule.php @@ -0,0 +1,39 @@ +name instanceof Name) { + $functionName = (string) $node->name; + if (in_array($functionName, self::FORBIDDEN_FUNCTIONS, true)) { + return [ + RuleErrorBuilder::message(sprintf( + 'Usage of global function "%s" is forbidden.', + $functionName, + ))->identifier('myCustomRules.forbiddenGlobalFunctions')->build(), + ]; + } + } + + return []; + } +} diff --git a/app/Policies/.gitkeep b/app/Policies/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Policies/ActivityLogPolicy.php b/app/Policies/ActivityLogPolicy.php new file mode 100644 index 0000000000..df5fffa219 --- /dev/null +++ b/app/Policies/ActivityLogPolicy.php @@ -0,0 +1,21 @@ +can(SubuserPermission::ActivityRead, Filament::getTenant()); + } + + public function view(User $user, Model $model): bool + { + return $user->can(SubuserPermission::ActivityRead, Filament::getTenant()); + } +} diff --git a/app/Policies/AllocationPolicy.php b/app/Policies/AllocationPolicy.php new file mode 100644 index 0000000000..4a3a58744a --- /dev/null +++ b/app/Policies/AllocationPolicy.php @@ -0,0 +1,89 @@ +canTarget($allocation->node)) { + return false; + } + + return null; + } + + public function viewAny(User $user): bool + { + /** @var ?Server $server */ + $server = Filament::getTenant(); + + return $server ? $user->can(SubuserPermission::AllocationRead, $server) : $this->adminViewAny($user); + } + + public function view(User $user, Model $model): bool + { + /** @var ?Server $server */ + $server = Filament::getTenant(); + + return $server ? $user->can(SubuserPermission::AllocationRead, $server) : $this->adminView($user, $model); + } + + public function create(User $user): bool + { + /** @var ?Server $server */ + $server = Filament::getTenant(); + + return $server ? $user->can(SubuserPermission::AllocationCreate, $server) : $this->adminCreate($user); + } + + public function update(User $user, Model $model): bool + { + /** @var ?Server $server */ + $server = Filament::getTenant(); + + return $server ? $user->can(SubuserPermission::AllocationUpdate, $server) : $this->adminUpdate($user, $model); + } + + public function delete(User $user, Model $model): bool + { + /** @var ?Server $server */ + $server = Filament::getTenant(); + + return $server ? $user->can(SubuserPermission::AllocationDelete, $server) : $this->adminDelete($user, $model); + } + + public function deleteAny(User $user): bool + { + /** @var ?Server $server */ + $server = Filament::getTenant(); + + return $server ? $user->can(SubuserPermission::AllocationDelete, $server) : $this->adminDeleteAny($user); + } +} diff --git a/app/Policies/ApiKeyPolicy.php b/app/Policies/ApiKeyPolicy.php index 37aac90939..848787c234 100644 --- a/app/Policies/ApiKeyPolicy.php +++ b/app/Policies/ApiKeyPolicy.php @@ -4,7 +4,7 @@ class ApiKeyPolicy { - use DefaultPolicies; + use DefaultAdminPolicies; - protected string $modelName = 'apikey'; + protected string $modelName = 'apiKey'; } diff --git a/app/Policies/BackupPolicy.php b/app/Policies/BackupPolicy.php new file mode 100644 index 0000000000..1407f5fff9 --- /dev/null +++ b/app/Policies/BackupPolicy.php @@ -0,0 +1,31 @@ +can(SubuserPermission::BackupRead, Filament::getTenant()); + } + + public function view(User $user, Model $model): bool + { + return $user->can(SubuserPermission::BackupRead, Filament::getTenant()); + } + + public function create(User $user): bool + { + return $user->can(SubuserPermission::BackupCreate, Filament::getTenant()); + } + + public function delete(User $user, Model $model): bool + { + return $user->can(SubuserPermission::BackupDelete, Filament::getTenant()); + } +} diff --git a/app/Policies/DatabaseHostPolicy.php b/app/Policies/DatabaseHostPolicy.php index b939540645..00ae26dd59 100644 --- a/app/Policies/DatabaseHostPolicy.php +++ b/app/Policies/DatabaseHostPolicy.php @@ -2,9 +2,28 @@ namespace App\Policies; +use App\Models\DatabaseHost; +use App\Models\User; + class DatabaseHostPolicy { - use DefaultPolicies; + use DefaultAdminPolicies; + + protected string $modelName = 'databaseHost'; + + public function before(User $user, string $ability, string|DatabaseHost $databaseHost): ?bool + { + // For "viewAny" the $databaseHost param is the class name + if (is_string($databaseHost)) { + return null; + } + + foreach ($databaseHost->nodes as $node) { + if (!$user->canTarget($node)) { + return false; + } + } - protected string $modelName = 'databasehost'; + return null; + } } diff --git a/app/Policies/DatabasePolicy.php b/app/Policies/DatabasePolicy.php index ce54b9e643..e14fa9103c 100644 --- a/app/Policies/DatabasePolicy.php +++ b/app/Policies/DatabasePolicy.php @@ -2,9 +2,35 @@ namespace App\Policies; +use App\Enums\SubuserPermission; +use App\Models\User; +use Filament\Facades\Filament; +use Illuminate\Database\Eloquent\Model; + class DatabasePolicy { - use DefaultPolicies; + public function viewAny(User $user): bool + { + return $user->can(SubuserPermission::DatabaseRead, Filament::getTenant()); + } + + public function view(User $user, Model $model): bool + { + return $user->can(SubuserPermission::DatabaseRead, Filament::getTenant()); + } + + public function create(User $user): bool + { + return $user->can(SubuserPermission::DatabaseCreate, Filament::getTenant()); + } + + public function update(User $user, Model $model): bool + { + return $user->can(SubuserPermission::DatabaseUpdate, Filament::getTenant()); + } - protected string $modelName = 'database'; + public function delete(User $user, Model $model): bool + { + return $user->can(SubuserPermission::DatabaseDelete, Filament::getTenant()); + } } diff --git a/app/Policies/DefaultAdminPolicies.php b/app/Policies/DefaultAdminPolicies.php new file mode 100644 index 0000000000..f5dd029425 --- /dev/null +++ b/app/Policies/DefaultAdminPolicies.php @@ -0,0 +1,44 @@ +can('viewList ' . $this->modelName); + } + + public function view(User $user, Model $model): bool + { + return $user->can('view ' . $this->modelName, $model); + } + + public function create(User $user): bool + { + return $user->can('create ' . $this->modelName); + } + + public function update(User $user, Model $model): bool + { + return $user->can('update ' . $this->modelName, $model); + } + + public function delete(User $user, Model $model): bool + { + return $user->can('delete ' . $this->modelName, $model); + } + + public function deleteAny(User $user): bool + { + return $user->can('delete ' . $this->modelName); + } + + public function replicate(User $user, Model $model): bool + { + return $user->can('create ' . $this->modelName); + } +} diff --git a/app/Policies/DefaultPolicies.php b/app/Policies/DefaultPolicies.php deleted file mode 100644 index 3035cae198..0000000000 --- a/app/Policies/DefaultPolicies.php +++ /dev/null @@ -1,49 +0,0 @@ -can('viewList ' . $this->modelName); - } - - /** - * Determine whether the user can view the model. - */ - public function view(User $user, Model $model): bool - { - return $user->can('view ' . $this->modelName, $model); - } - - /** - * Determine whether the user can create models. - */ - public function create(User $user): bool - { - return $user->can('create ' . $this->modelName); - } - - /** - * Determine whether the user can update the model. - */ - public function update(User $user, Model $model): bool - { - return $user->can('update ' . $this->modelName, $model); - } - - /** - * Determine whether the user can delete the model. - */ - public function delete(User $user, Model $model): bool - { - return $user->can('delete ' . $this->modelName, $model); - } -} diff --git a/app/Policies/EggPolicy.php b/app/Policies/EggPolicy.php index bd589f1b25..64d7749836 100644 --- a/app/Policies/EggPolicy.php +++ b/app/Policies/EggPolicy.php @@ -4,7 +4,7 @@ class EggPolicy { - use DefaultPolicies; + use DefaultAdminPolicies; protected string $modelName = 'egg'; } diff --git a/app/Policies/FilePolicy.php b/app/Policies/FilePolicy.php new file mode 100644 index 0000000000..3940b7e0af --- /dev/null +++ b/app/Policies/FilePolicy.php @@ -0,0 +1,36 @@ +can(SubuserPermission::FileRead, Filament::getTenant()); + } + + public function view(User $user, Model $model): bool + { + return $user->can(SubuserPermission::FileReadContent, Filament::getTenant()); + } + + public function create(User $user): bool + { + return $user->can(SubuserPermission::FileCreate, Filament::getTenant()); + } + + public function update(User $user, Model $model): bool + { + return $user->can(SubuserPermission::FileUpdate, Filament::getTenant()); + } + + public function delete(User $user, Model $model): bool + { + return $user->can(SubuserPermission::FileDelete, Filament::getTenant()); + } +} diff --git a/app/Policies/MountPolicy.php b/app/Policies/MountPolicy.php index 4f9d58b63b..356ca46852 100644 --- a/app/Policies/MountPolicy.php +++ b/app/Policies/MountPolicy.php @@ -2,9 +2,28 @@ namespace App\Policies; +use App\Models\Mount; +use App\Models\User; + class MountPolicy { - use DefaultPolicies; + use DefaultAdminPolicies; protected string $modelName = 'mount'; + + public function before(User $user, string $ability, string|Mount $mount): ?bool + { + // For "viewAny" the $mount param is the class name + if (is_string($mount)) { + return null; + } + + foreach ($mount->nodes as $node) { + if (!$user->canTarget($node)) { + return false; + } + } + + return null; + } } diff --git a/app/Policies/NodePolicy.php b/app/Policies/NodePolicy.php index 8f23cc666c..412dd03733 100644 --- a/app/Policies/NodePolicy.php +++ b/app/Policies/NodePolicy.php @@ -2,9 +2,26 @@ namespace App\Policies; +use App\Models\Node; +use App\Models\User; + class NodePolicy { - use DefaultPolicies; + use DefaultAdminPolicies; protected string $modelName = 'node'; + + public function before(User $user, string $ability, string|Node $node): ?bool + { + // For "viewAny" the $node param is the class name + if (is_string($node)) { + return null; + } + + if (!$user->canTarget($node)) { + return false; + } + + return null; + } } diff --git a/app/Policies/PluginPolicy.php b/app/Policies/PluginPolicy.php new file mode 100644 index 0000000000..0e70632504 --- /dev/null +++ b/app/Policies/PluginPolicy.php @@ -0,0 +1,10 @@ +can(SubuserPermission::ScheduleRead, Filament::getTenant()); + } + + public function view(User $user, Model $model): bool + { + return $user->can(SubuserPermission::ScheduleRead, Filament::getTenant()); + } + + public function create(User $user): bool + { + return $user->can(SubuserPermission::ScheduleCreate, Filament::getTenant()); + } + + public function update(User $user, Model $model): bool + { + return $user->can(SubuserPermission::ScheduleUpdate, Filament::getTenant()); + } + + public function delete(User $user, Model $model): bool + { + return $user->can(SubuserPermission::ScheduleDelete, Filament::getTenant()); + } +} diff --git a/app/Policies/ServerPolicy.php b/app/Policies/ServerPolicy.php index dbc2ae4028..6f58b28fbe 100644 --- a/app/Policies/ServerPolicy.php +++ b/app/Policies/ServerPolicy.php @@ -3,11 +3,12 @@ namespace App\Policies; use App\Models\Server; +use App\Models\Subuser; use App\Models\User; class ServerPolicy { - use DefaultPolicies; + use DefaultAdminPolicies; protected string $modelName = 'server'; @@ -21,15 +22,22 @@ public function before(User $user, string $ability, string|Server $server): ?boo return null; } - // Owner has full server permissions - if ($server->owner_id === $user->id) { - return true; + if (Subuser::doesPermissionExist($ability)) { + // Owner has full server permissions + if ($server->owner_id === $user->id) { + return true; + } + + $subuser = $server->subusers->where('user_id', $user->id)->first(); + // If the user is a subuser check their permissions + if ($subuser && in_array($ability, $subuser->permissions)) { + return true; + } } - $subuser = $server->subusers->where('user_id', $user->id)->first(); - // If the user is a subuser check their permissions - if ($subuser) { - return in_array($ability, $subuser->permissions); + // Make sure user can target node of the server + if (!$user->canTarget($server->node)) { + return false; } // Return null to let default policies take over @@ -40,8 +48,10 @@ public function before(User $user, string $ability, string|Server $server): ?boo * This is a horrendous hack to avoid Laravel's "smart" behavior that does * not call the before() function if there isn't a function matching the * policy permission. + * + * @param array $arguments */ - public function __call(string $name, mixed $arguments) + public function __call(string $name, array $arguments): void { // do nothing } diff --git a/app/Policies/SubuserPolicy.php b/app/Policies/SubuserPolicy.php new file mode 100644 index 0000000000..37b88089d2 --- /dev/null +++ b/app/Policies/SubuserPolicy.php @@ -0,0 +1,36 @@ +can(SubuserPermission::UserRead, Filament::getTenant()); + } + + public function view(User $user, Model $model): bool + { + return $user->can(SubuserPermission::UserRead, Filament::getTenant()); + } + + public function create(User $user): bool + { + return $user->can(SubuserPermission::UserCreate, Filament::getTenant()); + } + + public function update(User $user, Model $model): bool + { + return $user->can(SubuserPermission::UserUpdate, Filament::getTenant()); + } + + public function delete(User $user, Model $model): bool + { + return $user->can(SubuserPermission::UserDelete, Filament::getTenant()); + } +} diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 6f975b474d..14c15d359c 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -7,7 +7,7 @@ class UserPolicy { - use DefaultPolicies { + use DefaultAdminPolicies { update as defaultUpdate; delete as defaultDelete; } diff --git a/app/Policies/WebhookConfigurationPolicy.php b/app/Policies/WebhookConfigurationPolicy.php new file mode 100644 index 0000000000..3ce18aa159 --- /dev/null +++ b/app/Policies/WebhookConfigurationPolicy.php @@ -0,0 +1,10 @@ +app->scoped(ActivityLogBatchService::class); $this->app->scoped(ActivityLogTargetableService::class); } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 20a6b0dd51..927ef7bce3 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,61 +2,76 @@ namespace App\Providers; -use App\Extensions\Themes\Theme; -use App\Models; +use App\Checks\CacheCheck; +use App\Checks\DatabaseCheck; +use App\Checks\DebugModeCheck; +use App\Checks\EnvironmentCheck; +use App\Checks\NodeVersionsCheck; +use App\Checks\PanelVersionCheck; +use App\Checks\ScheduleCheck; +use App\Checks\UsedDiskSpaceCheck; +use App\Models\Allocation; use App\Models\ApiKey; +use App\Models\Backup; +use App\Models\Database; +use App\Models\Egg; +use App\Models\EggVariable; use App\Models\Node; +use App\Models\Schedule; +use App\Models\Server; +use App\Models\Task; use App\Models\User; +use App\Models\UserSSHKey; +use App\Services\Helpers\PluginService; use App\Services\Helpers\SoftwareVersionService; use Dedoc\Scramble\Scramble; use Dedoc\Scramble\Support\Generator\OpenApi; use Dedoc\Scramble\Support\Generator\SecurityScheme; -use Filament\Support\Colors\Color; -use Filament\Support\Facades\FilamentColor; +use Filament\Auth\Http\Responses\Contracts\LoginResponse as LoginResponseContract; +use Illuminate\Config\Repository; use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Pagination\Paginator; -use Illuminate\Support\Facades\Broadcast; -use Illuminate\Support\Facades\Event; +use Illuminate\Foundation\Application; +use Illuminate\Foundation\Console\AboutCommand; use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\URL; -use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Str; use Laravel\Sanctum\Sanctum; +use Spatie\Health\Facades\Health; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. */ - public function boot(): void - { - $versionData = app(SoftwareVersionService::class)->versionData(); - View::share('appVersion', $versionData['version'] ?? 'undefined'); - View::share('appIsGit', $versionData['is_git'] ?? false); - - Paginator::useBootstrap(); - + public function boot( + Application $app, + SoftwareVersionService $versionService, + Repository $config, + ): void { // If the APP_URL value is set with https:// make sure we force it here. Theoretically // this should just work with the proxy logic, but there are a lot of cases where it // doesn't, and it triggers a lot of support requests, so lets just head it off here. - if (Str::startsWith(config('app.url') ?? '', 'https://')) { - URL::forceScheme('https'); + URL::forceHttps(Str::startsWith(config('app.url') ?? '', 'https://')); + + if ($app->runningInConsole() && empty(config('app.key'))) { + $config->set('app.key', ''); } Relation::enforceMorphMap([ - 'allocation' => Models\Allocation::class, - 'api_key' => Models\ApiKey::class, - 'backup' => Models\Backup::class, - 'database' => Models\Database::class, - 'egg' => Models\Egg::class, - 'egg_variable' => Models\EggVariable::class, - 'schedule' => Models\Schedule::class, - 'server' => Models\Server::class, - 'ssh_key' => Models\UserSSHKey::class, - 'task' => Models\Task::class, - 'user' => Models\User::class, + 'allocation' => Allocation::class, + 'api_key' => ApiKey::class, + 'backup' => Backup::class, + 'database' => Database::class, + 'egg' => Egg::class, + 'egg_variable' => EggVariable::class, + 'schedule' => Schedule::class, + 'server' => Server::class, + 'ssh_key' => UserSSHKey::class, + 'task' => Task::class, + 'user' => User::class, + 'node' => Node::class, ]); Http::macro( @@ -65,37 +80,45 @@ public function boot(): void ->asJson() ->withToken($node->daemon_token) ->withHeaders($headers) - ->withOptions(['verify' => (bool) app()->environment('production')]) + ->withOptions(['verify' => (bool) $app->environment('production')]) ->timeout(config('panel.guzzle.timeout')) ->connectTimeout(config('panel.guzzle.connect_timeout')) ->baseUrl($node->getConnectionAddress()) ); - $this->bootAuth(); - $this->bootBroadcast(); + Sanctum::usePersonalAccessTokenModel(ApiKey::class); - $bearerTokens = fn (OpenApi $openApi) => $openApi->secure(SecurityScheme::http('bearer')); Gate::define('viewApiDocs', fn () => true); - Scramble::registerApi('application', ['api_path' => 'api/application', 'info' => ['version' => '1.0']]); + + $bearerTokens = fn (OpenApi $openApi) => $openApi->secure(SecurityScheme::http('bearer')); + Scramble::registerApi('application', ['api_path' => 'api/application', 'info' => ['version' => '1.0']])->afterOpenApiGenerated($bearerTokens); Scramble::registerApi('client', ['api_path' => 'api/client', 'info' => ['version' => '1.0']])->afterOpenApiGenerated($bearerTokens); - Scramble::registerApi('remote', ['api_path' => 'api/remote', 'info' => ['version' => '1.0']])->afterOpenApiGenerated($bearerTokens); - - Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) { - $event->extendSocialite('discord', \SocialiteProviders\Discord\Provider::class); - }); - - FilamentColor::register([ - 'danger' => Color::Red, - 'gray' => Color::Zinc, - 'info' => Color::Sky, - 'primary' => Color::Blue, - 'success' => Color::Green, - 'warning' => Color::Amber, + + // Don't run any health checks during tests + if (!$app->runningUnitTests()) { + Health::checks([ + DebugModeCheck::new()->if($app->isProduction()), + EnvironmentCheck::new(), + CacheCheck::new(), + DatabaseCheck::new(), + ScheduleCheck::new(), + UsedDiskSpaceCheck::new(), + PanelVersionCheck::new(), + NodeVersionsCheck::new(), + ]); + } + + Gate::before(fn (User $user, $ability) => $user->isRootAdmin() ? true : null); + + AboutCommand::add('Pelican', [ + 'Panel Version' => $versionService->currentPanelVersion(), + 'Latest Version' => $versionService->latestPanelVersion(), + 'Up-to-Date' => $versionService->isLatestPanel() ? 'Yes' : 'No', ]); - Gate::before(function (User $user, $ability) { - return $user->isRootAdmin() ? true : null; - }); + AboutCommand::add('Drivers', 'Backups', config('backups.default')); + + AboutCommand::add('Environment', 'Installation Directory', base_path()); } /** @@ -103,28 +126,13 @@ public function boot(): void */ public function register(): void { - $this->app->singleton('extensions.themes', function () { - return new Theme(); - }); + $this->app->bind(LoginResponseContract::class, \App\Http\Responses\LoginResponse::class); - Scramble::extendOpenApi(fn (OpenApi $openApi) => $openApi->secure(SecurityScheme::http('bearer'))); Scramble::ignoreDefaultRoutes(); - } - public function bootAuth(): void - { - Sanctum::usePersonalAccessTokenModel(ApiKey::class); - } + /** @var PluginService $pluginService */ + $pluginService = app(PluginService::class); // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions - public function bootBroadcast(): void - { - Broadcast::routes(); - - /* - * Authenticate the user's personal channel... - */ - Broadcast::channel('App.User.*', function ($user, $userId) { - return (int) $user->id === (int) $userId; - }); + $pluginService->loadPlugins(); } } diff --git a/app/Providers/BackupsServiceProvider.php b/app/Providers/BackupsServiceProvider.php index 2a1725760c..0d970afe3f 100644 --- a/app/Providers/BackupsServiceProvider.php +++ b/app/Providers/BackupsServiceProvider.php @@ -2,9 +2,9 @@ namespace App\Providers; -use Illuminate\Support\ServiceProvider; use App\Extensions\Backups\BackupManager; use Illuminate\Contracts\Support\DeferrableProvider; +use Illuminate\Support\ServiceProvider; class BackupsServiceProvider extends ServiceProvider implements DeferrableProvider { @@ -18,6 +18,9 @@ public function register(): void }); } + /** + * @return class-string[] + */ public function provides(): array { return [BackupManager::class]; diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index e8b9a9a0d9..50a6e42cdd 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,16 +2,7 @@ namespace App\Providers; -use App\Models\User; -use App\Models\Server; -use App\Models\Subuser; -use App\Models\EggVariable; -use App\Observers\UserObserver; -use App\Observers\ServerObserver; -use App\Observers\SubuserObserver; -use App\Observers\EggVariableObserver; -use App\Events\Server\Installed as ServerInstalledEvent; -use App\Notifications\ServerInstalled as ServerInstalledNotification; +use App\Listeners\DispatchWebhooks; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider @@ -20,19 +11,9 @@ class EventServiceProvider extends ServiceProvider * The event to listener mappings for the application. */ protected $listen = [ - ServerInstalledEvent::class => [ServerInstalledNotification::class], + 'App\\*' => [DispatchWebhooks::class], + 'eloquent.created*' => [DispatchWebhooks::class], + 'eloquent.deleted*' => [DispatchWebhooks::class], + 'eloquent.updated*' => [DispatchWebhooks::class], ]; - - /** - * Register any events for your application. - */ - public function boot(): void - { - parent::boot(); - - User::observe(UserObserver::class); - Server::observe(ServerObserver::class); - Subuser::observe(SubuserObserver::class); - EggVariable::observe(EggVariableObserver::class); - } } diff --git a/app/Providers/Extensions/AvatarServiceProvider.php b/app/Providers/Extensions/AvatarServiceProvider.php new file mode 100644 index 0000000000..a108c690d9 --- /dev/null +++ b/app/Providers/Extensions/AvatarServiceProvider.php @@ -0,0 +1,24 @@ +app->singleton(AvatarService::class, function ($app) { + $service = new AvatarService(config('panel.filament.uploadable-avatars', false), config('panel.filament.avatar-provider', 'gravatar')); + + // Default Avatar providers + $service->register(new GravatarSchema()); + $service->register(new UiAvatarsSchema()); + + return $service; + }); + } +} diff --git a/app/Providers/Extensions/CaptchaServiceProvider.php b/app/Providers/Extensions/CaptchaServiceProvider.php new file mode 100644 index 0000000000..82c891bd91 --- /dev/null +++ b/app/Providers/Extensions/CaptchaServiceProvider.php @@ -0,0 +1,22 @@ +app->singleton(CaptchaService::class, function ($app) { + $service = new CaptchaService(); + + // Default Captcha providers + $service->register(new TurnstileSchema()); + + return $service; + }); + } +} diff --git a/app/Providers/Extensions/FeatureServiceProvider.php b/app/Providers/Extensions/FeatureServiceProvider.php new file mode 100644 index 0000000000..abdce5524e --- /dev/null +++ b/app/Providers/Extensions/FeatureServiceProvider.php @@ -0,0 +1,30 @@ +app->singleton(FeatureService::class, function ($app) { + $provider = new FeatureService(); + + // Default Feature providers + $provider->register(new GSLTokenSchema()); + $provider->register(new JavaVersionSchema()); + $provider->register(new MinecraftEulaSchema()); + $provider->register(new PIDLimitSchema()); + $provider->register(new SteamDiskSpaceSchema()); + + return $provider; + }); + } +} diff --git a/app/Providers/Extensions/OAuthServiceProvider.php b/app/Providers/Extensions/OAuthServiceProvider.php new file mode 100644 index 0000000000..abc619dcbb --- /dev/null +++ b/app/Providers/Extensions/OAuthServiceProvider.php @@ -0,0 +1,44 @@ +app->singleton(OAuthService::class, function ($app) { + $service = new OAuthService(); + + // Default OAuth providers included with Socialite + $service->register(new FacebookSchema()); + $service->register(new XSchema()); + $service->register(new LinkedinSchema()); + $service->register(new GoogleSchema()); + $service->register(new GithubSchema()); + $service->register(new GitlabSchema()); + $service->register(new BitbucketSchema()); + $service->register(new SlackSchema()); + + // Additional OAuth providers from socialiteproviders.com + $service->register(new AuthentikSchema()); + $service->register(new DiscordSchema()); + $service->register(new SteamSchema()); + + return $service; + }); + } +} diff --git a/app/Providers/Extensions/TaskServiceProvider.php b/app/Providers/Extensions/TaskServiceProvider.php new file mode 100644 index 0000000000..d5cd0d1148 --- /dev/null +++ b/app/Providers/Extensions/TaskServiceProvider.php @@ -0,0 +1,31 @@ +app->singleton(TaskService::class, function ($app) { + $service = new TaskService(); + + // Default Task providers + $service->register(new PowerActionSchema($app->make(DaemonServerRepository::class))); + $service->register(new SendCommandSchema()); + $service->register(new CreateBackupSchema($app->make(InitiateBackupService::class))); + $service->register(new DeleteFilesSchema($app->make(DeleteFilesService::class))); + + return $service; + }); + } +} diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 0aef2f030a..4512c95a53 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -2,70 +2,57 @@ namespace App\Providers\Filament; -use App\Filament\Resources\UserResource\Pages\EditProfile; -use App\Http\Middleware\LanguageMiddleware; -use Filament\Http\Middleware\Authenticate; -use Filament\Http\Middleware\DisableBladeIconComponents; -use Filament\Http\Middleware\DispatchServingFilamentEvent; +use App\Enums\TablerIcon; +use App\Filament\Admin\Pages\ListLogs; +use App\Filament\Admin\Pages\ViewLogs; +use App\Services\Helpers\PluginService; +use Boquizo\FilamentLogViewer\FilamentLogViewerPlugin; +use Filament\Actions\Action; +use Filament\Facades\Filament; +use Filament\Navigation\NavigationGroup; use Filament\Panel; -use Filament\PanelProvider; -use Filament\Support\Facades\FilamentAsset; -use Filament\Widgets; -use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; -use Illuminate\Cookie\Middleware\EncryptCookies; -use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; -use Illuminate\Routing\Middleware\SubstituteBindings; -use Illuminate\Session\Middleware\AuthenticateSession; -use Illuminate\Session\Middleware\StartSession; -use Illuminate\View\Middleware\ShareErrorsFromSession; class AdminPanelProvider extends PanelProvider { - public function boot() - { - FilamentAsset::registerCssVariables([ - 'sidebar-width' => '16rem !important', - ]); - } - public function panel(Panel $panel): Panel { - return $panel - ->default() + $panel = parent::panel($panel) ->id('admin') ->path('admin') - ->topNavigation(config('panel.filament.top-navigation', true)) - ->login() - ->breadcrumbs(false) ->homeUrl('/') - ->favicon(config('app.favicon', '/pelican.ico')) - ->brandName(config('app.name', 'Pelican')) - ->brandLogo(config('app.logo')) - ->brandLogoHeight('2rem') - ->profile(EditProfile::class, false) - ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources') - ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages') - ->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\\Filament\\Clusters') - ->spa() - ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets') - ->widgets([ - Widgets\AccountWidget::class, - Widgets\FilamentInfoWidget::class, + ->breadcrumbs(false) + ->sidebarCollapsibleOnDesktop(fn () => !$panel->hasTopNavigation()) + ->userMenuItems([ + Action::make('exit_admin') + ->label(fn () => trans('profile.exit_admin')) + ->url(fn () => Filament::getPanel('app')->getUrl()) + ->icon(TablerIcon::ArrowBack), ]) - ->middleware([ - EncryptCookies::class, - AddQueuedCookiesToResponse::class, - StartSession::class, - AuthenticateSession::class, - ShareErrorsFromSession::class, - VerifyCsrfToken::class, - SubstituteBindings::class, - DisableBladeIconComponents::class, - DispatchServingFilamentEvent::class, - LanguageMiddleware::class, + ->navigationGroups([ + NavigationGroup::make(fn () => trans('admin/dashboard.server')) + ->collapsible(false), + NavigationGroup::make(fn () => trans('admin/dashboard.user')) + ->collapsible(false), + NavigationGroup::make(fn () => trans('admin/dashboard.advanced')), ]) - ->authMiddleware([ - Authenticate::class, + ->discoverResources(in: app_path('Filament/Admin/Resources'), for: 'App\\Filament\\Admin\\Resources') + ->discoverPages(in: app_path('Filament/Admin/Pages'), for: 'App\\Filament\\Admin\\Pages') + ->discoverWidgets(in: app_path('Filament/Admin/Widgets'), for: 'App\\Filament\\Admin\\Widgets') + ->plugins([ + FilamentLogViewerPlugin::make() + ->authorize(fn () => user()->can('view panelLog')) + ->listLogs(ListLogs::class) + ->viewLog(ViewLogs::class) + ->navigationLabel(fn () => trans('admin/log.navigation.panel_logs')) + ->navigationGroup(fn () => trans('admin/dashboard.advanced')) + ->navigationIcon(TablerIcon::FileInfo), ]); + + /** @var PluginService $pluginService */ + $pluginService = app(PluginService::class); // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + + $pluginService->loadPanelPlugins($panel); + + return $panel; } } diff --git a/app/Providers/Filament/AppPanelProvider.php b/app/Providers/Filament/AppPanelProvider.php new file mode 100644 index 0000000000..84405c0c19 --- /dev/null +++ b/app/Providers/Filament/AppPanelProvider.php @@ -0,0 +1,42 @@ +id('app') + ->default() + ->breadcrumbs(false) + ->navigation(false) + ->topbar(true) + ->userMenuItems([ + Action::make('to_admin') + ->label(trans('profile.admin')) + ->url(fn () => Filament::getPanel('admin')->getUrl()) + ->icon(TablerIcon::ArrowForward) + ->visible(fn () => user()?->canAccessPanel(Filament::getPanel('admin'))), + ]) + ->discoverResources(in: app_path('Filament/App/Resources'), for: 'App\\Filament\\App\\Resources') + ->plugins([ + FilamentLogViewerPlugin::make() + ->authorize(false), + ]); + + /** @var PluginService $pluginService */ + $pluginService = app(PluginService::class); // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + + $pluginService->loadPanelPlugins($panel); + + return $panel; + } +} diff --git a/app/Providers/Filament/FilamentServiceProvider.php b/app/Providers/Filament/FilamentServiceProvider.php new file mode 100644 index 0000000000..f97490aa9b --- /dev/null +++ b/app/Providers/Filament/FilamentServiceProvider.php @@ -0,0 +1,263 @@ + Color::Red, + 'gray' => Color::Zinc, + 'info' => Color::Sky, + 'primary' => Color::Blue, + 'success' => Color::Green, + 'warning' => Color::Amber, + 'blurple' => Color::hex('#5865F2'), + ]); + + FilamentView::registerRenderHook( + PanelsRenderHook::PAGE_START, + fn () => Blade::render('@livewire(\App\Livewire\AlertBannerContainer::class)'), + ); + + FilamentView::registerRenderHook( + PanelsRenderHook::FOOTER, + fn () => Blade::render('filament.layouts.footer'), + ); + + FilamentView::registerRenderHook( + PanelsRenderHook::STYLES_BEFORE, + fn () => Blade::render("@vite(['resources/css/app.css'])") + ); + + FilamentView::registerRenderHook( + PanelsRenderHook::SCRIPTS_AFTER, + fn () => Blade::render("@vite(['resources/js/app.js'])"), + ); + + before('dehydrate', function (Component $component) { + if (!Livewire::isLivewireRequest()) { + return; + } + + if (store($component)->has('redirect')) { + return; + } + + if (count(session()->get('alert-banners') ?? []) <= 0) { + return; + } + + $component->dispatch('alertBannerSent'); + }); + + Field::macro('hintCopy', function () { + /** @var Field $this */ + return $this->hintAction(CopyAction::make()); // @phpstan-ignore varTag.nativeType + }); + + Select::configureUsing(fn (Select $select) => $select->native(false)); + + KeyValue::configureUsing(fn (KeyValue $keyValue) => $keyValue->deleteAction(function (Action $action) { + $action->tooltip(fn () => $action->getLabel()); + $action->iconSize(IconSize::Large); + })); + + Repeater::configureUsing(fn (Repeater $repeater) => $repeater->deleteAction(function (Action $action) { + $action->tooltip(fn () => $action->getLabel()); + $action->iconSize(IconSize::Large); + })); + + ShowPasswordAction::configureUsing(function (ShowPasswordAction $action) { + $action->tooltip(fn () => $action->getLabel()); + $action->iconSize(IconSize::Large); + }); + + HidePasswordAction::configureUsing(function (HidePasswordAction $action) { + $action->tooltip(fn () => $action->getLabel()); + $action->iconSize(IconSize::Large); + }); + + CopyAction::configureUsing(function (CopyAction $action) { + $action->tooltip(fn () => $action->getLabel()); + $action->iconSize(IconSize::Large); + }); + + DeleteAction::configureUsing(function (DeleteAction $action) { + $action->icon(TablerIcon::Trash); + $action->tooltip(fn () => $action->getLabel()); + $action->hiddenLabel(); + $action->iconSize(IconSize::Large); + + if (user()?->getCustomization(CustomizationKey::ButtonStyle)) { + $action->iconButton(); + $action->iconSize(IconSize::ExtraLarge); + } + }); + + CreateAction::configureUsing(function (CreateAction $action) { + $action->icon(TablerIcon::Plus); + $action->tooltip(fn () => $action->getLabel()); + $action->hiddenLabel(); + $action->iconSize(IconSize::Large); + + if (user()?->getCustomization(CustomizationKey::ButtonStyle)) { + $action->iconButton(); + $action->iconSize(IconSize::ExtraLarge); + } + }); + + EditAction::configureUsing(function (EditAction $action) { + $action->icon(TablerIcon::Pencil); + $action->tooltip(fn () => $action->getLabel()); + $action->hiddenLabel(); + $action->iconSize(IconSize::Large); + + if (user()?->getCustomization(CustomizationKey::ButtonStyle)) { + $action->iconButton(); + $action->iconSize(IconSize::ExtraLarge); + } + }); + + ViewAction::configureUsing(function (ViewAction $action) { + $action->icon(TablerIcon::Eye); + $action->tooltip(fn () => $action->getLabel()); + $action->hiddenLabel(); + $action->iconSize(IconSize::Large); + + if (user()?->getCustomization(CustomizationKey::ButtonStyle)) { + $action->iconButton(); + $action->iconSize(IconSize::ExtraLarge); + } + }); + + Action::configureUsing(function (Action $action) { + $action->iconSize(IconSize::Large); + + if (user()?->getCustomization(CustomizationKey::ButtonStyle)) { + $name = $action->getName(); + + $excludedPrefixes = [ + 'enable_oauth_', + 'disable_oauth_', + 'enable_captcha_', + 'disable_captcha_', + 'oauth_', + 'db_', // dashboard + 'fm_', // file manager + 'hint_', // hint actions + 'exclude_', // exclude actions + ]; + + $excludeActions = [ + 'profile', + 'logout', + 'start', + 'stop', + 'restart', + 'kill', + 'fileUpload', + ]; + + foreach ($excludedPrefixes as $prefix) { + if (str_starts_with($name, $prefix)) { + return; + } + } + + if (in_array($name, $excludeActions, true)) { + return; + } + + $action->iconButton(); + $action->iconSize(IconSize::ExtraLarge); + } + }); + + FilamentIcon::register([ + ActionsIconAlias::DELETE_ACTION => TablerIcon::Trash, + ActionsIconAlias::DETACH_ACTION => TablerIcon::Trash, + ActionsIconAlias::EDIT_ACTION => TablerIcon::Pencil, + ActionsIconAlias::VIEW_ACTION => TablerIcon::Eye, + ActionsIconAlias::REPLICATE_ACTION => TablerIcon::CopyPlus, + + PanelsIconAlias::USER_MENU_LOGOUT_BUTTON => TablerIcon::Logout2, + PanelsIconAlias::USER_MENU_PROFILE_ITEM => TablerIcon::User, + PanelsIconAlias::THEME_SWITCHER_LIGHT_BUTTON => TablerIcon::Sun, + PanelsIconAlias::THEME_SWITCHER_DARK_BUTTON => TablerIcon::Moon, + PanelsIconAlias::THEME_SWITCHER_SYSTEM_BUTTON => TablerIcon::DeviceDesktop, + PanelsIconAlias::SIDEBAR_OPEN_DATABASE_NOTIFICATIONS_BUTTON => TablerIcon::Bell, + PanelsIconAlias::TOPBAR_OPEN_DATABASE_NOTIFICATIONS_BUTTON => TablerIcon::Bell, + PanelsIconAlias::GLOBAL_SEARCH_FIELD => TablerIcon::Search, + PanelsIconAlias::SIDEBAR_EXPAND_BUTTON => TablerIcon::ArrowRightDashed, + PanelsIconAlias::SIDEBAR_COLLAPSE_BUTTON => TablerIcon::ArrowLeftDashed, + + TablesIconAlias::ACTIONS_FILTER => TablerIcon::Filters, + TablesIconAlias::SEARCH_FIELD => TablerIcon::Search, + TablesIconAlias::ACTIONS_COLUMN_MANAGER => TablerIcon::Columns, + TablesIconAlias::ACTIONS_OPEN_BULK_ACTIONS => TablerIcon::BoxMultiple, + + NotificationsIconAlias::DATABASE_MODAL_EMPTY_STATE => TablerIcon::BellOff, + NotificationsIconAlias::NOTIFICATION_CLOSE_BUTTON => TablerIcon::X, + NotificationsIconAlias::NOTIFICATION_INFO => TablerIcon::InfoCircle, + NotificationsIconAlias::NOTIFICATION_SUCCESS => TablerIcon::CircleCheck, + NotificationsIconAlias::NOTIFICATION_WARNING => TablerIcon::AlertTriangle, + NotificationsIconAlias::NOTIFICATION_DANGER => TablerIcon::AlertCircle, + + SupportIconAlias::MODAL_CLOSE_BUTTON => TablerIcon::X, + SupportIconAlias::BREADCRUMBS_SEPARATOR => TablerIcon::ChevronsRight, + SupportIconAlias::PAGINATION_NEXT_BUTTON => TablerIcon::ArrowRight, + SupportIconAlias::PAGINATION_PREVIOUS_BUTTON => TablerIcon::ArrowLeft, + SupportIconAlias::SECTION_COLLAPSE_BUTTON => TablerIcon::ChevronUp, + + FormsIconAlias::COMPONENTS_KEY_VALUE_ACTIONS_DELETE => TablerIcon::Trash, + FormsIconAlias::COMPONENTS_REPEATER_ACTIONS_DELETE => TablerIcon::Trash, + FormsIconAlias::COMPONENTS_REPEATER_ACTIONS_EXPAND => TablerIcon::ChevronDown, + FormsIconAlias::COMPONENTS_REPEATER_ACTIONS_COLLAPSE => TablerIcon::ChevronUp, + FormsIconAlias::COMPONENTS_REPEATER_ACTIONS_REORDER => TablerIcon::ArrowsSort, + + SchemaIconAlias::COMPONENTS_WIZARD_COMPLETED_STEP => TablerIcon::Check, + ]); + } + + public function register(): void {} +} diff --git a/app/Providers/Filament/PanelProvider.php b/app/Providers/Filament/PanelProvider.php new file mode 100644 index 0000000000..76968af759 --- /dev/null +++ b/app/Providers/Filament/PanelProvider.php @@ -0,0 +1,79 @@ +spa(fn () => !request()->routeIs('filament.server.pages.console')) + ->spaUrlExceptions([ + '*/oauth/redirect/*', + ]) + ->databaseNotifications() + ->brandName(config('app.name', 'Pelican')) + ->brandLogo(config('app.logo')) + ->brandLogoHeight('2rem') + ->favicon(config('app.favicon', '/pelican.ico')) + ->topNavigation(function () { + $navigationType = user()?->getCustomization(CustomizationKey::TopNavigation); + + return $navigationType === 'topbar' || $navigationType === true; + }) + ->topbar(function () { + $navigationType = user()?->getCustomization(CustomizationKey::TopNavigation); + + return $navigationType === 'topbar' || $navigationType === 'mixed' || $navigationType === true; + }) + ->maxContentWidth(config('panel.filament.display-width', 'screen-2xl')) + ->profile(EditProfile::class, false) + ->userMenuItems([ + 'profile' => fn (Action $action) => $action + ->url(fn () => EditProfile::getUrl(panel: 'app')), + ]) + ->login(Login::class) + ->passwordReset() + ->multiFactorAuthentication([ + AppAuthentication::make()->recoverable(), + EmailAuthentication::make(), + ]) + ->middleware([ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + AuthenticateSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + DisableBladeIconComponents::class, + DispatchServingFilamentEvent::class, + LanguageMiddleware::class, + ]) + ->authMiddleware([ + Authenticate::class, + RequireTwoFactorAuthentication::class, + ]); + } +} diff --git a/app/Providers/Filament/ServerPanelProvider.php b/app/Providers/Filament/ServerPanelProvider.php new file mode 100644 index 0000000000..cb543c15f5 --- /dev/null +++ b/app/Providers/Filament/ServerPanelProvider.php @@ -0,0 +1,57 @@ +id('server') + ->path('server') + ->homeUrl(fn () => Filament::getPanel('app')->getUrl()) + ->tenant(Server::class, 'uuid_short') + ->userMenuItems([ + Action::make('to_serverList') + ->label(trans('profile.server_list')) + ->icon(TablerIcon::BrandDocker) + ->url(fn () => ListServers::getUrl(panel: 'app')), + Action::make('to_admin') + ->label(trans('profile.admin')) + ->icon(TablerIcon::ArrowForward) + ->url(fn () => Filament::getPanel('admin')->getUrl()) + ->visible(fn () => user()?->canAccessPanel(Filament::getPanel('admin'))), + ]) + ->navigationItems([ + NavigationItem::make(trans('server/console.open_in_admin')) + ->url(fn () => EditServer::getUrl(['record' => Filament::getTenant()], panel: 'admin')) + ->visible(fn () => user()?->canAccessPanel(Filament::getPanel('admin')) && user()->can('view server', Filament::getTenant())) + ->icon(TablerIcon::ArrowBack) + ->sort(99), + ]) + ->discoverResources(in: app_path('Filament/Server/Resources'), for: 'App\\Filament\\Server\\Resources') + ->discoverPages(in: app_path('Filament/Server/Pages'), for: 'App\\Filament\\Server\\Pages') + ->discoverWidgets(in: app_path('Filament/Server/Widgets'), for: 'App\\Filament\\Server\\Widgets') + ->tenantMiddleware([ + ServerSubject::class, + ]); + + /** @var PluginService $pluginService */ + $pluginService = app(PluginService::class); // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions + + $pluginService->loadPanelPlugins($panel); + + return $panel; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 432ededc06..36c42d07cd 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,14 +2,13 @@ namespace App\Providers; -use Illuminate\Http\Request; -use Illuminate\Foundation\Http\Middleware\TrimStrings; -use Illuminate\Support\Facades\Route; +use App\Enums\ResourceLimit; use Illuminate\Cache\RateLimiting\Limit; -use Illuminate\Support\Facades\RateLimiter; -use App\Http\Middleware\AdminAuthenticate; -use App\Http\Middleware\RequireTwoFactorAuthentication; +use Illuminate\Foundation\Http\Middleware\TrimStrings; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\RateLimiter; +use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { @@ -30,21 +29,17 @@ public function boot(): void $this->routes(function () { Route::middleware('web')->group(function () { - Route::middleware(['auth.session', RequireTwoFactorAuthentication::class]) + Route::middleware(['auth.session']) ->prefix('docs') ->group(base_path('routes/docs.php')); - Route::middleware(['auth.session', RequireTwoFactorAuthentication::class]) + Route::middleware(['auth.session']) ->group(base_path('routes/base.php')); - Route::middleware(['auth.session', RequireTwoFactorAuthentication::class, AdminAuthenticate::class]) - ->prefix('/legacy') - ->group(base_path('routes/admin.php')); - Route::middleware('guest')->prefix('/auth')->group(base_path('routes/auth.php')); }); - Route::middleware(['api', RequireTwoFactorAuthentication::class])->group(function () { + Route::middleware(['api'])->group(function () { Route::middleware(['application-api', 'throttle:api.application']) ->prefix('/api/application') ->scopeBindings() @@ -104,5 +99,7 @@ protected function configureRateLimiting(): void config('http.rate_limit.application') )->by($key); }); + + ResourceLimit::boot(); } } diff --git a/app/Providers/ViewComposerServiceProvider.php b/app/Providers/ViewComposerServiceProvider.php deleted file mode 100644 index 152291cfc5..0000000000 --- a/app/Providers/ViewComposerServiceProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -app->make('view')->composer('*', AssetComposer::class); - } -} diff --git a/app/Repositories/Daemon/DaemonBackupRepository.php b/app/Repositories/Daemon/DaemonBackupRepository.php index bbe852e809..4ec41d9b00 100644 --- a/app/Repositories/Daemon/DaemonBackupRepository.php +++ b/app/Repositories/Daemon/DaemonBackupRepository.php @@ -2,11 +2,9 @@ namespace App\Repositories\Daemon; -use Webmozart\Assert\Assert; use App\Models\Backup; -use App\Models\Server; -use GuzzleHttp\Exception\TransferException; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\Client\Response; class DaemonBackupRepository extends DaemonRepository { @@ -25,64 +23,42 @@ public function setBackupAdapter(string $adapter): self /** * Tells the remote Daemon to begin generating a backup for the server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ - public function backup(Backup $backup) + public function backup(Backup $backup): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/backup', $this->server->uuid), - [ - 'adapter' => $this->adapter ?? config('backups.default'), - 'uuid' => $backup->uuid, - 'ignore' => implode("\n", $backup->ignored_files), - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/backup", + [ + 'adapter' => $this->adapter ?? config('backups.default'), + 'uuid' => $backup->uuid, + 'ignore' => implode("\n", $backup->ignored_files), + ] + ); } /** * Sends a request to daemon to begin restoring a backup for a server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ - public function restore(Backup $backup, string $url = null, bool $truncate = false) + public function restore(Backup $backup, ?string $url = null, bool $truncate = false): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/backup/%s/restore', $this->server->uuid, $backup->uuid), - [ - 'adapter' => $backup->disk, - 'truncate_directory' => $truncate, - 'download_url' => $url ?? '', - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/backup/$backup->uuid/restore", + [ + 'adapter' => $backup->disk, + 'truncate_directory' => $truncate, + 'download_url' => $url ?? '', + ] + ); } /** * Deletes a backup from the daemon. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ - public function delete(Backup $backup) + public function delete(Backup $backup): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->delete( - sprintf('/api/servers/%s/backup/%s', $this->server->uuid, $backup->uuid) - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->delete("/api/servers/{$this->server->uuid}/backup/$backup->uuid"); } } diff --git a/app/Repositories/Daemon/DaemonConfigurationRepository.php b/app/Repositories/Daemon/DaemonConfigurationRepository.php deleted file mode 100644 index 52cda56dd4..0000000000 --- a/app/Repositories/Daemon/DaemonConfigurationRepository.php +++ /dev/null @@ -1,48 +0,0 @@ -getHttpClient() - ->connectTimeout($connectTimeout) - ->get('/api/system' . (!is_null($version) ? '?v=' . $version : '')); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } - - return $response->json() ?? []; - } - - /** - * Updates the configuration information for a daemon. Updates the information for - * this instance using a passed-in model. This allows us to change plenty of information - * in the model, and still use the old, pre-update model to actually make the HTTP request. - * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException - */ - public function update(Node $node) - { - try { - return $this->getHttpClient()->post( - '/api/update', - $node->getConfiguration(), - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } - } -} diff --git a/app/Repositories/Daemon/DaemonFileRepository.php b/app/Repositories/Daemon/DaemonFileRepository.php index 7667f482e8..650d8447a7 100644 --- a/app/Repositories/Daemon/DaemonFileRepository.php +++ b/app/Repositories/Daemon/DaemonFileRepository.php @@ -2,43 +2,43 @@ namespace App\Repositories\Daemon; -use Carbon\CarbonInterval; -use Webmozart\Assert\Assert; -use App\Models\Server; -use GuzzleHttp\Exception\ClientException; -use GuzzleHttp\Exception\TransferException; use App\Exceptions\Http\Server\FileSizeTooLargeException; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use App\Exceptions\Repository\FileExistsException; +use App\Exceptions\Repository\FileNotEditableException; +use Illuminate\Contracts\Filesystem\FileNotFoundException; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\Client\Response; class DaemonFileRepository extends DaemonRepository { /** * Return the contents of a given file. * - * @param int|null $notLargerThan the maximum content length in bytes + * @param int|null $notLargerThan the maximum content length in bytes * - * @throws \GuzzleHttp\Exception\TransferException - * @throws \App\Exceptions\Http\Server\FileSizeTooLargeException - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws FileSizeTooLargeException + * @throws ConnectionException + * @throws FileNotFoundException */ - public function getContent(string $path, int $notLargerThan = null): string + public function getContent(string $path, ?int $notLargerThan = null): string { - Assert::isInstanceOf($this->server, Server::class); - - try { - $response = $this->getHttpClient()->get( - sprintf('/api/servers/%s/files/contents', $this->server->uuid), - ['file' => $path] - ); - } catch (ClientException|TransferException $exception) { - throw new DaemonConnectionException($exception); - } + $response = $this->getHttpClient()->get("/api/servers/{$this->server->uuid}/files/contents", + ['file' => $path] + ); $length = $response->header('Content-Length'); if ($notLargerThan && $length > $notLargerThan) { throw new FileSizeTooLargeException(); } + if ($response->status() === 400) { + throw new FileNotEditableException(); + } + + if ($response->status() === 404) { + throw new FileNotFoundException(); + } + return $response; } @@ -46,215 +46,174 @@ public function getContent(string $path, int $notLargerThan = null): string * Save new contents to a given file. This works for both creating and updating * a file. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException + * @throws FileExistsException */ - public function putContent(string $path, string $content) + public function putContent(string $path, string $content): Response { - Assert::isInstanceOf($this->server, Server::class); + $response = $this->getHttpClient() + ->withQueryParameters(['file' => $path]) + ->withBody($content) + ->post("/api/servers/{$this->server->uuid}/files/write"); - try { - return $this->getHttpClient() - ->withQueryParameters(['file' => $path]) - ->withBody($content) - ->post(sprintf('/api/servers/%s/files/write', $this->server->uuid)); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); + if ($response->status() === 400) { + throw new FileExistsException(); } + + return $response; } /** * Return a directory listing for a given path. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @return array + * + * @throws ConnectionException */ public function getDirectory(string $path): array { - Assert::isInstanceOf($this->server, Server::class); - - try { - $response = $this->getHttpClient()->get( - sprintf('/api/servers/%s/files/list-directory', $this->server->uuid), - ['directory' => $path] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } - - return $response->json(); + return $this->getHttpClient()->get("/api/servers/{$this->server->uuid}/files/list-directory", + ['directory' => $path] + )->json(); } /** * Creates a new directory for the server in the given $path. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException + * @throws FileExistsException */ - public function createDirectory(string $name, string $path) + public function createDirectory(string $name, string $path): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/files/create-directory', $this->server->uuid), - [ - 'name' => $name, - 'path' => $path, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); + $response = $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/files/create-directory", + [ + 'name' => $name, + 'path' => $path, + ] + ); + + if ($response->status() === 400) { + throw new FileExistsException(); } + + return $response; } /** * Renames or moves a file on the remote machine. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @param array $files + * + * @throws ConnectionException */ - public function renameFiles(?string $root, array $files) + public function renameFiles(?string $root, array $files): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->put( - sprintf('/api/servers/%s/files/rename', $this->server->uuid), - [ - 'root' => $root ?? '/', - 'files' => $files, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->put("/api/servers/{$this->server->uuid}/files/rename", + [ + 'root' => $root ?? '/', + 'files' => $files, + ] + ); } /** * Copy a given file and give it a unique name. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ - public function copyFile(string $location) + public function copyFile(string $location): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/files/copy', $this->server->uuid), - [ - 'location' => $location, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/files/copy", + ['location' => $location] + ); } /** * Delete a file or folder for the server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @param string[] $files + * + * @throws ConnectionException */ - public function deleteFiles(?string $root, array $files) + public function deleteFiles(?string $root, array $files): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/files/delete', $this->server->uuid), - [ - 'root' => $root ?? '/', - 'files' => $files, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/files/delete", + [ + 'root' => $root ?? '/', + 'files' => $files, + ] + ); } /** * Compress the given files or folders in the given root. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @param string[] $files + * @return array + * + * @throws ConnectionException */ - public function compressFiles(?string $root, array $files): array + public function compressFiles(?string $root, array $files, ?string $name, ?string $extension): array { - Assert::isInstanceOf($this->server, Server::class); - - try { - $response = $this->getHttpClient() - // Wait for up to 15 minutes for the archive to be completed when calling this endpoint - // since it will likely take quite awhile for large directories. - ->timeout(60 * 15) - ->post( - sprintf('/api/servers/%s/files/compress', $this->server->uuid), - [ - 'root' => $root ?? '/', - 'files' => $files, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } - - return $response->json(); + return $this->getHttpClient() + // Wait for up to 15 minutes for the archive to be completed when calling this endpoint + // since it will likely take quite awhile for large directories. + ->timeout(60 * 15) + ->post("/api/servers/{$this->server->uuid}/files/compress", + [ + 'root' => $root ?? '/', + 'files' => $files, + 'name' => $name ?? '', + 'extension' => $extension ?? '', + ] + )->json(); } /** * Decompresses a given archive file. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ - public function decompressFile(?string $root, string $file) + public function decompressFile(?string $root, string $file): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient() - // Wait for up to 15 minutes for the decompress to be completed when calling this endpoint - // since it will likely take quite awhile for large directories. - ->timeout((int) CarbonInterval::minutes(15)->totalSeconds) - ->post( - sprintf('/api/servers/%s/files/decompress', $this->server->uuid), - [ - 'root' => $root ?? '/', - 'file' => $file, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient() + // Wait for up to 15 minutes for the archive to be completed when calling this endpoint + // since it will likely take quite awhile for large directories. + ->timeout(60 * 15) + ->post("/api/servers/{$this->server->uuid}/files/decompress", + [ + 'root' => $root ?? '/', + 'file' => $file, + ] + ); } /** * Chmods the given files. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @param array $files + * + * @throws ConnectionException */ - public function chmodFiles(?string $root, array $files) + public function chmodFiles(?string $root, array $files): Response { - Assert::isInstanceOf($this->server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/files/chmod', $this->server->uuid), - [ - 'root' => $root ?? '/', - 'files' => $files, - ] - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/files/chmod", + [ + 'root' => $root ?? '/', + 'files' => $files, + ] + ); } /** * Pulls a file from the given URL and saves it to the disk. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @param array $params + * + * @throws ConnectionException */ - public function pull(string $url, ?string $directory, array $params = []) + public function pull(string $url, ?string $directory, array $params = []): Response { - Assert::isInstanceOf($this->server, Server::class); - $attributes = [ 'url' => $url, 'root' => $directory ?? '/', @@ -263,13 +222,27 @@ public function pull(string $url, ?string $directory, array $params = []) 'foreground' => $params['foreground'] ?? null, ]; - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/files/pull', $this->server->uuid), - array_filter($attributes, fn ($value) => !is_null($value)) - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/files/pull", array_filter($attributes, fn ($value) => !is_null($value))); + } + + /** + * Searches all files in the directory (and its subdirectories) for the given search term. + * + * @return array + * + * @throws ConnectionException + */ + public function search(string $searchTerm, ?string $directory): array + { + return $this->getHttpClient() + // Wait for up to 2 minutes for the search to be completed when calling this endpoint + // since it will likely take quite awhile for large directories. + ->timeout(60 * 2) + ->get("/api/servers/{$this->server->uuid}/files/search", + [ + 'pattern' => $searchTerm, + 'directory' => $directory ?? '/', + ] + )->json(); } } diff --git a/app/Repositories/Daemon/DaemonPowerRepository.php b/app/Repositories/Daemon/DaemonPowerRepository.php deleted file mode 100644 index ca3e03c442..0000000000 --- a/app/Repositories/Daemon/DaemonPowerRepository.php +++ /dev/null @@ -1,30 +0,0 @@ -server, Server::class); - - try { - return $this->getHttpClient()->post( - sprintf('/api/servers/%s/power', $this->server->uuid), - ['action' => $action], - ); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } - } -} diff --git a/app/Repositories/Daemon/DaemonRepository.php b/app/Repositories/Daemon/DaemonRepository.php index 2785d5b202..f8b85e0d1d 100644 --- a/app/Repositories/Daemon/DaemonRepository.php +++ b/app/Repositories/Daemon/DaemonRepository.php @@ -3,10 +3,12 @@ namespace App\Repositories\Daemon; use App\Models\Node; +use App\Models\Server; +use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Facades\Http; use Webmozart\Assert\Assert; -use App\Models\Server; abstract class DaemonRepository { @@ -40,11 +42,34 @@ public function setNode(Node $node): static /** * Return an instance of the Guzzle HTTP Client to be used for requests. + * + * @param array $headers */ public function getHttpClient(array $headers = []): PendingRequest { Assert::isInstanceOf($this->node, Node::class); - return Http::daemon($this->node, $headers); + return Http::daemon($this->node, $headers)->throwIf(fn ($condition) => $this->enforceValidNodeToken($condition)); + } + + protected function enforceValidNodeToken(Response|bool $condition): bool + { + if (is_bool($condition)) { + return $condition; + } + if ($condition->clientError()) { + return false; + } + + $header = $condition->header('User-Agent'); + if ( + empty($header) || + preg_match('/^Pelican Wings\/v(?:\d+\.\d+\.\d+|develop) \(id:(\w*)\)$/', $header, $matches) && + array_get($matches, 1, '') !== $this->node->daemon_token_id + ) { + throw new ConnectionException($condition->effectiveUri()->__toString() . ' does not match node token_id !'); + } + + return true; } } diff --git a/app/Repositories/Daemon/DaemonServerRepository.php b/app/Repositories/Daemon/DaemonServerRepository.php index ce91ece2bf..6088acf130 100644 --- a/app/Repositories/Daemon/DaemonServerRepository.php +++ b/app/Repositories/Daemon/DaemonServerRepository.php @@ -6,28 +6,21 @@ use App\Enums\HttpStatusCode; use Exception; use Filament\Notifications\Notification; +use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\RequestException; -use Webmozart\Assert\Assert; -use App\Models\Server; -use GuzzleHttp\Exception\GuzzleException; -use GuzzleHttp\Exception\TransferException; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Illuminate\Http\Client\Response; class DaemonServerRepository extends DaemonRepository { /** * Returns details about a server from the Daemon instance. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @return array */ public function getDetails(): array { - Assert::isInstanceOf($this->server, Server::class); - try { - return $this->getHttpClient()->get( - sprintf('/api/servers/%s', $this->server->uuid) - )->throw()->json(); + return $this->getHttpClient()->connectTimeout(1)->timeout(1)->get("/api/servers/{$this->server->uuid}")->throw()->json(); } catch (RequestException $exception) { $cfId = $exception->response->header('Cf-Ray'); $cfCache = $exception->response->header('Cf-Cache-Status'); @@ -39,8 +32,8 @@ public function getDetails(): array if ($requestBadGateway && $requestFromCloudflare && !$requestCachedFromCloudflare) { Notification::make() - ->title('Cloudflare Issue') - ->body('Your Node is not accessible by Cloudflare') + ->title(trans('admin/node.cloudflare_issue.title')) + ->body(trans('admin/node.cloudflare_issue.body')) ->danger() ->send(); } @@ -54,131 +47,85 @@ public function getDetails(): array /** * Creates a new server on the daemon. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function create(bool $startOnCompletion = true): void { - Assert::isInstanceOf($this->server, Server::class); - - try { - $response = $this->getHttpClient()->post('/api/servers', [ - 'uuid' => $this->server->uuid, - 'start_on_completion' => $startOnCompletion, - ]); - } catch (GuzzleException $exception) { - throw new DaemonConnectionException($exception); - } + $this->getHttpClient()->post('/api/servers', [ + 'uuid' => $this->server->uuid, + 'start_on_completion' => $startOnCompletion, + ]); } /** * Triggers a server sync on daemon. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function sync(): void { - Assert::isInstanceOf($this->server, Server::class); - - try { - $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/sync"); - } catch (GuzzleException $exception) { - throw new DaemonConnectionException($exception); - } + $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/sync"); } /** * Delete a server from the daemon, forcibly if passed. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function delete(): void { - Assert::isInstanceOf($this->server, Server::class); - - try { - $this->getHttpClient()->delete('/api/servers/' . $this->server->uuid); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + $this->getHttpClient()->delete("/api/servers/{$this->server->uuid}"); } /** * Reinstall a server on the daemon. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function reinstall(): void { - Assert::isInstanceOf($this->server, Server::class); - - try { - $this->getHttpClient()->post(sprintf( - '/api/servers/%s/reinstall', - $this->server->uuid - )); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/reinstall"); } /** * Requests the daemon to create a full archive of the server. Once the daemon is finished * they will send a POST request to "/api/remote/servers/{uuid}/archive" with a boolean. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function requestArchive(): void { - Assert::isInstanceOf($this->server, Server::class); - - try { - $this->getHttpClient()->post(sprintf( - '/api/servers/%s/archive', - $this->server->uuid - )); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/archive"); } /** * Cancels a server transfer. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ public function cancelTransfer(): void { - Assert::isInstanceOf($this->server, Server::class); - - if ($transfer = $this->server->transfer) { - // Source node - $this->setNode($transfer->oldNode); - - try { - $this->getHttpClient()->delete(sprintf( - '/api/servers/%s/transfer', - $this->server->uuid - )); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } - - // Destination node - $this->setNode($transfer->newNode); - - try { - $this->getHttpClient()->delete('/api/transfer', [ - 'json' => [ - 'server_id' => $this->server->uuid, - 'server' => [ - 'uuid' => $this->server->uuid, - ], - ], - ]); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + $transfer = $this->server->transfer; + if (!$transfer) { + return; } + + // Source node + $this->setNode($transfer->oldNode); + + $this->getHttpClient()->delete("/api/servers/{$this->server->uuid}/transfer"); + + // Destination node + $this->setNode($transfer->newNode); + + $this->getHttpClient()->delete('/api/transfer', [ + 'json' => [ + 'server_id' => $this->server->uuid, + 'server' => [ + 'uuid' => $this->server->uuid, + ], + ], + ]); } /** @@ -186,32 +133,51 @@ public function cancelTransfer(): void * make it easier to revoke tokens on the fly. This ensures that the JTI key is formatted * correctly and avoids any costly mistakes in the codebase. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @deprecated + * @see self::deauthorize() + * + * @throws ConnectionException */ public function revokeUserJTI(int $id): void { - Assert::isInstanceOf($this->server, Server::class); - - $this->revokeJTIs([md5($id . $this->server->uuid)]); + $this->getHttpClient() + ->post("/api/servers/{$this->server->uuid}/ws/deny", [ + 'jtis' => [md5($id . $this->server->uuid)], + ]); } /** - * Revokes an array of JWT JTI's by marking any token generated before the current time on - * the daemon instance as being invalid. + * Deauthorizes a user (disconnects websockets and SFTP) on the Wings instance for the server. * - * @throws \App\Exceptions\Http\Connection\DaemonConnectionException + * @throws ConnectionException */ - protected function revokeJTIs(array $jtis): void + public function deauthorize(string $user): void + { + $this->getHttpClient()->post('/api/deauthorize-user', [ + 'json' => [ + 'user' => $user, + 'servers' => [$this->server->uuid], + ], + ]); + } + + public function getInstallLogs(): string { - Assert::isInstanceOf($this->server, Server::class); + return $this->getHttpClient() + ->get("/api/servers/{$this->server->uuid}/install-logs") + ->throw() + ->json('data'); + } - try { - $this->getHttpClient() - ->post(sprintf('/api/servers/%s/ws/deny', $this->server->uuid), [ - 'jtis' => $jtis, - ]); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); - } + /** + * Sends a power action to the server instance. + * + * @throws ConnectionException + */ + public function power(string $action): Response + { + return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/power", + ['action' => $action], + ); } } diff --git a/app/Repositories/Daemon/DaemonSystemRepository.php b/app/Repositories/Daemon/DaemonSystemRepository.php new file mode 100644 index 0000000000..71d88a1385 --- /dev/null +++ b/app/Repositories/Daemon/DaemonSystemRepository.php @@ -0,0 +1,61 @@ + + * + * @throws ConnectionException + */ + public function getSystemInformation(): array + { + return $this->getHttpClient() + ->connectTimeout(3) + ->get('/api/system') + ->throwIf(function ($result) { + $this->enforceValidNodeToken($result); + if (!$result->collect()->has(['architecture', 'cpu_count', 'kernel_version', 'os', 'version'])) { + throw new ConnectionException($result->effectiveUri()->__toString() . ' is not Pelican Wings !'); + } + + return true; + })->json(); + } + + /** + * Retrieve diagnostics from the daemon for the current node. + * + * + * @throws ConnectionException + */ + public function getDiagnostics(int $lines, bool $includeEndpoints, bool $includeLogs): Response + { + return $this->getHttpClient() + ->timeout(5) + ->get('/api/diagnostics', [ + 'log_lines' => $lines, + 'include_endpoints' => $includeEndpoints ? 'true' : 'false', + 'include_logs' => $includeLogs ? 'true' : 'false', + ]); + } + + /** + * Updates the configuration information for a daemon. Updates the information for + * this instance using a passed-in model. This allows us to change plenty of information + * in the model, and still use the old, pre-update model to actually make the HTTP request. + * + * @throws ConnectionException + */ + public function update(Node $node): Response + { + return $this->getHttpClient()->post('/api/update', $node->getConfiguration()); + } +} diff --git a/app/Rules/Port.php b/app/Rules/Port.php index 7225509c03..ca498ae08f 100644 --- a/app/Rules/Port.php +++ b/app/Rules/Port.php @@ -4,13 +4,14 @@ use Closure; use Illuminate\Contracts\Validation\ValidationRule; +use Illuminate\Translation\PotentiallyTranslatedString; class Port implements ValidationRule { /** * Run the validation rule. * - * @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail + * @param Closure(string):PotentiallyTranslatedString $fail */ public function validate(string $attribute, mixed $value, Closure $fail): void { diff --git a/app/Rules/Username.php b/app/Rules/Username.php deleted file mode 100644 index 591df389c2..0000000000 --- a/app/Rules/Username.php +++ /dev/null @@ -1,45 +0,0 @@ -getConstants())->filter(function ($value, $key) { - return substr($key, 0, 9) === 'RESOURCE_'; - })->values()->toArray(); + return self::can($key->getPermission($resource), $action); } } diff --git a/app/Services/Activity/ActivityLogBatchService.php b/app/Services/Activity/ActivityLogBatchService.php deleted file mode 100644 index cb2e91b5c4..0000000000 --- a/app/Services/Activity/ActivityLogBatchService.php +++ /dev/null @@ -1,59 +0,0 @@ -uuid; - } - - /** - * Starts a new batch transaction. If there is already a transaction present - * this will be nested. - */ - public function start(): void - { - if ($this->transaction === 0) { - $this->uuid = Uuid::uuid4()->toString(); - } - - $this->transaction++; - } - - /** - * Ends a batch transaction, if this is the last transaction in the stack - * the UUID will be cleared out. - */ - public function end(): void - { - $this->transaction = max(0, $this->transaction - 1); - - if ($this->transaction === 0) { - $this->uuid = null; - } - } - - /** - * Executes the logic provided within the callback in the scope of an activity - * log batch transaction. - */ - public function transaction(\Closure $callback): mixed - { - $this->start(); - $result = $callback($this->uuid()); - $this->end(); - - return $result; - } -} diff --git a/app/Services/Activity/ActivityLogService.php b/app/Services/Activity/ActivityLogService.php index 37b7ae43b5..9cf8e2d1ef 100644 --- a/app/Services/Activity/ActivityLogService.php +++ b/app/Services/Activity/ActivityLogService.php @@ -2,29 +2,32 @@ namespace App\Services\Activity; -use Illuminate\Support\Arr; -use Webmozart\Assert\Assert; -use Illuminate\Support\Collection; use App\Models\ActivityLog; +use App\Models\Server; +use App\Models\User; +use Closure; +use Filament\Facades\Filament; +use Illuminate\Contracts\Auth\Factory as AuthFactory; +use Illuminate\Database\ConnectionInterface; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Request; -use App\Models\ActivityLogSubject; -use Illuminate\Database\ConnectionInterface; -use Illuminate\Contracts\Auth\Factory as AuthFactory; +use Throwable; +use Webmozart\Assert\Assert; class ActivityLogService { protected ?ActivityLog $activity = null; + /** @var array */ protected array $subjects = []; public function __construct( protected AuthFactory $manager, - protected ActivityLogBatchService $batch, protected ActivityLogTargetableService $targetable, protected ConnectionInterface $connection - ) { - } + ) {} /** * Sets the activity logger as having been caused by an anonymous @@ -64,7 +67,7 @@ public function description(?string $description): self * * @template T extends \Illuminate\Database\Eloquent\Model|\Illuminate\Contracts\Auth\Authenticatable * - * @param T|T[]|null $subjects + * @param T|T[]|null $subjects */ public function subject(...$subjects): self { @@ -100,8 +103,8 @@ public function actor(Model $actor): self /** * Sets a custom property on the activity log instance. * - * @param string|array $key - * @param mixed $value + * @param string|array $key + * @param mixed $value */ public function property($key, $value = null): self { @@ -130,7 +133,7 @@ public function withRequestMetadata(): self * performing this action it will be logged to the disk but will not interrupt * the code flow. */ - public function log(string $description = null): ActivityLog + public function log(?string $description = null): ActivityLog { $activity = $this->getActivity(); @@ -140,9 +143,8 @@ public function log(string $description = null): ActivityLog try { return $this->save(); - } catch (\Throwable|\Exception $exception) { + } catch (Throwable $exception) { if (config('app.env') !== 'production') { - /* @noinspection PhpUnhandledExceptionInspection */ throw $exception; } @@ -166,9 +168,9 @@ public function clone(): self * and will only save the activity log entry if everything else successfully * settles. * - * @throws \Throwable + * @throws Throwable */ - public function transaction(\Closure $callback) + public function transaction(Closure $callback): mixed { return $this->connection->transaction(function () use ($callback) { $response = $callback($this); @@ -199,30 +201,31 @@ protected function getActivity(): ActivityLog $this->activity = new ActivityLog([ 'ip' => Request::ip(), - 'batch_uuid' => $this->batch->uuid(), 'properties' => Collection::make([]), 'api_key_id' => $this->targetable->apiKeyId(), ]); if ($subject = $this->targetable->subject()) { $this->subject($subject); + } elseif ($tenant = Filament::getTenant()) { + if ($tenant instanceof Server) { + $this->subject($tenant); + } } if ($actor = $this->targetable->actor()) { $this->actor($actor); } elseif ($user = $this->manager->guard()->user()) { - if ($user instanceof Model) { - $this->actor($user); - } + $this->actor($user); } return $this->activity; } /** - * Saves the activity log instance and attaches all of the subject models. + * Saves the activity log instance and attaches all the subject models. * - * @throws \Throwable + * @throws Throwable */ protected function save(): ActivityLog { @@ -231,16 +234,12 @@ protected function save(): ActivityLog $response = $this->connection->transaction(function () { $this->activity->save(); - $subjects = Collection::make($this->subjects) - ->map(fn (Model $subject) => [ - 'activity_log_id' => $this->activity->id, + foreach ($this->subjects as $subject) { + $this->activity->subjects()->forceCreate([ 'subject_id' => $subject->getKey(), 'subject_type' => $subject->getMorphClass(), - ]) - ->values() - ->toArray(); - - ActivityLogSubject::insert($subjects); + ]); + } return $this->activity; }); diff --git a/app/Services/Allocations/AssignmentService.php b/app/Services/Allocations/AssignmentService.php index 33ed4aa748..65974e5a3a 100644 --- a/app/Services/Allocations/AssignmentService.php +++ b/app/Services/Allocations/AssignmentService.php @@ -2,43 +2,47 @@ namespace App\Services\Allocations; -use App\Models\Allocation; -use IPTools\Network; -use App\Models\Node; -use App\Models\Server; -use Illuminate\Database\ConnectionInterface; use App\Exceptions\DisplayException; use App\Exceptions\Service\Allocation\CidrOutOfRangeException; -use App\Exceptions\Service\Allocation\PortOutOfRangeException; use App\Exceptions\Service\Allocation\InvalidPortMappingException; +use App\Exceptions\Service\Allocation\PortOutOfRangeException; use App\Exceptions\Service\Allocation\TooManyPortsInRangeException; +use App\Models\Allocation; +use App\Models\Node; +use App\Models\Server; +use Exception; +use Illuminate\Database\ConnectionInterface; +use IPTools\Network; class AssignmentService { public const CIDR_MAX_BITS = 25; + public const CIDR_MIN_BITS = 32; + public const PORT_FLOOR = 1024; + public const PORT_CEIL = 65535; + public const PORT_RANGE_LIMIT = 1000; + public const PORT_RANGE_REGEX = '/^(\d{4,5})-(\d{4,5})$/'; - /** - * AssignmentService constructor. - */ - public function __construct(protected ConnectionInterface $connection) - { - } + public function __construct(protected ConnectionInterface $connection) {} /** * Insert allocations into the database and link them to a specific node. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Service\Allocation\CidrOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\InvalidPortMappingException - * @throws \App\Exceptions\Service\Allocation\PortOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\TooManyPortsInRangeException + * @param array{allocation_ip: string, allocation_ports: array} $data + * @return array + * + * @throws DisplayException + * @throws CidrOutOfRangeException + * @throws InvalidPortMappingException + * @throws PortOutOfRangeException + * @throws TooManyPortsInRangeException */ - public function handle(Node $node, array $data, Server $server = null): array + public function handle(Node $node, array $data, ?Server $server = null): array { $explode = explode('/', $data['allocation_ip']); if (count($explode) !== 1) { @@ -48,13 +52,8 @@ public function handle(Node $node, array $data, Server $server = null): array } try { - // TODO: how should we approach supporting IPv6 with this? - // gethostbyname only supports IPv4, but the alternative (dns_get_record) returns - // an array of records, which is not ideal for this use case, we need a SINGLE - // IP to use, not multiple. - $underlying = gethostbyname($data['allocation_ip']); - $parsed = Network::parse($underlying); - } catch (\Exception $exception) { + $parsed = Network::parse($data['allocation_ip']); + } catch (Exception $exception) { throw new DisplayException("Could not parse provided allocation IP address ({$data['allocation_ip']}): {$exception->getMessage()}", $exception); } @@ -67,7 +66,7 @@ public function handle(Node $node, array $data, Server $server = null): array throw new InvalidPortMappingException($port); } - $insertData = []; + $newAllocations = []; if (preg_match(self::PORT_RANGE_REGEX, $port, $matches)) { $block = range($matches[1], $matches[2]); @@ -80,12 +79,13 @@ public function handle(Node $node, array $data, Server $server = null): array } foreach ($block as $unit) { - $insertData[] = [ + $newAllocations[] = [ 'node_id' => $node->id, 'ip' => $ip->__toString(), 'port' => (int) $unit, 'ip_alias' => array_get($data, 'allocation_alias'), 'server_id' => $server->id ?? null, + 'is_locked' => array_get($data, 'is_locked', false), ]; } } else { @@ -93,22 +93,27 @@ public function handle(Node $node, array $data, Server $server = null): array throw new PortOutOfRangeException(); } - $insertData[] = [ + $newAllocations[] = [ 'node_id' => $node->id, 'ip' => $ip->__toString(), 'port' => (int) $port, 'ip_alias' => array_get($data, 'allocation_alias'), 'server_id' => $server->id ?? null, + 'is_locked' => array_get($data, 'is_locked', false), ]; } - foreach ($insertData as $insert) { - $allocation = Allocation::query()->create($insert); + foreach ($newAllocations as $newAllocation) { + $allocation = Allocation::query()->create($newAllocation); $ids[] = $allocation->id; } } } + if ($server && !$server->allocation_id) { + $server->update(['allocation_id' => $ids[0]]); + } + $this->connection->commit(); return $ids; diff --git a/app/Services/Allocations/FindAssignableAllocationService.php b/app/Services/Allocations/FindAssignableAllocationService.php index 5c62b7539e..69aa8470d1 100644 --- a/app/Services/Allocations/FindAssignableAllocationService.php +++ b/app/Services/Allocations/FindAssignableAllocationService.php @@ -2,31 +2,36 @@ namespace App\Services\Allocations; -use Webmozart\Assert\Assert; -use App\Models\Server; -use App\Models\Allocation; +use App\Exceptions\DisplayException; use App\Exceptions\Service\Allocation\AutoAllocationNotEnabledException; +use App\Exceptions\Service\Allocation\CidrOutOfRangeException; +use App\Exceptions\Service\Allocation\InvalidPortMappingException; use App\Exceptions\Service\Allocation\NoAutoAllocationSpaceAvailableException; +use App\Exceptions\Service\Allocation\PortOutOfRangeException; +use App\Exceptions\Service\Allocation\TooManyPortsInRangeException; +use App\Models\Allocation; +use App\Models\Server; +use Webmozart\Assert\Assert; class FindAssignableAllocationService { /** * FindAssignableAllocationService constructor. */ - public function __construct(private AssignmentService $service) - { - } + public function __construct(private AssignmentService $service) {} /** - * Finds an existing unassigned allocation and attempts to assign it to the given server. If - * no allocation can be found, a new one will be created with a random port between the defined - * range from the configuration. + * Finds an existing unassigned allocation and attempts to assign it to the given server. + * + * Always attempts to find an existing unassigned allocation first. If create_new is enabled + * and no unassigned allocation is available, creates a new one from the configured port range. + * If create_new is disabled, throws an exception when no unassigned allocations are available. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Service\Allocation\CidrOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\InvalidPortMappingException - * @throws \App\Exceptions\Service\Allocation\PortOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\TooManyPortsInRangeException + * @throws DisplayException + * @throws CidrOutOfRangeException + * @throws InvalidPortMappingException + * @throws PortOutOfRangeException + * @throws TooManyPortsInRangeException */ public function handle(Server $server): Allocation { @@ -34,17 +39,39 @@ public function handle(Server $server): Allocation throw new AutoAllocationNotEnabledException(); } + $createNew = config('panel.client_features.allocations.create_new', true); + // Attempt to find a given available allocation for a server. If one cannot be found - // we will fall back to attempting to create a new allocation that can be used for the - // server. - /** @var \App\Models\Allocation|null $allocation */ - $allocation = $server->node->allocations() - ->where('ip', $server->allocation->ip) + // and create_new is enabled, we will fall back to attempting to create a new allocation + // that can be used for the server. + $start = config('panel.client_features.allocations.range_start', null); + $end = config('panel.client_features.allocations.range_end', null); + + Assert::integerish($start); + Assert::integerish($end); + + // + // Note: We use withoutGlobalScopes() to bypass Filament's tenant scoping when called + // from the Server panel context, which would otherwise filter allocations to only + // those belonging to the current server (making it impossible to find unassigned ones) + /** @var Allocation|null $allocation */ + $allocation = Allocation::withoutGlobalScopes() + ->where('node_id', $server->node_id) + ->when($server->allocation, function ($query) use ($server) { + $query->where('ip', $server->allocation->ip); + }) + ->whereBetween('port', [$start, $end]) ->whereNull('server_id') ->inRandomOrder() ->first(); - $allocation = $allocation ?? $this->createNewAllocation($server); + // If create_new is disabled, only pick from existing allocations + if (!$createNew && !$allocation) { + throw new NoAutoAllocationSpaceAvailableException(); + } + + // If create_new is enabled, create a new allocation if none available + $allocation ??= $this->createNewAllocation($server, $start, $end); $allocation->update(['server_id' => $server->id]); @@ -56,27 +83,23 @@ public function handle(Server $server): Allocation * in the settings. If there are no matches in that range, or something is wrong with the * range information provided an exception will be raised. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Service\Allocation\CidrOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\InvalidPortMappingException - * @throws \App\Exceptions\Service\Allocation\PortOutOfRangeException - * @throws \App\Exceptions\Service\Allocation\TooManyPortsInRangeException + * @throws DisplayException + * @throws CidrOutOfRangeException + * @throws InvalidPortMappingException + * @throws PortOutOfRangeException + * @throws TooManyPortsInRangeException */ - protected function createNewAllocation(Server $server): Allocation + protected function createNewAllocation(Server $server, ?int $start, ?int $end): Allocation { - $start = config('panel.client_features.allocations.range_start', null); - $end = config('panel.client_features.allocations.range_end', null); - if (!$start || !$end) { throw new NoAutoAllocationSpaceAvailableException(); } - Assert::integerish($start); - Assert::integerish($end); - - // Get all of the currently allocated ports for the node so that we can figure out + // Get all the currently allocated ports for the node so that we can figure out // which port might be available. - $ports = $server->node->allocations() + // Use withoutGlobalScopes() to bypass tenant filtering. + $ports = Allocation::withoutGlobalScopes() + ->where('node_id', $server->node_id) ->where('ip', $server->allocation->ip) ->whereBetween('port', [$start, $end]) ->pluck('port'); @@ -86,7 +109,7 @@ protected function createNewAllocation(Server $server): Allocation // array of ports to create a new allocation to assign to the server. $available = array_diff(range($start, $end), $ports->toArray()); - // If we've already allocated all of the ports, just abort. + // If we've already allocated all the ports, just abort. if (empty($available)) { throw new NoAutoAllocationSpaceAvailableException(); } @@ -100,8 +123,9 @@ protected function createNewAllocation(Server $server): Allocation 'allocation_ports' => [$port], ]); - /** @var \App\Models\Allocation $allocation */ - $allocation = $server->node->allocations() + /** @var Allocation $allocation */ + $allocation = Allocation::withoutGlobalScopes() + ->where('node_id', $server->node_id) ->where('ip', $server->allocation->ip) ->where('port', $port) ->firstOrFail(); diff --git a/app/Services/Api/KeyCreationService.php b/app/Services/Api/KeyCreationService.php index 7fde94ba22..211fde2fc2 100644 --- a/app/Services/Api/KeyCreationService.php +++ b/app/Services/Api/KeyCreationService.php @@ -2,7 +2,9 @@ namespace App\Services\Api; +use App\Exceptions\Model\DataValidationException; use App\Models\ApiKey; +use Illuminate\Support\Str; class KeyCreationService { @@ -24,18 +26,20 @@ public function setKeyType(int $type): self * This will automatically generate an identifier and an encrypted token that are * stored in the database. * - * @throws \App\Exceptions\Model\DataValidationException + * @param array $data + * + * @throws DataValidationException */ - public function handle(array $data, array $permissions = []): ApiKey + public function handle(array $data): ApiKey { $data = array_merge($data, [ 'key_type' => $this->keyType, 'identifier' => ApiKey::generateTokenIdentifier($this->keyType), - 'token' => str_random(ApiKey::KEY_LENGTH), + 'token' => Str::random(ApiKey::KEY_LENGTH), ]); - if ($this->keyType === ApiKey::TYPE_APPLICATION) { - $data = array_merge($data, $permissions); + if ($this->keyType !== ApiKey::TYPE_APPLICATION) { + unset($data['permissions']); } return ApiKey::query()->forceCreate($data); diff --git a/app/Services/Backups/DeleteBackupService.php b/app/Services/Backups/DeleteBackupService.php index 6aa0e929d7..c5064a2d09 100644 --- a/app/Services/Backups/DeleteBackupService.php +++ b/app/Services/Backups/DeleteBackupService.php @@ -2,16 +2,16 @@ namespace App\Services\Backups; +use App\Exceptions\Service\Backup\BackupLockedException; +use App\Extensions\Backups\BackupManager; use App\Extensions\Filesystem\S3Filesystem; -use Aws\S3\S3Client; -use Illuminate\Http\Response; use App\Models\Backup; -use GuzzleHttp\Exception\ClientException; -use Illuminate\Database\ConnectionInterface; -use App\Extensions\Backups\BackupManager; use App\Repositories\Daemon\DaemonBackupRepository; -use App\Exceptions\Service\Backup\BackupLockedException; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Aws\S3\S3Client; +use Exception; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\Response; +use Throwable; class DeleteBackupService { @@ -19,14 +19,13 @@ public function __construct( private ConnectionInterface $connection, private BackupManager $manager, private DaemonBackupRepository $daemonBackupRepository - ) { - } + ) {} /** * Deletes a backup from the system. If the backup is stored in S3 a request * will be made to delete that backup from the disk as well. * - * @throws \Throwable + * @throws Throwable */ public function handle(Backup $backup): void { @@ -49,11 +48,10 @@ public function handle(Backup $backup): void $this->connection->transaction(function () use ($backup) { try { $this->daemonBackupRepository->setServer($backup->server)->delete($backup); - } catch (DaemonConnectionException $exception) { - $previous = $exception->getPrevious(); + } catch (Exception $exception) { // Don't fail the request if the Daemon responds with a 404, just assume the backup // doesn't actually exist and remove its reference from the Panel as well. - if (!$previous instanceof ClientException || $previous->getResponse()->getStatusCode() !== Response::HTTP_NOT_FOUND) { + if ($exception->getCode() !== Response::HTTP_NOT_FOUND) { throw $exception; } } @@ -65,7 +63,7 @@ public function handle(Backup $backup): void /** * Deletes a backup from an S3 disk. * - * @throws \Throwable + * @throws Throwable */ protected function deleteFromS3(Backup $backup): void { diff --git a/app/Services/Backups/DownloadLinkService.php b/app/Services/Backups/DownloadLinkService.php index a167a1bb24..0b3eaba15a 100644 --- a/app/Services/Backups/DownloadLinkService.php +++ b/app/Services/Backups/DownloadLinkService.php @@ -2,20 +2,19 @@ namespace App\Services\Backups; -use Carbon\CarbonImmutable; -use App\Models\User; +use App\Extensions\Backups\BackupManager; +use App\Extensions\Filesystem\S3Filesystem; use App\Models\Backup; +use App\Models\User; use App\Services\Nodes\NodeJWTService; -use App\Extensions\Backups\BackupManager; +use Carbon\CarbonImmutable; class DownloadLinkService { /** * DownloadLinkService constructor. */ - public function __construct(private BackupManager $backupManager, private NodeJWTService $jwtService) - { - } + public function __construct(private BackupManager $backupManager, private NodeJWTService $jwtService) {} /** * Returns the URL that allows for a backup to be downloaded by an individual @@ -45,7 +44,7 @@ public function handle(Backup $backup, User $user): string */ protected function getS3BackupUrl(Backup $backup): string { - /** @var \App\Extensions\Filesystem\S3Filesystem $adapter */ + /** @var S3Filesystem $adapter */ $adapter = $this->backupManager->adapter(Backup::ADAPTER_AWS_S3); $request = $adapter->getClient()->createPresignedRequest( diff --git a/app/Services/Backups/InitiateBackupService.php b/app/Services/Backups/InitiateBackupService.php index 447c575359..67aff86463 100644 --- a/app/Services/Backups/InitiateBackupService.php +++ b/app/Services/Backups/InitiateBackupService.php @@ -2,19 +2,21 @@ namespace App\Services\Backups; -use Ramsey\Uuid\Uuid; -use Webmozart\Assert\Assert; +use App\Exceptions\Service\Backup\TooManyBackupsException; +use App\Extensions\Backups\BackupManager; use App\Models\Backup; use App\Models\Server; -use Illuminate\Database\ConnectionInterface; -use App\Extensions\Backups\BackupManager; use App\Repositories\Daemon\DaemonBackupRepository; -use App\Exceptions\Service\Backup\TooManyBackupsException; +use Illuminate\Database\ConnectionInterface; +use Ramsey\Uuid\Uuid; use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; +use Throwable; +use Webmozart\Assert\Assert; class InitiateBackupService { - private ?array $ignoredFiles; + /** @var string[] */ + private array $ignoredFiles; private bool $isLocked = false; @@ -22,12 +24,11 @@ class InitiateBackupService * InitiateBackupService constructor. */ public function __construct( - private ConnectionInterface $connection, - private DaemonBackupRepository $daemonBackupRepository, - private DeleteBackupService $deleteBackupService, - private BackupManager $backupManager - ) { - } + private readonly ConnectionInterface $connection, + private readonly DaemonBackupRepository $daemonBackupRepository, + private readonly DeleteBackupService $deleteBackupService, + private readonly BackupManager $backupManager + ) {} /** * Set if the backup should be locked once it is created which will prevent @@ -43,7 +44,7 @@ public function setIsLocked(bool $isLocked): self /** * Sets the files to be ignored by this backup. * - * @param string[]|null $ignored + * @param string[]|null $ignored */ public function setIgnoredFiles(?array $ignored): self { @@ -66,11 +67,11 @@ public function setIgnoredFiles(?array $ignored): self /** * Initiates the backup process for a server on daemon. * - * @throws \Throwable - * @throws \App\Exceptions\Service\Backup\TooManyBackupsException - * @throws \Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException + * @throws Throwable + * @throws TooManyBackupsException + * @throws TooManyRequestsHttpException */ - public function handle(Server $server, string $name = null, bool $override = false): Backup + public function handle(Server $server, ?string $name = null, bool $override = false): Backup { $limit = config('backups.throttles.limit'); $period = config('backups.throttles.period'); @@ -85,7 +86,7 @@ public function handle(Server $server, string $name = null, bool $override = fal if ($previous->count() >= $limit) { $message = sprintf('Only %d backups may be generated within a %d second span of time.', $limit, $period); - throw new TooManyRequestsHttpException((int) now()->diffInSeconds($previous->last()->created_at->addSeconds($period)), $message); + throw new TooManyRequestsHttpException((int) now()->diffInSeconds($previous->last()->created_at->addSeconds((int) $period)), $message); } } @@ -110,7 +111,7 @@ public function handle(Server $server, string $name = null, bool $override = fal } return $this->connection->transaction(function () use ($server, $name) { - /** @var \App\Models\Backup $backup */ + /** @var Backup $backup */ $backup = Backup::query()->create([ 'server_id' => $server->id, 'uuid' => Uuid::uuid4()->toString(), diff --git a/app/Services/Databases/DatabaseManagementService.php b/app/Services/Databases/DatabaseManagementService.php index 364e89c6ab..a14dded909 100644 --- a/app/Services/Databases/DatabaseManagementService.php +++ b/app/Services/Databases/DatabaseManagementService.php @@ -2,14 +2,18 @@ namespace App\Services\Databases; -use App\Models\Server; -use App\Models\Database; -use App\Helpers\Utilities; -use Illuminate\Database\ConnectionInterface; -use App\Extensions\DynamicDatabaseConnection; use App\Exceptions\Repository\DuplicateDatabaseNameException; -use App\Exceptions\Service\Database\TooManyDatabasesException; use App\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException; +use App\Exceptions\Service\Database\TooManyDatabasesException; +use App\Facades\Activity; +use App\Helpers\Utilities; +use App\Models\Database; +use App\Models\Server; +use Exception; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Support\Str; +use InvalidArgumentException; +use Throwable; class DatabaseManagementService { @@ -31,9 +35,7 @@ class DatabaseManagementService public function __construct( protected ConnectionInterface $connection, - protected DynamicDatabaseConnection $dynamic, - ) { - } + ) {} /** * Generates a unique database name for the given server. This name should be passed through when @@ -60,9 +62,11 @@ public function setValidateDatabaseLimit(bool $validate): self /** * Create a new database that is linked to a specific host. * - * @throws \Throwable - * @throws \App\Exceptions\Service\Database\TooManyDatabasesException - * @throws \App\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException + * @param array{database?: string, database_host_id: int} $data + * + * @throws Throwable + * @throws TooManyDatabasesException + * @throws DatabaseClientFeatureNotEnabledException */ public function create(Server $server, array $data): Database { @@ -80,29 +84,28 @@ public function create(Server $server, array $data): Database // Protect against developer mistakes... if (empty($data['database']) || !preg_match(self::MATCH_NAME_REGEX, $data['database'])) { - throw new \InvalidArgumentException('The database name passed to DatabaseManagementService::handle MUST be prefixed with "s{server_id}_".'); + throw new InvalidArgumentException('The database name passed to DatabaseManagementService::handle MUST be prefixed with "s{server_id}_".'); } $data = array_merge($data, [ 'server_id' => $server->id, - 'username' => sprintf('u%d_%s', $server->id, str_random(10)), + 'username' => sprintf('u%d_%s', $server->id, Str::random(10)), 'password' => Utilities::randomStringWithSpecialCharacters(24), ]); - return $this->connection->transaction(function () use ($data, &$database) { + return $this->connection->transaction(function () use ($data) { $database = $this->createModel($data); - $this->dynamic->set('dynamic', $data['database_host_id']); + $database + ->createDatabase() + ->createUser() + ->assignUserToDatabase() + ->flushPrivileges(); - $database->createDatabase($database->database); - $database->createUser( - $database->username, - $database->remote, - $database->password, - $database->max_connections - ); - $database->assignUserToDatabase($database->database, $database->username, $database->remote); - $database->flush(); + Activity::event('server:database.create') + ->subject($database) + ->property('name', $database->database) + ->log(); return $database; }); @@ -111,17 +114,45 @@ public function create(Server $server, array $data): Database /** * Delete a database from the given host server. * - * @throws \Exception + * @throws Throwable */ public function delete(Database $database): ?bool { - $this->dynamic->set('dynamic', $database->database_host_id); - - $database->dropDatabase($database->database); - $database->dropUser($database->username, $database->remote); - $database->flush(); + return $this->connection->transaction(function () use ($database) { + $database + ->dropDatabase() + ->dropUser() + ->flushPrivileges(); + + Activity::event('server:database.delete') + ->subject($database) + ->property('name', $database->database) + ->log(); + + return $database->delete(); + }); + } - return $database->delete(); + /** + * Updates a password for a given database. + * + * @throws \Exception + */ + public function rotatePassword(Database $database): void + { + $password = Utilities::randomStringWithSpecialCharacters(24); + + $this->connection->transaction(function () use ($database, $password) { + $database->update([ + 'password' => $password, + ]); + + $database + ->dropUser() + ->createUser() + ->assignUserToDatabase() + ->flushPrivileges(); + }); } /** @@ -129,8 +160,10 @@ public function delete(Database $database): ?bool * have the same name across multiple hosts, for the sake of keeping this logic easy to understand * and avoiding user confusion we will ignore the specific host and just look across all hosts. * - * @throws \App\Exceptions\Repository\DuplicateDatabaseNameException - * @throws \Throwable + * @param array{server_id: int, database: string} $data + * + * @throws DuplicateDatabaseNameException + * @throws Throwable */ protected function createModel(array $data): Database { diff --git a/app/Services/Databases/DatabasePasswordService.php b/app/Services/Databases/DatabasePasswordService.php deleted file mode 100644 index 47a8162f83..0000000000 --- a/app/Services/Databases/DatabasePasswordService.php +++ /dev/null @@ -1,47 +0,0 @@ -findOrFail($database); - } - - $password = Utilities::randomStringWithSpecialCharacters(24); - - $this->connection->transaction(function () use ($database, $password) { - $this->dynamic->set('dynamic', $database->database_host_id); - - $database->update([ - 'password' => $password, - ]); - - $database->dropUser($database->username, $database->remote); - $database->createUser($database->username, $database->remote, $password, $database->max_connections); - $database->assignUserToDatabase($database->database, $database->username, $database->remote); - $database->flush(); - }); - - return $password; - } -} diff --git a/app/Services/Databases/DeployServerDatabaseService.php b/app/Services/Databases/DeployServerDatabaseService.php index d451423793..d89e3dc1be 100644 --- a/app/Services/Databases/DeployServerDatabaseService.php +++ b/app/Services/Databases/DeployServerDatabaseService.php @@ -2,40 +2,33 @@ namespace App\Services\Databases; -use Webmozart\Assert\Assert; -use App\Models\Server; +use App\Exceptions\Service\Database\NoSuitableDatabaseHostException; use App\Models\Database; use App\Models\DatabaseHost; -use App\Exceptions\Service\Database\NoSuitableDatabaseHostException; +use App\Models\Server; +use Webmozart\Assert\Assert; -class DeployServerDatabaseService +readonly class DeployServerDatabaseService { - /** - * DeployServerDatabaseService constructor. - */ - public function __construct(private DatabaseManagementService $managementService) - { - } + public function __construct(private DatabaseManagementService $managementService) {} /** - * @throws \Throwable - * @throws \App\Exceptions\Service\Database\TooManyDatabasesException - * @throws \App\Exceptions\Service\Database\DatabaseClientFeatureNotEnabledException + * @param array{database?: string, remote?: string} $data */ public function handle(Server $server, array $data): Database { Assert::notEmpty($data['database'] ?? null); Assert::notEmpty($data['remote'] ?? null); - $hosts = DatabaseHost::query()->get()->toBase(); + $hosts = DatabaseHost::query()->get(); if ($hosts->isEmpty()) { throw new NoSuitableDatabaseHostException(); - } else { - $nodeHosts = $hosts->where('node_id', $server->node_id)->toBase(); + } - if ($nodeHosts->isEmpty() && !config('panel.client_features.databases.allow_random')) { - throw new NoSuitableDatabaseHostException(); - } + $nodeHosts = $server->node->databaseHosts()->get(); + // TODO: @areyouscared remove allow random feature for database hosts + if ($nodeHosts->isEmpty() && !config('panel.client_features.databases.allow_random')) { + throw new NoSuitableDatabaseHostException(); } return $this->managementService->create($server, [ diff --git a/app/Services/Databases/Hosts/HostCreationService.php b/app/Services/Databases/Hosts/HostCreationService.php index da61bbe7a8..1a0f023c22 100644 --- a/app/Services/Databases/Hosts/HostCreationService.php +++ b/app/Services/Databases/Hosts/HostCreationService.php @@ -3,9 +3,8 @@ namespace App\Services\Databases\Hosts; use App\Models\DatabaseHost; -use Illuminate\Database\DatabaseManager; use Illuminate\Database\ConnectionInterface; -use App\Extensions\DynamicDatabaseConnection; +use Throwable; class HostCreationService { @@ -14,15 +13,22 @@ class HostCreationService */ public function __construct( private ConnectionInterface $connection, - private DatabaseManager $databaseManager, - private DynamicDatabaseConnection $dynamic, - ) { - } + ) {} /** * Create a new database host on the Panel. * - * @throws \Throwable + * @param array{ + * password: string, + * name: string, + * host: string, + * port: int, + * username: string, + * max_databases: int, + * node_ids?: array + * } $data + * + * @throws Throwable */ public function handle(array $data): DatabaseHost { @@ -34,12 +40,12 @@ public function handle(array $data): DatabaseHost 'port' => array_get($data, 'port'), 'username' => array_get($data, 'username'), 'max_databases' => array_get($data, 'max_databases'), - 'node_id' => array_get($data, 'node_id'), ]); + $host->nodes()->sync(array_get($data, 'node_ids', [])); + // Confirm access using the provided credentials before saving data. - $this->dynamic->set('dynamic', $host); - $this->databaseManager->connection('dynamic')->getPdo(); + $host->buildConnection()->getPdo(); return $host; }); diff --git a/app/Services/Databases/Hosts/HostDeletionService.php b/app/Services/Databases/Hosts/HostDeletionService.php deleted file mode 100644 index c1caabac97..0000000000 --- a/app/Services/Databases/Hosts/HostDeletionService.php +++ /dev/null @@ -1,26 +0,0 @@ -findOrFail($host); - - if ($host->databases()->count() > 0) { - throw new HasActiveServersException(trans('exceptions.databases.delete_has_databases')); - } - - return (int) $host->delete(); - } -} diff --git a/app/Services/Databases/Hosts/HostUpdateService.php b/app/Services/Databases/Hosts/HostUpdateService.php index 82f4574e7a..a69466d73b 100644 --- a/app/Services/Databases/Hosts/HostUpdateService.php +++ b/app/Services/Databases/Hosts/HostUpdateService.php @@ -3,9 +3,8 @@ namespace App\Services\Databases\Hosts; use App\Models\DatabaseHost; -use Illuminate\Database\DatabaseManager; use Illuminate\Database\ConnectionInterface; -use App\Extensions\DynamicDatabaseConnection; +use Throwable; class HostUpdateService { @@ -14,15 +13,14 @@ class HostUpdateService */ public function __construct( private ConnectionInterface $connection, - private DatabaseManager $databaseManager, - private DynamicDatabaseConnection $dynamic, - ) { - } + ) {} /** * Update a database host and persist to the database. * - * @throws \Throwable + * @param array $data + * + * @throws Throwable */ public function handle(DatabaseHost|int $host, array $data): DatabaseHost { @@ -37,8 +35,8 @@ public function handle(DatabaseHost|int $host, array $data): DatabaseHost return $this->connection->transaction(function () use ($data, $host) { $host->update($data); - $this->dynamic->set('dynamic', $host); - $this->databaseManager->connection('dynamic')->getPdo(); + // Confirm access using the provided credentials before saving data. + $host->buildConnection()->getPdo(); return $host; }); diff --git a/app/Services/Deployment/AllocationSelectionService.php b/app/Services/Deployment/AllocationSelectionService.php index 3868d0b383..3beab139ca 100644 --- a/app/Services/Deployment/AllocationSelectionService.php +++ b/app/Services/Deployment/AllocationSelectionService.php @@ -2,17 +2,20 @@ namespace App\Services\Deployment; -use App\Models\Allocation; use App\Exceptions\DisplayException; -use App\Services\Allocations\AssignmentService; use App\Exceptions\Service\Deployment\NoViableAllocationException; +use App\Models\Allocation; +use App\Models\Node; +use App\Services\Allocations\AssignmentService; class AllocationSelectionService { protected bool $dedicated = false; + /** @var array */ protected array $nodes = []; + /** @var array */ protected array $ports = []; /** @@ -30,6 +33,8 @@ public function setDedicated(bool $dedicated): self /** * A list of node IDs that should be used when selecting an allocation. If empty, all * nodes will be used to filter with. + * + * @param array $nodes */ public function setNodes(array $nodes): self { @@ -43,7 +48,9 @@ public function setNodes(array $nodes): self * empty, all ports will be considered when finding an allocation. If set, only ports appearing * in the array or range will be used. * - * @throws \App\Exceptions\DisplayException + * @param array $ports + * + * @throws DisplayException */ public function setPorts(array $ports): self { @@ -72,7 +79,7 @@ public function setPorts(array $ports): self /** * Return a single allocation that should be used as the default allocation for a server. * - * @throws \App\Exceptions\Service\Deployment\NoViableAllocationException + * @throws NoViableAllocationException */ public function handle(): Allocation { @@ -87,6 +94,9 @@ public function handle(): Allocation /** * Return a single allocation from those meeting the requirements. + * + * @param array $nodes + * @param array> $ports */ private function getRandomAllocation(array $nodes = [], array $ports = [], bool $dedicated = false): ?Allocation { @@ -133,6 +143,9 @@ private function getRandomAllocation(array $nodes = [], array $ports = [], bool * * If an array of nodes is passed the results will be limited to allocations * in those nodes. + * + * @param array $nodes + * @return array */ private function getDiscardableDedicatedAllocations(array $nodes = []): array { @@ -142,8 +155,8 @@ private function getDiscardableDedicatedAllocations(array $nodes = []): array $query->whereIn('node_id', $nodes); } - return $query->groupBy('ip') - ->get() + return $query + ->groupBy('ip') ->pluck('ip') ->toArray(); } diff --git a/app/Services/Deployment/FindViableNodesService.php b/app/Services/Deployment/FindViableNodesService.php index 4cffc71d28..55d0749022 100644 --- a/app/Services/Deployment/FindViableNodesService.php +++ b/app/Services/Deployment/FindViableNodesService.php @@ -16,8 +16,10 @@ class FindViableNodesService * and cpu availability requirements. Any nodes not meeting those requirements * are tossed out, as are any nodes marked as non-public, meaning automatic * deployments should not be done against them. + * + * @param string[] $tags */ - public function handle(int $memory = 0, int $disk = 0, int $cpu = 0, $tags = []): Collection + public function handle(int $memory = 0, int $disk = 0, int $cpu = 0, array $tags = []): Collection { $nodes = Node::query() ->withSum('servers', 'memory') @@ -27,7 +29,7 @@ public function handle(int $memory = 0, int $disk = 0, int $cpu = 0, $tags = []) ->get(); return $nodes - ->filter(fn (Node $node) => !$tags || collect($node->tags)->intersect($tags)) + ->filter(fn (Node $node) => !$tags || collect($node->tags)->intersect($tags)->isNotEmpty()) ->filter(fn (Node $node) => $node->isViable($memory, $disk, $cpu)); } } diff --git a/app/Services/Eggs/EggChangerService.php b/app/Services/Eggs/EggChangerService.php new file mode 100644 index 0000000000..52abad1dc3 --- /dev/null +++ b/app/Services/Eggs/EggChangerService.php @@ -0,0 +1,49 @@ +egg->id === $newEgg->id) { + return; + } + + // Change egg id, default image and startup command + $server->forceFill([ + 'egg_id' => $newEgg->id, + 'image' => Arr::first($newEgg->docker_images), + 'startup' => Arr::first($newEgg->startup_commands), + ])->saveOrFail(); + + $oldVariables = []; + if ($keepOldVariables) { + // Keep copy of old server variables + foreach ($server->serverVariables as $serverVariable) { + $oldVariables[$serverVariable->variable->env_variable] = $serverVariable->variable_value; + } + } + + // Delete old server variables + ServerVariable::where('server_id', $server->id)->delete(); + + // Create new server variables + foreach ($newEgg->variables as $eggVariable) { + ServerVariable::create([ + 'server_id' => $server->id, + 'variable_id' => $eggVariable->id, + 'variable_value' => $oldVariables[$eggVariable->env_variable] ?? $eggVariable->default_value, + ]); + } + } +} diff --git a/app/Services/Eggs/EggConfigurationService.php b/app/Services/Eggs/EggConfigurationService.php index 90c9427e42..714535007c 100644 --- a/app/Services/Eggs/EggConfigurationService.php +++ b/app/Services/Eggs/EggConfigurationService.php @@ -2,29 +2,40 @@ namespace App\Services\Eggs; -use Illuminate\Support\Arr; -use Illuminate\Support\Str; use App\Models\Server; use App\Services\Servers\ServerConfigurationStructureService; +use Illuminate\Support\Arr; +use Illuminate\Support\Str; class EggConfigurationService { /** * EggConfigurationService constructor. */ - public function __construct(private ServerConfigurationStructureService $configurationStructureService) - { - } + public function __construct(private ServerConfigurationStructureService $configurationStructureService) {} /** * Return an Egg file to be used by the Daemon. + * + * @return array{ + * startup: array{done: string[], user_interaction: string[], strip_ansi: bool}, + * stop: array{type: string, value: string}, + * configs: list + * }> + * } */ public function handle(Server $server): array { - $configs = $this->replacePlaceholders( - $server, - json_decode($server->egg->inherit_config_files) - ); + $configFiles = json_decode($server->egg->inherit_config_files ?? '{}'); + $configs = is_object($configFiles) || is_array($configFiles) + ? $this->replacePlaceholders($server, $configFiles) + : []; return [ 'startup' => $this->convertStartupToNewFormat(json_decode($server->egg->inherit_config_startup, true)), @@ -35,6 +46,9 @@ public function handle(Server $server): array /** * Convert the "done" variable into an array if it is not currently one. + * + * @param array{done: string|string[], strip_ansi: bool} $startup + * @return array{done: string[], user_interaction: string[], strip_ansi: bool} */ protected function convertStartupToNewFormat(array $startup): array { @@ -53,6 +67,8 @@ protected function convertStartupToNewFormat(array $startup): array * For most eggs, this ends up just being a command sent to the server console, but * if the stop command is something starting with a caret (^), it will be converted * into the associated kill signal for the instance. + * + * @return array{type: string, value: string} */ protected function convertStopToNewFormat(string $stop): array { @@ -64,12 +80,6 @@ protected function convertStopToNewFormat(string $stop): array } $signal = substr($stop, 1); - if (strtoupper($signal) === 'C') { - return [ - 'type' => 'stop', - 'value' => null, - ]; - } return [ 'type' => 'signal', @@ -77,7 +87,11 @@ protected function convertStopToNewFormat(string $stop): array ]; } - protected function replacePlaceholders(Server $server, object $configs): array + /** + * @param array $configs + * @return array> + */ + protected function replacePlaceholders(Server $server, object|array $configs): array { // Get the legacy configuration structure for the server so that we // can property map the egg placeholders to values. @@ -124,6 +138,9 @@ protected function replacePlaceholders(Server $server, object $configs): array return $response; } + /** + * @param array{string, mixed} $structure + */ protected function matchAndReplaceKeys(mixed $value, array $structure): mixed { preg_match_all('/{{(?[\w.-]*)}}/', $value, $matches); @@ -178,6 +195,8 @@ protected function matchAndReplaceKeys(mixed $value, array $structure): mixed * Iterates over a set of "find" values for a given file in the parser configuration. If * the value of the line match is something iterable, continue iterating, otherwise perform * a match & replace. + * + * @param array $structure */ private function iterate(mixed $data, array $structure): mixed { diff --git a/app/Services/Eggs/Scripts/InstallScriptService.php b/app/Services/Eggs/Scripts/InstallScriptService.php deleted file mode 100644 index 824c79482f..0000000000 --- a/app/Services/Eggs/Scripts/InstallScriptService.php +++ /dev/null @@ -1,22 +0,0 @@ -update([ - 'script_install' => array_get($data, 'script_install'), - 'script_is_privileged' => array_get($data, 'script_is_privileged', 1), - 'script_entry' => array_get($data, 'script_entry'), - 'script_container' => array_get($data, 'script_container'), - 'copy_script_from' => array_get($data, 'copy_script_from'), - ]); - } -} diff --git a/app/Services/Eggs/Sharing/EggExporterService.php b/app/Services/Eggs/Sharing/EggExporterService.php index 19c9a5e123..94fbcda3fd 100644 --- a/app/Services/Eggs/Sharing/EggExporterService.php +++ b/app/Services/Eggs/Sharing/EggExporterService.php @@ -2,19 +2,23 @@ namespace App\Services\Eggs\Sharing; -use Carbon\Carbon; +use App\Enums\EggFormat; use App\Models\Egg; -use Illuminate\Support\Collection; use App\Models\EggVariable; +use Carbon\Carbon; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Storage; +use Symfony\Component\Yaml\Yaml; class EggExporterService { /** - * Return a JSON representation of an egg and its variables. + * Return a JSON or YAML representation of an egg and its variables. */ - public function handle(int $egg): string + public function handle(int $egg, EggFormat $format): string { $egg = Egg::with(['scriptFrom', 'configFrom', 'variables'])->findOrFail($egg); + $imageBase64 = $this->getEggImageAsBase64($egg); $struct = [ '_comment' => 'DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL', @@ -27,12 +31,12 @@ public function handle(int $egg): string 'author' => $egg->author, 'uuid' => $egg->uuid, 'description' => $egg->description, + 'image' => $imageBase64, + 'tags' => $egg->tags, 'features' => $egg->features, 'docker_images' => $egg->docker_images, - 'file_denylist' => Collection::make($egg->inherit_file_denylist)->filter(function ($value) { - return !empty($value); - }), - 'startup' => $egg->startup, + 'file_denylist' => Collection::make($egg->inherit_file_denylist)->filter(fn ($v) => !empty($v))->values(), + 'startup_commands' => $egg->startup_commands, 'config' => [ 'files' => $egg->inherit_config_files, 'startup' => $egg->inherit_config_startup, @@ -48,11 +52,69 @@ public function handle(int $egg): string ], 'variables' => $egg->variables->map(function (EggVariable $eggVariable) { return Collection::make($eggVariable->toArray()) - ->except(['id', 'egg_id', 'created_at', 'updated_at']) - ->merge(['field_type' => 'text']); - }), + ->except(['id', 'egg_id', 'created_at', 'updated_at']); + })->values()->toArray(), ]; - return json_encode($struct, JSON_PRETTY_PRINT); + return match ($format) { + EggFormat::JSON => json_encode($struct, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), + EggFormat::YAML => Yaml::dump($this->yamlExport($struct), 10, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK | Yaml::DUMP_OBJECT_AS_MAP), + }; + } + + /** + * Get the egg image as base64 for export. + */ + private function getEggImageAsBase64(Egg $egg): ?string + { + foreach (array_keys(Egg::IMAGE_FORMATS) as $ext) { + $path = Egg::ICON_STORAGE_PATH . "/$egg->uuid.$ext"; + + if (Storage::disk('public')->exists($path)) { + $mimeType = Egg::IMAGE_FORMATS[$ext]; + + return 'data:' . $mimeType . ';base64,' . base64_encode(Storage::disk('public')->get($path)); + } + } + + return null; + } + + protected function yamlExport(mixed $data): mixed + { + if ($data instanceof Collection) { + $data = $data->all(); + } + + if (is_string($data)) { + $decoded = json_decode($data, true); + if (json_last_error() === JSON_ERROR_NONE) { + return $this->yamlExport($decoded); + } + + return str_replace("\r\n", "\n", $data); + } + + if (is_array($data)) { + $result = []; + + foreach ($data as $key => $value) { + if ( + is_string($value) && + strtolower($key) === 'description' && + (str_contains($value, "\n") || strlen($value) > 80) + ) { + $value = wordwrap($value, 100, "\n"); + } else { + $value = $this->yamlExport($value); + } + + $result[$key] = $value; + } + + return $result; + } + + return $data; } } diff --git a/app/Services/Eggs/Sharing/EggImporterService.php b/app/Services/Eggs/Sharing/EggImporterService.php index dc54525a6e..c8fced1399 100644 --- a/app/Services/Eggs/Sharing/EggImporterService.php +++ b/app/Services/Eggs/Sharing/EggImporterService.php @@ -2,15 +2,21 @@ namespace App\Services\Eggs\Sharing; +use App\Enums\EggFormat; use App\Exceptions\Service\InvalidFileUploadException; -use Ramsey\Uuid\Uuid; -use Illuminate\Support\Arr; use App\Models\Egg; -use Illuminate\Http\UploadedFile; use App\Models\EggVariable; use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\UploadedFile; +use Illuminate\Support\Arr; use Illuminate\Support\Collection; -use Spatie\TemporaryDirectory\TemporaryDirectory; +use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Storage; +use JsonException; +use Ramsey\Uuid\Uuid; +use stdClass; +use Symfony\Component\Yaml\Yaml; +use Throwable; class EggImporterService { @@ -25,19 +31,77 @@ class EggImporterService 'server.build.environment.' => 'server.environment.', ]; - public function __construct(protected ConnectionInterface $connection) + public function __construct(protected ConnectionInterface $connection) {} + + /** + * Take a JSON or YAML as string and parse it into a new egg. + * + * @throws InvalidFileUploadException|Throwable + */ + public function fromContent(string $content, EggFormat $format = EggFormat::YAML, ?Egg $egg = null): Egg + { + $parsed = $this->parse($content, $format); + + return $this->fromParsed($parsed, $egg); + } + + /** + * Take an uploaded JSON or YAML file and parse it into a new egg. + * + * @throws InvalidFileUploadException|Throwable + */ + public function fromFile(UploadedFile $file, ?Egg $egg = null): Egg { + if ($file->getError() !== UPLOAD_ERR_OK) { + throw new InvalidFileUploadException('The selected file was not uploaded successfully'); + } + + $extension = strtolower($file->getClientOriginalExtension()); + $mime = $file->getMimeType(); + + try { + $content = $file->getContent(); + + if (in_array($extension, ['yaml', 'yml']) || str_contains($mime, 'yaml')) { + return $this->fromContent($content, EggFormat::YAML, $egg); + } + + return $this->fromContent($content, EggFormat::JSON, $egg); + } catch (Throwable $e) { + throw new InvalidFileUploadException('File parse failed: ' . $e->getMessage()); + } } /** - * Take an uploaded JSON file and parse it into a new egg. + * Take a URL (YAML or JSON) and parse it into a new egg or update an existing one. * - * @throws \App\Exceptions\Service\InvalidFileUploadException|\Throwable + * @throws InvalidFileUploadException|Throwable */ - public function fromFile(UploadedFile $file, Egg $egg = null): Egg + public function fromUrl(string $url, ?Egg $egg = null): Egg { - $parsed = $this->parseFile($file); + $info = pathinfo($url); + $extension = strtolower($info['extension']); + $format = match ($extension) { + 'yaml', 'yml' => EggFormat::YAML, + 'json' => EggFormat::JSON, + default => throw new InvalidFileUploadException('Unsupported file format.'), + }; + + $content = Http::timeout(5)->connectTimeout(1)->get($url)->throw()->body(); + + return $this->fromContent($content, $format, $egg); + } + + /** + * Take an array and parse it into a new egg. + * + * @param array $parsed + * + * @throws InvalidFileUploadException|Throwable + */ + protected function fromParsed(array $parsed, ?Egg $egg = null): Egg + { return $this->connection->transaction(function () use ($egg, $parsed) { $uuid = $parsed['uuid'] ?? Uuid::uuid4()->toString(); $egg = $egg ?? Egg::where('uuid', $uuid)->first() ?? new Egg(); @@ -48,10 +112,13 @@ public function fromFile(UploadedFile $file, Egg $egg = null): Egg 'copy_script_from' => null, ]); + for ($i = 0; $i < count($parsed['variables']); $i++) { + unset($parsed['variables'][$i]['field_type']); + } + $egg = $this->fillFromParsed($egg, $parsed); $egg->save(); - // Update existing variables or create new ones. foreach ($parsed['variables'] ?? [] as $variable) { EggVariable::unguarded(function () use ($egg, $variable) { $variable['rules'] = is_array($variable['rules']) ? $variable['rules'] : explode('|', $variable['rules']); @@ -63,7 +130,6 @@ public function fromFile(UploadedFile $file, Egg $egg = null): Egg } $imported = array_map(fn ($value) => $value['env_variable'], $parsed['variables'] ?? []); - $egg->variables()->whereNotIn('env_variable', $imported)->delete(); return $egg->refresh(); @@ -71,71 +137,118 @@ public function fromFile(UploadedFile $file, Egg $egg = null): Egg } /** - * Take an url and parse it into a new egg or update an existing one. + * Takes a string and parses out the egg configuration from within. * - * @throws \App\Exceptions\Service\InvalidFileUploadException|\Throwable - */ - public function fromUrl(string $url, Egg $egg = null): Egg - { - $info = pathinfo($url); - $tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed(); - $tmpPath = $tmpDir->path($info['basename']); - - file_put_contents($tmpPath, file_get_contents($url)); - - return $this->fromFile(new UploadedFile($tmpPath, $info['basename'], 'application/json'), $egg); - } - - /** - * Takes an uploaded file and parses out the egg configuration from within. + * @return array * - * @throws \JsonException - * @throws \App\Exceptions\Service\InvalidFileUploadException + * @throws InvalidFileUploadException|JsonException */ - protected function parseFile(UploadedFile $file): array + protected function parse(string $content, EggFormat $format): array { - if ($file->getError() !== UPLOAD_ERR_OK) { - throw new InvalidFileUploadException('The selected file was not uploaded successfully'); + try { + $parsed = match ($format) { + EggFormat::YAML => Yaml::parse($content), + default => json_decode($content, true, 512, JSON_THROW_ON_ERROR), + }; + } catch (Throwable $e) { + throw new InvalidFileUploadException('File parse failed: ' . $e->getMessage()); } - $parsed = json_decode($file->getContent(), true, 512, JSON_THROW_ON_ERROR); - $version = $parsed['meta']['version'] ?? ''; $parsed = match ($version) { - 'PTDL_v1' => $this->convertToV2($parsed), - 'PTDL_v2' => $parsed, - default => throw new InvalidFileUploadException('The JSON file provided is not in a format that can be recognized.') + 'PTDL_v1' => $this->convertToV3($this->convertLegacy($parsed)), + 'PTDL_v2', 'PLCN_v1', 'PLCN_v2' => $this->convertToV3($parsed), + Egg::EXPORT_VERSION => $parsed, + default => throw new InvalidFileUploadException('The file format is not recognized.'), }; - // Make sure we only use recent variable format from now on - $parsed['config']['files'] = str_replace( - array_keys(self::UPGRADE_VARIABLES), - array_values(self::UPGRADE_VARIABLES), - $parsed['config']['files'] ?? '', - ); + if (isset($parsed['config']) && (is_array($parsed['config']) || $parsed['config'] instanceof stdClass)) { + $parsed['config'] = (array) $parsed['config']; + foreach ($parsed['config'] as $key => $value) { + if (is_array($value) || $value instanceof stdClass) { + $parsed['config'][$key] = json_encode((array) $value, JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR); + } + + if ($key === 'files' && is_string($parsed['config'][$key])) { + $parsed['config'][$key] = str_replace( + array_keys(self::UPGRADE_VARIABLES), + array_values(self::UPGRADE_VARIABLES), + $parsed['config'][$key] + ); + } + } + } + + if (isset($parsed['scripts']['installation']) && (is_array($parsed['scripts']['installation']) || $parsed['scripts']['installation'] instanceof stdClass)) { + $parsed['scripts']['installation'] = (array) $parsed['scripts']['installation']; + foreach ($parsed['scripts']['installation'] as $key => $value) { + if (is_array($value) || $value instanceof stdClass) { + $parsed['scripts']['installation'][$key] = json_encode((array) $value, JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR); + } + } + } + + // Convert YAML booleans to strings to prevent Laravel from converting them to 1/0 + // when saving to TEXT field. Required for validation rules like "in:true,false". + if (isset($parsed['variables'])) { + $parsed['variables'] = array_map(function ($variable) { + if (isset($variable['default_value']) && is_bool($variable['default_value'])) { + $variable['default_value'] = $variable['default_value'] ? 'true' : 'false'; + } + + return $variable; + }, $parsed['variables']); + } + + // Reserved env var name handling + [$forbidden, $allowed] = collect($parsed['variables']) + ->map(fn ($variable) => array_merge( + $variable, + ['env_variable' => strtoupper($variable['env_variable'])] + )) + ->partition(fn ($variable) => in_array($variable['env_variable'], EggVariable::RESERVED_ENV_NAMES)); + + $updatedVariables = $forbidden->map(fn ($variable) => array_merge( + $variable, + ['env_variable' => 'SERVER_' . $variable['env_variable']] + )); + + if ($forbidden->count()) { + $parsed['variables'] = $allowed->merge($updatedVariables)->all(); + + foreach ($parsed['startup_commands'] ?? [] as $name => $startup) { + $pattern = '/\b(' . collect($forbidden)->map(fn ($variable) => preg_quote($variable['env_variable']))->join('|') . ')\b/'; + $parsed['startup_commands'][$name] = preg_replace($pattern, 'SERVER_$1', $startup) ?? $startup; + } + } return $parsed; } /** - * Fills the provided model with the parsed JSON data. + * @param array $parsed */ protected function fillFromParsed(Egg $model, array $parsed): Egg { + // Handle image data if present + if (!empty($parsed['image']) && str_starts_with($parsed['image'], 'data:')) { + $this->saveEggImageFromBase64($parsed['image'], $model); + } + return $model->forceFill([ 'name' => Arr::get($parsed, 'name'), 'description' => Arr::get($parsed, 'description'), + 'tags' => Arr::get($parsed, 'tags', []), 'features' => Arr::get($parsed, 'features'), 'docker_images' => Arr::get($parsed, 'docker_images'), - 'file_denylist' => Collection::make(Arr::get($parsed, 'file_denylist')) - ->filter(fn ($value) => !empty($value)), + 'file_denylist' => Collection::make(Arr::get($parsed, 'file_denylist'))->filter(fn ($value) => !empty($value)), 'update_url' => Arr::get($parsed, 'meta.update_url'), - 'config_files' => Arr::get($parsed, 'config.files'), - 'config_startup' => Arr::get($parsed, 'config.startup'), - 'config_logs' => Arr::get($parsed, 'config.logs'), + 'config_files' => json_encode(json_decode(Arr::get($parsed, 'config.files')), JSON_PRETTY_PRINT), + 'config_startup' => json_encode(json_decode(Arr::get($parsed, 'config.startup')), JSON_PRETTY_PRINT), + 'config_logs' => json_encode(json_decode(Arr::get($parsed, 'config.logs')), JSON_PRETTY_PRINT), 'config_stop' => Arr::get($parsed, 'config.stop'), - 'startup' => Arr::get($parsed, 'startup'), + 'startup_commands' => Arr::get($parsed, 'startup_commands'), 'script_install' => Arr::get($parsed, 'scripts.installation.script'), 'script_entry' => Arr::get($parsed, 'scripts.installation.entrypoint'), 'script_container' => Arr::get($parsed, 'scripts.installation.container'), @@ -143,30 +256,65 @@ protected function fillFromParsed(Egg $model, array $parsed): Egg } /** - * Converts a PTDL_V1 egg into the expected PTDL_V2 egg format. This just handles - * the "docker_images" field potentially not being present, and not being in the - * expected "key => value" format. + * Save an egg image from base64 data to a file. + */ + private function saveEggImageFromBase64(string $base64String, Egg $egg): void + { + if (!preg_match('/^data:image\/([\w+]+);base64,(.+)$/', $base64String, $matches)) { + return; + } + + $extension = $matches[1]; + $data = base64_decode($matches[2]); + + if (!$data) { + return; + } + + $normalizedExtension = match ($extension) { + 'svg+xml' => 'svg', + 'jpeg' => 'jpg', + default => $extension, + }; + + Storage::disk('public')->put(Egg::ICON_STORAGE_PATH . "/$egg->uuid.$normalizedExtension", $data); + } + + /** + * @param array $parsed + * @return array */ - protected function convertToV2(array $parsed): array + protected function convertLegacy(array $parsed): array { - // Maintain backwards compatability for eggs that are still using the old single image - // string format. New eggs can provide an array of Docker images that can be used. if (!isset($parsed['images'])) { $images = [Arr::get($parsed, 'image') ?? 'nil']; } else { $images = $parsed['images']; } - unset($parsed['images'], $parsed['image']); + unset($parsed['images'], $parsed['image'], $parsed['field_type']); $parsed['docker_images'] = []; foreach ($images as $image) { $parsed['docker_images'][$image] = $image; } - $parsed['variables'] = array_map(function ($value) { - return array_merge($value, ['field_type' => 'text']); - }, $parsed['variables']); + return $parsed; + } + + /** + * @param array $parsed + * @return array + */ + protected function convertToV3(array $parsed): array + { + $startup = $parsed['startup']; + + unset($parsed['startup']); + + $parsed['startup_commands'] = [ + 'Default' => $startup, + ]; return $parsed; } diff --git a/app/Services/Eggs/Variables/VariableCreationService.php b/app/Services/Eggs/Variables/VariableCreationService.php index c6c7269862..1d6c1358af 100644 --- a/app/Services/Eggs/Variables/VariableCreationService.php +++ b/app/Services/Eggs/Variables/VariableCreationService.php @@ -2,10 +2,12 @@ namespace App\Services\Eggs\Variables; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\Egg\Variable\BadValidationRuleException; +use App\Exceptions\Service\Egg\Variable\ReservedVariableNameException; use App\Models\EggVariable; use App\Traits\Services\ValidatesValidationRules; use Illuminate\Contracts\Validation\Factory as ValidationFactory; -use App\Exceptions\Service\Egg\Variable\ReservedVariableNameException; class VariableCreationService { @@ -14,9 +16,7 @@ class VariableCreationService /** * VariableCreationService constructor. */ - public function __construct(private ValidationFactory $validator) - { - } + public function __construct(private ValidationFactory $validator) {} /** * Return the validation factory instance to be used by rule validation @@ -30,13 +30,21 @@ protected function getValidator(): ValidationFactory /** * Create a new variable for a given Egg. * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\Variable\BadValidationRuleException - * @throws \App\Exceptions\Service\Egg\Variable\ReservedVariableNameException + * @param array{ + * name?: string, + * description?: string, + * env_variable?: string, + * default_value?: string, + * rules?: string|string[], + * } $data + * + * @throws DataValidationException + * @throws BadValidationRuleException + * @throws ReservedVariableNameException */ public function handle(int $egg, array $data): EggVariable { - if (in_array(strtoupper(array_get($data, 'env_variable')), explode(',', EggVariable::RESERVED_ENV_NAMES))) { + if (in_array(strtoupper(array_get($data, 'env_variable')), EggVariable::RESERVED_ENV_NAMES)) { throw new ReservedVariableNameException(sprintf('Cannot use the protected name %s for this environment variable.', array_get($data, 'env_variable'))); } diff --git a/app/Services/Eggs/Variables/VariableUpdateService.php b/app/Services/Eggs/Variables/VariableUpdateService.php index e56ae8ea74..37fb61ca41 100644 --- a/app/Services/Eggs/Variables/VariableUpdateService.php +++ b/app/Services/Eggs/Variables/VariableUpdateService.php @@ -2,11 +2,12 @@ namespace App\Services\Eggs\Variables; -use App\Models\EggVariable; use App\Exceptions\DisplayException; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\Egg\Variable\ReservedVariableNameException; +use App\Models\EggVariable; use App\Traits\Services\ValidatesValidationRules; use Illuminate\Contracts\Validation\Factory as ValidationFactory; -use App\Exceptions\Service\Egg\Variable\ReservedVariableNameException; class VariableUpdateService { @@ -15,9 +16,7 @@ class VariableUpdateService /** * VariableUpdateService constructor. */ - public function __construct(private ValidationFactory $validator) - { - } + public function __construct(private ValidationFactory $validator) {} /** * Return the validation factory instance to be used by rule validation @@ -31,15 +30,24 @@ protected function getValidator(): ValidationFactory /** * Update a specific egg variable. * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Egg\Variable\ReservedVariableNameException + * @param array{ + * env_variable?: string, + * rules?: string|string[], + * options?: string[], + * name?: string, + * description?: string, + * default_value?: string, + * } $data + * + * @throws DisplayException + * @throws DataValidationException + * @throws ReservedVariableNameException */ - public function handle(EggVariable $variable, array $data): mixed + public function handle(EggVariable $variable, array $data): EggVariable { if (!is_null(array_get($data, 'env_variable'))) { - if (in_array(strtoupper(array_get($data, 'env_variable')), explode(',', EggVariable::RESERVED_ENV_NAMES))) { - throw new ReservedVariableNameException(trans('exceptions.service.variables.reserved_name', ['name' => array_get($data, 'env_variable')])); + if (in_array(strtoupper(array_get($data, 'env_variable')), EggVariable::RESERVED_ENV_NAMES)) { + throw new ReservedVariableNameException(trans('exceptions.variables.reserved_name', ['name' => array_get($data, 'env_variable')])); } $search = EggVariable::query() @@ -49,7 +57,7 @@ public function handle(EggVariable $variable, array $data): mixed ->count(); if ($search > 0) { - throw new DisplayException(trans('exceptions.service.variables.env_not_unique', ['name' => array_get($data, 'env_variable')])); + throw new DisplayException(trans('exceptions.variables.env_not_unique', ['name' => array_get($data, 'env_variable')])); } } @@ -59,7 +67,7 @@ public function handle(EggVariable $variable, array $data): mixed $options = array_get($data, 'options') ?? []; - return $variable->update([ + $variable->update([ 'name' => $data['name'] ?? '', 'description' => $data['description'] ?? '', 'env_variable' => $data['env_variable'] ?? '', @@ -68,5 +76,7 @@ public function handle(EggVariable $variable, array $data): mixed 'user_editable' => in_array('user_editable', $options), 'rules' => $data['rules'] ?? [], ]); + + return $variable; } } diff --git a/app/Services/Exceptions/FilamentExceptionHandler.php b/app/Services/Exceptions/FilamentExceptionHandler.php deleted file mode 100644 index 328e944b05..0000000000 --- a/app/Services/Exceptions/FilamentExceptionHandler.php +++ /dev/null @@ -1,24 +0,0 @@ -title($exception->title ?? null) - ->body($exception->body ?? $exception->getMessage()) - ->color($exception->color ?? 'danger') - ->icon($exception->icon ?? 'tabler-x') - ->danger() - ->send(); - - if ($this->stopPropagation ?? true) { - $stopPropagation(); - } - } -} diff --git a/app/Services/Files/DeleteFilesService.php b/app/Services/Files/DeleteFilesService.php index 2b1be5fda1..8e4ea457e8 100644 --- a/app/Services/Files/DeleteFilesService.php +++ b/app/Services/Files/DeleteFilesService.php @@ -2,24 +2,23 @@ namespace App\Services\Files; -use App\Exceptions\Http\Connection\DaemonConnectionException; use App\Models\Server; use App\Repositories\Daemon\DaemonFileRepository; +use Illuminate\Http\Client\ConnectionException; use Illuminate\Support\Str; -class DeleteFilesService +readonly class DeleteFilesService { - /** - * DeleteFilesService constructor. - */ public function __construct( private DaemonFileRepository $daemonFileRepository - ) { - } + ) {} /** * Deletes the given files. - * @throws DaemonConnectionException + * + * @param string[] $files + * + * @throws ConnectionException */ public function handle(Server $server, array $files): void { diff --git a/app/Services/Helpers/AssetHashService.php b/app/Services/Helpers/AssetHashService.php deleted file mode 100644 index f94c32f3ba..0000000000 --- a/app/Services/Helpers/AssetHashService.php +++ /dev/null @@ -1,117 +0,0 @@ -filesystem = $filesystem->createLocalDriver(['root' => public_path()]); - } - - /** - * Modify a URL to append the asset hash. - */ - public function url(string $resource): string - { - $file = last(explode('/', $resource)); - $data = Arr::get($this->manifest(), $file) ?? $file; - - return str_replace($file, Arr::get($data, 'src') ?? $file, $resource); - } - - /** - * Return the data integrity hash for a resource. - */ - public function integrity(string $resource): string - { - $file = last(explode('/', $resource)); - $data = array_get($this->manifest(), $file, $file); - - return Arr::get($data, 'integrity') ?? ''; - } - - /** - * Return a built CSS import using the provided URL. - */ - public function css(string $resource): string - { - $attributes = [ - 'href' => $this->url($resource), - 'rel' => 'stylesheet preload', - 'as' => 'style', - 'crossorigin' => 'anonymous', - 'referrerpolicy' => 'no-referrer', - ]; - - if (config('panel.assets.use_hash')) { - $attributes['integrity'] = $this->integrity($resource); - } - - $output = ' $value) { - $output .= " $key=\"$value\""; - } - - return $output . '>'; - } - - /** - * Return a built JS import using the provided URL. - */ - public function js(string $resource): string - { - $attributes = [ - 'src' => $this->url($resource), - 'crossorigin' => 'anonymous', - ]; - - if (config('panel.assets.use_hash')) { - $attributes['integrity'] = $this->integrity($resource); - } - - $output = ' $value) { - $output .= " $key=\"$value\""; - } - - return $output . '>'; - } - - /** - * Get the asset manifest and store it in the cache for quicker lookups. - */ - protected function manifest(): array - { - if (static::$manifest === null) { - self::$manifest = json_decode( - $this->filesystem->get(self::MANIFEST_PATH), - true - ); - } - - $manifest = static::$manifest; - if ($manifest === null) { - throw new ManifestDoesNotExistException(); - } - - return $manifest; - } -} diff --git a/app/Services/Helpers/LanguageService.php b/app/Services/Helpers/LanguageService.php new file mode 100644 index 0000000000..aa8b87c9fb --- /dev/null +++ b/app/Services/Helpers/LanguageService.php @@ -0,0 +1,44 @@ + + */ + public function getAvailableLanguages(string $path = 'lang'): array + { + $baseLanguages = collect(File::directories(base_path($path)))->mapWithKeys(function ($path) { + $code = basename($path); + + return [$code => $this->getLanguageDisplayName($code)]; + })->toArray(); + + $pluginLanguages = collect($this->pluginService->getPluginLanguages())->mapWithKeys(fn ($code) => [$code => $this->getLanguageDisplayName($code)])->toArray(); + + return array_sort(array_unique(array_merge($baseLanguages, $pluginLanguages))); + } +} diff --git a/app/Services/Helpers/PluginService.php b/app/Services/Helpers/PluginService.php new file mode 100644 index 0000000000..26ead4f6c1 --- /dev/null +++ b/app/Services/Helpers/PluginService.php @@ -0,0 +1,518 @@ +app->runningUnitTests()) { + return; + } + + /** @var ClassLoader $classLoader */ + $classLoader = File::getRequire(base_path('vendor/autoload.php')); + + $plugins = Plugin::orderBy('load_order')->get(); + foreach ($plugins as $plugin) { + try { + // Filter out plugins that are not compatible with the current panel version + if (!$plugin->isCompatible()) { + $this->setStatus($plugin, PluginStatus::Incompatible, 'This Plugin is only compatible with Panel version ' . $plugin->panel_version . (!$plugin->isPanelVersionStrict() ? ' or newer' : '') . ' but you are using version ' . config('app.version') . '!'); + + continue; + } else { + // Make sure to update the status if a plugin is no longer incompatible (e.g. because the user changed their panel version) + if ($plugin->status === PluginStatus::Incompatible) { + $this->disablePlugin($plugin); + } + } + + if ($plugin->namespace === 'Error') { + continue; + } + + // Always autoload src directory to make sure all class names can be resolved (e.g. in migrations) + $namespace = $plugin->namespace . '\\'; + if (!array_key_exists($namespace, $classLoader->getPrefixesPsr4())) { + $classLoader->setPsr4($namespace, plugin_path($plugin->id, 'src/')); + + $classLoader->addPsr4('Database\Factories\\', plugin_path($plugin->id, 'database/Factories/')); + $classLoader->addPsr4('Database\Seeders\\', plugin_path($plugin->id, 'database/Seeders/')); + } + + // Load config + $config = plugin_path($plugin->id, 'config', $plugin->id . '.php'); + if (file_exists($config)) { + config()->set($plugin->id, require $config); + } + + // Filter out plugins that should not be loaded (e.g. because they are disabled or not installed yet) + if (!$plugin->shouldLoad()) { + continue; + } + + // Load translations + $translations = plugin_path($plugin->id, 'lang'); + if (file_exists($translations)) { + $this->app->afterResolving('translator', function ($translator) use ($plugin, $translations) { + if ($plugin->isLanguage()) { + $translator->addPath($translations); + } else { + $translator->addNamespace($plugin->id, $translations); + } + }); + } + + // Register service providers + foreach ($plugin->getProviders() as $provider) { + if (!class_exists($provider) || !is_subclass_of($provider, ServiceProvider::class)) { + continue; + } + + $this->app->register($provider); + } + + // Resolve artisan commands + foreach ($plugin->getCommands() as $command) { + if (!class_exists($command) || !is_subclass_of($command, Command::class)) { + continue; + } + + ConsoleApplication::starting(function ($artisan) use ($command) { + $artisan->resolve($command); + }); + } + + // Load migrations + $migrations = plugin_path($plugin->id, 'database', 'migrations'); + if (file_exists($migrations)) { + $this->app->afterResolving('migrator', function ($migrator) use ($migrations) { + $migrator->path($migrations); + }); + } + + // Load views + $views = plugin_path($plugin->id, 'resources', 'views'); + if (file_exists($views)) { + $this->app->afterResolving('view', function ($view) use ($plugin, $views) { + $view->addNamespace($plugin->id, $views); + }); + } + } catch (Exception $exception) { + $this->handlePluginException($plugin, $exception); + } + } + } + + public function loadPanelPlugins(Panel $panel): void + { + // Don't load any plugins during tests + if ($this->app->runningUnitTests()) { + return; + } + + $plugins = Plugin::orderBy('load_order')->get(); + foreach ($plugins as $plugin) { + try { + if (!$plugin->shouldLoad($panel->getId())) { + continue; + } + + $pluginClass = $plugin->fullClass(); + + if (!class_exists($pluginClass)) { + throw new Exception('Class "' . $pluginClass . '" not found'); + } + + $panel->plugin(new $pluginClass()); + + if ($plugin->status === PluginStatus::Errored) { + $this->enablePlugin($plugin); + } + } catch (Exception $exception) { + $this->handlePluginException($plugin, $exception); + } + } + } + + /** + * @param null|array $newPackages + * @param null|array $oldPackages + * + * @throws Exception + */ + public function manageComposerPackages(?array $newPackages = [], ?array $oldPackages = null): void + { + $newPackages ??= []; + + $plugins = Plugin::orderBy('load_order')->get(); + foreach ($plugins as $plugin) { + if (!$plugin->composer_packages) { + continue; + } + + if (!$plugin->shouldLoad()) { + continue; + } + + try { + $pluginPackages = json_decode($plugin->composer_packages, true, 512, JSON_THROW_ON_ERROR); + + $newPackages = array_merge($newPackages, $pluginPackages); + } catch (Exception $exception) { + report($exception); + } + } + + $oldPackages = collect($oldPackages) + ->filter(fn ($version, $package) => !array_key_exists($package, $newPackages)) + ->keys() + ->unique() + ->toArray(); + + if (count($oldPackages) > 0) { + $result = Process::path(base_path())->timeout(600)->run(['composer', 'remove', ...$oldPackages]); + if ($result->failed()) { + throw new Exception('Could not remove old composer packages: ' . $result->errorOutput()); + } + } + + $newPackages = collect($newPackages) + ->map(fn ($version, $package) => "$package:$version") + ->flatten() + ->unique() + ->toArray(); + + if (count($newPackages) > 0) { + $result = Process::path(base_path())->timeout(600)->run(['composer', 'require', ...$newPackages]); + if ($result->failed()) { + throw new Exception('Could not require new composer packages: ' . $result->errorOutput()); + } + } + } + + /** @throws Exception */ + public function runPluginMigrations(Plugin $plugin): void + { + $migrations = plugin_path($plugin->id, 'database', 'migrations'); + if (file_exists($migrations)) { + try { + $migrator = $this->app->make(Migrator::class); + $migrator->run($migrations); + } catch (Exception $exception) { + throw new Exception("Could not run migrations': " . $exception->getMessage()); + } + } + } + + /** @throws Exception */ + public function rollbackPluginMigrations(Plugin $plugin): void + { + $migrations = plugin_path($plugin->id, 'database', 'migrations'); + if (file_exists($migrations)) { + try { + $migrator = $this->app->make(Migrator::class); + $migrator->reset($migrations); + } catch (Exception $exception) { + throw new Exception("Could not rollback migrations': " . $exception->getMessage()); + } + } + } + + /** @throws Exception */ + public function runPluginSeeder(Plugin $plugin): void + { + $seeder = $plugin->getSeeder(); + if ($seeder) { + try { + $seederObject = $this->app->make($seeder)->setContainer($this->app); + + Model::unguarded(fn () => $seederObject->__invoke()); + } catch (Exception $exception) { + throw new Exception('Could not run seeder: ' . $exception->getMessage()); + } + } + } + + public function buildAssets(bool $throw = false): bool + { + try { + $result = Process::path(base_path())->timeout(300)->run('yarn install'); + if ($result->failed()) { + throw new Exception('Could not install yarn dependencies: ' . $result->errorOutput()); + } + + $result = Process::path(base_path())->timeout(600)->run('yarn build'); + if ($result->failed()) { + throw new Exception('Could not build assets: ' . $result->errorOutput()); + } + + return true; + } catch (Exception $exception) { + if ($throw || $this->isDevModeActive()) { + throw ($exception); + } + + Log::warning($exception->getMessage(), ['exception' => $exception]); + } + + return false; + } + + /** @throws Exception */ + public function installPlugin(Plugin $plugin, bool $enable = true): void + { + try { + $this->manageComposerPackages(json_decode($plugin->composer_packages, true, 512)); + + $this->buildAssets($plugin->isTheme()); + + $this->runPluginMigrations($plugin); + + $this->runPluginSeeder($plugin); + + if ($enable) { + $this->enablePlugin($plugin); + } else { + if ($plugin->status === PluginStatus::NotInstalled) { + $this->disablePlugin($plugin); + } + } + + foreach (Filament::getPanels() as $panel) { + $panel->clearCachedComponents(); + } + } catch (Exception $exception) { + $this->setStatus($plugin, PluginStatus::NotInstalled, $exception->getMessage()); + + throw $exception; + } + } + + /** @throws Exception */ + public function updatePlugin(Plugin $plugin): void + { + $downloadUrl = $plugin->getDownloadUrlForUpdate(); + if (!$downloadUrl) { + throw new Exception('No download url found.'); + } + + $this->downloadPluginFromUrl($downloadUrl, true); + + $this->installPlugin($plugin, false); + + cache()->forget("plugins.$plugin->id.update"); + } + + /** @throws Exception */ + public function uninstallPlugin(Plugin $plugin, bool $deleteFiles = false): void + { + $pluginPackages = json_decode($plugin->composer_packages, true, 512); + + $this->rollbackPluginMigrations($plugin); + + $this->setStatus($plugin, PluginStatus::NotInstalled); + + if ($deleteFiles) { + $this->deletePlugin($plugin); + } + + $this->buildAssets(); + + $this->manageComposerPackages(oldPackages: $pluginPackages); + + // This throws an error when not called with qualifier + foreach (\Filament\Facades\Filament::getPanels() as $panel) { + $panel->clearCachedComponents(); + } + } + + /** @throws Exception */ + public function downloadPluginFromFile(UploadedFile $file, bool $cleanDownload = false): void + { + // Validate file size to prevent zip bombs + $maxSize = config('panel.plugin.max_import_size'); + if ($file->getSize() > $maxSize) { + throw new Exception("Zip file too large. ($maxSize MiB)"); + } + + $zip = new ZipArchive(); + + if (!$zip->open($file->getPathname())) { + throw new Exception('Could not open zip file.'); + } + + // Validate zip contents before extraction + for ($i = 0; $i < $zip->numFiles; $i++) { + $filename = $zip->getNameIndex($i); + if (Str::contains($filename, '..') || Str::startsWith($filename, '/')) { + $zip->close(); + throw new Exception('Zip file contains invalid path traversal sequences.'); + } + } + + $pluginName = str($file->getClientOriginalName())->before('.zip')->toString(); + + if ($cleanDownload) { + File::deleteDirectory(plugin_path($pluginName)); + } + + $extractPath = $zip->locateName($pluginName . '/plugin.json') !== false ? base_path('plugins') : plugin_path($pluginName); + + if (!$zip->extractTo($extractPath)) { + $zip->close(); + throw new Exception('Could not extract zip file.'); + } + + $zip->close(); + } + + /** @throws Exception */ + public function downloadPluginFromUrl(string $url, bool $cleanDownload = false): void + { + $info = pathinfo($url); + $tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed(); + $tmpPath = $tmpDir->path($info['basename']); + + $content = Http::timeout(60)->connectTimeout(5)->throw()->get($url)->body(); + + // Validate file size to prevent zip bombs + $maxSize = config('panel.plugin.max_import_size'); + if (strlen($content) > $maxSize) { + throw new InvalidFileUploadException("Zip file too large. ($maxSize MiB)"); + } + + if (!file_put_contents($tmpPath, $content)) { + throw new InvalidFileUploadException('Could not write temporary file.'); + } + + $this->downloadPluginFromFile(new UploadedFile($tmpPath, $info['basename'], 'application/zip'), $cleanDownload); + } + + public function deletePlugin(Plugin $plugin): void + { + File::deleteDirectory(plugin_path($plugin->id)); + } + + public function enablePlugin(string|Plugin $plugin): void + { + $this->setStatus($plugin, PluginStatus::Enabled); + } + + public function disablePlugin(string|Plugin $plugin): void + { + $this->setStatus($plugin, PluginStatus::Disabled); + } + + /** @param array $data */ + private function setMetaData(string|Plugin $plugin, array $data): void + { + $path = plugin_path($plugin->id, 'plugin.json'); + + if (File::exists($path)) { + $pluginData = File::json($path, JSON_THROW_ON_ERROR); + $metaData = array_merge($pluginData['meta'] ?? [], $data); + $pluginData['meta'] = $metaData; + + File::put($path, json_encode($pluginData, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + + $plugin->update($metaData); + } + } + + private function setStatus(string|Plugin $plugin, PluginStatus $status, ?string $message = null): void + { + $this->setMetaData($plugin, [ + 'status' => $status, + 'status_message' => $message, + ]); + } + + /** + * @param array $order + * + * @throws JsonException + */ + public function updateLoadOrder(array $order): void + { + foreach ($order as $i => $plugin) { + $plugin = Plugin::firstOrFail(str($plugin)->lower()->toString()); + + $this->setMetaData($plugin, [ + 'load_order' => $i, + ]); + } + } + + public function hasThemePluginEnabled(): bool + { + $plugins = Plugin::orderBy('load_order')->get(); + foreach ($plugins as $plugin) { + if ($plugin->isTheme() && $plugin->status === PluginStatus::Enabled) { + return true; + } + } + + return false; + } + + /** @return string[] */ + public function getPluginLanguages(): array + { + $languages = []; + + $plugins = Plugin::orderBy('load_order')->get(); + foreach ($plugins as $plugin) { + if ($plugin->status !== PluginStatus::Enabled || !$plugin->isLanguage()) { + continue; + } + + $languages = array_merge($languages, collect(File::directories(plugin_path($plugin->id, 'lang')))->map(fn ($path) => basename($path))->toArray()); + } + + return array_unique($languages); + } + + public function isDevModeActive(): bool + { + return config('panel.plugin.dev_mode', false); + } + + private function handlePluginException(Plugin $plugin, Exception $exception): void + { + if ($this->isDevModeActive()) { + throw ($exception); + } + + report($exception); + + $this->setStatus($plugin, PluginStatus::Errored, $exception->getMessage()); + } +} diff --git a/app/Services/Helpers/SoftwareVersionService.php b/app/Services/Helpers/SoftwareVersionService.php index 7d50203bf1..4db9a25d81 100644 --- a/app/Services/Helpers/SoftwareVersionService.php +++ b/app/Services/Helpers/SoftwareVersionService.php @@ -2,146 +2,99 @@ namespace App\Services\Helpers; -use GuzzleHttp\Client; -use Carbon\CarbonImmutable; -use GuzzleHttp\Exception\GuzzleException; -use Illuminate\Support\Arr; -use Illuminate\Contracts\Cache\Repository as CacheRepository; +use Exception; +use Illuminate\Support\Facades\Http; class SoftwareVersionService { - public const VERSION_CACHE_KEY = 'panel:versioning_data'; - - private static array $result; - - /** - * SoftwareVersionService constructor. - */ - public function __construct( - protected CacheRepository $cache, - protected Client $client - ) { - self::$result = $this->cacheVersionData(); - } - - /** - * Get the latest version of the panel from the CDN servers. - */ - public function getPanel(): string + public function latestPanelVersionChangelog(): string { - return Arr::get(self::$result, 'panel') ?? 'error'; - } + $key = 'panel:latest_version_changelog'; + if (cache()->get($key) === 'error') { + cache()->forget($key); + } - /** - * Get the latest version of the daemon from the CDN servers. - */ - public function getDaemon(): string - { - return Arr::get(self::$result, 'daemon') ?? 'error'; + return cache()->remember($key, now()->addMinutes(config('panel.cdn.cache_time', 60)), function () { + try { + $response = Http::timeout(5)->connectTimeout(1)->get('https://api.github.com/repos/pelican-dev/panel/releases/latest')->throw()->json(); + + return $response['body']; + } catch (Exception) { + return 'error'; + } + }); } - /** - * Get the URL to the discord server. - */ - public function getDiscord(): string + public function latestPanelVersion(): string { - return Arr::get(self::$result, 'discord') ?? 'https://pelican.dev/discord'; + $key = 'panel:latest_version'; + if (cache()->get($key) === 'error') { + cache()->forget($key); + } + + return cache()->remember($key, now()->addMinutes(config('panel.cdn.cache_time', 60)), function () { + try { + $response = Http::timeout(5)->connectTimeout(1)->get('https://api.github.com/repos/pelican-dev/panel/releases/latest')->throw()->json(); + + return trim($response['tag_name'], 'v'); + } catch (Exception) { + return 'error'; + } + }); } - /** - * Get the donation URL. - */ - public function getDonations(): string + public function latestWingsVersion(): string { - return Arr::get(self::$result, 'donate') ?? 'https://pelican.dev/donate'; + $key = 'wings:latest_version'; + if (cache()->get($key) === 'error') { + cache()->forget($key); + } + + return cache()->remember($key, now()->addMinutes(config('panel.cdn.cache_time', 60)), function () { + try { + $response = Http::timeout(5)->connectTimeout(1)->get('https://api.github.com/repos/pelican-dev/wings/releases/latest')->throw()->json(); + + return trim($response['tag_name'], 'v'); + } catch (Exception) { + return 'error'; + } + }); } - /** - * Determine if the current version of the panel is the latest. - */ public function isLatestPanel(): bool { if (config('app.version') === 'canary') { return true; } - return version_compare(config('app.version'), $this->getPanel()) >= 0; + return version_compare(config('app.version'), $this->latestPanelVersion()) >= 0; } - /** - * Determine if a passed daemon version string is the latest. - */ - public function isLatestDaemon(string $version): bool + public function isLatestWings(string $version): bool { if ($version === 'develop') { return true; } - return version_compare($version, $this->getDaemon()) >= 0; - } - - /** - * Keeps the versioning cache up-to-date with the latest results from the CDN. - */ - protected function cacheVersionData(): array - { - return $this->cache->remember(self::VERSION_CACHE_KEY, CarbonImmutable::now()->addMinutes(config('panel.cdn.cache_time', 60)), function () { - $versionData = []; - - try { - $response = $this->client->request('GET', 'https://api.github.com/repos/pelican-dev/panel/releases/latest', - [ - 'timeout' => config('panel.guzzle.timeout'), - 'connect_timeout' => config('panel.guzzle.connect_timeout'), - ] - ); - if ($response->getStatusCode() === 200) { - $panelData = json_decode($response->getBody(), true); - $versionData['panel'] = trim($panelData['tag_name'], 'v'); - } - - $response = $this->client->request('GET', 'https://api.github.com/repos/pelican-dev/wings/releases/latest', - [ - 'timeout' => config('panel.guzzle.timeout'), - 'connect_timeout' => config('panel.guzzle.connect_timeout'), - ] - ); - if ($response->getStatusCode() === 200) { - $wingsData = json_decode($response->getBody(), true); - $versionData['daemon'] = trim($wingsData['tag_name'], 'v'); - } - } catch (GuzzleException $e) { - } - - $versionData['discord'] = 'https://pelican.dev/discord'; - $versionData['donate'] = 'https://pelican.dev/donate'; - - return $versionData; - }); + return version_compare($version, $this->latestWingsVersion()) >= 0; } - public function versionData(): array + public function currentPanelVersion(): string { - return cache()->remember('git-version', 5, function () { + return cache()->remember('panel:current_version', now()->addMinutes(5), function () { if (file_exists(base_path('.git/HEAD'))) { $head = explode(' ', file_get_contents(base_path('.git/HEAD'))); if (array_key_exists(1, $head)) { $path = base_path('.git/' . trim($head[1])); - } - } - if (isset($path) && file_exists($path)) { - return [ - 'version' => 'canary (' . substr(file_get_contents($path), 0, 8) . ')', - 'is_git' => true, - ]; + if (file_exists($path)) { + return 'canary (' . substr(file_get_contents($path), 0, 7) . ')'; + } + } } - return [ - 'version' => config('app.version'), - 'is_git' => false, - ]; + return config('app.version'); }); } } diff --git a/app/Services/Nodes/NodeAutoDeployService.php b/app/Services/Nodes/NodeAutoDeployService.php new file mode 100644 index 0000000000..5c50ddd136 --- /dev/null +++ b/app/Services/Nodes/NodeAutoDeployService.php @@ -0,0 +1,60 @@ +where('key_type', ApiKey::TYPE_APPLICATION) + ->whereJsonContains('permissions->' . Node::RESOURCE_NAME, AdminAcl::READ) + ->first(); + + // We couldn't find a key that exists for this user with only permission for + // reading nodes. Go ahead and create it now. + if (!$key) { + $key = $this->keyCreationService->setKeyType(ApiKey::TYPE_APPLICATION)->handle([ + 'memo' => 'Automatically generated node deployment key.', + 'user_id' => $request->user()->id, + 'permissions' => [Node::RESOURCE_NAME => AdminAcl::READ], + ]); + } + + $token = $key->identifier . $key->token; + + if (!$token) { + return null; + } + + return sprintf( + '%s wings configure --panel-url %s --token %s --node %d%s', + $docker ? 'docker compose exec -it $(docker ps --filter "name=wings" --format "{{.Names}}")' : 'sudo', + config('app.url'), + $token, + $node->id, + $request->isSecure() ? '' : ' --allow-insecure' + ); + } +} diff --git a/app/Services/Nodes/NodeCreationService.php b/app/Services/Nodes/NodeCreationService.php deleted file mode 100644 index 1c10b328da..0000000000 --- a/app/Services/Nodes/NodeCreationService.php +++ /dev/null @@ -1,24 +0,0 @@ -toString(); - $data['daemon_token'] = Str::random(Node::DAEMON_TOKEN_LENGTH); - $data['daemon_token_id'] = Str::random(Node::DAEMON_TOKEN_ID_LENGTH); - - return Node::query()->create($data); - } -} diff --git a/app/Services/Nodes/NodeDeletionService.php b/app/Services/Nodes/NodeDeletionService.php index 5aee63c3bd..4224937b6b 100644 --- a/app/Services/Nodes/NodeDeletionService.php +++ b/app/Services/Nodes/NodeDeletionService.php @@ -2,20 +2,11 @@ namespace App\Services\Nodes; -use App\Models\Node; -use Illuminate\Contracts\Translation\Translator; use App\Exceptions\Service\HasActiveServersException; +use App\Models\Node; class NodeDeletionService { - /** - * NodeDeletionService constructor. - */ - public function __construct( - protected Translator $translator - ) { - } - /** * Delete a node from the panel if no servers are attached to it. * @@ -28,7 +19,7 @@ public function handle(int|Node $node): int } if ($node->servers()->count() > 0) { - throw new HasActiveServersException($this->translator->get('exceptions.node.servers_attached')); + throw new HasActiveServersException(trans('exceptions.node.servers_attached')); } return (int) $node->delete(); diff --git a/app/Services/Nodes/NodeJWTService.php b/app/Services/Nodes/NodeJWTService.php index 325fe04c08..0eaae4c582 100644 --- a/app/Services/Nodes/NodeJWTService.php +++ b/app/Services/Nodes/NodeJWTService.php @@ -2,28 +2,32 @@ namespace App\Services\Nodes; -use Carbon\CarbonImmutable; -use Illuminate\Support\Str; +use App\Extensions\Lcobucci\JWT\Encoding\TimestampDates; use App\Models\Node; use App\Models\User; -use Lcobucci\JWT\Token\Plain; +use Carbon\CarbonImmutable; +use DateTimeImmutable; +use Illuminate\Support\Str; use Lcobucci\JWT\Configuration; use Lcobucci\JWT\Signer\Hmac\Sha256; use Lcobucci\JWT\Signer\Key\InMemory; -use App\Extensions\Lcobucci\JWT\Encoding\TimestampDates; +use Lcobucci\JWT\UnencryptedToken; class NodeJWTService { + /** @var array */ private array $claims = []; private ?User $user = null; - private ?\DateTimeImmutable $expiresAt; + private DateTimeImmutable $expiresAt; private ?string $subject = null; /** * Set the claims to include in this JWT. + * + * @param array $claims */ public function setClaims(array $claims): self { @@ -43,7 +47,7 @@ public function setUser(User $user): self return $this; } - public function setExpiresAt(\DateTimeImmutable $date): self + public function setExpiresAt(DateTimeImmutable $date): self { $this->expiresAt = $date; @@ -60,7 +64,7 @@ public function setSubject(string $subject): self /** * Generate a new JWT for a given node. */ - public function handle(Node $node, ?string $identifiedBy, string $algo = 'md5'): Plain + public function handle(Node $node, ?string $identifiedBy, string $algo = 'sha256'): UnencryptedToken { $identifier = hash($algo, $identifiedBy); $config = Configuration::forSymmetricSigner(new Sha256(), InMemory::plainText($node->daemon_token)); @@ -73,12 +77,12 @@ public function handle(Node $node, ?string $identifiedBy, string $algo = 'md5'): ->issuedAt(CarbonImmutable::now()) ->canOnlyBeUsedAfter(CarbonImmutable::now()->subMinutes(5)); - if ($this->expiresAt) { - $builder = $builder->expiresAt($this->expiresAt); - } + $builder = $builder->expiresAt($this->expiresAt); if (!empty($this->subject)) { - $builder = $builder->relatedTo($this->subject)->withHeader('sub', $this->subject); + $builder = $builder + ->relatedTo($this->subject) + ->withHeader('sub', $this->subject); } foreach ($this->claims as $key => $value) { @@ -86,14 +90,7 @@ public function handle(Node $node, ?string $identifiedBy, string $algo = 'md5'): } if (!is_null($this->user)) { - $builder = $builder - ->withClaim('user_uuid', $this->user->uuid) - // The "user_id" claim is deprecated and should not be referenced — it remains - // here solely to ensure older versions of daemon are unaffected when the Panel - // is updated. - // - // This claim will be removed in Panel@1.11 or later. - ->withClaim('user_id', $this->user->id); + $builder = $builder->withClaim('user_uuid', $this->user->uuid); } return $builder diff --git a/app/Services/Nodes/NodeUpdateService.php b/app/Services/Nodes/NodeUpdateService.php index 8377261af9..6ef132a46f 100644 --- a/app/Services/Nodes/NodeUpdateService.php +++ b/app/Services/Nodes/NodeUpdateService.php @@ -2,12 +2,13 @@ namespace App\Services\Nodes; -use Illuminate\Support\Str; +use App\Exceptions\Service\Node\ConfigurationNotPersistedException; use App\Models\Node; +use App\Repositories\Daemon\DaemonSystemRepository; use Illuminate\Database\ConnectionInterface; -use App\Repositories\Daemon\DaemonConfigurationRepository; -use App\Exceptions\Http\Connection\DaemonConnectionException; -use App\Exceptions\Service\Node\ConfigurationNotPersistedException; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Support\Str; +use Throwable; class NodeUpdateService { @@ -16,14 +17,15 @@ class NodeUpdateService */ public function __construct( private ConnectionInterface $connection, - private DaemonConfigurationRepository $configurationRepository, - ) { - } + private DaemonSystemRepository $configurationRepository, + ) {} /** * Update the configuration values for a given node on the machine. * - * @throws \Throwable + * @param array $data + * + * @throws Throwable */ public function handle(Node $node, array $data, bool $resetToken = false): Node { @@ -35,7 +37,7 @@ public function handle(Node $node, array $data, bool $resetToken = false): Node } [$updated, $exception] = $this->connection->transaction(function () use ($data, $node) { - /** @var \App\Models\Node $updated */ + /** @var Node $updated */ $updated = $node->replicate(); $updated->exists = true; $updated->forceFill($data)->save(); @@ -43,7 +45,7 @@ public function handle(Node $node, array $data, bool $resetToken = false): Node $node->fqdn = $updated->fqdn; $this->configurationRepository->setNode($node)->update($updated); - } catch (DaemonConnectionException $exception) { + } catch (ConnectionException $exception) { logger()->warning($exception, ['node_id' => $node->id]); // Never actually throw these exceptions up the stack. If we were able to change the settings diff --git a/app/Services/Schedules/ProcessScheduleService.php b/app/Services/Schedules/ProcessScheduleService.php index 5908fed2d7..12eb8267b3 100644 --- a/app/Services/Schedules/ProcessScheduleService.php +++ b/app/Services/Schedules/ProcessScheduleService.php @@ -2,32 +2,26 @@ namespace App\Services\Schedules; -use Exception; +use App\Enums\ContainerStatus; +use App\Exceptions\DisplayException; +use App\Jobs\Schedule\RunTaskJob; use App\Models\Schedule; +use App\Models\Task; +use App\Repositories\Daemon\DaemonServerRepository; +use Exception; use Illuminate\Contracts\Bus\Dispatcher; -use App\Jobs\Schedule\RunTaskJob; use Illuminate\Database\ConnectionInterface; -use App\Exceptions\DisplayException; -use App\Repositories\Daemon\DaemonServerRepository; -use App\Exceptions\Http\Connection\DaemonConnectionException; class ProcessScheduleService { - /** - * ProcessScheduleService constructor. - */ - public function __construct(private ConnectionInterface $connection, private Dispatcher $dispatcher, private DaemonServerRepository $serverRepository) - { - } + public function __construct(private ConnectionInterface $connection, private Dispatcher $dispatcher, private DaemonServerRepository $serverRepository) {} /** * Process a schedule and push the first task onto the queue worker. - * - * @throws \Throwable */ public function handle(Schedule $schedule, bool $now = false): void { - $task = $schedule->tasks()->orderBy('sequence_id')->first(); + $task = $schedule->firstTask(); if (!$task) { throw new DisplayException('Cannot process schedule for task execution: no tasks are registered.'); @@ -47,21 +41,15 @@ public function handle(Schedule $schedule, bool $now = false): void // Check that the server is currently in a starting or running state before executing // this schedule if this option has been set. try { - $details = $this->serverRepository->setServer($schedule->server)->getDetails(); - $state = $details['state'] ?? 'offline'; + $state = ContainerStatus::tryFrom(fluent($this->serverRepository->setServer($schedule->server)->getDetails())->get('state')) ?? ContainerStatus::Offline; + // If the server is stopping or offline just do nothing with this task. - if (in_array($state, ['offline', 'stopping'])) { + if ($state->isOffline()) { $job->failed(); return; } - } catch (\Exception $exception) { - if (!$exception instanceof DaemonConnectionException) { - // If we encountered some exception during this process that wasn't just an - // issue connecting to daemon run the failed sequence for a job. Otherwise we - // can just quietly mark the task as completed without actually running anything. - $job->failed($exception); - } + } catch (Exception) { $job->failed(); return; @@ -75,8 +63,8 @@ public function handle(Schedule $schedule, bool $now = false): void // so we need to manually trigger it and then continue with the exception throw. try { $this->dispatcher->dispatchNow($job); - } catch (\Exception $exception) { - $job->failed($exception); + } catch (Exception $exception) { + $job->failed(); throw $exception; } diff --git a/app/Services/Schedules/Sharing/ScheduleExporterService.php b/app/Services/Schedules/Sharing/ScheduleExporterService.php new file mode 100644 index 0000000000..7d6608b2b9 --- /dev/null +++ b/app/Services/Schedules/Sharing/ScheduleExporterService.php @@ -0,0 +1,39 @@ + $schedule->name, + 'is_active' => $schedule->is_active, + 'only_when_online' => $schedule->only_when_online, + 'cron_minute' => $schedule->cron_minute, + 'cron_hour' => $schedule->cron_hour, + 'cron_day_of_month' => $schedule->cron_day_of_month, + 'cron_month' => $schedule->cron_month, + 'cron_day_of_week' => $schedule->cron_day_of_week, + + 'tasks' => $schedule->tasks->map(function (Task $task) { + return [ + 'sequence_id' => $task->sequence_id, + 'action' => $task->action, + 'payload' => $task->payload, + 'time_offset' => $task->time_offset, + 'continue_on_failure' => $task->continue_on_failure, + ]; + }), + ]; + + return json_encode($data, JSON_PRETTY_PRINT); + } +} diff --git a/app/Services/Schedules/Sharing/ScheduleImporterService.php b/app/Services/Schedules/Sharing/ScheduleImporterService.php new file mode 100644 index 0000000000..4cbe63789b --- /dev/null +++ b/app/Services/Schedules/Sharing/ScheduleImporterService.php @@ -0,0 +1,82 @@ +getError() !== UPLOAD_ERR_OK) { + throw new InvalidFileUploadException('The selected file was not uploaded successfully'); + } + + try { + $parsed = json_decode($file->getContent(), true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $exception) { + throw new InvalidFileUploadException('Could not read JSON file: ' . $exception->getMessage()); + } + + return $this->connection->transaction(function () use ($server, $parsed) { + $minute = Arr::get($parsed, 'cron_minute', '0'); + $hour = Arr::get($parsed, 'cron_hour', '0'); + $dayOfMonth = Arr::get($parsed, 'cron_day_of_month', '*'); + $month = Arr::get($parsed, 'cron_month', '*'); + $dayOfWeek = Arr::get($parsed, 'cron_day_of_week', '*'); + + $schedule = Schedule::create([ + 'server_id' => $server->id, + 'name' => Arr::get($parsed, 'name'), + 'is_active' => Arr::get($parsed, 'is_active'), + 'only_when_online' => Arr::get($parsed, 'only_when_online'), + 'cron_minute' => $minute, + 'cron_hour' => $hour, + 'cron_day_of_month' => $dayOfMonth, + 'cron_month' => $month, + 'cron_day_of_week' => $dayOfWeek, + 'next_run_at' => Utilities::getScheduleNextRunDate($minute, $hour, $dayOfMonth, $month, $dayOfWeek), + ]); + + foreach (Arr::get($parsed, 'tasks', []) as $task) { + Task::create([ + 'schedule_id' => $schedule->id, + 'sequence_id' => Arr::get($task, 'sequence_id'), + 'action' => Arr::get($task, 'action'), + 'payload' => Arr::get($task, 'payload'), + 'time_offset' => Arr::get($task, 'time_offset'), + 'continue_on_failure' => Arr::get($task, 'continue_on_failure'), + ]); + } + + return $schedule; + }); + } + + public function fromUrl(string $url, Server $server): Schedule + { + $info = pathinfo($url); + $tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed(); + $tmpPath = $tmpDir->path($info['basename']); + + $fileContents = Http::timeout(5)->connectTimeout(1)->get($url)->throw()->body(); + + if (!$fileContents || !file_put_contents($tmpPath, $fileContents)) { + throw new InvalidFileUploadException('Could not write temporary file.'); + } + + return $this->fromFile(new UploadedFile($tmpPath, $info['basename'], 'application/json'), $server); + } +} diff --git a/app/Services/Servers/BuildModificationService.php b/app/Services/Servers/BuildModificationService.php index f7c7403249..5feb435d53 100644 --- a/app/Services/Servers/BuildModificationService.php +++ b/app/Services/Servers/BuildModificationService.php @@ -2,13 +2,14 @@ namespace App\Services\Servers; -use Illuminate\Support\Arr; -use App\Models\Server; -use App\Models\Allocation; -use Illuminate\Database\ConnectionInterface; use App\Exceptions\DisplayException; +use App\Models\Allocation; +use App\Models\Server; use App\Repositories\Daemon\DaemonServerRepository; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Support\Arr; +use Throwable; class BuildModificationService { @@ -19,18 +20,19 @@ public function __construct( private ConnectionInterface $connection, private DaemonServerRepository $daemonServerRepository, private ServerConfigurationStructureService $structureService - ) { - } + ) {} /** * Change the build details for a specified server. * - * @throws \Throwable - * @throws \App\Exceptions\DisplayException + * @param array $data + * + * @throws Throwable + * @throws DisplayException */ public function handle(Server $server, array $data): Server { - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $this->connection->transaction(function () use ($server, $data) { $this->processAllocations($server, $data); @@ -65,7 +67,7 @@ public function handle(Server $server, array $data): Server if (!empty($updateData['build'])) { try { $this->daemonServerRepository->setServer($server)->sync(); - } catch (DaemonConnectionException $exception) { + } catch (ConnectionException $exception) { logger()->warning($exception, ['server_id' => $server->id]); } } @@ -76,7 +78,15 @@ public function handle(Server $server, array $data): Server /** * Process the allocations being assigned in the data and ensure they are available for a server. * - * @throws \App\Exceptions\DisplayException + * @param array{ + * add_allocations?: array, + * remove_allocations?: array, + * allocation_id: ?int, + * oom_killer?: bool, + * oom_disabled?: bool, + * } $data + * + * @throws DisplayException */ private function processAllocations(Server $server, array &$data): void { @@ -92,35 +102,26 @@ private function processAllocations(Server $server, array &$data): void ->whereIn('id', $data['add_allocations']) ->whereNull('server_id'); - // Keep track of all the allocations we're just now adding so that we can use the first - // one to reset the default allocation to. - $freshlyAllocated = $query->first()?->id; - - $query->update(['server_id' => $server->id, 'notes' => null]); + $query->update(['server_id' => $server->id]); } if (!empty($data['remove_allocations'])) { - foreach ($data['remove_allocations'] as $allocation) { - // If we are attempting to remove the default allocation for the server, see if we can reassign - // to the first provided value in add_allocations. If there is no new first allocation then we - // will throw an exception back. - if ($allocation === ($data['allocation_id'] ?? $server->allocation_id)) { - if (empty($freshlyAllocated)) { - throw new DisplayException('You are attempting to delete the default allocation for this server but there is no fallback allocation to use.'); - } - - // Update the default allocation to be the first allocation that we are creating. - $data['allocation_id'] = $freshlyAllocated; - } + $allocations = Allocation::query() + ->where('server_id', $server->id) + // Only use the allocations that we didn't also attempt to add to the server... + ->whereIn('id', array_diff($data['remove_allocations'], $data['add_allocations'] ?? [])); + + // If we are attempting to remove the default allocation for the server, see if we can reassign + // to the first provided value in add_allocations. + if ((clone $allocations)->where('id', $server->allocation_id)->exists()) { + $nonPrimaryAllocations = $server->allocations->whereNotIn('id', $data['remove_allocations']); + $data['allocation_id'] = $nonPrimaryAllocations->first()->id ?? ($data['add_allocations'][0] ?? null); } // Remove any of the allocations we got that are currently assigned to this server on // this node. Also set the notes to null, otherwise when re-allocated to a new server those // notes will be carried over. - Allocation::query()->where('node_id', $server->node_id) - ->where('server_id', $server->id) - // Only remove the allocations that we didn't also attempt to add to the server... - ->whereIn('id', array_diff($data['remove_allocations'], $data['add_allocations'] ?? [])) + $allocations ->update([ 'notes' => null, 'server_id' => null, diff --git a/app/Services/Servers/DetailsModificationService.php b/app/Services/Servers/DetailsModificationService.php index 1b32c2ac5a..e8c40e3c56 100644 --- a/app/Services/Servers/DetailsModificationService.php +++ b/app/Services/Servers/DetailsModificationService.php @@ -2,12 +2,13 @@ namespace App\Services\Servers; -use Illuminate\Support\Arr; use App\Models\Server; -use Illuminate\Database\ConnectionInterface; -use App\Traits\Services\ReturnsUpdatedModels; use App\Repositories\Daemon\DaemonServerRepository; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use App\Traits\Services\ReturnsUpdatedModels; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Support\Arr; +use Throwable; class DetailsModificationService { @@ -16,14 +17,19 @@ class DetailsModificationService /** * DetailsModificationService constructor. */ - public function __construct(private ConnectionInterface $connection, private DaemonServerRepository $serverRepository) - { - } + public function __construct(private ConnectionInterface $connection, private DaemonServerRepository $serverRepository) {} /** * Update the details for a single server instance. * - * @throws \Throwable + * @param array{ + * external_id: int, + * owner_id: int, + * name: string, + * description?: ?string + * } $data + * + * @throws Throwable */ public function handle(Server $server, array $data): Server { @@ -42,8 +48,8 @@ public function handle(Server $server, array $data): Server // websockets. if ($server->owner_id !== $owner) { try { - $this->serverRepository->setServer($server)->revokeUserJTI($owner); - } catch (DaemonConnectionException $exception) { + $this->serverRepository->setServer($server)->deauthorize($server->user->uuid); + } catch (ConnectionException) { // Do nothing. A failure here is not ideal, but it is likely to be caused by daemon // being offline, or in an entirely broken state. Remember, these tokens reset every // few minutes by default, we're just trying to help it along a little quicker. diff --git a/app/Services/Servers/EnvironmentService.php b/app/Services/Servers/EnvironmentService.php index b960db3ed6..486133f854 100644 --- a/app/Services/Servers/EnvironmentService.php +++ b/app/Services/Servers/EnvironmentService.php @@ -2,16 +2,16 @@ namespace App\Services\Servers; -use App\Models\Server; use App\Models\EggVariable; +use App\Models\Server; class EnvironmentService { + /** @var array */ private array $additional = []; /** - * Dynamically configure additional environment variables to be assigned - * with a specific server. + * Dynamically configure additional environment variables to be assigned with a specific server. */ public function setEnvironmentKey(string $key, callable $closure): void { @@ -20,6 +20,8 @@ public function setEnvironmentKey(string $key, callable $closure): void /** * Return the dynamically added additional keys. + * + * @return array */ public function getEnvironmentKeys(): array { @@ -27,8 +29,10 @@ public function getEnvironmentKeys(): array } /** - * Take all of the environment variables configured for this server and return + * Take all the environment variables configured for this server and return * them in an easy to process format. + * + * @return array */ public function handle(Server $server): array { @@ -43,14 +47,6 @@ public function handle(Server $server): array $variables->put($key, object_get($server, $object)); } - // Process variables set in the configuration file. - foreach (config('panel.environment_variables', []) as $key => $object) { - $variables->put( - $key, - is_callable($object) ? call_user_func($object, $server) : object_get($server, $object) - ); - } - // Process dynamically included environment variables. foreach ($this->additional as $key => $closure) { $variables->put($key, call_user_func($closure, $server)); @@ -61,6 +57,8 @@ public function handle(Server $server): array /** * Return a mapping of Panel default environment variables. + * + * @return array */ private function getEnvironmentMappings(): array { diff --git a/app/Services/Servers/GetUserPermissionsService.php b/app/Services/Servers/GetUserPermissionsService.php index 882f8b7cc7..0c645e5c9a 100644 --- a/app/Services/Servers/GetUserPermissionsService.php +++ b/app/Services/Servers/GetUserPermissionsService.php @@ -2,33 +2,51 @@ namespace App\Services\Servers; -use App\Models\User; +use App\Enums\SubuserPermission; use App\Models\Server; +use App\Models\Subuser; +use App\Models\User; class GetUserPermissionsService { /** * Returns the server specific permissions that a user has. This checks - * if they are an admin or a subuser for the server. If no permissions are - * found, an empty array is returned. + * if they are an admin, the owner or a subuser for the server. If no + * permissions are found, an empty array is returned. + * + * @return string[] */ public function handle(Server $server, User $user): array { - if ($user->isRootAdmin() || $user->id === $server->owner_id) { - $permissions = ['*']; + $isOwner = $user->id === $server->owner_id; + $isAdmin = $user->isAdmin() && ($user->can('view', $server) || $user->can('update', $server)); + + if ($isOwner && !$isAdmin) { + return ['*']; + } - if ($user->isRootAdmin()) { - $permissions[] = 'admin.websocket.errors'; - $permissions[] = 'admin.websocket.install'; - $permissions[] = 'admin.websocket.transfer'; - } + $adminPermissions = [ + 'admin.websocket.errors', + 'admin.websocket.install', + 'admin.websocket.transfer', + ]; - return $permissions; + if ($isAdmin && ($isOwner || $user->can('update', $server))) { + return array_merge(['*'], $adminPermissions); } - /** @var \App\Models\Subuser|null $subuserPermissions */ - $subuserPermissions = $server->subusers()->where('user_id', $user->id)->first(); + /** @var Subuser|null $subuser */ + $subuser = $server->subusers()->where('user_id', $user->id)->first(); + $subuserPermissions = $subuser !== null ? $subuser->permissions : []; + + if ($isAdmin) { + return array_unique(array_merge( + [SubuserPermission::WebsocketConnect->value], + $adminPermissions, + $subuserPermissions, + )); + } - return $subuserPermissions ? $subuserPermissions->permissions : []; + return $subuserPermissions; } } diff --git a/app/Services/Servers/ReinstallServerService.php b/app/Services/Servers/ReinstallServerService.php index 301de97110..e111ab8f5e 100644 --- a/app/Services/Servers/ReinstallServerService.php +++ b/app/Services/Servers/ReinstallServerService.php @@ -4,8 +4,9 @@ use App\Enums\ServerState; use App\Models\Server; -use Illuminate\Database\ConnectionInterface; use App\Repositories\Daemon\DaemonServerRepository; +use Illuminate\Database\ConnectionInterface; +use Throwable; class ReinstallServerService { @@ -15,13 +16,12 @@ class ReinstallServerService public function __construct( private ConnectionInterface $connection, private DaemonServerRepository $daemonServerRepository - ) { - } + ) {} /** * Reinstall a server on the remote daemon. * - * @throws \Throwable + * @throws Throwable */ public function handle(Server $server): Server { diff --git a/app/Services/Servers/ServerConfigurationStructureService.php b/app/Services/Servers/ServerConfigurationStructureService.php index 43b8c97364..b95cfc720d 100644 --- a/app/Services/Servers/ServerConfigurationStructureService.php +++ b/app/Services/Servers/ServerConfigurationStructureService.php @@ -2,23 +2,22 @@ namespace App\Services\Servers; +use App\Extensions\Features\FeatureService; use App\Models\Mount; use App\Models\Server; class ServerConfigurationStructureService { - /** - * ServerConfigurationStructureService constructor. - */ - public function __construct(private EnvironmentService $environment) - { - } + public function __construct(private EnvironmentService $environment, private FeatureService $featureService) {} /** * Return a configuration array for a specific server when passed a server model. * * DO NOT MODIFY THIS FUNCTION. This powers legacy code handling for the new daemon * daemon, if you modify the structure eggs will break unexpectedly. + * + * @param array $override + * @return array */ public function handle(Server $server, array $override = []): array { @@ -37,10 +36,41 @@ public function handle(Server $server, array $override = []): array /** * Returns the data format used for the daemon. + * + * @return array{ + * id: int, + * uuid: string, + * meta: array{name: string, description: string}, + * suspended: bool, + * environment: array, + * invocation: string, + * skip_egg_scripts: bool, + * build: array{ + * memory_limit: int, + * swap: int, + * io_weight: int, + * cpu_limit: int, + * threads: ?string, + * disk_space: int, + * oom_killer: bool, + * }, + * container: array{image: string, requires_rebuild: false}, + * allocations: array{ + * force_outgoing_ip: bool, + * default: array{ip: string, port: int}, + * mappings: array>, + * }, + * egg: array{id: string, file_denylist: string[], features: string[][]}, + * labels?: string[], + * mounts: array{source: string, target: string, read_only: bool}, + * } + * + * @todo convert to API Resource */ protected function returnFormat(Server $server): array { $response = [ + 'id' => $server->id, 'uuid' => $server->uuid, 'meta' => [ 'name' => $server->name, @@ -66,14 +96,15 @@ protected function returnFormat(Server $server): array 'allocations' => [ 'force_outgoing_ip' => $server->egg->force_outgoing_ip, 'default' => [ - 'ip' => $server->allocation->ip, - 'port' => $server->allocation->port, + 'ip' => $server->allocation->ip ?? '127.0.0.1', + 'port' => $server->allocation->port ?? 0, ], 'mappings' => $server->getAllocationMappings(), ], 'egg' => [ 'id' => $server->egg->uuid, 'file_denylist' => $server->egg->inherit_file_denylist, + 'features' => $this->featureService->getMappings($server->egg->features), ], ]; @@ -93,5 +124,4 @@ protected function returnFormat(Server $server): array return $response; } - } diff --git a/app/Services/Servers/ServerCreationService.php b/app/Services/Servers/ServerCreationService.php index 7fd3e8b67a..f15f84f344 100644 --- a/app/Services/Servers/ServerCreationService.php +++ b/app/Services/Servers/ServerCreationService.php @@ -3,21 +3,26 @@ namespace App\Services\Servers; use App\Enums\ServerState; -use App\Models\ServerVariable; -use Ramsey\Uuid\Uuid; -use Illuminate\Support\Arr; -use App\Models\User; -use Webmozart\Assert\Assert; -use App\Models\Server; -use Illuminate\Support\Collection; +use App\Exceptions\DisplayException; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\Deployment\NoViableAllocationException; +use App\Exceptions\Service\Deployment\NoViableNodeException; use App\Models\Allocation; -use Illuminate\Database\ConnectionInterface; +use App\Models\Egg; use App\Models\Objects\DeploymentObject; +use App\Models\Server; +use App\Models\User; use App\Repositories\Daemon\DaemonServerRepository; -use App\Services\Deployment\FindViableNodesService; use App\Services\Deployment\AllocationSelectionService; -use App\Exceptions\Http\Connection\DaemonConnectionException; -use App\Models\Egg; +use App\Services\Deployment\FindViableNodesService; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Illuminate\Validation\ValidationException; +use Ramsey\Uuid\Uuid; +use Throwable; +use Webmozart\Assert\Assert; class ServerCreationService { @@ -31,8 +36,7 @@ public function __construct( private FindViableNodesService $findViableNodesService, private ServerDeletionService $serverDeletionService, private VariableValidatorService $validatorService - ) { - } + ) {} /** * Create a server on the Panel and trigger a request to the Daemon to begin the server @@ -40,12 +44,14 @@ public function __construct( * as possible given the input data. For example, if an allocation_id is passed with * no node_id the node_is will be picked from the allocation. * - * @throws \Throwable - * @throws \App\Exceptions\DisplayException - * @throws \Illuminate\Validation\ValidationException - * @throws \App\Exceptions\Service\Deployment\NoViableAllocationException + * @param array $data + * + * @throws Throwable + * @throws DisplayException + * @throws ValidationException + * @throws NoViableAllocationException */ - public function handle(array $data, DeploymentObject $deployment = null): Server + public function handle(array $data, ?DeploymentObject $deployment = null): Server { if (!isset($data['oom_killer']) && isset($data['oom_disabled'])) { $data['oom_killer'] = !$data['oom_disabled']; @@ -55,24 +61,41 @@ public function handle(array $data, DeploymentObject $deployment = null): Server $egg = Egg::query()->findOrFail($data['egg_id']); // Fill missing fields from egg - $data['image'] = $data['image'] ?? collect($egg->docker_images)->first(); - $data['startup'] = $data['startup'] ?? $egg->startup; - - // If a deployment object has been passed we need to get the allocation - // that the server should use, and assign the node from that allocation. - if ($deployment instanceof DeploymentObject) { - $allocation = $this->configureDeployment($data, $deployment); - $data['allocation_id'] = $allocation->id; - $data['node_id'] = $allocation->node_id; + $data['image'] ??= Arr::first($egg->docker_images); + $data['startup'] ??= Arr::first($egg->startup_commands); + + // If a deployment object has been passed we need to get the allocation and node that the server should use. + if ($deployment) { + $nodes = $this->findViableNodesService->handle( + Arr::get($data, 'memory', 0), + Arr::get($data, 'disk', 0), + Arr::get($data, 'cpu', 0), + $deployment->getTags(), + )->pluck('id'); + + if ($nodes->isEmpty()) { + throw new NoViableNodeException(trans('exceptions.deployment.no_viable_nodes')); + } + + $ports = $deployment->getPorts(); + if (!empty($ports)) { + $allocation = $this->allocationSelectionService->setDedicated($deployment->isDedicated()) + ->setNodes($nodes->toArray()) + ->setPorts($ports) + ->handle(); + + $data['allocation_id'] = $allocation->id; + $data['node_id'] = $allocation->node_id; + } + + if (empty($data['node_id'])) { + $data['node_id'] = $nodes->first(); + } + } else { + $data['node_id'] ??= Allocation::find($data['allocation_id'])?->node_id; } - // Auto-configure the node based on the selected allocation - // if no node was defined. - if (empty($data['node_id'])) { - Assert::false(empty($data['allocation_id']), 'Expected a non-empty allocation_id in server creation data.'); - - $data['node_id'] = Allocation::query()->findOrFail($data['allocation_id'])->node_id; - } + Assert::false(empty($data['node_id']), 'Expected a non-empty node_id in server creation data.'); $eggVariableData = $this->validatorService ->setUserLevel(User::USER_LEVEL_ADMIN) @@ -83,22 +106,25 @@ public function handle(array $data, DeploymentObject $deployment = null): Server // // If that connection fails out we will attempt to perform a cleanup by just // deleting the server itself from the system. - /** @var \App\Models\Server $server */ + /** @var Server $server */ $server = $this->connection->transaction(function () use ($data, $eggVariableData) { // Create the server and assign any additional allocations to it. $server = $this->createModel($data); - $this->storeAssignedAllocations($server, $data); + if ($server->allocation_id) { + $this->storeAssignedAllocations($server, $data); + } + $this->storeEggVariables($server, $eggVariableData); return $server; }, 5); try { - $this->daemonServerRepository->setServer($server)->create( - Arr::get($data, 'start_on_completion', false) ?? false - ); - } catch (DaemonConnectionException $exception) { + $this->daemonServerRepository + ->setServer($server) + ->create($data['start_on_completion'] ?? false); + } catch (ConnectionException $exception) { $this->serverDeletionService->withForce()->handle($server); throw $exception; @@ -107,32 +133,12 @@ public function handle(array $data, DeploymentObject $deployment = null): Server return $server; } - /** - * Gets an allocation to use for automatic deployment. - * - * @throws \App\Exceptions\DisplayException - * @throws \App\Exceptions\Service\Deployment\NoViableAllocationException - */ - private function configureDeployment(array $data, DeploymentObject $deployment): Allocation - { - /** @var Collection<\App\Models\Node> $nodes */ - $nodes = $this->findViableNodesService->handle( - Arr::get($data, 'memory', 0), - Arr::get($data, 'disk', 0), - Arr::get($data, 'cpu', 0), - Arr::get($data, 'tags', []), - ); - - return $this->allocationSelectionService->setDedicated($deployment->isDedicated()) - ->setNodes($nodes->pluck('id')->toArray()) - ->setPorts($deployment->getPorts()) - ->handle(); - } - /** * Store the server in the database and return the model. * - * @throws \App\Exceptions\Model\DataValidationException + * @param array $data + * + * @throws DataValidationException */ private function createModel(array $data): Server { @@ -168,17 +174,26 @@ private function createModel(array $data): Server /** * Configure the allocations assigned to this server. + * + * @param array{allocation_id: int, allocation_additional?: ?int[]} $data */ private function storeAssignedAllocations(Server $server, array $data): void { $records = [$data['allocation_id']]; - if (isset($data['allocation_additional']) && is_array($data['allocation_additional'])) { + if (isset($data['allocation_additional'])) { $records = array_merge($records, $data['allocation_additional']); } - Allocation::query()->whereIn('id', $records)->update([ - 'server_id' => $server->id, - ]); + Allocation::query() + ->whereIn('id', array_values(array_unique($records))) + ->whereNull('server_id') + ->lockForUpdate() + ->get() + ->each(function (Allocation $allocation) use ($server) { + $allocation->server_id = $server->id; + $allocation->is_locked = true; + $allocation->save(); + }); } /** @@ -186,20 +201,11 @@ private function storeAssignedAllocations(Server $server, array $data): void */ private function storeEggVariables(Server $server, Collection $variables): void { - $now = now(); - - $records = $variables->map(function ($result) use ($server, $now) { - return [ - 'server_id' => $server->id, - 'variable_id' => $result->id, - 'variable_value' => $result->value ?? '', - 'created_at' => $now, - 'updated_at' => $now, - ]; - })->toArray(); - - if (!empty($records)) { - ServerVariable::query()->insert($records); + foreach ($variables as $variable) { + $server->serverVariables()->forceCreate([ + 'variable_id' => $variable->id, + 'variable_value' => $variable->value ?? '', + ]); } } diff --git a/app/Services/Servers/ServerDeletionService.php b/app/Services/Servers/ServerDeletionService.php index 97e6995c77..7f59d017c5 100644 --- a/app/Services/Servers/ServerDeletionService.php +++ b/app/Services/Servers/ServerDeletionService.php @@ -2,13 +2,15 @@ namespace App\Services\Servers; -use Exception; -use Illuminate\Http\Response; +use App\Exceptions\DisplayException; use App\Models\Server; -use Illuminate\Database\ConnectionInterface; use App\Repositories\Daemon\DaemonServerRepository; use App\Services\Databases\DatabaseManagementService; -use App\Exceptions\Http\Connection\DaemonConnectionException; +use Exception; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Http\Client\ConnectionException; +use Illuminate\Http\Response; +use Throwable; class ServerDeletionService { @@ -21,8 +23,7 @@ public function __construct( private ConnectionInterface $connection, private DaemonServerRepository $daemonServerRepository, private DatabaseManagementService $databaseManagementService - ) { - } + ) {} /** * Set if the server should be forcibly deleted from the panel (ignoring daemon errors) or not. @@ -37,19 +38,19 @@ public function withForce(bool $bool = true): self /** * Delete a server from the panel and remove any associated databases from hosts. * - * @throws \Throwable - * @throws \App\Exceptions\DisplayException + * @throws Throwable + * @throws DisplayException */ public function handle(Server $server): void { try { $this->daemonServerRepository->setServer($server)->delete(); - } catch (DaemonConnectionException $exception) { + } catch (ConnectionException $exception) { // If there is an error not caused a 404 error and this isn't a forced delete, // go ahead and bail out. We specifically ignore a 404 since that can be assumed // to be a safe error, meaning the server doesn't exist at all on daemon so there // is no reason we need to bail out from that. - if (!$this->force && $exception->getStatusCode() !== Response::HTTP_NOT_FOUND) { + if (!$this->force && $exception->getCode() !== Response::HTTP_NOT_FOUND) { throw $exception; } @@ -62,7 +63,7 @@ public function handle(Server $server): void foreach ($server->databases as $database) { try { $this->databaseManagementService->delete($database); - } catch (\Exception $exception) { + } catch (Exception $exception) { if (!$this->force) { throw $exception; } @@ -77,7 +78,10 @@ public function handle(Server $server): void } } - $server->allocations()->update(['server_id' => null]); + $server->allocations()->update([ + 'server_id' => null, + 'notes' => null, + ]); $server->delete(); }); diff --git a/app/Services/Servers/StartupCommandService.php b/app/Services/Servers/StartupCommandService.php index 4703eb0753..6cc2af4afb 100644 --- a/app/Services/Servers/StartupCommandService.php +++ b/app/Services/Servers/StartupCommandService.php @@ -9,16 +9,22 @@ class StartupCommandService /** * Generates a startup command for a given server instance. */ - public function handle(Server $server, bool $hideAllValues = false): string + public function handle(Server $server, ?string $startup = null, bool $hideAllValues = false): string { + $startup ??= $server->startup; + $find = ['{{SERVER_MEMORY}}', '{{SERVER_IP}}', '{{SERVER_PORT}}']; - $replace = [$server->memory, $server->allocation->ip, $server->allocation->port]; + $replace = [ + (string) $server->memory, + $server->allocation->ip ?? '127.0.0.1', + (string) ($server->allocation->port ?? '0'), + ]; foreach ($server->variables as $variable) { $find[] = '{{' . $variable->env_variable . '}}'; $replace[] = ($variable->user_viewable && !$hideAllValues) ? ($variable->server_value ?? $variable->default_value) : '[hidden]'; } - return str_replace($find, $replace, $server->startup); + return str_replace($find, $replace, $startup); } } diff --git a/app/Services/Servers/StartupModificationService.php b/app/Services/Servers/StartupModificationService.php index c8eb95cf6d..f83bc2a9de 100644 --- a/app/Services/Servers/StartupModificationService.php +++ b/app/Services/Servers/StartupModificationService.php @@ -2,13 +2,14 @@ namespace App\Services\Servers; -use Illuminate\Support\Arr; use App\Models\Egg; -use App\Models\User; use App\Models\Server; use App\Models\ServerVariable; -use Illuminate\Database\ConnectionInterface; +use App\Models\User; use App\Traits\Services\HasUserLevels; +use Illuminate\Database\ConnectionInterface; +use Illuminate\Support\Arr; +use Throwable; class StartupModificationService { @@ -17,14 +18,14 @@ class StartupModificationService /** * StartupModificationService constructor. */ - public function __construct(private ConnectionInterface $connection, private VariableValidatorService $validatorService) - { - } + public function __construct(private ConnectionInterface $connection, private VariableValidatorService $validatorService) {} /** * Process startup modification for a server. * - * @throws \Throwable + * @param array $data + * + * @throws Throwable */ public function handle(Server $server, array $data): Server { @@ -64,22 +65,28 @@ public function handle(Server $server, array $data): Server /** * Update certain administrative settings for a server in the DB. + * + * @param array{ + * egg_id: ?int, + * docker_image?: ?string, + * startup?: ?string, + * skip_scripts?: ?bool, + * } $data */ protected function updateAdministrativeSettings(array $data, Server &$server): void { $eggId = Arr::get($data, 'egg_id'); if (is_digit($eggId) && $server->egg_id !== (int) $eggId) { - /** @var \App\Models\Egg $egg */ - $egg = Egg::query()->findOrFail($data['egg_id']); + $egg = Egg::findOrFail($data['egg_id']); $server = $server->forceFill([ 'egg_id' => $egg->id, ]); // Fill missing fields from egg - $data['docker_image'] = $data['docker_image'] ?? collect($egg->docker_images)->first(); - $data['startup'] = $data['startup'] ?? $egg->startup; + $data['docker_image'] ??= Arr::first($egg->docker_images); + $data['startup'] ??= Arr::first($egg->startup_commands); } $server->fill([ diff --git a/app/Services/Servers/SuspensionService.php b/app/Services/Servers/SuspensionService.php index aef02b7b2e..4c1702269e 100644 --- a/app/Services/Servers/SuspensionService.php +++ b/app/Services/Servers/SuspensionService.php @@ -3,45 +3,42 @@ namespace App\Services\Servers; use App\Enums\ServerState; -use Filament\Notifications\Notification; -use Webmozart\Assert\Assert; +use App\Enums\SuspendAction; use App\Models\Server; use App\Repositories\Daemon\DaemonServerRepository; +use Filament\Notifications\Notification; use Symfony\Component\HttpKernel\Exception\ConflictHttpException; +use Throwable; class SuspensionService { - public const ACTION_SUSPEND = 'suspend'; - public const ACTION_UNSUSPEND = 'unsuspend'; - /** * SuspensionService constructor. */ public function __construct( private DaemonServerRepository $daemonServerRepository - ) { - } + ) {} /** * Suspends a server on the system. * - * @throws \Throwable + * @throws Throwable */ - public function toggle(Server $server, string $action = self::ACTION_SUSPEND) + public function handle(Server $server, SuspendAction $action): void { - Assert::oneOf($action, [self::ACTION_SUSPEND, self::ACTION_UNSUSPEND]); - - $isSuspending = $action === self::ACTION_SUSPEND; + $isSuspending = $action === SuspendAction::Suspend; // Nothing needs to happen if we're suspending the server, and it is already // suspended in the database. Additionally, nothing needs to happen if the server // is not suspended, and we try to un-suspend the instance. if ($isSuspending === $server->isSuspended()) { - return Notification::make()->danger()->title('Failed!')->body('Server is already suspended!')->send(); + Notification::make()->danger()->title(trans('notifications.failed'))->body(trans('admin/server.notifications.server_already_suspended'))->send(); + + return; } // Check if the server is currently being transferred. if (!is_null($server->transfer)) { - Notification::make()->danger()->title('Failed!')->body('Server is currently being transferred.')->send(); + Notification::make()->danger()->title(trans('notifications.failed'))->body(trans('admin/server.notifications.already_transfering'))->send(); throw new ConflictHttpException('Cannot toggle suspension status on a server that is currently being transferred.'); } @@ -50,15 +47,7 @@ public function toggle(Server $server, string $action = self::ACTION_SUSPEND) 'status' => $isSuspending ? ServerState::Suspended : null, ]); - try { - // Tell daemon to re-sync the server state. - $this->daemonServerRepository->setServer($server)->sync(); - } catch (\Exception $exception) { - // Rollback the server's suspension status if daemon fails to sync the server. - $server->update([ - 'status' => $isSuspending ? null : ServerState::Suspended, - ]); - throw $exception; - } + // Tell daemon to re-sync the server state. + $this->daemonServerRepository->setServer($server)->sync(); } } diff --git a/app/Services/Servers/ToggleInstallService.php b/app/Services/Servers/ToggleInstallService.php new file mode 100644 index 0000000000..770db84434 --- /dev/null +++ b/app/Services/Servers/ToggleInstallService.php @@ -0,0 +1,19 @@ +isFailedInstall()) { + abort(500, trans('exceptions.server.marked_as_failed')); + } + + $server->status = $server->isInstalled() ? ServerState::Installing : null; + $server->save(); + } +} diff --git a/app/Services/Servers/TransferServerService.php b/app/Services/Servers/TransferServerService.php index 4312369dd7..05a0fcc254 100644 --- a/app/Services/Servers/TransferServerService.php +++ b/app/Services/Servers/TransferServerService.php @@ -2,17 +2,17 @@ namespace App\Services\Servers; -use App\Exceptions\Http\Connection\DaemonConnectionException; use App\Models\Allocation; +use App\Models\Backup; use App\Models\Node; use App\Models\Server; use App\Models\ServerTransfer; use App\Services\Nodes\NodeJWTService; use Carbon\CarbonImmutable; -use GuzzleHttp\Exception\TransferException; use Illuminate\Database\ConnectionInterface; use Illuminate\Support\Facades\Http; -use Lcobucci\JWT\Token\Plain; +use Lcobucci\JWT\UnencryptedToken; +use Throwable; class TransferServerService { @@ -22,42 +22,43 @@ class TransferServerService public function __construct( private ConnectionInterface $connection, private NodeJWTService $nodeJWTService, - ) { - } + ) {} - private function notify(Server $server, Plain $token): void + /** + * @param string[] $backup_uuids + */ + private function notify(ServerTransfer $transfer, UnencryptedToken $token, array $backup_uuids = []): void { - try { - Http::daemon($server->node)->post('/api/transfer', [ - 'json' => [ - 'server_id' => $server->uuid, - 'url' => $server->node->getConnectionAddress() . "/api/servers/$server->uuid/archive", - 'token' => 'Bearer ' . $token->toString(), - 'server' => [ - 'uuid' => $server->uuid, - 'start_on_completion' => false, - ], - ], - ])->toPsrResponse(); - } catch (TransferException $exception) { - throw new DaemonConnectionException($exception); + $backups = []; + if (config('backups.default') === Backup::ADAPTER_DAEMON) { + $backups = $backup_uuids; } + Http::daemon($transfer->oldNode)->post("/api/servers/{$transfer->server->uuid}/transfer", [ + 'url' => $transfer->newNode->getConnectionAddress() . '/api/transfers', + 'token' => 'Bearer ' . $token->toString(), + 'backups' => $backups, + 'server' => [ + 'uuid' => $transfer->server->uuid, + 'start_on_completion' => false, + ], + ]); } /** * Starts a transfer of a server to a new node. * - * @throws \Throwable + * @param int[] $additional_allocations + * @param string[] $backup_uuid + * + * @throws Throwable */ - public function handle(Server $server, array $data): bool + public function handle(Server $server, int $node_id, ?int $allocation_id = null, ?array $additional_allocations = [], ?array $backup_uuid = []): bool { - $node_id = $data['node_id']; - $allocation_id = intval($data['allocation_id']); - $additional_allocations = array_map(intval(...), $data['allocation_additional'] ?? []); + $additional_allocations = array_map(intval(...), $additional_allocations); // Check if the node is viable for the transfer. $node = Node::query() - ->select(['nodes.id', 'nodes.fqdn', 'nodes.scheme', 'nodes.daemon_token', 'nodes.daemon_listen', 'nodes.memory', 'nodes.disk', 'nodes.cpu', 'nodes.memory_overallocate', 'nodes.disk_overallocate', 'nodes.cpu_overallocate']) + ->select(['nodes.id', 'nodes.fqdn', 'nodes.scheme', 'nodes.daemon_token', 'nodes.daemon_connect', 'nodes.memory', 'nodes.disk', 'nodes.cpu', 'nodes.memory_overallocate', 'nodes.disk_overallocate', 'nodes.cpu_overallocate']) ->withSum('servers', 'disk') ->withSum('servers', 'memory') ->withSum('servers', 'cpu') @@ -71,47 +72,53 @@ public function handle(Server $server, array $data): bool $server->validateTransferState(); - $this->connection->transaction(function () use ($server, $node_id, $allocation_id, $additional_allocations) { + /** @var ServerTransfer $transfer */ + $transfer = $this->connection->transaction(function () use ($server, $node_id, $allocation_id, $additional_allocations) { // Create a new ServerTransfer entry. - $transfer = new ServerTransfer(); - - $transfer->server_id = $server->id; - $transfer->old_node = $server->node_id; - $transfer->new_node = $node_id; - $transfer->old_allocation = $server->allocation_id; - $transfer->new_allocation = $allocation_id; - $transfer->old_additional_allocations = $server->allocations->where('id', '!=', $server->allocation_id)->pluck('id')->all(); - $transfer->new_additional_allocations = $additional_allocations; + $transfer = ServerTransfer::create([ + 'server_id' => $server->id, + 'old_node' => $server->node_id, + 'new_node' => $node_id, + ]); + + if ($server->allocation_id) { + $transfer->old_allocation = $server->allocation_id; + $transfer->new_allocation = $allocation_id; + $transfer->old_additional_allocations = $server->allocations->where('id', '!=', $server->allocation_id)->pluck('id')->all(); + $transfer->new_additional_allocations = $additional_allocations; + + // Add the allocations to the server, so they cannot be automatically assigned while the transfer is in progress. + $this->assignAllocationsToServer($server, $node_id, $allocation_id, $additional_allocations); + } $transfer->save(); - // Add the allocations to the server, so they cannot be automatically assigned while the transfer is in progress. - $this->assignAllocationsToServer($server, $node_id, $allocation_id, $additional_allocations); - - // Generate a token for the destination node that the source node can use to authenticate with. - $token = $this->nodeJWTService - ->setExpiresAt(CarbonImmutable::now()->addMinutes(15)) - ->setSubject($server->uuid) - ->handle($transfer->newNode, $server->uuid, 'sha256'); - - // Notify the source node of the pending outgoing transfer. - $this->notify($server, $token); - return $transfer; }); + // Generate a token for the destination node that the source node can use to authenticate with. + $token = $this->nodeJWTService + ->setExpiresAt(CarbonImmutable::now()->addMinutes(15)) + ->setSubject($server->uuid) + ->handle($transfer->newNode, $server->uuid, 'sha256'); + + // Notify the source node of the pending outgoing transfer. + $this->notify($transfer, $token, $backup_uuid); + return true; } /** * Assigns the specified allocations to the specified server. + * + * @param int[] $additional_allocations */ - private function assignAllocationsToServer(Server $server, int $node_id, int $allocation_id, array $additional_allocations) + private function assignAllocationsToServer(Server $server, int $node_id, int $allocation_id, array $additional_allocations): void { $allocations = $additional_allocations; $allocations[] = $allocation_id; - $node = Node::query()->findOrFail($node_id); + $node = Node::findOrFail($node_id); $unassigned = $node->allocations() ->whereNull('server_id') ->pluck('id') @@ -127,7 +134,7 @@ private function assignAllocationsToServer(Server $server, int $node_id, int $al } if (!empty($updateIds)) { - Allocation::query()->whereIn('id', $updateIds)->update(['server_id' => $server->id]); + Allocation::whereIn('id', $updateIds)->update(['server_id' => $server->id]); } } } diff --git a/app/Services/Servers/VariableValidatorService.php b/app/Services/Servers/VariableValidatorService.php index 75f4a59b14..a20550a308 100644 --- a/app/Services/Servers/VariableValidatorService.php +++ b/app/Services/Servers/VariableValidatorService.php @@ -2,28 +2,25 @@ namespace App\Services\Servers; -use App\Models\User; -use Illuminate\Support\Collection; use App\Models\EggVariable; -use Illuminate\Validation\ValidationException; +use App\Models\User; use App\Traits\Services\HasUserLevels; use Illuminate\Contracts\Validation\Factory as ValidationFactory; +use Illuminate\Support\Collection; +use Illuminate\Validation\ValidationException; class VariableValidatorService { use HasUserLevels; - /** - * VariableValidatorService constructor. - */ - public function __construct(private ValidationFactory $validator) - { - } + public function __construct(private readonly ValidationFactory $validator) {} /** - * Validate all of the passed data against the given egg variables. + * Validate passed data against the given egg variables. + * + * @param array $fields * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function handle(int $egg, array $fields = []): Collection { @@ -34,12 +31,12 @@ public function handle(int $egg, array $fields = []): Collection $query = $query->where('user_editable', true)->where('user_viewable', true); } - /** @var \App\Models\EggVariable[] $variables */ + /** @var EggVariable[] $variables */ $variables = $query->get(); $data = $rules = $customAttributes = []; foreach ($variables as $variable) { - $data['environment'][$variable->env_variable] = array_get($fields, $variable->env_variable); + $data['environment'][$variable->env_variable] = $fields[$variable->env_variable] ?? $variable->default_value; $rules['environment.' . $variable->env_variable] = $variable->rules; $customAttributes['environment.' . $variable->env_variable] = trans('validation.internal.variable_value', ['env' => $variable->name]); } diff --git a/app/Services/Ssh/KeyCreationService.php b/app/Services/Ssh/KeyCreationService.php new file mode 100644 index 0000000000..4bd9f7faae --- /dev/null +++ b/app/Services/Ssh/KeyCreationService.php @@ -0,0 +1,48 @@ +getLength() < 2048) { + throw new Exception('RSA keys must be at least 2048 bytes in length'); + } + + $fingerprint = $key->getFingerprint('sha256'); + if ($user->sshKeys()->where('fingerprint', $fingerprint)->exists()) { + throw new Exception('The public key provided already exists on your account'); + } + + /** @var UserSSHKey $sshKey */ + $sshKey = $user->sshKeys()->create([ + 'name' => $name, + 'public_key' => $key->toString('PKCS8'), + 'fingerprint' => $fingerprint, + ]); + + return $sshKey; + } +} diff --git a/app/Services/Subusers/SubuserCreationService.php b/app/Services/Subusers/SubuserCreationService.php index 0f9508ba72..61d8ba0071 100644 --- a/app/Services/Subusers/SubuserCreationService.php +++ b/app/Services/Subusers/SubuserCreationService.php @@ -2,14 +2,17 @@ namespace App\Services\Subusers; -use App\Models\User; -use Illuminate\Support\Str; +use App\Enums\SubuserPermission; +use App\Events\Server\SubUserAdded; +use App\Exceptions\Model\DataValidationException; +use App\Exceptions\Service\Subuser\ServerSubuserExistsException; +use App\Exceptions\Service\Subuser\UserIsServerOwnerException; use App\Models\Server; use App\Models\Subuser; -use Illuminate\Database\ConnectionInterface; +use App\Models\User; use App\Services\Users\UserCreationService; -use App\Exceptions\Service\Subuser\UserIsServerOwnerException; -use App\Exceptions\Service\Subuser\ServerSubuserExistsException; +use Illuminate\Database\ConnectionInterface; +use Throwable; class SubuserCreationService { @@ -19,51 +22,57 @@ class SubuserCreationService public function __construct( private ConnectionInterface $connection, private UserCreationService $userCreationService, - ) { - } + ) {} /** * Creates a new user on the system and assigns them access to the provided server. * If the email address already belongs to a user on the system a new user will not * be created. * - * @throws \App\Exceptions\Model\DataValidationException - * @throws \App\Exceptions\Service\Subuser\ServerSubuserExistsException - * @throws \App\Exceptions\Service\Subuser\UserIsServerOwnerException - * @throws \Throwable + * @param string[] $permissions + * + * @throws DataValidationException + * @throws ServerSubuserExistsException + * @throws UserIsServerOwnerException + * @throws Throwable */ public function handle(Server $server, string $email, array $permissions): Subuser { return $this->connection->transaction(function () use ($server, $email, $permissions) { - $user = User::query()->where('email', $email)->first(); + $user = User::withoutGlobalScopes()->where('email', $email)->first(); if (!$user) { - // Just cap the username generated at 64 characters at most and then append a random string - // to the end to make it "unique"... - $username = substr(preg_replace('/([^\w\.-]+)/', '', strtok($email, '@')), 0, 64) . Str::random(3); - $user = $this->userCreationService->handle([ 'email' => $email, - 'username' => $username, - 'name_first' => 'Server', - 'name_last' => 'Subuser', 'root_admin' => false, ]); - } + } else { + if ($server->owner_id === $user->id) { + throw new UserIsServerOwnerException(trans('exceptions.subusers.user_is_owner')); + } - if ($server->owner_id === $user->id) { - throw new UserIsServerOwnerException(trans('exceptions.subusers.user_is_owner')); + $subuserCount = $server->subusers()->where('user_id', $user->id)->count(); + if ($subuserCount !== 0) { + throw new ServerSubuserExistsException(trans('exceptions.subusers.subuser_exists')); + } } - $subuserCount = $server->subusers()->where('user_id', $user->id)->count(); - if ($subuserCount !== 0) { - throw new ServerSubuserExistsException(trans('exceptions.subusers.subuser_exists')); - } + $cleanedPermissions = collect($permissions) + ->unique() + ->filter(fn ($permission) => $permission === SubuserPermission::WebsocketConnect->value || user()?->can($permission, $server)) + ->sort() + ->values() + ->all(); - return Subuser::query()->create([ + $subuser = Subuser::withoutGlobalScopes()->updateOrCreate([ 'user_id' => $user->id, 'server_id' => $server->id, - 'permissions' => array_unique($permissions), + ], [ + 'permissions' => $cleanedPermissions, ]); + + event(new SubUserAdded($subuser)); + + return $subuser; }); } } diff --git a/app/Services/Subusers/SubuserDeletionService.php b/app/Services/Subusers/SubuserDeletionService.php new file mode 100644 index 0000000000..bbf232995d --- /dev/null +++ b/app/Services/Subusers/SubuserDeletionService.php @@ -0,0 +1,40 @@ +subject($subuser->user) + ->property('email', $subuser->user->email) + ->property('revoked', true); + + $log->transaction(function ($instance) use ($server, $subuser) { + $subuser->delete(); + + event(new SubUserRemoved($subuser->server, $subuser->user)); + + try { + $this->serverRepository->setServer($server)->deauthorize($subuser->user->uuid); + } catch (ConnectionException $exception) { + // Don't block this request if we can't connect to the daemon instance. + logger()->warning($exception, ['user_id' => $subuser->user_id, 'server_id' => $server->id]); + + $instance->property('revoked', false); + } + }); + } +} diff --git a/app/Services/Subusers/SubuserUpdateService.php b/app/Services/Subusers/SubuserUpdateService.php new file mode 100644 index 0000000000..1ce9c0ac53 --- /dev/null +++ b/app/Services/Subusers/SubuserUpdateService.php @@ -0,0 +1,62 @@ +unique() + ->filter(fn ($permission) => $permission === SubuserPermission::WebsocketConnect->value || user()?->can($permission, $server)) + ->sort() + ->values() + ->all(); + + $current = $subuser->permissions; + sort($current); + + $log = Activity::event('server:subuser.update') + ->subject($subuser->user) + ->property([ + 'email' => $subuser->user->email, + 'old' => $current, + 'new' => $cleanedPermissions, + 'revoked' => true, + ]); + + // Only update the database and hit up the daemon instance to invalidate JTI's if the permissions + // have actually changed for the user. + if ($cleanedPermissions !== $current) { + $log->transaction(function ($instance) use ($subuser, $cleanedPermissions, $server) { + $subuser->update(['permissions' => $cleanedPermissions]); + + try { + $this->serverRepository->setServer($server)->deauthorize($subuser->user->uuid); + } catch (ConnectionException $exception) { + // Don't block this request if we can't connect to the daemon instance. Chances are it is + // offline and the token will be invalid once daemon boots back. + logger()->warning($exception, ['user_id' => $subuser->user_id, 'server_id' => $server->id]); + + $instance->property('revoked', false); + } + }); + } + + $log->reset(); + } +} diff --git a/app/Services/Users/ToggleTwoFactorService.php b/app/Services/Users/ToggleTwoFactorService.php deleted file mode 100644 index 64518e39bf..0000000000 --- a/app/Services/Users/ToggleTwoFactorService.php +++ /dev/null @@ -1,81 +0,0 @@ -google2FA->verifyKey($user->totp_secret, $token, config()->get('panel.auth.2fa.window')); - - if (!$isValidToken) { - throw new TwoFactorAuthenticationTokenInvalid(); - } - - return $this->connection->transaction(function () use ($user, $toggleState) { - // Now that we're enabling 2FA on the account, generate 10 recovery tokens for the account - // and store them hashed in the database. We'll return them to the caller so that the user - // can see and save them. - // - // If a user is unable to login with a 2FA token they can provide one of these backup codes - // which will then be marked as deleted from the database and will also bypass 2FA protections - // on their account. - $tokens = []; - if ((!$toggleState && !$user->use_totp) || $toggleState) { - $inserts = []; - for ($i = 0; $i < 10; $i++) { - $token = Str::random(10); - - $inserts[] = [ - 'user_id' => $user->id, - 'token' => password_hash($token, PASSWORD_DEFAULT), - // insert() won't actually set the time on the models, so make sure we do this - // manually here. - 'created_at' => Carbon::now(), - ]; - - $tokens[] = $token; - } - - // Before inserting any new records make sure all the old ones are deleted to avoid - // any issues or storing an unnecessary number of tokens in the database. - $user->recoveryTokens()->delete(); - - // Bulk insert the hashed tokens. - RecoveryToken::query()->insert($inserts); - } - - $user->totp_authenticated_at = now(); - $user->use_totp = (is_null($toggleState) ? !$user->use_totp : $toggleState); - $user->save(); - - return $tokens; - }); - } -} diff --git a/app/Services/Users/TwoFactorSetupService.php b/app/Services/Users/TwoFactorSetupService.php deleted file mode 100644 index fb906c9dbf..0000000000 --- a/app/Services/Users/TwoFactorSetupService.php +++ /dev/null @@ -1,44 +0,0 @@ -getMessage(), 0, $exception); - } - - $user->totp_secret = $secret; - $user->save(); - - $company = urlencode(preg_replace('/\s/', '', config('app.name'))); - - return [ - 'image_url_data' => sprintf( - 'otpauth://totp/%1$s:%2$s?secret=%3$s&issuer=%1$s', - rawurlencode($company), - rawurlencode($user->email), - rawurlencode($secret), - ), - 'secret' => $secret, - ]; - } -} diff --git a/app/Services/Users/UserCreationService.php b/app/Services/Users/UserCreationService.php index 958d84442b..53efb4933a 100644 --- a/app/Services/Users/UserCreationService.php +++ b/app/Services/Users/UserCreationService.php @@ -2,31 +2,33 @@ namespace App\Services\Users; +use App\Exceptions\Model\DataValidationException; use App\Models\Role; -use Ramsey\Uuid\Uuid; use App\Models\User; +use App\Notifications\AccountCreated; +use Exception; +use Filament\Facades\Filament; +use Illuminate\Auth\Passwords\PasswordBroker; use Illuminate\Contracts\Hashing\Hasher; use Illuminate\Database\ConnectionInterface; -use Illuminate\Contracts\Auth\PasswordBroker; -use App\Notifications\AccountCreated; +use Illuminate\Support\Facades\Password; +use Illuminate\Support\Str; +use Ramsey\Uuid\Uuid; class UserCreationService { - /** - * UserCreationService constructor. - */ public function __construct( - private ConnectionInterface $connection, - private Hasher $hasher, - private PasswordBroker $passwordBroker, - ) { - } + private readonly ConnectionInterface $connection, + private readonly Hasher $hasher, + ) {} /** * Create a new user on the system. * - * @throws \Exception - * @throws \App\Exceptions\Model\DataValidationException + * @param array $data + * + * @throws Exception + * @throws DataValidationException */ public function handle(array $data): User { @@ -37,12 +39,17 @@ public function handle(array $data): User $this->connection->beginTransaction(); if (empty($data['password'])) { $generateResetToken = true; - $data['password'] = $this->hasher->make(str_random(30)); + $data['password'] = $this->hasher->make(Str::random(30)); } $isRootAdmin = array_key_exists('root_admin', $data) && $data['root_admin']; unset($data['root_admin']); + if (empty($data['username'])) { + $data['username'] = str($data['email'])->before('@')->toString() . Str::random(3); + } + + /** @var User $user */ $user = User::query()->forceCreate(array_merge($data, [ 'uuid' => Uuid::uuid4()->toString(), ])); @@ -52,11 +59,14 @@ public function handle(array $data): User } if (isset($generateResetToken)) { - $token = $this->passwordBroker->createToken($user); + /** @var PasswordBroker $broker */ + $broker = Password::broker(Filament::getPanel('app')->getAuthPasswordBroker()); + $token = $broker->createToken($user); } $this->connection->commit(); - $user->notify(new AccountCreated($user, $token ?? null)); + + $user->notify(new AccountCreated($token ?? null)); return $user; } diff --git a/app/Services/Users/UserUpdateService.php b/app/Services/Users/UserUpdateService.php index 5884797494..aacb0cb479 100644 --- a/app/Services/Users/UserUpdateService.php +++ b/app/Services/Users/UserUpdateService.php @@ -3,24 +3,22 @@ namespace App\Services\Users; use App\Models\User; -use Illuminate\Contracts\Hashing\Hasher; use App\Traits\Services\HasUserLevels; +use Illuminate\Contracts\Hashing\Hasher; +use Throwable; class UserUpdateService { use HasUserLevels; - /** - * UserUpdateService constructor. - */ - public function __construct(private Hasher $hasher) - { - } + public function __construct(private readonly Hasher $hasher) {} /** * Update the user model instance and return the updated model. * - * @throws \Throwable + * @param array $data + * + * @throws Throwable */ public function handle(User $user, array $data): User { diff --git a/app/Traits/CheckMigrationsTrait.php b/app/Traits/CheckMigrationsTrait.php index ee2de8f3a8..c149085b97 100644 --- a/app/Traits/CheckMigrationsTrait.php +++ b/app/Traits/CheckMigrationsTrait.php @@ -12,7 +12,7 @@ trait CheckMigrationsTrait protected function hasCompletedMigrations(): bool { /** @var Migrator $migrator */ - $migrator = app()->make('migrator'); + $migrator = app()->make('migrator'); // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions $files = $migrator->getMigrationFiles(database_path('migrations')); diff --git a/app/Traits/Commands/RequestRedisSettingsTrait.php b/app/Traits/Commands/RequestRedisSettingsTrait.php index 07ef229c2c..77ae01d525 100644 --- a/app/Traits/Commands/RequestRedisSettingsTrait.php +++ b/app/Traits/Commands/RequestRedisSettingsTrait.php @@ -4,9 +4,12 @@ trait RequestRedisSettingsTrait { + /** @var array */ + protected array $variables; + protected function requestRedisSettings(): void { - $this->output->note(__('commands.appsettings.redis.note')); + $this->output->note(trans('commands.appsettings.redis.note')); $this->variables['REDIS_HOST'] = $this->option('redis-host') ?? $this->ask( 'Redis Host', config('database.redis.default.host') @@ -17,21 +20,21 @@ protected function requestRedisSettings(): void if (!empty(config('database.redis.default.user'))) { $this->variables['REDIS_USERNAME'] = config('database.redis.default.user'); - $askForRedisUser = $this->confirm(__('commands.appsettings.redis.confirm', ['field' => 'user'])); + $askForRedisUser = $this->confirm(trans('commands.appsettings.redis.confirm', ['field' => 'user'])); } if (!empty(config('database.redis.default.password'))) { $this->variables['REDIS_PASSWORD'] = config('database.redis.default.password'); - $askForRedisPassword = $this->confirm(__('commands.appsettings.redis.confirm', ['field' => 'password'])); + $askForRedisPassword = $this->confirm(trans('commands.appsettings.redis.confirm', ['field' => 'password'])); } if ($askForRedisUser) { - $this->output->comment(__('commands.appsettings.redis.comment')); + $this->output->comment(trans('commands.appsettings.redis.comment')); $this->variables['REDIS_USERNAME'] = $this->option('redis-user') ?? $this->output->askHidden( 'Redis User' ); } if ($askForRedisPassword) { - $this->output->comment(__('commands.appsettings.redis.comment')); + $this->output->comment(trans('commands.appsettings.redis.comment')); $this->variables['REDIS_PASSWORD'] = $this->option('redis-pass') ?? $this->output->askHidden( 'Redis Password' ); diff --git a/app/Traits/Commands/RequiresDatabaseMigrations.php b/app/Traits/Commands/RequiresDatabaseMigrations.php index 67551a26a9..aed555b9f3 100644 --- a/app/Traits/Commands/RequiresDatabaseMigrations.php +++ b/app/Traits/Commands/RequiresDatabaseMigrations.php @@ -14,7 +14,7 @@ trait RequiresDatabaseMigrations /** * Throw a massive error into the console to hopefully catch the users attention and get - * them to properly run the migrations rather than ignoring all of the other previous + * them to properly run the migrations rather than ignoring other previous * errors... */ protected function showMigrationWarning(): void diff --git a/app/Traits/Controllers/JavascriptInjection.php b/app/Traits/Controllers/JavascriptInjection.php deleted file mode 100644 index 7a95c7bdbd..0000000000 --- a/app/Traits/Controllers/JavascriptInjection.php +++ /dev/null @@ -1,28 +0,0 @@ -request = $request; - - return $this; - } - - /** - * Injects the exact array passed in, nothing more. - */ - public function plainInject(array $args = []): string - { - return \JavaScript::put($args); - } -} diff --git a/app/Traits/Controllers/PlainJavascriptInjection.php b/app/Traits/Controllers/PlainJavascriptInjection.php deleted file mode 100644 index 4b5169296b..0000000000 --- a/app/Traits/Controllers/PlainJavascriptInjection.php +++ /dev/null @@ -1,16 +0,0 @@ - $values + * + * @throws RuntimeException */ public function writeToEnvironment(array $values = []): void { - $path = base_path('.env'); - if (!file_exists($path)) { - throw new Exception('Cannot locate .env file, was this software installed correctly?'); - } - - $saveContents = file_get_contents($path); - collect($values)->each(function ($value, $key) use (&$saveContents) { - $key = strtoupper($key); - $saveValue = sprintf('%s=%s', $key, $this->escapeEnvironmentValue($value ?? '')); - - if (preg_match_all('/^' . $key . '=(.*)$/m', $saveContents) < 1) { - $saveContents = $saveContents . PHP_EOL . $saveValue; - } else { - $saveContents = preg_replace('/^' . $key . '=(.*)$/m', $saveValue, $saveContents); - } - }); - - file_put_contents($path, $saveContents); + Env::writeVariables($values, base_path('.env'), true); + Artisan::call('config:clear'); } } diff --git a/app/Traits/Filament/BlockAccessInConflict.php b/app/Traits/Filament/BlockAccessInConflict.php new file mode 100644 index 0000000000..a45f72fd25 --- /dev/null +++ b/app/Traits/Filament/BlockAccessInConflict.php @@ -0,0 +1,21 @@ +isInConflictState()) { + return false; + } + + return parent::canAccess(); + } +} diff --git a/app/Traits/Filament/CanCustomizeHeaderActions.php b/app/Traits/Filament/CanCustomizeHeaderActions.php new file mode 100644 index 0000000000..df89fd8e6c --- /dev/null +++ b/app/Traits/Filament/CanCustomizeHeaderActions.php @@ -0,0 +1,39 @@ + */ + protected static array $customHeaderActions = []; + + public static function registerCustomHeaderActions(HeaderActionPosition $position, Action|ActionGroup ...$customHeaderActions): void + { + static::$customHeaderActions[$position->value] = array_merge(static::$customHeaderActions[$position->value] ?? [], $customHeaderActions); + } + + /** @return array */ + protected function getDefaultHeaderActions(): array + { + return []; + } + + /** @return array + * @throws Exception + */ + protected function getHeaderActions(): array + { + return array_merge( + static::$customHeaderActions[HeaderActionPosition::Before->value] ?? [], + $this->getDefaultHeaderActions(), + static::$customHeaderActions[HeaderActionPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanCustomizeHeaderWidgets.php b/app/Traits/Filament/CanCustomizeHeaderWidgets.php new file mode 100644 index 0000000000..6972b22e8c --- /dev/null +++ b/app/Traits/Filament/CanCustomizeHeaderWidgets.php @@ -0,0 +1,34 @@ +|WidgetConfiguration> */ + protected static array $customHeaderWidgets = []; + + public static function registerCustomHeaderWidgets(HeaderWidgetPosition $position, string|WidgetConfiguration ...$customHeaderWidgets): void + { + static::$customHeaderWidgets[$position->value] = array_merge(static::$customHeaderWidgets[$position->value] ?? [], $customHeaderWidgets); + } + + /** @return array|WidgetConfiguration> */ + protected function getDefaultHeaderWidgets(): array + { + return []; + } + + /** @return array|WidgetConfiguration> */ + protected function getHeaderWidgets(): array + { + return array_merge( + static::$customHeaderWidgets[HeaderWidgetPosition::Before->value] ?? [], + $this->getDefaultHeaderWidgets(), + static::$customHeaderWidgets[HeaderWidgetPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanCustomizePages.php b/app/Traits/Filament/CanCustomizePages.php new file mode 100644 index 0000000000..7db269c0da --- /dev/null +++ b/app/Traits/Filament/CanCustomizePages.php @@ -0,0 +1,29 @@ + */ + protected static array $customPages = []; + + /** @param array $customPages */ + public static function registerCustomPages(array $customPages): void + { + static::$customPages = array_merge(static::$customPages, $customPages); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return []; + } + + /** @return array */ + public static function getPages(): array + { + return array_unique(array_merge(static::$customPages, static::getDefaultPages()), SORT_REGULAR); + } +} diff --git a/app/Traits/Filament/CanCustomizeRelations.php b/app/Traits/Filament/CanCustomizeRelations.php new file mode 100644 index 0000000000..eb43073c0a --- /dev/null +++ b/app/Traits/Filament/CanCustomizeRelations.php @@ -0,0 +1,28 @@ +> */ + protected static array $customRelations = []; + + public static function registerCustomRelations(string ...$customRelations): void + { + static::$customRelations = array_merge(static::$customRelations, $customRelations); + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return []; + } + + /** @return class-string[] */ + public static function getRelations(): array + { + return array_unique(array_merge(static::$customRelations, static::getDefaultRelations())); + } +} diff --git a/app/Traits/Filament/CanCustomizeStaticTabs.php b/app/Traits/Filament/CanCustomizeStaticTabs.php new file mode 100644 index 0000000000..fb60c30b8e --- /dev/null +++ b/app/Traits/Filament/CanCustomizeStaticTabs.php @@ -0,0 +1,33 @@ + */ + protected static array $customTabs = []; + + public static function registerCustomTabs(TabPosition $position, Tab ...$customTabs): void + { + static::$customTabs[$position->value] = array_merge(static::$customTabs[$position->value] ?? [], $customTabs); + } + + /** @return Tab[] */ + protected static function getDefaultTabs(): array + { + return []; + } + + /** @return Tab[] */ + protected static function getTabs(): array + { + return array_merge( + static::$customTabs[TabPosition::Before->value] ?? [], + static::getDefaultTabs(), + static::$customTabs[TabPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanCustomizeSteps.php b/app/Traits/Filament/CanCustomizeSteps.php new file mode 100644 index 0000000000..92503dd885 --- /dev/null +++ b/app/Traits/Filament/CanCustomizeSteps.php @@ -0,0 +1,33 @@ +value] = array_merge(static::$customSteps[$position->value] ?? [], $customSteps); + } + + /** @return Step[] */ + protected function getDefaultSteps(): array + { + return []; + } + + /** @return Step[] */ + protected function getSteps(): array + { + return array_merge( + static::$customSteps[StepPosition::Before->value] ?? [], + $this->getDefaultSteps(), + static::$customSteps[StepPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanCustomizeTabs.php b/app/Traits/Filament/CanCustomizeTabs.php new file mode 100644 index 0000000000..274313a4f4 --- /dev/null +++ b/app/Traits/Filament/CanCustomizeTabs.php @@ -0,0 +1,33 @@ + */ + protected static array $customTabs = []; + + public static function registerCustomTabs(TabPosition $position, Tab ...$customTabs): void + { + static::$customTabs[$position->value] = array_merge(static::$customTabs[$position->value] ?? [], $customTabs); + } + + /** @return Tab[] */ + protected function getDefaultTabs(): array + { + return []; + } + + /** @return Tab[] */ + protected function getTabs(): array + { + return array_merge( + static::$customTabs[TabPosition::Before->value] ?? [], + $this->getDefaultTabs(), + static::$customTabs[TabPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanModifyForm.php b/app/Traits/Filament/CanModifyForm.php new file mode 100644 index 0000000000..6fe7e5d4df --- /dev/null +++ b/app/Traits/Filament/CanModifyForm.php @@ -0,0 +1,33 @@ + */ + protected static array $customFormModifications = []; + + public static function modifyForm(Closure $closure): void + { + static::$customFormModifications[] = $closure; + } + + public static function defaultForm(Schema $schema): Schema + { + return $schema; + } + + public static function form(Schema $schema): Schema + { + $schema = static::defaultForm($schema); + + foreach (static::$customFormModifications as $closure) { + $schema = $closure($schema); + } + + return $schema; + } +} diff --git a/app/Traits/Filament/CanModifyTable.php b/app/Traits/Filament/CanModifyTable.php new file mode 100644 index 0000000000..96968b13cf --- /dev/null +++ b/app/Traits/Filament/CanModifyTable.php @@ -0,0 +1,33 @@ + */ + protected static array $customTableModifications = []; + + public static function modifyTable(Closure $closure): void + { + static::$customTableModifications[] = $closure; + } + + public static function defaultTable(Table $table): Table + { + return $table; + } + + public static function table(Table $table): Table + { + $table = static::defaultTable($table); + + foreach (static::$customTableModifications as $closure) { + $table = $closure($table); + } + + return $table; + } +} diff --git a/app/Traits/Filament/HasLimitBadge.php b/app/Traits/Filament/HasLimitBadge.php new file mode 100644 index 0000000000..c7d41a2432 --- /dev/null +++ b/app/Traits/Filament/HasLimitBadge.php @@ -0,0 +1,38 @@ += $limit ? 'danger' : ($count >= $limit * self::WARNING_THRESHOLD ? 'warning' : 'success'); + } +} diff --git a/app/Traits/HasValidation.php b/app/Traits/HasValidation.php new file mode 100644 index 0000000000..2d2f0e0c15 --- /dev/null +++ b/app/Traits/HasValidation.php @@ -0,0 +1,108 @@ +exists ? static::getRulesForUpdate($this) : static::getRules(); + + $validatorFactory = Container::getInstance()->make(ValidationFactory::class); + + return $validatorFactory->make([], $rules); + } + + /** + * Returns the rules associated with this model. + * + * @return array + */ + public static function getRules(): array + { + return static::$validationRules; + } + + /** + * Returns the rules for a specific field. If the field is not found, an empty array is returned. + * + * @return string[]|ValidationRule[] + */ + public static function getRulesForField(string $field): array + { + return Arr::get(static::getRules(), $field) ?? []; + } + + /** + * Returns the rules associated with the model, specifically for updating the given model rather than just creating it. + * + * @return array + */ + public static function getRulesForUpdate(self $model): array + { + [$id, $column] = [$model->getKey(), $model->getKeyName()]; + + $rules = static::getRules(); + foreach ($rules as $key => &$data) { + // For each rule in a given field, iterate over it and confirm if the rule + // is one for a unique field. If that is the case, append the ID of the current + // working model, so we don't run into errors due to the way that field validation + // works. + foreach ($data as &$datum) { + if (!Str::startsWith($datum, 'unique')) { + continue; + } + + [, $args] = explode(':', $datum); + $args = explode(',', $args); + + $datum = Rule::unique($args[0], $args[1] ?? $key)->ignore($id ?? $model, $column); + } + } + + return $rules; + } + + /** + * Determines if the model is in a valid state or not. + * + * @throws ValidationException + */ + public function validate(): void + { + if (isset($this->skipValidation)) { + return; + } + + $validator = $this->getValidator(); + $validator->setData( + // Trying to do self::toArray() here will leave out keys based on the whitelist/blacklist + // for that model. Doing this will return all the attributes in a format that can + // properly be validated. + $this->addCastAttributesToArray( + $this->getAttributes(), + $this->getMutatedAttributes() + ) + ); + + if (!$validator->passes()) { + throw new ValidationException($validator); + } + } +} diff --git a/app/Traits/Helpers/AvailableLanguages.php b/app/Traits/Helpers/AvailableLanguages.php deleted file mode 100644 index 53b45c5a60..0000000000 --- a/app/Traits/Helpers/AvailableLanguages.php +++ /dev/null @@ -1,56 +0,0 @@ -getFilesystemInstance()->directories(base_path('lang')))->mapWithKeys(function ($path) { - $code = basename($path); - - $value = Locale::getDisplayName($code, $code); - - return [$code => title_case($value)]; - })->toArray(); - } - - public function isLanguageTranslated(string $countryCode = 'en'): bool - { - return in_array($countryCode, self::TRANSLATED, true); - } - - /** - * Return an instance of the filesystem for getting a folder listing. - */ - private function getFilesystemInstance(): Filesystem - { - return $this->filesystem = $this->filesystem ?: app()->make(Filesystem::class); - } -} diff --git a/app/Traits/ResolvesRecordDate.php b/app/Traits/ResolvesRecordDate.php new file mode 100644 index 0000000000..7323fb60f4 --- /dev/null +++ b/app/Traits/ResolvesRecordDate.php @@ -0,0 +1,45 @@ +record ?? null); + + if (is_scalar($r)) { + return (string) $r; + } + + if (is_array($r)) { + return Arr::get($r, 'date') !== null ? (string) Arr::get($r, 'date') : null; + } + + if (is_object($r)) { + if (method_exists($r, 'getAttribute')) { + $val = $r->getAttribute('date'); + if ($val !== null) { + return (string) $val; + } + } + + if (isset($r->date) || property_exists($r, 'date')) { + return (string) $r->date; + } + + if (method_exists($r, 'toArray')) { + $arr = $r->toArray(); + + return Arr::get($arr, 'date') !== null ? (string) Arr::get($arr, 'date') : null; + } + } + + return null; + } +} diff --git a/app/Traits/Services/ValidatesValidationRules.php b/app/Traits/Services/ValidatesValidationRules.php index ccb393a6f4..44aec04d66 100644 --- a/app/Traits/Services/ValidatesValidationRules.php +++ b/app/Traits/Services/ValidatesValidationRules.php @@ -2,25 +2,28 @@ namespace App\Traits\Services; -use Illuminate\Support\Str; -use Illuminate\Contracts\Validation\Factory as ValidationFactory; use App\Exceptions\Service\Egg\Variable\BadValidationRuleException; +use BadMethodCallException; +use Illuminate\Contracts\Validation\Factory as ValidationFactory; +use Illuminate\Contracts\Validation\ValidationRule; +use Illuminate\Support\Str; trait ValidatesValidationRules { abstract protected function getValidator(): ValidationFactory; /** - * Validate that the rules being provided are valid for Laravel and can - * be resolved. + * Validate that the rules being provided are valid and can be resolved. + * + * @param string[]|string|ValidationRule[] $rules * - * @throws \App\Exceptions\Service\Egg\Variable\BadValidationRuleException + * @throws BadValidationRuleException */ public function validateRules(array|string $rules): void { try { $this->getValidator()->make(['__TEST' => 'test'], ['__TEST' => $rules])->fails(); - } catch (\BadMethodCallException $exception) { + } catch (BadMethodCallException $exception) { $matches = []; if (preg_match('/Method \[(.+)\] does not exist\./', $exception->getMessage(), $matches)) { throw new BadValidationRuleException(trans('exceptions.variables.bad_validation_rule', ['rule' => Str::snake(str_replace('validate', '', array_get($matches, 1, 'unknownRule')))]), $exception); diff --git a/app/Transformers/Api/Application/AllocationTransformer.php b/app/Transformers/Api/Application/AllocationTransformer.php index 7f5bf88270..d4deaaced5 100644 --- a/app/Transformers/Api/Application/AllocationTransformer.php +++ b/app/Transformers/Api/Application/AllocationTransformer.php @@ -2,12 +2,11 @@ namespace App\Transformers\Api\Application; +use App\Models\Allocation; use App\Models\Node; use App\Models\Server; use League\Fractal\Resource\Item; -use App\Models\Allocation; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class AllocationTransformer extends BaseTransformer { @@ -25,9 +24,9 @@ public function getResourceName(): string } /** - * Return a generic transformed allocation array. + * @param Allocation $allocation */ - public function transform(Allocation $allocation): array + public function transform($allocation): array { return [ 'id' => $allocation->id, @@ -41,12 +40,10 @@ public function transform(Allocation $allocation): array /** * Load the node relationship onto a given transformation. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeNode(Allocation $allocation): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_NODES)) { + if (!$this->authorize(Node::RESOURCE_NAME)) { return $this->null(); } @@ -59,12 +56,10 @@ public function includeNode(Allocation $allocation): Item|NullResource /** * Load the server relationship onto a given transformation. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeServer(Allocation $allocation): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS) || !$allocation->server) { + if (!$this->authorize(Server::RESOURCE_NAME) || !$allocation->server) { return $this->null(); } diff --git a/app/Transformers/Api/Application/BaseTransformer.php b/app/Transformers/Api/Application/BaseTransformer.php index 62ee4ceeb6..16395884b2 100644 --- a/app/Transformers/Api/Application/BaseTransformer.php +++ b/app/Transformers/Api/Application/BaseTransformer.php @@ -2,29 +2,28 @@ namespace App\Transformers\Api\Application; +use App\Models\ApiKey; +use App\Services\Acl\Api\AdminAcl; use Carbon\CarbonImmutable; use Carbon\CarbonInterface; -use Illuminate\Http\Request; -use Webmozart\Assert\Assert; -use App\Models\ApiKey; use Illuminate\Container\Container; -use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Request; use League\Fractal\TransformerAbstract; -use App\Services\Acl\Api\AdminAcl; +use Webmozart\Assert\Assert; -/** - * @method array transform(Model $model) - */ abstract class BaseTransformer extends TransformerAbstract { public const RESPONSE_TIMEZONE = 'UTC'; protected Request $request; - /** - * BaseTransformer constructor. - */ - public function __construct() + /** @var string[] */ + protected array $availableIncludes = []; + + /** @var string[] */ + protected array $defaultIncludes = []; + + final public function __construct() { // Transformers allow for dependency injection on the handle method. if (method_exists($this, 'handle')) { @@ -37,10 +36,17 @@ public function __construct() */ abstract public function getResourceName(): string; + /** + * @return array + * + * Transforms a Model into a representation that can be shown to regular users of the API. + */ + abstract public function transform($model): array; // @phpstan-ignore missingType.parameter + /** * Sets the request on the instance. */ - public function setRequest(Request $request): self + public function setRequest(Request $request): static { $this->request = $request; @@ -49,20 +55,16 @@ public function setRequest(Request $request): self /** * Returns a new transformer instance with the request set on the instance. - * - * @return static */ - public static function fromRequest(Request $request): self + public static function fromRequest(Request $request): static { - return app(static::class)->setRequest($request); + return (new static())->setRequest($request); } /** * Determine if the API key loaded onto the transformer has permission * to access a different resource. This is used when including other * models on a transformation request. - * - * @deprecated — prefer $user->can/cannot methods */ protected function authorize(string $resource): bool { @@ -89,12 +91,9 @@ protected function authorize(string $resource): bool * * @template T of \App\Transformers\Api\Application\BaseTransformer * - * @param class-string $abstract - * + * @param class-string $abstract * @return T * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException - * * @noinspection PhpDocSignatureInspection */ protected function makeTransformer(string $abstract) diff --git a/app/Transformers/Api/Application/DatabaseHostTransformer.php b/app/Transformers/Api/Application/DatabaseHostTransformer.php index 1a47b905a7..551fd19704 100644 --- a/app/Transformers/Api/Application/DatabaseHostTransformer.php +++ b/app/Transformers/Api/Application/DatabaseHostTransformer.php @@ -2,19 +2,17 @@ namespace App\Transformers\Api\Application; -use App\Models\Node; use App\Models\Database; use App\Models\DatabaseHost; -use League\Fractal\Resource\Item; +use App\Models\Node; use League\Fractal\Resource\Collection; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class DatabaseHostTransformer extends BaseTransformer { protected array $availableIncludes = [ 'databases', - 'node', + 'nodes', ]; /** @@ -26,9 +24,9 @@ public function getResourceName(): string } /** - * Transform database host into a representation for the application API. + * @param DatabaseHost $model */ - public function transform(DatabaseHost $model): array + public function transform($model): array { return [ 'id' => $model->id, @@ -36,7 +34,6 @@ public function transform(DatabaseHost $model): array 'host' => $model->host, 'port' => $model->port, 'username' => $model->username, - 'node' => $model->node_id, 'created_at' => $model->created_at->toAtomString(), 'updated_at' => $model->updated_at->toAtomString(), ]; @@ -44,12 +41,10 @@ public function transform(DatabaseHost $model): array /** * Include the databases associated with this host. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeDatabases(DatabaseHost $model): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVER_DATABASES)) { + if (!$this->authorize(Database::RESOURCE_NAME)) { return $this->null(); } @@ -59,18 +54,16 @@ public function includeDatabases(DatabaseHost $model): Collection|NullResource } /** - * Include the node associated with this host. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException + * Include the nodes associated with this host. */ - public function includeNode(DatabaseHost $model): Item|NullResource + public function includeNodes(DatabaseHost $model): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_NODES)) { + if (!$this->authorize(Node::RESOURCE_NAME)) { return $this->null(); } - $model->loadMissing('node'); + $model->loadMissing('nodes'); - return $this->item($model->getRelation('node'), $this->makeTransformer(NodeTransformer::class), Node::RESOURCE_NAME); + return $this->collection($model->getRelation('nodes'), $this->makeTransformer(NodeTransformer::class), Node::RESOURCE_NAME); } } diff --git a/app/Transformers/Api/Application/EggTransformer.php b/app/Transformers/Api/Application/EggTransformer.php index 982482b8c3..947a4613a5 100644 --- a/app/Transformers/Api/Application/EggTransformer.php +++ b/app/Transformers/Api/Application/EggTransformer.php @@ -2,13 +2,12 @@ namespace App\Transformers\Api\Application; -use Illuminate\Support\Arr; use App\Models\Egg; -use App\Models\Server; use App\Models\EggVariable; +use App\Models\Server; +use Illuminate\Support\Arr; use League\Fractal\Resource\Collection; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class EggTransformer extends BaseTransformer { @@ -31,16 +30,13 @@ public function getResourceName(): string } /** - * Transform an Egg model into a representation that can be consumed by - * the application api. - * - * @throws \JsonException + * @param Egg $model */ - public function transform(Egg $model): array + public function transform($model): array { $model->loadMissing('configFrom'); - $files = json_decode($model->inherit_config_files, true, 512, JSON_THROW_ON_ERROR); + $files = json_decode($model->inherit_config_files ?: '{}', true, 512, JSON_THROW_ON_ERROR); $model->loadMissing('scriptFrom'); @@ -50,20 +46,21 @@ public function transform(Egg $model): array 'name' => $model->name, 'author' => $model->author, 'description' => $model->description, - // "docker_image" is deprecated, but left here to avoid breaking too many things at once - // in external software. We'll remove it down the road once things have gotten the chance - // to upgrade to using "docker_images". - 'docker_image' => count($model->docker_images) > 0 ? Arr::first($model->docker_images) : '', + 'image' => $model->image, + 'features' => $model->features, + 'tags' => $model->tags, + 'docker_image' => Arr::first($model->docker_images, default: ''), // docker_images, use startup_commands 'docker_images' => $model->docker_images, 'config' => [ 'files' => $files, - 'startup' => json_decode($model->inherit_config_startup, true), + 'startup' => json_decode($model->inherit_config_startup ?: '{}', true), 'stop' => $model->inherit_config_stop, - 'logs' => json_decode($model->inherit_config_logs, true), + 'logs' => json_decode($model->inherit_config_logs ?: '{}', true), 'file_denylist' => $model->inherit_file_denylist, 'extends' => $model->config_from, ], - 'startup' => $model->startup, + 'startup' => Arr::first($model->startup_commands, default: ''), // deprecated, use startup_commands + 'startup_commands' => $model->startup_commands, 'script' => [ 'privileged' => $model->script_is_privileged, 'install' => $model->copy_script_install, @@ -78,12 +75,10 @@ public function transform(Egg $model): array /** * Include the Servers relationship for the given Egg in the transformation. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeServers(Egg $model): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS)) { + if (!$this->authorize(Server::RESOURCE_NAME)) { return $this->null(); } @@ -94,12 +89,10 @@ public function includeServers(Egg $model): Collection|NullResource /** * Include the variables that are defined for this Egg. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeVariables(Egg $model): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_EGGS)) { + if (!$this->authorize(Egg::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/EggVariableTransformer.php b/app/Transformers/Api/Application/EggVariableTransformer.php index 381b3102e1..af83208448 100644 --- a/app/Transformers/Api/Application/EggVariableTransformer.php +++ b/app/Transformers/Api/Application/EggVariableTransformer.php @@ -15,7 +15,10 @@ public function getResourceName(): string return Egg::RESOURCE_NAME; } - public function transform(EggVariable $model) + /** + * @param EggVariable $model + */ + public function transform($model): array { return $model->toArray(); } diff --git a/app/Transformers/Api/Application/MountTransformer.php b/app/Transformers/Api/Application/MountTransformer.php index c658f30fa2..91e51ca6c9 100644 --- a/app/Transformers/Api/Application/MountTransformer.php +++ b/app/Transformers/Api/Application/MountTransformer.php @@ -2,10 +2,12 @@ namespace App\Transformers\Api\Application; +use App\Models\Egg; use App\Models\Mount; +use App\Models\Node; +use App\Models\Server; use League\Fractal\Resource\Collection; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class MountTransformer extends BaseTransformer { @@ -22,19 +24,20 @@ public function getResourceName(): string return Mount::RESOURCE_NAME; } - public function transform(Mount $model) + /** + * @param Mount $model + */ + public function transform($model): array { return $model->toArray(); } /** * Return the eggs associated with this mount. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeEggs(Mount $mount): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_EGGS)) { + if (!$this->authorize(Egg::RESOURCE_NAME)) { return $this->null(); } @@ -49,12 +52,10 @@ public function includeEggs(Mount $mount): Collection|NullResource /** * Return the nodes associated with this mount. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeNodes(Mount $mount): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_NODES)) { + if (!$this->authorize(Node::RESOURCE_NAME)) { return $this->null(); } @@ -69,12 +70,10 @@ public function includeNodes(Mount $mount): Collection|NullResource /** * Return the servers associated with this mount. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeServers(Mount $mount): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS)) { + if (!$this->authorize(Server::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/NodeTransformer.php b/app/Transformers/Api/Application/NodeTransformer.php index 670e4bcac5..b30bdc425c 100644 --- a/app/Transformers/Api/Application/NodeTransformer.php +++ b/app/Transformers/Api/Application/NodeTransformer.php @@ -2,10 +2,11 @@ namespace App\Transformers\Api\Application; +use App\Models\Allocation; use App\Models\Node; +use App\Models\Server; use League\Fractal\Resource\Collection; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class NodeTransformer extends BaseTransformer { @@ -23,9 +24,9 @@ public function getResourceName(): string } /** - * Return a node transformed into a format that can be consumed by the external administrative API. + * @param Node $node */ - public function transform(Node $node): array + public function transform($node): array { $response = collect($node->toArray()) ->mapWithKeys(fn ($value, $key) => [snake_case($key) => $value]) @@ -47,12 +48,10 @@ public function transform(Node $node): array /** * Return the nodes associated with this location. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeAllocations(Node $node): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_ALLOCATIONS)) { + if (!$this->authorize(Allocation::RESOURCE_NAME)) { return $this->null(); } @@ -67,12 +66,10 @@ public function includeAllocations(Node $node): Collection|NullResource /** * Return the nodes associated with this location. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeServers(Node $node): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS)) { + if (!$this->authorize(Server::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/PluginTransformer.php b/app/Transformers/Api/Application/PluginTransformer.php new file mode 100644 index 0000000000..1018e038fc --- /dev/null +++ b/app/Transformers/Api/Application/PluginTransformer.php @@ -0,0 +1,47 @@ + $model->id, + 'name' => $model->name, + 'author' => $model->author, + 'version' => $model->version, + 'description' => $model->description, + 'category' => $model->category, + 'url' => $model->url, + 'update_url' => $model->update_url, + 'namespace' => $model->namespace, + 'class' => $model->class, + 'panels' => $model->panels ? explode(',', $model->panels) : null, + 'panel_version' => $model->panel_version, + 'composer_packages' => $model->composer_packages ? json_decode($model->composer_packages, true, 512, JSON_THROW_ON_ERROR) : null, + 'meta' => [ + 'status' => $model->status, + 'status_message' => $model->status_message, + 'load_order' => $model->load_order, + 'is_compatible' => $model->isCompatible(), + 'update_available' => $model->isUpdateAvailable(), + 'can_enable' => $model->canEnable(), + 'can_disable' => $model->canDisable(), + ], + ]; + } +} diff --git a/app/Transformers/Api/Application/RolePermissionTransformer.php b/app/Transformers/Api/Application/RolePermissionTransformer.php index 16d9cc6cb0..a0b24a5c3e 100644 --- a/app/Transformers/Api/Application/RolePermissionTransformer.php +++ b/app/Transformers/Api/Application/RolePermissionTransformer.php @@ -11,7 +11,10 @@ public function getResourceName(): string return 'permissions'; } - public function transform(Permission $model): array + /** + * @param Permission $model + */ + public function transform($model): array { return [ 'name' => $model->name, diff --git a/app/Transformers/Api/Application/RoleTransformer.php b/app/Transformers/Api/Application/RoleTransformer.php index fd57a3ee13..1eb5047d6d 100644 --- a/app/Transformers/Api/Application/RoleTransformer.php +++ b/app/Transformers/Api/Application/RoleTransformer.php @@ -21,9 +21,9 @@ public function getResourceName(): string } /** - * Transform role into a representation for the application API. + * @param Role $model */ - public function transform(Role $model): array + public function transform($model): array { return [ 'id' => $model->id, @@ -35,8 +35,6 @@ public function transform(Role $model): array /** * Include the permissions associated with this role. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includePermissions(Role $model): Collection|NullResource { diff --git a/app/Transformers/Api/Application/ServerDatabaseTransformer.php b/app/Transformers/Api/Application/ServerDatabaseTransformer.php index e74cd25863..e7ad4cb8eb 100644 --- a/app/Transformers/Api/Application/ServerDatabaseTransformer.php +++ b/app/Transformers/Api/Application/ServerDatabaseTransformer.php @@ -3,10 +3,9 @@ namespace App\Transformers\Api\Application; use App\Models\Database; -use League\Fractal\Resource\Item; use App\Models\DatabaseHost; +use League\Fractal\Resource\Item; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class ServerDatabaseTransformer extends BaseTransformer { @@ -21,9 +20,9 @@ public function getResourceName(): string } /** - * Transform a database model in a representation for the application API. + * @param Database $model */ - public function transform(Database $model): array + public function transform($model): array { return [ 'id' => $model->id, @@ -52,12 +51,10 @@ public function includePassword(Database $model): Item /** * Return the database host relationship for this server database. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeHost(Database $model): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_DATABASE_HOSTS)) { + if (!$this->authorize(DatabaseHost::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/ServerTransformer.php b/app/Transformers/Api/Application/ServerTransformer.php index 90836cc248..de89d35645 100644 --- a/app/Transformers/Api/Application/ServerTransformer.php +++ b/app/Transformers/Api/Application/ServerTransformer.php @@ -2,12 +2,16 @@ namespace App\Transformers\Api\Application; +use App\Models\Allocation; +use App\Models\Database; +use App\Models\Egg; +use App\Models\Node; use App\Models\Server; -use League\Fractal\Resource\Item; +use App\Models\User; +use App\Services\Servers\EnvironmentService; use League\Fractal\Resource\Collection; +use League\Fractal\Resource\Item; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; -use App\Services\Servers\EnvironmentService; class ServerTransformer extends BaseTransformer { @@ -30,7 +34,7 @@ class ServerTransformer extends BaseTransformer /** * Perform dependency injection. */ - public function handle(EnvironmentService $environmentService) + public function handle(EnvironmentService $environmentService): void { $this->environmentService = $environmentService; } @@ -44,9 +48,9 @@ public function getResourceName(): string } /** - * Return a generic transformed server array. + * @param Server $server */ - public function transform(Server $server): array + public function transform($server): array { return [ 'id' => $server->getKey(), @@ -92,12 +96,10 @@ public function transform(Server $server): array /** * Return a generic array of allocations for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeAllocations(Server $server): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_ALLOCATIONS)) { + if (!$this->authorize(Allocation::RESOURCE_NAME)) { return $this->null(); } @@ -108,12 +110,10 @@ public function includeAllocations(Server $server): Collection|NullResource /** * Return a generic array of data about subusers for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeSubusers(Server $server): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_USERS)) { + if (!$this->authorize(User::RESOURCE_NAME)) { return $this->null(); } @@ -124,12 +124,10 @@ public function includeSubusers(Server $server): Collection|NullResource /** * Return a generic array of data about subusers for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeUser(Server $server): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_USERS)) { + if (!$this->authorize(User::RESOURCE_NAME)) { return $this->null(); } @@ -140,12 +138,10 @@ public function includeUser(Server $server): Item|NullResource /** * Return a generic array with egg information for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeEgg(Server $server): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_EGGS)) { + if (!$this->authorize(Egg::RESOURCE_NAME)) { return $this->null(); } @@ -156,12 +152,10 @@ public function includeEgg(Server $server): Item|NullResource /** * Return a generic array of data about subusers for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeVariables(Server $server): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS)) { + if (!$this->authorize(Server::RESOURCE_NAME)) { return $this->null(); } @@ -172,12 +166,10 @@ public function includeVariables(Server $server): Collection|NullResource /** * Return a generic array with node information for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeNode(Server $server): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_NODES)) { + if (!$this->authorize(Node::RESOURCE_NAME)) { return $this->null(); } @@ -188,12 +180,10 @@ public function includeNode(Server $server): Item|NullResource /** * Return a generic array with database information for this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeDatabases(Server $server): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVER_DATABASES)) { + if (!$this->authorize(Database::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/ServerVariableTransformer.php b/app/Transformers/Api/Application/ServerVariableTransformer.php index 555fed2289..55963440b9 100644 --- a/app/Transformers/Api/Application/ServerVariableTransformer.php +++ b/app/Transformers/Api/Application/ServerVariableTransformer.php @@ -2,10 +2,10 @@ namespace App\Transformers\Api\Application; -use League\Fractal\Resource\Item; +use App\Models\Egg; use App\Models\EggVariable; +use League\Fractal\Resource\Item; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class ServerVariableTransformer extends BaseTransformer { @@ -23,21 +23,19 @@ public function getResourceName(): string } /** - * Return a generic transformed server variable array. + * @param EggVariable $variable */ - public function transform(EggVariable $variable): array + public function transform($variable): array { return $variable->toArray(); } /** * Return the parent service variable data. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeParent(EggVariable $variable): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_EGGS)) { + if (!$this->authorize(Egg::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/SubuserTransformer.php b/app/Transformers/Api/Application/SubuserTransformer.php index 5cec29b339..d916e6c129 100644 --- a/app/Transformers/Api/Application/SubuserTransformer.php +++ b/app/Transformers/Api/Application/SubuserTransformer.php @@ -2,10 +2,11 @@ namespace App\Transformers\Api\Application; +use App\Models\Server; use App\Models\Subuser; +use App\Models\User; use League\Fractal\Resource\Item; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class SubuserTransformer extends BaseTransformer { @@ -23,9 +24,9 @@ public function getResourceName(): string } /** - * Return a transformed Subuser model that can be consumed by external services. + * @param Subuser $subuser */ - public function transform(Subuser $subuser): array + public function transform($subuser): array { return [ 'id' => $subuser->id, @@ -39,12 +40,10 @@ public function transform(Subuser $subuser): array /** * Return a generic item of user for this subuser. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeUser(Subuser $subuser): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_USERS)) { + if (!$this->authorize(User::RESOURCE_NAME)) { return $this->null(); } @@ -55,12 +54,10 @@ public function includeUser(Subuser $subuser): Item|NullResource /** * Return a generic item of server for this subuser. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeServer(Subuser $subuser): Item|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS)) { + if (!$this->authorize(Server::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Application/UserTransformer.php b/app/Transformers/Api/Application/UserTransformer.php index 5cf800c08a..f3da7cc49b 100644 --- a/app/Transformers/Api/Application/UserTransformer.php +++ b/app/Transformers/Api/Application/UserTransformer.php @@ -3,16 +3,13 @@ namespace App\Transformers\Api\Application; use App\Models\Role; +use App\Models\Server; use App\Models\User; use League\Fractal\Resource\Collection; use League\Fractal\Resource\NullResource; -use App\Services\Acl\Api\AdminAcl; class UserTransformer extends BaseTransformer { - /** - * List of resources that can be included. - */ protected array $availableIncludes = [ 'servers', 'roles', @@ -27,22 +24,21 @@ public function getResourceName(): string } /** - * Return a transformed User model that can be consumed by external services. + * @param User $user */ - public function transform(User $user): array + public function transform($user): array { return [ 'id' => $user->id, 'external_id' => $user->external_id, + 'is_managed_externally' => $user->is_managed_externally, 'uuid' => $user->uuid, 'username' => $user->username, 'email' => $user->email, - 'first_name' => $user->name_first, - 'last_name' => $user->name_last, 'language' => $user->language, 'root_admin' => $user->isRootAdmin(), - '2fa_enabled' => (bool) $user->use_totp, - '2fa' => (bool) $user->use_totp, // deprecated, use "2fa_enabled" + '2fa_enabled' => filled($user->mfa_app_secret), + '2fa' => filled($user->mfa_app_secret), // deprecated, use "2fa_enabled" 'created_at' => $this->formatTimestamp($user->created_at), 'updated_at' => $this->formatTimestamp($user->updated_at), ]; @@ -50,12 +46,10 @@ public function transform(User $user): array /** * Return the servers associated with this user. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeServers(User $user): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_SERVERS)) { + if (!$this->authorize(Server::RESOURCE_NAME)) { return $this->null(); } @@ -66,12 +60,10 @@ public function includeServers(User $user): Collection|NullResource /** * Return the roles associated with this user. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeRoles(User $user): Collection|NullResource { - if (!$this->authorize(AdminAcl::RESOURCE_ROLES)) { + if (!$this->authorize(Role::RESOURCE_NAME)) { return $this->null(); } diff --git a/app/Transformers/Api/Client/ActivityLogTransformer.php b/app/Transformers/Api/Client/ActivityLogTransformer.php index 58d5f13ae5..631f9e21fb 100644 --- a/app/Transformers/Api/Client/ActivityLogTransformer.php +++ b/app/Transformers/Api/Client/ActivityLogTransformer.php @@ -2,10 +2,10 @@ namespace App\Transformers\Api\Client; -use Illuminate\Support\Str; -use App\Models\User; use App\Models\ActivityLog; +use App\Models\User; use Illuminate\Database\Eloquent\Model; +use League\Fractal\Resource\ResourceAbstract; class ActivityLogTransformer extends BaseClientTransformer { @@ -16,25 +16,27 @@ public function getResourceName(): string return ActivityLog::RESOURCE_NAME; } - public function transform(ActivityLog $model): array + /** + * @param ActivityLog $model + */ + public function transform($model): array { return [ // This is not for security, it is only to provide a unique identifier to // the front-end for each entry to improve rendering performance since there // is nothing else sufficiently unique to key off at this point. 'id' => sha1((string) $model->id), - 'batch' => $model->batch, 'event' => $model->event, 'is_api' => !is_null($model->api_key_id), 'ip' => $this->canViewIP($model->actor) ? $model->ip : null, 'description' => $model->description, - 'properties' => $this->properties($model), - 'has_additional_metadata' => $this->hasAdditionalMetadata($model), + 'properties' => $model->wrapProperties(), + 'has_additional_metadata' => $model->hasAdditionalMetadata(), 'timestamp' => $model->timestamp->toAtomString(), ]; } - public function includeActor(ActivityLog $model) + public function includeActor(ActivityLog $model): ResourceAbstract { if (!$model->actor instanceof User) { return $this->null(); @@ -43,76 +45,12 @@ public function includeActor(ActivityLog $model) return $this->item($model->actor, $this->makeTransformer(UserTransformer::class), User::RESOURCE_NAME); } - /** - * Transforms any array values in the properties into a countable field for easier - * use within the translation outputs. - */ - protected function properties(ActivityLog $model): object - { - if (!$model->properties || $model->properties->isEmpty()) { - return (object) []; - } - - $properties = $model->properties - ->mapWithKeys(function ($value, $key) use ($model) { - if ($key === 'ip' && $model->actor instanceof User && !$model->actor->is($this->request->user())) { - return [$key => '[hidden]']; - } - - if (!is_array($value)) { - // Perform some directory normalization at this point. - if ($key === 'directory') { - $value = str_replace('//', '/', '/' . trim($value, '/') . '/'); - } - - return [$key => $value]; - } - - return [$key => $value, "{$key}_count" => count($value)]; - }); - - $keys = $properties->keys()->filter(fn ($key) => Str::endsWith($key, '_count'))->values(); - if ($keys->containsOneItem()) { - $properties = $properties->merge(['count' => $properties->get($keys[0])])->except([$keys[0]]); - } - - return (object) $properties->toArray(); - } - - /** - * Determines if there are any log properties that we've not already exposed - * in the response language string and that are not just the IP address or - * the browser useragent. - * - * This is used by the front-end to selectively display an "additional metadata" - * button that is pointless if there is nothing the user can't already see from - * the event description. - */ - protected function hasAdditionalMetadata(ActivityLog $model): bool - { - if (is_null($model->properties) || $model->properties->isEmpty()) { - return false; - } - - $str = trans('activity.' . str_replace(':', '.', $model->event)); - preg_match_all('/:(?[\w.-]+\w)(?:[^\w:]?|$)/', $str, $matches); - - $exclude = array_merge($matches['key'], ['ip', 'useragent', 'using_sftp']); - foreach ($model->properties->keys() as $key) { - if (!in_array($key, $exclude, true)) { - return true; - } - } - - return false; - } - /** * Determines if the user can view the IP address in the output either because they are the * actor that performed the action, or because they are an administrator on the Panel. */ - protected function canViewIP(Model $actor = null): bool + protected function canViewIP(?Model $actor = null): bool { - return $actor?->is($this->request->user()) || $this->request->user()->isRootAdmin(); + return $actor?->is($this->request->user()) || $this->request->user()->can('seeIps activityLog'); } } diff --git a/app/Transformers/Api/Client/AllocationTransformer.php b/app/Transformers/Api/Client/AllocationTransformer.php index 4fd84ed61d..553412ec1d 100644 --- a/app/Transformers/Api/Client/AllocationTransformer.php +++ b/app/Transformers/Api/Client/AllocationTransformer.php @@ -14,7 +14,10 @@ public function getResourceName(): string return 'allocation'; } - public function transform(Allocation $model): array + /** + * @param Allocation $model + */ + public function transform($model): array { return [ 'id' => $model->id, diff --git a/app/Transformers/Api/Client/ApiKeyTransformer.php b/app/Transformers/Api/Client/ApiKeyTransformer.php index aadd81ac24..1d06b76e1a 100644 --- a/app/Transformers/Api/Client/ApiKeyTransformer.php +++ b/app/Transformers/Api/Client/ApiKeyTransformer.php @@ -15,9 +15,9 @@ public function getResourceName(): string } /** - * Transform this model into a representation that can be consumed by a client. + * @param ApiKey $model */ - public function transform(ApiKey $model): array + public function transform($model): array { return [ 'identifier' => $model->identifier, diff --git a/app/Transformers/Api/Client/BackupTransformer.php b/app/Transformers/Api/Client/BackupTransformer.php index eb5a6776e3..39b3ca8f7d 100644 --- a/app/Transformers/Api/Client/BackupTransformer.php +++ b/app/Transformers/Api/Client/BackupTransformer.php @@ -11,7 +11,10 @@ public function getResourceName(): string return Backup::RESOURCE_NAME; } - public function transform(Backup $backup): array + /** + * @param Backup $backup + */ + public function transform($backup): array { return [ 'uuid' => $backup->uuid, diff --git a/app/Transformers/Api/Client/BaseClientTransformer.php b/app/Transformers/Api/Client/BaseClientTransformer.php index c490d1bfdc..1225202726 100644 --- a/app/Transformers/Api/Client/BaseClientTransformer.php +++ b/app/Transformers/Api/Client/BaseClientTransformer.php @@ -2,10 +2,10 @@ namespace App\Transformers\Api\Client; -use App\Models\User; -use Webmozart\Assert\Assert; use App\Models\Server; +use App\Models\User; use App\Transformers\Api\Application\BaseTransformer as BaseApplicationTransformer; +use Webmozart\Assert\Assert; abstract class BaseClientTransformer extends BaseApplicationTransformer { @@ -24,7 +24,7 @@ public function getUser(): User * * @noinspection PhpParameterNameChangedDuringInheritanceInspection */ - protected function authorize(string $ability, Server $server = null): bool + protected function authorize(string $ability, ?Server $server = null): bool { Assert::isInstanceOf($server, Server::class); diff --git a/app/Transformers/Api/Client/DatabaseTransformer.php b/app/Transformers/Api/Client/DatabaseTransformer.php index 1a38559391..bca5def2a2 100644 --- a/app/Transformers/Api/Client/DatabaseTransformer.php +++ b/app/Transformers/Api/Client/DatabaseTransformer.php @@ -2,9 +2,9 @@ namespace App\Transformers\Api\Client; +use App\Enums\SubuserPermission; use App\Models\Database; use League\Fractal\Resource\Item; -use App\Models\Permission; use League\Fractal\Resource\NullResource; class DatabaseTransformer extends BaseClientTransformer @@ -16,7 +16,10 @@ public function getResourceName(): string return Database::RESOURCE_NAME; } - public function transform(Database $model): array + /** + * @param Database $model + */ + public function transform($model): array { $model->loadMissing('host'); @@ -38,7 +41,7 @@ public function transform(Database $model): array */ public function includePassword(Database $database): Item|NullResource { - if (!$this->request->user()->can(Permission::ACTION_DATABASE_VIEW_PASSWORD, $database->server)) { + if (!$this->request->user()->can(SubuserPermission::DatabaseViewPassword, $database->server)) { return $this->null(); } diff --git a/app/Transformers/Api/Client/EggTransformer.php b/app/Transformers/Api/Client/EggTransformer.php index 78d6e7de46..cefc3c7e62 100644 --- a/app/Transformers/Api/Client/EggTransformer.php +++ b/app/Transformers/Api/Client/EggTransformer.php @@ -14,7 +14,10 @@ public function getResourceName(): string return Egg::RESOURCE_NAME; } - public function transform(Egg $egg): array + /** + * @param Egg $egg + */ + public function transform($egg): array { return [ 'uuid' => $egg->uuid, diff --git a/app/Transformers/Api/Client/EggVariableTransformer.php b/app/Transformers/Api/Client/EggVariableTransformer.php index 141f43b618..231c534e1d 100644 --- a/app/Transformers/Api/Client/EggVariableTransformer.php +++ b/app/Transformers/Api/Client/EggVariableTransformer.php @@ -3,6 +3,7 @@ namespace App\Transformers\Api\Client; use App\Models\EggVariable; +use BadMethodCallException; class EggVariableTransformer extends BaseClientTransformer { @@ -11,13 +12,16 @@ public function getResourceName(): string return EggVariable::RESOURCE_NAME; } - public function transform(EggVariable $variable): array + /** + * @param EggVariable $variable + */ + public function transform($variable): array { // This guards against someone incorrectly retrieving variables (haha, me) and then passing // them into the transformer and along to the user. Just throw an exception and break the entire // pathway since you should never be exposing these types of variables to a client. if (!$variable->user_viewable) { - throw new \BadMethodCallException('Cannot transform a hidden egg variable in a client transformer.'); + throw new BadMethodCallException('Cannot transform a hidden egg variable in a client transformer.'); } return [ diff --git a/app/Transformers/Api/Client/FileObjectTransformer.php b/app/Transformers/Api/Client/FileObjectTransformer.php index d55b9f6ae3..b8ebdbd569 100644 --- a/app/Transformers/Api/Client/FileObjectTransformer.php +++ b/app/Transformers/Api/Client/FileObjectTransformer.php @@ -8,9 +8,19 @@ class FileObjectTransformer extends BaseClientTransformer { /** - * Transform a file object response from the daemon into a standardized response. + * @param array{ + * name: string, + * mode: string, + * mode_bits: mixed, + * size: int, + * file: bool, + * symlink: bool, + * mime: string, + * created: mixed, + * modified: mixed, + * } $item */ - public function transform(array $item): array + public function transform($item): array { return [ 'name' => Arr::get($item, 'name'), diff --git a/app/Transformers/Api/Client/ScheduleTransformer.php b/app/Transformers/Api/Client/ScheduleTransformer.php index 3cf6055bef..c2d4eecc8a 100644 --- a/app/Transformers/Api/Client/ScheduleTransformer.php +++ b/app/Transformers/Api/Client/ScheduleTransformer.php @@ -2,8 +2,8 @@ namespace App\Transformers\Api\Client; -use App\Models\Task; use App\Models\Schedule; +use App\Models\Task; use League\Fractal\Resource\Collection; class ScheduleTransformer extends BaseClientTransformer @@ -21,9 +21,9 @@ public function getResourceName(): string } /** - * Returns a transformed schedule model such that a client can view the information. + * @param Schedule $model */ - public function transform(Schedule $model): array + public function transform($model): array { return [ 'id' => $model->id, @@ -47,8 +47,6 @@ public function transform(Schedule $model): array /** * Allows attaching the tasks specific to the schedule in the response. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeTasks(Schedule $model): Collection { diff --git a/app/Transformers/Api/Client/ServerTransformer.php b/app/Transformers/Api/Client/ServerTransformer.php index df8a36bb9b..1763ef91bc 100644 --- a/app/Transformers/Api/Client/ServerTransformer.php +++ b/app/Transformers/Api/Client/ServerTransformer.php @@ -2,10 +2,10 @@ namespace App\Transformers\Api\Client; +use App\Enums\SubuserPermission; use App\Models\Allocation; use App\Models\Egg; use App\Models\EggVariable; -use App\Models\Permission; use App\Models\Server; use App\Models\Subuser; use App\Services\Servers\StartupCommandService; @@ -26,12 +26,11 @@ public function getResourceName(): string } /** - * Transform a server model into a representation that can be returned - * to a client. + * @param Server $server */ - public function transform(Server $server): array + public function transform($server): array { - /** @var \App\Services\Servers\StartupCommandService $service */ + /** @var StartupCommandService $service */ $service = Container::getInstance()->make(StartupCommandService::class); $user = $this->request->user(); @@ -61,7 +60,7 @@ public function transform(Server $server): array 'oom_disabled' => !$server->oom_killer, 'oom_killer' => $server->oom_killer, ], - 'invocation' => $service->handle($server, !$user->can(Permission::ACTION_STARTUP_READ, $server)), + 'invocation' => $service->handle($server, hideAllValues: !$user->can(SubuserPermission::StartupRead, $server)), 'docker_image' => $server->image, 'egg_features' => $server->egg->inherit_features, 'feature_limits' => [ @@ -86,8 +85,6 @@ public function transform(Server $server): array /** * Returns the allocations associated with this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeAllocations(Server $server): Collection { @@ -101,7 +98,7 @@ public function includeAllocations(Server $server): Collection // // This allows us to avoid too much permission regression, without also hiding information that // is generally needed for the frontend to make sense when browsing or searching results. - if (!$user->can(Permission::ACTION_ALLOCATION_READ, $server)) { + if (!$user->can(SubuserPermission::AllocationRead, $server)) { $primary = clone $server->allocation; $primary->notes = null; @@ -111,12 +108,9 @@ public function includeAllocations(Server $server): Collection return $this->collection($server->allocations, $transformer, Allocation::RESOURCE_NAME); } - /** - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException - */ public function includeVariables(Server $server): Collection|NullResource { - if (!$this->request->user()->can(Permission::ACTION_STARTUP_READ, $server)) { + if (!$this->request->user()->can(SubuserPermission::StartupRead, $server)) { return $this->null(); } @@ -129,8 +123,6 @@ public function includeVariables(Server $server): Collection|NullResource /** * Returns the egg associated with this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeEgg(Server $server): Item { @@ -139,12 +131,10 @@ public function includeEgg(Server $server): Item /** * Returns the subusers associated with this server. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeSubusers(Server $server): Collection|NullResource { - if (!$this->request->user()->can(Permission::ACTION_USER_READ, $server)) { + if (!$this->request->user()->can(SubuserPermission::UserRead, $server)) { return $this->null(); } diff --git a/app/Transformers/Api/Client/StatsTransformer.php b/app/Transformers/Api/Client/StatsTransformer.php index 40949d8e89..d7273c1eee 100644 --- a/app/Transformers/Api/Client/StatsTransformer.php +++ b/app/Transformers/Api/Client/StatsTransformer.php @@ -12,10 +12,20 @@ public function getResourceName(): string } /** - * Transform stats from the daemon into a result set that can be used in - * the client API. + * @param array{ + * state: string, + * is_suspended: bool, + * utilization: array{ + * memory_bytes: int, + * cpu_absolute: int, + * disk_bytes: int, + * rx_bytes: int, + * tx_bytes: int, + * uptime: int, + * }, + * } $data */ - public function transform(array $data): array + public function transform($data): array { return [ 'current_state' => Arr::get($data, 'state', 'stopped'), diff --git a/app/Transformers/Api/Client/SubuserTransformer.php b/app/Transformers/Api/Client/SubuserTransformer.php index 6f671e780f..9fc7e18122 100644 --- a/app/Transformers/Api/Client/SubuserTransformer.php +++ b/app/Transformers/Api/Client/SubuserTransformer.php @@ -15,11 +15,9 @@ public function getResourceName(): string } /** - * Transforms a subuser into a model that can be shown to a front-end user. - * - * @throws \App\Exceptions\Transformer\InvalidTransformerLevelException + * @param Subuser $model */ - public function transform(Subuser $model): array + public function transform($model): array { return array_merge( $this->makeTransformer(UserTransformer::class)->transform($model->user), diff --git a/app/Transformers/Api/Client/TaskTransformer.php b/app/Transformers/Api/Client/TaskTransformer.php index 3e95577ea7..3710bec19a 100644 --- a/app/Transformers/Api/Client/TaskTransformer.php +++ b/app/Transformers/Api/Client/TaskTransformer.php @@ -15,9 +15,9 @@ public function getResourceName(): string } /** - * Transforms a schedule's task into a client viewable format. + * @param Task $model */ - public function transform(Task $model): array + public function transform($model): array { return [ 'id' => $model->id, diff --git a/app/Transformers/Api/Client/UserSSHKeyTransformer.php b/app/Transformers/Api/Client/UserSSHKeyTransformer.php index ce153904e8..880bba220a 100644 --- a/app/Transformers/Api/Client/UserSSHKeyTransformer.php +++ b/app/Transformers/Api/Client/UserSSHKeyTransformer.php @@ -12,9 +12,9 @@ public function getResourceName(): string } /** - * Return's a user's SSH key in an API response format. + * @param UserSSHKey $model */ - public function transform(UserSSHKey $model): array + public function transform($model): array { return [ 'name' => $model->name, diff --git a/app/Transformers/Api/Client/UserTransformer.php b/app/Transformers/Api/Client/UserTransformer.php index f875463e56..a12bb2879b 100644 --- a/app/Transformers/Api/Client/UserTransformer.php +++ b/app/Transformers/Api/Client/UserTransformer.php @@ -2,8 +2,8 @@ namespace App\Transformers\Api\Client; -use Illuminate\Support\Str; use App\Models\User; +use Illuminate\Support\Str; class UserTransformer extends BaseClientTransformer { @@ -16,22 +16,21 @@ public function getResourceName(): string } /** - * Transforms a User model into a representation that can be shown to regular - * users of the API. + * @param User $user + * + * {@inheritdoc} */ - public function transform(User $user): array + public function transform($user): array { return [ 'uuid' => $user->uuid, 'username' => $user->username, 'email' => $user->email, - 'first_name' => $user->name_first, - 'last_name' => $user->name_last, 'language' => $user->language, 'image' => 'https://gravatar.com/avatar/' . md5(Str::lower($user->email)), // deprecated 'admin' => $user->isRootAdmin(), // deprecated, use "root_admin" 'root_admin' => $user->isRootAdmin(), - '2fa_enabled' => (bool) $user->use_totp, + '2fa_enabled' => filled($user->mfa_app_secret), 'created_at' => $this->formatTimestamp($user->created_at), 'updated_at' => $this->formatTimestamp($user->updated_at), ]; diff --git a/app/helpers.php b/app/helpers.php index 2e21fc7280..d258fd2b3e 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -17,3 +17,122 @@ function is_ip(?string $address): bool return $address !== null && filter_var($address, FILTER_VALIDATE_IP) !== false; } } + +if (!function_exists('is_ipv4')) { + function is_ipv4(?string $address): bool + { + return $address !== null && filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false; + } +} + +if (!function_exists('is_ipv6')) { + function is_ipv6(?string $address): bool + { + return $address !== null && filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false; + } +} + +if (!function_exists('convert_bytes_to_readable')) { + function convert_bytes_to_readable(int $bytes, int $decimals = 2, ?int $base = null): string + { + $conversionUnit = config('panel.use_binary_prefix') ? 1024 : 1000; + $suffix = config('panel.use_binary_prefix') ? ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB'] : ['Bytes', 'KB', 'MB', 'GB', 'TB']; + + if ($bytes <= 0) { + return '0 ' . $suffix[0]; + } + + $fromBase = log($bytes) / log($conversionUnit); + $base ??= floor($fromBase); + + return format_number(pow($conversionUnit, $fromBase - $base), precision: $decimals) . ' ' . $suffix[$base]; + } +} + +if (!function_exists('join_paths')) { + function join_paths(string $base, string ...$paths): string + { + $base = rtrim($base, '/'); + + $paths = array_map(fn (string $path) => trim($path, '/'), $paths); + $paths = array_filter($paths, fn (string $path) => strlen($path) > 0); + + if (empty($base)) { + return implode('/', $paths); + } + + return $base . '/' . implode('/', $paths); + } +} + +if (!function_exists('resolve_path')) { + function resolve_path(string $path): string + { + $parts = array_filter(explode('/', $path), fn (string $p) => strlen($p) > 0); + + $absolutes = []; + foreach ($parts as $part) { + if ($part == '.') { + continue; + } + + if ($part == '..') { + array_pop($absolutes); + } else { + $absolutes[] = $part; + } + } + + return implode('/', $absolutes); + } +} + +if (!function_exists('plugin_path')) { + function plugin_path(string $plugin, string ...$paths): string + { + return join_paths(base_path('plugins'), $plugin, implode('/', $paths)); + } +} + +if (!function_exists('get_ip_from_hostname')) { + function get_ip_from_hostname(string $hostname): string|bool + { + $validARecords = @dns_get_record($hostname, DNS_A); + if ($validARecords) { + return collect($validARecords)->first()['ip']; + } + + $validAAAARecords = @dns_get_record($hostname, DNS_AAAA); + if ($validAAAARecords) { + return collect($validAAAARecords)->first()['ipv6']; + } + + return false; + } +} + +if (!function_exists('format_number')) { + function format_number(int|float $number, ?int $precision = null, ?int $maxPrecision = null): false|string + { + try { + return Number::format($number, $precision, $maxPrecision, user()->language ?? 'en'); + } catch (Throwable) { + // User language is invalid, so default to english + return Number::format($number, $precision, $maxPrecision, 'en'); + } + } +} + +if (!function_exists('encode_path')) { + function encode_path(string $path): string + { + return implode('/', array_map('rawurlencode', explode('/', $path))); + } +} + +if (!function_exists('user')) { + function user(): ?App\Models\User + { + return auth(config('auth.defaults.guard', 'web'))->user(); + } +} diff --git a/artisan b/artisan index 8e04b42240..c35e31d6a2 100755 --- a/artisan +++ b/artisan @@ -1,6 +1,7 @@ #!/usr/bin/env php handleCommand(new ArgvInput); +/** @var Application $app */ +$app = require_once __DIR__.'/bootstrap/app.php'; + +$status = $app->handleCommand(new ArgvInput); exit($status); diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 808bb186f9..0000000000 --- a/babel.config.js +++ /dev/null @@ -1,34 +0,0 @@ -module.exports = function (api) { - let targets = {}; - const plugins = [ - 'babel-plugin-macros', - 'styled-components', - 'react-hot-loader/babel', - '@babel/transform-runtime', - '@babel/transform-react-jsx', - '@babel/proposal-class-properties', - '@babel/proposal-object-rest-spread', - '@babel/proposal-optional-chaining', - '@babel/proposal-nullish-coalescing-operator', - '@babel/syntax-dynamic-import', - ]; - - if (api.env('test')) { - targets = { node: 'current' }; - plugins.push('@babel/transform-modules-commonjs'); - } - - return { - plugins, - presets: [ - '@babel/typescript', - ['@babel/env', { - modules: false, - useBuiltIns: 'entry', - corejs: 3, - targets, - }], - '@babel/react', - ] - }; -}; diff --git a/bootstrap/app.php b/bootstrap/app.php index 18295a393b..cd5ca70057 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -5,15 +5,12 @@ use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) - ->withProviders([ - \Prologue\Alerts\AlertsServiceProvider::class, - ]) + ->withProviders() ->withRouting( - commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { - $middleware->redirectGuestsTo(fn () => route('auth.login')); + $middleware->redirectGuestsTo(fn () => route('filament.app.auth.login')); $middleware->web(\App\Http\Middleware\LanguageMiddleware::class); @@ -22,7 +19,6 @@ 'auth:sanctum', \App\Http\Middleware\Api\IsValidJson::class, \App\Http\Middleware\Activity\TrackAPIKey::class, - \App\Http\Middleware\RequireTwoFactorAuthentication::class, \App\Http\Middleware\Api\AuthenticateIPAccess::class, ]); @@ -47,14 +43,15 @@ 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'node.maintenance' => \App\Http\Middleware\MaintenanceMiddleware::class, - 'recaptcha' => \App\Http\Middleware\VerifyReCaptcha::class, + ]); + + $middleware->priority([ + \Illuminate\Routing\Middleware\SubstituteBindings::class, ]); }) ->withSingletons([ \Illuminate\Contracts\Console\Kernel::class => \App\Console\Kernel::class, \Illuminate\Contracts\Debug\ExceptionHandler::class => \App\Exceptions\Handler::class, ]) - ->withExceptions(function (Exceptions $exceptions) { - - }) + ->withExceptions(function (Exceptions $exceptions) {}) ->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore old mode 100644 new mode 100755 diff --git a/bootstrap/providers.php b/bootstrap/providers.php index a20d8785c2..c1f98d09de 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -5,8 +5,15 @@ App\Providers\AppServiceProvider::class, App\Providers\BackupsServiceProvider::class, App\Providers\EventServiceProvider::class, + App\Providers\Extensions\AvatarServiceProvider::class, + App\Providers\Extensions\CaptchaServiceProvider::class, + App\Providers\Extensions\FeatureServiceProvider::class, + App\Providers\Extensions\OAuthServiceProvider::class, + App\Providers\Extensions\TaskServiceProvider::class, + App\Providers\Filament\FilamentServiceProvider::class, App\Providers\Filament\AdminPanelProvider::class, + App\Providers\Filament\AppPanelProvider::class, + App\Providers\Filament\ServerPanelProvider::class, App\Providers\RouteServiceProvider::class, - App\Providers\ViewComposerServiceProvider::class, SocialiteProviders\Manager\ServiceProvider::class, ]; diff --git a/bootstrap/tests.php b/bootstrap/tests.php deleted file mode 100644 index a80e0b27f9..0000000000 --- a/bootstrap/tests.php +++ /dev/null @@ -1,45 +0,0 @@ -make(Kernel::class); - -/* - * Bootstrap the kernel and prepare application for testing. - */ -$kernel->bootstrap(); - -// Register the collision service provider so that errors during the test -// setup process are output nicely. -(new Provider())->register(); - -$output = new ConsoleOutput(); - -$prefix = 'database.connections.' . config('database.default'); -if (!Str::contains(config("$prefix.database"), 'test')) { - $output->writeln(PHP_EOL . 'Cannot run test process against non-testing database.'); - $output->writeln(PHP_EOL . 'Environment is currently pointed at: "' . config("$prefix.database") . '".'); - exit(1); -} - -/* - * Perform database migrations and reseeding before continuing with - * running the tests. - */ -if (!env('SKIP_MIGRATIONS')) { - $output->writeln(PHP_EOL . 'Refreshing database for Integration tests...'); - $kernel->call('migrate:fresh'); - - $output->writeln('Seeding database for Integration tests...' . PHP_EOL); - $kernel->call('db:seed'); -} else { - $output->writeln(PHP_EOL . 'Skipping database migrations...' . PHP_EOL); -} diff --git a/bounties.md b/bounties.md index 9f9dc890be..4382b45fd1 100644 --- a/bounties.md +++ b/bounties.md @@ -1,4 +1,4 @@ -# [Bounties](https://github.com/pelican-dev/panel/issues?q=is%3Aopen+is%3Aissue+label%3A%22%F0%9F%92%B5+bounty%22) +# [Bounties](https://github.com/pelican-dev/panel/issues?q=state%3Aopen%20is%3Aissue%20label%3A%22%F0%9F%92%B0%20fund%22) Get paid to improve Pelican! @@ -15,6 +15,6 @@ This is still valuable work, so we'll pay out $50 for getting any bounty closed ## Issue bounties -We've tagged bounty-eligible issues across openpilot and the rest of our repos; check out all the open ones [here](https://github.com/pelican-dev/panel/issues?q=is%3Aopen+is%3Aissue+label%3A%22%F0%9F%92%B5+bounty%22). +We've tagged bounty-eligible issues across openpilot and the rest of our repos; check out all the open ones [here](https://github.com/pelican-dev/panel/issues?q=state%3Aopen%20is%3Aissue%20label%3A%22%F0%9F%92%B0%20fund%22). New bounties can be proposed in the [**#feedback**](https://discord.com/channels/1218730176297439332/1218732581797892220) channel in Discord. diff --git a/compose-full-stack.yml b/compose-full-stack.yml new file mode 100644 index 0000000000..304f3a93c3 --- /dev/null +++ b/compose-full-stack.yml @@ -0,0 +1,96 @@ +x-common: + panel: + &panel-environment + APP_URL: "https://localhost" # can be set to 'http://localhost' on port 80 only + LE_EMAIL: "USEYOUROWNEMAILHERE@example.com" # email to be used for let's encrypt certificates + APP_DEBUG: "false" + APP_ENV: "production" + + # BEHIND_PROXY: true # uncomment to run behind a proxy + # TRUSTED_PROXIES: 127.0.0.1,172.17.0.1,172.20.0.1 # defaults are for local proxies + + mail: + &mail-environment + MAIL_DRIVER: "log" + # MAIL_HOST: "" + # MAIL_PORT: "" + # MAIL_FROM: "" + # MAIL_USERNAME: "" + # MAIL_PASSWORD: "" + # MAIL_SCHEME: "" + + database: + &db-environment + # Do not remove the "&db-password" from the end of the line below, it is important + # for Panel functionality. + MYSQL_ROOT_PASSWORD: "SUPERNEEDSTOCHANGE" + MYSQL_PASSWORD: &db-password "NEEDSTOCHANGE" + MYSQL_DATABASE: &db-database "panel" + MYSQL_USER: &db-username "pelican" + +# +# ------------------------------------------------------------------------------------------ +# DANGER ZONE BELOW +# +# The remainder of this file likely does not need to be changed. Please only make modifications +# below if you understand what you are doing. +# + +services: + database: + image: mariadb:10.11 + restart: always + command: --default-authentication-plugin=mysql_native_password + volumes: + - pelican-db:/var/lib/mysql + environment: + <<: *db-environment + + cache: + image: redis:alpine + restart: always + + panel: + image: ghcr.io/pelican-dev/panel:latest + build: . + restart: unless-stopped + networks: + - default + ports: + - "80:80" + - "443:443" + # - "81:80" # if you are behind a proxy uncomment this line and comment out 80 and 443 + # - "9000:9000" # enable when not using caddy to be able to reach php-fpm + links: + - database + - cache + extra_hosts: + - "host.docker.internal:host-gateway" # shows the panel on the internal docker network as well. usually '172.17.0.1' + volumes: + - pelican-data:/pelican-data + - pelican-logs:/var/www/html/storage/logs + environment: + <<: [*panel-environment, *mail-environment] + XDG_DATA_HOME: /pelican-data + # SKIP_CADDY: true # enable when not using caddy. + CACHE_STORE: "redis" + SESSION_DRIVER: "redis" + QUEUE_CONNECTION: "redis" + REDIS_HOST: "cache" + DB_CONNECTION: "mariadb" + DB_HOST: "database" + DB_PORT: "3306" + DB_DATABASE: *db-database + DB_USERNAME: *db-username + DB_PASSWORD: *db-password + +volumes: + pelican-data: + pelican-logs: + pelican-db: + +networks: + default: + ipam: + config: + - subnet: 172.20.0.0/16 diff --git a/compose.yml b/compose.yml index 23d2f2a397..86d16c0ef7 100644 --- a/compose.yml +++ b/compose.yml @@ -1,13 +1,13 @@ x-common: panel: &panel-environment - APP_URL: "https://localhost" # can be set to 'http://localhost' on port 80 only - ADMIN_EMAIL: "USEYOUROWNEMAILHERE@example.com" - + APP_URL: "http://localhost" + LE_EMAIL: "USEYOUROWNEMAILHERE@example.com" # email to be used for let's encrypt certificates APP_DEBUG: "false" - APP_ENVIRONMENT_ONLY: "false" APP_ENV: "production" - SESSION_DRIVER: "file" + + # BEHIND_PROXY: true # uncomment to run behind a proxy + # TRUSTED_PROXIES: 127.0.0.1,172.17.0.1,172.20.0.1 # defaults are for local proxies mail: &mail-environment @@ -17,7 +17,7 @@ x-common: # MAIL_FROM: "" # MAIL_USERNAME: "" # MAIL_PASSWORD: "" - # MAIL_ENCRYPTION: "" + # MAIL_SCHEME: "" # # ------------------------------------------------------------------------------------------ @@ -30,15 +30,17 @@ x-common: services: panel: image: ghcr.io/pelican-dev/panel:latest - restart: always + build: . + restart: unless-stopped networks: - default ports: - "80:80" - "443:443" - # - "9000:9000" # enable when not using caddy to be abel to reach php-fpm + # - "81:80" # if you are behind a proxy uncomment this line and comment out 80 and 443 + # - "9000:9000" # enable when not using caddy to be able to reach php-fpm extra_hosts: - - "host.docker.internal:host-gateway" # shows the panel on te internal docker network as well. usually '172.17.0.1' + - "host.docker.internal:host-gateway" # shows the panel on the internal docker network as well. usually '172.17.0.1' volumes: - pelican-data:/pelican-data - pelican-logs:/var/www/html/storage/logs diff --git a/composer.json b/composer.json index 6b44652ffc..42fae8cc1b 100644 --- a/composer.json +++ b/composer.json @@ -1,58 +1,61 @@ { "name": "pelican-dev/panel", "description": "The free, open-source game management panel. Supporting Minecraft, Spigot, BungeeCord, and SRCDS servers.", + "license": "AGPL-3.0-only", "require": { - "php": "^8.2 || ^8.3", + "php": "^8.2 || ^8.3 || ^8.4 || ^8.5", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-pdo": "*", "ext-zip": "*", - "abdelhamiderrahmouni/filament-monaco-editor": "0.2.1", - "aws/aws-sdk-php": "~3.288.1", - "chillerlan/php-qrcode": "^5.0.2", - "dedoc/scramble": "^0.10.0", - "doctrine/dbal": "~3.6.0", - "filament/filament": "^3.2", - "guzzlehttp/guzzle": "^7.8.1", - "laracasts/utilities": "~3.2.2", - "laravel/framework": "^11.7", - "laravel/helpers": "^1.7", - "laravel/sanctum": "^4.0.2", - "laravel/socialite": "^5.14", - "laravel/tinker": "^2.9", - "laravel/ui": "^4.5.1", - "lcobucci/jwt": "~4.3.0", - "league/flysystem-aws-s3-v3": "~3.12.2", - "league/flysystem-memory": "~3.10.3", + "aws/aws-sdk-php": "^3.370", + "calebporzio/sushi": "^2.5", + "dedoc/scramble": "^0.13", + "filament/filament": "^4.5", + "gboquizosanchez/filament-log-viewer": "^2.2", + "guzzlehttp/guzzle": "^7.10", + "laravel/framework": "^12.53", + "laravel/helpers": "^1.8", + "laravel/sanctum": "^4.3", + "laravel/socialite": "^5.24", + "laravel/tinker": "^2.10.1", + "laravel/ui": "^4.6", + "lcobucci/jwt": "^5.6", + "league/flysystem-aws-s3-v3": "^3.31", + "league/flysystem-memory": "^3.31", + "phiki/phiki": "^2.0", "phpseclib/phpseclib": "~3.0.18", - "pragmarx/google2fa": "~8.0.0", - "predis/predis": "~2.1.1", - "prologue/alerts": "^1.2", - "ryangjchandler/blade-tabler-icons": "^2.3", + "predis/predis": "^2.3", "s1lentium/iptools": "~1.2.0", + "secondnetwork/blade-tabler-icons": "^3.26", + "socialiteproviders/authentik": "^5.2", "socialiteproviders/discord": "^4.2", - "spatie/laravel-fractal": "^6.2", - "spatie/laravel-permission": "^6.9", - "spatie/laravel-query-builder": "^5.8.1", - "spatie/temporary-directory": "^2.2", - "symfony/http-client": "^7.1", - "symfony/mailgun-mailer": "^7.1", - "symfony/postmark-mailer": "^7.0.7", - "symfony/yaml": "^7.0.7", - "webbingbrasil/filament-copyactions": "^3.0.1", + "socialiteproviders/steam": "^4.3", + "spatie/laravel-data": "^4.19", + "spatie/laravel-fractal": "^6.4", + "spatie/laravel-health": "^1.38", + "spatie/laravel-permission": "^6.24", + "spatie/laravel-query-builder": "^6.4", + "spatie/temporary-directory": "^2.3", + "symfony/http-client": "^7.2", + "symfony/mailgun-mailer": "^7.2", + "symfony/postmark-mailer": "^7.2", + "symfony/yaml": "^7.2", "webmozart/assert": "~1.11.0" }, "require-dev": { - "barryvdh/laravel-ide-helper": "^3.0", + "barryvdh/laravel-ide-helper": "^3.6", "fakerphp/faker": "^1.23.1", - "larastan/larastan": "^2.9.6", + "larastan/larastan": "^3.4", + "laravel/pail": "^1.2.2", "laravel/pint": "^1.15.3", - "laravel/sail": "^1.29.1", + "laravel/sail": "^1.41", "mockery/mockery": "^1.6.11", - "nunomaduro/collision": "^8.1.1", - "phpunit/phpunit": "^10.5.20", - "spatie/laravel-ignition": "^2.7" + "nunomaduro/collision": "^8.6", + "pestphp/pest": "^3.7", + "pestphp/pest-plugin-faker": "^3.0", + "pestphp/pest-plugin-livewire": "^3.0" }, "autoload": { "files": [ @@ -70,23 +73,27 @@ } }, "scripts": { - "cs:fix": "php-cs-fixer fix", - "cs:check": "php-cs-fixer fix --dry-run --diff --verbose", + "pint": "pint", "phpstan": "phpstan --memory-limit=-1", "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump" + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan filament:upgrade" ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate --ansi" + "post-install-cmd": [ + "php -r \"file_exists('.env') || copy('.env.example', '.env');\"", + "php artisan p:plugin:composer" ] }, "config": { "optimize-autoloader": true, "preferred-install": "dist", - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true + }, + "platform": { + "php": "8.2" + } }, "minimum-stability": "stable", "prefer-stable": true diff --git a/composer.lock b/composer.lock index ca8c6f54ab..0983301157 100644 --- a/composer.lock +++ b/composer.lock @@ -4,117 +4,33 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c21f5c06eaf398480f33cb59dabd886a", + "content-hash": "fdc3f0889850e4f352008e80e362ee3e", "packages": [ - { - "name": "abdelhamiderrahmouni/filament-monaco-editor", - "version": "v0.2.1", - "source": { - "type": "git", - "url": "https://github.com/abdelhamiderrahmouni/filament-monaco-editor.git", - "reference": "3a74de11f74bee5b782df74c998c071c64a17ac0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/abdelhamiderrahmouni/filament-monaco-editor/zipball/3a74de11f74bee5b782df74c998c071c64a17ac0", - "reference": "3a74de11f74bee5b782df74c998c071c64a17ac0", - "shasum": "" - }, - "require": { - "filament/forms": "^3.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.15.0" - }, - "require-dev": { - "laravel/pint": "^1.0", - "nunomaduro/collision": "^7.9", - "nunomaduro/larastan": "^2.0.1", - "orchestra/testbench": "^8.0", - "pestphp/pest": "^2.1", - "pestphp/pest-plugin-arch": "^2.0", - "pestphp/pest-plugin-laravel": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/laravel-ray": "^1.26" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "AbdelhamidErrahmouni\\FilamentMonacoEditor\\MonacoEditorServiceProvider" - ], - "aliases": { - "MonacoEditor": "AbdelhamidErrahmouni\\FilamentMonacoEditor\\Facades\\MonacoEditor" - } - } - }, - "autoload": { - "psr-4": { - "AbdelhamidErrahmouni\\FilamentMonacoEditor\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Abdelhamid Errahmouni", - "email": "abdelhamid.errahmouni@gmail.com", - "role": "Developer" - } - ], - "description": "A monaco editor form field for filamentphp.", - "homepage": "https://github.com/abdelhamiderrahmouni/filament-monaco-editor", - "keywords": [ - "Abdelhamid Errahmouni", - "Monaco", - "code editor", - "filament monaco code editor", - "filament monaco editor", - "filamentphp", - "laravel", - "monaco editor", - "php" - ], - "support": { - "issues": "https://github.com/abdelhamiderrahmouni/filament-monaco-editor/issues", - "source": "https://github.com/abdelhamiderrahmouni/filament-monaco-editor" - }, - "funding": [ - { - "url": "https://github.com/AbdelhamidErrahmouni", - "type": "github" - } - ], - "time": "2024-04-20T01:01:49+00:00" - }, { "name": "anourvalar/eloquent-serialize", - "version": "1.2.25", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/AnourValar/eloquent-serialize.git", - "reference": "6d7a868ae4218b9d7796334ff9a17e1539bad48a" + "reference": "1a7dead8d532657e5358f8f27c0349373517681e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/6d7a868ae4218b9d7796334ff9a17e1539bad48a", - "reference": "6d7a868ae4218b9d7796334ff9a17e1539bad48a", + "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/1a7dead8d532657e5358f8f27c0349373517681e", + "reference": "1a7dead8d532657e5358f8f27c0349373517681e", "shasum": "" }, "require": { - "laravel/framework": "^8.0|^9.0|^10.0|^11.0", + "laravel/framework": "^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.4|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.26", "laravel/legacy-factories": "^1.1", - "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.5|^10.5", - "psalm/plugin-laravel": "^2.8", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^9.5|^10.5|^11.0", + "psalm/plugin-laravel": "^2.8|^3.0", "squizlabs/php_codesniffer": "^3.7" }, "type": "library", @@ -152,22 +68,22 @@ ], "support": { "issues": "https://github.com/AnourValar/eloquent-serialize/issues", - "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.2.25" + "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.5" }, - "time": "2024-09-16T12:59:37+00:00" + "time": "2025-12-04T13:38:21+00:00" }, { "name": "aws/aws-crt-php", - "version": "v1.2.5", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", "shasum": "" }, "require": { @@ -206,22 +122,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" }, - "time": "2024-04-19T21:30:56+00:00" + "time": "2024-10-18T22:15:13+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.288.1", + "version": "3.370.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "a1dfa12c7165de0b731ae8074c4ba1f3ae733f89" + "reference": "273a9bbed9e73016be390b8428f7925f15ea053e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a1dfa12c7165de0b731ae8074c4ba1f3ae733f89", - "reference": "a1dfa12c7165de0b731ae8074c4ba1f3ae733f89", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/273a9bbed9e73016be390b8428f7925f15ea053e", + "reference": "273a9bbed9e73016be390b8428f7925f15ea053e", "shasum": "" }, "require": { @@ -229,37 +145,36 @@ "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.4.5", + "mtdowling/jmespath.php": "^2.8.0", + "php": ">=8.1", + "psr/http-message": "^1.0 || ^2.0", + "symfony/filesystem": "^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", - "composer/composer": "^1.10.22", + "composer/composer": "^2.7.8", "dms/phpunit-arraysubset-asserts": "^0.4.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", - "ext-pcntl": "*", "ext-sockets": "*", - "nette/neon": "^2.3", - "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0", - "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" + "phpunit/phpunit": "^9.6", + "psr/cache": "^2.0 || ^3.0", + "psr/simple-cache": "^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", + "yoast/phpunit-polyfills": "^2.0" }, "suggest": { "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", "doctrine/cache": "To use the DoctrineCacheAdapter", "ext-curl": "To send requests using cURL", "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-pcntl": "To use client-side monitoring", "ext-sockets": "To use client-side monitoring" }, "type": "library", @@ -274,7 +189,10 @@ ], "psr-4": { "Aws\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/data/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -299,33 +217,33 @@ "sdk" ], "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.288.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.370.1" }, - "time": "2023-11-22T19:35:38+00:00" + "time": "2026-02-23T19:05:30+00:00" }, { "name": "blade-ui-kit/blade-heroicons", - "version": "2.4.0", + "version": "2.6.0", "source": { "type": "git", - "url": "https://github.com/blade-ui-kit/blade-heroicons.git", - "reference": "a7c377a4ef88cd54712e3e15cbed30446820da0b" + "url": "https://github.com/driesvints/blade-heroicons.git", + "reference": "4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/a7c377a4ef88cd54712e3e15cbed30446820da0b", - "reference": "a7c377a4ef88cd54712e3e15cbed30446820da0b", + "url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19", + "reference": "4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19", "shasum": "" }, "require": { "blade-ui-kit/blade-icons": "^1.6", - "illuminate/support": "^9.0|^10.0|^11.0", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0", "php": "^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", "phpunit/phpunit": "^9.0|^10.5|^11.0" }, "type": "library", @@ -359,8 +277,8 @@ "laravel" ], "support": { - "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", - "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/2.4.0" + "issues": "https://github.com/driesvints/blade-heroicons/issues", + "source": "https://github.com/driesvints/blade-heroicons/tree/2.6.0" }, "funding": [ { @@ -372,34 +290,34 @@ "type": "paypal" } ], - "time": "2024-07-16T07:00:01+00:00" + "time": "2025-02-13T20:53:33+00:00" }, { "name": "blade-ui-kit/blade-icons", - "version": "1.7.1", + "version": "1.9.0", "source": { "type": "git", - "url": "https://github.com/blade-ui-kit/blade-icons.git", - "reference": "8f787baf09d88cdfd6ec4dbaba11ebfa885f0595" + "url": "https://github.com/driesvints/blade-icons.git", + "reference": "caa92fde675d7a651c38bf73ca582ddada56f318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/8f787baf09d88cdfd6ec4dbaba11ebfa885f0595", - "reference": "8f787baf09d88cdfd6ec4dbaba11ebfa885f0595", + "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/caa92fde675d7a651c38bf73ca582ddada56f318", + "reference": "caa92fde675d7a651c38bf73ca582ddada56f318", "shasum": "" }, "require": { - "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0", - "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", - "illuminate/view": "^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/view": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^7.4|^8.0", - "symfony/console": "^5.3|^6.0|^7.0", - "symfony/finder": "^5.3|^6.0|^7.0" + "symfony/console": "^5.3|^6.0|^7.0|^8.0", + "symfony/finder": "^5.3|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "^1.5.1", - "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "phpunit/phpunit": "^9.0|^10.5|^11.0" }, "bin": [ @@ -432,7 +350,7 @@ } ], "description": "A package to easily make use of icons in your Laravel Blade views.", - "homepage": "https://github.com/blade-ui-kit/blade-icons", + "homepage": "https://github.com/driesvints/blade-icons", "keywords": [ "blade", "icons", @@ -440,8 +358,8 @@ "svg" ], "support": { - "issues": "https://github.com/blade-ui-kit/blade-icons/issues", - "source": "https://github.com/blade-ui-kit/blade-icons" + "issues": "https://github.com/driesvints/blade-icons/issues", + "source": "https://github.com/driesvints/blade-icons" }, "funding": [ { @@ -453,29 +371,29 @@ "type": "paypal" } ], - "time": "2024-08-14T14:25:11+00:00" + "time": "2026-02-23T10:42:23+00:00" }, { "name": "brick/math", - "version": "0.12.1", + "version": "0.14.8", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.2" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "5.16.0" + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" }, "type": "library", "autoload": { @@ -505,7 +423,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.1" + "source": "https://github.com/brick/math/tree/0.14.8" }, "funding": [ { @@ -513,30 +431,84 @@ "type": "github" } ], - "time": "2023-11-29T23:19:16+00:00" + "time": "2026-02-10T14:33:43+00:00" + }, + { + "name": "calebporzio/sushi", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/calebporzio/sushi.git", + "reference": "ef71a031f78a80b0ed82ce51fc5b648c01145281" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/calebporzio/sushi/zipball/ef71a031f78a80b0ed82ce51fc5b648c01145281", + "reference": "ef71a031f78a80b0ed82ce51fc5b648c01145281", + "shasum": "" + }, + "require": { + "ext-pdo_sqlite": "*", + "ext-sqlite3": "*", + "illuminate/database": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^7.1.3|^8.0" + }, + "require-dev": { + "doctrine/dbal": "^2.9 || ^3.1.4", + "orchestra/testbench": "3.8.* || 3.9.* || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "phpunit/phpunit": "^7.5 || ^8.4 || ^9.0 || ^10.0 || ^11.0 || ^12.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sushi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "Eloquent's missing \"array\" driver.", + "support": { + "source": "https://github.com/calebporzio/sushi/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://github.com/calebporzio", + "type": "github" + } + ], + "time": "2026-02-21T02:53:22+00:00" }, { "name": "carbonphp/carbon-doctrine-types", - "version": "1.0.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "3c430083d0b41ceed84ecccf9dac613241d7305d" + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/3c430083d0b41ceed84ecccf9dac613241d7305d", - "reference": "3c430083d0b41ceed84ecccf9dac613241d7305d", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", "shasum": "" }, "require": { - "php": "^7.1.8 || ^8.0" + "php": "^8.1" }, "conflict": { - "doctrine/dbal": ">=3.7.0" + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, "require-dev": { - "doctrine/dbal": ">=2.0.0", + "doctrine/dbal": "^4.0.0", "nesbot/carbon": "^2.71.0 || ^3.0.0", "phpunit/phpunit": "^10.3" }, @@ -566,7 +538,7 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/1.0.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" }, "funding": [ { @@ -582,34 +554,37 @@ "type": "tidelift" } ], - "time": "2023-10-01T12:35:29+00:00" + "time": "2024-02-09T16:56:22+00:00" }, { "name": "chillerlan/php-qrcode", - "version": "5.0.2", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "da5bdb82c8755f54de112b271b402aaa8df53269" + "reference": "7b66282572fc14075c0507d74d9837dab25b38d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/da5bdb82c8755f54de112b271b402aaa8df53269", - "reference": "da5bdb82c8755f54de112b271b402aaa8df53269", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/7b66282572fc14075c0507d74d9837dab25b38d6", + "reference": "7b66282572fc14075c0507d74d9837dab25b38d6", "shasum": "" }, "require": { - "chillerlan/php-settings-container": "^2.1.4 || ^3.1", + "chillerlan/php-settings-container": "^2.1.6 || ^3.2.1", "ext-mbstring": "*", "php": "^7.4 || ^8.0" }, "require-dev": { - "chillerlan/php-authenticator": "^4.1 || ^5.1", - "phan/phan": "^5.4", + "chillerlan/php-authenticator": "^4.3.1 || ^5.2.1", + "ext-fileinfo": "*", + "phan/phan": "^5.5.2", + "phpcompatibility/php-compatibility": "10.x-dev", "phpmd/phpmd": "^2.15", "phpunit/phpunit": "^9.6", "setasign/fpdf": "^1.8.2", - "squizlabs/php_codesniffer": "^3.8" + "slevomat/coding-standard": "^8.23.0", + "squizlabs/php_codesniffer": "^4.0.0" }, "suggest": { "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", @@ -619,7 +594,7 @@ "type": "library", "autoload": { "psr-4": { - "chillerlan\\QRCode\\": "src/" + "chillerlan\\QRCode\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -650,7 +625,7 @@ "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors" } ], - "description": "A QR code generator and reader with a user friendly API. PHP 7.4+", + "description": "A QR Code generator and reader with a user-friendly API. PHP 7.4+", "homepage": "https://github.com/chillerlan/php-qrcode", "keywords": [ "phpqrcode", @@ -667,29 +642,25 @@ "source": "https://github.com/chillerlan/php-qrcode" }, "funding": [ - { - "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", - "type": "custom" - }, { "url": "https://ko-fi.com/codemasher", - "type": "ko_fi" + "type": "Ko-Fi" } ], - "time": "2024-02-27T14:37:26+00:00" + "time": "2025-11-23T23:51:44+00:00" }, { "name": "chillerlan/php-settings-container", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "8f93648fac8e6bacac8e00a8d325eba4950295e6" + "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/8f93648fac8e6bacac8e00a8d325eba4950295e6", - "reference": "8f93648fac8e6bacac8e00a8d325eba4950295e6", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681", "shasum": "" }, "require": { @@ -697,15 +668,16 @@ "php": "^8.1" }, "require-dev": { - "phan/phan": "^5.4", "phpmd/phpmd": "^2.15", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-deprecation-rules": "^1.2", "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.9" + "squizlabs/php_codesniffer": "^3.10" }, "type": "library", "autoload": { "psr-4": { - "chillerlan\\Settings\\": "src/" + "chillerlan\\Settings\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -741,7 +713,7 @@ "type": "ko_fi" } ], - "time": "2024-03-02T20:07:15+00:00" + "time": "2024-07-16T11:13:48+00:00" }, { "name": "danharrin/date-format-converter", @@ -796,27 +768,27 @@ }, { "name": "danharrin/livewire-rate-limiting", - "version": "v1.3.1", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/danharrin/livewire-rate-limiting.git", - "reference": "1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb" + "reference": "14dde653a9ae8f38af07a0ba4921dc046235e1a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb", - "reference": "1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/14dde653a9ae8f38af07a0ba4921dc046235e1a0", + "reference": "14dde653a9ae8f38af07a0ba4921dc046235e1a0", "shasum": "" }, "require": { - "illuminate/support": "^9.0|^10.0|^11.0", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0", "php": "^8.0" }, "require-dev": { "livewire/livewire": "^3.0", "livewire/volt": "^1.3", - "orchestra/testbench": "^7.0|^8.0|^9.0", - "phpunit/phpunit": "^9.0|^10.0" + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpunit/phpunit": "^9.0|^10.0|^11.5.3" }, "type": "library", "autoload": { @@ -846,36 +818,42 @@ "type": "github" } ], - "time": "2024-05-06T09:10:03+00:00" + "time": "2025-02-21T08:52:11+00:00" }, { "name": "dedoc/scramble", - "version": "v0.10.13", + "version": "v0.13.14", "source": { "type": "git", "url": "https://github.com/dedoc/scramble.git", - "reference": "d8c3ed9c69fe6c0900f22ec0c7520b9b579d9ec3" + "reference": "8f0c1bba364e4916f3f2ff23b7f4ca002e586b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dedoc/scramble/zipball/d8c3ed9c69fe6c0900f22ec0c7520b9b579d9ec3", - "reference": "d8c3ed9c69fe6c0900f22ec0c7520b9b579d9ec3", + "url": "https://api.github.com/repos/dedoc/scramble/zipball/8f0c1bba364e4916f3f2ff23b7f4ca002e586b75", + "reference": "8f0c1bba364e4916f3f2ff23b7f4ca002e586b75", "shasum": "" }, "require": { - "illuminate/contracts": "^10.0|^11.0", + "illuminate/contracts": "^10.0|^11.0|^12.0", + "myclabs/deep-copy": "^1.12", "nikic/php-parser": "^5.0", "php": "^8.1", - "phpstan/phpdoc-parser": "^1.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", "spatie/laravel-package-tools": "^1.9.2" }, "require-dev": { + "larastan/larastan": "^3.3", "laravel/pint": "^v1.1.0", "nunomaduro/collision": "^7.0|^8.0", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.34", - "pestphp/pest-plugin-laravel": "^2.3", - "phpunit/phpunit": "^10.5", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "pestphp/pest": "^2.34|^3.7", + "pestphp/pest-plugin-laravel": "^2.3|^3.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5|^11.5.3", + "spatie/laravel-permission": "^6.10", "spatie/pest-plugin-snapshots": "^2.1" }, "type": "library", @@ -912,7 +890,7 @@ ], "support": { "issues": "https://github.com/dedoc/scramble/issues", - "source": "https://github.com/dedoc/scramble/tree/v0.10.13" + "source": "https://github.com/dedoc/scramble/tree/v0.13.14" }, "funding": [ { @@ -920,20 +898,20 @@ "type": "github" } ], - "time": "2024-06-05T17:01:46+00:00" + "time": "2026-02-15T13:14:31+00:00" }, { "name": "dflydev/dot-access-data", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "f41715465d65213d644d3141a6a93081be5d3549" + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", - "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { @@ -993,42 +971,86 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2022-10-27T11:44:00+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { - "name": "doctrine/cache", - "version": "2.2.0", + "name": "doctrine/deprecations", + "version": "1.1.6", "source": { "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { - "php": "~7.1 || ^8.0" + "php": "^7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "phpunit/phpunit": "<=7.5 || >=14" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" + }, + "time": "2026-02-07T07:09:04+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" }, "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1057,22 +1079,23 @@ "email": "schmittjoh@gmail.com" } ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", + "inflection", + "inflector", + "lowercase", + "manipulation", "php", - "redis", - "xcache" + "plural", + "singular", + "strings", + "uppercase", + "words" ], "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -1084,59 +1107,40 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", "type": "tidelift" } ], - "time": "2022-05-20T20:07:39+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { - "name": "doctrine/dbal", - "version": "3.6.7", + "name": "doctrine/lexer", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "8e0e268052b4a8974cb00215bb2892787021614f" + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/8e0e268052b4a8974cb00215bb2892787021614f", - "reference": "8e0e268052b4a8974cb00215bb2892787021614f", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.34", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.12", - "psalm/plugin-phpunit": "0.18.4", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^5.4|^6.0", - "symfony/console": "^4.4|^5.4|^6.0", - "vimeo/psalm": "4.30.0" + "php": "^8.1" }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "src" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1153,39 +1157,22 @@ "email": "roman@code-factory.org" }, { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" + "annotations", + "docblock", + "lexer", + "parser", + "php" ], "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.7" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { @@ -1197,89 +1184,1798 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", "type": "tidelift" } ], - "time": "2023-09-19T20:15:41+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { - "name": "doctrine/deprecations", - "version": "1.1.3", + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.2|^8.3|^8.4|^8.5" }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" + "replace": { + "mtdowling/cron-expression": "^1.0" }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" }, - "time": "2024-01-30T19:34:25+00:00" + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" }, { - "name": "doctrine/event-manager", - "version": "2.0.1", + "name": "egulias/email-validator", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", "shasum": "" }, "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/common": "<2.9" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "filament/actions", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/actions.git", + "reference": "3c72645f04112b2b50d0af64d9765b304ea6e069" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/3c72645f04112b2b50d0af64d9765b304ea6e069", + "reference": "3c72645f04112b2b50d0af64d9765b304ea6e069", + "shasum": "" + }, + "require": { + "anourvalar/eloquent-serialize": "^1.2", + "filament/forms": "self.version", + "filament/infolists": "self.version", + "filament/notifications": "self.version", + "filament/support": "self.version", + "league/csv": "^9.27", + "openspout/openspout": "^4.23", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Actions\\ActionsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Actions\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful action modals to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:18:10+00:00" + }, + { + "name": "filament/filament", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/panels.git", + "reference": "4eb94830bdd9c8bb319ab81f24315da5cd622c7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/4eb94830bdd9c8bb319ab81f24315da5cd622c7f", + "reference": "4eb94830bdd9c8bb319ab81f24315da5cd622c7f", + "shasum": "" + }, + "require": { + "chillerlan/php-qrcode": "^5.0", + "filament/actions": "self.version", + "filament/forms": "self.version", + "filament/infolists": "self.version", + "filament/notifications": "self.version", + "filament/schemas": "self.version", + "filament/support": "self.version", + "filament/tables": "self.version", + "filament/widgets": "self.version", + "php": "^8.2", + "pragmarx/google2fa": "^8.0|^9.0", + "pragmarx/google2fa-qrcode": "^3.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\FilamentServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/global_helpers.php", + "src/helpers.php" + ], + "psr-4": { + "Filament\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A collection of full-stack components for accelerated Laravel app development.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:22:38+00:00" + }, + { + "name": "filament/forms", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/forms.git", + "reference": "62dc9e701f4364d78d3fddf9d6765139f37f744e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/62dc9e701f4364d78d3fddf9d6765139f37f744e", + "reference": "62dc9e701f4364d78d3fddf9d6765139f37f744e", + "shasum": "" + }, + "require": { + "danharrin/date-format-converter": "^0.3", + "filament/actions": "self.version", + "filament/schemas": "self.version", + "filament/support": "self.version", + "php": "^8.2", + "ueberdosis/tiptap-php": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Forms\\FormsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\Forms\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful forms to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:19:57+00:00" + }, + { + "name": "filament/infolists", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/infolists.git", + "reference": "7376fd0046e8cea9d41550dea2ab18770b83d559" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/7376fd0046e8cea9d41550dea2ab18770b83d559", + "reference": "7376fd0046e8cea9d41550dea2ab18770b83d559", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/schemas": "self.version", + "filament/support": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Infolists\\InfolistsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Infolists\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful read-only infolists to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:16:10+00:00" + }, + { + "name": "filament/notifications", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/notifications.git", + "reference": "53b004187380aebbf176cb9fc5cb78c5717a9285" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/53b004187380aebbf176cb9fc5cb78c5717a9285", + "reference": "53b004187380aebbf176cb9fc5cb78c5717a9285", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/support": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Notifications\\NotificationsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Testing/helpers.php" + ], + "psr-4": { + "Filament\\Notifications\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful notifications to any Livewire app.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-04T16:10:32+00:00" + }, + { + "name": "filament/query-builder", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/query-builder.git", + "reference": "880d04585dfec91aecd3f53f50cef7f6a34cd71d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/880d04585dfec91aecd3f53f50cef7f6a34cd71d", + "reference": "880d04585dfec91aecd3f53f50cef7f6a34cd71d", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/forms": "self.version", + "filament/schemas": "self.version", + "filament/support": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\QueryBuilder\\QueryBuilderServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\QueryBuilder\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A powerful query builder component for Filament.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:21:18+00:00" + }, + { + "name": "filament/schemas", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/schemas.git", + "reference": "20d8d7a9f7d299d7a523d54ada1f64938c563517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/schemas/zipball/20d8d7a9f7d299d7a523d54ada1f64938c563517", + "reference": "20d8d7a9f7d299d7a523d54ada1f64938c563517", + "shasum": "" + }, + "require": { + "danharrin/date-format-converter": "^0.3", + "filament/actions": "self.version", + "filament/support": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Schemas\\SchemasServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Schemas\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful UI to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:18:27+00:00" + }, + { + "name": "filament/support", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/support.git", + "reference": "3c68c4bef64807d98a1481a4e621c5d9a8cbcf69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/support/zipball/3c68c4bef64807d98a1481a4e621c5d9a8cbcf69", + "reference": "3c68c4bef64807d98a1481a4e621c5d9a8cbcf69", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-heroicons": "^2.5", + "danharrin/livewire-rate-limiting": "^2.0", + "ext-intl": "*", + "illuminate/contracts": "^11.28|^12.0", + "kirschbaum-development/eloquent-power-joins": "^4.0", + "league/uri-components": "^7.0", + "livewire/livewire": "^3.5", + "nette/php-generator": "^4.0", + "php": "^8.2", + "ryangjchandler/blade-capture-directive": "^1.0", + "spatie/invade": "^2.0", + "spatie/laravel-package-tools": "^1.9", + "symfony/console": "^7.0", + "symfony/html-sanitizer": "^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Support\\SupportServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\Support\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Core helper methods and foundation code for all Filament packages.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:25:28+00:00" + }, + { + "name": "filament/tables", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/tables.git", + "reference": "3e090095e56ec86603cba78e41529d1af213b182" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/3e090095e56ec86603cba78e41529d1af213b182", + "reference": "3e090095e56ec86603cba78e41529d1af213b182", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/forms": "self.version", + "filament/query-builder": "self.version", + "filament/support": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Tables\\TablesServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Tables\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful tables to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-20T12:22:50+00:00" + }, + { + "name": "filament/widgets", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/widgets.git", + "reference": "bbe126e5e4e7f8073be19d22ec8f8bd298f40529" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/bbe126e5e4e7f8073be19d22ec8f8bd298f40529", + "reference": "bbe126e5e4e7f8073be19d22ec8f8bd298f40529", + "shasum": "" + }, + "require": { + "filament/schemas": "self.version", + "filament/support": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Widgets\\WidgetsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Widgets\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful dashboard widgets to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2026-02-10T13:13:04+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v7.0.2", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v7.0.2" + }, + "time": "2025-12-16T22:17:28+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "gboquizosanchez/filament-log-viewer", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/gboquizosanchez/filament-log-viewer.git", + "reference": "eae98cd4fda986b65d78a38ef967c4a639626c1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/gboquizosanchez/filament-log-viewer/zipball/eae98cd4fda986b65d78a38ef967c4a639626c1f", + "reference": "eae98cd4fda986b65d78a38ef967c4a639626c1f", + "shasum": "" + }, + "require": { + "ext-zip": "*", + "owenvoke/blade-fontawesome": "^2.9", + "php": "^8.2|^8.3|^8.4", + "symfony/polyfill-php83": "^1.33" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.64", + "hermes/dependencies": "^1.1", + "larastan/larastan": "^2.9", + "orchestra/testbench": "^9.1", + "pestphp/pest": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Boquizo\\FilamentLogViewer\\FilamentLogViewerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Boquizo\\FilamentLogViewer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Germán Boquizo Sánchez", + "email": "germanboquizosanchez@gmail.com", + "role": "Developer" + } + ], + "description": "Filament Log Viewer", + "homepage": "https://github.com/gboquizosanchez", + "keywords": [ + "filament", + "laravel", + "log-viewer" + ], + "support": { + "issues": "https://github.com/gboquizosanchez/filament-log-viewer/issues", + "source": "https://github.com/gboquizosanchez/filament-log-viewer/tree/2.2.3" + }, + "time": "2026-02-03T00:08:41+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:43:20+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "kirschbaum-development/eloquent-power-joins", + "version": "4.2.11", + "source": { + "type": "git", + "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", + "reference": "0e3e3372992e4bf82391b3c7b84b435c3db73588" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/0e3e3372992e4bf82391b3c7b84b435c3db73588", + "reference": "0e3e3372992e4bf82391b3c7b84b435c3db73588", + "shasum": "" + }, + "require": { + "illuminate/database": "^11.42|^12.0", + "illuminate/support": "^11.42|^12.0", + "php": "^8.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "dev-master", + "laravel/legacy-factories": "^1.0@dev", + "orchestra/testbench": "^9.0|^10.0", + "phpunit/phpunit": "^10.0|^11.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Kirschbaum\\PowerJoins\\PowerJoinsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Kirschbaum\\PowerJoins\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luis Dalmolin", + "email": "luis.nh@gmail.com", + "role": "Developer" + } + ], + "description": "The Laravel magic applied to joins.", + "homepage": "https://github.com/kirschbaum-development/eloquent-power-joins", + "keywords": [ + "eloquent", + "join", + "laravel", + "mysql" + ], + "support": { + "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", + "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.2.11" + }, + "time": "2025-12-17T00:37:48+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.53.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/f57f035c0d34503d9ff30be76159bb35a003cd1f", + "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13|^0.14", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.7", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.9.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-02-24T14:35:15+00:00" + }, + { + "name": "laravel/helpers", + "version": "v1.8.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/helpers.git", + "reference": "98499eea4c1cca76fb0fb37ed365a468773daf0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/helpers/zipball/98499eea4c1cca76fb0fb37ed365a468773daf0a", + "reference": "98499eea4c1cca76fb0fb37ed365a468773daf0a", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.0|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Dries Vints", + "email": "dries@laravel.com" + } + ], + "description": "Provides backwards compatibility for helpers in the latest Laravel release.", + "keywords": [ + "helpers", + "laravel" + ], + "support": { + "source": "https://github.com/laravel/helpers/tree/v1.8.2" + }, + "time": "2025-11-25T14:46:28+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.13", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0|^8.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.13" + }, + "time": "2026-02-06T12:17:10+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v4.3.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", + "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "symfony/console": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2026-02-07T17:19:31+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.10", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "src" + "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1288,88 +2984,74 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" }, { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Nuno Maduro", + "email": "nuno@laravel.com" } ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" + "closure", + "laravel", + "serializable" ], "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2026-02-20T19:59:49+00:00" }, { - "name": "doctrine/inflector", - "version": "2.0.10", + "name": "laravel/socialite", + "version": "v5.24.3", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "url": "https://github.com/laravel/socialite.git", + "reference": "0feb62267e7b8abc68593ca37639ad302728c129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/laravel/socialite/zipball/0feb62267e7b8abc68593ca37639ad302728c129", + "reference": "0feb62267e7b8abc68593ca37639ad302728c129", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "ext-json": "*", + "firebase/php-jwt": "^6.4|^7.0", + "guzzlehttp/guzzle": "^6.0|^7.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "league/oauth1-client": "^1.11", + "php": "^7.2|^8.0", + "phpseclib/phpseclib": "^3.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.12.23", + "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5|^12.0" }, "type": "library", + "extra": { + "laravel": { + "aliases": { + "Socialite": "Laravel\\Socialite\\Facades\\Socialite" + }, + "providers": [ + "Laravel\\Socialite\\SocialiteServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Laravel\\Socialite\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1378,88 +3060,63 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", + "homepage": "https://laravel.com", "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" + "laravel", + "oauth" ], "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "issues": "https://github.com/laravel/socialite/issues", + "source": "https://github.com/laravel/socialite" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2026-02-21T13:32:50+00:00" }, { - "name": "doctrine/lexer", - "version": "3.0.1", + "name": "laravel/tinker", + "version": "v2.11.1", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + "url": "https://github.com/laravel/tinker.git", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", "shasum": "" }, "require": { - "php": "^8.1" + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" }, "require-dev": { - "doctrine/coding-standard": "^12", + "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "Laravel\\Tinker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1468,702 +3125,841 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "Powerful REPL for the Laravel framework.", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "REPL", + "Tinker", + "laravel", + "psysh" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.11.1" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "time": "2026-02-06T14:12:35+00:00" + }, + { + "name": "laravel/ui", + "version": "v4.6.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.21|^10.0|^11.0|^12.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "illuminate/validation": "^9.21|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0", + "phpunit/phpunit": "^9.3|^10.4|^11.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] }, + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "time": "2024-02-05T11:56:58+00:00" + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v4.6.1" + }, + "time": "2025-01-28T15:15:29+00:00" }, { - "name": "dragonmantank/cron-expression", - "version": "v3.3.3", + "name": "lcobucci/jwt", + "version": "5.6.0", "source": { "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + "url": "https://github.com/lcobucci/jwt.git", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "webmozart/assert": "^1.0" - }, - "replace": { - "mtdowling/cron-expression": "^1.0" + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" }, "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0" + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" }, "type": "library", "autoload": { "psr-4": { - "Cron\\": "src/Cron/" + "Lcobucci\\JWT\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" } ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "description": "A simple library to work with JSON Web Token and JSON Web Signature", "keywords": [ - "cron", - "schedule" + "JWS", + "jwt" ], "support": { - "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" }, "funding": [ { - "url": "https://github.com/dragonmantank", + "url": "https://github.com/lcobucci", "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" } ], - "time": "2023-08-10T19:36:49+00:00" + "time": "2025-10-17T11:30:53+00:00" }, { - "name": "egulias/email-validator", - "version": "4.0.2", + "name": "league/commonmark", + "version": "2.8.0", "source": { "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", "shasum": "" }, "require": { - "doctrine/lexer": "^2.0 || ^3.0", - "php": ">=8.1", - "symfony/polyfill-intl-idn": "^1.26" + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "phpunit/phpunit": "^10.2", - "vimeo/psalm": "^5.12" + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-main": "2.9-dev" } }, "autoload": { "psr-4": { - "Egulias\\EmailValidator\\": "src" + "League\\CommonMark\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Eduardo Gulias Davis" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" ], "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" }, "funding": [ { - "url": "https://github.com/egulias", + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" } ], - "time": "2023-10-06T06:47:41+00:00" + "time": "2025-11-26T21:48:24+00:00" }, { - "name": "filament/actions", - "version": "v3.2.117", + "name": "league/config", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/actions.git", - "reference": "886108b59ce99edc26f5bc1231134a95ec58718a" + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/886108b59ce99edc26f5bc1231134a95ec58718a", - "reference": "886108b59ce99edc26f5bc1231134a95ec58718a", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { - "anourvalar/eloquent-serialize": "^1.2", - "filament/forms": "self.version", - "filament/infolists": "self.version", - "filament/notifications": "self.version", - "filament/support": "self.version", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/database": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "league/csv": "^9.14", - "openspout/openspout": "^4.23", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Filament\\Actions\\ActionsServiceProvider" - ] + "branch-alias": { + "dev-main": "1.2-dev" } }, "autoload": { "psr-4": { - "Filament\\Actions\\": "src" + "League\\Config\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], - "description": "Easily add beautiful action modals to any Livewire component.", - "homepage": "https://github.com/filamentphp/filament", - "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" - }, - "time": "2024-10-09T11:19:22+00:00" - }, - { - "name": "filament/filament", - "version": "v3.2.117", - "source": { - "type": "git", - "url": "https://github.com/filamentphp/panels.git", - "reference": "84f839b4b42549c0d4bd231648da17561ada70c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/84f839b4b42549c0d4bd231648da17561ada70c2", - "reference": "84f839b4b42549c0d4bd231648da17561ada70c2", - "shasum": "" - }, - "require": { - "danharrin/livewire-rate-limiting": "^0.3|^1.0", - "filament/actions": "self.version", - "filament/forms": "self.version", - "filament/infolists": "self.version", - "filament/notifications": "self.version", - "filament/support": "self.version", - "filament/tables": "self.version", - "filament/widgets": "self.version", - "illuminate/auth": "^10.45|^11.0", - "illuminate/console": "^10.45|^11.0", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/cookie": "^10.45|^11.0", - "illuminate/database": "^10.45|^11.0", - "illuminate/http": "^10.45|^11.0", - "illuminate/routing": "^10.45|^11.0", - "illuminate/session": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "illuminate/view": "^10.45|^11.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Filament\\FilamentServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/global_helpers.php", - "src/helpers.php" - ], - "psr-4": { - "Filament\\": "src" + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" ], - "description": "A collection of full-stack components for accelerated Laravel app development.", - "homepage": "https://github.com/filamentphp/filament", + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" }, - "time": "2024-10-08T14:24:12+00:00" + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" }, { - "name": "filament/forms", - "version": "v3.2.117", + "name": "league/csv", + "version": "9.28.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/forms.git", - "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc" + "url": "https://github.com/thephpleague/csv.git", + "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/896c868cca474b2e925a3e6162b7c76d8ff3e5fc", - "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/6582ace29ae09ba5b07049d40ea13eb19c8b5073", + "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073", "shasum": "" }, "require": { - "danharrin/date-format-converter": "^0.3", - "filament/actions": "self.version", - "filament/support": "self.version", - "illuminate/console": "^10.45|^11.0", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/database": "^10.45|^11.0", - "illuminate/filesystem": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "illuminate/validation": "^10.45|^11.0", - "illuminate/view": "^10.45|^11.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.92.3", + "phpbench/phpbench": "^1.4.3", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.5.4", + "symfony/var-dumper": "^6.4.8 || ^7.4.0 || ^8.0" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Filament\\Forms\\FormsServiceProvider" - ] + "branch-alias": { + "dev-master": "9.x-dev" } }, "autoload": { "files": [ - "src/helpers.php" + "src/functions_include.php" ], "psr-4": { - "Filament\\Forms\\": "src" + "League\\Csv\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Easily add beautiful forms to any Livewire component.", - "homepage": "https://github.com/filamentphp/filament", + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "docs": "https://csv.thephpleague.com", + "issues": "https://github.com/thephpleague/csv/issues", + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" }, - "time": "2024-10-09T11:19:26+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-12-27T15:18:42+00:00" }, { - "name": "filament/infolists", - "version": "v3.2.117", + "name": "league/flysystem", + "version": "3.31.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/infolists.git", - "reference": "fc5f01c094fe25ef906f3e1b88d3d8883a73d6be" + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/fc5f01c094fe25ef906f3e1b88d3d8883a73d6be", - "reference": "fc5f01c094fe25ef906f3e1b88d3d8883a73d6be", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1717e0b3642b0df65ecb0cc89cdd99fa840672ff", + "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff", "shasum": "" }, "require": { - "filament/actions": "self.version", - "filament/support": "self.version", - "illuminate/console": "^10.45|^11.0", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/database": "^10.45|^11.0", - "illuminate/filesystem": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "illuminate/view": "^10.45|^11.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Filament\\Infolists\\InfolistsServiceProvider" - ] - } + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, + "type": "library", "autoload": { "psr-4": { - "Filament\\Infolists\\": "src" + "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Easily add beautiful read-only infolists to any Livewire component.", - "homepage": "https://github.com/filamentphp/filament", + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.31.0" }, - "time": "2024-10-08T14:24:09+00:00" + "time": "2026-01-23T15:38:47+00:00" }, { - "name": "filament/notifications", - "version": "v3.2.117", + "name": "league/flysystem-aws-s3-v3", + "version": "3.31.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/notifications.git", - "reference": "a5f684b690354630210fc9a90bd06da9b1f6ae82" + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "e36a2bc60b06332c92e4435047797ded352b446f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/a5f684b690354630210fc9a90bd06da9b1f6ae82", - "reference": "a5f684b690354630210fc9a90bd06da9b1f6ae82", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/e36a2bc60b06332c92e4435047797ded352b446f", + "reference": "e36a2bc60b06332c92e4435047797ded352b446f", "shasum": "" }, "require": { - "filament/actions": "self.version", - "filament/support": "self.version", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/filesystem": "^10.45|^11.0", - "illuminate/notifications": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "aws/aws-sdk-php": "^3.295.10", + "league/flysystem": "^3.10.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Filament\\Notifications\\NotificationsServiceProvider" - ] - } + "conflict": { + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1" }, + "type": "library", "autoload": { - "files": [ - "src/Testing/Autoload.php" - ], "psr-4": { - "Filament\\Notifications\\": "src" + "League\\Flysystem\\AwsS3V3\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Easily add beautiful notifications to any Livewire app.", - "homepage": "https://github.com/filamentphp/filament", + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "AWS S3 filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "aws", + "file", + "files", + "filesystem", + "s3", + "storage" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.31.0" }, - "time": "2024-10-08T14:24:11+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { - "name": "filament/support", - "version": "v3.2.117", + "name": "league/flysystem-local", + "version": "3.31.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/support.git", - "reference": "31fcff80b873b4decdba10d5f7010310e12c8e94" + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/31fcff80b873b4decdba10d5f7010310e12c8e94", - "reference": "31fcff80b873b4decdba10d5f7010310e12c8e94", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", "shasum": "" }, "require": { - "blade-ui-kit/blade-heroicons": "^2.2.1", - "doctrine/dbal": "^3.2|^4.0", - "ext-intl": "*", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "illuminate/view": "^10.45|^11.0", - "kirschbaum-development/eloquent-power-joins": "^3.0|^4.0", - "livewire/livewire": "^3.4.10 <= 3.5.6", - "php": "^8.1", - "ryangjchandler/blade-capture-directive": "^0.2|^0.3|^1.0", - "spatie/color": "^1.5", - "spatie/invade": "^1.0|^2.0", - "spatie/laravel-package-tools": "^1.9", - "symfony/console": "^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0" + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Filament\\Support\\SupportServiceProvider" - ] - } - }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Filament\\Support\\": "src" + "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Core helper methods and foundation code for all Filament packages.", - "homepage": "https://github.com/filamentphp/filament", + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" }, - "time": "2024-10-08T14:24:29+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { - "name": "filament/tables", - "version": "v3.2.117", + "name": "league/flysystem-memory", + "version": "3.31.0", "source": { "type": "git", - "url": "https://github.com/filamentphp/tables.git", - "reference": "152bf46a8f2c46f047835771a67085c2866b039b" + "url": "https://github.com/thephpleague/flysystem-memory.git", + "reference": "b2d1700ed1215684e7276e55bcacf350e0e06ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/152bf46a8f2c46f047835771a67085c2866b039b", - "reference": "152bf46a8f2c46f047835771a67085c2866b039b", + "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/b2d1700ed1215684e7276e55bcacf350e0e06ff9", + "reference": "b2d1700ed1215684e7276e55bcacf350e0e06ff9", "shasum": "" }, "require": { - "filament/actions": "self.version", - "filament/forms": "self.version", - "filament/support": "self.version", - "illuminate/console": "^10.45|^11.0", - "illuminate/contracts": "^10.45|^11.0", - "illuminate/database": "^10.45|^11.0", - "illuminate/filesystem": "^10.45|^11.0", - "illuminate/support": "^10.45|^11.0", - "illuminate/view": "^10.45|^11.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "php": "^8.0.2" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Filament\\Tables\\TablesServiceProvider" - ] - } - }, "autoload": { "psr-4": { - "Filament\\Tables\\": "src" + "League\\Flysystem\\InMemory\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Easily add beautiful tables to any Livewire component.", - "homepage": "https://github.com/filamentphp/filament", + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "In-memory filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "memory" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "source": "https://github.com/thephpleague/flysystem-memory/tree/3.31.0" }, - "time": "2024-10-08T14:24:25+00:00" + "time": "2026-01-23T15:30:45+00:00" }, { - "name": "filament/widgets", - "version": "v3.2.117", + "name": "league/fractal", + "version": "0.20.2", "source": { "type": "git", - "url": "https://github.com/filamentphp/widgets.git", - "reference": "14ae503aae8265ddc48274debbf7b7aefc7afb0b" + "url": "https://github.com/thephpleague/fractal.git", + "reference": "573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/14ae503aae8265ddc48274debbf7b7aefc7afb0b", - "reference": "14ae503aae8265ddc48274debbf7b7aefc7afb0b", + "url": "https://api.github.com/repos/thephpleague/fractal/zipball/573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e", + "reference": "573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e", "shasum": "" }, "require": { - "filament/support": "self.version", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9" + "php": ">=7.4" + }, + "require-dev": { + "doctrine/orm": "^2.5", + "illuminate/contracts": "~5.0", + "laminas/laminas-paginator": "~2.12", + "mockery/mockery": "^1.3", + "pagerfanta/pagerfanta": "~1.0.0|~4.0.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "~3.4", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "illuminate/pagination": "The Illuminate Pagination component.", + "laminas/laminas-paginator": "Laminas Framework Paginator", + "pagerfanta/pagerfanta": "Pagerfanta Paginator" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Filament\\Widgets\\WidgetsServiceProvider" - ] + "branch-alias": { + "dev-master": "0.20.x-dev" } }, "autoload": { "psr-4": { - "Filament\\Widgets\\": "src" + "League\\Fractal\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Easily add beautiful dashboard widgets to any Livewire component.", - "homepage": "https://github.com/filamentphp/filament", + "authors": [ + { + "name": "Phil Sturgeon", + "email": "me@philsturgeon.uk", + "homepage": "http://philsturgeon.uk/", + "role": "Developer" + } + ], + "description": "Handle the output of complex data structures ready for API output.", + "homepage": "http://fractal.thephpleague.com/", + "keywords": [ + "api", + "json", + "league", + "rest" + ], "support": { - "issues": "https://github.com/filamentphp/filament/issues", - "source": "https://github.com/filamentphp/filament" + "issues": "https://github.com/thephpleague/fractal/issues", + "source": "https://github.com/thephpleague/fractal/tree/0.20.2" }, - "time": "2024-10-08T14:24:26+00:00" + "time": "2025-02-14T21:33:14+00:00" }, { - "name": "firebase/php-jwt", - "version": "v6.10.1", + "name": "league/mime-type-detection", + "version": "1.16.0", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "500501c2ce893c824c801da135d02661199f60c5" + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", - "reference": "500501c2ce893c824c801da135d02661199f60c5", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { - "php": "^8.0" + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^7.4", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "psr/cache": "^2.0||^3.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0" - }, - "suggest": { - "ext-sodium": "Support EdDSA (Ed25519) signatures", - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { "psr-4": { - "Firebase\\JWT\\": "src" + "League\\MimeTypeDetection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], + "description": "Mime-type detection for Flysystem", "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, - "time": "2024-05-18T18:05:11+00:00" + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" }, { - "name": "fruitcake/php-cors", - "version": "v1.3.0", + "name": "league/oauth1-client", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/fruitcake/php-cors.git", - "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + "url": "https://github.com/thephpleague/oauth1-client.git", + "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", - "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/f9c94b088837eb1aae1ad7c4f23eb65cc6993055", + "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055", "shasum": "" }, "require": { - "php": "^7.4|^8.0", - "symfony/http-foundation": "^4.4|^5.4|^6|^7" + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "guzzlehttp/psr7": "^1.7|^2.0", + "php": ">=7.1||>=8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.5" + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^2.17", + "mockery/mockery": "^1.3.3", + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5||9.5" + }, + "suggest": { + "ext-simplexml": "For decoding XML-based responses." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.0-dev", + "dev-develop": "2.0-dev" } }, "autoload": { "psr-4": { - "Fruitcake\\Cors\\": "src/" + "League\\OAuth1\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2172,62 +3968,78 @@ ], "authors": [ { - "name": "Fruitcake", - "homepage": "https://fruitcake.nl" - }, - { - "name": "Barryvdh", - "email": "barryvdh@gmail.com" + "name": "Ben Corlett", + "email": "bencorlett@me.com", + "homepage": "http://www.webcomm.com.au", + "role": "Developer" } ], - "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", - "homepage": "https://github.com/fruitcake/php-cors", + "description": "OAuth 1.0 Client Library", "keywords": [ - "cors", - "laravel", - "symfony" + "Authentication", + "SSO", + "authorization", + "bitbucket", + "identity", + "idp", + "oauth", + "oauth1", + "single sign on", + "trello", + "tumblr", + "twitter" ], "support": { - "issues": "https://github.com/fruitcake/php-cors/issues", - "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + "issues": "https://github.com/thephpleague/oauth1-client/issues", + "source": "https://github.com/thephpleague/oauth1-client/tree/v1.11.0" }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2023-10-12T05:21:21+00:00" + "time": "2024-12-10T19:59:05+00:00" }, { - "name": "graham-campbell/result-type", - "version": "v1.1.2", + "name": "league/uri", + "version": "7.8.0", "source": { "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + "url": "https://github.com/thephpleague/uri.git", + "reference": "4436c6ec8d458e4244448b069cc572d088230b76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", - "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76", + "reference": "4436c6ec8d458e4244448b069cc572d088230b76", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2" + "league/uri-interfaces": "^7.8", + "php": "^8.1", + "psr/http-factory": "^1" }, - "require-dev": { - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2236,86 +4048,90 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "An Implementation Of The Result Type", + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" ], "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" } ], - "time": "2023-11-12T22:16:48+00:00" + "time": "2026-01-14T17:24:56+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "name": "league/uri-components", + "version": "7.8.0", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "url": "https://github.com/thephpleague/uri-components.git", + "reference": "8b5ffcebcc0842b76eb80964795bd56a8333b2ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/8b5ffcebcc0842b76eb80964795bd56a8333b2ba", + "reference": "8b5ffcebcc0842b76eb80964795bd56a8333b2ba", "shasum": "" }, "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", - "psr/log": "^1.1 || ^2.0 || ^3.0" + "league/uri": "^7.8", + "php": "^8.1" }, "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-mbstring": "to use the sorting algorithm of URLSearchParams", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "7.x-dev" } }, - "autoload": { - "files": [ - "src/functions_include.php" - ], + "autoload": { "psr-4": { - "GuzzleHttp\\": "src/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2324,104 +4140,79 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Guzzle is a PHP HTTP client library", + "description": "URI components manipulation library", + "homepage": "http://uri.thephpleague.com", "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "authority", + "components", + "fragment", + "host", + "middleware", + "modifier", + "path", + "port", + "query", + "rfc3986", + "scheme", + "uri", + "url", + "userinfo" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-components/tree/7.8.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2026-01-14T17:24:56+00:00" }, { - "name": "guzzlehttp/promises", - "version": "2.0.2", + "name": "league/uri-interfaces", + "version": "7.8.0", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4", + "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "7.x-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2430,92 +4221,97 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Guzzle promises library", + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "promise" + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2026-01-15T06:54:53+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.6.2", + "name": "livewire/livewire", + "version": "v3.7.10", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "url": "https://github.com/livewire/livewire.git", + "reference": "0dc679eb4c8b4470cb12522b5927ef08ca2358bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/livewire/livewire/zipball/0dc679eb4c8b4470cb12522b5927ef08ca2358bb", + "reference": "0dc679eb4c8b4470cb12522b5927ef08ca2358bb", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "illuminate/database": "^10.0|^11.0|^12.0", + "illuminate/routing": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/validation": "^10.0|^11.0|^12.0", + "laravel/prompts": "^0.1.24|^0.2|^0.3", + "league/mime-type-detection": "^1.9", + "php": "^8.1", + "symfony/console": "^6.0|^7.0", + "symfony/http-kernel": "^6.2|^7.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "calebporzio/sushi": "^2.1", + "laravel/framework": "^10.15.0|^11.0|^12.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^8.21.0|^9.0|^10.0", + "orchestra/testbench-dusk": "^8.24|^9.1|^10.0", + "phpunit/phpunit": "^10.4|^11.5", + "psy/psysh": "^0.11.22|^0.12" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "laravel": { + "aliases": { + "Livewire": "Livewire\\Livewire" + }, + "providers": [ + "Livewire\\LivewireServiceProvider" + ] } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Livewire\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2524,105 +4320,53 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" } ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], + "description": "A front-end framework for Laravel.", "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v3.7.10" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/livewire", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2026-02-09T22:49:33+00:00" }, { - "name": "guzzlehttp/uri-template", - "version": "v1.0.3", + "name": "masterminds/html5", + "version": "2.10.0", "source": { "type": "git", - "url": "https://github.com/guzzle/uri-template.git", - "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", - "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-php80": "^1.24" + "ext-dom": "*", + "php": ">=5.3.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", - "uri-template/tests": "1.0.0" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\UriTemplate\\": "src" + "Masterminds\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2631,87 +4375,102 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Matt Butcher", + "email": "technosophos@gmail.com" }, { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" + "name": "Matt Farina", + "email": "matt@mattfarina.com" }, { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" } ], - "description": "A polyfill class for uri_template of PHP", + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", "keywords": [ - "guzzlehttp", - "uri-template" + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" ], "support": { - "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", - "type": "tidelift" - } - ], - "time": "2023-12-03T19:50:20+00:00" + "time": "2025-07-25T09:04:22+00:00" }, { - "name": "kirschbaum-development/eloquent-power-joins", - "version": "4.0.0", + "name": "monolog/monolog", + "version": "3.10.0", "source": { "type": "git", - "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", - "reference": "c6c42a52c5a097cc11761e72782b2d0215692caf" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/c6c42a52c5a097cc11761e72782b2d0215692caf", - "reference": "c6c42a52c5a097cc11761e72782b2d0215692caf", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { - "illuminate/database": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "php": "^8.1" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "dev-master", - "laravel/legacy-factories": "^1.0@dev", - "orchestra/testbench": "^8.0|^9.0", - "phpunit/phpunit": "^10.0" + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Kirschbaum\\PowerJoins\\PowerJoinsServiceProvider" - ] + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Kirschbaum\\PowerJoins\\": "src" + "Monolog\\": "src/Monolog" } }, "notification-url": "https://packagist.org/downloads/", @@ -2720,63 +4479,71 @@ ], "authors": [ { - "name": "Luis Dalmolin", - "email": "luis.nh@gmail.com", - "role": "Developer" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "The Laravel magic applied to joins.", - "homepage": "https://github.com/kirschbaum-development/eloquent-power-joins", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", "keywords": [ - "eloquent", - "join", - "laravel", - "mysql" + "log", + "logging", + "psr-3" ], "support": { - "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", - "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.0.0" + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, - "time": "2024-10-06T12:28:14+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-01-02T08:56:05+00:00" }, { - "name": "laracasts/utilities", - "version": "3.2.3", + "name": "mtdowling/jmespath.php", + "version": "2.8.0", "source": { "type": "git", - "url": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer.git", - "reference": "4826fe062f58d07b13e72460141b21c8c07b736d" + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/PHP-Vars-To-Js-Transformer/zipball/4826fe062f58d07b13e72460141b21c8c07b736d", - "reference": "4826fe062f58d07b13e72460141b21c8c07b736d", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", "shasum": "" }, "require": { - "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "php": ">=5.5.0|>=7.2.5|>=8.0.0" + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "phpspec/phpspec": ">=2.0" + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" }, + "bin": [ + "bin/jp.php" + ], "type": "library", "extra": { - "laravel": { - "providers": [ - "Laracasts\\Utilities\\JavaScript\\JavaScriptServiceProvider" - ], - "aliases": { - "JavaScript": "Laracasts\\Utilities\\JavaScript\\JavaScriptFacade" - } + "branch-alias": { + "dev-master": "2.8-dev" } }, "autoload": { "files": [ - "src/helpers.php" + "src/JmesPath.php" ], "psr-4": { - "Laracasts\\Utilities\\JavaScript\\": "src/" + "JmesPath\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2785,202 +4552,147 @@ ], "authors": [ { - "name": "Jeffrey Way", - "email": "jeffrey@laracasts.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" } ], - "description": "Transform your PHP to JavaScript", + "description": "Declaratively specify how to extract elements from a JSON document", "keywords": [ - "javascript", - "laravel" + "json", + "jsonpath" ], "support": { - "issues": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer/issues", - "source": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer/tree/3.2.3" + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" }, - "time": "2024-03-03T16:53:37+00:00" + "time": "2024-09-04T18:46:31+00:00" }, { - "name": "laravel/framework", - "version": "v11.10.0", + "name": "myclabs/deep-copy", + "version": "1.13.4", "source": { "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "99b4255194912044b75ab72329f8c19e6345720e" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/99b4255194912044b75ab72329f8c19e6345720e", - "reference": "99b4255194912044b75ab72329f8c19e6345720e", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", - "composer-runtime-api": "^2.2", - "doctrine/inflector": "^2.0.5", - "dragonmantank/cron-expression": "^3.3.2", - "egulias/email-validator": "^3.2.1|^4.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "ext-session": "*", - "ext-tokenizer": "*", - "fruitcake/php-cors": "^1.3", - "guzzlehttp/guzzle": "^7.8", - "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18", - "laravel/serializable-closure": "^1.3", - "league/commonmark": "^2.2.1", - "league/flysystem": "^3.8.0", - "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.72.2|^3.0", - "nunomaduro/termwind": "^2.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/log": "^1.0|^2.0|^3.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "ramsey/uuid": "^4.7", - "symfony/console": "^7.0", - "symfony/error-handler": "^7.0", - "symfony/finder": "^7.0", - "symfony/http-foundation": "^7.0", - "symfony/http-kernel": "^7.0", - "symfony/mailer": "^7.0", - "symfony/mime": "^7.0", - "symfony/polyfill-php83": "^1.28", - "symfony/process": "^7.0", - "symfony/routing": "^7.0", - "symfony/uid": "^7.0", - "symfony/var-dumper": "^7.0", - "tijsverkoyen/css-to-inline-styles": "^2.2.5", - "vlucas/phpdotenv": "^5.4.1", - "voku/portable-ascii": "^2.0" + "php": "^7.1 || ^8.0" }, "conflict": { - "mockery/mockery": "1.6.8", - "tightenco/collect": "<5.5.33" + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0" + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, - "replace": { - "illuminate/auth": "self.version", - "illuminate/broadcasting": "self.version", - "illuminate/bus": "self.version", - "illuminate/cache": "self.version", - "illuminate/collections": "self.version", - "illuminate/conditionable": "self.version", - "illuminate/config": "self.version", - "illuminate/console": "self.version", - "illuminate/container": "self.version", - "illuminate/contracts": "self.version", - "illuminate/cookie": "self.version", - "illuminate/database": "self.version", - "illuminate/encryption": "self.version", - "illuminate/events": "self.version", - "illuminate/filesystem": "self.version", - "illuminate/hashing": "self.version", - "illuminate/http": "self.version", - "illuminate/log": "self.version", - "illuminate/macroable": "self.version", - "illuminate/mail": "self.version", - "illuminate/notifications": "self.version", - "illuminate/pagination": "self.version", - "illuminate/pipeline": "self.version", - "illuminate/process": "self.version", - "illuminate/queue": "self.version", - "illuminate/redis": "self.version", - "illuminate/routing": "self.version", - "illuminate/session": "self.version", - "illuminate/support": "self.version", - "illuminate/testing": "self.version", - "illuminate/translation": "self.version", - "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "spatie/once": "*" + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.1", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "f438fcc98f92babee98381d399c65336f3a3827f" }, - "require-dev": { - "ably/ably-php": "^1.0", - "aws/aws-sdk-php": "^3.235.5", - "ext-gmp": "*", - "fakerphp/faker": "^1.23", - "league/flysystem-aws-s3-v3": "^3.0", - "league/flysystem-ftp": "^3.0", - "league/flysystem-path-prefixing": "^3.3", - "league/flysystem-read-only": "^3.3", - "league/flysystem-sftp-v3": "^3.0", - "mockery/mockery": "^1.6", - "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^9.0.15", - "pda/pheanstalk": "^5.0", - "phpstan/phpstan": "^1.4.7", - "phpunit/phpunit": "^10.5|^11.0", - "predis/predis": "^2.0.2", - "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.0", - "symfony/http-client": "^7.0", - "symfony/psr-http-message-bridge": "^7.0" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/f438fcc98f92babee98381d399c65336f3a3827f", + "reference": "f438fcc98f92babee98381d399c65336f3a3827f", + "shasum": "" }, - "suggest": { - "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", - "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", - "ext-apcu": "Required to use the APC cache driver.", - "ext-fileinfo": "Required to use the Filesystem class.", - "ext-ftp": "Required to use the Flysystem FTP driver.", - "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", - "ext-memcached": "Required to use the memcache cache driver.", - "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", - "ext-pdo": "Required to use all database features.", - "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", - "filp/whoops": "Required for friendly error pages in development (^2.14.3).", - "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", - "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", - "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", - "league/flysystem-read-only": "Required to use read-only disks (^3.3)", - "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", - "mockery/mockery": "Required to use mocking (^1.6).", - "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", - "predis/predis": "Required to use the predis connector (^2.0.2).", - "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], "type": "library", "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { - "dev-master": "11.x-dev" + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { - "files": [ - "src/Illuminate/Collections/helpers.php", - "src/Illuminate/Events/functions.php", - "src/Illuminate/Filesystem/functions.php", - "src/Illuminate/Foundation/helpers.php", - "src/Illuminate/Support/helpers.php" - ], "psr-4": { - "Illuminate\\": "src/Illuminate/", - "Illuminate\\Support\\": [ - "src/Illuminate/Macroable/", - "src/Illuminate/Collections/", - "src/Illuminate/Conditionable/" - ] + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2989,309 +4701,377 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" } ], - "description": "The Laravel Framework.", - "homepage": "https://laravel.com", + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", "keywords": [ - "framework", - "laravel" + "date", + "datetime", + "time" ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" }, - "time": "2024-06-04T13:45:55+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-01-29T09:26:29+00:00" }, { - "name": "laravel/helpers", - "version": "v1.7.0", + "name": "nette/php-generator", + "version": "v4.2.1", "source": { "type": "git", - "url": "https://github.com/laravel/helpers.git", - "reference": "6caaa242a23bc39b4e3cf57304b5409260a7a346" + "url": "https://github.com/nette/php-generator.git", + "reference": "52aff4d9b12f20ca9f3e31a559b646d2fd21dd61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/helpers/zipball/6caaa242a23bc39b4e3cf57304b5409260a7a346", - "reference": "6caaa242a23bc39b4e3cf57304b5409260a7a346", + "url": "https://api.github.com/repos/nette/php-generator/zipball/52aff4d9b12f20ca9f3e31a559b646d2fd21dd61", + "reference": "52aff4d9b12f20ca9f3e31a559b646d2fd21dd61", "shasum": "" }, "require": { - "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "php": "^7.2.0|^8.0" + "nette/utils": "^4.0.6", + "php": "8.1 - 8.5" }, "require-dev": { - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^7.0|^8.0|^9.0|^10.0" + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.6", + "nikic/php-parser": "^5.0", + "phpstan/phpstan": "^2.0@stable", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "4.2-dev" } }, "autoload": { - "files": [ - "src/helpers.php" + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "name": "Dries Vints", - "email": "dries@laravel.com" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Provides backwards compatibility for helpers in the latest Laravel release.", + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.", + "homepage": "https://nette.org", "keywords": [ - "helpers", - "laravel" + "code", + "nette", + "php", + "scaffolding" ], "support": { - "source": "https://github.com/laravel/helpers/tree/v1.7.0" + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.2.1" }, - "time": "2023-11-30T14:09:05+00:00" + "time": "2026-02-09T05:43:31+00:00" }, { - "name": "laravel/prompts", - "version": "v0.1.25", + "name": "nette/schema", + "version": "v1.3.5", "source": { "type": "git", - "url": "https://github.com/laravel/prompts.git", - "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" + "url": "https://github.com/nette/schema.git", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", - "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", "shasum": "" }, "require": { - "ext-mbstring": "*", - "illuminate/collections": "^10.0|^11.0", - "php": "^8.1", - "symfony/console": "^6.2|^7.0" - }, - "conflict": { - "illuminate/console": ">=10.17.0 <10.25.0", - "laravel/framework": ">=10.17.0 <10.25.0" + "nette/utils": "^4.0", + "php": "8.1 - 8.5" }, "require-dev": { - "mockery/mockery": "^1.5", - "pestphp/pest": "^2.3", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-mockery": "^1.1" - }, - "suggest": { - "ext-pcntl": "Required for the spinner to be animated." + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "0.1.x-dev" + "dev-master": "1.3-dev" } }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Laravel\\Prompts\\": "src/" - } + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" ], - "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { - "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.25" + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.5" }, - "time": "2024-08-12T22:06:33+00:00" + "time": "2026-02-23T03:47:12+00:00" }, { - "name": "laravel/sanctum", - "version": "v4.0.2", + "name": "nette/utils", + "version": "v4.1.3", "source": { "type": "git", - "url": "https://github.com/laravel/sanctum.git", - "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1" + "url": "https://github.com/nette/utils.git", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/9cfc0ce80cabad5334efff73ec856339e8ec1ac1", - "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { - "ext-json": "*", - "illuminate/console": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/database": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2", - "symfony/console": "^7.0" + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { - "mockery/mockery": "^1.6", - "orchestra/testbench": "^9.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Laravel\\Sanctum\\SanctumServiceProvider" - ] + "branch-alias": { + "dev-master": "4.1-dev" } }, "autoload": { "psr-4": { - "Laravel\\Sanctum\\": "src/" - } + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", "keywords": [ - "auth", - "laravel", - "sanctum" + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" ], "support": { - "issues": "https://github.com/laravel/sanctum/issues", - "source": "https://github.com/laravel/sanctum" + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2024-04-10T19:39:58+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { - "name": "laravel/serializable-closure", - "version": "v1.3.3", + "name": "nikic/php-parser", + "version": "v5.7.0", "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "nesbot/carbon": "^2.61", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "Laravel\\SerializableClosure\\": "src/" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" + "name": "Nikita Popov" } ], - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "description": "A PHP parser written in PHP", "keywords": [ - "closure", - "laravel", - "serializable" + "parser", + "php" ], "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2023-11-08T14:08:06+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { - "name": "laravel/socialite", - "version": "v5.14.0", + "name": "nunomaduro/termwind", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/laravel/socialite.git", - "reference": "c7b0193a3753a29aff8ce80aa2f511917e6ed68a" + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/c7b0193a3753a29aff8ce80aa2f511917e6ed68a", - "reference": "c7b0193a3753a29aff8ce80aa2f511917e6ed68a", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", "shasum": "" }, "require": { - "ext-json": "*", - "firebase/php-jwt": "^6.4", - "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "league/oauth1-client": "^1.10.1", - "php": "^7.2|^8.0", - "phpseclib/phpseclib": "^3.0" + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.4.4 || ^8.0.4" }, "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.0|^9.3|^10.4" + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - }, "laravel": { "providers": [ - "Laravel\\Socialite\\SocialiteServiceProvider" - ], - "aliases": { - "Socialite": "Laravel\\Socialite\\Facades\\Socialite" - } + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" } }, "autoload": { + "files": [ + "src/Functions.php" + ], "psr-4": { - "Laravel\\Socialite\\": "src/" + "Termwind\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3300,63 +5080,85 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", - "homepage": "https://laravel.com", + "description": "It's like Tailwind CSS, but for the console.", "keywords": [ - "laravel", - "oauth" + "cli", + "console", + "css", + "package", + "php", + "style" ], "support": { - "issues": "https://github.com/laravel/socialite/issues", - "source": "https://github.com/laravel/socialite" + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" }, - "time": "2024-05-03T20:31:38+00:00" + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2026-02-16T23:10:27+00:00" }, { - "name": "laravel/tinker", - "version": "v2.9.0", + "name": "openspout/openspout", + "version": "v4.28.5", "source": { "type": "git", - "url": "https://github.com/laravel/tinker.git", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + "url": "https://github.com/openspout/openspout.git", + "reference": "ab05a09fe6fce57c90338f83280648a9786ce36b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "url": "https://api.github.com/repos/openspout/openspout/zipball/ab05a09fe6fce57c90338f83280648a9786ce36b", + "reference": "ab05a09fe6fce57c90338f83280648a9786ce36b", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.11.1|^0.12.0", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-filter": "*", + "ext-libxml": "*", + "ext-xmlreader": "*", + "ext-zip": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "mockery/mockery": "~1.3.3|^1.4.2", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3" + "ext-zlib": "*", + "friendsofphp/php-cs-fixer": "^3.68.3", + "infection/infection": "^0.29.10", + "phpbench/phpbench": "^1.4.0", + "phpstan/phpstan": "^2.1.2", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^11.5.4" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", + "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Laravel\\Tinker\\TinkerServiceProvider" - ] + "branch-alias": { + "dev-master": "3.3.x-dev" } }, "autoload": { "psr-4": { - "Laravel\\Tinker\\": "src/" + "OpenSpout\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3365,121 +5167,132 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Adrien Loison", + "email": "adrien@box.com" } ], - "description": "Powerful REPL for the Laravel framework.", + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://github.com/openspout/openspout", "keywords": [ - "REPL", - "Tinker", - "laravel", - "psysh" + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" ], "support": { - "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.9.0" + "issues": "https://github.com/openspout/openspout/issues", + "source": "https://github.com/openspout/openspout/tree/v4.28.5" }, - "time": "2024-01-04T16:10:04+00:00" + "funding": [ + { + "url": "https://paypal.me/filippotessarotto", + "type": "custom" + }, + { + "url": "https://github.com/Slamdunk", + "type": "github" + } + ], + "time": "2025-01-30T13:51:11+00:00" }, { - "name": "laravel/ui", - "version": "v4.5.2", + "name": "owenvoke/blade-fontawesome", + "version": "v2.9.1", "source": { "type": "git", - "url": "https://github.com/laravel/ui.git", - "reference": "c75396f63268c95b053c8e4814eb70e0875e9628" + "url": "https://github.com/owenvoke/blade-fontawesome.git", + "reference": "94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/c75396f63268c95b053c8e4814eb70e0875e9628", - "reference": "c75396f63268c95b053c8e4814eb70e0875e9628", + "url": "https://api.github.com/repos/owenvoke/blade-fontawesome/zipball/94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1", + "reference": "94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1", "shasum": "" }, "require": { - "illuminate/console": "^9.21|^10.0|^11.0", - "illuminate/filesystem": "^9.21|^10.0|^11.0", - "illuminate/support": "^9.21|^10.0|^11.0", - "illuminate/validation": "^9.21|^10.0|^11.0", - "php": "^8.0", - "symfony/console": "^6.0|^7.0" + "blade-ui-kit/blade-icons": "^1.5", + "illuminate/support": "^10.34|^11.0|^12.0", + "php": "^8.1" }, "require-dev": { - "orchestra/testbench": "^7.35|^8.15|^9.0", - "phpunit/phpunit": "^9.3|^10.4|^11.0" + "laravel/pint": "^1.13", + "orchestra/testbench": "^8.12|^9.0|^10.0", + "pestphp/pest": "^2.26|^3.7", + "phpstan/phpstan": "^1.10|^2.1", + "symfony/var-dumper": "^6.3|^7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - }, "laravel": { "providers": [ - "Laravel\\Ui\\UiServiceProvider" + "OwenVoke\\BladeFontAwesome\\BladeFontAwesomeServiceProvider" ] } }, "autoload": { "psr-4": { - "Laravel\\Ui\\": "src/", - "Illuminate\\Foundation\\Auth\\": "auth-backend/" + "OwenVoke\\BladeFontAwesome\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "description": "A package to easily make use of Font Awesome in your Laravel Blade views", + "support": { + "issues": "https://github.com/owenvoke/blade-fontawesome/issues", + "source": "https://github.com/owenvoke/blade-fontawesome/tree/v2.9.1" + }, + "funding": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "url": "https://ecologi.com/owenvoke?gift-trees", + "type": "custom" + }, + { + "url": "https://github.com/owenvoke", + "type": "github" } ], - "description": "Laravel UI utilities and presets.", - "keywords": [ - "laravel", - "ui" - ], - "support": { - "source": "https://github.com/laravel/ui/tree/v4.5.2" - }, - "time": "2024-05-08T18:07:10+00:00" + "time": "2025-03-28T16:03:42+00:00" }, { - "name": "lcobucci/clock", - "version": "3.2.0", + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", "source": { "type": "git", - "url": "https://github.com/lcobucci/clock.git", - "reference": "6f28b826ea01306b07980cb8320ab30b966cd715" + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/6f28b826ea01306b07980cb8320ab30b966cd715", - "reference": "6f28b826ea01306b07980cb8320ab30b966cd715", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", "shasum": "" }, "require": { - "php": "~8.2.0 || ~8.3.0", - "psr/clock": "^1.0" - }, - "provide": { - "psr/clock-implementation": "1.0" + "php": "^8" }, "require-dev": { - "infection/infection": "^0.27", - "lcobucci/coding-standard": "^11.0.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.10.25", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.13", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^10.2.3" + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" }, "type": "library", "autoload": { "psr-4": { - "Lcobucci\\Clock\\": "src" + "ParagonIE\\ConstantTime\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3488,336 +5301,259 @@ ], "authors": [ { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com" - } - ], - "description": "Yet another clock abstraction", - "support": { - "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" }, { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" } ], - "time": "2023-11-17T17:00:27+00:00" + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" }, { - "name": "lcobucci/jwt", - "version": "4.3.0", + "name": "paragonie/random_compat", + "version": "v9.99.100", "source": { "type": "git", - "url": "https://github.com/lcobucci/jwt.git", - "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4" + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/4d7de2fe0d51a96418c0d04004986e410e87f6b4", - "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4", - "shasum": "" - }, - "require": { - "ext-hash": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "ext-sodium": "*", - "lcobucci/clock": "^2.0 || ^3.0", - "php": "^7.4 || ^8.0" + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" }, "require-dev": { - "infection/infection": "^0.21", - "lcobucci/coding-standard": "^6.0", - "mikey179/vfsstream": "^1.6.7", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/php-invoker": "^3.1", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, - "type": "library", - "autoload": { - "psr-4": { - "Lcobucci\\JWT\\": "src" - } + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, + "type": "library", "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com", - "role": "Developer" + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" } ], - "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ - "JWS", - "jwt" + "csprng", + "polyfill", + "pseudorandom", + "random" ], "support": { - "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/4.3.0" + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2023-01-02T13:28:00+00:00" + "time": "2020-10-15T08:29:30+00:00" }, { - "name": "league/commonmark", - "version": "2.4.2", + "name": "phiki/phiki", + "version": "v2.1.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + "url": "https://github.com/phikiphp/phiki.git", + "reference": "b16020573e9f4ad3c9d230c17ed4c84c15356e28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", - "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "url": "https://api.github.com/repos/phikiphp/phiki/zipball/b16020573e9f4ad3c9d230c17ed4c84c15356e28", + "reference": "b16020573e9f4ad3c9d230c17ed4c84c15356e28", "shasum": "" }, "require": { "ext-mbstring": "*", - "league/config": "^1.1.1", - "php": "^7.4 || ^8.0", - "psr/event-dispatcher": "^1.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.16" + "league/commonmark": "^2.5.3", + "php": "^8.2", + "psr/simple-cache": "^3.0" }, "require-dev": { - "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.3", - "commonmark/commonmark.js": "0.30.0", - "composer/package-versions-deprecated": "^1.8", - "embed/embed": "^4.4", - "erusev/parsedown": "^1.0", - "ext-json": "*", - "github/gfm": "0.29.0", - "michelf/php-markdown": "^1.4 || ^2.0", - "nyholm/psr7": "^1.5", - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", - "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 || ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", - "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0 || ^5.0.0" - }, - "suggest": { - "symfony/yaml": "v2.3+ required if using the Front Matter extension" + "illuminate/support": "^11.45", + "laravel/pint": "^1.18.1", + "orchestra/testbench": "^9.15", + "pestphp/pest": "^3.5.1", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^7.1.6" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" + "laravel": { + "providers": [ + "Phiki\\Adapters\\Laravel\\PhikiServiceProvider" + ] } }, "autoload": { "psr-4": { - "League\\CommonMark\\": "src" + "Phiki\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" + "name": "Ryan Chandler", + "email": "support@ryangjchandler.co.uk", + "homepage": "https://ryangjchandler.co.uk", + "role": "Developer" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], + "description": "Syntax highlighting using TextMate grammars in PHP.", "support": { - "docs": "https://commonmark.thephpleague.com/", - "forum": "https://github.com/thephpleague/commonmark/discussions", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" + "issues": "https://github.com/phikiphp/phiki/issues", + "source": "https://github.com/phikiphp/phiki/tree/v2.1.0" }, "funding": [ { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", + "url": "https://github.com/sponsors/ryangjchandler", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" + "url": "https://buymeacoffee.com/ryangjchandler", + "type": "other" } ], - "time": "2024-02-02T11:59:32+00:00" + "time": "2026-01-20T21:26:48+00:00" }, { - "name": "league/config", - "version": "v1.2.0", + "name": "phpdocumentor/reflection", + "version": "6.4.4", "source": { "type": "git", - "url": "https://github.com/thephpleague/config.git", - "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "5e5db15b34e6eae755cb97beaa7fe076ae9e8d4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", - "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/5e5db15b34e6eae755cb97beaa7fe076ae9e8d4c", + "reference": "5e5db15b34e6eae755cb97beaa7fe076ae9e8d4c", "shasum": "" }, "require": { - "dflydev/dot-access-data": "^3.0.1", - "nette/schema": "^1.2", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.5", - "scrutinizer/ocular": "^1.8.1", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" + "composer-runtime-api": "^2", + "nikic/php-parser": "~4.18 || ^5.0", + "php": "8.1.*|8.2.*|8.3.*|8.4.*|8.5.*", + "phpdocumentor/reflection-common": "^2.1", + "phpdocumentor/reflection-docblock": "^5", + "phpdocumentor/type-resolver": "^1.4", + "symfony/polyfill-php80": "^1.28", + "webmozart/assert": "^1.7" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/coding-standard": "^13.0", + "eliashaeussler/phpunit-attributes": "^1.8", + "mikey179/vfsstream": "~1.2", + "mockery/mockery": "~1.6.0", + "phpspec/prophecy-phpunit": "^2.4", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^10.5.53", + "psalm/phar": "^6.0", + "rector/rector": "^1.0.0", + "squizlabs/php_codesniffer": "^3.8" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.2-dev" + "dev-5.x": "5.3.x-dev", + "dev-6.x": "6.0.x-dev" } }, "autoload": { + "files": [ + "src/php-parser/Modifiers.php" + ], "psr-4": { - "League\\Config\\": "src" + "phpDocumentor\\": "src/phpDocumentor" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } + "MIT" ], - "description": "Define configuration arrays with strict schemas and access values with dot notation", - "homepage": "https://config.thephpleague.com", + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org", "keywords": [ - "array", - "config", - "configuration", - "dot", - "dot-access", - "nested", - "schema" + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" ], "support": { - "docs": "https://config.thephpleague.com/", - "issues": "https://github.com/thephpleague/config/issues", - "rss": "https://github.com/thephpleague/config/releases.atom", - "source": "https://github.com/thephpleague/config" + "issues": "https://github.com/phpDocumentor/Reflection/issues", + "source": "https://github.com/phpDocumentor/Reflection/tree/6.4.4" }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - } - ], - "time": "2022-12-11T20:36:23+00:00" + "time": "2025-11-25T21:21:18+00:00" }, { - "name": "league/csv", - "version": "9.17.0", + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/csv.git", - "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011" + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/8cab815fb11ec93aa2f7b8a57b3daa1f1a364011", - "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^8.1.2" - }, - "require-dev": { - "ext-dom": "*", - "ext-xdebug": "*", - "friendsofphp/php-cs-fixer": "^3.64.0", - "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.12.5", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^10.5.16 || ^11.4.0", - "symfony/var-dumper": "^6.4.8 || ^7.1.5" - }, - "suggest": { - "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", - "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", - "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "9.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "League\\Csv\\": "src/" + "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3826,89 +5562,66 @@ ], "authors": [ { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://github.com/nyamsprod/", - "role": "Developer" + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" } ], - "description": "CSV data manipulation made easy in PHP", - "homepage": "https://csv.thephpleague.com", + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", "keywords": [ - "convert", - "csv", - "export", - "filter", - "import", - "read", - "transform", - "write" + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" ], "support": { - "docs": "https://csv.thephpleague.com", - "issues": "https://github.com/thephpleague/csv/issues", - "rss": "https://github.com/thephpleague/csv/releases.atom", - "source": "https://github.com/thephpleague/csv" + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2024-10-10T10:30:28+00:00" + "time": "2020-06-27T09:03:43+00:00" }, { - "name": "league/flysystem", - "version": "3.28.0", + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.6", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", "shasum": "" }, - "require": { - "league/flysystem-local": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "conflict": { - "async-aws/core": "<1.19.0", - "async-aws/s3": "<1.14.0", - "aws/aws-sdk-php": "3.209.31 || 3.210.0", - "guzzlehttp/guzzle": "<7.0", - "guzzlehttp/ringphp": "<1.1.1", - "phpseclib/phpseclib": "3.0.15", - "symfony/http-client": "<5.2" + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { - "async-aws/s3": "^1.5 || ^2.0", - "async-aws/simple-s3": "^1.1 || ^2.0", - "aws/aws-sdk-php": "^3.295.10", - "composer/semver": "^3.0", - "ext-fileinfo": "*", - "ext-ftp": "*", - "ext-mongodb": "^1.3", - "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.5", - "google/cloud-storage": "^1.23", - "guzzlehttp/psr7": "^2.6", - "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", - "phpseclib/phpseclib": "^3.0.36", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.5.11|^10.0", - "sabre/dav": "^4.6.0" + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { - "League\\Flysystem\\": "src" + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3917,58 +5630,60 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" } ], - "description": "File storage abstraction for PHP", - "keywords": [ - "WebDAV", - "aws", - "cloud", - "file", - "files", - "filesystem", - "filesystems", - "ftp", - "s3", - "sftp", - "storage" - ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" }, - "time": "2024-05-22T10:09:12+00:00" + "time": "2025-12-22T21:13:58+00:00" }, { - "name": "league/flysystem-aws-s3-v3", - "version": "3.12.2", + "name": "phpdocumentor/type-resolver", + "version": "1.12.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "645e14e4a80bd2da8b01e57388e7296a695a80c2" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/645e14e4a80bd2da8b01e57388e7296a695a80c2", - "reference": "645e14e4a80bd2da8b01e57388e7296a695a80c2", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", "shasum": "" }, "require": { - "aws/aws-sdk-php": "^3.220.0", - "league/flysystem": "^3.10.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" }, - "conflict": { - "guzzlehttp/guzzle": "<7.0", - "guzzlehttp/ringphp": "<1.1.1" + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" }, "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, "autoload": { "psr-4": { - "League\\Flysystem\\AwsS3V3\\": "" + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3977,112 +5692,128 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" } ], - "description": "AWS S3 filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "aws", - "file", - "files", - "filesystem", - "s3", - "storage" - ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { - "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.12.2" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2023-01-17T14:15:08+00:00" + "time": "2025-11-21T15:09:14+00:00" }, { - "name": "league/flysystem-local", - "version": "3.28.0", + "name": "phpoption/phpoption", + "version": "1.9.5", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "league/flysystem": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, "autoload": { "psr-4": { - "League\\Flysystem\\Local\\": "" + "PhpOption\\": "src/PhpOption/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "Local filesystem adapter for Flysystem.", + "description": "Option Type for PHP", "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "local" + "language", + "option", + "php", + "type" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" }, - "time": "2024-05-06T20:05:52+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:41:33+00:00" }, { - "name": "league/flysystem-memory", - "version": "3.10.3", + "name": "phpseclib/phpseclib", + "version": "3.0.49", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem-memory.git", - "reference": "5405162ac81f4de5aa5fa01aae7d07382b7c797b" + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/5405162ac81f4de5aa5fa01aae7d07382b7c797b", - "reference": "5405162ac81f4de5aa5fa01aae7d07382b7c797b", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/6233a1e12584754e6b5daa69fe1289b47775c1b9", + "reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "league/flysystem": "^2.0.0 || ^3.0.0", - "php": "^8.0.2" + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." }, "type": "library", "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], "psr-4": { - "League\\Flysystem\\InMemory\\": "" + "phpseclib3\\": "phpseclib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4091,135 +5822,145 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" } ], - "description": "In-memory filesystem adapter for Flysystem.", + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "memory" + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-memory/issues", - "source": "https://github.com/thephpleague/flysystem-memory/tree/3.10.3" + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.49" }, "funding": [ { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" + "url": "https://github.com/terrafrost", + "type": "github" }, { - "url": "https://github.com/frankdejonge", - "type": "github" + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", "type": "tidelift" } ], - "time": "2022-10-26T18:30:26+00:00" + "time": "2026-01-27T09:17:28+00:00" }, { - "name": "league/fractal", - "version": "0.20.1", + "name": "phpstan/phpdoc-parser", + "version": "2.3.2", "source": { "type": "git", - "url": "https://github.com/thephpleague/fractal.git", - "reference": "8b9d39b67624db9195c06f9c1ffd0355151eaf62" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/fractal/zipball/8b9d39b67624db9195c06f9c1ffd0355151eaf62", - "reference": "8b9d39b67624db9195c06f9c1ffd0355151eaf62", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { - "php": ">=7.4" + "php": "^7.4 || ^8.0" }, "require-dev": { - "doctrine/orm": "^2.5", - "illuminate/contracts": "~5.0", - "mockery/mockery": "^1.3", - "pagerfanta/pagerfanta": "~1.0.0", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "~3.4", - "vimeo/psalm": "^4.22", - "zendframework/zend-paginator": "~2.3" - }, - "suggest": { - "illuminate/pagination": "The Illuminate Pagination component.", - "pagerfanta/pagerfanta": "Pagerfanta Paginator", - "zendframework/zend-paginator": "Zend Framework Paginator" + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.20.x-dev" - } - }, "autoload": { "psr-4": { - "League\\Fractal\\": "src" + "PHPStan\\PhpDocParser\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Phil Sturgeon", - "email": "me@philsturgeon.uk", - "homepage": "http://philsturgeon.uk/", - "role": "Developer" - } - ], - "description": "Handle the output of complex data structures ready for API output.", - "homepage": "http://fractal.thephpleague.com/", - "keywords": [ - "api", - "json", - "league", - "rest" - ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/thephpleague/fractal/issues", - "source": "https://github.com/thephpleague/fractal/tree/0.20.1" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2022-04-11T12:47:17+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { - "name": "league/mime-type-detection", - "version": "1.16.0", + "name": "pragmarx/google2fa", + "version": "v9.0.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/e6bc62dd6ae83acc475f57912e27466019a1f2cf", + "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" + "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", + "php": "^7.1|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" }, "type": "library", "autoload": { "psr-4": { - "League\\MimeTypeDetection\\": "src" + "PragmaRX\\Google2FA\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4228,68 +5969,63 @@ ], "authors": [ { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" } ], - "description": "Mime-type detection for Flysystem", + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v9.0.0" }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2024-09-21T08:32:55+00:00" + "time": "2025-09-19T22:51:08+00:00" }, { - "name": "league/oauth1-client", - "version": "v1.10.1", + "name": "pragmarx/google2fa-qrcode", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/oauth1-client.git", - "reference": "d6365b901b5c287dd41f143033315e2f777e1167" + "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", + "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167", - "reference": "d6365b901b5c287dd41f143033315e2f777e1167", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/ce4d8a729b6c93741c607cfb2217acfffb5bf76b", + "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b", "shasum": "" }, "require": { - "ext-json": "*", - "ext-openssl": "*", - "guzzlehttp/guzzle": "^6.0|^7.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "php": ">=7.1||>=8.0" + "php": ">=7.1", + "pragmarx/google2fa": ">=4.0" }, "require-dev": { - "ext-simplexml": "*", - "friendsofphp/php-cs-fixer": "^2.17", - "mockery/mockery": "^1.3.3", - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5||9.5" + "bacon/bacon-qr-code": "^2.0", + "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0", + "khanamiryan/qrcode-detector-decoder": "^1.0", + "phpunit/phpunit": "~4|~5|~6|~7|~8|~9" }, "suggest": { - "ext-simplexml": "For decoding XML-based responses." + "bacon/bacon-qr-code": "For QR Code generation, requires imagick", + "chillerlan/php-qrcode": "For QR Code generation" }, "type": "library", "extra": { + "component": "package", "branch-alias": { - "dev-master": "1.0-dev", - "dev-develop": "2.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "League\\OAuth1\\Client\\": "src/" + "PragmaRX\\Google2FAQRCode\\": "src/", + "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4298,73 +6034,56 @@ ], "authors": [ { - "name": "Ben Corlett", - "email": "bencorlett@me.com", - "homepage": "http://www.webcomm.com.au", - "role": "Developer" + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" } ], - "description": "OAuth 1.0 Client Library", + "description": "QR Code package for Google2FA", "keywords": [ + "2fa", "Authentication", - "SSO", - "authorization", - "bitbucket", - "identity", - "idp", - "oauth", - "oauth1", - "single sign on", - "trello", - "tumblr", - "twitter" + "Two Factor Authentication", + "google2fa", + "qr code", + "qrcode" ], "support": { - "issues": "https://github.com/thephpleague/oauth1-client/issues", - "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1" + "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues", + "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.0" }, - "time": "2022-04-15T14:02:14+00:00" + "time": "2021-08-15T12:53:48+00:00" }, { - "name": "league/uri", - "version": "7.4.1", + "name": "predis/predis", + "version": "v2.4.1", "source": { "type": "git", - "url": "https://github.com/thephpleague/uri.git", - "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4" + "url": "https://github.com/predis/predis.git", + "reference": "07105e050622ed80bd60808367ced9e379f31530" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4", - "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4", + "url": "https://api.github.com/repos/predis/predis/zipball/07105e050622ed80bd60808367ced9e379f31530", + "reference": "07105e050622ed80bd60808367ced9e379f31530", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.3", - "php": "^8.1" + "php": "^7.2 || ^8.0" }, - "conflict": { - "league/uri-schemes": "^1.0" + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.3", + "phpstan/phpstan": "^1.9", + "phpunit/phpcov": "^6.0 || ^8.0", + "phpunit/phpunit": "^8.0 || ^9.4" }, "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-fileinfo": "to create Data URI from file contennts", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "php-64bit": "to improve IPV4 host parsing", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, "autoload": { "psr-4": { - "League\\Uri\\": "" + "Predis\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4373,183 +6092,104 @@ ], "authors": [ { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" } ], - "description": "URI manipulation library", - "homepage": "https://uri.thephpleague.com", + "description": "A flexible and feature-complete Redis/Valkey client for PHP.", + "homepage": "http://github.com/predis/predis", "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "middleware", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "uri-template", - "url", - "ws" + "nosql", + "predis", + "redis" ], "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.4.1" + "issues": "https://github.com/predis/predis/issues", + "source": "https://github.com/predis/predis/tree/v2.4.1" }, "funding": [ { - "url": "https://github.com/sponsors/nyamsprod", + "url": "https://github.com/sponsors/tillkruss", "type": "github" } ], - "time": "2024-03-23T07:42:40+00:00" + "time": "2025-11-12T18:00:11+00:00" }, { - "name": "league/uri-interfaces", - "version": "7.4.1", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "8d43ef5c841032c87e2de015972c06f3865ef718" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718", - "reference": "8d43ef5c841032c87e2de015972c06f3865ef718", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^8.1", - "psr/http-factory": "^1", - "psr/http-message": "^1.1 || ^2.0" - }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "php-64bit": "to improve IPV4 host parsing", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + "php": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, "autoload": { "psr-4": { - "League\\Uri\\": "" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "Common interfaces and classes for URI representation and interaction", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "url", - "ws" - ], - "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1" - }, - "funding": [ + "authors": [ { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "time": "2024-03-23T07:42:40+00:00" + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "livewire/livewire", - "version": "v3.5.6", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/livewire/livewire.git", - "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", - "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "illuminate/database": "^10.0|^11.0", - "illuminate/routing": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "illuminate/validation": "^10.0|^11.0", - "laravel/prompts": "^0.1.24", - "league/mime-type-detection": "^1.9", - "php": "^8.1", - "symfony/console": "^6.0|^7.0", - "symfony/http-kernel": "^6.2|^7.0" - }, - "require-dev": { - "calebporzio/sushi": "^2.1", - "laravel/framework": "^10.15.0|^11.0", - "mockery/mockery": "^1.3.1", - "orchestra/testbench": "^8.21.0|^9.0", - "orchestra/testbench-dusk": "^8.24|^9.1", - "phpunit/phpunit": "^10.4", - "psy/psysh": "^0.11.22|^0.12" + "php": ">=7.4.0" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Livewire\\LivewireServiceProvider" - ], - "aliases": { - "Livewire": "Livewire\\Livewire" - } + "branch-alias": { + "dev-master": "2.0.x-dev" } }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Livewire\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4558,53 +6198,51 @@ ], "authors": [ { - "name": "Caleb Porzio", - "email": "calebporzio@gmail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A front-end framework for Laravel.", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], "support": { - "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.5.6" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "funding": [ - { - "url": "https://github.com/livewire", - "type": "github" - } - ], - "time": "2024-08-19T11:52:18+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "masterminds/html5", - "version": "2.9.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Masterminds\\": "src" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4613,100 +6251,49 @@ ], "authors": [ { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", + "description": "Standard interfaces for event handling.", "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2024-03-31T07:05:07+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "monolog/monolog", - "version": "3.6.0", + "name": "psr/http-client", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", - "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Monolog\\": "src/Monolog" + "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4715,71 +6302,50 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", "keywords": [ - "log", - "logging", - "psr-3" + "http", + "http-client", + "psr", + "psr-18" ], "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/php-fig/http-client" }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { - "name": "mtdowling/jmespath.php", - "version": "2.7.0", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, - "bin": [ - "bin/jp.php" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "files": [ - "src/JmesPath.php" - ], "psr-4": { - "JmesPath\\": "src/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4788,88 +6354,52 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Declaratively specify how to extract elements from a JSON document", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "json", - "jsonpath" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-08-25T10:54:48+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "nesbot/carbon", - "version": "3.5.0", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "415782b7e48223342f1a616c16c45a95b15b2318" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/415782b7e48223342f1a616c16c45a95b15b2318", - "reference": "415782b7e48223342f1a616c16c45a95b15b2318", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "carbonphp/carbon-doctrine-types": "*", - "ext-json": "*", - "php": "^8.1", - "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "require-dev": { - "doctrine/dbal": "^3.6.3 || ^4.0", - "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", - "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", - "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "php": "^7.2 || ^8.0" }, - "bin": [ - "bin/carbon" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev", - "dev-2.x": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4878,297 +6408,231 @@ ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" - }, - { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "date", - "datetime", - "time" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "funding": [ - { - "url": "https://github.com/sponsors/kylekatarnls", - "type": "github" - }, - { - "url": "https://opencollective.com/Carbon#sponsor", - "type": "opencollective" - }, - { - "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", - "type": "tidelift" - } - ], - "time": "2024-06-03T17:25:54+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "nette/schema", - "version": "v1.3.0", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "nette/utils": "^4.0", - "php": "8.1 - 8.3" - }, - "require-dev": { - "nette/tester": "^2.4", - "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.8" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "3.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Log\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "config", - "nette" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2023-12-11T11:54:22+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "nette/utils", - "version": "v4.0.4", + "name": "psr/simple-cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", - "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": ">=8.0 <8.4" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" - }, - "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", + "description": "Common interfaces for simple caching", "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" ], "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.4" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2024-01-17T16:50:36+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.0.2", + "name": "psy/psysh", + "version": "v0.12.20", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "url": "https://github.com/bobthecow/psysh.git", + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373", + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.4" + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, "bin": [ - "bin/php-parse" + "bin/psysh" ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "0.12.x-dev" } }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Psy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Justin Hileman", + "email": "justin@justinhileman.info" } ], - "description": "A PHP parser written in PHP", + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", "keywords": [ - "parser", - "php" + "REPL", + "console", + "interactive", + "shell" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.20" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2026-02-11T15:05:28+00:00" }, { - "name": "nunomaduro/termwind", - "version": "v2.0.1", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/58c4c58cf23df7f498daeb97092e34f5259feb6a", - "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": "^8.2", - "symfony/console": "^7.0.4" + "php": ">=5.6" }, "require-dev": { - "ergebnis/phpstan-rules": "^2.2.0", - "illuminate/console": "^11.0.0", - "laravel/pint": "^1.14.0", - "mockery/mockery": "^1.6.7", - "pestphp/pest": "^2.34.1", - "phpstan/phpstan": "^1.10.59", - "phpstan/phpstan-strict-rules": "^1.5.2", - "symfony/var-dumper": "^7.0.4", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - }, - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, "autoload": { - "files": [ - "src/Functions.php" - ], - "psr-4": { - "Termwind\\": "src/" - } + "files": [ + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5176,85 +6640,65 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" } ], - "description": "Its like Tailwind CSS, but for the console.", - "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" - ], + "description": "A polyfill for getallheaders.", "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.0.1" + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/xiCO2k", - "type": "github" - } - ], - "time": "2024-03-06T16:17:14+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { - "name": "openspout/openspout", - "version": "v4.26.0", + "name": "ramsey/collection", + "version": "2.1.1", "source": { "type": "git", - "url": "https://github.com/openspout/openspout.git", - "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50" + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openspout/openspout/zipball/a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", - "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-filter": "*", - "ext-libxml": "*", - "ext-xmlreader": "*", - "ext-zip": "*", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "^8.1" }, "require-dev": { - "ext-zlib": "*", - "friendsofphp/php-cs-fixer": "^3.64.0", - "infection/infection": "^0.29.6", - "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.12.4", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^11.3.6" - }, - "suggest": { - "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", - "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" } }, "autoload": { "psr-4": { - "OpenSpout\\": "src/" + "Ramsey\\Collection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5263,420 +6707,396 @@ ], "authors": [ { - "name": "Adrien Loison", - "email": "adrien@box.com" + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" } ], - "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", - "homepage": "https://github.com/openspout/openspout", + "description": "A PHP library for representing and manipulating collections.", "keywords": [ - "OOXML", - "csv", - "excel", - "memory", - "odf", - "ods", - "office", - "open", - "php", - "read", - "scale", - "spreadsheet", - "stream", - "write", - "xlsx" + "array", + "collection", + "hash", + "map", + "queue", + "set" ], "support": { - "issues": "https://github.com/openspout/openspout/issues", - "source": "https://github.com/openspout/openspout/tree/v4.26.0" + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://paypal.me/filippotessarotto", - "type": "custom" - }, - { - "url": "https://github.com/Slamdunk", - "type": "github" - } - ], - "time": "2024-09-24T14:04:43+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { - "name": "paragonie/constant_time_encoding", - "version": "v2.7.0", + "name": "ramsey/uuid", + "version": "4.9.2", "source": { "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105" + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105", - "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", "shasum": "" }, "require": { - "php": "^7|^8" + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" + "Ramsey\\Uuid\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https://www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" + "guid", + "identifier", + "uuid" ], "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.2" }, - "time": "2024-05-08T12:18:48+00:00" + "time": "2025-12-14T04:43:48+00:00" }, { - "name": "paragonie/random_compat", - "version": "v9.99.100", + "name": "ryangjchandler/blade-capture-directive", + "version": "v1.1.0", "source": { "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + "url": "https://github.com/ryangjchandler/blade-capture-directive.git", + "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d", + "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d", "shasum": "" }, "require": { - "php": ">= 7" + "illuminate/contracts": "^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9.2" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + "nunomaduro/collision": "^7.0|^8.0", + "nunomaduro/larastan": "^2.0|^3.0", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "pestphp/pest": "^2.0|^3.7", + "pestphp/pest-plugin-laravel": "^2.0|^3.1", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.0|^2.0", + "phpunit/phpunit": "^10.0|^11.5.3", + "spatie/laravel-ray": "^1.26" }, "type": "library", + "extra": { + "laravel": { + "aliases": { + "BladeCaptureDirective": "RyanChandler\\BladeCaptureDirective\\Facades\\BladeCaptureDirective" + }, + "providers": [ + "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "RyanChandler\\BladeCaptureDirective\\": "src", + "RyanChandler\\BladeCaptureDirective\\Database\\Factories\\": "database/factories" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" + "name": "Ryan Chandler", + "email": "support@ryangjchandler.co.uk", + "role": "Developer" } ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "description": "Create inline partials in your Blade templates with ease.", + "homepage": "https://github.com/ryangjchandler/blade-capture-directive", "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" + "blade-capture-directive", + "laravel", + "ryangjchandler" ], "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" + "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues", + "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.1.0" }, - "time": "2020-10-15T08:29:30+00:00" + "funding": [ + { + "url": "https://github.com/ryangjchandler", + "type": "github" + } + ], + "time": "2025-02-25T09:09:36+00:00" }, { - "name": "phpoption/phpoption", - "version": "1.9.2", + "name": "s1lentium/iptools", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + "url": "https://github.com/S1lentium/IPTools.git", + "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", - "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "url": "https://api.github.com/repos/S1lentium/IPTools/zipball/88be1aaaab3c50fc131ebe778e246215ff006d8e", + "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "ext-bcmath": "*", + "php": "^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^9.0" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, "autoload": { "psr-4": { - "PhpOption\\": "src/PhpOption/" + "IPTools\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "Safarov Alisher", + "email": "alisher.safarov@outlook.com", + "homepage": "https://github.com/S1lentium" } ], - "description": "Option Type for PHP", + "description": "PHP Library for manipulating network addresses (IPv4 and IPv6)", "keywords": [ - "language", - "option", - "php", - "type" + "IP", + "IP-Tools", + "cidr", + "ipv4", + "ipv6", + "network", + "subnet" ], "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + "issues": "https://github.com/S1lentium/IPTools/issues", + "source": "https://github.com/S1lentium/IPTools/tree/v1.2.0" }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2023-11-12T21:59:55+00:00" + "time": "2022-08-17T14:28:59+00:00" }, { - "name": "phpseclib/phpseclib", - "version": "3.0.37", + "name": "scrivo/highlight.php", + "version": "v9.18.1.10", "source": { "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", + "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1|^2", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" + "ext-json": "*", + "php": ">=5.4" }, "require-dev": { - "phpunit/phpunit": "*" + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4|^5.4", + "symfony/var-dumper": "^2.8|^3.4|^5.4" }, "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" }, "type": "library", "autoload": { "files": [ - "phpseclib/bootstrap.php" + "HighlightUtilities/functions.php" ], - "psr-4": { - "phpseclib3\\": "phpseclib/" + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" }, { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" }, { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" } ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" ], "support": { - "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" + "issues": "https://github.com/scrivo/highlight.php/issues", + "source": "https://github.com/scrivo/highlight.php" }, "funding": [ { - "url": "https://github.com/terrafrost", + "url": "https://github.com/allejo", "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" } ], - "time": "2024-03-03T02:14:58+00:00" + "time": "2022-12-17T21:53:22+00:00" }, { - "name": "phpstan/phpdoc-parser", - "version": "1.29.1", + "name": "secondnetwork/blade-tabler-icons", + "version": "v3.37.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" + "url": "https://github.com/secondnetwork/blade-tabler-icons.git", + "reference": "97b03688aa4925091cbb33f39578bf3dc79bd474" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "url": "https://api.github.com/repos/secondnetwork/blade-tabler-icons/zipball/97b03688aa4925091cbb33f39578bf3dc79bd474", + "reference": "97b03688aa4925091cbb33f39578bf3dc79bd474", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "blade-ui-kit/blade-icons": "^1.8", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0", + "php": "^8.0" }, "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" + "orchestra/testbench": "^6.0|^7.0|^9.0", + "phpunit/phpunit": "^9.0|^10.0|^11.0|^12.0" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "secondnetwork\\TablerIcons\\BladeTablerIconsServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] + "secondnetwork\\TablerIcons\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", + "authors": [ + { + "name": "Andreas Farah" + } + ], + "description": "A package to easily make use of tabler-icons in your Laravel Blade views.", + "homepage": "https://github.com/secondnetwork/blade-tabler-icons", + "keywords": [ + "blade", + "laravel", + "tabler-icons" + ], "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" + "issues": "https://github.com/secondnetwork/blade-tabler-icons/issues", + "source": "https://github.com/secondnetwork/blade-tabler-icons/tree/v3.37.0" }, - "time": "2024-05-31T08:52:43+00:00" + "time": "2026-02-22T18:54:55+00:00" }, { - "name": "pragmarx/google2fa", - "version": "v8.0.1", + "name": "socialiteproviders/authentik", + "version": "5.3.0", "source": { "type": "git", - "url": "https://github.com/antonioribeiro/google2fa.git", - "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + "url": "https://github.com/SocialiteProviders/Authentik.git", + "reference": "4ef0ca226d3be29dc0523f3afc86b63fd6b755b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", - "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "url": "https://api.github.com/repos/SocialiteProviders/Authentik/zipball/4ef0ca226d3be29dc0523f3afc86b63fd6b755b4", + "reference": "4ef0ca226d3be29dc0523f3afc86b63fd6b755b4", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1.0|^2.0", - "php": "^7.1|^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + "ext-json": "*", + "php": "^8.0", + "socialiteproviders/manager": "^4.4" }, "type": "library", "autoload": { "psr-4": { - "PragmaRX\\Google2FA\\": "src/" + "SocialiteProviders\\Authentik\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5685,50 +7105,48 @@ ], "authors": [ { - "name": "Antonio Carlos Ribeiro", - "email": "acr@antoniocarlosribeiro.com", - "role": "Creator & Designer" + "name": "rf152", + "email": "git@rf152.co.uk" } ], - "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "description": "Authentik OAuth2 Provider for Laravel Socialite", "keywords": [ - "2fa", - "Authentication", - "Two Factor Authentication", - "google2fa" + "authentik", + "laravel", + "oauth", + "provider", + "socialite" ], "support": { - "issues": "https://github.com/antonioribeiro/google2fa/issues", - "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + "docs": "https://socialiteproviders.com/authentik", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" }, - "time": "2022-06-13T21:57:56+00:00" + "time": "2026-02-04T14:27:03+00:00" }, { - "name": "predis/predis", - "version": "v2.1.2", + "name": "socialiteproviders/discord", + "version": "4.2.0", "source": { "type": "git", - "url": "https://github.com/predis/predis.git", - "reference": "a77a43913a74f9331f637bb12867eb8e274814e5" + "url": "https://github.com/SocialiteProviders/Discord.git", + "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/a77a43913a74f9331f637bb12867eb8e274814e5", - "reference": "a77a43913a74f9331f637bb12867eb8e274814e5", + "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/c71c379acfdca5ba4aa65a3db5ae5222852a919c", + "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.3", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^8.0 || ~9.4.4" + "ext-json": "*", + "php": "^7.4 || ^8.0", + "socialiteproviders/manager": "~4.0" }, "type": "library", "autoload": { "psr-4": { - "Predis\\": "src/" + "SocialiteProviders\\Discord\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5737,67 +7155,59 @@ ], "authors": [ { - "name": "Till Krüss", - "homepage": "https://till.im", - "role": "Maintainer" + "name": "Christopher Eklund", + "email": "eklundchristopher@gmail.com" } ], - "description": "A flexible and feature-complete Redis client for PHP.", - "homepage": "http://github.com/predis/predis", + "description": "Discord OAuth2 Provider for Laravel Socialite", "keywords": [ - "nosql", - "predis", - "redis" + "discord", + "laravel", + "oauth", + "provider", + "socialite" ], "support": { - "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v2.1.2" + "docs": "https://socialiteproviders.com/discord", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" }, - "funding": [ - { - "url": "https://github.com/sponsors/tillkruss", - "type": "github" - } - ], - "time": "2023-03-02T18:32:04+00:00" + "time": "2023-07-24T23:28:47+00:00" }, { - "name": "prologue/alerts", - "version": "1.2.0", + "name": "socialiteproviders/manager", + "version": "v4.8.1", "source": { "type": "git", - "url": "https://github.com/prologuephp/alerts.git", - "reference": "00c4662ce50a633c39d3424698baa5cbfb880da3" + "url": "https://github.com/SocialiteProviders/Manager.git", + "reference": "8180ec14bef230ec2351cff993d5d2d7ca470ef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/prologuephp/alerts/zipball/00c4662ce50a633c39d3424698baa5cbfb880da3", - "reference": "00c4662ce50a633c39d3424698baa5cbfb880da3", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/8180ec14bef230ec2351cff993d5d2d7ca470ef4", + "reference": "8180ec14bef230ec2351cff993d5d2d7ca470ef4", "shasum": "" }, "require": { - "illuminate/config": "~9|^10|^11.0", - "illuminate/session": "~9|^10|^11.0", - "illuminate/support": "~9|^10|^11.0" + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "laravel/socialite": "^5.5", + "php": "^8.1" }, "require-dev": { - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^9|^10.5" + "mockery/mockery": "^1.2", + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "laravel": { "providers": [ - "Prologue\\Alerts\\AlertsServiceProvider" - ], - "aliases": { - "Alert": "Prologue\\Alerts\\Facades\\Alert" - } + "SocialiteProviders\\Manager\\ServiceProvider" + ] } }, "autoload": { "psr-4": { - "Prologue\\Alerts\\": "src/" + "SocialiteProviders\\Manager\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5806,56 +7216,61 @@ ], "authors": [ { - "name": "Dries Vints", - "email": "dries.vints@gmail.com", - "homepage": "http://driesvints.com", - "role": "Creator" + "name": "Andy Wendt", + "email": "andy@awendt.com" }, { - "name": "Cristian Tabacitu", - "email": "hello@tabacitu.ro", - "homepage": "http://tabacitu.ro", - "role": "Maintainer" + "name": "Anton Komarev", + "email": "a.komarev@cybercog.su" + }, + { + "name": "Miguel Piedrafita", + "email": "soy@miguelpiedrafita.com" + }, + { + "name": "atymic", + "email": "atymicq@gmail.com", + "homepage": "https://atymic.dev" } ], - "description": "Prologue Alerts is a package that handles global site messages.", + "description": "Easily add new or override built-in providers in Laravel Socialite.", + "homepage": "https://socialiteproviders.com", "keywords": [ - "alerts", "laravel", - "messages" + "manager", + "oauth", + "providers", + "socialite" ], "support": { - "issues": "https://github.com/prologuephp/alerts/issues", - "source": "https://github.com/prologuephp/alerts/tree/1.2.0" + "issues": "https://github.com/socialiteproviders/manager/issues", + "source": "https://github.com/socialiteproviders/manager" }, - "time": "2024-03-12T11:23:19+00:00" + "time": "2025-02-24T19:33:30+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "socialiteproviders/steam", + "version": "4.3.1", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/SocialiteProviders/Steam.git", + "reference": "b92e57db0dc498a2328d98db1ede379528ace211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/SocialiteProviders/Steam/zipball/b92e57db0dc498a2328d98db1ede379528ace211", + "reference": "b92e57db0dc498a2328d98db1ede379528ace211", "shasum": "" }, "require": { - "php": ">=8.0.0" + "ext-json": "*", + "php": "^8.0", + "socialiteproviders/manager": "^4.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "SocialiteProviders\\Steam\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5864,42 +7279,58 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Christopher Eklund", + "email": "eklundchristopher@gmail.com" } ], - "description": "Common interface for caching libraries", + "description": "Steam OpenID Provider for Laravel Socialite", "keywords": [ - "cache", - "psr", - "psr-6" + "OpenId", + "laravel", + "oauth", + "provider", + "socialite", + "steam" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "docs": "https://socialiteproviders.com/steam", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2025-02-12T21:49:52+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "spatie/enum", + "version": "3.13.0", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/spatie/enum.git", + "reference": "f1a0f464ba909491a53e60a955ce84ad7cd93a2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/spatie/enum/zipball/f1a0f464ba909491a53e60a955ce84ad7cd93a2c", + "reference": "f1a0f464ba909491a53e60a955ce84ad7cd93a2c", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "ext-json": "*", + "php": "^8.0" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "larapack/dd": "^1.1", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "^4.3" + }, + "suggest": { + "fakerphp/faker": "To use the enum faker provider", + "phpunit/phpunit": "To use the enum assertions" }, "type": "library", "autoload": { "psr-4": { - "Psr\\Clock\\": "src/" + "Spatie\\Enum\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5908,51 +7339,69 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Brent Roose", + "email": "brent@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Tom Witkowski", + "email": "dev@gummibeer.de", + "homepage": "https://gummibeer.de", + "role": "Developer" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", + "description": "PHP Enums", + "homepage": "https://github.com/spatie/enum", "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" + "enum", + "enumerable", + "spatie" ], "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "docs": "https://docs.spatie.be/enum", + "issues": "https://github.com/spatie/enum/issues", + "source": "https://github.com/spatie/enum" }, - "time": "2022-11-25T14:36:26+00:00" + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-04-22T08:51:55+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "spatie/fractalistic", + "version": "2.11.1", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/spatie/fractalistic.git", + "reference": "85d6ff9a93f00d902e17924bb1475163b373c890" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/spatie/fractalistic/zipball/85d6ff9a93f00d902e17924bb1475163b373c890", + "reference": "85d6ff9a93f00d902e17924bb1475163b373c890", "shasum": "" }, "require": { - "php": ">=7.4.0" + "league/fractal": "^0.20.1", + "php": "^7.4|^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "require-dev": { + "illuminate/pagination": "~5.3.0|~5.4.0|^9.0|^13.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.0" }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Spatie\\Fractalistic\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5961,51 +7410,62 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "A developer friendly wrapper around Fractal", + "homepage": "https://github.com/spatie/fractalistic", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "api", + "fractal", + "fractalistic", + "spatie", + "transform" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "issues": "https://github.com/spatie/fractalistic/issues", + "source": "https://github.com/spatie/fractalistic/tree/2.11.1" }, - "time": "2021-11-05T16:47:00+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-21T21:10:25+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "spatie/invade", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/spatie/invade.git", + "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63", + "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "pestphp/pest": "^1.20", + "phpstan/phpstan": "^1.4", + "spatie/ray": "^1.28" }, + "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Spatie\\Invade\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6014,49 +7474,78 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" } ], - "description": "Standard interfaces for event handling.", + "description": "A PHP function to work with private properties and methods", + "homepage": "https://github.com/spatie/invade", "keywords": [ - "events", - "psr", - "psr-14" + "invade", + "spatie" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "source": "https://github.com/spatie/invade/tree/2.1.0" }, - "time": "2019-01-08T18:20:26+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-17T09:06:10+00:00" }, { - "name": "psr/http-client", - "version": "1.0.3", + "name": "spatie/laravel-data", + "version": "4.19.1", "source": { "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + "url": "https://github.com/spatie/laravel-data.git", + "reference": "41ed0472250676f19440fb24d7b62a8d43abdb89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/41ed0472250676f19440fb24d7b62a8d43abdb89", + "reference": "41ed0472250676f19440fb24d7b62a8d43abdb89", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" + "illuminate/contracts": "^10.0|^11.0|^12.0", + "php": "^8.1", + "phpdocumentor/reflection": "^6.0", + "spatie/laravel-package-tools": "^1.9.0", + "spatie/php-structure-discoverer": "^2.0" + }, + "require-dev": { + "fakerphp/faker": "^1.14", + "friendsofphp/php-cs-fixer": "^3.0", + "inertiajs/inertia-laravel": "^2.0", + "livewire/livewire": "^3.0", + "mockery/mockery": "^1.6", + "nesbot/carbon": "^2.63|^3.0", + "orchestra/testbench": "^8.37.0|^9.16|^10.9", + "pestphp/pest": "^2.36|^3.8|^4.3", + "pestphp/pest-plugin-laravel": "^2.4|^3.0|^4.0", + "pestphp/pest-plugin-livewire": "^2.1|^3.0|^4.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "spatie/invade": "^1.0", + "spatie/laravel-typescript-transformer": "^2.5", + "spatie/pest-plugin-snapshots": "^2.1", + "spatie/test-time": "^1.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" + "laravel": { + "providers": [ + "Spatie\\LaravelData\\LaravelDataServiceProvider" + ] } }, "autoload": { "psr-4": { - "Psr\\Http\\Client\\": "src/" + "Spatie\\LaravelData\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6065,50 +7554,75 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" } ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", + "description": "Create unified resources and data transfer objects", + "homepage": "https://github.com/spatie/laravel-data", "keywords": [ - "http", - "http-client", - "psr", - "psr-18" + "laravel", + "laravel-data", + "spatie" ], "support": { - "source": "https://github.com/php-fig/http-client" + "issues": "https://github.com/spatie/laravel-data/issues", + "source": "https://github.com/spatie/laravel-data/tree/4.19.1" }, - "time": "2023-09-23T14:17:50+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-01-28T13:10:20+00:00" }, { - "name": "psr/http-factory", - "version": "1.1.0", + "name": "spatie/laravel-fractal", + "version": "6.4.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + "url": "https://github.com/spatie/laravel-fractal.git", + "reference": "d34114259233540dcb405e45dff863164fb426c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "url": "https://api.github.com/repos/spatie/laravel-fractal/zipball/d34114259233540dcb405e45dff863164fb426c5", + "reference": "d34114259233540dcb405e45dff863164fb426c5", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "league/fractal": "^0.20.1|^0.20", + "nesbot/carbon": "^2.63|^3.0", + "php": "^8.0", + "spatie/fractalistic": "^2.9.5|^2.9", + "spatie/laravel-package-tools": "^1.11" + }, + "require-dev": { + "ext-json": "*", + "orchestra/testbench": "^7.0|^8.0|^9.2|^10.0|^11.0", + "pestphp/pest": "^1.22|^2.34|^3.0|^4.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" + "laravel": { + "aliases": { + "Fractal": "Spatie\\Fractal\\Facades\\Fractal" + }, + "providers": [ + "Spatie\\Fractal\\FractalServiceProvider" + ] } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Spatie\\Fractal\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6117,52 +7631,96 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "description": "An easy to use Fractal integration for Laravel applications", + "homepage": "https://github.com/spatie/laravel-fractal", "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" + "api", + "fractal", + "laravel", + "laravel-fractal", + "lumen", + "spatie", + "transform" ], "support": { - "source": "https://github.com/php-fig/http-factory" + "source": "https://github.com/spatie/laravel-fractal/tree/6.4.0" }, - "time": "2024-04-15T12:06:14+00:00" + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2026-02-21T15:58:07+00:00" }, { - "name": "psr/http-message", - "version": "2.0", + "name": "spatie/laravel-health", + "version": "1.38.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + "url": "https://github.com/spatie/laravel-health.git", + "reference": "9c7cc3cc9d96eec33f090c5bc0894f128a5386e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "url": "https://api.github.com/repos/spatie/laravel-health/zipball/9c7cc3cc9d96eec33f090c5bc0894f128a5386e4", + "reference": "9c7cc3cc9d96eec33f090c5bc0894f128a5386e4", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "dragonmantank/cron-expression": "^3.3.1", + "guzzlehttp/guzzle": "^6.5|^7.4.5|^7.2", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/notifications": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "laravel/serializable-closure": "^1.3|^2.0", + "nunomaduro/termwind": "^1.0|^2.0", + "php": "^8.2", + "spatie/enum": "^3.13", + "spatie/laravel-package-tools": "^1.12.1", + "spatie/regex": "^3.1.1|^3.1", + "spatie/temporary-directory": "^2.2", + "symfony/process": "^5.4|^6.0|^7.0|^8.0" + }, + "require-dev": { + "laravel/horizon": "^5.9.10", + "laravel/slack-notification-channel": "^2.4|^3.2", + "nunomaduro/collision": "^5.10|^6.2.1|^6.1|^8.0", + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^2.34|^3.0|^4.0", + "pestphp/pest-plugin-laravel": "^2.3|^3.0|^4.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.1.1|^2.0", + "phpunit/phpunit": "^9.5.21|^9.5.10|^10.5|^11.0|^12.0", + "spatie/laravel-ray": "^1.30", + "spatie/pest-plugin-snapshots": "^1.1|^2.3|^3.0", + "spatie/pest-plugin-test-time": "^1.1.1|^1.1|^2.0|^3.0", + "spatie/test-time": "^1.3|^2.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" + "laravel": { + "aliases": { + "Health": "Spatie\\Health\\Facades\\Health" + }, + "providers": [ + "Spatie\\Health\\HealthServiceProvider" + ] } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Spatie\\Health\\": "src", + "Spatie\\Health\\Database\\Factories\\": "database/factories" } }, "notification-url": "https://packagist.org/downloads/", @@ -6171,51 +7729,59 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Monitor the health of a Laravel application", + "homepage": "https://github.com/spatie/laravel-health", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "laravel", + "laravel-health", + "spatie" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" + "source": "https://github.com/spatie/laravel-health/tree/1.38.0" }, - "time": "2023-04-04T09:54:51+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-22T18:44:51+00:00" }, { - "name": "psr/log", - "version": "3.0.2", + "name": "spatie/laravel-package-tools", + "version": "1.93.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", "shasum": "" }, "require": { - "php": ">=8.0.0" + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^8.0|^9.2|^10.0|^11.0", + "pestphp/pest": "^2.1|^3.1|^4.0", + "phpunit/php-code-coverage": "^10.0|^11.0|^12.0", + "phpunit/phpunit": "^10.5|^11.5|^12.5", + "spatie/pest-plugin-test-time": "^2.2|^3.0" }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Spatie\\LaravelPackageTools\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6224,48 +7790,74 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", "keywords": [ - "log", - "psr", - "psr-3" + "laravel-package-tools", + "spatie" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0" }, - "time": "2024-09-11T13:17:53+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-21T12:49:54+00:00" }, { - "name": "psr/simple-cache", - "version": "3.0.0", + "name": "spatie/laravel-permission", + "version": "6.24.1", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + "url": "https://github.com/spatie/laravel-permission.git", + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/eefc9d17eba80d023d6bff313f882cb2bcd691a3", + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3", "shasum": "" }, "require": { - "php": ">=8.0.0" + "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0", + "php": "^8.0" + }, + "require-dev": { + "laravel/passport": "^11.0|^12.0", + "laravel/pint": "^1.0", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", + "phpunit/phpunit": "^9.4|^10.1|^11.5" }, "type": "library", "extra": { + "laravel": { + "providers": [ + "Spatie\\Permission\\PermissionServiceProvider" + ] + }, "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-main": "6.x-dev", + "dev-master": "6.x-dev" } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "Psr\\SimpleCache\\": "src/" + "Spatie\\Permission\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6274,75 +7866,78 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "Common interfaces for simple caching", + "description": "Permission handling for Laravel 8.0 and up", + "homepage": "https://github.com/spatie/laravel-permission", "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" + "acl", + "laravel", + "permission", + "permissions", + "rbac", + "roles", + "security", + "spatie" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + "issues": "https://github.com/spatie/laravel-permission/issues", + "source": "https://github.com/spatie/laravel-permission/tree/6.24.1" }, - "time": "2021-10-29T13:26:27+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-09T21:10:03+00:00" }, { - "name": "psy/psysh", - "version": "v0.12.3", + "name": "spatie/laravel-query-builder", + "version": "6.4.3", "source": { "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + "url": "https://github.com/spatie/laravel-query-builder.git", + "reference": "317cf7e7146daec502241dd1cd1d8fd4bb6d5cff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/317cf7e7146daec502241dd1cd1d8fd4bb6d5cff", + "reference": "317cf7e7146daec502241dd1cd1d8fd4bb6d5cff", "shasum": "" }, "require": { - "ext-json": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "^5.0 || ^4.0", - "php": "^8.0 || ^7.4", - "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" - }, - "conflict": { - "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.2", + "spatie/laravel-package-tools": "^1.11" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + "ext-json": "*", + "larastan/larastan": "^2.7 || ^3.3", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7.0|^8.0|^10.0|^11.0", + "pestphp/pest": "^2.0|^3.7|^4.0", + "phpunit/phpunit": "^10.0|^11.5.3|^12.0", + "spatie/invade": "^2.0" }, - "bin": [ - "bin/psysh" - ], "type": "library", "extra": { - "branch-alias": { - "dev-main": "0.12.x-dev" - }, - "bamarni-bin": { - "bin-links": false, - "forward-command": false + "laravel": { + "providers": [ + "Spatie\\QueryBuilder\\QueryBuilderServiceProvider" + ] } }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Psy\\": "src/" + "Spatie\\QueryBuilder\\": "src", + "Spatie\\QueryBuilder\\Database\\Factories\\": "database/factories" } }, "notification-url": "https://packagist.org/downloads/", @@ -6351,51 +7946,79 @@ ], "authors": [ { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", + "description": "Easily build Eloquent queries from API requests", + "homepage": "https://github.com/spatie/laravel-query-builder", "keywords": [ - "REPL", - "console", - "interactive", - "shell" + "laravel-query-builder", + "spatie" ], "support": { - "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + "issues": "https://github.com/spatie/laravel-query-builder/issues", + "source": "https://github.com/spatie/laravel-query-builder" }, - "time": "2024-04-02T15:57:53+00:00" + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2026-02-21T21:10:32+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "spatie/php-structure-discoverer", + "version": "2.3.2", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" + "url": "https://github.com/spatie/php-structure-discoverer.git", + "reference": "6c46e069349c7f2f6ebbe00429332c9e6b70fa92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", + "url": "https://api.github.com/repos/spatie/php-structure-discoverer/zipball/6c46e069349c7f2f6ebbe00429332c9e6b70fa92", + "reference": "6c46e069349c7f2f6ebbe00429332c9e6b70fa92", "shasum": "" }, "require": { - "php": ">=5.6" + "illuminate/collections": "^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.4.3", + "symfony/finder": "^6.0|^7.0" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" + "amphp/parallel": "^2.2", + "illuminate/console": "^10.0|^11.0|^12.0", + "laravel/pint": "^1.0", + "nunomaduro/collision": "^7.0|^8.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "pestphp/pest": "^2.0|^3.0", + "pestphp/pest-plugin-laravel": "^2.0|^3.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5|^10.0|^11.5.3", + "spatie/laravel-ray": "^1.26" + }, + "suggest": { + "amphp/parallel": "When you want to use the Parallel discover worker" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\StructureDiscoverer\\StructureDiscovererServiceProvider" + ] + } + }, "autoload": { - "files": [ - "src/getallheaders.php" - ] + "psr-4": { + "Spatie\\StructureDiscoverer\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6403,68 +8026,55 @@ ], "authors": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" } ], - "description": "A polyfill for getallheaders.", + "description": "Automatically discover structures within your PHP application", + "homepage": "https://github.com/spatie/php-structure-discoverer", + "keywords": [ + "discover", + "laravel", + "php", + "php-structure-discoverer" + ], "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" + "issues": "https://github.com/spatie/php-structure-discoverer/issues", + "source": "https://github.com/spatie/php-structure-discoverer/tree/2.3.2" }, - "time": "2019-03-08T08:55:37+00:00" + "funding": [ + { + "url": "https://github.com/LaravelAutoDiscoverer", + "type": "github" + } + ], + "time": "2025-09-22T14:58:17+00:00" }, { - "name": "ramsey/collection", - "version": "2.0.0", + "name": "spatie/regex", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "url": "https://github.com/spatie/regex.git", + "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/spatie/regex/zipball/d543de2019a0068e7b80da0ba24f1c51c7469303", + "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.0|^8.1" }, "require-dev": { - "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", - "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "phpunit/phpunit": "^9.3" }, "type": "library", - "extra": { - "captainhook": { - "force-install": true - }, - "ramsey/conventional-commits": { - "configFile": "conventional-commits.json" - } - }, "autoload": { "psr-4": { - "Ramsey\\Collection\\": "src/" + "Spatie\\Regex\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6473,174 +8083,126 @@ ], "authors": [ { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "A PHP library for representing and manipulating collections.", + "description": "A sane interface for php's built in preg_* functions", + "homepage": "https://github.com/spatie/regex", "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" + "expression", + "expressions", + "regex", + "regular", + "spatie" ], "support": { - "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "issues": "https://github.com/spatie/regex/issues", + "source": "https://github.com/spatie/regex/tree/3.1.1" }, "funding": [ { - "url": "https://github.com/ramsey", - "type": "github" + "url": "https://spatie.be/open-source/support-us", + "type": "custom" }, { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" + "url": "https://github.com/spatie", + "type": "github" } ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2021-11-30T21:13:59+00:00" }, { - "name": "ramsey/uuid", - "version": "4.7.6", + "name": "spatie/shiki-php", + "version": "2.3.3", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "url": "https://github.com/spatie/shiki-php.git", + "reference": "9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/spatie/shiki-php/zipball/9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b", + "reference": "9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", - "ramsey/collection": "^1.2 || ^2.0" - }, - "replace": { - "rhumsaa/uuid": "self.version" + "symfony/process": "^5.4|^6.4|^7.1|^8.0" }, "require-dev": { - "captainhook/captainhook": "^5.10", - "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", - "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" - }, - "suggest": { - "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", - "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + "friendsofphp/php-cs-fixer": "^v3.0", + "pestphp/pest": "^1.8", + "phpunit/phpunit": "^9.5", + "spatie/pest-plugin-snapshots": "^1.1", + "spatie/ray": "^1.10" }, "type": "library", - "extra": { - "captainhook": { - "force-install": true - } - }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Ramsey\\Uuid\\": "src/" + "Spatie\\ShikiPhp\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "authors": [ + { + "name": "Rias Van der Veken", + "email": "rias@spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Highlight code using Shiki in PHP", + "homepage": "https://github.com/spatie/shiki-php", "keywords": [ - "guid", - "identifier", - "uuid" + "shiki", + "spatie" ], "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/spatie/shiki-php/tree/2.3.3" }, "funding": [ { - "url": "https://github.com/ramsey", + "url": "https://github.com/spatie", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" } ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2026-02-01T09:30:04+00:00" }, { - "name": "ryangjchandler/blade-capture-directive", - "version": "v1.0.0", + "name": "spatie/temporary-directory", + "version": "2.3.1", "source": { "type": "git", - "url": "https://github.com/ryangjchandler/blade-capture-directive.git", - "reference": "cb6f58663d97f17bece176295240b740835e14f1" + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "662e481d6ec07ef29fd05010433428851a42cd07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/cb6f58663d97f17bece176295240b740835e14f1", - "reference": "cb6f58663d97f17bece176295240b740835e14f1", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/662e481d6ec07ef29fd05010433428851a42cd07", + "reference": "662e481d6ec07ef29fd05010433428851a42cd07", "shasum": "" }, "require": { - "illuminate/contracts": "^10.0|^11.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.9.2" + "php": "^8.0" }, "require-dev": { - "nunomaduro/collision": "^7.0|^8.0", - "nunomaduro/larastan": "^2.0", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.0", - "pestphp/pest-plugin-laravel": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.0", - "spatie/laravel-ray": "^1.26" + "phpunit/phpunit": "^9.5" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider" - ], - "aliases": { - "BladeCaptureDirective": "RyanChandler\\BladeCaptureDirective\\Facades\\BladeCaptureDirective" - } - } - }, "autoload": { "psr-4": { - "RyanChandler\\BladeCaptureDirective\\": "src", - "RyanChandler\\BladeCaptureDirective\\Database\\Factories\\": "database/factories" + "Spatie\\TemporaryDirectory\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6649,66 +8211,68 @@ ], "authors": [ { - "name": "Ryan Chandler", - "email": "support@ryangjchandler.co.uk", + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", "role": "Developer" } ], - "description": "Create inline partials in your Blade templates with ease.", - "homepage": "https://github.com/ryangjchandler/blade-capture-directive", + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", "keywords": [ - "blade-capture-directive", - "laravel", - "ryangjchandler" + "php", + "spatie", + "temporary-directory" ], "support": { - "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues", - "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.0.0" + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.3.1" }, "funding": [ { - "url": "https://github.com/ryangjchandler", + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2024-02-26T18:08:49+00:00" + "time": "2026-01-12T07:42:22+00:00" }, { - "name": "ryangjchandler/blade-tabler-icons", - "version": "v2.3.0", + "name": "symfony/clock", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/ryangjchandler/blade-tabler-icons.git", - "reference": "cd359f5d3b406a982dae1aaaf121d84067576a2e" + "url": "https://github.com/symfony/clock.git", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ryangjchandler/blade-tabler-icons/zipball/cd359f5d3b406a982dae1aaaf121d84067576a2e", - "reference": "cd359f5d3b406a982dae1aaaf121d84067576a2e", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", "shasum": "" }, "require": { - "blade-ui-kit/blade-icons": "^1.5", - "illuminate/support": "^10.0 || ^11.0", - "php": "^8.1" + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.14", - "orchestra/testbench": "^8.0 || ^9.0", - "phpunit/phpunit": "^9.5.10 || ^10.5" + "provide": { + "psr/clock-implementation": "1.0" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "RyanChandler\\TablerIcons\\BladeTablerIconsServiceProvider" - ] - } - }, "autoload": { + "files": [ + "Resources/now.php" + ], "psr-4": { - "RyanChandler\\TablerIcons\\": "src" - } + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6716,52 +8280,96 @@ ], "authors": [ { - "name": "Ryan Chandler", - "email": "support@ryangjchandler.co.uk", - "homepage": "https://ryangjchandler.co.uk", - "role": "Developer" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A package to easily make use of Tabler icons in your Laravel Blade views.", - "homepage": "https://github.com/ryangjchandler/blade-tabler-icons", + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", "keywords": [ - "blade", - "laravel", - "tabler" + "clock", + "psr20", + "time" ], "support": { - "issues": "https://github.com/ryangjchandler/blade-tabler-icons/issues", - "source": "https://github.com/ryangjchandler/blade-tabler-icons/tree/v2.3.0" + "source": "https://github.com/symfony/clock/tree/v7.4.0" }, - "time": "2024-03-12T23:54:24+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T15:39:26+00:00" }, { - "name": "s1lentium/iptools", - "version": "v1.2.0", + "name": "symfony/console", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/S1lentium/IPTools.git", - "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e" + "url": "https://github.com/symfony/console.git", + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/S1lentium/IPTools/zipball/88be1aaaab3c50fc131ebe778e246215ff006d8e", - "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e", + "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", "shasum": "" }, "require": { - "ext-bcmath": "*", - "php": "^8.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^9.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { - "IPTools\\": "src/" - } + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6769,51 +8377,70 @@ ], "authors": [ { - "name": "Safarov Alisher", - "email": "alisher.safarov@outlook.com", - "homepage": "https://github.com/S1lentium" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "PHP Library for manipulating network addresses (IPv4 and IPv6)", - "keywords": [ - "IP", - "IP-Tools", - "cidr", - "ipv4", - "ipv6", - "network", - "subnet" - ], - "support": { - "issues": "https://github.com/S1lentium/IPTools/issues", - "source": "https://github.com/S1lentium/IPTools/tree/v1.2.0" - }, - "time": "2022-08-17T14:28:59+00:00" + "time": "2026-01-13T11:36:38+00:00" }, { - "name": "socialiteproviders/discord", - "version": "4.2.0", + "name": "symfony/css-selector", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/SocialiteProviders/Discord.git", - "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c" + "url": "https://github.com/symfony/css-selector.git", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/c71c379acfdca5ba4aa65a3db5ae5222852a919c", - "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.4 || ^8.0", - "socialiteproviders/manager": "~4.0" + "php": ">=8.2" }, "type": "library", "autoload": { "psr-4": { - "SocialiteProviders\\Discord\\": "" - } + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6821,60 +8448,74 @@ ], "authors": [ { - "name": "Christopher Eklund", - "email": "eklundchristopher@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Discord OAuth2 Provider for Laravel Socialite", - "keywords": [ - "discord", - "laravel", - "oauth", - "provider", - "socialite" - ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", "support": { - "docs": "https://socialiteproviders.com/discord", - "issues": "https://github.com/socialiteproviders/providers/issues", - "source": "https://github.com/socialiteproviders/providers" + "source": "https://github.com/symfony/css-selector/tree/v7.4.0" }, - "time": "2023-07-24T23:28:47+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-30T13:39:42+00:00" }, { - "name": "socialiteproviders/manager", - "version": "v4.6.0", + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/dea5190981c31b89e52259da9ab1ca4e2b258b21", - "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", - "laravel/socialite": "^5.5", - "php": "^8.0" - }, - "require-dev": { - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^9.0" + "php": ">=8.1" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "SocialiteProviders\\Manager\\ServiceProvider" - ] + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { - "psr-4": { - "SocialiteProviders\\Manager\\": "src/" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6882,64 +8523,77 @@ ], "authors": [ { - "name": "Andy Wendt", - "email": "andy@awendt.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Anton Komarev", - "email": "a.komarev@cybercog.su" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Miguel Piedrafita", - "email": "soy@miguelpiedrafita.com" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "atymic", - "email": "atymicq@gmail.com", - "homepage": "https://atymic.dev" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Easily add new or override built-in providers in Laravel Socialite.", - "homepage": "https://socialiteproviders.com", - "keywords": [ - "laravel", - "manager", - "oauth", - "providers", - "socialite" - ], - "support": { - "issues": "https://github.com/socialiteproviders/manager/issues", - "source": "https://github.com/socialiteproviders/manager" - }, - "time": "2024-05-04T07:57:39+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "spatie/color", - "version": "1.6.0", + "name": "symfony/error-handler", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/spatie/color.git", - "reference": "02ce48c480f86d65702188f738f4e8ccad1b999a" + "url": "https://github.com/symfony/error-handler.git", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/color/zipball/02ce48c480f86d65702188f738f4e8ccad1b999a", - "reference": "02ce48c480f86d65702188f738f4e8ccad1b999a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "pestphp/pest": "^1.22", - "phpunit/phpunit": "^6.5||^9.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { - "Spatie\\Color\\": "src" - } + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6947,59 +8601,84 @@ ], "authors": [ { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A little library to handle color conversions", - "homepage": "https://github.com/spatie/color", - "keywords": [ - "color", - "conversion", - "rgb", - "spatie" - ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/spatie/color/issues", - "source": "https://github.com/spatie/color/tree/1.6.0" + "source": "https://github.com/symfony/error-handler/tree/v7.4.4" }, "funding": [ { - "url": "https://github.com/spatie", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-09-20T14:00:15+00:00" + "time": "2026-01-20T16:42:42+00:00" }, { - "name": "spatie/fractalistic", - "version": "2.9.5", + "name": "symfony/event-dispatcher", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/spatie/fractalistic.git", - "reference": "6f12686a03d035f4558d166989c62aa93bde2151" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/fractalistic/zipball/6f12686a03d035f4558d166989c62aa93bde2151", - "reference": "6f12686a03d035f4558d166989c62aa93bde2151", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746", "shasum": "" }, "require": { - "league/fractal": "^0.20.1", - "php": "^7.4|^8.0" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { - "illuminate/pagination": "~5.3.0|~5.4.0", - "phpunit/phpunit": "^9.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Spatie\\Fractalistic\\": "src" - } + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7007,62 +8686,70 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A developer friendly wrapper around Fractal", - "homepage": "https://github.com/spatie/fractalistic", - "keywords": [ - "api", - "fractal", - "fractalistic", - "spatie", - "transform" - ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/spatie/fractalistic/issues", - "source": "https://github.com/spatie/fractalistic/tree/2.9.5" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" }, "funding": [ { - "url": "https://github.com/spatie", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2022-04-21T12:26:22+00:00" + "time": "2026-01-05T11:45:34+00:00" }, { - "name": "spatie/invade", - "version": "2.1.0", + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/spatie/invade.git", - "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63", - "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { - "php": "^8.0" - }, - "require-dev": { - "pestphp/pest": "^1.20", - "phpstan/phpstan": "^1.4", - "spatie/ray": "^1.28" + "php": ">=8.1", + "psr/event-dispatcher": "^1" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Spatie\\Invade\\": "src" + "Symfony\\Contracts\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -7071,74 +8758,73 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "role": "Developer" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A PHP function to work with private properties and methods", - "homepage": "https://github.com/spatie/invade", + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", "keywords": [ - "invade", - "spatie" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/spatie/invade/tree/2.1.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { - "url": "https://github.com/spatie", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-05-17T09:06:10+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { - "name": "spatie/laravel-fractal", - "version": "6.2.1", + "name": "symfony/filesystem", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-fractal.git", - "reference": "0a30630d2ab49590af118172c03c99c0d838dab1" + "url": "https://github.com/symfony/filesystem.git", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-fractal/zipball/0a30630d2ab49590af118172c03c99c0d838dab1", - "reference": "0a30630d2ab49590af118172c03c99c0d838dab1", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { - "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", - "league/fractal": "^0.20.1|^0.20", - "nesbot/carbon": "^2.63|^3.0", - "php": "^8.0", - "spatie/fractalistic": "^2.9.5|^2.9", - "spatie/laravel-package-tools": "^1.11" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "ext-json": "*", - "orchestra/testbench": "^7.0|^8.0|^9.0", - "pestphp/pest": "^1.22|^2.34" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\Fractal\\FractalServiceProvider" - ], - "aliases": { - "Fractal": "Spatie\\Fractal\\Facades\\Fractal" - } - } - }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Spatie\\Fractal\\": "src" - } + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7146,64 +8832,67 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "An easy to use Fractal integration for Laravel applications", - "homepage": "https://github.com/spatie/laravel-fractal", - "keywords": [ - "api", - "fractal", - "laravel", - "laravel-fractal", - "lumen", - "spatie", - "transform" - ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", "support": { - "source": "https://github.com/spatie/laravel-fractal/tree/6.2.1" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-06-04T09:33:08+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { - "name": "spatie/laravel-package-tools", - "version": "1.16.5", + "name": "symfony/finder", + "version": "v7.4.5", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2" + "url": "https://github.com/symfony/finder.git", + "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2", - "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2", + "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", + "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0", - "php": "^8.0" + "php": ">=8.2" }, "require-dev": { - "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0", - "pestphp/pest": "^1.22", - "phpunit/phpunit": "^9.5.24", - "spatie/pest-plugin-test-time": "^1.1" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Spatie\\LaravelPackageTools\\": "src" - } + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7211,74 +8900,68 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Tools for creating Laravel packages", - "homepage": "https://github.com/spatie/laravel-package-tools", - "keywords": [ - "laravel-package-tools", - "spatie" - ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5" + "source": "https://github.com/symfony/finder/tree/v7.4.5" }, "funding": [ { - "url": "https://github.com/spatie", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-08-27T18:56:10+00:00" + "time": "2026-01-26T15:07:59+00:00" }, { - "name": "spatie/laravel-permission", - "version": "6.9.0", + "name": "symfony/html-sanitizer", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-permission.git", - "reference": "fe973a58b44380d0e8620107259b7bda22f70408" + "url": "https://github.com/symfony/html-sanitizer.git", + "reference": "5b0bbcc3600030b535dd0b17a0e8c56243f96d7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/fe973a58b44380d0e8620107259b7bda22f70408", - "reference": "fe973a58b44380d0e8620107259b7bda22f70408", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/5b0bbcc3600030b535dd0b17a0e8c56243f96d7f", + "reference": "5b0bbcc3600030b535dd0b17a0e8c56243f96d7f", "shasum": "" }, "require": { - "illuminate/auth": "^8.12|^9.0|^10.0|^11.0", - "illuminate/container": "^8.12|^9.0|^10.0|^11.0", - "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0", - "illuminate/database": "^8.12|^9.0|^10.0|^11.0", - "php": "^8.0" - }, - "require-dev": { - "laravel/passport": "^11.0|^12.0", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", - "phpunit/phpunit": "^9.4|^10.1" + "ext-dom": "*", + "league/uri": "^6.5|^7.0", + "masterminds/html5": "^2.7.2", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.x-dev", - "dev-master": "6.x-dev" - }, - "laravel": { - "providers": [ - "Spatie\\Permission\\PermissionServiceProvider" - ] - } - }, "autoload": { - "files": [ - "src/helpers.php" - ], "psr-4": { - "Spatie\\Permission\\": "src" - } + "Symfony\\Component\\HtmlSanitizer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7286,78 +8969,102 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Permission handling for Laravel 8.0 and up", - "homepage": "https://github.com/spatie/laravel-permission", + "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", + "homepage": "https://symfony.com", "keywords": [ - "acl", - "laravel", - "permission", - "permissions", - "rbac", - "roles", - "security", - "spatie" + "Purifier", + "html", + "sanitizer" ], "support": { - "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.9.0" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.0" }, "funding": [ { - "url": "https://github.com/spatie", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-06-22T23:04:52+00:00" + "time": "2025-10-30T13:39:42+00:00" }, { - "name": "spatie/laravel-query-builder", - "version": "5.8.1", + "name": "symfony/http-client", + "version": "v7.4.5", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-query-builder.git", - "reference": "caa8467fa9e127ba7ea9e0aac93c71324365bae2" + "url": "https://github.com/symfony/http-client.git", + "reference": "84bb634857a893cc146cceb467e31b3f02c5fe9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/caa8467fa9e127ba7ea9e0aac93c71324365bae2", - "reference": "caa8467fa9e127ba7ea9e0aac93c71324365bae2", + "url": "https://api.github.com/repos/symfony/http-client/zipball/84bb634857a893cc146cceb467e31b3f02c5fe9f", + "reference": "84bb634857a893cc146cceb467e31b3f02c5fe9f", "shasum": "" }, "require": { - "illuminate/database": "^10.0|^11.0", - "illuminate/http": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "php": "^8.2", - "spatie/laravel-package-tools": "^1.11" + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" }, "require-dev": { - "ext-json": "*", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^7.0|^8.0", - "pestphp/pest": "^2.0", - "spatie/invade": "^2.0", - "spatie/laravel-ray": "^1.28" + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\QueryBuilder\\QueryBuilderServiceProvider" - ] - } - }, "autoload": { "psr-4": { - "Spatie\\QueryBuilder\\": "src", - "Spatie\\QueryBuilder\\Database\\Factories\\": "database/factories" - } + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7365,55 +9072,76 @@ ], "authors": [ { - "name": "Alex Vanderbist", - "email": "alex@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Easily build Eloquent queries from API requests", - "homepage": "https://github.com/spatie/laravel-query-builder", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", "keywords": [ - "laravel-query-builder", - "spatie" + "http" ], "support": { - "issues": "https://github.com/spatie/laravel-query-builder/issues", - "source": "https://github.com/spatie/laravel-query-builder" + "source": "https://github.com/symfony/http-client/tree/v7.4.5" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-05-10T08:19:35+00:00" + "time": "2026-01-27T16:16:02+00:00" }, { - "name": "spatie/temporary-directory", - "version": "2.2.1", + "name": "symfony/http-client-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/spatie/temporary-directory.git", - "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", - "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { - "php": "^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" + "php": ">=8.1" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, "autoload": { "psr-4": { - "Spatie\\TemporaryDirectory\\": "src" - } + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7421,64 +9149,81 @@ ], "authors": [ { - "name": "Alex Vanderbist", - "email": "alex@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Easily create, use and destroy temporary directories", - "homepage": "https://github.com/spatie/temporary-directory", + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", "keywords": [ - "php", - "spatie", - "temporary-directory" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/spatie/temporary-directory/issues", - "source": "https://github.com/spatie/temporary-directory/tree/2.2.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/spatie", + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2023-12-25T11:46:58+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { - "name": "symfony/clock", - "version": "v7.1.1", + "name": "symfony/http-foundation", + "version": "v7.4.5", "source": { "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "446d0db2b1f21575f1284b74533e425096abdfb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/446d0db2b1f21575f1284b74533e425096abdfb6", + "reference": "446d0db2b1f21575f1284b74533e425096abdfb6", "shasum": "" }, "require": { "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" }, - "provide": { - "psr/clock-implementation": "1.0" + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { - "files": [ - "Resources/now.php" - ], "psr-4": { - "Symfony\\Component\\Clock\\": "" + "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7490,23 +9235,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Decouples applications from the system clock", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.1" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.5" }, "funding": [ { @@ -7517,60 +9257,92 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2026-01-27T16:16:02+00:00" }, { - "name": "symfony/console", - "version": "v7.1.5", + "name": "symfony/http-kernel", + "version": "v7.4.5", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", - "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/229eda477017f92bd2ce7615d06222ec0c19e82a", + "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Component\\HttpKernel\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7590,16 +9362,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.5" }, "funding": [ { @@ -7610,34 +9376,57 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2026-01-28T10:33:42+00:00" }, { - "name": "symfony/css-selector", - "version": "v7.1.1", + "name": "symfony/mailer", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "url": "https://github.com/symfony/mailer.git", + "reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7b750074c40c694ceb34cb926d6dffee231c5cd6", + "reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6", "shasum": "" }, "require": { - "php": ">=8.2" + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\CssSelector\\": "" + "Symfony\\Component\\Mailer\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7652,19 +9441,15 @@ "name": "Fabien Potencier", "email": "fabien@symfony.com" }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Converts CSS selectors to XPath expressions", + "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/mailer/tree/v7.4.4" }, "funding": [ { @@ -7675,43 +9460,49 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2026-01-08T08:25:11+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "name": "symfony/mailgun-mailer", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "url": "https://github.com/symfony/mailgun-mailer.git", + "reference": "ffbcdbf93ed0700f083a6307acfb8f78dd3f091b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/ffbcdbf93ed0700f083a6307acfb8f78dd3f091b", + "reference": "ffbcdbf93ed0700f083a6307acfb8f78dd3f091b", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" }, + "type": "symfony-mailer-bridge", "autoload": { - "files": [ - "function.php" + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -7720,18 +9511,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", + "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/mailgun-mailer/tree/v7.4.0" }, "funding": [ { @@ -7742,48 +9533,58 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2025-08-04T07:05:15+00:00" }, { - "name": "symfony/error-handler", - "version": "v7.1.3", + "name": "symfony/mime", + "version": "v7.4.5", "source": { "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "432bb369952795c61ca1def65e078c4a80dad13c" + "url": "https://github.com/symfony/mime.git", + "reference": "b18c7e6e9eee1e19958138df10412f3c4c316148" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", - "reference": "432bb369952795c61ca1def65e078c4a80dad13c", + "url": "https://api.github.com/repos/symfony/mime/zipball/b18c7e6e9eee1e19958138df10412f3c4c316148", + "reference": "b18c7e6e9eee1e19958138df10412f3c4c316148", "shasum": "" }, "require": { "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/deprecation-contracts": "<2.5", - "symfony/http-kernel": "<6.4" + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" }, - "bin": [ - "Resources/bin/patch-type-declarations" - ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" + "Symfony\\Component\\Mime\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7803,10 +9604,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to manage errors and ease debugging PHP code", + "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.3" + "source": "https://github.com/symfony/mime/tree/v7.4.5" }, "funding": [ { @@ -7817,57 +9622,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-07-26T13:02:51+00:00" + "time": "2026-01-27T08:59:58+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/service-contracts": "<2.5" + "php": ">=7.2" }, "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "ext-ctype": "*" }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7875,18 +9677,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -7897,44 +9705,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -7951,18 +9765,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to dispatching event", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -7973,41 +9787,52 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { - "name": "symfony/finder", - "version": "v7.1.4", + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", - "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8015,18 +9840,30 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.4" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -8037,40 +9874,53 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-08-13T14:28:19+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { - "name": "symfony/html-sanitizer", - "version": "v7.1.5", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "89bf376c056926bd7fe8a81c0f486a060e20fdbc" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/89bf376c056926bd7fe8a81c0f486a060e20fdbc", - "reference": "89bf376c056926bd7fe8a81c0f486a060e20fdbc", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "ext-dom": "*", - "league/uri": "^6.5|^7.0", - "masterminds/html5": "^2.7.2", - "php": ">=8.2" + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\HtmlSanitizer\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8079,23 +9929,26 @@ ], "authors": [ { - "name": "Titouan Galopin", - "email": "galopintitouan@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ - "Purifier", - "html", - "sanitizer" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.1.5" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -8106,68 +9959,55 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-20T13:35:23+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/http-client", - "version": "v7.1.1", + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "1ec24a54d1885b11e862d6ddab31bd6749720d20" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/1ec24a54d1885b11e862d6ddab31bd6749720d20", - "reference": "1ec24a54d1885b11e862d6ddab31bd6749720d20", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "^3.4.1", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.4" + "ext-iconv": "*", + "php": ">=7.2" }, "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" + "ext-mbstring": "*" }, - "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4|^2.0", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8183,13 +10023,17 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ - "http" + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.1.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -8197,7 +10041,11 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -8205,41 +10053,41 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { - "name": "symfony/http-client-contracts", - "version": "v3.5.0", + "name": "symfony/polyfill-php80", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "20414d96f391677bf80078aa55baece78b82647d" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", - "reference": "20414d96f391677bf80078aa55baece78b82647d", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, - "exclude-from-classmap": [ - "/Test/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8247,6 +10095,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -8256,18 +10108,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to HTTP clients", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -8278,53 +10128,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { - "name": "symfony/http-foundation", - "version": "v7.1.5", + "name": "symfony/polyfill-php83", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", - "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4" - }, - "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8333,18 +10180,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Defines an object-oriented layer for the HTTP specification", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.5" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -8355,90 +10208,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { - "name": "symfony/http-kernel", - "version": "v7.1.5", + "name": "symfony/polyfill-php84", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", - "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/browser-kit": "<6.4", - "symfony/cache": "<6.4", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<6.4", - "symfony/form": "<6.4", - "symfony/http-client": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", - "symfony/translation": "<6.4", - "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.4", - "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.4", - "twig/twig": "<3.0.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^7.1", - "symfony/routing": "^6.4|^7.0", - "symfony/serializer": "^7.1", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8447,18 +10260,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a structured process for converting a Request into a Response", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.5" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -8469,56 +10288,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-21T06:09:21+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { - "name": "symfony/mailer", - "version": "v7.1.1", + "name": "symfony/polyfill-php85", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/2eaad2e167cae930f25a3d731fec8b2ded5e751e", - "reference": "2eaad2e167cae930f25a3d731fec8b2ded5e751e", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.2", - "psr/event-dispatcher": "^1", - "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/twig-bridge": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Mailer\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8527,18 +10340,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Helps sending emails", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.1" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" }, "funding": [ { @@ -8549,46 +10368,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2025-06-23T16:12:55+00:00" }, { - "name": "symfony/mailgun-mailer", - "version": "v7.1.1", + "name": "symfony/polyfill-uuid", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "08d9b1fe18db2ea3b3a69c8c280b3f85479efdaa" + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/08d9b1fe18db2ea3b3a69c8c280b3f85479efdaa", - "reference": "08d9b1fe18db2ea3b3a69c8c280b3f85479efdaa", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/mailer": "^6.4|^7.0" + "php": ">=7.2" }, - "conflict": { - "symfony/http-foundation": "<6.4" + "provide": { + "ext-uuid": "*" }, - "require-dev": { - "symfony/http-client": "^6.4|^7.0", - "symfony/webhook": "^6.4|^7.0" + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } }, - "type": "symfony-mailer-bridge", "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Uuid\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8596,18 +10423,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Mailgun Mailer Bridge", + "description": "Symfony polyfill for uuid functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v7.1.1" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" }, "funding": [ { @@ -8618,53 +10451,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/mime", - "version": "v7.1.5", + "name": "symfony/postmark-mailer", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" + "url": "https://github.com/symfony/postmark-mailer.git", + "reference": "8b573474e89368f1ddb25b43fd86a6dd51343e9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", - "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", + "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/8b573474e89368f1ddb25b43fd86a6dd51343e9b", + "reference": "8b573474e89368f1ddb25b43fd86a6dd51343e9b", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "psr/event-dispatcher": "^1", + "symfony/mailer": "^7.2|^8.0" }, "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<6.4", - "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3" + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" }, - "type": "library", + "type": "symfony-mailer-bridge", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\Mailer\\Bridge\\Postmark\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -8684,14 +10511,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows manipulating MIME messages", + "description": "Symfony Postmark Mailer Bridge", "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.5" + "source": "https://github.com/symfony/postmark-mailer/tree/v7.4.4" }, "funding": [ { @@ -8702,50 +10525,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2026-01-08T08:25:11+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "name": "symfony/process", + "version": "v7.4.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/symfony/process.git", + "reference": "608476f4604102976d687c483ac63a79ba18cc97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", + "reference": "608476f4604102976d687c483ac63a79ba18cc97", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" + "php": ">=8.2" }, "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8753,24 +10568,18 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/process/tree/v7.4.5" }, "funding": [ { @@ -8781,47 +10590,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-01-26T15:07:59+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "name": "symfony/routing", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "url": "https://github.com/symfony/routing.git", + "reference": "0798827fe2c79caeed41d70b680c2c3507d10147" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/routing/zipball/0798827fe2c79caeed41d70b680c2c3507d10147", + "reference": "0798827fe2c79caeed41d70b680c2c3507d10147", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "ext-intl": "For best performance" + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8829,26 +10647,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" + "router", + "routing", + "uri", + "url" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/routing/tree/v7.4.4" }, "funding": [ { @@ -8859,48 +10675,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-01-12T12:19:02+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "name": "symfony/service-contracts", + "version": "v3.6.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { - "php": ">=7.2", - "symfony/polyfill-intl-normalizer": "^1.10" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "ext-intl": "For best performance" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8908,30 +10732,26 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -8942,49 +10762,59 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "name": "symfony/string", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/string.git", + "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f", + "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, - "suggest": { - "ext-intl": "For best performance" + "conflict": { + "symfony/translation-contracts": "<2.5" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, + "type": "library", "autoload": { "files": [ - "bootstrap.php" + "Resources/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Component\\String\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -9001,18 +10831,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/string/tree/v7.4.4" }, "funding": [ { @@ -9023,50 +10853,77 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-01-12T10:54:30+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "name": "symfony/translation", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "url": "https://github.com/symfony/translation.git", + "reference": "bfde13711f53f549e73b06d27b35a55207528877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/translation/zipball/bfde13711f53f549e73b06d27b35a55207528877", + "reference": "bfde13711f53f549e73b06d27b35a55207528877", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { - "ext-mbstring": "*" + "symfony/translation-implementation": "2.3|3.0" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { "files": [ - "bootstrap.php" + "Resources/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9074,25 +10931,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/translation/tree/v7.4.4" }, "funding": [ { @@ -9103,46 +10953,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-01-13T10:40:19+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "name": "symfony/translation-contracts", + "version": "v3.6.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Contracts\\Translation\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -9150,10 +11004,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -9163,16 +11013,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Generic abstractions related to translation", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -9183,46 +11035,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "name": "symfony/uid", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "url": "https://github.com/symfony/uid.git", + "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36", + "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Component\\Uid\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -9230,6 +11081,10 @@ "MIT" ], "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -9239,16 +11094,15 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Provides an object-oriented API to generate and represent UIDs", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "UID", + "ulid", + "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/uid/tree/v7.4.4" }, "funding": [ { @@ -9259,50 +11113,60 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-01-03T23:30:35+00:00" }, { - "name": "symfony/polyfill-uuid", - "version": "v1.29.0", + "name": "symfony/var-dumper", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0e4769b46a0c3c62390d124635ce59f66874b282" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e4769b46a0c3c62390d124635ce59f66874b282", + "reference": "0e4769b46a0c3c62390d124635ce59f66874b282", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, - "provide": { - "ext-uuid": "*" + "conflict": { + "symfony/console": "<6.4" }, - "suggest": { - "ext-uuid": "For best performance" + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { "files": [ - "bootstrap.php" + "Resources/functions/dump.php" ], "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - } + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9310,24 +11174,22 @@ ], "authors": [ { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for uuid functions", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "uuid" + "debug", + "dump" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.4" }, "funding": [ { @@ -9338,43 +11200,49 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2026-01-01T22:13:48+00:00" }, { - "name": "symfony/postmark-mailer", - "version": "v7.1.1", + "name": "symfony/yaml", + "version": "v7.4.1", "source": { "type": "git", - "url": "https://github.com/symfony/postmark-mailer.git", - "reference": "24f37cf11c953473afd7b18a1a59c12182a20939" + "url": "https://github.com/symfony/yaml.git", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/24f37cf11c953473afd7b18a1a59c12182a20939", - "reference": "24f37cf11c953473afd7b18a1a59c12182a20939", + "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", "shasum": "" }, "require": { "php": ">=8.2", - "psr/event-dispatcher": "^1", - "symfony/mailer": "^6.4|^7.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/http-foundation": "<6.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/http-client": "^6.4|^7.0", - "symfony/webhook": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0|^8.0" }, - "type": "symfony-mailer-bridge", + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mailer\\Bridge\\Postmark\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -9394,10 +11262,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Postmark Mailer Bridge", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/postmark-mailer/tree/v7.1.1" + "source": "https://github.com/symfony/yaml/tree/v7.4.1" }, "funding": [ { @@ -9408,194 +11276,253 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2025-12-04T18:11:45+00:00" }, { - "name": "symfony/process", - "version": "v7.1.1", + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "ueberdosis/tiptap-php", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/ueberdosis/tiptap-php.git", + "reference": "6ea321fa665080e1a72ac5f52dfab19f6a292e2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/6ea321fa665080e1a72ac5f52dfab19f6a292e2d", + "reference": "6ea321fa665080e1a72ac5f52dfab19f6a292e2d", + "shasum": "" + }, + "require": { + "php": "^8.0", + "scrivo/highlight.php": "^9.18", + "spatie/shiki-php": "^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.5", + "pestphp/pest": "^1.21", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tiptap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Hans Pagel", + "email": "humans@tiptap.dev", + "role": "Developer" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "A PHP package to work with Tiptap output", + "homepage": "https://github.com/ueberdosis/tiptap-php", + "keywords": [ + "prosemirror", + "tiptap", + "ueberdosis" + ], "support": { - "source": "https://github.com/symfony/process/tree/v7.1.1" + "issues": "https://github.com/ueberdosis/tiptap-php/issues", + "source": "https://github.com/ueberdosis/tiptap-php/tree/2.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://tiptap.dev/pricing", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/ueberdosis", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/tiptap", + "type": "open_collective" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2026-01-10T16:40:02+00:00" }, { - "name": "symfony/routing", - "version": "v7.1.1", + "name": "vlucas/phpdotenv", + "version": "v5.6.3", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "955e7815d677a3eaa7075231212f2110983adecc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", - "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", + "reference": "955e7815d677a3eaa7075231212f2110983adecc", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.4", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Dotenv\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" } ], - "description": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", "keywords": [ - "router", - "routing", - "uri", - "url" + "dotenv", + "env", + "environment" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.1" + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2025-12-27T19:49:13+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.5.0", + "name": "voku/portable-ascii", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=7.0.0" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "voku\\": "src/voku/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9603,86 +11530,80 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "ascii", + "clean", + "php" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.paypal.me/moelleken", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/voku", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-11-21T01:49:47+00:00" }, { - "name": "symfony/string", - "version": "v7.1.5", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { - "symfony/translation-contracts": "<2.5" + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Webmozart\\Assert\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9690,101 +11611,78 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", + "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "assert", + "check", + "validate" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-20T08:28:38+00:00" - }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ { - "name": "symfony/translation", - "version": "v7.1.1", + "name": "barryvdh/laravel-ide-helper", + "version": "v3.6.1", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3" + "url": "https://github.com/barryvdh/laravel-ide-helper.git", + "reference": "b106f7ee85f263c4f103eca49e7bf3862c2e5e75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", - "reference": "cf5ae136e124fc7681b34ce9fac9d5b9ae8ceee3", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/b106f7ee85f263c4f103eca49e7bf3862c2e5e75", + "reference": "b106f7ee85f263c4f103eca49e7bf3862c2e5e75", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" + "barryvdh/reflection-docblock": "^2.4", + "composer/class-map-generator": "^1.0", + "ext-json": "*", + "illuminate/console": "^11.15 || ^12", + "illuminate/database": "^11.15 || ^12", + "illuminate/filesystem": "^11.15 || ^12", + "illuminate/support": "^11.15 || ^12", + "php": "^8.2" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" + "ext-pdo_sqlite": "*", + "friendsofphp/php-cs-fixer": "^3", + "illuminate/config": "^11.15 || ^12", + "illuminate/view": "^11.15 || ^12", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^9.2 || ^10", + "phpunit/phpunit": "^10.5 || ^11.5.3", + "spatie/phpunit-snapshot-assertions": "^4 || ^5", + "vimeo/psalm": "^5.4", + "vlucas/phpdotenv": "^5" + }, + "suggest": { + "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)." }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.5-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Barryvdh\\LaravelIdeHelper\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9792,69 +11690,75 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" } ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", + "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", + "keywords": [ + "autocomplete", + "codeintel", + "dev", + "helper", + "ide", + "laravel", + "netbeans", + "phpdoc", + "phpstorm", + "sublime" + ], "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.1" + "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.6.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://fruitcake.nl", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/barryvdh", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2025-12-10T09:11:07+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.0", + "name": "barryvdh/reflection-docblock", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "url": "https://github.com/barryvdh/ReflectionDocBlock.git", + "reference": "d103774cbe7e94ddee7e4870f97f727b43fe7201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/d103774cbe7e94ddee7e4870f97f727b43fe7201", + "reference": "d103774cbe7e94ddee7e4870f97f727b43fe7201", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.14|^9" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "2.3.x-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "psr-0": { + "Barryvdh": [ + "src/" + ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9862,72 +11766,67 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" } ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.4.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2025-07-17T06:07:30+00:00" }, { - "name": "symfony/uid", - "version": "v7.1.1", + "name": "brianium/paratest", + "version": "v7.8.5", "source": { "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" + "url": "https://github.com/paratestphp/paratest.git", + "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", - "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", + "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-uuid": "^1.15" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0" + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.3.0", + "jean85/pretty-package-versions": "^2.1.1", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-timer": "^7.0.1", + "phpunit/phpunit": "^11.5.46", + "sebastian/environment": "^7.2.1", + "symfony/console": "^6.4.22 || ^7.3.4 || ^8.0.3", + "symfony/process": "^6.4.20 || ^7.3.4 || ^8.0.3" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.1.33", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.11", + "phpstan/phpstan-strict-rules": "^2.0.7", + "squizlabs/php_codesniffer": "^3.13.5", + "symfony/filesystem": "^6.4.13 || ^7.3.2 || ^8.0.1" }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Uid\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "ParaTest\\": [ + "src/" + ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -9935,87 +11834,77 @@ ], "authors": [ { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" } ], - "description": "Provides an object-oriented API to generate and represent UIDs", - "homepage": "https://symfony.com", + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", "keywords": [ - "UID", - "ulid", - "uuid" + "concurrent", + "parallel", + "phpunit", + "testing" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.1" + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.8.5" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sponsors/Slamdunk", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2026-01-08T08:02:38+00:00" }, { - "name": "symfony/var-dumper", - "version": "v7.1.5", + "name": "composer/class-map-generator", + "version": "1.7.1", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + "url": "https://github.com/composer/class-map-generator.git", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", - "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Composer\\ClassMapGenerator\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -10023,74 +11912,71 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", + "description": "Utilities to scan PHP code and generate class maps.", "keywords": [ - "debug", - "dump" + "classmap" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.5" + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.7.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-16T10:07:02+00:00" + "time": "2025-12-29T13:15:25+00:00" }, { - "name": "symfony/yaml", - "version": "v7.1.1", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "^1.8" + "php": "^7.4 || ^8.0" }, "conflict": { - "symfony/console": "<6.4" + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Composer\\Pcre\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -10098,199 +11984,198 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.1" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "tijsverkoyen/css-to-inline-styles", - "version": "v2.2.7", + "name": "fakerphp/faker", + "version": "v1.24.1", "source": { "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", - "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." }, + "type": "library", "autoload": { "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" + "Faker\\": "src/Faker/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", - "role": "Developer" + "name": "François Zaninotto" } ], - "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", - "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], "support": { - "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" }, - "time": "2023-12-08T13:03:43+00:00" + "time": "2024-11-21T13:46:39+00:00" }, { - "name": "vlucas/phpdotenv", - "version": "v5.6.0", + "name": "fidry/cpu-core-counter", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", - "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { - "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.2", - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.2", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" + "php": "^7.2 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-filter": "*", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator." + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - }, - "branch-alias": { - "dev-master": "5.6-dev" - } - }, "autoload": { "psr-4": { - "Dotenv\\": "src/" + "Fidry\\CpuCoreCounter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "description": "Tiny utility to get the number of CPU cores.", "keywords": [ - "dotenv", - "env", - "environment" + "CPU", + "core" ], "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/theofidry", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" } ], - "time": "2023-11-12T22:43:29+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { - "name": "voku/portable-ascii", - "version": "2.0.1", + "name": "filp/whoops", + "version": "2.18.4", "source": { "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, "autoload": { "psr-4": { - "voku\\": "src/voku/" + "Whoops\\": "src/Whoops/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10299,133 +12184,106 @@ ], "authors": [ { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" } ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", "keywords": [ - "ascii", - "clean", - "php" + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" ], "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" }, "funding": [ { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", + "url": "https://github.com/denis-sokolov", "type": "github" - }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" } ], - "time": "2022-03-08T17:03:00+00:00" + "time": "2025-08-08T12:00:00+00:00" }, { - "name": "webbingbrasil/filament-copyactions", - "version": "3.0.1", + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", "source": { "type": "git", - "url": "https://github.com/webbingbrasil/filament-copyactions.git", - "reference": "6a7bd63c1ce69632147f3ecf2c193f3465d8de43" + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webbingbrasil/filament-copyactions/zipball/6a7bd63c1ce69632147f3ecf2c193f3465d8de43", - "reference": "6a7bd63c1ce69632147f3ecf2c193f3465d8de43", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", "shasum": "" }, "require": { - "filament/filament": "^3.0", - "php": "^8.0" + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Webbingbrasil\\FilamentCopyActions\\FilamentCopyActionsProvider" - ] + "branch-alias": { + "dev-master": "2.1-dev" } }, "autoload": { - "psr-4": { - "Webbingbrasil\\FilamentCopyActions\\": "src" - } + "classmap": [ + "hamcrest" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Danilo Andrade", - "email": "danilo@webbingbrasil.com.br", - "role": "Developer" - } + "BSD-3-Clause" ], - "description": "A easy-to-use copy actions for Filament Admin.", - "homepage": "https://github.com/webbingbrasil/filament-copyactions", + "description": "This is the PHP port of Hamcrest Matchers", "keywords": [ - "filament", - "laravel" + "test" ], "support": { - "issues": "https://github.com/webbingbrasil/filament-copyactions/issues", - "source": "https://github.com/webbingbrasil/filament-copyactions/tree/3.0.1" + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" }, - "time": "2024-04-03T12:14:21+00:00" + "time": "2025-04-30T06:54:44+00:00" }, { - "name": "webmozart/assert", - "version": "1.11.0", + "name": "iamcal/sql-parser", + "version": "v0.7", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "url": "https://github.com/iamcal/SQLParser.git", + "reference": "610392f38de49a44dab08dc1659960a29874c4b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/iamcal/SQLParser/zipball/610392f38de49a44dab08dc1659960a29874c4b8", + "reference": "610392f38de49a44dab08dc1659960a29874c4b8", "shasum": "" }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, "require-dev": { - "phpunit/phpunit": "^8.5.13" + "php-coveralls/php-coveralls": "^1.0", + "phpunit/phpunit": "^5|^6|^7|^8|^9" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { "psr-4": { - "Webmozart\\Assert\\": "src/" + "iamcal\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -10434,78 +12292,52 @@ ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Cal Henderson", + "email": "cal@iamcal.com" } ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], + "description": "MySQL schema parser", "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "issues": "https://github.com/iamcal/SQLParser/issues", + "source": "https://github.com/iamcal/SQLParser/tree/v0.7" }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "packages-dev": [ + "time": "2026-01-28T22:20:33+00:00" + }, { - "name": "barryvdh/laravel-ide-helper", - "version": "v3.0.0", + "name": "jean85/pretty-package-versions", + "version": "2.1.1", "source": { "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "bc1d67f01ce8c77e3f97d48ba51fa1d81874f622" + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/bc1d67f01ce8c77e3f97d48ba51fa1d81874f622", - "reference": "bc1d67f01ce8c77e3f97d48ba51fa1d81874f622", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", "shasum": "" }, "require": { - "barryvdh/reflection-docblock": "^2.1.1", - "composer/class-map-generator": "^1.0", - "ext-json": "*", - "illuminate/console": "^10 || ^11", - "illuminate/database": "^10.38 || ^11", - "illuminate/filesystem": "^10 || ^11", - "illuminate/support": "^10 || ^11", - "nikic/php-parser": "^4.18 || ^5", - "php": "^8.1", - "phpdocumentor/type-resolver": "^1.1.0" + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" }, "require-dev": { - "ext-pdo_sqlite": "*", - "friendsofphp/php-cs-fixer": "^3", - "illuminate/config": "^9 || ^10 || ^11", - "illuminate/view": "^9 || ^10 || ^11", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^8 || ^9", - "phpunit/phpunit": "^10.5", - "spatie/phpunit-snapshot-assertions": "^4 || ^5", - "vimeo/psalm": "^5.4" - }, - "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)." + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" - ] + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" + "Jean85\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10514,73 +12346,78 @@ ], "authors": [ { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" } ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", + "description": "A library to get pretty versions strings of installed dependencies", "keywords": [ - "autocomplete", - "codeintel", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" + "composer", + "package", + "release", + "versions" ], "support": { - "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.0.0" + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2024-03-01T12:53:18+00:00" + "time": "2025-03-19T14:43:43+00:00" }, { - "name": "barryvdh/reflection-docblock", - "version": "v2.1.1", + "name": "larastan/larastan", + "version": "v3.9.2", "source": { "type": "git", - "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597" + "url": "https://github.com/larastan/larastan.git", + "reference": "2e9ed291bdc1969e7f270fb33c9cdf3c912daeb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/e6811e927f0ecc37cc4deaa6627033150343e597", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597", + "url": "https://api.github.com/repos/larastan/larastan/zipball/2e9ed291bdc1969e7f270fb33c9cdf3c912daeb2", + "reference": "2e9ed291bdc1969e7f270fb33c9cdf3c912daeb2", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-json": "*", + "iamcal/sql-parser": "^0.7.0", + "illuminate/console": "^11.44.2 || ^12.4.1", + "illuminate/container": "^11.44.2 || ^12.4.1", + "illuminate/contracts": "^11.44.2 || ^12.4.1", + "illuminate/database": "^11.44.2 || ^12.4.1", + "illuminate/http": "^11.44.2 || ^12.4.1", + "illuminate/pipeline": "^11.44.2 || ^12.4.1", + "illuminate/support": "^11.44.2 || ^12.4.1", + "php": "^8.2", + "phpstan/phpstan": "^2.1.32" }, "require-dev": { - "phpunit/phpunit": "^8.5.14|^9" + "doctrine/coding-standard": "^13", + "laravel/framework": "^11.44.2 || ^12.7.2", + "mockery/mockery": "^1.6.12", + "nikic/php-parser": "^5.4", + "orchestra/canvas": "^v9.2.2 || ^10.0.1", + "orchestra/testbench-core": "^9.12.0 || ^10.1", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpunit/phpunit": "^10.5.35 || ^11.5.15" }, "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "orchestra/testbench": "Using Larastan for analysing a package needs Testbench", + "phpmyadmin/sql-parser": "Install to enable Larastan's optional phpMyAdmin-based SQL parser automatically" }, - "type": "library", + "type": "phpstan-extension", "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { - "psr-0": { - "Barryvdh": [ - "src/" - ] + "psr-4": { + "Larastan\\Larastan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10589,51 +12426,82 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "name": "Can Vural", + "email": "can9119@gmail.com" } ], + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "larastan", + "laravel", + "package", + "php", + "static analysis" + ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.1" + "issues": "https://github.com/larastan/larastan/issues", + "source": "https://github.com/larastan/larastan/tree/v3.9.2" }, - "time": "2023-06-14T05:06:27+00:00" + "funding": [ + { + "url": "https://github.com/canvural", + "type": "github" + } + ], + "time": "2026-01-30T15:16:32+00:00" }, { - "name": "composer/class-map-generator", - "version": "1.3.2", + "name": "laravel/pail", + "version": "v1.2.6", "source": { "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "acd227952154850d0bb7d65caa4f9edf9cd806a7" + "url": "https://github.com/laravel/pail.git", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/acd227952154850d0bb7d65caa4f9edf9cd806a7", - "reference": "acd227952154850d0bb7d65caa4f9edf9cd806a7", + "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", "shasum": "" }, "require": { - "composer/pcre": "^2.1 || ^3.1", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0|^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" }, "type": "library", "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, "branch-alias": { "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Composer\\ClassMapGenerator\\": "src" + "Laravel\\Pail\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10642,66 +12510,68 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Utilities to scan PHP code and generate class maps.", + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", "keywords": [ - "classmap" + "dev", + "laravel", + "logs", + "php", + "tail" ], "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.3.2" + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-05-31T19:45:56+00:00" + "time": "2026-02-09T13:44:54+00:00" }, { - "name": "composer/pcre", - "version": "3.1.4", + "name": "laravel/pint", + "version": "v1.27.1", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "url": "https://github.com/laravel/pint.git", + "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/laravel/pint/zipball/54cca2de13790570c7b6f0f94f37896bee4abcb5", + "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } + "friendsofphp/php-cs-fixer": "^3.93.1", + "illuminate/view": "^12.51.0", + "larastan/larastan": "^3.9.2", + "laravel-zero/framework": "^12.0.5", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3.3", + "pestphp/pest": "^3.8.5" }, + "bin": [ + "builds/pint" + ], + "type": "project", "autoload": { "psr-4": { - "Composer\\Pcre\\": "src" + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10710,78 +12580,66 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "dev", + "format", + "formatter", + "lint", + "linter", + "php" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2026-02-10T20:00:20+00:00" }, { - "name": "fakerphp/faker", - "version": "v1.23.1", + "name": "laravel/sail", + "version": "v1.53.0", "source": { "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + "url": "https://github.com/laravel/sail.git", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "doctrine/persistence": "^1.3 || ^2.0", - "ext-intl": "*", - "phpunit/phpunit": "^9.5.26", - "symfony/phpunit-bridge": "^5.4.16" - }, - "suggest": { - "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^2.0" }, + "bin": [ + "bin/sail" + ], "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "Faker\\": "src/Faker/" + "Laravel\\Sail\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10790,184 +12648,261 @@ ], "authors": [ { - "name": "François Zaninotto" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Faker is a PHP library that generates fake data for you.", + "description": "Docker files for running a basic Laravel application.", "keywords": [ - "data", - "faker", - "fixtures" + "docker", + "laravel" ], "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" }, - "time": "2024-01-02T13:46:09+00:00" + "time": "2026-02-06T12:16:02+00:00" }, { - "name": "filp/whoops", - "version": "2.15.4", + "name": "mockery/mockery", + "version": "1.6.12", "source": { "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "conflict": { + "phpunit/phpunit": "<8.0" }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], "psr-4": { - "Whoops\\": "src/Whoops/" + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", "keywords": [ - "error", - "exception", - "handling", + "BDD", + "TDD", "library", - "throwable", - "whoops" + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" ], "support": { - "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.4" + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "funding": [ - { - "url": "https://github.com/denis-sokolov", - "type": "github" - } - ], - "time": "2023-11-03T12:00:00+00:00" + "time": "2024-05-16T03:13:13+00:00" }, { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "name": "nunomaduro/collision", + "version": "v8.9.1", "source": { "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "url": "https://github.com/nunomaduro/collision.git", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "shasum": "" }, "require": { - "php": "^5.3|^7.0|^8.0" + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", + "php": "^8.2.0", + "symfony/console": "^7.4.4 || ^8.0.4" }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" + "conflict": { + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" }, "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.2", + "laravel/framework": "^11.48.0 || ^12.52.0", + "laravel/pint": "^1.27.1", + "orchestra/testbench-core": "^9.12.0 || ^10.9.0", + "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" }, "type": "library", "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, "branch-alias": { - "dev-master": "2.1-dev" + "dev-8.x": "8.x-dev" } }, "autoload": { - "classmap": [ - "hamcrest" - ] + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } ], - "description": "This is the PHP port of Hamcrest Matchers", + "description": "Cli error handling for console/command-line PHP applications.", "keywords": [ - "test" + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" ], "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" }, - "time": "2020-07-09T08:09:16+00:00" + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-02-17T17:33:08+00:00" }, { - "name": "larastan/larastan", - "version": "v2.9.7", + "name": "pestphp/pest", + "version": "v3.8.5", "source": { "type": "git", - "url": "https://github.com/larastan/larastan.git", - "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb" + "url": "https://github.com/pestphp/pest.git", + "reference": "7796630eafcfd1c02660cecdde3bc6984fbf01f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/5c805f636095cc2e0b659e3954775cf8f1dad1bb", - "reference": "5c805f636095cc2e0b659e3954775cf8f1dad1bb", + "url": "https://api.github.com/repos/pestphp/pest/zipball/7796630eafcfd1c02660cecdde3bc6984fbf01f4", + "reference": "7796630eafcfd1c02660cecdde3bc6984fbf01f4", "shasum": "" }, "require": { - "ext-json": "*", - "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", - "php": "^8.0.2", - "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.11.1" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0", - "nikic/php-parser": "^4.19.1", - "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", - "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", - "phpunit/phpunit": "^9.6.13 || ^10.5.16" + "brianium/paratest": "^7.8.5", + "nunomaduro/collision": "^8.8.3", + "nunomaduro/termwind": "^2.3.3", + "pestphp/pest-plugin": "^3.0.0", + "pestphp/pest-plugin-arch": "^3.1.1", + "pestphp/pest-plugin-mutate": "^3.0.5", + "php": "^8.2.0", + "phpunit/phpunit": "^11.5.50" }, - "suggest": { - "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" + "conflict": { + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">11.5.50", + "sebastian/exporter": "<6.0.0", + "webmozart/assert": "<1.11.0" }, - "type": "phpstan-extension", + "require-dev": { + "pestphp/pest-dev-tools": "^3.4.0", + "pestphp/pest-plugin-type-coverage": "^3.6.1", + "symfony/process": "^7.4.4" + }, + "bin": [ + "bin/pest" + ], + "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.0-dev" + "pest": { + "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Parallel" + ] }, "phpstan": { "includes": [ @@ -10976,8 +12911,12 @@ } }, "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], "psr-4": { - "Larastan\\Larastan\\": "src/" + "Pest\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10985,373 +12924,336 @@ "MIT" ], "authors": [ - { - "name": "Can Vural", - "email": "can9119@gmail.com" - }, { "name": "Nuno Maduro", "email": "enunomaduro@gmail.com" } ], - "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", + "description": "The elegant PHP Testing Framework.", "keywords": [ - "PHPStan", - "code analyse", - "code analysis", - "larastan", - "laravel", - "package", + "framework", + "pest", "php", - "static analysis" + "test", + "testing", + "unit" ], "support": { - "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.7" + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v3.8.5" }, "funding": [ { "url": "https://www.paypal.com/paypalme/enunomaduro", "type": "custom" }, - { - "url": "https://github.com/canvural", - "type": "github" - }, { "url": "https://github.com/nunomaduro", "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" } ], - "time": "2024-05-27T18:33:26+00:00" + "time": "2026-01-28T01:33:45+00:00" }, { - "name": "laravel/pint", - "version": "v1.16.0", + "name": "pestphp/pest-plugin", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/laravel/pint.git", - "reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98" + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98", - "reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", "shasum": "" }, "require": { - "ext-json": "*", - "ext-mbstring": "*", - "ext-tokenizer": "*", - "ext-xml": "*", - "php": "^8.1.0" + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.2" + }, + "conflict": { + "pestphp/pest": "<3.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.57.1", - "illuminate/view": "^10.48.10", - "larastan/larastan": "^2.9.6", - "laravel-zero/framework": "^10.4.0", - "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.34.7" + "composer/composer": "^2.7.9", + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" }, - "bin": [ - "builds/pint" - ], - "type": "project", "autoload": { "psr-4": { - "App\\": "app/", - "Database\\Seeders\\": "database/seeders/", - "Database\\Factories\\": "database/factories/" + "Pest\\Plugin\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "An opinionated code formatter for PHP.", - "homepage": "https://laravel.com", + "description": "The Pest plugin manager", "keywords": [ - "format", - "formatter", - "lint", - "linter", - "php" + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" ], "support": { - "issues": "https://github.com/laravel/pint/issues", - "source": "https://github.com/laravel/pint" + "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" }, - "time": "2024-05-21T18:08:25+00:00" + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-09-08T23:21:41+00:00" }, { - "name": "laravel/sail", - "version": "v1.29.2", + "name": "pestphp/pest-plugin-arch", + "version": "v3.1.1", "source": { "type": "git", - "url": "https://github.com/laravel/sail.git", - "reference": "a8e4e749735ba2f091856eafeb3f99db8cd6b621" + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/a8e4e749735ba2f091856eafeb3f99db8cd6b621", - "reference": "a8e4e749735ba2f091856eafeb3f99db8cd6b621", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0", - "illuminate/support": "^9.52.16|^10.0|^11.0", - "php": "^8.0", - "symfony/console": "^6.0|^7.0", - "symfony/yaml": "^6.0|^7.0" + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0", - "phpstan/phpstan": "^1.10" + "pestphp/pest": "^3.8.1", + "pestphp/pest-dev-tools": "^3.4.0" }, - "bin": [ - "bin/sail" - ], "type": "library", "extra": { - "laravel": { - "providers": [ - "Laravel\\Sail\\SailServiceProvider" + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" ] } }, "autoload": { + "files": [ + "src/Autoload.php" + ], "psr-4": { - "Laravel\\Sail\\": "src/" + "Pest\\Arch\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Docker files for running a basic Laravel application.", + "description": "The Arch plugin for Pest PHP.", "keywords": [ - "docker", - "laravel" + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" ], "support": { - "issues": "https://github.com/laravel/sail/issues", - "source": "https://github.com/laravel/sail" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.1" }, - "time": "2024-05-16T21:39:11+00:00" + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-04-16T22:59:48+00:00" }, { - "name": "mockery/mockery", - "version": "1.6.12", + "name": "pestphp/pest-plugin-faker", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + "url": "https://github.com/pestphp/pest-plugin-faker.git", + "reference": "48343e2806cfc12a042dead90ffff4a043167e3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "url": "https://api.github.com/repos/pestphp/pest-plugin-faker/zipball/48343e2806cfc12a042dead90ffff4a043167e3e", + "reference": "48343e2806cfc12a042dead90ffff4a043167e3e", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": ">=7.3" - }, - "conflict": { - "phpunit/phpunit": "<8.0" + "fakerphp/faker": "^1.23.1", + "pestphp/pest": "^3.0.0", + "php": "^8.2" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.17", - "symplify/easy-coding-standard": "^12.1.14" + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "library", "autoload": { "files": [ - "library/helpers.php", - "library/Mockery.php" + "src/Faker.php" ], "psr-4": { - "Mockery\\": "library/Mockery" + "Pest\\Faker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ + "description": "The Pest Faker Plugin", + "keywords": [ + "faker", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-faker/tree/v3.0.0" + }, + "funding": [ { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "https://github.com/padraic", - "role": "Author" + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" }, { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "https://davedevelopment.co.uk", - "role": "Developer" + "url": "https://github.com/nunomaduro", + "type": "github" }, { - "name": "Nathanael Esayeas", - "email": "nathanael.esayeas@protonmail.com", - "homepage": "https://github.com/ghostwriter", - "role": "Lead Developer" + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" } ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "support": { - "docs": "https://docs.mockery.io/", - "issues": "https://github.com/mockery/mockery/issues", - "rss": "https://github.com/mockery/mockery/releases.atom", - "security": "https://github.com/mockery/mockery/security/advisories", - "source": "https://github.com/mockery/mockery" - }, - "time": "2024-05-16T03:13:13+00:00" + "time": "2024-09-08T23:56:08+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.11.1", + "name": "pestphp/pest-plugin-livewire", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "url": "https://github.com/pestphp/pest-plugin-livewire.git", + "reference": "e2f2edb0a7d414d6837d87908a0e148256d3bf89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/e2f2edb0a7d414d6837d87908a0e148256d3bf89", + "reference": "e2f2edb0a7d414d6837d87908a0e148256d3bf89", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "livewire/livewire": "^3.5.6", + "pestphp/pest": "^3.0.0", + "php": "^8.1" }, "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + "orchestra/testbench": "^9.4.0", + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "library", "autoload": { "files": [ - "src/DeepCopy/deep_copy.php" + "src/Autoload.php" ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" + "Pest\\Livewire\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "MIT" + ], + "description": "The Pest Livewire Plugin", + "keywords": [ + "framework", + "livewire", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v3.0.0" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-09-09T00:05:59+00:00" }, { - "name": "nunomaduro/collision", - "version": "v8.1.1", + "name": "pestphp/pest-plugin-mutate", + "version": "v3.0.5", "source": { "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9" + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/13e5d538b95a744d85f447a321ce10adb28e9af9", - "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", "shasum": "" }, "require": { - "filp/whoops": "^2.15.4", - "nunomaduro/termwind": "^2.0.1", - "php": "^8.2.0", - "symfony/console": "^7.0.4" - }, - "conflict": { - "laravel/framework": "<11.0.0 || >=12.0.0", - "phpunit/phpunit": "<10.5.1 || >=12.0.0" + "nikic/php-parser": "^5.2.0", + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "psr/simple-cache": "^3.0.0" }, "require-dev": { - "larastan/larastan": "^2.9.2", - "laravel/framework": "^11.0.0", - "laravel/pint": "^1.14.0", - "laravel/sail": "^1.28.2", - "laravel/sanctum": "^4.0.0", - "laravel/tinker": "^2.9.0", - "orchestra/testbench-core": "^9.0.0", - "pestphp/pest": "^2.34.1 || ^3.0.0", - "sebastian/environment": "^6.0.1 || ^7.0.0" + "pestphp/pest": "^3.0.8", + "pestphp/pest-dev-tools": "^3.0.0", + "pestphp/pest-plugin-type-coverage": "^3.0.0" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - }, - "branch-alias": { - "dev-8.x": "8.x-dev" - } - }, "autoload": { - "files": [ - "./src/Adapters/Phpunit/Autoload.php" - ], "psr-4": { - "NunoMaduro\\Collision\\": "src/" + "Pest\\Mutate\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -11360,26 +13262,24 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" } ], - "description": "Cli error handling for console/command-line PHP applications.", + "description": "Mutates your code to find untested cases", "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "error", - "handling", - "laravel", - "laravel-zero", + "framework", + "mutate", + "mutation", + "pest", "php", - "symfony" + "plugin", + "test", + "testing", + "unit" ], "support": { - "issues": "https://github.com/nunomaduro/collision/issues", - "source": "https://github.com/nunomaduro/collision" + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" }, "funding": [ { @@ -11387,15 +13287,15 @@ "type": "custom" }, { - "url": "https://github.com/nunomaduro", + "url": "https://github.com/gehrisandro", "type": "github" }, { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" + "url": "https://github.com/nunomaduro", + "type": "github" } ], - "time": "2024-03-06T16:20:09+00:00" + "time": "2024-09-22T07:54:40+00:00" }, { "name": "phar-io/manifest", @@ -11515,221 +13415,17 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" - }, - "time": "2024-02-23T11:10:43+00:00" - }, - { - "name": "phpmyadmin/sql-parser", - "version": "5.9.0", - "source": { - "type": "git", - "url": "https://github.com/phpmyadmin/sql-parser.git", - "reference": "011fa18a4e55591fac6545a821921dd1d61c6984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/011fa18a4e55591fac6545a821921dd1d61c6984", - "reference": "011fa18a4e55591fac6545a821921dd1d61c6984", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "phpmyadmin/motranslator": "<3.0" - }, - "require-dev": { - "phpbench/phpbench": "^1.1", - "phpmyadmin/coding-standard": "^3.0", - "phpmyadmin/motranslator": "^4.0 || ^5.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.9.12", - "phpstan/phpstan-phpunit": "^1.3.3", - "phpunit/php-code-coverage": "*", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "^0.16.1", - "vimeo/psalm": "^4.11", - "zumba/json-serializer": "~3.0.2" - }, - "suggest": { - "ext-mbstring": "For best performance", - "phpmyadmin/motranslator": "Translate messages to your favorite locale" - }, - "bin": [ - "bin/highlight-query", - "bin/lint-query", - "bin/sql-parser", - "bin/tokenize-query" - ], - "type": "library", - "autoload": { - "psr-4": { - "PhpMyAdmin\\SqlParser\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "The phpMyAdmin Team", - "email": "developers@phpmyadmin.net", - "homepage": "https://www.phpmyadmin.net/team/" - } - ], - "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", - "homepage": "https://github.com/phpmyadmin/sql-parser", - "keywords": [ - "analysis", - "lexer", - "parser", - "query linter", - "sql", - "sql lexer", - "sql linter", - "sql parser", - "sql syntax highlighter", - "sql tokenizer" - ], - "support": { - "issues": "https://github.com/phpmyadmin/sql-parser/issues", - "source": "https://github.com/phpmyadmin/sql-parser" - }, - "funding": [ - { - "url": "https://www.phpmyadmin.net/donate/", - "type": "other" - } - ], - "time": "2024-01-20T20:34:02+00:00" - }, { "name": "phpstan/phpstan", - "version": "1.11.4", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "9100a76ce8015b9aa7125b9171ae3a76887b6c82" - }, + "version": "2.1.40", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9100a76ce8015b9aa7125b9171ae3a76887b6c82", - "reference": "9100a76ce8015b9aa7125b9171ae3a76887b6c82", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -11770,39 +13466,39 @@ "type": "github" } ], - "time": "2024-06-06T12:19:22+00:00" + "time": "2026-02-23T15:04:35+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "11.0.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "nikic/php-parser": "^5.7.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.1", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.3.1" }, "require-dev": { - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "^11.5.46" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -11811,7 +13507,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -11840,40 +13536,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2025-12-24T07:01:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -11901,36 +13609,48 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2026-02-02T13:52:54+00:00" }, { "name": "phpunit/php-invoker", - "version": "4.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -11938,7 +13658,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11964,7 +13684,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -11972,32 +13693,32 @@ "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "3.0.1", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -12024,7 +13745,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -12032,32 +13753,32 @@ "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "6.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12083,7 +13804,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -12091,20 +13813,20 @@ "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "10.5.20", + "version": "11.5.50", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", + "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", "shasum": "" }, "require": { @@ -12114,26 +13836,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.3", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -12144,7 +13866,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -12176,7 +13898,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.50" }, "funding": [ { @@ -12187,37 +13909,45 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2024-04-24T06:32:35+00:00" + "time": "2026-01-27T05:59:18+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -12241,7 +13971,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { @@ -12249,32 +13979,32 @@ "type": "github" } ], - "time": "2024-03-02T07:12:49+00:00" + "time": "2024-07-03T04:41:36+00:00" }, { "name": "sebastian/code-unit", - "version": "2.0.0", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -12297,7 +14027,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" }, "funding": [ { @@ -12305,32 +14036,32 @@ "type": "github" } ], - "time": "2023-02-03T06:58:43+00:00" + "time": "2025-03-19T07:56:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -12352,7 +14083,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" }, "funding": [ { @@ -12360,36 +14092,39 @@ "type": "github" } ], - "time": "2023-02-03T06:59:15+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -12429,41 +14164,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2026-01-24T09:26:40+00:00" }, { "name": "sebastian/complexity", - "version": "3.2.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -12487,7 +14234,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -12495,33 +14242,33 @@ "type": "github" } ], - "time": "2023-12-21T08:37:17+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "5.1.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -12554,7 +14301,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -12562,27 +14309,27 @@ "type": "github" } ], - "time": "2024-03-02T07:15:17+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "6.1.0", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -12590,7 +14337,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -12618,42 +14365,54 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-03-23T08:47:14+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.2", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -12696,43 +14455,55 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-03-02T07:17:12+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12758,7 +14529,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { @@ -12766,33 +14537,33 @@ "type": "github" } ], - "time": "2024-03-02T07:19:19+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.2", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -12816,7 +14587,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -12824,34 +14595,34 @@ "type": "github" } ], - "time": "2023-12-21T08:38:20+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "5.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -12873,7 +14644,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -12881,32 +14653,32 @@ "type": "github" } ], - "time": "2023-02-03T07:08:32+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "3.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -12928,7 +14700,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -12936,32 +14709,32 @@ "type": "github" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "5.0.0", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -12991,40 +14764,53 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T07:05:40+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "4.0.0", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -13047,37 +14833,50 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", - "version": "4.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -13100,7 +14899,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -13108,188 +14908,89 @@ "type": "github" } ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "spatie/backtrace", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/backtrace.git", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "ext-json": "*", - "laravel/serializable-closure": "^1.3", - "phpunit/phpunit": "^9.3", - "spatie/phpunit-snapshot-assertions": "^4.2", - "symfony/var-dumper": "^5.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Backtrace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van de Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A better backtrace", - "homepage": "https://github.com/spatie/backtrace", - "keywords": [ - "Backtrace", - "spatie" - ], - "support": { - "source": "https://github.com/spatie/backtrace/tree/1.6.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2024-04-24T13:22:11+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { - "name": "spatie/flare-client-php", - "version": "1.6.0", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/spatie/flare-client-php.git", - "reference": "220a7c8745e9fa427d54099f47147c4b97fe6462" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/220a7c8745e9fa427d54099f47147c4b97fe6462", - "reference": "220a7c8745e9fa427d54099f47147c4b97fe6462", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", - "php": "^8.0", - "spatie/backtrace": "^1.5.2", - "symfony/http-foundation": "^5.2|^6.0|^7.0", - "symfony/mime": "^5.2|^6.0|^7.0", - "symfony/process": "^5.2|^6.0|^7.0", - "symfony/var-dumper": "^5.2|^6.0|^7.0" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.5.0", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.3.x-dev" - } - }, "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\FlareClient\\": "src" - } + "classmap": [ + "lib/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/spatie/flare-client-php", + "description": "A static analysis tool to detect side effects in PHP code", "keywords": [ - "exception", - "flare", - "reporting", - "spatie" + "static analysis" ], "support": { - "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.6.0" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://github.com/spatie", + "url": "https://github.com/staabm", "type": "github" } ], - "time": "2024-05-22T09:45:39+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "spatie/ignition", - "version": "1.14.2", + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.7", "source": { "type": "git", - "url": "https://github.com/spatie/ignition.git", - "reference": "5e11c11f675bb5251f061491a493e04a1a571532" + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/5e11c11f675bb5251f061491a493e04a1a571532", - "reference": "5e11c11f675bb5251f061491a493e04a1a571532", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", "shasum": "" }, "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0", - "spatie/backtrace": "^1.5.3", - "spatie/flare-client-php": "^1.4.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0", - "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "psr/simple-cache-implementation": "*", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.5.x-dev" - } - }, "autoload": { "psr-4": { - "Spatie\\Ignition\\": "src" + "PHPUnit\\Architecture\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -13298,137 +14999,40 @@ ], "authors": [ { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for PHP applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/ignition/issues", - "source": "https://github.com/spatie/ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-05-29T08:10:20+00:00" - }, - { - "name": "spatie/laravel-ignition", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f52124d50122611e8a40f628cef5c19ff6cc5b57", - "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "illuminate/support": "^10.0|^11.0", - "php": "^8.1", - "spatie/flare-client-php": "^1.5", - "spatie/ignition": "^1.14", - "symfony/console": "^6.2.3|^7.0", - "symfony/var-dumper": "^6.2.3|^7.0" - }, - "require-dev": { - "livewire/livewire": "^2.11|^3.3.5", - "mockery/mockery": "^1.5.1", - "openai-php/client": "^0.8.1", - "orchestra/testbench": "8.22.3|^9.0", - "pestphp/pest": "^2.34", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.16", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\LaravelIgnition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" - } - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\LaravelIgnition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://flareapp.io/ignition", + "description": "Methods for testing application architecture", "keywords": [ - "error", - "flare", - "laravel", - "page" + "architecture", + "phpunit", + "stucture", + "test", + "testing" ], "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/laravel-ignition/issues", - "source": "https://github.com/spatie/laravel-ignition" + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-05-02T13:42:49+00:00" + "time": "2026-02-17T17:25:14+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -13457,7 +15061,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -13465,22 +15069,25 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2 || ^8.3", + "php": "^8.2 || ^8.3 || ^8.4 || ^8.5", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-pdo": "*", "ext-zip": "*" }, - "platform-dev": [], + "platform-dev": {}, + "platform-overrides": { + "php": "8.2" + }, "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php index 1a89ba65ff..eeb3a168d0 100644 --- a/config/app.php +++ b/config/app.php @@ -1,28 +1,21 @@ env('APP_NAME', 'Pelican'), + 'logo' => env('APP_LOGO'), 'favicon' => env('APP_FAVICON', '/pelican.ico'), 'version' => 'canary', + 'timezone' => 'UTC', + + 'installed' => env('APP_INSTALLED', true), + 'exceptions' => [ 'report_all' => env('APP_REPORT_ALL_EXCEPTIONS', false), ], - 'aliases' => Facade::defaultAliases()->merge([ - 'Alert' => Prologue\Alerts\Facades\Alert::class, - 'Carbon' => Carbon\Carbon::class, - 'JavaScript' => Laracasts\Utilities\JavaScript\JavaScriptFacade::class, - 'Theme' => App\Extensions\Facades\Theme::class, - - // Custom Facades - 'Activity' => App\Facades\Activity::class, - 'LogBatch' => App\Facades\LogBatch::class, - 'LogTarget' => App\Facades\LogTarget::class, - ])->toArray(), + 'fallback_locale' => 'en', ]; diff --git a/config/backups.php b/config/backups.php index 0074bf8d7a..c3bf16cf71 100644 --- a/config/backups.php +++ b/config/backups.php @@ -1,5 +1,6 @@ env('BACKUP_PRESIGNED_URL_LIFESPAN', 60), + 'presigned_url_lifespan' => (int) env('BACKUP_PRESIGNED_URL_LIFESPAN', 60), // This value defines the maximal size of a single part for the S3 multipart upload during backups // The maximal part size must be given in bytes. The default value is 5GB. // Note that 5GB is the maximum for a single part when using AWS S3. - 'max_part_size' => env('BACKUP_MAX_PART_SIZE', 5 * 1024 * 1024 * 1024), + 'max_part_size' => (int) env('BACKUP_MAX_PART_SIZE', BackupRemoteUploadController::DEFAULT_MAX_PART_SIZE), // The time to wait before automatically failing a backup, time is in minutes and defaults // to 6 hours. To disable this feature, set the value to `0`. - 'prune_age' => env('BACKUP_PRUNE_AGE', 360), + 'prune_age' => (int) env('BACKUP_PRUNE_AGE', 360), // Defines the backup creation throttle limits for users. In this default example, we allow // a user to create two (successful or pending) backups per 10 minutes. Even if they delete @@ -27,8 +28,8 @@ // // Set the period to "0" to disable this throttle. The period is defined in seconds. 'throttles' => [ - 'limit' => env('BACKUP_THROTTLE_LIMIT', 2), - 'period' => env('BACKUP_THROTTLE_PERIOD', 600), + 'limit' => (int) env('BACKUP_THROTTLE_LIMIT', 2), + 'period' => (int) env('BACKUP_THROTTLE_PERIOD', 600), ], 'disks' => [ diff --git a/config/database.php b/config/database.php index bc995eddac..c4ff1f198b 100644 --- a/config/database.php +++ b/config/database.php @@ -1,22 +1,52 @@ startsWith('/')) { +$databasePath = database_path($database); + +if (str_starts_with($database, '/') || $database === ':memory:') { $databasePath = $database; } return [ + /* + |-------------------------------------------------------------------------- + | Default Database Connection Name + |-------------------------------------------------------------------------- + | + | Here you may specify which of the database connections below you wish + | to use as your default connection for database operations. This is + | the connection which will be utilized unless another connection + | is explicitly specified when you execute a query / statement. + | + */ + 'default' => env('DB_CONNECTION', 'sqlite'), + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + 'connections' => [ + 'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DB_URL'), - 'database' => $datapasePath, + 'database' => $databasePath, 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, ], 'mysql' => [ @@ -35,7 +65,7 @@ 'strict' => env('DB_STRICT_MODE', false), 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], @@ -55,27 +85,75 @@ 'strict' => env('DB_STRICT_MODE', false), 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'panel'), + 'username' => env('DB_USERNAME', 'pelican'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + ], + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + 'migrations' => [ 'table' => 'migrations', 'update_date_on_publish' => false, // disable to preserve original behavior for existing applications ], + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + 'redis' => [ + 'client' => env('REDIS_CLIENT', 'predis'), + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + 'default' => [ 'scheme' => env('REDIS_SCHEME', 'tcp'), + 'path' => env('REDIS_PATH', '/run/redis/redis.sock'), - 'host' => env('REDIS_HOST', 'localhost'), + + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', 6379), - 'database' => env('REDIS_DATABASE', 0), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', env('REDIS_DATABASE', '0')), 'context' => extension_loaded('redis') && env('REDIS_CLIENT') === 'phpredis' ? [ 'stream' => array_filter([ 'verify_peer' => env('REDIS_VERIFY_PEER', true), @@ -105,6 +183,16 @@ ]), ] : [], ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + ], ]; diff --git a/config/filament-monaco-editor.php b/config/filament-monaco-editor.php deleted file mode 100644 index 50dab0268b..0000000000 --- a/config/filament-monaco-editor.php +++ /dev/null @@ -1,270 +0,0 @@ - [ - 'enable-preview' => true, - 'show-full-screen-toggle' => true, - 'show-placeholder' => true, - 'placeholder-text' => 'Your code here...', - 'show-loader' => true, - 'font-size' => '15px', - 'line-numbers-min-chars' => true, - 'automatic-layout' => true, - 'default-theme' => 'iPlastic', - ], - 'themes' => [ - 'blackboard' => [ - 'base' => 'vs-dark', - 'inherit' => true, - 'rules' => [ - [ - 'background' => '0C1021', - 'token' => '', - ], - [ - 'foreground' => 'aeaeae', - 'token' => 'comment', - ], - [ - 'foreground' => 'd8fa3c', - 'token' => 'constant', - ], - [ - 'foreground' => 'ff6400', - 'token' => 'entity', - ], - [ - 'foreground' => 'fbde2d', - 'token' => 'keyword', - ], - [ - 'foreground' => 'fbde2d', - 'token' => 'storage', - ], - [ - 'foreground' => '61ce3c', - 'token' => 'string', - ], - [ - 'foreground' => '61ce3c', - 'token' => 'meta.verbatim', - ], - [ - 'foreground' => '8da6ce', - 'token' => 'support', - ], - [ - 'foreground' => 'ab2a1d', - 'fontStyle' => 'italic', - 'token' => 'invalid.deprecated', - ], - [ - 'foreground' => 'f8f8f8', - 'background' => '9d1e15', - 'token' => 'invalid.illegal', - ], - [ - 'foreground' => 'ff6400', - 'fontStyle' => 'italic', - 'token' => 'entity.other.inherited-class', - ], - [ - 'foreground' => 'ff6400', - 'token' => 'string constant.other.placeholder', - ], - [ - 'foreground' => 'becde6', - 'token' => 'meta.function-call.py', - ], - [ - 'foreground' => '7f90aa', - 'token' => 'meta.tag', - ], - [ - 'foreground' => '7f90aa', - 'token' => 'meta.tag entity', - ], - [ - 'foreground' => 'ffffff', - 'token' => 'entity.name.section', - ], - [ - 'foreground' => 'd5e0f3', - 'token' => 'keyword.type.variant', - ], - [ - 'foreground' => 'f8f8f8', - 'token' => 'source.ocaml keyword.operator.symbol', - ], - [ - 'foreground' => '8da6ce', - 'token' => 'source.ocaml keyword.operator.symbol.infix', - ], - [ - 'foreground' => '8da6ce', - 'token' => 'source.ocaml keyword.operator.symbol.prefix', - ], - [ - 'fontStyle' => 'underline', - 'token' => 'source.ocaml keyword.operator.symbol.infix.floating-point', - ], - [ - 'fontStyle' => 'underline', - 'token' => 'source.ocaml keyword.operator.symbol.prefix.floating-point', - ], - [ - 'fontStyle' => 'underline', - 'token' => 'source.ocaml constant.numeric.floating-point', - ], - [ - 'background' => 'ffffff08', - 'token' => 'text.tex.latex meta.function.environment', - ], - [ - 'background' => '7a96fa08', - 'token' => 'text.tex.latex meta.function.environment meta.function.environment', - ], - [ - 'foreground' => 'fbde2d', - 'token' => 'text.tex.latex support.function', - ], - [ - 'foreground' => 'ffffff', - 'token' => 'source.plist string.unquoted', - ], - [ - 'foreground' => 'ffffff', - 'token' => 'source.plist keyword.operator', - ], - ], - 'colors' => [ - 'editor.foreground' => '#F8F8F8', - 'editor.background' => '#0C1021', - 'editor.selectionBackground' => '#253B76', - 'editor.lineHighlightBackground' => '#FFFFFF0F', - 'editorCursor.foreground' => '#FFFFFFA6', - 'editorWhitespace.foreground' => '#FFFFFF40', - ], - ], - 'iPlastic' => [ - 'base' => 'vs', - 'inherit' => true, - 'rules' => [ - [ - 'background' => 'EEEEEEEB', - 'token' => '', - ], - [ - 'foreground' => '009933', - 'token' => 'string', - ], - [ - 'foreground' => '0066ff', - 'token' => 'constant.numeric', - ], - [ - 'foreground' => 'ff0080', - 'token' => 'string.regexp', - ], - [ - 'foreground' => '0000ff', - 'token' => 'keyword', - ], - [ - 'foreground' => '9700cc', - 'token' => 'constant.language', - ], - [ - 'foreground' => '990000', - 'token' => 'support.class.exception', - ], - [ - 'foreground' => 'ff8000', - 'token' => 'entity.name.function', - ], - [ - 'fontStyle' => 'bold underline', - 'token' => 'entity.name.type', - ], - [ - 'fontStyle' => 'italic', - 'token' => 'variable.parameter', - ], - [ - 'foreground' => '0066ff', - 'fontStyle' => 'italic', - 'token' => 'comment', - ], - [ - 'foreground' => 'ff0000', - 'background' => 'e71a114d', - 'token' => 'invalid', - ], - [ - 'background' => 'e71a1100', - 'token' => 'invalid.deprecated.trailing-whitespace', - ], - [ - 'foreground' => '000000', - 'background' => 'fafafafc', - 'token' => 'text source', - ], - [ - 'foreground' => '0033cc', - 'token' => 'meta.tag', - ], - [ - 'foreground' => '0033cc', - 'token' => 'declaration.tag', - ], - [ - 'foreground' => '6782d3', - 'token' => 'constant', - ], - [ - 'foreground' => '6782d3', - 'token' => 'support.constant', - ], - [ - 'foreground' => '3333ff', - 'fontStyle' => 'bold', - 'token' => 'support', - ], - [ - 'fontStyle' => 'bold', - 'token' => 'storage', - ], - [ - 'fontStyle' => 'bold underline', - 'token' => 'entity.name.section', - ], - [ - 'foreground' => '000000', - 'fontStyle' => 'bold', - 'token' => 'entity.name.function.frame', - ], - [ - 'foreground' => '333333', - 'token' => 'meta.tag.preprocessor.xml', - ], - [ - 'foreground' => '3366cc', - 'fontStyle' => 'italic', - 'token' => 'entity.other.attribute-name', - ], - [ - 'fontStyle' => 'bold', - 'token' => 'entity.name.tag', - ], - ], - 'colors' => [ - 'editor.foreground' => '#000000', - 'editor.background' => '#EEEEEEEB', - 'editor.selectionBackground' => '#BAD6FD', - 'editor.lineHighlightBackground' => '#0000001A', - 'editorCursor.foreground' => '#000000', - 'editorWhitespace.foreground' => '#B3B3B3F4', - ], - ], - ], -]; diff --git a/config/health.php b/config/health.php new file mode 100644 index 0000000000..85cefc501d --- /dev/null +++ b/config/health.php @@ -0,0 +1,123 @@ + [ + /* + Spatie\Health\ResultStores\EloquentHealthResultStore::class => [ + 'connection' => env('HEALTH_DB_CONNECTION', env('DB_CONNECTION')), + 'model' => Spatie\Health\Models\HealthCheckResultHistoryItem::class, + 'keep_history_for_days' => 5, + ], + */ + + Spatie\Health\ResultStores\CacheHealthResultStore::class => [ + 'store' => 'file', + ], + + /* + Spatie\Health\ResultStores\JsonFileHealthResultStore::class => [ + 'disk' => 's3', + 'path' => 'health.json', + ], + + Spatie\Health\ResultStores\InMemoryHealthResultStore::class, + */ + ], + + /* + * You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'. + * For Slack you need to install laravel/slack-notification-channel. + */ + 'notifications' => [ + /* + * Notifications will only get sent if this option is set to `true`. + */ + 'enabled' => false, + + 'notifications' => [ + Spatie\Health\Notifications\CheckFailedNotification::class => ['mail'], + ], + + /* + * Here you can specify the notifiable to which the notifications should be sent. The default + * notifiable will use the variables specified in this config file. + */ + 'notifiable' => Spatie\Health\Notifications\Notifiable::class, + + /* + * When checks start failing, you could potentially end up getting + * a notification every minute. + * + * With this setting, notifications are throttled. By default, you'll + * only get one notification per hour. + */ + 'throttle_notifications_for_minutes' => 60, + 'throttle_notifications_key' => 'health:latestNotificationSentAt:', + + 'mail' => [ + 'to' => 'your@example.com', + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + ], + + 'slack' => [ + 'webhook_url' => env('HEALTH_SLACK_WEBHOOK_URL', ''), + + /* + * If this is set to null the default channel of the webhook will be used. + */ + 'channel' => null, + + 'username' => null, + + 'icon' => null, + ], + ], + + /* + * You can let Oh Dear monitor the results of all health checks. This way, you'll + * get notified of any problems even if your application goes totally down. Via + * Oh Dear, you can also have access to more advanced notification options. + */ + 'oh_dear_endpoint' => [ + 'enabled' => false, + + /* + * When this option is enabled, the checks will run before sending a response. + * Otherwise, we'll send the results from the last time the checks have run. + */ + 'always_send_fresh_results' => true, + + /* + * The secret that is displayed at the Application Health settings at Oh Dear. + */ + 'secret' => env('OH_DEAR_HEALTH_CHECK_SECRET'), + + /* + * The URL that should be configured in the Application health settings at Oh Dear. + */ + 'url' => '/oh-dear-health-check-results', + ], + + /* + * You can set a theme for the local results page + * + * - light: light mode + * - dark: dark mode + */ + 'theme' => 'light', + + /* + * When enabled, completed `HealthQueueJob`s will be displayed + * in Horizon's silenced jobs screen. + */ + 'silence_health_queue_job' => true, +]; diff --git a/config/http.php b/config/http.php index ed54e475b1..69bf4b5305 100644 --- a/config/http.php +++ b/config/http.php @@ -13,7 +13,7 @@ */ 'rate_limit' => [ 'client_period' => 1, - 'client' => env('APP_API_CLIENT_RATELIMIT', 720), + 'client' => env('APP_API_CLIENT_RATELIMIT', 120), 'application_period' => 1, 'application' => env('APP_API_APPLICATION_RATELIMIT', 240), diff --git a/config/livewire.php b/config/livewire.php new file mode 100644 index 0000000000..39bce8afe8 --- /dev/null +++ b/config/livewire.php @@ -0,0 +1,7 @@ + [ + 'rules' => 'file', + ], +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000000..492c0a890c --- /dev/null +++ b/config/logging.php @@ -0,0 +1,7 @@ + env('LOG_CHANNEL', 'daily'), + +]; diff --git a/config/mail.php b/config/mail.php index c6a0657b31..c79f13b0d7 100644 --- a/config/mail.php +++ b/config/mail.php @@ -2,10 +2,118 @@ return [ + /* + |-------------------------------------------------------------------------- + | Default Mailer + |-------------------------------------------------------------------------- + | + | This option controls the default mailer that is used to send all email + | messages unless another mailer is explicitly specified when sending + | the message. All additional mailers can be configured within the + | "mailers" array. Examples of each type of mailer are provided. + | + */ + + 'default' => env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + 'mailers' => [ 'mailgun' => [ 'transport' => 'mailgun', ], + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME', env('MAIL_ENCRYPTION') === 'ssl' || env('MAIL_ENCRYPTION') === 'tls' ? 'smtps' : 'smtp'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), ], ]; diff --git a/config/monaco-editor.php b/config/monaco-editor.php new file mode 100644 index 0000000000..b54865a961 --- /dev/null +++ b/config/monaco-editor.php @@ -0,0 +1,268 @@ + [ + 'enable-preview' => false, + 'show-full-screen-toggle' => false, + 'show-loader' => false, + 'font-size' => '15px', + 'line-numbers-min-chars' => 3, + 'automatic-layout' => true, + 'default-theme' => 'blackboard', + ], + 'themes' => [ + 'blackboard' => [ + 'base' => 'vs-dark', + 'inherit' => true, + 'rules' => [ + [ + 'background' => '161F27', + 'token' => '', + ], + [ + 'foreground' => 'aeaeae', + 'token' => 'comment', + ], + [ + 'foreground' => 'd8fa3c', + 'token' => 'constant', + ], + [ + 'foreground' => 'ff6400', + 'token' => 'entity', + ], + [ + 'foreground' => 'fbde2d', + 'token' => 'keyword', + ], + [ + 'foreground' => 'fbde2d', + 'token' => 'storage', + ], + [ + 'foreground' => '61ce3c', + 'token' => 'string', + ], + [ + 'foreground' => '61ce3c', + 'token' => 'meta.verbatim', + ], + [ + 'foreground' => '8da6ce', + 'token' => 'support', + ], + [ + 'foreground' => 'ab2a1d', + 'fontStyle' => 'italic', + 'token' => 'invalid.deprecated', + ], + [ + 'foreground' => 'f8f8f8', + 'background' => '9d1e15', + 'token' => 'invalid.illegal', + ], + [ + 'foreground' => 'ff6400', + 'fontStyle' => 'italic', + 'token' => 'entity.other.inherited-class', + ], + [ + 'foreground' => 'ff6400', + 'token' => 'string constant.other.placeholder', + ], + [ + 'foreground' => 'becde6', + 'token' => 'meta.function-call.py', + ], + [ + 'foreground' => '7f90aa', + 'token' => 'meta.tag', + ], + [ + 'foreground' => '7f90aa', + 'token' => 'meta.tag entity', + ], + [ + 'foreground' => 'ffffff', + 'token' => 'entity.name.section', + ], + [ + 'foreground' => 'd5e0f3', + 'token' => 'keyword.type.variant', + ], + [ + 'foreground' => 'f8f8f8', + 'token' => 'source.ocaml keyword.operator.symbol', + ], + [ + 'foreground' => '8da6ce', + 'token' => 'source.ocaml keyword.operator.symbol.infix', + ], + [ + 'foreground' => '8da6ce', + 'token' => 'source.ocaml keyword.operator.symbol.prefix', + ], + [ + 'fontStyle' => 'underline', + 'token' => 'source.ocaml keyword.operator.symbol.infix.floating-point', + ], + [ + 'fontStyle' => 'underline', + 'token' => 'source.ocaml keyword.operator.symbol.prefix.floating-point', + ], + [ + 'fontStyle' => 'underline', + 'token' => 'source.ocaml constant.numeric.floating-point', + ], + [ + 'background' => 'ffffff08', + 'token' => 'text.tex.latex meta.function.environment', + ], + [ + 'background' => '7a96fa08', + 'token' => 'text.tex.latex meta.function.environment meta.function.environment', + ], + [ + 'foreground' => 'fbde2d', + 'token' => 'text.tex.latex support.function', + ], + [ + 'foreground' => 'ffffff', + 'token' => 'source.plist string.unquoted', + ], + [ + 'foreground' => 'ffffff', + 'token' => 'source.plist keyword.operator', + ], + ], + 'colors' => [ + 'editor.foreground' => '#F8F8F8', + 'editor.background' => '#101519', + 'editor.selectionBackground' => '#5a5f63', + 'editor.lineHighlightBackground' => '#FFFFFF0F', + 'editorCursor.foreground' => '#FFFFFFA6', + 'editorWhitespace.foreground' => '#FFFFFF40', + ], + ], + 'iPlastic' => [ + 'base' => 'vs', + 'inherit' => true, + 'rules' => [ + [ + 'background' => 'EEEEEEEB', + 'token' => '', + ], + [ + 'foreground' => '009933', + 'token' => 'string', + ], + [ + 'foreground' => '0066ff', + 'token' => 'constant.numeric', + ], + [ + 'foreground' => 'ff0080', + 'token' => 'string.regexp', + ], + [ + 'foreground' => '0000ff', + 'token' => 'keyword', + ], + [ + 'foreground' => '9700cc', + 'token' => 'constant.language', + ], + [ + 'foreground' => '990000', + 'token' => 'support.class.exception', + ], + [ + 'foreground' => 'ff8000', + 'token' => 'entity.name.function', + ], + [ + 'fontStyle' => 'bold underline', + 'token' => 'entity.name.type', + ], + [ + 'fontStyle' => 'italic', + 'token' => 'variable.parameter', + ], + [ + 'foreground' => '0066ff', + 'fontStyle' => 'italic', + 'token' => 'comment', + ], + [ + 'foreground' => 'ff0000', + 'background' => 'e71a114d', + 'token' => 'invalid', + ], + [ + 'background' => 'e71a1100', + 'token' => 'invalid.deprecated.trailing-whitespace', + ], + [ + 'foreground' => '000000', + 'background' => 'fafafafc', + 'token' => 'text source', + ], + [ + 'foreground' => '0033cc', + 'token' => 'meta.tag', + ], + [ + 'foreground' => '0033cc', + 'token' => 'declaration.tag', + ], + [ + 'foreground' => '6782d3', + 'token' => 'constant', + ], + [ + 'foreground' => '6782d3', + 'token' => 'support.constant', + ], + [ + 'foreground' => '3333ff', + 'fontStyle' => 'bold', + 'token' => 'support', + ], + [ + 'fontStyle' => 'bold', + 'token' => 'storage', + ], + [ + 'fontStyle' => 'bold underline', + 'token' => 'entity.name.section', + ], + [ + 'foreground' => '000000', + 'fontStyle' => 'bold', + 'token' => 'entity.name.function.frame', + ], + [ + 'foreground' => '333333', + 'token' => 'meta.tag.preprocessor.xml', + ], + [ + 'foreground' => '3366cc', + 'fontStyle' => 'italic', + 'token' => 'entity.other.attribute-name', + ], + [ + 'fontStyle' => 'bold', + 'token' => 'entity.name.tag', + ], + ], + 'colors' => [ + 'editor.foreground' => '#000000', + 'editor.background' => '#EEEEEEEB', + 'editor.selectionBackground' => '#BAD6FD', + 'editor.lineHighlightBackground' => '#0000001A', + 'editorCursor.foreground' => '#000000', + 'editorWhitespace.foreground' => '#B3B3B3F4', + ], + ], + ], +]; diff --git a/config/panel.php b/config/panel.php index 487ee354b5..848b4761d0 100644 --- a/config/panel.php +++ b/config/panel.php @@ -1,13 +1,6 @@ [ '2fa_required' => env('APP_2FA_REQUIRED', 0), @@ -18,65 +11,15 @@ ], ], - /* - |-------------------------------------------------------------------------- - | Pagination - |-------------------------------------------------------------------------- - | - | Certain pagination result counts can be configured here and will take - | effect globally. - */ - - 'paginate' => [ - 'frontend' => [ - 'servers' => env('APP_PAGINATE_FRONT_SERVERS', 15), - ], - 'admin' => [ - 'servers' => env('APP_PAGINATE_ADMIN_SERVERS', 25), - 'users' => env('APP_PAGINATE_ADMIN_USERS', 25), - ], - 'api' => [ - 'nodes' => env('APP_PAGINATE_API_NODES', 25), - 'servers' => env('APP_PAGINATE_API_SERVERS', 25), - 'users' => env('APP_PAGINATE_API_USERS', 25), - ], - ], - - /* - |-------------------------------------------------------------------------- - | Guzzle Connections - |-------------------------------------------------------------------------- - | - | Configure the timeout to be used for Guzzle connections here. - */ - 'guzzle' => [ 'timeout' => env('GUZZLE_TIMEOUT', 15), 'connect_timeout' => env('GUZZLE_CONNECT_TIMEOUT', 5), ], - /* - |-------------------------------------------------------------------------- - | CDN - |-------------------------------------------------------------------------- - | - | Information for the panel to use when contacting the CDN to confirm - | if panel is up to date. - */ - 'cdn' => [ 'cache_time' => 60, - 'url' => 'https://cdn.pelican.dev/releases/latest.json', ], - /* - |-------------------------------------------------------------------------- - | Client Features - |-------------------------------------------------------------------------- - | - | Allow clients to turn features on or off - */ - 'client_features' => [ 'databases' => [ 'enabled' => env('PANEL_CLIENT_DATABASES_ENABLED', true), @@ -90,61 +33,16 @@ 'allocations' => [ 'enabled' => env('PANEL_CLIENT_ALLOCATIONS_ENABLED', false), + 'create_new' => env('PANEL_CLIENT_ALLOCATIONS_CREATE_NEW', true), 'range_start' => env('PANEL_CLIENT_ALLOCATIONS_RANGE_START'), 'range_end' => env('PANEL_CLIENT_ALLOCATIONS_RANGE_END'), ], ], - /* - |-------------------------------------------------------------------------- - | File Editor - |-------------------------------------------------------------------------- - | - | This array includes the MIME filetypes that can be edited via the web. - */ - 'files' => [ 'max_edit_size' => env('PANEL_FILES_MAX_EDIT_SIZE', 1024 * 1024 * 4), ], - /* - |-------------------------------------------------------------------------- - | Dynamic Environment Variables - |-------------------------------------------------------------------------- - | - | Place dynamic environment variables here that should be auto-appended - | to server environment fields when the server is created or updated. - | - | Items should be in 'key' => 'value' format, where key is the environment - | variable name, and value is the server-object key. For example: - | - | 'P_SERVER_CREATED_AT' => 'created_at' - */ - - 'environment_variables' => [ - 'P_SERVER_ALLOCATION_LIMIT' => 'allocation_limit', - ], - - /* - |-------------------------------------------------------------------------- - | Asset Verification - |-------------------------------------------------------------------------- - | - | This section controls the output format for JS & CSS assets. - */ - - 'assets' => [ - 'use_hash' => env('PANEL_USE_ASSET_HASH', false), - ], - - /* - |-------------------------------------------------------------------------- - | Email Notification Settings - |-------------------------------------------------------------------------- - | - | This section controls what notifications are sent to users. - */ - 'email' => [ // Should an email be sent to a server owner once their server has completed it's first install process? 'send_install_notification' => env('PANEL_SEND_INSTALL_NOTIFICATION', true), @@ -152,19 +50,28 @@ 'send_reinstall_notification' => env('PANEL_SEND_REINSTALL_NOTIFICATION', true), ], - /* - |-------------------------------------------------------------------------- - | FilamentPHP Settings - |-------------------------------------------------------------------------- - | - | This section controls Filament configurations - */ - 'filament' => [ - 'top-navigation' => env('FILAMENT_TOP_NAVIGATION', false), + 'display-width' => env('FILAMENT_WIDTH', 'screen-2xl'), + 'avatar-provider' => env('FILAMENT_AVATAR_PROVIDER', 'gravatar'), + 'uploadable-avatars' => env('FILAMENT_UPLOADABLE_AVATARS', false), + 'default-navigation' => env('FILAMENT_DEFAULT_NAVIGATION', 'sidebar'), ], 'use_binary_prefix' => env('PANEL_USE_BINARY_PREFIX', true), 'editable_server_descriptions' => env('PANEL_EDITABLE_SERVER_DESCRIPTIONS', true), + + 'api' => [ + 'key_limit' => env('API_KEYS_LIMIT', 25), + 'key_expire_time' => env('API_KEYS_EXPIRE_TIME', 720), + ], + + 'webhook' => [ + 'prune_days' => env('APP_WEBHOOK_PRUNE_DAYS', 30), + ], + + 'plugin' => [ + 'dev_mode' => env('PANEL_PLUGIN_DEV_MODE', false), + 'max_import_size' => env('PANEL_PLUGIN_MAX_IMPORT_SIZE', 1024 * 1024 * 100), + ], ]; diff --git a/config/recaptcha.php b/config/recaptcha.php deleted file mode 100644 index 757e184a5b..0000000000 --- a/config/recaptcha.php +++ /dev/null @@ -1,31 +0,0 @@ - env('RECAPTCHA_ENABLED', true), - - /* - * API endpoint for recaptcha checks. You should not edit this. - */ - 'domain' => env('RECAPTCHA_DOMAIN', 'https://www.google.com/recaptcha/api/siteverify'), - - /* - * Use a custom secret key, we use our public one by default - */ - 'secret_key' => env('RECAPTCHA_SECRET_KEY', '6LcJcjwUAAAAALOcDJqAEYKTDhwELCkzUkNDQ0J5'), - '_shipped_secret_key' => '6LcJcjwUAAAAALOcDJqAEYKTDhwELCkzUkNDQ0J5', - - /* - * Use a custom website key, we use our public one by default - */ - 'website_key' => env('RECAPTCHA_WEBSITE_KEY', '6LcJcjwUAAAAAO_Xqjrtj9wWufUpYRnK6BW8lnfn'), - '_shipped_website_key' => '6LcJcjwUAAAAAO_Xqjrtj9wWufUpYRnK6BW8lnfn', - - /* - * Domain verification is enabled by default and compares the domain used when solving the captcha - * as public keys can't have domain verification on google's side enabled (obviously). - */ - 'verify_domain' => true, -]; diff --git a/config/services.php b/config/services.php index 7311fdc16f..62e0a08a8b 100644 --- a/config/services.php +++ b/config/services.php @@ -9,16 +9,4 @@ 'scheme' => 'https', ], - 'github' => [ - 'client_id' => env('OAUTH_GITHUB_CLIENT_ID'), - 'client_secret' => env('OAUTH_GITHUB_CLIENT_SECRET'), - 'redirect' => '/auth/oauth/callback/github', - ], - - 'discord' => [ - 'client_id' => env('OAUTH_DISCORD_CLIENT_ID'), - 'client_secret' => env('OAUTH_DISCORD_CLIENT_SECRET'), - 'redirect' => '/auth/oauth/callback/discord', - ], - ]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000000..cf4a46ff83 --- /dev/null +++ b/config/session.php @@ -0,0 +1,9 @@ + env('SESSION_DRIVER', 'file'), + + 'cookie' => env('SESSION_COOKIE', 'pelican_session'), + +]; diff --git a/config/trustedproxy.php b/config/trustedproxy.php new file mode 100644 index 0000000000..7e0166af8e --- /dev/null +++ b/config/trustedproxy.php @@ -0,0 +1,28 @@ +getClientIp() + * always gets the originating client IP, no matter + * how many proxies that client's request has + * subsequently passed through. + */ + 'proxies' => in_array(env('TRUSTED_PROXIES', []), ['*', '**']) ? + env('TRUSTED_PROXIES') : explode(',', env('TRUSTED_PROXIES') ?? ''), +]; diff --git a/contributing.md b/contributing.md index 5c9ee66c8a..627c04e4c4 100644 --- a/contributing.md +++ b/contributing.md @@ -8,7 +8,7 @@ To start contributing to Pelican Panel, you need to have a basic understanding o * [PHP](https://php.net) & [Laravel](https://laravel.com) * [Livewire](https://laravel-livewire.com) & [Filament](https://filamentphp.com) -* [Git](https://git-scm.com) & [Github](https://github.com) +* [Git](https://git-scm.com) & [GitHub](https://github.com) ## Dev Environment Setup @@ -23,11 +23,11 @@ To start contributing to Pelican Panel, you need to have a basic understanding o As IDE we recommend [Visual Studio](https://visualstudio.microsoft.com)/ [Visual Studio Code](https://code.visualstudio.com) (free) or [PhpStorm](https://www.jetbrains.com/phpstorm) (paid). To easily install PHP and the Webserver we recommend Laravel Herd. ([Windows](https://herd.laravel.com/windows) & [macOS](https://herd.laravel.com)) -The (paid) Pro version of Laravel Herd also offers easy MySQL and Redis hosting, but it is not needed. +The (paid) Pro version of Laravel Herd also offers easy MySQL and Redis hosting, but the free version is fine for most cases. ## Coding Standards -We use PHPStan/ [Larastan](https://github.com/larastan/larastan) and PHP-CS-Fixer/ [Pint](https://laravel.com/docs/11.x/pint) to enforce certain code styles and standards. +We use PHPStan/ [Larastan](https://github.com/larastan/larastan) and PHP-CS-Fixer/ [Pint](https://laravel.com/docs/12.x/pint) to enforce certain code styles and standards. You can run PHPStan via `\vendor\bin\phpstan analyse` and Pint via `\vendor\bin\pint`. ## Making Contributions @@ -37,7 +37,10 @@ When you are ready, you can submit a pull request to the Pelican repository. If Also, please make sure that your pull requests are as targeted and simple as possible and don't do a hundred things at a time. If you want to add/ change/ fix 5 different things you should make 5 different pull requests. -*Note: For now we only accept pull requests that handle existing issues!* +### Translations + +If you add any new translation strings make sure to only add them to english. +Other languages are translated via [Crowdin](https://crowdin.com/project/pelican-dev). ## Code Review Process @@ -51,4 +54,4 @@ Depending on the pull request size this process can take multiple days. * Help: [Discord](https://discord.gg/pelican-panel) * Bugs: [GitHub Issues](https://github.com/pelican-dev/panel/issues) * Features: [GitHub Discussions](https://github.com/pelican-dev/panel/discussions) -* Security vulnerabilities: See our [security policy](./security.md). +* Security vulnerabilities: See our [security policy](./security.md). diff --git a/database/Factories/AllocationFactory.php b/database/Factories/AllocationFactory.php index 19405b7024..a4cdad0bff 100644 --- a/database/Factories/AllocationFactory.php +++ b/database/Factories/AllocationFactory.php @@ -2,8 +2,9 @@ namespace Database\Factories; -use App\Models\Server; use App\Models\Allocation; +use App\Models\Node; +use App\Models\Server; use Illuminate\Database\Eloquent\Factories\Factory; class AllocationFactory extends Factory @@ -23,6 +24,7 @@ public function definition(): array return [ 'ip' => $this->faker->unique()->ipv4(), 'port' => $this->faker->unique()->numberBetween(1024, 65535), + 'node_id' => Node::factory(), ]; } diff --git a/database/Factories/ApiKeyFactory.php b/database/Factories/ApiKeyFactory.php index 1b258767b7..c119d359c0 100644 --- a/database/Factories/ApiKeyFactory.php +++ b/database/Factories/ApiKeyFactory.php @@ -2,10 +2,10 @@ namespace Database\Factories; -use Carbon\Carbon; -use Illuminate\Support\Str; use App\Models\ApiKey; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; class ApiKeyFactory extends Factory { @@ -28,6 +28,7 @@ public function definition(): array 'identifier' => ApiKey::generateTokenIdentifier(ApiKey::TYPE_APPLICATION), 'token' => $token ?: $token = Str::random(ApiKey::KEY_LENGTH), 'allowed_ips' => [], + 'permissions' => [], 'memo' => 'Test Function Key', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), diff --git a/database/Factories/BackupFactory.php b/database/Factories/BackupFactory.php index acb428d20c..ff37b60fa8 100644 --- a/database/Factories/BackupFactory.php +++ b/database/Factories/BackupFactory.php @@ -2,10 +2,10 @@ namespace Database\Factories; -use Ramsey\Uuid\Uuid; -use Carbon\CarbonImmutable; use App\Models\Backup; +use Carbon\CarbonImmutable; use Illuminate\Database\Eloquent\Factories\Factory; +use Ramsey\Uuid\Uuid; class BackupFactory extends Factory { diff --git a/database/Factories/DatabaseFactory.php b/database/Factories/DatabaseFactory.php index d590a0e130..6c1830fe72 100644 --- a/database/Factories/DatabaseFactory.php +++ b/database/Factories/DatabaseFactory.php @@ -2,10 +2,10 @@ namespace Database\Factories; -use Carbon\Carbon; -use Illuminate\Support\Str; use App\Models\Database; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; class DatabaseFactory extends Factory { diff --git a/database/Factories/EggFactory.php b/database/Factories/EggFactory.php index 36ec942fa8..0a0d2a238b 100644 --- a/database/Factories/EggFactory.php +++ b/database/Factories/EggFactory.php @@ -2,9 +2,9 @@ namespace Database\Factories; -use Ramsey\Uuid\Uuid; use App\Models\Egg; use Illuminate\Database\Eloquent\Factories\Factory; +use Ramsey\Uuid\Uuid; class EggFactory extends Factory { @@ -22,9 +22,15 @@ public function definition(): array { return [ 'uuid' => Uuid::uuid4()->toString(), + 'author' => $this->faker->email(), + 'docker_images' => ['a', 'b', 'c'], + 'config_logs' => '{}', + 'config_startup' => '{}', + 'config_stop' => '{}', + 'config_files' => '{}', 'name' => $this->faker->name(), 'description' => implode(' ', $this->faker->sentences()), - 'startup' => 'java -jar test.jar', + 'startup_commands' => ['java -jar test.jar'], ]; } } diff --git a/database/Factories/EggVariableFactory.php b/database/Factories/EggVariableFactory.php index b2008cc3ff..8f5220948e 100644 --- a/database/Factories/EggVariableFactory.php +++ b/database/Factories/EggVariableFactory.php @@ -2,9 +2,9 @@ namespace Database\Factories; -use Illuminate\Support\Str; use App\Models\EggVariable; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; class EggVariableFactory extends Factory { diff --git a/database/Factories/NodeFactory.php b/database/Factories/NodeFactory.php index 19a1fbf7b1..b32ff56d5d 100644 --- a/database/Factories/NodeFactory.php +++ b/database/Factories/NodeFactory.php @@ -2,10 +2,10 @@ namespace Database\Factories; -use Ramsey\Uuid\Uuid; -use Illuminate\Support\Str; use App\Models\Node; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; +use Ramsey\Uuid\Uuid; class NodeFactory extends Factory { @@ -38,8 +38,10 @@ public function definition(): array 'daemon_token_id' => Str::random(Node::DAEMON_TOKEN_ID_LENGTH), 'daemon_token' => Str::random(Node::DAEMON_TOKEN_LENGTH), 'daemon_listen' => 8080, + 'daemon_connect' => 8080, 'daemon_sftp' => 2022, 'daemon_base' => '/var/lib/panel/volumes', + 'maintenance_mode' => false, ]; } } diff --git a/database/Factories/PermissionFactory.php b/database/Factories/PermissionFactory.php new file mode 100644 index 0000000000..c1e041ee6c --- /dev/null +++ b/database/Factories/PermissionFactory.php @@ -0,0 +1,17 @@ + $this->faker->name(), + 'guard_name' => $this->faker->name(), + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ]; + } +} diff --git a/database/Factories/ServerFactory.php b/database/Factories/ServerFactory.php index e0ced8de5d..98ebe36e73 100644 --- a/database/Factories/ServerFactory.php +++ b/database/Factories/ServerFactory.php @@ -2,11 +2,15 @@ namespace Database\Factories; -use Carbon\Carbon; -use Ramsey\Uuid\Uuid; -use Illuminate\Support\Str; +use App\Models\Allocation; +use App\Models\Egg; +use App\Models\Node; use App\Models\Server; +use App\Models\User; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; +use Ramsey\Uuid\Uuid; class ServerFactory extends Factory { @@ -17,12 +21,28 @@ class ServerFactory extends Factory */ protected $model = Server::class; + public function withNode(?Node $node = null): static + { + $node ??= Node::factory()->create(); + + return $this->state(fn () => [ + 'node_id' => $node->id, + 'allocation_id' => Allocation::factory([ + 'node_id' => $node->id, + ]), + ]); + } + /** * Define the model's default state. */ public function definition(): array { return [ + 'owner_id' => User::factory(), + 'node_id' => Node::factory(), + 'allocation_id' => Allocation::factory(), + 'egg_id' => Egg::factory(), 'uuid' => Uuid::uuid4()->toString(), 'uuid_short' => Str::lower(Str::random(8)), 'name' => $this->faker->firstName(), diff --git a/database/Factories/SubuserFactory.php b/database/Factories/SubuserFactory.php index 0726580f5a..0220d54975 100644 --- a/database/Factories/SubuserFactory.php +++ b/database/Factories/SubuserFactory.php @@ -2,8 +2,8 @@ namespace Database\Factories; +use App\Enums\SubuserPermission; use App\Models\Subuser; -use App\Models\Permission; use Illuminate\Database\Eloquent\Factories\Factory; class SubuserFactory extends Factory @@ -22,7 +22,7 @@ public function definition(): array { return [ 'permissions' => [ - Permission::ACTION_WEBSOCKET_CONNECT, + SubuserPermission::WebsocketConnect->value, ], ]; } diff --git a/database/Factories/UserFactory.php b/database/Factories/UserFactory.php index 3c6003cc24..0d43631c68 100644 --- a/database/Factories/UserFactory.php +++ b/database/Factories/UserFactory.php @@ -2,11 +2,11 @@ namespace Database\Factories; -use Carbon\Carbon; -use Ramsey\Uuid\Uuid; -use Illuminate\Support\Str; use App\Models\User; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; +use Ramsey\Uuid\Uuid; class UserFactory extends Factory { @@ -26,14 +26,12 @@ public function definition(): array return [ 'external_id' => null, + 'is_managed_externally' => false, 'uuid' => Uuid::uuid4()->toString(), 'username' => $this->faker->userName() . '_' . Str::random(10), 'email' => Str::random(32) . '@example.com', - 'name_first' => $this->faker->firstName(), - 'name_last' => $this->faker->lastName(), 'password' => $password ?: $password = bcrypt('password'), 'language' => 'en', - 'use_totp' => false, 'oauth' => [], 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), diff --git a/database/Factories/UserSSHKeyFactory.php b/database/Factories/UserSSHKeyFactory.php index b00d9ec6eb..ccb6d229ba 100644 --- a/database/Factories/UserSSHKeyFactory.php +++ b/database/Factories/UserSSHKeyFactory.php @@ -2,8 +2,8 @@ namespace Database\Factories; -use phpseclib3\Crypt\PublicKeyLoader; use Illuminate\Database\Eloquent\Factories\Factory; +use phpseclib3\Crypt\PublicKeyLoader; class UserSSHKeyFactory extends Factory { diff --git a/database/Factories/WebhookConfigurationFactory.php b/database/Factories/WebhookConfigurationFactory.php new file mode 100644 index 0000000000..e1a70954e4 --- /dev/null +++ b/database/Factories/WebhookConfigurationFactory.php @@ -0,0 +1,20 @@ + fake()->url(), + 'description' => fake()->sentence(), + 'events' => [], + ]; + } +} diff --git a/database/Seeders/DatabaseSeeder.php b/database/Seeders/DatabaseSeeder.php index 2f7f6694e1..0ccfad9100 100644 --- a/database/Seeders/DatabaseSeeder.php +++ b/database/Seeders/DatabaseSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\Plugin; use App\Models\Role; use Illuminate\Database\Seeder; @@ -10,10 +11,19 @@ class DatabaseSeeder extends Seeder /** * Run the database seeds. */ - public function run() + public function run(): void { - $this->call(EggSeeder::class); - Role::firstOrCreate(['name' => Role::ROOT_ADMIN]); + + $plugins = Plugin::query()->orderBy('load_order')->get(); + foreach ($plugins as $plugin) { + if (!$plugin->shouldLoad()) { + continue; + } + + if ($seeder = $plugin->getSeeder()) { + $this->call($seeder); + } + } } } diff --git a/database/Seeders/EggSeeder.php b/database/Seeders/EggSeeder.php deleted file mode 100644 index dcbc4f25c1..0000000000 --- a/database/Seeders/EggSeeder.php +++ /dev/null @@ -1,83 +0,0 @@ -importerService = $importerService; - } - - /** - * Run the egg seeder. - */ - public function run() - { - foreach (static::$imports as $import) { - /* @noinspection PhpParamsInspection */ - $this->parseEggFiles($import); - } - } - - /** - * Loop through the list of egg files and import them. - */ - protected function parseEggFiles($name) - { - $files = new \DirectoryIterator(database_path('Seeders/eggs/' . kebab_case($name))); - - $this->command->alert('Updating Eggs for: ' . $name); - /** @var \DirectoryIterator $file */ - foreach ($files as $file) { - if (!$file->isFile() || !$file->isReadable()) { - continue; - } - - try { - $decoded = json_decode(file_get_contents($file->getRealPath()), true, 512, JSON_THROW_ON_ERROR); - } catch (Exception) { - continue; - } - - $file = new UploadedFile($file->getPathname(), $file->getFilename(), 'application/json'); - - $egg = Egg::query() - ->where('author', $decoded['author']) - ->where('name', $decoded['name']) - ->first(); - - if ($egg instanceof Egg) { - $this->importerService->fromFile($file, $egg); - $this->command->info('Updated ' . $decoded['name']); - } else { - $this->importerService->fromFile($file); - $this->command->comment('Created ' . $decoded['name']); - } - } - - $this->command->line(''); - } -} diff --git a/database/Seeders/eggs/minecraft/egg-bungeecord.json b/database/Seeders/eggs/minecraft/egg-bungeecord.json deleted file mode 100644 index e71b8d1ec1..0000000000 --- a/database/Seeders/eggs/minecraft/egg-bungeecord.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-bungeecord.json" - }, - "exported_at": "2024-07-25T12:03:12+00:00", - "name": "Bungeecord", - "author": "panel@example.com", - "uuid": "9e6b409e-4028-4947-aea8-50a2c404c271", - "description": "For a long time, Minecraft server owners have had a dream that encompasses a free, easy, and reliable way to connect multiple Minecraft servers together. BungeeCord is the answer to said dream. Whether you are a small server wishing to string multiple game-modes together, or the owner of the ShotBow Network, BungeeCord is the ideal solution for you. With the help of BungeeCord, you will be able to unlock your community's full potential.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "docker_images": { - "Java 21": "ghcr.io\/parkervcp\/yolks:java_21", - "Java 17": "ghcr.io\/parkervcp\/yolks:java_17", - "Java 16": "ghcr.io\/parkervcp\/yolks:java_16", - "Java 11": "ghcr.io\/parkervcp\/yolks:java_11", - "Java 8": "ghcr.io\/parkervcp\/yolks:java_8" - }, - "file_denylist": [], - "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", - "config": { - "files": "{\r\n \"config.yml\": {\r\n \"parser\": \"yaml\",\r\n \"find\": {\r\n \"listeners[0].query_port\": \"{{server.allocations.default.port}}\",\r\n \"listeners[0].host\": \"0.0.0.0:{{server.allocations.default.port}}\",\r\n \"servers.*.address\": {\r\n \"regex:^(127\\\\.0\\\\.0\\\\.1|localhost)(:\\\\d{1,5})?$\": \"{{config.docker.interface}}$2\"\r\n }\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Listening on \"\r\n}", - "logs": "{}", - "stop": "end" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/ash\r\n# Bungeecord Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\ncd \/mnt\/server\r\n\r\nif [ -z \"${BUNGEE_VERSION}\" ] || [ \"${BUNGEE_VERSION}\" == \"latest\" ]; then\r\n BUNGEE_VERSION=\"lastStableBuild\"\r\nfi\r\n\r\ncurl -o ${SERVER_JARFILE} https:\/\/ci.md-5.net\/job\/BungeeCord\/${BUNGEE_VERSION}\/artifact\/bootstrap\/target\/BungeeCord.jar", - "container": "ghcr.io\/parkervcp\/installers:alpine", - "entrypoint": "ash" - } - }, - "variables": [ - { - "name": "Bungeecord Version", - "description": "The version of Bungeecord to download and use.", - "env_variable": "BUNGEE_VERSION", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "alpha_num", - "between:1,6" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Bungeecord Jar File", - "description": "The name of the Jarfile to use when running Bungeecord.", - "env_variable": "SERVER_JARFILE", - "default_value": "bungeecord.jar", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" - ], - "sort": 2, - "field_type": "text" - } - ] -} diff --git a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json deleted file mode 100644 index 13afe9748a..0000000000 --- a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-forge-minecraft.json" - }, - "exported_at": "2024-07-25T12:03:19+00:00", - "name": "Forge Minecraft", - "author": "panel@example.com", - "uuid": "ed072427-f209-4603-875c-f540c6dd5a65", - "description": "Minecraft Forge Server. Minecraft Forge is a modding API (Application Programming Interface), which makes it easier to create mods, and also make sure mods are compatible with each other.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "docker_images": { - "Java 21": "ghcr.io\/parkervcp\/yolks:java_21", - "Java 17": "ghcr.io\/parkervcp\/yolks:java_17", - "Java 16": "ghcr.io\/parkervcp\/yolks:java_16", - "Java 11": "ghcr.io\/parkervcp\/yolks:java_11", - "Java 8": "ghcr.io\/parkervcp\/yolks:java_8" - }, - "file_denylist": [], - "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar {{SERVER_JARFILE}}\" || printf %s \"@unix_args.txt\" )", - "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", - "logs": "{}", - "stop": "stop" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt update\r\napt install -y curl jq\r\n\r\nif [[ ! -d \/mnt\/server ]]; then\r\n mkdir \/mnt\/server\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\n# Remove spaces from the version number to avoid issues with curl\r\nFORGE_VERSION=\"$(echo \"$FORGE_VERSION\" | tr -d ' ')\"\r\nMC_VERSION=\"$(echo \"$MC_VERSION\" | tr -d ' ')\"\r\n\r\nif [[ ! -z ${FORGE_VERSION} ]]; then\r\n DOWNLOAD_LINK=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\/${FORGE_VERSION}\/forge-${FORGE_VERSION}\r\n FORGE_JAR=forge-${FORGE_VERSION}*.jar\r\nelse\r\n JSON_DATA=$(curl -sSL https:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/promotions_slim.json)\r\n\r\n if [[ \"${MC_VERSION}\" == \"latest\" ]] || [[ \"${MC_VERSION}\" == \"\" ]]; then\r\n echo -e \"getting latest version of forge.\"\r\n MC_VERSION=$(echo -e ${JSON_DATA} | jq -r '.promos | del(.\"latest-1.7.10\") | del(.\"1.7.10-latest-1.7.10\") | to_entries[] | .key | select(contains(\"latest\")) | split(\"-\")[0]' | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -1)\r\n BUILD_TYPE=latest\r\n fi\r\n\r\n if [[ \"${BUILD_TYPE}\" != \"recommended\" ]] && [[ \"${BUILD_TYPE}\" != \"latest\" ]]; then\r\n BUILD_TYPE=recommended\r\n fi\r\n\r\n echo -e \"minecraft version: ${MC_VERSION}\"\r\n echo -e \"build type: ${BUILD_TYPE}\"\r\n\r\n ## some variables for getting versions and things\r\n FILE_SITE=https:\/\/maven.minecraftforge.net\/net\/minecraftforge\/forge\/\r\n VERSION_KEY=$(echo -e ${JSON_DATA} | jq -r --arg MC_VERSION \"${MC_VERSION}\" --arg BUILD_TYPE \"${BUILD_TYPE}\" '.promos | del(.\"latest-1.7.10\") | del(.\"1.7.10-latest-1.7.10\") | to_entries[] | .key | select(contains($MC_VERSION)) | select(contains($BUILD_TYPE))')\r\n\r\n ## locating the forge version\r\n if [[ \"${VERSION_KEY}\" == \"\" ]] && [[ \"${BUILD_TYPE}\" == \"recommended\" ]]; then\r\n echo -e \"dropping back to latest from recommended due to there not being a recommended version of forge for the mc version requested.\"\r\n VERSION_KEY=$(echo -e ${JSON_DATA} | jq -r --arg MC_VERSION \"${MC_VERSION}\" '.promos | del(.\"latest-1.7.10\") | del(.\"1.7.10-latest-1.7.10\") | to_entries[] | .key | select(contains($MC_VERSION)) | select(contains(\"latest\"))')\r\n fi\r\n\r\n ## Error if the mc version set wasn't valid.\r\n if [ \"${VERSION_KEY}\" == \"\" ] || [ \"${VERSION_KEY}\" == \"null\" ]; then\r\n echo -e \"The install failed because there is no valid version of forge for the version of minecraft selected.\"\r\n exit 1\r\n fi\r\n\r\n FORGE_VERSION=$(echo -e ${JSON_DATA} | jq -r --arg VERSION_KEY \"$VERSION_KEY\" '.promos | .[$VERSION_KEY]')\r\n\r\n if [[ \"${MC_VERSION}\" == \"1.7.10\" ]] || [[ \"${MC_VERSION}\" == \"1.8.9\" ]]; then\r\n DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\/forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}.jar\r\n if [[ \"${MC_VERSION}\" == \"1.7.10\" ]]; then\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}-universal.jar\r\n fi\r\n else\r\n DOWNLOAD_LINK=${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}\/forge-${MC_VERSION}-${FORGE_VERSION}\r\n FORGE_JAR=forge-${MC_VERSION}-${FORGE_VERSION}.jar\r\n fi\r\nfi\r\n\r\n#Adding .jar when not eding by SERVER_JARFILE\r\nif [[ ! $SERVER_JARFILE = *\\.jar ]]; then\r\n SERVER_JARFILE=\"$SERVER_JARFILE.jar\"\r\nfi\r\n\r\n#Downloading jars\r\necho -e \"Downloading forge version ${FORGE_VERSION}\"\r\necho -e \"Download link is ${DOWNLOAD_LINK}\"\r\n\r\nif [[ ! -z \"${DOWNLOAD_LINK}\" ]]; then\r\n if curl --output \/dev\/null --silent --head --fail ${DOWNLOAD_LINK}-installer.jar; then\r\n echo -e \"installer jar download link is valid.\"\r\n else\r\n echo -e \"link is invalid. Exiting now\"\r\n exit 2\r\n fi\r\nelse\r\n echo -e \"no download link provided. Exiting now\"\r\n exit 3\r\nfi\r\n\r\ncurl -s -o installer.jar -sS ${DOWNLOAD_LINK}-installer.jar\r\n\r\n#Checking if downloaded jars exist\r\nif [[ ! -f .\/installer.jar ]]; then\r\n echo \"!!! Error downloading forge version ${FORGE_VERSION} !!!\"\r\n exit\r\nfi\r\n\r\nfunction unix_args {\r\n echo -e \"Detected Forge 1.17 or newer version. Setting up forge unix args.\"\r\n ln -sf libraries\/net\/minecraftforge\/forge\/*\/unix_args.txt unix_args.txt\r\n}\r\n\r\n# Delete args to support downgrading\/upgrading\r\nrm -rf libraries\/net\/minecraftforge\/forge\r\nrm unix_args.txt\r\n\r\n#Installing server\r\necho -e \"Installing forge server.\\n\"\r\njava -jar installer.jar --installServer || { echo -e \"\\nInstall failed using Forge version ${FORGE_VERSION} and Minecraft version ${MINECRAFT_VERSION}.\\nShould you be using unlimited memory value of 0, make sure to increase the default install resource limits in the Daemon config or specify exact allocated memory in the server Build Configuration instead of 0! \\nOtherwise, the Forge installer will not have enough memory.\"; exit 4; }\r\n\r\n# Check if we need a symlink for 1.17+ Forge JPMS args\r\nif [[ $MC_VERSION =~ ^1\\.(17|18|19|20|21|22|23) || $FORGE_VERSION =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\r\n unix_args\r\n\r\n# Check if someone has set MC to latest but overwrote it with older Forge version, otherwise we would have false positives\r\nelif [[ $MC_VERSION == \"latest\" && $FORGE_VERSION =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\r\n unix_args\r\nelse\r\n # For versions below 1.17 that ship with jar\r\n mv $FORGE_JAR $SERVER_JARFILE\r\nfi\r\n\r\necho -e \"Deleting installer.jar file.\\n\"\r\nrm -rf installer.jar\r\necho -e \"Installation process is completed\"", - "container": "openjdk:8-jdk-slim", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Server Jar File", - "description": "The name of the Jarfile to use when running Forge version below 1.17.", - "env_variable": "SERVER_JARFILE", - "default_value": "server.jar", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Minecraft Version", - "description": "The version of minecraft you want to install for.\r\n\r\nLeaving latest will install the latest recommended version.", - "env_variable": "MC_VERSION", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "max:9" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Build Type", - "description": "The type of server jar to download from forge.\r\n\r\nValid types are \"recommended\" and \"latest\".", - "env_variable": "BUILD_TYPE", - "default_value": "recommended", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "in:recommended,latest" - ], - "sort": 3, - "field_type": "text" - }, - { - "name": "Forge Version", - "description": "The full exact version.\r\n\r\nEx. 1.15.2-31.2.4\r\n\r\nOverrides MC_VERSION and BUILD_TYPE. If it fails to download the server files it will fail to install.", - "env_variable": "FORGE_VERSION", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "regex:\/^[0-9\\.\\-]+$\/" - ], - "sort": 4, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/minecraft/egg-paper.json b/database/Seeders/eggs/minecraft/egg-paper.json deleted file mode 100644 index d8a73b9f40..0000000000 --- a/database/Seeders/eggs/minecraft/egg-paper.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-paper.json" - }, - "exported_at": "2024-07-25T12:03:43+00:00", - "name": "Paper", - "author": "parker@example.com", - "uuid": "5da37ef6-58da-4169-90a6-e683e1721247", - "description": "High performance Spigot fork that aims to fix gameplay and mechanics inconsistencies.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "docker_images": { - "Java 21": "ghcr.io\/parkervcp\/yolks:java_21", - "Java 17": "ghcr.io\/parkervcp\/yolks:java_17", - "Java 16": "ghcr.io\/parkervcp\/yolks:java_16", - "Java 11": "ghcr.io\/parkervcp\/yolks:java_11", - "Java 8": "ghcr.io\/parkervcp\/yolks:java_8" - }, - "file_denylist": [], - "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", - "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", - "logs": "{}", - "stop": "stop" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/ash\r\n# Paper Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\nPROJECT=paper\r\n\r\nif [ -n \"${DL_PATH}\" ]; then\r\n\techo -e \"Using supplied download url: ${DL_PATH}\"\r\n\tDOWNLOAD_URL=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\nelse\r\n\tVER_EXISTS=`curl -s https:\/\/api.papermc.io\/v2\/projects\/${PROJECT} | jq -r --arg VERSION $MINECRAFT_VERSION '.versions[] | contains($VERSION)' | grep -m1 true`\r\n\tLATEST_VERSION=`curl -s https:\/\/api.papermc.io\/v2\/projects\/${PROJECT} | jq -r '.versions' | jq -r '.[-1]'`\r\n\r\n\tif [ \"${VER_EXISTS}\" == \"true\" ]; then\r\n\t\techo -e \"Version is valid. Using version ${MINECRAFT_VERSION}\"\r\n\telse\r\n\t\techo -e \"Specified version not found. Defaulting to the latest ${PROJECT} version\"\r\n\t\tMINECRAFT_VERSION=${LATEST_VERSION}\r\n\tfi\r\n\r\n\tBUILD_EXISTS=`curl -s https:\/\/api.papermc.io\/v2\/projects\/${PROJECT}\/versions\/${MINECRAFT_VERSION} | jq -r --arg BUILD ${BUILD_NUMBER} '.builds[] | tostring | contains($BUILD)' | grep -m1 true`\r\n\tLATEST_BUILD=`curl -s https:\/\/api.papermc.io\/v2\/projects\/${PROJECT}\/versions\/${MINECRAFT_VERSION} | jq -r '.builds' | jq -r '.[-1]'`\r\n\r\n\tif [ \"${BUILD_EXISTS}\" == \"true\" ]; then\r\n\t\techo -e \"Build is valid for version ${MINECRAFT_VERSION}. Using build ${BUILD_NUMBER}\"\r\n\telse\r\n\t\techo -e \"Using the latest ${PROJECT} build for version ${MINECRAFT_VERSION}\"\r\n\t\tBUILD_NUMBER=${LATEST_BUILD}\r\n\tfi\r\n\r\n\tJAR_NAME=${PROJECT}-${MINECRAFT_VERSION}-${BUILD_NUMBER}.jar\r\n\r\n\techo \"Version being downloaded\"\r\n\techo -e \"MC Version: ${MINECRAFT_VERSION}\"\r\n\techo -e \"Build: ${BUILD_NUMBER}\"\r\n\techo -e \"JAR Name of Build: ${JAR_NAME}\"\r\n\tDOWNLOAD_URL=https:\/\/api.papermc.io\/v2\/projects\/${PROJECT}\/versions\/${MINECRAFT_VERSION}\/builds\/${BUILD_NUMBER}\/downloads\/${JAR_NAME}\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"Running curl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\"\r\n\r\nif [ -f ${SERVER_JARFILE} ]; then\r\n\tmv ${SERVER_JARFILE} ${SERVER_JARFILE}.old\r\nfi\r\n\r\ncurl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\r\n\r\nif [ ! -f server.properties ]; then\r\n echo -e \"Downloading MC server.properties\"\r\n curl -o server.properties https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/minecraft\/java\/server.properties\r\nfi", - "container": "ghcr.io\/parkervcp\/installers:alpine", - "entrypoint": "ash" - } - }, - "variables": [ - { - "name": "Minecraft Version", - "description": "The version of minecraft to download. \r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.", - "env_variable": "MINECRAFT_VERSION", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string", - "max:20" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Server Jar File", - "description": "The name of the server jarfile to run the server with.", - "env_variable": "SERVER_JARFILE", - "default_value": "server.jar", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Download Path", - "description": "A URL to use to download a server.jar rather than the ones in the install script. This is not user viewable.", - "env_variable": "DL_PATH", - "default_value": "", - "user_viewable": false, - "user_editable": false, - "rules": [ - "nullable", - "string" - ], - "sort": 3, - "field_type": "text" - }, - { - "name": "Build Number", - "description": "The build number for the paper release.\r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.", - "env_variable": "BUILD_NUMBER", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "max:20" - ], - "sort": 4, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json b/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json deleted file mode 100644 index 1a72aefe77..0000000000 --- a/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-sponge--sponge-vanilla.json" - }, - "exported_at": "2024-07-25T12:03:55+00:00", - "name": "Sponge (SpongeVanilla)", - "author": "panel@example.com", - "uuid": "f0d2f88f-1ff3-42a0-b03f-ac44c5571e6d", - "description": "SpongeVanilla is the SpongeAPI implementation for Vanilla Minecraft.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "docker_images": { - "Java 21": "ghcr.io\/parkervcp\/yolks:java_21", - "Java 17": "ghcr.io\/parkervcp\/yolks:java_17", - "Java 16": "ghcr.io\/parkervcp\/yolks:java_16", - "Java 11": "ghcr.io\/parkervcp\/yolks:java_11", - "Java 8": "ghcr.io\/parkervcp\/yolks:java_8" - }, - "file_denylist": [], - "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", - "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", - "logs": "{}", - "stop": "stop" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/ash\r\n# Sponge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\ncd \/mnt\/server\r\n\r\ncurl -sSL \"https:\/\/repo.spongepowered.org\/maven\/org\/spongepowered\/spongevanilla\/${SPONGE_VERSION}\/spongevanilla-${SPONGE_VERSION}.jar\" -o ${SERVER_JARFILE}", - "container": "ghcr.io\/parkervcp\/installers:alpine", - "entrypoint": "ash" - } - }, - "variables": [ - { - "name": "Sponge Version", - "description": "The version of SpongeVanilla to download and use.", - "env_variable": "SPONGE_VERSION", - "default_value": "1.12.2-7.3.0", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^([a-zA-Z0-9.\\-_]+)$\/" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Server Jar File", - "description": "The name of the Jarfile to use when running SpongeVanilla.", - "env_variable": "SERVER_JARFILE", - "default_value": "server.jar", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" - ], - "sort": 2, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json b/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json deleted file mode 100644 index 71d71938e1..0000000000 --- a/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-vanilla-minecraft.json" - }, - "exported_at": "2024-07-25T12:04:05+00:00", - "name": "Vanilla Minecraft", - "author": "panel@example.com", - "uuid": "9ac39f3d-0c34-4d93-8174-c52ab9e6c57b", - "description": "Minecraft is a game about placing blocks and going on adventures. Explore randomly generated worlds and build amazing things from the simplest of homes to the grandest of castles. Play in Creative Mode with unlimited resources or mine deep in Survival Mode, crafting weapons and armor to fend off dangerous mobs. Do all this alone or with friends.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "docker_images": { - "Java 21": "ghcr.io\/parkervcp\/yolks:java_21", - "Java 17": "ghcr.io\/parkervcp\/yolks:java_17", - "Java 16": "ghcr.io\/parkervcp\/yolks:java_16", - "Java 11": "ghcr.io\/parkervcp\/yolks:java_11", - "Java 8": "ghcr.io\/parkervcp\/yolks:java_8" - }, - "file_denylist": [], - "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", - "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.allocations.default.port}}\",\r\n \"query.port\": \"{{server.allocations.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", - "logs": "{}", - "stop": "stop" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/ash\r\n# Vanilla MC Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nLATEST_VERSION=`curl https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq -r '.latest.release'`\r\nLATEST_SNAPSHOT_VERSION=`curl https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq -r '.latest.snapshot'`\r\n\r\necho -e \"latest version is $LATEST_VERSION\"\r\necho -e \"latest snapshot is $LATEST_SNAPSHOT_VERSION\"\r\n\r\nif [ -z \"$VANILLA_VERSION\" ] || [ \"$VANILLA_VERSION\" == \"latest\" ]; then\r\n MANIFEST_URL=$(curl -sSL https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq --arg VERSION $LATEST_VERSION -r '.versions | .[] | select(.id== $VERSION )|.url')\r\nelif [ \"$VANILLA_VERSION\" == \"snapshot\" ]; then\r\n MANIFEST_URL=$(curl -sSL https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq --arg VERSION $LATEST_SNAPSHOT_VERSION -r '.versions | .[] | select(.id== $VERSION )|.url')\r\nelse\r\n MANIFEST_URL=$(curl -sSL https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq --arg VERSION $VANILLA_VERSION -r '.versions | .[] | select(.id== $VERSION )|.url')\r\nfi\r\n\r\nDOWNLOAD_URL=$(curl ${MANIFEST_URL} | jq .downloads.server | jq -r '. | .url')\r\n\r\necho -e \"running: curl -o ${SERVER_JARFILE} $DOWNLOAD_URL\"\r\ncurl -o ${SERVER_JARFILE} $DOWNLOAD_URL\r\n\r\necho -e \"Install Complete\"", - "container": "ghcr.io\/parkervcp\/installers:alpine", - "entrypoint": "ash" - } - }, - "variables": [ - { - "name": "Server Jar File", - "description": "The name of the server jarfile to run the server with.", - "env_variable": "SERVER_JARFILE", - "default_value": "server.jar", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Server Version", - "description": "The version of Minecraft Vanilla to install. Use \"latest\" to install the latest version, or use \"snapshot\" to install the latest snapshot. Go to Settings > Reinstall Server to apply.", - "env_variable": "VANILLA_VERSION", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "between:3,15" - ], - "sort": 2, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/rust/egg-rust.json b/database/Seeders/eggs/rust/egg-rust.json deleted file mode 100644 index e74368604a..0000000000 --- a/database/Seeders/eggs/rust/egg-rust.json +++ /dev/null @@ -1,291 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/rust\/egg-rust.json" - }, - "exported_at": "2024-07-25T12:06:17+00:00", - "name": "Rust", - "author": "panel@example.com", - "uuid": "bace2dfb-209c-452a-9459-7d6f340b07ae", - "description": "The only aim in Rust is to survive. To do this you will need to overcome struggles such as hunger, thirst and cold. Build a fire. Build a shelter. Kill animals for meat. Protect yourself from other players, and kill them for meat. Create alliances with other players and form a town. Do whatever it takes to survive.", - "features": [ - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:rust": "ghcr.io\/parkervcp\/games:rust" - }, - "file_denylist": [], - "startup": ".\/RustDedicated -batchmode +server.port {{SERVER_PORT}} +server.queryport {{QUERY_PORT}} +server.identity \"rust\" +rcon.port {{RCON_PORT}} +rcon.web true +server.hostname \\\"{{HOSTNAME}}\\\" +server.level \\\"{{LEVEL}}\\\" +server.description \\\"{{DESCRIPTION}}\\\" +server.url \\\"{{SERVER_URL}}\\\" +server.headerimage \\\"{{SERVER_IMG}}\\\" +server.logoimage \\\"{{SERVER_LOGO}}\\\" +server.maxplayers {{MAX_PLAYERS}} +rcon.password \\\"{{RCON_PASS}}\\\" +server.saveinterval {{SAVEINTERVAL}} +app.port {{APP_PORT}} $( [ -z ${MAP_URL} ] && printf %s \"+server.worldsize \\\"{{WORLD_SIZE}}\\\" +server.seed \\\"{{WORLD_SEED}}\\\"\" || printf %s \"+server.levelurl {{MAP_URL}}\" ) {{ADDITIONAL_ARGS}}", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"Server startup complete\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Server Name", - "description": "The name of your server in the public server list.", - "env_variable": "HOSTNAME", - "default_value": "A Rust Server", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "max:60" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Modding Framework", - "description": "The modding framework to be used: carbon, oxide, vanilla.\r\nDefaults to \"vanilla\" for a non-modded server installation.", - "env_variable": "FRAMEWORK", - "default_value": "vanilla", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "in:vanilla,oxide,carbon" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Level", - "description": "The world file for Rust to use.", - "env_variable": "LEVEL", - "default_value": "Procedural Map", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "max:20" - ], - "sort": 3, - "field_type": "text" - }, - { - "name": "Description", - "description": "The description under your server title. Commonly used for rules & info. Use \\n for newlines.", - "env_variable": "DESCRIPTION", - "default_value": "Powered by Panel", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string" - ], - "sort": 4, - "field_type": "text" - }, - { - "name": "URL", - "description": "The URL for your server. This is what comes up when clicking the \"Visit Website\" button.", - "env_variable": "SERVER_URL", - "default_value": "http:\/\/example.com", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "url" - ], - "sort": 5, - "field_type": "text" - }, - { - "name": "World Size", - "description": "The world size for a procedural map.", - "env_variable": "WORLD_SIZE", - "default_value": "3000", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "integer" - ], - "sort": 6, - "field_type": "text" - }, - { - "name": "World Seed", - "description": "The seed for a procedural map.", - "env_variable": "WORLD_SEED", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string" - ], - "sort": 7, - "field_type": "text" - }, - { - "name": "Max Players", - "description": "The maximum amount of players allowed in the server at once.", - "env_variable": "MAX_PLAYERS", - "default_value": "40", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "integer" - ], - "sort": 8, - "field_type": "text" - }, - { - "name": "Server Image", - "description": "The header image for the top of your server listing.", - "env_variable": "SERVER_IMG", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "url" - ], - "sort": 9, - "field_type": "text" - }, - { - "name": "Query Port", - "description": "Server Query Port. Can't be the same as Game's primary port.", - "env_variable": "QUERY_PORT", - "default_value": "27017", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer" - ], - "sort": 10, - "field_type": "text" - }, - { - "name": "RCON Port", - "description": "Port for RCON connections.", - "env_variable": "RCON_PORT", - "default_value": "28016", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer" - ], - "sort": 11, - "field_type": "text" - }, - { - "name": "RCON Password", - "description": "RCON access password.", - "env_variable": "RCON_PASS", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^[\\w.-]*$\/", - "max:64" - ], - "sort": 12, - "field_type": "text" - }, - { - "name": "Save Interval", - "description": "Sets the server\u2019s auto-save interval in seconds.", - "env_variable": "SAVEINTERVAL", - "default_value": "60", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "integer" - ], - "sort": 13, - "field_type": "text" - }, - { - "name": "Additional Arguments", - "description": "Add additional startup parameters to the server.", - "env_variable": "ADDITIONAL_ARGS", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string" - ], - "sort": 14, - "field_type": "text" - }, - { - "name": "App Port", - "description": "Port for the Rust+ App. -1 to disable.", - "env_variable": "APP_PORT", - "default_value": "28082", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer" - ], - "sort": 15, - "field_type": "text" - }, - { - "name": "Server Logo", - "description": "The circular server logo for the Rust+ app.", - "env_variable": "SERVER_LOGO", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "url" - ], - "sort": 16, - "field_type": "text" - }, - { - "name": "Custom Map URL", - "description": "Overwrites the map with the one from the direct download URL. Invalid URLs will cause the server to crash.", - "env_variable": "MAP_URL", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "url" - ], - "sort": 17, - "field_type": "text" - }, - { - "name": "App ID", - "description": "", - "env_variable": "SRCDS_APPID", - "default_value": "258550", - "user_viewable": false, - "user_editable": false, - "rules": [ - "required", - "string", - "in:258550" - ], - "sort": 18, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json b/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json deleted file mode 100644 index 1c092bd213..0000000000 --- a/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-counter--strike--global-offensive.json" - }, - "exported_at": "2024-07-25T12:04:25+00:00", - "name": "Counter-Strike: Global Offensive", - "author": "panel@example.com", - "uuid": "437c367d-06be-498f-a604-fdad135504d7", - "description": "Counter-Strike: Global Offensive is a multiplayer first-person shooter video game developed by Hidden Path Entertainment and Valve Corporation.", - "features": [ - "gsl_token", - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:source": "ghcr.io\/parkervcp\/games:source" - }, - "file_denylist": [], - "startup": ".\/srcds_run -game csgo -console -port {{SERVER_PORT}} +ip 0.0.0.0 +map {{SRCDS_MAP}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}}", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"Connection to Steam servers successful\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Map", - "description": "The default map for the server.", - "env_variable": "SRCDS_MAP", - "default_value": "de_dust2", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_dash" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Steam Account Token", - "description": "The Steam Account Token required for the server to be displayed publicly.", - "env_variable": "STEAM_ACC", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_num", - "size:32" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Source AppID", - "description": "Required for game to update on server restart. Do not modify this.", - "env_variable": "SRCDS_APPID", - "default_value": "740", - "user_viewable": false, - "user_editable": false, - "rules": [ - "required", - "string", - "max:20" - ], - "sort": 3, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json b/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json deleted file mode 100644 index 1126e629f1..0000000000 --- a/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-custom-source-engine-game.json" - }, - "exported_at": "2024-07-25T12:03:27+00:00", - "name": "Custom Source Engine Game", - "author": "panel@example.com", - "uuid": "2a42d0c2-c0ba-4067-9a0a-9b95d77a3490", - "description": "This option allows modifying the startup arguments and other details to run a custom SRCDS based game on the panel.", - "features": [ - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:source": "ghcr.io\/parkervcp\/games:source" - }, - "file_denylist": [], - "startup": ".\/srcds_run -game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"gameserver Steam ID\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n##\r\n#\r\n# Variables\r\n# STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n# WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n# SRCDS_APPID - steam app id ffound here - https:\/\/developer.valvesoftware.com\/wiki\/Dedicated_Servers_List\r\n# EXTRA_FLAGS - when a server has extra glas for things like beta installs or updates.\r\n#\r\n##\r\n\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ \"${WINDOWS_INSTALL}\" == \"1\" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Game ID", - "description": "The ID corresponding to the game to download and run using SRCDS.", - "env_variable": "SRCDS_APPID", - "default_value": "", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "numeric", - "digits_between:1,6" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Game Name", - "description": "The name corresponding to the game to download and run using SRCDS.", - "env_variable": "SRCDS_GAME", - "default_value": "", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "alpha_dash", - "between:1,100" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Map", - "description": "The default map for the server.", - "env_variable": "SRCDS_MAP", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_dash" - ], - "sort": 3, - "field_type": "text" - }, - { - "name": "Steam Username", - "description": "", - "env_variable": "STEAM_USER", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string" - ], - "sort": 4, - "field_type": "text" - }, - { - "name": "Steam Password", - "description": "", - "env_variable": "STEAM_PASS", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string" - ], - "sort": 5, - "field_type": "text" - }, - { - "name": "Steam Auth", - "description": "", - "env_variable": "STEAM_AUTH", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string" - ], - "sort": 6, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/source-engine/egg-garrys-mod.json b/database/Seeders/eggs/source-engine/egg-garrys-mod.json deleted file mode 100644 index 21a289cd5e..0000000000 --- a/database/Seeders/eggs/source-engine/egg-garrys-mod.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-garrys-mod.json" - }, - "exported_at": "2024-07-25T12:05:02+00:00", - "name": "Garrys Mod", - "author": "panel@example.com", - "uuid": "60ef81d4-30a2-4d98-ab64-f59c69e2f915", - "description": "Garrys Mod, is a sandbox physics game created by Garry Newman, and developed by his company, Facepunch Studios.", - "features": [ - "gsl_token", - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:source": "ghcr.io\/parkervcp\/games:source" - }, - "file_denylist": [], - "startup": ".\/srcds_run -game garrysmod -console -port {{SERVER_PORT}} +ip 0.0.0.0 +host_workshop_collection {{WORKSHOP_ID}} +map {{SRCDS_MAP}} +gamemode {{GAMEMODE}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}} +maxplayers {{MAX_PLAYERS}} -tickrate {{TICKRATE}} $( [ \"$LUA_REFRESH\" == \"1\" ] || printf %s '-disableluarefresh' )", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"gameserver Steam ID\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ \"${WINDOWS_INSTALL}\" == \"1\" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so\r\n\r\n# Creating needed default files for the game\r\ncd \/mnt\/server\/garrysmod\/lua\/autorun\/server\r\necho '\r\n-- Docs: https:\/\/wiki.garrysmod.com\/page\/resource\/AddWorkshop\r\n-- Place the ID of the workshop addon you want to be downloaded to people who join your server, not the collection ID\r\n-- Use https:\/\/beta.configcreator.com\/create\/gmod\/resources.lua to easily create a list based on your collection ID\r\n\r\nresource.AddWorkshop( \"\" )\r\n' > workshop.lua\r\n\r\ncd \/mnt\/server\/garrysmod\/cfg\r\necho '\r\n\/\/ Please do not set RCon in here, use the startup parameters.\r\n\r\nhostname\t\t\"New Gmod Server\"\r\nsv_password\t\t\"\"\r\nsv_loadingurl \"\"\r\nsv_downloadurl \"\"\r\n\r\n\/\/ Steam Server List Settings\r\n\/\/ sv_location \"eu\"\r\nsv_region \"255\"\r\nsv_lan \"0\"\r\nsv_max_queries_sec_global \"30000\"\r\nsv_max_queries_window \"45\"\r\nsv_max_queries_sec \"5\"\r\n\r\n\/\/ Server Limits\r\nsbox_maxprops\t\t100\r\nsbox_maxragdolls\t5\r\nsbox_maxnpcs\t\t10\r\nsbox_maxballoons\t10\r\nsbox_maxeffects\t\t10\r\nsbox_maxdynamite\t10\r\nsbox_maxlamps\t\t10\r\nsbox_maxthrusters\t10\r\nsbox_maxwheels\t\t10\r\nsbox_maxhoverballs\t10\r\nsbox_maxvehicles\t20\r\nsbox_maxbuttons\t\t10\r\nsbox_maxsents\t\t20\r\nsbox_maxemitters\t5\r\nsbox_godmode\t\t0\r\nsbox_noclip\t\t 0\r\n\r\n\/\/ Network Settings - Please keep these set to default.\r\n\r\nsv_minrate\t\t75000\r\nsv_maxrate\t\t0\r\ngmod_physiterations\t2\r\nnet_splitpacket_maxrate\t45000\r\ndecalfrequency\t\t12 \r\n\r\n\/\/ Execute Ban Files - Please do not edit\r\nexec banned_ip.cfg \r\nexec banned_user.cfg \r\n\r\n\/\/ Add custom lines under here\r\n' > server.cfg", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Map", - "description": "The default map for the server.", - "env_variable": "SRCDS_MAP", - "default_value": "gm_flatgrass", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_dash" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Steam Account Token", - "description": "The Steam Account Token required for the server to be displayed publicly.", - "env_variable": "STEAM_ACC", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "string", - "alpha_num", - "size:32" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Source AppID", - "description": "Required for game to update on server restart. Do not modify this.", - "env_variable": "SRCDS_APPID", - "default_value": "4020", - "user_viewable": false, - "user_editable": false, - "rules": [ - "required", - "string", - "max:20" - ], - "sort": 3, - "field_type": "text" - }, - { - "name": "Workshop ID", - "description": "The ID of your workshop collection (the numbers at the end of the URL)", - "env_variable": "WORKSHOP_ID", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "nullable", - "integer" - ], - "sort": 4, - "field_type": "text" - }, - { - "name": "Gamemode", - "description": "The gamemode of your server.", - "env_variable": "GAMEMODE", - "default_value": "sandbox", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string" - ], - "sort": 5, - "field_type": "text" - }, - { - "name": "Max Players", - "description": "The maximum amount of players allowed on your game server.", - "env_variable": "MAX_PLAYERS", - "default_value": "32", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "integer", - "max:128" - ], - "sort": 6, - "field_type": "text" - }, - { - "name": "Tickrate", - "description": "The tickrate defines how fast the server will update each entity's location.", - "env_variable": "TICKRATE", - "default_value": "22", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "integer", - "max:100" - ], - "sort": 7, - "field_type": "text" - }, - { - "name": "Lua Refresh", - "description": "0 = disable Lua refresh,\r\n1 = enable Lua refresh", - "env_variable": "LUA_REFRESH", - "default_value": "0", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "boolean" - ], - "sort": 8, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/source-engine/egg-insurgency.json b/database/Seeders/eggs/source-engine/egg-insurgency.json deleted file mode 100644 index 1c7e1525f4..0000000000 --- a/database/Seeders/eggs/source-engine/egg-insurgency.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-insurgency.json" - }, - "exported_at": "2024-07-25T12:05:30+00:00", - "name": "Insurgency", - "author": "panel@example.com", - "uuid": "a5702286-655b-4069-bf1e-925c7300b61a", - "description": "Take to the streets for intense close quarters combat, where a team's survival depends upon securing crucial strongholds and destroying enemy supply in this multiplayer and cooperative Source Engine based experience.", - "features": [ - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:source": "ghcr.io\/parkervcp\/games:source" - }, - "file_denylist": [], - "startup": ".\/srcds_run -game insurgency -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"gameserver Steam ID\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login anonymous +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Game ID", - "description": "The ID corresponding to the game to download and run using SRCDS.", - "env_variable": "SRCDS_APPID", - "default_value": "237410", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "regex:\/^(237410)$\/" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Default Map", - "description": "The default map to use when starting the server.", - "env_variable": "SRCDS_MAP", - "default_value": "sinjar", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^(\\w{1,20})$\/" - ], - "sort": 2, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/source-engine/egg-team-fortress2.json b/database/Seeders/eggs/source-engine/egg-team-fortress2.json deleted file mode 100644 index 667d045559..0000000000 --- a/database/Seeders/eggs/source-engine/egg-team-fortress2.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-team-fortress2.json" - }, - "exported_at": "2024-07-25T12:05:42+00:00", - "name": "Team Fortress 2", - "author": "panel@example.com", - "uuid": "7f8eb681-b2c8-4bf8-b9f4-d79ff70b6e5d", - "description": "Team Fortress 2 is a team-based first-person shooter multiplayer video game developed and published by Valve Corporation. It is the sequel to the 1996 mod Team Fortress for Quake and its 1999 remake.", - "features": [ - "gsl_token", - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:source": "ghcr.io\/parkervcp\/games:source" - }, - "file_denylist": [], - "startup": ".\/srcds_run -game tf -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}}", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"gameserver Steam ID\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n# Image to install with is 'debian:buster-slim'\r\n\r\n##\r\n#\r\n# Variables\r\n# STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n# WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n# SRCDS_APPID - steam app id ffound here - https:\/\/developer.valvesoftware.com\/wiki\/Dedicated_Servers_List\r\n# EXTRA_FLAGS - when a server has extra glas for things like beta installs or updates.\r\n#\r\n##\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n echo -e \"steam user is not set.\\n\"\r\n echo -e \"Using anonymous user.\\n\"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nelse\r\n echo -e \"user set to ${STEAM_USER}\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ \"${WINDOWS_INSTALL}\" == \"1\" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Game ID", - "description": "The ID corresponding to the game to download and run using SRCDS.", - "env_variable": "SRCDS_APPID", - "default_value": "232250", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "in:232250" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "Default Map", - "description": "The default map to use when starting the server.", - "env_variable": "SRCDS_MAP", - "default_value": "cp_dustbowl", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "regex:\/^(\\w{1,20})$\/" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Steam", - "description": "The Steam Game Server Login Token to display servers publicly. Generate one at https:\/\/steamcommunity.com\/dev\/managegameservers", - "env_variable": "STEAM_ACC", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_num", - "size:32" - ], - "sort": 3, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/voice-servers/egg-mumble-server.json b/database/Seeders/eggs/voice-servers/egg-mumble-server.json deleted file mode 100644 index a4c02919f9..0000000000 --- a/database/Seeders/eggs/voice-servers/egg-mumble-server.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/voice-servers\/egg-mumble-server.json" - }, - "exported_at": "2024-07-25T12:05:52+00:00", - "name": "Mumble Server", - "author": "panel@example.com", - "uuid": "727ee758-7fb2-4979-972b-d3eba4e1e9f0", - "description": "Mumble is an open source, low-latency, high quality voice chat software primarily intended for use while gaming.", - "features": [], - "docker_images": { - "Mumble": "ghcr.io\/parkervcp\/yolks:voice_mumble" - }, - "file_denylist": [], - "startup": "mumble-server -fg -ini murmur.ini", - "config": { - "files": "{\r\n \"murmur.ini\": {\r\n \"parser\": \"ini\",\r\n \"find\": {\r\n \"database\": \"\/home\/container\/murmur.sqlite\",\r\n \"logfile\": \"\/home\/container\/murmur.log\",\r\n \"port\": \"{{server.allocations.default.port}}\",\r\n \"host\": \"\",\r\n \"users\": \"{{server.environment.MAX_USERS}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \"Server listening on\"\r\n}", - "logs": "{}", - "stop": "^C" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/ash\r\n\r\nif [ ! -d \/mnt\/server\/ ]; then\r\n mkdir \/mnt\/server\/\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\nFILE=\/mnt\/server\/murmur.ini\r\nif [ -f \"$FILE\" ]; then\r\n echo \"Config file already exists.\"\r\nelse \r\n echo \"Downloading the config file.\"\r\n apk add --no-cache murmur\r\n cp \/etc\/murmur.ini \/mnt\/server\/murmur.ini\r\n apk del murmur\r\nfi\r\necho \"done\"", - "container": "ghcr.io\/parkervcp\/installers:alpine", - "entrypoint": "ash" - } - }, - "variables": [ - { - "name": "Maximum Users", - "description": "Maximum concurrent users on the mumble server.", - "env_variable": "MAX_USERS", - "default_value": "100", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "numeric", - "digits_between:1,5" - ], - "sort": 1, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json b/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json deleted file mode 100644 index 0543a16c04..0000000000 --- a/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/voice-servers\/egg-teamspeak3-server.json" - }, - "exported_at": "2024-07-25T12:06:05+00:00", - "name": "Teamspeak3 Server", - "author": "panel@example.com", - "uuid": "983b1fac-d322-4d5f-a636-436127326b37", - "description": "VoIP software designed with security in mind, featuring crystal clear voice quality, endless customization options, and scalabilty up to thousands of simultaneous users.", - "features": [], - "docker_images": { - "Debian": "ghcr.io\/parkervcp\/yolks:debian" - }, - "file_denylist": [], - "startup": ".\/ts3server default_voice_port={{SERVER_PORT}} query_port={{QUERY_PORT}} filetransfer_ip=0.0.0.0 filetransfer_port={{FILE_TRANSFER}} query_http_port={{QUERY_HTTP}} query_ssh_port={{QUERY_SSH}} query_protocols={{QUERY_PROTOCOLS_VAR}} license_accepted=1", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"listening on 0.0.0.0:\"\r\n}", - "logs": "{}", - "stop": "^C" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/ash\r\n# TS3 Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\nif [ -z ${TS_VERSION} ] || [ ${TS_VERSION} == latest ]; then\r\n TS_VERSION=$(curl -sSL https:\/\/teamspeak.com\/versions\/server.json | jq -r '.linux.x86_64.version')\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"getting files from http:\/\/files.teamspeak-services.com\/releases\/server\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2\" \r\ncurl -L http:\/\/files.teamspeak-services.com\/releases\/server\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2 | tar -xvj --strip-components=1\r\ncp .\/redist\/libmariadb.so.2 .\/", - "container": "ghcr.io\/parkervcp\/installers:alpine", - "entrypoint": "ash" - } - }, - "variables": [ - { - "name": "Server Version", - "description": "The version of Teamspeak 3 to use when running the server.", - "env_variable": "TS_VERSION", - "default_value": "latest", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "max:6" - ], - "sort": 1, - "field_type": "text" - }, - { - "name": "File Transfer Port", - "description": "The Teamspeak file transfer port", - "env_variable": "FILE_TRANSFER", - "default_value": "30033", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer", - "between:1025,65535" - ], - "sort": 2, - "field_type": "text" - }, - { - "name": "Query Port", - "description": "The Teamspeak Query Port", - "env_variable": "QUERY_PORT", - "default_value": "10011", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer", - "between:1025,65535" - ], - "sort": 3, - "field_type": "text" - }, - { - "name": "Query Protocols", - "description": "Comma separated list of protocols that can be used to connect to the ServerQuery | \r\nPossible values are raw, ssh and http | \r\nE.g.: raw,ssh,http", - "env_variable": "QUERY_PROTOCOLS_VAR", - "default_value": "raw,http,ssh", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "max:12" - ], - "sort": 4, - "field_type": "text" - }, - { - "name": "Query SSH Port", - "description": "TCP Port opened for ServerQuery connections using SSH", - "env_variable": "QUERY_SSH", - "default_value": "10022", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer", - "between:1025,65535" - ], - "sort": 5, - "field_type": "text" - }, - { - "name": "Query HTTP Port", - "description": "TCP Port opened for ServerQuery connections using http", - "env_variable": "QUERY_HTTP", - "default_value": "10080", - "user_viewable": true, - "user_editable": false, - "rules": [ - "required", - "integer", - "between:1025,65535" - ], - "sort": 6, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/database/migrations/2016_01_23_195641_add_allocations_table.php b/database/migrations/2016_01_23_195641_add_allocations_table.php index 2ff176b028..88772b7e03 100644 --- a/database/migrations/2016_01_23_195641_add_allocations_table.php +++ b/database/migrations/2016_01_23_195641_add_allocations_table.php @@ -1,7 +1,7 @@ increments('id'); - $table->char('public', 16); + $table->string('public', 16)->nullable(); $table->text('secret'); $table->text('allowed_ips')->nullable(); $table->timestamps(); diff --git a/database/migrations/2016_01_23_200044_add_api_permissions.php b/database/migrations/2016_01_23_200044_add_api_permissions.php index b850d797d9..e7da2f7077 100644 --- a/database/migrations/2016_01_23_200044_add_api_permissions.php +++ b/database/migrations/2016_01_23_200044_add_api_permissions.php @@ -1,7 +1,7 @@ increments('id'); - $table->char('token', 36)->unique(); - $table->char('server', 36); + $table->string('token', 36)->unique(); + $table->string('server', 36); $table->text('path'); $table->timestamps(); }); diff --git a/database/migrations/2016_01_23_200421_create_failed_jobs_table.php b/database/migrations/2016_01_23_200421_create_failed_jobs_table.php index 55b79845d3..23e432ca1f 100644 --- a/database/migrations/2016_01_23_200421_create_failed_jobs_table.php +++ b/database/migrations/2016_01_23_200421_create_failed_jobs_table.php @@ -1,7 +1,7 @@ mediumInteger('memory_overallocate')->unsigned()->nullable(); $table->integer('disk')->unsigned(); $table->mediumInteger('disk_overallocate')->unsigned()->nullable(); - $table->char('daemonSecret', 36)->unique(); + $table->string('daemonSecret', 36)->unique(); $table->smallInteger('daemonListen')->unsigned()->default(8080); $table->smallInteger('daemonSFTP')->unsgined()->default(2022); $table->string('daemonBase')->default('/home/daemon-files'); diff --git a/database/migrations/2016_01_23_201433_add_password_resets.php b/database/migrations/2016_01_23_201433_add_password_resets.php index 8a0ac8d7ae..3b842edc44 100644 --- a/database/migrations/2016_01_23_201433_add_password_resets.php +++ b/database/migrations/2016_01_23_201433_add_password_resets.php @@ -1,7 +1,7 @@ increments('id'); - $table->char('uuid', 36)->unique(); - $table->char('uuidShort', 8)->unique(); + $table->string('uuid', 36)->unique(); + $table->string('uuidShort', 8)->unique(); $table->mediumInteger('node')->unsigned(); $table->string('name'); $table->tinyInteger('active')->unsigned(); @@ -29,7 +29,7 @@ public function up(): void $table->mediumInteger('service')->unsigned(); $table->mediumInteger('option')->unsigned(); $table->text('startup'); - $table->char('daemonSecret', 36)->unique(); + $table->string('daemonSecret', 36)->unique(); $table->string('username')->unique(); $table->tinyInteger('installed')->unsigned()->default(0); $table->timestamps(); diff --git a/database/migrations/2016_01_23_202544_add_service_options.php b/database/migrations/2016_01_23_202544_add_service_options.php index 72fd8dc85e..21cf825146 100644 --- a/database/migrations/2016_01_23_202544_add_service_options.php +++ b/database/migrations/2016_01_23_202544_add_service_options.php @@ -1,7 +1,7 @@ increments('id'); $table->integer('user_id')->unsigned(); $table->integer('server_id')->unsigned(); - $table->char('daemonSecret', 36)->unique(); + $table->string('daemonSecret', 36)->unique(); $table->timestamps(); }); } diff --git a/database/migrations/2016_01_23_203159_add_users.php b/database/migrations/2016_01_23_203159_add_users.php index 7c3e8afa1b..c69633168f 100644 --- a/database/migrations/2016_01_23_203159_add_users.php +++ b/database/migrations/2016_01_23_203159_add_users.php @@ -1,7 +1,7 @@ increments('id'); - $table->char('uuid', 36)->unique(); + $table->string('uuid', 36)->unique(); $table->string('email')->unique(); $table->text('password'); $table->string('remember_token')->nullable(); - $table->char('language', 5)->default('en'); + $table->string('language', 5)->default('en'); $table->tinyInteger('root_admin')->unsigned()->default(0); $table->tinyInteger('use_totp')->unsigned(); - $table->char('totp_secret', 16)->nullable(); + $table->string('totp_secret', 16)->nullable(); $table->timestamps(); }); } diff --git a/database/migrations/2016_01_23_203947_create_sessions_table.php b/database/migrations/2016_01_23_203947_create_sessions_table.php index 1017a858ea..b8fb18aab0 100644 --- a/database/migrations/2016_01_23_203947_create_sessions_table.php +++ b/database/migrations/2016_01_23_203947_create_sessions_table.php @@ -1,7 +1,7 @@ renameColumn('permissions', 'permission'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('permissions', function (Blueprint $table) { - }); - } -}; diff --git a/database/migrations/2016_02_07_172148_add_databases_tables.php b/database/migrations/2016_02_07_172148_add_databases_tables.php index dbcb535098..7bcebbc587 100644 --- a/database/migrations/2016_02_07_172148_add_databases_tables.php +++ b/database/migrations/2016_02_07_172148_add_databases_tables.php @@ -1,7 +1,7 @@ mediumInteger('allocation')->unsigned()->after('oom_disabled'); + $table->mediumInteger('allocation')->nullable()->unsigned()->after('oom_disabled'); }); // Parse All Servers diff --git a/database/migrations/2016_09_01_193520_add_suspension_for_servers.php b/database/migrations/2016_09_01_193520_add_suspension_for_servers.php index 62511e73b7..744c9999a0 100644 --- a/database/migrations/2016_09_01_193520_add_suspension_for_servers.php +++ b/database/migrations/2016_09_01_193520_add_suspension_for_servers.php @@ -1,7 +1,7 @@ text('exception'); + $table->text('exception')->nullable(); }); } diff --git a/database/migrations/2016_09_04_182835_create_notifications_table.php b/database/migrations/2016_09_04_182835_create_notifications_table.php index 788e37be07..ac98d872c3 100644 --- a/database/migrations/2016_09_04_182835_create_notifications_table.php +++ b/database/migrations/2016_09_04_182835_create_notifications_table.php @@ -1,7 +1,7 @@ string('id')->primary(); $table->string('type'); $table->morphs('notifiable'); - $table->text('data'); + $table->json('data'); $table->timestamp('read_at')->nullable(); $table->timestamps(); }); diff --git a/database/migrations/2016_09_07_163017_add_unique_identifier.php b/database/migrations/2016_09_07_163017_add_unique_identifier.php index ad186c385e..a7e5aee4f1 100644 --- a/database/migrations/2016_09_07_163017_add_unique_identifier.php +++ b/database/migrations/2016_09_07_163017_add_unique_identifier.php @@ -1,8 +1,8 @@ char('author', 36)->after('id'); + $table->string('author', 36)->nullable()->after('id'); }); } diff --git a/database/migrations/2016_09_14_145945_allow_longer_regex_field.php b/database/migrations/2016_09_14_145945_allow_longer_regex_field.php index f4c1ae8792..ab296d0d0b 100644 --- a/database/migrations/2016_09_14_145945_allow_longer_regex_field.php +++ b/database/migrations/2016_09_14_145945_allow_longer_regex_field.php @@ -1,8 +1,8 @@ string('image')->after('daemonSecret'); + $table->string('image')->nullable()->after('daemonSecret'); }); // Populate the column diff --git a/database/migrations/2016_09_21_165554_update_servers_column_name.php b/database/migrations/2016_09_21_165554_update_servers_column_name.php index 1ef86ff033..1b6edbf926 100644 --- a/database/migrations/2016_09_21_165554_update_servers_column_name.php +++ b/database/migrations/2016_09_21_165554_update_servers_column_name.php @@ -1,8 +1,8 @@ increments('id'); $table->boolean('authorized'); $table->text('error')->nullable(); - $table->char('key', 16)->nullable(); - $table->char('method', 6); + $table->string('key', 16)->nullable(); + $table->string('method', 6); $table->text('route'); $table->text('content')->nullable(); $table->text('user_agent'); diff --git a/database/migrations/2016_10_14_164802_update_api_keys.php b/database/migrations/2016_10_14_164802_update_api_keys.php index 0d4032f9bf..93135a9491 100644 --- a/database/migrations/2016_10_14_164802_update_api_keys.php +++ b/database/migrations/2016_10_14_164802_update_api_keys.php @@ -1,8 +1,8 @@ unsignedInteger('user')->after('id'); + $table->unsignedInteger('user')->nullable()->after('id'); $table->text('memo')->after('allowed_ips')->nullable(); $table->timestamp('expires_at')->after('memo')->nullable(); }); diff --git a/database/migrations/2016_10_23_181719_update_misnamed_bungee.php b/database/migrations/2016_10_23_181719_update_misnamed_bungee.php index ff10f9c4bc..146a4fa41d 100644 --- a/database/migrations/2016_10_23_181719_update_misnamed_bungee.php +++ b/database/migrations/2016_10_23_181719_update_misnamed_bungee.php @@ -17,7 +17,5 @@ public function up(): void /** * Reverse the migrations. */ - public function down(): void - { - } + public function down(): void {} }; diff --git a/database/migrations/2016_10_23_193810_add_foreign_keys_servers.php b/database/migrations/2016_10_23_193810_add_foreign_keys_servers.php index e847e801d7..5fba20088d 100644 --- a/database/migrations/2016_10_23_193810_add_foreign_keys_servers.php +++ b/database/migrations/2016_10_23_193810_add_foreign_keys_servers.php @@ -1,8 +1,8 @@ foreign('user_id')->references('id')->on('users'); - $table->foreign('server_id')->references('id')->on('servers'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('permissions', function (Blueprint $table) { - $table->dropForeign('permissions_user_id_foreign'); - $table->dropForeign('permissions_server_id_foreign'); - - $table->dropIndex('permissions_user_id_foreign'); - $table->dropIndex('permissions_server_id_foreign'); - }); - } -}; diff --git a/database/migrations/2016_10_23_203857_add_foreign_server_variables.php b/database/migrations/2016_10_23_203857_add_foreign_server_variables.php index 628d5f1579..defb4ddcf9 100644 --- a/database/migrations/2016_10_23_203857_add_foreign_server_variables.php +++ b/database/migrations/2016_10_23_203857_add_foreign_server_variables.php @@ -1,8 +1,8 @@ increments('id'); $table->unsignedInteger('option'); - $table->char('uuid', 36)->unique(); + $table->string('uuid', 36)->unique(); $table->string('name'); $table->string('version'); $table->text('description')->nullable(); diff --git a/database/migrations/2016_11_11_231731_set_service_name_unique.php b/database/migrations/2016_11_11_231731_set_service_name_unique.php index 381cf3f7c7..7da407e666 100644 --- a/database/migrations/2016_11_11_231731_set_service_name_unique.php +++ b/database/migrations/2016_11_11_231731_set_service_name_unique.php @@ -1,8 +1,8 @@ increments('id'); - $table->char('token', 32); + $table->string('token', 32); $table->timestamp('expires_at'); $table->integer('node')->unsigned(); $table->foreign('node')->references('id')->on('nodes'); diff --git a/database/migrations/2017_01_12_135449_add_more_user_data.php b/database/migrations/2017_01_12_135449_add_more_user_data.php index aa86095051..2f4b8c88ae 100644 --- a/database/migrations/2017_01_12_135449_add_more_user_data.php +++ b/database/migrations/2017_01_12_135449_add_more_user_data.php @@ -1,9 +1,9 @@ string('name_first')->after('email')->nullable(); $table->string('name_last')->after('name_first')->nullable(); - $table->string('username')->after('uuid'); + $table->string('username')->after('uuid')->nullable(); $table->boolean('gravatar')->after('totp_secret')->default(true); }); diff --git a/database/migrations/2017_02_02_175548_UpdateColumnNames.php b/database/migrations/2017_02_02_175548_UpdateColumnNames.php index 1ef3415e4e..426e32fded 100644 --- a/database/migrations/2017_02_02_175548_UpdateColumnNames.php +++ b/database/migrations/2017_02_02_175548_UpdateColumnNames.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign('servers_node_foreign'); - $table->dropForeign('servers_owner_foreign'); - $table->dropForeign('servers_allocation_foreign'); - $table->dropForeign('servers_service_foreign'); - $table->dropForeign('servers_option_foreign'); - $table->dropForeign('servers_pack_foreign'); + $table->dropForeign(['node']); + $table->dropForeign(['owner']); + $table->dropForeign(['allocation']); + $table->dropForeign(['service']); + $table->dropForeign(['option']); + $table->dropForeign(['pack']); + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('servers_node_foreign'); $table->dropIndex('servers_owner_foreign'); $table->dropIndex('servers_allocation_foreign'); @@ -52,13 +52,11 @@ public function up(): void public function down(): void { Schema::table('servers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - $table->dropForeign(['owner_id']); - $table->dropForeign(['allocation_id']); - $table->dropForeign(['service_id']); - $table->dropForeign(['option_id']); - } + $table->dropForeign(['node_id']); + $table->dropForeign(['owner_id']); + $table->dropForeign(['allocation_id']); + $table->dropForeign(['service_id']); + $table->dropForeign(['option_id']); $table->renameColumn('node_id', 'node'); $table->renameColumn('owner_id', 'owner'); diff --git a/database/migrations/2017_02_03_140948_UpdateNodesTable.php b/database/migrations/2017_02_03_140948_UpdateNodesTable.php index 72f560f391..4c0b6bd79c 100644 --- a/database/migrations/2017_02_03_140948_UpdateNodesTable.php +++ b/database/migrations/2017_02_03_140948_UpdateNodesTable.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign('nodes_location_foreign'); + $table->dropForeign(['location']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('nodes_location_foreign'); } @@ -28,8 +29,9 @@ public function up(): void public function down(): void { Schema::table('nodes', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('nodes_location_id_foreign'); + $table->dropForeign(['location_id']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('nodes_location_id_foreign'); } diff --git a/database/migrations/2017_02_03_155554_RenameColumns.php b/database/migrations/2017_02_03_155554_RenameColumns.php index 400241e88f..0d640a135a 100644 --- a/database/migrations/2017_02_03_155554_RenameColumns.php +++ b/database/migrations/2017_02_03_155554_RenameColumns.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign('allocations_node_foreign'); - $table->dropForeign('allocations_assigned_to_foreign'); + $table->dropForeign(['node']); + $table->dropForeign(['assigned_to']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('allocations_node_foreign'); $table->dropIndex('allocations_assigned_to_foreign'); } @@ -32,9 +33,10 @@ public function up(): void public function down(): void { Schema::table('allocations', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('allocations_node_id_foreign'); - $table->dropForeign('allocations_server_id_foreign'); + $table->dropForeign(['node_id']); + $table->dropForeign(['server_id']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('allocations_node_id_foreign'); $table->dropIndex('allocations_server_id_foreign'); } diff --git a/database/migrations/2017_02_05_164123_AdjustColumnNames.php b/database/migrations/2017_02_05_164123_AdjustColumnNames.php index e299b62f6d..74e309aba7 100644 --- a/database/migrations/2017_02_05_164123_AdjustColumnNames.php +++ b/database/migrations/2017_02_05_164123_AdjustColumnNames.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign('service_options_parent_service_foreign'); + $table->dropForeign(['parent_service']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('service_options_parent_service_foreign'); } @@ -28,8 +29,9 @@ public function up(): void public function down(): void { Schema::table('service_options', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('service_options_service_id_foreign'); + $table->dropForeign(['service_id']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('service_options_service_id_foreign'); } diff --git a/database/migrations/2017_02_05_164516_AdjustColumnNamesForServicePacks.php b/database/migrations/2017_02_05_164516_AdjustColumnNamesForServicePacks.php index 352b264437..05f422306e 100644 --- a/database/migrations/2017_02_05_164516_AdjustColumnNamesForServicePacks.php +++ b/database/migrations/2017_02_05_164516_AdjustColumnNamesForServicePacks.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign('service_packs_option_foreign'); + $table->dropForeign(['option']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('service_packs_option_foreign'); } @@ -28,8 +29,9 @@ public function up(): void public function down(): void { Schema::table('service_packs', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('service_packs_option_id_foreign'); + $table->dropForeign(['option_id']); + + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropIndex('service_packs_option_id_foreign'); } diff --git a/database/migrations/2017_02_09_174834_SetupPermissionsPivotTable.php b/database/migrations/2017_02_09_174834_SetupPermissionsPivotTable.php deleted file mode 100644 index ca2cabfd67..0000000000 --- a/database/migrations/2017_02_09_174834_SetupPermissionsPivotTable.php +++ /dev/null @@ -1,75 +0,0 @@ -unsignedInteger('subuser_id')->after('id'); - }); - - DB::transaction(function () { - foreach (Subuser::all() as &$subuser) { - Permission::where('user_id', $subuser->user_id)->where('server_id', $subuser->server_id)->update([ - 'subuser_id' => $subuser->id, - ]); - } - }); - - Schema::table('permissions', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('permissions_server_id_foreign'); - $table->dropIndex('permissions_server_id_foreign'); - $table->dropForeign('permissions_user_id_foreign'); - $table->dropIndex('permissions_user_id_foreign'); - } - - $table->dropColumn('server_id'); - $table->dropColumn('user_id'); - $table->dropColumn('created_at'); - $table->dropColumn('updated_at'); - $table->foreign('subuser_id')->references('id')->on('subusers'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('permissions', function (Blueprint $table) { - $table->unsignedInteger('server_id')->after('subuser_id'); - $table->unsignedInteger('user_id')->after('server_id'); - $table->timestamps(); - }); - - DB::transaction(function () { - foreach (Subuser::all() as &$subuser) { - Permission::where('subuser_id', $subuser->id)->update([ - 'user_id' => $subuser->user_id, - 'server_id' => $subuser->server_id, - ]); - } - }); - - Schema::table('permissions', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('permissions_subuser_id_foreign'); - $table->dropIndex('permissions_subuser_id_foreign'); - } - $table->dropColumn('subuser_id'); - - $table->foreign('server_id')->references('id')->on('servers'); - $table->foreign('user_id')->references('id')->on('users'); - }); - } -}; diff --git a/database/migrations/2017_02_10_171858_UpdateAPIKeyColumnNames.php b/database/migrations/2017_02_10_171858_UpdateAPIKeyColumnNames.php index 177d599525..2ecb88e6df 100644 --- a/database/migrations/2017_02_10_171858_UpdateAPIKeyColumnNames.php +++ b/database/migrations/2017_02_10_171858_UpdateAPIKeyColumnNames.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropForeign('api_keys_user_foreign'); $table->dropIndex('api_keys_user_foreign'); } @@ -28,7 +28,7 @@ public function up(): void public function down(): void { Schema::table('api_keys', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { + if (!in_array(Schema::getConnection()->getDriverName(), ['sqlite', 'pgsql'])) { $table->dropForeign('api_keys_user_id_foreign'); $table->dropIndex('api_keys_user_id_foreign'); } diff --git a/database/migrations/2017_03_03_224254_UpdateNodeConfigTokensColumns.php b/database/migrations/2017_03_03_224254_UpdateNodeConfigTokensColumns.php index 1f348bf643..2d41609c9b 100644 --- a/database/migrations/2017_03_03_224254_UpdateNodeConfigTokensColumns.php +++ b/database/migrations/2017_03_03_224254_UpdateNodeConfigTokensColumns.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['node']); - } + $table->dropForeign(['node']); $table->dropColumn('expires_at'); $table->renameColumn('node', 'node_id'); @@ -29,9 +27,7 @@ public function up(): void public function down(): void { Schema::table('node_configuration_tokens', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - } + $table->dropForeign(['node_id']); $table->renameColumn('node_id', 'node'); $table->timestamp('expires_at')->after('token'); diff --git a/database/migrations/2017_03_05_212803_DeleteServiceExecutableOption.php b/database/migrations/2017_03_05_212803_DeleteServiceExecutableOption.php index 8846768d40..a8b78a9820 100644 --- a/database/migrations/2017_03_05_212803_DeleteServiceExecutableOption.php +++ b/database/migrations/2017_03_05_212803_DeleteServiceExecutableOption.php @@ -1,8 +1,8 @@ text('index_file')->after('startup'); + $table->text('index_file')->nullable()->after('startup'); }); DB::transaction(function () { diff --git a/database/migrations/2017_03_14_175631_RenameServicePacksToSingluarPacks.php b/database/migrations/2017_03_14_175631_RenameServicePacksToSingluarPacks.php index 12fc9cc212..f430dcf1ae 100644 --- a/database/migrations/2017_03_14_175631_RenameServicePacksToSingluarPacks.php +++ b/database/migrations/2017_03_14_175631_RenameServicePacksToSingluarPacks.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - Schema::table('service_packs', function (Blueprint $table) { - $table->dropForeign(['option_id']); - }); - } + Schema::table('service_packs', function (Blueprint $table) { + $table->dropForeign(['option_id']); + }); Schema::rename('service_packs', 'packs'); @@ -29,11 +27,9 @@ public function up(): void */ public function down(): void { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - Schema::table('packs', function (Blueprint $table) { - $table->dropForeign(['option_id']); - }); - } + Schema::table('packs', function (Blueprint $table) { + $table->dropForeign(['option_id']); + }); Schema::rename('packs', 'service_packs'); diff --git a/database/migrations/2017_03_14_200326_AddLockedStatusToTable.php b/database/migrations/2017_03_14_200326_AddLockedStatusToTable.php index 89e72f1eac..b3541eed12 100644 --- a/database/migrations/2017_03_14_200326_AddLockedStatusToTable.php +++ b/database/migrations/2017_03_14_200326_AddLockedStatusToTable.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - Schema::table('database_servers', function (Blueprint $table) { - $table->dropForeign(['linked_node']); - }); - } + Schema::table('database_servers', function (Blueprint $table) { + $table->dropForeign(['linked_node']); + }); Schema::rename('database_servers', 'database_hosts'); @@ -31,11 +29,9 @@ public function up(): void */ public function down(): void { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - Schema::table('database_hosts', function (Blueprint $table) { - $table->dropForeign(['node_id']); - }); - } + Schema::table('database_hosts', function (Blueprint $table) { + $table->dropForeign(['node_id']); + }); Schema::rename('database_hosts', 'database_servers'); diff --git a/database/migrations/2017_03_16_181515_CleanupDatabasesDatabase.php b/database/migrations/2017_03_16_181515_CleanupDatabasesDatabase.php index ee760a9a2b..f6cd8f5243 100644 --- a/database/migrations/2017_03_16_181515_CleanupDatabasesDatabase.php +++ b/database/migrations/2017_03_16_181515_CleanupDatabasesDatabase.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['db_server']); - } + $table->dropForeign(['db_server']); $table->renameColumn('db_server', 'database_host_id'); @@ -28,9 +26,7 @@ public function up(): void public function down(): void { Schema::table('databases', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['database_host_id']); - } + $table->dropForeign(['database_host_id']); $table->renameColumn('database_host_id', 'db_server'); diff --git a/database/migrations/2017_03_18_204953_AddForeignKeyToPacks.php b/database/migrations/2017_03_18_204953_AddForeignKeyToPacks.php index 5ed1a11846..00e13eaedc 100644 --- a/database/migrations/2017_03_18_204953_AddForeignKeyToPacks.php +++ b/database/migrations/2017_03_18_204953_AddForeignKeyToPacks.php @@ -1,8 +1,8 @@ text('description')->after('name'); + $table->text('description')->nullable()->after('name'); }); } diff --git a/database/migrations/2017_04_02_163232_DropDeletedAtColumnFromServers.php b/database/migrations/2017_04_02_163232_DropDeletedAtColumnFromServers.php index 87e9a4d1d1..122bb8b828 100644 --- a/database/migrations/2017_04_02_163232_DropDeletedAtColumnFromServers.php +++ b/database/migrations/2017_04_02_163232_DropDeletedAtColumnFromServers.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['server']); - } + $table->dropForeign(['server']); $table->renameColumn('server', 'server_id'); $table->unsignedInteger('user_id')->nullable()->after('id'); @@ -38,10 +36,8 @@ public function up(): void public function down(): void { Schema::table('tasks', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['server_id']); - $table->dropForeign(['user_id']); - } + $table->dropForeign(['server_id']); + $table->dropForeign(['user_id']); $table->renameColumn('server_id', 'server'); $table->dropColumn('user_id'); diff --git a/database/migrations/2017_04_20_171943_AddScriptsToServiceOptions.php b/database/migrations/2017_04_20_171943_AddScriptsToServiceOptions.php index 662adcab3f..c9880a3caf 100644 --- a/database/migrations/2017_04_20_171943_AddScriptsToServiceOptions.php +++ b/database/migrations/2017_04_20_171943_AddScriptsToServiceOptions.php @@ -1,8 +1,8 @@ increments('id'); - $table->char('token', 36)->unique(); - $table->char('server', 36); + $table->string('token', 36)->unique(); + $table->string('server', 36); $table->text('path'); $table->timestamps(); }); diff --git a/database/migrations/2017_05_01_141559_DeleteNodeConfigurationTable.php b/database/migrations/2017_05_01_141559_DeleteNodeConfigurationTable.php index 16d17b30f2..a5107d9095 100644 --- a/database/migrations/2017_05_01_141559_DeleteNodeConfigurationTable.php +++ b/database/migrations/2017_05_01_141559_DeleteNodeConfigurationTable.php @@ -1,8 +1,8 @@ increments('id'); - $table->char('token', 32); + $table->string('token', 32); $table->unsignedInteger('node_id'); $table->timestamps(); }); diff --git a/database/migrations/2017_06_10_152951_add_external_id_to_users.php b/database/migrations/2017_06_10_152951_add_external_id_to_users.php index 2fd27d5091..821921787c 100644 --- a/database/migrations/2017_06_10_152951_add_external_id_to_users.php +++ b/database/migrations/2017_06_10_152951_add_external_id_to_users.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['key_id']); - } + $table->dropForeign(['key_id']); $table->foreign('key_id')->references('id')->on('api_keys')->onDelete('cascade'); }); @@ -26,9 +24,7 @@ public function up(): void public function down(): void { Schema::table('api_permissions', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['key_id']); - } + $table->dropForeign(['key_id']); $table->foreign('key_id')->references('id')->on('api_keys'); }); diff --git a/database/migrations/2017_07_08_152806_ChangeUserPermissionsToDeleteOnUserDeletion.php b/database/migrations/2017_07_08_152806_ChangeUserPermissionsToDeleteOnUserDeletion.php index 89baae6f05..cabb8c4d73 100644 --- a/database/migrations/2017_07_08_152806_ChangeUserPermissionsToDeleteOnUserDeletion.php +++ b/database/migrations/2017_07_08_152806_ChangeUserPermissionsToDeleteOnUserDeletion.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['subuser_id']); - } - - $table->foreign('subuser_id')->references('id')->on('subusers')->onDelete('cascade'); - }); - Schema::table('subusers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['user_id']); - $table->dropForeign(['server_id']); - } + $table->dropForeign(['user_id']); + $table->dropForeign(['server_id']); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('server_id')->references('id')->on('servers')->onDelete('cascade'); @@ -36,21 +26,11 @@ public function up(): void public function down(): void { Schema::table('subusers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['user_id']); - $table->dropForeign(['server_id']); - } + $table->dropForeign(['user_id']); + $table->dropForeign(['server_id']); $table->foreign('user_id')->references('id')->on('users'); $table->foreign('server_id')->references('id')->on('servers'); }); - - Schema::table('permissions', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['subuser_id']); - } - - $table->foreign('subuser_id')->references('id')->on('subusers'); - }); } }; diff --git a/database/migrations/2017_07_08_154416_SetAllocationToReferenceNullOnServerDelete.php b/database/migrations/2017_07_08_154416_SetAllocationToReferenceNullOnServerDelete.php index 0d80e32a38..573ce9037e 100644 --- a/database/migrations/2017_07_08_154416_SetAllocationToReferenceNullOnServerDelete.php +++ b/database/migrations/2017_07_08_154416_SetAllocationToReferenceNullOnServerDelete.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['server_id']); - } + $table->dropForeign(['server_id']); $table->foreign('server_id')->references('id')->on('servers')->onDelete('set null'); }); @@ -26,9 +24,7 @@ public function up(): void public function down(): void { Schema::table('allocations', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['server_id']); - } + $table->dropForeign(['server_id']); $table->foreign('server_id')->references('id')->on('servers'); }); diff --git a/database/migrations/2017_07_08_154650_CascadeDeletionWhenAServerOrVariableIsDeleted.php b/database/migrations/2017_07_08_154650_CascadeDeletionWhenAServerOrVariableIsDeleted.php index 60320b1d9c..cb9deb41f0 100644 --- a/database/migrations/2017_07_08_154650_CascadeDeletionWhenAServerOrVariableIsDeleted.php +++ b/database/migrations/2017_07_08_154650_CascadeDeletionWhenAServerOrVariableIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['server_id']); - $table->dropForeign(['variable_id']); - } + $table->dropForeign(['server_id']); + $table->dropForeign(['variable_id']); $table->foreign('server_id')->references('id')->on('servers')->onDelete('cascade'); $table->foreign('variable_id')->references('id')->on('service_variables')->onDelete('cascade'); @@ -28,10 +26,8 @@ public function up(): void public function down(): void { Schema::table('server_variables', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['server_id']); - $table->dropForeign(['variable_id']); - } + $table->dropForeign(['server_id']); + $table->dropForeign(['variable_id']); $table->foreign('server_id')->references('id')->on('servers'); $table->foreign('variable_id')->references('id')->on('service_variables'); diff --git a/database/migrations/2017_07_24_194433_DeleteTaskWhenParentServerIsDeleted.php b/database/migrations/2017_07_24_194433_DeleteTaskWhenParentServerIsDeleted.php index f3b0b0e2bb..2d8303d6d4 100644 --- a/database/migrations/2017_07_24_194433_DeleteTaskWhenParentServerIsDeleted.php +++ b/database/migrations/2017_07_24_194433_DeleteTaskWhenParentServerIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['server_id']); - } + $table->dropForeign(['server_id']); $table->foreign('server_id')->references('id')->on('servers')->onDelete('cascade'); }); @@ -23,7 +21,5 @@ public function up(): void /** * Reverse the migrations. */ - public function down(): void - { - } + public function down(): void {} }; diff --git a/database/migrations/2017_08_05_115800_CascadeNullValuesForDatabaseHostWhenNodeIsDeleted.php b/database/migrations/2017_08_05_115800_CascadeNullValuesForDatabaseHostWhenNodeIsDeleted.php index 41b85372f2..ab97e2ee60 100644 --- a/database/migrations/2017_08_05_115800_CascadeNullValuesForDatabaseHostWhenNodeIsDeleted.php +++ b/database/migrations/2017_08_05_115800_CascadeNullValuesForDatabaseHostWhenNodeIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - } + $table->dropForeign(['node_id']); $table->foreign('node_id')->references('id')->on('nodes')->onDelete('set null'); }); } @@ -25,9 +23,7 @@ public function up(): void public function down(): void { Schema::table('database_hosts', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - } + $table->dropForeign(['node_id']); $table->foreign('node_id')->references('id')->on('nodes'); }); } diff --git a/database/migrations/2017_08_05_144104_AllowNegativeValuesForOverallocation.php b/database/migrations/2017_08_05_144104_AllowNegativeValuesForOverallocation.php index 2072a3f181..c958d90512 100644 --- a/database/migrations/2017_08_05_144104_AllowNegativeValuesForOverallocation.php +++ b/database/migrations/2017_08_05_144104_AllowNegativeValuesForOverallocation.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - } + $table->dropForeign(['node_id']); $table->dropUnique(['node_id', 'ip', 'port']); $table->foreign('node_id')->references('id')->on('nodes'); }); diff --git a/database/migrations/2017_08_15_214555_CascadeDeletionWhenAParentServiceIsDeleted.php b/database/migrations/2017_08_15_214555_CascadeDeletionWhenAParentServiceIsDeleted.php index a7ffe4042a..b997800d4d 100644 --- a/database/migrations/2017_08_15_214555_CascadeDeletionWhenAParentServiceIsDeleted.php +++ b/database/migrations/2017_08_15_214555_CascadeDeletionWhenAParentServiceIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['service_id']); - } + $table->dropForeign(['service_id']); $table->foreign('service_id')->references('id')->on('services')->onDelete('cascade'); }); @@ -26,9 +24,7 @@ public function up(): void public function down(): void { Schema::table('service_options', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['service_id']); - } + $table->dropForeign(['service_id']); $table->foreign('service_id')->references('id')->on('services'); }); diff --git a/database/migrations/2017_08_18_215428_RemovePackWhenParentServiceOptionIsDeleted.php b/database/migrations/2017_08_18_215428_RemovePackWhenParentServiceOptionIsDeleted.php index d4f1dab114..7fb1d65843 100644 --- a/database/migrations/2017_08_18_215428_RemovePackWhenParentServiceOptionIsDeleted.php +++ b/database/migrations/2017_08_18_215428_RemovePackWhenParentServiceOptionIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } + $table->dropForeign(['option_id']); $table->foreign('option_id')->references('id')->on('service_options')->onDelete('cascade'); }); @@ -26,9 +24,8 @@ public function up(): void public function down(): void { Schema::table('packs', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } + $table->dropForeign(['option_id']); + $table->foreign('option_id')->references('id')->on('service_options'); }); } diff --git a/database/migrations/2017_09_10_225749_RenameTasksTableForStructureRefactor.php b/database/migrations/2017_09_10_225749_RenameTasksTableForStructureRefactor.php index 9ecd88f5e1..3a63d7778a 100644 --- a/database/migrations/2017_09_10_225749_RenameTasksTableForStructureRefactor.php +++ b/database/migrations/2017_09_10_225749_RenameTasksTableForStructureRefactor.php @@ -1,7 +1,7 @@ where('permission', 'like', '%-task%')->get(); - foreach ($permissions as $record) { - $parts = explode('-', $record->permission); - if (!in_array(array_get($parts, 1), ['tasks', 'task']) || count($parts) !== 2) { - continue; - } - - $newPermission = $parts[0] . '-' . str_replace('task', 'schedule', $parts[1]); - - DB::table('permissions')->where('id', '=', $record->id)->update(['permission' => $newPermission]); - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - $permissions = DB::table('permissions')->where('permission', 'like', '%-schedule%')->get(); - foreach ($permissions as $record) { - $parts = explode('-', $record->permission); - if (!in_array(array_get($parts, 1), ['schedules', 'schedule']) || count($parts) !== 2) { - continue; - } - - $newPermission = $parts[0] . '-' . str_replace('schedule', 'task', $parts[1]); - - DB::table('permissions')->where('id', '=', $record->id)->update(['permission' => $newPermission]); - } - } -}; diff --git a/database/migrations/2017_09_23_170933_CreateDaemonKeysTable.php b/database/migrations/2017_09_23_170933_CreateDaemonKeysTable.php index 114ff9afed..422d770017 100644 --- a/database/migrations/2017_09_23_170933_CreateDaemonKeysTable.php +++ b/database/migrations/2017_09_23_170933_CreateDaemonKeysTable.php @@ -1,8 +1,8 @@ $server->owner_id, 'server_id' => $server->id, - 'secret' => DaemonKeyRepositoryInterface::INTERNAL_KEY_IDENTIFIER . str_random(40), + 'secret' => DaemonKeyRepositoryInterface::INTERNAL_KEY_IDENTIFIER . Str::random(40), 'expires_at' => Carbon::now()->addMinutes(config('panel.api.key_expire_time', 720))->toDateTimeString(), 'created_at' => Carbon::now()->toDateTimeString(), 'updated_at' => Carbon::now()->toDateTimeString(), @@ -44,7 +45,7 @@ public function up(): void public function down(): void { Schema::table('servers', function (Blueprint $table) { - $table->char('daemonSecret', 36)->after('startup')->unique(); + $table->string('daemonSecret', 36)->after('startup')->unique(); }); DB::table('daemon_keys')->truncate(); diff --git a/database/migrations/2017_09_23_185022_RemoveDaemonSecretFromSubusersTable.php b/database/migrations/2017_09_23_185022_RemoveDaemonSecretFromSubusersTable.php index 9090be4072..aeb428670f 100644 --- a/database/migrations/2017_09_23_185022_RemoveDaemonSecretFromSubusersTable.php +++ b/database/migrations/2017_09_23_185022_RemoveDaemonSecretFromSubusersTable.php @@ -1,10 +1,11 @@ $subuser->user_id, 'server_id' => $subuser->server_id, - 'secret' => DaemonKeyRepositoryInterface::INTERNAL_KEY_IDENTIFIER . str_random(40), + 'secret' => DaemonKeyRepositoryInterface::INTERNAL_KEY_IDENTIFIER . Str::random(40), 'expires_at' => Carbon::now()->addMinutes(config('panel.api.key_expire_time', 720))->toDateTimeString(), 'created_at' => Carbon::now()->toDateTimeString(), 'updated_at' => Carbon::now()->toDateTimeString(), @@ -42,7 +43,7 @@ public function up(): void public function down(): void { Schema::table('subusers', function (Blueprint $table) { - $table->char('daemonSecret', 36)->after('server_id'); + $table->string('daemonSecret', 36)->after('server_id'); }); $subusers = DB::table('subusers')->get(); diff --git a/database/migrations/2017_10_02_202000_ChangeServicesToUseAMoreUniqueIdentifier.php b/database/migrations/2017_10_02_202000_ChangeServicesToUseAMoreUniqueIdentifier.php index 3ffe5a866a..60b0e0da63 100644 --- a/database/migrations/2017_10_02_202000_ChangeServicesToUseAMoreUniqueIdentifier.php +++ b/database/migrations/2017_10_02_202000_ChangeServicesToUseAMoreUniqueIdentifier.php @@ -1,10 +1,10 @@ dropUnique(['file']); $table->string('author')->change(); - $table->char('uuid', 36)->after('id'); + $table->string('uuid', 36)->nullable()->after('id'); $table->dropColumn('folder'); $table->dropColumn('startup'); $table->dropColumn('index_file'); diff --git a/database/migrations/2017_10_02_202007_ChangeToABetterUniqueServiceConfiguration.php b/database/migrations/2017_10_02_202007_ChangeToABetterUniqueServiceConfiguration.php index 92d86500e6..e226ed4926 100644 --- a/database/migrations/2017_10_02_202007_ChangeToABetterUniqueServiceConfiguration.php +++ b/database/migrations/2017_10_02_202007_ChangeToABetterUniqueServiceConfiguration.php @@ -1,10 +1,11 @@ char('uuid', 36)->after('id'); - $table->string('author')->after('service_id'); + $table->string('uuid', 36)->nullable()->after('id'); + $table->string('author')->nullable()->after('service_id'); $table->dropColumn('tag'); }); @@ -51,7 +52,7 @@ public function down(): void DB::transaction(function () { DB::table('service_options')->select(['id', 'tag'])->get()->each(function ($option) { DB::table('service_options')->where('id', $option->id)->update([ - 'tag' => str_random(10), + 'tag' => Str::random(10), ]); }); }); diff --git a/database/migrations/2017_10_03_233202_CascadeDeletionWhenServiceOptionIsDeleted.php b/database/migrations/2017_10_03_233202_CascadeDeletionWhenServiceOptionIsDeleted.php index effef871e1..40484e621e 100644 --- a/database/migrations/2017_10_03_233202_CascadeDeletionWhenServiceOptionIsDeleted.php +++ b/database/migrations/2017_10_03_233202_CascadeDeletionWhenServiceOptionIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } + $table->dropForeign(['option_id']); $table->foreign('option_id')->references('id')->on('service_options')->onDelete('CASCADE'); }); @@ -26,9 +24,7 @@ public function up(): void public function down(): void { Schema::table('service_variables', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } + $table->dropForeign(['option_id']); $table->foreign('option_id')->references('id')->on('service_options'); }); diff --git a/database/migrations/2017_10_06_214026_ServicesToNestsConversion.php b/database/migrations/2017_10_06_214026_ServicesToNestsConversion.php index 496e18d6ce..c43cfd4d22 100644 --- a/database/migrations/2017_10_06_214026_ServicesToNestsConversion.php +++ b/database/migrations/2017_10_06_214026_ServicesToNestsConversion.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['service_id']); - } + $table->dropForeign(['service_id']); + $table->renameColumn('service_id', 'nest_id'); $table->foreign('nest_id')->references('id')->on('nests'); }); Schema::table('service_options', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['service_id']); - } + $table->dropForeign(['service_id']); + $table->renameColumn('service_id', 'nest_id'); $table->foreign('nest_id')->references('id')->on('nests')->onDelete('CASCADE'); @@ -46,18 +44,16 @@ public function down(): void Schema::rename('nests', 'services'); Schema::table('servers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['nest_id']); - } + $table->dropForeign(['nest_id']); + $table->renameColumn('nest_id', 'service_id'); $table->foreign('service_id')->references('id')->on('services'); }); Schema::table('service_options', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['nest_id']); - } + $table->dropForeign(['nest_id']); + $table->renameColumn('nest_id', 'service_id'); $table->foreign('service_id')->references('id')->on('services')->onDelete('CASCADE'); diff --git a/database/migrations/2017_10_06_214053_ServiceOptionsToEggsConversion.php b/database/migrations/2017_10_06_214053_ServiceOptionsToEggsConversion.php index d49c2fc981..f7727acb43 100644 --- a/database/migrations/2017_10_06_214053_ServiceOptionsToEggsConversion.php +++ b/database/migrations/2017_10_06_214053_ServiceOptionsToEggsConversion.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - Schema::table('service_options', function (Blueprint $table) { - $table->dropForeign(['config_from']); - $table->dropForeign(['copy_script_from']); - }); - } + Schema::table('service_options', function (Blueprint $table) { + $table->dropForeign(['config_from']); + $table->dropForeign(['copy_script_from']); + }); Schema::rename('service_options', 'eggs'); Schema::table('packs', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } + $table->dropForeign(['option_id']); $table->renameColumn('option_id', 'egg_id'); $table->foreign('egg_id')->references('id')->on('eggs')->onDelete('CASCADE'); }); Schema::table('servers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } + $table->dropForeign(['option_id']); $table->renameColumn('option_id', 'egg_id'); $table->foreign('egg_id')->references('id')->on('eggs'); @@ -46,10 +40,7 @@ public function up(): void }); Schema::table('service_variables', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['option_id']); - } - + $table->dropForeign(['option_id']); $table->renameColumn('option_id', 'egg_id'); $table->foreign('egg_id')->references('id')->on('eggs')->onDelete('CASCADE'); @@ -65,28 +56,22 @@ public function down(): void { Schema::disableForeignKeyConstraints(); - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - Schema::table('eggs', function (Blueprint $table) { - $table->dropForeign(['config_from']); - $table->dropForeign(['copy_script_from']); - }); - } + Schema::table('eggs', function (Blueprint $table) { + $table->dropForeign(['config_from']); + $table->dropForeign(['copy_script_from']); + }); Schema::rename('eggs', 'service_options'); Schema::table('packs', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['egg_id']); - } + $table->dropForeign(['egg_id']); $table->renameColumn('egg_id', 'option_id'); $table->foreign('option_id')->references('id')->on('service_options')->onDelete('CASCADE'); }); Schema::table('servers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['egg_id']); - } + $table->dropForeign(['egg_id']); $table->renameColumn('egg_id', 'option_id'); $table->foreign('option_id')->references('id')->on('service_options'); @@ -98,9 +83,7 @@ public function down(): void }); Schema::table('service_variables', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['egg_id']); - } + $table->dropForeign(['egg_id']); $table->renameColumn('egg_id', 'option_id'); $table->foreign('option_id')->references('id')->on('options')->onDelete('CASCADE'); diff --git a/database/migrations/2017_10_06_215741_ServiceVariablesToEggVariablesConversion.php b/database/migrations/2017_10_06_215741_ServiceVariablesToEggVariablesConversion.php index 8b4b0ff375..9db779ee3c 100644 --- a/database/migrations/2017_10_06_215741_ServiceVariablesToEggVariablesConversion.php +++ b/database/migrations/2017_10_06_215741_ServiceVariablesToEggVariablesConversion.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['variable_id']); - } + $table->dropForeign(['variable_id']); $table->foreign('variable_id')->references('id')->on('egg_variables')->onDelete('CASCADE'); }); @@ -36,9 +34,7 @@ public function down(): void Schema::rename('egg_variables', 'service_variables'); Schema::table('server_variables', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['variable_id']); - } + $table->dropForeign(['variable_id']); $table->foreign('variable_id')->references('id')->on('service_variables')->onDelete('CASCADE'); }); diff --git a/database/migrations/2017_10_24_222238_RemoveLegacySFTPInformation.php b/database/migrations/2017_10_24_222238_RemoveLegacySFTPInformation.php index 1aef77e19d..3f25225700 100644 --- a/database/migrations/2017_10_24_222238_RemoveLegacySFTPInformation.php +++ b/database/migrations/2017_10_24_222238_RemoveLegacySFTPInformation.php @@ -1,8 +1,8 @@ secret); } catch (DecryptException $exception) { - $decrypted = str_random(32); + $decrypted = Str::random(32); } finally { DB::table('api_keys')->where('id', $item->id)->update([ 'secret' => $decrypted, @@ -31,13 +32,22 @@ public function up(): void if (Schema::getConnection()->getDriverName() === 'sqlite') { Schema::table('api_keys', function (Blueprint $table) { $table->dropColumn('public'); - $table->char('secret', 32)->change(); + $table->string('secret', 32)->change(); $table->renameColumn('secret', 'token'); $table->string('token', 32)->unique()->change(); }); - } + } elseif (Schema::getConnection()->getDriverName() === 'pgsql') { + // Rename column 'secret' to 'token' + DB::statement('ALTER TABLE api_keys RENAME COLUMN secret TO token'); + + // Change data type of 'token' to CHAR(32) and set NOT NULL constraint + DB::statement('ALTER TABLE api_keys ALTER COLUMN token TYPE CHAR(32)'); + DB::statement('ALTER TABLE api_keys ALTER COLUMN token SET NOT NULL'); + + // Add unique constraint on 'token' + DB::statement('ALTER TABLE api_keys ADD CONSTRAINT api_keys_token_unique UNIQUE (token)'); - if (Schema::getConnection()->getDriverName() !== 'sqlite') { + } else { DB::statement('ALTER TABLE `api_keys` CHANGE `secret` `token` CHAR(32) NOT NULL, ADD UNIQUE INDEX `api_keys_token_unique` (`token`(32))'); } @@ -51,13 +61,13 @@ public function down(): void DB::statement('ALTER TABLE `api_keys` CHANGE `token` `secret` TEXT, DROP INDEX `api_keys_token_unique`'); Schema::table('api_keys', function (Blueprint $table) { - $table->char('public', 16)->after('user_id'); + $table->string('public', 16)->after('user_id'); }); DB::transaction(function () { DB::table('api_keys')->get()->each(function ($item) { DB::table('api_keys')->where('id', $item->id)->update([ - 'public' => str_random(16), + 'public' => Str::random(16), 'secret' => Crypt::encrypt($item->secret), ]); }); diff --git a/database/migrations/2017_12_04_184012_DropAllocationsWhenNodeIsDeleted.php b/database/migrations/2017_12_04_184012_DropAllocationsWhenNodeIsDeleted.php index ccb4925d4e..9b4d50269d 100644 --- a/database/migrations/2017_12_04_184012_DropAllocationsWhenNodeIsDeleted.php +++ b/database/migrations/2017_12_04_184012_DropAllocationsWhenNodeIsDeleted.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - } + $table->dropForeign(['node_id']); $table->foreign('node_id')->references('id')->on('nodes')->onDelete('cascade'); }); @@ -26,9 +24,7 @@ public function up(): void public function down(): void { Schema::table('allocations', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['node_id']); - } + $table->dropForeign(['node_id']); $table->foreign('node_id')->references('id')->on('nodes'); }); diff --git a/database/migrations/2017_12_12_220426_MigrateSettingsTableToNewFormat.php b/database/migrations/2017_12_12_220426_MigrateSettingsTableToNewFormat.php index 3f9d96f95c..830af52695 100644 --- a/database/migrations/2017_12_12_220426_MigrateSettingsTableToNewFormat.php +++ b/database/migrations/2017_12_12_220426_MigrateSettingsTableToNewFormat.php @@ -1,8 +1,8 @@ char('identifier', 16)->nullable()->unique()->after('user_id'); + $table->string('identifier', 16)->nullable()->unique()->after('user_id'); $table->dropUnique(['token']); }); diff --git a/database/migrations/2018_01_13_145209_AddLastUsedAtColumn.php b/database/migrations/2018_01_13_145209_AddLastUsedAtColumn.php index 2227864a7a..2d4ea87425 100644 --- a/database/migrations/2018_01_13_145209_AddLastUsedAtColumn.php +++ b/database/migrations/2018_01_13_145209_AddLastUsedAtColumn.php @@ -1,8 +1,8 @@ timestamp('last_used_at')->after('memo')->nullable(); $table->dropColumn('expires_at'); - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['user_id']); - } + $table->dropForeign(['user_id']); }); Schema::table('api_keys', function (Blueprint $table) { @@ -35,9 +33,7 @@ public function down(): void $table->timestamp('expires_at')->after('memo')->nullable(); $table->dropColumn('last_used_at', 'key_type'); - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign(['user_id']); - } + $table->dropForeign(['user_id']); }); Schema::table('api_keys', function (Blueprint $table) { diff --git a/database/migrations/2018_02_04_145617_AllowTextInUserExternalId.php b/database/migrations/2018_02_04_145617_AllowTextInUserExternalId.php index b1457b85e1..f199046889 100644 --- a/database/migrations/2018_02_04_145617_AllowTextInUserExternalId.php +++ b/database/migrations/2018_02_04_145617_AllowTextInUserExternalId.php @@ -1,8 +1,8 @@ text('description')->after('name'); + $table->text('description')->nullable()->after('name'); }); } diff --git a/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php b/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php index 82453c75f5..498278cff3 100644 --- a/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php +++ b/database/migrations/2018_05_04_123826_add_maintenance_to_nodes.php @@ -1,8 +1,8 @@ P::ACTION_CONTROL_START, - 'power-stop' => P::ACTION_CONTROL_STOP, - 'power-restart' => P::ACTION_CONTROL_RESTART, - 'power-kill' => P::ACTION_CONTROL_STOP, - 'send-command' => P::ACTION_CONTROL_CONSOLE, - 'list-subusers' => P::ACTION_USER_READ, - 'view-subuser' => P::ACTION_USER_READ, - 'edit-subuser' => P::ACTION_USER_UPDATE, - 'create-subuser' => P::ACTION_USER_CREATE, - 'delete-subuser' => P::ACTION_USER_DELETE, - 'view-allocations' => P::ACTION_ALLOCATION_READ, - 'edit-allocation' => P::ACTION_ALLOCATION_UPDATE, - 'view-startup' => P::ACTION_STARTUP_READ, - 'edit-startup' => P::ACTION_STARTUP_UPDATE, - 'view-databases' => P::ACTION_DATABASE_READ, - // Better to just break this flow a bit than accidentally grant a dangerous permission. - 'reset-db-password' => P::ACTION_DATABASE_UPDATE, - 'delete-database' => P::ACTION_DATABASE_DELETE, - 'create-database' => P::ACTION_DATABASE_CREATE, - 'access-sftp' => P::ACTION_FILE_SFTP, - 'list-files' => P::ACTION_FILE_READ, - 'edit-files' => P::ACTION_FILE_READ_CONTENT, - 'save-files' => P::ACTION_FILE_UPDATE, - 'create-files' => P::ACTION_FILE_CREATE, - 'delete-files' => P::ACTION_FILE_DELETE, - 'compress-files' => P::ACTION_FILE_ARCHIVE, - 'list-schedules' => P::ACTION_SCHEDULE_READ, - 'view-schedule' => P::ACTION_SCHEDULE_READ, - 'edit-schedule' => P::ACTION_SCHEDULE_UPDATE, - 'create-schedule' => P::ACTION_SCHEDULE_CREATE, - 'delete-schedule' => P::ACTION_SCHEDULE_DELETE, - // Skipping these permissions as they are granted if you have more specific read/write permissions. - 'move-files' => null, - 'copy-files' => null, - 'decompress-files' => null, - 'upload-files' => null, - 'download-files' => null, - // These permissions do not exist in 1.0 - 'toggle-schedule' => null, - 'queue-schedule' => null, - ]; - /** * Run the migrations. */ @@ -67,31 +14,6 @@ public function up(): void Schema::table('subusers', function (Blueprint $table) { $table->json('permissions')->nullable()->after('server_id'); }); - - $cursor = DB::table('permissions') - ->select(['subuser_id']) - ->selectRaw('GROUP_CONCAT(permission) as permissions') - ->from('permissions') - ->groupBy(['subuser_id']) - ->cursor(); - - DB::transaction(function () use (&$cursor) { - $cursor->each(function ($datum) { - $updated = Collection::make(explode(',', $datum->permissions)) - ->map(function ($value) { - return self::$permissionsMap[$value] ?? null; - })->filter(function ($value) { - return !is_null($value) && $value !== Permission::ACTION_WEBSOCKET_CONNECT; - }) - // All subusers get this permission, so make sure it gets pushed into the array. - ->merge([Permission::ACTION_WEBSOCKET_CONNECT]) - ->unique() - ->values() - ->toJson(); - - DB::update('UPDATE subusers SET permissions = ? WHERE id = ?', [$updated, $datum->subuser_id]); - }); - }); } /** @@ -99,25 +21,6 @@ public function up(): void */ public function down(): void { - $flipped = array_flip(array_filter(self::$permissionsMap)); - - foreach (DB::select('SELECT id, permissions FROM subusers') as $datum) { - $values = []; - foreach (json_decode($datum->permissions, true) as $permission) { - $v = $flipped[$permission] ?? null; - if (!empty($v)) { - $values[] = $datum->id; - $values[] = $v; - } - } - - if (!empty($values)) { - $string = 'VALUES ' . implode(', ', array_fill(0, count($values) / 2, '(?, ?)')); - - DB::insert('INSERT INTO permissions(`subuser_id`, `permission`) ' . $string, $values); - } - } - Schema::table('subusers', function (Blueprint $table) { $table->dropColumn('permissions'); }); diff --git a/database/migrations/2020_03_22_164814_drop_permissions_table.php b/database/migrations/2020_03_22_164814_drop_permissions_table.php index ddbee3da17..fb52529dcb 100644 --- a/database/migrations/2020_03_22_164814_drop_permissions_table.php +++ b/database/migrations/2020_03_22_164814_drop_permissions_table.php @@ -1,8 +1,8 @@ bigIncrements('id'); $table->unsignedInteger('server_id'); - $table->char('uuid', 36); + $table->string('uuid', 36); $table->string('name'); $table->text('ignored_files'); $table->string('disk'); diff --git a/database/migrations/2020_04_04_131016_add_table_server_transfers.php b/database/migrations/2020_04_04_131016_add_table_server_transfers.php index a7f5e2f7b5..680f0d43a0 100644 --- a/database/migrations/2020_04_04_131016_add_table_server_transfers.php +++ b/database/migrations/2020_04_04_131016_add_table_server_transfers.php @@ -1,8 +1,8 @@ char('uuid', 36)->after('id'); - $table->char('daemon_token_id', 16)->after('upload_size'); + $table->string('uuid', 36)->nullable()->after('id'); + $table->string('daemon_token_id', 16)->nullable()->after('upload_size'); $table->renameColumn('daemonSecret', 'daemon_token'); }); diff --git a/database/migrations/2020_04_17_203438_allow_nullable_descriptions.php b/database/migrations/2020_04_17_203438_allow_nullable_descriptions.php index bec3ea1ca2..07e0db814c 100644 --- a/database/migrations/2020_04_17_203438_allow_nullable_descriptions.php +++ b/database/migrations/2020_04_17_203438_allow_nullable_descriptions.php @@ -1,8 +1,8 @@ increments('id')->unique(); - $table->char('uuid', 36)->unique(); + $table->string('uuid', 36)->unique(); $table->string('name')->unique(); $table->text('description')->nullable(); $table->string('source'); diff --git a/database/migrations/2020_05_21_192756_add_mount_server_table.php b/database/migrations/2020_05_21_192756_add_mount_server_table.php index f9287e7b4b..3e121a20d5 100644 --- a/database/migrations/2020_05_21_192756_add_mount_server_table.php +++ b/database/migrations/2020_05_21_192756_add_mount_server_table.php @@ -1,8 +1,8 @@ getDriverName() !== 'sqlite') { - $table->dropForeign(['pack_id']); - } - + $table->dropForeign(['pack_id']); $table->dropColumn('pack_id'); }); } diff --git a/database/migrations/2020_09_13_110021_drop_packs_from_api_key_permissions.php b/database/migrations/2020_09_13_110021_drop_packs_from_api_key_permissions.php index f25659fecb..a7a16809a6 100644 --- a/database/migrations/2020_09_13_110021_drop_packs_from_api_key_permissions.php +++ b/database/migrations/2020_09_13_110021_drop_packs_from_api_key_permissions.php @@ -1,8 +1,8 @@ increments('id'); $table->unsignedInteger('egg_id'); - $table->char('uuid', 36)->unique(); + $table->string('uuid', 36)->unique(); $table->string('name'); $table->string('version'); $table->text('description')->nullable(); diff --git a/database/migrations/2020_09_13_113503_drop_daemon_key_table.php b/database/migrations/2020_09_13_113503_drop_daemon_key_table.php index 635006c275..4baa33f58a 100644 --- a/database/migrations/2020_09_13_113503_drop_daemon_key_table.php +++ b/database/migrations/2020_09_13_113503_drop_daemon_key_table.php @@ -1,8 +1,8 @@ getDriverName() === 'pgsql') { + DB::statement('UPDATE eggs SET docker_images = json_build_array(docker_image)'); + } else { + DB::statement('UPDATE eggs SET docker_images = JSON_ARRAY(docker_image)'); + } }); Schema::table('eggs', function (Blueprint $table) { @@ -36,7 +40,7 @@ public function down(): void }); Schema::table('eggs', function (Blueprint $table) { - DB::statement('UPDATE `eggs` SET `docker_image` = JSON_UNQUOTE(JSON_EXTRACT(docker_images, "$[0]"))'); + DB::statement('UPDATE eggs SET docker_image = JSON_UNQUOTE(JSON_EXTRACT(docker_images, "$[0]"))'); }); Schema::table('eggs', function (Blueprint $table) { diff --git a/database/migrations/2020_12_14_013707_make_successful_nullable_in_server_transfers.php b/database/migrations/2020_12_14_013707_make_successful_nullable_in_server_transfers.php index c90e6a31d4..1128765a98 100644 --- a/database/migrations/2020_12_14_013707_make_successful_nullable_in_server_transfers.php +++ b/database/migrations/2020_12_14_013707_make_successful_nullable_in_server_transfers.php @@ -1,8 +1,9 @@ getDriverName() === 'pgsql') { + // Drop existing default first + DB::statement('ALTER TABLE server_transfers ALTER COLUMN successful DROP DEFAULT'); + + // Change type to boolean explicitly casting smallint values + DB::statement('ALTER TABLE server_transfers ALTER COLUMN successful TYPE BOOLEAN USING (successful <> 0)'); + + // Set column nullable if desired + DB::statement('ALTER TABLE server_transfers ALTER COLUMN successful DROP NOT NULL'); + + return; + } + Schema::table('server_transfers', function (Blueprint $table) { $table->boolean('successful')->nullable()->default(null)->change(); }); @@ -21,6 +35,17 @@ public function up(): void */ public function down(): void { + if (Schema::getConnection()->getDriverName() === 'pgsql') { + // Convert boolean back to smallint + DB::statement('ALTER TABLE server_transfers ALTER COLUMN successful TYPE SMALLINT USING (CASE WHEN successful THEN 1 ELSE 0 END)'); + + // Restore previous defaults and constraints + DB::statement('ALTER TABLE server_transfers ALTER COLUMN successful SET DEFAULT 0'); + DB::statement('ALTER TABLE server_transfers ALTER COLUMN successful SET NOT NULL'); + + return; + } + Schema::table('server_transfers', function (Blueprint $table) { $table->boolean('successful')->default(0)->change(); }); diff --git a/database/migrations/2020_12_17_014330_add_archived_field_to_server_transfers_table.php b/database/migrations/2020_12_17_014330_add_archived_field_to_server_transfers_table.php index e11be7d3ea..5fca7618a6 100644 --- a/database/migrations/2020_12_17_014330_add_archived_field_to_server_transfers_table.php +++ b/database/migrations/2020_12_17_014330_add_archived_field_to_server_transfers_table.php @@ -1,9 +1,9 @@ where('successful', 1)->update(['archived' => 1]); }); } diff --git a/database/migrations/2020_12_24_092449_make_allocation_fields_json.php b/database/migrations/2020_12_24_092449_make_allocation_fields_json.php index 1fb88bb051..ee4c49ed2b 100644 --- a/database/migrations/2020_12_24_092449_make_allocation_fields_json.php +++ b/database/migrations/2020_12_24_092449_make_allocation_fields_json.php @@ -1,8 +1,8 @@ getDriverName() === 'pgsql') { + Schema::table('server_transfers', function (Blueprint $table) { + DB::statement('ALTER TABLE server_transfers ALTER COLUMN old_additional_allocations TYPE JSON USING old_additional_allocations::json'); + DB::statement('ALTER TABLE server_transfers ALTER COLUMN new_additional_allocations TYPE JSON USING new_additional_allocations::json'); + }); + + return; + } + Schema::table('server_transfers', function (Blueprint $table) { $table->json('old_additional_allocations')->nullable()->change(); $table->json('new_additional_allocations')->nullable()->change(); diff --git a/database/migrations/2020_12_26_184914_add_upload_id_column_to_backups_table.php b/database/migrations/2020_12_26_184914_add_upload_id_column_to_backups_table.php index 9db7e25822..d967d6a22d 100644 --- a/database/migrations/2020_12_26_184914_add_upload_id_column_to_backups_table.php +++ b/database/migrations/2020_12_26_184914_add_upload_id_column_to_backups_table.php @@ -1,8 +1,8 @@ text('file_denylist')->after('docker_images'); + $table->text('file_denylist')->nullable()->after('docker_images'); }); } diff --git a/database/migrations/2021_01_13_013420_add_cron_month.php b/database/migrations/2021_01_13_013420_add_cron_month.php index 7868460270..96dbba8a51 100644 --- a/database/migrations/2021_01_13_013420_add_cron_month.php +++ b/database/migrations/2021_01_13_013420_add_cron_month.php @@ -1,8 +1,8 @@ string('cron_month')->after('cron_day_of_week'); + $table->string('cron_month')->nullable()->after('cron_day_of_week'); }); } diff --git a/database/migrations/2021_01_17_102401_create_audit_logs_table.php b/database/migrations/2021_01_17_102401_create_audit_logs_table.php index 43b02d63f3..de1319932c 100644 --- a/database/migrations/2021_01_17_102401_create_audit_logs_table.php +++ b/database/migrations/2021_01_17_102401_create_audit_logs_table.php @@ -1,8 +1,8 @@ id(); - $table->char('uuid', 36); + $table->string('uuid', 36); $table->boolean('is_system')->default(false); $table->unsignedInteger('user_id')->nullable(); $table->unsignedInteger('server_id')->nullable(); diff --git a/database/migrations/2021_01_17_152623_add_generic_server_status_column.php b/database/migrations/2021_01_17_152623_add_generic_server_status_column.php index b864ee6286..a23649fa6d 100644 --- a/database/migrations/2021_01_17_152623_add_generic_server_status_column.php +++ b/database/migrations/2021_01_17_152623_add_generic_server_status_column.php @@ -1,9 +1,9 @@ where('suspended', 1)->update(['status' => 'suspended']); + DB::table('servers')->where('suspended', 0)->update(['status' => 'installing']); + DB::table('servers')->where('suspended', 2)->update(['status' => 'install_failed']); }); Schema::table('servers', function (Blueprint $table) { diff --git a/database/migrations/2021_01_26_210502_update_file_denylist_to_json.php b/database/migrations/2021_01_26_210502_update_file_denylist_to_json.php index ee8b3a2f7d..4392cd6a35 100644 --- a/database/migrations/2021_01_26_210502_update_file_denylist_to_json.php +++ b/database/migrations/2021_01_26_210502_update_file_denylist_to_json.php @@ -1,8 +1,8 @@ where('cron_month', '') + ->update(['cron_month' => '*']); }); } diff --git a/database/migrations/2021_05_01_092457_add_continue_on_failure_option_to_tasks.php b/database/migrations/2021_05_01_092457_add_continue_on_failure_option_to_tasks.php index c9bd003b82..1fba174eb4 100644 --- a/database/migrations/2021_05_01_092457_add_continue_on_failure_option_to_tasks.php +++ b/database/migrations/2021_05_01_092457_add_continue_on_failure_option_to_tasks.php @@ -1,8 +1,8 @@ getDriverName() === 'pgsql') { + DB::table('eggs')->update([ + 'config_startup' => DB::raw("config_startup::jsonb - 'userInteraction'"), + ]); + + return; + } + // Remove User Interaction from startup config DB::table('eggs')->update([ 'config_startup' => DB::raw('JSON_REMOVE(config_startup, \'$.userInteraction\')'), diff --git a/database/migrations/2021_07_17_211512_create_user_ssh_keys_table.php b/database/migrations/2021_07_17_211512_create_user_ssh_keys_table.php index 2351514394..0607adb72d 100644 --- a/database/migrations/2021_07_17_211512_create_user_ssh_keys_table.php +++ b/database/migrations/2021_07_17_211512_create_user_ssh_keys_table.php @@ -1,8 +1,8 @@ id(); - $table->char('batch', 36)->nullable(); + $table->string('batch', 36)->nullable(); $table->string('event')->index(); $table->string('ip'); $table->text('description')->nullable(); diff --git a/database/migrations/2022_05_29_140349_create_activity_log_actors_table.php b/database/migrations/2022_05_29_140349_create_activity_log_actors_table.php index 29a8bfc5e7..8b2b01dd77 100644 --- a/database/migrations/2022_05_29_140349_create_activity_log_actors_table.php +++ b/database/migrations/2022_05_29_140349_create_activity_log_actors_table.php @@ -1,8 +1,8 @@ keys, 0); - $oldSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $oldKeys)); - - // Gets the second column in our key table and gets all matching settings. - $newKeys = array_column($this->keys, 1); - $newSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $newKeys)); - - // Map all the old settings to their new key. - $oldSettings->map(function (Setting $setting) use ($oldKeys) { - $row = array_search($setting->key, $oldKeys, true); - $setting->key = $this->keys[$row][1]; - - return $setting; - // Check if any settings with the new key already exist. - })->filter(function (Setting $setting) use ($newSettings) { - if ($newSettings->contains('key', $setting->key)) { - return false; - } - - return true; - // Update the settings to use their new keys if they don't already exist. - })->each(fn (Setting $setting) => $setting->save()); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - DB::transaction(function () { - $settings = Setting::all(); - - // Gets the second column in our key table and gets all matching settings. - $newKeys = array_column($this->keys, 0); - $newSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $newKeys)); - - // Delete all settings that already have the new key. - $newSettings->each(fn (Setting $setting) => $setting->delete()); - - // Gets the first column in our key table and gets all matching settings. - $oldKeys = array_column($this->keys, 1); - $oldSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $oldKeys)); - - // Map all the old settings to their new key. - $oldSettings->map(function (Setting $setting) use ($oldKeys) { - $row = array_search($setting->key, $oldKeys, true); - $setting->key = $this->keys[$row][0]; - - return $setting; - // Update the settings to use their new keys if they don't already exist. - })->each(fn (Setting $setting) => $setting->save()); - }); - } -}; diff --git a/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php b/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php index 1de85b4200..758e06529e 100644 --- a/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php +++ b/database/migrations/2023_01_24_210051_add_uuid_column_to_failed_jobs_table.php @@ -1,11 +1,11 @@ text('tags'); + $table->text('tags')->nullable(); }); DB::table('eggs')->update(['tags' => '[]']); @@ -30,14 +30,15 @@ public function up(): void Schema::table('eggs', function (Blueprint $table) { if (Schema::getConnection()->getDriverName() !== 'sqlite') { $table->dropForeign('service_options_nest_id_foreign'); + } else { + $table->dropForeign(['nest_id']); } + $table->dropColumn('nest_id'); }); Schema::table('servers', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('servers_nest_id_foreign'); - } + $table->dropForeign(['nest_id']); $table->dropColumn('nest_id'); }); @@ -57,7 +58,7 @@ public function down(): void Schema::create('nests', function (Blueprint $table) { $table->increments('id'); - $table->char('uuid', 36)->unique(); + $table->string('uuid', 36)->unique(); $table->string('author'); $table->string('name'); $table->text('description')->nullable(); diff --git a/database/migrations/2024_03_14_055537_remove_locations_table.php b/database/migrations/2024_03_14_055537_remove_locations_table.php index f06ded66fd..5bbaf4ee52 100644 --- a/database/migrations/2024_03_14_055537_remove_locations_table.php +++ b/database/migrations/2024_03_14_055537_remove_locations_table.php @@ -10,7 +10,7 @@ public function up(): void { Schema::table('nodes', function (Blueprint $table) { - $table->text('tags'); + $table->text('tags')->nullable(); }); DB::table('nodes')->update(['tags' => '[]']); @@ -27,10 +27,7 @@ public function up(): void } Schema::table('nodes', function (Blueprint $table) { - if (Schema::getConnection()->getDriverName() !== 'sqlite') { - $table->dropForeign('nodes_location_id_foreign'); - } - + $table->dropForeign(['location_id']); $table->dropColumn('location_id'); }); diff --git a/database/migrations/2024_04_14_002250_update_column_names.php b/database/migrations/2024_04_14_002250_update_column_names.php index 21303f36b8..44f3df3f45 100644 --- a/database/migrations/2024_04_14_002250_update_column_names.php +++ b/database/migrations/2024_04_14_002250_update_column_names.php @@ -1,8 +1,8 @@ id(); + $table->string('endpoint'); + $table->string('description'); + $table->json('events'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhook_configurations'); + } +}; diff --git a/database/migrations/2024_04_21_162552_create_webhooks_table.php b/database/migrations/2024_04_21_162552_create_webhooks_table.php new file mode 100644 index 0000000000..a7565e041a --- /dev/null +++ b/database/migrations/2024_04_21_162552_create_webhooks_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignIdFor(\App\Models\WebhookConfiguration::class)->constrained(); + $table->string('event'); + $table->string('endpoint'); + $table->timestamp('successful_at')->nullable(); + $table->json('payload'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhooks'); + } +}; diff --git a/database/migrations/2024_05_08_094823_rename_oom_disabled_column_to_oom_killer.php b/database/migrations/2024_05_08_094823_rename_oom_disabled_column_to_oom_killer.php index 4e941db28f..f3c770332a 100644 --- a/database/migrations/2024_05_08_094823_rename_oom_disabled_column_to_oom_killer.php +++ b/database/migrations/2024_05_08_094823_rename_oom_disabled_column_to_oom_killer.php @@ -1,9 +1,9 @@ getDriverName() !== 'sqlite') { - return; - } - - // Disable foreign checks - // legacy_alter_table needs to be 'ON' so existing foreign key table references aren't renamed when renaming the table, see https://www.sqlite.org/lang_altertable.html - DB::statement('PRAGMA foreign_keys = OFF'); - DB::statement('PRAGMA legacy_alter_table = ON'); - - DB::transaction(function () { - // api_keys_user_id_foreign - DB::statement('ALTER TABLE api_keys RENAME TO _api_keys_old'); - DB::statement('CREATE TABLE api_keys - ("id" integer primary key autoincrement not null, - "token" text not null, - "allowed_ips" text not null, - "created_at" datetime, - "updated_at" datetime, - "user_id" integer not null, - "memo" text, - "r_servers" integer not null default \'0\', - "r_nodes" integer not null default \'0\', - "r_allocations" integer not null default \'0\', - "r_users" integer not null default \'0\', - "r_eggs" integer not null default \'0\', - "r_database_hosts" integer not null default \'0\', - "r_server_databases" integer not null default \'0\', - "identifier" varchar, - "key_type" integer not null default \'0\', - "last_used_at" datetime, - "expires_at" datetime, - "r_mounts" integer not null default \'0\', - foreign key("user_id") references "users"("id") on delete cascade)'); - DB::statement('INSERT INTO api_keys SELECT * FROM _api_keys_old'); - DB::statement('DROP TABLE _api_keys_old'); - DB::statement('CREATE UNIQUE INDEX "api_keys_identifier_unique" on "api_keys" ("identifier")'); - - // database_hosts_node_id_foreign - DB::statement('ALTER TABLE database_hosts RENAME TO _database_hosts_old'); - DB::statement('CREATE TABLE database_hosts - ("id" integer primary key autoincrement not null, - "name" varchar not null, - "host" varchar not null, - "port" integer not null, - "username" varchar not null, - "password" text not null, - "max_databases" integer, - "node_id" integer, - "created_at" datetime, - "updated_at" datetime, - foreign key("node_id") references "nodes"("id") on delete set null)'); - DB::statement('INSERT INTO database_hosts SELECT * FROM _database_hosts_old'); - DB::statement('DROP TABLE _database_hosts_old'); - - // mount_node_node_id_foreign - // mount_node_mount_id_foreign - DB::statement('ALTER TABLE mount_node RENAME TO _mount_node_old'); - DB::statement('CREATE TABLE mount_node - ("node_id" integer not null, - "mount_id" integer not null, - foreign key("node_id") references "nodes"("id") on delete cascade on update cascade, - foreign key("mount_id") references "mounts"("id") on delete cascade on update cascade)'); - DB::statement('INSERT INTO mount_node SELECT * FROM _mount_node_old'); - DB::statement('DROP TABLE _mount_node_old'); - DB::statement('CREATE UNIQUE INDEX "mount_node_node_id_mount_id_unique" on "mount_node" ("node_id", "mount_id")'); - - // servers_node_id_foreign - // servers_owner_id_foreign - // servers_egg_id_foreign - // servers_allocation_id_foreign - DB::statement('ALTER TABLE servers RENAME TO _servers_old'); - DB::statement('CREATE TABLE servers - ("id" integer primary key autoincrement not null, - "uuid" varchar not null, - "uuid_short" varchar not null, - "node_id" integer not null, - "name" varchar not null, - "owner_id" integer not null, - "memory" integer not null, - "swap" integer not null, - "disk" integer not null, - "io" integer not null, - "cpu" integer not null, - "egg_id" integer not null, - "startup" text not null, - "created_at" datetime, - "updated_at" datetime, - "allocation_id" integer not null, - "image" varchar not null, - "description" text not null, - "skip_scripts" tinyint(1) not null default \'0\', - "external_id" varchar, - "database_limit" integer default \'0\', - "allocation_limit" integer, - "threads" varchar, - "backup_limit" integer not null default \'0\', - "status" varchar, - "installed_at" datetime, - "oom_killer" integer not null default \'0\', - "docker_labels" text, - foreign key("node_id") references "nodes"("id"), - foreign key("owner_id") references "users"("id"), - foreign key("egg_id") references "eggs"("id"), - foreign key("allocation_id") references "allocations"("id"))'); - DB::statement('INSERT INTO servers SELECT * FROM _servers_old'); - DB::statement('DROP TABLE _servers_old'); - DB::statement('CREATE UNIQUE INDEX "servers_allocation_id_unique" on "servers" ("allocation_id")'); - DB::statement('CREATE UNIQUE INDEX "servers_external_id_unique" on "servers" ("external_id")'); - DB::statement('CREATE UNIQUE INDEX "servers_uuid_unique" on "servers" ("uuid")'); - DB::statement('CREATE UNIQUE INDEX "servers_uuidshort_unique" on "servers" ("uuid_short")'); - - // databases_server_id_foreign - // databases_database_host_id_foreign - DB::statement('ALTER TABLE databases RENAME TO _databases_old'); - DB::statement('CREATE TABLE databases - ("id" integer primary key autoincrement not null, - "server_id" integer not null, - "database_host_id" integer not null, - "database" varchar not null, - "username" varchar not null, - "remote" varchar not null default \'%\', - "password" text not null, - "created_at" datetime, - "updated_at" datetime, - "max_connections" integer default \'0\', - foreign key("server_id") references "servers"("id"), - foreign key("database_host_id") references "database_hosts"("id"))'); - DB::statement('INSERT INTO databases SELECT * FROM _databases_old'); - DB::statement('DROP TABLE _databases_old'); - DB::statement('CREATE UNIQUE INDEX "databases_database_host_id_server_id_database_unique" on "databases" ("database_host_id", "server_id", "database")'); - DB::statement('CREATE UNIQUE INDEX "databases_database_host_id_username_unique" on "databases" ("database_host_id", "username")'); - - // allocations_node_id_foreign - // allocations_server_id_foreign - DB::statement('ALTER TABLE allocations RENAME TO _allocations_old'); - DB::statement('CREATE TABLE allocations - ("id" integer primary key autoincrement not null, - "node_id" integer not null, - "ip" varchar not null, - "port" integer not null, - "server_id" integer, - "created_at" datetime, - "updated_at" datetime, - "ip_alias" text, - "notes" varchar, - foreign key("node_id") references "nodes"("id") on delete cascade, - foreign key("server_id") references "servers"("id") on delete cascade on update set null)'); - DB::statement('INSERT INTO allocations SELECT * FROM _allocations_old'); - DB::statement('DROP TABLE _allocations_old'); - DB::statement('CREATE UNIQUE INDEX "allocations_node_id_ip_port_unique" on "allocations" ("node_id", "ip", "port")'); - - // eggs_config_from_foreign - // eggs_copy_script_from_foreign - DB::statement('ALTER TABLE eggs RENAME TO _eggs_old'); - DB::statement('CREATE TABLE eggs - ("id" integer primary key autoincrement not null, - "name" varchar not null, - "description" text, - "created_at" datetime, - "updated_at" datetime, - "startup" text, - "config_from" integer, - "config_stop" varchar, - "config_logs" text, - "config_startup" text, - "config_files" text, - "script_install" text, - "script_is_privileged" tinyint(1) not null default \'1\', - "script_entry" varchar not null default \'ash\', - "script_container" varchar not null default \'alpine:3.4\', - "copy_script_from" integer, - "uuid" varchar not null, - "author" varchar not null, - "features" text, - "docker_images" text, - "update_url" text, - "file_denylist" text, - "force_outgoing_ip" tinyint(1) not null default \'0\', - "tags" text not null, - foreign key("config_from") references "eggs"("id") on delete set null, - foreign key("copy_script_from") references "eggs"("id") on delete set null)'); - DB::statement('INSERT INTO eggs SELECT * FROM _eggs_old'); - DB::statement('DROP TABLE _eggs_old'); - DB::statement('CREATE UNIQUE INDEX "service_options_uuid_unique" on "eggs" ("uuid")'); - - // egg_mount_mount_id_foreign - // egg_mount_egg_id_foreign - DB::statement('ALTER TABLE egg_mount RENAME TO _egg_mount_old'); - DB::statement('CREATE TABLE egg_mount - ("egg_id" integer not null, - "mount_id" integer not null, - foreign key("egg_id") references "eggs"("id") on delete cascade on update cascade, - foreign key("mount_id") references "mounts"("id") on delete cascade on update cascade)'); - DB::statement('INSERT INTO egg_mount SELECT * FROM _egg_mount_old'); - DB::statement('DROP TABLE _egg_mount_old'); - DB::statement('CREATE UNIQUE INDEX "egg_mount_egg_id_mount_id_unique" on "egg_mount" ("egg_id", "mount_id")'); - - // service_variables_egg_id_foreign - DB::statement('ALTER TABLE egg_variables RENAME TO _egg_variables_old'); - DB::statement('CREATE TABLE egg_variables - ("id" integer primary key autoincrement not null, - "egg_id" integer not null, - "name" varchar not null, - "description" text not null, - "env_variable" varchar not null, - "default_value" text not null, - "user_viewable" integer not null, - "user_editable" integer not null, - "rules" text not null, - "created_at" datetime, - "updated_at" datetime, - "sort" integer, - foreign key("egg_id") references "eggs"("id") on delete cascade)'); - DB::statement('INSERT INTO egg_variables SELECT * FROM _egg_variables_old'); - DB::statement('DROP TABLE _egg_variables_old'); - - // mount_server_server_id_foreign - // mount_server_mount_id_foreign - DB::statement('ALTER TABLE mount_server RENAME TO _mount_server_old'); - DB::statement('CREATE TABLE mount_server - ("server_id" integer not null, - "mount_id" integer not null, - foreign key("server_id") references "servers"("id") on delete cascade on update cascade, - foreign key("mount_id") references "mounts"("id") on delete cascade on update cascade)'); - DB::statement('INSERT INTO mount_server SELECT * FROM _mount_server_old'); - DB::statement('DROP TABLE _mount_server_old'); - DB::statement('CREATE UNIQUE INDEX "mount_server_server_id_mount_id_unique" on "mount_server" ("server_id", "mount_id")'); - - // server_variables_variable_id_foreign - DB::statement('ALTER TABLE server_variables RENAME TO _server_variables_old'); - DB::statement('CREATE TABLE server_variables - ("id" integer primary key autoincrement not null, - "server_id" integer not null, - "variable_id" integer not null, - "variable_value" text not null, - "created_at" datetime, - "updated_at" datetime, - foreign key("server_id") references "servers"("id") on delete cascade, - foreign key("variable_id") references "egg_variables"("id") on delete cascade)'); - DB::statement('INSERT INTO server_variables SELECT * FROM _server_variables_old'); - DB::statement('DROP TABLE _server_variables_old'); - - // subusers_user_id_foreign - // subusers_server_id_foreign - DB::statement('ALTER TABLE subusers RENAME TO _subusers_old'); - DB::statement('CREATE TABLE subusers - ("id" integer primary key autoincrement not null, - "user_id" integer not null, - "server_id" integer not null, - "created_at" datetime, - "updated_at" datetime, - "permissions" text, - foreign key("user_id") references "users"("id") on delete cascade, - foreign key("server_id") references "servers"("id") on delete cascade)'); - DB::statement('INSERT INTO subusers SELECT * FROM _subusers_old'); - DB::statement('DROP TABLE _subusers_old'); - }); - - DB::statement('PRAGMA foreign_keys = ON'); - DB::statement('PRAGMA legacy_alter_table = OFF'); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - // Reverse not needed - } -}; diff --git a/database/migrations/2024_07_19_130942_create_permission_tables.php b/database/migrations/2024_07_19_130942_create_permission_tables.php index 9c7044b46e..dcfb8813f4 100644 --- a/database/migrations/2024_07_19_130942_create_permission_tables.php +++ b/database/migrations/2024_07_19_130942_create_permission_tables.php @@ -1,8 +1,8 @@ where('id', $eggVariable->id)->update(['rules' => explode('|', $eggVariable->rules)]); }); + if (Schema::getConnection()->getDriverName() === 'pgsql') { + DB::statement('ALTER TABLE egg_variables ALTER COLUMN rules TYPE JSON USING rules::json'); + + return; + } + Schema::table('egg_variables', function (Blueprint $table) { $table->json('rules')->change(); }); diff --git a/database/migrations/2024_08_13_171337_fix_allocation_server_foreign_key.php b/database/migrations/2024_08_13_171337_fix_allocation_server_foreign_key.php deleted file mode 100644 index 9abb9317e7..0000000000 --- a/database/migrations/2024_08_13_171337_fix_allocation_server_foreign_key.php +++ /dev/null @@ -1,54 +0,0 @@ -getDriverName() !== 'sqlite') { - return; - } - - // Disable foreign checks - // legacy_alter_table needs to be 'ON' so existing foreign key table references aren't renamed when renaming the table, see https://www.sqlite.org/lang_altertable.html - DB::statement('PRAGMA foreign_keys = OFF'); - DB::statement('PRAGMA legacy_alter_table = ON'); - - DB::transaction(function () { - DB::statement('ALTER TABLE allocations RENAME TO _allocations_old'); - DB::statement('CREATE TABLE allocations - ("id" integer primary key autoincrement not null, - "node_id" integer not null, - "ip" varchar not null, - "port" integer not null, - "server_id" integer, - "created_at" datetime, - "updated_at" datetime, - "ip_alias" text, - "notes" varchar, - foreign key("node_id") references "nodes"("id") on delete cascade, - foreign key("server_id") references "servers"("id") on delete set null)'); - DB::statement('INSERT INTO allocations SELECT * FROM _allocations_old'); - DB::statement('DROP TABLE _allocations_old'); - DB::statement('CREATE UNIQUE INDEX "allocations_node_id_ip_port_unique" on "allocations" ("node_id", "ip", "port")'); - }); - - DB::statement('PRAGMA foreign_keys = ON'); - DB::statement('PRAGMA legacy_alter_table = OFF'); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - // Reverse not needed - } -}; diff --git a/database/migrations/2024_10_27_033218_update_webhook_configurations_softdelete.php b/database/migrations/2024_10_27_033218_update_webhook_configurations_softdelete.php new file mode 100644 index 0000000000..2f95aee58c --- /dev/null +++ b/database/migrations/2024_10_27_033218_update_webhook_configurations_softdelete.php @@ -0,0 +1,28 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('webhook_configurations', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +}; diff --git a/database/migrations/2024_10_31_203540_change_database_hosts_to_belong_to_many_nodes.php b/database/migrations/2024_10_31_203540_change_database_hosts_to_belong_to_many_nodes.php new file mode 100644 index 0000000000..2fc831cb18 --- /dev/null +++ b/database/migrations/2024_10_31_203540_change_database_hosts_to_belong_to_many_nodes.php @@ -0,0 +1,51 @@ +id(); + $table->unsignedInteger('node_id'); + $table->foreign('node_id')->references('id')->on('nodes'); + $table->unsignedInteger('database_host_id'); + $table->foreign('database_host_id')->references('id')->on('database_hosts'); + $table->timestamps(); + }); + + $databaseNodes = DB::table('database_hosts')->whereNotNull('node_id')->get(); + $newJoinEntries = $databaseNodes->map(fn ($record) => [ + 'node_id' => $record->node_id, + 'database_host_id' => $record->id, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + DB::table('database_host_node')->insert($newJoinEntries->toArray()); + + Schema::table('database_hosts', function (Blueprint $table) { + $table->dropForeign(['node_id']); + $table->dropColumn('node_id'); + }); + } + + public function down(): void + { + Schema::table('database_hosts', function (Blueprint $table) { + $table->unsignedInteger('node_id')->nullable(); + $table->foreign('node_id')->references('id')->on('nodes'); + }); + + foreach (DB::table('database_host_node')->get() as $record) { + DB::table('database_hosts') + ->where('id', $record->database_host_id) + ->update(['node_id' => $record->node_id]); + } + + Schema::drop('database_host_node'); + } +}; diff --git a/database/migrations/2024_11_04_185326_revamp_api_keys_permissions.php b/database/migrations/2024_11_04_185326_revamp_api_keys_permissions.php new file mode 100644 index 0000000000..c1147f9d68 --- /dev/null +++ b/database/migrations/2024_11_04_185326_revamp_api_keys_permissions.php @@ -0,0 +1,94 @@ +json('permissions')->nullable(); + }); + + foreach (ApiKey::all() as $apiKey) { + $permissions = [ + Server::RESOURCE_NAME => intval($apiKey->r_servers ?? 0), + Node::RESOURCE_NAME => intval($apiKey->r_nodes ?? 0), + Allocation::RESOURCE_NAME => intval($apiKey->r_allocations ?? 0), + User::RESOURCE_NAME => intval($apiKey->r_users ?? 0), + Egg::RESOURCE_NAME => intval($apiKey->r_eggs ?? 0), + DatabaseHost::RESOURCE_NAME => intval($apiKey->r_database_hosts ?? 0), + Database::RESOURCE_NAME => intval($apiKey->r_server_databases ?? 0), + Mount::RESOURCE_NAME => intval($apiKey->r_mounts ?? 0), + ]; + + DB::table('api_keys') + ->where('id', $apiKey->id) + ->update(['permissions' => $permissions]); + } + + Schema::table('api_keys', function (Blueprint $table) { + $table->dropColumn([ + 'r_servers', + 'r_nodes', + 'r_allocations', + 'r_users', + 'r_eggs', + 'r_database_hosts', + 'r_server_databases', + 'r_mounts', + ]); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('api_keys', function (Blueprint $table) { + $table->unsignedTinyInteger('r_servers')->default(0); + $table->unsignedTinyInteger('r_nodes')->default(0); + $table->unsignedTinyInteger('r_allocations')->default(0); + $table->unsignedTinyInteger('r_users')->default(0); + $table->unsignedTinyInteger('r_eggs')->default(0); + $table->unsignedTinyInteger('r_database_hosts')->default(0); + $table->unsignedTinyInteger('r_server_databases')->default(0); + $table->unsignedTinyInteger('r_mounts')->default(0); + }); + + foreach (ApiKey::all() as $apiKey) { + DB::table('api_keys') + ->where('id', $apiKey->id) + ->update([ + 'r_servers' => $apiKey->permissions[Server::RESOURCE_NAME], + 'r_nodes' => $apiKey->permissions[Node::RESOURCE_NAME], + 'r_allocations' => $apiKey->permissions[Allocation::RESOURCE_NAME], + 'r_users' => $apiKey->permissions[User::RESOURCE_NAME], + 'r_eggs' => $apiKey->permissions[Egg::RESOURCE_NAME], + 'r_database_hosts' => $apiKey->permissions[DatabaseHost::RESOURCE_NAME], + 'r_server_databases' => $apiKey->permissions[Database::RESOURCE_NAME], + 'r_mounts' => $apiKey->permissions[Mount::RESOURCE_NAME], + ]); + } + + Schema::table('api_keys', function (Blueprint $table) { + $table->dropColumn('permissions'); + }); + } +}; diff --git a/database/migrations/2024_12_02_013000_remove_illegal_subusers.php b/database/migrations/2024_12_02_013000_remove_illegal_subusers.php new file mode 100644 index 0000000000..35e6381194 --- /dev/null +++ b/database/migrations/2024_12_02_013000_remove_illegal_subusers.php @@ -0,0 +1,29 @@ +whereIn('user_id', function ($query) { + $query->select('id') + ->from('servers') + ->whereColumn('owner_id', 'subusers.server_id'); + }) + ->delete(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2024_12_27_135435_delete_database_host_node_when_node_is_deleted.php b/database/migrations/2024_12_27_135435_delete_database_host_node_when_node_is_deleted.php new file mode 100644 index 0000000000..2c7bdfc29e --- /dev/null +++ b/database/migrations/2024_12_27_135435_delete_database_host_node_when_node_is_deleted.php @@ -0,0 +1,28 @@ +dropForeign(['node_id']); + + $table->foreign('node_id')->references('id')->on('nodes')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/migrations/2025_01_03_210426_remove_user_first_and_last_names.php b/database/migrations/2025_01_03_210426_remove_user_first_and_last_names.php new file mode 100644 index 0000000000..95929d7b24 --- /dev/null +++ b/database/migrations/2025_01_03_210426_remove_user_first_and_last_names.php @@ -0,0 +1,30 @@ +dropColumn('name_first'); + $table->dropColumn('name_last'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->string('name_first')->nullable(); + $table->string('name_last')->nullable(); + }); + } +}; diff --git a/database/migrations/2025_01_09_143607_database_host_node_foreign_delete_cascade.php b/database/migrations/2025_01_09_143607_database_host_node_foreign_delete_cascade.php new file mode 100644 index 0000000000..66c0b184a6 --- /dev/null +++ b/database/migrations/2025_01_09_143607_database_host_node_foreign_delete_cascade.php @@ -0,0 +1,24 @@ +dropForeign(['database_host_id']); + $table->foreign('database_host_id')->references('id')->on('database_hosts')->cascadeOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/2025_02_11_181129_remove_audit_logs_table.php b/database/migrations/2025_02_11_181129_remove_audit_logs_table.php new file mode 100644 index 0000000000..105b4750fb --- /dev/null +++ b/database/migrations/2025_02_11_181129_remove_audit_logs_table.php @@ -0,0 +1,23 @@ +dropColumn('gravatar'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->boolean('gravatar')->default(true); + }); + } +}; diff --git a/database/migrations/2025_04_01_033956_egg_variable_unique_foreign_key.php b/database/migrations/2025_04_01_033956_egg_variable_unique_foreign_key.php new file mode 100644 index 0000000000..64f011b711 --- /dev/null +++ b/database/migrations/2025_04_01_033956_egg_variable_unique_foreign_key.php @@ -0,0 +1,30 @@ +unique(['egg_id', 'env_variable']); + $table->unique(['egg_id', 'name']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('egg_variables', function (Blueprint $table) { + $table->dropUnique(['egg_id', 'env_variable']); + $table->dropUnique(['egg_id', 'name']); + }); + } +}; diff --git a/database/migrations/2025_04_01_214953_add_customization_column.php b/database/migrations/2025_04_01_214953_add_customization_column.php new file mode 100644 index 0000000000..51ff112fba --- /dev/null +++ b/database/migrations/2025_04_01_214953_add_customization_column.php @@ -0,0 +1,28 @@ +json('customization')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('customization'); + }); + } +}; diff --git a/database/migrations/2025_04_07_062945_remove_additional_roles_of_root_admins.php b/database/migrations/2025_04_07_062945_remove_additional_roles_of_root_admins.php new file mode 100644 index 0000000000..25dd029991 --- /dev/null +++ b/database/migrations/2025_04_07_062945_remove_additional_roles_of_root_admins.php @@ -0,0 +1,27 @@ +filter(fn ($user) => $user->isRootAdmin()); + foreach ($rootAdmins as $rootAdmin) { + $rootAdmin->syncRoles(Role::getRootAdmin()); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // No going back + } +}; diff --git a/database/migrations/2025_04_08_113556_create_node_role_table.php b/database/migrations/2025_04_08_113556_create_node_role_table.php new file mode 100644 index 0000000000..42f51c73a0 --- /dev/null +++ b/database/migrations/2025_04_08_113556_create_node_role_table.php @@ -0,0 +1,32 @@ +unsignedInteger('node_id'); + $table->unsignedBigInteger('role_id'); + + $table->unique(['node_id', 'role_id']); + + $table->foreign('node_id')->references('id')->on('nodes')->cascadeOnDelete(); + $table->foreign('role_id')->references('id')->on('roles')->cascadeOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('node_role'); + } +}; diff --git a/database/migrations/2025_04_09_015500_add_webhook_configurations_type_column.php b/database/migrations/2025_04_09_015500_add_webhook_configurations_type_column.php new file mode 100644 index 0000000000..009e3d96a2 --- /dev/null +++ b/database/migrations/2025_04_09_015500_add_webhook_configurations_type_column.php @@ -0,0 +1,41 @@ +string('type')->nullable()->after('id'); + $table->json('payload')->nullable()->after('type'); + }); + + foreach (WebhookConfiguration::all() as $webhookConfig) { + $type = str($webhookConfig->endpoint)->contains('discord.com') ? WebhookType::Discord->value : WebhookType::Regular->value; + + DB::table('webhook_configurations') + ->where('id', $webhookConfig->id) + ->update(['type' => $type]); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('webhook_configurations', function (Blueprint $table) { + $table->dropColumn('type'); + $table->dropColumn('payload'); + }); + } +}; diff --git a/database/migrations/2025_05_01_193002_move_to_mountables.php b/database/migrations/2025_05_01_193002_move_to_mountables.php new file mode 100644 index 0000000000..36bf52bfb1 --- /dev/null +++ b/database/migrations/2025_05_01_193002_move_to_mountables.php @@ -0,0 +1,93 @@ +unsignedInteger('mount_id'); + + $table->string('mountable_type'); + $table->unsignedBigInteger('mountable_id'); + $table->index(['mountable_id', 'mountable_type'], 'mountables_mountable_id_mountable_type_index'); + + $table->foreign('mount_id') + ->references('id') // mount id + ->on('mounts') + ->onDelete('cascade'); + + $table->primary(['mount_id', 'mountable_id', 'mountable_type'], + 'mountables_mountable_type_primary'); + }); + + Schema::table('mount_node', function (Blueprint $table) { + $table->dropForeign(['node_id']); + $table->dropForeign(['mount_id']); + $table->dropUnique(['node_id', 'mount_id']); + }); + + $inserts = []; + $nodeMounts = DB::table('mount_node')->get(); + $nodeMounts->each(function ($mount) use (&$inserts) { + $inserts[] = [ + 'mount_id' => $mount->mount_id, + 'mountable_type' => 'node', + 'mountable_id' => $mount->node_id, + ]; + }); + + Schema::table('mount_server', function (Blueprint $table) { + $table->dropForeign(['server_id']); + $table->dropForeign(['mount_id']); + $table->dropUnique(['server_id', 'mount_id']); + }); + + $serverMounts = DB::table('mount_server')->get(); + $serverMounts->each(function ($mount) use (&$inserts) { + $inserts[] = [ + 'mount_id' => $mount->mount_id, + 'mountable_type' => 'server', + 'mountable_id' => $mount->server_id, + ]; + }); + + Schema::table('egg_mount', function (Blueprint $table) { + $table->dropForeign(['egg_id']); + $table->dropForeign(['mount_id']); + $table->dropUnique(['egg_id', 'mount_id']); + }); + + $eggMounts = DB::table('egg_mount')->get(); + $eggMounts->each(function ($mount) use (&$inserts) { + $inserts[] = [ + 'mount_id' => $mount->mount_id, + 'mountable_type' => 'egg', + 'mountable_id' => $mount->egg_id, + ]; + }); + + DB::transaction(function () use ($inserts) { + DB::table('mountables')->insert($inserts); + }); + + Schema::drop('mount_node'); + Schema::drop('mount_server'); + Schema::drop('egg_mount'); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2025_05_26_150328_add_headers_webhook.php b/database/migrations/2025_05_26_150328_add_headers_webhook.php new file mode 100644 index 0000000000..c7a2ea144c --- /dev/null +++ b/database/migrations/2025_05_26_150328_add_headers_webhook.php @@ -0,0 +1,28 @@ +json('headers')->nullable()->after('payload'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('webhook_configurations', function (Blueprint $table) { + $table->dropColumn('headers'); + }); + } +}; diff --git a/database/migrations/2025_06_02_073349_add_daemon_connect_to_nodes.php b/database/migrations/2025_06_02_073349_add_daemon_connect_to_nodes.php new file mode 100644 index 0000000000..90f01b0bcb --- /dev/null +++ b/database/migrations/2025_06_02_073349_add_daemon_connect_to_nodes.php @@ -0,0 +1,28 @@ +smallInteger('daemon_connect')->unsigned()->default(8080); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('nodes', function (Blueprint $table) { + $table->dropColumn('daemon_connect'); + }); + } +}; diff --git a/database/migrations/2025_06_03_171448_nullable_server_allocation_id.php b/database/migrations/2025_06_03_171448_nullable_server_allocation_id.php new file mode 100644 index 0000000000..d9d6bbd963 --- /dev/null +++ b/database/migrations/2025_06_03_171448_nullable_server_allocation_id.php @@ -0,0 +1,34 @@ +dropForeign(['allocation_id']); + $table->dropUnique(['allocation_id']); + $table->unsignedInteger('allocation_id')->nullable()->change(); + $table->foreign('allocation_id')->references('id')->on('allocations')->nullOnDelete(); + }); + + Schema::table('server_transfers', function (Blueprint $table) { + $table->unsignedInteger('old_allocation')->nullable()->change(); + $table->unsignedInteger('new_allocation')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2025_07_06_213447_match-node-port.php b/database/migrations/2025_07_06_213447_match-node-port.php new file mode 100644 index 0000000000..b3909c1628 --- /dev/null +++ b/database/migrations/2025_07_06_213447_match-node-port.php @@ -0,0 +1,29 @@ +get(); + foreach ($nodes as $node) { + $node->update(['daemon_connect' => $node->daemon_listen]); + } + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2025_07_19_141511_clear_password_from_failed_auth_logs.php b/database/migrations/2025_07_19_141511_clear_password_from_failed_auth_logs.php new file mode 100644 index 0000000000..8ff24c81c4 --- /dev/null +++ b/database/migrations/2025_07_19_141511_clear_password_from_failed_auth_logs.php @@ -0,0 +1,29 @@ +get(); + foreach ($logs as $log) { + $log->update(['properties' => collect($log->properties)->except(['password'])->toArray()]); + } + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2025_07_22_091435_update_users_totp.php b/database/migrations/2025_07_22_091435_update_users_totp.php new file mode 100644 index 0000000000..c4490aeefc --- /dev/null +++ b/database/migrations/2025_07_22_091435_update_users_totp.php @@ -0,0 +1,36 @@ +text('mfa_app_secret')->nullable(); + $table->text('mfa_app_recovery_codes')->nullable(); + $table->boolean('mfa_email_enabled')->default(false); + }); + + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('use_totp'); + $table->dropColumn('totp_secret'); + $table->dropColumn('totp_authenticated_at'); + }); + + Schema::dropIfExists('recovery_tokens'); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2025_08_30_111308_fix_activity_log_permission_name.php b/database/migrations/2025_08_30_111308_fix_activity_log_permission_name.php new file mode 100644 index 0000000000..e1e5c093b8 --- /dev/null +++ b/database/migrations/2025_08_30_111308_fix_activity_log_permission_name.php @@ -0,0 +1,27 @@ +where('name', 'seeIps activity') + ->update(['name' => 'seeIps activityLog']); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + DB::table('permissions') + ->where('name', 'seeIps activityLog') + ->update(['name' => 'seeIps activity']); + } +}; diff --git a/database/migrations/2025_09_03_080547_remove_batch_column_from_activity_logs.php b/database/migrations/2025_09_03_080547_remove_batch_column_from_activity_logs.php new file mode 100644 index 0000000000..eda184e31b --- /dev/null +++ b/database/migrations/2025_09_03_080547_remove_batch_column_from_activity_logs.php @@ -0,0 +1,28 @@ +dropColumn('batch'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('activity_logs', function (Blueprint $table) { + $table->string('batch', 36)->nullable(); + }); + } +}; diff --git a/database/migrations/2025_09_03_090706_support_multiple_startup_commands.php b/database/migrations/2025_09_03_090706_support_multiple_startup_commands.php new file mode 100644 index 0000000000..4ff2647694 --- /dev/null +++ b/database/migrations/2025_09_03_090706_support_multiple_startup_commands.php @@ -0,0 +1,50 @@ +json('startup_commands')->after('startup')->nullable(); + }); + + DB::table('eggs')->select(['id', 'startup'])->cursor()->each(function ($egg) { + DB::table('eggs')->where('id', $egg->id)->update(['startup_commands' => json_encode(['Default' => $egg->startup], JSON_UNESCAPED_SLASHES)]); + }); + + Schema::table('eggs', function (Blueprint $table) { + $table->dropColumn('startup'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + DB::transaction(function () { + Schema::table('eggs', function (Blueprint $table) { + $table->text('startup')->after('startup_commands'); + }); + + DB::table('eggs')->select(['id', 'startup_commands'])->cursor()->each(function ($egg) { + DB::table('eggs')->where('id', $egg->id)->update([ + 'startup' => Arr::first(json_decode($egg->startup_commands, true, 512, JSON_THROW_ON_ERROR)), + ]); + }); + + Schema::table('eggs', function (Blueprint $table) { + $table->dropColumn('startup_commands'); + }); + }); + } +}; diff --git a/database/migrations/2025_10_14_065517_add_is_locked_to_allocations.php b/database/migrations/2025_10_14_065517_add_is_locked_to_allocations.php new file mode 100644 index 0000000000..f7c429cb24 --- /dev/null +++ b/database/migrations/2025_10_14_065517_add_is_locked_to_allocations.php @@ -0,0 +1,28 @@ +boolean('is_locked')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('allocations', function (Blueprint $table) { + $table->dropColumn('is_locked'); + }); + } +}; diff --git a/database/migrations/2025_10_23_073209_add_is_managed_externally_to_users.php b/database/migrations/2025_10_23_073209_add_is_managed_externally_to_users.php new file mode 100644 index 0000000000..24f171fb7f --- /dev/null +++ b/database/migrations/2025_10_23_073209_add_is_managed_externally_to_users.php @@ -0,0 +1,28 @@ +boolean('is_managed_externally')->default(false)->after('external_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('is_managed_externally'); + }); + } +}; diff --git a/database/migrations/2025_10_29_105725_add_egg_image_column.php b/database/migrations/2025_10_29_105725_add_egg_image_column.php new file mode 100644 index 0000000000..3a4620967f --- /dev/null +++ b/database/migrations/2025_10_29_105725_add_egg_image_column.php @@ -0,0 +1,28 @@ +longText('image')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('eggs', function (Blueprint $table) { + $table->dropColumn('image'); + }); + } +}; diff --git a/database/migrations/2025_11_11_121905_fix_case_for_role_permissions.php b/database/migrations/2025_11_11_121905_fix_case_for_role_permissions.php new file mode 100644 index 0000000000..2188cdb0fc --- /dev/null +++ b/database/migrations/2025_11_11_121905_fix_case_for_role_permissions.php @@ -0,0 +1,47 @@ + $permissions) { + foreach ($permissions as $permission) { + $allPermissions[] = $permission . ' ' . $model; + } + } + + foreach (Permission::all() as $spatiePermission) { + $name = $spatiePermission->name; + + foreach ($allPermissions as $permission) { + if (Str::lower($name) === Str::lower($permission)) { + $name = $permission; + break; + } + } + + $spatiePermission->update(['name' => $name]); + } + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2025_11_16_000000_add_icon_to_servers.php b/database/migrations/2025_11_16_000000_add_icon_to_servers.php new file mode 100644 index 0000000000..e89799d0f0 --- /dev/null +++ b/database/migrations/2025_11_16_000000_add_icon_to_servers.php @@ -0,0 +1,28 @@ +longText('icon')->nullable()->after('image'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('servers', function (Blueprint $table) { + $table->dropColumn('icon'); + }); + } +}; diff --git a/database/migrations/2025_12_13_000000_convert_base64_images_to_files.php b/database/migrations/2025_12_13_000000_convert_base64_images_to_files.php new file mode 100644 index 0000000000..235f74f3cd --- /dev/null +++ b/database/migrations/2025_12_13_000000_convert_base64_images_to_files.php @@ -0,0 +1,73 @@ +whereNotNull('image')->get(); + foreach ($eggs as $egg) { + if (!empty($egg->image) && str_starts_with($egg->image, 'data:')) { + $this->convertBase64ToFile($egg->image, $egg->uuid, Egg::ICON_STORAGE_PATH); + } + } + + $servers = DB::table('servers')->whereNotNull('icon')->get(); + foreach ($servers as $server) { + if (!empty($server->icon) && str_starts_with($server->icon, 'data:')) { + $this->convertBase64ToFile($server->icon, $server->uuid, Server::ICON_STORAGE_PATH); + } + } + + Schema::table('eggs', function (Blueprint $table) { + $table->dropColumn('image'); + }); + + Schema::table('servers', function (Blueprint $table) { + $table->dropColumn('icon'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + //None: This migration is irreversible. + } + + /** + * Convert a base64 image string to a file. + */ + private function convertBase64ToFile(string $base64String, string $uuid, string $directory): void + { + if (!preg_match('/^data:image\/([\w+]+);base64,(.+)$/', $base64String, $matches)) { + return; + } + + $extension = $matches[1]; + $data = base64_decode($matches[2]); + + if (!$data) { + return; + } + + $normalizedExtension = match ($extension) { + 'svg+xml' => 'svg', + 'jpeg' => 'jpg', + default => $extension, + }; + + Storage::disk('public')->put("$directory/$uuid.$normalizedExtension", $data); + } +}; diff --git a/database/migrations/2026_01_09_134116_clear_unused_allocation_notes.php b/database/migrations/2026_01_09_134116_clear_unused_allocation_notes.php new file mode 100644 index 0000000000..6eb6e5c2d1 --- /dev/null +++ b/database/migrations/2026_01_09_134116_clear_unused_allocation_notes.php @@ -0,0 +1,25 @@ +whereNull('server_id') + ->update(['notes' => null]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Not needed + } +}; diff --git a/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php b/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php new file mode 100644 index 0000000000..b1c426d1fe --- /dev/null +++ b/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php @@ -0,0 +1,47 @@ + [ + 'new_uuid' => 'ed072427-f209-4603-875c-f540c6dd5a65', + 'new_update_url' => 'https://raw.githubusercontent.com/pelican-eggs/minecraft/refs/heads/main/java/forge/egg-forge-minecraft.yaml', + ], + + // Paper + '150956be-4164-4086-9057-631ae95505e9' => [ + 'new_uuid' => '5da37ef6-58da-4169-90a6-e683e1721247', + 'new_update_url' => 'https://raw.githubusercontent.com/pelican-eggs/minecraft/refs/heads/main/java/paper/egg-paper.yaml', + ], + + // Garrys Mod + 'c0b2f96a-f753-4d82-a73e-6e5be2bbadd5' => [ + 'new_uuid' => '60ef81d4-30a2-4d98-ab64-f59c69e2f915', + 'new_update_url' => 'https://raw.githubusercontent.com/pelican-eggs/games-steamcmd/refs/heads/main/gmod/egg-garrys-mod.yaml', + ], + ]; + + foreach ($mappings as $oldUuid => $newData) { + if (DB::table('eggs')->where('uuid', $newData['new_uuid'])->exists()) { + DB::table('eggs')->where('uuid', $newData['new_uuid'])->update([ + 'update_url' => $newData['new_update_url'], + ]); + } else { + DB::table('eggs')->where('uuid', $oldUuid)->update([ + 'uuid' => $newData['new_uuid'], + 'update_url' => $newData['new_update_url'], + ]); + } + } + } + + public function down(): void + { + // Not needed + } +}; diff --git a/database/schema/mysql-schema.sql b/database/schema/mysql-schema.sql deleted file mode 100644 index 79d4548398..0000000000 --- a/database/schema/mysql-schema.sql +++ /dev/null @@ -1,859 +0,0 @@ -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -DROP TABLE IF EXISTS `activity_log_subjects`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `activity_log_subjects` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `activity_log_id` bigint unsigned NOT NULL, - `subject_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `subject_id` bigint unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `activity_log_subjects_activity_log_id_foreign` (`activity_log_id`), - KEY `activity_log_subjects_subject_type_subject_id_index` (`subject_type`,`subject_id`), - CONSTRAINT `activity_log_subjects_activity_log_id_foreign` FOREIGN KEY (`activity_log_id`) REFERENCES `activity_logs` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `activity_logs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `activity_logs` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `batch` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `event` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `ip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `actor_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `actor_id` bigint unsigned DEFAULT NULL, - `api_key_id` int unsigned DEFAULT NULL, - `properties` json NOT NULL, - `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `activity_logs_actor_type_actor_id_index` (`actor_type`,`actor_id`), - KEY `activity_logs_event_index` (`event`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `allocations`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `allocations` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `node_id` int unsigned NOT NULL, - `ip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `ip_alias` text COLLATE utf8mb4_unicode_ci, - `port` mediumint unsigned NOT NULL, - `server_id` int unsigned DEFAULT NULL, - `notes` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `allocations_node_id_ip_port_unique` (`node_id`,`ip`,`port`), - KEY `allocations_server_id_foreign` (`server_id`), - CONSTRAINT `allocations_node_id_foreign` FOREIGN KEY (`node_id`) REFERENCES `nodes` (`id`) ON DELETE CASCADE, - CONSTRAINT `allocations_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `api_keys`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `api_keys` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `user_id` int unsigned NOT NULL, - `key_type` tinyint unsigned NOT NULL DEFAULT '0', - `identifier` char(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `public` char(16) COLLATE utf8mb4_unicode_ci NOT NULL, - `token` text COLLATE utf8mb4_unicode_ci NOT NULL, - `allowed_ips` text COLLATE utf8mb4_unicode_ci, - `memo` text COLLATE utf8mb4_unicode_ci, - `last_used_at` timestamp NULL DEFAULT NULL, - `expires_at` timestamp NULL DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - `r_servers` tinyint unsigned NOT NULL DEFAULT '0', - `r_nodes` tinyint unsigned NOT NULL DEFAULT '0', - `r_allocations` tinyint unsigned NOT NULL DEFAULT '0', - `r_users` tinyint unsigned NOT NULL DEFAULT '0', - `r_eggs` tinyint unsigned NOT NULL DEFAULT '0', - `r_database_hosts` tinyint unsigned NOT NULL DEFAULT '0', - `r_server_databases` tinyint unsigned NOT NULL DEFAULT '0', - `r_mounts` tinyint unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - UNIQUE KEY `api_keys_identifier_unique` (`identifier`), - KEY `api_keys_user_id_foreign` (`user_id`), - CONSTRAINT `api_keys_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `api_logs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `api_logs` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `authorized` tinyint(1) NOT NULL, - `error` text COLLATE utf8mb4_unicode_ci, - `key` char(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `method` char(6) COLLATE utf8mb4_unicode_ci NOT NULL, - `route` text COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `user_agent` text COLLATE utf8mb4_unicode_ci NOT NULL, - `request_ip` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `audit_logs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `audit_logs` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `is_system` tinyint(1) NOT NULL DEFAULT '0', - `user_id` int unsigned DEFAULT NULL, - `server_id` int unsigned DEFAULT NULL, - `action` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `subaction` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `device` json NOT NULL, - `metadata` json NOT NULL, - `created_at` timestamp NOT NULL, - PRIMARY KEY (`id`), - KEY `audit_logs_user_id_foreign` (`user_id`), - KEY `audit_logs_server_id_foreign` (`server_id`), - KEY `audit_logs_action_server_id_index` (`action`,`server_id`), - CONSTRAINT `audit_logs_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE, - CONSTRAINT `audit_logs_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `backups`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `backups` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `server_id` int unsigned NOT NULL, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `is_successful` tinyint(1) NOT NULL DEFAULT '0', - `upload_id` text COLLATE utf8mb4_unicode_ci, - `is_locked` tinyint unsigned NOT NULL DEFAULT '0', - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `ignored_files` text COLLATE utf8mb4_unicode_ci NOT NULL, - `disk` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `checksum` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `bytes` bigint unsigned NOT NULL DEFAULT '0', - `completed_at` timestamp NULL DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - `deleted_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `backups_uuid_unique` (`uuid`), - KEY `backups_server_id_foreign` (`server_id`), - CONSTRAINT `backups_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `database_hosts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `database_hosts` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `host` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `port` int unsigned NOT NULL, - `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `password` text COLLATE utf8mb4_unicode_ci NOT NULL, - `max_databases` int unsigned DEFAULT NULL, - `node_id` int unsigned DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `database_hosts_node_id_foreign` (`node_id`), - CONSTRAINT `database_hosts_node_id_foreign` FOREIGN KEY (`node_id`) REFERENCES `nodes` (`id`) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `databases`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `databases` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `server_id` int unsigned NOT NULL, - `database_host_id` int unsigned NOT NULL, - `database` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `remote` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '%', - `password` text COLLATE utf8mb4_unicode_ci NOT NULL, - `max_connections` int DEFAULT '0', - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `databases_database_host_id_username_unique` (`database_host_id`,`username`), - UNIQUE KEY `databases_database_host_id_server_id_database_unique` (`database_host_id`,`server_id`,`database`), - KEY `databases_server_id_foreign` (`server_id`), - CONSTRAINT `databases_database_host_id_foreign` FOREIGN KEY (`database_host_id`) REFERENCES `database_hosts` (`id`), - CONSTRAINT `databases_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `egg_mount`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `egg_mount` ( - `egg_id` int unsigned NOT NULL, - `mount_id` int unsigned NOT NULL, - UNIQUE KEY `egg_mount_egg_id_mount_id_unique` (`egg_id`,`mount_id`), - KEY `egg_mount_mount_id_foreign` (`mount_id`), - CONSTRAINT `egg_mount_egg_id_foreign` FOREIGN KEY (`egg_id`) REFERENCES `eggs` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `egg_mount_mount_id_foreign` FOREIGN KEY (`mount_id`) REFERENCES `mounts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `egg_variables`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `egg_variables` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `egg_id` int unsigned NOT NULL, - `sort` tinyint unsigned DEFAULT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci NOT NULL, - `env_variable` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `default_value` text COLLATE utf8mb4_unicode_ci NOT NULL, - `user_viewable` tinyint unsigned NOT NULL, - `user_editable` tinyint unsigned NOT NULL, - `rules` text COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `service_variables_egg_id_foreign` (`egg_id`), - CONSTRAINT `service_variables_egg_id_foreign` FOREIGN KEY (`egg_id`) REFERENCES `eggs` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `eggs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `eggs` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `author` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `features` json DEFAULT NULL, - `docker_images` json DEFAULT NULL, - `file_denylist` json DEFAULT NULL, - `update_url` text COLLATE utf8mb4_unicode_ci, - `config_files` text COLLATE utf8mb4_unicode_ci, - `config_startup` text COLLATE utf8mb4_unicode_ci, - `config_logs` text COLLATE utf8mb4_unicode_ci, - `config_stop` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `config_from` int unsigned DEFAULT NULL, - `startup` text COLLATE utf8mb4_unicode_ci, - `script_container` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'alpine:3.4', - `copy_script_from` int unsigned DEFAULT NULL, - `script_entry` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'ash', - `script_is_privileged` tinyint(1) NOT NULL DEFAULT '1', - `script_install` text COLLATE utf8mb4_unicode_ci, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - `force_outgoing_ip` tinyint(1) NOT NULL DEFAULT '0', - `tags` text COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `service_options_uuid_unique` (`uuid`), - KEY `eggs_config_from_foreign` (`config_from`), - KEY `eggs_copy_script_from_foreign` (`copy_script_from`), - CONSTRAINT `eggs_config_from_foreign` FOREIGN KEY (`config_from`) REFERENCES `eggs` (`id`) ON DELETE SET NULL, - CONSTRAINT `eggs_copy_script_from_foreign` FOREIGN KEY (`copy_script_from`) REFERENCES `eggs` (`id`) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `failed_jobs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `failed_jobs` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `uuid` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, - `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, - `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, - `failed_at` timestamp NOT NULL, - `exception` text COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `jobs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `jobs` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, - `attempts` tinyint unsigned NOT NULL, - `reserved_at` int unsigned DEFAULT NULL, - `available_at` int unsigned NOT NULL, - `created_at` int unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `jobs_queue_reserved_at_index` (`queue`,`reserved_at`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `migrations`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `migrations` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `batch` int NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `mount_node`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mount_node` ( - `node_id` int unsigned NOT NULL, - `mount_id` int unsigned NOT NULL, - UNIQUE KEY `mount_node_node_id_mount_id_unique` (`node_id`,`mount_id`), - KEY `mount_node_mount_id_foreign` (`mount_id`), - CONSTRAINT `mount_node_mount_id_foreign` FOREIGN KEY (`mount_id`) REFERENCES `mounts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mount_node_node_id_foreign` FOREIGN KEY (`node_id`) REFERENCES `nodes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `mount_server`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mount_server` ( - `server_id` int unsigned NOT NULL, - `mount_id` int unsigned NOT NULL, - UNIQUE KEY `mount_server_server_id_mount_id_unique` (`server_id`,`mount_id`), - KEY `mount_server_mount_id_foreign` (`mount_id`), - CONSTRAINT `mount_server_mount_id_foreign` FOREIGN KEY (`mount_id`) REFERENCES `mounts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mount_server_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `mounts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mounts` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `source` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `target` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `read_only` tinyint unsigned NOT NULL, - `user_mountable` tinyint unsigned NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `mounts_id_unique` (`id`), - UNIQUE KEY `mounts_uuid_unique` (`uuid`), - UNIQUE KEY `mounts_name_unique` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `nodes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `nodes` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `public` smallint unsigned NOT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `fqdn` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `scheme` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'https', - `behind_proxy` tinyint(1) NOT NULL DEFAULT '0', - `maintenance_mode` tinyint(1) NOT NULL DEFAULT '0', - `memory` int unsigned NOT NULL, - `memory_overallocate` int NOT NULL DEFAULT '0', - `disk` int unsigned NOT NULL, - `disk_overallocate` int NOT NULL DEFAULT '0', - `cpu` int unsigned NOT NULL DEFAULT '0', - `cpu_overallocate` int NOT NULL DEFAULT '0', - `upload_size` int unsigned NOT NULL DEFAULT '100', - `daemon_token_id` char(16) COLLATE utf8mb4_unicode_ci NOT NULL, - `daemon_token` text COLLATE utf8mb4_unicode_ci NOT NULL, - `daemon_listen` smallint unsigned NOT NULL DEFAULT '8080', - `daemon_sftp` smallint unsigned NOT NULL DEFAULT '2022', - `daemon_sftp_alias` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `daemon_base` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - `tags` text COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `nodes_uuid_unique` (`uuid`), - UNIQUE KEY `nodes_daemon_token_id_unique` (`daemon_token_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `notifications`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `notifications` ( - `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `notifiable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `notifiable_id` bigint unsigned NOT NULL, - `data` text COLLATE utf8mb4_unicode_ci NOT NULL, - `read_at` timestamp NULL DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `notifications_notifiable_type_notifiable_id_index` (`notifiable_type`,`notifiable_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `password_resets`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `password_resets` ( - `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NOT NULL, - KEY `password_resets_email_index` (`email`), - KEY `password_resets_token_index` (`token`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `recovery_tokens`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `recovery_tokens` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `user_id` int unsigned NOT NULL, - `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `recovery_tokens_user_id_foreign` (`user_id`), - CONSTRAINT `recovery_tokens_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `schedules`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `schedules` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `server_id` int unsigned NOT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `cron_day_of_week` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `cron_month` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `cron_day_of_month` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `cron_hour` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `cron_minute` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `is_active` tinyint(1) NOT NULL, - `is_processing` tinyint(1) NOT NULL, - `only_when_online` tinyint unsigned NOT NULL DEFAULT '0', - `last_run_at` timestamp NULL DEFAULT NULL, - `next_run_at` timestamp NULL DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `schedules_server_id_foreign` (`server_id`), - CONSTRAINT `schedules_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `server_transfers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `server_transfers` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `server_id` int unsigned NOT NULL, - `successful` tinyint(1) DEFAULT NULL, - `old_node` int unsigned NOT NULL, - `new_node` int unsigned NOT NULL, - `old_allocation` int unsigned NOT NULL, - `new_allocation` int unsigned NOT NULL, - `old_additional_allocations` json DEFAULT NULL, - `new_additional_allocations` json DEFAULT NULL, - `archived` tinyint(1) NOT NULL DEFAULT '0', - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `server_transfers_server_id_foreign` (`server_id`), - CONSTRAINT `server_transfers_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `server_variables`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `server_variables` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `server_id` int unsigned NOT NULL, - `variable_id` int unsigned NOT NULL, - `variable_value` text COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `server_variables_server_id_foreign` (`server_id`), - KEY `server_variables_variable_id_foreign` (`variable_id`), - CONSTRAINT `server_variables_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE, - CONSTRAINT `server_variables_variable_id_foreign` FOREIGN KEY (`variable_id`) REFERENCES `egg_variables` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `servers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `servers` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `external_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `uuid_short` char(8) COLLATE utf8mb4_unicode_ci NOT NULL, - `node_id` int unsigned NOT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci NOT NULL, - `status` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `skip_scripts` tinyint(1) NOT NULL DEFAULT '0', - `owner_id` int unsigned NOT NULL, - `memory` int unsigned NOT NULL, - `swap` int NOT NULL, - `disk` int unsigned NOT NULL, - `io` int unsigned NOT NULL, - `cpu` int unsigned NOT NULL, - `threads` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `oom_killer` tinyint unsigned NOT NULL DEFAULT '0', - `allocation_id` int unsigned NOT NULL, - `egg_id` int unsigned NOT NULL, - `startup` text COLLATE utf8mb4_unicode_ci NOT NULL, - `image` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `allocation_limit` int unsigned DEFAULT NULL, - `database_limit` int unsigned DEFAULT '0', - `backup_limit` int unsigned NOT NULL DEFAULT '0', - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - `installed_at` timestamp NULL DEFAULT NULL, - `docker_labels` text COLLATE utf8mb4_unicode_ci, - PRIMARY KEY (`id`), - UNIQUE KEY `servers_uuid_unique` (`uuid`), - UNIQUE KEY `servers_uuidshort_unique` (`uuid_short`), - UNIQUE KEY `servers_allocation_id_unique` (`allocation_id`), - UNIQUE KEY `servers_external_id_unique` (`external_id`), - KEY `servers_node_id_foreign` (`node_id`), - KEY `servers_owner_id_foreign` (`owner_id`), - KEY `servers_egg_id_foreign` (`egg_id`), - CONSTRAINT `servers_allocation_id_foreign` FOREIGN KEY (`allocation_id`) REFERENCES `allocations` (`id`), - CONSTRAINT `servers_egg_id_foreign` FOREIGN KEY (`egg_id`) REFERENCES `eggs` (`id`), - CONSTRAINT `servers_node_id_foreign` FOREIGN KEY (`node_id`) REFERENCES `nodes` (`id`), - CONSTRAINT `servers_owner_id_foreign` FOREIGN KEY (`owner_id`) REFERENCES `users` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `sessions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `sessions` ( - `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `user_id` int DEFAULT NULL, - `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_agent` text COLLATE utf8mb4_unicode_ci, - `payload` text COLLATE utf8mb4_unicode_ci NOT NULL, - `last_activity` int NOT NULL, - UNIQUE KEY `sessions_id_unique` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `settings`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `settings` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `value` text COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `subusers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `subusers` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `user_id` int unsigned NOT NULL, - `server_id` int unsigned NOT NULL, - `permissions` json DEFAULT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `subusers_user_id_foreign` (`user_id`), - KEY `subusers_server_id_foreign` (`server_id`), - CONSTRAINT `subusers_server_id_foreign` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE CASCADE, - CONSTRAINT `subusers_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `tasks`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `tasks` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `schedule_id` int unsigned NOT NULL, - `sequence_id` int unsigned NOT NULL, - `action` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `payload` text COLLATE utf8mb4_unicode_ci NOT NULL, - `time_offset` int unsigned NOT NULL, - `is_queued` tinyint(1) NOT NULL, - `continue_on_failure` tinyint unsigned NOT NULL DEFAULT '0', - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `tasks_schedule_id_sequence_id_index` (`schedule_id`,`sequence_id`), - CONSTRAINT `tasks_schedule_id_foreign` FOREIGN KEY (`schedule_id`) REFERENCES `schedules` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `tasks_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `tasks_log` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `task_id` int unsigned NOT NULL, - `run_time` timestamp NOT NULL, - `run_status` int unsigned NOT NULL, - `response` text COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `user_ssh_keys`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_ssh_keys` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `user_id` int unsigned NOT NULL, - `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `fingerprint` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `public_key` text COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - `deleted_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `user_ssh_keys_user_id_foreign` (`user_id`), - CONSTRAINT `user_ssh_keys_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `users` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `external_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `name_first` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `name_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `password` text COLLATE utf8mb4_unicode_ci NOT NULL, - `remember_token` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `language` char(5) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'en', - `root_admin` tinyint unsigned NOT NULL DEFAULT '0', - `use_totp` tinyint unsigned NOT NULL, - `totp_secret` text COLLATE utf8mb4_unicode_ci, - `totp_authenticated_at` timestamp NULL DEFAULT NULL, - `gravatar` tinyint(1) NOT NULL DEFAULT '1', - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `users_uuid_unique` (`uuid`), - UNIQUE KEY `users_email_unique` (`email`), - UNIQUE KEY `users_username_unique` (`username`), - KEY `users_external_id_index` (`external_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (1,'2016_01_23_195641_add_allocations_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (2,'2016_01_23_195851_add_api_keys',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (3,'2016_01_23_200044_add_api_permissions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (4,'2016_01_23_200159_add_downloads',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (5,'2016_01_23_200421_create_failed_jobs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (6,'2016_01_23_200440_create_jobs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (7,'2016_01_23_200528_add_locations',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (8,'2016_01_23_200648_add_nodes',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (9,'2016_01_23_201433_add_password_resets',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (10,'2016_01_23_201531_add_permissions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (11,'2016_01_23_201649_add_server_variables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (12,'2016_01_23_201748_add_servers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (13,'2016_01_23_202544_add_service_options',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (14,'2016_01_23_202731_add_service_varibles',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (15,'2016_01_23_202943_add_services',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (16,'2016_01_23_203119_create_settings_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (17,'2016_01_23_203150_add_subusers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (18,'2016_01_23_203159_add_users',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (19,'2016_01_23_203947_create_sessions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (20,'2016_01_25_234418_rename_permissions_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (21,'2016_02_07_172148_add_databases_tables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (22,'2016_02_07_181319_add_database_servers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (23,'2016_02_13_154306_add_service_option_default_startup',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (24,'2016_02_20_155318_add_unique_service_field',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (25,'2016_02_27_163411_add_tasks_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (26,'2016_02_27_163447_add_tasks_log_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (27,'2016_03_18_155649_add_nullable_field_lastrun',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (28,'2016_08_30_212718_add_ip_alias',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (29,'2016_08_30_213301_modify_ip_storage_method',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (30,'2016_09_01_193520_add_suspension_for_servers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (31,'2016_09_01_211924_remove_active_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (32,'2016_09_02_190647_add_sftp_password_storage',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (33,'2016_09_04_171338_update_jobs_tables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (34,'2016_09_04_172028_update_failed_jobs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (35,'2016_09_04_182835_create_notifications_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (36,'2016_09_07_163017_add_unique_identifier',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (37,'2016_09_14_145945_allow_longer_regex_field',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (38,'2016_09_17_194246_add_docker_image_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (39,'2016_09_21_165554_update_servers_column_name',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (40,'2016_09_29_213518_rename_double_insurgency',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (41,'2016_10_07_152117_build_api_log_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (42,'2016_10_14_164802_update_api_keys',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (43,'2016_10_23_181719_update_misnamed_bungee',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (44,'2016_10_23_193810_add_foreign_keys_servers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (45,'2016_10_23_201624_add_foreign_allocations',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (46,'2016_10_23_202222_add_foreign_api_keys',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (47,'2016_10_23_202703_add_foreign_api_permissions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (48,'2016_10_23_202953_add_foreign_database_servers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (49,'2016_10_23_203105_add_foreign_databases',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (50,'2016_10_23_203335_add_foreign_nodes',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (51,'2016_10_23_203522_add_foreign_permissions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (52,'2016_10_23_203857_add_foreign_server_variables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (53,'2016_10_23_204157_add_foreign_service_options',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (54,'2016_10_23_204321_add_foreign_service_variables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (55,'2016_10_23_204454_add_foreign_subusers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (56,'2016_10_23_204610_add_foreign_tasks',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (57,'2016_11_11_220649_add_pack_support',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (58,'2016_11_11_231731_set_service_name_unique',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (59,'2016_11_27_142519_add_pack_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (60,'2016_12_01_173018_add_configurable_upload_limit',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (61,'2016_12_02_185206_correct_service_variables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (62,'2017_01_07_154228_create_node_configuration_tokens_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (63,'2017_01_12_135449_add_more_user_data',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (64,'2017_02_02_175548_UpdateColumnNames',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (65,'2017_02_03_140948_UpdateNodesTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (66,'2017_02_03_155554_RenameColumns',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (67,'2017_02_05_164123_AdjustColumnNames',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (68,'2017_02_05_164516_AdjustColumnNamesForServicePacks',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (69,'2017_02_09_174834_SetupPermissionsPivotTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (70,'2017_02_10_171858_UpdateAPIKeyColumnNames',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (71,'2017_03_03_224254_UpdateNodeConfigTokensColumns',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (72,'2017_03_05_212803_DeleteServiceExecutableOption',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (73,'2017_03_10_162934_AddNewServiceOptionsColumns',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (74,'2017_03_10_173607_MigrateToNewServiceSystem',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (75,'2017_03_11_215455_ChangeServiceVariablesValidationRules',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (76,'2017_03_12_150648_MoveFunctionsFromFileToDatabase',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (77,'2017_03_14_175631_RenameServicePacksToSingluarPacks',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (78,'2017_03_14_200326_AddLockedStatusToTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (79,'2017_03_16_181109_ReOrganizeDatabaseServersToDatabaseHost',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (80,'2017_03_16_181515_CleanupDatabasesDatabase',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (81,'2017_03_18_204953_AddForeignKeyToPacks',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (82,'2017_03_31_221948_AddServerDescriptionColumn',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (83,'2017_04_02_163232_DropDeletedAtColumnFromServers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (84,'2017_04_15_125021_UpgradeTaskSystem',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (85,'2017_04_20_171943_AddScriptsToServiceOptions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (86,'2017_04_21_151432_AddServiceScriptTrackingToServers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (87,'2017_04_27_145300_AddCopyScriptFromColumn',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (88,'2017_04_27_223629_AddAbilityToDefineConnectionOverSSLWithDaemonBehindProxy',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (89,'2017_05_01_141528_DeleteDownloadTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (90,'2017_05_01_141559_DeleteNodeConfigurationTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (91,'2017_06_10_152951_add_external_id_to_users',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (92,'2017_06_25_133923_ChangeForeignKeyToBeOnCascadeDelete',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (93,'2017_07_08_152806_ChangeUserPermissionsToDeleteOnUserDeletion',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (94,'2017_07_08_154416_SetAllocationToReferenceNullOnServerDelete',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (95,'2017_07_08_154650_CascadeDeletionWhenAServerOrVariableIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (96,'2017_07_24_194433_DeleteTaskWhenParentServerIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (97,'2017_08_05_115800_CascadeNullValuesForDatabaseHostWhenNodeIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (98,'2017_08_05_144104_AllowNegativeValuesForOverallocation',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (99,'2017_08_05_174811_SetAllocationUnqiueUsingMultipleFields',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (100,'2017_08_15_214555_CascadeDeletionWhenAParentServiceIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (101,'2017_08_18_215428_RemovePackWhenParentServiceOptionIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (102,'2017_09_10_225749_RenameTasksTableForStructureRefactor',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (103,'2017_09_10_225941_CreateSchedulesTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (104,'2017_09_10_230309_CreateNewTasksTableForSchedules',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (105,'2017_09_11_002938_TransferOldTasksToNewScheduler',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (106,'2017_09_13_211810_UpdateOldPermissionsToPointToNewScheduleSystem',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (107,'2017_09_23_170933_CreateDaemonKeysTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (108,'2017_09_23_173628_RemoveDaemonSecretFromServersTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (109,'2017_09_23_185022_RemoveDaemonSecretFromSubusersTable',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (110,'2017_10_02_202000_ChangeServicesToUseAMoreUniqueIdentifier',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (111,'2017_10_02_202007_ChangeToABetterUniqueServiceConfiguration',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (112,'2017_10_03_233202_CascadeDeletionWhenServiceOptionIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (113,'2017_10_06_214026_ServicesToNestsConversion',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (114,'2017_10_06_214053_ServiceOptionsToEggsConversion',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (115,'2017_10_06_215741_ServiceVariablesToEggVariablesConversion',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (116,'2017_10_24_222238_RemoveLegacySFTPInformation',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (117,'2017_11_11_161922_Add2FaLastAuthorizationTimeColumn',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (118,'2017_11_19_122708_MigratePubPrivFormatToSingleKey',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (119,'2017_12_04_184012_DropAllocationsWhenNodeIsDeleted',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (120,'2017_12_12_220426_MigrateSettingsTableToNewFormat',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (121,'2018_01_01_122821_AllowNegativeValuesForServerSwap',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (122,'2018_01_11_213943_AddApiKeyPermissionColumns',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (123,'2018_01_13_142012_SetupTableForKeyEncryption',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (124,'2018_01_13_145209_AddLastUsedAtColumn',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (125,'2018_02_04_145617_AllowTextInUserExternalId',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (126,'2018_02_10_151150_remove_unique_index_on_external_id_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (127,'2018_02_17_134254_ensure_unique_allocation_id_on_servers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (128,'2018_02_24_112356_add_external_id_column_to_servers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (129,'2018_02_25_160152_remove_default_null_value_on_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (130,'2018_02_25_160604_define_unique_index_on_users_external_id',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (131,'2018_03_01_192831_add_database_and_port_limit_columns_to_servers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (132,'2018_03_15_124536_add_description_to_nodes',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (133,'2018_05_04_123826_add_maintenance_to_nodes',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (134,'2018_09_03_143756_allow_egg_variables_to_have_longer_values',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (135,'2018_09_03_144005_allow_server_variables_to_have_longer_values',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (136,'2019_03_02_142328_set_allocation_limit_default_null',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (137,'2019_03_02_151321_fix_unique_index_to_account_for_host',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (138,'2020_03_22_163911_merge_permissions_table_into_subusers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (139,'2020_03_22_164814_drop_permissions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (140,'2020_04_03_203624_add_threads_column_to_servers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (141,'2020_04_03_230614_create_backups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (142,'2020_04_04_131016_add_table_server_transfers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (143,'2020_04_10_141024_store_node_tokens_as_encrypted_value',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (144,'2020_04_17_203438_allow_nullable_descriptions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (145,'2020_04_22_055500_add_max_connections_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (146,'2020_04_26_111208_add_backup_limit_to_servers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (147,'2020_05_20_234655_add_mounts_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (148,'2020_05_21_192756_add_mount_server_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (149,'2020_07_02_213612_create_user_recovery_tokens_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (150,'2020_07_09_201845_add_notes_column_for_allocations',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (151,'2020_08_20_205533_add_backup_state_column_to_backups',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (152,'2020_08_22_132500_update_bytes_to_unsigned_bigint',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (153,'2020_08_23_175331_modify_checksums_column_for_backups',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (154,'2020_09_13_110007_drop_packs_from_servers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (155,'2020_09_13_110021_drop_packs_from_api_key_permissions',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (156,'2020_09_13_110047_drop_packs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (157,'2020_09_13_113503_drop_daemon_key_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (158,'2020_10_10_165437_change_unique_database_name_to_account_for_server',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (159,'2020_10_26_194904_remove_nullable_from_schedule_name_field',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (160,'2020_11_02_201014_add_features_column_to_eggs',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (161,'2020_12_12_102435_support_multiple_docker_images_and_updates',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (162,'2020_12_14_013707_make_successful_nullable_in_server_transfers',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (163,'2020_12_17_014330_add_archived_field_to_server_transfers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (164,'2020_12_24_092449_make_allocation_fields_json',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (165,'2020_12_26_184914_add_upload_id_column_to_backups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (166,'2021_01_10_153937_add_file_denylist_to_egg_configs',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (167,'2021_01_13_013420_add_cron_month',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (168,'2021_01_17_102401_create_audit_logs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (169,'2021_01_17_152623_add_generic_server_status_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (170,'2021_01_26_210502_update_file_denylist_to_json',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (171,'2021_02_23_205021_add_index_for_server_and_action',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (172,'2021_02_23_212657_make_sftp_port_unsigned_int',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (173,'2021_03_21_104718_force_cron_month_field_to_have_value_if_missing',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (174,'2021_05_01_092457_add_continue_on_failure_option_to_tasks',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (175,'2021_05_01_092523_add_only_run_when_server_online_option_to_schedules',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (176,'2021_05_03_201016_add_support_for_locking_a_backup',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (177,'2021_07_12_013420_remove_userinteraction',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (178,'2021_07_17_211512_create_user_ssh_keys_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (179,'2021_08_03_210600_change_successful_field_to_default_to_false_on_backups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (180,'2021_08_21_175111_add_foreign_keys_to_mount_node_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (181,'2021_08_21_175118_add_foreign_keys_to_mount_server_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (182,'2021_08_21_180921_add_foreign_keys_to_egg_mount_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (183,'2022_01_25_030847_drop_google_analytics',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (184,'2022_05_07_165334_migrate_egg_images_array_to_new_format',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (185,'2022_05_28_135717_create_activity_logs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (186,'2022_05_29_140349_create_activity_log_actors_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (187,'2022_06_18_112822_track_api_key_usage_for_activity_events',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (188,'2022_08_16_214400_add_force_outgoing_ip_column_to_eggs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (189,'2022_08_16_230204_add_installed_at_column_to_servers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (190,'2022_12_12_213937_update_mail_settings_to_new_format',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (191,'2023_01_24_210051_add_uuid_column_to_failed_jobs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (192,'2023_02_23_191004_add_expires_at_column_to_api_keys_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (193,'2024_03_12_154408_remove_nests_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (194,'2024_03_14_055537_remove_locations_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (195,'2024_04_14_002250_update_column_names',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (196,'2024_04_20_214441_add_egg_var_sort',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (197,'2024_04_28_184102_add_mounts_to_api_keys',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (198,'2024_05_08_094823_rename_oom_disabled_column_to_oom_killer',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (199,'2024_05_16_091207_add_cpu_columns_to_nodes_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (200,'2024_05_20_002841_add_docker_container_label',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (201,'2024_05_31_204646_fix_old_encrypted_values',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (202,'2024_06_02_205622_update_stock_egg_uuid',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (203,'2024_06_04_085042_add_daemon_sftp_alias_column_to_nodes',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (204,'2024_06_05_220135_update_egg_config_variables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (205,'2024_06_08_020904_refix_egg_variables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (206,'2024_06_11_220722_update_field_length',1); diff --git a/docker/Caddyfile b/docker/Caddyfile new file mode 100644 index 0000000000..48c6d8e888 --- /dev/null +++ b/docker/Caddyfile @@ -0,0 +1,18 @@ +{ + servers { + ## docs https://caddyserver.com/docs/caddyfile/options#trusted-proxies + {$CADDY_TRUSTED_PROXIES} + {$CADDY_STRICT_PROXIES} + } + admin off + {$CADDY_AUTO_HTTPS} + {$CADDY_LE_EMAIL} +} + +{$CADDY_APP_URL} { + root * /var/www/html/public + encode gzip + + file_server + php_fastcgi 127.0.0.1:9000 +} diff --git a/docker/crontab b/docker/crontab new file mode 100644 index 0000000000..f67a6bf177 --- /dev/null +++ b/docker/crontab @@ -0,0 +1 @@ +* * * * * php /var/www/html/artisan schedule:run diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000000..f69d737a64 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,109 @@ +#!/bin/ash -e +# shellcheck shell=dash + +# check for .env file or symlink and generate app keys if missing +if [ -f /pelican-data/.env ]; then + echo ".env vars exist." + # load specific env vars from .env used in the entrypoint and they are not already set + for VAR in "APP_KEY" "APP_INSTALLED" "DB_CONNECTION" "DB_HOST" "DB_PORT"; do + echo "checking for ${VAR}" + ## skip if it looks like it might try to execute code + if (grep "${VAR}" .env | grep -qE "\$\(|=\`|\$#"); then echo "var in .env may be executable or a comment, skipping"; continue; fi + # if the variable is in .env then set it + if (grep -q "${VAR}" .env); then + echo "loading ${VAR} from .env" + export "$(grep "${VAR}" .env | sed 's/"//g')" + continue + fi + ## variable wasn't loaded or in the env to set + echo "didn't find variable to set" + done +else + echo ".env vars don't exist." + # webroot .env is symlinked to this path + touch /pelican-data/.env + + # manually generate a key because key generate --force fails + if [ -z "${APP_KEY}" ]; then + echo "No key set, Generating key." + APP_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) + echo "APP_KEY=$APP_KEY" > /pelican-data/.env + echo "Generated app key written to .env file" + else + echo "APP_KEY exists in environment, using that." + echo "APP_KEY=$APP_KEY" > /pelican-data/.env + fi + + # enable installer + echo "APP_INSTALLED=false" >> /pelican-data/.env +fi + +# create directories for volumes +mkdir -p /pelican-data/database /pelican-data/storage/avatars /pelican-data/storage/fonts /pelican-data/storage/icons /pelican-data/plugins /var/www/html/storage/logs/supervisord 2>/dev/null + +# if the app is installed then we need to run migrations on start. New installs will run migrations when you run the installer. +if [ "${APP_INSTALLED}" = "true" ]; then + #if the db is anything but sqlite wait until it's accepting connections + if [ "${DB_CONNECTION}" != "sqlite" ]; then + # check for DB up before starting the panel + echo "Checking database status." + until nc -z -v -w30 $DB_HOST $DB_PORT + do + echo "Waiting for database connection..." + # wait for 1 seconds before check again + sleep 1 + done + else + echo "using sqlite database" + fi + + # run migration + php artisan migrate --force +fi + +echo "Optimizing Filament" +php artisan filament:optimize + +# default to caddy not starting +export SUPERVISORD_CADDY=false +export CADDY_APP_URL="${APP_URL}" + +# checking if app url is https +if (echo "${APP_URL}" | grep -qE '^https://'); then + # check lets encrypt email was set without a proxy + if [ -z "${LE_EMAIL}" ] && [ "${BEHIND_PROXY}" != "true" ]; then + echo "when app url is https a lets encrypt email must be set when not behind a proxy" + exit 1 + fi + echo "https domain found setting email var" + export CADDY_LE_EMAIL="email ${LE_EMAIL}" +fi + +# when running behind a proxy +if [ "${BEHIND_PROXY}" = "true" ]; then + echo "running behind proxy" + echo "listening on port 80 internally" + export CADDY_LE_EMAIL="" + export CADDY_APP_URL=":80" + export CADDY_AUTO_HTTPS="auto_https off" + export ASSET_URL="${APP_URL}" +fi + +# disable caddy if SKIP_CADDY is set +if [ "${SKIP_CADDY:-}" = "true" ]; then + echo "Starting PHP-FPM only" +else + echo "Starting PHP-FPM and Caddy" + # enable caddy + export SUPERVISORD_CADDY=true + + # handle trusted proxies for caddy when variable has data + if [ -n "${TRUSTED_PROXIES:-}" ]; then + FORMATTED_PROXIES=$(echo "trusted_proxies static ${TRUSTED_PROXIES}" | sed 's/,/ /g') + export CADDY_TRUSTED_PROXIES="${FORMATTED_PROXIES}" + export CADDY_STRICT_PROXIES="trusted_proxies_strict" + fi +fi + +echo "Starting Supervisord" +exec "$@" \ No newline at end of file diff --git a/docker/healthcheck.sh b/docker/healthcheck.sh new file mode 100644 index 0000000000..8eef81989f --- /dev/null +++ b/docker/healthcheck.sh @@ -0,0 +1,9 @@ +#!/bin/ash -e + +if [ ${SKIP_CADDY} ! "true" ]; then + curl -f http://localhost/up || exit 1 +fi + +cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 2 + +exit 0 \ No newline at end of file diff --git a/docker/supervisord.conf b/docker/supervisord.conf new file mode 100644 index 0000000000..870814f485 --- /dev/null +++ b/docker/supervisord.conf @@ -0,0 +1,47 @@ +[unix_http_server] +file=/tmp/supervisor.sock ; path to your socket file +username=dummy +password=dummy + +[supervisord] +logfile=/var/www/html/storage/logs/supervisord/supervisord.log ; supervisord log file +logfile_maxbytes=50MB ; maximum size of logfile before rotation +logfile_backups=2 ; number of backed up logfiles +loglevel=error ; info, debug, warn, trace +pidfile=/var/run/supervisord/supervisord.pid ; pidfile location +nodaemon=true ; run supervisord as a daemon +minfds=1024 ; number of startup file descriptors +minprocs=200 ; number of process descriptors + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket +username=dummy +password=dummy + +[program:php-fpm] +command=/usr/local/sbin/php-fpm -F +autostart=true +autorestart=true + +[program:queue-worker] +command=/usr/local/bin/php /var/www/html/artisan queue:work --tries=3 +autostart=true +autorestart=true + +[program:caddy] +command=caddy run --config /etc/caddy/Caddyfile --adapter caddyfile +autostart=%(ENV_SUPERVISORD_CADDY)s +autorestart=%(ENV_SUPERVISORD_CADDY)s +priority=10 +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +redirect_stderr=true + +[program:supercronic] +command=supercronic -overlapping /etc/crontabs/crontab +autostart=true +autorestart=true +redirect_stderr=true diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index abb02f3860..0000000000 --- a/jest.config.js +++ /dev/null @@ -1,28 +0,0 @@ -const { pathsToModuleNameMapper } = require('ts-jest'); -const { compilerOptions } = require('./tsconfig'); - -/** @type {import('ts-jest').InitialOptionsTsJest} */ -module.exports = { - preset: 'ts-jest', - globals: { - 'ts-jest': { - isolatedModules: true, - }, - }, - moduleFileExtensions: ['js', 'ts', 'tsx', 'd.ts', 'json', 'node'], - moduleNameMapper: { - '\\.(jpe?g|png|gif|svg)$': '/resources/scripts/__mocks__/file.ts', - '\\.(s?css|less)$': 'identity-obj-proxy', - ...pathsToModuleNameMapper(compilerOptions.paths, { - prefix: '/', - }), - }, - setupFilesAfterEnv: [ - '/resources/scripts/setup-tests.ts', - ], - transform: { - '.*\\.[t|j]sx$': 'babel-jest', - '.*\\.ts$': 'ts-jest', - }, - testPathIgnorePatterns: ['/node_modules/'], -}; diff --git a/lang/af/activity.php b/lang/af/activity.php deleted file mode 100644 index 98d9f6f7eb..0000000000 --- a/lang/af/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Kon nie aanmeld nie', - 'success' => 'Aangemeld', - 'password-reset' => 'Wagwoord herstel', - 'reset-password' => 'Versoek wagwoordterugstelling', - 'checkpoint' => 'Twee-faktor-stawing versoek', - 'recovery-token' => 'Gebruik twee-faktor-hersteltoken', - 'token' => 'Twee-faktor uitdaging opgelos', - 'ip-blocked' => 'Geblokkeerde versoek van ongelyste IP-adres vir :identifier', - 'sftp' => [ - 'fail' => 'Kon nie SFTP aanmeld nie', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'E-pos verander van :oud na :nuut', - 'password-changed' => 'Verander wagwoord', - ], - 'api-key' => [ - 'create' => 'Skep nuwe API-sleutel:identifiseerder', - 'delete' => 'Geskrap API-sleutel:identifiseerder', - ], - 'ssh-key' => [ - 'create' => 'SSH-sleutel :vingerafdruk by rekening gevoeg', - 'delete' => 'SSH-sleutel :vingerafdruk van rekening verwyder', - ], - 'two-factor' => [ - 'create' => 'Geaktiveerde twee-faktor-autagtiging', - 'delete' => 'Gedeaktiveerde twee-faktor-aut', - ], - ], - 'server' => [ - 'reinstall' => 'Herinstalleer bediener', - 'console' => [ - 'command' => '":opdrag" op die bediener uitgevoer', - ], - 'power' => [ - 'start' => 'Het die bediener begin', - 'stop' => 'Het die bediener gestop', - 'restart' => 'Het die bediener herbegin', - 'kill' => 'Het die bedienerproses doodgemaak', - ], - 'backup' => [ - 'download' => 'Het die :name rugsteun afgelaai', - 'delete' => 'Het die :name rugsteun uitgevee', - 'restore' => 'Het die :name-rugsteun herstel (geskrap lêers: :truncate)', - 'restore-complete' => 'Voltooide herstel van die :name rugsteun', - 'restore-failed' => 'Kon nie die herstel van die :name rugsteun voltooi nie', - 'start' => 'Het \'n nuwe rugsteun :name begin', - 'complete' => 'Het die :name-rugsteun as voltooi gemerk', - 'fail' => 'Het die :name-rugsteun as voltooi gemerk', - 'lock' => 'Het die :name rugsteun uitgevee', - 'unlock' => 'Het die :name rugsteun afgelaai', - ], - 'database' => [ - 'create' => 'Create new database file', - 'rotate-password' => 'Wagwoord geroteer vir databasis :naam', - 'delete' => 'Geskrap databasis :naam', - ], - 'file' => [ - 'compress_one' => 'Saamgeperste :directory:lêer', - 'compress_other' => 'Saamgeperste :count lêers in :directory', - 'read' => 'Het die inhoud van :file bekyk', - 'copy' => 'Het \'n kopie van :file geskep', - 'create-directory' => 'Geskep gids :gids:naam', - 'decompress' => 'Gedekomprimeerde :lêers in :directory', - 'delete_one' => 'Geskrap :gids:lêers.0', - 'delete_other' => 'Saamgeperste :count lêers in :directory', - 'download' => 'Afgelaai: lêer', - 'pull' => 'Het \'n afstandlêer afgelaai vanaf :url na :directory', - 'rename_one' => 'Hernoem :gids:lêers.0.van na :gids:lêers.0.na', - 'rename_other' => 'Hernoem :count lêers in :directory', - 'write' => 'Het nuwe inhoud na :file geskryf', - 'upload' => 'Het \'n lêeroplaai begin', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/af/admin/eggs.php b/lang/af/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/af/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/af/admin/node.php b/lang/af/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/af/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/af/admin/server.php b/lang/af/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/af/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/af/admin/user.php b/lang/af/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/af/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/af/auth.php b/lang/af/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/af/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/af/command/messages.php b/lang/af/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/af/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/af/dashboard/account.php b/lang/af/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/af/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/af/dashboard/index.php b/lang/af/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/af/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/af/exceptions.php b/lang/af/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/af/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/af/pagination.php b/lang/af/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/af/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/af/passwords.php b/lang/af/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/af/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/af/server/users.php b/lang/af/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/af/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/af/strings.php b/lang/af/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/af/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/af/validation.php b/lang/af/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/af/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/ar/activity.php b/lang/ar/activity.php index 5ab03716bc..fe12b7652d 100644 --- a/lang/ar/activity.php +++ b/lang/ar/activity.php @@ -10,38 +10,37 @@ 'auth' => [ 'fail' => 'فشل تسجيل الدخول', 'success' => 'تم تسجيل الدخول', - 'password-reset' => 'تم إعادة تعيين كلمة المرور', - 'reset-password' => 'طلب إعادة تعيين كلمة المرور', - 'checkpoint' => 'طلب التحقق ذو العاملين', - 'recovery-token' => 'استخدم رمز الاسترداد ذو العاملين', - 'token' => 'تم حل تحدي ذو العاملين', - 'ip-blocked' => 'تم حظر الطلب من عنوان IP غير مدرج لـ :identifier', + 'password-reset' => 'إعادة تعيين كلمة المرور', + 'checkpoint' => 'تم طلب المصادقة الثنائية', + 'recovery-token' => 'تم استخدام رمز استعادة المصادقة الثنائية', + 'token' => 'تم حل تحدي المصادقة الثنائية', + 'ip-blocked' => 'تم حظر الطلب من عنوان IP غير مدرج لـ :identifier', 'sftp' => [ 'fail' => 'فشل تسجيل الدخول عبر SFTP', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'تغيير البريد الإلكتروني من :old إلى :new', + 'username-changed' => 'تم تغيير اسم المستخدم من :old إلى :new', + 'email-changed' => 'تم تغيير البريد الإلكتروني من :old إلى :new', 'password-changed' => 'تم تغيير كلمة المرور', ], 'api-key' => [ - 'create' => 'تم إنشاء مفتاح API جديد :identifier', - 'delete' => 'تم حذف مفتاح API :identifier', + 'create' => 'تم إنشاء مفتاح API جديد :identifier', + 'delete' => 'تم حذف مفتاح API :identifier', ], 'ssh-key' => [ - 'create' => 'تم إضافة مفتاح SSH :fingerprint إلى الحساب', - 'delete' => 'تم إزالة مفتاح SSH :fingerprint من الحساب', + 'create' => 'تمت إضافة مفتاح SSH :fingerprint إلى الحساب', + 'delete' => 'تمت إزالة مفتاح SSH :fingerprint من الحساب', ], 'two-factor' => [ - 'create' => 'تم تفعيل التحقق ذو العاملين', - 'delete' => 'تم تعطيل التحقق ذو العاملين', + 'create' => 'تم تمكين المصادقة الثنائية', + 'delete' => 'تم تعطيل المصادقة الثنائية', ], ], 'server' => [ - 'reinstall' => 'تم إعادة تثبيت الخادم', 'console' => [ - 'command' => 'تنفيذ الأمر ":command" على الخادم', + 'command' => 'تم تنفيذ الأمر ":command" على الخادم', ], 'power' => [ 'start' => 'تم تشغيل الخادم', @@ -50,81 +49,77 @@ 'kill' => 'تم إنهاء عملية الخادم', ], 'backup' => [ - 'download' => 'تم تنزيل النسخة الاحتياطية :name', - 'delete' => 'تم حذف النسخة الاحتياطية :name', - 'restore' => 'تم استعادة النسخة الاحتياطية :name (تم حذف الملفات: :truncate)', - 'restore-complete' => 'تم إكمال استعادة النسخة الاحتياطية :name', - 'restore-failed' => 'فشل في إكمال استعادة النسخة الاحتياطية :name', - 'start' => 'تم بدء نسخة احتياطية جديدة :name', - 'complete' => 'تم وضع علامة على النسخة الاحتياطية :name كمكتملة', - 'fail' => 'تم وضع علامة على النسخة الاحتياطية :name كفاشلة', - 'lock' => 'تم قفل النسخة الاحتياطية :name', - 'unlock' => 'تم فتح قفل النسخة الاحتياطية :name', + 'download' => 'تم تنزيل النسخة الاحتياطية :name', + 'delete' => 'تم حذف النسخة الاحتياطية :name', + 'restore' => 'تمت استعادة النسخة الاحتياطية :name (تم حذف الملفات: :truncate)', + 'restore-complete' => 'تمت استعادة النسخة الاحتياطية :name بنجاح', + 'restore-failed' => 'فشلت استعادة النسخة الاحتياطية :name', + 'start' => 'تم بدء نسخة احتياطية جديدة :name', + 'complete' => 'تم تمييز النسخة الاحتياطية :name كمكتملة', + 'fail' => 'تم تمييز النسخة الاحتياطية :name كفاشلة', + 'lock' => 'تم قفل النسخة الاحتياطية :name', + 'unlock' => 'تم فك قفل النسخة الاحتياطية :name', + 'rename' => 'تم إعادة تسمية النسخة الاحتياطية من ":old_name" إلى ":new_name"', ], 'database' => [ - 'create' => 'تم إنشاء قاعدة بيانات جديدة :name', - 'rotate-password' => 'تم تغيير كلمة المرور لقاعدة البيانات :name', - 'delete' => 'تم حذف قاعدة البيانات :name', + 'create' => 'تم إنشاء قاعدة بيانات جديدة :name', + 'rotate-password' => 'تم تغيير كلمة مرور قاعدة البيانات :name', + 'delete' => 'تم حذف قاعدة البيانات :name', ], 'file' => [ - 'compress_one' => 'تم ضغط :directory:file', - 'compress_other' => 'تم ضغط :count ملف في :directory', - 'read' => 'تم عرض محتويات :file', - 'copy' => 'تم إنشاء نسخة من :file', - 'create-directory' => 'تم إنشاء الدليل :directory:name', - 'decompress' => 'تم فك ضغط :files في :directory', - 'delete_one' => 'تم حذف :directory:files.0', - 'delete_other' => 'تم حذف :count ملف في :directory', - 'download' => 'تم تنزيل :file', - 'pull' => 'تم تنزيل ملف من بعد من :url إلى :directory', - 'rename_one' => 'تم تغيير اسم :directory:files.0.from إلى :directory:files.0.to', - 'rename_other' => 'تم تغيير اسم :count ملف في :directory', - 'write' => 'تم كتابة محتوى جديد في :file', - 'upload' => 'بدء تحميل ملف', - 'uploaded' => 'تم رفع :directory:file', + 'compress' => 'تم ضغط :directory:files|تم ضغط :count ملفات في :directory', + 'read' => 'تم عرض محتوى :file', + 'copy' => 'تم إنشاء نسخة من :file', + 'create-directory' => 'تم إنشاء المجلد :directory:name', + 'decompress' => 'تم فك ضغط :file في :directory', + 'delete' => 'تم حذف :directory:files|تم حذف :count ملفات في :directory', + 'download' => 'تم تنزيل :file', + 'pull' => 'تم تنزيل ملف عن بعد من :url إلى :directory', + 'rename' => 'تم نقل/إعادة تسمية :from إلى :to|تم نقل/إعادة تسمية :count ملفات في :directory', + 'write' => 'تمت كتابة محتوى جديد إلى :file', + 'upload' => 'تم بدء رفع ملف', + 'uploaded' => 'تم رفع :directory:file', ], 'sftp' => [ - 'denied' => 'تم حظر الوصول عبر SFTP بسبب الأذونات', - 'create_one' => 'تم إنشاء :files.0', - 'create_other' => 'تم إنشاء :count ملف جديد', - 'write_one' => 'تم تعديل محتويات :files.0', - 'write_other' => 'تم تعديل محتويات :count ملف', - 'delete_one' => 'تم حذف :files.0', - 'delete_other' => 'تم حذف :count ملف', - 'create-directory_one' => 'تم إنشاء دليل :files.0', - 'create-directory_other' => 'تم إنشاء :count مجلد', - 'rename_one' => 'تم تغيير اسم :files.0.from إلى :files.0.to', - 'rename_other' => 'تم تغيير اسم أو نقل :count ملف', + 'denied' => 'تم حظر الوصول إلى SFTP بسبب الأذونات', + 'create' => 'تم إنشاء :files|تم إنشاء :count ملفات جديدة', + 'write' => 'تم تعديل محتوى :files|تم تعديل محتوى :count ملفات', + 'delete' => 'تم حذف :files|تم حذف :count ملفات', + 'create-directory' => 'تم إنشاء المجلد :files|تم إنشاء :count مجلدات', + 'rename' => 'تمت إعادة تسمية :from إلى :to|تمت إعادة تسمية أو نقل :count ملفات', ], 'allocation' => [ - 'create' => 'تم إضافة :allocation إلى الخادم', - 'notes' => 'تم تحديث الملاحظات لـ :allocation من ":old" إلى ":new"', - 'primary' => 'تم تعيين :allocation كتخصيص أساسي للخادم', - 'delete' => 'تم حذف التخصيص :allocation', + 'create' => 'تمت إضافة :allocation إلى الخادم', + 'notes' => 'تم تحديث الملاحظات لـ :allocation من ":old" إلى ":new"', + 'primary' => 'تم تعيين :allocation كالتخصيص الأساسي للخادم', + 'delete' => 'تم حذف التخصيص :allocation', ], 'schedule' => [ - 'create' => 'تم إنشاء جدول :name', - 'update' => 'تم تحديث جدول :name', - 'execute' => 'تم تنفيذ جدول :name يدويًا', - 'delete' => 'تم حذف جدول :name', + 'create' => 'تم إنشاء الجدولة :name', + 'update' => 'تم تحديث الجدولة :name', + 'execute' => 'تم تنفيذ الجدولة :name يدويًا', + 'delete' => 'تم حذف الجدولة :name', ], 'task' => [ - 'create' => 'تم إنشاء مهمة ":action" جديدة لجدول :name', - 'update' => 'تم تحديث مهمة ":action" لجدول :name', - 'delete' => 'تم حذف مهمة لجدول :name', + 'create' => 'تم إنشاء مهمة جديدة ":action" لجدولة :name', + 'update' => 'تم تحديث المهمة ":action" لجدولة :name', + 'delete' => 'تم حذف ":action" لمهمة الجدول :name', ], 'settings' => [ - 'rename' => 'تم تغيير اسم الخادم من :old إلى :new', - 'description' => 'تم تغيير وصف الخادم من :old إلى :new', + 'rename' => 'تمت إعادة تسمية الخادم من ":old" إلى ":new"', + 'description' => 'تم تغيير وصف الخادم من ":old" إلى ":new"', + 'reinstall' => 'تم إعادة تثبيت الخادم', ], 'startup' => [ - 'edit' => 'تم تغيير متغير :variable من ":old" إلى ":new"', - 'image' => 'تم تحديث صورة Docker للخادم من :old إلى :new', + 'edit' => 'تم تغيير المتغير :variable من ":old" إلى ":new"', + 'image' => 'تم تحديث صورة Docker للخادم من :old إلى :new', + 'command' => 'تم تحديث أمر بدء التشغيل للخادم من :old إلى :new', ], 'subuser' => [ - 'create' => 'تم إضافة :email كمستخدم فرعي', - 'update' => 'تم تحديث أذونات المستخدم الفرعي لـ :email', - 'delete' => 'تم إزالة :email كمستخدم فرعي', + 'create' => 'تمت إضافة :email كمستخدم فرعي', + 'update' => 'تم تحديث أذونات المستخدم الفرعي :email', + 'delete' => 'تمت إزالة :email كمستخدم فرعي', ], + 'crashed' => 'تعطل الخادم', ], ]; diff --git a/lang/ar/admin/apikey.php b/lang/ar/admin/apikey.php new file mode 100644 index 0000000000..c1bb639841 --- /dev/null +++ b/lang/ar/admin/apikey.php @@ -0,0 +1,27 @@ + 'مفاتيح API للتطبيق', + 'empty' => 'لا توجد مفاتيح API', + 'whitelist' => 'عناوين IPv4 المسموح بها', + 'whitelist_help' => 'يمكن تقييد مفاتيح API بحيث تعمل فقط من عناوين IPv4 محددة. أدخل كل عنوان في سطر جديد.', + 'whitelist_placeholder' => 'مثال: 127.0.0.1 أو 192.168.1.1', + 'description' => 'الوصف', + 'description_help' => 'وصف موجز لاستخدام هذا المفتاح.', + 'nav_title' => 'مفاتيح API', + 'model_label' => 'مفتاح API للتطبيق', + 'model_label_plural' => 'مفاتيح API للتطبيق', + 'table' => [ + 'key' => 'المفتاح', + 'description' => 'الوصف', + 'last_used' => 'آخر استخدام', + 'created' => 'تم الإنشاء', + 'created_by' => 'تم الإنشاء بواسطة', + 'never_used' => 'لم يُستخدم أبدًا', + ], + 'permissions' => [ + 'none' => 'لا شيء', + 'read' => 'قراءة', + 'read_write' => 'قراءة وكتابة', + ], +]; diff --git a/lang/ar/admin/dashboard.php b/lang/ar/admin/dashboard.php new file mode 100644 index 0000000000..18b5116d9d --- /dev/null +++ b/lang/ar/admin/dashboard.php @@ -0,0 +1,45 @@ + 'مرحبًا بك في Pelican!', + 'version' => 'الإصدار: :version', + 'advanced' => 'متقدم', + 'server' => 'الخادم', + 'user' => 'المستخدم', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'معلومات للمطورين', + 'content' => 'شكرًا لك على تجربة الإصدار التجريبي!', + 'extra_note' => 'إذا واجهت أي مشاكل، يرجى الإبلاغ عنها على GitHub.', + 'button_issues' => 'إنشاء مشكلة', + 'button_features' => 'مناقشة الميزات', + ], + 'intro-update-available' => [ + 'heading' => 'تحديث متاح', + 'content' => ':latestVersion متوفر الآن! اقرأ وثائقنا لتحديث اللوحة الخاصة بك.', + 'button_changelog' => 'ما الجديد؟', + ], + 'intro-no-update' => [ + 'heading' => 'لوحتك محدثة', + 'content' => 'أنت تستخدم حاليًا الإصدار :version. لوحتك محدثة بالكامل!', + ], + 'intro-first-node' => [ + 'heading' => 'لم يتم اكتشاف أي عقد', + 'content' => 'يبدو أنه لم يتم إعداد أي عقد حتى الآن، لكن لا تقلق، يمكنك النقر على زر الإجراء لإنشاء العقدة الأولى!', + 'extra_note' => 'إذا واجهت أي مشاكل، يرجى الإبلاغ عنها على GitHub.', + 'button_label' => 'إنشاء العقدة الأولى في Pelican', + ], + 'intro-support' => [ + 'heading' => 'دعم Pelican', + 'content' => 'شكرًا لاستخدامك Pelican، لقد تحقق هذا بفضل دعمك، ودعم المساهمين، وبقية داعمينا!', + 'extra_note' => 'نقدر أي نوع من الدعم من الجميع.', + 'button_translate' => 'المساعدة في الترجمة', + 'button_donate' => 'التبرع مباشرة', + ], + 'intro-help' => [ + 'heading' => 'بحاجة إلى مساعدة؟', + 'content' => 'تحقق من الوثائق أولًا! إذا كنت لا تزال بحاجة إلى المساعدة، انضم إلى خادم الديسكورد الخاص بنا!', + 'button_docs' => 'قراءة الوثائق', + ], + ], +]; diff --git a/lang/ar/admin/databasehost.php b/lang/ar/admin/databasehost.php new file mode 100644 index 0000000000..5ec73f5538 --- /dev/null +++ b/lang/ar/admin/databasehost.php @@ -0,0 +1,73 @@ + 'مضيفو قواعد البيانات', + 'model_label' => 'مضيف قاعدة بيانات', + 'model_label_plural' => 'مضيفو قواعد البيانات', + 'table' => [ + 'database' => 'قاعدة البيانات', + 'name' => 'الاسم', + 'host' => 'المضيف', + 'port' => 'المنفذ', + 'name_helper' => 'ترك هذا الحقل فارغًا سيؤدي إلى إنشاء اسم عشوائي تلقائيًا', + 'username' => 'اسم المستخدم', + 'password' => 'كلمة المرور', + 'remote' => 'الاتصالات من', + 'remote_helper' => 'المكان الذي يجب السماح بالاتصالات منه. اتركه فارغًا للسماح بالاتصالات من أي مكان.', + 'max_connections' => 'الحد الأقصى للاتصالات', + 'created_at' => 'تم الإنشاء في', + 'connection_string' => 'سلسلة اتصال JDBC', + ], + 'error' => 'خطأ في الاتصال بالمضيف', + 'host' => 'المضيف', + 'host_help' => 'عنوان IP أو اسم النطاق الذي يجب استخدامه عند محاولة الاتصال بهذا المضيف MySQL من هذه اللوحة لإنشاء قواعد بيانات جديدة.', + 'port' => 'المنفذ', + 'port_help' => 'المنفذ الذي يعمل عليه MySQL لهذا المضيف.', + 'max_database' => 'الحد الأقصى لعدد قواعد البيانات', + 'max_databases_help' => 'الحد الأقصى لعدد قواعد البيانات التي يمكن إنشاؤها على هذا المضيف. إذا تم الوصول إلى الحد، فلن يمكن إنشاء قواعد بيانات جديدة على هذا المضيف. اتركه فارغًا ليكون غير محدود.', + 'display_name' => 'اسم العرض', + 'display_name_help' => 'عنوان IP أو اسم المجال الذي يجب أن يظهر للمستخدم النهائي.', + 'username' => 'اسم المستخدم', + 'username_help' => 'اسم المستخدم لحساب لديه أذونات كافية لإنشاء مستخدمين جدد وقواعد بيانات على النظام.', + 'password' => 'كلمة المرور', + 'password_help' => 'كلمة المرور الخاصة بمستخدم قاعدة البيانات.', + 'linked_nodes' => 'العقد المرتبطة', + 'linked_nodes_help' => 'يكون هذا الإعداد افتراضيًا فقط لهذا المضيف عند إضافة قاعدة بيانات إلى خادم على العقدة المحددة.', + 'connection_error' => 'خطأ في الاتصال بمضيف قاعدة البيانات', + 'no_database_hosts' => 'لا توجد مضيفات قواعد بيانات', + 'no_nodes' => 'لا توجد عقد', + 'delete_help' => 'مضيف قاعدة البيانات يحتوي على قواعد بيانات', + 'unlimited' => 'غير محدود', + 'anywhere' => 'في أي مكان', + + 'rotate' => 'تدوير', + 'rotate_password' => 'تدوير كلمة المرور', + 'rotated' => 'تم تدوير كلمة المرور', + 'rotate_error' => 'فشل تدوير كلمة المرور', + 'databases' => 'قواعد البيانات', + + 'setup' => [ + 'preparations' => 'التحضيرات', + 'database_setup' => 'إعداد قاعدة البيانات', + 'panel_setup' => 'إعداد اللوحة', + + 'note' => 'حالياً، يتم دعم قواعد البيانات MySQL/MariaDB فقط لمضيفي قاعدة البيانات!', + 'different_server' => 'هل اللوحة وقاعدة البيانات ليسا على نفس الخادم؟', + + 'database_user' => 'مستخدم قاعدة البيانات', + 'cli_login' => 'استخدم mysql -u root -p للوصول إلى mysql cli.', + 'command_create_user' => 'الأمر لإنشاء المستخدم', + 'command_assign_permissions' => 'الأمر لتعيين الصلاحيات', + 'cli_exit' => 'للخروج من mysql cli عليك تشغيل الأمر exit.', + 'external_access' => 'الوصول الخارجي', + 'allow_external_access' => ' +

من المحتمل أنك ستحتاج إلى السماح بالوصول الخارجي إلى قاعدة البيانات MySQL حتى تتمكن الخوادم من الاتصال به.

+
+

لتفعل ذلك، عليك فتح الملفmy.cnf، الذي يختلف مكانه اعتمادا على نظام التشغيل وكيفية تثبيت قاعدة البيانات MYSQL، يمكنك كتابة /etc -iname my.cnf لتجده

+
+

افتح الملف my.cnf، اضف النص المشار عليه في الأسفل إلى نهاية الملف ثم قم بحفظه:
+ [mysqld]
bind-address=0.0.0.0

+
+

أعد تشغيل MySQL/ MariaDB لتطبيق هذه التغيرات، هذا سيتجاوز إعدادات MySQL الافتراضية، التي في الافتراضي تقبل الطلبات فقط من الجهاز المحلي، تحديث هذا سيسمح بالاتصالات على جميع الواجهات، وبالتالي الاتصالات الخارجية، تأكد من السماح لمنفذ MySQL (الافتراضي 3306) في جدار الحماية الخاص بك.

', + ], +]; diff --git a/lang/ar/admin/eggs.php b/lang/ar/admin/eggs.php deleted file mode 100644 index d981abfd3a..0000000000 --- a/lang/ar/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'تم استيراد هذا البيض والمتغيرات المرتبطة به بنجاح.', - 'updated_via_import' => 'تم تحديث هذا البيض باستخدام الملف المقدم.', - 'deleted' => 'تم حذف البيض المطلوب بنجاح من اللوحة.', - 'updated' => 'تم تحديث تكوين البيض بنجاح.', - 'script_updated' => 'تم تحديث سكريبت تثبيت البيض وسيتم تشغيله كلما تم تثبيت خوادم.', - 'egg_created' => 'تم وضع بيضة جديدة بنجاح. ستحتاج إلى إعادة تشغيل أي دايمونات جارية لتطبيق هذا البيض الجديد.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'تم حذف المتغير ":variable" ولن يكون متاحًا بعد الآن للخوادم بمجرد إعادة بنائها.', - 'variable_updated' => 'تم تحديث المتغير ":variable". ستحتاج إلى إعادة بناء أي خوادم تستخدم هذا المتغير لتطبيق التغييرات.', - 'variable_created' => 'تم إنشاء متغير جديد بنجاح وتعيينه لهذا البيض.', - ], - ], -]; diff --git a/lang/ar/admin/health.php b/lang/ar/admin/health.php new file mode 100644 index 0000000000..2c0b1580d9 --- /dev/null +++ b/lang/ar/admin/health.php @@ -0,0 +1,60 @@ + 'الصحة', + 'results_refreshed' => 'تم تحديث نتائج فحص الصحة', + 'checked' => 'تم التحقق من النتائج منذ :time', + 'refresh' => 'تحديث', + 'results' => [ + 'cache' => [ + 'label' => 'التخزين المؤقت', + 'ok' => 'موافق', + 'failed_retrieve' => 'تعذر تعيين أو استرجاع قيمة التخزين المؤقت للتطبيق.', + 'failed' => 'حدث استثناء في التخزين المؤقت للتطبيق: :error', + ], + 'database' => [ + 'label' => 'قاعدة البيانات', + 'ok' => 'موافق', + 'failed' => 'تعذر الاتصال بقاعدة البيانات: :error', + ], + 'debugmode' => [ + 'label' => 'وضع التصحيح', + 'ok' => 'وضع التصحيح معطل', + 'failed' => 'كان من المتوقع أن يكون وضع التصحيح :expected، لكنه كان :actual', + ], + 'environment' => [ + 'label' => 'البيئة', + 'ok' => 'موافق، تم التعيين إلى :actual', + 'failed' => 'تم تعيين البيئة إلى :actual، بينما كان المتوقع :expected', + ], + 'nodeversions' => [ + 'label' => 'إصدارات العقد', + 'ok' => 'العقد محدثة', + 'failed' => ':outdated/:all من العقد قديمة', + 'no_nodes_created' => 'لم يتم إنشاء أي عقد', + 'no_nodes' => 'لا توجد عقد', + 'all_up_to_date' => 'جميعها محدثة', + 'outdated' => ':outdated/:all قديمة', + ], + 'panelversion' => [ + 'label' => 'إصدار اللوحة', + 'ok' => 'اللوحة محدثة', + 'failed' => 'الإصدار المثبت هو :currentVersion بينما الأحدث هو :latestVersion', + 'up_to_date' => 'محدث', + 'outdated' => 'قديم', + ], + 'schedule' => [ + 'label' => 'الجدولة', + 'ok' => 'موافق', + 'failed_last_ran' => 'آخر تشغيل للجدولة كان قبل أكثر من :time دقيقة', + 'failed_not_ran' => 'لم يتم تشغيل الجدولة بعد.', + ], + 'useddiskspace' => [ + 'label' => 'مساحة القرص', + ], + ], + 'checks' => [ + 'successful' => 'ناجح', + 'failed' => 'فشل', + ], +]; diff --git a/lang/ar/admin/log.php b/lang/ar/admin/log.php new file mode 100644 index 0000000000..5c3a113e76 --- /dev/null +++ b/lang/ar/admin/log.php @@ -0,0 +1,26 @@ + 'ياي! لا توجد أخطاء!', + 'total_logs' => 'مجموع السجلات', + 'error' => 'خطأ', + 'warning' => 'تحذير', + 'notice' => 'تنويه', + 'info' => 'معلومات', + 'debug' => 'تصحيح الأخطاء', + 'navigation' => [ + 'panel_logs' => 'سجلات اللوحة', + ], + 'actions' => [ + 'upload_logs' => 'رفع السجلات؟', + 'upload_logs_description' => 'سيؤدي هذا إلى رفع :file إلى :url هل أنت متأكد من رغبتك في القيام بهذا؟', + 'view_logs' => 'عرض السجلات', + 'log_not_found' => 'لم يتم العثور على السجل!', + 'log_not_found_description' => 'تعذر العثور على سجل لـ :filename', + 'failed_to_upload' => 'فشل الرفع.', + 'failed_to_upload_description' => 'حالة HTTP: :status', + 'log_upload' => 'تم رفع السجل!', + 'log_upload_action' => 'عرض السجل', + 'upload_tooltip' => 'رفع إلى :url', + ], +]; diff --git a/lang/ar/admin/mount.php b/lang/ar/admin/mount.php new file mode 100644 index 0000000000..cfeace9f68 --- /dev/null +++ b/lang/ar/admin/mount.php @@ -0,0 +1,30 @@ + 'التوصيلات', + 'model_label' => 'التوصيل', + 'model_label_plural' => 'التوصيلات', + 'name' => 'الاسم', + 'name_help' => 'اسم فريد يستخدم لتمييز هذا التوصيل عن غيره.', + 'source' => 'المصدر', + 'source_help' => 'مسار الملف في نظام المضيف ليتم توصيله بالحاوية.', + 'target' => 'الهدف', + 'target_help' => 'المكان الذي سيكون فيه التوصيل متاحًا داخل الحاوية.', + 'read_only' => 'للقراءة فقط؟', + 'read_only_help' => 'هل التوصيل للقراءة فقط داخل الحاوية؟', + 'description' => 'الوصف', + 'description_help' => 'وصف تفصيلي لهذا التوصيل', + 'no_mounts' => 'لا توجد توصيلات', + 'eggs' => 'البيوض', + 'nodes' => 'العقد', + 'toggles' => [ + 'writable' => 'قابل للكتابة', + 'read_only' => 'للقراءة فقط', + ], + 'table' => [ + 'name' => 'الاسم', + 'all_eggs' => 'جميع البيض', + 'all_nodes' => 'جميع العقد', + 'read_only' => 'للقراءة فقط', + ], +]; diff --git a/lang/ar/admin/node.php b/lang/ar/admin/node.php index 34407364ef..4332b38f3d 100644 --- a/lang/ar/admin/node.php +++ b/lang/ar/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'النطاق (FQDN) أو عنوان IP المقدم لا يُحل إلى عنوان IP صالح.', - 'fqdn_required_for_ssl' => 'يتطلب اسم نطاق كامل يُحل إلى عنوان IP عام لاستخدام SSL لهذه العقدة.', + 'nav_title' => 'العقد', + 'model_label' => 'العقدة', + 'model_label_plural' => 'العقد', + 'create' => 'إنشاء عقدة', + 'tabs' => [ + 'overview' => 'نظرة عامة', + 'basic_settings' => 'الإعدادات الأساسية', + 'advanced_settings' => 'الإعدادات المتقدمة', + 'config_file' => 'ملف الإعدادات', + 'diagnostics' => 'التشخيصات', ], - 'notices' => [ - 'allocations_added' => 'تم إضافة التخصيصات بنجاح إلى هذه العقدة.', - 'node_deleted' => 'تم إزالة العقدة بنجاح من اللوحة.', - 'node_created' => 'تم إنشاء عقدة جديدة بنجاح. يمكنك تكوين الدايمون تلقائيًا على هذه الآلة بزيارة علامة التبويب "التكوين". قبل أن تتمكن من إضافة أي خوادم يجب عليك أولاً تخصيص عنوان IP واحد على الأقل ومنفذ.', - 'node_updated' => 'تم تحديث معلومات العقدة. إذا تم تغيير أي إعدادات دايمون ستحتاج إلى إعادة تشغيله لكي تصبح هذه التغييرات فعالة.', - 'unallocated_deleted' => 'تم حذف جميع المنافذ غير المخصصة لـ :ip.', + 'table' => [ + 'health' => 'الحالة', + 'name' => 'الاسم', + 'address' => 'العنوان', + 'public' => 'عام', + 'servers' => 'الخوادم', + 'alias' => 'الاسم المستعار', + 'ip' => 'عنوان IP', + 'egg' => 'البيضة', + 'owner' => 'المالك', + 'allocation_notes' => 'ملاحظات', + 'no_notes' => 'لا يوجد ملاحظات', ], + 'node_info' => 'معلومات العقدة', + 'wings_version' => 'إصدار Wings', + 'cpu_threads' => 'أنوية المعالج', + 'architecture' => 'المعمارية', + 'kernel' => 'النواة', + 'unknown' => 'غير معروف', + 'latest' => 'الأحدث', + 'node_uuid' => 'UUID العقدة', + 'node_id' => 'معرف العقدة', + + 'ip_address' => 'عنوان IP', + 'ip_help' => 'عادةً يكون عنوان IP العام لجهازك ما لم تكن تستخدم توجيه المنافذ.', + 'alias_help' => 'اسم عرض اختياري لمساعدتك في التعرف عليها.', + 'refresh' => 'تحديث', + 'domain' => 'اسم النطاق', + 'ssl_ip' => 'لا يمكنك الاتصال بعنوان IP عبر SSL', + 'error' => 'هذا هو اسم النطاق الذي يشير إلى عنوان IP الخاص بالعقدة. إذا كنت قد قمت بإعداده مسبقًا، يمكنك التحقق منه من خلال الحقل التالي!', + 'fqdn_help' => 'يتم تأمين لوحتك حاليًا عبر شهادة SSL، مما يعني أن العقد تحتاج إلى شهادة SSL أيضًا. يجب عليك استخدام اسم نطاق لأنه لا يمكن الحصول على شهادات SSL لعناوين IP.', + 'dns' => 'التحقق من سجل DNS', + 'dns_help' => 'يتيح لك هذا معرفة ما إذا كان سجل DNS يشير إلى عنوان IP الصحيح.', + 'valid' => 'صالح', + 'invalid' => 'غير صالح', + 'port' => 'المنفذ', + 'ports' => 'المنافذ', + 'port_help' => 'إذا كنت تقوم بتشغيل Daemon خلف Cloudflare، فيجب تعيين منفذ Daemon إلى 8443 للسماح بتمرير Websocket عبر SSL.', + 'connect_port' => 'منفذ الإتصال', + 'connect_port_help' => 'سيتم استخدام هذا المنفذ للاتصال بـ Wings. إذا كنت تستخدم Reverse Proxy، فقد يختلف هذا عن منفذ الاستماع. عند استخدام وكيل Cloudflare، يجب استخدام المنفذ 8443.', + 'listen_port' => 'منفذ الإستماع', + 'listen_port_help' => 'سيستمع Wings على هذا المنفذ.', + 'display_name' => 'اسم العرض', + 'ssl' => 'التواصل عبر SSL', + 'panel_on_ssl' => 'لوحتك تستخدم اتصال SSL آمن،
لذلك يجب أن يستخدم Daemon أيضًا.', + 'ssl_help' => 'لا يمكن لعناوين IP استخدام SSL.', + + 'tags' => 'الوسوم', + 'upload_limit' => 'حد الرفع', + 'upload_limit_help' => 'أدخل الحد الأقصى لحجم الملفات التي يمكن رفعها عبر مدير الملفات المستند إلى الويب.', + 'sftp_port' => 'منفذ SFTP', + 'sftp_alias' => 'الاسم المستعار لـ SFTP', + 'sftp_alias_help' => 'اسم عرض لـ SFTP، اتركه فارغًا لاستخدام FQDN الخاص بالعقدة.', + 'use_for_deploy' => 'استخدام للنشر؟', + 'maintenance_mode' => 'وضع الصيانة', + 'maintenance_mode_help' => 'إذا تم تعيين العقدة على "تحت الصيانة"، فلن يتمكن المستخدمون من الوصول إلى الخوادم الموجودة على تلك العقدة.', + + 'cpu' => 'المعالج', + 'cpu_limit' => 'حد المعالج', + 'memory' => 'الذاكرة', + 'memory_limit' => 'حد الذاكرة', + 'disk' => 'القرص', + 'disk_limit' => 'حد مساحة القرص', + 'unlimited' => 'غير محدود', + 'limited' => 'محدود', + 'overallocate' => 'تجاوز الحد', + 'enabled' => 'مفعل', + 'disabled' => 'معطل', + 'yes' => 'نعم', + 'no' => 'لا', + + 'instructions' => 'التعليمات', + 'instructions_help' => 'احفظ هذا الملف في دليل الجذر للـ Daemon، باسم config.yml', + + 'auto_deploy' => 'أمر النشر التلقائي', + 'auto_question' => 'اختر بين التثبيت المستقل وDocker.', + 'auto_label' => 'النوع', + 'standalone' => 'مستقل', + 'docker' => 'Docker', + 'auto_command' => 'لتكوين العقدة تلقائيًا، قم بتشغيل الأمر التالي:', + 'reset_token' => 'إعادة تعيين رمز المصادقة', + 'token_reset' => 'تمت إعادة تعيين رمز المصادقة للـ Daemon.', + 'reset_help' => 'إعادة تعيين رمز Daemon سيؤدي إلى إلغاء أي طلبات قادمة من الرمز القديم. يُستخدم هذا الرمز لجميع العمليات الحساسة على Daemon، بما في ذلك إنشاء وحذف الخوادم. نوصي بتغييره بانتظام لتعزيز الأمان.', + + 'no_nodes' => 'لا توجد عقد', + 'none' => 'لا شيء', + 'cpu_chart' => 'المعالج - :cpu% من :max%', + 'memory_chart' => 'الذاكرة - :used من :total', + 'disk_chart' => 'التخزين - :used من :total', + 'used' => 'المستخدم', + 'unused' => 'غير المستخدم', + + 'next_step' => 'الخطوة التالية', + 'node_has_servers' => 'العقدة تحتوي على خوادم', + 'create_allocation' => 'إنشاء تخصيص', + 'primary_allocation' => 'التخصيص الأساسي', + 'databases' => 'قواعد البيانات', + 'backups' => 'النسخ الاحتياطية', + + 'error_connecting' => 'خطأ في الاتصال بالعقدة', + 'error_connecting_description' => 'تعذر تحديث التكوين تلقائيًا على Wings، ستحتاج إلى تحديث ملف التكوين يدويًا.', + 'allocation' => 'تخصيص (عنوان IP ومنفذ)', + + 'diagnostics' => [ + 'header' => 'تشخيصات العقدة', + 'include_endpoints' => 'تضمين نقاط النهاية', + 'include_endpoints_hint' => 'سيؤدي تضمين نقاط النهاية إلى إظهار روابط اللوحات داخل السجلات ولا يحجب عنها.', + 'include_logs' => 'تضمين السجلات', + 'include_logs_hint' => 'تضمين السجلات سوف يظهر السجلات الأخيرة وتساعد في تتبع المشاكل المحتملة.', + 'run_diagnostics' => 'تشغيل التشخيص', + 'upload_to_pelican' => 'رفع السجلات', + 'logs_pulled' => 'تم سحب السجلات!', + 'logs_uploaded' => 'تم رفع السجلات', + 'upload_failed' => 'فشل في رفع السجلات', + 'view_logs' => 'عرض السجلات', + 'pull' => 'سحب', + 'upload' => 'رفع', + 'clear' => 'مسح', + '404' => 'تعذر العثور على تقرير التشخيص المطلوب. تأكد من أن wings محدث وحاول مرة أخرى.', + ], + + 'cloudflare_issue' => [ + 'title' => 'مشكلة Cloudflare', + 'body' => 'العقدة الخاصة بك لا يمكن الوصول إليها بواسطة Cloudflare', + ], + + 'bulk_update_ip' => 'تحديث عناوين IP', + 'bulk_update_ip_description' => 'استبدل عنوان IP القديم بعنوان جديد للمخصصات. هذا مفيد عندما يتغير عنوان IP للعقدة', + 'update_ip' => 'تحديث عنوان IP', + 'old_ip' => 'عنوان IP القديم', + 'new_ip' => 'عنوان IP الجديد', + 'no_allocations_to_update' => 'لم يتم العثور على مخصصات مع عنوان IP القديم المحدد', + 'ip_updated' => 'تم تحديث :count بنجاح من :total المخصص(ات)', + 'ip_update_failed' => 'فشل تحديث :count التخصيص(ات)', ]; diff --git a/lang/ar/admin/role.php b/lang/ar/admin/role.php new file mode 100644 index 0000000000..e70ac2172c --- /dev/null +++ b/lang/ar/admin/role.php @@ -0,0 +1,17 @@ + 'الأدوار', + 'model_label' => 'الدور', + 'model_label_plural' => 'الأدوار', + 'no_roles' => 'لا توجد أدوار', + 'name' => 'اسم الدور', + 'permissions' => 'الأذونات', + 'in_use' => 'قيد الاستخدام', + 'all' => 'الكل', + 'root_admin' => 'الدور :role يمتلك جميع الأذونات.', + 'root_admin_delete' => 'لا يمكن حذف المسؤول الجذري', + 'users' => 'المستخدمون', + 'nodes' => 'العقد', + 'nodes_hint' => 'اتركه فارغاً للسماح بالوصول إلى جميع العقد.', +]; diff --git a/lang/ar/admin/server.php b/lang/ar/admin/server.php index bc33de87ba..236433ecaf 100644 --- a/lang/ar/admin/server.php +++ b/lang/ar/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'أنت تحاول حذف التخصيص الافتراضي لهذا الخادم ولكن لا يوجد تخصيص بديل لاستخدامه.', - 'marked_as_failed' => 'تم تعليم هذا الخادم على أنه فشل في تثبيت سابق. لا يمكن تغيير الحالة الحالية في هذه الحالة.', - 'bad_variable' => 'كان هناك خطأ في التحقق من المتغير :name.', - 'daemon_exception' => 'حدث استثناء أثناء محاولة التواصل مع الدايمون مما أدى إلى رمز استجابة HTTP/:code. تم تسجيل هذا الاستثناء. (معرف الطلب: :request_id)', - 'default_allocation_not_found' => 'لم يتم العثور على التخصيص الافتراضي المطلوب في تخصيصات هذا الخادم.', + 'nav_title' => 'الخوادم', + 'model_label' => 'الخادم', + 'model_label_plural' => 'الخوادم', + 'no_servers' => 'لا توجد خوادم', + 'create' => 'إنشاء الخادم', + 'next_step' => 'الخطوة التالية', + 'ip_address' => 'عنوان IP', + 'ip_address_helper' => 'عادةً يكون عنوان IP العام لجهازك ما لم تكن تستخدم توجيه المنافذ.', + 'port' => 'المنفذ', + 'ports' => 'المنافذ', + 'alias' => 'الاسم المستعار', + 'alias_helper' => 'اسم عرض اختياري لمساعدتك على تذكره.', + 'locked' => 'مقفل؟', + 'locked_helper' => 'لن يتمكن المستخدمون من حذف المخصصات المقفلة', + 'lock' => 'قفل', + 'unlock' => 'فتح القفل', + 'name' => 'الاسم', + 'external_id' => 'المعرف الخارجي', + 'owner' => 'المالك', + 'description' => 'الوصف', + 'install_script' => 'تشغيل برنامج التثبيت؟', + 'start_after' => 'بدء التشغيل بعد التثبيت؟', + 'yes' => 'نعم', + 'no' => 'لا', + 'skip' => 'تخطي', + 'primary' => 'أساسي', + 'already_primary' => 'أساسي بالفعل', + 'make_primary' => 'تعيين كـ أساسي', + 'startup_cmd' => 'أمر بدء التشغيل', + 'startup_name' => 'اسم بدء التشغيل', + 'default_startup' => 'أمر بدء التشغيل الافتراضي', + 'startup_placeholder' => 'أدخل أمر بدء تشغيل مخصص', + 'variables' => 'المتغيرات', + 'resource_limits' => 'حدود الموارد', + 'cpu' => 'المعالج', + 'cpu_limit' => 'حد المعالج', + 'cpu_helper' => '100٪ تعادل نواة معالج واحدة.', + 'unlimited' => 'غير محدود', + 'limited' => 'محدود', + 'enabled' => 'مفعل', + 'disabled' => 'معطل', + 'memory' => 'الذاكرة', + 'memory_limit' => 'حد الذاكرة', + 'memory_helper' => 'سوف تضيف الأجنحة إلى هذه القيمة عند إنشاء الحاوية للتأكد من أنها لا تضيع جوعا عند استخدام الذاكرة الأقصى.', + 'disk' => 'مساحة القرص', + 'disk_limit' => 'حد مساحة القرص', + 'advanced_limits' => 'الحدود المتقدمة', + 'cpu_pin' => 'تثبيت المعالج', + 'threads' => 'المؤشرات المثبتة', + 'pin_help' => 'أضف مؤشرًا مثبتًا، مثل 0 أو 2-4', + 'swap' => 'ذاكرة التبديل', + 'swap_limit' => 'حد ذاكرة التبديل', + 'oom' => 'قاتل العمليات خارج الذاكرة (OOM)', + 'feature_limits' => 'حدود الميزات', + 'docker_settings' => 'إعدادات Docker', + 'docker_image' => 'صورة Docker', + 'image_name' => 'اسم الصورة', + 'primary_allocation' => 'التخصيص الأساسي', + 'image' => 'الصورة', + 'image_placeholder' => 'أدخل صورة مخصصة', + 'container_labels' => 'تسميات الحاوية', + 'title' => 'العنوان', + 'actions' => 'الإجراءات', + 'console' => 'وحدة التحكم', + 'suspend' => 'تعليق', + 'unsuspend' => 'إلغاء التعليق', + 'reinstall' => 'إعادة التثبيت', + 'reinstall_help' => 'سيؤدي هذا إلى إعادة تثبيت الخادم باستخدام برنامج التثبيت المخصص له.', + 'reinstall_modal_heading' => 'هل أنت متأكد أنك تريد إعادة تثبيت هذا الخادم؟', + 'reinstall_modal_description' => '!! قد يؤدي ذلك إلى فقدان بيانات غير قابلة للاسترجاع !!', + 'server_status' => 'حالة الخادم', + 'view_install_log' => 'عرض سجل التثبيت', + 'uuid' => 'UUID', + 'node' => 'العقدة', + 'short_uuid' => 'UUID مختصر', + 'toggle_install' => 'تبديل حالة التثبيت', + 'toggle_install_help' => 'إذا كنت بحاجة إلى تغيير حالة التثبيت من غير مثبت إلى مثبت أو العكس، يمكنك القيام بذلك باستخدام هذا الزر.', + 'toggle_install_failed_header' => 'الخادم في حالة فشل', + 'toggle_install_failed_desc' => 'هل تريد إعادة تثبيت الخادم لإصلاح هذا؟', + 'transfer' => 'نقل', + 'transfer_help' => 'نقل هذا الخادم إلى عقدة أخرى متصلة بهذه اللوحة.
تحذير! لا تزال هذه الميزة تجريبية. فكّر في إجراء نسخة احتياطية يدوياً لتجنب فقدان البيانات!', + 'condition' => 'الحالة', + 'suspend_all' => 'تعليق جميع الخوادم', + 'unsuspend_all' => 'إلغاء تعليق جميع الخوادم', + 'select_allocation' => 'حدد التخصيص', + 'new_allocation' => 'إنشاء تخصيص جديد', + 'additional_allocations' => 'التخصيصات الإضافية', + 'select_additional' => 'حدد التخصيصات الإضافية', + 'no_variables' => 'لا يحتوي البيضة المحددة على أي متغيرات!', + 'select_egg' => 'حدد بيضة أولاً لعرض متغيراتها!', + 'allocations' => 'التخصيصات', + 'databases' => 'قواعد البيانات', + 'no_databases' => 'لا توجد قواعد بيانات لهذا الخادم', + 'delete_db' => 'هل أنت متأكد أنك تريد حذف', + 'delete_db_heading' => 'حذف قاعدة البيانات؟', + 'backups' => 'النسخ الاحتياطية', + 'egg' => 'البيضة', + 'mounts' => 'التوصيلات', + 'no_mounts' => 'لا توجد توصيلات لهذه العقدة', + 'create_database' => 'إنشاء قاعدة بيانات', + 'no_db_hosts' => 'لا توجد مضيفات قواعد بيانات', + 'failed_to_create' => 'فشل إنشاء قاعدة البيانات', + 'change_egg' => 'تغيير البيضة', + 'new_egg' => 'بيضة جديدة', + 'keep_old_variables' => 'الاحتفاظ بالمتغيرات القديمة إن أمكن؟', + 'create_allocation' => 'إنشاء تخصيص', + 'add_allocation' => 'إضافة تخصيص', + 'view' => 'عرض', + 'no_log' => 'لا يوجد سجل متاح', + 'tabs' => [ + 'information' => 'المعلومات', + 'egg_configuration' => 'إعداد البيضة', + 'environment_configuration' => 'إعداد البيئة', ], - 'alerts' => [ - 'startup_changed' => 'تم تحديث تكوين البدء لهذا الخادم. إذا تم تغيير بيضة هذا الخادم، فسيحدث إعادة تثبيت الآن.', - 'server_deleted' => 'تم حذف الخادم بنجاح من النظام.', - 'server_created' => 'تم إنشاء الخادم بنجاح على اللوحة. الرجاء السماح للدايمون ببضع دقائق لإكمال تثبيت هذا الخادم.', - 'build_updated' => 'تم تحديث تفاصيل بناء هذا الخادم. قد تتطلب بعض التغييرات إعادة التشغيل لتصبح فعالة.', - 'suspension_toggled' => 'تم تغيير حالة تعليق الخادم إلى :status.', - 'rebuild_on_boot' => 'تم تعليم هذا الخادم على أنه يتطلب إعادة بناء حاوية Docker. سيحدث هذا عند التشغيل التالي للخادم.', - 'install_toggled' => 'تم تغيير حالة التثبيت لهذا الخادم.', - 'server_reinstalled' => 'تم وضع هذا الخادم في قائمة الانتظار لإعادة التثبيت التي تبدأ الآن.', - 'details_updated' => 'تم تحديث تفاصيل الخادم بنجاح.', - 'docker_image_updated' => 'تم تغيير صورة Docker الافتراضية المستخدمة لهذا الخادم بنجاح. يلزم إعادة التشغيل لتطبيق هذا التغيير.', - 'node_required' => 'يجب أن يكون لديك عقدة واحدة على الأقل مكونة قبل أن تتمكن من إضافة خادم إلى هذه اللوحة.', - 'transfer_nodes_required' => 'يجب أن يكون لديك عقدتين على الأقل مكونتين قبل أن تتمكن من نقل الخوادم.', - 'transfer_started' => 'تم بدء نقل الخادم.', - 'transfer_not_viable' => 'العقدة التي اخترتها لا تملك مساحة القرص أو الذاكرة المطلوبة لاستيعاب هذا الخادم.', + 'notifications' => [ + 'server_suspension' => 'تعليق الخادم', + 'server_suspended' => 'تم تعليق الخادم', + 'server_already_suspended' => 'الخادم معلق بالفعل!', + 'server_suspend_help' => 'سيؤدي ذلك إلى تعليق الخادم، وإيقاف أي عمليات جارية، ومنع المستخدم فورًا من الوصول إلى ملفاته أو إدارة الخادم من خلال اللوحة أو API.', + 'server_unsuspend_help' => 'سيؤدي ذلك إلى إلغاء تعليق الخادم واستعادة الوصول العادي للمستخدم.', + 'server_unsuspended' => 'تم إلغاء تعليق الخادم', + 'error_server_delete' => 'لا يمكن حذف الخادم بشكل آمن.', + 'error_server_delete_body' => 'يمكنك إجبار حذفه.', + 'create_failed' => 'تعذر إنشاء الخادم', + 'invalid_port_range' => 'نطاق المنافذ غير صالح', + 'invalid_port_range_body' => 'نطاق المنافذ المدخل ليس أرقامًا صحيحة: :port', + 'too_many_ports' => 'عدد كبير جدًا من المنافذ في وقت واحد!', + 'too_many_ports_body' => 'الحد الحالي هو :limit منفذ في وقت واحد.', + 'invalid_port' => 'المنفذ خارج النطاق المسموح به', + 'invalid_port_body' => ':i ليس ضمن نطاق المنافذ الصالح بين :portFloor-:portCeil', + 'already_exists' => 'المنفذ قيد الاستخدام بالفعل', + 'already_exists_body' => ':i مستخدم بالفعل في تخصيص آخر', + 'error_connecting' => 'حدث خطأ أثناء الاتصال بـ :node', + 'error_connecting_description' => 'تعذر تحديث التكوين تلقائيًا على Wings، ستحتاج إلى تحديث ملف التكوين يدويًا.', + 'install_toggled' => 'تم تبديل حالة التثبيت', + 'install_toggle_failed' => 'تعذر تبديل حالة التثبيت', + 'reinstall_started' => 'بدأ إعادة التثبيت', + 'reinstall_failed' => 'تعذر بدء إعادة تثبيت', + 'log_failed' => 'تعذر الاتصال ب Wings لاسترجاع سجل تثبيت السيرفر.', + 'transfer_started' => 'بدأت عملية النقل', + 'transfer_failed' => 'فشلت عملية النقل', + 'already_transfering' => 'يتم حاليا نقل الخادم.', ], + 'notes' => 'ملاحظات', + 'no_notes' => 'لا يوجد ملاحظات', + 'none' => 'لا شيء', ]; diff --git a/lang/ar/admin/user.php b/lang/ar/admin/user.php deleted file mode 100644 index 049d175f09..0000000000 --- a/lang/ar/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'لا يمكن حذف مستخدم لديه خوادم نشطة مرتبطة بحسابه. يرجى حذف خوادمهم قبل المتابعة.', - 'user_is_self' => 'لا يمكنك حذف حساب المستخدم الخاص بك.', - ], - 'notices' => [ - 'account_created' => 'تم إنشاء الحساب بنجاح.', - 'account_updated' => 'تم تحديث الحساب بنجاح.', - ], -]; diff --git a/lang/ar/admin/webhook.php b/lang/ar/admin/webhook.php new file mode 100644 index 0000000000..2904f5faf7 --- /dev/null +++ b/lang/ar/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'نقطة النهاية', + 'description' => 'الوصف', + 'no_webhooks' => 'لا توجد Webhooks', + 'help' => 'مساعدة', + 'help_text' => 'يجب أن تضع اسم المتغير بين {{ }}، على سبيل المثال إذا كنت تريد الحصول على الاسم من الـ API يمكنك استخدام {{name}}.', + 'test_now' => 'اختبار الآن', + 'test_now_help' => 'سيؤدي هذا إلى تشغيل حدث `created: Server`', + 'table' => [ + 'description' => 'الوصف', + 'endpoint' => 'نقطة النهاية', + ], + 'headers' => 'ترويسات', + 'events' => 'الأحداث', + 'regular' => 'عادي', + 'reset_headers' => 'إعادة تعيين الترويسات', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'الملف الشخصي', + 'message' => 'الرسالة', + 'username' => 'اسم المستخدم', + 'avatar_url' => 'عنوان الصورة الرمزية', + 'forum_thread' => 'اسم موضوع المنتدى', + 'supress_embeds' => 'إخفاء الإيمبدز', + 'supress_embeds_text' => 'لا تتضمّن أي ايمبيدز عند تسلسل هذه الرسالة', + 'supress_notifications' => 'كتم الإشعارات', + 'supress_notifications_text' => 'هذه الرسالة لن تُفعّل الإشعارات الفورية وإشعارات سطح المكتب', + ], + 'discord_embed' => [ + 'add_embed' => 'إضافة ايمبد', + 'flags' => 'الخيارات', + 'thumbnail' => 'عنوان الصورة المصغّرة', + 'embeds' => 'ايمبدز', + 'thread_name' => 'اسم موضوع المنتدى', + 'allowed_mentions' => 'الإشارات المسموح بها', + 'roles' => 'الأدوار', + 'users' => 'المستخدمون', + 'everyone' => '@everyone و @here', + 'author' => 'المؤلف', + 'author_url' => 'عنوان URL للمؤلف', + 'author_icon_url' => 'عنوان أيقونة المؤلف', + 'body' => 'الجسم', + 'title' => 'العنوان', + 'color' => 'لون الايمبد', + 'url' => 'عنوان URL', + 'images' => 'الصور', + 'image_url' => 'عنوان الصورة', + 'image_thumbnail' => 'عنوان الصورة المصغّرة', + 'footer' => 'ذيل الصفحة', + 'has_timestamp' => 'يحتوي على طابع زمني', + 'footer_icon_url' => 'عنوان أيقونة التذييل', + 'add_field' => 'إضافة حقل', + 'fields' => 'الحقول', + 'field_name' => 'إسم الحقل', + 'field_value' => 'قيمة الحقل', + 'inline_field' => 'حقل مضمّن', + ], +]; diff --git a/lang/ar/auth.php b/lang/ar/auth.php index 6418138f15..1d0ee56aec 100644 --- a/lang/ar/auth.php +++ b/lang/ar/auth.php @@ -1,27 +1,24 @@ 'تسجيل الدخول', - 'go_to_login' => 'الذهاب إلى صفحة الدخول', - 'failed' => 'لم يتم العثور على حساب يتطابق مع هذه البيانات.', - 'forgot_password' => [ - 'label' => 'نسيت كلمة المرور؟', - 'label_help' => 'أدخل عنوان بريدك الإلكتروني لتتلقى تعليمات حول إعادة تعيين كلمة المرور.', - 'button' => 'استعادة الحساب', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'إعادة تعيين وتسجيل الدخول', - ], + 'failed' => 'بيانات الاعتماد هذه لا تتطابق مع سجلاتنا.', + 'failed-two-factor' => 'رمز التحقق غير صحيح', + 'two-factor-code' => 'رمز التحقق بخطوتين', + 'two-factor-hint' => 'يمكنك استخدام رموز النسخ الاحتياطي إذا فقدت الوصول إلى جهازك.', + 'password' => 'كلمة المرور المدخلة غير صحيحة.', + 'throttle' => 'عدد محاولات تسجيل الدخول كبير جدًا. يرجى المحاولة مرة أخرى بعد :seconds ثانية.', + '2fa_must_be_enabled' => 'طلب المسؤول أن يتم تمكين المصادقة الثنائية لحسابك من أجل استخدام اللوحة.', - 'two_factor' => [ - 'label' => 'رمز التحقق ذو العاملين', - 'label_help' => 'هذا الحساب يتطلب طبقة ثانية من التحقق للمتابعة. الرجاء إدخال الرمز المولد على جهازك لإكمال هذا التسجيل.', - 'checkpoint_failed' => 'رمز التحقق ذو العاملين كان غير صالح.', - ], - - 'throttle' => 'عدد محاولات تسجيل الدخول كثيرة جداً. يرجى المحاولة مجدداً بعد :seconds ثوانٍ.', - 'password_requirements' => 'يجب أن تكون كلمة المرور بطول 8 أحرف على الأقل وأن تكون فريدة لهذا الموقع.', - '2fa_must_be_enabled' => 'يتطلب المدير تفعيل التحقق ذو العاملين لحسابك لاستخدام اللوحة.', ]; diff --git a/lang/ar/command/messages.php b/lang/ar/command/messages.php index 6470d02926..8a97a2f128 100644 --- a/lang/ar/command/messages.php +++ b/lang/ar/command/messages.php @@ -11,19 +11,14 @@ 'ask_admin' => 'هل هذا المستخدم مدير؟', 'ask_email' => 'عنوان البريد الإلكتروني', 'ask_username' => 'اسم المستخدم', - 'ask_name_first' => 'الاسم الأول', - 'ask_name_last' => 'الاسم الأخير', 'ask_password' => 'كلمة المرور', 'ask_password_tip' => 'إذا كنت ترغب في إنشاء حساب بكلمة مرور عشوائية يتم إرسالها بالبريد الإلكتروني للمستخدم، أعد تشغيل هذا الأمر (CTRL+C) ومرر علامة `--no-password`.', 'ask_password_help' => 'يجب أن تكون كلمات المرور بطول 8 أحرف على الأقل وتحتوي على حرف كبير ورقم على الأقل.', - '2fa_help_text' => [ - 'هذا الأمر سيعطل التوثيق الثنائي لحساب المستخدم إذا كان مفعلاً. يجب استخدام هذا فقط كأمر استرداد حساب إذا كان المستخدم محظورًا من حسابه.', - 'إذا لم يكن هذا ما تريد القيام به، اضغط CTRL+C للخروج من هذه العملية.', - ], + '2fa_help_text' => 'سيؤدي هذا الأمر إلى تعطيل المصادقة ذات عاملين لحساب المستخدم إذا تم تمكينه. يجب استخدام هذا الأمر فقط كأمر باسترداد الحساب إذا كان المستخدم مغلق من حسابه. إذا لم يكن هذا ما تريد فعله، اضغط على CTRL+C للخروج من هذه العملية.', '2fa_disabled' => 'تم تعطيل التوثيق الثنائي لـ :email.', ], 'schedule' => [ - 'output_line' => 'جاري إرسال العمل للمهمة الأولى في `:schedule` (:hash).', + 'output_line' => 'يتم تنفيذ المهمة الأولى في `:schedule` (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'جاري حذف ملف النسخ الاحتياطي للخدمة :file.', diff --git a/lang/ar/commands.php b/lang/ar/commands.php new file mode 100644 index 0000000000..b67d81753c --- /dev/null +++ b/lang/ar/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'قم بتوفير عنوان البريد الإلكتروني الذي يجب أن تصدر منه البيوض المصدرة بواسطة هذا اللوحة. يجب أن يكون عنوان بريد إلكتروني صالحًا.', + 'url' => 'يجب أن يبدأ عنوان URL للتطبيق بـ https:// أو http:// حسب استخدامك لـ SSL أم لا. إذا لم تقم بتضمين المخطط، فقد يتم ربط رسائل البريد الإلكتروني والمحتوى الآخر بموقع غير صحيح.', + 'timezone' => 'يجب أن تتطابق المنطقة الزمنية مع إحدى المناطق الزمنية المدعومة من PHP. إذا كنت غير متأكد، يرجى الرجوع إلى https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'لقد اخترت برنامج Redis لسائق واحد أو أكثر، يرجى تقديم معلومات اتصال صالحة أدناه. في معظم الحالات، يمكنك استخدام الإعدادات الافتراضية ما لم تكن قد عدلت إعدادك.', + 'comment' => 'بشكل افتراضي، يكون اسم المستخدم الافتراضي لخادم Redis بدون كلمة مرور لأنه يعمل محليًا وغير متاح للعالم الخارجي. إذا كان هذا هو الحال، فقط اضغط على Enter دون إدخال قيمة.', + 'confirm' => 'يبدو أن هناك قيمة :field محددة بالفعل لـ Redis، هل ترغب في تغييرها؟', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'يُوصى بشدة بعدم استخدام "localhost" كمضيف قاعدة البيانات، حيث لاحظنا مشكلات متكررة في اتصال المقبس. إذا كنت تريد استخدام اتصال محلي، فيجب أن تستخدم "127.0.0.1".', + 'DB_USERNAME_note' => 'استخدام حساب الجذر لاتصالات MySQL ليس فقط مرفوضًا بشدة، ولكنه غير مسموح به في هذا التطبيق. ستحتاج إلى إنشاء مستخدم MySQL لهذا البرنامج.', + 'DB_PASSWORD_note' => 'يبدو أن لديك بالفعل كلمة مرور اتصال MySQL محددة، هل ترغب في تغييرها؟', + 'DB_error_2' => 'لم يتم حفظ بيانات الاعتماد الخاصة باتصالك. ستحتاج إلى تقديم معلومات اتصال صالحة قبل المتابعة.', + 'go_back' => 'العودة والمحاولة مرة أخرى', + ], + 'make_node' => [ + 'name' => 'أدخل معرفًا قصيرًا لتمييز هذه العقدة عن غيرها', + 'description' => 'أدخل وصفًا لتحديد العقدة', + 'scheme' => 'يرجى إدخال https لاستخدام SSL أو http لاتصال غير مشفر', + 'fqdn' => 'أدخل اسم النطاق (مثل node.example.com) ليتم استخدامه للاتصال بالـ Daemon. يمكن استخدام عنوان IP فقط إذا لم تكن تستخدم SSL لهذه العقدة.', + 'public' => 'هل يجب أن تكون هذه العقدة عامة؟ ملاحظة: تعيين العقدة كخاصة سيمنع إمكانية النشر التلقائي لهذه العقدة.', + 'behind_proxy' => 'هل اسم النطاق الخاص بك خلف وكيل؟', + 'maintenance_mode' => 'هل يجب تمكين وضع الصيانة؟', + 'memory' => 'أدخل الحد الأقصى للذاكرة', + 'memory_overallocate' => 'أدخل مقدار الذاكرة المطلوب تجاوزه، -1 سيعطل الفحص و 0 سيمنع إنشاء خوادم جديدة', + 'disk' => 'أدخل الحد الأقصى لمساحة القرص', + 'disk_overallocate' => 'أدخل مقدار القرص المطلوب تجاوزه، -1 سيعطل الفحص و 0 سيمنع إنشاء خوادم جديدة', + 'cpu' => 'أدخل الحد الأقصى لاستخدام المعالج', + 'cpu_overallocate' => 'أدخل مقدار تجاوز استخدام المعالج، -1 سيعطل الفحص و 0 سيمنع إنشاء خوادم جديدة', + 'upload_size' => 'أدخل الحد الأقصى لحجم التحميل', + 'daemonListen' => 'أدخل منفذ استماع الـ Daemon', + 'daemonConnect' => 'أدخل منفذ الاتصال الخاص بال daemon (يمكن أن يكون نفس منفذ الاستماع)', + 'daemonSFTP' => 'أدخل منفذ استماع SFTP لـ Daemon', + 'daemonSFTPAlias' => 'أدخل اسم مستعار لـ SFTP (يمكن أن يكون فارغًا)', + 'daemonBase' => 'أدخل المجلد الأساسي', + 'success' => 'تم إنشاء عقدة جديدة بنجاح بالاسم :name ومعرفها :id', + ], + 'node_config' => [ + 'error_not_exist' => 'العقدة المحددة غير موجودة.', + 'error_invalid_format' => 'تنسيق غير صالح محدد. الخيارات الصالحة هي yaml و json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'يبدو أنك قمت بالفعل بتكوين مفتاح تشفير التطبيق. المتابعة مع هذه العملية ستؤدي إلى استبدال هذا المفتاح وقد تسبب في تلف البيانات المشفرة الموجودة. لا تتابع ما لم تكن متأكدًا مما تفعله.', + 'understand' => 'أفهم عواقب تنفيذ هذا الأمر وأتحمل كامل المسؤولية عن فقدان البيانات المشفرة.', + 'continue' => 'هل أنت متأكد أنك تريد المتابعة؟ تغيير مفتاح تشفير التطبيق سيسبب فقدان البيانات.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'لا توجد مهام مجدولة للخوادم تحتاج إلى التشغيل.', + 'error_message' => 'حدث خطأ أثناء معالجة الجدولة: ', + ], + ], +]; diff --git a/lang/ar/dashboard/account.php b/lang/ar/dashboard/account.php deleted file mode 100644 index 377447765e..0000000000 --- a/lang/ar/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'تحديث بريدك الإلكتروني', - 'updated' => 'تم تحديث عنوان بريدك الإلكتروني.', - ], - 'password' => [ - 'title' => 'تغيير كلمة مرورك', - 'requirements' => 'يجب أن تكون كلمة المرور الجديدة مكونة من 8 أحرف على الأقل.', - 'updated' => 'تم تحديث كلمة المرور الخاصة بك.', - ], - 'two_factor' => [ - 'button' => 'إعداد التوثيق الثنائي', - 'disabled' => 'تم تعطيل التوثيق الثنائي في حسابك. لن يُطلب منك تقديم رمز عند تسجيل الدخول.', - 'enabled' => 'تم تفعيل التوثيق الثنائي في حسابك! من الآن فصاعدًا، عند تسجيل الدخول، سيُطلب منك تقديم الرمز الذي يُنتجه جهازك.', - 'invalid' => 'الرمز المقدم غير صالح.', - 'setup' => [ - 'title' => 'إعداد التوثيق الثنائي', - 'help' => 'لا يمكن مسح الرمز؟ أدخل الرمز أدناه في تطبيقك:', - 'field' => 'أدخل الرمز', - ], - 'disable' => [ - 'title' => 'تعطيل التوثيق الثنائي', - 'field' => 'أدخل الرمز', - ], - ], -]; diff --git a/lang/ar/dashboard/index.php b/lang/ar/dashboard/index.php deleted file mode 100644 index a8146630a8..0000000000 --- a/lang/ar/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'ابحث عن الخوادم...', - 'no_matches' => 'لم يتم العثور على خوادم تطابق معايير البحث المقدمة.', - 'cpu_title' => 'المعالج', - 'memory_title' => 'الذاكرة', -]; diff --git a/lang/ar/exceptions.php b/lang/ar/exceptions.php index 4de9d56aac..7577ecd6dc 100644 --- a/lang/ar/exceptions.php +++ b/lang/ar/exceptions.php @@ -1,55 +1,64 @@ 'حدث استثناء أثناء محاولة التواصل مع الدايمون مما أدى إلى رمز استجابة HTTP/:code. تم تسجيل هذا الاستثناء.', + 'daemon_connection_failed' => 'حدث خطأ أثناء محاولة الاتصال بـ Daemon مما أدى إلى استجابة برمز HTTP/:code. تم تسجيل هذا الاستثناء.', 'node' => [ - 'servers_attached' => 'يجب ألا يكون هناك أي خوادم مرتبطة بالعقدة لكي يتم حذفها.', - 'daemon_off_config_updated' => 'تم تحديث تكوين الدايمون لكن، واجهت مشكلة أثناء محاولة تحديث ملف التكوين تلقائيًا على الدايمون. ستحتاج إلى تحديث ملف التكوين (config.yml) يدويًا لتطبيق هذه التغييرات.', + 'servers_attached' => 'يجب ألا يكون هناك أي خوادم مرتبطة بهذه العقدة حتى يتم حذفها.', + 'error_connecting' => 'حدث خطأ أثناء الاتصال بـ :node', + 'daemon_off_config_updated' => 'تم تحديث تكوين Daemon، ولكن حدث خطأ أثناء محاولة تحديث ملف التكوين تلقائيًا. ستحتاج إلى تحديث ملف التكوين (config.yml) يدويًا ليتم تطبيق هذه التغييرات.', ], 'allocations' => [ - 'server_using' => 'تم تعيين خادم حاليًا لهذا التخصيص. لا يمكن حذف التخصيص إلا إذا لم يكن هناك خادم معين حاليًا.', - 'too_many_ports' => 'لا يتم دعم إضافة أكثر من 1000 منفذ في نطاق واحد دفعة واحدة.', - 'invalid_mapping' => 'التعيين المقدم للمنفذ :port كان غير صالح ولا يمكن معالجته.', - 'cidr_out_of_range' => 'تسمح ترميزات CIDR فقط بالأقنعة بين /25 و /32.', - 'port_out_of_range' => 'يجب أن تكون المنافذ في التخصيص أكبر من 1024 وأقل من أو يساوي 65535.', + 'server_using' => 'تم تعيين خادم حاليًا لهذا التخصيص. لا يمكن حذف التخصيص إلا إذا لم يكن هناك خادم معين له.', + 'too_many_ports' => 'إضافة أكثر من 1000 منفذ في نطاق واحد دفعة واحدة غير مدعومة.', + 'invalid_mapping' => 'التعيين المقدم للمنفذ :port غير صالح ولا يمكن معالجته.', + 'cidr_out_of_range' => 'صيغة CIDR تسمح فقط بالأقنعة بين /25 و /32.', + 'port_out_of_range' => 'يجب أن تكون المنافذ في التخصيص بين 1024 و 65535.', ], 'egg' => [ - 'delete_has_servers' => 'لا يمكن حذف بيضة تحتوي على خوادم نشطة مرتبطة بها من اللوحة.', - 'invalid_copy_id' => 'البيضة المختارة لنسخ سكربت منها إما أنها غير موجودة، أو أنها تقوم بنسخ سكربت نفسها.', - 'has_children' => 'هذه البيضة هي الوالد لواحدة أو أكثر من البيض الأخرى. يرجى حذف تلك البيض قبل حذف هذه البيضة.', + 'delete_has_servers' => 'لا يمكن حذف بيضة تحتوي على خوادم نشطة من اللوحة.', + 'invalid_copy_id' => 'البيضة المحددة لنسخ السكريبت منها غير موجودة أو تقوم بنسخ سكريبت بنفسها.', + 'has_children' => 'هذه البيضة تحتوي على بيضات فرعية. يرجى حذفها قبل حذف هذه البيضة.', ], 'variables' => [ - 'env_not_unique' => 'يجب أن تكون المتغيرات البيئية :name فريدة لهذه البيضة.', - 'reserved_name' => 'المتغير البيئي :name محمي ولا يمكن تخصيصه لمتغير.', - 'bad_validation_rule' => 'قاعدة التحقق ":rule" ليست صالحة لهذا التطبيق.', + 'env_not_unique' => 'يجب أن يكون المتغير البيئي :name فريدًا لهذه البيضة.', + 'reserved_name' => 'المتغير البيئي :name محجوز ولا يمكن تعيينه كمتغير.', + 'bad_validation_rule' => 'قاعدة التحقق ":rule" غير صالحة لهذا التطبيق.', ], 'importer' => [ - 'json_error' => 'حدث خطأ أثناء محاولة تحليل ملف JSON: :error.', - 'file_error' => 'ملف JSON المقدم لم يكن صالحًا.', - 'invalid_json_provided' => 'الملف JSON المقدم ليس بتنسيق يمكن التعرف عليه.', + 'json_error' => 'حدث خطأ أثناء تحليل ملف JSON: :error.', + 'file_error' => 'ملف JSON المقدم غير صالح.', + 'invalid_json_provided' => 'ملف JSON المقدم ليس بتنسيق يمكن التعرف عليه.', ], 'subusers' => [ 'editing_self' => 'لا يُسمح بتعديل حساب المستخدم الفرعي الخاص بك.', 'user_is_owner' => 'لا يمكنك إضافة مالك الخادم كمستخدم فرعي لهذا الخادم.', - 'subuser_exists' => 'المستخدم ذو البريد الإلكتروني هذا مُعين بالفعل كمستخدم فرعي لهذا الخادم.', + 'subuser_exists' => 'المستخدم بعنوان البريد الإلكتروني هذا مضاف بالفعل كمستخدم فرعي لهذا الخادم.', ], 'databases' => [ - 'delete_has_databases' => 'لا يمكن حذف مضيف قاعدة البيانات الذي يحتوي على قواعد بيانات نشطة مرتبطة به.', + 'delete_has_databases' => 'لا يمكن حذف مضيف قاعدة بيانات يحتوي على قواعد بيانات نشطة مرتبطة به.', ], 'tasks' => [ - 'chain_interval_too_long' => 'أقصى فترة زمنية لمهمة متسلسلة هي 15 دقيقة.', + 'chain_interval_too_long' => 'الحد الأقصى للفاصل الزمني لمهمة متسلسلة هو 15 دقيقة.', ], 'locations' => [ 'has_nodes' => 'لا يمكن حذف موقع يحتوي على عقد نشطة مرتبطة به.', ], 'users' => [ - 'node_revocation_failed' => 'فشل في إلغاء المفاتيح على العقدة #:node. :error', + 'is_self' => 'لا يمكنك حذف حسابك الشخصي.', + 'has_servers' => 'لا يمكن حذف مستخدم لديه خوادم نشطة مرتبطة بحسابه. يرجى حذف خوادمه قبل المتابعة.', + 'node_revocation_failed' => 'فشل إلغاء المفاتيح على العقدة #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'لم يتم العثور على عقد تلبي المتطلبات المحددة للنشر التلقائي.', - 'no_viable_allocations' => 'لم يتم العثور على تخصيصات تلبي المتطلبات للنشر التلقائي.', + 'no_viable_nodes' => 'لم يتم العثور على أي عقد تفي بالمتطلبات المحددة للنشر التلقائي.', + 'no_viable_allocations' => 'لم يتم العثور على أي تخصيصات تفي بمتطلبات النشر التلقائي.', ], 'api' => [ 'resource_not_found' => 'المورد المطلوب غير موجود على هذا الخادم.', ], + 'mount' => [ + 'servers_attached' => 'يجب ألا يكون هناك أي خوادم مرتبطة بهذا التوصيل ليتم حذفه.', + ], + 'server' => [ + 'marked_as_failed' => 'لم يكتمل بعد تثبيت هذا الخادم، يرجى المحاولة مرة أخرى لاحقًا.', + ], ]; diff --git a/lang/ar/notifications.php b/lang/ar/notifications.php new file mode 100644 index 0000000000..0f7919c977 --- /dev/null +++ b/lang/ar/notifications.php @@ -0,0 +1,18 @@ + 'فتح الخادم', + 'installation_completed' => 'اكتمل تثبيت الخادم', + 'installation_failed' => 'فشل تثبيت الخادم', + 'reinstallation_completed' => 'اكتملت إعادة تثبيت السير فر', + 'reinstallation_failed' => 'فشل إعادة تثبيت الخادم', + 'failed' => 'فشل', + 'user_added' => [ + 'title' => 'أضيف إلى الخادم', + 'body' => 'لقد تمت إضافتك كمستخدم فرعي إلى الخادم', + ], + 'user_removed' => [ + 'title' => 'تم الإزالة من الخادم', + 'body' => 'لقد تمت إزالتك كمستخدم فرعي من الخادم', + ], +]; diff --git a/lang/ar/pagination.php b/lang/ar/pagination.php deleted file mode 100644 index 2e204a684e..0000000000 --- a/lang/ar/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« السابق', - 'next' => 'التالي »', -]; diff --git a/lang/ar/passwords.php b/lang/ar/passwords.php deleted file mode 100644 index 2559979d66..0000000000 --- a/lang/ar/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'يجب أن تكون كلمات المرور ستة أحرف على الأقل وأن تتطابق مع التأكيد.', - 'reset' => 'تم إعادة تعيين كلمة مرورك!', - 'sent' => 'لقد أرسلنا رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني!', - 'token' => 'رمز إعادة تعيين كلمة المرور هذا غير صالح.', - 'user' => 'لا يمكننا العثور على مستخدم بهذا العنوان البريدي الإلكتروني.', -]; diff --git a/lang/ar/profile.php b/lang/ar/profile.php new file mode 100644 index 0000000000..dd10a75822 --- /dev/null +++ b/lang/ar/profile.php @@ -0,0 +1,70 @@ + 'الملف الشخصي', + 'tabs' => [ + 'account' => 'الحساب', + 'oauth' => 'OAuth', + 'activity' => 'النشاط', + 'api_keys' => 'مفاتيح API', + 'ssh_keys' => 'مفاتيح SSH', + 'keys' => 'المفاتيح', + '2fa' => 'المصادقة الثنائية', + 'customization' => 'التخصيص', + ], + 'username' => 'اسم المستخدم', + 'admin' => 'المدير', + 'exit_admin' => 'الخروج من المسؤول', + 'server_list' => 'قائمة الخوادم', + 'email' => 'البريد الإلكتروني', + 'password' => 'كلمة المرور', + 'current_password' => 'كلمة المرور الحالية', + 'password_confirmation' => 'تأكيد كلمة المرور', + 'timezone' => 'المنطقة الزمنية', + 'language' => 'اللغة', + 'language_help' => 'لغتك :state لم تتم ترجمتها بعد!', + 'link' => 'ربط', + 'unlink' => 'إلغاء الربط', + 'unlinked' => ':name تم إلغاء ربطه', + 'scan_qr' => 'مسح رمز QR', + 'code' => 'الرمز', + 'setup_key' => 'مفتاح الإعداد', + 'invalid_code' => 'رمز المصادقة الثنائية غير صالح', + 'code_help' => 'قم بمسح رمز QR أعلاه باستخدام تطبيق المصادقة الثنائية، ثم أدخل الرمز الذي تم إنشاؤه.', + '2fa_enabled' => 'المصادقة الثنائية مفعلة حالياً!', + 'backup_help' => 'لن يتم عرض هذه الأكواد مرة أخرى!', + 'backup_codes' => 'أكواد النسخ الاحتياطي', + 'disable_2fa' => 'تعطيل المصادقة الثنائية', + 'disable_2fa_help' => 'أدخل رمز المصادقة الثنائية الحالي لتعطيل المصادقة الثنائية', + 'api_keys' => 'مفاتيح API', + 'create_api_key' => 'إنشاء مفتاح API', + 'api_key_created' => 'تم إنشاء مفتاح API', + 'description' => 'الوصف', + 'allowed_ips' => 'عناوين IP المسموح بها', + 'allowed_ips_help' => 'اضغط على Enter لإضافة عنوان IP جديد أو اتركه فارغًا للسماح بأي عنوان IP', + 'ssh_keys' => 'مفاتيح SSH', + 'create_ssh_key' => 'إنشاء مفتاح SSH', + 'ssh_key_created' => 'تم إنشاء مفتاح SSH', + 'name' => 'الاسم', + 'public_key' => 'المفتاح العام', + 'could_not_create_ssh_key' => 'تعذر إنشاء مفتاح ssh', + 'dashboard' => 'لوحة التحكم', + 'dashboard_layout' => 'تصميم لوحة التحكم', + 'console' => 'وحدة التحكم', + 'grid' => 'شبكة', + 'table' => 'جدول', + 'rows' => 'صفوف', + 'font_size' => 'حجم الخط', + 'font' => 'نوع الخط', + 'font_preview' => 'معاينة الخط', + 'seconds' => 'ثواني', + 'graph_period' => 'فترة الرسم البياني', + 'graph_period_helper' => 'كمية نقاط البيانات و الثواني المعروضة على الرسوم البيانية', + 'navigation' => 'نوع التنقل', + 'sidebar' => 'الشريط الجانبي', + 'topbar' => 'الشريط العلوي', + 'mixed' => 'مختلط', + 'no_oauth' => 'لا يوجد حسابات مرتبطة', + 'no_api_keys' => 'لا يوجد مفاتيح API', + 'no_ssh_keys' => 'لا يوجد مفاتيح SSH', +]; diff --git a/lang/ar/search.php b/lang/ar/search.php new file mode 100644 index 0000000000..13d91bdbf2 --- /dev/null +++ b/lang/ar/search.php @@ -0,0 +1,9 @@ + 'يرجى إدخال ثلاثة أحرف على الأقل لبدء البحث.', + 'term' => [ + 'label' => 'مصطلح البحث', + 'description' => 'أدخل اسم الخادم أو UUID أو التخصيص لبدء البحث.', + ], +]; diff --git a/lang/ar/server/activity.php b/lang/ar/server/activity.php new file mode 100644 index 0000000000..6ecd7b440b --- /dev/null +++ b/lang/ar/server/activity.php @@ -0,0 +1,11 @@ + 'النشاط', + 'event' => 'الحدث', + 'user' => 'المستخدم', + 'deleted_user' => 'مستخدم محذوف', + 'system' => 'النظام', + 'timestamp' => 'التوقيت الزمني', + 'metadata' => 'بيانات التعريف', +]; diff --git a/lang/ar/server/backup.php b/lang/ar/server/backup.php new file mode 100644 index 0000000000..208e814a63 --- /dev/null +++ b/lang/ar/server/backup.php @@ -0,0 +1,55 @@ + 'النسخ الاحتياطية', + 'empty' => 'لا توجد نسخ احتياطية', + 'size' => 'الحجم', + 'created_at' => 'تاريخ الانشاء', + 'status' => 'الحالة', + 'is_locked' => 'حالة القفل', + 'backup_status' => [ + 'in_progress' => 'جار المعالجة', + 'successful' => 'ناجح', + 'failed' => 'فشل', + ], + 'actions' => [ + 'create' => [ + 'title' => 'إنشاء نسخة احتياطية', + 'limit' => 'تم الوصول إلى حد النسخ الاحتياطي', + 'created' => 'تم إنشاء :name', + 'notification_success' => 'تم إنشاء النسخة الاحتياطية بنجاح', + 'notification_fail' => 'فشل إنشاء النسخة الاحتياطية', + 'name' => 'الاسم', + 'ignored' => 'الملفات والمجلدات المتجاهلة', + 'locked' => 'مقفل؟', + 'lock_helper' => 'منع حذف هذه النسخة الاحتياطية حتى يتم إلغاء قفلها.', + ], + 'lock' => [ + 'lock' => 'قفل', + 'unlock' => 'فتح القفل', + ], + 'download' => 'تحميل', + 'rename' => [ + 'title' => 'إعادة تسمية', + 'new_name' => 'اسم النسخة الاحتياطية', + 'notification_success' => 'تم إعادة تسمية النسخة الاحتياطية بنجاح', + ], + 'restore' => [ + 'title' => 'استعادة', + 'helper' => 'سيتم إيقاف الخادم الخاص بك. لن تتمكن من التحكم في حالة الطاقة، أو الوصول إلى مدير الملفات، أو إنشاء نسخ احتياطية إضافية حتى تكتمل هذه العملية.', + 'delete_all' => 'حذف جميع الملفات قبل استعادة النسخة الاحتياطية؟', + 'notification_started' => 'جار استعادة النسخة الاحتياطية', + 'notification_success' => 'تم استعادة النسخة الاحتياطية بنجاح', + 'notification_fail' => 'فشل استعادة النسخة الاحتياطية', + 'notification_fail_body_1' => 'هذا الخادم ليس حاليا في حالة تسمح باستعادة النسخة الاحتياطية.', + 'notification_fail_body_2' => 'لا يمكن استعادة هذه النسخة الاحتياطية في هذا الوقت: لم تكتمل أو فشل.', + ], + 'delete' => [ + 'title' => 'حذف النسخة الاحتياطية', + 'description' => 'هل ترغب في حذف :backup؟', + 'notification_success' => 'تم حذف النسخة الاحتياطية', + 'notification_fail' => 'تعذر حذف النسخة الاحتياطية', + 'notification_fail_body' => 'فشل الاتصال بالعقدة. الرجاء المحاولة مرة أخرى.', + ], + ], +]; diff --git a/lang/ar/server/console.php b/lang/ar/server/console.php new file mode 100644 index 0000000000..3d0be84d6d --- /dev/null +++ b/lang/ar/server/console.php @@ -0,0 +1,43 @@ + 'وحدة التحكم', + 'command' => 'اكتب أمر...', + 'command_blocked' => 'الخادم غير متصل...', + 'command_blocked_title' => 'لا يمكن إرسال أمر عندما يكون الخادم غير متصل', + 'open_in_admin' => 'فتح في لوحة المسؤول', + 'power_actions' => [ + 'start' => 'تشغيل', + 'stop' => 'إيقاف', + 'restart' => 'إعادة تشغيل', + 'kill' => 'قتل', + 'kill_tooltip' => 'يمكن أن يؤدي هذا إلى فساد البيانات و/أو فقدان البيانات!', + ], + 'labels' => [ + 'cpu' => 'المعالج', + 'memory' => 'الذاكرة', + 'network' => 'الشبكة', + 'disk' => 'القرص', + 'name' => 'الاسم', + 'status' => 'الحالة', + 'address' => 'العنوان', + 'unavailable' => 'غير متاح', + ], + 'status' => [ + 'created' => 'تم الإنشاء', + 'starting' => 'جار التشغيل', + 'running' => 'قيد التشغيل', + 'restarting' => 'يتم إعادة التشغيل', + 'exited' => 'تم الخروج', + 'paused' => 'متوقف مؤقتاً', + 'dead' => 'ميت', + 'removing' => 'جار الإزالة', + 'stopping' => 'جار الإيقاف', + 'offline' => 'غير مُتصل', + 'missing' => 'مفقود', + ], + 'websocket_error' => [ + 'title' => 'تعذر الاتصال ب websocket!', + 'body' => 'تحقق من وحدة التحكم في المتصفح الخاص بك للحصول على مزيد من التفاصيل.', + ], +]; diff --git a/lang/ar/server/dashboard.php b/lang/ar/server/dashboard.php new file mode 100644 index 0000000000..888f6add2e --- /dev/null +++ b/lang/ar/server/dashboard.php @@ -0,0 +1,28 @@ + 'الخوادم', + 'list' => 'قائمة الخوادم', + 'tabs' => [ + 'my' => 'خوادمي', + 'other' => 'خوادم الآخرين', + 'all' => 'جميع الخوادم', + ], + 'empty_own' => 'لا تملك أي خوادم!', + 'empty_other' => 'ليس لديك حق الوصول إلى أي خادم!', + + 'status' => 'الحالة', + 'server' => 'الخادم', + 'resources' => 'الموارد', + 'usage_limit' => 'حد الاستخدام: :resource', + + 'cpu' => 'المعالج', + 'memory' => 'الذاكرة', + 'disk' => 'القرص', + 'network' => 'الشبكة', + 'none' => 'لا شيء', + 'loading' => 'جار التحميل...', + + 'power_actions' => 'إجراءات التشغيل', + 'power_action_sent' => ':action أرسلت إلى :name', +]; diff --git a/lang/ar/server/database.php b/lang/ar/server/database.php new file mode 100644 index 0000000000..7c05d0a6f8 --- /dev/null +++ b/lang/ar/server/database.php @@ -0,0 +1,26 @@ + 'قواعد البيانات', + 'empty' => 'لا يوجد قواعد بيانات', + 'create_database' => 'إنشاء قاعدة بيانات', + 'limit' => 'تم الوصول إلى حد قاعدة البيانات', + 'viewing' => 'عرض: :databas', + 'host' => 'المضيف', + 'database' => 'قاعدة البيانات', + 'username' => 'اسم المستخدم', + 'password' => 'كلمة المرور', + 'remote' => 'بعيد', + 'created_at' => 'تاريخ الانشاء', + 'name' => 'اسم قاعدة البيانات', + 'name_hint' => 'ترك هذا الحقل فارغًا سيؤدي إلى إنشاء اسم عشوائي تلقائيًا', + 'connections_from' => 'الاتصالات من', + 'max_connections' => 'الحد الأقصى للاتصالات', + 'database_host' => 'مضيف قاعدة بيانات', + 'database_host_select' => 'اختر مضيف قاعدة البيانات', + 'jdbc' => 'سلسلة اتصال JDBC', + 'create_notification' => 'تم إنشاء :database', + 'create_notification_fail' => 'فشل إنشاء :database', + 'delete_notification' => 'تم حذف :database', + 'delete_notification_fail' => 'فشل في حذف :database', +]; diff --git a/lang/ar/server/network.php b/lang/ar/server/network.php new file mode 100644 index 0000000000..5006aed8d7 --- /dev/null +++ b/lang/ar/server/network.php @@ -0,0 +1,17 @@ + 'الشبكة', + 'add' => 'إضافة تخصيص', + 'limit' => 'تم الوصول إلى حد التخصيص', + 'address' => 'العنوان', + 'port' => 'المنفذ', + 'notes' => 'ملاحظات', + 'no_notes' => 'لا يوجد ملاحظات', + 'make_primary' => 'تعيين كـ أساسي', + 'primary' => 'أساسي', + 'make' => 'صنع', + 'delete' => 'حذف', + 'locked' => 'مقفل؟', + 'locked_helper' => 'لا يمكن حذف المخصصات المقفلة إلا من قبل المشرفين', +]; diff --git a/lang/ar/server/startup.php b/lang/ar/server/startup.php new file mode 100644 index 0000000000..e1144a1055 --- /dev/null +++ b/lang/ar/server/startup.php @@ -0,0 +1,17 @@ + 'بدء التشغيل', + 'command' => 'أمر بدء التشغيل', + 'notification_startup' => 'تم تحديث أمر البدء', + 'notification_startup_body' => 'أعد تشغيل الخادم لاستخدام أمر بدء التشغيل الجديد.', + 'enable_preview' => 'تمكين المعاينة', + 'disable_preview' => 'تعطيل المعاينة', + 'docker_image' => 'صورة Docker', + 'notification_docker' => 'تم تحديث صورة Docker', + 'notification_docker_body' => 'أعد تشغيل الخادم لاستخدام الصورة الجديدة.', + 'variables' => 'متغيرات الخادم', + 'update' => 'تم التحديث: :variable', + 'fail' => 'فشل: :variable', + 'validation_fail' => 'فشل التحقق: :variable', +]; diff --git a/lang/ar/server/user.php b/lang/ar/server/user.php new file mode 100644 index 0000000000..336187d67f --- /dev/null +++ b/lang/ar/server/user.php @@ -0,0 +1,73 @@ + 'المستخدمون', + 'username' => 'اسم المستخدم', + 'email' => 'البريد الإلكتروني', + 'assign_all' => 'تعيين الكل', + 'invite_user' => 'دعوة مستخدم', + 'action' => 'دعوة', + 'remove' => 'إزالة مستخدم', + 'edit' => 'تعديل المستخدم', + 'editing' => 'تعديل :user', + 'delete' => 'حذف المستخدم', + 'notification_add' => 'تم دعوة المستخدم!', + 'notification_edit' => 'تم تحديث المستخدم!', + 'notification_delete' => 'تم حذف المستخدم!', + 'notification_failed' => 'فشل دعوة المستخدم!', + 'permissions' => [ + 'title' => 'الأذونات', + 'activity_desc' => 'الأذونات التي تتحكم في وصول المستخدم إلى سجلات أنشطة الخادم.', + 'startup_desc' => 'الأذونات التي تتحكم في قدرة المستخدم على عرض معلمات تشغيل هذا الخادم.', + 'settings_desc' => 'الأذونات التي تتحكم في قدرة المستخدم على تعديل إعدادات هذا الخادم.', + 'control_desc' => 'الأذونات التي تتحكم في قدرة المستخدم على التحكم في حالة تشغيل الخادم أو إرسال الأوامر.', + 'user_desc' => 'الأذونات التي تسمح للمستخدم بإدارة المستخدمين الفرعيين الآخرين على الخادم. لن يتمكنوا أبدًا من تعديل حسابهم الخاص أو منح أذونات لا يمتلكونها بأنفسهم.', + 'file_desc' => 'الأذونات التي تتحكم في قدرة المستخدم على تعديل نظام الملفات لهذا الخادم.', + 'allocation_desc' => 'الأذونات التي تتحكم في قدرة المستخدم على تعديل تخصيصات المنافذ لهذا الخادم.', + 'database_desc' => 'الأذونات التي تتحكم في وصول المستخدم إلى إدارة قواعد البيانات لهذا الخادم.', + 'backup_desc' => 'الأذونات التي تتحكم في قدرة المستخدم على إنشاء وإدارة النسخ الاحتياطية للخادم.', + 'schedule_desc' => 'الأذونات التي تتحكم في وصول المستخدم إلى إدارة الجدولة لهذا الخادم.', + 'startup_read' => 'يسمح للمستخدم بعرض متغيرات بدء التشغيل للخادم.', + 'startup_update' => 'يسمح للمستخدم بتعديل متغيرات بدء التشغيل للخادم.', + 'startup_docker_image' => 'يسمح للمستخدم بتعديل صورة Docker المستخدمة عند تشغيل الخادم.', + 'settings_reinstall' => 'يسمح للمستخدم بتشغيل إعادة تثبيت هذا الخادم.', + 'settings_rename' => 'يسمح للمستخدم بإعادة تسمية هذا الخادم.', + 'settings_description' => 'يسمح للمستخدم بتغيير وصف هذا الخادم.', + 'activity_read' => 'يسمح للمستخدم بعرض سجلات أنشطة الخادم.', + 'websocket_connect' => 'يسمح للمستخدم بالوصول إلى websocket لهذا الخادم.', + 'control_console' => 'يسمح للمستخدم بإرسال بيانات إلى وحدة تحكم الخادم.', + 'control_start' => 'يسمح للمستخدم بتشغيل الخادم.', + 'control_stop' => 'يسمح للمستخدم بإيقاف الخادم.', + 'control_restart' => 'يسمح للمستخدم بإعادة تشغيل الخادم.', + 'control_kill' => 'يسمح للمستخدم بإنهاء عملية الخادم.', + 'user_create' => 'يسمح للمستخدم بإنشاء حسابات مستخدمين جديدة للخادم.', + 'user_read' => 'يسمح للمستخدم بعرض المستخدمين المرتبطين بهذا الخادم.', + 'user_update' => 'يسمح للمستخدم بتعديل المستخدمين الآخرين المرتبطين بهذا الخادم.', + 'user_delete' => 'يسمح للمستخدم بحذف المستخدمين الآخرين المرتبطين بهذا الخادم.', + 'file_create' => 'يسمح للمستخدم بإنشاء ملفات ومجلدات جديدة.', + 'file_read' => 'يسمح للمستخدم بعرض محتويات دليل، ولكن ليس عرض محتوى أو تنزيل الملفات.', + 'file_read_content' => 'يسمح للمستخدم بعرض محتوى ملف معين. سيسمح ذلك أيضًا للمستخدم بتنزيل الملفات.', + 'file_update' => 'يسمح للمستخدم بتحديث الملفات والمجلدات المرتبطة بالخادم.', + 'file_delete' => 'يسمح للمستخدم بحذف الملفات والمجلدات.', + 'file_archive' => 'يسمح للمستخدم بإنشاء أرشيفات ملفات وفك ضغط الأرشيفات الموجودة.', + 'file_sftp' => 'يسمح للمستخدم بتنفيذ العمليات السابقة باستخدام عميل SFTP.', + 'allocation_read' => 'يسمح للمستخدم بعرض جميع التخصيصات المعينة حاليًا لهذا الخادم. يمكن للمستخدمين الذين لديهم أي مستوى من الوصول إلى هذا الخادم دائمًا عرض التخصيص الأساسي.', + 'allocation_update' => 'يسمح للمستخدم بتغيير التخصيص الأساسي للخادم وإضافة ملاحظات لكل تخصيص.', + 'allocation_delete' => 'يسمح للمستخدم بحذف تخصيص من الخادم.', + 'allocation_create' => 'يسمح للمستخدم بتعيين تخصيصات إضافية للخادم.', + 'database_create' => 'يسمح للمستخدم بإنشاء قاعدة بيانات جديدة للخادم.', + 'database_read' => 'يسمح للمستخدم بعرض قواعد بيانات الخادم.', + 'database_update' => 'يسمح للمستخدم بإجراء تعديلات على قاعدة بيانات. إذا لم يكن لدى المستخدم إذن "عرض كلمة المرور"، فلن يتمكن من تعديل كلمة المرور.', + 'database_delete' => 'يسمح للمستخدم بحذف قاعدة بيانات.', + 'database_view_password' => 'يسمح للمستخدم بعرض كلمة مرور قاعدة البيانات في النظام.', + 'schedule_create' => 'يسمح للمستخدم بإنشاء جدول جديد للخادم.', + 'schedule_read' => 'يسمح للمستخدم بعرض الجداول الزمنية للخادم.', + 'schedule_update' => 'يسمح للمستخدم بتعديل جدول زمني موجود للخادم.', + 'schedule_delete' => 'يسمح للمستخدم بحذف جدول زمني للخادم.', + 'backup_create' => 'يسمح للمستخدم بإنشاء نسخ احتياطية جديدة لهذا الخادم.', + 'backup_read' => 'يسمح للمستخدم بعرض جميع النسخ الاحتياطية الموجودة لهذا الخادم.', + 'backup_delete' => 'يسمح للمستخدم بإزالة النسخ الاحتياطية من النظام.', + 'backup_download' => 'يسمح للمستخدم بتنزيل نسخة احتياطية للخادم. تحذير: يسمح هذا للمستخدم بالوصول إلى جميع ملفات الخادم في النسخة الاحتياطية.', + 'backup_restore' => 'يسمح للمستخدم باستعادة نسخة احتياطية للخادم. تحذير: يسمح هذا للمستخدم بحذف جميع ملفات الخادم أثناء العملية.', + ], +]; diff --git a/lang/ar/server/users.php b/lang/ar/server/users.php deleted file mode 100644 index 7f1d02db71..0000000000 --- a/lang/ar/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'يتيح الوصول إلى الويب سوكيت لهذا الخادم.', - 'control_console' => 'يسمح للمستخدم بإرسال بيانات إلى وحدة تحكم الخادم.', - 'control_start' => 'يسمح للمستخدم بتشغيل نموذج الخادم.', - 'control_stop' => 'يسمح للمستخدم بإيقاف نموذج الخادم.', - 'control_restart' => 'يسمح للمستخدم بإعادة تشغيل نموذج الخادم.', - 'control_kill' => 'يسمح للمستخدم بإنهاء نموذج الخادم.', - 'user_create' => 'يسمح للمستخدم بإنشاء حسابات مستخدمين جديدة للخادم.', - 'user_read' => 'يمنح المستخدم إذنًا لعرض المستخدمين المرتبطين بهذا الخادم.', - 'user_update' => 'يسمح للمستخدم بتعديل المستخدمين الآخرين المرتبطين بهذا الخادم.', - 'user_delete' => 'يسمح للمستخدم بحذف المستخدمين الآخرين المرتبطين بهذا الخادم.', - 'file_create' => 'يمنح المستخدم إذنًا بإنشاء ملفات ودلائل جديدة.', - 'file_read' => 'يسمح للمستخدم برؤية الملفات والمجلدات المرتبطة بهذا نموذج الخادم، بالإضافة إلى عرض محتوياتها.', - 'file_update' => 'يسمح للمستخدم بتحديث الملفات والمجلدات المرتبطة بالخادم.', - 'file_delete' => 'يسمح للمستخدم بحذف الملفات والدلائل.', - 'file_archive' => 'يسمح للمستخدم بإنشاء أرشيفات الملفات وفك ضغط الأرشيفات الموجودة.', - 'file_sftp' => 'يسمح للمستخدم بتنفيذ الإجراءات المذكورة أعلاه للملفات باستخدام عميل SFTP.', - 'allocation_read' => 'يتيح الوصول إلى صفحات إدارة تخصيص الخادم.', - 'allocation_update' => 'يمنح المستخدم إذنًا بإجراء تعديلات على تخصيصات الخادم.', - 'database_create' => 'يمنح المستخدم إذنًا لإنشاء قاعدة بيانات جديدة للخادم.', - 'database_read' => 'يمنح المستخدم إذنًا لعرض قواعد البيانات الخاصة بالخادم.', - 'database_update' => 'يمنح المستخدم إذنًا لإجراء تعديلات على قاعدة بيانات. إذا لم يمتلك المستخدم إذن "عرض كلمة المرور" أيضًا، فلن يتمكن من تعديل كلمة المرور.', - 'database_delete' => 'يمنح المستخدم إذنًا بحذف نموذج قاعدة البيانات.', - 'database_view_password' => 'يمنح المستخدم إذنًا لعرض كلمة مرور قاعدة البيانات في النظام.', - 'schedule_create' => 'يسمح للمستخدم بإنشاء جدول زمني جديد للخادم.', - 'schedule_read' => 'يمنح المستخدم إذنًا لعرض جداول الخادم.', - 'schedule_update' => 'يمنح المستخدم إذنًا لإجراء تعديلات على جدول الخادم الحالي.', - 'schedule_delete' => 'يسمح للمستخدم بحذف جدول الخادم.', - ], -]; diff --git a/lang/ar/strings.php b/lang/ar/strings.php deleted file mode 100644 index 012be9f067..0000000000 --- a/lang/ar/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'البريد الإلكتروني', - 'email_address' => 'عنوان البريد الإلكتروني', - 'user_identifier' => 'اسم المستخدم أو البريد الإلكتروني', - 'password' => 'كلمة المرور', - 'new_password' => 'كلمة المرور الجديدة', - 'confirm_password' => 'تأكيد كلمة المرور الجديدة', - 'login' => 'تسجيل الدخول', - 'home' => 'الرئيسية', - 'servers' => 'الخوادم', - 'id' => 'الهوية', - 'name' => 'الاسم', - 'node' => 'العقدة', - 'connection' => 'الاتصال', - 'memory' => 'الذاكرة', - 'cpu' => 'المعالج', - 'disk' => 'القرص', - 'status' => 'الحالة', - 'search' => 'بحث', - 'suspended' => 'معلق', - 'account' => 'الحساب', - 'security' => 'الأمان', - 'ip' => 'عنوان IP', - 'last_activity' => 'آخر نشاط', - 'revoke' => 'سحب', - '2fa_token' => 'رمز التوثيق', - 'submit' => 'إرسال', - 'close' => 'إغلاق', - 'settings' => 'الإعدادات', - 'configuration' => 'التكوين', - 'sftp' => 'اتصال FTP محمى', - 'databases' => 'قواعد البيانات', - 'memo' => 'مذكرة', - 'created' => 'تم إنشاؤه', - 'expires' => 'تنتهي', - 'public_key' => 'مفتاح عام', - 'api_access' => 'وصول API', - 'never' => 'أبداً', - 'sign_out' => 'تسجيل الخروج', - 'admin_control' => 'التحكم الإداري', - 'required' => 'مطلوب', - 'port' => 'المنفذ', - 'username' => 'اسم المستخدم', - 'database' => 'قاعدة البيانات', - 'new' => 'جديد', - 'danger' => 'خطر', - 'create' => 'إنشاء', - 'select_all' => 'تحديد الكل', - 'select_none' => 'إلغاء تحديد الكل', - 'alias' => 'الاسم المستعار', - 'primary' => 'أساسي', - 'make_primary' => 'جعله أساسي', - 'none' => 'لا شيء', - 'cancel' => 'إلغاء', - 'created_at' => 'أُنشئ في', - 'action' => 'عمل', - 'data' => 'بيانات', - 'queued' => 'في قائمة الانتظار', - 'last_run' => 'آخر تشغيل', - 'next_run' => 'التشغيل التالي', - 'not_run_yet' => 'لم يتم التشغيل بعد', - 'yes' => 'نعم', - 'no' => 'لا', - 'delete' => 'حذف', - '2fa' => 'المصادقة الثنائية', - 'logout' => 'تسجيل الخروج', - 'admin_cp' => 'لوحة التحكم الإدارية', - 'optional' => 'اختياري', - 'read_only' => 'للقراءة فقط', - 'relation' => 'علاقة', - 'owner' => 'المالك', - 'admin' => 'المدير', - 'subuser' => 'المستخدم الفرعي', - 'captcha_invalid' => 'الكابتشا المقدمة غير صالحة.', - 'tasks' => 'المهام', - 'seconds' => 'ثواني', - 'minutes' => 'دقائق', - 'under_maintenance' => 'تحت الصيانة', - 'days' => [ - 'sun' => 'الأحد', - 'mon' => 'الاثنين', - 'tues' => 'الثلاثاء', - 'wed' => 'الأربعاء', - 'thurs' => 'الخميس', - 'fri' => 'الجمعة', - 'sat' => 'السبت', - ], - 'last_used' => 'آخر استخدام', - 'enable' => 'تمكين', - 'disable' => 'تعطيل', - 'save' => 'حفظ', - 'copyright' => '® 2024 - بيليكان سنة', -]; diff --git a/lang/ar/validation.php b/lang/ar/validation.php index cac14f8719..bed9cff641 100644 --- a/lang/ar/validation.php +++ b/lang/ar/validation.php @@ -28,7 +28,7 @@ 'string' => 'يجب أن يكون طول :attribute بين :min و :max حرفًا.', 'array' => 'يجب أن يحتوي :attribute على :min إلى :max عناصر.', ], - 'boolean' => 'يجب أن يكون :attribute صحيحًا أو خاطئًا.', + 'confirmed' => 'تأكيد :attribute غير متطابق.', 'date' => ':attribute ليس تاريخًا صالحًا.', 'date_format' => ':attribute لا يتطابق مع الشكل :format.', @@ -36,13 +36,13 @@ 'digits' => 'يجب أن يكون :attribute :digits أرقام.', 'digits_between' => 'يجب أن يكون :attribute بين :min و :max رقمًا.', 'dimensions' => ':attribute يحتوي على أبعاد صورة غير صالحة.', - 'distinct' => 'الحقل :attribute يحتوي على قيمة مكررة.', + 'email' => 'يجب أن يكون :attribute عنوان بريد إلكتروني صالحًا.', - 'exists' => 'ال:attribute المحدد غير صالح.', + 'file' => 'يجب أن يكون :attribute ملفًا.', 'filled' => 'حقل :attribute إلزامي.', 'image' => 'يجب أن يكون :attribute صورة.', - 'in' => ':attribute المحدد غير صالح.', + 'in_array' => 'حقل :attribute غير موجود في :other.', 'integer' => 'يجب أن يكون :attribute عددًا صحيحًا.', 'ip' => 'يجب أن يكون :attribute عنوان IP صالحًا.', @@ -61,17 +61,13 @@ 'string' => 'يجب أن يكون طول :attribute على الأقل :min حرفًا.', 'array' => 'يجب أن يحتوي :attribute على الأقل :min عناصر.', ], - 'not_in' => ':attribute المحدد غير صالح.', + 'numeric' => 'يجب أن يكون :attribute رقمًا.', - 'present' => 'يجب تقديم حقل :attribute.', + 'regex' => 'تنسيق :attribute غير صالح.', - 'required' => 'حقل :attribute مطلوب.', - 'required_if' => 'حقل :attribute مطلوب عندما يكون :other هو :value.', - 'required_unless' => 'حقل :attribute مطلوب ما لم يكن :other في :values.', - 'required_with' => 'حقل :attribute مطلوب عند توفر :values.', + 'required_with_all' => 'حقل :attribute مطلوب عند توفر كل من :values.', - 'required_without' => 'حقل :attribute مطلوب عند عدم توفر :values.', - 'required_without_all' => 'حقل :attribute مطلوب عند عدم توفر أي من :values.', + 'same' => 'يجب أن يتطابق :attribute و :other.', 'size' => [ 'numeric' => 'يجب أن يكون :attribute :size.', @@ -81,8 +77,7 @@ ], 'string' => 'يجب أن يكون :attribute نصًا.', 'timezone' => 'يجب أن تكون :attribute منطقة زمنية صالحة.', - 'unique' => 'تم أخذ :attribute بالفعل.', - 'uploaded' => 'فشل في تحميل :attribute.', + 'url' => 'تنسيق :attribute غير صالح.', /* diff --git a/lang/be/activity.php b/lang/be/activity.php index 0394353145..c8df524175 100644 --- a/lang/be/activity.php +++ b/lang/be/activity.php @@ -11,27 +11,27 @@ 'fail' => 'Не атрымалася аўтарызавацца', 'success' => 'Увайшоў', 'password-reset' => 'Скінуць пароль', - 'reset-password' => 'Запытаць скіданне пароля', 'checkpoint' => 'Двухфактарная аўтэнтыфікацыя ўключана', 'recovery-token' => 'Использован резервный код 2FA', 'token' => 'Пройдена двухфакторная проверка', - 'ip-blocked' => 'Заблокирован запрос с IP адреса не внесенного в список для :identifier', + 'ip-blocked' => 'Блакаваная заявка ад неўлічанага IP-адрасу для :identifier', 'sftp' => [ 'fail' => 'Не атрымалася аўтарызавацца', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Изменена эл. почта с :old на :new', + 'username-changed' => 'Зменен ідэнтыфікатар карыстальніка з :old на :new', + 'email-changed' => 'Зменена электронная пошта з :old на :new', 'password-changed' => 'Змяніць пароль', ], 'api-key' => [ - 'create' => 'Создан новый API ключ :identifier', - 'delete' => 'Создан новый API ключ :identifier', + 'create' => 'Створаны новы API ключ :identifier', + 'delete' => 'Выдалены API ключ :identifier', ], 'ssh-key' => [ - 'create' => 'Добавлен SSH ключ :fingerprint в аккаунт', - 'delete' => 'Добавлен SSH ключ :fingerprint в аккаунт', + 'create' => 'Дададзены SSH ключ :fingerprint да ўліковага запісу', + 'delete' => 'Выдалены SSH ключ :fingerprint з уліковага запісу', ], 'two-factor' => [ 'create' => 'Включена двухфакторная авторизация', @@ -39,92 +39,87 @@ ], ], 'server' => [ - 'reinstall' => 'Сервер переустановлен', 'console' => [ - 'command' => 'Executed ":command" on the server', + 'command' => 'Выканана дзеянне :command на серверы', ], 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', + 'start' => 'Сервер запушчаны', + 'stop' => 'Сервер спынены', + 'restart' => 'Сервер перазапушчаны', + 'kill' => 'Працэс сервера завершаны', ], 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', + 'download' => 'Спампавана рэзервовая копія :name', + 'delete' => 'Выдалена рэзервовая копія :name', + 'restore' => 'Адноўлена рэзервовая копія :name (выдаленыя файлы: :truncate)', + 'restore-complete' => 'Завершана аднаўленне рэзервовай копіі :name', + 'restore-failed' => 'Няўдалася завяршыць аднаўленне рэзервовай копіі :name', + 'start' => 'Пачата новая рэзервовая копія :identifier', + 'complete' => 'Рэзервовая копія :name адзначана як завершаная', + 'fail' => 'Рэзервовая копія :name адзначана як няўдалая', + 'lock' => 'Замкнута рэзервовая копія :name', + 'unlock' => 'Адкрылі рэзервовую копію :name', + 'rename' => 'Перайменаваны рэзервовы файл з ":old_name" у ":new_name"', ], 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', + 'create' => 'Створана новая база дадзеных :name', + 'rotate-password' => 'Пароль для базы даных :name зменены', + 'delete' => 'Выдалена база дадзеных :name', ], 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', + 'compress' => 'Кампрэсаваны :directory:files|Кампрэсавана :count файлаў у :directory', + 'read' => 'Паглядзелі змесціва файла :file', + 'copy' => 'Створана копія файла :file', + 'create-directory' => 'Створана тэчка :directory:name', + 'decompress' => 'Распакоўка файла :file у :directory', + 'delete' => 'Выдалены :directory:files|Выдалены :count файлаў у :directory', + 'download' => 'Спампаваны файл :file', + 'pull' => 'Спампаваны файл з аддаленага сэрвера з :url у :directory', + 'rename' => 'Перамешчаны/ Пераназваны :from у :to|Перамешчаны/ Пераназваны :count файлаў у :directory', + 'write' => 'Запісаны новы кантэнт у файл :file', + 'upload' => 'Пачата загрузка файла', + 'uploaded' => 'Загружаны файл :directory:file', ], 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', + 'denied' => 'Блакаваная магчымасць доступу SFTP з-за правоў', + 'create' => 'Створаны :files|Створана :count новых файлаў', + 'write' => 'Заменен змест у :files|Зменены змест :count файлаў', + 'delete' => 'Выдалены :files|Выдалены :count файлы', + 'create-directory' => 'Створана папка :files|Створана :count папак', + 'rename' => 'Пераназваны :from у :to|Пераназваны або перамешчаны :count файлы', ], 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', + 'create' => 'Дададзена :allocation на сервер', + 'notes' => 'Абноўлены заўвагі для :allocation з :old на :new', + 'primary' => 'Усталявана :allocation як асноўная сетка для сервера', + 'delete' => 'Выдалена сетка :allocation', ], 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', + 'create' => 'Створана задача :name', + 'update' => 'Абноўлена задача :name', + 'execute' => 'Уручную выканана задача :name', + 'delete' => 'Выдалена задача :name', ], 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', + 'create' => 'Створана новая дзеянне ":action" для задачы ":name"', + 'update' => 'Абноўлена дзеянне ":action" для задачы ":name".', + 'delete' => 'Выдалена дзеянне ":action" для задачы ":name"', ], 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', + 'rename' => 'Пераназваны сервер з ":old" на ":new"', + 'description' => 'Змянёна апісанне сервера з ":old" на ":new"', + 'reinstall' => 'Сервер пераўсталяваны', ], 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', + 'edit' => 'Змянёна зменная ":variable" з ":old" на ":new"', + 'image' => 'Абноўлены Docker-вобраз для сервера з ":old" на ":new"', + 'command' => 'Абноўлена каманда запуску для сервера з ":old" на ":new"', ], 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', + 'create' => 'Дададзены ":email" як падкарыстальнік', + 'update' => 'Абноўлены правы падкарыстальніка для ":email"', + 'delete' => 'Выдалены ":email" як падкарыстальнік', ], + 'crashed' => 'Сервер выйшаў з ладу', ], ]; diff --git a/lang/be/admin/apikey.php b/lang/be/admin/apikey.php new file mode 100644 index 0000000000..b3371a1a61 --- /dev/null +++ b/lang/be/admin/apikey.php @@ -0,0 +1,27 @@ + 'API ключы прыкладання', + 'empty' => 'Няма API ключоў', + 'whitelist' => 'Белы спіс IPv4 адрасоў', + 'whitelist_help' => 'API ключы могуць быць абмежаваны для працы з пэўнымі IPv4 адрасамі. Увядзіце кожны адрас на новым радку.', + 'whitelist_placeholder' => 'Напрыклад: 127.0.0.1 або 192.168.1.1', + 'description' => 'Апісанне', + 'description_help' => 'Кароткае апісанне гэтага ключа.', + 'nav_title' => 'API ключы', + 'model_label' => 'API ключ прыкладання', + 'model_label_plural' => 'API ключы прыкладання', + 'table' => [ + 'key' => 'Ключ', + 'description' => 'Апісанне', + 'last_used' => 'Апошняе выкарыстанне', + 'created' => 'Створаны', + 'created_by' => 'Стварыў', + 'never_used' => 'Не выкарыстоўвалася', + ], + 'permissions' => [ + 'none' => 'Няма', + 'read' => 'Чытаць', + 'read_write' => 'Чытаць і пісаць', + ], +]; diff --git a/lang/be/admin/dashboard.php b/lang/be/admin/dashboard.php new file mode 100644 index 0000000000..6f968e93a9 --- /dev/null +++ b/lang/be/admin/dashboard.php @@ -0,0 +1,46 @@ + 'Сардэчна запрашаем у Pelican!', + 'version' => 'Версія: :version', + 'advanced' => 'Дадатковыя', + 'server' => 'Сервер', + 'user' => 'Карыстальнік', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Інфармацыя для Распрацоўшчыкаў +', + 'content' => 'Дзякуем, што паспрабавалі распрацоўчую версію!', + 'extra_note' => 'Калі ўзнікнуць якія-небудзь праблемы, калі ласка, паведаміце пра іх на GitHub.', + 'button_issues' => 'Апавясціць аб праблеме.', + 'button_features' => 'Абмеркаваць функцыі.', + ], + 'intro-update-available' => [ + 'heading' => 'Даступна абнаўленне.', + 'content' => ':latestVersion цяпер даступная! Прачытайце нашу дакументацыю, каб абнавіць вашу панэль.', + 'button_changelog' => 'Што новага?', + ], + 'intro-no-update' => [ + 'heading' => 'Ваша панэль абноўлена да актуальнай версіі.', + 'content' => 'Цяпер вы выкарыстоўваеце :version. Ваша панэль абноўлена!', + ], + 'intro-first-node' => [ + 'heading' => 'Вузлы не выяўленыя.', + 'content' => 'Здаецца, у вас яшчэ няма наладжаных вузлоў, але не хвалюйцеся — проста націсніце кнопку дзеяння, каб стварыць свой першы вузел!', + 'extra_note' => 'Калі ў вас узнікнуць якія-небудзь праблемы, калі ласка, паведаміце пра іх на GitHub.', + 'button_label' => 'Стварыце першы вузел у Pelican', + ], + 'intro-support' => [ + 'heading' => 'Падтрымка Pelican', + 'content' => 'Дзякуй за выкарыстанне Pelican! Гэта стала магчымым толькі дзякуючы падтрымцы вас, нашых удзельнікаў і ўсіх астатніх, хто нас падтрымлівае!', + 'extra_note' => 'Мы ўдзячныя кожнаму за любую падтрымку.', + 'button_translate' => 'Дапамагчы з перакладам', + 'button_donate' => 'Ахвяраваць напрамую', + ], + 'intro-help' => [ + 'heading' => 'Патрэбна дапамога?', + 'content' => 'Спачатку азнаёмцеся з дакументацыяй! Калі ўсё яшчэ патрэбна дапамога — заходзьце на наш Discord-сервер!', + 'button_docs' => 'Прачытаць дакументацыю', + ], + ], +]; diff --git a/lang/be/admin/databasehost.php b/lang/be/admin/databasehost.php new file mode 100644 index 0000000000..8f89b50f41 --- /dev/null +++ b/lang/be/admin/databasehost.php @@ -0,0 +1,72 @@ + 'Базы даных', + 'model_label' => 'База даных', + 'model_label_plural' => 'Хост базы даных', + 'table' => [ + 'database' => 'База даных', + 'name' => 'Імя', + 'host' => 'Хост', + 'port' => 'Порт', + 'name_helper' => 'Калі пакінуць гэта поле пустым, імя будзе створана аўтаматычна.', + 'username' => 'Ідэнтыфікатар карыстальніка', + 'password' => 'Пароль', + 'remote' => 'Падключэнні з', + 'remote_helper' => 'Адкуль павінны дазваляцца падключэнні. Пакіньце пустым, каб дазволіць іх з любога месца.', + 'max_connections' => 'Максімальная колькасць злучэнняў', + 'created_at' => 'Створана ў', + 'connection_string' => 'Радок падключэння да JDBC', + ], + 'error' => 'Памылка пры падключэнні з хостам', + 'host' => 'Хост', + 'host_help' => 'IP-адрас або даменнае імя, якое павінна выкарыстоўвацца пры спробе падключэння з гэтым хостам MySQL з панэлі для стварэння новых баз даных.', + 'port' => 'Порт', + 'port_help' => 'Порт, на якім працуе MySQL для гэтага хоста.', + 'max_database' => 'Максімальная колькасць баз даных', + 'max_databases_help' => 'Максімальная колькасць баз дадзеных, якія можна стварыць на гэтым хосце. Калі ліміт дасягнуты, новыя базы дадзеных на гэтым хосце ствараць нельга. Пустое значэнне — без абмежавання.', + 'display_name' => 'Назва', + 'display_name_help' => 'IP-адрас або даменнае імя, якое павінна адлюстроўвацца для канчатковага карыстальніка.', + 'username' => 'Имя пользователя', + 'username_help' => 'Ідэнтыфікатар карыстальніка ўліковага запісу, які мае дастатковыя правы для стварэння новых карыстальнікаў і баз даных у сістэме.', + 'password' => 'Пароль', + 'password_help' => 'Пароль да карыстальніка базы даных.', + 'linked_nodes' => 'Звязаныя вузлы', + 'linked_nodes_help' => 'Гэта налада выкарыстоўваецца па змаўчанні толькі для гэтага хоста базы даных пры даданні базы на сервер, што знаходзіцца на выбраным вузле.', + 'connection_error' => 'Памылка пры падключэнні з хостам базы даных', + 'no_database_hosts' => 'Няма хостаў базы даных', + 'no_nodes' => 'Няма вузлоў', + 'delete_help' => 'Хост базы дадзеных ужо ўтрымлівае базы даных', + 'unlimited' => 'Без абмежавання', + 'anywhere' => 'З любога месца', + + 'rotate' => 'Павярнуць', + 'rotate_password' => 'Абнавіць пароль', + 'rotated' => 'Пароль абноўлены', + 'rotate_error' => 'Не атрымалася абнавіць пароль', + 'databases' => 'Базы данных', + + 'setup' => [ + 'preparations' => 'Падрыхтоўка', + 'database_setup' => 'Устаноўка базы даных', + 'panel_setup' => 'Устаноўка панэлі', + + 'note' => 'На дадзены момант падтрымліваюцца толькі базы MySQL / MariaDB!', + 'different_server' => 'Панэль і база даных не знаходзяцца на адным серверы?', + + 'database_user' => 'Карыстальнік базы даных', + 'cli_login' => 'Выкарыстай mysql -u root -p, каб атрымаць доступ да mysql cli.', + 'command_create_user' => 'Каманда для стварэння карыстальніка', + 'command_assign_permissions' => 'Каманда для прызначэння разрашэнняў', + 'cli_exit' => 'Каб выйсці з mysql cli, увядзіце exit.', + 'external_access' => 'Знешні доступ', + 'allow_external_access' => ' +

Скорэй за ўсё, табе спатрэбіцца дазволіць знешні доступ да гэтай інстанцыі MySQL, каб серверы маглі падключацца да яе.

+
+

Для гэтага адкрый файл my.cnf, які можа знаходзіцца ў розных месцах у залежнасці ад аперацыйнай сістэмы і спосабу ўстаноўкі MySQL. Ты можаш увесці каманду find /etc -iname my.cnf, каб знайсці яго.

+
+

Адкрый my.cnf, дадай наступны тэкст у канец файла і запішы змены:
[mysqld]
bind-address=0.0.0.0

+
+

Перазапусці MySQL або MariaDB, каб прымяніць змены. Гэта зменіць стандартную канфігурацыю MySQL, якая па змаўчанні прымае злучэнні толькі з localhost. Пасля абнаўлення канфігурацыі сервер зможа прымаць злучэнні на ўсіх інтэрфейсах, у тым ліку і знешнія. Абавязкова дазволь порт MySQL (па змаўчанні 3306) у брандмаўэры.

', + ], +]; diff --git a/lang/be/admin/eggs.php b/lang/be/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/be/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/be/admin/health.php b/lang/be/admin/health.php new file mode 100644 index 0000000000..4a5acc51ba --- /dev/null +++ b/lang/be/admin/health.php @@ -0,0 +1,60 @@ + 'Стан', + 'results_refreshed' => 'Рэкамендацыі па праверцы стану абноўлены', + 'checked' => 'Правераныя вынікі ад :time', + 'refresh' => 'Абнавіць', + 'results' => [ + 'cache' => [ + 'label' => 'Кэш', + 'ok' => 'Добра', + 'failed_retrieve' => 'Няўдалося ўсталяваць або атрымаць значэнне кэша прыкладання.', + 'failed' => 'Адбылася памылка з кэшам прыкладання: :error', + ], + 'database' => [ + 'label' => 'База даных', + 'ok' => 'Добра', + 'failed' => 'Няўдалося падключыцца да базы даных: :error', + ], + 'debugmode' => [ + 'label' => 'Рэжым адладки', + 'ok' => 'Рэжым адладки адключаны', + 'failed' => 'Чакалася, што рэжым адладки будзе: :expected, але на самой справе быў: :actual', + ], + 'environment' => [ + 'label' => 'Асяроддзе', + 'ok' => 'Добра, усталявана на :actual', + 'failed' => 'Асяроддзе ўсталявана на :actual, чакалася :expected', + ], + 'nodeversions' => [ + 'label' => 'Версіі вузлоў', + 'ok' => 'Вузлы абноўлены', + 'failed' => ':outdated:/:all вузлы састарэлі', + 'no_nodes_created' => 'Вузлоў няма', + 'no_nodes' => 'Вузлоў няма', + 'all_up_to_date' => 'Усе абноўлена', + 'outdated' => ':outdated:/:all састарэла', + ], + 'panelversion' => [ + 'label' => 'Версія панэлі', + 'ok' => 'Панэль абноўлена да актуальнай версіі', + 'failed' => 'Усталяваная версія: :currentVersion, але апошняя: :latestVersion', + 'up_to_date' => 'Абноўлена', + 'outdated' => 'Састарэла', + ], + 'schedule' => [ + 'label' => 'Задача', + 'ok' => 'Добра', + 'failed_last_ran' => 'Апошні запуск задачы адбыўся больш за :time хвілін таму назад', + 'failed_not_ran' => 'Задача яшчэ не выканана', + ], + 'useddiskspace' => [ + 'label' => 'Месца на дыску', + ], + ], + 'checks' => [ + 'successful' => 'Паспяхова', + 'failed' => 'Няўдалося', + ], +]; diff --git a/lang/be/admin/mount.php b/lang/be/admin/mount.php new file mode 100644 index 0000000000..793f23080b --- /dev/null +++ b/lang/be/admin/mount.php @@ -0,0 +1,30 @@ + 'Маунты', + 'model_label' => 'Маунт', + 'model_label_plural' => 'Маунты', + 'name' => 'Імя', + 'name_help' => 'Унікальнае імя, якое выкарыстоўваецца для аддзялення гэтага маунта ад іншых.', + 'source' => 'Крыніца', + 'source_help' => 'Шлях да файла на сістэме для маунта ў кантэйнер.', + 'target' => 'Месца прызначэння', + 'target_help' => 'Месца, дзе маунт будзе даступны ўнутры кантэйнера.', + 'read_only' => 'Толькі для чытання?', + 'read_only_help' => 'Ці з\'яўляецца маунт толькі для чытання ўнутры кантэйнера?', + 'description' => 'Апісанне', + 'description_help' => 'Больш падрабязнае апісанне для гэтага маунта', + 'no_mounts' => 'Няма маунтаў', + 'eggs' => 'Вобразы', + 'nodes' => 'Вузлы', + 'toggles' => [ + 'writable' => 'Даступна для запісу', + 'read_only' => 'Толькі для чытання', + ], + 'table' => [ + 'name' => 'Імя', + 'all_eggs' => 'Усе вобразы', + 'all_nodes' => 'Усе вузлы', + 'read_only' => 'Толькі для чытання', + ], +]; diff --git a/lang/be/admin/node.php b/lang/be/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/be/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/be/admin/role.php b/lang/be/admin/role.php new file mode 100644 index 0000000000..9a52871ab1 --- /dev/null +++ b/lang/be/admin/role.php @@ -0,0 +1,17 @@ + 'Ролі', + 'model_label' => 'Роля', + 'model_label_plural' => 'Ролі', + 'no_roles' => 'Няма роляў', + 'name' => 'Назва ролі', + 'permissions' => 'Правы', + 'in_use' => 'У выкарыстанні', + 'all' => 'Усе', + 'root_admin' => 'Роля :role мае ўсе правы.', + 'root_admin_delete' => 'Нельга выдаліць Root Admin', + 'users' => 'Карыстальнікі', + 'nodes' => 'Вузлы', + 'nodes_hint' => 'Пакіньце пустым, каб дазволіць доступ да ўсіх вузлоў.', +]; diff --git a/lang/be/admin/server.php b/lang/be/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/be/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/be/admin/user.php b/lang/be/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/be/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/be/auth.php b/lang/be/auth.php index 2a3a452682..3ef3ee975a 100644 --- a/lang/be/auth.php +++ b/lang/be/auth.php @@ -1,27 +1,24 @@ 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], + 'failed' => 'Гэтыя ўліковыя даныя не супадаюць з запісамі.', + 'failed-two-factor' => 'Няправільны код 2FA.', + 'two-factor-code' => 'Код двафактарнай аўтэнтыфікацыі', + 'two-factor-hint' => 'Вы можаце выкарыстоўваць рэзервовыя коды, калі страцілі доступ да вашага прылады.', + 'password' => 'Дадзены пароль няправільны.', + 'throttle' => 'Занадта шмат спробаў уваходу. Калі ласка, паспрабуйце зноў праз :seconds секунд.', + '2fa_must_be_enabled' => 'Адміністратар запатрабаваў уключыць двухфактарную аўтэнтыфікацыю для вашага ўліковага запісу, каб мець магчымасць карыстацца панэллю.', - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', ]; diff --git a/lang/be/command/messages.php b/lang/be/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/be/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/be/commands.php b/lang/be/commands.php new file mode 100644 index 0000000000..6774ac2270 --- /dev/null +++ b/lang/be/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Увядзіце адрас электроннай пошты, з якога павінны быць адпраўлены вобразамі, экспартаваныя з гэтай панэлі. Гэта павінен быць сапраўдны адрас электроннай пошты.', + 'url' => 'URL прыкладання павінен пачынацца з https:// або http:// ў залежнасці ад таго, ці выкарыстоўваецца SSL. Калі схема не будзе ўключаная, вашыя электронныя лісты і іншы кантэнт будуць спасылацца на няправільнае месца.', + 'timezone' => 'Часавы пояс павінен супадаць з адным з падтрымліваемых часавых паясоў PHP. Калі вы не ўпэўнены, калі ласка, звярніцеся да https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Вы выбралі драйвер Redis для адной або некалькіх опцый, калі ласка, прадастаўце сапраўдныя дадзеныя для падключэння ніжэй. У большасці выпадкаў вы можаце выкарыстоўваць па змоўчанні параметры, калі не змянялі вашу наладу.', + 'comment' => 'Па змоўчанні экземпляр Redis мае імя карыстальніка "default" і не мае пароля, паколькі ён працуе лакальна і недаступны знешняму свету. Калі гэта так, проста націсніце enter без уводу значэння.', + 'confirm' => 'Выглядае, што :field ужо вызначаны для Redis, хочаце змяніць?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Рекомендуецца не выкарыстоўваць "localhost" як хост базы дадзеных, бо мы часта сутыкаліся з праблемамі падключэння праз сокеты. Калі вы хочаце выкарыстоўваць лакальнае падключэнне, вам трэба выкарыстоўваць "127.0.0.1".', + 'DB_USERNAME_note' => 'Выкарыстанне ўліковага запісу root для падключэнняў да MySQL не толькі настойліва не рэкамендуецца, але таксама не дазваляецца гэтым прыкладаннем. Вам трэба стварыць карыстальніка MySQL для гэтага праграмнага забеспячэння.', + 'DB_PASSWORD_note' => 'Выглядае, што ў вас ужо вызначаны пароль для падключэння MySQL, хочаце яго змяніць?', + 'DB_error_2' => 'Вашы дадзеныя для падключэння не былі захаваныя. Вам трэба ўвесці сапраўдныя дадзеныя для падключэння, перш чым працягнуць.', + 'go_back' => 'Вярнуцца і паспрабаваць зноў', + ], + 'make_node' => [ + 'name' => 'Увядзіце кароткі ідэнтыфікатар, які выкарыстоўваецца для адрознення гэтага вузла ад іншых', + 'description' => 'Увядзіце апісанне для ідэнтыфікацыі вузла', + 'scheme' => 'Калі ласка, увядзіце https для SSL або http для не-ssl злучэння', + 'fqdn' => 'Увядзіце даменнае імя (напрыклад, node.example.com), якое будзе выкарыстоўвацца для падключэння да дэману. IP-адрас можа выкарыстоўвацца толькі ў тым выпадку, калі вы не выкарыстоўваеце SSL для гэтага вузла', + 'public' => 'Ці павінен гэты вузел быць публічным? Як заўвага, усталёўка вузла ў рэжым прыватнасці будзе адмаўляць магчымасць аўтаматычнага разгортвання на гэтым вузле', + 'behind_proxy' => 'Ваш FQDN знаходзіцца за проксі?', + 'maintenance_mode' => 'Ці павінен быць уключаны рэжым абслугоўвання?', + 'memory' => 'Увядзіце максімальную колькасць памяці', + 'memory_overallocate' => 'Увядзіце колькасць памяці для пераразмеркавання, -1 адключыць праверку, а 0 не дазволіць ствараць новыя серверы', + 'disk' => 'Увядзіце максімальную колькасць месца на дыску', + 'disk_overallocate' => 'Увядзіце колькасць месца на дыску для пераразмеркавання, -1 адключыць праверку, а 0 не дазволіць ствараць новыя серверы', + 'cpu' => 'Увядзіце максімальную колькасць працэсарных рэсурсаў', + 'cpu_overallocate' => 'Увядзіце колькасць працэсарных рэсурсаў для пераразмеркавання, -1 адключыць праверку, а 0 не дазволіць ствараць новыя серверы', + 'upload_size' => 'Увядзіце максімальны памер файла для загрузкі', + 'daemonListen' => 'Увядзіце порт для праслухоўвання дэману', + 'daemonConnect' => 'Увядзіце порт для падключэння дэману (можа супадаць з портам слухання)', + 'daemonSFTP' => 'Увядзіце порт праслухоўвання SFTP дэману', + 'daemonSFTPAlias' => 'Увядзіце псеўданім SFTP дэману (можа быць пустым)', + 'daemonBase' => 'Увядзіце асноўную тэчку', + 'success' => 'Паспяхова створаны новы вузел з імем :name і Id :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Выбраны вузел не існуе.', + 'error_invalid_format' => 'Указаны няправільны фармат. Дапушчальныя фарматы: yaml і json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Выглядае, што вы ўжо наладзілі ключ шыфравання прыкладання. Працягваючы гэты працэс, вы перазапішаце гэты ключ і выклікаеце пашкоджанне дадзеных для ўжо зашыфраваных дадзеных. НЕ ПРАДАЛЖАЙЦЕ, КАЛІ НЕ ВЕДАЕЦЕ, ШТО РАБІЦЕ.', + 'understand' => 'Я разумею наступствы выканання гэтай каманды і бяру на сябе ўсю адказнасць за страту зашыфраваных дадзеных.', + 'continue' => 'Вы ўпэўнены, што хочаце працягнуць? Змена ключа шыфравання прыкладання прівядзе да страту дадзеных.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Няма запланаваных задач для сервера, якія трэба выканаць.', + 'error_message' => 'Узнікла памылка пры апрацоўцы задачы: ', + ], + ], +]; diff --git a/lang/be/dashboard/account.php b/lang/be/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/be/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/be/dashboard/index.php b/lang/be/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/be/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/be/exceptions.php b/lang/be/exceptions.php index 3977c87c24..61aea31a97 100644 --- a/lang/be/exceptions.php +++ b/lang/be/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'Узнікла памылка пры спробе ўзаемадзеяння з дэманам, што прывяло да кода адказу HTTP/:code. Гэтая памылка была запісана ў журнал.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'Вузел павінен мець адключаныя ўсе серверы, каб яго можна было выдаліць.', + 'error_connecting' => 'Немагчыма падключыцца да :node', + 'daemon_off_config_updated' => 'Канфігурацыя дэману была абноўлена, аднак узнікла памылка пры спробе аўтаматычна абнавіць канфігурацыйны файл дэману. Вам трэба будзе ўручную абнавіць канфігурацыйны файл (config.yml), каб дэман ужыў гэтыя змены.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'Сервер ужо прывязаны да гэтай сеткі. Сетка можа быць выдалена толькі ў выпадку, калі сервер не прывязаны.', + 'too_many_ports' => 'Дадаць больш за 1000 портаў у адзін дыяпазон адразу не падтрымліваецца.', + 'invalid_mapping' => 'Картаванне для порта :port няправільнае і не можа быць апрацавана.', + 'cidr_out_of_range' => 'Натацыя CIDR дазваляе выкарыстоўваць маскі толькі ў межах /25 і /32.', + 'port_out_of_range' => 'Порты ў сетцы павінны быць большымі за 1024 і меншымі або роўнымі 65535.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Вобраз з актыўнымі серверамі, падключанымі да яго, не можа быць выдалены з панэлі.', + 'invalid_copy_id' => 'Вобраз, выбраны для капіравання скрыпта, не існуе або капіруе сам скрыпт.', + 'has_children' => 'Гэты вобраз з\'яўляецца бацькам аднаго ці некалькіх іншых вобразаў. Калі ласка, выдаліце гэтыя вобразаў перад выдаленнем гэтага.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'Зменная асяроддзя :name павінна быць унікальнай для гэтага вобраза.', + 'reserved_name' => 'Зменная асяроддзя :name абароненая і не можа быць прызначана іншай зменнай.', + 'bad_validation_rule' => 'Правіла праверкі ":rule" не з\'яўляецца сапраўдным правілам для гэтага прыкладання.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'Узнікла памылка пры спробе прачытаць JSON файл: :error.', + 'file_error' => 'Пададзены JSON файл не з\'яўляецца сапраўдным.', + 'invalid_json_provided' => 'Пададзены JSON файл не ў фармаце, які можа быць распазнаны.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Змяненне ўліковага запісу свайго падкарыстальніка не дазваляецца.', + 'user_is_owner' => 'Вы не можаце дадаць ўладальніка сервера як падкарыстальніка для гэтага сервера.', + 'subuser_exists' => 'Карыстальнік з гэтай поштай ужо прызначаны падкарыстальнікам для гэтага сервера.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Нельга выдаліць сервер базы даных, калі на ім ёсць актыўныя базы дадзеных.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Максімальны інтэрвал для спасцяжнай задачы складае 15 хвілін.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Нельга выдаліць размяшчэнне, калі на яго прывязаны актыўныя вузлы.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Нельга выдаліць уліковы запіс карыстальніка.', + 'has_servers' => 'Нельга выдаліць карыстальніка, калі ў яго ёсць актыўныя серверы. Спачатку выдаліце іх серверы.', + 'node_revocation_failed' => 'Не ўдалося адклікаць ключы на вузле #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Няма вузлоў, якія адпавядаюць патрабаванням для аўтаматычнага разгортвання.', + 'no_viable_allocations' => 'Няма сетак, якія адпавядаюць патрабаванням для аўтаматычнага разгортвання.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => 'Запытаны рэсурс не існуе на гэтым серверы.', + ], + 'mount' => [ + 'servers_attached' => 'Вобраз павінен мець адключаныя ўсе серверы, каб яго можна было выдаліць.', + ], + 'server' => [ + 'marked_as_failed' => 'Гэты сервер яшчэ не завершыў працэс усталёўкі, паспрабуйце пазней.', ], ]; diff --git a/lang/be/pagination.php b/lang/be/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/be/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/be/passwords.php b/lang/be/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/be/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/be/profile.php b/lang/be/profile.php new file mode 100644 index 0000000000..d9deea366a --- /dev/null +++ b/lang/be/profile.php @@ -0,0 +1,70 @@ + 'Профіль', + 'tabs' => [ + 'account' => 'Уліковы запіс', + 'oauth' => 'OAuth', + 'activity' => 'Актыўнасць', + 'api_keys' => 'API ключы', + 'ssh_keys' => 'Ключы SSH', + 'keys' => 'Ключы', + '2fa' => '2FA', + 'customization' => 'Кастамізацыя', + ], + 'username' => 'Имя пользователя', + 'admin' => 'Адміністратар', + 'exit_admin' => 'Выйсці з адміністратара', + 'server_list' => 'Спіс сервероў', + 'email' => 'Пошта', + 'password' => 'Пароль', + 'current_password' => 'Бягучы пароль', + 'password_confirmation' => 'Подтвердіть пароль', + 'timezone' => 'Часавы пояс', + 'language' => 'Мовы', + 'language_help' => 'Ваша мова :state яшчэ не перакладзена!', + 'link' => 'Спалучыць', + 'unlink' => 'Адключыць', + 'unlinked' => ':name адключаны', + 'scan_qr' => 'Адсканаваць QR-код', + 'code' => 'Код', + 'setup_key' => 'Ключ налад', + 'invalid_code' => 'Няправільны код 2FA', + 'code_help' => 'Адсканаваць QR код, выкарыстоўваючы вашую праграму двухкрокавай аўтэнтыфікацыі, а затым увядзіце згенераваны код.', + '2fa_enabled' => 'Двухфактарная аўтэнтыфікацыя зараз уключана!', + 'backup_help' => 'Яны больш не будуць паказаны!', + 'backup_codes' => 'Рэзервовыя коды', + 'disable_2fa' => 'Адключыць 2FA', + 'disable_2fa_help' => 'Увядзіце ваш тэкучы код 2FA для адключэння двухфактарнай аўтэнтыфікацыі.', + 'api_keys' => 'API ключы', + 'create_api_key' => 'Стварыць API ключ', + 'api_key_created' => 'Ключ API створаны', + 'description' => 'Апісанне', + 'allowed_ips' => 'Дазволеныя IP-адраса', + 'allowed_ips_help' => 'Націсніце Enter, каб дадаць новы IP-адрас, або пакіньце пустым, каб дазволіць любы IP-адрас', + 'ssh_keys' => 'Ключы SSH', + 'create_ssh_key' => 'Стварыць SSH ключ', + 'ssh_key_created' => 'Ключ SHH створаны', + 'name' => 'Назва', + 'public_key' => 'Публічны ключ', + 'could_not_create_ssh_key' => 'Няўдалося стварыць SSH ключ', + 'dashboard' => 'Панэль кіравання', + 'dashboard_layout' => 'Макет панэлі кіравання', + 'console' => 'Тэрмінал', + 'grid' => 'Сетка', + 'table' => 'Табліца', + 'rows' => 'Радкі', + 'font_size' => 'Памер шрыфта', + 'font' => 'Шрыфт', + 'font_preview' => 'Папярэдні прагляд шрыфту', + 'seconds' => 'Секунды', + 'graph_period' => 'Перыяд графіка', + 'graph_period_helper' => 'Колькасць кропак даных (у секундах) на графіках у тэрмінале.', + 'navigation' => 'Тып панэлі', + 'sidebar' => 'Бакавая панэль', + 'topbar' => 'Верхняя панэль', + 'mixed' => 'Змешаны', + 'no_oauth' => 'Вы пакуль не звязалі ніводнага ўліковага запісу', + 'no_api_keys' => 'Няма API ключоў', + 'no_ssh_keys' => 'Няма SSH ключоў', +]; diff --git a/lang/be/search.php b/lang/be/search.php new file mode 100644 index 0000000000..3d91d4040d --- /dev/null +++ b/lang/be/search.php @@ -0,0 +1,9 @@ + 'Калі ласка, увядзіце хаця б тры сімвалы, каб пачаць пошук.', + 'term' => [ + 'label' => 'Тэрмін для пошуку', + 'description' => 'Увядзіце назву сервера, UUID або сець, каб пачаць пошук.', + ], +]; diff --git a/lang/be/server/setting.php b/lang/be/server/setting.php new file mode 100644 index 0000000000..5f1a6d5478 --- /dev/null +++ b/lang/be/server/setting.php @@ -0,0 +1,55 @@ + 'Налады', + 'server_info' => [ + 'title' => 'Інфармацыя сервера', + 'information' => 'Інфармацыя', + 'name' => 'Імя сервера', + 'server_name' => 'Імя сервера: :name', + 'notification_name' => 'Імя сервера абноўлено', + 'description' => 'Апісанне сервера', + 'notification_description' => 'Апісанне сервера абноўлено', + 'failed' => 'Не атрымалася', + 'uuid' => 'UUID сервера', + 'uuid_short' => 'ID сервера', + 'node_name' => 'Назва вузла', + 'icon' => [ + 'upload' => 'Загрузіць іконку', + 'tooltip' => 'Выкарыстоўваць іконку вобраза', + 'updated' => 'Іконка сервера абноўлена', + 'deleted' => 'Іконка сервера выдалена', + ], + 'limits' => [ + 'title' => 'Ліміты', + 'unlimited' => 'Неабмежавана', + 'of' => 'з :max', + 'cpu' => 'Працэсар', + 'memory' => 'Памяць', + 'disk' => 'Месца на дыску', + 'backups' => 'Рэзервовыя копіі', + 'databases' => 'База даных', + 'allocations' => 'Сеткі', + 'no_allocations' => 'Дадатковыя сеткі адсутнічаюць', + ], + 'sftp' => [ + 'title' => 'Інфармацыя пра SFTP', + 'connection' => 'Падключэнне', + 'action' => 'Падключыцца да SFTP', + 'username' => 'Ідэнтыфікатар карыстальніка', + 'password' => 'Пароль', + 'password_body' => 'Ваш пароль для SFTP супадае з паролем для ўваходу ў панэль.', + ], + ], + 'reinstall' => [ + 'title' => 'Пераўсталяваць сервер', + 'body' => 'Пераўсталёўка сервера спыніць яго і паўторна запусціць інсталяцыйны скрыпт, які першапачаткова яго наладзіў.', + 'body2' => 'Падчас працэсу некаторыя файлы могуць быць выдалены або зменены, калі ласка, зрабіце рэзервовую копію дадзеных перад працягам.', + 'action' => 'Пераўсталяваць', + 'modal' => 'Ці ўпэўнены вы, што хочаце пераўсталяваць гэты сервер?', + 'modal_description' => 'Падчас працэсу некаторыя файлы могуць быць выдалены або зменены, калі ласка, зрабіце рэзервовую копію дадзеных перад працягам.', + 'yes' => 'Так, пераўсталяваць', + 'notification_start' => 'Пераўстаноўка пачата', + 'notification_fail' => 'Памылка пераўсталёўкі', + ], +]; diff --git a/lang/be/server/users.php b/lang/be/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/be/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/be/strings.php b/lang/be/strings.php deleted file mode 100644 index 0205e847ef..0000000000 --- a/lang/be/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Пошта', - 'email_address' => 'Адрас электроннай пошты', - 'user_identifier' => 'Имя пользователя или адрес эл. почты', - 'password' => 'Пароль', - 'new_password' => 'Новый пароль', - 'confirm_password' => 'Повторите пароль', - 'login' => 'Авторизация', - 'home' => 'Галоўная', - 'servers' => 'Серверы', - 'id' => 'ID', - 'name' => 'Імя', - 'node' => 'Вузел', - 'connection' => 'Падключэнне', - 'memory' => 'Памяць', - 'cpu' => 'Працэсар', - 'disk' => 'Дыск', - 'status' => 'Стан', - 'search' => 'Поіск', - 'suspended' => 'Пріостановлена', - 'account' => 'Уліковы запіс', - 'security' => 'Безопасность', - 'ip' => 'IP-адрес', - 'last_activity' => 'Последняя активность', - 'revoke' => 'Отозвать', - '2fa_token' => 'Токен аутентификации', - 'submit' => 'Подтвердить', - 'close' => 'Закрыть', - 'settings' => 'Настройки', - 'configuration' => 'Конфигурация', - 'sftp' => 'SFTP', - 'databases' => 'Базы данных', - 'memo' => 'Заметка', - 'created' => 'Создан', - 'expires' => 'Истекает', - 'public_key' => 'Токен', - 'api_access' => 'Api Доступ', - 'never' => 'никогда', - 'sign_out' => 'Выйти', - 'admin_control' => 'Панель администратора', - 'required' => 'Обязательно', - 'port' => 'Порт', - 'username' => 'Имя пользователя', - 'database' => 'База данных', - 'new' => 'Создать', - 'danger' => 'Важно!', - 'create' => 'Создать', - 'select_all' => 'Выбрать всё', - 'select_none' => 'Ни один из предложенных', - 'alias' => 'Псевдоним', - 'primary' => 'Основной', - 'make_primary' => 'Сделать основным', - 'none' => 'Ничего', - 'cancel' => 'Отменить', - 'created_at' => 'Создан', - 'action' => 'Действие', - 'data' => 'Данные', - 'queued' => 'В очереди', - 'last_run' => 'Последний Запуск', - 'next_run' => 'Следующий Запуск', - 'not_run_yet' => 'Ещё Не Запущено', - 'yes' => 'Да', - 'no' => 'Нет', - 'delete' => 'Удалить', - '2fa' => '2FA', - 'logout' => 'Выйти', - 'admin_cp' => 'Панель администратора', - 'optional' => 'Необязательно', - 'read_only' => 'Только для чтения', - 'relation' => 'Отношение', - 'owner' => 'Владелец', - 'admin' => 'Администратор', - 'subuser' => 'Подпользователь', - 'captcha_invalid' => 'Проверка на робота не пройдена.', - 'tasks' => 'Задачи', - 'seconds' => 'Секунды', - 'minutes' => 'Минуты', - 'under_maintenance' => 'На Технических Работах', - 'days' => [ - 'sun' => 'Воскресенье', - 'mon' => 'Понедельник', - 'tues' => 'Вторник', - 'wed' => 'Среда', - 'thurs' => 'Четверг', - 'fri' => 'Пятница', - 'sat' => 'Суббота', - ], - 'last_used' => 'Последнее использование', - 'enable' => 'Включить', - 'disable' => 'Отключить', - 'save' => 'Сохранить', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/be/validation.php b/lang/be/validation.php index 151f3bbf8d..702a6ec49d 100644 --- a/lang/be/validation.php +++ b/lang/be/validation.php @@ -28,62 +28,57 @@ 'string' => 'Значэнне :attribute павінна знаходзіцца ў межах :min і :max', 'array' => 'Значэнне :attribute павінна знаходзіцца ў межах :min і :max', ], - 'boolean' => ':attribute должен иметь значение true или false.', + 'confirmed' => ':attribute подтверждение не совпадает.', 'date' => '{{ attribute }} з\'яўляецца несапраўдным URL-адрасам', 'date_format' => 'Атрибут: не соответствует формату: формат.', 'different' => ':attribute и :other должны быть разными.', 'digits' => ':attribute должен содержать :digits цифр.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + 'digits_between' => ':attribute павінен быць паміж :min і :max лічбамі.', + 'dimensions' => ':attribute мае недапушчальныя памеры выявы.', + + 'email' => ':attribute павінен быць правільным адрасам пошты.', + + 'file' => ':attribute павінен быць файлам.', + 'filled' => 'Поле :attribute абавязковае.', + 'image' => ':attribute павінен быць выявай.', + + 'in_array' => 'Поле :attribute не існуе ў :other.', + 'integer' => ':attribute павінен быць цэлым лікам.', + 'ip' => ':attribute павінен быць правільным IP-адрасам.', + 'json' => ':attribute павінен быць правільнай радковай перадачай JSON.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute не можа перавышаць :max.', + 'file' => ':attribute не можа перавышаць :max кілабайт.', + 'string' => ':attribute не можа перавышаць :max сімвалаў.', + 'array' => ':attribute не можа мець больш за :max элементаў.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute павінен быць файлам тыпу :values.', + 'mimetypes' => ':attribute павінен быць файлам тыпу :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute павінен быць хаця б :min.', + 'file' => ':attribute павінен быць хаця б :min кілабайт.', + 'string' => ':attribute павінен быць хаця б :min сімвалаў.', + 'array' => ':attribute павінен мець хаця б :min элементаў.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute павінен быць лікам.', + + 'regex' => 'Фармат :attribute недапушчальны.', + + 'required_with_all' => 'Поле :attribute абавязковае, калі :values прысутнічае.', + + 'same' => ':attribute і :other павінны супадаць.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute павінен быць :size.', + 'file' => ':attribute павінен быць :size кілабайт.', + 'string' => ':attribute павінен быць :size сімвалаў.', + 'array' => ':attribute павінен утрымліваць :size элементаў.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute павінен быць радком.', + 'timezone' => ':attribute павінен быць правільнай зонай.', + + 'url' => 'Фармат :attribute недапушчальны.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => ':env зменная', + 'invalid_password' => 'Уведзены пароль недапушчальны для гэтага акаўнта.', ], ]; diff --git a/lang/bg/admin/apikey.php b/lang/bg/admin/apikey.php new file mode 100644 index 0000000000..81cd794b48 --- /dev/null +++ b/lang/bg/admin/apikey.php @@ -0,0 +1,27 @@ + 'API ключ на приложението', + 'empty' => 'Няма API ключове', + 'whitelist' => 'Позволени IPv4 Адреси', + 'whitelist_help' => 'API ключовете могат да бъдат ограничени да работят само от специфични IPv4 адреси. Въведи свеки адрес на нова линия.', + 'whitelist_placeholder' => 'Пример: 172.0.0.1 или 192.168.1.1', + 'description' => 'Описание', + 'description_help' => 'Кратко обяснение за какво е този ключ.', + 'nav_title' => 'API ключове', + 'model_label' => 'API ключ на приложението', + 'model_label_plural' => 'API ключове на приложението', + 'table' => [ + 'key' => 'Ключ', + 'description' => 'Описание', + 'last_used' => 'Последно използван', + 'created' => 'Създаден', + 'created_by' => 'Създаден от', + 'never_used' => 'Никога употребявано', + ], + 'permissions' => [ + 'none' => 'Няма', + 'read' => 'Четене', + 'read_write' => 'Четене и писане', + ], +]; diff --git a/lang/bg/admin/databasehost.php b/lang/bg/admin/databasehost.php new file mode 100644 index 0000000000..6e2c4f74c9 --- /dev/null +++ b/lang/bg/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Сървъри на база данни', + 'model_label' => 'Сървър на базата данни', + 'model_label_plural' => 'Сървъри на база данни', + 'table' => [ + 'database' => 'База данни', + 'name' => 'Име', + 'host' => 'Адрес', + 'port' => 'Порт', + 'name_helper' => 'Оставяне на полето празно ще генерира име', + 'username' => 'Потребителско име', + 'password' => 'Парола', + 'remote' => 'Връзки от', + 'remote_helper' => 'От къде да бъдат позволени връзки. Оставете празно за да бъдат позволени от всякъде.', + 'max_connections' => 'Максимален брой връзки', + 'created_at' => 'Създаден от', + 'connection_string' => 'Справка за връзка JDBC', + ], + 'error' => 'Проблем при свързването с :node', + 'host' => 'Хост', + 'host_help' => 'IP адресът или домейна които ще се използва за връзка към то MYSQL сървър към Panel-а за да създадете нова база данни', + 'port' => 'Порт', + 'port_help' => 'Порта който използва Mysql.', + 'max_database' => 'Максимален брой база данни', + 'max_databases_help' => 'Максималната бройка база данни, които могат да бъдат създадени на този хост. Ако лимитът е достигнат, нови бази данни не могат да бъдат създавани. Оставете празно за неограничен лимит.', + 'display_name' => 'Потребителско име', + 'display_name_help' => 'IP адресът или домейнът, който трябва да бъде показан на крайния потребител.', + 'username' => 'Потребителско име', + 'username_help' => 'Потребителското име на профил, който има достатъчно права за създаване на нови потребители и бази данни в системата.', + 'password' => 'Парола', + 'password_help' => 'Парола на потребителя за базата данни', + 'linked_nodes' => 'Свързани Node-ове', + 'linked_nodes_help' => 'Тази настройка по подразбиране задава този хост на база данни само когато се добавя база данни към сървър на избрания Node.', + 'connection_error' => 'Грешка при свързване с хоста на базата данни', + 'no_database_hosts' => 'Няма сървъри на бази данни', + 'no_nodes' => 'Няма Node-ове', + 'delete_help' => 'Хостът има бази данни', + 'unlimited' => 'Неограничено', + 'anywhere' => 'Навсякъде', + + 'rotate' => 'Завърти', + 'rotate_password' => 'Нулирай парола', + 'rotated' => 'Паролата е нулирана', + 'rotate_error' => 'Грешка при нулиране на паролата', + 'databases' => 'Бази данни', + + 'setup' => [ + 'preparations' => 'Подготовки', + 'database_setup' => 'Настройка на базата данни', + 'panel_setup' => 'Настройка на панела', + + 'note' => 'До момента се поддържат само бази данни от типа MySQL/MariaDB!', + 'different_server' => 'Панелът и базата данни не са на един и същ сървър?', + + 'database_user' => 'Потребител за базата данни', + 'cli_login' => 'Използвайте mysql -u root -p за достъп до mysql cli.', + 'command_create_user' => 'Команда за създаване на потребител', + 'command_assign_permissions' => 'Команда за задаване на права', + 'cli_exit' => 'За да излезете от mysql cli, изпълнете exit.', + 'external_access' => 'Външен достъп', + 'allow_external_access' => ' +

Вероятно ще трябва да разрешите външен достъп до този MySQL сървър, за да могат игралните сървъри да се свързват с него.

+
+

За да направите това, отворете my.cnf, чието местоположение варира в зависимост от вашата операционна система и начина на инсталиране на MySQL. Можете да използвате команда find /etc -iname my.cnf, за да го намерите.

+
+

Отворете my.cnf, добавете този текст отдолу и го запазете:
+ [mysqld]
bind-address=0.0.0.0

+
+

Рестартирайте MySQL/MariaDB, за да приложите тези промени. Това ще отмени конфигурацията по подразбиране на MySQL, която по подразбиране приема заявки само от localhost. Актуализирането на това ще позволи външни връзки на всички интерфейси. Уверете се, че сте разрешили MySQL порта (по подразбиране 3306) във вашата защитна стена.

+ ', + ], +]; diff --git a/lang/bg/admin/health.php b/lang/bg/admin/health.php new file mode 100644 index 0000000000..54835248b3 --- /dev/null +++ b/lang/bg/admin/health.php @@ -0,0 +1,60 @@ + 'Здраве', + 'results_refreshed' => 'Резултатите от проверката на състоянието са актуализирани', + 'checked' => 'Проверени резултати от :time .', + 'refresh' => 'Презареждане', + 'results' => [ + 'cache' => [ + 'label' => 'Кеш', + 'ok' => 'Добре', + 'failed_retrieve' => 'Не можа да се зададе или извлече стойност на кеша на приложението.', + 'failed' => 'Възникна изключение с кеша на приложението: :error', + ], + 'database' => [ + 'label' => 'База данни', + 'ok' => 'Добре', + 'failed' => 'Няма връзка с базата данни: :error', + ], + 'debugmode' => [ + 'label' => 'Режим за отстраняване на грешки', + 'ok' => 'Режимът за отстраняване на грешки е деактивиран', + 'failed' => 'Очакваше се режимът на грешки да бъде :expected, но всъщност беше :actual', + ], + 'environment' => [ + 'label' => 'Обстановка', + 'ok' => 'Добре, зададено на :actual', + 'failed' => 'Средата е настроена на :actual, Очакван :expected', + ], + 'nodeversions' => [ + 'label' => 'Версии на nodo-вете.', + 'ok' => 'Node-овете са актуални.', + 'failed' => ':outdated/:all Nodo-вете са неактуални.', + 'no_nodes_created' => 'Няма създадени nodo-ве.', + 'no_nodes' => 'Няма nodo-ве.', + 'all_up_to_date' => 'Всичко е актуално.', + 'outdated' => ':outdated/:all неактуален.', + ], + 'panelversion' => [ + 'label' => 'Панелна версия', + 'ok' => 'Панелът е актуален', + 'failed' => 'Инсталираната версия е :currentVersion, но най-новата е :latestVersion', + 'up_to_date' => 'Нов', + 'outdated' => '', + ], + 'schedule' => [ + 'label' => 'Задача.', + 'ok' => 'Добре.', + 'failed_last_ran' => 'Последното начало на задачата е по-дълго от :time минути', + 'failed_not_ran' => 'Задачата не е започнала все-още.', + ], + 'useddiskspace' => [ + 'label' => 'Място за съхранение.', + ], + ], + 'checks' => [ + 'successful' => 'Успешно.', + 'failed' => 'Провалени :checks', + ], +]; diff --git a/lang/bg/admin/mount.php b/lang/bg/admin/mount.php new file mode 100644 index 0000000000..0371fdf302 --- /dev/null +++ b/lang/bg/admin/mount.php @@ -0,0 +1,30 @@ + 'Mounts', + 'model_label' => 'Поставяне', + 'model_label_plural' => 'Mounts', + 'name' => 'Име', + 'name_help' => 'Уникално име, използвано за разграничаване на този mount от друг.', + 'source' => 'Източник', + 'source_help' => 'Път до файла в хост системата за инсталиране към контейнер.', + 'target' => 'Цел', + 'target_help' => 'Където mount-а ще бъде достъпен в контейнер.', + 'read_only' => 'Само за четене?', + 'read_only_help' => 'Mount-a само за четене ли е вътре в контейнера?', + 'description' => 'Описание', + 'description_help' => 'По-дълго описание за този Mount', + 'no_mounts' => 'Няма Mount-ове', + 'eggs' => 'Яйца', + 'nodes' => 'Node-ове', + 'toggles' => [ + 'writable' => 'Записваемо', + 'read_only' => 'Само за четене', + ], + 'table' => [ + 'name' => 'Име', + 'all_eggs' => 'Всички яйца', + 'all_nodes' => 'Всички Node-ове', + 'read_only' => 'Само за четене', + ], +]; diff --git a/lang/bg/command/messages.php b/lang/bg/command/messages.php new file mode 100644 index 0000000000..469005f0d5 --- /dev/null +++ b/lang/bg/command/messages.php @@ -0,0 +1,54 @@ + [ + 'search_users' => 'Въведете потребителско име, потребителско ID или имейл адрес', + 'select_search_user' => 'ID на потребителя за изтриване (Въведете \'0\' за повторно търсене)', + 'deleted' => 'Потребителят бе изтрит успешно от панела.', + 'confirm_delete' => 'Сигурни ли сте че искате да изтриете този потребител от панела?', + 'no_users_found' => 'Не бяха намерени потребители с предоставената дума за търсене.', + 'multiple_found' => 'Няколко акаунта бяха намерени за този потребител, не може да се изтрие потребител заради --no-interaction флага.', + 'ask_admin' => 'Този потребител администратор ли е?', + 'ask_email' => 'Имейл адрес', + 'ask_username' => 'Потребителско име', + 'ask_password' => 'Парола', + 'ask_password_tip' => 'Ако искате да създадете акаунт с рандомизирана парола изпратена до имейла на потребителя, изпълнете отново тази команда (CTRL+C) и подайте флага `--no-password`.', + 'ask_password_help' => 'Паролите трябва да са поне 8 знака дълги и да имат поне една главна буква и число.', + '2fa_help_text' => 'Тази команда ще изключи дву-факторното удостоверяване за акаунта на потребителя ако е включено. Това трябва да се използва само като команда за възстановяване на акаунта, ако потребителят няма достъп до акаунтът си. Ако не искате това, натиснете CTRL+C за да спрете този процес.', + '2fa_disabled' => 'Дву-факторното удостоверяване е деактивирано за :email.', + ], + 'schedule' => [ + 'output_line' => 'Изпращане на процес за първата задача в `:schedule` (:id).', + ], + 'maintenance' => [ + 'deleting_service_backup' => 'Изтриване на резервен файл на услугата :file.', + ], + 'server' => [ + 'rebuild_failed' => 'Заявката за възстановяване на ":name" (#:id) на възел ":node" е неуспешна с грешка: :message', + 'reinstall' => [ + 'failed' => 'Заявката за преинсталиране на ":name" (#:id) на възел ":node" е неуспешна с грешка: :message', + 'confirm' => 'Предстои преинсталиране на група сървъри. Искате ли да продължите?', + ], + 'power' => [ + 'confirm' => 'Предстои ви да извършите :action срещу :count сървъри. Искате ли да продължите?', + 'action_failed' => 'Заявката за захранващо действие на ":name" (#:id) на възел ":node" е неуспешна с грешка: :message', + ], + ], + 'environment' => [ + 'mail' => [ + 'ask_smtp_host' => 'SMTP хост (пример smtp.gmail.com)', + 'ask_smtp_port' => 'SMTP порт', + 'ask_smtp_username' => 'SMTP потребител', + 'ask_smtp_password' => 'SMTP парола', + 'ask_mailgun_domain' => 'Mailgun домейн', + 'ask_mailgun_endpoint' => 'Mailgun крайна точка', + 'ask_mailgun_secret' => 'Mailgun тайна', + 'ask_mandrill_secret' => 'Mandrill тайна', + 'ask_postmark_username' => 'Postmark API ключ', + 'ask_driver' => 'Кой драйвер трябва да се използва за изпращане на имейли?', + 'ask_mail_from' => 'Имейл адрес, от който трябва да идват имейлите', + 'ask_mail_name' => 'Име от което трябва да идват имейлите', + 'ask_encryption' => 'Метод за криптиране, който да използвате', + ], + ], +]; diff --git a/lang/bg/exceptions.php b/lang/bg/exceptions.php new file mode 100644 index 0000000000..e4a17bb2cb --- /dev/null +++ b/lang/bg/exceptions.php @@ -0,0 +1,64 @@ + 'Имаше изключение при опит за комуникация с daemon-а с код HTTP/:code. Това изключение бе записано.', + 'node' => [ + 'servers_attached' => 'Този node не трябва да има сървъри на него за да се изтрие.', + 'error_connecting' => 'Проблем при свързването с :node', + 'daemon_off_config_updated' => 'Конфигурацията на daemon-а бе актуализирана, обаче възникна проблем при опит за автоматично актуализиране на конфигурационния файл на daemon-а. Ще трябва ръчно да актуализираш конфигорационния файл (config.yml) за да може daemon-а да приложи тези промени.', + ], + 'allocations' => [ + 'server_using' => 'В момента е назначен сървър към тази алокация. Алокацията може да се изтрие само когато не е назначен сървър към нея.', + 'too_many_ports' => 'Добавяне на над 1000 порта в единствен диапазон не се поддържа.', + 'invalid_mapping' => 'Зададеното съпоставяне за :port е невалидно и не може да бъде обработено.', + 'cidr_out_of_range' => 'CIDR нотацията позволява само маски между /25 и /32', + 'port_out_of_range' => 'Портовете в разпределението трябва да са по-голям или равен на 1024 и по-малък или равен на 65535.', + ], + 'egg' => [ + 'delete_has_servers' => 'Egg с назначени активни сървъри към него не може да се изтрие от панела.', + 'invalid_copy_id' => 'Яйцето, избрано за копиране на скрипт, или не съществува, или самото то копира скрипт.', + 'has_children' => 'Това Яйце е родител на едно или повече други Яйца. Моля, изтрийте тези Яйца, преди да изтриете това Яйце.', + ], + 'variables' => [ + 'env_not_unique' => 'Променливата на средата :name трябва да бъде уникална за това Яйце.', + 'reserved_name' => 'Променливата на средата :name е защитена и не може да бъде зададена на променлива.', + 'bad_validation_rule' => 'Правилото за валидиране ":rule" не е валидно правило за това приложение.', + ], + 'importer' => [ + 'json_error' => 'Имаше грешка при опита за анализ на JSON файла: :error.', + 'file_error' => 'Даденият JSON файл не е валиден.', + 'invalid_json_provided' => 'Даденият JSON файл не е в разпознаем формат.', + ], + 'subusers' => [ + 'editing_self' => 'Редактирането на своя подпотребителски акаунт не е позволено.', + 'user_is_owner' => 'Не можеш да добавиш собственика на сървъра като подпотребител на този сървър.', + 'subuser_exists' => 'Потребител с този имейл адрес е вече подпотребител за този сървър.', + ], + 'databases' => [ + 'delete_has_databases' => 'Не може да се изтрие хост сървъра за бази данните, към който са свързани активни бази данни.', + ], + 'tasks' => [ + 'chain_interval_too_long' => 'Максималната продължителност на интервала за верижна задача е 15 минути.', + ], + 'locations' => [ + 'has_nodes' => 'Не можеш да изтриеш локация с активни node-ове свързани към нея.', + ], + 'users' => [ + 'is_self' => 'Не можеш да изтриеш твоя собствен потребителски профил.', + 'has_servers' => 'Не можеш да изтриеш профил със свързани активни сървъри към него. Моля изтрийте техните сървъри преди да продължите.', + 'node_revocation_failed' => 'Неуспешно отнемане на ключовете на Възел #:node. :error', + ], + 'deployment' => [ + 'no_viable_nodes' => 'Не бяха открити възли, отговарящи на изискванията, определени за автоматичен деплоймънт.', + 'no_viable_allocations' => 'Не бяха открити алокации, които да отговарят на изискванията за автоматичен деплоймънт.', + ], + 'api' => [ + 'resource_not_found' => 'Поисканият ресурс не съществува на този сървър.', + ], + 'mount' => [ + 'servers_attached' => 'Този node не трябва да има сървъри на него за да се изтрие', + ], + 'server' => [ + 'marked_as_failed' => 'Този сървър не е приключил инсталирания си процес, моля опитайте по-късно.', + ], +]; diff --git a/lang/bg/search.php b/lang/bg/search.php new file mode 100644 index 0000000000..fe32f25f28 --- /dev/null +++ b/lang/bg/search.php @@ -0,0 +1,9 @@ + 'Моля, въведете поне три символа, за да започнете търсенето.', + 'term' => [ + 'label' => 'Термин за търсене', + 'description' => 'Въведете име на сървър, Uuid или разпределение, за да започнете търсенето.', + ], +]; diff --git a/lang/bg/validation.php b/lang/bg/validation.php new file mode 100644 index 0000000000..60a3abf781 --- /dev/null +++ b/lang/bg/validation.php @@ -0,0 +1,101 @@ + ':attribute трябва да се приеме.', + 'active_url' => ':attribute не е валиден линк.', + 'after' => ':attribute трябва да е дата след :date.', + 'after_or_equal' => ':attribute трябва да е дата преди или равна на :date.', + 'alpha' => ':attribute може да съдържа само букви.', + 'alpha_dash' => ':attribute може да съдържа само букви, цифри и тирета.', + 'alpha_num' => ':attribute може да съдържа само букви и цифри.', + 'array' => ':attribute трябва да е масив.', + 'before' => ':attribute трябва да е дата преди :date.', + 'before_or_equal' => ':attribute трябва да е дата преди или след :date.', + 'between' => [ + 'numeric' => ':attribute трябва да е между :min и :max.', + 'file' => ':attribute трябва да е между :min и :max килобайта.', + 'string' => ':attribute трябва да е между :min и :max знака.', + 'array' => ':attribute трябва да има между :min и :max елемента.', + ], + + 'confirmed' => 'Потвържденито на :attribute не съвпада.', + 'date' => ':attribute не е валидна дата.', + 'date_format' => ':attribute не съотвества на формата :format.', + 'different' => ':attribute и :other трябва да са различни.', + 'digits' => ':attribute трябва да е :digits цифри.', + 'digits_between' => ':attribute трябва да бъде между :min и :max цифри.', + 'dimensions' => 'Изображението :attribute има невалидни размери.', + + 'email' => ':attribute трябва да бъде валиден имейл адрес.', + + 'file' => ':attribute трябва да бъде файл.', + 'filled' => 'Полето :attribute е задължително.', + 'image' => ':attribute трябва да е изображение', + + 'in_array' => 'Полето :attribute не съществува в :other.', + 'integer' => ':attribute трябва да е цяло число.', + 'ip' => ':attribute трябва да е валиден IP адрес.', + 'json' => ':attribute трябва да е валиден JSON низ.', + 'max' => [ + 'numeric' => ':attribute не трябва да е по голям от :max.', + 'file' => ':attribute не трябва да е по-голям от :max килобайта.', + 'string' => ':attribute не трябва да бъде по-дълъг от :max символа.', + 'array' => ':attribute не трябва да има повече от :max елемента.', + ], + 'mimes' => ':attribute трябва да бъде файл от тип: :values.', + 'mimetypes' => ':attribute трябва да бъде файл от тип: :values.', + 'min' => [ + 'numeric' => ':attribute трябва да бъде поне :min.', + 'file' => ':attribute трябва да е поне :min килобайта.', + 'string' => ':attribute трябва да бъде поне :min символа.', + 'array' => ':attribute трябва да има поне :min елемента.', + ], + + 'numeric' => ':attribute трябва да е число.', + + 'regex' => 'Формата :attribute е невалиден', + + 'required_with_all' => 'Полето :attribute е задължително когато :values присъства.', + + 'same' => ':attribute и :other трябва да съвпадат.', + 'size' => [ + 'numeric' => ':attribute трябва да е :size.', + 'file' => ':attribute трябвада бъде :size килобайта.', + 'string' => ':attribute трябва да е :size знака.', + 'array' => ':attribute трябва да съдържа :size елемента.', + ], + 'string' => ':attribute трябва да бъде низ.', + 'timezone' => ':attribute трябва да бъде валидна зона.', + + 'url' => 'Формата :attribute е невалиден.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + + // Internal validation logic for Panel + 'internal' => [ + 'variable_value' => ':env променливо', + 'invalid_password' => 'Зададената парола е невалидна за този акаунт.', + ], +]; diff --git a/lang/ca/activity.php b/lang/ca/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/ca/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/ca/admin/eggs.php b/lang/ca/admin/eggs.php deleted file mode 100644 index d36d1f701c..0000000000 --- a/lang/ca/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'S\'ha importat amb èxit aquest Egg i les seves variables associades.', - 'updated_via_import' => 'Aquest Egg s\'ha actualitzat utilitzant el fitxer proporcionat.', - 'deleted' => 'S\'ha eliminat amb èxit l\'egg sol·licitat del Panell.', - 'updated' => 'La configuració de l\'Egg s\'ha actualitzat correctament.', - 'script_updated' => 'El script d\'instal·lació de l\'Egg s\'ha actualitzat i s\'executarà sempre que s\'instal·lin els servidors.', - 'egg_created' => 'S\'ha posat amb èxit un nou egg. Necessitarà reiniciar qualsevol daemon en execució per aplicar aquest nou egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'La variable ":variable" s\'ha eliminat i ja no estarà disponible per als servidors una vegada es reconstrueixin.', - 'variable_updated' => 'S\'ha actualitzat la variable ":variable". Hauràs de reconstruir qualsevol servidor que utilitzi aquesta variable per aplicar els canvis.', - 'variable_created' => 'S\'ha creat amb èxit una nova variable i s\'ha assignat a aquest egg.', - ], - ], -]; diff --git a/lang/ca/admin/node.php b/lang/ca/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/ca/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/ca/admin/server.php b/lang/ca/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/ca/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/ca/admin/user.php b/lang/ca/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/ca/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/ca/auth.php b/lang/ca/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/ca/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/ca/command/messages.php b/lang/ca/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/ca/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/ca/dashboard/account.php b/lang/ca/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/ca/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/ca/dashboard/index.php b/lang/ca/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/ca/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/ca/exceptions.php b/lang/ca/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/ca/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/ca/pagination.php b/lang/ca/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/ca/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/ca/passwords.php b/lang/ca/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/ca/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/ca/server/users.php b/lang/ca/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/ca/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/ca/strings.php b/lang/ca/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/ca/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/ca/validation.php b/lang/ca/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/ca/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/cs/activity.php b/lang/cs/activity.php index 912f507216..c92861af6f 100644 --- a/lang/cs/activity.php +++ b/lang/cs/activity.php @@ -9,39 +9,38 @@ return [ 'auth' => [ 'fail' => 'Přihlášení se nezdařilo', - 'success' => 'Přihlášen', + 'success' => 'Přihlášen/a', 'password-reset' => 'Obnovit heslo', - 'reset-password' => 'Požádáno o změnu hesla', 'checkpoint' => 'Požadováno dvoufaktorové ověření', 'recovery-token' => 'Použitý dvoufázový obnovovací token', - 'token' => 'Vyřešená dvoufázová výzva', - 'ip-blocked' => 'Blokovaný požadavek z neuvedené IP adresy pro :identifier', + 'token' => 'Vyřešená dvoufaktorová výzva', + 'ip-blocked' => 'Zablokován požadavek z neuvedené IP adresy pro :identifier', 'sftp' => [ - 'fail' => 'Selhalo přihlášení k SFTP', + 'fail' => 'Selhalo přihlášení SFTP', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Změněn e-mail z :old na :new', - 'password-changed' => 'Změněno heslo', + 'username-changed' => 'Změněno uživatelské jméno z :old na :new', + 'email-changed' => 'Změněný e-mail z :old na :new', + 'password-changed' => 'Změněné heslo', ], 'api-key' => [ - 'create' => 'Vytvořen nový API klíč :identifier', - 'delete' => 'Odstraněný API klíč :identifier', + 'create' => 'Vytvořen nový API klíč :identifier', + 'delete' => 'Smazán API klíč :identifier', ], 'ssh-key' => [ - 'create' => 'Přidán SSH klíč :fingerprint k účtu', - 'delete' => 'Odstraněný SSH klíč :fingerprint z účtu', + 'create' => 'Přidán SSH klíč :fingerprint k účtu', + 'delete' => 'Odstraněn SSH klíč :fingerprint z účtu', ], 'two-factor' => [ - 'create' => 'Povolené doufázové ověření', - 'delete' => 'Vypnuté dvoufázové ověření', + 'create' => 'Povoleno dvoufaktorové ověření', + 'delete' => 'Zakázáno dvoufaktorové ověření', ], ], 'server' => [ - 'reinstall' => 'Přeinstalovaný server', 'console' => [ - 'command' => 'Proveden příkaz „:command“ na serveru', + 'command' => 'Proveden příkaz ":command“ na serveru', ], 'power' => [ 'start' => 'Server byl spuštěn', @@ -50,81 +49,77 @@ 'kill' => 'Ukončen proces serveru', ], 'backup' => [ - 'download' => 'Záloha :name stažena', - 'delete' => 'Záloha :name smazána', - 'restore' => 'Obnovena záloha :name (smazané soubory: :truncate)', - 'restore-complete' => 'Dokončená obnova zálohy :name', - 'restore-failed' => 'Nepodařilo se dokončit obnovení zálohy :name', - 'start' => 'Zahájeno zálohování :name', - 'complete' => 'Označit zálohu :name jako dokončená', - 'fail' => 'Záloha :name označena jako neúspěšná', - 'lock' => 'Záloha :name uzamčena', - 'unlock' => 'Záloha :name odemčena', + 'download' => 'Stáhnuto :name zálohu', + 'delete' => 'Smazána záloha :name', + 'restore' => 'Obnovena záloha :name (smazané soubory: :truncate)', + 'restore-complete' => 'Dokončená obnova zálohy :name', + 'restore-failed' => 'Nepodařilo se dokončit obnovení zálohy :name', + 'start' => 'Nová záloha byla spuštěna :name', + 'complete' => 'Označil :name záloha jako kompletní', + 'fail' => 'Záloha označena jako neúspěšná :name', + 'lock' => 'Uzamčeno :name záloha', + 'unlock' => 'Odemknul :name zálohu', + 'rename' => 'Záloha přejmenovaná z ":old_name" na ":new_name"', ], 'database' => [ - 'create' => 'Vytvořena nová databáze :name', - 'rotate-password' => 'Heslo pro databázi :name změněno', - 'delete' => 'Smazána databáze :name', + 'create' => 'Vytvořena nová databáze :name', + 'rotate-password' => 'Heslo pro databázi :name', + 'delete' => 'Smazána databáze :name', ], 'file' => [ - 'compress_one' => 'Komprimováno :directory:file', - 'compress_other' => 'Komprimováno :count souborů v :directory', - 'read' => 'Zobrazen obsah :file', - 'copy' => 'Vytvořena kopie :file', - 'create-directory' => 'Vytvořen adresář :directory:name', - 'decompress' => 'Dekomprimováno :files souborů v :directory', - 'delete_one' => 'Smazáno :directory:files.0', - 'delete_other' => ':count souborů v :directory bylo smazáno', - 'download' => 'Staženo :file', - 'pull' => 'Stažen vzdálený soubor z :url do :directory', - 'rename_one' => 'Přejmenováno :directory:files.0.from na :directory:files.0.to', - 'rename_other' => 'Přejmenováno :count souborů v :directory', - 'write' => 'Přepsaný nový obsah v :file', + 'compress' => 'Komprimováno :directory:files|Komprimováno :count souborů v :directory', + 'read' => 'Zobrazen obsah :file', + 'copy' => 'Vytvořena kopie :file', + 'create-directory' => 'Vytvořený adresář :directory:name', + 'decompress' => 'Dekomprimován :file v :directory', + 'delete' => 'Smazáno :directory:files|Smazáno :count souborů v :directory', + 'download' => 'Staženo :file', + 'pull' => 'Stáhnout vzdálený soubor z :url do :directory', + 'rename' => 'Přesunuto / přejmenováno :from to :to|Moved/ přejmenováno :count souborů v :directory', + 'write' => 'Přepsaný nový obsah v :file', 'upload' => 'Zahájeno nahrávání souboru', - 'uploaded' => 'Nahráno :directory:file', + 'uploaded' => 'Nahráno :directory:file', ], 'sftp' => [ - 'denied' => 'Zablokován SFTP přístup z důvodu nedostatku oprávnění', - 'create_one' => 'Vytvořeno :files.0', - 'create_other' => 'Vytvořeno :count nových souborů', - 'write_one' => 'Změněn obsah :files.0', - 'write_other' => 'Změněn obsah :count souborů', - 'delete_one' => 'Smazáno :files.0', - 'delete_other' => 'Smazáno :count souborů', - 'create-directory_one' => 'Vytvořen adresář :files.0', - 'create-directory_other' => 'Vytvořeno :count adresářů', - 'rename_one' => 'Přejmenováno :files.0.from na :files.0.to', - 'rename_other' => 'Přejmenováno nebo přesunuto :count souborů', + 'denied' => 'Zablokován přístup SFTP z důvodu oprávnění', + 'create' => 'Vytvořeno :files|Vytvořeno :count nových souborů', + 'write' => 'Upravil obsah :files|Upravil obsah :count souborů', + 'delete' => 'Smazáno :files|Smazáno :count souborů', + 'create-directory' => 'Vytvořil adresář :files | Vytvořil :count adresáře', + 'rename' => 'Přejmenováno :z na :to|přejmenováno nebo přesunuto :count souborů', ], 'allocation' => [ - 'create' => 'Přidáno :alokace k serveru', - 'notes' => 'Aktualizovány poznámky pro :allocation z „:old“ na „:new“', - 'primary' => 'Nastavit :allocation jako primární alokaci serveru', - 'delete' => 'Odstraněno :allocation', + 'create' => 'Přidáno :allocace na server', + 'notes' => 'Aktualizovány poznámky pro :allocation z ":old" na ":new"', + 'primary' => 'Nastavil :allocation jako primární rozvržení serveru', + 'delete' => 'Smazáno :allocation alokace', ], 'schedule' => [ - 'create' => 'Vytvořen plán :name', - 'update' => 'Aktualizován plán :name', - 'execute' => 'Manuálně proveden plán :name', - 'delete' => 'Odstraněn plán :name', + 'create' => 'Vytvořil/a plán :name', + 'update' => 'Aktualizován plán :name', + 'execute' => 'Manuálně provést plán :name', + 'delete' => 'Smazán plán :name', ], 'task' => [ - 'create' => 'Vytvořen nový úkol „:action“ pro plán :name', - 'update' => 'Aktualizován úkol „:action“ pro plán :name', - 'delete' => 'Odstraněn úkol pro plán :name', + 'create' => 'Vytvořil nový úkol ":action" pro :name plán', + 'update' => 'Aktualizoval úkol ":action" pro plán :name', + 'delete' => 'Odstraněna akce ":action" pro plán :name', ], 'settings' => [ - 'rename' => 'Přejmenován server z :old na :new', - 'description' => 'Změněn popis serveru z :old na :new', + 'rename' => 'Přejmenoval server z ":old" na ":new"', + 'description' => 'Změnil popis serveru z ":old" na ":new"', + 'reinstall' => 'Server přeinstalován', ], 'startup' => [ - 'edit' => ':variable byla změněna z „:old“ na „:new“', - 'image' => 'Aktualizoval Docker Image pro server z :old na :new', + 'edit' => 'Změnil proměnnou :variable z ":old" na ":new"', + 'image' => 'Aktualizoval Docker Image pro server z :old na :new', + 'command' => 'Aktualizován příkaz pro spuštění pro server z :old na :new', ], 'subuser' => [ - 'create' => ':email přidán jako poduživatel', - 'update' => 'Aktualizována oprávnění poduživatele pro :email', - 'delete' => ':email odebrán jako poduživatel', + 'create' => 'Přidáno :email jako poduživatel', + 'update' => 'Aktualizována oprávnění poduživatele pro :email', + 'delete' => 'Odstraněno :email jako poduživatel', ], + 'crashed' => 'Server havaroval', ], ]; diff --git a/lang/cs/admin/apikey.php b/lang/cs/admin/apikey.php new file mode 100644 index 0000000000..4954df0532 --- /dev/null +++ b/lang/cs/admin/apikey.php @@ -0,0 +1,27 @@ + 'API klíče aplikace', + 'empty' => 'Žádné API klíče', + 'whitelist' => 'Povolené IPv4 adresy', + 'whitelist_help' => 'API klíče mohou být omezeny pouze na práci z konkrétních IPv4 adres. Zadejte každou adresu na novém řádku.', + 'whitelist_placeholder' => 'Příklad: 127.0.0.1 nebo 192.168.1.1', + 'description' => 'Popis:', + 'description_help' => 'Stručný popis toho, k čemu tento klíč je.', + 'nav_title' => 'API klíče', + 'model_label' => 'API klíče aplikace', + 'model_label_plural' => 'API klíče aplikace', + 'table' => [ + 'key' => 'Klíč', + 'description' => 'Popis:', + 'last_used' => 'Naposledy použito', + 'created' => 'Vytvořeno', + 'created_by' => 'Vytvořil:', + 'never_used' => 'Nikdy nepoužito', + ], + 'permissions' => [ + 'none' => 'Žádný', + 'read' => 'Přečteno', + 'read_write' => 'Čtení / zápis', + ], +]; diff --git a/lang/cs/admin/dashboard.php b/lang/cs/admin/dashboard.php new file mode 100644 index 0000000000..a26e3fcf80 --- /dev/null +++ b/lang/cs/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Vítejte v Pelican!', + 'version' => 'Verze: :version', + 'advanced' => 'Pokročilé', + 'server' => 'Server', + 'user' => 'Uživatel', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Inofmace o vývojářích', + 'content' => 'Děkujeme za zkoušení naší vývojářské verze', + 'extra_note' => 'Pokud naleznete bugy nahlaste je přes GitHub', + 'button_issues' => 'Vytvořit problém', + 'button_features' => 'Diskutujte o funkcích', + ], + 'intro-update-available' => [ + 'heading' => 'Aktulizace je dostupná', + 'content' => ':latestVersion je nyní dostupná! Přečtěte si dokumentaci jak aktulizovat váš panel.', + 'button_changelog' => 'Co je nového?', + ], + 'intro-no-update' => [ + 'heading' => 'Máte nejnovější verzy panelu', + 'content' => 'Právě používáte verzy :version. Váš panel je aktuální', + ], + 'intro-first-node' => [ + 'heading' => 'Nebyly nalezeny žádné uzly', + 'content' => 'Vypadá to že nemáš žádné Nodes nastavené, ale kliknutím na tlačítko akce můžete vytvořit váš první!', + 'extra_note' => 'Pokud naleznete bugy nahlaste je na GitHub', + 'button_label' => 'Vytvořte první Node v Pelican', + ], + 'intro-support' => [ + 'heading' => 'Podpořte Pelican!', + 'content' => 'Děkujeme za používání Pelican, toto je možné vytvářet jen díky vaší podpoře, přespěvatelům a dalším podporovatelům!', + 'extra_note' => 'Vážíme si jaké koliv podpory od kohokoliv.', + 'button_translate' => 'Pomocte Přeložit', + 'button_donate' => 'Darovat přímo', + ], + 'intro-help' => [ + 'heading' => 'Potřebujete pomoc?', + 'content' => 'Nejdříve se podívejte na dokumentaci! Pokud stále potřebujete pomoc, přejděte na náš Discord server!', + 'button_docs' => 'Přečtěte si dokumentaci', + ], + ], +]; diff --git a/lang/cs/admin/databasehost.php b/lang/cs/admin/databasehost.php new file mode 100644 index 0000000000..dae11cd34f --- /dev/null +++ b/lang/cs/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Hostitelé databáze', + 'model_label' => 'Hostitel databáze', + 'model_label_plural' => 'Hostitelé databáze', + 'table' => [ + 'database' => 'Databáze', + 'name' => 'Název', + 'host' => 'Hostitel', + 'port' => 'Port', + 'name_helper' => 'Ponecháním tohoto prázdného bude automaticky generováno náhodné jméno', + 'username' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'remote' => 'Připojení od', + 'remote_helper' => 'Kde by mělo být povoleno připojení. Ponechte prázdné pro povolení připojení odkudkoliv.', + 'max_connections' => 'Maximální počet připojení', + 'created_at' => 'Vytvořeno v', + 'connection_string' => 'JDBC Connection String', + ], + 'error' => 'Chyba při připojování k serveru', + 'host' => 'Hostitel', + 'host_help' => 'IP adresa nebo název domény, které by měly být použity při pokusu o připojení k tomuto MySQL hostiteli z tohoto panelu pro vytvoření nových databází.', + 'port' => 'Port', + 'port_help' => 'Port který MySQL používá na hostiteli', + 'max_database' => 'Maximální počet databází', + 'max_databases_help' => 'Maximální počet databází, které mohou být vytvořeny na tomto serveru. Pokud je dosaženo limitu, na tomto hostiteli nelze vytvořit žádné nové databáze. Prázdné je neomezené.', + 'display_name' => 'Zobrazené jméno', + 'display_name_help' => 'Krátký identifikátor používaný k odlišení tohoto umístění od ostatních. Musí mít 1 až 60 znaků, například us.nyc.lvl3.', + 'username' => 'Uživatelské jméno', + 'username_help' => 'Uživatelské jméno účtu, který má dostatečná oprávnění pro vytvoření nových uživatelů a databází v systému.', + 'password' => 'Heslo', + 'password_help' => 'Heslo pro uživatele databáze.', + 'linked_nodes' => 'Propojený Nodes', + 'linked_nodes_help' => 'Toto nastavení je výchozí pouze pro tuto databázi hostitele při přidání databáze na server vybraného uzlu.', + 'connection_error' => 'Chyba při připojování k serveru', + 'no_database_hosts' => 'Žádné hostitele databáze', + 'no_nodes' => 'Žádné Nodes', + 'delete_help' => 'Databáze hostitel má databáze', + 'unlimited' => 'Neomezené', + 'anywhere' => 'Kdekoliv', + + 'rotate' => 'Otočit', + 'rotate_password' => 'Změnit heslo', + 'rotated' => 'Heslo změněné', + 'rotate_error' => 'Změna hesla se nezdařila', + 'databases' => 'Databáze', + + 'setup' => [ + 'preparations' => 'Přípravy', + 'database_setup' => 'Nastavení databáze', + 'panel_setup' => 'Nastavení panelu', + + 'note' => 'V současné době jsou podporovány pouze databáze MySQL/ MariaDB!', + 'different_server' => 'Jsou panel a databáze ne na stejném serveru?', + + 'database_user' => 'Uživatel databáze', + 'cli_login' => 'Použijte mysql -u root -p pro přístup mysql CLI.', + 'command_create_user' => 'Příkaz k vytvoření uživatele', + 'command_assign_permissions' => 'Příkaz k přiřazení oprávnění', + 'cli_exit' => 'Pro ukončení mysql cli spusťte exit.', + 'external_access' => 'Externí přístup', + 'allow_external_access' => ' +

Šance budete muset povolit externí přístup k této instanci MySQL, abyste se k ní mohli připojit.

+
+

otevřít my. nf, které se liší v umístění v závislosti na vašem OS a jak byl MySQL nainstalován. Můžete napsat /etc -iname my.cnf a najít ji.

+
+

Open my. nf, přidejte text níže do spodní části souboru a uložte jej:
+ [mysqld]
bind-address=0. .0.

+
+

Restart MySQL/ MariaDB, aby se tyto změny použily. Toto přepíše výchozí konfiguraci MySQL, která bude ve výchozím nastavení přijímat pouze žádosti od localhost. Aktualizace umožní připojení na všech rozhraních, a tedy i externí připojení. Ujistěte se, že povolíte MySQL port (výchozí 3306) ve vaší firewall.

+ ', + ], +]; diff --git a/lang/cs/admin/egg.php b/lang/cs/admin/egg.php new file mode 100644 index 0000000000..bed8100f4e --- /dev/null +++ b/lang/cs/admin/egg.php @@ -0,0 +1,110 @@ + 'Vejce', + 'model_label' => 'Vejce', + 'model_label_plural' => 'Vejce', + 'tabs' => [ + 'configuration' => 'Konfigurace', + 'process_management' => 'Správce procesů', + 'egg_variables' => 'Egg Variables', + 'install_script' => 'Nainstalovat skript', + ], + 'import' => [ + 'file' => 'Soubor', + 'url' => 'URL', + 'image_url' => 'URL adresa obrázku', + 'image_error' => 'Obrázek nelze načíst', + 'image_too_large' => 'Obrázek je příliš velký. Limit je 1024KB', + 'egg_help' => 'Toto by mělo být raw .json soubor ( egg-minecraft.json )', + 'url_help' => 'URL musí odkazovat přímo na raw .json soubor', + 'add_url' => 'Nová URL', + 'import_failed' => 'Import se nezdařil', + 'import_success' => 'Import proběhl úspěšně', + 'github' => 'Přidat z Githubu', + 'refresh' => 'Obnovit', + 'import_image' => 'Importovat obrázek', + 'no_local_ip' => 'Lokální IP adresy nejsou povoleny', + 'unsupported_format' => 'Nepodporovaný formát. Podporované formáty: :formats', + 'invalid_url' => 'Zadaná URL adresa je neplatná', + 'image_deleted' => 'Obrázek byl odstraněn', + 'no_image' => 'Žádný obrázek', + 'image_updated' => 'Obrázek byl aktualizován', + ], + 'export' => [ + 'modal' => 'Jak byste chtěli exportovat :egg ?', + 'as' => 'Jako .:format', + ], + 'in_use' => 'Používá se', + 'servers' => 'Servery', + 'name' => 'Název', + 'egg_uuid' => 'Egg UUID', + 'egg_id' => 'Egg ID', + 'name_help' => 'Jednoduché, člověkem čitelné jméno k použití jako identifikátor pro toto vejce.', + 'author' => 'Autor', + 'uuid_help' => 'Toto je globálně jedinečný identifikátor pro toto vejce, které Wings používá jako identifikátor.', + 'author_help' => 'Autor této verze Eggu.', + 'author_help_edit' => 'Autor této verze Egg. Nahrání nové konfigurace Egg od jiného autora to změní.', + 'description' => 'Popis', + 'description_help' => 'Popis tohoto vejce, který se zobrazí v panelu podle potřeby.', + 'add_startup' => 'Přidat příkaz při spuštění', + 'startup_command' => 'Příkaz', + 'startup_commands' => 'Příkazy pro spuštění', + 'startup_name' => 'Zobrazovaný název', + 'startup_help' => 'Příkazy spouštění dostupné pro servery používající tento Egg. První jsou výchozí.', + 'file_denylist' => 'Soubor OdmítnoutList', + 'file_denylist_help' => 'Seznam souborů, které koncovému uživateli není povoleno upravovat.', + 'features' => 'Funkce', + 'force_ip' => 'Vynutit odchozí IP', + 'force_ip_help' => 'Nutí veškerý odchozí provoz sítě, aby jeho zdrojová IP IP byla zasazena do IP primární alokační IP serveru. +Je vyžadováno pro některé hry, aby fungovaly správně, pokud má uzel více veřejných IP adres. +Povolení této volby zakáže interní síťové připojení pro všechny servery používající tento egg, což způsobí, že nemohou interně přistupovat k jiným serverům ve stejném uzlu.', + 'tags' => 'Štítky', + 'update_url' => 'Aktualizace adres URL', + 'update_url_help' => 'URL musí odkazovat přímo na raw .json soubor', + 'add_image' => 'Přidat obrázek Dockeru', + 'docker_images' => 'Docker obrazy', + 'docker_name' => 'Název obrázku', + 'docker_uri' => 'URI obrázku', + 'docker_help' => 'Docker images dostupné pro servery používající tento Egg. První z nich je výchozí.', + + 'stop_command' => 'Příkaz pro zastavení', + 'stop_command_help' => 'Příkaz, který by měl být odeslán serveru, aby byl zastaven. Pokud potřebujete poslat SIGINT měli byste zadat ^C zde.', + 'copy_from' => 'Zkopírovat nastavení z', + 'copy_from_help' => 'Pokud chcete výchozí nastavení z jiného Eggu vyberte z menu výše.', + 'none' => 'Žádný', + 'start_config' => 'Zahájit konfiguraci', + 'start_config_help' => 'Seznam hodnot, které by měl daemon hledat při zapínání serveru, aby bylo možné určit jejich dokončení.', + 'config_files' => 'Konfigurační soubor', + 'config_files_help' => 'Toto by mělo být zastoupení konfiguračních souborů JSON, které mají být změněny a které části by se měly změnit.', + 'log_config' => 'Nastavení logu', + 'log_config_help' => 'Toto by mělo být JSON reprezentace místa, kde jsou uloženy logy a zda by démon měl vytvářet vlastní logy.', + + 'environment_variable' => 'Proměnná prostředí', + 'default_value' => 'Výchozí hodnota', + 'user_permissions' => 'Oprávnění uživatele', + 'viewable' => 'Zobrazitelné', + 'editable' => 'Upravitelné', + 'rules' => 'Pravidla', + 'add_new_variable' => 'Přidat novou proměnnou', + + 'error_unique' => 'Proměnná s tímto názvem již existuje!', + 'error_required' => 'Pole proměnné prostředí je povinné.', + 'error_reserved' => 'Tato proměnná prostředí je rezervována a nelze ji použít.', + + 'script_from' => 'Skript od', + 'script_container' => 'Kontejner skriptů', + 'script_entry' => 'Záznam skriptu', + 'script_install' => 'Nainstalovat skript', + 'no_eggs' => 'Žádná vejce', + 'no_servers' => 'Žádný Server', + 'no_servers_help' => 'K tomuto vejci nejsou přiřazeny žádné servery.', + + 'update' => 'Aktualizovat|Aktualizovat vybrané', + 'updated' => 'Vejce aktualizována|:count/:total vajec aktualizováno', + 'updated_failed' => ':count se nezdařilo', + 'updated_skipped' => ':count přeskočeno', + 'update_question' => 'Opravdu chcete aktualizovat toto vejce?|Jste si jisti, že chcete aktualizovat vybraná vejce?', + 'update_description' => 'Pokud jste provedli nějaké změny vajec, budou přepsáni!|Pokud jste provedli nějaké změny vajec, budou přepsány!', + 'no_updates' => 'Žádné aktualizace pro vybrané vejce k dispozici', +]; diff --git a/lang/cs/admin/eggs.php b/lang/cs/admin/eggs.php deleted file mode 100644 index e6adb4cb8f..0000000000 --- a/lang/cs/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Úspěšně importováno toto vejce a jeho související proměnné.', - 'updated_via_import' => 'Toto vejce bylo aktualizováno pomocí poskytnutého souboru.', - 'deleted' => 'Požadované vejce bylo úspěšně smazáno z panelu.', - 'updated' => 'Konfigurace vejce byla úspěšně aktualizována.', - 'script_updated' => 'Instalační skript vejce byl aktualizován a bude spuštěn vždy, když budou nainstalovány servery.', - 'egg_created' => 'Nové vejce bylo úspěšně přidáno. Abyste mohli použít toto nové vejce, budete muset restartovat všechny spuštěné daemony.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Proměnná „:variable“ byla odstraněna a nebude serverům po rekonstrukci k dispozici.', - 'variable_updated' => 'Proměnná „:variable“ byla aktualizována. Budete muset obnovit všechny servery používající tuto proměnnou pro použití změn.', - 'variable_created' => 'Nová proměnná byla úspěšně vytvořena a přiřazena k tomuto vejci.', - ], - ], -]; diff --git a/lang/cs/admin/health.php b/lang/cs/admin/health.php new file mode 100644 index 0000000000..c6db58b140 --- /dev/null +++ b/lang/cs/admin/health.php @@ -0,0 +1,60 @@ + 'Zdraví', + 'results_refreshed' => 'Výsledky kontroly stavu byly aktualizovány', + 'checked' => 'Kontrolované výsledky od :time', + 'refresh' => 'Obnovit', + 'results' => [ + 'cache' => [ + 'label' => 'Mezipaměť', + 'ok' => 'Ok', + 'failed_retrieve' => 'Nelze nastavit nebo načíst hodnotu mezipaměti aplikace.', + 'failed' => 'Došlo k výjimce v mezipaměti aplikace: :error', + ], + 'database' => [ + 'label' => 'Databáze', + 'ok' => 'Ok', + 'failed' => 'Nelze se připojit k databázi: :error', + ], + 'debugmode' => [ + 'label' => 'Režim ladění', + 'ok' => 'Režim ladění je zakázán', + 'failed' => 'Režim ladění byl očekáván :expected, ale ve skutečnosti byl :actual', + ], + 'environment' => [ + 'label' => 'Prostředí', + 'ok' => 'Ok, nastavte na :actual', + 'failed' => 'Prostředí je nastaveno na :actual , Očekáváno :expected', + ], + 'nodeversions' => [ + 'label' => 'Verze uzlu', + 'ok' => 'Uzly jsou aktuální', + 'failed' => ':zastaralý/:all uzly jsou zastaralé', + 'no_nodes_created' => 'Nebyly vytvořeny žádné uzly', + 'no_nodes' => 'Žádné uzly', + 'all_up_to_date' => 'Všechny aktuální', + 'outdated' => ':zastaralý/:all zastaralý', + ], + 'panelversion' => [ + 'label' => 'Verze panelu', + 'ok' => 'Máte nejnovější verzy panelu', + 'failed' => 'Nainstalovaná verze je :currentVersion ale nejnovější je :latestversion', + 'up_to_date' => 'Aktuální', + 'outdated' => 'Neaktuální', + ], + 'schedule' => [ + 'label' => 'Rozvrh', + 'ok' => 'Ok', + 'failed_last_ran' => 'Poslední běh plánu byl před více než :time minutami', + 'failed_not_ran' => 'Plán se ještě nespustil.', + ], + 'useddiskspace' => [ + 'label' => 'Místo na disku', + ], + ], + 'checks' => [ + 'successful' => 'Úspěšné', + 'failed' => 'Selhání', + ], +]; diff --git a/lang/cs/admin/log.php b/lang/cs/admin/log.php new file mode 100644 index 0000000000..0806fc9138 --- /dev/null +++ b/lang/cs/admin/log.php @@ -0,0 +1,26 @@ + 'Hurá! Žádné chyby!', + 'total_logs' => 'Celkem logů', + 'error' => 'Chyba', + 'warning' => 'Varování', + 'notice' => 'Upozornění', + 'info' => 'Informace', + 'debug' => 'Ladění', + 'navigation' => [ + 'panel_logs' => 'Protokoly panelu', + ], + 'actions' => [ + 'upload_logs' => 'Nahrát logy?', + 'upload_logs_description' => 'Toto nahrajete :file na :url Jste si jisti, že to chcete udělat?', + 'view_logs' => 'Zobrazit logy', + 'log_not_found' => 'Log nebyl nalezen!', + 'log_not_found_description' => 'Nepodařilo se najít log pro :file', + 'failed_to_upload' => 'Nahrávání se nezdařilo.', + 'failed_to_upload_description' => 'HTTP stav: :status', + 'log_upload' => 'Log nahrán!', + 'log_upload_action' => 'Zobrazit log', + 'upload_tooltip' => 'Nahrát na :url', + ], +]; diff --git a/lang/cs/admin/mount.php b/lang/cs/admin/mount.php new file mode 100644 index 0000000000..919c596cab --- /dev/null +++ b/lang/cs/admin/mount.php @@ -0,0 +1,30 @@ + 'Připojení', + 'model_label' => 'Připojit', + 'model_label_plural' => 'Připojit', + 'name' => 'Název', + 'name_help' => 'Jedinečný název použitý k oddělení tohoto přípojného zařízení od jiného.', + 'source' => 'Zdroj', + 'source_help' => 'Cesta k souboru v hostitelském systému pro připojení k kontejneru.', + 'target' => 'Cíl', + 'target_help' => 'Tam, kde bude montáž přístupná uvnitř kontejneru.', + 'read_only' => 'Pouze pro čtení?', + 'read_only_help' => 'Je připojení čteno pouze uvnitř kontejneru?', + 'description' => 'Popis:', + 'description_help' => 'Delší popis pro toto připojení', + 'no_mounts' => 'Žádná připojení', + 'eggs' => 'Vejce', + 'nodes' => 'Uzly', + 'toggles' => [ + 'writable' => 'Lze zapisovat', + 'read_only' => 'Pouze pro čtení', + ], + 'table' => [ + 'name' => 'Název', + 'all_eggs' => 'Všechna vejce.', + 'all_nodes' => 'Všechny uzly', + 'read_only' => 'Pouze pro čtení', + ], +]; diff --git a/lang/cs/admin/node.php b/lang/cs/admin/node.php index 1318415b45..a216feb2ef 100644 --- a/lang/cs/admin/node.php +++ b/lang/cs/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'Poskytnutá FQDN neodpovídá platné IP adrese.', - 'fqdn_required_for_ssl' => 'Pro použití SSL pro tento uzel je vyžadován plně kvalifikovaný název domény, který odpovídá veřejné IP adrese', + 'nav_title' => 'Uzly', + 'model_label' => 'Uzel', + 'model_label_plural' => 'Uzly', + 'create' => 'Vytvořit node', + 'tabs' => [ + 'overview' => 'Přehled', + 'basic_settings' => 'Základní nastavení', + 'advanced_settings' => 'Pokročilá nastavení', + 'config_file' => 'Konfigurační soubor', + 'diagnostics' => 'Diagnostika', ], - 'notices' => [ - 'allocations_added' => 'Alokace byly úspěšně přidány do tohoto uzlu.', - 'node_deleted' => 'Uzel byl úspěšně odebrán z panelu.', - 'node_created' => 'Nový uzel byl úspěšně vytvořen. Daemon na tomto uzlu můžete automaticky nakonfigurovat na kartě Konfigurace. Před přidáním všech serverů musíte nejprve přidělit alespoň jednu IP adresu a port.', - 'node_updated' => 'Informace o uzlu byly aktualizovány. Pokud bylo změněno nastavení daemonu, budete jej muset restartovat, aby se tyto změny projevily.', - 'unallocated_deleted' => 'Smazány všechny nepřidělené porty pro :ip.', + 'table' => [ + 'health' => 'Zdraví', + 'name' => 'Název', + 'address' => 'Adresa', + 'public' => 'Veřejné', + 'servers' => 'Servery', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Vejce', + 'owner' => 'Vlastník', + 'allocation_notes' => 'Poznámky', + 'no_notes' => 'Žádné poznámky', ], + 'node_info' => 'Systémové Informace', + 'wings_version' => 'Verze Wings', + 'cpu_threads' => 'CPU vlákna', + 'architecture' => 'Architektura', + 'kernel' => 'Jádro', + 'unknown' => 'Neznámý', + 'latest' => 'Nejnovější', + 'node_uuid' => 'ID uzlu', + 'node_id' => 'ID uzlu', + + 'ip_address' => 'IP adresa', + 'ip_help' => 'Obvykle veřejná IP adresa Vašeho počítače, pokud neportujete přeposílání.', + 'alias_help' => 'Volitelné zobrazované jméno, které vám pomůže si zapamatovat, co to je.', + 'refresh' => 'Obnovit', + 'domain' => 'Název domény', + 'ssl_ip' => 'Nelze se připojit k IP adrese přes SSL', + 'error' => 'Toto je doménový název, který odkazuje na IP adresu vašeho uzlu. Pokud jste již tuto možnost nastavili, můžete ji ověřit zaškrtnutím dalšího pole!', + 'fqdn_help' => 'Váš panel je v současné době zabezpečen pomocí SSL certifikátu a to znamená, že vaše uzly vyžadují také. Musíte použít název domény, protože nelze získat SSL certifikáty pro IP adresy.', + 'dns' => 'Kontrola záznamu DNS', + 'dns_help' => 'Toto vám umožní zjistit, zda DNS záznam ukazuje na správnou IP adresu.', + 'valid' => 'Platné', + 'invalid' => 'Neplatné', + 'port' => 'Port', + 'ports' => 'Porty', + 'port_help' => 'Pokud používáte daemon za Cloudflare, měli byste nastavit daemon port na 8443, aby bylo umožněno proxying websocketu přes SSL.', + 'connect_port' => 'Port pro připojení', + 'connect_port_help' => 'Připojení s wings použije tento port. Pokud používáte reverzní proxy tak se tohle může lišit od naslouchajícího portu. Při použití Cloudflare proxy byste měli použít 8443.', + 'listen_port' => 'Naslouchat na portu', + 'listen_port_help' => 'Wings budou běžet na tomto portu.', + 'display_name' => 'Zobrazovaný název', + 'ssl' => 'Komunikovat přes SSL', + 'panel_on_ssl' => 'Váš panel používá zabezpečené SSL připojení,
takže váš Daemon musí.', + 'ssl_help' => 'IP adresa nemůže použít SSL.', + + 'tags' => 'Tagy', + 'upload_limit' => 'Limit odesílání', + 'upload_limit_help' => 'Zadejte maximální velikost souborů, které lze nahrát prostřednictvím webového správce souborů.', + 'sftp_port' => 'SFTP port', + 'sftp_alias' => 'SFTP Alias', + 'sftp_alias_help' => 'Zobrazit alias pro SFTP adresu. Ponechte prázdné pro použití Node FQDN.', + 'use_for_deploy' => 'Použít pro zaměstnání?', + 'maintenance_mode' => 'Režim údržby', + 'maintenance_mode_help' => 'Pokud je uzel označen jako \'v rámci údržby\', uživatelé nebudou moci přistupovat k serverům, které jsou na tomto uzlu', + + 'cpu' => 'CPU', + 'cpu_limit' => 'Limit CPU', + 'memory' => 'Paměť', + 'memory_limit' => 'Limit paměti', + 'disk' => 'Disk', + 'disk_limit' => 'Limit Disk', + 'unlimited' => 'Neomezené', + 'limited' => 'Omezené', + 'overallocate' => 'Přetížené', + 'enabled' => 'Aktivováno', + 'disabled' => 'Deaktivován', + 'yes' => 'Ano', + 'no' => 'Ne', + + 'instructions' => 'Pokyny', + 'instructions_help' => 'Uložit tento soubor do kořenového adresáře vašeho daemonu, s názvem config.yml', + + 'auto_deploy' => 'Příkaz automatického nasazení', + 'auto_question' => 'Vyberte si mezi samostatnou instalací a instalací Docker.', + 'auto_label' => 'Typ', + 'standalone' => 'Samostatný', + 'docker' => 'Docker', + 'auto_command' => 'Pro automatickou konfiguraci vašeho uzlu spusťte následující příkaz:', + 'reset_token' => 'Resetovat autorizační token', + 'token_reset' => 'Token daemona byl resetován.', + 'reset_help' => 'Resetování daemon token zruší jakýkoliv požadavek pocházející ze starého tokenu. Tento token se používá pro všechny citlivé operace na démonu, včetně vytvoření a smazání serveru. Z důvodu bezpečnosti doporučujeme tento token pravidelně měnit.', + + 'no_nodes' => 'Žádné uzly', + 'none' => 'Žádný', + 'cpu_chart' => 'CPU - :cpu% of :max%', + 'memory_chart' => 'Pamětí - :used of :total', + 'disk_chart' => 'Úložiště - :used z :total', + 'used' => 'Použité', + 'unused' => 'Nepoužité', + + 'next_step' => 'Další krok', + 'node_has_servers' => 'Uzel má servery', + 'create_allocation' => 'Vytvořit alokaci', + 'primary_allocation' => 'Vytvořit alokaci', + 'databases' => 'Databáze', + 'backups' => 'Zálohy', + + 'error_connecting' => 'Chyba při připojování k serveru', + 'error_connecting_description' => 'Konfiguraci nebylo možné automaticky aktualizovat, budete muset manuálně aktualizovat konfigurační soubor.', + 'allocation' => 'Alokace', + + 'diagnostics' => [ + 'header' => 'Diagnostika uzlu', + 'include_endpoints' => 'Zahrnout koncové body', + 'include_endpoints_hint' => 'Včetně koncových bodů zobrazí URL panelu v logu a NEzastíní je.', + 'include_logs' => 'Zahrnout logy', + 'include_logs_hint' => 'Včetně protokolů zobrazí poslední logy a pomůže sledovat možné problémy.', + 'run_diagnostics' => 'Spustit diagnostiku', + 'upload_to_pelican' => 'Nahrát logy', + 'logs_pulled' => 'Záznamy staženy!', + 'logs_uploaded' => 'Logy Nahrány', + 'upload_failed' => 'Nahrávání protokolů se nezdařilo', + 'view_logs' => 'Zobrazit log', + 'pull' => 'Stáhnout', + 'upload' => 'Nahrát', + 'clear' => 'Vyčistit', + '404' => 'Požadovaná diagnostická zpráva nebyla nalezena. Ujistěte se, že wings jsou aktuální a zkuste to znovu.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Problém s Cloudflare', + 'body' => 'Vaše node není dostupná prostřednictvím Cloudflare', + ], + + 'bulk_update_ip' => 'Aktualizace IP', + 'bulk_update_ip_description' => 'Nahradit starou IP adresu novou, pro alokace. To je užitečné, pokud se IP adresa uzlu změní', + 'update_ip' => 'Upravit IP', + 'old_ip' => 'Původní IP adresa', + 'new_ip' => 'Nová IP adresa', + 'no_allocations_to_update' => 'Nebyly nalezeny žádné alokace se starou IP adresou', + 'ip_updated' => 'Úspěšně aktualizováno :count z :total alokací', + 'ip_update_failed' => ':count alokace(í) se nepodařilo aktualizovat', ]; diff --git a/lang/cs/admin/plugin.php b/lang/cs/admin/plugin.php new file mode 100644 index 0000000000..5b58f86daa --- /dev/null +++ b/lang/cs/admin/plugin.php @@ -0,0 +1,61 @@ + 'Pluginy', + 'model_label' => 'Plugin', + 'model_label_plural' => 'Pluginy', + + 'name' => 'Název', + 'update_available' => 'Aktualizace pro tento plugin je dostupná', + 'author' => 'Autor', + 'version' => 'Verze', + 'category' => 'Kategorie', + 'status' => 'Stav', + 'visit_website' => 'Navštívit webovou stránku', + 'settings' => 'Nastavení', + 'install' => 'Nainstalovat', + 'uninstall' => 'Odinstalovat', + 'update' => 'Aktualizovat', + 'enable' => 'Povolit', + 'disable' => 'Zakázat', + 'import_from_file' => 'Importovat ze souboru', + 'import_from_url' => 'Importovat z URL', + 'no_plugins' => 'Žádné pluginy', + 'all' => 'Vše', + 'change_load_order' => 'Změnit pořadí načítání', + 'apply_load_order' => 'Použít pořadí načítání', + + 'enable_theme_modal' => [ + 'heading' => 'Motiv je již povolen', + 'description' => 'Již máte jeden motiv povolený. Povolení více motivů může mít za následek vizuální chyby. Chcete pokračovat?', + ], + + 'status_enum' => [ + 'not_installed' => 'Nenainstalováno', + 'disabled' => 'Deaktivováno', + 'enabled' => 'Aktivováno', + 'errored' => 'Chyba', + 'incompatible' => 'Nekompatibilní', + ], + + 'category_enum' => [ + 'plugin' => 'Plugin', + 'theme' => 'Motiv', + 'language' => 'Jazykový balíček', + ], + + 'notifications' => [ + 'installed' => 'Plugin nainstalován!', + 'install_error' => 'Plugin nelze nainstalovat', + 'uninstalled' => 'Plugin odinstalován', + 'uninstall_error' => 'Plugin nelze odinstalovat', + 'deleted' => 'Plugin byl smazán', + 'updated' => 'Plugin byl aktualizován', + 'update_error' => 'Plugin nelze aktualizovat', + 'enabled' => 'Plugin aktivován', + 'disabled' => 'Plugin deaktivován', + 'imported' => 'Plugin importován', + 'import_exists' => 'Plugin s tímto ID již existuje', + 'import_failed' => 'Plugin nelze importovat', + ], +]; diff --git a/lang/cs/admin/role.php b/lang/cs/admin/role.php new file mode 100644 index 0000000000..509a8052fb --- /dev/null +++ b/lang/cs/admin/role.php @@ -0,0 +1,17 @@ + 'Role', + 'model_label' => 'Role', + 'model_label_plural' => 'Role', + 'no_roles' => 'Žádné role', + 'name' => 'Název role', + 'permissions' => 'Oprávnění', + 'in_use' => 'Používá se', + 'all' => 'Vše', + 'root_admin' => ':role má všechna oprávnění.', + 'root_admin_delete' => 'Nelze odstranit Root Admin', + 'users' => 'Uživatelé', + 'nodes' => 'Síťové uzly', + 'nodes_hint' => 'Ponechte prázdné pro povolení přístupu ke všem uzlům.', +]; diff --git a/lang/cs/admin/server.php b/lang/cs/admin/server.php index 5699948579..04f5bee4da 100644 --- a/lang/cs/admin/server.php +++ b/lang/cs/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Pokoušíte se odstranit výchozí alokaci pro tento server, ale není k dispozici žádná záložní alokace.', - 'marked_as_failed' => 'Tento server byl označen jako neúspěšný předchozí instalace. Aktuální stav nelze v tomto stavu přepnout.', - 'bad_variable' => 'Došlo k chybě ověření proměnné :name.', - 'daemon_exception' => 'Při pokusu o komunikaci s daemonem došlo k výjimce, která vedla k HTTP/:code kódu odpovědi. Tato výjimka byla zaznamenána. (požadavek id: :request_id)', - 'default_allocation_not_found' => 'Požadovaná výchozí alokace nebyla nalezena v alokaci tohoto serveru.', + 'nav_title' => 'Servery', + 'model_label' => 'Server', + 'model_label_plural' => 'Servery', + 'no_servers' => 'Žádné servery', + 'create' => 'Vytvořit server', + 'next_step' => 'Další krok', + 'ip_address' => 'IP adresa', + 'ip_address_helper' => 'Obvykle veřejná IP adresa Vašeho počítače, pokud neportujete přeposílání.', + 'port' => 'Port', + 'ports' => 'Porty', + 'alias' => 'Alias', + 'alias_helper' => 'Volitelné zobrazované jméno, které vám pomůže si zapamatovat, co to je.', + 'locked' => 'Zamknuto?', + 'locked_helper' => 'Uživatelé nebudou moci odstranit uzamčené příděly', + 'lock' => 'Zamknout', + 'unlock' => 'Odemknout', + 'name' => 'Název', + 'external_id' => 'Externí ID', + 'owner' => 'Vlastník', + 'description' => 'Popis', + 'install_script' => 'Spustit instalační Script?', + 'start_after' => 'Začít po instalaci?', + 'yes' => 'Ano', + 'no' => 'Ne', + 'skip' => 'Přeskočit', + 'primary' => 'Primární', + 'already_primary' => 'Již primární', + 'make_primary' => 'Nastavit jako primární', + 'startup_cmd' => 'Příkaz pro spuštění', + 'startup_name' => 'Název startupu', + 'default_startup' => 'Výchozí příkaz pro spuštění', + 'startup_placeholder' => 'Zadejte vlastní příkaz pro spuštění', + 'variables' => 'Proměnné', + 'resource_limits' => 'Limity zdrojů', + 'cpu' => 'CPU', + 'cpu_limit' => 'Limit CPU', + 'cpu_helper' => '100% se rovná jednomu jádru CPU.', + 'unlimited' => 'Neomezené', + 'limited' => 'Omezené', + 'enabled' => 'Aktivováno', + 'disabled' => 'Deaktivováno', + 'memory' => 'Paměť', + 'memory_limit' => 'Limit paměti', + 'memory_helper' => 'Křídla k této hodnotě přidají hlavu při vytváření kontejneru, aby se ujistila, že při používání maximální paměti nehladoví.', + 'disk' => 'Místo na disku', + 'disk_limit' => 'Limit místa na disku', + 'advanced_limits' => 'Pokročilé limity', + 'cpu_pin' => 'Připnutí CPU', + 'threads' => 'Připnuté vlákna', + 'pin_help' => 'Přidat připnuté vlákno, např. 0 nebo 2-4', + 'swap' => 'Přepnout paměť', + 'swap_limit' => 'Přepnout limit paměti', + 'oom' => 'OOM zabiják', + 'feature_limits' => 'Omezení funkcí', + 'docker_settings' => 'Nastavení Dockeru', + 'docker_image' => 'Docker Image', + 'image_name' => 'Název obrázku', + 'primary_allocation' => 'Hlavní alokace', + 'image' => 'Obrázek', + 'image_placeholder' => 'Zadejte vlastní obrázek', + 'container_labels' => 'Popisek kontejneru:', + 'title' => 'Název', + 'actions' => 'Akce', + 'console' => 'Konzole', + 'suspend' => 'Pozastavit', + 'unsuspend' => 'Zrušit pozastavení', + 'reinstall' => 'Přeinstalovat', + 'reinstall_help' => 'Toto přeinstaluje server pomocí přiřazeného instalačního skriptu z vajec.', + 'reinstall_modal_heading' => 'Opravdu chcete přeinstalovat tento server?', + 'reinstall_modal_description' => '!! To může mít za následek nevratnou ztrátu dat!!', + 'server_status' => 'Stav serveru', + 'view_install_log' => 'Zobrazit protokol instalace', + 'uuid' => 'UUID', + 'node' => 'Uzel', + 'short_uuid' => 'Krátká UUID', + 'toggle_install' => 'Přepnout stav instalace', + 'toggle_install_help' => 'Pokud potřebujete změnit stav instalace z odinstalovaného na instalovaný nebo naopak, můžete tak učinit tímto tlačítkem.', + 'toggle_install_failed_header' => 'Server je ve stavu selhání', + 'toggle_install_failed_desc' => 'Chcete to opravit přeinstalací serveru?', + 'transfer' => 'Převést', + 'transfer_help' => 'Přenést server na jiný uzel.
Upozornění! Tato funkce je stále experimentální. Doporučujeme si nejdříve vytvořit zálohu pro případ ztráty dat.', + 'condition' => 'Podmínky', + 'suspend_all' => 'Zastavit všechny servery', + 'unsuspend_all' => 'Zrušit pozastavení všech serverů', + 'select_allocation' => 'Vybrat alokaci', + 'new_allocation' => 'Vytvořit novou alokaci', + 'additional_allocations' => 'Další alokace', + 'select_additional' => 'Vybrat další alokace', + 'no_variables' => 'Vybrané vejce nemá žádné proměnné!', + 'select_egg' => 'Vyberte nejprve vajíčko pro zobrazení proměnných!', + 'allocations' => 'Alokace', + 'databases' => 'Databáze', + 'no_databases' => 'Pro tento server neexistují žádné databáze', + 'delete_db' => 'Jste si jisti, že chcete odstranit', + 'delete_db_heading' => 'Smazat databázi?', + 'backups' => 'Zálohy', + 'egg' => 'Vejce', + 'mounts' => 'Připojení', + 'no_mounts' => 'Pro tento uzel neexistují žádná zařízení', + 'create_database' => 'Vytvořit databázi', + 'no_db_hosts' => 'Žádní hostitelé databáze', + 'failed_to_create' => 'Chyba při vytváření databáze', + 'change_egg' => 'Změna vejce', + 'new_egg' => 'Nové vejce.', + 'keep_old_variables' => 'Ponechat staré proměnné, pokud je to možné.', + 'create_allocation' => 'Vytvořit alokace', + 'add_allocation' => 'Přidat alokace', + 'view' => 'Zobrazit', + 'no_log' => 'Žádný protokol není k dispozici', + 'tabs' => [ + 'information' => 'Informace', + 'egg_configuration' => 'Nastavení vejce', + 'environment_configuration' => 'Konfigurace prostředí', ], - 'alerts' => [ - 'startup_changed' => 'Konfigurace spouštění pro tento server byla aktualizována. Pokud bylo vejce tohoto serveru změněno, přeinstalování se nyní bude opakovat.', - 'server_deleted' => 'Server byl ze systému úspěšně odstraněn.', - 'server_created' => 'Server byl úspěšně vytvořen v panelu. Povolte prosím démonovi několik minut pro úplnou instalaci tohoto serveru.', - 'build_updated' => 'Detaily sestavení tohoto serveru byly aktualizovány. Některé změny mohou vyžadovat restartování.', - 'suspension_toggled' => 'Stav pozastavení serveru byl změněn na :status.', - 'rebuild_on_boot' => 'Tento server byl označen jako server vyžadující přesestavení kontejneru Docker. To se stane při příštím spuštění serveru.', - 'install_toggled' => 'Stav instalace pro tento server byl přepnut.', - 'server_reinstalled' => 'Tento server byl zařazen do fronty pro reinstalaci, která je nyní zahájena.', - 'details_updated' => 'Podrobnosti o serveru byly úspěšně aktualizovány.', - 'docker_image_updated' => 'Úspěšně změněn výchozí obraz Dockeru, který má být použit pro tento server. Pro tuto změnu je nutný restart.', - 'node_required' => 'Před přidáním serveru do tohoto panelu musíte mít nakonfigurován alespoň jeden uzel.', - 'transfer_nodes_required' => 'Před přenosem serverů musíte mít nakonfigurovány alespoň dva uzly.', - 'transfer_started' => 'Přenos serveru byl zahájen.', - 'transfer_not_viable' => 'Vybraný uzel nemá k dispozici požadovaný prostor na disku nebo paměť pro uložení tohoto serveru.', + 'notifications' => [ + 'server_suspension' => 'Pozastavení serveru', + 'server_suspended' => 'Server byl zablokován', + 'server_already_suspended' => 'Server je již suspendovaný!', + 'server_suspend_help' => 'To zastaví server, zastaví všechny procesy spuštění, a okamžitě zablokovat uživateli přístup ke svým souborům nebo jiným způsobem spravovat server prostřednictvím panelu nebo API.', + 'server_unsuspend_help' => 'Zruší se pozastavení serveru a obnoví přístup k běžnému uživateli.', + 'server_unsuspended' => 'Server byl zablokován', + 'error_server_delete' => 'Server nemohl být bezpečně odstraněn.', + 'error_server_delete_body' => 'Můžete si jej odstranit vynuceně.', + 'create_failed' => 'Nelze vytvořit server', + 'invalid_port_range' => 'Neplatný rozsah portu', + 'invalid_port_range_body' => 'Rozsah portu není platná čísla: :port', + 'too_many_ports' => 'Příliš mnoho portů najednou!', + 'too_many_ports_body' => 'Aktuální limit je :limit počtu portů najednou.', + 'invalid_port' => 'Port není v platném rozsahu', + 'invalid_port_body' => ':i není v platném rozsahu portu mezi :portFloor-:portCeil', + 'already_exists' => 'Port už je používán', + 'already_exists_body' => ':i již má alokaci', + 'error_connecting' => 'Chyba při připojování k :node', + 'error_connecting_description' => 'Konfiguraci nebylo možné automaticky synchronizovat, budete muset manuálně restartovat server.', + 'install_toggled' => 'Stav instalace přepnutý', + 'install_toggle_failed' => 'Stav instalace nelze přepnout', + 'reinstall_started' => 'Přeinstalování zahájeno', + 'reinstall_failed' => 'Nelze spustit přeinstalaci', + 'log_failed' => 'Nelze se připojit k křídlu pro načítání instalačního protokolu serveru.', + 'transfer_started' => 'Přenos začal', + 'transfer_failed' => 'Přenos selhal', + 'already_transfering' => 'Probíhá přenos serveru.', ], + 'notes' => 'Poznámky', + 'no_notes' => 'Žádné poznámky', + 'none' => 'Žádný', ]; diff --git a/lang/cs/admin/setting.php b/lang/cs/admin/setting.php new file mode 100644 index 0000000000..6cfca3ca80 --- /dev/null +++ b/lang/cs/admin/setting.php @@ -0,0 +1,157 @@ + 'Nastavení', + 'save_success' => 'Nastavení uloženo', + 'save_failed' => 'Nepodařilo se uložit nastavení', + 'navigation' => [ + 'general' => 'Všeobecné', + 'captcha' => 'Captcha', + 'mail' => 'E-mail', + 'backup' => 'Záloha', + 'oauth' => 'OAuth', + 'misc' => 'OstatnÍ', + ], + 'general' => [ + 'app_name' => 'Název aplikace', + 'app_logo' => 'Logo aplikace', + 'app_logo_help' => 'Logo by mělo být umístěno ve veřejné složce umístěné v kořenovém panelu. Nechte prázdné pro použití názvu aplikace.', + 'app_favicon' => 'Aplikace ikona (favicon)', + 'app_favicon_help' => 'Favicon by měly být umístěny ve veřejné složce, umístěné v kořenovém panelu.', + 'debug_mode' => 'Režim ladění', + 'navigation' => 'Navigace', + 'default_navigation' => 'Výchozí typ navigace', + 'sidebar' => 'Postranní panel', + 'topbar' => 'Horní lišta', + 'mixed' => 'Smíšený', + 'unit_prefix' => 'Prefix jednotky', + 'decimal_prefix' => 'Desetinná předpona (MB/GB)', + 'binary_prefix' => 'Binární předpona (MiB/GiB)', + '2fa_requirement' => '2FA požadavek', + 'not_required' => 'Nevyžadováno', + 'admins_only' => 'Vyžadováno pouze pro administrátory', + 'all_users' => 'Vyžadováno pro všechny uživatele', + 'trusted_proxies' => 'Důvěryhodné proxies', + 'trusted_proxies_help' => 'Rozsah nové IP nebo IP adresy', + 'clear' => 'Vymazat', + 'set_to_cf' => 'Nastavit na Cloudflare IP', + 'display_width' => 'Šířka displeje', + 'avatar_provider' => 'Poskytovatel Avataru', + 'uploadable_avatars' => 'Povolit uživatelům nahrát vlastní avatar?', + ], + 'captcha' => [ + 'enable' => 'Povolit', + 'disable' => 'Zakázat', + 'info_label' => 'Informace', + 'info' => 'Tlačítka můžete vygenerovat na Cloudflare Dashboard. Je vyžadován účet Cloudflare.', + 'site_key' => 'Klíč webu', + 'secret_key' => 'Tajný klíč:', + 'verify' => 'Ověřit Doménu?', + ], + 'mail' => [ + 'mail_driver' => 'Ovladač pro e-mail', + 'test_mail' => 'Odeslat zkušební poštu', + 'test_mail_sent' => 'Zkušební pošta odeslána', + 'test_mail_failed' => 'Testovací Mail se nezdařil', + 'from_settings' => 'Od nastavení', + 'from_settings_help' => 'Nastavte adresu a jméno použité jako "Od" v e-mailu.', + 'from_address' => 'Odesilatel', + 'from_name' => 'Od (jméno)', + 'smtp' => [ + 'smtp_title' => 'Nastavení SMTP', + 'host' => 'Hostitel', + 'port' => 'Port', + 'username' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'scheme' => 'Schéma', + ], + 'mailgun' => [ + 'mailgun_title' => 'Konfigurace schránky', + 'domain' => 'Doména', + 'secret' => 'Tajný klíč (Secret)', + 'endpoint' => 'Endpoint', + ], + ], + 'backup' => [ + 'backup_driver' => 'Ovladač zálohy', + 'throttle' => 'Štětce', + 'throttle_help' => 'Nakonfigurujte, kolik záloh lze vytvořit v periodě. Nastavte období 0 pro vypnutí tohoto tahu.', + 'limit' => 'Limit', + 'period' => 'Období', + 'seconds' => 'Sekundy', + 's3' => [ + 's3_title' => 'S3 Konfigurace', + 'default_region' => 'Výchozí region', + 'access_key' => 'Přístupový ID klíč', + 'secret_key' => 'Tajný Přístupový klíč', + 'bucket' => 'Kbelík', + 'endpoint' => 'Endpoint', + 'use_path_style_endpoint' => 'Použít koncový styl trasy', + ], + ], + 'oauth' => [ + 'enable' => 'Aktivovat', + 'enable_schema' => 'Zapnout :schema', + 'disable' => 'Deaktivovat', + 'client_id' => 'ID klienta', + 'client_secret' => 'Tajný klíč klienta', + 'redirect' => 'Přesměrovat na URL', + 'web_api_key' => 'Klíč webového API', + 'base_url' => 'Základní adresa URL', + 'display_name' => 'Zobrazovaný název', + 'auth_url' => 'Autorizační URL zpětného volání', + 'create_missing_users' => 'Automaticky vytvořit chybějící uživatele?', + 'link_missing_users' => 'Automaticky propojit chybějící uživatele?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Automatické vytváření alokace', + 'helper' => 'Zvolte, zda mohou uživatelé vytvářet alokace přes klientskou oblast.', + 'question' => 'Povolit uživatelům vytvářet alokace?', + 'create_new' => 'Vytvořit nové alokace, pokud nejsou k dispozici?', + 'create_new_help' => 'Pokud je tato možnost povolena, vytvoří se nové přidělení. Pokud je zakázána, přiděluje se pouze z existujících nepřidělených přidělení. Obě možnosti zohledňují níže uvedený rozsah portů.', + 'start' => 'Spustit port', + 'end' => 'Koncový port', + ], + 'mail_notifications' => [ + 'title' => 'Upozorňování na e-mail', + 'helper' => 'Určuje, která e-mailová oznámení by měla být odeslána uživatelům.', + 'server_installed' => 'Server nainstalován', + 'server_reinstalled' => 'Server přeinstalován', + ], + 'connections' => [ + 'title' => 'Spojení', + 'helper' => 'Časový limit použitý při vytváření požadavků.', + 'request_timeout' => 'Čas vypršel', + 'connection_timeout' => 'Vypršel čas pro připojení', + 'seconds' => 'Sekundy', + ], + 'activity_log' => [ + 'title' => 'Historie akcí', + 'helper' => 'Nakonfigurujte, jak často by měly být staré záznamy o aktivitách vykresleny a zda by měly být logovány administrativní činnosti.', + 'prune_age' => 'Vyčistit věk', + 'days' => 'Dny', + 'log_admin' => 'Skrýt administrátorské aktivity?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Určuje limit sazby pro počet žádostí za minutu, které lze provést.', + 'client_rate' => 'Limit API rychlosti klienta', + 'app_rate' => 'Limit API frekvence aplikace', + 'rpm' => 'Požadavky za minutu', + ], + 'server' => [ + 'title' => 'Servery', + 'helper' => 'Nastavení pro servery', + 'edit_server_desc' => 'Povolit uživatelům upravovat popisy?', + 'console_font_upload' => 'Nahrát písmo konzole', + 'console_font_hint' => 'Jsou podporována pouze písma *.ttf. důrazně doporučujeme fonty!', + ], + 'webhook' => [ + 'title' => 'Webové háčky', + 'helper' => 'Nakonfigurujte, jak často by měly být staré protokoly webových háčků oříznuty.', + 'prune_age' => 'Vyčistit stáří', + 'days' => 'Dny', + ], + ], +]; diff --git a/lang/cs/admin/user.php b/lang/cs/admin/user.php index 9d3e44321a..c1b9cff25c 100644 --- a/lang/cs/admin/user.php +++ b/lang/cs/admin/user.php @@ -1,12 +1,24 @@ [ - 'user_has_servers' => 'Nelze odstranit uživatele s aktivními servery připojenými k jeho účtu. Před pokračováním prosím odstraňte jeho servery.', - 'user_is_self' => 'Nemůžete smazat svůj vlastní uživatelský účet!', - ], - 'notices' => [ - 'account_created' => 'Účet byl úspěšně vytvořen', - 'account_updated' => 'Účet byl úspěšně aktualizován.', - ], + 'nav_title' => 'Uživatelé', + 'model_label' => 'Uživatel', + 'model_label_plural' => 'Uživatelé', + 'self_delete' => 'Nelze odstranit sám sebe', + 'has_servers' => 'Uživatel má servery', + 'email' => 'E-mail', + 'username' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'external_id' => 'Externí ID', + 'is_managed_externally' => 'Je řízen externě', + 'is_managed_externally_helper' => 'Pokud jsou vaši uživatelé spravováni externím softwarem (např. fakturační software), který můžete povolit, aby uživatelé nemohli měnit své uživatelské jméno, e-mail a heslo v rámci panelu.', + 'password_help' => 'Poskytnutí uživatelského hesla je volitelné. Nový uživatelský e-mail vyzve uživatele, aby si při prvním přihlášení vytvořili heslo.', + 'admin_roles' => 'Administrátorské role', + 'roles' => 'Role', + 'no_roles' => 'Žádné role', + 'servers' => 'Servery', + 'subusers' => 'Poduživatelé', + 'password_reset' => 'Resetovat heslo', + 'password_reset_sent' => 'Email pro obnovení hesla byl odeslán', + 'password_reset_failed' => 'Odeslání e-mailu pro obnovení hesla se nezdařilo', ]; diff --git a/lang/cs/admin/webhook.php b/lang/cs/admin/webhook.php new file mode 100644 index 0000000000..57772a0c80 --- /dev/null +++ b/lang/cs/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webové háčky', + 'model_label' => 'Webový háček', + 'model_label_plural' => 'Webové háčky', + 'endpoint' => 'Koncový bod', + 'description' => 'Popis:', + 'no_webhooks' => 'Žádné webové háčky', + 'help' => 'Nápověda', + 'help_text' => 'Musíte zalomit název proměnné mezi {{ }} například pokud chcete získat jméno z api, můžete použít {{name}}.', + 'test_now' => 'Otestovat nyní', + 'test_now_help' => 'Tímto vyvoláte událost `vytvořený: Server`', + 'table' => [ + 'description' => 'Popis', + 'endpoint' => 'Koncový bod', + ], + 'headers' => 'Hlavičky', + 'events' => 'Akce', + 'regular' => 'Běžný', + 'reset_headers' => 'Obnovit hlavičky', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Zpráva', + 'username' => 'Uživatelské jméno', + 'avatar_url' => 'URL avataru', + 'forum_thread' => 'Název vlákna', + 'supress_embeds' => 'Potlačit vložené', + 'supress_embeds_text' => 'Při serializaci této zprávy nezahrnout žádné vložené', + 'supress_notifications' => 'Potlačit upozornění', + 'supress_notifications_text' => 'Tato zpráva nebude spouštět push a desktopová oznámení', + ], + 'discord_embed' => [ + 'add_embed' => 'Přidat vložené', + 'flags' => 'Značky', + 'thumbnail' => 'URL náhledu', + 'embeds' => 'Embedy', + 'thread_name' => 'Název vlákna', + 'allowed_mentions' => 'Povolené zmínky', + 'roles' => 'Role', + 'users' => 'Uživatelé', + 'everyone' => '@everyone & @here', + 'author' => 'Autor', + 'author_url' => 'URL autora', + 'author_icon_url' => 'URL ikony autora', + 'body' => 'Tělo', + 'title' => 'Název', + 'color' => 'Barva Embedu', + 'url' => 'URL', + 'images' => 'Obrázky', + 'image_url' => 'URL obrázku', + 'image_thumbnail' => 'URL náhledu', + 'footer' => 'Zápatí', + 'has_timestamp' => 'Má časové razítko', + 'footer_icon_url' => 'URL ikony zápatí', + 'add_field' => 'Přidat pole', + 'fields' => 'Pole', + 'field_name' => 'Název pole', + 'field_value' => 'Hodnota pole', + 'inline_field' => 'Vložené pole', + ], +]; diff --git a/lang/cs/auth.php b/lang/cs/auth.php index e4ff1701ad..3818ef960a 100644 --- a/lang/cs/auth.php +++ b/lang/cs/auth.php @@ -1,27 +1,24 @@ 'Přihlásit se', - 'go_to_login' => 'Přejít na přihlášení', - 'failed' => 'Nebyl nalezen žádný účet odpovídající těmto přihlašovacím údajům.', - 'forgot_password' => [ - 'label' => 'Zapomněli jste heslo?', - 'label_help' => 'Zadejte e-mailovou adresu vašeho účtu pro příjem pokynů k obnovení hesla.', - 'button' => 'Obnovit účet', - ], - - 'reset_password' => [ - 'button' => 'Obnovit a přihlásit se', - ], - - 'two_factor' => [ - 'label' => 'Dvoufázový token', - 'label_help' => 'Tento účet vyžaduje druhou vrstvu ověřování, abyste mohli pokračovat. Pro dokončení přihlášení zadejte kód generovaný zařízením.', - 'checkpoint_failed' => 'Dvoufaktorový ověřovací token je neplatný.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'Tyto přihlašovací údaje neodpovídají uloženým záznamům.', + 'failed-two-factor' => 'Nesprávný 2FA kód', + 'two-factor-code' => 'Dvojfaktorový kód', + 'two-factor-hint' => 'Můžete použít záložní kódy, pokud jste ztratili přístup k vašemu zařízení.', + 'password' => 'Zadané heslo není správné.', 'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.', - 'password_requirements' => 'Heslo musí mít délku nejméně 8 znaků a mělo by být pro tento web jedinečné.', - '2fa_must_be_enabled' => 'Správce požaduje, aby bylo dvoufázové ověření povoleno pro váš účet, aby jste mohl použit panel.', + '2fa_must_be_enabled' => 'Správce požadoval, aby 2-Factor ověření bylo povoleno pro váš účet, aby bylo možné použít panel.', + ]; diff --git a/lang/cs/command/messages.php b/lang/cs/command/messages.php index d26699ff73..6eab4ece3a 100644 --- a/lang/cs/command/messages.php +++ b/lang/cs/command/messages.php @@ -11,19 +11,14 @@ 'ask_admin' => 'Je tento uživatel správcem?', 'ask_email' => 'Emailová adresa', 'ask_username' => 'Uživatelské jméno', - 'ask_name_first' => 'Jméno', - 'ask_name_last' => 'Příjmení', 'ask_password' => 'Heslo', 'ask_password_tip' => 'Pokud chcete vytvořit účet s náhodným heslem zaslaným uživateli, spusťte znovu tento příkaz (CTRL+C) a přejděte do proměnné `--no-password`.', 'ask_password_help' => 'Heslo musí mít délku nejméně 8 znaků a obsahovat alespoň jedno velké písmeno a číslo.', - '2fa_help_text' => [ - 'Tento příkaz zakáže dvoufázové ověření pro uživatelský účet, pokud je povoleno. Toto by mělo být použito jako příkaz k obnovení účtu pouze v případě, že je uživatel uzamčen mimo jeho účet.', - 'Pokud toto nechcete udělat, stiskněte CTRL + C pro ukončení tohoto procesu.', - ], + '2fa_help_text' => 'Tento příkaz deaktivuje 2-fázové ověřování pro účet uživatele, pokud je povoleno. Tento příkaz by měl být použit pouze jako příkaz pro obnovení účtu, pokud je uživatel zablokován ve svém účtu. Pokud to není to, co jste chtěli udělat, stiskněte CTRL+C pro ukončení tohoto procesu.', '2fa_disabled' => 'Dvoufázové ověření bylo vypnuto pro :email.', ], 'schedule' => [ - 'output_line' => 'Odesílání první úlohy v `:schedule` (:hash).', + 'output_line' => 'Odesílání první úlohy v `:schedule` (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'Odstraňování záložního souboru služby :file.', @@ -45,15 +40,15 @@ 'ask_smtp_port' => 'SMTP port', 'ask_smtp_username' => 'SMTP Uživatelské jméno', 'ask_smtp_password' => 'SMTP heslo', - 'ask_mailgun_domain' => 'Mailgun doména', + 'ask_mailgun_domain' => 'Mailgun doména (doména)', 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', + 'ask_mailgun_secret' => 'Mailgun tajný klíč', + 'ask_mandrill_secret' => 'Mandrill Tajný klíč', 'ask_postmark_username' => 'Postmark API klíč', 'ask_driver' => 'Který ovladač by měl být použit pro odesílání e-mailů?', 'ask_mail_from' => 'E-mailové adresy by měly pocházet z', 'ask_mail_name' => 'Název, ze kterého by se měly zobrazit e-maily', - 'ask_encryption' => 'Šifrovací metoda', + 'ask_encryption' => 'Používat šifrovací metodu', ], ], ]; diff --git a/lang/cs/commands.php b/lang/cs/commands.php new file mode 100644 index 0000000000..5fba06c022 --- /dev/null +++ b/lang/cs/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Zadejte e-mailovou adresu, ze které by měly být vajíčka exportovaná tímto panelem. Toto by mělo být platná e-mailová adresa.', + 'url' => 'URL aplikace MUSÍ začít s https:// nebo http:// v závislosti na tom, zda používáte SSL nebo ne. Pokud nezahrnete do schématu vaše e-maily a jiný obsah bude odkazovat na nesprávné umístění.', + 'timezone' => 'Časové pásmo by mělo odpovídat jednomu z podporovaných časových pásem PHP. Pokud si nejste jisti, prosím na https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Vybrali jste ovladač Redis pro jednu nebo více možností, poskytněte prosím platné informace o připojení níže. Ve většině případů můžete použít výchozí hodnoty, pokud jste nezměnili nastavení.', + 'comment' => 'Ve výchozím nastavení má instance Redis serveru výchozí uživatelské jméno a žádné heslo, protože běží lokálně a je nepřístupné vnějšímu světu. Pokud tomu tak je, stiskněte klávesu Enter bez zadání hodnoty.', + 'confirm' => 'Zdá se, že :field je již definovaný pro Redis, chcete ho změnit?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Je důrazně doporučeno nepoužívat "localhost" jako hostitele databáze, protože jsme viděli časté problémy s připojením socketu. Pokud chcete použít místní připojení, měli byste použít "127.0.0.1".', + 'DB_USERNAME_note' => 'Použití kořenového účtu pro MySQL spojení není pouze velmi rozblednuté, ale tato aplikace také nepovoluje. Pro tento software budete muset vytvořit MySQL uživatele.', + 'DB_PASSWORD_note' => 'Zdá se, že heslo pro připojení k MySQL je již definováno, chcete jej změnit?', + 'DB_error_2' => 'Vaše přihlašovací údaje k připojení NEJSOU uloženy. Před pokračováním budete muset poskytnout platné informace o připojení.', + 'go_back' => 'Vraťte se zpět a zkuste to znovu', + ], + 'make_node' => [ + 'name' => 'Zadejte krátký identifikátor používaný k rozlišení tohoto uzlu od ostatních', + 'description' => 'Zadejte popis pro identifikaci uzlu', + 'scheme' => 'Prosím, zadejte https for SSL nebo http pro jiné než ssl připojení', + 'fqdn' => 'Zadejte název domény (např. node.example.com) pro připojení k Démonu. IP adresa může být použita pouze v případě, že pro tento uzel nepoužíváte SSL', + 'public' => 'Měl by být tento uzel veřejný? Pro poznámku, nastavením uzlu soukromému vám bude odepřena možnost automatické nasazení do tohoto uzlu.', + 'behind_proxy' => 'Je tvá FQDN za proxy?', + 'maintenance_mode' => 'Měl by být režim údržby aktivován?', + 'memory' => 'Zadejte maximální množství paměti', + 'memory_overallocate' => 'Zadejte množství paměti k překročení alokace, -1 vypne kontrolu a 0 zabrání vytvoření nových serverů', + 'disk' => 'Zadejte maximální množství diskového místa', + 'disk_overallocate' => 'Zadejte množství disku na překrytí přiděleného množství, -1 zakáže kontrolu a 0 zabrání vytváření nového serveru', + 'cpu' => 'Zadejte maximální množství pro Cpu', + 'cpu_overallocate' => 'Zadejte množství Cpu k překročení přiděleného množství, -1 vypne kontrolu a 0 zabrání vytvoření nového serveru', + 'upload_size' => 'Zadejte maximální velikost nahrávání', + 'daemonListen' => 'Vložte port poslechu daemon', + 'daemonConnect' => 'Zadejte port pro připojení démona (může být stejný jako port pro naslouchání)', + 'daemonSFTP' => 'Zadejte port pro poslech SFTP', + 'daemonSFTPAlias' => 'Zadejte alias Démon SFTP (může být prázdný)', + 'daemonBase' => 'Zadej základní složku', + 'success' => 'Nový uzel s názvem :name byl úspěšně vytvořen a obsahuje Id :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Vybraný uzel neexistuje.', + 'error_invalid_format' => 'Byl zadán neplatný formát. Platné možnosti jsou yaml a json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Zdá se, že již jste nakonfigurovali šifrovací klíč aplikace. Pokračujte v tomto procesu přepsáním klíče a způsobte poškození dat u všech existujících šifrovaných dat. NEPOTVRZUJTE NEPOVINNÉ, KE KTERÉ JSOU JSOU DOTČENÉ.', + 'understand' => 'Chápu důsledky provedení tohoto příkazu a přebírám veškerou odpovědnost za ztrátu šifrovaných dat.', + 'continue' => 'Opravdu chcete pokračovat? Změna šifrovacího klíče aplikace ZPŮSOBÍ ZTRÁTU DAT.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Neexistují žádné naplánované úkoly pro servery, které je třeba spustit.', + 'error_message' => 'Došlo k chybě při zpracování plánu: ', + ], + ], +]; diff --git a/lang/cs/dashboard/account.php b/lang/cs/dashboard/account.php deleted file mode 100644 index 3670f473a6..0000000000 --- a/lang/cs/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Aktualizovat e-mail', - 'updated' => 'E-mailová adresa byla úspěšně změněna.', - ], - 'password' => [ - 'title' => 'Změnit heslo', - 'requirements' => 'Vaše heslo by mělo mít délku alespoň 8 znaků.', - 'updated' => 'Vaše heslo bylo změněno.', - ], - 'two_factor' => [ - 'button' => 'Nastavení dvoufázového ověření', - 'disabled' => 'Dvoufázové ověřování bylo na vašem účtu zakázáno. Po přihlášení již nebudete vyzváni k poskytnutí tokenu.', - 'enabled' => 'Dvoufázové ověřování bylo na vašem účtu povoleno! Od nynějška při přihlášení budete muset zadat kód vygenerovaný vaším zařízením.', - 'invalid' => 'Zadaný token není platný.', - 'setup' => [ - 'title' => 'Nastavit dvoufázové ověřování', - 'help' => 'Nelze naskenovat kód? Zadejte kód níže do vaší aplikace:', - 'field' => 'Zadejte token', - ], - 'disable' => [ - 'title' => 'Zakázat dvoufázové ověření', - 'field' => 'Zadejte token', - ], - ], -]; diff --git a/lang/cs/dashboard/index.php b/lang/cs/dashboard/index.php deleted file mode 100644 index fbbb5ac31b..0000000000 --- a/lang/cs/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Vyhledat servery...', - 'no_matches' => 'Nebyly nalezeny žádné servery, které odpovídají zadaným kritériím.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Paměť', -]; diff --git a/lang/cs/exceptions.php b/lang/cs/exceptions.php index 337f026138..729c16143e 100644 --- a/lang/cs/exceptions.php +++ b/lang/cs/exceptions.php @@ -1,55 +1,64 @@ 'Byla zaznamenána nečekaná vyjímka při pokusu komunikovat s daemonem vyusaťující v chybu HTTP/:code. Tahle vyjímka byla logována.', + 'daemon_connection_failed' => 'Při pokusu o komunikaci s daemonem došlo k výjimce, což vedlo k HTTP/:code kódu odpovědi. Tato výjimka byla zaznamenána.', 'node' => [ - 'servers_attached' => 'Uzel nesmí mít žádné s ním spojené servery, aby mohl být smazán', - 'daemon_off_config_updated' => 'Konfigurace daemonu byla aktualizována, ale byla zde chyba při automatické aktualizaci souborů konfigurace Daemonu. Je třeba soubory konfigurace Daemonu aktualizovat manuálně (config.yml), aby změny damemonu byly aplikovány.', + 'servers_attached' => 'Uzel nesmí mít žádné servery spojené s ním, aby mohl být odstraněn.', + 'error_connecting' => 'Chyba při připojování k :node', + 'daemon_off_config_updated' => 'Konfigurace daemonu byla aktualizována, ale byla zde chyba při automatické aktualizaci souborů konfigurace Daemonu. Je třeba soubory konfigurace Daemonu aktualizovat manuálně (config.yml), aby změny daemonu byly aplikovány.', ], 'allocations' => [ - 'server_using' => 'Server již využívá tuhle alokaci. Pro odstranění alokace, nesmí být žádný server spojen s alokací.', + 'server_using' => 'Server je v současné době přiřazen k této alokaci. Přidělení může být odstraněno pouze v případě, že žádný server není aktuálně přiřazen.', 'too_many_ports' => 'Přidání více než 1000 portů v jednom rozsahu najednou není podporováno.', - 'invalid_mapping' => 'Mapování poskytnuto pro :port bylo nesprávné a nebylo možné ho zpracovat.', - 'cidr_out_of_range' => 'CIDR zápis je možný jen pro masky /25 až /32 subnetu.', + 'invalid_mapping' => 'Mapování poskytováno pro :port bylo neplatné a nelze jej zpracovat.', + 'cidr_out_of_range' => 'Poznámka CIDR umožňuje pouze masky mezi /25 a /32.', 'port_out_of_range' => 'Porty v alokacích musí být vyšší než 1024 a nížší nebo se rovnat 65535.', ], 'egg' => [ - 'delete_has_servers' => 'Vejce s aktivními servery není možné smazat z panelu.', - 'invalid_copy_id' => 'Zvolený vejce na kopii skriptu buď neexistuje nebo neobsahuje samotný skript.', + 'delete_has_servers' => 'Vejce s aktivními servery, které jsou k němu připojeny, nemůže být odstraněna z panelu.', + 'invalid_copy_id' => 'Vejce vybraná pro kopírování skriptu buď neexistuje, nebo kopíruje samotný skript.', 'has_children' => 'Toto vejce je nadřazeno jednomu či více vajec. Prosím vymažte tyto vejce předtím než smažete toto.', ], 'variables' => [ - 'env_not_unique' => 'Proměnná prostředí :name musí mít unikátní pro toto vejce.', - 'reserved_name' => 'Proměnná prostředí :name je chráněna a nemůže být přidělena k této proměnné', - 'bad_validation_rule' => 'Pravidlo pro ověření „:rule“ není platné pravidlo pro tuto aplikaci.', + 'env_not_unique' => 'Proměnná prostředí :name musí být pro toto vejce jedinečná.', + 'reserved_name' => 'Proměnná prostředí :name je chráněná a nemůže být přiřazena k proměnné.', + 'bad_validation_rule' => 'Pravidlo ověření „:rule“ není platným pravidlem pro tuto aplikaci.', ], 'importer' => [ 'json_error' => 'Při pokusu o analyzování souboru JSON došlo k chybě: :error.', - 'file_error' => 'Poskytnutý JSON soubor není platný.', - 'invalid_json_provided' => 'Formát poskytnutého JSON souboru nebylo možné rozeznat', + 'file_error' => 'Poskytnutý soubor JSON není platný.', + 'invalid_json_provided' => 'Poskytnutý soubor JSON není ve formátu, který lze rozpoznat.', ], 'subusers' => [ - 'editing_self' => 'Úprava tvého vlastního podúčtu není dovolena.', + 'editing_self' => 'Úprava vlastního poduživatele není povolena.', 'user_is_owner' => 'Nemůžete přidat vlastníka serveru jako poduživatele pro tento server.', - 'subuser_exists' => 'Uživatel s touto emailovou adresou je již poduživatel na tomto serveru.', + 'subuser_exists' => 'Uživatel s touto e-mailovou adresou je již přiřazen jako subuživatel pro tento server.', ], 'databases' => [ - 'delete_has_databases' => 'Nelze odstranit hostitelský server databáze, který má s ním spojené aktivní databáze.', + 'delete_has_databases' => 'Nelze odstranit databázový hostitelský server, který obsahuje aktivní databáze, které jsou k němu připojeny.', ], 'tasks' => [ - 'chain_interval_too_long' => 'Maximální čas intervalu pro tuto řetězovou úlohu je 15 minut.', + 'chain_interval_too_long' => 'Maximální interval pro zadaný úkol je 15 minut.', ], 'locations' => [ - 'has_nodes' => 'Nelze smazat lokaci, která má s ní spojené aktivní uzly.', + 'has_nodes' => 'Nelze odstranit umístění, které má k němu připojené aktivní uzly.', ], 'users' => [ - 'node_revocation_failed' => 'Odstranění klíču pro uzel Uzel #:node nevyšlo: :error.', + 'is_self' => 'Nelze odstranit vlastní uživatelský účet.', + 'has_servers' => 'Nelze odstranit uživatele s aktivním serverem připojeným k jeho účtu. Před pokračováním prosím odstraňte jeho servery.', + 'node_revocation_failed' => 'Nepodařilo se zrušit klíče na uzel #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'Žadné uzly nesplňují specifikované požadavky pro automatické aplikování.', - 'no_viable_allocations' => 'Žádné alokace nesplňující požadavky pro automatickou aplikaci nebyly nalezeny.', + 'no_viable_nodes' => 'Nebyly nalezeny žádné uzly splňující požadavky stanovené pro automatické spuštění.', + 'no_viable_allocations' => 'Nebyly nalezeny žádné příděly splňující požadavky pro automatické nasazení.', ], 'api' => [ - 'resource_not_found' => 'Požadovaný dokument neexistuje na tomto serveru.', + 'resource_not_found' => 'Požadovaný zdroj na tomto serveru neexistuje.', + ], + 'mount' => [ + 'servers_attached' => 'Připojení nesmí mít připojené žádné servery, aby mohlo být odstraněno.', + ], + 'server' => [ + 'marked_as_failed' => 'Tento server ještě nedokončil instalační proces, zkuste to prosím později.', ], ]; diff --git a/lang/cs/installer.php b/lang/cs/installer.php new file mode 100644 index 0000000000..4bf17e9f68 --- /dev/null +++ b/lang/cs/installer.php @@ -0,0 +1,114 @@ + 'Instalátor panelu', + 'requirements' => [ + 'title' => 'Požadavky na server', + 'sections' => [ + 'version' => [ + 'title' => 'PHP verze', + 'or_newer' => ':version nebo novější', + 'content' => 'Vaše PHP verze je :version.', + ], + 'extensions' => [ + 'title' => 'PHP rozšíření', + 'good' => 'Všechny potřebné PHP rozšíření jsou nainstalována.', + 'bad' => 'Následující PHP rozšíření chybí: :extensions', + ], + 'permissions' => [ + 'title' => 'Oprávnění složky', + 'good' => 'Všechny složky mají správné oprávnění.', + 'bad' => 'Následující složky mají špatné oprávnění: :folders', + ], + ], + 'exception' => 'Některé požadavky chybí', + ], + 'environment' => [ + 'title' => 'Prostředí', + 'fields' => [ + 'app_name' => 'Název aplikace', + 'app_name_help' => 'Toto bude název vašeho panelu.', + 'app_url' => 'Odkaz aplikace', + 'app_url_help' => 'Toto bude adresa URL, ze které budete přistupovat k vašemu panelu.', + 'account' => [ + 'section' => 'Admin uživatel', + 'email' => 'E-mail', + 'username' => 'Přezdívka', + 'password' => 'Heslo', + ], + ], + ], + 'database' => [ + 'title' => 'Databáze', + 'driver' => 'Ovladač databáze', + 'driver_help' => 'Ovladač používaný pro panelovou databázi. Doporučujeme „SQLite“.', + 'fields' => [ + 'host' => 'Hostitel databáze', + 'host_help' => 'Hostitel vaší databáze. Ověřte, že se na něj lze dostat.', + 'port' => 'Port databáze', + 'port_help' => 'Port vaší databáze.', + 'path' => 'Cesta k databázi', + 'path_help' => 'Cesta vašeho .sqlite souboru vzhledem ke složce databáze.', + 'name' => 'Název databáze', + 'name_help' => 'Název databáze panelu.', + 'username' => 'Uživatelské jméno k databázi', + 'username_help' => 'Jméno uživatele vaší databáze.', + 'password' => 'Heslo databáze', + 'password_help' => 'Heslo uživatele databáze. Může být prázdné.', + ], + 'exceptions' => [ + 'connection' => 'Spojení s databází se nezdařilo', + 'migration' => 'Přesun dat se nezdařil', + ], + ], + 'egg' => [ + 'title' => 'Vejce', + 'no_eggs' => 'Žádná vejce nejsou k dispozici', + 'background_install_started' => 'Instalace vejce byla spuštěna', + 'background_install_description' => 'Instalace :count vajec byla zařazena do fronty a bude pokračovat na pozadí.', + 'exceptions' => [ + 'failed_to_update' => 'Nepodařilo se aktualizovat index vejce', + 'no_eggs' => 'V tuto chvíli nejsou k dispozici žádná vejce.', + 'installation_failed' => 'Nepodařilo se nainstalovat vybraná vejce. Importujte je prosím po instalaci přes seznam vajec.', + ], + ], + 'session' => [ + 'title' => 'Relace', + 'driver' => 'Ovladač relace', + 'driver_help' => 'Ovladač používaný pro ukládání relací. Doporučujeme "Souborový systém" nebo "Databáze".', + ], + 'cache' => [ + 'title' => 'Mezipaměť', + 'driver' => 'Ovladač mezipaměti', + 'driver_help' => 'Ovladač používaný pro ukládání do mezipaměti. Doporučujeme "Souborový systém".', + 'fields' => [ + 'host' => 'Redis hostitel', + 'host_help' => 'Hostitel vašeho redis serveru. Ověřte, že se na něj lze dostat.', + 'port' => 'Redis port', + 'port_help' => 'Port vašeho redis serveru.', + 'username' => 'Redis uživatelské jméno', + 'username_help' => 'Jméno redis uživatele. Může být prázdné', + 'password' => 'Redis heslo', + 'password_help' => 'Heslo redis uživatele. Může být prázdné.', + ], + 'exception' => 'Spojení s redis se nezdařilo', + ], + 'queue' => [ + 'title' => 'Fronta', + 'driver' => 'Řadič fronty', + 'driver_help' => 'Řadič používaný pro udržení fronty. Doporučujeme "Databáze".', + 'fields' => [ + 'done' => 'Udělal jsem oba kroky níže.', + 'done_validation' => 'Před pokračováním musíte udělat oba kroky!', + 'crontab' => 'Spusťte následující příkaz pro nastavení crontab. Všimněte si, že www-data je váš uživatel webového serveru. Na některých systémech se toto uživatelské jméno může lišit!', + 'service' => 'Pro nastavení služby workeru ve frontě stačí spustit následující příkaz.', + ], + ], + 'exceptions' => [ + 'write_env' => 'Nelze zapsat do souboru .env', + 'migration' => 'Migrace nelze spustit', + 'create_user' => 'Nelze vytvořit admin uživatele', + ], + 'next_step' => 'Další krok', + 'finish' => 'Dokončit', +]; diff --git a/lang/cs/notifications.php b/lang/cs/notifications.php new file mode 100644 index 0000000000..f85e632b02 --- /dev/null +++ b/lang/cs/notifications.php @@ -0,0 +1,18 @@ + 'Otevřít server', + 'installation_completed' => 'Instalace serveru dokončena', + 'installation_failed' => 'Instalace serveru selhala', + 'reinstallation_completed' => 'Reinstalace serveru dokončena', + 'reinstallation_failed' => 'Reinstalace serveru selhala', + 'failed' => 'Selhalo', + 'user_added' => [ + 'title' => 'Přidáno na server', + 'body' => 'Byli jste přidáni jako poduživatel do :server.', + ], + 'user_removed' => [ + 'title' => 'Odebráno ze serveru', + 'body' => 'Byli jste odebráni jako poduživatel do :server.', + ], +]; diff --git a/lang/cs/pagination.php b/lang/cs/pagination.php deleted file mode 100644 index 984384fac6..0000000000 --- a/lang/cs/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Předchozí', - 'next' => 'Další »', -]; diff --git a/lang/cs/passwords.php b/lang/cs/passwords.php deleted file mode 100644 index 7a53257ba2..0000000000 --- a/lang/cs/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Heslo musí obsahovat alespoň 6 znaků a musí se shodovat s ověřením.', - 'reset' => 'Vaše heslo bylo obnoveno!', - 'sent' => 'Na váš e-mal byl odeslán link pro obnovu hesla!', - 'token' => 'Tento klíč pro obnovu hesla je neplatný.', - 'user' => 'Nelze najít uživatele s touto e-mailovou adresou.', -]; diff --git a/lang/cs/profile.php b/lang/cs/profile.php new file mode 100644 index 0000000000..aba19a73af --- /dev/null +++ b/lang/cs/profile.php @@ -0,0 +1,70 @@ + 'Profil', + 'tabs' => [ + 'account' => 'Účet', + 'oauth' => 'OAuth', + 'activity' => 'Aktivita', + 'api_keys' => 'API klíče', + 'ssh_keys' => 'SSH klíče', + 'keys' => 'Klíče', + '2fa' => '2FA', + 'customization' => 'Přizpůsobení', + ], + 'username' => 'Uživatelské jméno', + 'admin' => 'Administrátor', + 'exit_admin' => 'Ukončit administrátora', + 'server_list' => 'Seznam serverů', + 'email' => 'E-mail', + 'password' => 'Heslo', + 'current_password' => 'Aktuální heslo', + 'password_confirmation' => 'Potvrzení hesla', + 'timezone' => 'Časové pásmo', + 'language' => 'Jazyk', + 'language_help' => 'Váš jazyk :state nebyl dosud přeložen!', + 'link' => 'Odkaz ', + 'unlink' => 'Odpojit ', + 'unlinked' => ':name odpojeno', + 'scan_qr' => 'Naskenovat QR kód', + 'code' => 'Kód', + 'setup_key' => 'Nastavit Klíč!', + 'invalid_code' => 'Neplatný kód 2FA', + 'code_help' => 'Naskenujte výše uvedený QR kód pomocí dvoufázové ověřovací aplikace, poté zadejte generovaný kód.', + '2fa_enabled' => 'Dvoufázové ověření je momentálně povoleno!', + 'backup_help' => 'Ty nebudou znovu zobrazeny!', + 'backup_codes' => 'Záložní kódy', + 'disable_2fa' => 'Zakázat 2FA', + 'disable_2fa_help' => 'Zadejte svůj aktuální 2FA kód pro vypnutí dvoufázového ověřování', + 'api_keys' => 'API klíče', + 'create_api_key' => 'Vytvořit klíč API', + 'api_key_created' => 'API klíč vytvořen', + 'description' => 'Popis', + 'allowed_ips' => 'Povolené IP', + 'allowed_ips_help' => 'Stiskněte Enter pro přidání nové IP adresy nebo ponechte prázdné pro povolení jakékoli IP adresy', + 'ssh_keys' => 'SSH klíče', + 'create_ssh_key' => 'Vytvořit SSH klíč', + 'ssh_key_created' => 'SSH klíč vytvořen', + 'name' => 'Název', + 'public_key' => 'Veřejný klíč', + 'could_not_create_ssh_key' => 'Nelze vytvořit ssh klíč', + 'dashboard' => 'Přehled', + 'dashboard_layout' => 'Rozložení přehledu', + 'console' => 'Konzole', + 'grid' => 'Mřížka', + 'table' => 'Tabulka', + 'rows' => 'Řádky', + 'font_size' => 'Velikost písma', + 'font' => 'Písmo', + 'font_preview' => 'Náhled fontu', + 'seconds' => 'Sekundy', + 'graph_period' => 'Perioda grafu', + 'graph_period_helper' => 'Množství datových bodů, sekund, zobrazené na grafech konzoly.', + 'navigation' => 'Typ navigace', + 'sidebar' => 'Postranní panel', + 'topbar' => 'Horní lišta', + 'mixed' => 'Smíšený', + 'no_oauth' => 'Žádné účty nejsou propojeny', + 'no_api_keys' => 'Žádné API klíče.', + 'no_ssh_keys' => 'Žádné SSH klíče', +]; diff --git a/lang/cs/search.php b/lang/cs/search.php new file mode 100644 index 0000000000..18de6d380c --- /dev/null +++ b/lang/cs/search.php @@ -0,0 +1,9 @@ + 'Pro zahájení hledání zadejte alespoň tři znaky.', + 'term' => [ + 'label' => 'Hledaný výraz', + 'description' => 'Zadejte název serveru, uuid, nebo alokaci pro zahájení vyhledávání.', + ], +]; diff --git a/lang/cs/server/activity.php b/lang/cs/server/activity.php new file mode 100644 index 0000000000..b01071216e --- /dev/null +++ b/lang/cs/server/activity.php @@ -0,0 +1,11 @@ + 'Aktivita', + 'event' => 'Událost', + 'user' => 'Uživatel', + 'deleted_user' => 'Smazaný uživatel', + 'system' => 'Systém', + 'timestamp' => 'Čas', + 'metadata' => 'Metadata', +]; diff --git a/lang/cs/server/backup.php b/lang/cs/server/backup.php new file mode 100644 index 0000000000..2e946d0faf --- /dev/null +++ b/lang/cs/server/backup.php @@ -0,0 +1,55 @@ + 'Zálohy', + 'empty' => 'Žádné Zálohy', + 'size' => 'Velikost', + 'created_at' => 'Vytvořeno v', + 'status' => 'Stav', + 'is_locked' => 'Stav zamknutí', + 'backup_status' => [ + 'in_progress' => 'V průběhu', + 'successful' => 'Úspěšné', + 'failed' => 'Selhání', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Vytvořit zálohu', + 'limit' => 'Dosažen limit zálohy', + 'created' => ':name vytvořeno', + 'notification_success' => 'Záloha úspěšně vytvořena', + 'notification_fail' => 'Vytvoření zálohy se nezdařilo', + 'name' => 'Název', + 'ignored' => 'Ignorované soubory a složky', + 'locked' => 'Zamknuto?', + 'lock_helper' => 'Zabraňuje tomu, aby byla tato záloha odstraněna, dokud nebude výslovně odemčena.', + ], + 'lock' => [ + 'lock' => 'Zamknout', + 'unlock' => 'Odemknout', + ], + 'download' => 'Stáhnout', + 'rename' => [ + 'title' => 'Přejmenovat', + 'new_name' => 'Název zálohy', + 'notification_success' => 'Záloha úspěšně přejmenovaná', + ], + 'restore' => [ + 'title' => 'Obnovit', + 'helper' => 'Váš server bude zastaven. Nebudete moci ovládat stav napájení, přístup ke správci souborů nebo vytvářet další zálohy, dokud nebude tento proces dokončen.', + 'delete_all' => 'Smazat všechny soubory před obnovením zálohy?', + 'notification_started' => 'Obnovení zálohy', + 'notification_success' => 'Záloha úspěšně obnovena', + 'notification_fail' => 'Obnovení zálohy se nezdařilo', + 'notification_fail_body_1' => 'Tento server není v současné době ve stavu, který umožňuje obnovení zálohy.', + 'notification_fail_body_2' => 'Záloha nemůže být v tuto chvíli obnovena: není dokončena nebo se nezdařila.', + ], + 'delete' => [ + 'title' => 'Smazat zálohu', + 'description' => 'Přejete si odstranit :backup?', + 'notification_success' => 'Záloha smazána', + 'notification_fail' => 'Zálohu nelze odstranit', + 'notification_fail_body' => 'Připojení k uzlu se nezdařilo. Zkuste to prosím znovu.', + ], + ], +]; diff --git a/lang/cs/server/console.php b/lang/cs/server/console.php new file mode 100644 index 0000000000..d3f3a28e61 --- /dev/null +++ b/lang/cs/server/console.php @@ -0,0 +1,43 @@ + 'Konzole', + 'command' => 'Zadejte příkaz…', + 'command_blocked' => 'Server offline...', + 'command_blocked_title' => 'Příkaz nelze odeslat, když je server offline', + 'open_in_admin' => 'Otevřít v administraci', + 'power_actions' => [ + 'start' => 'Spustit', + 'stop' => 'Zastavit', + 'restart' => 'Restartovat', + 'kill' => 'Vynuceně ukončit', + 'kill_tooltip' => 'To může mít za následek poškození dat nebo ztrátu dat!', + ], + 'labels' => [ + 'cpu' => 'Procesor', + 'memory' => 'Paměť Ram', + 'network' => 'Síť', + 'disk' => 'Úložiště', + 'name' => 'Název', + 'status' => 'Status', + 'address' => 'Adresa', + 'unavailable' => 'Není k dispozici', + ], + 'status' => [ + 'created' => 'Vytvořeno', + 'starting' => 'Startuje', + 'running' => 'Spuštěno', + 'restarting' => 'Restartování…', + 'exited' => 'Ukončeno', + 'paused' => 'Pozastaveno', + 'dead' => 'Smrt', + 'removing' => 'Odstranění', + 'stopping' => 'Zastavuji', + 'offline' => 'Offline', + 'missing' => 'Chybějící', + ], + 'websocket_error' => [ + 'title' => 'Nelze se připojit na websocket!', + 'body' => 'Zkontrolujte konzoli prohlížeče pro více informací.', + ], +]; diff --git a/lang/cs/server/dashboard.php b/lang/cs/server/dashboard.php new file mode 100644 index 0000000000..1be7044984 --- /dev/null +++ b/lang/cs/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servery', + 'list' => 'Seznam serverů', + 'tabs' => [ + 'my' => 'Moje servery', + 'other' => 'Servery ostatních', + 'all' => 'Všechny servery', + ], + 'empty_own' => 'Nevlastníte žádné servery!', + 'empty_other' => 'Nemáte přístup k žádným serverům!', + + 'status' => 'Stav', + 'server' => 'Server', + 'resources' => 'Prostředky', + 'usage_limit' => 'Limit využití: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Paměť', + 'disk' => 'Úložiště', + 'network' => 'Síť', + 'none' => 'Žádný', + 'loading' => 'Načítání…', + + 'power_actions' => 'Akce napájení', + 'power_action_sent' => ':action odeslána :name', +]; diff --git a/lang/cs/server/database.php b/lang/cs/server/database.php new file mode 100644 index 0000000000..060a5d1b7d --- /dev/null +++ b/lang/cs/server/database.php @@ -0,0 +1,26 @@ + 'Databáze', + 'empty' => 'Žádné databáze', + 'create_database' => 'Vytvořit databázi', + 'limit' => 'Dosáhli jsme limitu databáze', + 'viewing' => 'Zobrazení: :database', + 'host' => 'Hostitel', + 'database' => 'Databáze', + 'username' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'remote' => 'Vzdálené', + 'created_at' => 'Vytvořeno v', + 'name' => 'Název databáze', + 'name_hint' => 'Ponecháním tohoto prázdného bude automaticky generováno náhodné jméno', + 'connections_from' => 'Připojení od', + 'max_connections' => 'Maximální počet připojení', + 'database_host' => 'Host databáze', + 'database_host_select' => 'Vybrat hostitele databáze', + 'jdbc' => 'JDBC připojovací řetězec', + 'create_notification' => 'Vytvořeno :database', + 'create_notification_fail' => 'Nepodařilo se vytvořit :database', + 'delete_notification' => 'Smazáno :database', + 'delete_notification_fail' => 'Nepodařilo se smazat :database', +]; diff --git a/lang/cs/server/file.php b/lang/cs/server/file.php new file mode 100644 index 0000000000..d0dc654c16 --- /dev/null +++ b/lang/cs/server/file.php @@ -0,0 +1,111 @@ + 'Soubory', + 'name' => 'Název', + 'size' => 'Velikost', + 'modified_at' => 'Změněno v', + 'actions' => [ + 'open' => 'Otevřít', + 'download' => 'Stáhnout', + 'copy' => [ + 'title' => 'Kopírovat', + 'notification' => 'Soubor zkopírován', + ], + 'upload' => [ + 'title' => 'Nahrát', + 'from_files' => 'Nahrát soubory', + 'from_url' => 'Nahrát z URL', + 'url' => 'URL', + 'drop_files' => 'Přetáhněte soubory k nahrání', + 'success' => 'Soubory úspěšně nahrány', + 'failed' => 'Nahrávání se nezdařilo.', + 'header' => 'Nahrávání souborů', + 'error' => 'Při nahrávání %s došlo k chybě', + ], + 'rename' => [ + 'title' => 'Přejmenovat', + 'file_name' => 'Název souboru', + 'notification' => 'Soubor byl přejmenován', + ], + 'move' => [ + 'title' => 'Přesunout', + 'directory' => 'Adresář', + 'directory_hint' => 'Zadejte nový adresář vzhledem k aktuálnímu adresáři.', + 'new_location' => 'Nové místo', + 'new_location_hint' => 'Zadejte umístění tohoto souboru nebo složky vzhledem k aktuální složce.', + 'notification' => 'Soubor byl přesunut', + 'bulk_notification' => ':count Soubory byly přesunuty do :directory', + ], + 'permissions' => [ + 'title' => 'Oprávnění', + 'read' => 'Čtení', + 'write' => 'Zápis', + 'execute' => 'Vykonat', + 'owner' => 'Vlastník', + 'group' => 'Skupina', + 'public' => 'Veřejné', + 'notification' => 'Oprávnění změněna na :mode', + ], + 'archive' => [ + 'title' => 'Archivovat', + 'archive_name' => 'Název archivu', + 'notification' => 'Archiv vytvořen', + 'extension' => 'Rozšíření', + ], + 'unarchive' => [ + 'title' => 'Odarchivovat', + 'notification' => 'Odarchivování dokončeno', + ], + 'new_file' => [ + 'title' => 'Nový soubor', + 'file_name' => 'Název nového souboru', + 'syntax' => 'Zvýraznění syntaxe', + 'create' => 'Vytvořit', + ], + 'new_folder' => [ + 'title' => 'Nová složka', + 'folder_name' => 'Název nové složky', + ], + 'nested_search' => [ + 'title' => 'Vnořené hledání', + 'search_term' => 'Hledaný výraz', + 'search_term_placeholder' => 'Zadejte hledaný výraz, například *.txt', + 'search' => 'Hledat', + 'search_for_term' => 'Hledaný výraz', + ], + 'delete' => [ + 'notification' => 'Soubor byl smazán', + 'bulk_notification' => ':count souborů byly smazány', + ], + 'edit' => [ + 'title' => 'Upravení: :file', + 'save_close' => 'Uložit & zavřít', + 'save' => 'Uložit', + 'cancel' => 'Zrušit', + 'notification' => 'Soubor uložen', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ': jméno je příliš dlouhé!', + 'body' => 'Maximum je :max', + ], + 'file_not_found' => [ + 'title' => ':name nebylo nalezeno!', + ], + 'file_not_editable' => [ + 'title' => ':name je složka', + ], + 'file_already_exists' => [ + 'title' => ':name již existuje!', + ], + 'files_node_error' => [ + 'title' => 'Nelze načíst soubory!', + ], + 'pelicanignore' => [ + 'title' => 'Upravujete .pelicanignore soubor!', + 'body' => 'Všechny soubory nebo adresáře uvedené v tomto seznamu budou ze zálohování vyloučeny. Podporovány jsou zástupné znaky pomocí hvězdičky (*).
Předchozí pravidlo můžete zrušit přidáním vykřičníku (!) na začátek.', + ], + ], +]; diff --git a/lang/cs/server/network.php b/lang/cs/server/network.php new file mode 100644 index 0000000000..3a2e81f7a0 --- /dev/null +++ b/lang/cs/server/network.php @@ -0,0 +1,17 @@ + 'Síť', + 'add' => 'Přidat alokaci', + 'limit' => 'Byl dosažen limit alokace', + 'address' => 'Adresa', + 'port' => 'Port', + 'notes' => 'Poznámky', + 'no_notes' => 'Žádné poznámky', + 'make_primary' => 'Nastavit jako primární', + 'primary' => 'Primární', + 'make' => 'Vytvoř', + 'delete' => 'Smazat', + 'locked' => 'Zamknuto?', + 'locked_helper' => 'Uzamčené alokace mohou být odstraněny pouze administrátorem', +]; diff --git a/lang/cs/server/schedule.php b/lang/cs/server/schedule.php new file mode 100644 index 0000000000..041f41724b --- /dev/null +++ b/lang/cs/server/schedule.php @@ -0,0 +1,121 @@ + 'Rozvrh', + 'new' => 'Nový rozvrh', + 'edit' => 'Upravit Rozvrh', + 'save' => 'Uložit rozvrh', + 'delete' => 'Smazat rozvrh', + 'import' => 'Importovat rozvrh', + 'export' => 'Exportovat rozvrh', + 'name' => 'Název', + 'cron' => 'Cron', + 'status' => 'Stav', + 'schedule_status' => [ + 'inactive' => 'Neaktivní', + 'processing' => 'Zpracovávání', + 'active' => 'Aktivní', + ], + 'no_tasks' => 'Žádné úlohy', + 'run_now' => 'Spustit teď', + 'online_only' => 'Pouze když je online', + 'last_run' => 'Poslední spuštění', + 'next_run' => 'Další spuštění', + 'never' => 'nikdy', + 'cancel' => 'Zrušit', + + 'only_online' => 'Jen když je server online?', + 'only_online_hint' => 'Spustit tento plán pouze tehdy, když je server ve stavu běžící.', + 'enabled' => 'Povolit rozvrh?', + 'enabled_hint' => 'Tento plán bude proveden automaticky, pokud je povoleno.', + + 'cron_body' => 'Mějte prosím na paměti, že vstupy cronu níže vždy předpokládají UTC.', + 'cron_timezone' => 'Další spuštění ve Vašem časovém pásmu (:timezone): :next_run ', + + 'invalid' => 'Neplatný', + + 'time' => [ + 'minute' => 'Minut', + 'hour' => 'Hodina', + 'day' => 'Den', + 'week' => 'Týden', + 'month' => 'Měsíc', + 'day_of_month' => 'Den v měsíci', + 'day_of_week' => 'Den v týdnu', + + 'hourly' => 'Hodina', + 'daily' => 'Denně', + 'weekly_mon' => 'Týdně (pondělí)', + 'weekly_sun' => 'Týdně (Neděle)', + 'monthly' => 'Měsíčně', + 'every_min' => 'Každých x minut', + 'every_hour' => 'Každých x hodin', + 'every_day' => 'Každých x dní', + 'every_week' => 'Každých x týdnů', + 'every_month' => 'Každých x měsíců', + 'every_day_of_week' => 'Každý x den v týdnu.', + + 'every' => 'Každý', + 'minutes' => 'Minuta', + 'hours' => 'Hodina', + 'days' => 'Den', + 'months' => 'Měsíc', + + 'monday' => 'Pondělí', + 'tuesday' => 'Úterý', + 'wednesday' => 'Středa', + 'thursday' => 'Čtvrtek', + 'friday' => 'Pátek', + 'saturday' => 'Sobota', + 'sunday' => 'Neděle', + ], + + 'tasks' => [ + 'title' => 'Úkoly', + 'create' => 'Vytvořit úkol', + 'limit' => 'Dosažen limit úkolu', + 'action' => 'Akce', + 'payload' => 'Uspořádání', + 'no_payload' => 'Žádná data', + 'time_offset' => 'Časový posun', + 'first_task' => 'První úloha', + 'seconds' => 'Sekunda', + 'continue_on_failure' => 'Pokračovat při selhání', + + 'actions' => [ + 'title' => 'Akce', + 'power' => [ + 'title' => 'Poslat akci napájení', + 'action' => 'Aktivace napájení', + 'start' => 'Spustit', + 'stop' => 'Vypnout', + 'restart' => 'Restartovat', + 'kill' => 'Ukončit', + ], + 'command' => [ + 'title' => 'Poslat příkaz', + 'command' => 'Příkaz', + ], + 'backup' => [ + 'title' => 'Vytvořit zálohu', + 'files_to_ignore' => 'Ignorovat soubory', + ], + 'delete_files' => [ + 'title' => 'Odstranit soubory', + 'files_to_delete' => 'Soubory k odstranění', + ], + ], + ], + + 'notification_invalid_cron' => 'Poskytnutá data cron se nehodnotí na správný výraz', + + 'import_action' => [ + 'file' => 'Soubor', + 'url' => 'Odkaz', + 'schedule_help' => 'Měl by to být nezpracovaný soubor .json ( schedule-daily-restart.json )', + 'url_help' => 'Odkaz musí směřovat přímo na nezpracovaný .json soubor', + 'add_url' => 'Nový odkaz', + 'import_failed' => 'Import selhal', + 'import_success' => 'Import úspěšný', + ], +]; diff --git a/lang/cs/server/setting.php b/lang/cs/server/setting.php new file mode 100644 index 0000000000..25b5bcbd49 --- /dev/null +++ b/lang/cs/server/setting.php @@ -0,0 +1,55 @@ + 'Nastavení', + 'server_info' => [ + 'title' => 'Informace o serveru', + 'information' => 'Informace', + 'name' => 'Název serveru', + 'server_name' => 'Název serveru: :name', + 'notification_name' => 'Aktualizovaný název serveru', + 'description' => 'Popis serveru', + 'notification_description' => 'Aktualizován popis serveru', + 'failed' => 'Selhalo', + 'uuid' => 'Server UUID', + 'uuid_short' => 'ID serveru', + 'node_name' => 'Název uzlu', + 'icon' => [ + 'upload' => 'Nahrát Ikonu', + 'tooltip' => 'Používá ikonu vejce', + 'updated' => 'Ikona serveru byla aktualizována', + 'deleted' => 'Ikona serveru byla smazána', + ], + 'limits' => [ + 'title' => 'Limity', + 'unlimited' => 'Bez omezení', + 'of' => 'z', + 'cpu' => 'Procesor', + 'memory' => 'Paměť Ram', + 'disk' => 'Místo na disku', + 'backups' => 'Zálohy', + 'databases' => 'Databáze', + 'allocations' => 'Alokace', + 'no_allocations' => 'Žádné další alokace', + ], + 'sftp' => [ + 'title' => 'SFTP informace', + 'connection' => 'Připojení', + 'action' => 'Připojit na SFTP', + 'username' => 'Přezdívka', + 'password' => 'Heslo', + 'password_body' => 'Vaše SFTP heslo je stejné, jako heslo, kterým se přihlašujete do panelu.', + ], + ], + 'reinstall' => [ + 'title' => 'Přeinstalovat Server', + 'body' => 'Přeinstalování serveru ho zastaví a poté znovu spustí instalační skript.', + 'body2' => 'Některé soubory mohou být během tohoto procesu odstraněny nebo upraveny, před pokračováním prosím zálohujte data.', + 'action' => 'Přeinstalovat', + 'modal' => 'Opravdu chcete znovu nainstalovat server?', + 'modal_description' => 'Některé soubory mohou být během tohoto procesu smazány nebo změněny, před pokračováním prosím zálohujte data.', + 'yes' => 'Ano, přeinstalovat', + 'notification_start' => 'Přeinstalování bylo zahájeno', + 'notification_fail' => 'Přeinstalování se nezdařilo', + ], +]; diff --git a/lang/cs/server/startup.php b/lang/cs/server/startup.php new file mode 100644 index 0000000000..13b55e4b2e --- /dev/null +++ b/lang/cs/server/startup.php @@ -0,0 +1,17 @@ + 'Spuštění', + 'command' => 'Příkaz pro spuštění', + 'notification_startup' => 'Příkaz pro spuštění aktualizován', + 'notification_startup_body' => 'Restartujte server pro použití nového příkazu spuštění.', + 'enable_preview' => 'Povolit náhled', + 'disable_preview' => 'Vypnout náhled', + 'docker_image' => 'Docker Image', + 'notification_docker' => 'Obrázek Dockeru byl aktualizován', + 'notification_docker_body' => 'Restartovat server pro použití nového obrázku.', + 'variables' => 'Serverové proměnné', + 'update' => 'Aktualizováno: :variable', + 'fail' => 'Nezdařilo: :variable', + 'validation_fail' => 'Ověření se nezdařilo: :variable', +]; diff --git a/lang/cs/server/user.php b/lang/cs/server/user.php new file mode 100644 index 0000000000..abed28d8c7 --- /dev/null +++ b/lang/cs/server/user.php @@ -0,0 +1,73 @@ + 'Uživatelé', + 'username' => 'Uživatelské jméno', + 'email' => 'E-mail', + 'assign_all' => 'Přiřadit vše', + 'invite_user' => 'Pozvat uživatele', + 'action' => 'Pozvat', + 'remove' => 'Odebrat uživatele', + 'edit' => 'Upravit uživatele', + 'editing' => 'Editace :user', + 'delete' => 'Smazat uživatele', + 'notification_add' => 'Uživatel pozván!', + 'notification_edit' => 'Uživatel aktualizován!', + 'notification_delete' => 'Uživatel smazán!', + 'notification_failed' => 'Uživatele se nepodařilo pozvat', + 'permissions' => [ + 'title' => 'Oprávnění', + 'activity_desc' => 'Oprávnění, která ovládají přístup uživatele k protokolům aktivity serveru.', + 'startup_desc' => 'Oprávnění, která ovládají schopnost uživatele zobrazit spouštěcí parametry tohoto serveru.', + 'settings_desc' => 'Oprávnění, která ovládají schopnost uživatele změnit nastavení tohoto serveru.', + 'control_desc' => 'Oprávnění, která ovládají schopnost uživatele ovládat stav napájení serveru nebo posílat příkazy.', + 'user_desc' => 'Oprávnění, která uživateli umožňují spravovat ostatní poduživatele na serveru. Nikdy nebudou moci upravovat svůj vlastní účet nebo udělovat oprávnění, která sami nemají.', + 'file_desc' => 'Oprávnění, která řídí uživatelskou schopnost měnit souborový systém pro tento server.', + 'allocation_desc' => 'Oprávnění, která řídí uživatelskou schopnost měnit alokace portů pro tento server.', + 'database_desc' => 'Oprávnění, která ovládají přístup uživatele k databázi pro tento server.', + 'backup_desc' => 'Oprávnění, která ovládají schopnost uživatele generovat a spravovat zálohy serveru.', + 'schedule_desc' => 'Oprávnění, která řídí přístup uživatele k správě harmonogramu pro tento server.', + 'startup_read' => 'Umožňuje uživateli zobrazit spouštěcí proměnné pro server.', + 'startup_update' => 'Umožňuje uživateli změnit spouštěcí proměnné pro server.', + 'startup_docker_image' => 'Umožňuje uživateli upravovat obrázek Dockeru použitý při spuštění serveru.', + 'settings_reinstall' => 'Umožňuje uživateli spustit přeinstalaci tohoto serveru.', + 'settings_rename' => 'Umožňuje uživateli přejmenovat tento server a změnit jeho popis.', + 'settings_description' => 'Umožňuje uživateli změnit popis tohoto serveru.', + 'activity_read' => 'Umožňuje uživateli zobrazit záznamy aktivit na serveru.', + 'websocket_connect' => 'Umožňuje uživateli přístup k websocketu pro tento server.', + 'control_console' => 'Umožňuje uživateli posílat data do konzole serveru.', + 'control_start' => 'Umožňuje uživateli spustit instanci serveru.', + 'control_stop' => 'Umožní uživateli zastavit instanci serveru.', + 'control_restart' => 'Umožní uživateli restartovat instanci serveru.', + 'control_kill' => 'Umožňuje uživateli ukončit instanci serveru.', + 'user_create' => 'Umožňuje uživateli vytvářet nové uživatelské účty pro server.', + 'user_read' => 'Umožňuje uživateli oprávnění k zobrazení uživatelů přidružených k tomuto serveru.', + 'user_update' => 'Umožňuje uživateli upravovat ostatní uživatele spojené s tímto serverem.', + 'user_delete' => 'Umožňuje uživateli odstranit další uživatele přidružené k tomuto serveru.', + 'file_create' => 'Umožňuje uživatelům oprávnění vytvářet nové soubory a adresáře.', + 'file_read' => 'Umožňuje uživateli zobrazit obsah adresáře, ale nezobrazovat obsah nebo stahovat soubory.', + 'file_read_content' => 'Umožňuje uživateli zobrazit obsah daného souboru. To také umožní uživateli stahovat soubory.', + 'file_update' => 'Umožňuje uživateli aktualizovat soubory a složky spojené se serverem.', + 'file_delete' => 'Umožňuje uživateli odstranit soubory a adresáře.', + 'file_archive' => 'Umožňuje uživateli vytvářet soubory a dekomprimovat existující archivy.', + 'file_sftp' => 'Umožňuje uživateli provést výše uvedené akce souborů pomocí SFTP klienta.', + 'allocation_read' => 'Umožňuje uživateli zobrazit všechny alokace aktuálně přiřazené k tomuto serveru. Uživatelé s jakoukoli úrovní přístupu k tomuto serveru mohou vždy zobrazit primární alokaci.', + 'allocation_update' => 'Umožňuje uživateli změnit primární alokaci serveru a připojit poznámky ke každé alokaci.', + 'allocation_delete' => 'Umožňuje uživateli odstranit alokaci ze serveru.', + 'allocation_create' => 'Umožňuje uživateli přiřadit k serveru další alokace.', + 'database_create' => 'Umožňuje uživateli oprávnění vytvořit novou databázi pro server.', + 'database_read' => 'Umožňuje uživateli oprávnění k zobrazení serverových databází.', + 'database_update' => 'Umožňuje uživateli oprávnění provádět změny v databázi. Pokud uživatel nemá také oprávnění "Zobrazit heslo", nebude moci heslo upravit.', + 'database_delete' => 'Umožňuje uživateli oprávnění odstranit instanci databáze.', + 'database_view_password' => 'Umožňuje uživateli oprávnění zobrazit heslo k databázi v systému.', + 'schedule_create' => 'Umožňuje uživateli vytvořit pro server nový plán.', + 'schedule_read' => 'Umožňuje uživateli oprávnění zobrazovat plány serveru.', + 'schedule_update' => 'Umožňuje uživateli oprávnění provádět změny v rozvrhu stávajícího serveru.', + 'schedule_delete' => 'Umožňuje uživateli smazat plán pro server.', + 'backup_create' => 'Umožňuje uživateli vytvářet pro tento server nové zálohy.', + 'backup_read' => 'Umožňuje uživateli zobrazit všechny existující zálohy.', + 'backup_delete' => 'Umožňuje uživateli odebrat zálohy ze systému.', + 'backup_download' => 'Umožňuje uživateli stáhnout zálohu serveru. Nebezpečí: umožňuje uživateli přístup ke všem souborům pro server v záloze.', + 'backup_restore' => 'Umožňuje uživateli obnovit zálohu serveru. Nebezpečí: umožní uživateli odstranit všechny soubory serveru.', + ], +]; diff --git a/lang/cs/server/users.php b/lang/cs/server/users.php deleted file mode 100644 index 7c9031be1a..0000000000 --- a/lang/cs/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Umožňuje přístup do websocketu pro tento server.', - 'control_console' => 'Umožňuje uživateli odesílat data do konzole serveru.', - 'control_start' => 'Umožňuje uživateli spustit instanci serveru.', - 'control_stop' => 'Umožňuje uživateli zastavit instanci serveru.', - 'control_restart' => 'Umožňuje uživateli restartovat instanci serveru.', - 'control_kill' => 'Umožňuje uživateli ukončit instanci serveru.', - 'user_create' => 'Umožňuje uživateli vytvářet nové uživatelské účty pro server.', - 'user_read' => 'Umožňuje uživateli zobrazit oprávnění uživatele asociované s tímto serverem.', - 'user_update' => 'Umožňuje uživateli upravovat ostatní oprávnění uživatelů spojené s tímto serverem.', - 'user_delete' => 'Umožňuje uživateli odstranit ostatní uživatele přidružené k tomuto serveru.', - 'file_create' => 'Umožňuje uživateli oprávnění vytvářet nové soubory a adresáře.', - 'file_read' => 'Umožňuje uživateli vidět soubory a složky spojené s touto instancí serveru a také zobrazit jejich obsah.', - 'file_update' => 'Umožňuje uživateli aktualizovat soubory a složky spojené se serverem.', - 'file_delete' => 'Umožňuje uživateli odstranit soubory a adresáře.', - 'file_archive' => 'Umožňuje uživateli vytvářet archivy souborů a dekomprimovat existující archivy.', - 'file_sftp' => 'Umožňuje uživateli provést výše uvedené akce souborů pomocí SFTP klienta.', - 'allocation_read' => 'Umožňuje přístup ke stránkám správy alokace serveru.', - 'allocation_update' => 'Umožňuje uživateli oprávnění provádět změny alokací serveru.', - 'database_create' => 'Umožňuje uživateli oprávnění k vytvoření nové databáze pro server.', - 'database_read' => 'Umožňuje uživateli oprávnění zobrazit databáze serverů.', - 'database_update' => 'Umožňuje uživateli oprávnění provádět změny v databázi. Pokud uživatel nemá také oprávnění "Zobrazit heslo", nebude moci heslo upravit.', - 'database_delete' => 'Umožňuje uživateli oprávnění odstranit instanci databáze.', - 'database_view_password' => 'Umožňuje uživateli oprávnění zobrazit heslo do databáze.', - 'schedule_create' => 'Umožňuje uživateli vytvořit nový plán pro server.', - 'schedule_read' => 'Umožňuje uživateli oprávnění k prohlížení plánů serveru.', - 'schedule_update' => 'Umožňuje uživateli oprávnění provádět změny plánu existujícího serveru.', - 'schedule_delete' => 'Umožňuje uživateli odstranit plán pro server.', - ], -]; diff --git a/lang/cs/strings.php b/lang/cs/strings.php deleted file mode 100644 index ce96485e41..0000000000 --- a/lang/cs/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-mail', - 'email_address' => 'E-mailová adresa', - 'user_identifier' => 'Uživatelské jméno nebo e-mail', - 'password' => 'Heslo', - 'new_password' => 'Nové heslo', - 'confirm_password' => 'Potvrdit nové heslo', - 'login' => 'Přihlášení', - 'home' => 'Domovská stránka', - 'servers' => 'Servery', - 'id' => 'ID', - 'name' => 'Název', - 'node' => 'Uzel', - 'connection' => 'Připojení', - 'memory' => 'Paměť', - 'cpu' => 'CPU', - 'disk' => 'Úložiště', - 'status' => 'Stav', - 'search' => 'Hledat', - 'suspended' => 'Pozastaveno', - 'account' => 'Účet', - 'security' => 'Zabezpečení', - 'ip' => 'IP adresa', - 'last_activity' => 'Poslední aktivita', - 'revoke' => 'Odvolat', - '2fa_token' => 'Ověřovací Token', - 'submit' => 'Odeslat', - 'close' => 'Zavřít', - 'settings' => 'Nastavení', - 'configuration' => 'Nastavení', - 'sftp' => 'SFTP', - 'databases' => 'Databáze', - 'memo' => 'Poznámka', - 'created' => 'Vytvořeno', - 'expires' => 'Expirace', - 'public_key' => 'Token', - 'api_access' => 'Api Přístup', - 'never' => 'nikdy', - 'sign_out' => 'Odhlásit se', - 'admin_control' => 'Administrace', - 'required' => 'Povinné pole', - 'port' => 'Port', - 'username' => 'Uživatelské jméno', - 'database' => 'Databáze', - 'new' => 'Nový', - 'danger' => 'Nebezpečí', - 'create' => 'Vytořit', - 'select_all' => 'Vybrat vše', - 'select_none' => 'Zrušit výběr', - 'alias' => 'Přezdívka', - 'primary' => 'Primární', - 'make_primary' => 'Nastavit jako výchozí', - 'none' => 'Žádný', - 'cancel' => 'Zrušit', - 'created_at' => 'Vytvořeno v', - 'action' => 'Akce', - 'data' => 'Data', - 'queued' => 'Ve frontě', - 'last_run' => 'Poslední spuštění', - 'next_run' => 'Další spuštění', - 'not_run_yet' => 'Zatím nespustěno', - 'yes' => 'Ano', - 'no' => 'Ne', - 'delete' => 'Smazat', - '2fa' => '2FA', - 'logout' => 'Odhlásit se', - 'admin_cp' => 'Administrace', - 'optional' => 'Volitelné', - 'read_only' => 'Pouze pro čtení', - 'relation' => 'Souvislost', - 'owner' => 'Vlastník', - 'admin' => 'Administrátor', - 'subuser' => 'Poduživatel', - 'captcha_invalid' => 'Zadaný captcha je neplatný.', - 'tasks' => 'Úkoly', - 'seconds' => 'Sekund', - 'minutes' => 'Minut', - 'under_maintenance' => 'Probíhá údržba', - 'days' => [ - 'sun' => 'Neděle', - 'mon' => 'Pondělí', - 'tues' => 'Úterý', - 'wed' => 'Středa', - 'thurs' => 'Čtvrtek', - 'fri' => 'Pátek', - 'sat' => 'Sobota', - ], - 'last_used' => 'Naposledy použito', - 'enable' => 'Povolit', - 'disable' => 'Zakázat', - 'save' => 'Uložit', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/cs/validation.php b/lang/cs/validation.php index 63a90ae54a..921d952ede 100644 --- a/lang/cs/validation.php +++ b/lang/cs/validation.php @@ -14,75 +14,70 @@ 'accepted' => ':attribute musí být přijat.', 'active_url' => ':attribute není platná URL adresa.', - 'after' => ':attribute musí být po datu :date.', - 'after_or_equal' => ':attribute musí být datum :date nebo pozdější.', - 'alpha' => ':attribute může obsahovat pouze písmena.', - 'alpha_dash' => ':attribute může obsahovat pouze písmena, čísla, a pomlčky.', + 'after' => ':attribute nemůže být dříve než :date.', + 'after_or_equal' => ':attribute musí být datum po nebo stejné jako :date.', + 'alpha' => ':attribute smí obsahovat pouze písmena.', + 'alpha_dash' => ':attribute smí obsahovat pouze písmena, čísla a pomlčky.', 'alpha_num' => ':attribute může obsahovat pouze písmena a čísla.', - 'array' => ':attribute musí být seznam.', - 'before' => ':attribute musí být datum před :date.', - 'before_or_equal' => ':attribute musí být datum před nebo rovné :date.', + 'array' => ':attribute musí být pole.', + 'before' => ':attribute musí mít datum před :date.', + 'before_or_equal' => ':attribute musí být datum před nebo stejné jako :date.', 'between' => [ - 'numeric' => ':attribute musí být mezi :min a :max.', - 'file' => ':attribute musí být v rozmezí :min a :max kilobajtů.', - 'string' => ':attribute musí mít délku v rozmezí :min a :max znaků.', - 'array' => ':attribute musí mít mezi :min a :max položkami.', + 'numeric' => ':attribute musí být v rozmezí :min až :max.', + 'file' => ':attribute musí být mezi :min a :max kilobajtů.', + 'string' => ':attribute musí být v rozmezí :min až :max znaků.', + 'array' => ':attribute musí mít v rozmezí :min až :max položek.', ], - 'boolean' => ':attribute musí být true nebo false', + 'confirmed' => 'Potvrzení :attribute se neshoduje.', 'date' => ':attribute není platné datum.', - 'date_format' => ':attribute se neshoduje se správným formátem :format.', - 'different' => ':attribute a :other se musí lišit.', - 'digits' => 'Atribut :attribute musí mít :digits číslic.', - 'digits_between' => ':attribute musí být dlouhé nejméně :min a nejvíce :max číslic.', - 'dimensions' => ':attribute nemá platné rozměry obrázku.', - 'distinct' => ':attribute má duplicitní hodnotu.', - 'email' => ':attribute musí být platná e-mailová adresa.', - 'exists' => 'Vybraný :attribute je neplatný.', + 'date_format' => ':attribute neodpovídá formátu :formát.', + 'different' => ':attribute a :other musí být odlišné.', + 'digits' => ':attribute musí obsahovat :digits číslic.', + 'digits_between' => ':attribute musí mít délku mezi :min a :max číslicemi.', + 'dimensions' => ':attribute má neplatné rozměry obrázku.', + + 'email' => ':attribute musí obsahovat platnou e-mailovou adresu.', + 'file' => ':attribute musí být soubor.', 'filled' => 'Pole :attribute je povinné.', 'image' => ':attribute musí být obrázek.', - 'in' => 'Vybraný :attribute je neplatný.', - 'in_array' => 'Pole :attribute neexistuje v :other.', + + 'in_array' => 'Pole :attribute neexistuje v :other', 'integer' => ':attribute musí být celé číslo.', - 'ip' => ':attribute musí být platná IP adresa.', + 'ip' => ':attribute musí obsahovat platnou IP adresu.', 'json' => ':attribute musí být platný řetězec JSON.', 'max' => [ - 'numeric' => ':attribute nemůže být větší než :max.', - 'file' => ':attribute nesmí být větší než :max kilobajtů.', - 'string' => ':attribute nesmí být delší než :max znaků.', - 'array' => ':attribute nesmí obsahovat více než: max položek.', + 'numeric' => ':attribute nesmí být delší než :max.', + 'file' => ':attribute nesmí být vyšší než :max kilobajtů.', + 'string' => ':attribute nesmí být větší než :max znaků.', + 'array' => ':attribute nesmí obsahovat více než :max položek.', ], 'mimes' => 'Atribut: musí být soubor typu: :values.', - 'mimetypes' => 'Atribut :attribute musí být soubor o typu: :values.', + 'mimetypes' => 'Atribut: musí být soubor typu: :values.', 'min' => [ - 'numeric' => 'Atribut :attribute musí být alepoň :min místný.', - 'file' => 'Atribut :attribute musí mít alapoň :min kilobajtů.', - 'string' => 'Atribut :attribute musí mít alespoň :min znaků.', - 'array' => 'Atribut :attribute musí mít alespoň :min položek.', + 'numeric' => ':attribute musí být alespoň :min.', + 'file' => ':attribute musí být alespoň :min kilobajtů.', + 'string' => 'Atribut musí být dlouhý alespoň :min znaků.', + 'array' => ':attribute musí obsahovat alespoň :min položek.', ], - 'not_in' => 'Zvolený atribut :attribute je neplatný.', - 'numeric' => 'Atribut :attribute musí být číslo.', - 'present' => 'Pole atributu :attribute musí být přítomno.', - 'regex' => 'Formát atributu :attribute je neplatný.', - 'required' => 'Pole atributu :attribute je povinné.', - 'required_if' => 'Pole atributu :attribute je povinné když :other je :values.', - 'required_unless' => 'Pole atributu :attribute je povinné pokud není :other :values.', - 'required_with' => 'Pole atributu :attribute je povinné pokud :values je přitomná.', - 'required_with_all' => 'Pole atributu :attribute je povinné pokud :values nejsou přítomny.', - 'required_without' => 'Pole atributu :attribute je povinné pokud :values není přitomna.', - 'required_without_all' => 'Pole atributu :attribute pokud žádná z :values není přítomna.', + + 'numeric' => ':attribute musí být číslo.', + + 'regex' => 'Formát :attribute je neplatný.', + + 'required_with_all' => 'Pole :attribute je vyžadováno, pokud je zvoleno :values.', + 'same' => 'Atribut :attribute a :other se musí shodovat.', 'size' => [ - 'numeric' => 'Atribut :attribute musí být :size místný.', - 'file' => ':attribute musí mít velikost :size Kb.Atribut :attribute musí mít :size kilobajtů.', + 'numeric' => ':attribute musí mít velikost :size.', + 'file' => ':attribute musí mít velikost :size Kb.', 'string' => ':attribute musí mít :size znaků.', 'array' => ':attribute musí obsahovat :size položek.', ], - 'string' => ':attribute musí být text.', + 'string' => 'Atribut musí být textový řetězec.', 'timezone' => ':attribute musí být platná zóna.', - 'unique' => ':attribute byl již použit.', - 'uploaded' => 'Nahrávání :attribute se nezdařilo.', + 'url' => 'Formát :attribute není platný.', /* diff --git a/lang/da/activity.php b/lang/da/activity.php deleted file mode 100644 index 5239cb6fd8..0000000000 --- a/lang/da/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Log ind mislykkedes', - 'success' => 'Logget ind', - 'password-reset' => 'Nulstil adgangskode', - 'reset-password' => 'Anmodet om nulstilling af adgangskode', - 'checkpoint' => '2-factor godkendelse anmodet', - 'recovery-token' => '2-factor gendannelses-token brugt', - 'token' => 'Løst 2-factor udfordring', - 'ip-blocked' => 'Blokeret anmodning fra ikke-listet IP-adresse for :identifier', - 'sftp' => [ - 'fail' => 'SFTP log ind mislykkedes', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Skiftede e-mail fra :old til :new', - 'password-changed' => 'Adgangskode ændret', - ], - 'api-key' => [ - 'create' => 'Ny API-nøgle oprettet :identifier', - 'delete' => 'API-nøgle slettet :identifier', - ], - 'ssh-key' => [ - 'create' => 'SSH-nøgle :fingerprint tilføjet til konto', - 'delete' => 'SSH-nøgle :fingerprint fjernet fra konto', - ], - 'two-factor' => [ - 'create' => '2-factor godkendelse aktiveret', - 'delete' => '2-factor godkendelse deaktiveret', - ], - ], - 'server' => [ - 'reinstall' => 'Server geninstalleret', - 'console' => [ - 'command' => 'Udført ":command" på serveren', - ], - 'power' => [ - 'start' => 'Server startet', - 'stop' => 'Server stoppet', - 'restart' => 'Server genstartet', - 'kill' => 'Dræbte serverprocessen', - ], - 'backup' => [ - 'download' => 'Hentede :name backup', - 'delete' => 'Slettede :name backup', - 'restore' => 'Gendannede :name backup (slettede filer: :truncate)', - 'restore-complete' => 'Genoprettelse af :name backup fuldført', - 'restore-failed' => 'Genoprettelse af :name backup mislykkedes', - 'start' => 'Startede en ny backup :name', - 'complete' => 'Backup :name markeret som fuldført', - 'fail' => 'Markeret :name backup som mislykket', - 'lock' => 'Låst :name backup', - 'unlock' => 'Oplåst :name backup', - ], - 'database' => [ - 'create' => 'Oprettet ny database :name', - 'rotate-password' => 'Adgangskode roteret for database :name', - 'delete' => 'Slettet database :name', - ], - 'file' => [ - 'compress_one' => 'Komprimeret :directory:file', - 'compress_other' => 'Komprimeret :count filer i :directory', - 'read' => 'Indholdet af :file blev set', - 'copy' => 'Kopi af :file oprettet', - 'create-directory' => 'Mappen :directory:name oprettet', - 'decompress' => 'Dekomprimeret :files i :directory', - 'delete_one' => 'Slettede :directory:files.0', - 'delete_other' => 'Slettede :count filer i :directory', - 'download' => 'Hentede :file', - 'pull' => 'Hentede en fjernfil fra :url til :directory', - 'rename_one' => 'Omdøbte :directory:files.0.from til :directory:files.0.to', - 'rename_other' => 'Omdøbte :count filer i :directory', - 'write' => 'Skrev nyt indhold til :file', - 'upload' => 'Begyndte en filoverførsel', - 'uploaded' => 'Uploadet :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blokeret SFTP adgang på grund af tilladelser', - 'create_one' => 'Oprettede :files.0', - 'create_other' => 'Oprettede :count nye filer', - 'write_one' => 'Ændrede indholdet af :files.0', - 'write_other' => 'Ændrede indholdet af :count filer', - 'delete_one' => 'Slettede :files.0', - 'delete_other' => 'Slettede :count filer', - 'create-directory_one' => 'Oprettede mappen :files.0', - 'create-directory_other' => 'Oprettede :count mapper', - 'rename_one' => 'Omdøbte :files.0.from til :files.0.to', - 'rename_other' => 'Omdøbte eller flyttede :count filer', - ], - 'allocation' => [ - 'create' => 'Tilføjede :allocation til serveren', - 'notes' => 'Opdaterede noterne for :allocation fra ":old" til ":new"', - 'primary' => 'Satte :allocation som primær servertildeling', - 'delete' => 'Slettede :allocation tildeling', - ], - 'schedule' => [ - 'create' => 'Oprettede :name tidsplan', - 'update' => 'Opdaterede :name tidsplan', - 'execute' => 'Manuelt udført :name tidsplan', - 'delete' => 'Slettede :name tidsplan', - ], - 'task' => [ - 'create' => 'Oprettede en ny ":action" opgave for :name tidsplan', - 'update' => 'Opdaterede ":action" opgaven for :name tidsplan', - 'delete' => 'Slettede en opgave for :name tidsplan', - ], - 'settings' => [ - 'rename' => 'Omdøbte serveren fra :old til :new', - 'description' => 'Skiftede server beskrivelse fra :old til :new', - ], - 'startup' => [ - 'edit' => 'Skiftede :variable variabel fra ":old" til ":new"', - 'image' => 'Opdaterede Docker Image for serveren fra :old til :new', - ], - 'subuser' => [ - 'create' => 'Tilføjede :email som en underbruger', - 'update' => 'Opdaterede underbruger rettighederne for :email', - 'delete' => 'Fjernede :email som underbruger', - ], - ], -]; diff --git a/lang/da/admin/databasehost.php b/lang/da/admin/databasehost.php new file mode 100644 index 0000000000..5a97eef7e0 --- /dev/null +++ b/lang/da/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Database Host', + 'model_label' => 'Database Host', + 'model_label_plural' => 'Databaseværter', + 'table' => [ + 'database' => 'Database', + 'name' => 'Navn', + 'host' => 'Host', + 'port' => 'Port', + 'name_helper' => 'Efterlades dette tomt vil der automatisk genereres et tilfældigt navn', + 'username' => 'Brugernavn', + 'password' => 'Adgangskode', + 'remote' => 'Forbindelser fra', + 'remote_helper' => 'Hvorfra forbindelser skal tillades. Lad være tomt for at tillade forbindelser fra hvor som helst.', + 'max_connections' => 'Maks. forbindelser', + 'created_at' => 'Oprettet den', + 'connection_string' => 'JDBC-forbindelsesstreng', + ], + 'error' => 'Fejl ved tilslutning til vært', + 'host' => 'Host', + 'host_help' => 'IP-adressen eller domænenavnet, der skal bruges for at oprette forbindelse til denne MySQL server fra panelet for at oprette nye databaser.', + 'port' => 'Port', + 'port_help' => 'Porten, MySQL kører på for denne vært.', + 'max_database' => 'Maks. databaser', + 'max_databases_help' => 'Det maksimale antal databaser, som kan oprettes på denne vært. Nås kvoten, kan der ikke oprettes nye databaser på denne vært. Lad stå tomt for ubegrænset.', + 'display_name' => 'Visningsnavn', + 'display_name_help' => 'IP-adressen eller domænenavnet, der skal vises for slutbrugeren.', + 'username' => 'Brugernavn', + 'username_help' => 'Brugernavnet på en konto med tilstrækkelige tilladelser til at oprette nye brugere og databaser på systemet.', + 'password' => 'Adgangskode', + 'password_help' => 'Adgangskoden til databasebrugeren.', + 'linked_nodes' => 'Linket Nodes', + 'linked_nodes_help' => 'Denne indstilling falder kun tilbage på denne databasevært, når der føjes en database til en server på den valgte node.', + 'connection_error' => 'Fejl under tilslutning til databasevært', + 'no_database_hosts' => 'Ingen databaseværter', + 'no_nodes' => 'Ingen noder', + 'delete_help' => 'Databaseværten har stadig databaser', + 'unlimited' => 'Ubegrænset', + 'anywhere' => 'Hvor som helst', + + 'rotate' => 'Rotation', + 'rotate_password' => 'Roter Adgangskode', + 'rotated' => 'Adgangskode skiftet', + 'rotate_error' => 'Adgangskoderotation mislykkedes', + 'databases' => 'Databaser', + + 'setup' => [ + 'preparations' => 'Forberedelser', + 'database_setup' => 'Database Opsætning', + 'panel_setup' => 'Panel Opsætning', + + 'note' => 'I øjeblikket understøttes kun MySQL/MariaDB databaser som databaseværter!', + 'different_server' => 'Er panelet og databasen ikke på samme server?', + + 'database_user' => 'Databasebruger', + 'cli_login' => 'Brug mysql -u root -p for at tilgå mysql cli.', + 'command_create_user' => 'Kommando til at oprette brugeren', + 'command_assign_permissions' => 'Kommando til at tildele rettigheder', + 'cli_exit' => 'For at afslutte mysql cli, kør exit.', + 'external_access' => 'Ekstern Adgang', + 'allow_external_access' => ' +

Det er sandsynligt, at du skal tillade ekstern adgang til denne MySQL-instans for at lade servere oprette forbindelse til den.

+
+

For at gøre dette skal du åbne my.cnf, hvis placering varierer afhængigt af dit operativsystem og hvordan MySQL blev installeret. Du kan bruge kommandoen find /etc -iname my.cnf for at finde den.

+
+

Åbn my.cnf, tilføj følgende tekst nederst i filen og gem den:
+ [mysqld]
bind-address=0.0.0.0

+
+

Genstart MySQL/MariaDB for at anvende ændringerne. Dette vil overskrive standardkonfigurationen, som udgangspunkt kun accepterer forbindelser fra localhost. Ved at opdatere dette tillades forbindelser fra alle netværksgrænseflader – altså også eksterne forbindelser. Husk også at åbne MySQL-porten (standard: 3306) i din firewall.

+ ', + ], +]; diff --git a/lang/da/admin/eggs.php b/lang/da/admin/eggs.php deleted file mode 100644 index df1ee3931c..0000000000 --- a/lang/da/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Dette Egg og dets tilknyttede variabler blev importeret med succes.', - 'updated_via_import' => 'Dette Egg er blevet opdateret ved hjælp af den givne fil.', - 'deleted' => 'Egget blev slettet fra panelet.', - 'updated' => 'Egget blev opdateret med succes.', - 'script_updated' => 'Eggets installationsscript er blevet opdateret, og vil blive kørt når servere installeres.', - 'egg_created' => 'Et nyt egg blev lagt med succes. Du skal genstarte eventuelle kørende daemons for at anvende dette nye egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Variablen :variable er blevet slettet og vil ikke længere være tilgængelig for servere der er blevet genstartet.', - 'variable_updated' => 'Variablen :variable er blevet opdateret. Du skal genstarte eventuelle servere, der bruger denne variabel for at anvende ændringer.', - 'variable_created' => 'Ny variabel er blevet oprettet og tildelt dette egg.', - ], - ], -]; diff --git a/lang/da/admin/node.php b/lang/da/admin/node.php deleted file mode 100644 index d8040b6c89..0000000000 --- a/lang/da/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'FQDN eller IP-adressen, der er angivet, resulterer ikke i en gyldig IP-adresse.', - 'fqdn_required_for_ssl' => 'Et fuldt kvalificeret domænenavn, der resulterer i en offentlig IP-adresse, er påkrævet for at bruge SSL til denne node.', - ], - 'notices' => [ - 'allocations_added' => 'Tildelinger er blevet tilføjet til denne node.', - 'node_deleted' => 'Node er blevet slettet fra panelet.', - 'node_created' => 'Ny node blev oprettet. Du kan automatisk konfigurere daemonen på denne maskine ved at besøge \'Configuration\' fanen for denne node. Før du kan tilføje nogen servere, skal du først tildele mindst en IP-adresse og port.', - 'node_updated' => 'Node information er blevet opdateret. Hvis nogen daemon indstillinger blev ændret, skal du genstarte den for at anvende disse ændringer.', - 'unallocated_deleted' => 'Slettede alle ikke-tildelte porte for :ip.', - ], -]; diff --git a/lang/da/admin/server.php b/lang/da/admin/server.php deleted file mode 100644 index 764e11a5d5..0000000000 --- a/lang/da/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'Du forsøger at slette standard allokeringen for denne server, men der er ingen reserve allokeringer at bruge.', - 'marked_as_failed' => 'Denne server blev markeret som fejlet under en tidligere installationen. Nuværende status kan ikke ændres i denne tilstand.', - 'bad_variable' => 'Der opstod en valideringsfejl med :name variablen.', - 'daemon_exception' => 'Der opstod en fejl under forsøget på at kommunikere med daemonen, hvilket resulterede i en HTTP/:code responskode. Denne fejl er gemt i loggen. (request id: :request_id)', - 'default_allocation_not_found' => 'Den efterspurgte standard allokering blev ikke fundet i denne servers allokeringer.', - ], - 'alerts' => [ - 'startup_changed' => 'Startup konfigurationen for denne server er blevet opdateret. Hvis serverens egg blev ændret, vil en geninstallation starte nu.', - 'server_deleted' => 'Serveren er blevet slettet fra systemet.', - 'server_created' => 'Serveren blev oprettet på panelet. Det kan tage et par minutter at installere serveren.', - 'build_updated' => 'Serveren er blevet opdateret. Nogle ændringer kan kræve et genstart for at træde i kraft.', - 'suspension_toggled' => 'Server suspenderings status er blevet ændret til :status.', - 'rebuild_on_boot' => 'Denne server er blevet markeret til at kræve en geninstallation af Docker Container. Dette vil ske næste gang serveren startes.', - 'install_toggled' => 'Installations status for denne server er blevet ændret.', - 'server_reinstalled' => 'Denne server er blevet sat i kø til en geninstallation, der begynder nu.', - 'details_updated' => 'Server detaljerne er blevet opdateret.', - 'docker_image_updated' => 'Standard Docker container image er blevet opdateret. For at anvende dette skal du genstarte serveren.', - 'node_required' => 'Du skal have mindst en node konfigureret, før du kan tilføje en server til panelet.', - 'transfer_nodes_required' => 'Du skal have mindst to noder konfigureret for at starte en serveroverførsel.', - 'transfer_started' => 'Server flytning er blevet startet.', - 'transfer_not_viable' => 'Noden du har valgt har ikke nok disk plads eller hukommelse til at rumme denne server.', - ], -]; diff --git a/lang/da/admin/user.php b/lang/da/admin/user.php deleted file mode 100644 index f6d123fe65..0000000000 --- a/lang/da/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Kan ikke slette en bruger med aktive servere knyttet til deres konto. Slet deres servere før du fortsætter.', - 'user_is_self' => 'Kan ikke slette din egen konto.', - ], - 'notices' => [ - 'account_created' => 'Kontoen er blevet oprettet.', - 'account_updated' => 'Kontoen er blevet opdateret.', - ], -]; diff --git a/lang/da/auth.php b/lang/da/auth.php deleted file mode 100644 index 7cfbe886ea..0000000000 --- a/lang/da/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Log ind', - 'go_to_login' => 'Gå til log ind', - 'failed' => 'Ingen konto fundet med de angivne oplysninger.', - - 'forgot_password' => [ - 'label' => 'Glemt adgangskode?', - 'label_help' => 'Indtast din kontos e-mailadresse for at modtage instruktioner om nulstilling af din adgangskode.', - 'button' => 'Gendan konto', - ], - - 'reset_password' => [ - 'button' => 'Nulstil adgangskode og log ind', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'Denne konto kræver en anden form for godkendelse for at fortsætte. Indtast venligst koden genereret af din enhed for at fuldføre dette login.', - 'checkpoint_failed' => '2-factor godkendelses-token var ugyldig.', - ], - - 'throttle' => 'For mange login forsøg. Prøv igen om :sekunder sekunder.', - 'password_requirements' => 'Adgangskoden skal være mindst 8 tegn lang og bør være unik for dette website.', - '2fa_must_be_enabled' => 'Administratoren har krævet, at 2-factor godkendelse skal være aktiveret for din konto for at bruge panelet.', -]; diff --git a/lang/da/command/messages.php b/lang/da/command/messages.php deleted file mode 100644 index 833c81097c..0000000000 --- a/lang/da/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Indtast et brugernavn, bruger ID eller e-mailadresse', - 'select_search_user' => 'ID på brugeren der skal slettes (Indtast \'0\' for at søge igen)', - 'deleted' => 'Brugeren blev slettet fra panelet.', - 'confirm_delete' => 'Er du sikker på at du vil slette denne bruger fra panelet?', - 'no_users_found' => 'Ingen brugere blev fundet for det angivne søgeord.', - 'multiple_found' => 'Der blev fundet flere konti for den angivne bruger, det er ikke muligt at slette en bruger på grund af --no-interaction flaget.', - 'ask_admin' => 'Er denne bruger en administrator?', - 'ask_email' => 'E-mailadresse', - 'ask_username' => 'Brugernavn', - 'ask_name_first' => 'Fornavn', - 'ask_name_last' => 'Efternavn', - 'ask_password' => 'Adgangskode', - 'ask_password_tip' => 'Hvis du vil oprette en konto med en tilfældig adgangskode sendt til brugeren, skal du køre denne kommando igen (CTRL+C) og tilføje `--no-password` flaget.', - 'ask_password_help' => 'Adgangskoder skal være mindst 8 tegn og indeholde mindst et stort bogstav og et tal.', - '2fa_help_text' => [ - 'Denne kommando vil deaktivere 2-faktor godkendelse for en brugers konto, hvis det er aktiveret. Dette bør kun bruges som en konto recovery kommando, hvis brugeren er låst ude af deres konto.', - 'Hvis dette ikke er det du ønskede at gøre, tryk CTRL+C for at afslutte denne proces.', - ], - '2fa_disabled' => '2-Factor godkendelse er blevet deaktiveret for :email.', - ], - 'schedule' => [ - 'output_line' => 'Udsender job for første opgave i `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Sletter service backup fil :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Genopbygnings anmodning for ":name" (#:id) på node ":node" mislykkedes med fejl: :message', - 'reinstall' => [ - 'failed' => 'Geninstallation anmodning for ":name" (#:id) på node ":node" mislykkedes med fejl: :message', - 'confirm' => 'Du er ved at geninstallere en gruppe servere. Ønsker du at fortsætte?', - ], - 'power' => [ - 'confirm' => 'Du er ved at udføre en :action mod :count servere. Ønsker du at fortsætte?', - 'action_failed' => 'Power handling anmodning for ":name" (#:id) på node ":node" mislykkedes med fejl: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (f.eks. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Brugernavn', - 'ask_smtp_password' => 'SMTP Adgangskode', - 'ask_mailgun_domain' => 'Mailgun Domæne', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API nøgle', - 'ask_driver' => 'Hvilken driver skal bruges til at sende e-mails?', - 'ask_mail_from' => 'E-mail skal sendes fra', - 'ask_mail_name' => 'Navn som e-mails skal vises fra', - 'ask_encryption' => 'Krypterings metode der skal bruges', - ], - ], -]; diff --git a/lang/da/dashboard/account.php b/lang/da/dashboard/account.php deleted file mode 100644 index 6cc4b09ff4..0000000000 --- a/lang/da/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Opdater din e-mail', - 'updated' => 'Din e-mailadresse er blevet opdateret.', - ], - 'password' => [ - 'title' => 'Skift din adgangskode', - 'requirements' => 'Din nye adgangskode skal være mindst 8 tegn lang.', - 'updated' => 'Din adgangskode er blevet opdateret.', - ], - 'two_factor' => [ - 'button' => 'Konfigurer 2-Factor godkendelse', - 'disabled' => '2-factor godkendelse er blevet deaktiveret på din konto. Du vil ikke længere blive bedt om at angive en token ved login.', - 'enabled' => '2-factor godkendelse er blevet aktiveret på din konto! Fra nu af, når du logger ind, vil du blive bedt om at angive koden genereret af din enhed.', - 'invalid' => 'Den angivne token var ugyldig.', - 'setup' => [ - 'title' => 'Opsætning af 2-factor godkendelse', - 'help' => 'Kan ikke scanne koden? Indtast koden nedenfor i din applikation:', - 'field' => 'Indtast token', - ], - 'disable' => [ - 'title' => 'Deaktiver 2-factor godkendelse', - 'field' => 'Indtast token', - ], - ], -]; diff --git a/lang/da/dashboard/index.php b/lang/da/dashboard/index.php deleted file mode 100644 index 64aa7faf9d..0000000000 --- a/lang/da/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Søg efter servere...', - 'no_matches' => 'Der blev ikke fundet nogen servere, der matcher de angivne søgekriterier.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Hukommelse', -]; diff --git a/lang/da/exceptions.php b/lang/da/exceptions.php index 544bec5814..8586937cc8 100644 --- a/lang/da/exceptions.php +++ b/lang/da/exceptions.php @@ -4,6 +4,7 @@ 'daemon_connection_failed' => 'Der opstod en fejl under forsøget på at kommunikere med daemonen, hvilket resulterede i en HTTP/:code responskode. Denne fejl er blevet logget.', 'node' => [ 'servers_attached' => 'En node må ikke have nogen servere tilknyttet for at kunne slettes.', + 'error_connecting' => 'Fejl ved forbindelse til :node', 'daemon_off_config_updated' => 'Daemon konfiguration er blevet opdateret, men der opstod en fejl under forsøget på automatisk at opdatere konfigurationsfilen på daemonen. Du skal manuelt opdatere konfigurationsfilen (config.yml) for at daemonen kan anvende disse ændringer.', ], 'allocations' => [ @@ -11,7 +12,7 @@ 'too_many_ports' => 'Tilføjede af flere end 1000 porte i en enkelt række ad gangen understøttes ikke.', 'invalid_mapping' => 'Den angivne kortlægning for :port var ugyldig og kunne ikke behandles.', 'cidr_out_of_range' => 'CIDR notation tillader kun masker mellem /25 og /32.', - 'port_out_of_range' => 'Portene i en tildeling skal være større end 1024 og mindre end eller lig med 65535.', + 'port_out_of_range' => 'Porte i en tildeling skal være større end eller lig med 1024 og mindre end eller lig med 65535.', ], 'egg' => [ 'delete_has_servers' => 'Et æg med aktive servere tilknyttet kan ikke slettes fra panelet.', @@ -43,6 +44,8 @@ 'has_nodes' => 'Kan ikke slette en lokation, der har aktive noder tilknyttet.', ], 'users' => [ + 'is_self' => 'Du kan ikke slette din egen brugerkonto.', + 'has_servers' => 'Du kan ikke slette en bruger, der har aktive servere tilknyttet sin konto. Slet venligst deres servere, før du fortsætter.', 'node_revocation_failed' => 'Kunne ikke tilbagekalde nøgler på Node #:node. :error', ], 'deployment' => [ @@ -52,4 +55,10 @@ 'api' => [ 'resource_not_found' => 'Den anmodede ressource findes ikke på denne server.', ], + 'mount' => [ + 'servers_attached' => 'Et mount må ikke have nogen servere tilknyttet for at kunne slettes.', + ], + 'server' => [ + 'marked_as_failed' => 'Denne server har endnu ikke gennemført installationsprocessen, prøv venligst igen senere.', + ], ]; diff --git a/lang/da/pagination.php b/lang/da/pagination.php deleted file mode 100644 index 73b9aa3687..0000000000 --- a/lang/da/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Forrige', - 'next' => 'Næste »', -]; diff --git a/lang/da/passwords.php b/lang/da/passwords.php deleted file mode 100644 index dda647b037..0000000000 --- a/lang/da/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Adgangskode skal være mindst seks tegn lang og matche bekræftelsen.', - 'reset' => 'Din adgangskode er blevet nulstillet!', - 'sent' => 'Vi har sendt dig en e-mail med et link til at nulstille din adgangskode!', - 'token' => 'Denne adgangskode nulstillings token er ugyldig.', - 'user' => 'Vi kan ikke finde en bruger med den e-mailadresse.', -]; diff --git a/lang/da/search.php b/lang/da/search.php new file mode 100644 index 0000000000..6aadbf257a --- /dev/null +++ b/lang/da/search.php @@ -0,0 +1,9 @@ + 'Indtast mindst tre tegn for at begynde at søge.', + 'term' => [ + 'label' => 'Søgeord', + 'description' => 'Indtast et servernavn, uuid eller allokering for at begynde at søge.', + ], +]; diff --git a/lang/da/server/users.php b/lang/da/server/users.php deleted file mode 100644 index 628e31703a..0000000000 --- a/lang/da/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Tillader adgang til websocket for denne server.', - 'control_console' => 'Tillader brugeren at sende data til serverkonsollen.', - 'control_start' => 'Tillader brugeren at starte serveren', - 'control_stop' => 'Tillader brugeren at stoppe serveren.', - 'control_restart' => 'Tillader brugeren at genstarte serveren.', - 'control_kill' => 'Tillader brugeren at dræbe serveren.', - 'user_create' => 'Tillader brugeren at oprette nye brugerkonti til serveren.', - 'user_read' => 'Tillader brugeren tilladelse til at se brugere, der er tilknyttet denne server.', - 'user_update' => 'Tillader brugeren at ændre andre brugere, der er tilknyttet denne server.', - 'user_delete' => 'Tillader brugeren at slette andre brugere, der er tilknyttet denne server.', - 'file_create' => 'Tillader brugeren tilladelse til at oprette nye filer og mapper.', - 'file_read' => 'Tillader brugeren at se filer og mapper, der er tilknyttet denne serverinstans, samt se deres indhold.', - 'file_update' => 'Tillader brugeren at opdatere filer og mapper, der er tilknyttet serveren.', - 'file_delete' => 'Tillader brugeren at slette filer og mapper.', - 'file_archive' => 'Tillader brugeren at oprette filarkiver og udpakke eksisterende arkiver.', - 'file_sftp' => 'Tillader brugeren at udføre de ovennævnte filhandlinger ved hjælp af en SFTP-klient.', - 'allocation_read' => 'Tillader adgang til serverens styringssider for tildelinger.', - 'allocation_update' => 'Tillader brugeren tilladelse til at foretage ændringer i serverens tildelinger.', - 'database_create' => 'Tillader brugeren tilladelse til at oprette en ny database til serveren.', - 'database_read' => 'Tillader brugeren tilladelse til at se server databaser.', - 'database_update' => 'Tillader en bruger tilladelse til at foretage ændringer i en database. Hvis brugeren ikke har tilladelsen "Vis adgangskode" vil de heller ikke kunne ændre adgangskoden.', - 'database_delete' => 'Tillader en bruger tilladelse til at slette en database instans.', - 'database_view_password' => 'Tillader en bruger tilladelse til at se en database adgangskode i systemet.', - 'schedule_create' => 'Tillader en bruger at oprette en ny tidsplan for serveren.', - 'schedule_read' => 'Tillader en bruger tilladelse til at se tidsplaner for en server.', - 'schedule_update' => 'Tillader en bruger tilladelse til at foretage ændringer i en eksisterende server tidsplan.', - 'schedule_delete' => 'Tillader en bruger at slette en tidsplan for serveren.', - ], -]; diff --git a/lang/da/strings.php b/lang/da/strings.php deleted file mode 100644 index 4b161ab030..0000000000 --- a/lang/da/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email addresse', - 'user_identifier' => 'Brugernavn eller Email', - 'password' => 'Adgangskode', - 'new_password' => 'Ny adgangskode', - 'confirm_password' => 'Bekræft adgangskode', - 'login' => 'Log ind', - 'home' => 'Hjem', - 'servers' => 'Servere', - 'id' => 'ID', - 'name' => 'Navn', - 'node' => 'Node', - 'connection' => 'Forbindelse', - 'memory' => 'Hukommelse', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Søg', - 'suspended' => 'Suspenderet', - 'account' => 'Konto', - 'security' => 'Sikkerhed', - 'ip' => 'IP Adresse', - 'last_activity' => 'Sidste aktivitet', - 'revoke' => 'Tilbagekald', - '2fa_token' => 'Godkendelses Token', - 'submit' => 'Send', - 'close' => 'Luk', - 'settings' => 'Indstillinger', - 'configuration' => 'Konfiguration', - 'sftp' => 'SFTP', - 'databases' => 'Databaser', - 'memo' => 'Memo', - 'created' => 'Oprettet', - 'expires' => 'Udløber', - 'public_key' => 'Token', - 'api_access' => 'Api Adgang', - 'never' => 'aldrig', - 'sign_out' => 'Log ud', - 'admin_control' => 'Admin Kontrol', - 'required' => 'Påkrævet', - 'port' => 'Port', - 'username' => 'Brugernavn', - 'database' => 'Database', - 'new' => 'Ny', - 'danger' => 'Fare', - 'create' => 'Opret', - 'select_all' => 'Vælg Alle', - 'select_none' => 'Vælg Ingen', - 'alias' => 'Alias', - 'primary' => 'Primær', - 'make_primary' => 'Gør til primær', - 'none' => 'Ingen', - 'cancel' => 'Annuller', - 'created_at' => 'Oprettet den', - 'action' => 'Handling', - 'data' => 'Data', - 'queued' => 'I kø', - 'last_run' => 'Sidste Kørsel', - 'next_run' => 'Næste Kørsel', - 'not_run_yet' => 'Ikke Kørt Endnu', - 'yes' => 'Ja', - 'no' => 'Nej', - 'delete' => 'Slet', - '2fa' => '2FA', - 'logout' => 'Log ud', - 'admin_cp' => 'Admin Kontrolpanel', - 'optional' => 'Valgfri', - 'read_only' => 'Skrivebeskyttet', - 'relation' => 'Relation', - 'owner' => 'Ejer', - 'admin' => 'Admin', - 'subuser' => 'Underbruger', - 'captcha_invalid' => 'Den givne captcha var ugyldig.', - 'tasks' => 'Opgaver', - 'seconds' => 'Sekunder', - 'minutes' => 'Minutter', - 'under_maintenance' => 'Under vedligeholdelse', - 'days' => [ - 'sun' => 'Søndag', - 'mon' => 'Mandag', - 'tues' => 'Tirsdag', - 'wed' => 'Onsdag', - 'thurs' => 'Torsdag', - 'fri' => 'Fredag', - 'sat' => 'Lørdag', - ], - 'last_used' => 'Sidst brugt', - 'enable' => 'Aktiver', - 'disable' => 'Deaktiver', - 'save' => 'Gem', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/da/validation.php b/lang/da/validation.php index e2a449c613..cecf17750e 100644 --- a/lang/da/validation.php +++ b/lang/da/validation.php @@ -13,7 +13,7 @@ */ 'accepted' => ':attribute skal accepteres.', - 'active_url' => ':attribute er ikke en gyldig URL.', + 'active_url' => ':attribute er ikke et gyldigt URL.', 'after' => ':attribute skal være en dato efter :date.', 'after_or_equal' => ':attribute skal være en dato efter eller lig med :date.', 'alpha' => ':attribute må kun indeholde bogstaver.', @@ -25,10 +25,10 @@ 'between' => [ 'numeric' => ':attribute skal være mellem :min og :max.', 'file' => ':attribute skal være mellem :min og :max kilobytes.', - 'string' => ':attribute skal være mellem :min og :max tegn.', - 'array' => ':attribute skal have mellem :min og :max elementer.', + 'string' => ':attribute skal være imellem :min - :max tegn.', + 'array' => ':attribute skal have mellem :min - :max elementer.', ], - 'boolean' => ':attribute skal være sandt eller falsk.', + 'confirmed' => ':attribute bekræftelse stemmer ikke overens.', 'date' => ':attribute er ikke en gyldig dato.', 'date_format' => ':attribute stemmer ikke overens med formatet :format.', @@ -36,13 +36,13 @@ 'digits' => ':attribute skal være :digits cifre.', 'digits_between' => ':attribute skal være mellem :min og :max cifre.', 'dimensions' => ':attribute har ugyldige billeddimensioner.', - 'distinct' => ':attribute feltet har en duplikeret værdi.', + 'email' => ':attribute skal være en gyldig emailadresse.', - 'exists' => 'Den valgte :attribute er ugyldig.', + 'file' => ':attribute skal være en fil.', 'filled' => ':attribute skal udfyldes.', 'image' => ':attribute skal være et billede.', - 'in' => 'Den valgte :attribute er ugyldig.', + 'in_array' => ':attribute feltet findes ikke i :other.', 'integer' => ':attribute skal være et heltal.', 'ip' => ':attribute skal være en gyldig IP-adresse.', @@ -61,17 +61,13 @@ 'string' => ':attribute skal være mindst :min tegn.', 'array' => ':attribute skal have mindst :min elementer.', ], - 'not_in' => 'Den valgte :attribute er ugyldig.', + 'numeric' => ':attribute skal være et tal.', - 'present' => ':attribute feltet skal være til stede.', + 'regex' => ':attribute formatet er ugyldigt.', - 'required' => ':attribute skal udfyldes.', - 'required_if' => ':attribute skal udfyldes når :other er :value.', - 'required_unless' => ':attribute skal udfyldes medmindre :other findes i :values.', - 'required_with' => ':attribute skal udfyldes når :values er til stede.', + 'required_with_all' => ':attribute skal udfyldes når :values er til stede.', - 'required_without' => ':attribute skal udfyldes når :values ikke er til stede.', - 'required_without_all' => ':attribute skal udfyldes når ingen af :values er til stede.', + 'same' => ':attribute og :other skal matche.', 'size' => [ 'numeric' => ':attribute skal være :size.', @@ -79,10 +75,9 @@ 'string' => ':attribute skal være :size tegn.', 'array' => ':attribute skal indeholde :size elementer.', ], - 'string' => ':attribute skal være en streng.', + 'string' => ':attribute skal være tekst.', 'timezone' => ':attribute skal være en gyldig tidszone.', - 'unique' => ':attribute er allerede taget.', - 'uploaded' => ':attribute fejlede uploade.', + 'url' => ':attribute formatet er ugyldigt.', /* diff --git a/lang/de/activity.php b/lang/de/activity.php index 1de87ddc0a..ec6b9da238 100644 --- a/lang/de/activity.php +++ b/lang/de/activity.php @@ -10,28 +10,28 @@ 'auth' => [ 'fail' => 'Fehler beim Anmelden', 'success' => 'Angemeldet', - 'password-reset' => 'Passwort zurücksetzen', - 'reset-password' => 'Angefordertes Passwort zurücksetzen', + 'password-reset' => 'Passwort zurückgesetzt', 'checkpoint' => 'Zwei-Faktor-Authentifizierung angefordert', 'recovery-token' => 'Zwei-Faktor-Wiederherstellungs-Token verwendet', 'token' => '2FA Überprüfung abgeschlossen', - 'ip-blocked' => 'Blockierte Anfrage von nicht gelisteter IP-Adresse für :identifier', + 'ip-blocked' => 'Blockierte Anfrage von nicht gelisteter IP-Adresse für :identifier', 'sftp' => [ - 'fail' => 'Fehlgeschlagener SFTP Login', + 'fail' => 'Fehlgeschlagener SFTP-Login', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'E-Mail von :old auf :new geändert', + 'username-changed' => 'Benutzername von :old zu :new geändert', + 'email-changed' => 'E-Mail von :old auf :new geändert', 'password-changed' => 'Passwort geändert', ], 'api-key' => [ - 'create' => 'Neuer API-Schlüssel :identifier erstellt', - 'delete' => 'API-Schlüssel :identifier gelöscht', + 'create' => 'Neuer API-Schlüssel :identifier erstellt', + 'delete' => 'API-Schlüssel :identifier gelöscht', ], 'ssh-key' => [ - 'create' => 'SSH-Schlüssel :fingerprint zum Konto hinzugefügt', - 'delete' => 'SSH-Schlüssel :fingerprint aus dem Konto entfernt', + 'create' => 'SSH-Schlüssel :fingerprint zum Konto hinzugefügt', + 'delete' => 'SSH-Schlüssel :fingerprint aus dem Konto entfernt', ], 'two-factor' => [ 'create' => 'Zwei-Faktor-Authentifizierung aktiviert', @@ -39,9 +39,8 @@ ], ], 'server' => [ - 'reinstall' => 'Server neuinstalliert', 'console' => [ - 'command' => '":command" auf dem Server ausgeführt', + 'command' => '":command" auf dem Server ausgeführt', ], 'power' => [ 'start' => 'Server gestartet', @@ -50,81 +49,77 @@ 'kill' => 'Serverprozess beendet', ], 'backup' => [ - 'download' => 'Backup :name heruntergeladen', - 'delete' => 'Backup :name gelöscht', - 'restore' => 'Backup :name wiederhergestellt (gelöschte Dateien: :truncate)', - 'restore-complete' => 'Wiederherstellen des Backups :name abgeschlossen', - 'restore-failed' => 'Wiederherstellen des Backups :name fehlgeschlagen', - 'start' => 'Ein neues Backup :name gestartet', - 'complete' => 'Backup :name als abgeschlossen markiert', - 'fail' => 'Backup :name als fehlgeschlagen markiert', - 'lock' => 'Backup :name gesperrt', - 'unlock' => 'Backup :name entsperrt', + 'download' => 'Backup :name heruntergeladen', + 'delete' => 'Backup :name gelöscht', + 'restore' => 'Backup :name wiederhergestellt (gelöschte Dateien: :truncate)', + 'restore-complete' => 'Wiederherstellung von Backup :name abgeschlossen', + 'restore-failed' => 'Wiederherstellung des Backups :name fehlgeschlagen', + 'start' => 'Neues Backup :name gestartet', + 'complete' => 'Backup :name als Erfolgreich markiert', + 'fail' => 'Backup :name als fehlgeschlagen markiert', + 'lock' => 'Backup :name gesperrt', + 'unlock' => 'Backup :name entsperrt', + 'rename' => 'Sicherung umbenannt von ":old_name" in ":new_name"', ], 'database' => [ - 'create' => 'Datenbank :name erstellt', - 'rotate-password' => 'Passwort für Datenbank :name zurückgesetzt', - 'delete' => 'Datenbank :name gelöscht', + 'create' => 'Datenbank :name erstellt', + 'rotate-password' => 'Passwort für Datenbank :name zurückgesetzt', + 'delete' => 'Datenbank :name gelöscht', ], 'file' => [ - 'compress_one' => ':directory:file komprimiert', - 'compress_other' => ':count Dateien in :directory komprimiert', - 'read' => 'Inhalt von :file angesehen', - 'copy' => 'Kopie von :file erstellt', - 'create-directory' => 'Verzeichnis :directory:name erstellt', - 'decompress' => ':files in :directory entpackt', - 'delete_one' => ':directory:files.0 gelöscht', - 'delete_other' => ':count Dateien in :directory gelöscht', - 'download' => ':file heruntergeladen', - 'pull' => 'Remote-Datei von :url nach :directory heruntergeladen', - 'rename_one' => ':directory:files.0.from nach :directory:files.0.to umbenannt', - 'rename_other' => ':count Dateien in :directory umbenannt', - 'write' => 'Neuen Inhalt in :file geschrieben', - 'upload' => 'Datei-Upload begonnen', - 'uploaded' => ':directory:file hochgeladen', + 'compress' => ':directory:files komprimiert|:count Dateien in :directory komprimiert', + 'read' => 'Inhalt von :file angesehen', + 'copy' => 'Kopie von :file erstellt', + 'create-directory' => 'Verzeichnis :directory:name erstellt', + 'decompress' => ':file in :directory entpackt', + 'delete' => ':directory:files gelöscht|:count Dateien in :directory gelöscht', + 'download' => ':file heruntergeladen', + 'pull' => 'Datei von :url nach :directory heruntergeladen', + 'rename' => ':from wurde verschoben nach / umbenannt zu :to|:count Dateien wurden in :directory Umbenannt / Verschoben', + 'write' => 'Neuen Inhalt in :file geschrieben', + 'upload' => 'Dateiupload gestartet', + 'uploaded' => ':directory:file hochgeladen', ], 'sftp' => [ 'denied' => 'SFTP-Zugriff aufgrund von fehlenden Berechtigungen blockiert', - 'create_one' => ':files.0 erstellt', - 'create_other' => ':count Dateien erstellt', - 'write_one' => 'Inhalt von :files.0 geändert', - 'write_other' => 'Inhalt von :count Dateien geändert', - 'delete_one' => ':files.0 gelöscht', - 'delete_other' => ':count Dateien gelöscht', - 'create-directory_one' => 'Verzeichnis :files.0 erstellt', - 'create-directory_other' => ':count Verzeichnisse erstellt', - 'rename_one' => ':files.0.from zu :files.0.to umbenannt', - 'rename_other' => ':count Dateien umbenannt oder verschoben', + 'create' => ':files erstellt|:count neue Dateien erstellt', + 'write' => 'Inhalt von :files geändert|Inhalt von :count Dateien geändert', + 'delete' => ':files gelöscht|:count Dateien gelöscht', + 'create-directory' => 'Verzeichnis :files erstellt|:count Verzeichnisse erstellt', + 'rename' => ':from in :to umbenannt|:count Dateien umbenannt oder verschoben', ], 'allocation' => [ - 'create' => ':allocation zum Server hinzugefügt', - 'notes' => 'Notizen für :allocation von ":old" auf ":new" aktualisiert', - 'primary' => ':allocation als primäre Server-Zuweisung festgelegt', - 'delete' => ':allocation gelöscht', + 'create' => ':allocation zum Server hinzugefügt', + 'notes' => 'Notizen für :allocation von ":old" auf ":new" aktualisiert', + 'primary' => ':allocation als primäre Port-Allokation festgelegt', + 'delete' => ' :allocation gelöscht', ], 'schedule' => [ - 'create' => 'Zeitplan :name erstellt', - 'update' => 'Zeitplan :name aktualisiert', - 'execute' => 'Zeitplan :name manuell ausgeführt', - 'delete' => 'Zeitplan :name gelöscht', + 'create' => 'Zeitplan :name erstellt', + 'update' => 'Zeitplan :name aktualisiert', + 'execute' => 'Zeitplan :name manuell ausgeführt', + 'delete' => 'Zeitplan :name gelöscht', ], 'task' => [ - 'create' => 'Erstellte eine neue ":action"-Aufgabe für den :name Zeitplan', - 'update' => 'Aktualisierte die ":action" Aufgabe für den :name Zeitplan', - 'delete' => 'Aufgabe für den Zeitplan :name gelöscht', + 'create' => 'Neue Aufgabe ":action" für den Zeitplan :name erstellt', + 'update' => 'Aufgabe ":action" für den Zeitplan :name aktualisiert', + 'delete' => 'Aufgabe ":action" wurde aus dem Zeitplan :name gelöscht', ], 'settings' => [ - 'rename' => 'Server von :old zu :new umbenannt', - 'description' => 'Serverbeschreibung von :old zu :new geändert', + 'rename' => 'Server von ":old" zu ":new" umbenannt', + 'description' => 'Serverbeschreibung von ":old" zu ":new" geändert', + 'reinstall' => 'Server neuinstalliert', ], 'startup' => [ - 'edit' => 'Die Variable :variable von ":old" zu ":new" geändert', - 'image' => 'Das Docker-Image für den Server von :old auf :new aktualisiert', + 'edit' => 'Variable :variable von ":old" zu ":new" geändert', + 'image' => 'Docker-Image für den Server von :old auf :new geändert', + 'command' => 'Der Startbefehl für den Server wurde von :old zu :new geändert', ], 'subuser' => [ - 'create' => ':email als Unterbenutzer hinzugefügt', - 'update' => 'Die Unterbenutzer-Berechtigungen für :email aktualisiert', - 'delete' => 'Unterbenutzer :email entfernt', + 'create' => ':email als Unterbenutzer hinzugefügt', + 'update' => 'Unterbenutzer-Berechtigungen für :email aktualisiert', + 'delete' => 'Unterbenutzer :email entfernt', ], + 'crashed' => 'Server abgestürzt', ], ]; diff --git a/lang/de/admin/apikey.php b/lang/de/admin/apikey.php new file mode 100644 index 0000000000..e964d6ffd9 --- /dev/null +++ b/lang/de/admin/apikey.php @@ -0,0 +1,27 @@ + 'Application API-Schlüssel', + 'empty' => 'Keine API-Schlüssel', + 'whitelist' => 'IPv4-Adressen auf der Whitelist', + 'whitelist_help' => 'API-Schlüssel können so eingeschränkt werden, dass sie nur von bestimmten IPv4-Adressen aus funktionieren. Geben Sie jede Adresse in eine neue Zeile ein.', + 'whitelist_placeholder' => 'Beispiel: 127.0.0.1 oder 192.168.1.1', + 'description' => 'Beschreibung', + 'description_help' => 'Eine kurze Beschreibung, wofür dieser Schlüssel verwendet wird.', + 'nav_title' => 'API-Schlüssel', + 'model_label' => 'Application API-Schlüssel', + 'model_label_plural' => 'Application API-Schlüssel', + 'table' => [ + 'key' => 'Schlüssel', + 'description' => 'Beschreibung', + 'last_used' => 'Zuletzt verwendet', + 'created' => 'Erstellt am', + 'created_by' => 'Erstellt von', + 'never_used' => 'Noch nicht verwendet', + ], + 'permissions' => [ + 'none' => 'Keine', + 'read' => 'Lesen', + 'read_write' => 'Lesen & Schreiben', + ], +]; diff --git a/lang/de/admin/dashboard.php b/lang/de/admin/dashboard.php new file mode 100644 index 0000000000..f511924f2f --- /dev/null +++ b/lang/de/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Willkommen bei Pelican!', + 'version' => 'Version: :version', + 'advanced' => 'Erweitert', + 'server' => 'Server', + 'user' => 'Benutzer', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informationen für Entwickler', + 'content' => 'Vielen Dank für das Ausprobieren der Entwicklungsversion!', + 'extra_note' => 'Wenn Sie auf Probleme stoßen, melden Sie diese bitte auf GitHub.', + 'button_issues' => 'Issue erstellen', + 'button_features' => 'Features diskutieren', + ], + 'intro-update-available' => [ + 'heading' => 'Update verfügbar', + 'content' => ':latestVersion ist jetzt verfügbar! Lesen Sie unsere Dokumentation, um Ihr Panel zu aktualisieren.', + 'button_changelog' => 'Was ist neu?', + ], + 'intro-no-update' => [ + 'heading' => 'Ihr Panel ist aktuell', + 'content' => 'Sie verwenden derzeit :version. Ihr Panel ist aktuell!', + ], + 'intro-first-node' => [ + 'heading' => 'Keine Nodes gefunden', + 'content' => 'Es sieht so aus, als hätten Sie noch keine Nodes eingerichtet, aber keine Sorge, klicken Sie auf die Schaltfläche, um Ihre erste Node zu erstellen!', + 'extra_note' => 'Wenn Sie auf Probleme stoßen, melden Sie diese bitte auf GitHub.', + 'button_label' => 'Erste Node in Pelican erstellen', + ], + 'intro-support' => [ + 'heading' => 'Pelican unterstützen', + 'content' => 'Vielen Dank für die Verwendung von Pelican, dies konnte nur durch die Unterstützung von Ihnen, unseren Mitwirkenden und den Rest unserer Unterstützer erreicht werden!', + 'extra_note' => 'Wir freuen uns über jede Unterstützung.', + 'button_translate' => 'Beim Übersetzen helfen', + 'button_donate' => 'Direkt spenden', + ], + 'intro-help' => [ + 'heading' => 'Benötigen Sie Hilfe?', + 'content' => 'Schauen Sie sich zuerst die Dokumentation an! Wenn Sie immer noch Hilfe brauchen, besuchen Sie unseren Discord Server!', + 'button_docs' => 'Dokumentation lesen', + ], + ], +]; diff --git a/lang/de/admin/databasehost.php b/lang/de/admin/databasehost.php new file mode 100644 index 0000000000..b3aa329281 --- /dev/null +++ b/lang/de/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Datenbank Hosts', + 'model_label' => 'Datenbank Host', + 'model_label_plural' => 'Datenbank Hosts', + 'table' => [ + 'database' => 'Datenbank', + 'name' => 'Name', + 'host' => 'Host', + 'port' => 'Port', + 'name_helper' => 'Wenn dieses Feld leer gelassen wird, wird automatisch ein zufälliger Name generiert', + 'username' => 'Benutzername', + 'password' => 'Passwort', + 'remote' => 'Verbindungen von', + 'remote_helper' => 'Von wo aus Verbindungen erlaubt werden sollen. Leer lassen, um Verbindungen von überall zu erlauben.', + 'max_connections' => 'Max. Verbindungen', + 'created_at' => 'Erstellt am', + 'connection_string' => 'JDBC Verbindungsstring', + ], + 'error' => 'Fehler beim Verbinden mit dem Host', + 'host' => 'Host', + 'host_help' => 'Die IP-Adresse oder der Domain Name, der vom Panel verwendet werden soll, um eine Verbindung zum MySQL Host herzustellen, um neue Datenbanken zu erstellen.', + 'port' => 'Port', + 'port_help' => 'Der Port, auf dem MySQL für diesen Host läuft.', + 'max_database' => 'Max. Datenbanken', + 'max_databases_help' => 'Die maximale Anzahl von Datenbanken, die auf diesem Host erstellt werden können. Wenn das Limit erreicht ist, können keine neuen Datenbanken auf diesem Host erstellt werden. Leer ist unbegrenzt.', + 'display_name' => 'Anzeigename', + 'display_name_help' => 'Die IP-Adresse oder der Domain-Name, der dem Endbenutzer angezeigt werden soll.', + 'username' => 'Benutzername', + 'username_help' => 'Der Benutzername eines Kontos mit ausreichenden Berechtigungen, um neue Benutzer und Datenbanken auf dem System zu erstellen.', + 'password' => 'Passwort', + 'password_help' => 'Das Passwort für den Datenbank Benutzer.', + 'linked_nodes' => 'Verknüpfte Nodes', + 'linked_nodes_help' => 'Diese Einstellung bewirkt nur, dass standardmäßig auf dieser Datenbank Host genutzt wird, wenn eine Datenbank zu einem Server auf den ausgewählten Nodes hinzugefügt wird.', + 'connection_error' => 'Fehler beim Verbinden mit dem Datenbank Host', + 'no_database_hosts' => 'Keine Datenbank Hosts', + 'no_nodes' => 'Keine Nodes', + 'delete_help' => 'Datenbank Host hat Datenbanken', + 'unlimited' => 'Unbegrenzt', + 'anywhere' => 'Überall', + + 'rotate' => 'Rotieren', + 'rotate_password' => 'Passwort rotieren', + 'rotated' => 'Passwort rotiert', + 'rotate_error' => 'Passwort rotieren fehlgeschlagen', + 'databases' => 'Datenbanken', + + 'setup' => [ + 'preparations' => 'Vorbereitungen', + 'database_setup' => 'Datenbank Einrichtung', + 'panel_setup' => 'Panel Einrichtung', + + 'note' => 'Derzeit werden nur MySQL / MariaDB Datenbanken als Datenbank-Host unterstützt!', + 'different_server' => 'Sind das Panel und die Datenbank nicht auf dem gleichen Server?', + + 'database_user' => 'Datenbank-Benutzer', + 'cli_login' => 'Verwende mysql -u root -p um auf die mysql cli zuzugreifen.', + 'command_create_user' => 'Befehl um den Benutzer zu erstellen', + 'command_assign_permissions' => 'Befehl um Berechtigungen zuzuweisen', + 'cli_exit' => 'Um mysql cli zu beenden, führe exit aus.', + 'external_access' => 'Externer Zugriff', + 'allow_external_access' => ' +

Möglicherweise musst Du externen Zugriff auf diese MySQL-Instanz erlauben, um den Servern die Verbindung zu ermöglichen.

+
+

Um dies zu tun öffne my.cnf, welche je nach Betriebssystem und wie MySQL installiert wurde variiert. Du kannst /etc -iname my.cnf eingeben, um sie zu finden.

+
+

Öffne my.cnf, füge den Text unten am Ende der Datei hinzu und speichere sie:
+ [mysqld]
bind-address=0.0.0.0

+
+

Starte MySQL/ MariaDB neu, um diese Änderungen zu übernehmen. Dies überschreibt die Standard-MySQL-Konfiguration, die standardmäßig nur Anfragen von localhost akzeptiert. Das Aktualisieren dieser Option ermöglicht Verbindungen auf allen Schnittstellen und somit externe Verbindungen. Stelle sicher, dass Du den MySQL-Port (Standard 3306) in Deiner Firewall zulässt.

+ ', + ], +]; diff --git a/lang/de/admin/egg.php b/lang/de/admin/egg.php new file mode 100644 index 0000000000..a4da7a7c65 --- /dev/null +++ b/lang/de/admin/egg.php @@ -0,0 +1,110 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => 'Konfiguration', + 'process_management' => 'Prozessverwaltung', + 'egg_variables' => 'Egg Variablen', + 'install_script' => 'Installationsscript', + ], + 'import' => [ + 'file' => 'Datei', + 'url' => 'URL', + 'image_url' => 'Bild URL', + 'image_error' => 'Bild konnte nicht abgerufen werden', + 'image_too_large' => 'Bild zu groß. Limit ist 1024KB', + 'egg_help' => 'Dies sollte die unveränderte .json-Datei sein ( egg-minecraft.json )', + 'url_help' => 'URLs müssen direkt auf die unveränderte .json-Datei zeigen', + 'add_url' => 'Neue URL', + 'import_failed' => 'Import fehlgeschlagen', + 'import_success' => 'Import erfolgreich', + 'github' => 'Aus GitHub importieren', + 'refresh' => 'Aktualisieren', + 'import_image' => 'Importiere Bilder', + 'no_local_ip' => 'Lokale IP-Adressen sind nicht erlaubt', + 'unsupported_format' => 'Nicht unterstütztes Format. Unterstützte Formate: :formats', + 'invalid_url' => 'Die angegebene URL ist ungültig', + 'image_deleted' => 'Bild wurde gelöscht', + 'no_image' => 'Kein Bild angegeben', + 'image_updated' => 'Bild aktualisiert', + ], + 'export' => [ + 'modal' => 'Wie möchten Sie exportieren?', + 'as' => 'Als', + ], + 'in_use' => 'In Verwendung', + 'servers' => 'Server', + 'name' => 'Name', + 'egg_uuid' => 'Egg UUID', + 'egg_id' => 'Egg ID', + 'name_help' => 'Ein einfacher, lesbarer Name, der als Kennzeichnung für dieses Egg verwendet wird.', + 'author' => 'Author', + 'uuid_help' => 'Dies ist der einzigartige Identifikator für dieses Egg, welchen Wings als Identifikator verwendet.', + 'author_help' => 'Der Ersteller dieser Egg Version.', + 'author_help_edit' => 'Der Ersteller dieser Egg Version. Das Hochladen einer neuen Konfiguration von einem anderen Autor ändert diesen.', + 'description' => 'Beschreibung', + 'description_help' => 'Eine Beschreibung des Eggs, welche bei Bedarf im gesamten Panel angezeigt wird.', + 'add_startup' => 'Startbefehl hinzufügen', + 'startup_command' => 'Befehl', + 'startup_commands' => 'Start Befehl', + 'startup_name' => 'Anzeigename', + 'startup_help' => 'Start-Befehle für Server, die dieses Egg verwenden. Der erste Start-Befehl ist die Standardeinstellung.', + 'file_denylist' => 'Datei Verbotsliste', + 'file_denylist_help' => 'Eine Liste von Dateien, die der Endbenutzer nicht bearbeiten darf.', + 'features' => 'Features', + 'force_ip' => 'Ausgehende IP erzwingen', + 'force_ip_help' => 'Erzwingt ausgehenden Netzwerkverkehr, seine Source IP auf die IP der primären Zuweisung des Servers zu ändern (NAT). +Wird benötigt damit bestimmte Spiele richtig funktionieren, wenn der Node mehrere öffentliche IP-Adressen hat. +Das Aktivieren dieser Option deaktiviert das interne Netzwerk für alle Server, die dieses Egg verwenden, was dazu führt, dass sie nicht mehr auf andere interne Server auf dem selben Node zugreifen können.', + 'tags' => 'Tags', + 'update_url' => 'Update URL', + 'update_url_help' => 'URLs müssen direkt auf die RAW .json-Datei zeigen', + 'add_image' => 'Docker Image hinzufügen', + 'docker_images' => 'Docker Images', + 'docker_name' => 'Image Name', + 'docker_uri' => 'Image URI', + 'docker_help' => 'Docker Images für Server, die dieses Egg verwenden. Das erste Image ist die Standardeinstellung.', + + 'stop_command' => 'Stopp Befehl', + 'stop_command_help' => 'Der Befehl, der an Serverprozesse gesendet werden soll, um sie ordnungsgemäß zu stoppen. Wenn ein SIGINT gesendet werden soll, gebe ^C ein.', + 'copy_from' => 'Kopiere Einstellungen von', + 'copy_from_help' => 'Wenn Du die Einstellungen eines anderen Eggs benutzen möchtest, wähle es aus dem Menü oben aus.', + 'none' => 'Keine', + 'start_config' => 'Start Konfiguration', + 'start_config_help' => 'Liste der Werte, nach denen der Daemon beim Booten eines Servers suchen soll, um einen erfolgreichen Start zu erkennen.', + 'config_files' => 'Konfigurationsdateien', + 'config_files_help' => 'Dies sollte eine JSON-Darstellung von Konfigurationsdateien sein, die geändert werden sollen und welche Teile von ihnen geändert werden sollen.', + 'log_config' => 'Log Konfiguration', + 'log_config_help' => 'Dies sollte eine JSON-Darstellung sein, um dem Daemon zu zeigen, wo Log-Dateien gespeichert werden und ob der Daemon benutzerdefinierte Logs erstellen soll oder nicht.', + + 'environment_variable' => 'Env Variable', + 'default_value' => 'Standardwert', + 'user_permissions' => 'Benutzerberechtigungen', + 'viewable' => 'Sichtbar', + 'editable' => 'Bearbeitbar', + 'rules' => 'Regeln', + 'add_new_variable' => 'Neue Variable hinzufügen', + + 'error_unique' => 'Eine Variable mit diesem Namen existiert bereits.', + 'error_required' => 'Das Feld für Env Variable ist erforderlich.', + 'error_reserved' => 'Diese Env Variable ist reserviert und kann nicht verwendet werden.', + + 'script_from' => 'Skript von', + 'script_container' => 'Skript-Container', + 'script_entry' => 'Skript-Eintrag', + 'script_install' => 'Installationsscript', + 'no_eggs' => 'Keine Eggs', + 'no_servers' => 'Keine Server', + 'no_servers_help' => 'Diesem Egg sind keine Server zugeordnet.', + + 'update' => 'Aktualisieren|Ausgewählte aktualisieren', + 'updated' => 'Egg aktualisiert|:count/:total Eggs aktualisiert', + 'updated_failed' => ':count fehlgeschlagen', + 'updated_skipped' => ':count übersprungen', + 'update_question' => 'Bist du dir sicher, dass du das Egg aktualisieren möchtest?|Bist du dir sicher, dass du die ausgewählten Eggs aktualisieren möchtest?', + 'update_description' => 'Wenn du Änderungen am Egg vorgenommen hast, werden diese überschieben!|Wenn du Änderungen an den Eggs vorgenommen hast, werden diese überschrieben', + 'no_updates' => 'Keine Aktualisierungen für die ausgewählten Eggs verfügbar', +]; diff --git a/lang/de/admin/eggs.php b/lang/de/admin/eggs.php deleted file mode 100644 index 8fc69bce57..0000000000 --- a/lang/de/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Das Egg und die zugehörigen Variablen wurden erfolgreich importiert.', - 'updated_via_import' => 'Dieses Egg wurde mit der angegebenen Datei aktualisiert.', - 'deleted' => 'Das angeforderte Egg wurde erfolgreich aus dem Panel gelöscht.', - 'updated' => 'Egg Konfiguration wurde erfolgreich aktualisiert.', - 'script_updated' => 'Das Egg-Installationsskript wurde aktualisiert und wird bei der Installation von Servern ausgeführt.', - 'egg_created' => 'Ein neues Egg wurde erfolgreich erstellt.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Die Variable ":variable" wurde gelöscht und wird nach einem Serverneustart nicht mehr verfügbar sein.', - 'variable_updated' => 'Die Variable ":variable" wurde aktualisiert. Du musst alle Server neustarten, die diese Variable verwenden, um die Änderungen zu übernehmen.', - 'variable_created' => 'Neue Variable wurde erfolgreich erstellt und diesem Egg zugewiesen.', - ], - ], -]; diff --git a/lang/de/admin/health.php b/lang/de/admin/health.php new file mode 100644 index 0000000000..f5f1baf099 --- /dev/null +++ b/lang/de/admin/health.php @@ -0,0 +1,60 @@ + 'Status', + 'results_refreshed' => 'Ergebnisse der Statusprüfung aktualisiert', + 'checked' => 'Ergebnisse von :time', + 'refresh' => 'Aktualisieren', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Konnte keinen App Cache Wert setzen oder abrufen.', + 'failed' => 'Ein Fehler ist mit dem App Cache aufgetreten: :error', + ], + 'database' => [ + 'label' => 'Datenbank', + 'ok' => 'Ok', + 'failed' => 'Verbindung zur Datenbank konnte nicht hergestellt werden: :error', + ], + 'debugmode' => [ + 'label' => 'Debug Modus', + 'ok' => 'Debug Modus ist deaktiviert', + 'failed' => 'Der Debug Modus sollte :expected sein, ist aber tatsächlich :actual', + ], + 'environment' => [ + 'label' => 'Umgebung', + 'ok' => 'Ok, ist :actual', + 'failed' => 'Umgebung ist auf :actual gesetzt, :expected erwartet', + ], + 'nodeversions' => [ + 'label' => 'Node Versionen', + 'ok' => 'Nodes sind aktuell', + 'failed' => ':outdated/:all Nodes sind veraltet', + 'no_nodes_created' => 'Keine Nodes gefunden', + 'no_nodes' => 'Keine Nodes', + 'all_up_to_date' => 'Alle aktuell', + 'outdated' => ':outdated/:all veraltet', + ], + 'panelversion' => [ + 'label' => 'Panel Version', + 'ok' => 'Panel ist aktuell', + 'failed' => 'Installierte Version ist :currentVersion, die neueste Version ist allerdings :latestVersion', + 'up_to_date' => 'Aktuell', + 'outdated' => 'Veraltet', + ], + 'schedule' => [ + 'label' => 'Schedule', + 'ok' => 'Ok', + 'failed_last_ran' => 'Der letzte Durchlauf des Schedulers war vor mehr als :time Minuten', + 'failed_not_ran' => 'Der Scheduler wurde noch nicht ausgeführt.', + ], + 'useddiskspace' => [ + 'label' => 'Speicherplatz', + ], + ], + 'checks' => [ + 'successful' => 'Erfolgreich', + 'failed' => 'Fehlgeschlagen', + ], +]; diff --git a/lang/de/admin/log.php b/lang/de/admin/log.php new file mode 100644 index 0000000000..4938bd397e --- /dev/null +++ b/lang/de/admin/log.php @@ -0,0 +1,26 @@ + 'Super! Es gibt keine Fehler!', + 'total_logs' => 'Protokolleinträge', + 'error' => 'Fehler', + 'warning' => 'Warnung', + 'notice' => 'Hinweis', + 'info' => 'Info', + 'debug' => 'Debug', + 'navigation' => [ + 'panel_logs' => 'Panel Protokolle', + ], + 'actions' => [ + 'upload_logs' => 'Protokolleinträge hochladen?', + 'upload_logs_description' => 'Dies wird :file nach :url hochladen. Sind Sie sicher, dass Sie das tun möchten?', + 'view_logs' => 'Protokolleinträge anzeigen', + 'log_not_found' => 'Protokoll nicht gefunden!', + 'log_not_found_description' => 'Protokoll für :filename konnte nicht gefunden werden', + 'failed_to_upload' => 'Fehler beim Hochladen.', + 'failed_to_upload_description' => 'HTTP-Status: :status', + 'log_upload' => 'Protokoll hochgeladen!', + 'log_upload_action' => 'Protokolleinträge anzeigen', + 'upload_tooltip' => 'Hochladen nach :url', + ], +]; diff --git a/lang/de/admin/mount.php b/lang/de/admin/mount.php new file mode 100644 index 0000000000..d88976af1e --- /dev/null +++ b/lang/de/admin/mount.php @@ -0,0 +1,30 @@ + 'Mounts', + 'model_label' => 'Mount', + 'model_label_plural' => 'Mounts', + 'name' => 'Name', + 'name_help' => 'Einzigartiger Name, um diesen Mount von anderen zu unterscheiden.', + 'source' => 'Quelle', + 'source_help' => 'Dateipfad auf dem Hostsystem zum Mounten in einen Container.', + 'target' => 'Ziel', + 'target_help' => 'Wo der Mount innerhalb eines Containers zugänglich sein wird.', + 'read_only' => 'Schreibgeschützt?', + 'read_only_help' => 'Ist der Mount innerhalb des Containers schreibgeschützt?', + 'description' => 'Beschreibung', + 'description_help' => 'Eine längere Beschreibung für diesen Mount', + 'no_mounts' => 'Keine Mounts', + 'eggs' => 'Eggs', + 'nodes' => 'Nodes', + 'toggles' => [ + 'writable' => 'Schreibend', + 'read_only' => 'Nur lesend', + ], + 'table' => [ + 'name' => 'Name', + 'all_eggs' => 'Alle Eggs', + 'all_nodes' => 'Alle Nodes', + 'read_only' => 'Schreibgeschützt?', + ], +]; diff --git a/lang/de/admin/node.php b/lang/de/admin/node.php index 65148ec3a1..3c7bc86560 100644 --- a/lang/de/admin/node.php +++ b/lang/de/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'Der angegebene FQDN oder die IP-Adresse wird nicht mit einer gültigen IP-Adresse aufgelöst.', - 'fqdn_required_for_ssl' => 'Um SSL für diese Node nutzen zu können, ist ein FQDN erforderlich, welcher eine öffentliche IP besitzt.', + 'nav_title' => 'Nodes', + 'model_label' => 'Node', + 'model_label_plural' => 'Nodes', + 'create' => 'Knoten Erstellen', + 'tabs' => [ + 'overview' => 'Übersicht', + 'basic_settings' => 'Grundeinstellungen', + 'advanced_settings' => 'Erweiterte Einstellungen', + 'config_file' => 'Konfigurationsdatei', + 'diagnostics' => 'Diagnose', ], - 'notices' => [ - 'allocations_added' => 'Zuweisungen wurden erfolgreich zu dieser Node hinzugefügt.', - 'node_deleted' => 'Node wurde erfolgreich aus dem Panel entfernt.', - 'node_created' => 'Neue Node erfolgreich erstellt. Du kannst den Daemon auf dieser Maschine automatisch konfigurieren, indem du die Registerkarte "Konfiguration" aufrufst. Bevor du Server hinzufügen kannst, musst du zuerst mindestens eine IP-Adresse und einen Port zuweisen.', - 'node_updated' => 'Nodeinformationen wurden aktualisiert. Wenn irgendwelche Daemon-Einstellungen geändert wurden, musst du den Node neu starten, damit diese Änderungen wirksam werden.', - 'unallocated_deleted' => 'Alle nicht zugewiesenen Ports für :ip gelöscht.', + 'table' => [ + 'health' => 'Status', + 'name' => 'Name', + 'address' => 'Adresse', + 'public' => 'Öffentlich', + 'servers' => 'Server', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => 'Besitzer', + 'allocation_notes' => 'Notizen', + 'no_notes' => 'Keine Notizen', ], + 'node_info' => 'Node Informationen', + 'wings_version' => 'Wings Version', + 'cpu_threads' => 'CPU Threads', + 'architecture' => 'Architektur', + 'kernel' => 'Kernel', + 'unknown' => 'Unbekannt', + 'latest' => 'Neuste', + 'node_uuid' => 'Node UUID', + 'node_id' => 'Node ID', + + 'ip_address' => 'IP Adresse', + 'ip_help' => 'Normalerweise die öffentliche IP Ihres Rechners, es sei denn, Sie leiten den Port weiter.', + 'alias_help' => 'Optionaler Anzeigename, der Dir hilft Dich zu erinnern.', + 'refresh' => 'Neuladen', + 'domain' => 'Domain Name', + 'ssl_ip' => 'Du kannst SSL nicht mit einer IP-Adresse verwenden', + 'error' => 'Dies ist die Domain, die auf die IP-Adresse Deines Nodes verweist. Wenn Du das bereits eingerichtet hast, kannst Du das im nächsten Feld überprüfen!', + 'fqdn_help' => 'Dein Panel ist derzeit über ein SSL-Zertifikat gesichert, das bedeutet, dass Dein Node auch eines benötigt. Du musst einen Domänennamen verwenden, da es keine SSL-Zertifikate für IP-Adressen gibt.', + 'dns' => 'DNS Prüfung', + 'dns_help' => 'Damit können Sie wissen, ob Ihr DNS-Eintrag auf die richtige IP-Adresse verweist.', + 'valid' => 'Gültig', + 'invalid' => 'Ungültig', + 'port' => 'Port', + 'ports' => 'Ports', + 'port_help' => 'Wenn Du den Daemon hinter Cloudflare benutzt, solltest Du den Daemon-Port auf 8443 setzen, damit Websockets über SSL geproxiet werden können.', + 'connect_port' => 'Verbindungsport', + 'connect_port_help' => 'Verbindungen zu Wings werden diesen Port nutzen. Wenn ein Reverse-Proxy verwendet wird, kann dieser vom Standard Port abweichen. Wenn ein Cloudflare-Proxy verwendet wird sollte der Port 8443 genutzt werden.', + 'listen_port' => 'Listening Port', + 'listen_port_help' => 'Wings wird auf diesem Port gestartet', + 'display_name' => 'Anzeigename', + 'ssl' => 'Kommunikation über SSL', + 'panel_on_ssl' => 'Ihr Panel verwendet SSL,
also muss Ihr Daemon ebenfalls SSL verwenden.', + 'ssl_help' => 'Eine IP Adresse kann kein SSL verwenden.', + + 'tags' => 'Tags', + 'upload_limit' => 'Upload Limit', + 'upload_limit_help' => 'Geben Sie die maximale Dateigröße ein, die über den web-basierten Dateimanager hochgeladen werden kann.', + 'sftp_port' => 'SFTP Port', + 'sftp_alias' => 'SFTP Alias', + 'sftp_alias_help' => 'Alias für die SFTP-Adresse. Leer lassen, um den Node-FQDN zu verwenden.', + 'use_for_deploy' => 'Für Deployments verwenden?', + 'maintenance_mode' => 'Wartungsmodus', + 'maintenance_mode_help' => 'Wenn der Node als "In Wartung" markiert ist, können Benutzer nicht auf Server zugreifen, die auf diesem Node sind', + + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU Limit', + 'memory' => 'RAM', + 'memory_limit' => 'RAM Limit', + 'disk' => 'Speicherplatz', + 'disk_limit' => 'Speicherplatz Limit', + 'unlimited' => 'Unbegrenzt', + 'limited' => 'Begrenzt', + 'overallocate' => 'Überbelegung', + 'enabled' => 'Aktiviert', + 'disabled' => 'Deaktiviert', + 'yes' => 'Ja', + 'no' => 'Nein', + + 'instructions' => 'Anweisungen', + 'instructions_help' => 'Speichere diese Datei unter dem Namen config.yml im Stammverzeichnis des Daemons', + + 'auto_deploy' => 'Befehl zur automatischen Bereitstellung', + 'auto_question' => 'Wähle zwischen einer Standalone- und Docker-Installation.', + 'auto_label' => 'Typ', + 'standalone' => 'Standalone', + 'docker' => 'Docker', + 'auto_command' => 'Zum automatischen Konfigurieren deines Nodes führe bitte folgenden Command aus:', + 'reset_token' => 'Autorisierungs-Token zurücksetzen', + 'token_reset' => 'Der Daemon-Token wurde zurückgesetzt.', + 'reset_help' => 'Durch das Zurücksetzen des Daemon-Tokens werden alle Anfragen, die von dem alten Token stammen, ungültig. Dieser Token wird für alle sensiblen Vorgänge auf dem Daemon verwendet, einschließlich der Erstellung und Löschung von Servern. Wir empfehlen, diesen Token aus Sicherheitsgründen regelmäßig zu ändern.', + + 'no_nodes' => 'Keine Nodes', + 'none' => 'Keine', + 'cpu_chart' => 'CPU - :cpu% von :max%', + 'memory_chart' => 'RAM - :used von :total', + 'disk_chart' => 'Speicherplatz - :used von :total', + 'used' => 'Verwendet', + 'unused' => 'Frei', + + 'next_step' => 'Nächster Schritt', + 'node_has_servers' => 'Node hat Server', + 'create_allocation' => 'Allocation erstellen', + 'primary_allocation' => 'Primäre Allocation', + 'databases' => 'Datenbanken', + 'backups' => 'Backups', + + 'error_connecting' => 'Fehler beim Verbinden zu :node', + 'error_connecting_description' => 'Die Konfiguration konnte nicht automatisch von Wings aktualisiert werden. Sie müssen die Konfigurationsdatei manuell aktualisieren.', + 'allocation' => 'Allokation', + + 'diagnostics' => [ + 'header' => 'Knoten-Diagnose', + 'include_endpoints' => 'Endpunkte einschließen', + 'include_endpoints_hint' => 'Durch das Einschließen von Endpunkten werden Panel-URLs in den Protokollen angezeigt und NICHT verdeckt.', + 'include_logs' => 'Protokolle einschließen', + 'include_logs_hint' => 'Durch das Einschließen der Protokolle werden die letzten Protokolleinträge angezeigt und mögliche Probleme können leichter aufgespürt werden.', + 'run_diagnostics' => 'Diagnose durchführen', + 'upload_to_pelican' => 'Protokolle hochladen', + 'logs_pulled' => 'Protokolle abgerufen!', + 'logs_uploaded' => 'Protokolle hochgeladen', + 'upload_failed' => 'Hochladen der Protokolle fehlgeschlagen', + 'view_logs' => 'Protokolleinträge anzeigen', + 'pull' => 'Abrufen', + 'upload' => 'Hochladen', + 'clear' => 'Leeren', + '404' => 'Der angeforderte Diagnosebericht konnte nicht gefunden werden. Stellen Sie sicher, dass Wings auf dem neuesten Stand ist, und versuchen Sie es erneut.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Cloudflare Fehler', + 'body' => 'Dein Knoten ist nicht zugänglich mit Cloudflare', + ], + + 'bulk_update_ip' => 'IP-Adressen ersetzen', + 'bulk_update_ip_description' => 'Ersetzen Sie eine alte IP-Adresse durch eine neue für alle Allokationen. Dies ist nützlich, falls sich die IP-Adresse der Node ändert.', + 'update_ip' => 'IP-Adresse ersetzen', + 'old_ip' => 'Alte IP-Adresse', + 'new_ip' => 'Neue IP-Adresse', + 'no_allocations_to_update' => 'Es wurden keine Allokationen mit der ausgewählten alten IP-Adresse gefunden', + 'ip_updated' => ':count von :total Allokationen erfolgreich aktualisiert', + 'ip_update_failed' => ':count Allokation(en) konnte(n) nicht aktualisiert werden', ]; diff --git a/lang/de/admin/plugin.php b/lang/de/admin/plugin.php new file mode 100644 index 0000000000..5354ce30c7 --- /dev/null +++ b/lang/de/admin/plugin.php @@ -0,0 +1,61 @@ + 'Plugins', + 'model_label' => 'Plugin', + 'model_label_plural' => 'Plugins', + + 'name' => 'Name', + 'update_available' => 'Ein Update für dieses Plugin ist verfügbar', + 'author' => 'Author', + 'version' => 'Version', + 'category' => 'Kategorie', + 'status' => 'Status', + 'visit_website' => 'Webseite besuchen', + 'settings' => 'Einstellungen', + 'install' => 'Installieren', + 'uninstall' => 'Deinstallieren', + 'update' => 'Aktualisieren', + 'enable' => 'Aktivieren', + 'disable' => 'Deaktivieren', + 'import_from_file' => 'Von Datei importieren', + 'import_from_url' => 'Von URL importieren', + 'no_plugins' => 'Keine Plugins', + 'all' => 'Alle', + 'change_load_order' => 'Ladereihenfolge ändern', + 'apply_load_order' => 'Ladereihenfolge anwenden', + + 'enable_theme_modal' => [ + 'heading' => 'Theme bereits aktiviert', + 'description' => 'Du hast bereits ein Theme aktiviert. Die Aktivierung mehrerer Themes kann zu visuellen Fehlern führen. Möchtest Du fortfahren?', + ], + + 'status_enum' => [ + 'not_installed' => 'Nicht installiert', + 'disabled' => 'Deaktiviert', + 'enabled' => 'Aktiviert', + 'errored' => 'Fehlerhaft', + 'incompatible' => 'Inkompatibel', + ], + + 'category_enum' => [ + 'plugin' => 'Plugin', + 'theme' => 'Theme', + 'language' => 'Sprachpaket', + ], + + 'notifications' => [ + 'installed' => 'Plugin installiert', + 'install_error' => 'Plugin konnte nicht installiert werden', + 'uninstalled' => 'Plugin deinstalliert', + 'uninstall_error' => 'Plugin konnte nicht deinstalliert werden', + 'deleted' => 'Plugin gelöscht', + 'updated' => 'Plugin aktualisiert', + 'update_error' => 'Plugin konnte nicht aktualisiert werden', + 'enabled' => 'Plugin aktiviert', + 'disabled' => 'Plugin deaktiviert', + 'imported' => 'Plugin importiert', + 'import_exists' => 'Ein Plugin mit dieser ID existiert bereits', + 'import_failed' => 'Plugin konnte nicht aktualisiert werden', + ], +]; diff --git a/lang/de/admin/role.php b/lang/de/admin/role.php new file mode 100644 index 0000000000..cf78a79134 --- /dev/null +++ b/lang/de/admin/role.php @@ -0,0 +1,17 @@ + 'Rollen', + 'model_label' => 'Rolle', + 'model_label_plural' => 'Rollen', + 'no_roles' => 'Keine Rollen', + 'name' => 'Name', + 'permissions' => 'Berechtigungen', + 'in_use' => 'In Verwendung', + 'all' => 'Alle', + 'root_admin' => ':role besitzt alle Berechtigungen.', + 'root_admin_delete' => 'Root Admin kann nicht gelöscht werden', + 'users' => 'Benutzer', + 'nodes' => 'Nodes', + 'nodes_hint' => 'Leer lassen für Zugriff auf alle Nodes', +]; diff --git a/lang/de/admin/server.php b/lang/de/admin/server.php index c6eea1b803..75f0af9100 100644 --- a/lang/de/admin/server.php +++ b/lang/de/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Du versuchst die Standard-Zuweisung für diesen Server zu löschen, es gibt aber keine Fallback-Zuweisung.', - 'marked_as_failed' => 'Dieser Server wurde als fehlgeschlagen einer vorherigen Installation markiert. Der aktuelle Status kann in diesem Zustand nicht umgestellt werden.', - 'bad_variable' => 'Es gab einen Validierungsfehler mit der Variable :name', - 'daemon_exception' => 'Es gab einen Fehler beim Versuch mit dem Daemon zu kommunizieren, was zu einem HTTP/:code Antwortcode führte. Diese Ausnahme wurde protokolliert. (Anfrage-Id: :request_id)', - 'default_allocation_not_found' => 'Die angeforderte Standard-Zuweisung wurde in den Zuweisungen dieses Servers nicht gefunden.', + 'nav_title' => 'Server', + 'model_label' => 'Server', + 'model_label_plural' => 'Server', + 'no_servers' => 'Keine Server', + 'create' => 'Server erstellen', + 'next_step' => 'Nächster Schritt', + 'ip_address' => 'IP Adresse', + 'ip_address_helper' => 'In der Regel die öffentliche IP des Nodes, es sei denn Portfreigaben werden genutzt.', + 'port' => 'Port', + 'ports' => 'Ports', + 'alias' => 'Alias', + 'alias_helper' => 'Optionaler Anzeigename, um sich leichter daran zu erinnern, worum es geht.', + 'locked' => 'Sperrstatus', + 'locked_helper' => 'Benutzer können gesperrte Allokationen nicht löschen', + 'lock' => 'Sperren', + 'unlock' => 'Entsperren', + 'name' => 'Name', + 'external_id' => 'Externe ID', + 'owner' => 'Besitzer', + 'description' => 'Beschreibung', + 'install_script' => 'Installations-Script ausführen?', + 'start_after' => 'Nach Installation starten?', + 'yes' => 'Ja', + 'no' => 'Nein', + 'skip' => 'Überspringen', + 'primary' => 'Primär', + 'already_primary' => 'Bereits als Primär gesetzt', + 'make_primary' => 'Als Primär festlegen', + 'startup_cmd' => 'Start Befehl', + 'startup_name' => 'Startup Name', + 'default_startup' => 'Standard Startbefehl', + 'startup_placeholder' => 'Benutzerdefinierter Startbefehl eingeben', + 'variables' => 'Variablen', + 'resource_limits' => 'Ressourcenbegrenzung', + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU Limit', + 'cpu_helper' => '100% entspricht einem CPU Thread.', + 'unlimited' => 'Unbegrenzt', + 'limited' => 'Begrenzt', + 'enabled' => 'Aktiviert', + 'disabled' => 'Deaktiviert', + 'memory' => 'Arbeitsspeicher', + 'memory_limit' => 'Speicherlimit', + 'memory_helper' => 'Wings fügt diesem Wert Overhead hinzu, wenn der Container erstellt wird, um sicherzustellen, dass er nicht abstürzt, wenn der maximale Speicher verwendet wird.', + 'disk' => 'Speicherplatz', + 'disk_limit' => 'Speicherplatz-Limits', + 'advanced_limits' => 'Erweiterte Limits', + 'cpu_pin' => 'CPU-Pinning', + 'threads' => 'Gepinnte Threads', + 'pin_help' => 'Pinned Thread hinzufügen, z.B. 0 oder 2-4', + 'swap' => 'Swap-Speicher', + 'swap_limit' => 'Swap Speicherlimit', + 'oom' => 'OOM Killer', + 'feature_limits' => 'Feature Limits', + 'docker_settings' => 'Docker Einstellungen', + 'docker_image' => 'Docker Image', + 'image_name' => 'Image-Name', + 'primary_allocation' => 'Primäre Allokation', + 'image' => 'Image', + 'image_placeholder' => 'Benutzerdefiniertes Image eingeben', + 'container_labels' => 'Containerlabels:', + 'title' => 'Titel', + 'actions' => 'Aktionen', + 'console' => 'Konsole', + 'suspend' => 'Sperren', + 'unsuspend' => 'Entsperren', + 'reinstall' => 'Neu installieren', + 'reinstall_help' => 'Dadurch wird der Server mit dem zugewiesenen Egg-Installationsskript neu installiert.', + 'reinstall_modal_heading' => 'Bist du dir sicher, dass du den Server neu Installieren möchtest?', + 'reinstall_modal_description' => '!! Dies kann zu unwiederbringlichen Datenverlust führen !!', + 'server_status' => 'Server Status', + 'view_install_log' => 'Installationsprotokoll anzeigen', + 'uuid' => 'UUID', + 'node' => 'Node', + 'short_uuid' => 'Kurze UUID', + 'toggle_install' => 'Installationsstatus umschalten', + 'toggle_install_help' => 'Wenn Du den Installationsstatus von „nicht installiert“ auf „installiert“ oder umgekehrt ändern musst, kannst Du das mit dieser Schaltfläche tun.', + 'toggle_install_failed_header' => 'Server ist im fehlgeschlagenen Zustand', + 'toggle_install_failed_desc' => 'Möchtest du den Server neu installieren, um das Problem zu beheben?', + 'transfer' => 'Übertragen', + 'transfer_help' => 'Übertrage den Server auf einen anderen mit diesem Panel verbundenen Node.
Warnung! Diese Funkion ist experimentell. Erstelle vorher ein manuelles Backup, um Datenverlust zu vermeiden.', + 'condition' => 'Zustand', + 'suspend_all' => 'Alle Server sperren', + 'unsuspend_all' => 'Alle Server Entsperren', + 'select_allocation' => 'Allokation auswählen', + 'new_allocation' => 'Neue Allokation erstellen', + 'additional_allocations' => 'Zusätzliche Allokationen', + 'select_additional' => 'Zusätzliche Allokationen auswählen', + 'no_variables' => 'Das ausgewählte Egg hat keine Variablen!', + 'select_egg' => 'Wähle zuerst ein Egg aus, um seine Variablen anzuzeigen!', + 'allocations' => 'Allokationen', + 'databases' => 'Datenbanken', + 'no_databases' => 'Für diesen Server existieren keine Datenbanken', + 'delete_db' => 'Bist Du sicher, dass Du löschen möchtest', + 'delete_db_heading' => 'Datenbank löschen?', + 'backups' => 'Backups', + 'egg' => 'Egg', + 'mounts' => 'Mounts', + 'no_mounts' => 'Für diese Node existieren keine Mounts', + 'create_database' => 'Datenbank erstellen', + 'no_db_hosts' => 'Keine Datenbank Hosts', + 'failed_to_create' => 'Fehler beim Erstellen der Datenbank', + 'change_egg' => 'Egg ändern', + 'new_egg' => 'Neues Egg', + 'keep_old_variables' => 'Alte Variablen wenn möglich beibehalten?', + 'create_allocation' => 'Allocation erstellen', + 'add_allocation' => 'Allocation hinzufügen', + 'view' => 'Anzeigen', + 'no_log' => 'Kein Log verfügbar', + 'tabs' => [ + 'information' => 'Informationen', + 'egg_configuration' => 'Egg-Konfiguration', + 'environment_configuration' => 'Environment Konfiguration', ], - 'alerts' => [ - 'startup_changed' => 'Die Start-Konfiguration für diesen Server wurde aktualisiert. Wenn das Egg dieses Servers geändert wurde, wird jetzt eine Neuinstallation durchgeführt.', - 'server_deleted' => 'Der Server wurde erfolgreich aus dem System gelöscht.', - 'server_created' => 'Server wurde erfolgreich im Panel erstellt. Bitte gib dem Daemon ein paar Minuten, um diesen Server zu installieren.', - 'build_updated' => 'Die Build-Details für diesen Server wurden aktualisiert. Einige Änderungen erfordern möglicherweise einen Neustart, um wirksam zu werden.', - 'suspension_toggled' => 'Serversperrung wurde auf :status gesetzt.', - 'rebuild_on_boot' => 'Dieser Server benötigt einen Container-Rebuild. Dieser wird beim nächsten Start des Servers durchgeführt.', - 'install_toggled' => 'Der Installationsstatus für diesen Server wurde umgestellt.', - 'server_reinstalled' => 'Dieser Server steht für eine Neuinstallation in der Warteschlange.', - 'details_updated' => 'Serverdetails wurden erfolgreich aktualisiert.', - 'docker_image_updated' => 'Das Standard-Docker-Image für diesen Server wurde erfolgreich geändert. Um diese Änderung zu übernehmen, muss ein Neustart durchgeführt werden.', - 'node_required' => 'Du musst mindestens eine Node konfiguriert haben, bevor Du einen Server zu diesem Panel hinzufügen kannst.', - 'transfer_nodes_required' => 'Du musst mindestens zwei Nodes konfiguriert haben, bevor Du Server übertragen kannst.', - 'transfer_started' => 'Server-Übertragung wurde gestartet.', - 'transfer_not_viable' => 'Die ausgewählte Node verfügt nicht über den benötigten Arbeitsspeicher oder Speicherplatz, um diesen Server unterzubringen.', + 'notifications' => [ + 'server_suspension' => 'Server ist gesperrt', + 'server_suspended' => 'Server wurde gesperrt', + 'server_already_suspended' => 'Der Server ist bereits gesperrt.', + 'server_suspend_help' => 'Dadurch wird der Server gesperrt, alle laufenden Prozesse gestoppt und der Benutzer sofort daran gehindert, auf seine Dateien zuzugreifen oder den Server anderweitig über das Panel oder die API zu verwalten.', + 'server_unsuspend_help' => 'Dadurch wird die Sperrung des Servers aufgehoben und der normale Zugriff wiederhergestellt.', + 'server_unsuspended' => 'Der Server wurde entsperrt', + 'error_server_delete' => 'Server konnte nicht sicher gelöscht werden.', + 'error_server_delete_body' => 'Du kannst das Löschen erzwingen.', + 'create_failed' => 'Server konnte nicht erstellt werden', + 'invalid_port_range' => 'Ungültige Port Reichweite', + 'invalid_port_range_body' => 'Die Port-Range enthält keine gültigen Zahlen: :port', + 'too_many_ports' => 'Zu viele Ports auf einmal!', + 'too_many_ports_body' => 'Das aktuelle Port Limit liegt bei :limit Ports auf einmal.', + 'invalid_port' => 'Port nicht im gültigen Bereich', + 'invalid_port_body' => ':i liegt nicht in der gültigen Port Reichweite zwischen :portFloor-:portCeil', + 'already_exists' => 'Port wird bereits verwendet', + 'already_exists_body' => ':i ist bereits mit einer Allokation versehen', + 'error_connecting' => 'Verbindungsfehler zu :node', + 'error_connecting_description' => 'Die Konfiguration konnte nicht automatisch mit Wings synchronisiert werden, du wirst den Server manuell Neustarten müssen.', + 'install_toggled' => 'Installationsstatus umgeschaltet', + 'install_toggle_failed' => 'Installationsstatus konnte nicht umgeschaltet werden', + 'reinstall_started' => 'Neuinstallation gestartet', + 'reinstall_failed' => 'Konnte Neuinstallation nicht starten', + 'log_failed' => 'Konnte keine Verbindung zu Wings herstellen, um Server-Installationsprotokoll abzurufen.', + 'transfer_started' => 'Übertragung gestartet', + 'transfer_failed' => 'Übertragung gescheitert', + 'already_transfering' => 'Der Server wird derzeit übertragen.', ], + 'notes' => 'Notizen', + 'no_notes' => 'Keine Notizen', + 'none' => 'Keine', ]; diff --git a/lang/de/admin/setting.php b/lang/de/admin/setting.php new file mode 100644 index 0000000000..f6b4ceb3e5 --- /dev/null +++ b/lang/de/admin/setting.php @@ -0,0 +1,157 @@ + 'Einstellungen', + 'save_success' => 'Einstellungen gespeichert', + 'save_failed' => 'Einstellungen konnten nicht gespeichert werden', + 'navigation' => [ + 'general' => 'Allgemein', + 'captcha' => 'Captcha', + 'mail' => 'E-Mail', + 'backup' => 'Backup', + 'oauth' => 'OAuth', + 'misc' => 'Verschiedenes', + ], + 'general' => [ + 'app_name' => 'App Name', + 'app_logo' => 'App-Logo', + 'app_logo_help' => 'Das Logo muss im "public" Verzeichnis, welches sich im root Verzeichnis des Panels befindet, platziert werden. Lasse das Feld leer um stattdessen den App-Namen zu verwenden.', + 'app_favicon' => 'App Favicon', + 'app_favicon_help' => 'Das Favicon muss im "public" Verzeichnis, welches sich im root Verzeichnis des Panels befindet, platziert werden.', + 'debug_mode' => 'Debugmodus', + 'navigation' => 'Navigation', + 'default_navigation' => 'Standard Navigationstyp', + 'sidebar' => 'Seitenleiste', + 'topbar' => 'Obere Leiste', + 'mixed' => 'Gemischt (Seitenleiste/Obere Leiste)', + 'unit_prefix' => 'Einheitenpräfix', + 'decimal_prefix' => 'Dezimale Einheit (MB/GB)', + 'binary_prefix' => 'Binäre Einheit (MiB/GiB)', + '2fa_requirement' => '2FA Erforderlich', + 'not_required' => 'Nicht Erforderlich', + 'admins_only' => 'Nur für Admins Erforderlich', + 'all_users' => 'Für alle Benutzer Erforderlich', + 'trusted_proxies' => 'Zulässige Proxies', + 'trusted_proxies_help' => 'Neue IP oder IP Bereich', + 'clear' => 'Leeren', + 'set_to_cf' => 'Auf Cloudflare-IPs setzen', + 'display_width' => 'Anzeigenbreite', + 'avatar_provider' => 'Avatar-Provider', + 'uploadable_avatars' => 'Benutzern erlauben, einen eigenen Avatar hochzuladen?', + ], + 'captcha' => [ + 'enable' => 'Aktivieren', + 'disable' => 'Deaktivieren', + 'info_label' => 'Info', + 'info' => 'Du kannst die Schlüssel im Cloudflare Dashboard generieren. Ein Cloudflare Account wird benötigt.', + 'site_key' => 'Site-Schlüssel', + 'secret_key' => 'Geheimer Schlüssel', + 'verify' => 'Domain Verifizieren?', + ], + 'mail' => [ + 'mail_driver' => 'E-Mail-Treiber', + 'test_mail' => 'Test E-Mail senden', + 'test_mail_sent' => 'Test E-Mail wurde verschickt', + 'test_mail_failed' => 'Test E-Mail konnte nicht verschickt werden', + 'from_settings' => 'Absendereinstellungen', + 'from_settings_help' => 'Setze die Adresse und den Namen vom Absender in der E-Mail.', + 'from_address' => 'E-Mail-Adresse vom Absender', + 'from_name' => 'Name vom Absender', + 'smtp' => [ + 'smtp_title' => 'SMTP Konfiguration', + 'host' => 'Host', + 'port' => 'Port', + 'username' => 'Benutzername', + 'password' => 'Passwort', + 'scheme' => 'Schema', + ], + 'mailgun' => [ + 'mailgun_title' => 'Mailgun Konfiguration', + 'domain' => 'Domain', + 'secret' => 'Geheimer Schlüssel', + 'endpoint' => 'Endpunkt', + ], + ], + 'backup' => [ + 'backup_driver' => 'Backup Treiber', + 'throttle' => 'Begrenzungen', + 'throttle_help' => 'Konfiguriere, wie viele Backups in einem Zeitraum erstellt werden können. Setze den Zeitraum auf 0, um die Begrenzung aufzuheben', + 'limit' => 'Limit', + 'period' => 'Zeitraum', + 'seconds' => 'Sekunden', + 's3' => [ + 's3_title' => 'S3 Konfiguration', + 'default_region' => 'Standardmäßige Region', + 'access_key' => 'Zugangsschlüssel-ID', + 'secret_key' => 'Geheimer Zugangsschlüssel', + 'bucket' => 'Bucket', + 'endpoint' => 'Endpunkt', + 'use_path_style_endpoint' => 'Path Style Endpoint benutzen', + ], + ], + 'oauth' => [ + 'enable' => 'Aktivieren', + 'enable_schema' => 'Aktivieren', + 'disable' => 'Deaktivieren', + 'client_id' => 'Client ID', + 'client_secret' => 'Client Secret', + 'redirect' => 'Umleitungs-URL', + 'web_api_key' => 'Web API Key', + 'base_url' => 'Base URL', + 'display_name' => 'Anzeigename', + 'auth_url' => 'Authorization callback URL', + 'create_missing_users' => 'Automatisch erstellen', + 'link_missing_users' => 'Fehlende Benutzer automatische verknüpfen', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Automatisches Erstellen von Allokationen', + 'helper' => 'Stelle ein, ob Benutzer in der Kundenansicht Allokationen erstellen können.', + 'question' => 'Benutzern erlauben Allokationen zu erstellen?', + 'create_new' => 'Neue Ports erstellen, falls keine frei sind?', + 'create_new_help' => 'Wenn aktiviert, werden neue Port-Zuweisungen erstellt. Wenn deaktiviert, werden nur bereits vorhandene, nicht zugewiesene Ports verwendet. Beide Optionen berücksichtigen dabei den unten angegebenen Port-Bereich.', + 'start' => 'Startport', + 'end' => 'Endport', + ], + 'mail_notifications' => [ + 'title' => 'E-Mail Benachrichtigungen', + 'helper' => 'Stelle ein, welche E-Mail Benachrichtigung zum Benutzer geschickt werden sollen.', + 'server_installed' => 'Server installiert', + 'server_reinstalled' => 'Server reinstalliert', + ], + 'connections' => [ + 'title' => 'Verbindungen', + 'helper' => 'Timeouts von Anfragen', + 'request_timeout' => 'Anfragen-Timeout', + 'connection_timeout' => 'Verbindungstimeout', + 'seconds' => 'Sekunden', + ], + 'activity_log' => [ + 'title' => 'Activity Logs', + 'helper' => 'Konfiguriere, wie oft alte Activity Logs gelöscht werden soll und ob Adminaktivitäten geloggt werden sollen.', + 'prune_age' => 'Maximales Alter', + 'days' => 'Tage', + 'log_admin' => 'Admin Aktivitäten verstecken?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Definiert das Limit von Anfragen pro Minute, die ausgeführt werden können.', + 'client_rate' => 'Nutzer API Anfragen Limit', + 'app_rate' => 'Applikation API Anfragen Limit', + 'rpm' => 'Anfragen pro Minute', + ], + 'server' => [ + 'title' => 'Servers', + 'helper' => 'Einstellungen für Server', + 'edit_server_desc' => 'Erlaube Benutzern die Beschreibung zu verändern', + 'console_font_upload' => 'Konsolenschrift-Upload', + 'console_font_hint' => 'Nur *.ttf Fonts werden unterstützt. Mono Fonts werden dringend empfohlen!', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => 'Konfiguriere, wie oft alte Webhook-Logs gelöscht werden sollen', + 'prune_age' => 'Maximales Alter', + 'days' => 'Tage', + ], + ], +]; diff --git a/lang/de/admin/user.php b/lang/de/admin/user.php deleted file mode 100644 index 4357657dc8..0000000000 --- a/lang/de/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Ein Benutzer mit aktiven Servern, die mit seinem Konto verbunden sind, kann nicht gelöscht werden. Bitte lösche seine Server, bevor du fortfährst.', - 'user_is_self' => 'Du kannst dein eigenes Benutzerkonto nicht löschen.', - ], - 'notices' => [ - 'account_created' => 'Konto wurde erfolgreich erstellt.', - 'account_updated' => 'Konto wurde erfolgreich aktualisiert.', - ], -]; diff --git a/lang/de/admin/webhook.php b/lang/de/admin/webhook.php new file mode 100644 index 0000000000..5cddadfa77 --- /dev/null +++ b/lang/de/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Endpunkt', + 'description' => 'Beschreibung', + 'no_webhooks' => 'Keine Webhooks', + 'help' => 'Hilfe', + 'help_text' => 'Du musst den Variablennamen zwischen {{ }} einschließen. Wenn Du z. B. den Namen aus der API abrufen möchten, kannst Du {{name}} verwenden.', + 'test_now' => 'Jetzt Testen', + 'test_now_help' => 'Dies löst das `created: Server` Event aus', + 'table' => [ + 'description' => 'Beschreibung', + 'endpoint' => 'Endpunkt', + ], + 'headers' => 'Kopfzeilen', + 'events' => 'Ereignisse', + 'regular' => 'Regelmäßig', + 'reset_headers' => 'Kopfzeilen zurücksetzen', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Nachricht', + 'username' => 'Nutzername', + 'avatar_url' => 'Avatar URL', + 'forum_thread' => 'Name des Forums', + 'supress_embeds' => 'Einbettungen unterdrücken', + 'supress_embeds_text' => 'Bei der Serialisierung dieser Nachricht keine Einbettungen einfügen', + 'supress_notifications' => 'Benachrichtigungen unterdrücken', + 'supress_notifications_text' => 'Diese Nachricht löst keine Push- und Desktop-Benachrichtigungen aus', + ], + 'discord_embed' => [ + 'add_embed' => 'Einbettung hinzufügen', + 'flags' => 'Flags', + 'thumbnail' => 'Thumbnail URL', + 'embeds' => 'Einbettungen', + 'thread_name' => 'Name des Forums', + 'allowed_mentions' => 'Erlaubte Erwähnungen', + 'roles' => 'Rollen', + 'users' => 'Nutzer', + 'everyone' => '@everyone & @here', + 'author' => 'Autor', + 'author_url' => 'Autor URL', + 'author_icon_url' => 'Autor Icon URL', + 'body' => 'Body', + 'title' => 'Titel', + 'color' => 'Einbettungsfarbe', + 'url' => 'URL', + 'images' => 'Bilder', + 'image_url' => 'Bild URL', + 'image_thumbnail' => 'Thumbnail URL', + 'footer' => 'Fußzeile', + 'has_timestamp' => 'Besitzt Zeitstempel', + 'footer_icon_url' => 'Fußzeilen Bild-URL', + 'add_field' => 'Feld hinzufügen', + 'fields' => 'Felder', + 'field_name' => 'Feldname', + 'field_value' => 'Feldwert', + 'inline_field' => 'Einzeiliges Feld', + ], +]; diff --git a/lang/de/auth.php b/lang/de/auth.php index 05667cd396..1847622057 100644 --- a/lang/de/auth.php +++ b/lang/de/auth.php @@ -1,27 +1,24 @@ 'Anmelden', - 'go_to_login' => 'Zum Login', - 'failed' => 'Es wurde kein Konto mit diesen Zugangsdaten gefunden.', - 'forgot_password' => [ - 'label' => 'Passwort vergessen?', - 'label_help' => 'Geben Sie Ihre E-Mail Adresse ein, um Anweisungen zum Zurücksetzen Ihres Passworts zu erhalten.', - 'button' => 'Konto wiederherstellen', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Zurücksetzen und Anmelden', - ], + 'failed' => 'Diese Zugangsdaten wurden nicht in unserer Datenbank gefunden.', + 'failed-two-factor' => 'Falscher Zwei-Faktor-Code.', + 'two-factor-code' => 'Zwei-Faktor-Code.', + 'two-factor-hint' => 'Es können Backup-Codes verwendet werden, sofern der Zugriff auf das Gerät nicht mehr möglich ist.', + 'password' => 'Das angegebene Passwort ist falsch.', + 'throttle' => 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in :seconds Sekunden erneut.', + '2fa_must_be_enabled' => 'Der Administrator verlangt, dass die 2-Faktor-Authentifizierung für Deinen Account aktiviert sein muss, damit Du das Panel nutzen kannst.', - 'two_factor' => [ - 'label' => '2-Faktor Token', - 'label_help' => 'Dieses Konto benötigt eine zweite Authentifizierungsebene, um fortzufahren. Bitte geben Sie den von Ihrem Gerät generierten Code ein, um diesen Login abzuschließen.', - 'checkpoint_failed' => 'Der Zwei-Faktor-Authentifizierungstoken war ungültig.', - ], - - 'throttle' => 'Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.', - 'password_requirements' => 'Das Passwort muss mindestens 8 Zeichen lang sein und sollte auf dieser Seite eindeutig sein.', - '2fa_must_be_enabled' => 'Der Administrator hat festgelegt, dass die 2-Faktor-Authentifizierung für deinen Account angeschaltet sein muss, damit du dieses Panel nutzen kannst.', ]; diff --git a/lang/de/command/messages.php b/lang/de/command/messages.php index f7d69a1927..310f1c9ddc 100644 --- a/lang/de/command/messages.php +++ b/lang/de/command/messages.php @@ -2,57 +2,52 @@ return [ 'user' => [ - 'search_users' => 'Gib einen Benutzernamen, eine Benutzer-ID oder eine E-Mail Adresse ein', + 'search_users' => 'Gebe einen Benutzernamen, eine Benutzer-ID oder E-Mail-Adresse ein', 'select_search_user' => 'ID des zu löschenden Benutzers (Gib \'0\' ein, um erneut zu suchen)', 'deleted' => 'Benutzerkonto erfolgreich aus dem Panel gelöscht.', 'confirm_delete' => 'Bist du sicher, dass du dieses Benutzerkonto aus dem Panel löschen möchtest?', 'no_users_found' => 'Für den angegebenen Suchbegriff wurden keine Benutzerkonten gefunden.', - 'multiple_found' => 'Mehrere Konten für den angegebenen Benutzer wurden gefunden, ein Benutzer konnte wegen der --no-interaction Flag nicht gelöscht werden.', - 'ask_admin' => 'Ist dieses Benutzerkonto ein Administratorkonto?', - 'ask_email' => 'E-Mail Adresse', + 'multiple_found' => 'Mehrere Konten für den angegebenen Benutzer wurden gefunden. Ein Benutzer konnte wegen der --no-interaction Flag nicht gelöscht werden.', + 'ask_admin' => 'Ist dieser Benutzer ein Administrator?', + 'ask_email' => 'E-Mail-Adresse', 'ask_username' => 'Benutzername', - 'ask_name_first' => 'Vorname', - 'ask_name_last' => 'Nachname', 'ask_password' => 'Passwort', - 'ask_password_tip' => 'Wenn du ein Benutzerkonto mit einem zufälligen Passwort erstellen möchtest, führe diesen Befehl (CTRL+C) erneut aus und gebe die `--no-password` Flag an.', + 'ask_password_tip' => 'Wenn du ein Benutzerkonto mit einem zufälligen Passwort erstellen möchtest, führe den Befehl (CTRL+C) erneut aus und gebe die `--no-password` Flag an.', 'ask_password_help' => 'Passwörter müssen mindestens 8 Zeichen lang sein und mindestens einen Großbuchstaben und eine Zahl enthalten.', - '2fa_help_text' => [ - 'Dieser Befehl wird die 2-Faktor-Authentifizierung für das Benutzerkonto deaktivieren, wenn sie aktiviert ist. Dies sollte nur als Wiederherstellungsbefehl verwendet werden, wenn der Benutzer aus seinem Konto ausgeschlossen ist.', - 'Wenn das nicht das ist, was Sie tun wollten, drücken Sie STRG+C, um diesen Prozess zu beenden.', - ], + '2fa_help_text' => 'Dieser Befehl deaktiviert die 2-Faktor-Authentifizierung für das Konto eines Benutzers, sofern diese aktiviert ist. Er sollte nur als Befehl zur Kontowiederherstellung verwendet werden, wenn der Benutzer aus seinem Konto ausgesperrt ist. Wenn Sie dies nicht beabsichtigt haben, drücken Sie STRG+C, um diesen Vorgang zu beenden.', '2fa_disabled' => '2-Faktor-Authentifizierung wurde für :email deaktiviert.', ], 'schedule' => [ - 'output_line' => 'Versenden des Auftrags für die erste Aufgabe in `:schedule` (:hash).', + 'output_line' => 'Versenden des Auftrags für die erste Aufgabe in `:schedule` (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'Service-Backup-Datei :file wird gelöscht.', ], 'server' => [ - 'rebuild_failed' => 'Rebuild Anfrage für ":name" (#:id) im Node ":node" fehlgeschlagen mit Fehler: :message', + 'rebuild_failed' => 'Rebuild-Anfrage für ":name“ (#:id) auf dem Node ":node“ fehlgeschlagen mit Fehler: :message', 'reinstall' => [ - 'failed' => 'Neustart der Anfrage für ":name" (#:id) im Node ":node" fehlgeschlagen mit Fehler: :message', - 'confirm' => 'Du bist dabei, eine Gruppe von Servern neu zu installieren. Möchtest du fortfahren?', + 'failed' => 'Neuinstallationsanforderung für ":name“ (#:id) auf dem Node ":node“ fehlgeschlagen mit Fehler: :message', + 'confirm' => 'Du bist dabei, eine Neuinstallation für eine Gruppe von Servern durchzuführen. Möchtest Du fortfahren?', ], 'power' => [ - 'confirm' => 'Du bist dabei, eine :action auf :count Servern auszuführen. Möchtest du fortfahren?', + 'confirm' => 'Du bist dabei, die Aktion :action auf :count Servern auszuführen. Möchtest Du fortfahren?', 'action_failed' => 'Power-Aktion für ":name" (#:id) auf Node ":node" fehlgeschlagen mit Fehler: :message', ], ], 'environment' => [ 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (z.B. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Benutzername', - 'ask_smtp_password' => 'SMTP Passwort', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpunkt', - 'ask_mailgun_secret' => 'Mailgun Verschlüsselung', - 'ask_mandrill_secret' => 'Mandrill Secret', + 'ask_smtp_host' => 'SMTP-Host (z.B. smtp.gmail.com)', + 'ask_smtp_port' => 'SMTP-Port', + 'ask_smtp_username' => 'SMTP-Benutzername', + 'ask_smtp_password' => 'SMTP-Passwort', + 'ask_mailgun_domain' => 'Mailgun-Domain', + 'ask_mailgun_endpoint' => 'Mailgun-Endpoint', + 'ask_mailgun_secret' => 'Mailgun-Secret', + 'ask_mandrill_secret' => 'Mandrill-Secret', 'ask_postmark_username' => 'Postmark API Schlüssel', 'ask_driver' => 'Welcher Treiber soll für das Versenden von E-Mails verwendet werden?', - 'ask_mail_from' => 'E-Mail Adresse, von der die E-Mails stammen sollten', - 'ask_mail_name' => 'Name, von denen E-Mails erscheinen sollen', + 'ask_mail_from' => 'E-Mail Adresse, von der die E-Mails stammen sollen', + 'ask_mail_name' => 'Name, der bei versendeten E-Mails erscheinen soll', 'ask_encryption' => 'Zu verwendende Verschlüsselungsmethode', ], ], diff --git a/lang/de/commands.php b/lang/de/commands.php new file mode 100644 index 0000000000..d068e25f0c --- /dev/null +++ b/lang/de/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Gib eine E-Mail-Adresse an, von der exportierte Eggs von diesem Panel stammen sollen. Dies sollte eine gültige E-Mail-Adresse sein.', + 'url' => 'Die URL der Anwendung MUSS mit https:// oder http:// beginnen, je nachdem, ob Du SSL verwendest oder nicht. Wenn Du dies nicht einbindest, werden Deine E-Mails und andere Inhalte auf eine falsche Seite linken.', + 'timezone' => 'Die Zeitzone sollte mit einer der unterstützten PHP-Zeitzonen übereinstimmen. Wenn Du Dir nicht sicher bist, schau unter folgendem Link nach https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Du hast den Redis-Treiber für eine oder mehrere Optionen ausgewählt, bitte gib unten gültige Verbindungsinformationen an. In den meisten Fällen kannst Du die vorgegebenen Standardwerte verwenden, es sei denn, Du hast in Deinem Setup etwas geändert.', + 'comment' => 'Standardmäßig hat eine Redis-Server-Instanz kein Passwort, da sie lokal läuft und für die Außenwelt nicht zugänglich ist. Wenn dies der Fall ist, drücke einfach Enter ohne einen Wert einzugeben.', + 'confirm' => 'Es scheint, dass :field bereits für Redis definiert ist. Möchtest Du es ändern?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Es wird davon abgeraten "localhost" als Datenbank-Host zu verwenden, da wir häufig Probleme mit den Socket-Verbindungen hatten. Wenn Du eine lokale Verbindung verwenden möchtest, solltest Du "127.0.0.1" verwenden.', + 'DB_USERNAME_note' => 'Die Verwendung des root-Kontos für MySQL-Verbindungen ist nicht nur sehr umstritten, sondern auch von dieser Anwendung nicht erlaubt. Du musst einen eigenen MySQL-Benutzer für diese Software erstellt haben.', + 'DB_PASSWORD_note' => 'Es scheint, als hättest Du bereits ein Passwort für die MySQL-Verbindung definiert, möchtest Du es ändern?', + 'DB_error_2' => 'Deine Verbindungsdaten wurden NICHT gespeichert. Du musst gültige Verbindungsdaten angeben, bevor Du fortfährst.', + 'go_back' => 'Zurück und erneut versuchen', + ], + 'make_node' => [ + 'name' => 'Gib ein Kürzel an, um diesen Node von anderen unterscheiden zu können', + 'description' => 'Gib eine Beschreibung ein, um diesen Node zu identifizieren', + 'scheme' => 'Bitte gib entweder https für SSL-Verbindungen oder http für Verbindungen die kein SSL verwenden an', + 'fqdn' => 'Gib einen Domänennamen ein (z.B. node.example.com), der für die Verbindung zum Daemon verwendet werden soll. Eine IP-Adresse darf nur verwendet werden, wenn Du kein SSL für diesen Node verwendest', + 'public' => 'Soll dieser Node öffentlich sein? Tipp: Wird ein Node auf privat gestellt, ist es nicht möglich zu diesem Node automatisch zu deployen.', + 'behind_proxy' => 'Ist dein FQDN hinter einem Proxy?', + 'maintenance_mode' => 'Soll der Wartungsmodus aktiviert werden?', + 'memory' => 'Gib die maximale Menge an Arbeitsspeicher an', + 'memory_overallocate' => 'Gib die Menge an zusätzlichem Arbeitsspeicher an, den Du zuteilen möchtest. -1 deaktiviert die Überprüfung, und 0 verhindert das Erstellen neuer Server.', + 'disk' => 'Gib die maximale Größe an Speicherplatz an', + 'disk_overallocate' => 'Gib die Menge an zusätzlichem Speicher an, den Du zuweisen möchtest. -1 deaktiviert die Überprüfung, und 0 verhindert das Erstellen eines neuen Servers.', + 'cpu' => 'Gib die maximale Menge an CPU an', + 'cpu_overallocate' => 'Gib die Menge an zusätzlicher CPU-Leistung an, die Du zuweisen möchtest. -1 deaktiviert die Überprüfung, und 0 verhindert das Erstellen eines neuen Servers.', + 'upload_size' => 'Gib die maximale Dateigröße für das Hochladen an', + 'daemonListen' => 'Gib den Port für den Daemon an', + 'daemonConnect' => 'Geben Sie den Verbindungs-Port des Daemons ein (kann identisch mit dem Listen-Port sein)', + 'daemonSFTP' => 'Gib den SFTP-Port für den Daemon an', + 'daemonSFTPAlias' => 'Gib den Daemon SFTP-Alias ein (kann leer sein)', + 'daemonBase' => 'Gib den Basisordner an', + 'success' => 'Neuer Node mit dem Namen :name wurde erfolgreich erstellt und hat die ID :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Der ausgewählte Node existiert nicht.', + 'error_invalid_format' => 'Ungültiges Format angegeben. Gültige Optionen sind yaml und json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Es scheint, als ob Du bereits einen Anwendungsverschlüsselungsschlüssel konfiguriert hast. Mit diesem Prozess fortzufahren kann zu Datenbeschädigung bereits verschlüsselter Daten führen. FAHRE NICHT FORT, ES SEI DENN DU WEIßT WAS DU TUST!', + 'understand' => 'Mir sind die Folgen der Ausführung dieses Befehls bekannt und ich übernehme jede Verantwortung für den Verlust von verschlüsselten Daten.', + 'continue' => 'Bist du sicher, dass du fortfahren möchtest? Änderungen des Anwendungsschlüssels FÜHRT ZU DATENVERLUST.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Es gibt keine geplanten Aufgaben für Server, die ausgeführt werden müssen.', + 'error_message' => 'Ein Fehler trat beim Verarbeiten des Zeitplans auf: ', + ], + ], +]; diff --git a/lang/de/dashboard/account.php b/lang/de/dashboard/account.php deleted file mode 100644 index 447cb11ee0..0000000000 --- a/lang/de/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Aktualisiere deine E-Mail', - 'updated' => 'Deine E-Mail-Adresse wurde aktualisiert.', - ], - 'password' => [ - 'title' => 'Ändere dein Passwort', - 'requirements' => 'Dein neues Passwort sollte mindestens 8 Zeichen lang sein.', - 'updated' => 'Dein Passwort wurde aktualisiert.', - ], - 'two_factor' => [ - 'button' => '2-Faktor-Authentifizierung konfigurieren', - 'disabled' => 'Zwei-Faktor-Authentifizierung wurde auf deinem Konto deaktiviert. Du wirst beim Anmelden nicht mehr aufgefordert, einen Token anzugeben.', - 'enabled' => 'Zwei-Faktor-Authentifizierung wurde auf deinem Konto aktiviert! Ab sofort musst du beim Einloggen den von deinem Gerät generierten Code zur Verfügung stellen.', - 'invalid' => 'Der angegebene Token ist ungültig.', - 'setup' => [ - 'title' => 'Zwei-Faktor-Authentifizierung einrichten', - 'help' => 'Code kann nicht gescannt werden? Gebe den unteren Code in deine Anwendung ein:', - 'field' => 'Token eingeben', - ], - 'disable' => [ - 'title' => 'Zwei-Faktor-Authentifizierung deaktivieren', - 'field' => 'Token eingeben', - ], - ], -]; diff --git a/lang/de/dashboard/index.php b/lang/de/dashboard/index.php deleted file mode 100644 index a0899439f4..0000000000 --- a/lang/de/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Nach Servern suchen...', - 'no_matches' => 'Es wurden keine Server gefunden, die den angegebenen Suchkriterien entsprechen.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Arbeitsspeicher', -]; diff --git a/lang/de/exceptions.php b/lang/de/exceptions.php index 72193edd95..2f9cedaf62 100644 --- a/lang/de/exceptions.php +++ b/lang/de/exceptions.php @@ -4,23 +4,24 @@ 'daemon_connection_failed' => 'Beim Versuch, mit dem Daemon zu kommunizieren, gab es einen Fehler, was zu einem HTTP/:code Antwortcode führte. Dieser Fehler wurde protokolliert.', 'node' => [ 'servers_attached' => 'Ein Node darf keine Server haben, die mit ihm verknüpft sind, um gelöscht zu werden.', - 'daemon_off_config_updated' => 'Die Daemon Konfiguration wurde aktualisiert, jedoch gab es einen Fehler bei dem Versuch, die Konfigurationsdatei des Daemon automatisch zu aktualisieren. Du musst die Konfigurationsdatei (config.yml) manuell anpassen, damit die Änderungen übernommen werden.', + 'error_connecting' => 'Fehler beim Verbinden zu :node', + 'daemon_off_config_updated' => 'Die Daemon-Konfiguration wurde aktualisiert, jedoch ist beim Versuch, die Konfigurationsdatei des Daemons automatisch zu aktualisieren, ein Fehler aufgetreten. Du musst die Konfigurationsdatei (config.yml) für den Daemon manuell aktualisieren, um diese Änderungen zu übernehmen.', ], 'allocations' => [ - 'server_using' => 'Derzeit ist ein Server dieser Zuweisung zugewiesen. Eine Zuordnung kann nur gelöscht werden, wenn derzeit kein Server zugewiesen ist.', + 'server_using' => 'Dieser Allokation ist derzeit ein Server zugewiesen. Eine Allokation kann nur gelöscht werden, wenn sie keinem Server zugewiesen ist.', 'too_many_ports' => 'Das Hinzufügen von mehr als 1000 Ports in einem einzigen Bereich wird nicht unterstützt.', 'invalid_mapping' => 'Das für :port angegebene Mapping war ungültig und konnte nicht verarbeitet werden.', - 'cidr_out_of_range' => 'CIDR-Notation erlaubt nur Masken zwischen /25 und /32.', + 'cidr_out_of_range' => 'CIDR-Notation nur für Masken zwischen /25 und /32 erlaubt.', 'port_out_of_range' => 'Ports in einer Zuteilung müssen größer als 1024 und kleiner oder gleich 65535 sein.', ], 'egg' => [ 'delete_has_servers' => 'Ein Egg mit aktiven Servern kann nicht aus dem Panel gelöscht werden.', - 'invalid_copy_id' => 'Das Egg, das für das Kopieren eines Skripts ausgewählt wurde, existiert entweder nicht oder kopiert ein Skript selbst.', - 'has_children' => 'Dieses Egg ist ein Eltern-Ei für ein oder mehreren anderen Eiern. Bitte löschen Sie diese Eier bevor Sie dieses Ei löschen.', + 'invalid_copy_id' => 'Das Egg, das für das Kopieren eines Skripts ausgewählt wurde, existiert nicht oder kopiert selbst ein Skript.', + 'has_children' => 'Dieses Egg ist ein Parent-Egg für ein oder mehrere Eggs. Bitte lösche diese Eggs bevor Du dieses Egg löschst.', ], 'variables' => [ - 'env_not_unique' => 'Die Umgebungsvariable :name muss für dieses Egg eindeutig sein.', - 'reserved_name' => 'Die Umgebungsvariable :name ist geschützt und kann nicht einer Variable zugewiesen werden.', + 'env_not_unique' => 'Die Umgebungsvariable :name muss für dieses Egg einzigartig sein.', + 'reserved_name' => 'Die Umgebungsvariable :name ist geschützt und kann nicht zugewiesen werden.', 'bad_validation_rule' => 'Die Validierungsregel ":rule" ist keine gültige Regel für diese Anwendung.', ], 'importer' => [ @@ -29,27 +30,35 @@ 'invalid_json_provided' => 'Die angegebene JSON-Datei ist nicht in einem Format, das erkannt werden kann.', ], 'subusers' => [ - 'editing_self' => 'Das Bearbeiten Ihres eigenen Unterbenutzerkontos ist nicht zulässig.', + 'editing_self' => 'Das Bearbeiten Deines eigenen Unterbenutzerkontos ist nicht zulässig.', 'user_is_owner' => 'Du kannst den Serverbesitzer nicht als Unterbenutzer für diesen Server hinzufügen.', - 'subuser_exists' => 'Ein Benutzer mit dieser E-Mail Adresse ist bereits als Unterbenutzer für diesen Server zugewiesen.', + 'subuser_exists' => 'Ein Benutzer mit dieser E-Mail-Adresse ist bereits als Unterbenutzer für diesen Server zugewiesen.', ], 'databases' => [ - 'delete_has_databases' => 'Ein Datenbank Host kann nicht gelöscht werden, der aktive Datenbanken enthält.', + 'delete_has_databases' => 'Ein Datenbank-Host kann nicht gelöscht werden, der aktive Datenbanken enthält.', ], 'tasks' => [ - 'chain_interval_too_long' => 'Die maximale Intervallzeit einer verketteten Aufgabe beträgt 15 Minuten.', + 'chain_interval_too_long' => 'Das maximale Intervall einer verketteten Aufgabe beträgt 15 Minuten.', ], 'locations' => [ 'has_nodes' => 'Ein Standort, der aktive Nodes hat, kann nicht gelöscht werden.', ], 'users' => [ + 'is_self' => 'Du kannst dein eigenes Benutzerkonto nicht löschen.', + 'has_servers' => 'Ein Benutzer mit aktiven Servern, die mit seinem Konto verknüpft sind, kann nicht gelöscht werden. Bitte lösche die Server, bevor du fortfährst.', 'node_revocation_failed' => 'Fehler beim Widerrufen der Schlüssel auf Node #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'Es konnten keine Nodes gefunden werden, die die für den automatischen Einsatz angegebenen Anforderungen erfüllen.', - 'no_viable_allocations' => 'Es wurden keine Zuweisungen gefunden, die die Anforderungen für den automatischen Einsatz erfüllen.', + 'no_viable_nodes' => 'Es konnten keine Nodes gefunden werden, die die für das automatische Deployment angegebenen Anforderungen erfüllen.', + 'no_viable_allocations' => 'Es wurden keine Allokationen gefunden, die die Anforderungen für das automatische Deployment erfüllen.', ], 'api' => [ 'resource_not_found' => 'Die angeforderte Ressource existiert nicht auf diesem Server.', ], + 'mount' => [ + 'servers_attached' => 'Ein Mount darf keine Server haben, die mit ihm verknüpft sind, um gelöscht zu werden.', + ], + 'server' => [ + 'marked_as_failed' => 'Dieser Server hat seinen Installationsprozess noch nicht abgeschlossen, bitte versuche es später erneut.', + ], ]; diff --git a/lang/de/notifications.php b/lang/de/notifications.php new file mode 100644 index 0000000000..cbe7a2d3bb --- /dev/null +++ b/lang/de/notifications.php @@ -0,0 +1,18 @@ + 'Server öffnen', + 'installation_completed' => 'Serverinstallation abgeschlossen', + 'installation_failed' => 'Serverinstallation fehlgeschlagen', + 'reinstallation_completed' => 'Server Neuinstallation abgeschlossen', + 'reinstallation_failed' => 'Server Neuinstallation fehlgeschlagen', + 'failed' => 'Fehlgeschlagen', + 'user_added' => [ + 'title' => 'Zum Server hinzugefügt', + 'body' => 'Sie wurden als Unterbenutzer hinzugefügt zu :server', + ], + 'user_removed' => [ + 'title' => 'Vom Server entfernt', + 'body' => 'Sie wurden als Unterbenutzer von :server entfernt', + ], +]; diff --git a/lang/de/pagination.php b/lang/de/pagination.php deleted file mode 100644 index 25253b1871..0000000000 --- a/lang/de/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Zurück', - 'next' => 'Weiter »', -]; diff --git a/lang/de/passwords.php b/lang/de/passwords.php deleted file mode 100644 index c9225b9dd2..0000000000 --- a/lang/de/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwörter müssen aus mindestens 6 Zeichen bestehen und übereinstimmen.', - 'reset' => 'Dein Passwort wurde zurückgesetzt!', - 'sent' => 'Wir haben dir einen Link zum Zurücksetzen des Passworts per E-Mail zugesendet!', - 'token' => 'Das Passwort Reset Token ist ungültig.', - 'user' => 'Es konnte kein Benutzer mit dieser E-Mail-Adresse gefunden werden.', -]; diff --git a/lang/de/profile.php b/lang/de/profile.php new file mode 100644 index 0000000000..1abdb87735 --- /dev/null +++ b/lang/de/profile.php @@ -0,0 +1,70 @@ + 'Profil', + 'tabs' => [ + 'account' => 'Konto', + 'oauth' => 'OAuth', + 'activity' => 'Aktivität', + 'api_keys' => 'API Schlüssel', + 'ssh_keys' => 'SSH Schlüssel', + 'keys' => 'Schlüssel', + '2fa' => '2FA', + 'customization' => 'Anpassung', + ], + 'username' => 'Benutzername', + 'admin' => 'Administrator', + 'exit_admin' => 'Admin verlassen', + 'server_list' => 'Serverliste', + 'email' => 'E-Mail', + 'password' => 'Passwort', + 'current_password' => 'Aktuelles Passwort', + 'password_confirmation' => 'Passwortbestätigung', + 'timezone' => 'Zeitzone', + 'language' => 'Sprache', + 'language_help' => 'Ihre Sprache :state wurde noch nicht übersetzt!', + 'link' => 'Verbinden', + 'unlink' => 'Verknüpfung von :name entfernen', + 'unlinked' => 'Verknüpfung von :name entfernt', + 'scan_qr' => 'QR-Code Scannen', + 'code' => 'Code', + 'setup_key' => 'Einrichtungsschlüssel', + 'invalid_code' => 'Ungültiger 2FA Code', + 'code_help' => 'Scannen Sie den obigen QR-Code mit Ihrer 2FA App, dann geben Sie den generierten Code ein.', + '2fa_enabled' => 'Zwei-Faktor-Authentifizierung ist derzeit aktiviert!', + 'backup_help' => 'Diese werden nicht wieder angezeigt!', + 'backup_codes' => 'Backup Codes', + 'disable_2fa' => '2FA deaktivieren', + 'disable_2fa_help' => 'Geben Sie Ihren aktuellen 2FA-Code ein, um die Zwei-Faktor-Authentifizierung zu deaktivieren', + 'api_keys' => 'API Schlüssel', + 'create_api_key' => 'API Schlüssel erstellen', + 'api_key_created' => 'API Schlüssel erstellt', + 'description' => 'Beschreibung', + 'allowed_ips' => 'Erlaubte IPs', + 'allowed_ips_help' => 'Drücken Sie Enter, um eine neue IP Adresse hinzuzufügen oder lassen Sie leer, um beliebige IP-Adresse zu erlauben', + 'ssh_keys' => 'SSH Schlüssel', + 'create_ssh_key' => 'SSH Schlüssel erstellen', + 'ssh_key_created' => 'SSH Schlüssel erstellt', + 'name' => 'Name', + 'public_key' => 'Öffentlicher Schlüssel', + 'could_not_create_ssh_key' => 'SSH-Schlüssel konnte nicht erstellt werden', + 'dashboard' => 'Dashboard', + 'dashboard_layout' => 'Dashboard Anordnung', + 'console' => 'Konsole', + 'grid' => 'Raster', + 'table' => 'Tabelle', + 'rows' => 'Zeilen', + 'font_size' => 'Schriftgröße', + 'font' => 'Schriftart', + 'font_preview' => 'Schriftartenvorschau', + 'seconds' => 'Sekunden', + 'graph_period' => 'Diagramm-Zeitraum', + 'graph_period_helper' => 'Die Anzahl der Datenpunkte, Sekunden, die in den Konsolendiagrammen angezeigt werden.', + 'navigation' => 'Navigationstyp', + 'sidebar' => 'Seitenleiste', + 'topbar' => 'Kopfzeile', + 'mixed' => 'Gemischt', + 'no_oauth' => 'Keine Konten verknüpft', + 'no_api_keys' => 'Keine API-Schlüssel', + 'no_ssh_keys' => 'Keine SSH-Schlüssel', +]; diff --git a/lang/de/search.php b/lang/de/search.php new file mode 100644 index 0000000000..44b4cc7483 --- /dev/null +++ b/lang/de/search.php @@ -0,0 +1,9 @@ + 'Bitte geben Sie mindestens drei Zeichen ein, um mit der Suche zu beginnen.', + 'term' => [ + 'label' => 'Suchbegriff', + 'description' => 'Geben Sie einen Servernamen, eine UUID oder eine Allocation ein, um mit der Suche zu beginnen.', + ], +]; diff --git a/lang/de/server/activity.php b/lang/de/server/activity.php new file mode 100644 index 0000000000..0488a0b31b --- /dev/null +++ b/lang/de/server/activity.php @@ -0,0 +1,11 @@ + 'Aktivität', + 'event' => 'Ereignis', + 'user' => 'Benutzer', + 'deleted_user' => 'Gelöscht Benutzer', + 'system' => 'System', + 'timestamp' => 'Zeitpunkt', + 'metadata' => 'Metadaten', +]; diff --git a/lang/de/server/backup.php b/lang/de/server/backup.php new file mode 100644 index 0000000000..438430570b --- /dev/null +++ b/lang/de/server/backup.php @@ -0,0 +1,55 @@ + 'Backups', + 'empty' => 'Keine Backups', + 'size' => 'Größe', + 'created_at' => 'Erstellt am', + 'status' => 'Status', + 'is_locked' => 'Sperrstatus', + 'backup_status' => [ + 'in_progress' => 'In Bearbeitung', + 'successful' => 'Erfolgreich', + 'failed' => 'Fehlgeschlagen', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Backup erstellen', + 'limit' => 'Maximale Anzahl von Backups erreicht', + 'created' => ':name erstellt', + 'notification_success' => 'Backup erfolgreich erstellt', + 'notification_fail' => 'Backup Fehlgeschlagen', + 'name' => 'Name', + 'ignored' => 'Ignorierte Dateien & Ordner', + 'locked' => 'Gesperrt?', + 'lock_helper' => 'Verhindert das Löschen dieses Backups bis es explizit entsperrt wird', + ], + 'lock' => [ + 'lock' => 'Sperren', + 'unlock' => 'Entsperren', + ], + 'download' => 'Herunterladen', + 'rename' => [ + 'title' => 'Umbenennen', + 'new_name' => 'Sicherungsname', + 'notification_success' => 'Sicherung erfolgreich umbenannt', + ], + 'restore' => [ + 'title' => 'Wiederherstellen', + 'helper' => 'Dein Server wird gestoppt. Du kannst deinen Server nicht mehr steuern, auf die Dateien zugreifen oder zusätzliche Backups erstellen, solange dieser Prozess läuft.', + 'delete_all' => 'Alle Dateien vor der Wiederherstellung löschen?', + 'notification_started' => 'Backup wiederherstellen', + 'notification_success' => 'Backup wurde erfolgreich wiederhergestellt', + 'notification_fail' => 'Backup Wiederherstellung fehlgeschlagen', + 'notification_fail_body_1' => 'Dieser Server befindet sich aktuell in einem Status, indem keine Backups wiederhergestellt werden können', + 'notification_fail_body_2' => 'Dieses Backup kann aktuell nicht wiederhergestellt werden: nicht komplett oder fehlgeschlagen', + ], + 'delete' => [ + 'title' => 'Backup löschen', + 'description' => 'Möchtest du :backup löschen?', + 'notification_success' => 'Backup gelöscht', + 'notification_fail' => 'Backup konnte nicht gelöscht werden', + 'notification_fail_body' => 'Verbindung zur Node fehlgeschlagen. Bitte versuche es erneut.', + ], + ], +]; diff --git a/lang/de/server/console.php b/lang/de/server/console.php new file mode 100644 index 0000000000..9bfede82bc --- /dev/null +++ b/lang/de/server/console.php @@ -0,0 +1,43 @@ + 'Konsole', + 'command' => 'Gib einen Command ein...', + 'command_blocked' => 'Server offline...', + 'command_blocked_title' => 'Es kann kein Command gesendet werden, wenn der Server offline ist', + 'open_in_admin' => 'Adminseite öffnen', + 'power_actions' => [ + 'start' => 'Starten', + 'stop' => 'Stoppen', + 'restart' => 'Neustarten', + 'kill' => 'Stopp erzwingen', + 'kill_tooltip' => 'Dieser Vorgang kann zu Datenbeschädigung oder Datenverlust führen!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Arbeitsspeicher', + 'network' => 'Netzwerk', + 'disk' => 'Speicher', + 'name' => 'Name', + 'status' => 'Status', + 'address' => 'Adresse', + 'unavailable' => 'Nicht verfügbar', + ], + 'status' => [ + 'created' => 'Erstellt', + 'starting' => 'Startet', + 'running' => 'Läuft', + 'restarting' => 'Startet neu', + 'exited' => 'Beenden', + 'paused' => 'Pausiert', + 'dead' => 'Offline', + 'removing' => 'Entfernen', + 'stopping' => 'Stoppt', + 'offline' => 'Offline', + 'missing' => 'Fehlt', + ], + 'websocket_error' => [ + 'title' => 'Verbindung zum Websocket konnte nicht hergestellt werden!', + 'body' => 'Weitere Informationen finden Sie in Ihrer Browserkonsole.', + ], +]; diff --git a/lang/de/server/dashboard.php b/lang/de/server/dashboard.php new file mode 100644 index 0000000000..5cb17f3c98 --- /dev/null +++ b/lang/de/server/dashboard.php @@ -0,0 +1,28 @@ + 'Server', + 'list' => 'Server Liste', + 'tabs' => [ + 'my' => 'Meine Server', + 'other' => 'Andere Server', + 'all' => 'Alle Server', + ], + 'empty_own' => 'Du besitzt keine Server', + 'empty_other' => 'Es gibt keine Server, auf die du Zugreifen darfst.', + + 'status' => 'Status', + 'server' => 'Server', + 'resources' => 'Ressourcen', + 'usage_limit' => 'Nutzungs Limit: :resource', + + 'cpu' => 'CPU', + 'memory' => 'RAM', + 'disk' => 'Speicherplatz', + 'network' => 'Netzwerk', + 'none' => 'Keine', + 'loading' => 'Laden...', + + 'power_actions' => '', + 'power_action_sent' => 'Gesendet an', +]; diff --git a/lang/de/server/database.php b/lang/de/server/database.php new file mode 100644 index 0000000000..565e8a04ad --- /dev/null +++ b/lang/de/server/database.php @@ -0,0 +1,26 @@ + 'Datenbanken', + 'empty' => 'Keine Datenbank', + 'create_database' => 'Datenbank erstellen', + 'limit' => 'Datenbank Limit erreicht', + 'viewing' => 'Du siehst: :database', + 'host' => 'Host', + 'database' => 'Datenbank', + 'username' => 'Benutzername', + 'password' => 'Passwort', + 'remote' => 'Fernzugriff', + 'created_at' => 'Erstellt am', + 'name' => 'Datenbank Name', + 'name_hint' => 'Leer lassen, um einen zufälligen Namen generieren zu lassen', + 'connections_from' => 'Verbindungen von', + 'max_connections' => 'Max. Verbindungen', + 'database_host' => 'Datenbank Host', + 'database_host_select' => 'Wähle einen Datenbank Host', + 'jdbc' => '', + 'create_notification' => 'Erstellt :database', + 'create_notification_fail' => 'Fehler bei der Erstellung von :database', + 'delete_notification' => 'Löschte :database', + 'delete_notification_fail' => 'Fehler bei der Löschung von :database', +]; diff --git a/lang/de/server/file.php b/lang/de/server/file.php new file mode 100644 index 0000000000..cc57b210ff --- /dev/null +++ b/lang/de/server/file.php @@ -0,0 +1,111 @@ + 'Dateien', + 'name' => 'Name', + 'size' => 'Größe', + 'modified_at' => 'Zuletzt bearbeitet:', + 'actions' => [ + 'open' => 'Öffnen', + 'download' => 'Herunterladen', + 'copy' => [ + 'title' => 'Kopieren', + 'notification' => 'Datei erfolgreich kopiert', + ], + 'upload' => [ + 'title' => 'Hochladen', + 'from_files' => 'Dateien Hochladen', + 'from_url' => 'Per URL hochladen', + 'url' => 'URL', + 'drop_files' => 'Dateien zum Hochladen hier ablegen', + 'success' => 'Dateien erfolgreich hochgeladen', + 'failed' => 'Fehler beim Hochladen der Dateien', + 'header' => 'Dateien werden hochgeladen', + 'error' => 'Beim Hochladen ist ein Fehler aufgetreten.', + ], + 'rename' => [ + 'title' => 'Umbenennen', + 'file_name' => 'Datei Name', + 'notification' => 'Datei erfolgreich umbenannt', + ], + 'move' => [ + 'title' => 'Verschieben', + 'directory' => 'Ordner', + 'directory_hint' => 'Gib einen neuen Dateipfad an, gelesen vom aktuellen Ordner', + 'new_location' => 'Neuer Ablageort', + 'new_location_hint' => 'Geben Sie den Speicherort dieser Datei oder dieses Ordners relativ zum aktuellen Verzeichnis ein.', + 'notification' => 'Datei erfolgreich verschoben', + 'bulk_notification' => ':count Dateien wurden nach :directory verschoben', + ], + 'permissions' => [ + 'title' => 'Berechtigungen', + 'read' => 'Lesen', + 'write' => 'Schreiben', + 'execute' => 'Befehle Ausführen', + 'owner' => 'Admin', + 'group' => 'Gruppe', + 'public' => 'Öffentlich', + 'notification' => 'Berechtigungen geändert zu :mode', + ], + 'archive' => [ + 'title' => 'Archivieren', + 'archive_name' => 'Archivname', + 'notification' => 'Archiv erstellt', + 'extension' => 'Erweiterung', + ], + 'unarchive' => [ + 'title' => 'De archivieren', + 'notification' => 'De archivieren fertig', + ], + 'new_file' => [ + 'title' => 'Neue Datei', + 'file_name' => 'Neuer Dateiname', + 'syntax' => 'Syntaxhervorhebung', + 'create' => 'Erstellen', + ], + 'new_folder' => [ + 'title' => 'Neuer Ordner', + 'folder_name' => 'Neuer Ordnername', + ], + 'nested_search' => [ + 'title' => 'Verschachtelte Suche', + 'search_term' => 'Suchbegriff', + 'search_term_placeholder' => 'Geben Sie einen Suchbegriff ein, z. B. *.txt', + 'search' => 'Suchen', + 'search_for_term' => 'Suchen :term', + ], + 'delete' => [ + 'notification' => 'Datei gelöscht', + 'bulk_notification' => ':count Dateien wurden gelöscht', + ], + 'edit' => [ + 'title' => 'Bearbeiten: :file', + 'save_close' => 'Speichern & Schließen', + 'save' => 'Speichern', + 'cancel' => 'Abbrechen', + 'notification' => 'Datei gespeichert', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ' Ist zu groß', + 'body' => 'Max ist', + ], + 'file_not_found' => [ + 'title' => ':name Nicht gefunden', + ], + 'file_not_editable' => [ + 'title' => ':name ist ein Verzeichnis', + ], + 'file_already_exists' => [ + 'title' => ':name ist bereits vorhanden!', + ], + 'files_node_error' => [ + 'title' => 'Dateien konnten nicht geladen werden!', + ], + 'pelicanignore' => [ + 'title' => 'Sie bearbeiten eine .pelicanignore-Datei!', + 'body' => 'Alle hier aufgeführten Dateien oder Verzeichnisse werden von Backups ausgeschlossen. Platzhalter werden durch die Verwendung eines Sternchens (*) unterstützt.
Sie können eine vorherige Regel negieren, indem Sie ein Ausrufezeichen (!) voranstellen.', + ], + ], +]; diff --git a/lang/de/server/network.php b/lang/de/server/network.php new file mode 100644 index 0000000000..95d82e4468 --- /dev/null +++ b/lang/de/server/network.php @@ -0,0 +1,17 @@ + 'Netzwerk', + 'add' => 'Allokation hinzufügen', + 'limit' => 'Allokationslimit erreicht', + 'address' => 'Adresse', + 'port' => 'Port', + 'notes' => 'Notizen', + 'no_notes' => 'Keine Notizen', + 'make_primary' => 'Als Primär festlegen', + 'primary' => 'Primär', + 'make' => 'Erstelle', + 'delete' => 'Löschen', + 'locked' => 'Sperrstatus', + 'locked_helper' => 'Gesperrte Allokationen können nur von Administratoren gelöscht werden', +]; diff --git a/lang/de/server/schedule.php b/lang/de/server/schedule.php new file mode 100644 index 0000000000..83fcda9f9c --- /dev/null +++ b/lang/de/server/schedule.php @@ -0,0 +1,121 @@ + 'Zeitpläne', + 'new' => 'Neue Zeitpläne', + 'edit' => 'Zeitpläne Editieren', + 'save' => 'Zeitpläne Speichern', + 'delete' => 'Zeitpläne Löschen', + 'import' => 'Zeitpläne Importieren', + 'export' => 'Zeitpläne Exportieren', + 'name' => 'Name', + 'cron' => 'Cron', + 'status' => 'Status', + 'schedule_status' => [ + 'inactive' => 'Inaktiv', + 'processing' => 'Verarbeiten', + 'active' => 'Aktiv', + ], + 'no_tasks' => 'Keine Aufgaben', + 'run_now' => 'Jetzt ausführen', + 'online_only' => 'Nur wenn online', + 'last_run' => 'Zuletzt ausgeführt', + 'next_run' => 'Nächste Ausführung', + 'never' => 'Nie', + 'cancel' => 'Abbrechen', + + 'only_online' => 'Nur, wenn der Server online ist?', + 'only_online_hint' => 'Führen Sie diesen Zeitplan nur aus, wenn der Server ausgeführt wird.', + 'enabled' => 'Zeitplan aktivieren?', + 'enabled_hint' => 'Dieser Zeitplan wird automatisch ausgeführt, wenn er aktiviert ist.', + + 'cron_body' => 'Bitte beachten Sie, dass die folgenden Kron-Eingaben immer von UTC ausgehen.', + 'cron_timezone' => 'Nächster Lauf in Ihrer Zeitzone (: time Zone): :next_run ', + + 'invalid' => 'Ungültig', + + 'time' => [ + 'minute' => 'Minuten', + 'hour' => 'Stunden', + 'day' => 'Tag', + 'week' => 'Woche', + 'month' => 'Monat', + 'day_of_month' => 'Tag das Monats', + 'day_of_week' => 'Tag der Woche', + + 'hourly' => 'Stündlich', + 'daily' => 'Täglich', + 'weekly_mon' => 'Wöchentlich(jeden Montag)', + 'weekly_sun' => 'Wöchentlich(jeden Sonntag)', + 'monthly' => 'Monatlich', + 'every_min' => 'Alle x Minuten', + 'every_hour' => 'Alle x Stunden', + 'every_day' => 'Alle x Tage', + 'every_week' => 'Alle x Wochen', + 'every_month' => 'Alle x Monate', + 'every_day_of_week' => 'Alle x Tage der Woche', + + 'every' => 'Alle', + 'minutes' => 'Minuten', + 'hours' => 'Stunden', + 'days' => 'Tage', + 'months' => 'Monate', + + 'monday' => 'Montag', + 'tuesday' => 'Dienstag', + 'wednesday' => 'Mittwoch', + 'thursday' => 'Donnerstag', + 'friday' => 'Freitag', + 'saturday' => 'Samstag', + 'sunday' => 'Sonntag', + ], + + 'tasks' => [ + 'title' => 'Aufgaben', + 'create' => 'Aufgabe erstellen', + 'limit' => 'Aufgaben Limit erreicht', + 'action' => 'Aktion', + 'payload' => '', + 'no_payload' => 'Keine Daten', + 'time_offset' => 'Zeit Verschiebung', + 'first_task' => 'Erste Aufgabe', + 'seconds' => 'Sekunden', + 'continue_on_failure' => 'Bei Fehlern fortführen', + + 'actions' => [ + 'title' => 'Aktion', + 'power' => [ + 'title' => 'Server Kontrolle', + 'action' => 'Server Steuerungs Aktion', + 'start' => 'Starten', + 'stop' => 'Stoppen', + 'restart' => 'Neustarten', + 'kill' => 'Killen', + ], + 'command' => [ + 'title' => 'Befehl senden', + 'command' => 'Befehl', + ], + 'backup' => [ + 'title' => 'Backup erstellen', + 'files_to_ignore' => 'Datein zum ignorieren', + ], + 'delete_files' => [ + 'title' => 'Dateien löschen', + 'files_to_delete' => 'Dateien zum Löschen', + ], + ], + ], + + 'notification_invalid_cron' => 'Die bereitgestellten Kron-Daten ergeben keinen gültigen Ausdruck', + + 'import_action' => [ + 'file' => 'Datei', + 'url' => 'URL', + 'schedule_help' => 'Dies sollte die rohe JSON-Datei sein (schedule-daily-restart.json).', + 'url_help' => 'URLs müssen direkt auf die rohe .json-Datei verweisen.', + 'add_url' => 'Neue URL', + 'import_failed' => 'Import fehlgeschlagen', + 'import_success' => 'Import erfolgreich', + ], +]; diff --git a/lang/de/server/setting.php b/lang/de/server/setting.php new file mode 100644 index 0000000000..76895f2fa6 --- /dev/null +++ b/lang/de/server/setting.php @@ -0,0 +1,55 @@ + 'Einstellungen', + 'server_info' => [ + 'title' => 'Server-Information', + 'information' => 'Informationen', + 'name' => 'Server-Name', + 'server_name' => 'Server Name', + 'notification_name' => 'Aktualisierter Server-Name', + 'description' => 'Server-Beschreibung', + 'notification_description' => 'Aktualisiere Server-Beschreibung', + 'failed' => 'Fehlgeschlagen', + 'uuid' => 'Server-UUID', + 'uuid_short' => 'Server ID', + 'node_name' => 'Knoten Name', + 'icon' => [ + 'upload' => 'Icon hochladen', + 'tooltip' => 'Nutze Egg Icon', + 'updated' => 'Server Icon aktualisiert', + 'deleted' => 'Server Icon gelöscht', + ], + 'limits' => [ + 'title' => 'Limit', + 'unlimited' => 'Unbegrenzt', + 'of' => 'Von', + 'cpu' => 'CPU', + 'memory' => 'Arbeitsspeicher', + 'disk' => 'Speicherplatz', + 'backups' => 'Backups', + 'databases' => 'Datenbanken', + 'allocations' => 'Zuteilungen', + 'no_allocations' => 'Keine zusätzlichen Zuteilungen', + ], + 'sftp' => [ + 'title' => 'SFTP Information', + 'connection' => 'Verbindung', + 'action' => 'Verbindung zu SFTP', + 'username' => 'Nutzername', + 'password' => 'Passwort', + 'password_body' => 'Ihr SFTP-Passwort ist dasselbe wie das Passwort, das Sie für den Zugriff auf dieses Panel verwenden.', + ], + ], + 'reinstall' => [ + 'title' => 'Server neu installieren', + 'body' => 'Durch die Neuinstallation Ihres Servers wird dieser gestoppt und anschließend das Installationsskript, mit dem er ursprünglich eingerichtet wurde, erneut ausgeführt.', + 'body2' => 'Während dieses Vorgangs können einige Dateien gelöscht oder geändert werden. Bitte sichern Sie Ihre Daten, bevor Sie fortfahren.', + 'action' => 'Neu installieren', + 'modal' => 'Bist du dir sicher, dass du den Server neu Installieren möchtest?', + 'modal_description' => 'Einige Dateien können während dieses Vorgangs gelöscht oder geändert werden. Bitte sichern Sie Ihre Daten, bevor Sie fortfahren.', + 'yes' => 'Ja, neu installieren', + 'notification_start' => 'Neuinstallation gestartet', + 'notification_fail' => 'Neuinstallation fehlgeschlagen', + ], +]; diff --git a/lang/de/server/startup.php b/lang/de/server/startup.php new file mode 100644 index 0000000000..c33795ddcf --- /dev/null +++ b/lang/de/server/startup.php @@ -0,0 +1,17 @@ + 'Startet', + 'command' => 'Start Befehl', + 'notification_startup' => 'Start-Befehl aktualisiert', + 'notification_startup_body' => 'Starten Sie den Server neu, um den neuen Start-Befehl zu verwenden.', + 'enable_preview' => 'Vorschau aktivieren', + 'disable_preview' => 'Vorschau deaktivieren', + 'docker_image' => 'Docker Image', + 'notification_docker' => 'Docker-Image aktualisiert', + 'notification_docker_body' => 'Starten Sie den Server neu, um das neue Image zu verwenden.', + 'variables' => 'Server variablen', + 'update' => 'Aktualisiert: :variable', + 'fail' => 'Fehlgeschlagen: :variable', + 'validation_fail' => 'Validierung fehlgeschlagen: :variable', +]; diff --git a/lang/de/server/user.php b/lang/de/server/user.php new file mode 100644 index 0000000000..0c3cb84b80 --- /dev/null +++ b/lang/de/server/user.php @@ -0,0 +1,73 @@ + 'Benutzer', + 'username' => 'Benutzername', + 'email' => 'E-Mail', + 'assign_all' => 'Alle zuordnen', + 'invite_user' => 'Benutzer einladen', + 'action' => 'Einladen', + 'remove' => 'Benutzer entfernen', + 'edit' => 'Benutzer bearbeiten', + 'editing' => 'Bearbeiten :user', + 'delete' => 'Benutzer Löschen', + 'notification_add' => 'Benutzer eingeladen!', + 'notification_edit' => 'Benutzer aktualisiert!', + 'notification_delete' => 'Benutzer entfernt!', + 'notification_failed' => 'Benutzer konnte nicht eingeladen werden!', + 'permissions' => [ + 'title' => 'Rechte', + 'activity_desc' => 'Berechtigungen, die den Zugriff eines Benutzers auf die Server-Aktivitätsprotokolle erlaubt.', + 'startup_desc' => 'Berechtigungen, die den Zugriff eines Benutzers auf die Startparameter dieses Servers erlaubt.', + 'settings_desc' => 'Berechtigungen, die die Fähigkeit eines Benutzers steuern, die Einstellungen dieses Servers zu ändern.', + 'control_desc' => 'Berechtigungen, die die Fähigkeit eines Benutzers steuern, den Zustand eines Servers zu kontrollieren oder Befehle zu senden.', + 'user_desc' => 'Berechtigungen, die einem Benutzer ermöglichen, andere Unterbenutzer auf einem Server zu verwalten. Sie können niemals ihr eigenes Konto bearbeiten oder Berechtigungen vergeben, die sie selbst nicht haben.', + 'file_desc' => 'Berechtigungen, die Fähigkeit eines Benutzers steuern, Dateien für diesen Server zu ändern.', + 'allocation_desc' => 'Berechtigungen, die Fähigkeit eines Benutzers steuern, die Port-Allokationen für diesen Server zu ändern.', + 'database_desc' => 'Berechtigungen, die Zugriff eines Benutzers auf die Datenbankverwaltung für diesen Server steuern.', + 'backup_desc' => 'Berechtigungen, die die Fähigkeit eines Benutzers steuern, Server-Backups zu erstellen und zu verwalten.', + 'schedule_desc' => 'Berechtigungen, die den Zugriff eines Benutzers auf den Zeitplan für diesen Server erlauben.', + 'startup_read' => 'Ermöglicht es einem Benutzer, die Start-Variablen für einen Server anzuzeigen.', + 'startup_update' => 'Ermöglicht es dem Benutzer, die Start-Variablen für den Server zu ändern.', + 'startup_docker_image' => 'Ermöglicht es einem Benutzer, das Docker-Image zu ändern, das beim Start des Servers verwendet wird.', + 'settings_reinstall' => 'Erlaubt einem Benutzer, eine Neuinstallation für diesen Server zu starten.', + 'settings_rename' => 'Ermöglicht einem Benutzer, diesen Server umzubenennen und die Beschreibung zu ändern.', + 'settings_description' => 'Ermöglicht einem Benutzer, die Beschreibung des Servers zu ändern.', + 'activity_read' => 'Ermöglicht einem Benutzer, die Aktivitätsprotokolle für den Server anzuzeigen.', + 'websocket_connect' => 'Ermöglicht einem Benutzer den Zugriff auf den Websocket für diesen Server.', + 'control_console' => 'Ermöglicht dem Benutzer, Daten an die Serverkonsole zu senden.', + 'control_start' => 'Ermöglicht dem Benutzer, die Serverinstanz zu starten.', + 'control_stop' => 'Ermöglicht dem Benutzer, die Serverinstanz zu stoppen.', + 'control_restart' => 'Ermöglicht dem Benutzer, die Serverinstanz neu zu starten.', + 'control_kill' => 'Ermöglicht dem Benutzer, die Server-Instanz zu beenden.', + 'user_create' => 'Ermöglicht dem Benutzer, neue Benutzerkonten für den Server zu erstellen.', + 'user_read' => 'Ermöglicht dem Benutzer, die mit diesem Server verbundenen Benutzer anzuzeigen.', + 'user_update' => 'Ermöglicht es einem Benutzer, andere mit diesem Server verbundene Benutzer zu ändern.', + 'user_delete' => 'Ermöglicht dem Benutzer, andere diesem Server zugeordnete Benutzer zu löschen.', + 'file_create' => 'Erlaubt es einem Benutzer, neue Dateien und Verzeichnisse zu erstellen.', + 'file_read' => 'Ermöglicht es einem Benutzer, den Inhalt eines Verzeichnisses einzusehen, aber nicht den Inhalt von Dateien einzusehen oder herunterzuladen.', + 'file_read_content' => 'Ermöglicht es dem Benutzer, den Inhalt einer bestimmten Datei einzusehen. Damit kann der Benutzer auch Dateien herunterladen.', + 'file_update' => 'Ermöglicht einem Benutzer die Aktualisierung von Dateien und Ordnern, die mit dem Server verbunden sind.', + 'file_delete' => 'Ermöglicht dem Benutzer, Dateien und Verzeichnisse zu löschen.', + 'file_archive' => 'Ermöglicht dem Benutzer, Dateiarchive zu erstellen und vorhandene Archive zu dekomprimieren.', + 'file_sftp' => 'Ermöglicht dem Benutzer, die oben genannten Dateiaktionen mit einem SFTP-Client auszuführen.', + 'allocation_read' => 'Ermöglicht einem Benutzer das Anzeigen aller Allokationen, die diesem Server derzeit zugewiesen sind. Benutzer mit einer beliebigen Zugriffsebene auf diesem Server können immer die primäre Allokation anzeigen.', + 'allocation_update' => 'Ermöglicht es einem Benutzer, die primäre Allokation des Servers zu ändern und jeder Allokation Notizen hinzuzufügen.', + 'allocation_delete' => 'Ermöglicht es einem Benutzer, eine Allokation vom Server zu löschen.', + 'allocation_create' => 'Ermöglicht es einem Benutzer, dem Server zusätzliche Allokationen zuzuweisen.', + 'database_create' => 'Ermöglicht es einem Benutzer, eine neue Datenbank für den Server zu erstellen.', + 'database_read' => 'Ermöglicht einem Benutzer die Einsicht in die Serverdatenbanken.', + 'database_update' => 'Erlaubt einem Benutzer, Änderungen an einer Datenbank vorzunehmen. Wenn der Benutzer nicht auch die Berechtigung „Passwort ansehen“ hat, kann er das Passwort nicht ändern.', + 'database_delete' => 'Erlaubt einem Benutzer das Löschen einer Datenbankinstanz.', + 'database_view_password' => 'Ermöglicht es einem Benutzer, ein Datenbankpasswort im System einzusehen.', + 'schedule_create' => 'Ermöglicht es einem Benutzer, einen neuen Zeitplan für den Server zu erstellen.', + 'schedule_read' => 'Ermöglicht es einem Benutzer, Zeitpläne für einen Server einzusehen.', + 'schedule_update' => 'Ermöglicht es einem Benutzer, Änderungen an einem bestehenden Zeitplan vorzunehmen.', + 'schedule_delete' => 'Erlaubt einem Benutzer, Zeitpläne für diesen Server zu löschen.', + 'backup_create' => 'Erlaubt einem Benutzer, neue Backups für diesen Server zu erstellen.', + 'backup_read' => 'Ermöglicht einem Benutzer, alle Backups für diesen Server anzuzeigen.', + 'backup_delete' => 'Erlaubt einem Benutzer, Backups vom System zu entfernen.', + 'backup_download' => 'Erlaubt einem Benutzer, ein Backup für den Server herunterzuladen. Achtung: Dies ermöglicht einem Benutzer Zugriff auf alle Dateien, die im Backup enthalten sind.', + 'backup_restore' => 'Ermöglicht einem Benutzer, ein Backup für den Server wiederherzustellen. Achtung: Dies erlaubt dem Benutzer auch alle Server-Dateien zu löschen.', + ], +]; diff --git a/lang/de/server/users.php b/lang/de/server/users.php deleted file mode 100644 index 4543b2afab..0000000000 --- a/lang/de/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Erlaubt den Zugriff auf den Websocket für diesen Server.', - 'control_console' => 'Erlaubt dem Benutzer, Daten an die Server-Konsole zu senden.', - 'control_start' => 'Erlaubt dem Benutzer, die Serverinstanz zu starten.', - 'control_stop' => 'Erlaubt dem Benutzer, die Serverinstanz zu stoppen.', - 'control_restart' => 'Erlaubt dem Benutzer, die Serverinstanz neu zu starten.', - 'control_kill' => 'Ermöglicht dem Benutzer, die Server-Instanz zu beenden.', - 'user_create' => 'Erlaubt dem Benutzer, neue Benutzerkonten für den Server zu erstellen.', - 'user_read' => 'Ermöglicht dem Benutzer, die mit diesem Server verbundenen Benutzer anzuzeigen.', - 'user_update' => 'Ermöglicht dem Benutzer, andere mit diesem Server verbundene Benutzer zu ändern.', - 'user_delete' => 'Ermöglicht dem Benutzer, andere mit diesem Server verbundene Benutzer zu löschen.', - 'file_create' => 'Ermöglicht dem Benutzer, neue Dateien und Verzeichnisse zu erstellen.', - 'file_read' => 'Ermöglicht dem Benutzer, Dateien und Ordner zu sehen, die dieser Serverinstanz zugeordnet sind, sowie deren Inhalt anzuzeigen.', - 'file_update' => 'Ermöglicht dem Benutzer, Dateien und Ordner zu aktualisieren, die dem Server zugeordnet sind.', - 'file_delete' => 'Ermöglicht dem Benutzer, Dateien und Verzeichnisse zu löschen.', - 'file_archive' => 'Ermöglicht dem Benutzer, Datei-Archive zu erstellen und bestehende Archive zu dekomprimieren.', - 'file_sftp' => 'Ermöglicht dem Benutzer, die obigen Dateiaktionen mit einem SFTP-Client auszuführen.', - 'allocation_read' => 'Ermöglicht den Zugriff auf die Seiten zur Verwaltung der Server-Zuordnung.', - 'allocation_update' => 'Ermöglicht dem Benutzer, die Zuweisungen des Servers zu modifizieren.', - 'database_create' => 'Ermöglicht dem Benutzer die Berechtigung zum Erstellen einer neuen Datenbank für den Server.', - 'database_read' => 'Ermöglicht dem Benutzer, die Serverdatenbanken anzuzeigen.', - 'database_update' => 'Ermöglicht einem Benutzer, Änderungen an einer Datenbank vorzunehmen. Wenn der Benutzer nicht über die "Passwort anzeigen" Berechtigung verfügt, kann er das Passwort nicht ändern.', - 'database_delete' => 'Ermöglicht einem Benutzer, eine Datenbankinstanz zu löschen.', - 'database_view_password' => 'Ermöglicht einem Benutzer, ein Datenbankpasswort im System anzuzeigen.', - 'schedule_create' => 'Ermöglicht einem Benutzer, einen neuen Zeitplan für den Server zu erstellen.', - 'schedule_read' => 'Ermöglicht der Benutzer-Berechtigung, Zeitpläne für einen Server anzuzeigen.', - 'schedule_update' => 'Ermöglicht einem Benutzer, Änderungen an einem bestehenden Serverplan vorzunehmen.', - 'schedule_delete' => 'Ermöglicht einem Benutzer, einen Zeitplan für den Server zu löschen.', - ], -]; diff --git a/lang/de/strings.php b/lang/de/strings.php deleted file mode 100644 index ed26122b03..0000000000 --- a/lang/de/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-Mail', - 'email_address' => 'E-Mail Adresse', - 'user_identifier' => 'Benutzername oder E-Mail', - 'password' => 'Passwort', - 'new_password' => 'Neues Passwort', - 'confirm_password' => 'Neues Passwort bestätigen', - 'login' => 'Anmelden', - 'home' => 'Startseite', - 'servers' => 'Server', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Verbindung', - 'memory' => 'Arbeitsspeicher', - 'cpu' => 'CPU', - 'disk' => 'Festplatte', - 'status' => 'Status', - 'search' => 'Suchen', - 'suspended' => 'Gesperrt', - 'account' => 'Konto', - 'security' => 'Sicherheit', - 'ip' => 'IP-Adresse', - 'last_activity' => 'Letzte Aktivität', - 'revoke' => 'Widerrufen', - '2fa_token' => 'Authentifizierungs-Token', - 'submit' => 'Bestätigen', - 'close' => 'Schließen', - 'settings' => 'Einstellungen', - 'configuration' => 'Konfiguration', - 'sftp' => 'SFTP', - 'databases' => 'Datenbanken', - 'memo' => 'Notiz', - 'created' => 'Erstellt', - 'expires' => 'Gültig bis', - 'public_key' => 'Token', - 'api_access' => 'Api-Zugriff', - 'never' => 'niemals', - 'sign_out' => 'Abmelden', - 'admin_control' => 'Admin Verwaltung', - 'required' => 'Erforderlich', - 'port' => 'Port', - 'username' => 'Benutzername', - 'database' => 'Datenbank', - 'new' => 'Neu', - 'danger' => 'Achtung', - 'create' => 'Erstellen', - 'select_all' => 'Alle auswählen', - 'select_none' => 'Nichts auswählen', - 'alias' => 'Alias', - 'primary' => 'Primär', - 'make_primary' => 'Als Primär festlegen', - 'none' => 'Keine', - 'cancel' => 'Abbrechen', - 'created_at' => 'Erstellt am', - 'action' => 'Aktion', - 'data' => 'Daten', - 'queued' => 'In der Warteschlange', - 'last_run' => 'Zuletzt ausgeführt', - 'next_run' => 'Nächste Ausführung', - 'not_run_yet' => 'Noch nicht ausgeführt', - 'yes' => 'Ja', - 'no' => 'Nein', - 'delete' => 'Löschen', - '2fa' => '2FA', - 'logout' => 'Abmelden', - 'admin_cp' => 'Admin Verwaltung', - 'optional' => 'Optional', - 'read_only' => 'Nur lesen', - 'relation' => 'Beziehung', - 'owner' => 'Besitzer', - 'admin' => 'Admin', - 'subuser' => 'Unterbenutzer', - 'captcha_invalid' => 'Das angegebene Captcha ist ungültig.', - 'tasks' => 'Aufgaben', - 'seconds' => 'Sekunden', - 'minutes' => 'Minuten', - 'under_maintenance' => 'Wartungsarbeiten', - 'days' => [ - 'sun' => 'Sonntag', - 'mon' => 'Montag', - 'tues' => 'Dienstag', - 'wed' => 'Mittwoch', - 'thurs' => 'Donnerstag', - 'fri' => 'Freitag', - 'sat' => 'Samstag', - ], - 'last_used' => 'Zuletzt verwendet', - 'enable' => 'Aktivieren', - 'disable' => 'Deaktivieren', - 'save' => 'Speichern', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/de/validation.php b/lang/de/validation.php index a7a30cc014..304d202b7b 100644 --- a/lang/de/validation.php +++ b/lang/de/validation.php @@ -12,10 +12,10 @@ | */ - 'accepted' => ':attribute muss akzeptiert werden.', - 'active_url' => ':attribute ist keine gültige URL.', + 'accepted' => 'Das :attribute muss akzeptiert werden.', + 'active_url' => 'Das :attribute ist keine gültige URL.', 'after' => ':attribute muss ein Datum nach :date sein.', - 'after_or_equal' => ':attribute muss ein Datum nach oder gleich :date sein.', + 'after_or_equal' => ':attribute muss ein Datum nach :date oder gleich :date sein.', 'alpha' => ':attribute darf nur Buchstaben enthalten.', 'alpha_dash' => ':attribute darf nur Buchstaben, Zahlen und Bindestriche enthalten.', 'alpha_num' => ':attribute darf nur Buchstaben und Zahlen enthalten.', @@ -28,22 +28,22 @@ 'string' => ':attribute muss zwischen :min und :max Zeichen haben.', 'array' => ':attribute muss zwischen :min und :max Elemente haben.', ], - 'boolean' => ':attribute muss wahr oder falsch sein.', + 'confirmed' => 'Die :attribute Bestätigung stimmt nicht überein.', 'date' => ':attribute ist kein gültiges Datum.', 'date_format' => ':attribute entspricht nicht dem Format :format.', 'different' => ':attribute und :other müssen unterschiedlich sein.', 'digits' => ':attribute muss :digits Zeichen enthalten.', 'digits_between' => ':attribute muss zwischen :min und :max Zeichen haben.', - 'dimensions' => ':attribute hat ungültige Bildabmessungen.', - 'distinct' => ':attribute Feld hat einen doppelten Wert.', + 'dimensions' => 'Das :attribute hat eine ungültige Bildgröße.', + 'email' => ':attribute muss eine gültige E-Mail Adresse sein.', - 'exists' => ':attribute ist ungültig.', + 'file' => ':attribute muss eine Datei sein.', 'filled' => ':attribute Feld ist erforderlich.', 'image' => ':attribute muss ein Bild sein.', - 'in' => 'Das ausgewählte :attribute ist ungültig.', - 'in_array' => ':attribute Feld existiert nicht in :other.', + + 'in_array' => 'Das :attribute Feld existiert nicht in :other.', 'integer' => ':attribute muss eine ganze Zahl sein.', 'ip' => ':attribute muss eine gültige IP-Adresse sein.', 'json' => ':attribute muss ein gültiger JSON-String sein.', @@ -57,21 +57,17 @@ 'mimetypes' => ':attribute muss den Dateityp :values haben.', 'min' => [ 'numeric' => ':attribute muss mindestens :min sein.', - 'file' => ':attribute muss mindestens :min Kilobytes groß sein.', + 'file' => 'Das :attribute muss mindestens :min Kilobytes sein.', 'string' => ':attribute muss mindestens :min Zeichen enthalten.', 'array' => ':attribute muss mindestens :min Elemente haben.', ], - 'not_in' => 'Das ausgewählte :attribute ist ungültig.', + 'numeric' => ':attribute muss eine Zahl sein.', - 'present' => ':attribute Feld muss vorhanden sein.', + 'regex' => ':attribute Format ist ungültig.', - 'required' => ':attribute Feld ist erforderlich.', - 'required_if' => ':attribute muss angegeben werden, wenn :other :value ist.', - 'required_unless' => ':attribute Feld ist erforderlich, sofern :other nicht in :values ist.', - 'required_with' => ':attribute muss angegeben werden, wenn :values vorhanden ist.', + 'required_with_all' => ':attribute muss angegeben werden, wenn :values vorhanden ist.', - 'required_without' => ':attribute muss angegeben werden, wenn :values nicht vorhanden sind.', - 'required_without_all' => ':attribute muss angegeben werden, wenn keine :values vorhanden sind.', + 'same' => ':attribute und :other müssen übereinstimmen.', 'size' => [ 'numeric' => ':attribute muss :size sein.', @@ -81,8 +77,7 @@ ], 'string' => ':attribute muss ein String sein.', 'timezone' => ':attribute muss eine gültige Zone sein.', - 'unique' => ':attribute ist bereits vergeben.', - 'uploaded' => ':attribute konnte nicht hochgeladen werden.', + 'url' => ':attribute Format ist ungültig.', /* diff --git a/lang/el/activity.php b/lang/el/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/el/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/el/admin/eggs.php b/lang/el/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/el/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/el/admin/health.php b/lang/el/admin/health.php new file mode 100644 index 0000000000..5f8f4389ea --- /dev/null +++ b/lang/el/admin/health.php @@ -0,0 +1,60 @@ + 'Υγεία', + 'results_refreshed' => 'Ο έλεγχος υγείας ενημερώθηκε', + 'checked' => 'Ελεγχθέντα αποτελέσματα από τις :time', + 'refresh' => 'Ανανέωση', + 'results' => [ + 'cache' => [ + 'label' => 'Προσωρινή μνήμη', + 'ok' => 'Οκ', + 'failed_retrieve' => 'Δεν ήταν δυνατός ο ορισμός ή η ανάκτηση τιμής από την προσωρινή μνήμη της εφαρμογής.', + 'failed' => 'Προέκυψε σφάλμα (exception) στην προσωρινή μνήμη της εφαρμογής: :error', + ], + 'database' => [ + 'label' => 'Βάση δεδομένων', + 'ok' => 'Οκ', + 'failed' => 'Δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων: :error', + ], + 'debugmode' => [ + 'label' => 'Λειτουργία Debug', + 'ok' => 'Η λειτουργία εντοπισμού σφαλμάτων είναι απενεργοποιημένη', + 'failed' => 'Η λειτουργία εντοπισμού σφαλμάτων αναμενόταν να είναι :expected αλλά στην πραγματικότητα ήταν :actual', + ], + 'environment' => [ + 'label' => 'Περιβάλλον', + 'ok' => 'Εντάξει, ορίστηκε σε :actual', + 'failed' => 'Το περιβάλλον έχει οριστεί σε :actual , Αναμενόμενο :expected', + ], + 'nodeversions' => [ + 'label' => 'Εκδόσεις Node', + 'ok' => 'Τα Nodes είναι ενημερωμένα', + 'failed' => ':outdated/:all Τα Nodes δεν είναι ενημερωμένα', + 'no_nodes_created' => 'Δεν δημιουργήθηκαν Nodes', + 'no_nodes' => 'Δεν υπάρχουν Nodes', + 'all_up_to_date' => 'Όλα ενημερωμένα', + 'outdated' => ':outdated/:all δεν είναι ενημερωμένα', + ], + 'panelversion' => [ + 'label' => 'Έκδοση Πίνακα Ελέγχου', + 'ok' => 'Ο πίνακας ελέγχου είναι ενημερωμένος', + 'failed' => 'Η εγκατεστημένη έκδοση είναι :currentVersion αλλά η τελευταία είναι :latestVersion', + 'up_to_date' => 'Ενημερωμένο', + 'outdated' => 'Δεν είναι ενημερωμένο', + ], + 'schedule' => [ + 'label' => 'Πρόγραμμα', + 'ok' => 'Οκ', + 'failed_last_ran' => 'Η τελευταία προγραμματισμένη εκτέλεση του προγράμματος έγινε πριν από :time λεπτά', + 'failed_not_ran' => 'Το πρόγραμμα δεν εκτελέστηκε ακόμα.', + ], + 'useddiskspace' => [ + 'label' => 'Χώρος Δίσκου', + ], + ], + 'checks' => [ + 'successful' => 'Επιτυχής', + 'failed' => 'Απέτυχε', + ], +]; diff --git a/lang/el/admin/node.php b/lang/el/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/el/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/el/admin/server.php b/lang/el/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/el/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/el/admin/user.php b/lang/el/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/el/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/el/auth.php b/lang/el/auth.php index 2a3a452682..6b73166f9c 100644 --- a/lang/el/auth.php +++ b/lang/el/auth.php @@ -1,27 +1,24 @@ 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], + 'failed' => 'Αυτά τα credentials δεν ταιριάζουν με τις εγγραφές μας.', + 'failed-two-factor' => 'Λανθασμένος κωδικός 2FA', + 'two-factor-code' => 'Κωδικός Δύο Παραγόντων (2FA)', + 'two-factor-hint' => 'Μπορείτε να χρησιμοποιήσετε τους εφεδρικούς κωδικούς εάν χάσατε πρόσβαση στη συσκευή σας.', + 'password' => 'Ο κωδικός που εισάγατε είναι λανθασμένος.', + 'throttle' => 'Πάρα πολλές προσπάθειες σύνδεσης. Παρακαλώ δοκιμάστε ξανά σε :seconds δευτερόλεπτα.', + '2fa_must_be_enabled' => 'Ο διαχειριστής απαιτεί την ενεργοποίηση του ελέγχου ταυτότητας δύο παραγόντων (2FA) για τον λογαριασμό σας ώστε να χρησιμοποιήσετε τον πίνακα ελέγχου.', - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', ]; diff --git a/lang/el/command/messages.php b/lang/el/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/el/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/el/dashboard/account.php b/lang/el/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/el/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/el/dashboard/index.php b/lang/el/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/el/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/el/exceptions.php b/lang/el/exceptions.php index 3977c87c24..60e39747f4 100644 --- a/lang/el/exceptions.php +++ b/lang/el/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'Υπήρξε ένα exception κατά την προσπάθεια επικοινωνίας με το daemon με αποτέλεσμα να υπάρχει κωδικός απόκρισης HTTP/:code. Αυτή η εξαίρεση έχει καταγραφεί.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'Ένας κόμβος δεν πρέπει να έχει διακομιστές συνδεδεμένους με αυτόν για να διαγραφτεί.', + 'error_connecting' => 'Σφάλμα σύνδεσης σε :node', + 'daemon_off_config_updated' => 'Η ρύθμιση παραμέτρων daemon έχει ενημερωθεί, Ωστόσο, υπήρξε ένα σφάλμα κατά την προσπάθεια αυτόματης ενημέρωσης του αρχείου ρυθμίσεων στο daemon. Θα χρειαστεί να ενημερώσετε χειροκίνητα το αρχείο ρυθμίσεων (config.yml) για το daemon ώστε να εφαρμοστούν αυτές οι αλλαγές.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'Ένας διακομιστής έχει ανατεθεί σε αυτήν την κατανομή. Μια κατανομή μπορεί να διαγραφτεί μόνο αν δεν έχει οριστεί κανένας διακομιστής για αυτήν.', + 'too_many_ports' => 'Η προσθήκη περισσότερων από 1000 θυρών σε ένα εύρος ταυτόχρονα δεν υποστηρίζεται.', + 'invalid_mapping' => 'Η χαρτογράφηση που παρέχεται για :port ήταν άκυρη και δεν μπόρεσε να υποβληθεί σε επεξεργασία.', + 'cidr_out_of_range' => 'Η ένδειξη CIDR επιτρέπει μόνο μάσκες μεταξύ /25 και /32.', + 'port_out_of_range' => 'Οι θύρες σε μια κατανομή πρέπει να είναι μεγαλύτεροι από 1024 και μικρότεροι ή ίσοι με 65535.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Ένα Αυγό με ενεργούς διακομιστές που είναι συνδεδεμένοι σε αυτό δεν μπορεί να διαγραφτεί από τον πίνακα.', + 'invalid_copy_id' => 'Το Αυγό που επιλέχθηκε για την αντιγραφή ενός σεναρίου είτε δεν υπάρχει ή αντιγράφει το ίδιο το σενάριο.', + 'has_children' => 'Αυτό το Αυγό είναι γονέας σε ένα ή περισσότερα άλλα Αυγά. Παρακαλώ διαγράψτε αυτά τα Αυγά πριν διαγράψετε αυτό το συγκεκριμένο αυγό.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'Η μεταβλητή περιβάλλοντος :name πρέπει να είναι μοναδική σε αυτό το Αυγό.', + 'reserved_name' => 'Η μεταβλητή περιβάλλοντος :name προστατεύεται και δεν μπορεί να ανατεθεί σε μια μεταβλητή.', + 'bad_validation_rule' => 'Ο κανόνας επικύρωσης ":rule" δεν είναι έγκυρος κανόνας για αυτήν την εφαρμογή.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'Παρουσιάστηκε σφάλμα κατά την προσπάθεια ανάλυσης του αρχείου JSON: :error.', + 'file_error' => 'Το παρεχόμενο αρχείο JSON δεν ήταν έγκυρο.', + 'invalid_json_provided' => 'Το αρχείο JSON που παρέχεται δεν είναι σε μορφή που μπορεί να αναγνωριστεί.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Η επεξεργασία του δικού σας χρήστη δεν επιτρέπεται.', + 'user_is_owner' => 'Δεν μπορείτε να προσθέσετε τον ιδιοκτήτη του διακομιστή ως χρήστη σε αυτόν το διακομιστή.', + 'subuser_exists' => 'Ένας χρήστης με αυτή τη διεύθυνση ηλεκτρονικού ταχυδρομείου έχει ήδη αντιστοιχιστεί ως υποχρήστης για αυτόν τον διακομιστή.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Δεν είναι δυνατή η διαγραφή ενός διακομιστή βάσης δεδομένων που έχει ενεργές βάσεις δεδομένων συνδεδεμένες με αυτόν.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Το μέγιστο χρονικό διάστημα για μια αλυσοδεμένη εργασία είναι 15 λεπτά.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Δεν είναι δυνατή η διαγραφή μιας τοποθεσίας που έχει συνδεδεμένους ενεργούς κόμβους.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Δεν μπορείτε να διαγράψετε το δικό σας λογαριασμό χρήστη.', + 'has_servers' => 'Δεν είναι δυνατή η διαγραφή ενός χρήστη με ενεργούς διακομιστές συνδεδεμένους στον λογαριασμό του. Παρακαλούμε διαγράψτε τους διακομιστές του πριν συνεχίσετε.', + 'node_revocation_failed' => 'Αποτυχία ανάκλησης κλειδιών στον κόμβο #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Δεν βρέθηκαν κόμβοι που να ικανοποιούν τις απαιτήσεις που καθορίζονται για την αυτόματη ανάπτυξη.', + 'no_viable_allocations' => 'Δεν βρέθηκαν allocations που να ικανοποιούν τις απαιτήσεις για αυτόματη ανάπτυξη.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => 'Ο πόρος που ζητήθηκε δεν υπάρχει σε αυτόν το διακομιστή.', + ], + 'mount' => [ + 'servers_attached' => 'Ένας κόμβος δεν πρέπει να έχει διακομιστές συνδεδεμένους με αυτόν για να διαγραφτεί.', + ], + 'server' => [ + 'marked_as_failed' => 'Αυτός ο διακομιστής δεν έχει ολοκληρώσει ακόμη τη διαδικασία εγκατάστασης, παρακαλώ προσπαθήστε ξανά αργότερα.', ], ]; diff --git a/lang/el/pagination.php b/lang/el/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/el/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/el/passwords.php b/lang/el/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/el/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/el/search.php b/lang/el/search.php new file mode 100644 index 0000000000..405c1cdeb5 --- /dev/null +++ b/lang/el/search.php @@ -0,0 +1,9 @@ + 'Παρακαλώ συμπληρώστε τουλάχιστον τρεις χαρακτήρες ώστε να πραγματοποιήσετε αναζήτηση', + 'term' => [ + 'label' => 'Όρος Αναζήτησης', + 'description' => 'Εισάγετε όνομα διακομιστή, UUID ή κατανομή ώστε να πραγματοποιήσετε αναζήτηση', + ], +]; diff --git a/lang/el/server/users.php b/lang/el/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/el/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/el/strings.php b/lang/el/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/el/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/el/validation.php b/lang/el/validation.php index 9cccf35080..7addbd3ec5 100644 --- a/lang/el/validation.php +++ b/lang/el/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => 'Το :attribute πρέπει να γίνει αποδεκτό.', + 'active_url' => 'Το :attribute δεν είναι μια έγκυρη διεύθυνση.', + 'after' => 'Το :attribute πρέπει να είναι μια ημερομηνία μετά τις :date.', + 'after_or_equal' => 'Tο :attribute πρέπει να είναι μια ημερομηνία μετά ή ίδια με :date.', + 'alpha' => 'Το :attribute μπορεί να περιέχει μόνο γράμματα.', + 'alpha_dash' => 'Το :attribute μπορεί να περιέχει μόνο γράμματα, αριθμούς και παύλες.', + 'alpha_num' => 'Το :attribute μπορεί να περιέχει μόνο γράμματα και αριθμούς.', + 'array' => 'Το :attribute πρέπει να είναι πίνακας.', + 'before' => 'Tο :attribute πρέπει να είναι μια ημερομηνία πριν από :date.', + 'before_or_equal' => 'Το :attribute πρέπει να είναι μια ημερομηνία πριν ή ίση με :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => 'Tο :attribute πρέπει να είναι ανάμεσα σε :min και :max.', + 'file' => 'Το :attribute πρέπει να είναι μεταξύ :min και :max kilobytes.', + 'string' => 'Το :attribute πρέπει να είναι μεταξύ :min και :max χαρακτήρες.', + 'array' => 'Tο :attribute πρέπει να είναι ανάμεσα σε :min και :max αντικείμενα.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => 'Η επιβεβαίωση του :attribute δεν ταιριάζει.', + 'date' => 'Το :attribute δεν είναι μια έγκυρη ημερομηνία.', + 'date_format' => 'Tο :attribute δεν ταιριάζει με την μορφή :format.', + 'different' => 'Το :attribute και :other πρέπει να είναι διαφορετικά.', + 'digits' => 'Το :attribute πρέπει να είναι :digits ψηφία.', + 'digits_between' => 'Το :attribute πρέπει να είναι μεταξύ των ψηφίων :min και :max.', + 'dimensions' => 'To :attribute έχει μη έγκυρες διαστάσεις εικόνας.', + + 'email' => 'Tο :attribute πρέπει να είναι μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου.', + + 'file' => 'Tο :attribute πρέπει να είναι αρχείο.', + 'filled' => 'Το πεδίο :attribute είναι υποχρεωτικό.', + 'image' => 'Το :attribute πρέπει να είναι εικόνα.', + + 'in_array' => 'Το πεδίο :attribute δεν υπάρχει στο :other.', + 'integer' => 'Tο :attribute πρέπει να είναι ακέραιος αριθμός.', + 'ip' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση IP.', + 'json' => 'Το :attribute πρέπει να είναι έγκυρο JSON string.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => 'Το :attribute δεν μπορεί να είναι μεγαλύτερο από :max.', + 'file' => 'To :attribute δεν μπορεί να είναι μεγαλύτερο από :max kilobytes.', + 'string' => 'Το :attribute δεν μπορεί να είναι μεγαλύτερο από :max χαρακτήρες.', + 'array' => 'Tο :attribute δεν μπορεί να έχει περισσότερα από :max αντικείμενα.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => 'Το :attribute πρέπει να είναι ένα αρχείου τύπου: :values.', + 'mimetypes' => 'Το :attribute πρέπει να είναι ένα αρχείο τύπου: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => 'Το :attribute πρέπει να είναι τουλάχιστον: min.', + 'file' => 'Tο :attribute πρέπει να είναι το λιγότερο :min kilobytes.', + 'string' => 'Το :attribute πρέπει να είναι τουλάχιστον :min χαρακτήρες.', + 'array' => 'To :attribute πρέπει να έχει τουλάχιστον :min αντικείμενα.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => 'To :attribute πρέπει να είναι αριθμός.', + + 'regex' => 'Το :attribute έχει μη έγκυρη μορφή.', + + 'required_with_all' => 'Tο :attribute πεδίο είναι υποχρεωτικό όταν υπάρχουν :values.', + + 'same' => 'Το :attribute και :other πρέπει να ταιριάζουν.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => 'Το :attribute πρέπει να είναι :size.', + 'file' => 'Το :attribute πρέπει να έχει μέγεθος :size kilobytes.', + 'string' => 'Το :attribute πρέπει να έχει μέγεθος :size χαρακτήρων.', + 'array' => 'Το :attribute πρέπει να περιέχει μέγεθος :size αντικειμένων.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => 'Το :attribute πρέπει να είναι string.', + 'timezone' => 'Το :attribute πρέπει να είναι μία έγκυρη ζώνη ώρας.', + + 'url' => 'Το :attribute έχει μη έγκυρη μορφή.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => ':env μεταβλητή', + 'invalid_password' => 'Ο κωδικός πρόσβασης που δόθηκε δεν ήταν έγκυρος για αυτόν το λογαριασμό.', ], ]; diff --git a/lang/en/activity.php b/lang/en/activity.php index 501a1dcde6..464854f004 100644 --- a/lang/en/activity.php +++ b/lang/en/activity.php @@ -11,27 +11,27 @@ 'fail' => 'Failed log in', 'success' => 'Logged in', 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', 'checkpoint' => 'Two-factor authentication requested', 'recovery-token' => 'Used two-factor recovery token', 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', + 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', 'sftp' => [ 'fail' => 'Failed SFTP log in', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Changed email from :old to :new', + 'username-changed' => 'Changed username from :old to :new', + 'email-changed' => 'Changed email from :old to :new', 'password-changed' => 'Changed password', ], 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', + 'create' => 'Created new API key :identifier', + 'delete' => 'Deleted API key :identifier', ], 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', + 'create' => 'Added SSH key :fingerprint to account', + 'delete' => 'Removed SSH key :fingerprint from account', ], 'two-factor' => [ 'create' => 'Enabled two-factor auth', @@ -39,9 +39,8 @@ ], ], 'server' => [ - 'reinstall' => 'Reinstalled server', 'console' => [ - 'command' => 'Executed ":command" on the server', + 'command' => 'Executed ":command" on the server', ], 'power' => [ 'start' => 'Started the server', @@ -50,81 +49,77 @@ 'kill' => 'Killed the server process', ], 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', + 'download' => 'Downloaded the :name backup', + 'delete' => 'Deleted the :name backup', + 'restore' => 'Restored the :name backup (deleted files: :truncate)', + 'restore-complete' => 'Completed restoration of the :name backup', + 'restore-failed' => 'Failed to complete restoration of the :name backup', + 'start' => 'Started a new backup :name', + 'complete' => 'Marked the :name backup as complete', + 'fail' => 'Marked the :name backup as failed', + 'lock' => 'Locked the :name backup', + 'unlock' => 'Unlocked the :name backup', + 'rename' => 'Renamed backup from ":old_name" to ":new_name"', ], 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', + 'create' => 'Created new database :name', + 'rotate-password' => 'Password rotated for database :name', + 'delete' => 'Deleted database :name', ], 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', + 'compress' => 'Compressed :directory:files|Compressed :count files in :directory', + 'read' => 'Viewed the contents of :file', + 'copy' => 'Created a copy of :file', + 'create-directory' => 'Created directory :directory:name', + 'decompress' => 'Decompressed :file in :directory', + 'delete' => 'Deleted :directory:files|Deleted :count files in :directory', + 'download' => 'Downloaded :file', + 'pull' => 'Downloaded a remote file from :url to :directory', + 'rename' => 'Moved/ Renamed :from to :to|Moved/ Renamed :count files in :directory', + 'write' => 'Wrote new content to :file', 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', + 'uploaded' => 'Uploaded :directory:file', ], 'sftp' => [ 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', + 'create' => 'Created :files|Created :count new files', + 'write' => 'Modified the contents of :files|Modified the contents of :count files', + 'delete' => 'Deleted :files|Deleted :count files', + 'create-directory' => 'Created the :files directory|Created :count directories', + 'rename' => 'Renamed :from to :to|Renamed or moved :count files', ], 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', + 'create' => 'Added :allocation to the server', + 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', + 'primary' => 'Set :allocation as the primary server allocation', + 'delete' => 'Deleted the :allocation allocation', ], 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', + 'create' => 'Created the :name schedule', + 'update' => 'Updated the :name schedule', + 'execute' => 'Manually executed the :name schedule', + 'delete' => 'Deleted the :name schedule', ], 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', + 'create' => 'Created a new ":action" task for the :name schedule', + 'update' => 'Updated the ":action" task for the :name schedule', + 'delete' => 'Deleted the ":action" task for the :name schedule', ], 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', + 'rename' => 'Renamed the server from ":old" to ":new"', + 'description' => 'Changed the server description from ":old" to ":new"', + 'reinstall' => 'Reinstalled server', ], 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', + 'edit' => 'Changed the :variable variable from ":old" to ":new"', + 'image' => 'Updated the Docker Image for the server from :old to :new', + 'command' => 'Updated the Startup Command for the server from :old to :new', ], 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', + 'create' => 'Added :email as a subuser', + 'update' => 'Updated the subuser permissions for :email', + 'delete' => 'Removed :email as a subuser', ], + 'crashed' => 'Server crashed', ], ]; diff --git a/lang/en/admin/apikey.php b/lang/en/admin/apikey.php new file mode 100644 index 0000000000..ea12955ec5 --- /dev/null +++ b/lang/en/admin/apikey.php @@ -0,0 +1,29 @@ + 'Application API Keys', + 'empty' => 'No API keys', + 'whitelist' => 'Whitelisted IPv4 Addresses', + 'whitelist_help' => 'API keys can be restricted to only work from specific IPv4 addresses. Enter each address on a new line.', + 'whitelist_placeholder' => 'Example: 127.0.0.1 or 192.168.1.1', + 'description' => 'Description', + 'description_help' => 'A brief description of what this key is for.', + 'nav_title' => 'API Keys', + 'model_label' => 'Application API Key', + 'model_label_plural' => 'Application API Keys', + 'table' => [ + 'key' => 'Key', + 'description' => 'Description', + 'last_used' => 'Last Used', + 'created' => 'Created', + 'created_by' => 'Created By', + 'never_used' => 'Never Used', + ], + 'permissions' => [ + 'all' => 'Set All Permissions', + 'all_description' => 'Quickly set all permissions below to the same level.', + 'none' => 'None', + 'read' => 'Read', + 'read_write' => 'Read & Write', + ], +]; diff --git a/lang/en/admin/dashboard.php b/lang/en/admin/dashboard.php new file mode 100644 index 0000000000..410175e9c0 --- /dev/null +++ b/lang/en/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Welcome to Pelican!', + 'version' => 'Version: :version', + 'advanced' => 'Advanced', + 'server' => 'Server', + 'user' => 'User', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Information for Developers', + 'content' => 'Thank you for trying out the development version!', + 'extra_note' => 'If you run into any issues, please report them on GitHub.', + 'button_issues' => 'Create Issue', + 'button_features' => 'Discuss Features', + ], + 'intro-update-available' => [ + 'heading' => 'Update available', + 'content' => ':latestVersion is now available! Read our documentation to update your Panel.', + 'button_changelog' => 'What\'s New?', + ], + 'intro-no-update' => [ + 'heading' => 'Your Panel is up to date', + 'content' => 'You are currently using :version. Your panel is up-to-date!', + ], + 'intro-first-node' => [ + 'heading' => 'No Nodes Detected', + 'content' => "It looks like you don't have any Nodes set up yet, but don't worry because you click the action button to create your first one!", + 'extra_note' => 'If you run into any issues, please report them on GitHub.', + 'button_label' => 'Create first Node in Pelican', + ], + 'intro-support' => [ + 'heading' => 'Support Pelican', + 'content' => 'Thank you for using Pelican, this could only be achieved through the support of you, our contributors, and the rest of our supporters!', + 'extra_note' => 'We appreciate any and all support from anybody.', + 'button_translate' => 'Help Translate', + 'button_donate' => 'Donate Directly', + ], + 'intro-help' => [ + 'heading' => 'Need Help?', + 'content' => 'Check out the documentation first! If you still need help head on over to our discord server!', + 'button_docs' => 'Read Documentation', + ], + ], +]; diff --git a/lang/en/admin/databasehost.php b/lang/en/admin/databasehost.php new file mode 100644 index 0000000000..263b25e0e4 --- /dev/null +++ b/lang/en/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Database Hosts', + 'model_label' => 'Database Host', + 'model_label_plural' => 'Database Hosts', + 'table' => [ + 'database' => 'Database', + 'name' => 'Name', + 'host' => 'Host', + 'port' => 'Port', + 'name_helper' => 'Leaving this blank will auto generate a random name', + 'username' => 'Username', + 'password' => 'Password', + 'remote' => 'Connections From', + 'remote_helper' => 'Where connections should be allowed from. Leave blank to allow connections from anywhere.', + 'max_connections' => 'Max Connections', + 'created_at' => 'Created At', + 'connection_string' => 'JDBC Connection String', + ], + 'error' => 'Error connecting to host', + 'host' => 'Host', + 'host_help' => 'The IP address or Domain name that should be used when attempting to connect to this MySQL host from this Panel to create new databases.', + 'port' => 'Port', + 'port_help' => 'The port that MySQL is running on for this host.', + 'max_database' => 'Max Databases', + 'max_databases_help' => 'The maximum number of databases that can be created on this host. If the limit is reached, no new databases can be created on this host. Blank is unlimited.', + 'display_name' => 'Display Name', + 'display_name_help' => 'The IP address or Domain name that should be shown to the enduser.', + 'username' => 'Username', + 'username_help' => 'The username of an account that has enough permissions to create new users and databases on the system.', + 'password' => 'Password', + 'password_help' => 'The password for the database user.', + 'linked_nodes' => 'Linked Nodes', + 'linked_nodes_help' => 'This setting only defaults to this database host when adding a database to a server on the selected Node.', + 'connection_error' => 'Error connecting to database host', + 'no_database_hosts' => 'No Database Hosts', + 'no_nodes' => 'No Nodes', + 'delete_help' => 'Database Host Has Databases', + 'unlimited' => 'Unlimited', + 'anywhere' => 'Anywhere', + + 'rotate' => 'Rotate', + 'rotate_password' => 'Rotate Password', + 'rotated' => 'Password Rotated', + 'rotate_error' => 'Password Rotation Failed', + 'databases' => 'Databases', + + 'setup' => [ + 'preparations' => 'Preparations', + 'database_setup' => 'Database Setup', + 'panel_setup' => 'Panel Setup', + + 'note' => 'Currently, only MySQL/ MariaDB databases are supported for database hosts!', + 'different_server' => 'Are the panel and the database not on the same server?', + + 'database_user' => 'Database User', + 'cli_login' => 'Use mysql -u root -p to access mysql cli.', + 'command_create_user' => 'Command to create the user', + 'command_assign_permissions' => 'Command to assign permissions', + 'cli_exit' => 'To exit mysql cli run exit.', + 'external_access' => 'External Access', + 'allow_external_access' => ' +

Chances are you\'ll need to allow external access to this MySQL instance in order to allow servers to connect to it.

+
+

To do this, open my.cnf, which varies in location depending on your OS and how MySQL was installed. You can type find /etc -iname my.cnf to locate it.

+
+

Open my.cnf, add text below to the bottom of the file and save it:
+ [mysqld]
bind-address=0.0.0.0

+
+

Restart MySQL/ MariaDB to apply these changes. This will override the default MySQL configuration, which by default will only accept requests from localhost. Updating this will allow connections on all interfaces, and thus, external connections. Make sure to allow the MySQL port (default 3306) in your firewall.

+ ', + ], +]; diff --git a/lang/en/admin/egg.php b/lang/en/admin/egg.php new file mode 100644 index 0000000000..db5d69d510 --- /dev/null +++ b/lang/en/admin/egg.php @@ -0,0 +1,124 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => 'Configuration', + 'process_management' => 'Process Management', + 'egg_variables' => 'Egg Variables', + 'install_script' => 'Install Script', + ], + 'import' => [ + 'file' => 'File', + 'url' => 'URL', + 'image_url' => 'Image URL', + 'image_error' => 'Could not fetch image', + 'image_too_large' => 'Image too large. Limit is 1024KB', + 'egg_help' => 'This should be the raw .json/.yaml file', + 'url_help' => 'URLs must point directly to the raw .json/.yaml file', + 'add_url' => 'New URL', + 'import_failed' => 'Import Failed', + 'import_success' => 'Import Success', + 'import_result' => 'Imported :success of :total eggs', + 'imported_eggs' => 'Imported: :eggs', + 'failed_import_eggs' => 'Failed: :eggs', + 'github' => 'GitHub', + 'refresh' => 'Refresh', + 'import_image' => 'Import Image', + 'delete_image' => 'Delete Image', + 'no_local_ip' => 'Local IP Addresses are not allowed', + 'unsupported_format' => 'Unsupported Format. Supported Formats: :formats', + 'invalid_url' => 'The provided URL is invalid', + 'unknown_extension' => 'Unknown image extension', + 'image_deleted' => 'Image Deleted', + 'no_image' => 'No Image Provided', + 'image_updated' => 'Image Updated', + ], + 'export' => [ + 'modal' => 'How would you like to export :egg ?', + 'as' => 'As .:format', + ], + 'in_use' => 'In Use', + 'servers' => 'Servers', + 'name' => 'Name', + 'egg_uuid' => 'Egg UUID', + 'egg_id' => 'Egg ID', + 'name_help' => 'A simple, human-readable name to use as an identifier for this Egg.', + 'author' => 'Author', + 'uuid_help' => 'This is the globally unique identifier for this Egg which Wings uses as an identifier.', + 'author_help' => 'The author of this version of the Egg.', + 'author_help_edit' => 'The author of this version of the Egg. Uploading a new configuration from a different author will change this.', + 'description' => 'Description', + 'description_help' => 'A description of this Egg that will be displayed throughout the Panel as needed.', + 'add_startup' => 'Add Startup Command', + 'startup_command' => 'Command', + 'startup_commands' => 'Startup Commands', + 'startup_name' => 'Display Name', + 'startup_help' => 'The startup commands available to servers using this Egg. The first one is the default.', + 'file_denylist' => 'File Denylist', + 'file_denylist_help' => 'A list of files that the end user is not allowed to edit.', + 'features' => 'Features', + 'force_ip' => 'Force Outgoing IP', + 'force_ip_help' => 'Forces all outgoing network traffic to have its Source IP NATed to the IP of the server\'s primary allocation IP. Required for certain games to work properly when the Node has multiple public IP addresses. Enabling this option will disable internal networking for any servers using this Egg, causing them to be unable to internally access other servers on the same node.', + 'tags' => 'Tags', + 'update_url' => 'Update URL', + 'update_url_help' => 'URLs must point directly to the raw .json file', + 'add_image' => 'Add Docker Image', + 'docker_images' => 'Docker Images', + 'docker_name' => 'Image Name', + 'docker_uri' => 'Image URI', + 'docker_help' => 'The docker images available to servers using this Egg. The first one is the default.', + + 'stop_command' => 'Stop Command', + 'stop_command_help' => 'The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.', + 'copy_from' => 'Copy Settings From', + 'copy_from_help' => 'If you would like to default to settings from another Egg select it from the menu above.', + 'none' => 'None', + 'start_config' => 'Start Configuration', + 'start_config_help' => 'List of values the daemon should be looking for when booting a server to determine completion.', + 'config_files' => 'Configuration Files', + 'config_files_help' => 'This should be a JSON representation of configuration files to modify and what parts should be changed.', + 'log_config' => 'Log Configuration', + 'log_config_help' => 'This should be a JSON representation of where log files are stored, and whether or not the daemon should be creating custom logs.', + + 'environment_variable' => 'Environment Variable', + 'default_value' => 'Default Value', + 'user_permissions' => 'User Permissions', + 'viewable' => 'Viewable', + 'editable' => 'Editable', + 'rules' => 'Rules', + 'add_new_variable' => 'Add New Variable', + + 'error_unique' => 'A variable with this name already exists.', + 'error_required' => 'The environment variable field is required.', + 'error_reserved' => 'This environment variable is reserved and cannot be used.', + + 'script_from' => 'Script From', + 'script_container' => 'Script Container', + 'script_entry' => 'Script Entry', + 'script_install' => 'Install Script', + 'no_eggs' => 'No Eggs', + 'no_servers' => 'No Servers', + 'no_servers_help' => 'No Servers are assigned to this Egg', + + 'update' => 'Update|Update selected', + 'updated' => 'Egg updated|:count/:total Eggs updated', + 'updated_failed' => ':count failed', + 'updated_skipped' => ':count skipped', + 'update_success' => ':egg updated successfully', + 'update_failed' => 'Failed to update :egg', + 'update_question' => 'Are you sure you want to update this egg?|Are you sure you want to update the selected eggs?', + 'update_description' => 'If you made any changes to the egg they will be overwritten!|If you made any changes to the eggs they will be overwritten!', + 'no_updates' => 'No updates for the selected eggs available', + 'cannot_update' => 'Cannot update :count egg(s)', + 'no_update_url' => 'The following eggs do not have a working update URL set: :eggs', + 'cannot_delete' => 'Cannot delete :count egg(s)', + 'eggs_have_servers' => 'The following eggs have servers and cannot be deleted: :eggs', + 'updated_from' => 'Successfully updated from: :url', + 'update_error' => 'Error: :error', + 'updated_eggs' => 'Updated: :eggs', + 'failed_eggs' => 'Failed: :eggs', + 'skipped_eggs' => 'Skipped: :eggs', +]; diff --git a/lang/en/admin/eggs.php b/lang/en/admin/eggs.php deleted file mode 100644 index a0ec074444..0000000000 --- a/lang/en/admin/eggs.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], - 'descriptions' => [ - 'name' => 'A simple, human-readable name to use as an identifier for this Egg.', - 'description' => 'A description of this Egg that will be displayed throughout the Panel as needed.', - 'uuid' => 'This is the globally unique identifier for this Egg which Wings uses as an identifier.', - 'author' => 'The author of this version of the Egg. Uploading a new Egg configuration from a different author will change this.', - 'force_outgoing_ip' => "Forces all outgoing network traffic to have its Source IP NATed to the IP of the server's primary allocation IP.\nRequired for certain games to work properly when the Node has multiple public IP addresses.\nEnabling this option will disable internal networking for any servers using this egg, causing them to be unable to internally access other servers on the same node.", - 'startup' => 'The default startup command that should be used for new servers using this Egg.', - 'docker_images' => 'The docker images available to servers using this egg.', - ], -]; diff --git a/lang/en/admin/health.php b/lang/en/admin/health.php new file mode 100644 index 0000000000..03272d2114 --- /dev/null +++ b/lang/en/admin/health.php @@ -0,0 +1,60 @@ + 'Health', + 'results_refreshed' => 'Health check results updated', + 'checked' => 'Checked results from :time', + 'refresh' => 'Refresh', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Could not set or retrieve an application cache value.', + 'failed' => 'An exception occurred with the application cache: :error', + ], + 'database' => [ + 'label' => 'Database', + 'ok' => 'Ok', + 'failed' => 'Could not connect to the database: :error', + ], + 'debugmode' => [ + 'label' => 'Debug Mode', + 'ok' => 'Debug mode is disabled', + 'failed' => 'The debug mode was expected to be :expected, but actually was :actual', + ], + 'environment' => [ + 'label' => 'Environment', + 'ok' => 'Ok, Set to :actual', + 'failed' => 'Environment is set to :actual , Expected :expected', + ], + 'nodeversions' => [ + 'label' => 'Node Versions', + 'ok' => 'Nodes are up-to-date', + 'failed' => ':outdated/:all Nodes are outdated', + 'no_nodes_created' => 'No Nodes created', + 'no_nodes' => 'No Nodes', + 'all_up_to_date' => 'All up-to-date', + 'outdated' => ':outdated/:all outdated', + ], + 'panelversion' => [ + 'label' => 'Panel Version', + 'ok' => 'Panel is up-to-date', + 'failed' => 'Installed version is :currentVersion but latest is :latestVersion', + 'up_to_date' => 'Up to date', + 'outdated' => 'Outdated', + ], + 'schedule' => [ + 'label' => 'Schedule', + 'ok' => 'Ok', + 'failed_last_ran' => 'The last run of the schedule was more than :time minutes ago', + 'failed_not_ran' => 'The schedule did not run yet.', + ], + 'useddiskspace' => [ + 'label' => 'Disk Space', + ], + ], + 'checks' => [ + 'successful' => 'Successful', + 'failed' => 'Failed :checks', + ], +]; diff --git a/lang/en/admin/index.php b/lang/en/admin/index.php deleted file mode 100644 index bf83088dc6..0000000000 --- a/lang/en/admin/index.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Administration', - 'header' => [ - 'title' => 'Administrative Overview', - 'subtitle' => 'A quick glance at your system.', - ], - 'content' => [ - 'title' => 'System Information', - 'up-to-date' => 'You are running Pelican version :version. Your panel is up-to-date!', - 'not-up-to-date1' => 'Your panel is not up-to-date! The latest version is', - 'not-up-to-date2' => 'and you are currently running version :version.', - 'get-help' => 'Get Help (via Discord)', - 'documentation' => 'Documentation', - 'github' => 'Github', - 'support-the-project' => 'Support the Project', - ], -]; diff --git a/lang/en/admin/log.php b/lang/en/admin/log.php new file mode 100644 index 0000000000..4c1a131595 --- /dev/null +++ b/lang/en/admin/log.php @@ -0,0 +1,26 @@ + 'Yay! No Errors!', + 'total_logs' => 'Total Logs', + 'error' => 'Error', + 'warning' => 'Warning', + 'notice' => 'Notice', + 'info' => 'Info', + 'debug' => 'Debug', + 'navigation' => [ + 'panel_logs' => 'Panel Logs', + ], + 'actions' => [ + 'upload_logs' => 'Upload Logs?', + 'upload_logs_description' => 'This will upload :file to :url Are you sure you wish to do this?', + 'view_logs' => 'View Logs', + 'log_not_found' => 'Log not found!', + 'log_not_found_description' => 'Could not find log for :filename', + 'failed_to_upload' => 'Failed to upload.', + 'failed_to_upload_description' => 'HTTP Status: :status', + 'log_upload' => 'Log Uploaded!', + 'log_upload_action' => 'View Log', + 'upload_tooltip' => 'Upload to :url', + ], +]; diff --git a/lang/en/admin/mount.php b/lang/en/admin/mount.php new file mode 100644 index 0000000000..1f0c6f9493 --- /dev/null +++ b/lang/en/admin/mount.php @@ -0,0 +1,30 @@ + 'Mounts', + 'model_label' => 'Mount', + 'model_label_plural' => 'Mounts', + 'name' => 'Name', + 'name_help' => 'Unique name used to separate this mount from another.', + 'source' => 'Source', + 'source_help' => 'File path on the host system to mount to a container.', + 'target' => 'Target', + 'target_help' => 'Where the mount will be accessible inside a container.', + 'read_only' => 'Read Only?', + 'read_only_help' => 'Is the mount read only inside the container?', + 'description' => 'Description', + 'description_help' => 'A longer description for this Mount', + 'no_mounts' => 'No Mounts', + 'eggs' => 'Eggs', + 'nodes' => 'Nodes', + 'toggles' => [ + 'writable' => 'Writable', + 'read_only' => 'Read Only', + ], + 'table' => [ + 'name' => 'Name', + 'all_eggs' => 'All Eggs', + 'all_nodes' => 'All Nodes', + 'read_only' => 'Read Only', + ], +]; diff --git a/lang/en/admin/node.php b/lang/en/admin/node.php index fde28a25b3..918171a044 100644 --- a/lang/en/admin/node.php +++ b/lang/en/admin/node.php @@ -1,15 +1,152 @@ [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', + 'nav_title' => 'Nodes', + 'model_label' => 'Node', + 'model_label_plural' => 'Nodes', + 'create' => 'Create Node', + 'tabs' => [ + 'overview' => 'Overview', + 'basic_settings' => 'Basic Settings', + 'advanced_settings' => 'Advanced Settings', + 'config_file' => 'Configuration File', + 'diagnostics' => 'Diagnostics', ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', + 'table' => [ + 'health' => 'Health', + 'reachable' => 'Reachable', + 'name' => 'Name', + 'address' => 'Address', + 'public' => 'Public', + 'servers' => 'Servers', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => 'Owner', + 'allocation_notes' => 'Notes', + 'no_notes' => 'No notes', ], + 'node_info' => 'Node Information', + 'wings_version' => 'Wings Version', + 'cpu_threads' => 'CPU Threads', + 'architecture' => 'Architecture', + 'kernel' => 'Kernel', + 'unknown' => 'Unknown', + 'latest' => '(Latest: :version)', + 'node_uuid' => 'Node UUID', + 'node_id' => 'Node ID', + + 'ip_address' => 'IP Address', + 'ip_help' => 'Usually your machine\'s public IP unless you are port forwarding.', + 'alias_help' => 'Optional display name to help you remember what these are.', + 'refresh' => 'Refresh', + 'custom_ip' => 'Enter Custom IP', + 'domain' => 'Domain Name', + 'ssl_ip' => 'You cannot connect to an IP Address over SSL', + 'error' => 'This is the domain name that points to your node\'s IP Address. If you\'ve already set up this, you can verify it by checking the next field!', + 'fqdn_help' => 'Your panel is currently secured via an SSL certificate and that means your nodes require one too. You must use a domain name, because you cannot get SSL certificates for IP Addresses.', + 'dns' => 'DNS Record Check', + 'dns_help' => 'This lets you know if your DNS record is pointing to the correct IP address.', + 'valid' => 'Valid', + 'invalid' => 'Invalid', + 'port' => 'Port', + 'ports' => 'Ports', + 'port_help' => 'If you are running the daemon behind Cloudflare you should set the daemon port to 8443 to allow websocket proxying over SSL.', + 'connect_port' => 'Connection Port', + 'connect_port_help' => 'Connections to wings will use this port. If you are using a reverse proxy this can differ from the listen port. When using Cloudflare proxy you should use 8443.', + 'listen_port' => 'Listening Port', + 'listen_port_help' => 'Wings will listen on this port.', + 'display_name' => 'Display Name', + 'ssl' => 'Communicate over SSL', + 'panel_on_ssl' => 'Your Panel is using a secure SSL connection,
so your Daemon must too.', + 'ssl_help' => 'An IP address cannot use SSL.', + + 'tags' => 'Tags', + 'upload_limit' => 'Upload Limit', + 'upload_limit_help' => 'Enter the maximum size of files that can be uploaded through the web-based file manager.', + 'sftp_port' => 'SFTP Port', + 'sftp_alias' => 'SFTP Alias', + 'sftp_alias_help' => 'Display alias for the SFTP address. Leave empty to use the Node FQDN.', + 'daemon_base' => 'Daemon Base Directory', + 'daemon_base_help' => 'The directory where server data will be stored.', + 'use_for_deploy' => 'Use for Deployments?', + 'maintenance_mode' => 'Maintenance Mode', + 'maintenance_mode_help' => 'If the node is marked \'Under Maintenance\' users won\'t be able to access servers that are on that node', + + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU Limit', + 'memory' => 'Memory', + 'memory_limit' => 'Memory Limit', + 'disk' => 'Disk', + 'disk_limit' => 'Disk Limit', + 'unlimited' => 'Unlimited', + 'limited' => 'Limited', + 'overallocate' => 'Overallocate', + 'enabled' => 'Enabled', + 'disabled' => 'Disabled', + 'yes' => 'Yes', + 'no' => 'No', + + 'instructions' => 'Instructions', + 'instructions_help' => 'Save this file to your daemon\'s root directory, named config.yml', + + 'auto_deploy' => 'Auto Deploy Command', + 'auto_question' => 'Choose between Standalone and Docker install.', + 'auto_label' => 'Type', + 'standalone' => 'Standalone', + 'docker' => 'Docker', + 'auto_command' => 'To auto-configure your node run the following command:', + 'reset_token' => 'Reset Authorization Token', + 'token_reset' => 'The daemon token has been reset.', + 'reset_help' => 'Resetting the daemon token will void any request coming from the old token. This token is used for all sensitive operations on the daemon including server creation and deletion. We suggest changing this token regularly for security.', + + 'no_nodes' => 'No Nodes', + 'none' => 'None', + 'cpu_chart' => 'CPU - :cpu% of :max%', + 'memory_chart' => 'Memory - :used of :total', + 'disk_chart' => 'Storage - :used of :total', + 'used' => 'Used', + 'unused' => 'Unused', + + 'node_has_servers' => 'Node Has Servers', + 'create_allocation' => 'Create Allocation', + 'primary_allocation' => 'Primary Allocation', + 'databases' => 'Databases', + 'backups' => 'Backups', + + 'error_connecting' => 'Error connecting to :node', + 'error_connecting_description' => 'The configuration could not be automatically updated on Wings, you will need to manually update the configuration file.', + 'allocation' => 'Allocation', + + 'diagnostics' => [ + 'header' => 'Node Diagnostics', + 'include_endpoints' => 'Include Endpoints', + 'include_endpoints_hint' => 'Including endpoints will show panel urls within the logs and NOT obscure them.', + 'include_logs' => 'Include Logs', + 'include_logs_hint' => 'Including logs will show recent logs and help track down possible issues.', + 'run_diagnostics' => 'Run Diagnostics', + 'upload_to_pelican' => 'Upload Logs', + 'logs_pulled' => 'Logs Pulled!', + 'logs_uploaded' => 'Logs Uploaded', + 'upload_failed' => 'Logs Upload Failed', + 'view_logs' => 'View Logs', + 'pull' => 'Pull', + 'upload' => 'Upload', + 'clear' => 'Clear', + '404' => 'The requested diagnostic report could not be found. Make sure wings is up to date and try again.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Cloudflare Issue', + 'body' => 'Your Node is not accessible by Cloudflare', + ], + + 'bulk_update_ip' => 'Update IPs', + 'bulk_update_ip_description' => 'Replace an old IP address with a new one for allocations. This is useful when a node\'s IP address changes', + 'update_ip' => 'Update IP', + 'old_ip' => 'Old IP Address', + 'new_ip' => 'New IP Address', + 'no_allocations_to_update' => 'No allocations with the selected old IP address were found', + 'ip_updated' => 'Successfully updated :count of :total allocation(s)', + 'ip_update_failed' => ':count allocation(s) failed to update', ]; diff --git a/lang/en/admin/plugin.php b/lang/en/admin/plugin.php new file mode 100644 index 0000000000..489ed6a5a1 --- /dev/null +++ b/lang/en/admin/plugin.php @@ -0,0 +1,61 @@ + 'Plugins', + 'model_label' => 'Plugin', + 'model_label_plural' => 'Plugins', + + 'name' => 'Name', + 'update_available' => 'An update for this plugin is available', + 'author' => 'Author', + 'version' => 'Version', + 'category' => 'Category', + 'status' => 'Status', + 'visit_website' => 'Visit Website', + 'settings' => 'Settings', + 'install' => 'Install', + 'uninstall' => 'Uninstall', + 'update' => 'Update', + 'enable' => 'Enable', + 'disable' => 'Disable', + 'import_from_file' => 'Import from File', + 'import_from_url' => 'Import from URL', + 'no_plugins' => 'No Plugins', + 'all' => 'All', + 'change_load_order' => 'Change load order', + 'apply_load_order' => 'Apply load order', + + 'enable_theme_modal' => [ + 'heading' => 'Theme already enabled', + 'description' => 'You already have a theme enabled. Enabling multiple themes can result in visual bugs. Do you want to continue?', + ], + + 'status_enum' => [ + 'not_installed' => 'Not Installed', + 'disabled' => 'Disabled', + 'enabled' => 'Enabled', + 'errored' => 'Errored', + 'incompatible' => 'Incompatible', + ], + + 'category_enum' => [ + 'plugin' => 'Plugin', + 'theme' => 'Theme', + 'language' => 'Language Pack', + ], + + 'notifications' => [ + 'installed' => 'Plugin installed', + 'install_error' => 'Could not install plugin', + 'uninstalled' => 'Plugin uninstalled', + 'uninstall_error' => 'Could not uninstall plugin', + 'deleted' => 'Plugin deleted', + 'updated' => 'Plugin updated', + 'update_error' => 'Could not update plugin', + 'enabled' => 'Plugin enabled', + 'disabled' => 'Plugin disabled', + 'imported' => 'Plugin imported', + 'import_exists' => 'A plugin with that id already exists', + 'import_failed' => 'Could not import plugin', + ], +]; diff --git a/lang/en/admin/role.php b/lang/en/admin/role.php new file mode 100644 index 0000000000..c4871ac7ac --- /dev/null +++ b/lang/en/admin/role.php @@ -0,0 +1,17 @@ + 'Roles', + 'model_label' => 'Role', + 'model_label_plural' => 'Roles', + 'no_roles' => 'No Roles', + 'name' => 'Role Name', + 'permissions' => 'Permissions', + 'in_use' => 'In Use', + 'all' => 'All', + 'root_admin' => 'The :role has all permissions.', + 'root_admin_delete' => 'Can\'t delete Root Admin', + 'users' => 'Users', + 'nodes' => 'Nodes', + 'nodes_hint' => 'Leave empty to allow access to all nodes.', +]; diff --git a/lang/en/admin/server.php b/lang/en/admin/server.php index 057bd3ca58..e0bb2bebab 100644 --- a/lang/en/admin/server.php +++ b/lang/en/admin/server.php @@ -1,27 +1,154 @@ [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', + 'nav_title' => 'Servers', + 'model_label' => 'Server', + 'model_label_plural' => 'Servers', + 'no_servers' => 'No Servers', + 'create' => 'Create Server', + 'ip_address' => 'IP Address', + 'import_image' => 'Import Image', + 'delete_image' => 'Delete Image', + 'ip_address_helper' => 'Usually your machine\'s public IP unless you are port forwarding.', + 'port' => 'Port', + 'ports' => 'Ports', + 'alias' => 'Alias', + 'alias_helper' => 'Optional display name to help you remember what these are.', + 'locked' => 'Locked?', + 'locked_helper' => 'Users won\'t be able to delete locked allocations', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'name' => 'Name', + 'external_id' => 'External ID', + 'owner' => 'Owner', + 'description' => 'Description', + 'install_script' => 'Run Install Script?', + 'start_after' => 'Start After Install?', + 'yes' => 'Yes', + 'no' => 'No', + 'skip' => 'Skip', + 'primary' => 'Primary', + 'already_primary' => 'Already Primary', + 'make_primary' => 'Make Primary', + 'startup_cmd' => 'Startup Command', + 'startup_name' => 'Startup Name', + 'default_startup' => 'Default Startup Command', + 'startup_placeholder' => 'Enter a custom startup command', + 'variables' => 'Variables', + 'resource_limits' => 'Resource Limits', + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU Limit', + 'cpu_helper' => '100% equals one CPU thread.', + 'unlimited' => 'Unlimited', + 'limited' => 'Limited', + 'enabled' => 'Enabled', + 'disabled' => 'Disabled', + 'memory' => 'Memory', + 'memory_limit' => 'Memory Limit', + 'memory_helper' => 'Wings will add overhead to this value when creating the container to make sure it doesn\'t starve out when using max memory.', + 'disk' => 'Disk Space', + 'disk_limit' => 'Disk Space Limit', + 'advanced_limits' => 'Advanced Limits', + 'cpu_pin' => 'CPU Pinning', + 'threads' => 'Pinned Threads', + 'pin_help' => 'Add pinned thread, e.g. 0 or 2-4', + 'swap' => 'Swap Memory', + 'swap_limit' => 'Swap Memory Limit', + 'oom' => 'OOM Killer', + 'feature_limits' => 'Feature Limits', + 'docker_settings' => 'Docker Settings', + 'docker_image' => 'Docker Image', + 'image_name' => 'Image Name', + 'primary_allocation' => 'Primary Allocation', + 'image' => 'Image', + 'image_placeholder' => 'Enter a custom image', + 'container_labels' => 'Container Labels', + 'title' => 'Title', + 'actions' => 'Actions', + 'console' => 'Console', + 'suspend' => 'Suspend', + 'unsuspend' => 'Unsuspend', + 'reinstall' => 'Reinstall', + 'reinstall_help' => 'This will reinstall the server with the assigned egg install script.', + 'reinstall_modal_heading' => 'Are you sure you want to reinstall this server?', + 'reinstall_modal_description' => '!! This can result in unrecoverable data loss !!', + 'server_status' => 'Server Status', + 'view_install_log' => 'View install log', + 'uuid' => 'UUID', + 'node' => 'Node', + 'short_uuid' => 'Short UUID', + 'toggle_install' => 'Toggle Install Status', + 'toggle_install_help' => 'If you need to change the install status from uninstalled to installed, or vice versa, you may do so with this button.', + 'toggle_install_failed_header' => 'Server is in failed state', + 'toggle_install_failed_desc' => 'Do you want to reinstall the server to fix this?', + 'transfer' => 'Transfer', + 'transfer_help' => 'Transfer this server to another node connected to this panel.
Warning! This feature is still experimental. Consider manually making a backup first to avoid data loss!', + 'condition' => 'Condition', + 'suspend_all' => 'Suspend All Servers', + 'unsuspend_all' => 'Unsuspend All Servers', + 'select_allocation' => 'Select Allocation', + 'new_allocation' => 'Create New Allocation', + 'additional_allocations' => 'Additional Allocations', + 'select_additional' => 'Select Additional Allocations', + 'no_variables' => 'The selected egg has no variables!', + 'select_egg' => 'Select an egg first to show its variables!', + 'allocations' => 'Allocations', + 'databases' => 'Databases', + 'no_databases' => 'No Databases exist for this Server', + 'delete_db' => 'Are you sure you want to delete :name ?', + 'delete_db_heading' => 'Delete Database?', + 'backups' => 'Backups', + 'egg' => 'Egg', + 'mounts' => 'Mounts', + 'no_mounts' => 'No Mounts exist for this Node', + 'create_database' => 'Create Database', + 'no_db_hosts' => 'No Database Hosts', + 'failed_to_create' => 'Failed to create Database', + 'change_egg' => 'Change Egg', + 'new_egg' => 'New Egg', + 'keep_old_variables' => 'Keep old variables if possible?', + 'create_allocation' => 'Create Allocation', + 'add_allocation' => 'Add Allocation', + 'view' => 'View', + 'no_log' => 'No Log Available', + 'select_backups' => 'Select Backups', + 'warning_backups' => 'Be aware, not transferred backups will be deleted.', + 'tabs' => [ + 'information' => 'Information', + 'egg_configuration' => 'Egg Configuration', + 'environment_configuration' => 'Environment Configuration', ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', + 'notifications' => [ + 'server_suspension' => 'Server Suspension', + 'server_suspended' => 'Server has been suspended', + 'server_already_suspended' => 'Server is already suspended!', + 'server_suspend_help' => 'This will suspend the Server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the Server through the panel or API.', + 'server_unsuspend_help' => 'This will unsuspend the Server and restore normal user access.', + 'server_unsuspended' => 'Server has been unsuspended', + 'error_server_delete' => 'Server couldn\'t be safely deleted.', + 'error_server_delete_body' => 'You may Force Delete it.', + 'create_failed' => 'Could not create Server', + 'invalid_port_range' => 'Invalid Port Range', + 'invalid_port_range_body' => 'Your port range are not valid integers: :port', + 'too_many_ports' => 'Too many ports at one time!', + 'too_many_ports_body' => 'The current limit is :limit number of ports at one time.', + 'invalid_port' => 'Port not in valid range', + 'invalid_port_body' => ':i is not in the valid port range between :portFloor-:portCeil', + 'already_exists' => 'Port already in use', + 'already_exists_body' => ':i is already with an allocation', + 'error_connecting' => 'Error connecting to :node', + 'error_connecting_description' => 'The configuration could not be automatically synced on Wings, you will need to manually restart the server.', + 'install_toggled' => 'Install status toggled', + 'install_toggle_failed' => 'Could not toggle install status', + 'reinstall_started' => 'Reinstall started', + 'reinstall_failed' => 'Could not start reinstall', + 'log_failed' => 'Could not connect to Wings to retrieve server install log.', + 'transfer_started' => 'Transfer started', + 'transfer_failed' => 'Transfer failed', + 'already_transfering' => 'Server is currently being transferred.', + 'backup_transfer_failed' => 'Backup Transfer Failed', ], + 'notes' => 'Notes', + 'no_notes' => 'No Notes', + 'none' => 'None', ]; diff --git a/lang/en/admin/setting.php b/lang/en/admin/setting.php new file mode 100644 index 0000000000..a01668ced0 --- /dev/null +++ b/lang/en/admin/setting.php @@ -0,0 +1,157 @@ + 'Settings', + 'save_success' => 'Settings saved', + 'save_failed' => 'Failed to save Settings', + 'navigation' => [ + 'general' => 'General', + 'captcha' => 'Captcha', + 'mail' => 'Mail', + 'backup' => 'Backup', + 'oauth' => 'OAuth', + 'misc' => 'Misc', + ], + 'general' => [ + 'app_name' => 'App Name', + 'app_logo' => 'App Logo', + 'app_logo_help' => 'Logo should be placed in the public folder located in the root panel directory. Leave blank to use App Name instead.', + 'app_favicon' => 'App Favicon', + 'app_favicon_help' => 'Favicon should be placed in the public folder located in the root panel directory.', + 'debug_mode' => 'Debug Mode', + 'navigation' => 'Navigation', + 'default_navigation' => 'Default Navigation Type', + 'sidebar' => 'Sidebar', + 'topbar' => 'Topbar', + 'mixed' => 'Mixed', + 'unit_prefix' => 'Unit Prefix', + 'decimal_prefix' => 'Decimal Prefix (MB/GB)', + 'binary_prefix' => 'Binary Prefix (MiB/GiB)', + '2fa_requirement' => '2FA Requirement', + 'not_required' => 'Not Required', + 'admins_only' => 'Required for Admins Only', + 'all_users' => 'Required for All Users', + 'trusted_proxies' => 'Trusted Proxies', + 'trusted_proxies_help' => 'New IP or IP Range', + 'clear' => 'Clear', + 'set_to_cf' => 'Set to Cloudflare IPs', + 'display_width' => 'Display Width', + 'avatar_provider' => 'Avatar Provider', + 'uploadable_avatars' => 'Allow users to upload own avatar?', + ], + 'captcha' => [ + 'enable' => 'Enable', + 'disable' => 'Disable', + 'info_label' => 'Info', + 'info' => 'You can generate the keys on your Cloudflare Dashboard. A Cloudflare account is required.', + 'site_key' => 'Site Key', + 'secret_key' => 'Secret Key', + 'verify' => 'Verify Domain?', + ], + 'mail' => [ + 'mail_driver' => 'Mail Driver', + 'test_mail' => 'Send Test Mail', + 'test_mail_sent' => 'Test Mail sent', + 'test_mail_failed' => 'Test Mail failed', + 'from_settings' => 'From Settings', + 'from_settings_help' => 'Set the Address and Name used as "From" in mails.', + 'from_address' => 'From Address', + 'from_name' => 'From Name', + 'smtp' => [ + 'smtp_title' => 'SMTP Configuration', + 'host' => 'Host', + 'port' => 'Port', + 'username' => 'Username', + 'password' => 'Password', + 'scheme' => 'Scheme', + ], + 'mailgun' => [ + 'mailgun_title' => 'Mailgun Configuration', + 'domain' => 'Domain', + 'secret' => 'Secret', + 'endpoint' => 'Endpoint', + ], + ], + 'backup' => [ + 'backup_driver' => 'Backup Driver', + 'throttle' => 'Throttles', + 'throttle_help' => 'Configure how many backups can be created in a period. Set period to 0 to disable this throttle.', + 'limit' => 'Limit', + 'period' => 'Period', + 'seconds' => 'Seconds', + 's3' => [ + 's3_title' => 'S3 Configuration', + 'default_region' => 'Default Region', + 'access_key' => 'Access Key ID', + 'secret_key' => 'Secret Access Key', + 'bucket' => 'Bucket', + 'endpoint' => 'Endpoint', + 'use_path_style_endpoint' => 'Use Path Style Endpoint', + ], + ], + 'oauth' => [ + 'enable' => 'Enable', + 'enable_schema' => 'Enable :schema', + 'disable' => 'Disable', + 'client_id' => 'Client ID', + 'client_secret' => 'Client Secret', + 'redirect' => 'Redirect URL', + 'web_api_key' => 'Web API Key', + 'base_url' => 'Base URL', + 'display_name' => 'Display Name', + 'auth_url' => 'Authorization callback URL', + 'create_missing_users' => 'Auto Create Missing Users?', + 'link_missing_users' => 'Auto Link Missing Users?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Automatic Allocation Creation', + 'helper' => 'Toggle if Users can create allocations via the client area.', + 'question' => 'Allow Users to create Allocations?', + 'create_new' => 'Create new allocations if none available?', + 'create_new_help' => 'When enabled, creates new allocations. When disabled, only assigns from existing unassigned allocations. Both options factor the port range below into account.', + 'start' => 'Start Port', + 'end' => 'End Port', + ], + 'mail_notifications' => [ + 'title' => 'Mail Notifications', + 'helper' => 'Toggle which mail notifications should be sent to Users.', + 'server_installed' => 'Server Installed', + 'server_reinstalled' => 'Server Reinstalled', + ], + 'connections' => [ + 'title' => 'Connections', + 'helper' => 'Timeouts used when making requests.', + 'request_timeout' => 'Request Timeout', + 'connection_timeout' => 'Connection Timeout', + 'seconds' => 'Seconds', + ], + 'activity_log' => [ + 'title' => 'Activity Logs', + 'helper' => 'Configure how often old activity logs should be pruned and whether admin activities should be logged.', + 'prune_age' => 'Prune Age', + 'days' => 'Days', + 'log_admin' => 'Hide admin activities?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Defines the rate limit for the number of requests per minute that can be executed.', + 'client_rate' => 'Client API Rate Limit', + 'app_rate' => 'Application API Rate Limit', + 'rpm' => 'Requests per Minute', + ], + 'server' => [ + 'title' => 'Servers', + 'helper' => 'Settings for Servers', + 'edit_server_desc' => 'Allow Users to edit Descriptions?', + 'console_font_upload' => 'Console Font Upload', + 'console_font_hint' => 'Only *.ttf fonts are supported. Mono fonts strongly recommended!', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => 'Configure how often old webhook logs should be pruned.', + 'prune_age' => 'Prune Age', + 'days' => 'Days', + ], + ], +]; diff --git a/lang/en/admin/user.php b/lang/en/admin/user.php index 2bf52b77af..62081d28d5 100644 --- a/lang/en/admin/user.php +++ b/lang/en/admin/user.php @@ -1,20 +1,24 @@ [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], - 'last_admin' => [ - 'hint' => 'This is the last root administrator!', - 'helper_text' => 'You must have at least one root administrator in your system.', - ], - 'language' => [ - 'helper_text1' => 'Your language (:state) has not been translated yet!\nBut never fear, you can help fix that by', - 'helper_text2' => 'contributing directly here', - ], + 'nav_title' => 'Users', + 'model_label' => 'User', + 'model_label_plural' => 'Users', + 'self_delete' => 'Can\'t Delete Yourself', + 'has_servers' => 'User Has Servers', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'external_id' => 'External ID', + 'is_managed_externally' => 'Is managed externally?', + 'is_managed_externally_helper' => 'If your users are managed by external software (e.g. a billing software) you may enable this to prevent users from changing their username, e-mail and password from within the panel.', + 'password_help' => 'Providing a user password is optional. New user email will prompt users to create a password the first time they login.', + 'admin_roles' => 'Admin Roles', + 'roles' => 'Roles', + 'no_roles' => 'No Roles', + 'servers' => 'Servers', + 'subusers' => 'Subusers', + 'password_reset' => 'Reset Password', + 'password_reset_sent' => 'Password Reset E-Mail Sent', + 'password_reset_failed' => 'Failed to Send Password Reset E-Mail', ]; diff --git a/lang/en/admin/webhook.php b/lang/en/admin/webhook.php new file mode 100644 index 0000000000..66586c6b4d --- /dev/null +++ b/lang/en/admin/webhook.php @@ -0,0 +1,62 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Endpoint', + 'description' => 'Description', + 'no_webhooks' => 'No Webhooks', + 'help' => 'Help', + 'help_text' => 'You have to wrap variable name in between {{ }} for example if you want to get the name from the api you can use {{name}}.', + 'test_now' => 'Test now', + 'table' => [ + 'description' => 'Description', + 'endpoint' => 'Endpoint', + ], + 'headers' => 'Headers', + 'events' => 'Events', + 'regular' => 'Regular', + 'reset_headers' => 'Reset Headers', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profile', + 'message' => 'Message', + 'username' => 'Username', + 'avatar_url' => 'Avatar URL', + 'forum_thread' => 'Forum Thread Name', + 'supress_embeds' => 'Suppress Embeds', + 'supress_embeds_text' => 'Do not include any embeds when serializing this message', + 'supress_notifications' => 'Suppress Notifications', + 'supress_notifications_text' => 'This message will not trigger push and desktop notifications', + ], + 'discord_embed' => [ + 'add_embed' => 'Add Embed', + 'flags' => 'Flags', + 'thumbnail' => 'Thumbnail URL', + 'embeds' => 'Embeds', + 'thread_name' => 'Forum Thread Name', + 'allowed_mentions' => 'Allowed Mentions', + 'roles' => 'Roles', + 'users' => 'Users', + 'everyone' => '@everyone & @here', + 'author' => 'Author', + 'author_url' => 'Author URL', + 'author_icon_url' => 'Author Icon URL', + 'body' => 'Body', + 'title' => 'Title', + 'color' => 'Embed Color', + 'url' => 'URL', + 'images' => 'Images', + 'image_url' => 'Image URL', + 'image_thumbnail' => 'Thumbnail URL', + 'footer' => 'Footer', + 'has_timestamp' => 'Has Timestamp', + 'footer_icon_url' => 'Footer Icon URL', + 'add_field' => 'Add Field', + 'fields' => 'Fields', + 'field_name' => 'Field Name', + 'field_value' => 'Field Value', + 'inline_field' => 'Inline Field', + ], +]; diff --git a/lang/en/auth.php b/lang/en/auth.php index 8facb6dc52..d88b093972 100644 --- a/lang/en/auth.php +++ b/lang/en/auth.php @@ -1,64 +1,24 @@ 'Return to Login', - 'failed' => 'No account matching those credentials could be found.', - 'login' => [ - 'title' => 'Login to Continue', - 'button' => 'Log In', - 'required' => [ - 'username_or_email' => 'A username or email must be provided.', - 'password' => 'Please enter your account password.', - ], - ], - - 'forgot_password' => [ - 'title' => 'Request Password Reset', - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Send Email', - 'required' => [ - 'email' => 'A valid email address must be provided to continue.', - ], - ], - - 'reset_password' => [ - 'title' => 'Reset Password', - 'button' => 'Reset Password', - 'new_password' => 'New Password', - 'confirm_new_password' => 'Confirm New Password', - 'requirement' => [ - 'password' => 'Passwords must be at least 8 characters in length.', - ], - 'required' => [ - 'password' => 'A new password is required.', - 'password_confirmation' => 'Your new password does not match.', - ], - 'validation' => [ - 'password' => 'Your new password should be at least 8 characters in length.', - 'password_confirmation' => 'Your new password does not match.', - ], - ], - - 'checkpoint' => [ - 'title' => 'Device Checkpoint', - 'recovery_code' => 'Recovery Code', - 'recovery_code_description' => 'Enter one of the recovery codes generated when you setup 2-Factor authentication on this account in order to continue.', - 'authentication_code' => 'Authentication Code', - 'authentication_code_description' => 'Enter the two-factor token generated by your device.', - 'button' => 'Continue', - 'lost_device' => "I've Lost My Device", - 'have_device' => 'I Have My Device', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'These credentials do not match our records.', + 'failed-two-factor' => 'Incorrect 2FA Code', + 'two-factor-code' => 'Two Factor Code', + 'two-factor-hint' => 'You may use backup codes if you lost access to your device.', + 'password' => 'The provided password is incorrect.', 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', + '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication must be enabled for your account in order to use the Panel.', + ]; diff --git a/lang/en/command/messages.php b/lang/en/command/messages.php index 50adf0fa36..f245099d74 100644 --- a/lang/en/command/messages.php +++ b/lang/en/command/messages.php @@ -11,15 +11,10 @@ 'ask_admin' => 'Is this user an administrator?', 'ask_email' => 'Email Address', 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', 'ask_password' => 'Password', 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], + '2fa_help_text' => 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account. If this is not what you wanted to do, press CTRL+C to exit this process.', '2fa_disabled' => '2-Factor authentication has been disabled for :email.', ], 'schedule' => [ diff --git a/lang/en/commands.php b/lang/en/commands.php index b6fa6c9ca4..a24222b3a8 100644 --- a/lang/en/commands.php +++ b/lang/en/commands.php @@ -36,6 +36,7 @@ 'cpu_overallocate' => 'Enter the amount of cpu to over allocate by, -1 will disable checking and 0 will prevent creating new server', 'upload_size' => "'Enter the maximum filesize upload", 'daemonListen' => 'Enter the daemon listening port', + 'daemonConnect' => 'Enter the daemon connecting port (can be same as listen port)', 'daemonSFTP' => 'Enter the daemon SFTP listening port', 'daemonSFTPAlias' => 'Enter the daemon SFTP alias (can be empty)', 'daemonBase' => 'Enter the base folder', @@ -53,21 +54,7 @@ 'schedule' => [ 'process' => [ 'no_tasks' => 'There are no scheduled tasks for servers that need to be run.', - 'error_message' => 'An error was encountered while processing Schedule: ', + 'error_message' => 'An error was encountered while processing Schedule: :schedules', ], ], - 'upgrade' => [ - 'integrity' => 'This command does not verify the integrity of downloaded assets. Please ensure that you trust the download source before continuing. If you do not wish to download an archive, please indicate that using the --skip-download flag, or answering "no" to the question below.', - 'source_url' => 'Download Source (set with --url=):', - 'php_version' => 'Cannot execute self-upgrade process. The minimum required PHP version required is 7.4.0, you have', - 'skipDownload' => 'Would you like to download and unpack the archive files for the latest version?', - 'webserver_user' => 'Your webserver user has been detected as [{:user}]: is this correct?', - 'name_webserver' => 'Please enter the name of the user running your webserver process. This varies from system to system, but is generally "www-data", "nginx", or "apache".', - 'group_webserver' => 'Your webserver group has been detected as [{:group}]: is this correct?', - 'group_webserver_question' => 'Please enter the name of the group running your webserver process. Normally this is the same as your user.', - 'are_your_sure' => 'Are you sure you want to run the upgrade process for your Panel?', - 'terminated' => 'Upgrade process terminated by user.', - 'success' => 'Panel has been successfully upgraded. Please ensure you also update any Daemon instances', - - ], ]; diff --git a/lang/en/dashboard/account.php b/lang/en/dashboard/account.php deleted file mode 100644 index 8868996fcd..0000000000 --- a/lang/en/dashboard/account.php +++ /dev/null @@ -1,48 +0,0 @@ - 'Account Overview', - 'email' => [ - 'title' => 'Update Email Address', - 'button' => 'Update Email', - 'updated' => 'Your primary email has been updated.', - ], - 'password' => [ - 'title' => 'Update Password', - 'button' => 'Update Password', - 'requirements' => 'Your new password should be at least 8 characters in length and unique to this website.', - 'validation' => [ - 'account_password' => 'You must provide your account password.', - 'current_password' => 'You must provide your current password.', - 'password_confirmation' => 'Password confirmation does not match the password you entered.', - ], - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'title' => 'Two-Step Verification', - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'enable' => [ - 'help' => 'You do not currently have two-step verification enabled on your account. Click the button below to begin configuring it.', - 'button' => 'Enable Two-Step', - ], - 'disable' => [ - 'help' => 'Two-step verification is currently enabled on your account.', - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - 'button' => 'Disable Two-Step', - ], - 'setup' => [ - 'title' => 'Enable Two-Step Verification', - 'subtitle' => "Help protect your account from unauthorized access. You'll be prompted for a verification code each time you sign in.", - 'help' => 'Scan the QR code above using the two-step authentication app of your choice. Then, enter the 6-digit code generated into the field below.', - ], - - 'required' => [ - 'title' => '2-Factor Required', - 'description' => 'Your account must have two-factor authentication enabled in order to continue.', - ], - ], -]; diff --git a/lang/en/dashboard/index.php b/lang/en/dashboard/index.php deleted file mode 100644 index 72867b654c..0000000000 --- a/lang/en/dashboard/index.php +++ /dev/null @@ -1,55 +0,0 @@ - 'Dashboard', - 'showing-your-servers' => 'Showing your servers', - 'showing-others-servers' => "Showing other's servers", - 'no-other-servers' => 'There are no other servers to display.', - 'no-servers-associated' => 'There are no servers associated with your account.', - - 'content_tabs' => 'Content tabs', - 'overview' => 'Overview', - 'heading' => 'Welcome to Pelican!', - 'expand_sections' => 'You can expand the following sections:', - 'sections' => [ - 'intro-developers' => [ - 'heading' => 'Information for Developers', - 'content' => 'Thank you for trying out the development version!', - 'extra_note' => 'If you run into any issues, please report them on GitHub.', - 'button_issues' => 'Create Issue', - 'button_features' => 'Discuss Features', - ], - 'intro-update-available' => [ - 'heading' => 'Update available', - 'content' => ':latestVersion is now available! Read our documentation to update your Panel.', - ], - 'intro-no-update' => [ - 'heading' => 'Your Panel is up to date', - 'content' => 'You are currently using :version. Your panel is up-to-date!', - ], - 'intro-first-node' => [ - 'heading' => 'No Nodes Detected', - 'content' => "It looks like you don't have any Nodes set up yet, but don't worry because you click the action button to create your first one!", - 'extra_note' => 'If you run into any issues, please report them on GitHub.', - 'button_label' => 'Create first Node in Pelican', - ], - 'intro-support' => [ - 'heading' => 'Support Pelican', - 'content' => 'Thank you for using Pelican, this could only be achieved through the support of you, our contributors, and the rest of our supporters!', - 'extra_note' => 'We appreciate any and all support from anybody.', - 'button_translate' => 'Help Translate', - 'button_donate' => 'Donate Directly', - ], - 'intro-help' => [ - 'heading' => 'Need Help?', - 'content' => 'Check out the documentation first! If you still need assistance then, fly onto our Discord server!', - 'button_docs' => 'Read Documentation', - 'button_discord' => 'Get Help in Discord', - ], - ], - - 'search' => 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/en/exceptions.php b/lang/en/exceptions.php index 9ec18f9b27..ed17349d2e 100644 --- a/lang/en/exceptions.php +++ b/lang/en/exceptions.php @@ -4,6 +4,7 @@ 'daemon_connection_failed' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', 'node' => [ 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', + 'error_connecting' => 'Error connecting to :node', 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', ], 'allocations' => [ @@ -43,6 +44,8 @@ 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', ], 'users' => [ + 'is_self' => 'Cannot delete your own user account.', + 'has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', ], 'deployment' => [ @@ -55,4 +58,7 @@ 'mount' => [ 'servers_attached' => 'A mount must have no servers attached to it in order to be deleted.', ], + 'server' => [ + 'marked_as_failed' => 'This server has not yet completed its installation process, please try again later.', + ], ]; diff --git a/lang/en/installer.php b/lang/en/installer.php new file mode 100644 index 0000000000..43005bbc9d --- /dev/null +++ b/lang/en/installer.php @@ -0,0 +1,113 @@ + 'Panel Installer', + 'requirements' => [ + 'title' => 'Server Requirements', + 'sections' => [ + 'version' => [ + 'title' => 'PHP Version', + 'or_newer' => ':version or newer', + 'content' => 'Your PHP Version is :version.', + ], + 'extensions' => [ + 'title' => 'PHP Extensions', + 'good' => 'All needed PHP Extensions are installed.', + 'bad' => 'The following PHP Extensions are missing: :extensions', + ], + 'permissions' => [ + 'title' => 'Folder Permissions', + 'good' => 'All Folders have the correct permissions.', + 'bad' => 'The following Folders have wrong permissions: :folders', + ], + ], + 'exception' => 'Some requirements are missing', + ], + 'environment' => [ + 'title' => 'Environment', + 'fields' => [ + 'app_name' => 'App Name', + 'app_name_help' => 'This will be the Name of your Panel.', + 'app_url' => 'App URL', + 'app_url_help' => 'This will be the URL you access your Panel from.', + 'account' => [ + 'section' => 'Admin User', + 'email' => 'E-Mail', + 'username' => 'Username', + 'password' => 'Password', + ], + ], + ], + 'database' => [ + 'title' => 'Database', + 'driver' => 'Database Driver', + 'driver_help' => 'The driver used for the panel database. We recommend "SQLite".', + 'fields' => [ + 'host' => 'Database Host', + 'host_help' => 'The host of your database. Make sure it is reachable.', + 'port' => 'Database Port', + 'port_help' => 'The port of your database.', + 'path' => 'Database Path', + 'path_help' => 'The path of your .sqlite file relative to the database folder.', + 'name' => 'Database Name', + 'name_help' => 'The name of the panel database.', + 'username' => 'Database Username', + 'username_help' => 'The name of your database user.', + 'password' => 'Database Password', + 'password_help' => 'The password of your database user. Can be empty.', + ], + 'exceptions' => [ + 'connection' => 'Database connection failed', + 'migration' => 'Migrations failed', + ], + ], + 'egg' => [ + 'title' => 'Eggs', + 'no_eggs' => 'No Eggs Available', + 'background_install_started' => 'Egg Install Started', + 'background_install_description' => 'Install of :count eggs has been queued and will continue in the background.', + 'exceptions' => [ + 'failed_to_update' => 'Failed to update egg index', + 'no_eggs' => 'No eggs are available to install at this time.', + 'installation_failed' => 'Failed to install selected eggs. Please import them after the installation via the egg list.', + ], + ], + 'session' => [ + 'title' => 'Session', + 'driver' => 'Session Driver', + 'driver_help' => 'The driver used for storing sessions. We recommend "Filesystem" or "Database".', + ], + 'cache' => [ + 'title' => 'Cache', + 'driver' => 'Cache Driver', + 'driver_help' => 'The driver used for caching. We recommend "Filesystem".', + 'fields' => [ + 'host' => 'Redis Host', + 'host_help' => 'The host of your redis server. Make sure it is reachable.', + 'port' => 'Redis Port', + 'port_help' => 'The port of your redis server.', + 'username' => 'Redis Username', + 'username_help' => 'The name of your redis user. Can be empty', + 'password' => 'Redis Password', + 'password_help' => 'The password for your redis user. Can be empty.', + ], + 'exception' => 'Redis connection failed', + ], + 'queue' => [ + 'title' => 'Queue', + 'driver' => 'Queue Driver', + 'driver_help' => 'The driver used for handling queues. We recommend "Database".', + 'fields' => [ + 'done' => 'I have done both steps below.', + 'done_validation' => 'You need to do both steps before continuing!', + 'crontab' => 'Run the following command to set up your crontab. Note that www-data is your webserver user. On some systems this username might be different!', + 'service' => 'To setup the queue worker service you simply have to run the following command.', + ], + ], + 'exceptions' => [ + 'write_env' => 'Could not write to .env file', + 'migration' => 'Could not run migrations', + 'create_user' => 'Could not create admin user', + ], + 'finish' => 'Finish', +]; diff --git a/lang/en/mail.php b/lang/en/mail.php new file mode 100644 index 0000000000..9097eb665d --- /dev/null +++ b/lang/en/mail.php @@ -0,0 +1,35 @@ + 'Hello :name!', + + 'account_created' => [ + 'body' => 'You are receiving this email because an account has been created for you on :app.', + 'username' => 'Username: :username', + 'email' => 'Email: :email', + 'action' => 'Setup Your Account', + ], + + 'added_to_server' => [ + 'body' => 'You have been added as a subuser for the following server, allowing you certain control over the server.', + 'server_name' => 'Server Name: :name', + 'action' => 'Visit Server', + ], + + 'removed_from_server' => [ + 'body' => 'You have been removed as a subuser for the following server.', + 'server_name' => 'Server Name: :name', + 'action' => 'Visit Panel', + ], + + 'server_installed' => [ + 'body' => 'Your server has finished installing and is now ready for you to use.', + 'server_name' => 'Server Name: :name', + 'action' => 'Login and Begin Using', + ], + + 'mail_tested' => [ + 'subject' => 'Panel Test Message', + 'body' => 'This is a test of the Panel mail system. You\'re good to go!', + ], +]; diff --git a/lang/en/notifications.php b/lang/en/notifications.php new file mode 100644 index 0000000000..5005259f2e --- /dev/null +++ b/lang/en/notifications.php @@ -0,0 +1,18 @@ + 'Open Server', + 'installation_completed' => 'Server Installation Completed', + 'installation_failed' => 'Server Installation Failed', + 'reinstallation_completed' => 'Server Reinstallation Completed', + 'reinstallation_failed' => 'Server Reinstallation Failed', + 'failed' => 'Failed', + 'user_added' => [ + 'title' => 'Added to Server', + 'body' => 'You have been added as a subuser to :server.', + ], + 'user_removed' => [ + 'title' => 'Removed from Server', + 'body' => 'You have been removed as a subuser from :server.', + ], +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/en/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/en/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/en/profile.php b/lang/en/profile.php new file mode 100644 index 0000000000..b6fd1d1821 --- /dev/null +++ b/lang/en/profile.php @@ -0,0 +1,73 @@ + 'Profile', + 'tabs' => [ + 'account' => 'Account', + 'oauth' => 'OAuth', + 'activity' => 'Activity', + 'api_keys' => 'API Keys', + 'ssh_keys' => 'SSH Keys', + 'keys' => 'Keys', + '2fa' => '2FA', + 'customization' => 'Customization', + ], + 'username' => 'Username', + 'admin' => 'Admin', + 'exit_admin' => 'Exit Admin', + 'server_list' => 'Server List', + 'email' => 'Email', + 'password' => 'Password', + 'current_password' => 'Current Password', + 'password_confirmation' => 'Password Confirmation', + 'timezone' => 'Timezone', + 'language' => 'Language', + 'language_help' => 'Your language :state has not been translated yet!', + 'link' => 'Link :name', + 'unlink' => 'Unlink :name', + 'unlinked' => ':name unlinked', + 'scan_qr' => 'Scan QR Code', + 'code' => 'Code', + 'setup_key' => 'Setup Key: :secret', + 'invalid_code' => 'Invalid 2FA Code', + 'code_help' => 'Scan the QR code above using your two-step authentication app, then enter the code generated.', + '2fa_enabled' => 'Two Factor Authentication is currently enabled!', + 'backup_help' => 'These will not be shown again!', + 'backup_codes' => 'Backup Codes', + 'disable_2fa' => 'Disable 2FA', + 'disable_2fa_help' => 'Enter your current 2FA code to disable Two Factor Authentication', + 'api_keys' => 'API Keys', + 'create_api_key' => 'Create API Key', + 'api_key_created' => 'API Key Created', + 'description' => 'Description', + 'allowed_ips' => 'Allowed IPs', + 'allowed_ips_help' => 'Press enter to add a new IP address or leave blank to allow any IP address', + 'ssh_keys' => 'SSH Keys', + 'create_ssh_key' => 'Create SSH Key', + 'ssh_key_created' => 'SSH Key Created', + 'name' => 'Name', + 'public_key' => 'Public Key', + 'could_not_create_ssh_key' => 'Could not create ssh key', + 'dashboard' => 'Dashboard', + 'dashboard_layout' => 'Dashboard Layout', + 'console' => 'Console', + 'grid' => 'Grid', + 'table' => 'Table', + 'rows' => 'Rows', + 'font_size' => 'Font Size', + 'font' => 'Font', + 'font_preview' => 'Font Preview', + 'seconds' => 'Seconds', + 'graph_period' => 'Graph Period', + 'graph_period_helper' => 'The amount of data points, seconds, shown on the console graphs.', + 'navigation' => 'Navigation Type', + 'sidebar' => 'Sidebar', + 'topbar' => 'Topbar', + 'mixed' => 'Mixed', + 'redirect_to_admin' => 'Redirect to Admin on Login', + 'redirect_to_admin_help' => 'When enabled, you will be redirected to the admin area after logging in instead of the server list.', + 'no_oauth' => 'No Accounts Linked', + 'no_api_keys' => 'No API Keys', + 'no_ssh_keys' => 'No SSH Keys', + 'activity_info' => 'Showing last 50 activity logs', +]; diff --git a/lang/en/server/activity.php b/lang/en/server/activity.php new file mode 100644 index 0000000000..43db3d6cc7 --- /dev/null +++ b/lang/en/server/activity.php @@ -0,0 +1,11 @@ + 'Activity', + 'event' => 'Event', + 'user' => 'User', + 'deleted_user' => 'Deleted User', + 'system' => 'System', + 'timestamp' => 'Timestamp', + 'metadata' => 'Metadata', +]; diff --git a/lang/en/server/backup.php b/lang/en/server/backup.php new file mode 100644 index 0000000000..8ba5b8514e --- /dev/null +++ b/lang/en/server/backup.php @@ -0,0 +1,55 @@ + 'Backups', + 'empty' => 'No Backups', + 'size' => 'Size', + 'created_at' => 'Created at', + 'status' => 'Status', + 'is_locked' => 'Lock Status', + 'backup_status' => [ + 'in_progress' => 'In Progress', + 'successful' => 'Successful', + 'failed' => 'Failed', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Create Backup', + 'limit' => 'Backup Limit Reached', + 'created' => ':name created', + 'notification_success' => 'Backup Created Successfully', + 'notification_fail' => 'Backup Creation Failed', + 'name' => 'Name', + 'ignored' => 'Ignored Files & Directories', + 'locked' => 'Locked?', + 'lock_helper' => 'Prevents this backup from being deleted until explicitly unlocked.', + ], + 'lock' => [ + 'lock' => 'Lock', + 'unlock' => 'Unlock', + ], + 'download' => 'Download', + 'rename' => [ + 'title' => 'Rename', + 'new_name' => 'Backup Name', + 'notification_success' => 'Backup Renamed Successfully', + ], + 'restore' => [ + 'title' => 'Restore', + 'helper' => 'Your server will be stopped. You will not be able to control the power state, access the file manager, or create additional backups until this process is completed.', + 'delete_all' => 'Delete all files before restoring backup?', + 'notification_started' => 'Restoring Backup', + 'notification_success' => 'Backup Restored Successfully', + 'notification_fail' => 'Backup Restore Failed', + 'notification_fail_body_1' => 'This server is not currently in a state that allows for a backup to be restored.', + 'notification_fail_body_2' => 'This backup cannot be restored at this time: not completed or failed.', + ], + 'delete' => [ + 'title' => 'Delete Backup', + 'description' => 'Do you wish to delete :backup?', + 'notification_success' => 'Backup Deleted', + 'notification_fail' => 'Could not delete backup', + 'notification_fail_body' => 'Connection to node failed. Please try again.', + ], + ], +]; diff --git a/lang/en/server/console.php b/lang/en/server/console.php new file mode 100644 index 0000000000..4cdd9906bb --- /dev/null +++ b/lang/en/server/console.php @@ -0,0 +1,43 @@ + 'Console', + 'command' => 'Type a command...', + 'command_blocked' => 'Server Offline...', + 'command_blocked_title' => 'Can\'t send command when the server is Offline', + 'open_in_admin' => 'Open in Admin', + 'power_actions' => [ + 'start' => 'Start', + 'stop' => 'Stop', + 'restart' => 'Restart', + 'kill' => 'Kill', + 'kill_tooltip' => 'This can result in data corruption and/or data loss!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Memory', + 'network' => 'Network', + 'disk' => 'Disk', + 'name' => 'Name', + 'status' => 'Status', + 'address' => 'Address', + 'unavailable' => 'Unavailable', + ], + 'status' => [ + 'created' => 'Created', + 'starting' => 'Starting', + 'running' => 'Running', + 'restarting' => 'Restarting', + 'exited' => 'Exited', + 'paused' => 'Paused', + 'dead' => 'Dead', + 'removing' => 'Removing', + 'stopping' => 'Stopping', + 'offline' => 'Offline', + 'missing' => 'Missing', + ], + 'websocket_error' => [ + 'title' => 'Could not connect to websocket!', + 'body' => 'Check your browser console for more details.', + ], +]; diff --git a/lang/en/server/dashboard.php b/lang/en/server/dashboard.php new file mode 100644 index 0000000000..e645242e3f --- /dev/null +++ b/lang/en/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servers', + 'list' => 'Server List', + 'tabs' => [ + 'my' => 'My Servers', + 'other' => 'Others\' Servers', + 'all' => 'All Servers', + ], + 'empty_own' => 'You don\'t own any servers!', + 'empty_other' => 'You don\'t have access to any servers!', + + 'status' => 'Status', + 'server' => 'Server', + 'resources' => 'Resources', + 'usage_limit' => 'Usage Limit: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Memory', + 'disk' => 'Disk', + 'network' => 'Network', + 'none' => 'None', + 'loading' => 'Loading...', + + 'power_actions' => 'Power Actions', + 'power_action_sent' => ':action sent to :name', +]; diff --git a/lang/en/server/database.php b/lang/en/server/database.php new file mode 100644 index 0000000000..c8a8802396 --- /dev/null +++ b/lang/en/server/database.php @@ -0,0 +1,27 @@ + 'Databases', + 'empty' => 'No Databases', + 'create_database' => 'Create Database', + 'limit' => 'Database limit reached', + 'viewing' => 'Viewing: :database', + 'host' => 'Host', + 'database' => 'Database', + 'username' => 'Username', + 'password' => 'Password', + 'remote' => 'Remote', + 'unlimited' => 'Unlimited', + 'created_at' => 'Created at', + 'name' => 'Database Name', + 'name_hint' => 'Leaving this blank will auto generate a random name', + 'connections_from' => 'Connections From', + 'max_connections' => 'Max Connections', + 'database_host' => 'Database Host', + 'database_host_select' => 'Select Database Host', + 'jdbc' => 'JDBC Connection String', + 'create_notification' => 'Created :database', + 'create_notification_fail' => 'Failed to create :database', + 'delete_notification' => 'Deleted :database', + 'delete_notification_fail' => 'Failed to delete :database', +]; diff --git a/lang/en/server/file.php b/lang/en/server/file.php new file mode 100644 index 0000000000..c349195aca --- /dev/null +++ b/lang/en/server/file.php @@ -0,0 +1,111 @@ + 'Files', + 'name' => 'Name', + 'size' => 'Size', + 'modified_at' => 'Modified at', + 'actions' => [ + 'open' => 'Open', + 'download' => 'Download', + 'copy' => [ + 'title' => 'Copy', + 'notification' => 'File Copied', + ], + 'upload' => [ + 'title' => 'Upload', + 'from_files' => 'Upload Files', + 'from_url' => 'Upload from URL', + 'url' => 'URL', + 'drop_files' => 'Drop files to upload', + 'success' => 'Files uploaded successfully', + 'failed' => 'Failed to upload files', + 'header' => 'Uploading Files', + 'error' => 'An error occurred while uploading', + ], + 'rename' => [ + 'title' => 'Rename', + 'file_name' => 'File Name', + 'notification' => 'File Renamed', + ], + 'move' => [ + 'title' => 'Move', + 'directory' => 'Directory', + 'directory_hint' => 'Enter the new directory, relative to the current directory.', + 'new_location' => 'New Location', + 'new_location_hint' => 'Enter the location of this file or folder, relative to the current directory.', + 'notification' => 'File Moved', + 'bulk_notification' => ':count Files were moved to :directory', + ], + 'permissions' => [ + 'title' => 'Permissions', + 'read' => 'Read', + 'write' => 'Write', + 'execute' => 'Execute', + 'owner' => 'Owner', + 'group' => 'Group', + 'public' => 'Public', + 'notification' => 'Permissions changed to :mode', + ], + 'archive' => [ + 'title' => 'Archive', + 'archive_name' => 'Archive Name', + 'notification' => 'Archive Created', + 'extension' => 'Extension', + ], + 'unarchive' => [ + 'title' => 'Unarchive', + 'notification' => 'Unarchive Completed', + ], + 'new_file' => [ + 'title' => 'New file', + 'file_name' => 'New file name', + 'syntax' => 'Syntax Highlighting', + 'create' => 'Create', + ], + 'new_folder' => [ + 'title' => 'New folder', + 'folder_name' => 'New folder name', + ], + 'nested_search' => [ + 'title' => 'Nested Search', + 'search_term' => 'Search term', + 'search_term_placeholder' => 'Enter a search term, ex. *.txt', + 'search' => 'Search', + 'search_for_term' => 'Search :term', + ], + 'delete' => [ + 'notification' => 'File Deleted', + 'bulk_notification' => ':count files were deleted', + ], + 'edit' => [ + 'title' => 'Editing: :file', + 'save_close' => 'Save & Close', + 'save' => 'Save', + 'cancel' => 'Cancel', + 'notification' => 'File Saved', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name is too large!', + 'body' => 'Max is :max', + ], + 'file_not_found' => [ + 'title' => ':name not found!', + ], + 'file_not_editable' => [ + 'title' => ':name is a directory', + ], + 'file_already_exists' => [ + 'title' => ':name already exists!', + ], + 'files_node_error' => [ + 'title' => 'Could not load files!', + ], + 'pelicanignore' => [ + 'title' => 'You are editing a .pelicanignore file!', + 'body' => 'Any files or directories listed in here will be excluded from backups. Wildcards are supported by using an asterisk (*).
You can negate a prior rule by prepending an exclamation point (!).', + ], + ], +]; diff --git a/lang/en/server/network.php b/lang/en/server/network.php new file mode 100644 index 0000000000..6ff0bf1bb5 --- /dev/null +++ b/lang/en/server/network.php @@ -0,0 +1,17 @@ + 'Network', + 'add' => 'Add Allocation', + 'limit' => 'Allocation limit reached', + 'address' => 'Address', + 'port' => 'Port', + 'notes' => 'Notes', + 'no_notes' => 'No Notes', + 'make_primary' => 'Make Primary', + 'primary' => 'Primary', + 'make' => 'Make', + 'delete' => 'Delete', + 'locked' => 'Locked?', + 'locked_helper' => 'Locked allocations can only be deleted by admins', +]; diff --git a/lang/en/server/schedule.php b/lang/en/server/schedule.php new file mode 100644 index 0000000000..be0ae8d7b4 --- /dev/null +++ b/lang/en/server/schedule.php @@ -0,0 +1,121 @@ + 'Schedules', + 'new' => 'New Schedule', + 'edit' => 'Edit Schedule', + 'save' => 'Save Schedule', + 'delete' => 'Delete Schedule', + 'import' => 'Import Schedule', + 'export' => 'Export Schedule', + 'name' => 'Name', + 'cron' => 'Cron', + 'status' => 'Status', + 'schedule_status' => [ + 'inactive' => 'Inactive', + 'processing' => 'Processing', + 'active' => 'Active', + ], + 'no_tasks' => 'No Tasks', + 'run_now' => 'Run Now', + 'online_only' => 'Only When Online', + 'last_run' => 'Last Run', + 'next_run' => 'Next Run', + 'never' => 'Never', + 'cancel' => 'Cancel', + + 'only_online' => 'Only when Server is Online?', + 'only_online_hint' => 'Only execute this schedule when the server is in a running state.', + 'enabled' => 'Enable Schedule?', + 'enabled_hint' => 'This schedule will be executed automatically if enabled.', + + 'cron_body' => 'Please keep in mind that the cron inputs below always assume UTC.', + 'cron_timezone' => 'Next run in your timezone (:timezone): :next_run ', + + 'invalid' => 'Invalid', + + 'time' => [ + 'minute' => 'Minute', + 'hour' => 'Hour', + 'day' => 'Day', + 'week' => 'Week', + 'month' => 'Month', + 'day_of_month' => 'Day of Month', + 'day_of_week' => 'Day of Week', + + 'hourly' => 'Hourly', + 'daily' => 'Daily', + 'weekly_mon' => 'Weekly (Monday)', + 'weekly_sun' => 'Weekly (Sunday)', + 'monthly' => 'Monthly', + 'every_min' => 'Every x minutes', + 'every_hour' => 'Every x hours', + 'every_day' => 'Every x days', + 'every_week' => 'Every x weeks', + 'every_month' => 'Every x months', + 'every_day_of_week' => 'Every x day of week', + + 'every' => 'Every', + 'minutes' => 'Minutes', + 'hours' => 'Hours', + 'days' => 'Days', + 'months' => 'Months', + + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + 'sunday' => 'Sunday', + ], + + 'tasks' => [ + 'title' => 'Tasks', + 'create' => 'Create Task', + 'limit' => 'Task Limit Reached', + 'action' => 'Action', + 'payload' => 'Payload', + 'no_payload' => 'No Payload', + 'time_offset' => 'Time Offset', + 'first_task' => 'First Task', + 'seconds' => 'Second|Seconds', + 'continue_on_failure' => 'Continue On Failure', + + 'actions' => [ + 'title' => 'Action', + 'power' => [ + 'title' => 'Send Power Action', + 'action' => 'Power action', + 'start' => 'Start', + 'stop' => 'Stop', + 'restart' => 'Restart', + 'kill' => 'Kill', + ], + 'command' => [ + 'title' => 'Send Command', + 'command' => 'Command', + ], + 'backup' => [ + 'title' => 'Create Backup', + 'files_to_ignore' => 'Files to Ignore', + ], + 'delete_files' => [ + 'title' => 'Delete Files', + 'files_to_delete' => 'Files to Delete', + ], + ], + ], + + 'notification_invalid_cron' => 'The cron data provided does not evaluate to a valid expression', + + 'import_action' => [ + 'file' => 'File', + 'url' => 'URL', + 'schedule_help' => 'This should be the raw .json file ( schedule-daily-restart.json )', + 'url_help' => 'URLs must point directly to the raw .json file', + 'add_url' => 'New URL', + 'import_failed' => 'Import Failed', + 'import_success' => 'Import Success', + ], +]; diff --git a/lang/en/server/setting.php b/lang/en/server/setting.php new file mode 100644 index 0000000000..8691baebe6 --- /dev/null +++ b/lang/en/server/setting.php @@ -0,0 +1,55 @@ + 'Settings', + 'server_info' => [ + 'title' => 'Server Information', + 'information' => 'Information', + 'name' => 'Server Name', + 'server_name' => 'Server Name: :name', + 'notification_name' => 'Updated Server Name', + 'description' => 'Server Description', + 'notification_description' => 'Updated Server Description', + 'failed' => 'Failed', + 'uuid' => 'Server UUID', + 'uuid_short' => 'Server ID', + 'node_name' => 'Node Name', + 'icon' => [ + 'upload' => 'Upload Icon', + 'tooltip' => 'Using Egg Icon', + 'updated' => 'Server icon updated', + 'deleted' => 'Server icon deleted', + ], + 'limits' => [ + 'title' => 'Limits', + 'unlimited' => 'Unlimited', + 'of' => 'of :max', + 'cpu' => 'CPU', + 'memory' => 'Memory', + 'disk' => 'Disk Space', + 'backups' => 'Backups', + 'databases' => 'Databases', + 'allocations' => 'Allocations', + 'no_allocations' => 'No Additional Allocations', + ], + 'sftp' => [ + 'title' => 'SFTP Information', + 'connection' => 'Connection', + 'action' => 'Connect to SFTP', + 'username' => 'Username', + 'password' => 'Password', + 'password_body' => 'Your SFTP password is the same as the password you use to access this panel.', + ], + ], + 'reinstall' => [ + 'title' => 'Reinstall Server', + 'body' => 'Reinstalling your server will stop it, and then re-run the installation script that initially set it up.', + 'body2' => 'Some files may be deleted or modified during this process, please back up your data before continuing.', + 'action' => 'Reinstall', + 'modal' => 'Are you sure you want to reinstall the server?', + 'modal_description' => 'Some files may be deleted or modified during this process, please back up your data before continuing.', + 'yes' => 'Yes, Reinstall', + 'notification_start' => 'Reinstall Started', + 'notification_fail' => 'Reinstall Failed', + ], +]; diff --git a/lang/en/server/startup.php b/lang/en/server/startup.php new file mode 100644 index 0000000000..49ff30f7ed --- /dev/null +++ b/lang/en/server/startup.php @@ -0,0 +1,17 @@ + 'Startup', + 'command' => 'Startup Command', + 'notification_startup' => 'Startup Command Updated', + 'notification_startup_body' => 'Restart the server to use the new startup command.', + 'enable_preview' => 'Enable Preview', + 'disable_preview' => 'Disable Preview', + 'docker_image' => 'Docker Image', + 'notification_docker' => 'Docker Image Updated', + 'notification_docker_body' => 'Restart the server to use the new image.', + 'variables' => 'Server Variables', + 'update' => 'Updated: :variable', + 'fail' => 'Failed: :variable', + 'validation_fail' => 'Validation Failed: :variable', +]; diff --git a/lang/en/server/user.php b/lang/en/server/user.php new file mode 100644 index 0000000000..a56c719615 --- /dev/null +++ b/lang/en/server/user.php @@ -0,0 +1,73 @@ + 'Users', + 'username' => 'Username', + 'email' => 'Email', + 'assign_all' => 'Assign all', + 'invite_user' => 'Invite User', + 'action' => 'Invite', + 'remove' => 'Remove User', + 'edit' => 'Edit User', + 'editing' => 'Editing :user', + 'delete' => 'Delete User', + 'notification_add' => 'User Invited!', + 'notification_edit' => 'User Updated!', + 'notification_delete' => 'User Deleted!', + 'notification_failed' => 'Failed to invite user!', + 'permissions' => [ + 'title' => 'Permissions', + 'activity_desc' => 'Permissions that control a user\'s access to the server activity logs.', + 'startup_desc' => 'Permissions that control a user\'s ability to view this server\'s startup parameters.', + 'settings_desc' => 'Permissions that control a user\'s ability to modify this server\'s settings.', + 'control_desc' => 'Permissions that control a user\'s ability to control the power state of a server, or send commands.', + 'user_desc' => 'Permissions that allow a user to manage other subusers on a server. They will never be able to edit their own account, or assign permissions they do not have themselves.', + 'file_desc' => 'Permissions that control a user\'s ability to modify the filesystem for this server.', + 'allocation_desc' => 'Permissions that control a user\'s ability to modify the port allocations for this server.', + 'database_desc' => 'Permissions that control a user\'s access to the database management for this server.', + 'backup_desc' => 'Permissions that control a user\'s ability to generate and manage server backups.', + 'schedule_desc' => 'Permissions that control a user\'s access to the schedule management for this server.', + 'startup_read' => 'Allows a user to view the startup variables for a server.', + 'startup_update' => 'Allows a user to modify the startup variables for the server.', + 'startup_docker_image' => 'Allows a user to modify the Docker image used when running the server.', + 'settings_reinstall' => 'Allows a user to trigger a reinstall of this server.', + 'settings_rename' => 'Allows a user to rename this server.', + 'settings_description' => 'Allows a user to change the description of this server.', + 'activity_read' => 'Allows a user to view the activity logs for the server.', + 'websocket_connect' => 'Allows a user access to the websocket for this server.', + 'control_console' => 'Allows a user to send data to the server console.', + 'control_start' => 'Allows a user to start the server instance.', + 'control_stop' => 'Allows a user to stop the server instance.', + 'control_restart' => 'Allows a user to restart the server instance.', + 'control_kill' => 'Allows a user to kill the server instance.', + 'user_create' => 'Allows a user to create new user accounts for the server.', + 'user_read' => 'Allows a user permission to view users associated with this server.', + 'user_update' => 'Allows a user to modify other users associated with this server.', + 'user_delete' => 'Allows a user to delete other users associated with this server.', + 'file_create' => 'Allows a user permission to create new files and directories.', + 'file_read' => 'Allows a user to view the contents of a directory, but not view the contents of or download files.', + 'file_read_content' => 'Allows a user to view the contents of a given file. This will also allow the user to download files.', + 'file_update' => 'Allows a user to update files and folders associated with the server.', + 'file_delete' => 'Allows a user to delete files and directories.', + 'file_archive' => 'Allows a user to create file archives and decompress existing archives.', + 'file_sftp' => 'Allows a user to perform the above file actions using a SFTP client.', + 'allocation_read' => 'Allows a user to view all allocations currently assigned to this server. Users with any level of access to this server can always view the primary allocation.', + 'allocation_update' => 'Allows a user to change the primary server allocation and attach notes to each allocation.', + 'allocation_delete' => 'Allows a user to delete an allocation from the server.', + 'allocation_create' => 'Allows a user to assign additional allocations to the server.', + 'database_create' => 'Allows a user permission to create a new database for the server.', + 'database_read' => 'Allows a user permission to view the server databases.', + 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', + 'database_delete' => 'Allows a user permission to delete a database instance.', + 'database_view_password' => 'Allows a user permission to view a database password in the system.', + 'schedule_create' => 'Allows a user to create a new schedule for the server.', + 'schedule_read' => 'Allows a user permission to view schedules for a server.', + 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', + 'schedule_delete' => 'Allows a user to delete a schedule for the server.', + 'backup_create' => 'Allows a user to create new backups for this server.', + 'backup_read' => 'Allows a user to view all backups that exist for this server.', + 'backup_delete' => 'Allows a user to remove backups from the system.', + 'backup_download' => 'Allows a user to download a backup for the server. Danger: this allows a user to access all files for the server in the backup.', + 'backup_restore' => 'Allows a user to restore a backup for the server. Danger: this allows the user to delete all of the server files in the process.', + ], +]; diff --git a/lang/en/server/users.php b/lang/en/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/en/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/en/strings.php b/lang/en/strings.php deleted file mode 100644 index 21b134b3b0..0000000000 --- a/lang/en/strings.php +++ /dev/null @@ -1,115 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'password_confirmation' => 'Password Confirmation', - 'current_password' => 'Current Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'username' => 'Username', - 'language' => 'Language', - 'dashboard' => 'Dashboard', - 'id' => 'ID', - 'name' => 'Name', - 'description' => 'Description', - 'force_outgoing_ip' => 'Force Outgoing IP', - 'startup' => 'Startup', - 'docker_images' => 'Docker Images', - 'linked_node' => 'Linked Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'account_settings' => 'Account Settings', - 'account_password' => 'Account Password', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'Never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'host' => 'Host', - 'port' => 'Port', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'read_only?' => 'Read Only?', - 'writable' => 'Writable', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'author' => 'Author', - 'image_uri' => 'Image URI', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'error' => 'Error', - 'error_rendering_view' => 'An error was encountered by the application while rendering this view. Try refreshing the page.', - 'okay' => 'Okay', - 'loading' => 'Loading...', - 'access_denied' => [ - 'title' => 'Access Denied', - 'message' => 'You do not have permission to access this page.', - ], - 'version' => 'Version: :version', - 'coming_soon' => 'Coming soon!', -]; diff --git a/lang/en/validation.php b/lang/en/validation.php index 9cccf35080..03995fc1d5 100644 --- a/lang/en/validation.php +++ b/lang/en/validation.php @@ -28,7 +28,7 @@ 'string' => 'The :attribute must be between :min and :max characters.', 'array' => 'The :attribute must have between :min and :max items.', ], - 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', 'date' => 'The :attribute is not a valid date.', 'date_format' => 'The :attribute does not match the format :format.', @@ -36,13 +36,13 @@ 'digits' => 'The :attribute must be :digits digits.', 'digits_between' => 'The :attribute must be between :min and :max digits.', 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', 'filled' => 'The :attribute field is required.', 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', 'integer' => 'The :attribute must be an integer.', 'ip' => 'The :attribute must be a valid IP address.', @@ -61,17 +61,13 @@ 'string' => 'The :attribute must be at least :min characters.', 'array' => 'The :attribute must have at least :min items.', ], - 'not_in' => 'The selected :attribute is invalid.', + 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', 'size' => [ 'numeric' => 'The :attribute must be :size.', @@ -81,8 +77,7 @@ ], 'string' => 'The :attribute must be a string.', 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', /* diff --git a/lang/es/activity.php b/lang/es/activity.php index 68f9fa468c..2b9aec27c4 100644 --- a/lang/es/activity.php +++ b/lang/es/activity.php @@ -10,28 +10,28 @@ 'auth' => [ 'fail' => 'Inicio de sesión fallido', 'success' => 'Sesión iniciada', - 'password-reset' => 'Restablecimiento de contraseña', - 'reset-password' => 'Solicitud de restablecimiento de contraseña', - 'checkpoint' => 'Solicitud de autenticación de dos factores', - 'recovery-token' => 'Token de recuperación de dos factores utilizado', - 'token' => 'Resuelto desafío de dos factores', - 'ip-blocked' => 'Solicitud bloqueada desde la dirección IP no listada para :identifier', + 'password-reset' => 'Restablecer contraseña', + 'checkpoint' => 'Solicitud de autenticación de dos factores solicitada', + 'recovery-token' => 'Clave de recuperación de autenticación de dos factores usado', + 'token' => 'Autenticación en dos pasos resuelta', + 'ip-blocked' => 'Solicitud bloqueada de la dirección IP no listada para :identifier', 'sftp' => [ 'fail' => 'Inicio de sesión SFTP fallido', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Cambio de correo electrónico de :old a :new', + 'username-changed' => 'Nombre de usuario cambiado de :old a :new', + 'email-changed' => 'Correo electrónico cambiado de :old a :new', 'password-changed' => 'Contraseña cambiada', ], 'api-key' => [ - 'create' => 'Se creó una nueva clave API :identifier', - 'delete' => 'Se eliminó la clave API :identifier', + 'create' => 'Se creó una nueva clave API
:identifier', + 'delete' => 'Se eliminó la clave API :identificador', ], 'ssh-key' => [ - 'create' => 'Se agregó la clave SSH :fingerprint a la cuenta', - 'delete' => 'Se eliminó la clave SSH :fingerprint de la cuenta', + 'create' => 'Se agregó la clave SSH :huella a la cuenta', + 'delete' => 'Se eliminó la clave SSH :huella a la cuenta', ], 'two-factor' => [ 'create' => 'Se habilitó la autenticación de dos factores', @@ -39,92 +39,87 @@ ], ], 'server' => [ - 'reinstall' => 'Servidor reinstalado', 'console' => [ - 'command' => 'Ejecutado ":command" en el servidor', + 'command' => 'Se ejecutó ":comando"" en el servidor', ], 'power' => [ - 'start' => 'Iniciado el servidor', - 'stop' => 'Detenido el servidor', - 'restart' => 'Reiniciado el servidor', - 'kill' => 'Finalizado el proceso del servidor', + 'start' => 'Se ha iniciado el servidor', + 'stop' => 'Se ha detenido el servidor', + 'restart' => 'Se ha reiniciado el servidor', + 'kill' => 'Se ha detenido el proceso del servidor', ], 'backup' => [ - 'download' => 'Descargada la copia de seguridad :name', - 'delete' => 'Eliminada la copia de seguridad :name', - 'restore' => 'Restaurada la copia de seguridad :name (archivos eliminados: :truncate)', - 'restore-complete' => 'Restauración completa de la copia de seguridad :name', - 'restore-failed' => 'Falló la restauración de la copia de seguridad :name', - 'start' => 'Iniciada una nueva copia de seguridad :name', - 'complete' => 'Marcada la copia de seguridad :name como completada', - 'fail' => 'Marcada la copia de seguridad :name como fallida', - 'lock' => 'Bloqueada la copia de seguridad :name', - 'unlock' => 'Desbloqueada la copia de seguridad :name', + 'download' => 'Descargada la copia de seguridad :name', + 'delete' => 'Eliminada la copia de seguridad: :name ', + 'restore' => 'Restaurada la copia de seguridad: :name. (Archivos eliminados: :truncate) ', + 'restore-complete' => 'Restaurada la copia de seguridad: :name ', + 'restore-failed' => 'No se pudo completar la restauración de la copia de seguridad: : name', + 'start' => 'Iniciada una nueva copia de seguridad :name ', + 'complete' => 'Marcada la copia de seguridad :name como completada', + 'fail' => 'Marcada la copia de seguridad :name como fallida', + 'lock' => 'La copia de seguridad :name ha sido bloqueada.', + 'unlock' => 'La copia de seguridad :name ha sido desbloqueada.', + 'rename' => 'Copia de seguridad renombrada de ":old_name" a ":new_name"', ], 'database' => [ - 'create' => 'Creada nueva base de datos :name', - 'rotate-password' => 'Contraseña rotada para la base de datos :name', - 'delete' => 'Eliminada la base de datos :name', + 'create' => 'La base de datos :name ha sido creada.', + 'rotate-password' => 'La contraseña de la base de datos :name ha sido rotada.', + 'delete' => 'La base de datos :name se ha eliminado.', ], 'file' => [ - 'compress_one' => 'Comprimido :directory:file', - 'compress_other' => 'Comprimidos :count archivos en :directory', - 'read' => 'Visto el contenido de :file', - 'copy' => 'Creada una copia de :file', - 'create-directory' => 'Creado directorio :directory:name', - 'decompress' => 'Descomprimidos :files en :directory', - 'delete_one' => 'Eliminado :directory:files.0', - 'delete_other' => 'Eliminados :count archivos en :directory', - 'download' => 'Descargado :file', - 'pull' => 'Descargado un archivo remoto desde :url a :directory', - 'rename_one' => 'Renombrado :directory:files.0.from a :directory:files.0.to', - 'rename_other' => 'Renombrados :count archivos en :directory', - 'write' => 'Escrito nuevo contenido en :file', - 'upload' => 'Iniciada una carga de archivo', - 'uploaded' => 'Cargado :directory:file', + 'compress' => 'Comprimidos :directory:files|Comprimidos :count archivos en :directory.', + 'read' => 'Los contenidos de :file han sido vistos.', + 'copy' => 'Creado una copia de :file', + 'create-directory' => 'Creado el directorio :directory:name', + 'decompress' => 'Descomprimido :file en :directory', + 'delete' => 'Eliminado :directory:files|Eliminado :count archivos en :directory', + 'download' => 'Descargado :file', + 'pull' => 'Descargado un archivo remoto desde :url a :directory', + 'rename' => 'Movido/ Renombrado :from a :to | Movidos/ Renombrados :count archivos en :directory', + 'write' => 'Escrito nuevo contenido en :file', + 'upload' => 'Iniciada la subida de un archivo', + 'uploaded' => 'Subido :directory:file', ], 'sftp' => [ - 'denied' => 'Acceso SFTP bloqueado debido a permisos', - 'create_one' => 'Creado :files.0', - 'create_other' => 'Creados :count nuevos archivos', - 'write_one' => 'Modificado el contenido de :files.0', - 'write_other' => 'Modificado el contenido de :count archivos', - 'delete_one' => 'Eliminado :files.0', - 'delete_other' => 'Eliminados :count archivos', - 'create-directory_one' => 'Creado el directorio :files.0', - 'create-directory_other' => 'Creados :count directorios', - 'rename_one' => 'Renombrado :files.0.from a :files.0.to', - 'rename_other' => 'Renombrados o movidos :count archivos', + 'denied' => 'Acceso SFTP bloqueado debido a los permisos', + 'create' => 'Creado :files|Creado :count archivos nuevos', + 'write' => 'Modificados los contenidos de :files| Modificados los contenidos de :count archivos', + 'delete' => 'Eliminado :files|Eliminados :count archivos', + 'create-directory' => 'Creado el directorio :files | Creados :count directorios', + 'rename' => 'Renombrado :from a :to|Renombrados o movidos :count archivos', ], 'allocation' => [ - 'create' => 'Añadida :allocation al servidor', - 'notes' => 'Actualizadas las notas para :allocation de ":old" a ":new"', - 'primary' => 'Establecida :allocation como la asignación primaria del servidor', - 'delete' => 'Eliminada la asignación :allocation', + 'create' => 'Añadido :allocation al servidor', + 'notes' => 'Actualizadas las notas para :allocation de ":old" a ":new"', + 'primary' => 'Establecida :allocation como la asignación primaria del servidor', + 'delete' => 'Eliminada la asignación :allocation', ], 'schedule' => [ - 'create' => 'Creado el horario :name', - 'update' => 'Actualizado el horario :name', - 'execute' => 'Ejecutado manualmente el horario :name', - 'delete' => 'Eliminado el horario :name', + 'create' => 'Creado el horario :name', + 'update' => 'Actualizado el horario :name', + 'execute' => 'Ejecutó manualmente el horario :name', + 'delete' => 'Eliminado el horario :name', ], 'task' => [ - 'create' => 'Creada una nueva tarea ":action" para el horario :name', - 'update' => 'Actualizada la tarea ":action" para el horario :name', - 'delete' => 'Eliminada una tarea para el horario :name', + 'create' => 'Creada una nueva tarea ":action" para el horario :name', + 'update' => 'Actualizada la tarea":action" para el horario :name', + 'delete' => 'Se eliminó la tarea ":action" del horario :name', ], 'settings' => [ - 'rename' => 'Renombrado el servidor de :old a :new', - 'description' => 'Cambiada la descripción del servidor de :old a :new', + 'rename' => 'Renombrado el servidor de ":old" a ":new"', + 'description' => 'Cambiada la descripción del servidor de ":old" a ":new"', + 'reinstall' => 'Servidor reinstalado', ], 'startup' => [ - 'edit' => 'Cambiada la variable :variable de ":old" a ":new"', - 'image' => 'Actualizada la imagen de Docker del servidor de :old a :new', + 'edit' => 'Cambiada la variable :variable de ":old" a ":new"', + 'image' => 'Actualizada la Imagen Docker del el servidor de :old a :new', + 'command' => 'Se actualizó el comando de inicio del servidor de :old a :new', ], 'subuser' => [ - 'create' => 'Añadido :email como subusuario', - 'update' => 'Actualizados los permisos del subusuario :email', - 'delete' => 'Eliminado :email como subusuario', + 'create' => 'Añadido :email como subusuario', + 'update' => 'Actualizados los permisos del subusuario :email', + 'delete' => 'Eliminado :email como subusuario', ], + 'crashed' => 'Servidor caído', ], ]; diff --git a/lang/es/admin/apikey.php b/lang/es/admin/apikey.php new file mode 100644 index 0000000000..5757cc33c6 --- /dev/null +++ b/lang/es/admin/apikey.php @@ -0,0 +1,27 @@ + 'Claves API de la aplicación', + 'empty' => 'No hay claves API', + 'whitelist' => 'Direcciones IPv4 permitidas', + 'whitelist_help' => 'Las claves API pueden ser restringidas para funcionar solamente desde direcciones IPv4 específicas. Introduce cada dirección en una línea nueva.', + 'whitelist_placeholder' => 'Ejemplo: 127.0.0.1 o 192.168.1.1', + 'description' => 'Descripción', + 'description_help' => 'Una breve descripción de para qué es esta clave.', + 'nav_title' => 'Claves API', + 'model_label' => 'Clave API de la aplicación', + 'model_label_plural' => 'Claves API de la aplicación', + 'table' => [ + 'key' => 'Clave', + 'description' => 'Descripción', + 'last_used' => 'Último uso', + 'created' => 'Creado', + 'created_by' => 'Creado por', + 'never_used' => 'Nunca usado', + ], + 'permissions' => [ + 'none' => 'Ninguno', + 'read' => 'Leer', + 'read_write' => 'Lectura y escritura', + ], +]; diff --git a/lang/es/admin/dashboard.php b/lang/es/admin/dashboard.php new file mode 100644 index 0000000000..3559a97756 --- /dev/null +++ b/lang/es/admin/dashboard.php @@ -0,0 +1,45 @@ + '¡Bienvenido a Pelican!', + 'version' => 'Versión :version', + 'advanced' => 'Avanzado', + 'server' => 'Servidor', + 'user' => 'Usuario', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Información para Desarrolladores', + 'content' => '¡Gracias por probar la versión en desarrollo!', + 'extra_note' => 'Si tienes algún problema, por favor repórtalo en GitHub.', + 'button_issues' => 'Crear Incidencia', + 'button_features' => 'Discutir Funcionalidades', + ], + 'intro-update-available' => [ + 'heading' => 'Actualización disponible', + 'content' => '¡:latestVersion ya está disponible! Lea nuestra documentación para actualizar su panel.', + 'button_changelog' => '¿Qué hay de nuevo?', + ], + 'intro-no-update' => [ + 'heading' => 'Tu panel está actualizado', + 'content' => 'Actualmente estás usando la versión :version. ¡Tu panel está actualizado!', + ], + 'intro-first-node' => [ + 'heading' => 'No se han detectado nodes', + 'content' => 'Parece que aún no tienes ningún node configurado, pero no te preocupes: haz clic en el botón de acción para crear el primero.', + 'extra_note' => 'Si tienes algún problema, por favor repórtalo en GitHub.', + 'button_label' => 'Crear el primer node en Pelican', + ], + 'intro-support' => [ + 'heading' => 'Apoyar a Pelican', + 'content' => '¡Gracias por usar Pelican! Esto solo ha sido posible gracias a ti, nuestros colaboradores y el resto de nuestros seguidores.', + 'extra_note' => 'Agradecemos todo el apoyo de cualquier persona.', + 'button_translate' => 'Ayudar a traducir', + 'button_donate' => 'Donar Directamente', + ], + 'intro-help' => [ + 'heading' => '¿Necesitas ayuda?', + 'content' => '¡Echa un vistazo a la documentación primero! ¡Si todavía necesitas ayuda, ve a nuestro servidor de Discord!', + 'button_docs' => 'Leer la documentación', + ], + ], +]; diff --git a/lang/es/admin/databasehost.php b/lang/es/admin/databasehost.php new file mode 100644 index 0000000000..7bd6dfd86a --- /dev/null +++ b/lang/es/admin/databasehost.php @@ -0,0 +1,72 @@ + 'Hosts de base de datos', + 'model_label' => 'Host de base de datos', + 'model_label_plural' => 'Hosts de base de datos', + 'table' => [ + 'database' => 'Base de datos', + 'name' => 'Nombre', + 'host' => 'Host', + 'port' => 'Puerto', + 'name_helper' => 'Dejar este espacio en blanco generará automáticamente un nombre aleatorio', + 'username' => 'Nombre de usuario', + 'password' => 'Contraseña', + 'remote' => 'Conexiones desde', + 'remote_helper' => 'Desde donde se deben permitir las conexiones. Dejar en blanco para permitir conexiones desde cualquier lugar.', + 'max_connections' => 'Número máximo de conexiones', + 'created_at' => 'Se creó a la(s)', + 'connection_string' => 'Cadena de conexión JDBC', + ], + 'error' => 'Error al conectar al host', + 'host' => 'Host', + 'host_help' => 'La dirección IP o nombre de dominio que debe ser usado cuando se intenta conectar a este host MySQL desde este Panel para crear nuevas bases de datos.', + 'port' => 'Puerto', + 'port_help' => 'El puerto en el que MySQL se está ejecutando para este host.', + 'max_database' => 'Número máximo de bases de datos', + 'max_databases_help' => 'El número máximo de bases de datos que pueden ser creadas en este host. Si se alcanza el límite, no se pueden crear nuevas bases de datos en este host. En blanco es ilimitado.', + 'display_name' => 'Mostrar Nombre', + 'display_name_help' => 'Un identificador corto usado para distinguir esta ubicación de otros. Debe tener entre 1 y 60 caracteres, por ejemplo, us.nyc.lvl3.', + 'username' => 'Nombre de usuario', + 'username_help' => 'El nombre de usuario que tiene permisos suficientes para crear nuevos usuarios y bases de datos en el sistema.', + 'password' => 'Contraseña', + 'password_help' => 'Contraseña para el usuario de la base de datos.', + 'linked_nodes' => 'Nodos vinculados', + 'linked_nodes_help' => 'Esta configuración se establece por defecto en este host de base de datos cuando se añade una base de datos a un servidor en el nodo seleccionado.', + 'connection_error' => 'Error al conectar al host de base de datos', + 'no_database_hosts' => 'No hay hosts de base de datos', + 'no_nodes' => 'No hay nodos', + 'delete_help' => 'Este Host de base de datos tiene bases de datos', + 'unlimited' => 'Ilimitado', + 'anywhere' => 'Cualquier lugar', + + 'rotate' => 'Rotar', + 'rotate_password' => 'Renovar Contraseña', + 'rotated' => 'Contraseña renovada', + 'rotate_error' => 'Error al renovar la contraseña', + 'databases' => 'Bases de Datos', + + 'setup' => [ + 'preparations' => 'Preparativos', + 'database_setup' => 'Configuración de la base de datos', + 'panel_setup' => 'Configuración del Panel', + + 'note' => 'Actualmente, ¡solo bases de datos MySQL/ MariaDB están soportadas para hosts de bases de datos!', + 'different_server' => '¿El panel y la base de datos no están en el mismo servidor?', + + 'database_user' => 'Usuario de la base de datos', + 'cli_login' => 'Utilice mysql -u root -p para acceder al cli de mysql.', + 'command_create_user' => 'Comando para crear el usuario', + 'command_assign_permissions' => 'Comando para asignar permisos', + 'cli_exit' => 'Para salir del cli de mysql, ejecuta exit.', + 'external_access' => 'Acceso externo', + 'allow_external_access' => ' +

Es probable que necesites permitir el acceso externo a esta instancia de MySQL para que los servidores puedan conectarse a ella.

+
+

Para hacer esto, abre my.cnf, cuya ubicación varía según tu sistema operativo y cómo se haya instalado MySQL. Puedes escribir find /etc -iname my.cnf para localizarlo.

+
+

Abre my.cnf, añade el siguiente texto al final del archivo y guarda los cambios: [mysqld] bind-address=0.0.0.0

+
+

Reinicia MySQL/MariaDB para aplicar estos cambios. Esto sobrescribirá la configuración predeterminada de MySQL, que por defecto solo acepta solicitudes desde localhost. Al actualizarla, se permitirán conexiones en todas las interfaces y, por lo tanto, conexiones externas. Asegúrate de permitir el puerto de MySQL (por defecto 3306) en tu firewall.

', + ], +]; diff --git a/lang/es/admin/egg.php b/lang/es/admin/egg.php new file mode 100644 index 0000000000..f72069f644 --- /dev/null +++ b/lang/es/admin/egg.php @@ -0,0 +1,108 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => 'Configuración', + 'process_management' => 'Gestión de Procesos', + 'egg_variables' => 'Variables del Egg', + 'install_script' => 'Script de instalación', + ], + 'import' => [ + 'file' => 'Archivo', + 'url' => 'URL', + 'image_url' => 'URL de la imagen', + 'image_error' => 'No se pudo obtener la imagen', + 'image_too_large' => 'La imagen es demasiado grande. El límite es de 1024KB', + 'egg_help' => 'Este debería ser el archivo .json ( egg-minecraft.json )', + 'url_help' => 'Las URLs deben apuntar directamente al archivo .json', + 'add_url' => 'Nueva URL', + 'import_failed' => 'Importación fallida', + 'import_success' => 'Importación exitosa', + 'github' => 'Añadir desde GitHub', + 'refresh' => 'Actualizar', + 'import_image' => 'Importar Imagen', + 'no_local_ip' => 'No se permiten direcciones IP locales', + 'unsupported_format' => 'Formato no soportado. Formatos compatibles: :formatos', + 'invalid_url' => 'La URL proporcionada no es válida.', + 'image_deleted' => 'Imagen Eliminada', + 'no_image' => 'Ninguna imagen proporcionada', + 'image_updated' => 'Imagen actualizada', + ], + 'export' => [ + 'modal' => '¿Cómo te gustaría exportar :egg ?', + 'as' => 'Como .:format', + ], + 'in_use' => 'En uso', + 'servers' => 'Servidores', + 'name' => 'Nombre', + 'egg_uuid' => 'UUID del Egg', + 'egg_id' => 'ID del Egg', + 'name_help' => 'Un nombre simple y legible para usar como identificador para este Egg.', + 'author' => 'Autor', + 'uuid_help' => 'Este es el identificador único global de este Egg, que Wings utiliza como identificador.', + 'author_help' => 'El autor de esta versión del Egg.', + 'author_help_edit' => 'El autor de esta versión del Egg. Subir una nueva configuración de un autor diferente cambiará esto.', + 'description' => 'Descripción', + 'description_help' => 'La descripción de este Egg que se mostrará en el Panel según sea necesario.', + 'add_startup' => 'Agregar comando de inicio', + 'startup_command' => 'Comando', + 'startup_commands' => 'Comandos de inicio', + 'startup_name' => 'Nombre para mostrar', + 'startup_help' => 'Los comandos de inicio disponibles para los servidores que usan este Egg. El primero es el predeterminado.', + 'file_denylist' => 'Lista de ficheros rechazados', + 'file_denylist_help' => 'Una lista de archivos que el usuario final no puede editar.', + 'features' => 'Funcionalidades', + 'force_ip' => 'Forzar IP Saliente', + 'force_ip_help' => 'Fuerza que todo el tráfico de red saliente tenga su IP de origen traducida a la IP de asignación primaria del servidor. Es necesario para que algunos juegos funcionen correctamente cuando el nodo tiene múltiples direcciones IP públicas. Habilitar esta opción desactivará la red interna para cualquier servidor que utilice este Huevo, lo que hará que no puedan acceder internamente a otros servidores en el mismo nodo.', + 'tags' => 'Etiquetas', + 'update_url' => 'Actualizar URL', + 'update_url_help' => 'Las URLs deben apuntar directamente al archivo .json', + 'add_image' => 'Añadir imagen de Docker', + 'docker_images' => 'Imágenes de Docker', + 'docker_name' => 'Nombre de imagen', + 'docker_uri' => 'URI de Imagen', + 'docker_help' => 'Las imágenes de Docker disponibles para los servidores que usan este Egg. La primera es la predeterminada.', + + 'stop_command' => 'Comando de parado', + 'stop_command_help' => 'El comando que debe ser enviado a los procesos del servidor para detenerlos de forma automática. Si necesita enviar un SIGINT debe introducir ^C aquí.', + 'copy_from' => 'Copiar ajustes desde', + 'copy_from_help' => 'Si desea que la configuración predeterminada de otro Huevo, selecciónelo en el menú de arriba.', + 'none' => 'Ninguno', + 'start_config' => 'Comenzar configuración', + 'start_config_help' => 'Lista de valores que el demonio debe buscar al arrancar un servidor para determinar la finalización.', + 'config_files' => 'Archivos de configuración', + 'config_files_help' => 'Esto debería ser una representación JSON de los archivos de configuración a modificar y qué partes deben ser cambiadas.', + 'log_config' => 'Configuración de los registros', + 'log_config_help' => 'Esto debería ser una representación JSON de donde se almacenan los archivos de registro, y si el daemon debe estar o no creando registros personalizados.', + + 'environment_variable' => 'Variable de entorno', + 'default_value' => 'Valor por defecto', + 'user_permissions' => 'Permisos de usuario', + 'viewable' => 'Visible', + 'editable' => 'Editable', + 'rules' => 'Reglas', + 'add_new_variable' => 'Agregar nueva variable', + + 'error_unique' => 'Ya existe una variable con este nombre.', + 'error_required' => 'El campo de la variable de entorno es necesario.', + 'error_reserved' => 'Esta variable de entorno está reservada y no puede ser utilizada.', + + 'script_from' => 'Script de', + 'script_container' => 'Contenedor de Script', + 'script_entry' => 'Entrada de Script', + 'script_install' => 'Script de instalación', + 'no_eggs' => 'No hay huevos', + 'no_servers' => 'No hay servidores', + 'no_servers_help' => 'No hay servidores asignados a este Huevo.', + + 'update' => 'Actualizar|Actualizar seleccionado', + 'updated' => 'Egg actualizado|:count/:total Eggs actualizados', + 'updated_failed' => ':count fallaron', + 'updated_skipped' => ':count omitido(s)', + 'update_question' => '¿Está seguro que desea actualizar este egg?|¿Está seguro de que desea actualizar los eggs seleccionados?', + 'update_description' => '¡Si ha hecho algún cambio en el egg se sobrescribirá!|¡Si ha hecho algún cambio en los eggs, serán sobrescritos!', + 'no_updates' => 'No hay actualizaciones disponibles para los eggs seleccionados', +]; diff --git a/lang/es/admin/eggs.php b/lang/es/admin/eggs.php deleted file mode 100644 index ebb5c948ca..0000000000 --- a/lang/es/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'El Egg y sus variables asociadas se importaron correctamente.', - 'updated_via_import' => 'Este Egg se ha actualizado utilizando el archivo proporcionado.', - 'deleted' => 'Se eliminó correctamente el Egg solicitado del Panel.', - 'updated' => 'La configuración del Egg se ha actualizado correctamente.', - 'script_updated' => 'El script de instalación del Egg se ha actualizado y se ejecutará cada vez que se instalen servidores.', - 'egg_created' => 'Se ha creado un nuevo Egg correctamente. Deberás reiniciar cualquier daemon en ejecución para aplicar este nuevo Egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'La variable ":variable" se ha eliminado y ya no estará disponible para los servidores una vez reconstruidos.', - 'variable_updated' => 'La variable ":variable" se ha actualizado. Deberás reconstruir cualquier servidor que utilice esta variable para aplicar los cambios.', - 'variable_created' => 'Se ha creado correctamente una nueva variable y se ha asignado a este Egg.', - ], - ], -]; diff --git a/lang/es/admin/health.php b/lang/es/admin/health.php new file mode 100644 index 0000000000..3df442cbd5 --- /dev/null +++ b/lang/es/admin/health.php @@ -0,0 +1,60 @@ + 'Salud', + 'results_refreshed' => 'Resultados del checkeo de salud actualizados', + 'checked' => 'Resultados comprobados :time', + 'refresh' => 'Actualizar', + 'results' => [ + 'cache' => [ + 'label' => 'Caché', + 'ok' => 'Ok', + 'failed_retrieve' => 'No se pudo establecer o recuperar un valor de la caché de la aplicación', + 'failed' => 'Se ha producido una excepción con el caché de la aplicación: :error', + ], + 'database' => [ + 'label' => 'Base de datos', + 'ok' => 'Ok', + 'failed' => 'No se pudo conectar a la base de datos: :error', + ], + 'debugmode' => [ + 'label' => 'Modo de depuración', + 'ok' => 'El modo de depuración está desactivado', + 'failed' => 'Se esperaba que el modo de depuración fuera :expected, pero en realidad era :actual', + ], + 'environment' => [ + 'label' => 'Entorno', + 'ok' => 'Ok, Establecido a :actual', + 'failed' => 'El entorno está configurado a :actual , Esperado :expected', + ], + 'nodeversions' => [ + 'label' => 'Versiones del nodo', + 'ok' => 'Los nodos están actualizados', + 'failed' => ':outdated/:all Nodos están desactualizados', + 'no_nodes_created' => 'No hay nodos creados', + 'no_nodes' => 'No hay nodos', + 'all_up_to_date' => 'Todo actualizado', + 'outdated' => ':outdated/:all desactualizado', + ], + 'panelversion' => [ + 'label' => 'Versión del Panel', + 'ok' => 'El Panel está actualizado', + 'failed' => 'La versión instalada es :currentVersion pero la última es :latestVersion', + 'up_to_date' => 'Actualizado', + 'outdated' => 'Desactualizado', + ], + 'schedule' => [ + 'label' => 'Agendar', + 'ok' => 'Ok', + 'failed_last_ran' => 'La última ejecución del programa fue hace más de :time minutos', + 'failed_not_ran' => 'El programa no se ha ejecutado todavía.', + ], + 'useddiskspace' => [ + 'label' => 'Espacio en disco', + ], + ], + 'checks' => [ + 'successful' => 'Completado', + 'failed' => 'Fallido', + ], +]; diff --git a/lang/es/admin/log.php b/lang/es/admin/log.php new file mode 100644 index 0000000000..1e8dc9b021 --- /dev/null +++ b/lang/es/admin/log.php @@ -0,0 +1,26 @@ + '¡Genial! ¡Sin errores!', + 'total_logs' => 'Registros totales', + 'error' => 'Error', + 'warning' => 'Advertencia', + 'notice' => 'Aviso', + 'info' => 'Información', + 'debug' => 'Depuración', + 'navigation' => [ + 'panel_logs' => 'Registros del Panel', + ], + 'actions' => [ + 'upload_logs' => '¿Cargar registros?', + 'upload_logs_description' => 'Esto subirá :file a :url ¿Seguro que deseas hacerlo?', + 'view_logs' => 'Ver Registros', + 'log_not_found' => '¡Registro no encontrado!', + 'log_not_found_description' => 'No se pudo encontrar el registro para :filename', + 'failed_to_upload' => 'Error al subir', + 'failed_to_upload_description' => 'Estado HTTP: :status', + 'log_upload' => '¡Registro subido!', + 'log_upload_action' => 'Ver registro', + 'upload_tooltip' => 'Subir a :url', + ], +]; diff --git a/lang/es/admin/mount.php b/lang/es/admin/mount.php new file mode 100644 index 0000000000..9d46d05796 --- /dev/null +++ b/lang/es/admin/mount.php @@ -0,0 +1,30 @@ + 'Volumenes', + 'model_label' => 'Volumen', + 'model_label_plural' => 'Volumenes', + 'name' => 'Nombre', + 'name_help' => 'Nombre único para diferenciar este volumen de otros', + 'source' => 'Origen', + 'source_help' => 'Ruta de archivo en el host para montar a un contenedor', + 'target' => 'Destino', + 'target_help' => 'Ruta donde el volumen será accesible en el contendor', + 'read_only' => 'Solo Lectura?', + 'read_only_help' => 'Volumen de solo lectura dentro del contendor?', + 'description' => 'Descripción', + 'description_help' => 'Una descripción más larga sobre el volumen', + 'no_mounts' => 'Sin volumenes', + 'eggs' => 'Huevos', + 'nodes' => 'Nodos', + 'toggles' => [ + 'writable' => 'Editable', + 'read_only' => 'Solo Lectura', + ], + 'table' => [ + 'name' => 'Nombre', + 'all_eggs' => 'Todos los huevos', + 'all_nodes' => 'Todos los nodos', + 'read_only' => 'Solo Lectura', + ], +]; diff --git a/lang/es/admin/node.php b/lang/es/admin/node.php index 95556057bf..2ea329b5bf 100644 --- a/lang/es/admin/node.php +++ b/lang/es/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'El FQDN o la dirección IP proporcionada no se resuelve a una dirección IP válida.', - 'fqdn_required_for_ssl' => 'Se requiere un nombre de dominio completo que se resuelva a una dirección IP pública para poder utilizar SSL en este nodo.', + 'nav_title' => 'Nodos', + 'model_label' => 'Node', + 'model_label_plural' => 'Nodes', + 'create' => 'Crear Node', + 'tabs' => [ + 'overview' => 'Resumen', + 'basic_settings' => 'Ajustes Básicos', + 'advanced_settings' => 'Ajustes Avanzados', + 'config_file' => 'Archivo de Configuración', + 'diagnostics' => 'Diagnósticos', ], - 'notices' => [ - 'allocations_added' => 'Se han añadido correctamente las asignaciones a este nodo.', - 'node_deleted' => 'El nodo se ha eliminado correctamente del panel.', - 'node_created' => 'Se ha creado correctamente un nuevo nodo. Puedes configurar automáticamente el daemon en esta máquina visitando la pestaña \'Configuración\'. Antes de poder añadir cualquier servidor, primero debes asignar al menos una dirección IP y puerto.', - 'node_updated' => 'Se ha actualizado la información del nodo. Si se cambiaron ajustes del daemon, necesitarás reiniciarlo para que los cambios surtan efecto.', - 'unallocated_deleted' => 'Se han eliminado todos los puertos no asignados para :ip.', + 'table' => [ + 'health' => 'Salud', + 'name' => 'Nombre', + 'address' => 'Dirección', + 'public' => 'Público', + 'servers' => 'Servidores', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => 'Propietario', + 'allocation_notes' => 'Notas', + 'no_notes' => 'Sin notas', ], + 'node_info' => 'Información del node', + 'wings_version' => 'Versión de wings', + 'cpu_threads' => 'Hilos de CPU', + 'architecture' => 'Arquitectura', + 'kernel' => 'Kernel', + 'unknown' => 'Desconocido', + 'latest' => '(Última: :version)', + 'node_uuid' => 'UUID del node', + 'node_id' => 'ID del node', + + 'ip_address' => 'Dirección IP', + 'ip_help' => 'Normalmente la IP pública de su máquina a menos que esté redireccionando puertos.', + 'alias_help' => 'Nombre opcional para ayudarle a recordar cuáles son.', + 'refresh' => 'Recargar', + 'domain' => 'Nombre De Dominio', + 'ssl_ip' => 'No puede conectarse a una dirección IP a través de SSL', + 'error' => 'Este es el nombre de dominio que apunta a la dirección IP de tu node. Si ya has configurado esto, ¡puedes verificarlo seleccionando el siguiente campo!', + 'fqdn_help' => 'Tu panel está actualmente protegido con un certificado SSL, y eso significa que tus nodes también necesitan uno. Debes usar un nombre de dominio, porque no se pueden obtener certificados SSL para direcciones IP.', + 'dns' => 'Verificación de registros DNS', + 'dns_help' => 'Esto le permite saber si su registro DNS apunta a la dirección IP correcta.', + 'valid' => 'Válido', + 'invalid' => 'No válido', + 'port' => 'Puerto', + 'ports' => 'Puertos', + 'port_help' => 'Si está ejecutando el daemon detrás de Cloudflare debe establecer el puerto daemon a 8443 para permitir el proxy websocket sobre SSL.', + 'connect_port' => 'Puerto de Conexión', + 'connect_port_help' => 'Las conexiones a las wings usarán este puerto. Si estás usando un proxy inverso, esto puede diferir del puerto de escucha. Al usar el proxy de Cloudflare debes usar 8443.', + 'listen_port' => 'Puerto de escucha', + 'listen_port_help' => 'Las wings escucharán en este puerto.', + 'display_name' => 'Nombre a mostrar', + 'ssl' => 'Comunicación sobre SSL', + 'panel_on_ssl' => 'Tu Panel está usando una conexión SSL segura,
así que tu demonio también debe hacerlo.', + 'ssl_help' => 'Una dirección IP no puede usar SSL.', + + 'tags' => 'Etiquetas', + 'upload_limit' => 'Límite de subida', + 'upload_limit_help' => 'Introduzca el tamaño máximo de los archivos que se pueden subir a través del gestor de archivos basado en la web.', + 'sftp_port' => 'Puerto SFTP', + 'sftp_alias' => 'Alias de SFTP', + 'sftp_alias_help' => 'Mostrar alias para la dirección SFTP. Dejar vacío para usar el FQDN del nodo.', + 'use_for_deploy' => '¿Usar para Despliegues?', + 'maintenance_mode' => 'Modo de mantenimiento', + 'maintenance_mode_help' => 'Si el nodo está marcado como \'Bajo Mantenimiento\', los usuarios no podrán acceder a servidores que estén en ese nodo', + + 'cpu' => 'CPU', + 'cpu_limit' => 'Límite de CPU', + 'memory' => 'Memoria RAM', + 'memory_limit' => 'Límite de memoria RAM', + 'disk' => 'Almacenamiento', + 'disk_limit' => 'Límite de almacenamiento', + 'unlimited' => 'Ilimitado', + 'limited' => 'Limitado', + 'overallocate' => 'Sobreasignar', + 'enabled' => 'Enabled', + 'disabled' => 'Desactivado', + 'yes' => 'Sí', + 'no' => 'No', + + 'instructions' => 'Instrucciones', + 'instructions_help' => 'Guarda este archivo en el directorio raíz de tu demonio, llamado config.yml', + + 'auto_deploy' => 'Comando de autodespliegue', + 'auto_question' => 'Elija entre la instalación independiente o la instalación de Docker.', + 'auto_label' => 'Tipo', + 'standalone' => 'Independiente', + 'docker' => 'Docker', + 'auto_command' => 'Para autoconfigurar tu nodo ejecuta el siguiente comando:', + 'reset_token' => 'Restablecer token de autorización', + 'token_reset' => 'El token del demonio ha sido restablecido.', + 'reset_help' => 'Restablecer el token demonio anulará cualquier solicitud que venga del token antiguo. Este token se utiliza para todas las operaciones sensibles en el demonio incluyendo la creación y eliminación del servidor. Sugerimos cambiar este token regularmente por seguridad.', + + 'no_nodes' => 'No hay nodos', + 'none' => 'Ninguno', + 'cpu_chart' => 'CPU - :cpu% de :max%', + 'memory_chart' => 'Memoria RAM - :used de :total', + 'disk_chart' => 'Almacenamiento - :used de :total', + 'used' => 'En uso', + 'unused' => 'Libre', + + 'next_step' => 'Siguiente paso', + 'node_has_servers' => 'El nodo tiene servidores', + 'create_allocation' => 'Crear Asignación', + 'primary_allocation' => 'Asignación principal', + 'databases' => 'Bases de Datos', + 'backups' => 'Copias de seguridad', + + 'error_connecting' => 'Error al conectar al nodo', + 'error_connecting_description' => 'La configuración no se pudo actualizar automáticamente en Wings, tendrás que actualizar manualmente el archivo de configuración.', + 'allocation' => 'Asignación', + + 'diagnostics' => [ + 'header' => 'Diagnósticos de Node', + 'include_endpoints' => 'Incluir Endpoints', + 'include_endpoints_hint' => 'Incluir los endpoints mostrará las URL del panel en los registros y no las ocultará.', + 'include_logs' => 'Incluir Registros', + 'include_logs_hint' => 'Al incluir los registros se mostrarán los registros recientes y se ayudará a localizar posibles problemas.', + 'run_diagnostics' => 'Ejecutar diagnósticos', + 'upload_to_pelican' => 'Subir registros', + 'logs_pulled' => '¡Registros extraídos!', + 'logs_uploaded' => 'Registros Cargados', + 'upload_failed' => 'Carga de registros fallida', + 'view_logs' => 'Ver Registros', + 'pull' => 'Extraer', + 'upload' => 'Subir', + 'clear' => 'Limpiar', + '404' => 'No se pudo encontrar el informe de diagnóstico solicitado. Asegúrate de que Wings esté actualizado e inténtalo de nuevo.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Problema de Cloudflare', + 'body' => 'Tu nodo no es accesible vía Cloudflare', + ], + + 'bulk_update_ip' => 'Actualizar IPs', + 'bulk_update_ip_description' => 'Reemplazar una dirección IP antigua con una nueva para las asignaciones. Esto es útil cuando la dirección IP de un node cambia', + 'update_ip' => 'Actualizar IP', + 'old_ip' => 'Dirección IP Antigua', + 'new_ip' => 'Dirección IP Nueva', + 'no_allocations_to_update' => 'No se encontraron asignaciones con la dirección IP antigua seleccionada', + 'ip_updated' => 'Se actualizaron correctamente :count de :total asignación(es)', + 'ip_update_failed' => 'No se pudieron actualizar :count asignación(es)', ]; diff --git a/lang/es/admin/role.php b/lang/es/admin/role.php new file mode 100644 index 0000000000..da10ef4eb4 --- /dev/null +++ b/lang/es/admin/role.php @@ -0,0 +1,17 @@ + 'Roles', + 'model_label' => 'Rol', + 'model_label_plural' => 'Roles', + 'no_roles' => 'No hay roles', + 'name' => 'Nombre del rol', + 'permissions' => 'Permisos', + 'in_use' => 'En uso', + 'all' => 'Todos', + 'root_admin' => 'El rol :role tiene todos los permisos', + 'root_admin_delete' => 'No se puede eliminar el Administrador raíz', + 'users' => 'Usuarios', + 'nodes' => 'Nodos', + 'nodes_hint' => 'Dejar vacío para permitir el acceso a todos los nodos', +]; diff --git a/lang/es/admin/server.php b/lang/es/admin/server.php index 38af8b29c4..241c18b584 100644 --- a/lang/es/admin/server.php +++ b/lang/es/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Estás intentando eliminar la asignación predeterminada para este servidor pero no hay una asignación de respaldo para usar.', - 'marked_as_failed' => 'Este servidor fue marcado como que ha fallado en una instalación anterior. El estado actual no se puede cambiar en este estado.', - 'bad_variable' => 'Hubo un error de validación con la variable :name.', - 'daemon_exception' => 'Hubo una excepción al intentar comunicarse con el daemon que resultó en un código de respuesta HTTP/:code. Esta excepción ha sido registrada. (ID de solicitud: :request_id)', - 'default_allocation_not_found' => 'La asignación predeterminada solicitada no se encontró en las asignaciones de este servidor.', + 'nav_title' => 'Servidores', + 'model_label' => 'Servidor', + 'model_label_plural' => 'Servidores', + 'no_servers' => 'No hay servidores', + 'create' => 'Crear servidor', + 'next_step' => 'Siguiente Paso', + 'ip_address' => 'Dirección IP', + 'ip_address_helper' => 'Normalmente la IP pública de su máquina a menos que esté redireccionando puertos.', + 'port' => 'Puerto', + 'ports' => 'Puertos', + 'alias' => 'Alias', + 'alias_helper' => 'Nombre opcional para ayudarle a recordar cuáles son.', + 'locked' => '¿Bloqueado?', + 'locked_helper' => 'Los usuarios no podrán eliminar las asignaciones bloqueadas', + 'lock' => 'Bloquear', + 'unlock' => 'Desbloquear', + 'name' => 'Nombre', + 'external_id' => 'ID Externa', + 'owner' => 'Propietario', + 'description' => 'Descripción', + 'install_script' => '¿Ejecutar script de instalación?', + 'start_after' => '¿Iniciar después de instalar?', + 'yes' => 'Sí', + 'no' => 'No', + 'skip' => 'Omitir', + 'primary' => 'Principal', + 'already_primary' => 'Ya es primario', + 'make_primary' => 'Convertir en prinicipal', + 'startup_cmd' => 'Comando de arranque', + 'startup_name' => 'Nombre de inicio', + 'default_startup' => 'Comando de arranque por defecto', + 'startup_placeholder' => 'Introduzca un comando de inicio personalizado', + 'variables' => 'Variables', + 'resource_limits' => 'Límtes del recurso', + 'cpu' => 'CPU', + 'cpu_limit' => 'Límite de CPU', + 'cpu_helper' => '100% equivale a un núcleo de CPU.', + 'unlimited' => 'Sin límite', + 'limited' => 'Limitado', + 'enabled' => 'Activado', + 'disabled' => 'Desactivado', + 'memory' => 'Memoria RAM', + 'memory_limit' => 'Límite de memoria RAM', + 'memory_helper' => 'Las wings añadirán una sobrecarga a este valor al crear el contenedor para asegurarse de que no se quede sin recursos al usar la memoria máxima.', + 'disk' => 'Espacio en disco', + 'disk_limit' => 'Límite de espacio de disco', + 'advanced_limits' => 'Límites avanzados', + 'cpu_pin' => 'Fijar nucleo de CPU', + 'threads' => 'Hilos fijados', + 'pin_help' => 'Añadir hilo fijado, por ejemplo, 0 o 2-4', + 'swap' => 'Memoria SWAP', + 'swap_limit' => 'Límite de memoria SWAP', + 'oom' => 'Finalizador OOM (memoria llena)', + 'feature_limits' => 'Límites de funcionalidad', + 'docker_settings' => 'Ajustes de Docker', + 'docker_image' => 'Imagen de Docker', + 'image_name' => 'Nombre de la imagen', + 'primary_allocation' => 'Asignación principal', + 'image' => 'Imágen', + 'image_placeholder' => 'Introduce una imagen personalizada', + 'container_labels' => 'Etiquetas de contenedor', + 'title' => 'Título', + 'actions' => 'Acciones', + 'console' => 'Consola', + 'suspend' => 'Bloquear', + 'unsuspend' => 'Desbloquear', + 'reinstall' => 'Reinstalar', + 'reinstall_help' => 'Esto reinstalará el servidor con el script de instalación del huevo asignado.', + 'reinstall_modal_heading' => '¿Estás seguro de que quieres reinstalar este server?', + 'reinstall_modal_description' => '!! Esto puede resultar en una pérdida de datos irrecuperable !!', + 'server_status' => 'Estado del servidor', + 'view_install_log' => 'Ver registro de instalación', + 'uuid' => 'UUID', + 'node' => 'Node', + 'short_uuid' => 'UUID corta', + 'toggle_install' => 'Cambiar el estado de instalación', + 'toggle_install_help' => 'Si necesita cambiar el estado de instalación de desinstalado a instalado, o viceversa, puede hacerlo con este botón.', + 'toggle_install_failed_header' => 'El servidor está en estado fallido', + 'toggle_install_failed_desc' => '¿Quieres reinstalar el servidor para arreglarlo?', + 'transfer' => 'Transferir', + 'transfer_help' => 'Transferir este servidor a otro nodo conectado a este panel.
¡Advertencia! Esta función sigue siendo experimental. ¡Considere hacer una copia de seguridad manualmente primero para evitar la pérdida de datos!', + 'condition' => 'Condición', + 'suspend_all' => 'Bloquear todos los servidores', + 'unsuspend_all' => 'Desbloquear todos los servidores', + 'select_allocation' => 'Seleccionar asignación', + 'new_allocation' => 'Crear nueva asignación', + 'additional_allocations' => 'Asignaciones adicionales', + 'select_additional' => 'Seleccione asignaciones adicionales', + 'no_variables' => '¡El egg seleccionado no tiene variables!', + 'select_egg' => '¡Selecciona un egg primero para mostrar sus variables!', + 'allocations' => 'Asignaciones', + 'databases' => 'Bases de Datos', + 'no_databases' => 'No existen bases de datos para este servidor', + 'delete_db' => '¿Estás seguro de que quieres eliminar', + 'delete_db_heading' => 'Borrar base de datos', + 'backups' => 'Copias de seguridad', + 'egg' => 'Egg', + 'mounts' => 'Volumenes', + 'no_mounts' => 'No existen volúmenes para este node', + 'create_database' => 'Crear Base de Datos', + 'no_db_hosts' => 'No hay hosts de base de datos', + 'failed_to_create' => 'Error al crear la base de datos', + 'change_egg' => 'Cambiar Egg', + 'new_egg' => 'Nuevo Egg', + 'keep_old_variables' => '¿Mantener variables antiguas si es posible?', + 'create_allocation' => 'Crear Asignación', + 'add_allocation' => 'Añadir asignación', + 'view' => 'Vista', + 'no_log' => 'No hay registros disponibles', + 'tabs' => [ + 'information' => 'Información', + 'egg_configuration' => 'Configuración del egg', + 'environment_configuration' => 'Configuración del entorno', ], - 'alerts' => [ - 'startup_changed' => 'La configuración de inicio de este servidor se ha actualizado. Si se cambió el huevo de este servidor, se iniciará una reinstalación ahora.', - 'server_deleted' => 'El servidor se ha eliminado correctamente del sistema.', - 'server_created' => 'El servidor se ha creado correctamente en el panel. Por favor, permite al daemon unos minutos para instalar completamente este servidor.', - 'build_updated' => 'Los detalles de construcción para este servidor se han actualizado. Algunos cambios pueden requerir un reinicio para surtir efecto.', - 'suspension_toggled' => 'El estado de suspensión del servidor se ha cambiado a :status.', - 'rebuild_on_boot' => 'Este servidor se ha marcado como que requiere una reconstrucción del contenedor Docker. Esto ocurrirá la próxima vez que se inicie el servidor.', - 'install_toggled' => 'El estado de instalación para este servidor se ha cambiado.', - 'server_reinstalled' => 'Este servidor ha sido encolado para una reinstalación que comienza ahora.', - 'details_updated' => 'Los detalles del servidor se han actualizado correctamente.', - 'docker_image_updated' => 'Se cambió con éxito la imagen Docker predeterminada para usar en este servidor. Se requiere un reinicio para aplicar este cambio.', - 'node_required' => 'Debes tener al menos un nodo configurado antes de poder añadir un servidor a este panel.', - 'transfer_nodes_required' => 'Debes tener al menos dos nodos configurados antes de poder transferir servidores.', - 'transfer_started' => 'La transferencia del servidor se ha iniciado.', - 'transfer_not_viable' => 'El nodo que seleccionaste no tiene el espacio en disco o la memoria disponible requerida para acomodar este servidor.', + 'notifications' => [ + 'server_suspension' => 'Suspensión del servidor', + 'server_suspended' => 'El servidor ha sido suspendido', + 'server_already_suspended' => '¡El servidor ya ha sido suspendido!', + 'server_suspend_help' => 'Esto suspenderá el servidor, detendrá cualquier proceso en ejecución, y bloqueará inmediatamente que el usuario pueda acceder a sus archivos o administrar el servidor a través del panel o API.', + 'server_unsuspend_help' => 'Esto anulará la suspensión del servidor y restaurará el acceso normal del usuario.', + 'server_unsuspended' => 'La suspensión del servidor ha sido anulada.', + 'error_server_delete' => 'El servidor no pudo ser eliminado de forma segura.', + 'error_server_delete_body' => 'Puede forzar eliminarlo.', + 'create_failed' => 'No se pudo crear el servidor', + 'invalid_port_range' => 'Rango de puertos no válido', + 'invalid_port_range_body' => 'Su rango de puertos no son válidos: :port', + 'too_many_ports' => '¡Demasiados puertos a la vez!', + 'too_many_ports_body' => 'El límite actual es :limit número de puertos a la vez.', + 'invalid_port' => 'Puerto no válido', + 'invalid_port_body' => ':i no está en el rango de puertos válido entre :portFloor-:portCeil', + 'already_exists' => 'El puerto ya está en uso', + 'already_exists_body' => ':i ya está asignado', + 'error_connecting' => 'Error al conectarse a :node', + 'error_connecting_description' => 'La configuración no se pudo actualizar automáticamente en las Wings, tendrás que actualizar manualmente el archivo de configuración.', + 'install_toggled' => 'Estado de instalación cambiado', + 'install_toggle_failed' => 'No se pudo cambiar el estado de instalación', + 'reinstall_started' => 'Reinstalación iniciada', + 'reinstall_failed' => 'No se pudo iniciar la reinstalación', + 'log_failed' => 'No se pudo conectar a las Wings para recuperar el registro de instalación del servidor.', + 'transfer_started' => 'Transferencia iniciada', + 'transfer_failed' => 'Transferencia fallida', + 'already_transfering' => 'El servidor está actualmente siendo transferido.', ], + 'notes' => 'Notas', + 'no_notes' => 'Sin Notas', + 'none' => 'Ninguno', ]; diff --git a/lang/es/admin/setting.php b/lang/es/admin/setting.php new file mode 100644 index 0000000000..9393d9d583 --- /dev/null +++ b/lang/es/admin/setting.php @@ -0,0 +1,157 @@ + 'Configuración', + 'save_success' => 'Configuración guardada', + 'save_failed' => 'Se produjo un error al guardar la configuración', + 'navigation' => [ + 'general' => 'General', + 'captcha' => 'Captcha', + 'mail' => 'Correo', + 'backup' => 'Copia de seguridad', + 'oauth' => 'OAuth', + 'misc' => 'Misceláneo', + ], + 'general' => [ + 'app_name' => 'Nombre de la aplicación', + 'app_logo' => 'Logo de la App', + 'app_logo_help' => 'El logotipo debe colocarse en la carpeta public ubicada en el directorio raíz del panel. Déjalo en blanco para usar el nombre de la aplicación en su lugar.', + 'app_favicon' => 'Icono de la aplicación', + 'app_favicon_help' => 'El favicon debe colocarse en la carpeta pública situada en el directorio raíz del panel.', + 'debug_mode' => 'Modo de depuración', + 'navigation' => 'Navegación', + 'default_navigation' => 'Tipo de navegación por defecto', + 'sidebar' => 'Barra Lateral', + 'topbar' => 'Barra superior', + 'mixed' => 'Mezclado', + 'unit_prefix' => 'Prefijo de unidad', + 'decimal_prefix' => 'Prefijo decimal (MB/GB)', + 'binary_prefix' => 'Prefijo binario (MiB/GiB)', + '2fa_requirement' => 'Requisito de 2FA', + 'not_required' => 'No requerido', + 'admins_only' => 'Requerido sólo para administradores', + 'all_users' => 'Requerido para todos los usuarios', + 'trusted_proxies' => 'Proxies de confianza', + 'trusted_proxies_help' => 'Nueva IP o rango IP', + 'clear' => 'Borrar', + 'set_to_cf' => 'Establecer Ips de cloudflare', + 'display_width' => 'Anchura de la pantalla', + 'avatar_provider' => 'Proveedor de Avatar', + 'uploadable_avatars' => '¿Permitir a los usuarios subir su propio avatar?', + ], + 'captcha' => [ + 'enable' => 'Activar', + 'disable' => 'Desactivar', + 'info_label' => 'Información', + 'info' => 'Puedes generar las claves en tu Panel de Cloudflare. Se requiere una cuenta de Cloudflare.', + 'site_key' => 'Clave del sitio', + 'secret_key' => 'Clave secreta', + 'verify' => '¿Verificar dominio?', + ], + 'mail' => [ + 'mail_driver' => 'Driver de Email', + 'test_mail' => 'Enviar correo de prueba', + 'test_mail_sent' => 'Correo de prueba enviado', + 'test_mail_failed' => 'Prueba de correo fallida', + 'from_settings' => 'Desde ajustes', + 'from_settings_help' => 'Establezca la dirección y el nombre utilizados como "De" en los correos.', + 'from_address' => 'Dirección de origen', + 'from_name' => 'Nombre del remitente', + 'smtp' => [ + 'smtp_title' => 'Configuración de SMTP', + 'host' => 'Host', + 'port' => 'Puerto', + 'username' => 'Nombre de usuario', + 'password' => 'Contraseña', + 'scheme' => 'Esquema', + ], + 'mailgun' => [ + 'mailgun_title' => 'Configuración de Mailgun', + 'domain' => 'Dominio', + 'secret' => 'Secreto', + 'endpoint' => 'Endpoint', + ], + ], + 'backup' => [ + 'backup_driver' => 'Controlador de copia de seguridad', + 'throttle' => 'Limite', + 'throttle_help' => 'Configurar cuántas copias de seguridad se pueden crear en un período. Establecer el período a 0 para desactivar este limite.', + 'limit' => 'Limite', + 'period' => 'Periodo', + 'seconds' => 'Segundos', + 's3' => [ + 's3_title' => 'Configuración de S3', + 'default_region' => 'Región por Defecto', + 'access_key' => 'Access Key ID', + 'secret_key' => 'Secret Access Key', + 'bucket' => 'Bucket', + 'endpoint' => 'Endpoint', + 'use_path_style_endpoint' => 'Usar endpoint como ruta', + ], + ], + 'oauth' => [ + 'enable' => 'Activar', + 'enable_schema' => 'Habilitar :schema', + 'disable' => 'Desactivar', + 'client_id' => 'ID del cliente', + 'client_secret' => 'Secreto de cliente', + 'redirect' => 'URL de redirección', + 'web_api_key' => 'Clave API Web', + 'base_url' => 'URL base', + 'display_name' => 'Nombre para mostrar', + 'auth_url' => 'URL de callback', + 'create_missing_users' => '¿Crear automáticamente usuarios faltantes?', + 'link_missing_users' => '¿Vincular automáticamente usuarios faltantes?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Creación automática de asignación', + 'helper' => 'Alternar si los usuarios pueden crear asignaciones a través del área del cliente.', + 'question' => '¿Permitir a los usuarios crear asignaciones?', + 'create_new' => '¿Crear nuevos puertos si no hay ninguno disponible?', + 'create_new_help' => 'Cuando está activado, crea nuevas asignaciones; cuando está desactivado, solo asigna a partir de asignaciones existentes sin usar, y ambas opciones tienen en cuenta el rango de puertos indicado a continuación.', + 'start' => 'Puerto Inicial', + 'end' => 'Puerto Final', + ], + 'mail_notifications' => [ + 'title' => 'Notificación por correo electrónico', + 'helper' => 'Cambiar qué notificaciones de correo deben ser enviadas a los usuarios.', + 'server_installed' => 'Servidor instalado', + 'server_reinstalled' => 'Servidor reinstalado', + ], + 'connections' => [ + 'title' => 'Conexiones', + 'helper' => 'Tiempo de espera usado al hacer solicitudes.', + 'request_timeout' => 'Tiempo de espera de la solicitud', + 'connection_timeout' => 'Tiempo de espera agotado', + 'seconds' => 'Segundos', + ], + 'activity_log' => [ + 'title' => 'Registros de Actividad', + 'helper' => 'Configura la frecuencia con la que los registros de actividad antiguos deben ser eliminados y si las actividades de administración deben ser registradas.', + 'prune_age' => 'Edad de limpia', + 'days' => 'Días', + 'log_admin' => '¿Ocultar actividades de administrador?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Define el límite para el número de solicitudes por minuto que pueden ser ejecutadas.', + 'client_rate' => 'Límite de la API del cliente', + 'app_rate' => 'Límite de la APi de la aplicación', + 'rpm' => 'Peticiones por minuto', + ], + 'server' => [ + 'title' => 'Servidores', + 'helper' => 'Configuración para servidores', + 'edit_server_desc' => '¿Permitir a los usuarios editar descripciones?', + 'console_font_upload' => 'Subir fuente de consola', + 'console_font_hint' => 'Solo se admiten las fuentes *.ttf ¡Se recomiendan las fuentes Mono!', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => 'Configurar la frecuencia con la que los registros antiguos de webhook deben ser eliminados.', + 'prune_age' => 'Edad de limpia', + 'days' => 'Días', + ], + ], +]; diff --git a/lang/es/admin/user.php b/lang/es/admin/user.php deleted file mode 100644 index ab4373270b..0000000000 --- a/lang/es/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'No se puede eliminar un usuario con servidores activos asociados a su cuenta. Por favor, elimina sus servidores antes de continuar.', - 'user_is_self' => 'No se puede eliminar tu propia cuenta de usuario.', - ], - 'notices' => [ - 'account_created' => 'La cuenta se ha creado correctamente.', - 'account_updated' => 'La cuenta se ha actualizado correctamente.', - ], -]; diff --git a/lang/es/admin/webhook.php b/lang/es/admin/webhook.php new file mode 100644 index 0000000000..b0bc67f250 --- /dev/null +++ b/lang/es/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Endpoint', + 'description' => 'Descripción', + 'no_webhooks' => 'Sin Webhooks', + 'help' => 'Ayuda', + 'help_text' => 'Debes encerrar el nombre de la variable entre {{ }}, por ejemplo, si quieres obtener el nombre desde la API, puedes usar {{name}}.', + 'test_now' => 'Probar ahora', + 'test_now_help' => 'Esto disparará un evento `created: Server`.', + 'table' => [ + 'description' => 'Descripción', + 'endpoint' => 'Endpoint', + ], + 'headers' => 'Encabezados', + 'events' => 'Eventos', + 'regular' => 'Regular', + 'reset_headers' => 'Restablecer cabeceras', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Perfil', + 'message' => 'Mensaje', + 'username' => 'Nombre de usuario', + 'avatar_url' => 'URL del avatar', + 'forum_thread' => 'Nombre del hilo del foro', + 'supress_embeds' => 'Suprimir Embeds', + 'supress_embeds_text' => 'No incluyas ningún embed al serializar este mensaje', + 'supress_notifications' => 'Suprimir notificaciones', + 'supress_notifications_text' => 'Este mensaje no activará notificaciones push y de escritorio', + ], + 'discord_embed' => [ + 'add_embed' => 'Añadir Embed', + 'flags' => 'Banderas', + 'thumbnail' => 'URL de la Miniatura', + 'embeds' => 'Embeds', + 'thread_name' => 'Nombre del hilo del foro', + 'allowed_mentions' => 'Menciones permitidas', + 'roles' => 'Roles', + 'users' => 'usuarios', + 'everyone' => '@everyone & @here', + 'author' => 'Autor', + 'author_url' => 'URL del Autor', + 'author_icon_url' => 'URL del icono del autor', + 'body' => 'Contenido', + 'title' => 'Título', + 'color' => 'Color del Embed', + 'url' => 'URL', + 'images' => 'Imágenes', + 'image_url' => 'URL de la imágen', + 'image_thumbnail' => 'URL de la Miniatura', + 'footer' => 'Pie de página', + 'has_timestamp' => 'Tiene fecha y hora', + 'footer_icon_url' => 'URL del icono de pie de página', + 'add_field' => 'Añadir campo', + 'fields' => 'Campos', + 'field_name' => 'Nombre del Campo', + 'field_value' => 'Valor del Campo', + 'inline_field' => 'Campo en línea', + ], +]; diff --git a/lang/es/auth.php b/lang/es/auth.php index a3c86efb41..8f4d616917 100644 --- a/lang/es/auth.php +++ b/lang/es/auth.php @@ -1,27 +1,24 @@ 'Iniciar sesión', - 'go_to_login' => 'Ir al inicio de sesión', - 'failed' => 'No se pudo encontrar ninguna cuenta que coincida con esas credenciales.', - 'forgot_password' => [ - 'label' => '¿Olvidaste tu contraseña?', - 'label_help' => 'Ingresa la dirección de correo electrónico de tu cuenta para recibir instrucciones sobre cómo restablecer tu contraseña.', - 'button' => 'Recuperar cuenta', - ], - - 'reset_password' => [ - 'button' => 'Restablecer e iniciar sesión', - ], - - 'two_factor' => [ - 'label' => 'Token de 2 Factores', - 'label_help' => 'Esta cuenta requiere un segundo nivel de autenticación para continuar. Por favor, ingresa el código generado por tu dispositivo para completar este inicio de sesión.', - 'checkpoint_failed' => 'El token de autenticación de dos factores no era válido.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'Estas credenciales no coinciden con nuestros registros.', + 'failed-two-factor' => 'Código 2FA incorrecto', + 'two-factor-code' => 'Código de verificación en dos pasos', + 'two-factor-hint' => 'Puedes usar los códigos de respaldo si perdiste el acceso a tu dispositivo.', + 'password' => 'La contraseña ingresada es incorrecta.', 'throttle' => 'Demasiados intentos de inicio de sesión. Por favor, inténtalo de nuevo en :seconds segundos.', - 'password_requirements' => 'La contraseña debe tener al menos 8 caracteres de longitud y debe ser única para este sitio.', - '2fa_must_be_enabled' => 'El administrador ha requerido que la Autenticación de 2 Factores esté habilitada para tu cuenta para poder usar el Panel.', + '2fa_must_be_enabled' => 'El administrador ha requerido que la autenticación de 2 factores esté habilitada para su cuenta para poder utilizar el Panel.', + ]; diff --git a/lang/es/command/messages.php b/lang/es/command/messages.php index 1723749c29..3507a6bf08 100644 --- a/lang/es/command/messages.php +++ b/lang/es/command/messages.php @@ -7,23 +7,18 @@ 'deleted' => 'Usuario eliminado correctamente del Panel.', 'confirm_delete' => '¿Estás seguro de que quieres eliminar este usuario del Panel?', 'no_users_found' => 'No se encontraron usuarios para el término de búsqueda proporcionado.', - 'multiple_found' => 'Se encontraron varias cuentas para el usuario proporcionado, no se puede eliminar un usuario debido a la bandera --no-interaction.', + 'multiple_found' => 'Se encontraron varias cuentas para el usuario proporcionado, no se puede eliminar un usuario debido a la opción --no-interaction.', 'ask_admin' => '¿Es este usuario un administrador?', 'ask_email' => 'Dirección de correo electrónico', 'ask_username' => 'Nombre de usuario', - 'ask_name_first' => 'Nombre', - 'ask_name_last' => 'Apellido', 'ask_password' => 'Contraseña', - 'ask_password_tip' => 'Si deseas crear una cuenta con una contraseña aleatoria enviada por correo electrónico al usuario, vuelve a ejecutar este comando (CTRL+C) y pasa la bandera `--no-password`.', + 'ask_password_tip' => 'Si deseas crear una cuenta con una contraseña aleatoria enviada por correo al usuario, vuelve a ejecutar este comando (CTRL+C) y agrega la opción --no-password.', 'ask_password_help' => 'Las contraseñas deben tener al menos 8 caracteres de longitud y contener al menos una letra mayúscula y un número.', - '2fa_help_text' => [ - 'Este comando deshabilitará la autenticación de dos factores para la cuenta de un usuario si está habilitada. Esto solo debe usarse como un comando de recuperación de cuenta si el usuario está bloqueado fuera de su cuenta.', - 'Si esto no es lo que querías hacer, presiona CTRL+C para salir de este proceso.', - ], + '2fa_help_text' => 'Este comando deshabilitará la autenticación de doble factor para la cuenta de un usuario si está activado. Esto solo debería usarse como un comando de recuperación de cuenta si el usuario está bloqueado fuera de su cuenta. Si esto no es lo que querías hacer, pulsa CTRL+C para salir de este proceso.', '2fa_disabled' => 'La autenticación de dos factores ha sido desactivada para :email.', ], 'schedule' => [ - 'output_line' => 'Enviando trabajo para la primera tarea en `:schedule` (:hash).', + 'output_line' => 'Enviando acción para la primera tarea en `:schedule` (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'Eliminando archivo de copia de seguridad del servicio :file.', @@ -32,11 +27,11 @@ 'rebuild_failed' => 'La solicitud de reconstrucción para ":name" (#:id) en el nodo ":node" falló con el error: :message', 'reinstall' => [ 'failed' => 'La solicitud de reinstalación para ":name" (#:id) en el nodo ":node" falló con el error: :message', - 'confirm' => 'Estás a punto de reinstalar contra un grupo de servidores. ¿Deseas continuar?', + 'confirm' => 'Estás a punto de reinstalar un grupo de servidores. ¿Deseas continuar?', ], 'power' => [ - 'confirm' => 'Estás a punto de realizar una :action contra :count servidores. ¿Deseas continuar?', - 'action_failed' => 'La acción de energía para ":name" (#:id) en el nodo ":node" falló con el error: :message', + 'confirm' => 'Estás a punto de realizar una :action en :count servidores. ¿Deseas continuar?', + 'action_failed' => 'La acción para ":name" (#:id) en el nodo ":node" falló con el error: :message', ], ], 'environment' => [ @@ -46,14 +41,14 @@ 'ask_smtp_username' => 'Nombre de usuario SMTP', 'ask_smtp_password' => 'Contraseña SMTP', 'ask_mailgun_domain' => 'Dominio de Mailgun', - 'ask_mailgun_endpoint' => 'Extremo de Mailgun', + 'ask_mailgun_endpoint' => 'Mailgun endpoint', 'ask_mailgun_secret' => 'Secreto de Mailgun', 'ask_mandrill_secret' => 'Secreto de Mandrill', 'ask_postmark_username' => 'Clave API de Postmark', 'ask_driver' => '¿Qué controlador debe usarse para enviar correos electrónicos?', - 'ask_mail_from' => 'Dirección de correo electrónico desde la cual deben originarse los correos electrónicos', + 'ask_mail_from' => 'Dirección de correo electrónico desde la cual deben enviarse los correos electrónicos', 'ask_mail_name' => 'Nombre que debe aparecer en los correos electrónicos', - 'ask_encryption' => 'Método de cifrado a utilizar', + 'ask_encryption' => 'Método de cifrado a usar', ], ], ]; diff --git a/lang/es/commands.php b/lang/es/commands.php new file mode 100644 index 0000000000..1419e960d6 --- /dev/null +++ b/lang/es/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Indique la dirección de correo electrónico desde la cual deberían enviarse los huevos exportados por este Panel. Debe ser una dirección de email válida.', + 'url' => 'La URL de la aplicación DEBE comenzar con https:// o http:// dependiendo de si estás utilizando SSL o no. Si no incluyes el esquema, tus correos electrónicos y otros contenidos se vincularán al lugar incorrecto.', + 'timezone' => 'La zona horaria debe coincidir con una de las zonas horarias soportadas por PHP\\. Si no estás seguro, por favor consulta https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Has seleccionado el controlador Redis para una o más opciones, por favor proporciona información de conexión válida a continuación. En la mayoría de los casos, puedes utilizar los valores predeterminados proporcionados a menos que hayas modificado tu configuración.', + 'comment' => 'Por defecto, una instancia de servidor Redis no tiene contraseña, ya que se ejecuta localmente y es inaccesible desde el exterior. Si este es el caso, simplemente presiona Enter sin ingresar algún valor.', + 'confirm' => 'Parece que un campo :field ya está definido para Redis, ¿quieres cambiarlo?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Se recomienda encarecidamente no utilizar "localhost" como el hospedaje de tu base de datos, ya que hemos observado problemas frecuentes de conexión de socket. Si deseas utilizar una conexión local, deberías estar utilizando "127.0.0.1".', + 'DB_USERNAME_note' => 'El uso de la cuenta "root", o raíz, para conexiones MySQL no sólo está muy mal visto, sino que además no está permitido por esta aplicación. Necesitarás haber creado un usuario MySQL para este software.', + 'DB_PASSWORD_note' => 'Parece que ya tienes definida una contraseña de conexión MySQL, ¿te gustaría cambiarla?', + 'DB_error_2' => 'Tus credenciales de conexión NO han sido guardadas. Necesitarás proporcionar información de conexión válida antes de continuar.', + 'go_back' => 'Regresa e inténtalo de nuevo', + ], + 'make_node' => [ + 'name' => 'Introduce un identificador corto utilizado para distinguir este nodo de otros.', + 'description' => 'Introduce una descripción para identificar el nodo.', + 'scheme' => 'Por favor, ingresa https para SSL o http para una conexión sin SSL.', + 'fqdn' => 'Introduce un nombre de dominio (por ejemplo, nodo.ejemplo.com) que se utilizará para conectarse al daemon. Una dirección IP solo puede ser utilizada si no estás usando SSL para este nodo.', + 'public' => '¿Debería este nodo ser público? Como nota, al establecer un nodo como privado, estarás denegando la capacidad de desplegar automáticamente en este nodo.', + 'behind_proxy' => '¿Está tu FQDN detrás de un proxy?', + 'maintenance_mode' => '¿Debe activarse el modo de mantenimientos?', + 'memory' => 'Introduce la cantidad máxima de memoria', + 'memory_overallocate' => 'Introduce la cantidad de memoria para sobreasignar, -1 deshabilitará la verificación y 0 impedirá la creación de nuevos servidores.', + 'disk' => 'Introduce la cantidad máxima de espacio en disco', + 'disk_overallocate' => 'Introduce la cantidad de almacenamiento para sobreasignar, -1 deshabilitará la verificación y 0 impedirá la creación de nuevos servidores.', + 'cpu' => 'Introduce la cantidad máxima de cpu', + 'cpu_overallocate' => 'Introduce la cantidad de cpu para sobreasignar, -1 deshabilitará la verificación y 0 impedirá la creación de nuevos servidores.', + 'upload_size' => "'Introduce el tamaño máximo de archivo para cargar", + 'daemonListen' => 'Introduce el puerto de escucha del demonio', + 'daemonConnect' => 'Ingresa el puerto de conexión del servicio (puede ser el mismo que el puerto de escucha)', + 'daemonSFTP' => 'Introduce el puerto de escucha del demonio SFTP', + 'daemonSFTPAlias' => 'Introduzca el nombre del demonio SFTP(puede estar vacío)', + 'daemonBase' => 'Introduzca la carpeta raíz', + 'success' => 'Se ha creado correctamente un nuevo nodo con el nombre :name y tiene un id de :id', + ], + 'node_config' => [ + 'error_not_exist' => 'El nodo seleccionado no existe.', + 'error_invalid_format' => 'Formato especificado no válido. Las opciones válidas son yaml y json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Parece que ya has configurado una clave de cifrado de la aplicación. Continuar con este proceso sobrescribirá esa clave y causará corrupción de los datos para cualquier dato cifrado existente. NO CONTINÚES A MENOS QUE SEPAS LO QUE ESTÁS HACIENDO.', + 'understand' => 'Entiendo las consecuencias de realizar este comando y acepto toda la responsabilidad por la pérdida de datos cifrados.', + 'continue' => '¿Estás seguro de que deseas continuar? Cambiar la clave de cifrado de la aplicación CAUSARÁ PÉRDIDA DE DATOS.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'No hay tareas programadas para los servidores que necesiten ser ejecutadas.', + 'error_message' => 'Se encontró un error al procesar el Horario: ', + ], + ], +]; diff --git a/lang/es/dashboard/account.php b/lang/es/dashboard/account.php deleted file mode 100644 index efb4304036..0000000000 --- a/lang/es/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Actualizar tu correo electrónico', - 'updated' => 'Tu dirección de correo electrónico ha sido actualizada.', - ], - 'password' => [ - 'title' => 'Cambia tu contraseña', - 'requirements' => 'Tu nueva contraseña debe tener al menos 8 caracteres de longitud.', - 'updated' => 'Tu contraseña ha sido actualizada.', - ], - 'two_factor' => [ - 'button' => 'Configurar autenticación de 2 factores', - 'disabled' => 'La autenticación de dos factores ha sido desactivada en tu cuenta. Ya no se te pedirá que proporciones un token al iniciar sesión.', - 'enabled' => '¡La autenticación de dos factores ha sido activada en tu cuenta! A partir de ahora, al iniciar sesión, se te pedirá que proporciones el código generado por tu dispositivo.', - 'invalid' => 'El token proporcionado no era válido.', - 'setup' => [ - 'title' => 'Configurar autenticación de dos factores', - 'help' => '¿No puedes escanear el código? Ingresa el código a continuación en tu aplicación:', - 'field' => 'Introduce el token', - ], - 'disable' => [ - 'title' => 'Desactivar autenticación de dos factores', - 'field' => 'Introduce el token', - ], - ], -]; diff --git a/lang/es/dashboard/index.php b/lang/es/dashboard/index.php deleted file mode 100644 index ccbdd18f2e..0000000000 --- a/lang/es/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Buscar servidores...', - 'no_matches' => 'No se encontraron servidores que coincidan con los criterios de búsqueda proporcionados.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memoria', -]; diff --git a/lang/es/exceptions.php b/lang/es/exceptions.php index 19a6b31276..ec97851bf3 100644 --- a/lang/es/exceptions.php +++ b/lang/es/exceptions.php @@ -4,22 +4,23 @@ 'daemon_connection_failed' => 'Se produjo una excepción al intentar comunicarse con el daemon, lo que resultó en un código de respuesta HTTP/:code. Esta excepción ha sido registrada.', 'node' => [ 'servers_attached' => 'Un nodo no debe tener servidores vinculados a él para poder ser eliminado.', - 'daemon_off_config_updated' => 'La configuración del daemon se ha actualizado, sin embargo, se encontró un error al intentar actualizar automáticamente el archivo de configuración en el daemon. Deberás actualizar manualmente el archivo de configuración (config.yml) para que el daemon aplique estos cambios.', + 'error_connecting' => 'Error al conectarse a :node', + 'daemon_off_config_updated' => 'La configuración del daemon se ha actualizado, sin embargo, se encontró un error al intentar actualizar automáticamente el archivo de configuración en el daemon. Deberás actualizar manualmente el archivo de configuración (config.yml) para que el demonio aplique estos cambios.', ], 'allocations' => [ - 'server_using' => 'Actualmente hay un servidor asignado a esta asignación. Una asignación solo puede ser eliminada si ningún servidor está asignado actualmente.', + 'server_using' => 'Actualmente hay un servidor utilizando esta asignación. Una asignación solo puede ser eliminada si ningún servidor está utilizándola actualmente.', 'too_many_ports' => 'Agregar más de 1000 puertos en un solo rango a la vez no está soportado.', - 'invalid_mapping' => 'El mapeo proporcionado para el puerto :port era inválido y no pudo ser procesado.', + 'invalid_mapping' => 'El mapeo proporcionado para el puerto :port no era válido y no pudo ser procesado.', 'cidr_out_of_range' => 'La notación CIDR solo permite máscaras entre /25 y /32.', - 'port_out_of_range' => 'Los puertos en una asignación deben ser mayores que 1024 y menores o iguales a 65535.', + 'port_out_of_range' => 'Los puertos en una asignación deben ser mayores o iguales que 1024 y menores o iguales a 65535.', ], 'egg' => [ - 'delete_has_servers' => 'Un Egg con servidores activos vinculados a él no puede ser eliminado del Panel.', - 'invalid_copy_id' => 'El Egg seleccionado para copiar un script desde no existe o está copiando un script en sí mismo.', - 'has_children' => 'Este Egg es padre de uno o más otros Eggs. Por favor, elimina esos Eggs antes de eliminar este Egg.', + 'delete_has_servers' => 'Un Huevo con servidores activos vinculados a él no puede ser eliminado del Panel.', + 'invalid_copy_id' => 'El Huevo seleccionado para copiar un script no existe o está copiando un script en sí mismo.', + 'has_children' => 'Este Huevo es parte de uno o más Huevos. Por favor, elimina esos Huevos antes de eliminar este Huevo.', ], 'variables' => [ - 'env_not_unique' => 'La variable de entorno :name debe ser única para este Egg.', + 'env_not_unique' => 'La variable de entorno :name debe ser única para este Huevo.', 'reserved_name' => 'La variable de entorno :name está protegida y no se puede asignar a una variable.', 'bad_validation_rule' => 'La regla de validación ":rule" no es una regla válida para esta aplicación.', ], @@ -43,6 +44,8 @@ 'has_nodes' => 'No se puede eliminar una ubicación que tiene nodos activos vinculados a ella.', ], 'users' => [ + 'is_self' => 'No se puede eliminar tu propia cuenta de usuario.', + 'has_servers' => 'No se puede eliminar un usuario con servidores activos asociados a su cuenta. Por favor, elimina sus servidores antes de continuar.', 'node_revocation_failed' => 'Error al revocar las claves en Nodo #:node. :error', ], 'deployment' => [ @@ -52,4 +55,10 @@ 'api' => [ 'resource_not_found' => 'El recurso solicitado no existe en este servidor.', ], + 'mount' => [ + 'servers_attached' => 'Un volumen no debe tener servidores vinculados a él para poder ser eliminado.', + ], + 'server' => [ + 'marked_as_failed' => 'Este servidor aún no ha completado el proceso de instalación, por favor inténtalo de nuevo más tarde.', + ], ]; diff --git a/lang/es/notifications.php b/lang/es/notifications.php new file mode 100644 index 0000000000..925cdbb314 --- /dev/null +++ b/lang/es/notifications.php @@ -0,0 +1,18 @@ + 'Abrir servidor', + 'installation_completed' => 'Instalación del servidor completada', + 'installation_failed' => 'Instalación del servidor fallida', + 'reinstallation_completed' => 'Reinstalación del servidor completada', + 'reinstallation_failed' => 'Reinstalación del servidor fallida', + 'failed' => 'Fallido', + 'user_added' => [ + 'title' => 'Añadido al servidor', + 'body' => 'Has sido añadido como un sub usuario a :server.', + ], + 'user_removed' => [ + 'title' => 'Eliminado del servidor', + 'body' => 'Has sido eliminado como un subusuario de :server.', + ], +]; diff --git a/lang/es/pagination.php b/lang/es/pagination.php deleted file mode 100644 index 51862f2eb2..0000000000 --- a/lang/es/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Anterior', - 'next' => 'Siguiente »', -]; diff --git a/lang/es/passwords.php b/lang/es/passwords.php deleted file mode 100644 index 1f0855205d..0000000000 --- a/lang/es/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Las contraseñas deben tener al menos seis caracteres y coincidir con la confirmación.', - 'reset' => '¡Tu contraseña ha sido restablecida!', - 'sent' => '¡Hemos enviado por correo electrónico el enlace para restablecer tu contraseña!', - 'token' => 'Este token de restablecimiento de contraseña no es válido.', - 'user' => 'No podemos encontrar un usuario con esa dirección de correo electrónico.', -]; diff --git a/lang/es/profile.php b/lang/es/profile.php new file mode 100644 index 0000000000..81670471d9 --- /dev/null +++ b/lang/es/profile.php @@ -0,0 +1,70 @@ + 'Perfil', + 'tabs' => [ + 'account' => 'Cuenta', + 'oauth' => 'OAuth', + 'activity' => 'Actividad', + 'api_keys' => 'Claves API', + 'ssh_keys' => 'Claves SSH', + 'keys' => 'Claves', + '2fa' => '2FA', + 'customization' => 'Personalización', + ], + 'username' => 'Nombre de usuario', + 'admin' => 'Administrador', + 'exit_admin' => 'Salir de Admin', + 'server_list' => 'Lista de servidores', + 'email' => 'Correo electrónico', + 'password' => 'Contraseña', + 'current_password' => 'Contraseña Actual', + 'password_confirmation' => 'Confirmación de Contraseña', + 'timezone' => 'Zona horaria', + 'language' => 'Idioma', + 'language_help' => '¡Tu idioma :state no ha sido traducido aún!', + 'link' => 'Vincular :name', + 'unlink' => 'Desvincular :name', + 'unlinked' => ':name desvinculado', + 'scan_qr' => 'Escanear código QR', + 'code' => 'Código', + 'setup_key' => 'Clave de configuración', + 'invalid_code' => 'Código 2FA no válido', + 'code_help' => 'Escanea el código QR de arriba usando tu aplicación de autenticación en dos pasos, luego introduce el código generado.', + '2fa_enabled' => 'La autentificación de dos factores está habilitada.', + 'backup_help' => '¡No se volverán a mostrar!', + 'backup_codes' => 'Códigos de recuperación', + 'disable_2fa' => 'Deshabilitar 2FA', + 'disable_2fa_help' => 'Introduzca su código 2FA actual para deshabilitar la autenticación de dos factores', + 'api_keys' => 'Claves API', + 'create_api_key' => 'Crear clave API', + 'api_key_created' => 'Clave API creada', + 'description' => 'Descripción', + 'allowed_ips' => 'IPs permitidas', + 'allowed_ips_help' => 'Pulse enter para añadir una nueva dirección IP o dejar en blanco para permitir cualquier dirección IP', + 'ssh_keys' => 'Claves SSH', + 'create_ssh_key' => 'Crear clave SSH', + 'ssh_key_created' => 'Clave SSH creada', + 'name' => 'Nombre', + 'public_key' => 'Clave pública', + 'could_not_create_ssh_key' => 'No fue posible crear la clave SSH', + 'dashboard' => 'Panel de Control', + 'dashboard_layout' => 'Diseño del tablero', + 'console' => 'Consola', + 'grid' => 'Cuadrícula', + 'table' => 'Tabla', + 'rows' => 'Filas', + 'font_size' => 'Tamaño de fuente', + 'font' => 'Tipografía', + 'font_preview' => 'Previsualización de fuente', + 'seconds' => 'Segundos', + 'graph_period' => 'Período gráfico', + 'graph_period_helper' => 'La cantidad de puntos de datos, segundos, que se muestran en los gráficos de la consola.', + 'navigation' => 'Tipo de navegación', + 'sidebar' => 'Barra lateral', + 'topbar' => 'Barra superior', + 'mixed' => 'Mezclado', + 'no_oauth' => 'No hay cuentas vinculadas', + 'no_api_keys' => 'No hay claves API', + 'no_ssh_keys' => 'No hay claves SSH', +]; diff --git a/lang/es/search.php b/lang/es/search.php new file mode 100644 index 0000000000..95a4841637 --- /dev/null +++ b/lang/es/search.php @@ -0,0 +1,9 @@ + 'Por favor, introduzca al menos tres caracteres para empezar a buscar.', + 'term' => [ + 'label' => 'Término de búsqueda', + 'description' => 'Introduzca un nombre de servidor, uuid o asignación para comenzar a buscar.', + ], +]; diff --git a/lang/es/server/activity.php b/lang/es/server/activity.php new file mode 100644 index 0000000000..183b0fb334 --- /dev/null +++ b/lang/es/server/activity.php @@ -0,0 +1,11 @@ + 'Actividad', + 'event' => 'Evento', + 'user' => 'Usuario', + 'deleted_user' => 'Usuario eliminado', + 'system' => 'Sistema', + 'timestamp' => 'Fecha y hora', + 'metadata' => 'Meta datos', +]; diff --git a/lang/es/server/backup.php b/lang/es/server/backup.php new file mode 100644 index 0000000000..154feb7014 --- /dev/null +++ b/lang/es/server/backup.php @@ -0,0 +1,55 @@ + 'Copias de seguridad', + 'empty' => 'Sin copias de seguridad', + 'size' => 'Tamaño', + 'created_at' => 'Creado el', + 'status' => 'Estado', + 'is_locked' => 'Estado de bloqueo', + 'backup_status' => [ + 'in_progress' => 'En curso', + 'successful' => 'Completado', + 'failed' => 'Fallido', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Crear copia de seguridad', + 'limit' => 'Límite de copia de seguridad alcanzado', + 'created' => ':name creado', + 'notification_success' => 'Copia de seguridad creada con éxito', + 'notification_fail' => 'Creación de copia de seguridad fallida', + 'name' => 'Nombre', + 'ignored' => 'Archivos y directorios ignorados', + 'locked' => '¿Bloqueado?', + 'lock_helper' => 'Evita que esta copia de seguridad sea eliminada hasta que se desbloquee explícitamente.', + ], + 'lock' => [ + 'lock' => 'Bloquear', + 'unlock' => 'Ve a desbloquear', + ], + 'download' => 'Descargar', + 'rename' => [ + 'title' => 'Renombrar', + 'new_name' => 'Nombre de la copia de seguridad', + 'notification_success' => 'Backup renombrado', + ], + 'restore' => [ + 'title' => 'Restaurar', + 'helper' => 'Su servidor se detendrá. No podrá controlar el estado del servidor, acceder al administrador de archivos o crear copias de seguridad adicionales hasta que este sea completado.', + 'delete_all' => '¿Borrar todos los archivos antes de restaurar la copia de seguridad?', + 'notification_started' => 'Restaurando copia de seguridad', + 'notification_success' => 'Copia de seguridad restaurada con éxito', + 'notification_fail' => 'Fallo al recuperar la copia de seguridad', + 'notification_fail_body_1' => 'Este servidor no se encuentra actualmente en un estado que permita restaurar una copia de seguridad.', + 'notification_fail_body_2' => 'Esta copia de seguridad no se puede restaurar en este momento: no se ha completado o fallado.', + ], + 'delete' => [ + 'title' => 'Eliminar copia de seguridad', + 'description' => '¿Desea eliminar :backup?', + 'notification_success' => 'Copia de seguridad eliminada', + 'notification_fail' => 'No se pudo eliminar la copia de seguridad', + 'notification_fail_body' => 'Error de conexión al nodo. Por favor, inténtelo de nuevo.', + ], + ], +]; diff --git a/lang/es/server/console.php b/lang/es/server/console.php new file mode 100644 index 0000000000..1446f4ff3c --- /dev/null +++ b/lang/es/server/console.php @@ -0,0 +1,43 @@ + 'Consola', + 'command' => 'Escribe un comando...', + 'command_blocked' => 'Servidor sin conexión...', + 'command_blocked_title' => 'No se puede enviar el comando cuando el servidor está desconectado', + 'open_in_admin' => 'Abrir como admin', + 'power_actions' => [ + 'start' => 'Comenzar', + 'stop' => 'Detener', + 'restart' => 'Reiniciar', + 'kill' => 'Matar', + 'kill_tooltip' => 'Esto puede resultar en corrupción de datos y/o pérdida de datos!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Memoria', + 'network' => 'Red', + 'disk' => 'Almacenamiento', + 'name' => 'Nombre', + 'status' => 'Estado', + 'address' => 'Dirección', + 'unavailable' => 'No disponible', + ], + 'status' => [ + 'created' => 'Creado', + 'starting' => 'Iniciando', + 'running' => 'En ejecución', + 'restarting' => 'Reiniciando', + 'exited' => 'Finalizado', + 'paused' => 'En pausa', + 'dead' => 'Finalizado abruptamente', + 'removing' => 'Eliminando', + 'stopping' => 'Parando', + 'offline' => 'Desconectado', + 'missing' => 'Ausente', + ], + 'websocket_error' => [ + 'title' => '¡No se ha podido conectar con websocket!', + 'body' => 'Revisa la consola para más detalles.', + ], +]; diff --git a/lang/es/server/dashboard.php b/lang/es/server/dashboard.php new file mode 100644 index 0000000000..42bb9b2949 --- /dev/null +++ b/lang/es/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servidores', + 'list' => 'Lista de servidores', + 'tabs' => [ + 'my' => 'Mis servidores', + 'other' => 'Servidores de otros', + 'all' => 'Todos los servidores', + ], + 'empty_own' => '¡No posees ningún servidor!', + 'empty_other' => '¡No tienes acceso a ningún servidor!', + + 'status' => 'Estado', + 'server' => 'Servidor', + 'resources' => 'Recursos', + 'usage_limit' => 'Límite de uso: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Memoria RAM', + 'disk' => 'Almacenamiento', + 'network' => 'Red', + 'none' => 'Ninguno', + 'loading' => 'Cargando...', + + 'power_actions' => 'Acciones de energía', + 'power_action_sent' => ':action enviada a :name', +]; diff --git a/lang/es/server/database.php b/lang/es/server/database.php new file mode 100644 index 0000000000..6df7143da5 --- /dev/null +++ b/lang/es/server/database.php @@ -0,0 +1,26 @@ + 'Bases de datos', + 'empty' => 'Sin bases de datos', + 'create_database' => 'Crear Base de Datos', + 'limit' => 'Límite de bases de datos alcanzado', + 'viewing' => 'Visualizando: :database', + 'host' => 'Host', + 'database' => 'Base de datos', + 'username' => 'Nombre de usuario', + 'password' => 'Contraseña', + 'remote' => 'Remoto', + 'created_at' => 'Creado el', + 'name' => 'Nombre de la base de datos', + 'name_hint' => 'Dejar este espacio en blanco generará automáticamente un nombre aleatorio', + 'connections_from' => 'Conexiones desde', + 'max_connections' => 'Número máximo de conexiones', + 'database_host' => 'Host de base de datos', + 'database_host_select' => 'Seleccionar host de base de datos', + 'jdbc' => 'Cadena de conexión JDBC', + 'create_notification' => 'Creado :database', + 'create_notification_fail' => 'No se pudo crear :database', + 'delete_notification' => 'Eliminado :database', + 'delete_notification_fail' => 'No se pudo eliminar :database', +]; diff --git a/lang/es/server/file.php b/lang/es/server/file.php new file mode 100644 index 0000000000..988ce1fd4f --- /dev/null +++ b/lang/es/server/file.php @@ -0,0 +1,111 @@ + 'Archivos', + 'name' => 'Nombre', + 'size' => 'Tamaño', + 'modified_at' => 'Modificado en', + 'actions' => [ + 'open' => 'Abrir', + 'download' => 'Descargar', + 'copy' => [ + 'title' => 'Copiar', + 'notification' => 'Archivo copiado', + ], + 'upload' => [ + 'title' => 'Subir', + 'from_files' => 'Subir archivos', + 'from_url' => 'Subir desde una URL', + 'url' => 'URL', + 'drop_files' => 'Suelta los archivos para subirlos', + 'success' => 'Archivos subidos correctamente', + 'failed' => 'Error al subir los archivos', + 'header' => 'Subiendo Archivos', + 'error' => 'Se ha producido un error durante la subida', + ], + 'rename' => [ + 'title' => 'Renombrar', + 'file_name' => 'Nombre del archivo', + 'notification' => 'Archivo renombrado', + ], + 'move' => [ + 'title' => 'Mover', + 'directory' => 'Directorio', + 'directory_hint' => 'Introduzca el nuevo directorio, relativo al directorio actual.', + 'new_location' => 'Nueva ubicación', + 'new_location_hint' => 'Introduzca la ubicación de este fichero o carpeta, relativa al directorio actual.', + 'notification' => 'Archivo movido', + 'bulk_notification' => ':count Archivos fueron movidos a :directory', + ], + 'permissions' => [ + 'title' => 'Permisos', + 'read' => 'Lectura', + 'write' => 'Escritura', + 'execute' => 'Ejecución', + 'owner' => 'Propietario', + 'group' => 'Grupo', + 'public' => 'Público', + 'notification' => 'Permisos cambiados a :mode', + ], + 'archive' => [ + 'title' => 'Comprimir', + 'archive_name' => 'Nombre del archivo', + 'notification' => 'Archivo creado', + 'extension' => 'Extensión', + ], + 'unarchive' => [ + 'title' => 'Descomprimir', + 'notification' => 'Descompresión completada', + ], + 'new_file' => [ + 'title' => 'Nuevo archivo', + 'file_name' => 'Nuevo nombre del archivo', + 'syntax' => 'Resalte de sintaxis', + 'create' => 'Crear', + ], + 'new_folder' => [ + 'title' => 'Nueva carpeta', + 'folder_name' => 'Renombrar carpeta', + ], + 'nested_search' => [ + 'title' => 'Búsqueda anidada', + 'search_term' => 'Buscar término', + 'search_term_placeholder' => 'Introduce un término de búsqueda, p. ej. *.txt', + 'search' => 'Buscar', + 'search_for_term' => 'Buscar :term', + ], + 'delete' => [ + 'notification' => 'Archivo eliminado', + 'bulk_notification' => ':count archivos fueron eliminados', + ], + 'edit' => [ + 'title' => 'Editando: :file', + 'save_close' => 'Guardar y cerrar', + 'save' => 'Guardar', + 'cancel' => 'Cancelar', + 'notification' => 'Archivo guardado', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => '¡:name es demasiado largo!', + 'body' => 'El máximo es :max', + ], + 'file_not_found' => [ + 'title' => '¡:name no encontrado!', + ], + 'file_not_editable' => [ + 'title' => ':name es un directorio', + ], + 'file_already_exists' => [ + 'title' => '¡:name ya existe!', + ], + 'files_node_error' => [ + 'title' => '¡No se pudieron cargar los archivos!', + ], + 'pelicanignore' => [ + 'title' => '¡Estás editando un archivo .pelicanignore!', + 'body' => 'Cualquier fichero o directorio listado aquí será excluído de las copias de seguridad. Los comodines están soportados usando un asterisco (*).
Además puedes negar una regla previa anteponiendo una exclamación (!).', + ], + ], +]; diff --git a/lang/es/server/network.php b/lang/es/server/network.php new file mode 100644 index 0000000000..1e3a321370 --- /dev/null +++ b/lang/es/server/network.php @@ -0,0 +1,17 @@ + 'Red', + 'add' => 'Añadir Asignación', + 'limit' => 'Límite de asignaciones alcanzado', + 'address' => 'Dirección', + 'port' => 'Puerto', + 'notes' => 'Notas', + 'no_notes' => 'Sin notas', + 'make_primary' => 'Convertir en prinicipal', + 'primary' => 'Principal', + 'make' => 'Crear', + 'delete' => 'Eliminar', + 'locked' => '¿Bloqueado?', + 'locked_helper' => 'Las asignaciones bloqueadas sólo pueden ser eliminadas por administradores', +]; diff --git a/lang/es/server/schedule.php b/lang/es/server/schedule.php new file mode 100644 index 0000000000..e1f1dbfc25 --- /dev/null +++ b/lang/es/server/schedule.php @@ -0,0 +1,121 @@ + 'Programaciones', + 'new' => 'Nueva programación', + 'edit' => 'Editar programación', + 'save' => 'Guardar programación', + 'delete' => 'Eliminar programación', + 'import' => 'Importar programación', + 'export' => 'Exportar programación', + 'name' => 'Nombre', + 'cron' => 'Cron', + 'status' => 'Estado', + 'schedule_status' => [ + 'inactive' => 'Inactivo', + 'processing' => 'Procesando', + 'active' => 'Activo', + ], + 'no_tasks' => 'No hay tareas', + 'run_now' => 'Ejecutar ahora', + 'online_only' => 'Solo cuando esté iniciado', + 'last_run' => 'Última Ejecución', + 'next_run' => 'Próxima Ejecución', + 'never' => 'Nunca', + 'cancel' => 'Cancelar', + + 'only_online' => '¿Sólo cuando el servidor esté iniciado?', + 'only_online_hint' => 'Solo ejecutar este programa cuando el servidor esté en ejecución', + 'enabled' => '¿Habilitar programación?', + 'enabled_hint' => 'Esta programación se ejecutará automáticamente si está habilitada.', + + 'cron_body' => 'Por favor, tenga en cuenta que las entradas de cron a continuación siempre asumen UTC.', + 'cron_timezone' => 'Siguiente ejecución en tu zona horaria (:timezone): :next_run ', + + 'invalid' => 'Inválido', + + 'time' => [ + 'minute' => 'Minuto', + 'hour' => 'Hora', + 'day' => 'Día', + 'week' => 'Semana', + 'month' => 'Mes', + 'day_of_month' => 'Día del mes', + 'day_of_week' => 'Día de la semana', + + 'hourly' => 'Cada hora', + 'daily' => 'Diariamente', + 'weekly_mon' => 'Semanal (Lunes)', + 'weekly_sun' => 'Semanal (Domingo)', + 'monthly' => 'Mensual', + 'every_min' => 'Cada x minutos', + 'every_hour' => 'Cada x horas', + 'every_day' => 'Cada x días', + 'every_week' => 'Cada x semanas', + 'every_month' => 'Cada x meses', + 'every_day_of_week' => 'Cada x día de la semana', + + 'every' => 'Cada', + 'minutes' => 'Minutos', + 'hours' => 'Horas', + 'days' => 'Días', + 'months' => 'Meses', + + 'monday' => 'Lunes', + 'tuesday' => 'Martes', + 'wednesday' => 'Miércoles', + 'thursday' => 'Jueves', + 'friday' => 'Viernes', + 'saturday' => 'Sábado', + 'sunday' => 'Domingo', + ], + + 'tasks' => [ + 'title' => 'Tareas', + 'create' => 'Crear tarea', + 'limit' => 'Límite de tareas alcanzado', + 'action' => 'Acción', + 'payload' => 'Carga útil', + 'no_payload' => 'Sin carga útil', + 'time_offset' => 'Diferencia Horaria', + 'first_task' => 'Primera tarea', + 'seconds' => 'Segundo|Segundos', + 'continue_on_failure' => 'Continuar en caso de error', + + 'actions' => [ + 'title' => 'Acción', + 'power' => [ + 'title' => 'Enviar acción de energía', + 'action' => 'Acción de energía', + 'start' => 'Iniciar', + 'stop' => 'Detener', + 'restart' => 'Reiniciar', + 'kill' => 'Terminar proceso', + ], + 'command' => [ + 'title' => 'Enviar comando', + 'command' => 'Comando', + ], + 'backup' => [ + 'title' => 'Crear copia de seguridad', + 'files_to_ignore' => 'Archivos a ignorar', + ], + 'delete_files' => [ + 'title' => 'Borrar archivos', + 'files_to_delete' => 'Archivos a borrar', + ], + ], + ], + + 'notification_invalid_cron' => 'Los datos de cron proporcionados no evalúan a una expresión válida', + + 'import_action' => [ + 'file' => 'Archivo', + 'url' => 'URL', + 'schedule_help' => 'Este debería ser el archivo .json sin formato (schedule-daily-restart.json)', + 'url_help' => 'Las URLs deben apuntar directamente al archivo sin formato .json', + 'add_url' => 'Nueva URL', + 'import_failed' => 'Importación fallida', + 'import_success' => 'Importación realizada con éxito', + ], +]; diff --git a/lang/es/server/setting.php b/lang/es/server/setting.php new file mode 100644 index 0000000000..dddbaa33ab --- /dev/null +++ b/lang/es/server/setting.php @@ -0,0 +1,55 @@ + 'Configuración', + 'server_info' => [ + 'title' => 'Información del servidor', + 'information' => 'Información', + 'name' => 'Nombre del servidor', + 'server_name' => 'Nombre del servidor: :name', + 'notification_name' => 'Nombre del servidor actualizado', + 'description' => 'Descripción del servidor', + 'notification_description' => 'Descripción del servidor actualizada', + 'failed' => 'Fallido', + 'uuid' => 'UUID del servidor', + 'uuid_short' => 'ID del servidor', + 'node_name' => 'Nombre del nodo', + 'icon' => [ + 'upload' => 'Subir icono', + 'tooltip' => 'Usando el icono del Egg', + 'updated' => 'Icono del servidor actualizado', + 'deleted' => 'Icono del servidor borrado', + ], + 'limits' => [ + 'title' => 'Límites', + 'unlimited' => 'Ilimitado', + 'of' => 'de', + 'cpu' => 'CPU', + 'memory' => 'Memoria', + 'disk' => 'Espacio en disco', + 'backups' => 'Copias de seguridad', + 'databases' => 'Bases de datos', + 'allocations' => 'Asignaciones', + 'no_allocations' => 'No hay asignaciones adicionales', + ], + 'sftp' => [ + 'title' => 'Información SFTP', + 'connection' => 'Conexión', + 'action' => 'Conectar a SFTP', + 'username' => 'Usuario', + 'password' => 'Contraseña', + 'password_body' => 'Su contraseña SFTP es la misma que la contraseña que usa para acceder a este panel.', + ], + ], + 'reinstall' => [ + 'title' => 'Reinstalar Servidor', + 'body' => 'La reinstalación de su servidor lo detendrá y luego volverá a ejecutar el script de instalación que lo configuró inicialmente.', + 'body2' => 'Algunos archivos pueden ser eliminados o modificados durante este proceso. Por favor, respalde sus archivos antes de continuar.', + 'action' => 'Reinstalar', + 'modal' => '¿Estás seguro de que quieres reiniciar el servidor?', + 'modal_description' => 'Algunos archivos pueden ser eliminados o modificados durante este proceso. Por favor, respalde sus archivos antes de continuar.', + 'yes' => 'Sí, reinstalar', + 'notification_start' => 'Reinstalación Iniciada', + 'notification_fail' => 'Reinstalación Fallida', + ], +]; diff --git a/lang/es/server/startup.php b/lang/es/server/startup.php new file mode 100644 index 0000000000..c063cc7f91 --- /dev/null +++ b/lang/es/server/startup.php @@ -0,0 +1,17 @@ + 'Arranque', + 'command' => 'Comando de arranque', + 'notification_startup' => 'Comando de inicio actualizado', + 'notification_startup_body' => 'Reinicie el servidor para usar el nuevo comando de inicio.', + 'enable_preview' => 'Habilitar previsualización', + 'disable_preview' => 'Deshabilitar previsualización', + 'docker_image' => 'Imagen de Docker', + 'notification_docker' => 'Imagen de Docker actualizada', + 'notification_docker_body' => 'Reinicie el servidor para usar la nueva imagen.', + 'variables' => 'Variables del Servidor', + 'update' => 'Actualizado: :variable', + 'fail' => 'Error: :variable', + 'validation_fail' => 'Error de validación: :variable', +]; diff --git a/lang/es/server/user.php b/lang/es/server/user.php new file mode 100644 index 0000000000..b13d4af3dd --- /dev/null +++ b/lang/es/server/user.php @@ -0,0 +1,73 @@ + 'Usuarios', + 'username' => 'Nombre de usuario', + 'email' => 'Correo electrónico', + 'assign_all' => 'Asignar todo', + 'invite_user' => 'Invitar Usuario', + 'action' => 'Invitar', + 'remove' => 'Eliminar usuario', + 'edit' => 'Editar usuario', + 'editing' => 'Editando :user', + 'delete' => 'Eliminar usuario', + 'notification_add' => '¡Usuario invitado!', + 'notification_edit' => '¡Usuario actualizado!', + 'notification_delete' => '¡Usuario eliminado!', + 'notification_failed' => 'Error al invitar al usuario', + 'permissions' => [ + 'title' => 'Permisos', + 'activity_desc' => 'Permisos que controlan el acceso del usuario a los registros de actividad del servidor.', + 'startup_desc' => 'Permisos que controlan la capacidad del usuario para ver los parámetros de inicio de este servidor.', + 'settings_desc' => 'Permisos que controlan la capacidad del usuario para modificar la configuración de este servidor.', + 'control_desc' => 'Permisos que controlan la capacidad del usuario para controlar el estado de un servidor, o enviar comandos.', + 'user_desc' => 'Permisos que permiten al usuario administrar otros subusuarios en un servidor. Nunca podrán editar su propia cuenta o asignar permisos que no tienen ellos mismos.', + 'file_desc' => 'Permisos que controlan la capacidad del usuario para modificar el sistema de archivos de este servidor.', + 'allocation_desc' => 'Permisos que controlan la capacidad del usuario de modificar las asignaciones de puertos para este servidor.', + 'database_desc' => 'Permisos que controlan el acceso del usuario a la administración de base de datos de este servidor.', + 'backup_desc' => 'Permisos que controlan la capacidad del usuario para generar y administrar copias de seguridad del servidor.', + 'schedule_desc' => 'Permisos que controlan el acceso del usuario a la gestión de horarios de este servidor.', + 'startup_read' => 'Permite al usuario ver las variables de inicio de un servidor.', + 'startup_update' => 'Permite al usuario modificar las variables de inicio del servidor.', + 'startup_docker_image' => 'Permite al usuario modificar la imagen de Docker utilizada al ejecutar el servidor.', + 'settings_reinstall' => 'Permite al usuario reinstalar este servidor.', + 'settings_rename' => 'Permite al usuario a renombrar este servidor.', + 'settings_description' => 'Permite a un usuario cambiar la descripción de este servidor.', + 'activity_read' => 'Permite al usuario ver los registros de actividad del servidor.', + 'websocket_connect' => 'Permite a un usuario el acceso al websocket para este servidor.', + 'control_console' => 'Permite al usuario enviar datos a la consola del servidor.', + 'control_start' => 'Permite al usuario iniciar la instancia del servidor.', + 'control_stop' => 'Permite al usuario detener la instancia del servidor.', + 'control_restart' => 'Permite al usuario reiniciar la instancia del servidor.', + 'control_kill' => 'Permite al usuario matar la instancia del servidor.', + 'user_create' => 'Permite al usuario crear nuevas cuentas de usuario para el servidor.', + 'user_read' => 'Permite al usuario ver los usuarios asociados con este servidor.', + 'user_update' => 'Permite al usuario modificar otros usuarios asociados con este servidor.', + 'user_delete' => 'Permite al usuario eliminar otros usuarios asociados con este servidor.', + 'file_create' => 'Permite al usuario crear nuevos archivos y directorios.', + 'file_read' => 'Permite al usuario ver los contenidos de un directorio, pero no ver los contenidos o descargar archivos.', + 'file_read_content' => 'Permite al usuario ver el contenido de un archivo dado. Esto también permitirá al usuario descargar archivos.', + 'file_update' => 'Permite al usuario actualizar archivos y carpetas asociados con el servidor.', + 'file_delete' => 'Permite al usuario eliminar archivos y directorios.', + 'file_archive' => 'Permite al usuario crear archivos de archivos y descomprimir archivos existentes.', + 'file_sftp' => 'Permite al usuario realizar las acciones de los archivos anteriores usando un cliente SFTP.', + 'allocation_read' => 'Permite al usuario ver todas las asignaciones actualmente asignadas a este servidor. Los usuarios con cualquier nivel de acceso a este servidor siempre pueden ver la asignación principal.', + 'allocation_update' => 'Permite al usuario cambiar la asignación principal del servidor y adjuntar notas a cada asignación.', + 'allocation_delete' => 'Permite al usuario eliminar una asignación del servidor.', + 'allocation_create' => 'Permite al usuario agregar asignaciones adicionales al servidor.', + 'database_create' => 'Permite al usuario crear una nueva base de datos para el servidor.', + 'database_read' => 'Permite al usuario acceder a las bases de datos del servidor.', + 'database_update' => 'Permite al usuario realizar modificaciones en una base de datos. Si el usuario no tiene el permiso "Ver contraseña", no podrá modificar la contraseña.', + 'database_delete' => 'Permite al usuario eliminar una instancia de base de datos.', + 'database_view_password' => 'Permite al usuario ver una contraseña de base de datos en el sistema.', + 'schedule_create' => 'Permite al usuario crear un nuevo horario para el servidor.', + 'schedule_read' => 'Permite al usuario ver los horarios de un servidor.', + 'schedule_update' => 'Permite al usuario realizar modificaciones en un horario existente del servidor.', + 'schedule_delete' => 'Permite al usuario eliminar un horario del servidor.', + 'backup_create' => 'Permite al usuario crear un nuevo horario para el servidor.', + 'backup_read' => 'Permite al usuario ver todas las copias de seguridad que existen para este servidor.', + 'backup_delete' => 'Permite al usuario eliminar copias de seguridad del sistema.', + 'backup_download' => 'Permite al usuario descargar una copia de seguridad para el servidor. Peligro: esto permite a un usuario acceder a todos los archivos para el servidor en la copia de seguridad.', + 'backup_restore' => 'Permite al usuario restaurar una copia de seguridad del servidor. Peligro: esto permite al usuario borrar todos los archivos del servidor en el proceso.', + ], +]; diff --git a/lang/es/server/users.php b/lang/es/server/users.php deleted file mode 100644 index b71f9389ae..0000000000 --- a/lang/es/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Permite el acceso al websocket para este servidor.', - 'control_console' => 'Permite al usuario enviar datos a la consola del servidor.', - 'control_start' => 'Permite al usuario iniciar la instancia del servidor.', - 'control_stop' => 'Permite al usuario detener la instancia del servidor.', - 'control_restart' => 'Permite al usuario reiniciar la instancia del servidor.', - 'control_kill' => 'Permite al usuario eliminar la instancia del servidor.', - 'user_create' => 'Permite al usuario crear nuevas cuentas de usuario para el servidor.', - 'user_read' => 'Permite al usuario ver los usuarios asociados con este servidor.', - 'user_update' => 'Permite al usuario modificar otros usuarios asociados con este servidor.', - 'user_delete' => 'Permite al usuario eliminar otros usuarios asociados con este servidor.', - 'file_create' => 'Permite al usuario crear nuevos archivos y directorios.', - 'file_read' => 'Permite al usuario ver archivos y carpetas asociados con esta instancia de servidor, así como ver su contenido.', - 'file_update' => 'Permite al usuario actualizar archivos y carpetas asociados con el servidor.', - 'file_delete' => 'Permite al usuario eliminar archivos y directorios.', - 'file_archive' => 'Permite al usuario crear archivos de archivos y descomprimir archivos existentes.', - 'file_sftp' => 'Permite al usuario realizar las acciones de archivo anteriores utilizando un cliente SFTP.', - 'allocation_read' => 'Permite el acceso a las páginas de gestión de asignación del servidor.', - 'allocation_update' => 'Permite al usuario realizar modificaciones en las asignaciones del servidor.', - 'database_create' => 'Permite al usuario crear una nueva base de datos para el servidor.', - 'database_read' => 'Permite al usuario ver las bases de datos del servidor.', - 'database_update' => 'Permite al usuario realizar modificaciones en una base de datos. Si el usuario no tiene también el permiso de "Ver contraseña", no podrá modificar la contraseña.', - 'database_delete' => 'Permite al usuario eliminar una instancia de base de datos.', - 'database_view_password' => 'Permite al usuario ver la contraseña de una base de datos en el sistema.', - 'schedule_create' => 'Permite al usuario crear un nuevo horario para el servidor.', - 'schedule_read' => 'Permite al usuario ver los horarios de un servidor.', - 'schedule_update' => 'Permite al usuario realizar modificaciones en un horario existente del servidor.', - 'schedule_delete' => 'Permite al usuario eliminar un horario del servidor.', - ], -]; diff --git a/lang/es/strings.php b/lang/es/strings.php deleted file mode 100644 index 107d4deb51..0000000000 --- a/lang/es/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Correo electrónico', - 'email_address' => 'Dirección de correo electrónico', - 'user_identifier' => 'Nombre de usuario o Correo electrónico', - 'password' => 'Contraseña', - 'new_password' => 'Nueva contraseña', - 'confirm_password' => 'Confirmar nueva contraseña', - 'login' => 'Iniciar sesión', - 'home' => 'Inicio', - 'servers' => 'Servidores', - 'id' => 'ID', - 'name' => 'Nombre', - 'node' => 'Nodo', - 'connection' => 'Conexión', - 'memory' => 'Memoria', - 'cpu' => 'CPU', - 'disk' => 'Disco', - 'status' => 'Estado', - 'search' => 'Buscar', - 'suspended' => 'Suspendido', - 'account' => 'Cuenta', - 'security' => 'Seguridad', - 'ip' => 'Dirección IP', - 'last_activity' => 'Última Actividad', - 'revoke' => 'Revocar', - '2fa_token' => 'Token de Autenticación', - 'submit' => 'Enviar', - 'close' => 'Cerrar', - 'settings' => 'Ajustes', - 'configuration' => 'Configuración', - 'sftp' => 'SFTP', - 'databases' => 'Bases de Datos', - 'memo' => 'Nota', - 'created' => 'Creado', - 'expires' => 'Caduca', - 'public_key' => 'Token', - 'api_access' => 'Acceso API', - 'never' => 'nunca', - 'sign_out' => 'Cerrar sesión', - 'admin_control' => 'Control de Administrador', - 'required' => 'Requerido', - 'port' => 'Puerto', - 'username' => 'Nombre de usuario', - 'database' => 'Base de datos', - 'new' => 'Nuevo', - 'danger' => 'Peligro', - 'create' => 'Crear', - 'select_all' => 'Seleccionar Todo', - 'select_none' => 'Seleccionar Ninguno', - 'alias' => 'Alias', - 'primary' => 'Principal', - 'make_primary' => 'Hacer Principal', - 'none' => 'Ninguno', - 'cancel' => 'Cancelar', - 'created_at' => 'Creado en', - 'action' => 'Acción', - 'data' => 'Datos', - 'queued' => 'En cola', - 'last_run' => 'Última Ejecución', - 'next_run' => 'Próxima Ejecución', - 'not_run_yet' => 'Todavía no se ha ejecutado', - 'yes' => 'Sí', - 'no' => 'No', - 'delete' => 'Eliminar', - '2fa' => '2FA', - 'logout' => 'Cerrar sesión', - 'admin_cp' => 'Panel de Control de Administrador', - 'optional' => 'Opcional', - 'read_only' => 'Solo Lectura', - 'relation' => 'Relación', - 'owner' => 'Propietario', - 'admin' => 'Administrador', - 'subuser' => 'Subusuario', - 'captcha_invalid' => 'El captcha proporcionado no es válido.', - 'tasks' => 'Tareas', - 'seconds' => 'Segundos', - 'minutes' => 'Minutos', - 'under_maintenance' => 'En Mantenimiento', - 'days' => [ - 'sun' => 'Domingo', - 'mon' => 'Lunes', - 'tues' => 'Martes', - 'wed' => 'Miércoles', - 'thurs' => 'Jueves', - 'fri' => 'Viernes', - 'sat' => 'Sábado', - ], - 'last_used' => 'Último Uso', - 'enable' => 'Activar', - 'disable' => 'Desactivar', - 'save' => 'Guardar', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/es/validation.php b/lang/es/validation.php index c5b76a4901..43d3bdb917 100644 --- a/lang/es/validation.php +++ b/lang/es/validation.php @@ -19,16 +19,16 @@ 'alpha' => 'El campo :attribute solo puede contener letras.', 'alpha_dash' => 'El campo :attribute solo puede contener letras, números y guiones.', 'alpha_num' => 'El campo :attribute solo puede contener letras y números.', - 'array' => 'El campo :attribute debe ser un conjunto.', + 'array' => 'El campo :attribute debe ser un array.', 'before' => 'El campo :attribute debe ser una fecha anterior a :date.', 'before_or_equal' => 'El campo :attribute debe ser una fecha anterior o igual a :date.', 'between' => [ 'numeric' => 'El campo :attribute debe estar entre :min y :max.', 'file' => 'El campo :attribute debe tener entre :min y :max kilobytes.', 'string' => 'El campo :attribute debe tener entre :min y :max caracteres.', - 'array' => 'El campo :attribute debe tener entre :min y :max elementos.', + 'array' => 'El campo :attribute debe contener entre :min y :max elementos.', ], - 'boolean' => 'El campo :attribute debe ser verdadero o falso.', + 'confirmed' => 'La confirmación de :attribute no coincide.', 'date' => 'El campo :attribute no es una fecha válida.', 'date_format' => 'El campo :attribute no coincide con el formato :format.', @@ -36,13 +36,13 @@ 'digits' => 'El campo :attribute debe tener :digits dígitos.', 'digits_between' => 'El campo :attribute debe tener entre :min y :max dígitos.', 'dimensions' => 'Las dimensiones de la imagen :attribute no son válidas.', - 'distinct' => 'El campo :attribute tiene un valor duplicado.', + 'email' => 'El campo :attribute debe ser una dirección de correo electrónico válida.', - 'exists' => 'El :attribute seleccionado no es válido.', + 'file' => 'El campo :attribute debe ser un archivo.', 'filled' => 'El campo :attribute es obligatorio.', 'image' => 'El campo :attribute debe ser una imagen.', - 'in' => 'El :attribute seleccionado no es válido.', + 'in_array' => 'El campo :attribute no existe en :other.', 'integer' => 'El campo :attribute debe ser un número entero.', 'ip' => 'El campo :attribute debe ser una dirección IP válida.', @@ -61,17 +61,13 @@ 'string' => 'El campo :attribute debe tener al menos :min caracteres.', 'array' => 'El campo :attribute debe tener al menos :min elementos.', ], - 'not_in' => 'El campo :attribute seleccionado no es válido.', + 'numeric' => 'El campo :attribute debe ser un número.', - 'present' => 'El campo :attribute debe estar presente.', + 'regex' => 'El formato del campo :attribute no es válido.', - 'required' => 'El campo :attribute es obligatorio.', - 'required_if' => 'El campo :attribute es obligatorio cuando :other es :value.', - 'required_unless' => 'El campo :attribute es obligatorio a menos que :other esté en :values.', - 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.', + 'required_with_all' => 'El campo :attribute es obligatorio cuando :values está presente.', - 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.', - 'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de :values está presente.', + 'same' => 'Los campos :attribute y :other deben coincidir.', 'size' => [ 'numeric' => 'El campo :attribute debe ser :size.', @@ -81,8 +77,7 @@ ], 'string' => 'El campo :attribute debe ser una cadena de texto.', 'timezone' => 'El campo :attribute debe ser una zona horaria válida.', - 'unique' => 'El valor del campo :attribute ya ha sido tomado.', - 'uploaded' => 'La carga del archivo :attribute ha fallado.', + 'url' => 'El formato de :attribute no es válido.', /* diff --git a/lang/fi/activity.php b/lang/fi/activity.php deleted file mode 100644 index c6ed7e3ae3..0000000000 --- a/lang/fi/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Kirjautuminen epäonnistui', - 'success' => 'Kirjautunut sisään', - 'password-reset' => 'Salasanan palauttaminen', - 'reset-password' => 'Lähetä salasanan nollauspyyntö', - 'checkpoint' => 'Kaksivaiheista todennusta pyydetty', - 'recovery-token' => 'Käytetty kaksivaiheinen palautustunniste', - 'token' => 'Ratkaistu kaksivaiheinen haaste', - 'ip-blocked' => 'Estetty pyyntö listaamattomasta IP-osoitteesta :identifier', - 'sftp' => [ - 'fail' => 'SFTP kirjautuminen epäonnistui', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Muutettu sähköpostiosoite :old muotoon :new', - 'password-changed' => 'Salasana vaihdettu', - ], - 'api-key' => [ - 'create' => 'Luotu uusi API-avain :identifier', - 'delete' => 'Poistettu API-avain :identifier', - ], - 'ssh-key' => [ - 'create' => 'Tilille lisätty SSH avain :fingerprint', - 'delete' => 'Tililtä poistettu SSH avain :fingerprint', - ], - 'two-factor' => [ - 'create' => 'Kaksivaiheinen todennus käytössä', - 'delete' => 'Kaksivaiheinen todennus poistettu käytöstä', - ], - ], - 'server' => [ - 'reinstall' => 'Uudelleenasennettu palvelin', - 'console' => [ - 'command' => 'Suoritettu ":command" palvelimelle', - ], - 'power' => [ - 'start' => 'Palvelin käynnistetty', - 'stop' => 'Palvelin pysäytetty', - 'restart' => 'Palvelin uudelleen käynnistetty', - 'kill' => 'Palvelimen prosessi tapettu', - ], - 'backup' => [ - 'download' => 'Ladattu varmuuskopio :name', - 'delete' => 'Poistettu varmuuskopio :name', - 'restore' => 'Palautettu varmuuskopio :name (poistetut tiedostot: :truncate)', - 'restore-complete' => 'Suoritettu palauttaminen varmuuskopiosta :name', - 'restore-failed' => 'Ei voitu suorittaa varmuuskopion :name palauttamista', - 'start' => 'Aloitti uuden varmuuskopion :name', - 'complete' => 'Varmuuskopio :name on merkitty valmiiksi', - 'fail' => 'Varmuuskopio :name on merkitty epäonnistuneeksi', - 'lock' => 'Varmuuskopio :name lukittiin', - 'unlock' => 'Varmuuskopio :name on avattu lukituksesta', - ], - 'database' => [ - 'create' => 'Luotiin uusi tietokanta :name', - 'rotate-password' => 'Tietokannan :name salasana vaihdettu', - 'delete' => 'Tietokanta :name poistettiin', - ], - 'file' => [ - 'compress_one' => 'Pakattu :directory:file', - 'compress_other' => 'Pakattu :count tiedostoa :directory', - 'read' => 'Tiedoston :file sisältöä tarkasteltu', - 'copy' => 'Luotu kopio tiedostosta :file', - 'create-directory' => 'Luotu hakemisto :Directory:name', - 'decompress' => ':files purettiin :directory', - 'delete_one' => 'Poistettu :directory:files.0', - 'delete_other' => 'Poistettiin :count tiedostoa :directory', - 'download' => 'Ladattu :file', - 'pull' => 'Etätiedosto ladattiin :url :directory', - 'rename_one' => 'Uudelleennimetty :directory:files.0.from :directory:files.0.to', - 'rename_other' => 'Nimetty uudelleen :count tiedostoa hakemistossa :directory', - 'write' => 'Kirjoitettu uutta sisältöä tiedostoon :file', - 'upload' => 'Tiedoston lataus aloitettu', - 'uploaded' => 'Ladattu :directory:file', - ], - 'sftp' => [ - 'denied' => 'SFTP-käyttö estetty käyttöoikeuksien vuoksi', - 'create_one' => 'Luotu :files.0', - 'create_other' => 'Luotu :count uutta tiedostoa', - 'write_one' => 'Muokattu :files.0 sisältöä', - 'write_other' => 'Muokattu :count tiedostojen sisältöä', - 'delete_one' => 'Poistettiin :files.0', - 'delete_other' => 'Poistettiin :count tiedostoa', - 'create-directory_one' => 'Luotu :files.0 hakemisto', - 'create-directory_other' => 'Luotu :count hakemistoa', - 'rename_one' => 'Tiedosto :files.0.from nimettiin uudelleen tiedostoksi :files.0.to', - 'rename_other' => 'Nimetty uudelleen tai siirretty :count tiedostoa', - ], - 'allocation' => [ - 'create' => 'Lisätty :allocation palvelimeen', - 'notes' => 'Päivitettiin muistiinpanot varaukselle :allocation ":old":sta ":new":een', - 'primary' => 'Aseta :allocation ensisijaiseksi palvelinvaraukseksi', - 'delete' => 'Poistettu :allocation varaus', - ], - 'schedule' => [ - 'create' => 'Luotu :name aikataulu', - 'update' => 'Päivitetty :name aikataulu', - 'execute' => 'Suoritettu manuaalisesti :name aikataulu', - 'delete' => 'Aikataululta :name poistettiin', - ], - 'task' => [ - 'create' => 'Luotiin uusi ":action" tehtävä aikatauluun :name.', - 'update' => 'Päivitetty ":action" tehtävä aikatauluun :name', - 'delete' => 'Poistettu tehtävä :name aikataululta', - ], - 'settings' => [ - 'rename' => 'Palvelin :old nimettiin uudelleen :new', - 'description' => 'Palvelimen vanha kuvaus :old päivitetiin :new', - ], - 'startup' => [ - 'edit' => ':variable päivitettiin vanhasta :old uuteen :new', - 'image' => 'Päivitettiin Docker-kuva palvelimelle vanhasta :old uudeksi :new', - ], - 'subuser' => [ - 'create' => 'Alikäyttäjä :email lisättiin', - 'update' => 'Alikäyttäjän :email oikeudet päivitetty', - 'delete' => 'Alikäyttäjä :email poistettu', - ], - ], -]; diff --git a/lang/fi/admin/apikey.php b/lang/fi/admin/apikey.php new file mode 100644 index 0000000000..c043d99bf2 --- /dev/null +++ b/lang/fi/admin/apikey.php @@ -0,0 +1,27 @@ + 'Sovelluksen API avaimet', + 'empty' => 'Ei API avaimia.', + 'whitelist' => 'Sallitut IPv4 osoitteet', + 'whitelist_help' => 'API avaimet voidaan rajoittaa toimimaan vain tietyissä IPv4 osoitteissa. Syötä jokainen osoite uudella rivillä.', + 'whitelist_placeholder' => 'Esimerkki: 127.0.0.1 tai 192.168.1.1', + 'description' => 'Kuvaus', + 'description_help' => 'Lyhyt kuvaus siitä, mikä tämä avain on', + 'nav_title' => 'API Avaimet', + 'model_label' => 'Sovelluksen API-avaimet', + 'model_label_plural' => 'Sovelluksen API-avaimet', + 'table' => [ + 'key' => 'Avain', + 'description' => 'Kuvaus', + 'last_used' => 'Viimeksi käytetty', + 'created' => 'Luotu', + 'created_by' => 'Luotu', + 'never_used' => 'Ei ole käytetty', + ], + 'permissions' => [ + 'none' => 'Ei mitään', + 'read' => 'Lue', + 'read_write' => 'Luku & kirjoitus', + ], +]; diff --git a/lang/fi/admin/databasehost.php b/lang/fi/admin/databasehost.php new file mode 100644 index 0000000000..db516f3659 --- /dev/null +++ b/lang/fi/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Tietokantaisännät', + 'model_label' => 'Tietokantaisäntä', + 'model_label_plural' => 'Tietokantaisännät', + 'table' => [ + 'database' => 'Tietokanta', + 'name' => 'Nimi', + 'host' => 'Palvelin', + 'port' => 'Portti', + 'name_helper' => 'Jättämällä tämän tyhjäksi luodaan satunnainen nimi automaattisesti', + 'username' => 'Käyttäjänimi', + 'password' => 'Salasana', + 'remote' => 'Yhteydet lähteestä', + 'remote_helper' => 'Yhteyksien sallittu lähde. Tyhjä = yhteydet sallitaan kaikkialta.', + 'max_connections' => 'Yhteyksien enimmäismäärä', + 'created_at' => 'Luotu ajankohtana', + 'connection_string' => 'JDBC-yhteysmerkkijono', + ], + 'error' => 'Virhe yhdistettäessä palvelimeen', + 'host' => 'Palvelin', + 'host_help' => 'IP-osoite tai verkkotunnus, jota tulee käyttää yhdistettäessä tähän MySQL-isäntään tämän hallintapaneelin kautta uusien tietokantojen luomiseksi.', + 'port' => 'Portti', + 'port_help' => 'MySQL:n käyttämä portti tällä palvelimella.', + 'max_database' => 'Suurin sallittu tietokantojen määrä', + 'max_databases_help' => 'Suurin määrä tietokantoja, jotka voidaan luoda tällä isännällä. Kun raja on saavutettu, uusia tietokantoja ei voi enää luoda. Tyhjä tarkoittaa rajatonta määrää.', + 'display_name' => 'Näyttönimi', + 'display_name_help' => 'IP-osoite tai verkkotunnus, joka näytetään loppukäyttäjälle.', + 'username' => 'Käyttäjänimi', + 'username_help' => 'Käyttäjätunnus tilille, jolla on riittävät oikeudet luoda uusia käyttäjiä ja tietokantoja järjestelmään.', + 'password' => 'Salasana', + 'password_help' => 'Tietokantakäyttäjän salasana.', + 'linked_nodes' => 'Linkitetyt solmut', + 'linked_nodes_help' => 'Tämä asetus käyttää oletuksena tätä tietokantapalvelinta, kun valitulle solmulle lisätään tietokanta.', + 'connection_error' => 'Virhe yhdistettäessä tietokantapalvelimeen', + 'no_database_hosts' => 'Ei tietokantapalvelimia', + 'no_nodes' => 'Solmuja ei ole', + 'delete_help' => 'Tietokantapalvelimella on tietokantoja', + 'unlimited' => 'Rajaton', + 'anywhere' => 'Missä tahansa', + + 'rotate' => 'Vaihda', + 'rotate_password' => 'Vaihda salasana', + 'rotated' => 'Salasana vaihdettu', + 'rotate_error' => 'Salasanan vaihtaminen epäonnistui', + 'databases' => 'Tietokannat', + + 'setup' => [ + 'preparations' => 'Valmistelut', + 'database_setup' => 'Tietokannan määritys', + 'panel_setup' => 'Paneelin asetukset', + + 'note' => 'Tällä hetkellä tietokantapalvelimissa tuetaan vain MySQL/MariaDB-tietokantoja!', + 'different_server' => 'Paneeli ja tietokanta eivät ole samalla palvelimella.', + + 'database_user' => 'Tietokannan käyttäjä', + 'cli_login' => 'Käytä komentoa mysql -u root -p päästäksesi MySQL CLI:hin.', + 'command_create_user' => 'Komento käyttäjän luomiseen', + 'command_assign_permissions' => 'Komento käyttöoikeuksien määrittämiseen', + 'cli_exit' => 'Poistuaksesi MySQL CLI:stä käytä komentoa exit.', + 'external_access' => 'Ulkoinen Käyttöoikeus', + 'allow_external_access' => ' +Todennäköisesti sinun täytyy sallia ulkoinen pääsy tähän MySQL-instanssiin, jotta palvelimet voivat yhdistää siihen. + +Avaa my.cnf (sijainti riippuu käyttöjärjestelmästäsi ja asennustavasta). Sen löytämiseen voit käyttää komentoa: +find /etc -iname my.cnf + +Lisää tiedoston loppuun seuraava rivi ja tallenna: +[mysqld]
bind-address=0.0.0.0
+ +Käynnistä MySQL/MariaDB uudelleen, jotta muutokset tulevat voimaan. Tämä ohittaa MySQL:n oletusasetuksen, joka sallii yhteydet vain localhostista. Nyt yhteydet onnistuvat kaikilta verkkoliitännöiltä. Muista myös sallia MySQL-portti (oletus 3306) palomuurissa. ', + ], +]; diff --git a/lang/fi/admin/eggs.php b/lang/fi/admin/eggs.php deleted file mode 100644 index 2ccf6de6c7..0000000000 --- a/lang/fi/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Tämän munan ja siihen liittyvien muuttujien tuonti onnistui.', - 'updated_via_import' => 'Tämä muna on päivitetty toimitettua tiedostoa käyttäen.', - 'deleted' => 'Pyydetyn munan poistaminen paneelista onnistui.', - 'updated' => 'Munan määritys on päivitetty onnistuneesti.', - 'script_updated' => 'Munan asennus koodi on päivitetty ja suoritetaan aina, kun palvelin asennetaan.', - 'egg_created' => 'Uusi muna luotiin onnistuneesti ja se on valmis käytettäväksi. Sinun tulee käynnistää uudelleen kaikki käynnissä olevat daemonit, jotta uusi muna otetaan käyttöön', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Muuttuja ":variable" on poistettu, eikä se enää ole palvelimien käytettävissä uudelleenrakennuksen jälkeen.', - 'variable_updated' => 'Muuttuja ":variable" on päivitetty. Sinun on rakennettava uudelleen kaikki palvelimet, jotka käyttävät tätä muuttujaa, jotta muutokset voidaan ottaa käyttöön.', - 'variable_created' => 'Uusi muuttuja on onnistuneesti luotu ja määritetty tähän munaan.', - ], - ], -]; diff --git a/lang/fi/admin/node.php b/lang/fi/admin/node.php deleted file mode 100644 index 493df5de15..0000000000 --- a/lang/fi/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'Annettua FQDN:ää tai IP-osoitetta ei voida muuntaa kelvolliseksi IP-osoitteeksi.', - 'fqdn_required_for_ssl' => 'SSL:n käyttämiseksi tälle solmulle tarvitaan täysin määritelty verkkotunnusnimi, joka muuntuu julkiseksi IP-osoitteeksi.', - ], - 'notices' => [ - 'allocations_added' => 'Varaukset on onnistuneesti lisätty tähän solmuun.', - 'node_deleted' => 'Solmu on onnistuneesti poistettu paneelista.', - 'node_created' => 'Uusi palvelin luotiin onnistuneesti. Voit automaattisesti määrittää daemonin tälle koneelle käymällä \'Configuration\' välilehdellä. Ennen kuin voit lisätä mitään palvelimia, sinun on ensin varattava vähintään yksi IP-osoite ja portti.', - 'node_updated' => 'Palvelimen tiedot on päivitetty. Jos jokin Daemonin asetuksia on muutettu, sinun täytyy käynnistää ne uudelleen, jotta nämä muutokset tulevat voimaan.', - 'unallocated_deleted' => 'Poistettiin kaikki kohdentamattomat portit :ip.', - ], -]; diff --git a/lang/fi/admin/role.php b/lang/fi/admin/role.php new file mode 100644 index 0000000000..216b681209 --- /dev/null +++ b/lang/fi/admin/role.php @@ -0,0 +1,17 @@ + 'Roolit', + 'model_label' => 'Rooli', + 'model_label_plural' => 'Roolit', + 'no_roles' => 'Ei rooleja', + 'name' => 'Roolin Nimi', + 'permissions' => 'Oikeudet', + 'in_use' => 'Käytössä', + 'all' => 'Kaikki', + 'root_admin' => 'Roolilla :role on kaikki oikeudet.', + 'root_admin_delete' => 'Root Adminia ei voi poistaa', + 'users' => 'Käyttäjät', + 'nodes' => 'Solmu', + 'nodes_hint' => 'Jätä tyhjäksi, jotta pääsy sallitaan kaikille solmuille.', +]; diff --git a/lang/fi/admin/server.php b/lang/fi/admin/server.php deleted file mode 100644 index 13d2b7b9fe..0000000000 --- a/lang/fi/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'Yrität poistaa tämän palvelimen oletusvarauksen, mutta vaihtoehtoista varausta ei ole käytettävissä.', - 'marked_as_failed' => 'Tämä palvelin on merkitty epäonnistuneeksi aiemmassa asennuksessa. Nykyistä tilaa ei voida vaihtaa tässä tilassa.', - 'bad_variable' => 'Vahvistuksessa tapahtui virhe :name muuttujan kanssa.', - 'daemon_exception' => 'Tapahtui poikkeus, kun yritettiin kommunikoida daemonin kanssa, mikä johti HTTP/:code -vastauskoodiin. Tämä poikkeus on kirjattu. (request id: :request_id)', - 'default_allocation_not_found' => 'Pyydettyä oletusjakoa ei löytynyt tämän palvelimen varauksista.', - ], - 'alerts' => [ - 'startup_changed' => 'Tämän palvelimen käynnistysasetukset on päivitetty. Jos tämän palvelimen muna on muuttunut, uudelleenasennus tapahtuu nyt.', - 'server_deleted' => 'Palvelin on onnistuneesti poistettu järjestelmästä.', - 'server_created' => 'Palvelin luotiin onnistuneesti paneelissa. Anna daemonille muutama minuutti aikaa asentaa palvelin täysin valmiiksi.', - 'build_updated' => 'Rakennustiedot tälle palvelimelle on päivitetty. Osa muutoksista saattaa vaatia käynnistyksen, jotta ne tulevat voimaan.', - 'suspension_toggled' => 'Palvelimen keskeytyksen tila on vaihdettu :status.', - 'rebuild_on_boot' => 'Tämän palvelimen on merkitty edellyttävän Docker Container uudelleenrakentamista. Tämä tapahtuu seuraavan kerran, kun palvelin käynnistetään.', - 'install_toggled' => 'Tämän palvelimen asennuksen tila on vaihdettu.', - 'server_reinstalled' => 'Tämä palvelin on laitettu uudelleenasennusjonoon, joka alkaa nyt.', - 'details_updated' => 'Palvelimen tiedot on päivitetty onnistuneesti.', - 'docker_image_updated' => 'Onnistuneesti vaihdettiin oletus Docker-kuva, jota käytetään tälle palvelimelle. Muutoksen voimaantuloksi vaaditaan uudelleen käynnistys.', - 'node_required' => 'Sinulla on oltava vähintään yksi palvelin määritetty ennen kuin voit lisätä palvelimen tähän paneeliin.', - 'transfer_nodes_required' => 'Sinulla on oltava vähintään kaksi palvelinta määritetty ennen kuin voit siirtää palvelimia.', - 'transfer_started' => 'Palvelimen siirto on aloitettu.', - 'transfer_not_viable' => 'Valitsemasi palvelin ei ole riittävän suuri tälle palvelimelle tarvittavan levytilan tai muistin saatavuuden kannalta.', - ], -]; diff --git a/lang/fi/admin/user.php b/lang/fi/admin/user.php deleted file mode 100644 index 1e8ac13748..0000000000 --- a/lang/fi/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Ei voida poistaa käyttäjää, jolla on aktiivisia palvelimia heidän tililleen. Poista heidän palvelimensa ennen jatkamista.', - 'user_is_self' => 'Omaa käyttäjätiliä ei voi poistaa.', - ], - 'notices' => [ - 'account_created' => 'Tili on luotu onnistuneesti.', - 'account_updated' => 'Tili on päivitetty onnistuneesti.', - ], -]; diff --git a/lang/fi/auth.php b/lang/fi/auth.php index 14eb3dbe88..75851da279 100644 --- a/lang/fi/auth.php +++ b/lang/fi/auth.php @@ -1,27 +1,24 @@ 'Kirjaudu Sisään', - 'go_to_login' => 'Siirry kirjautumiseen', - 'failed' => 'Käyttäjätunnuksia vastaavaa tiliä ei löytynyt.', - 'forgot_password' => [ - 'label' => 'Unohtuiko salasana?', - 'label_help' => 'Syötä tilisi sähköpostiosoite saadaksesi ohjeet salasanan vaihtamista varten.', - 'button' => 'Palauta Tili', - ], - - 'reset_password' => [ - 'button' => 'Palauta ja kirjaudu sisään', - ], - - 'two_factor' => [ - 'label' => 'Kaksivaiheinen Tunnus', - 'label_help' => 'Tämä tunnus vaatii kaksivaiheisen todennuksen jatkaaksesi. Ole hyvä ja syötä laitteesi luoma koodi, jotta voit suorittaa tämän kirjautumisen.', - 'checkpoint_failed' => 'Kaksivaiheisen todennuksen avain oli virheellinen.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'Nämä tunnistetiedot eivät vastaa tietojamme.', + 'failed-two-factor' => 'Väärä Kaksivaiheiden Todennuksen Koodi', + 'two-factor-code' => 'Kaksivaiheisen Todennuksen Koodi', + 'two-factor-hint' => 'Voit käyttää varakoodeja, jos menetät pääsyn laitteeseesi.', + 'password' => 'Virheellinen salasana.', 'throttle' => 'Liian monta kirjautumisyritystä. Yritä uudelleen :seconds sekunnin kuluttua.', - 'password_requirements' => 'Salasanan on oltava vähintään 8 merkkiä pitkä ja sen tulisi olla ainutkertainen tälle sivustolle.', - '2fa_must_be_enabled' => 'Järjestelmänvalvoja on vaatinut, että kaksivaiheinen todennus on oltava käytössä tililläsi, jotta voit käyttää paneelia.', + '2fa_must_be_enabled' => 'Ylläpitäjä on vaatinut, että kaksivaiheinen tunnistautuminen on otettava käyttöön tililläsi, jotta voit käyttää paneelia.', + ]; diff --git a/lang/fi/command/messages.php b/lang/fi/command/messages.php deleted file mode 100644 index 1bac46e8fb..0000000000 --- a/lang/fi/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Anna käyttäjänimi, käyttäjätunnus tai sähköpostiosoite', - 'select_search_user' => 'Poistavan käyttäjän tunnus (Paina Enter \'0\' uudelleenhakua varten)', - 'deleted' => 'Käyttäjä poistettiin onnistuneesti paneelista.', - 'confirm_delete' => 'Oletko varma, että haluat poistaa tämän käyttäjän paneelista?', - 'no_users_found' => 'Yhtään käyttäjää ei löytynyt hakusanalla.', - 'multiple_found' => 'Useita tilejä löytyi annetulle käyttäjälle. Käyttäjää ei voitu poistaa --no-interaction -lipun takia.', - 'ask_admin' => 'Onko tämä käyttäjä järjestelmänvalvoja?', - 'ask_email' => 'Sähköpostiosoite', - 'ask_username' => 'Käyttäjänimi', - 'ask_name_first' => 'Etunimi', - 'ask_name_last' => 'Sukunimi', - 'ask_password' => 'Salasana', - 'ask_password_tip' => 'Mikäli haluat luoda tilin satunnaisella salasanalla, joka lähetetään sähköpostitse käyttäjälle, suorita tämä komento uudelleen (CTRL+C) ja lisää --no-password tunniste.', - 'ask_password_help' => 'Salasanan on oltava vähintään 8 merkkiä pitkä ja siinä on oltava vähintään yksi iso kirjain ja numero.', - '2fa_help_text' => [ - 'Tämä komento poistaa käytöstä kaksivaiheisen todennuksen käyttäjän tililtä, jos se on käytössä. Tätä tulee käyttää tilin palautuskomennona vain, jos käyttäjä on lukittu pois tililtään.', - 'Jos tämä ei ole sitä, mitä halusit tehdä, paina CTRL+C poistuaksesi tästä prosessista.', - ], - '2fa_disabled' => '2-tekijän todennus on poistettu käytöstä sähköpostilta :email.', - ], - 'schedule' => [ - 'output_line' => 'Lähetetään työtä ensimmäiseen tehtävään `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Poistetaan palvelun varmuuskopiotiedostoa :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Uudelleenrakennus pyyntö ":name" (#:id) solmussa ":node" epäonnistui virheellä: :message', - 'reinstall' => [ - 'failed' => 'Pyyntö ":name" (#:id) uudelleenasennuksesta palvelimessa ":node" epäonnistui virheellä: :message', - 'confirm' => 'Olet tekemässä uudelleenasennusta useille palvelimille. Haluatko jatkaa?', - ], - 'power' => [ - 'confirm' => 'Haluatko jatkaa :action :count palvelimelle?', - 'action_failed' => 'Virtatoiminnon pyyntö ":name" (#:id) solmussa ":node" epäonnistui virheellä: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Isäntä (esim. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP portti', - 'ask_smtp_username' => 'SMTP Käyttäjätunnus', - 'ask_smtp_password' => 'SMTP Salasana', - 'ask_mailgun_domain' => 'Mailgun Verkkotunnus', - 'ask_mailgun_endpoint' => 'Mailgun päätepiste', - 'ask_mailgun_secret' => 'Mailgun Salaisuus', - 'ask_mandrill_secret' => 'Mandrill Salaisuus', - 'ask_postmark_username' => 'Postmark API-avain', - 'ask_driver' => 'Mitä palvelua pitäisi käyttää sähköpostien lähetykseen?', - 'ask_mail_from' => 'Sähköpostiosoitteen sähköpostit tulee lähettää osoitteesta', - 'ask_mail_name' => 'Nimi, josta sähköpostit tulisi näyttää lähtevän', - 'ask_encryption' => 'Käytettävä salausmenetelmä', - ], - ], -]; diff --git a/lang/fi/commands.php b/lang/fi/commands.php new file mode 100644 index 0000000000..1757bc586c --- /dev/null +++ b/lang/fi/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Anna sähköpostiosoite, josta tämän paneelin viemät munat ovat peräisin. Tämän pitäisi olla voimassa oleva sähköposti osoite.', + 'url' => 'Sovelluksen URL-osoitteen PITÄÄ alkaa https:// tai http:// riippuen siitä, käytätkö SSL:ää vai et. Jos et sisällytä URL-osoitteen alkua sähköpostit ja muu sisältö linkittää väärään sijaintiin.', + 'timezone' => 'Aikavyöhykkeen tulee täsmätä yhteen PHP:n tuetuista aikavyöhykkeistä. Jos et ole varma. ole hyvä ja katso https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Olet valinnut Redis-ajurin yhteen tai useampaan vaihtoehtoon, ole hyvä ja anna kelvolliset yhdistys tiedot alla. Useimmissa tapauksissa voit käyttää oletusarvoja, ellei asetuksiasi ole muutettu.', + 'comment' => 'Oletuksena Redis-palvelimella on käyttäjänimi default eikä salasanaa, koska se toimii paikallisesti eikä ole ulkomaailman saavutettavissa. Tällöin paina vain enteriä syöttämättä arvoa.', + 'confirm' => 'Näyttää siltä, että Redisille on jo määritetty :field, haluatko muuttaa sitä?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'On erittäin suositeltavaa olla käyttämättä "localhost" tietokantapalvelimen isäntänä, koska olemme havainneet usein soketiyhteysongelmia. Jos haluat käyttää paikallista yhteyttä, sinun tulisi käyttää "127.0.0.1".', + 'DB_USERNAME_note' => 'MySQL-yhteyksien käyttö root-tilillä ei ole pelkästään erittäin paheksuttavaa, vaan se on myös kielletty tässä sovelluksessa. Sinun täytyy luoda MySQL-käyttäjä tätä ohjelmistoa varten.', + 'DB_PASSWORD_note' => 'Näyttää siltä, että sinulla on jo MySQL-yhteyssalasana määritetty, haluaisitko muuttaa sen?', + 'DB_error_2' => 'Yhteyden tietoja EI ole tallennettu. Sinun täytyy antaa kelvolliset yhteyden tiedot ennen kuin voit jatkaa.', + 'go_back' => 'Palaa takaisin ja yritä uudelleen', + ], + 'make_node' => [ + 'name' => 'Anna lyhyt tunniste, jolla erotat tämän solmun muista', + 'description' => 'Anna kuvaus solmun tunnistamiseksi', + 'scheme' => 'Ole hyvä ja syötä joko https SSL-yhteyttä varten tai http ei-SSL-yhteyttä varten.', + 'fqdn' => 'Syötä verkkotunnus (esim. node.example.com) käytettäväksi daemon-yhteydessä. IP-osoitetta voidaan käyttää vain, jos et käytä SSL:ää tälle solmulle.', + 'public' => 'Tuleeko tämän solmun olla julkinen? Huomaa, että asettamalla solmun yksityiseksi estät automaattisen käyttöönoton tälle solmulle.', + 'behind_proxy' => 'Onko sinun FQDN proxyn takana?', + 'maintenance_mode' => 'Pitäisikö huoltotilan olla päällä?', + 'memory' => 'Anna muistin enimmäismäärä', + 'memory_overallocate' => 'Syötä muistin ylikäytön määrä, -1 poistaa tarkistuksen käytöstä ja 0 estää uusien palvelimien luomisen.', + 'disk' => 'Anna levytilan enimmäismäärä', + 'disk_overallocate' => 'Syötä levytilan yliallokointi; arvo -1 ohittaa tarkistuksen ja 0 estää uuden palvelimen luonnin.', + 'cpu' => 'Anna enimmäis-CPU-määrä', + 'cpu_overallocate' => 'Anna CPU:n yliallokoinnin määrä; -1 poistaa tarkistuksen ja 0 estää uusien palvelimien luomisen.', + 'upload_size' => 'Syötä tiedoston maksimi lähetyskoko', + 'daemonListen' => 'Syötä daemonin kuuntelemisportti', + 'daemonConnect' => 'Syötä daemonin yhteysportti (voi olla sama kuin kuunteluportti)', + 'daemonSFTP' => 'Syötä daemonin SFTP kuuntelemisportti', + 'daemonSFTPAlias' => 'Syötä daemonin SFTP-alias (voi jättää tyhjäksi)', + 'daemonBase' => 'Anna peruskansio', + 'success' => 'Solmu :name luotiin onnistuneesti, sen tunnus on :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Valittua solmua ei ole olemassa.', + 'error_invalid_format' => 'Virheellinen muoto. Sallitut vaihtoehdot ovat yaml ja json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Näyttää siltä, että olet jo määrittänyt sovelluksen salausavaimen. Jatkamalla tätä prosessia kirjoitat yli kyseisen avaimen ja aiheutat tietojen korruptoitumisen kaikille olemassa oleville salatuille tiedoille. ÄLÄ JATKA ELLEI TIETÄMÄSI MITÄ TEET.', + 'understand' => 'Ymmärrän tämän komennon suorittamisen seuraukset ja hyväksyn kaiken vastuun salatun datan menetyksestä.', + 'continue' => 'Oletko varma, että haluat jatkaa? Sovelluksen salausavaimen muuttaminen AIHEUTTAA TIETOJEN MENETYKSEN.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Palvelimille ei ole ajoitettuja tehtäviä, jotka olisi suoritettava.', + 'error_message' => 'Aikataulua käsiteltäessä tapahtui virhe: ', + ], + ], +]; diff --git a/lang/fi/dashboard/account.php b/lang/fi/dashboard/account.php deleted file mode 100644 index 3a764a1f30..0000000000 --- a/lang/fi/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Päivitä sähköpostiosoitteesi', - 'updated' => 'Sähköpostiosoite on päivitetty.', - ], - 'password' => [ - 'title' => 'Vaihda salasanasi', - 'requirements' => 'Uuden salasanan on oltava vähintään 8 merkkiä pitkä', - 'updated' => 'Salasanasi on päivitetty.', - ], - 'two_factor' => [ - 'button' => 'Määritä Kaksivaiheinen Todennus', - 'disabled' => 'Kaksivaiheinen todennus on poistettu käytöstä tililtäsi. Sinua ei enää kehoteta antamaan tunnusta kirjautuessasi.', - 'enabled' => 'Kaksivaiheinen todennus on otettu käyttöön tililläsi! Tästä lähtien kun kirjaudut sisään, sinun on annettava laitteesi luoma koodi.', - 'invalid' => 'Annettu tunniste oli virheellinen.', - 'setup' => [ - 'title' => 'Aseta kaksivaiheinen todennus', - 'help' => 'Koodia ei voi skannata? Syötä alla oleva koodi sovelluksesi:', - 'field' => 'Syötä tunnus', - ], - 'disable' => [ - 'title' => 'Poista käytöstä kaksivaiheinen tunnistautuminen', - 'field' => 'Syötä tunnus', - ], - ], -]; diff --git a/lang/fi/dashboard/index.php b/lang/fi/dashboard/index.php deleted file mode 100644 index 1a34935e94..0000000000 --- a/lang/fi/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Etsi palvelimia...', - 'no_matches' => 'Ei löytynyt palvelimia, jotka vastaisivat annettuja hakuehtoja.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Muisti', -]; diff --git a/lang/fi/exceptions.php b/lang/fi/exceptions.php index 84eee3d849..fcf01eaa9c 100644 --- a/lang/fi/exceptions.php +++ b/lang/fi/exceptions.php @@ -4,6 +4,7 @@ 'daemon_connection_failed' => 'Tapahtui poikkeus, kun yritettiin kommunikoida daemonin kanssa, mikä johti HTTP/:code -vastauskoodiin. Tämä poikkeus on kirjautunut.', 'node' => [ 'servers_attached' => 'Palvelimella ei saa olla siihen linkitettyjä palvelimia, jotta se voitaisiin poistaa.', + 'error_connecting' => 'Virhe yhdistettäessä solmuun :node', 'daemon_off_config_updated' => 'Daemon konfiguraatio on päivitetty, mutta virhe ilmeni yritettäessä päivittää konfiguraatiota automaattisesti daemoniin. Sinun tulee päivittää daemonin konfiguraatio (config.yml) manuaalisesti, jotta muutokset voidaan ottaa käyttöön.', ], 'allocations' => [ @@ -11,7 +12,7 @@ 'too_many_ports' => 'Yli 1000 portin lisääminen yhteen alueeseen kerralla ei ole tuettua.', 'invalid_mapping' => ':port:lle annettu määritys oli virheellinen eikä sitä voitu käsitellä.', 'cidr_out_of_range' => 'CIDR-muoto sallii vain maskit välillä /25 ja /32.', - 'port_out_of_range' => 'Varauksessa olevien porttien on oltava suurempia kuin 1024 ja enintään 65535.', + 'port_out_of_range' => 'Portit allokaatiossa tulee olla välillä 1024–65535.', ], 'egg' => [ 'delete_has_servers' => 'Paneelista ei voi poistaa Munaa, johon on liitetty aktiivisia palvelimia.', @@ -43,6 +44,8 @@ 'has_nodes' => 'Ei voida poistaa sijaintia, jossa on aktiivisia palvelimia siihen liitettynä.', ], 'users' => [ + 'is_self' => 'Et voi poistaa omaa käyttäjätiliäsi.', + 'has_servers' => 'Käyttäjää ei voi poistaa, jos hänen tilillään on aktiivisia palvelimia. Poista palvelimet ennen jatkamista.', 'node_revocation_failed' => 'Avainten peruuttaminen epäonnistui Palvelimen #:node kohdalla. :error', ], 'deployment' => [ @@ -52,4 +55,10 @@ 'api' => [ 'resource_not_found' => 'Pyydettyä resurssia ei ole tällä palvelimella.', ], + 'mount' => [ + 'servers_attached' => 'Mountin poistaminen edellyttää, ettei siihen ole liitetty palvelimia.', + ], + 'server' => [ + 'marked_as_failed' => 'Palvelimen asennus on kesken, kokeile myöhemmin uudestaan.', + ], ]; diff --git a/lang/fi/notifications.php b/lang/fi/notifications.php new file mode 100644 index 0000000000..2a734a2116 --- /dev/null +++ b/lang/fi/notifications.php @@ -0,0 +1,18 @@ + 'Avaa Palvelin', + 'installation_completed' => 'Palvelimen Asennus Onnistui', + 'installation_failed' => 'Palvelimen Asennus Epäonnistui', + 'reinstallation_completed' => 'Palvelimen Uudelleenasennus Onnistui', + 'reinstallation_failed' => 'Palvelimen Uudelleenasennus Epäonnistui', + 'failed' => 'Epäonnistui', + 'user_added' => [ + 'title' => 'Lisätty palvelimeen', + 'body' => 'Sinut on lisätty käyttäjänä palvelimeen :server.', + ], + 'user_removed' => [ + 'title' => 'Poistettu palvelimelta', + 'body' => 'Sinut on poistettu käyttäjänä palvelimelta :server.', + ], +]; diff --git a/lang/fi/pagination.php b/lang/fi/pagination.php deleted file mode 100644 index e009000815..0000000000 --- a/lang/fi/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Edellinen', - 'next' => 'Seuraava »', -]; diff --git a/lang/fi/passwords.php b/lang/fi/passwords.php deleted file mode 100644 index da0093e42f..0000000000 --- a/lang/fi/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Salasanan on oltava vähintään 6 merkkiä pitkä ja vastata vahvistuskenttää.', - 'reset' => 'Salasanasi on palautettu!', - 'sent' => 'Olemme lähettäneet salasanasi palautuslinkin sähköpostitse!', - 'token' => 'Salasanan palautusavain on virheellinen.', - 'user' => 'Käyttäjää tällä sähköpostiosoitteella ei löytynyt.', -]; diff --git a/lang/fi/search.php b/lang/fi/search.php new file mode 100644 index 0000000000..cffed3cbb2 --- /dev/null +++ b/lang/fi/search.php @@ -0,0 +1,9 @@ + 'Anna vähintään kolme merkkiä aloittaaksesi haun.', + 'term' => [ + 'label' => 'Hakutermi', + 'description' => 'Syötä palvelimen nimi, UUID tai allokaatio aloittaaksesi haun.', + ], +]; diff --git a/lang/fi/server/users.php b/lang/fi/server/users.php deleted file mode 100644 index 1690571f9b..0000000000 --- a/lang/fi/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Mahdollistaa pääsyn WebSocketiin tälle palvelimelle.', - 'control_console' => 'Salli käyttäjän lähettää tietoja palvelimen konsolille.', - 'control_start' => 'Salli käyttäjän käynnistää palvelin instanssi.', - 'control_stop' => 'Salli käyttäjän pysäyttää palvelimen instanssi.', - 'control_restart' => 'Salli käyttäjän käynnistää palvelimen instanssi uudelleen.', - 'control_kill' => 'Salli käyttäjän tappaa palvelimen instanssi.', - 'user_create' => 'Salli käyttäjän luoda uusia käyttäjiä palvelimelle.', - 'user_read' => 'Salli käyttäjäoikeus tarkastella käyttäjiä jotka on liitetty tähän palvelimeen.', - 'user_update' => 'Salli käyttäjän muokata muita käyttäjiä jotka liittyvät tähän palvelimeen.', - 'user_delete' => 'Salli käyttäjän poistaa muita käyttäjiä, jotka on liitetty tähän palvelimeen.', - 'file_create' => 'Salli käyttäjäoikeuden luoda uusia tiedostoja ja kansioita.', - 'file_read' => 'Sallii käyttäjän nähdä tämän palvelimen instanssiin liittyvät tiedostot ja kansiot sekä tarkastella niiden sisältöä.', - 'file_update' => 'Salli käyttäjän päivittää palvelimeen liittyviä tiedostoja ja kansioita.', - 'file_delete' => 'Salli käyttäjän poistaa tiedostoja ja kansioita.', - 'file_archive' => 'Salli käyttäjän luoda tiedostoarkistoja ja purkaa olemassa olevat arkistot.', - 'file_sftp' => 'Salli käyttäjän suorittaa edellä mainitut tiedostotoiminnot SFTP-asiakkaan avulla.', - 'allocation_read' => 'Sallii pääsyn palvelimen allokoinnin hallintasivuille.', - 'allocation_update' => 'Sallii käyttäjän oikeuden tehdä muutoksia palvelimen allokaatioihin.', - 'database_create' => 'Sallii käyttäjän oikeuden luoda uuden tietokannan palvelimelle.', - 'database_read' => 'Sallii käyttäjän oikeuden tarkastella palvelimen tietokantoja.', - 'database_update' => 'Sallii käyttäjän oikeuden tehdä muutoksia tietokantaan. Jos käyttäjällä ei ole "Näytä salasana" käyttöoikeutta sekä, he eivät voi muokata salasanaa.', - 'database_delete' => 'Sallii käyttäjän oikeuden poistaa tietokannan instanssin.', - 'database_view_password' => 'Sallii käyttäjän oikeuden tarkastella tietokannan salasanaa järjestelmässä.', - 'schedule_create' => 'Sallii käyttäjän luoda uuden aikataulun palvelimelle.', - 'schedule_read' => 'Sallii käyttäjän oikeuden tarkastella aikatauluja palvelimelle.', - 'schedule_update' => 'Sallii käyttäjän oikeuden tehdä muutoksia olemassa olevaan palvelimen aikatauluun.', - 'schedule_delete' => 'Sallii käyttäjän poistaa aikataulun palvelimelta.', - ], -]; diff --git a/lang/fi/strings.php b/lang/fi/strings.php deleted file mode 100644 index 2d956273ec..0000000000 --- a/lang/fi/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Sähköposti', - 'email_address' => 'Sähköpostiosoite', - 'user_identifier' => 'Käyttäjätunnus tai Sähköposti', - 'password' => 'Salasana', - 'new_password' => 'Uusi salasana', - 'confirm_password' => 'Toista uusi salasana', - 'login' => 'Kirjaudu', - 'home' => 'Koti', - 'servers' => 'Palvelimet', - 'id' => 'ID', - 'name' => 'Nimi', - 'node' => 'Solmu', - 'connection' => 'Yhteys', - 'memory' => 'Muisti', - 'cpu' => 'CPU', - 'disk' => 'Levy', - 'status' => 'Tila', - 'search' => 'Hae', - 'suspended' => 'Keskeytetty', - 'account' => 'Tili', - 'security' => 'Turvallisuus', - 'ip' => 'IP-osoite', - 'last_activity' => 'Viimeisin toiminta', - 'revoke' => 'Hylkää', - '2fa_token' => 'Todennustunniste', - 'submit' => 'Lähetä', - 'close' => 'Sulje', - 'settings' => 'Asetukset', - 'configuration' => 'Konfiguraatio', - 'sftp' => 'SFTP', - 'databases' => 'Tietokannat', - 'memo' => 'Muistio', - 'created' => 'Luotu', - 'expires' => 'Vanhenee', - 'public_key' => 'Tunniste', - 'api_access' => 'Apin käyttöoikeus', - 'never' => 'ei koskaan', - 'sign_out' => 'Kirjaudu ulos', - 'admin_control' => 'Ylläpitäjän työkalut', - 'required' => 'Pakollinen', - 'port' => 'Portti', - 'username' => 'Käyttäjänimi', - 'database' => 'Tietokanta', - 'new' => 'Uusi', - 'danger' => 'Vaara', - 'create' => 'Luo', - 'select_all' => 'Valitse kaikki', - 'select_none' => 'Älä valitse mitään', - 'alias' => 'Alias', - 'primary' => 'Ensisijainen', - 'make_primary' => 'Aseta ensisijaiseksi', - 'none' => 'Ei mitään', - 'cancel' => 'Peruuta', - 'created_at' => 'Luotu', - 'action' => 'Toiminto', - 'data' => 'Tiedot', - 'queued' => 'Jonossa', - 'last_run' => 'Viimeisin suoritus', - 'next_run' => 'Seuraava Suoritus', - 'not_run_yet' => 'Ei Suoritettu Vielä', - 'yes' => 'Kyllä', - 'no' => 'Ei', - 'delete' => 'Poista', - '2fa' => '2FA', - 'logout' => 'Kirjaudu ulos', - 'admin_cp' => 'Ylläpitäjän Ohjauspaneeli', - 'optional' => 'Valinnainen', - 'read_only' => 'Vain luku', - 'relation' => 'Relaatio', - 'owner' => 'Omistaja', - 'admin' => 'Ylläpitäjä', - 'subuser' => 'Alikäyttäjä', - 'captcha_invalid' => 'Annettu captcha ei kelpaa.', - 'tasks' => 'Tehtävät', - 'seconds' => 'Sekuntia', - 'minutes' => 'Minuuttia', - 'under_maintenance' => 'Huollossa', - 'days' => [ - 'sun' => 'Sunnuntai', - 'mon' => 'Maanantai', - 'tues' => 'Tiistai', - 'wed' => 'Keskiviikko', - 'thurs' => 'Torstai', - 'fri' => 'Perjantai', - 'sat' => 'Lauantai', - ], - 'last_used' => 'Viimeksi käytetty', - 'enable' => 'Ota käyttöön', - 'disable' => 'Poista käytöstä', - 'save' => 'Tallenna', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/fi/validation.php b/lang/fi/validation.php index 80c518937e..cd683a8dc1 100644 --- a/lang/fi/validation.php +++ b/lang/fi/validation.php @@ -28,7 +28,7 @@ 'string' => ':attribute on oltava :min ja :max merkin väliltä.', 'array' => ':attribute tulee sisältää :min ja :max väliltä olioita.', ], - 'boolean' => ':attribute kentän tulee olla true tai false.', + 'confirmed' => ':attribute vahvistus ei täsmää.', 'date' => ':attribute ei ole oikea päivämäärä.', 'date_format' => ':attribute ei täsmää muodon :format kanssa.', @@ -36,13 +36,13 @@ 'digits' => ':attribute on oltava :digits numeroa pitkä.', 'digits_between' => ':attribute on oltava pituudeltaan :min ja :max numeron väliltä.', 'dimensions' => ':attribute kuvan mitat ovat virheelliset.', - 'distinct' => ':attribute kentässä on duplikaatti arvo.', + 'email' => ':attribute tulee olla kelvollinen sähköpostiosoite.', - 'exists' => 'Valittu :attribute on virheellinen.', + 'file' => ':attribute tulee olla tiedosto.', 'filled' => ':attribute kenttä on pakollinen.', 'image' => ':attribute on oltava kuva.', - 'in' => 'Valittu :attribute on virheellinen.', + 'in_array' => ':attribute kenttää ei ole olemassa :other:ssa.', 'integer' => ':attribute tulee olla kokonaisluku.', 'ip' => ':attribute tulee olla kelvollinen IP-osoite.', @@ -61,17 +61,13 @@ 'string' => ':attribute tulee olla vähintään :min merkkiä.', 'array' => ':attribute täytyy sisältää vähintään :min kohdetta.', ], - 'not_in' => 'Valittu :attribute on virheellinen.', + 'numeric' => ':attribute tulee olla numero.', - 'present' => ':attribute kenttä on oltava läsnä.', + 'regex' => ':attribute muoto on virheellinen.', - 'required' => ':attribute kenttä on pakollinen.', - 'required_if' => ':attribute kenttä on pakollinen kun :other on :value.', - 'required_unless' => ':attribute kenttä on pakollinen, ellei :values sisällä :other.', - 'required_with' => ':attribute kenttä on pakollinen kun :values on läsnä.', + 'required_with_all' => ':attribute kenttä on pakollinen kun :values ovat läsnä.', - 'required_without' => ':attribute kenttä on pakollinen kun :values ei ole läsnä.', - 'required_without_all' => ':attribute kenttä on pakollinen kun mikään :values ei ole läsnä.', + 'same' => ':attribute ja :other tulee täsmätä.', 'size' => [ 'numeric' => ':attribute on oltava :size.', @@ -81,8 +77,7 @@ ], 'string' => ':attribute on oltava merkkijono.', 'timezone' => ':attribute tulee olla validi aikavyöhyke.', - 'unique' => ':attribute on jo käytössä.', - 'uploaded' => ':attribute lataus epäonnistui.', + 'url' => ':attribute muoto on virheellinen.', /* diff --git a/lang/fr/activity.php b/lang/fr/activity.php index cddbedb774..9ac0712b63 100644 --- a/lang/fr/activity.php +++ b/lang/fr/activity.php @@ -11,27 +11,27 @@ 'fail' => 'Échec de la connexion', 'success' => 'Connecté', 'password-reset' => 'Réinitialisation du mot de passe', - 'reset-password' => 'Demande de réinitialisation de mot de passe', 'checkpoint' => 'Authentification à deux facteurs demandée', - 'recovery-token' => 'Jeton de récupération à deux facteurs utilisé', - 'token' => 'Défi à deux facteurs résolu', - 'ip-blocked' => 'Demande bloquée provenant d\'une adresse IP non répertoriée pour :identifier', + 'recovery-token' => 'Jeton de récupération d\'authentification à deux facteurs utilisé', + 'token' => 'Défi d\'authentification à deux facteurs résolu', + 'ip-blocked' => 'Requête bloquée provenant d\'une adresse IP non répertoriée pour :identifier', 'sftp' => [ 'fail' => 'Échec de la connexion SFTP', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Changement d\'adresse électronique de :old à :new', + 'username-changed' => 'Nom d\'utilisateur modifié de :old à :new', + 'email-changed' => 'E-mail modifié de :old à :new', 'password-changed' => 'Mot de passe modifié', ], 'api-key' => [ - 'create' => 'Création d\'une nouvelle clé API :identifiant', - 'delete' => 'Clé API supprimée :identifiant', + 'create' => 'Création d\'une nouvelle clé d\'API :identifiant', + 'delete' => 'Suppression d\'une clé d\'API :identifier', ], 'ssh-key' => [ - 'create' => 'Ajout de la clé SSH :fingerprint au compte', - 'delete' => 'Suppression de la clé SSH :fingerprint du compte', + 'create' => 'Ajout de la clé SSH :fingerprint au compte', + 'delete' => 'Suppression de la clé SSH :fingerprint du compte', ], 'two-factor' => [ 'create' => 'Activation de l\'authentification à deux facteurs', @@ -39,92 +39,87 @@ ], ], 'server' => [ - 'reinstall' => 'Serveur réinstallé', 'console' => [ - 'command' => '":command" exécutée sur le serveur', + 'command' => '":command" exécutée sur le serveur', ], 'power' => [ 'start' => 'Le serveur a été démarré', 'stop' => 'Le serveur a été arrêté', 'restart' => 'Le serveur a été redémarré', - 'kill' => 'Processus du serveur tué', + 'kill' => 'Le serveur a été arrêté de force', ], 'backup' => [ - 'download' => 'Sauvegarde :name téléchargée', - 'delete' => 'Sauvegarde :name supprimée', - 'restore' => 'Sauvegarde :name restaurée (fichiers supprimés: :truncate)', - 'restore-complete' => 'Restauration de la sauvegarde :name terminée', - 'restore-failed' => 'Échec de la restauration de la sauvegarde :name', - 'start' => 'Lancement d\'une nouvelle sauvegarde :name', - 'complete' => 'La sauvegarde :name a été marquée comme terminée', - 'fail' => 'La sauvegarde :name a échoué', - 'lock' => 'La sauvegarde :name est verrouillée', - 'unlock' => 'La sauvegarde :name a été déverrouillée', + 'download' => 'Sauvegarde :name téléchargée', + 'delete' => 'Sauvegarde :name supprimée', + 'restore' => 'Sauvegarde :name restaurée (fichiers supprimés : :truncate)', + 'restore-complete' => 'Restauration de la sauvegarde :name terminée', + 'restore-failed' => 'Échec de la restauration de la sauvegarde :name', + 'start' => 'Lancement d\'une nouvelle sauvegarde :name', + 'complete' => 'La sauvegarde :name a été marquée comme terminée', + 'fail' => 'La sauvegarde :name a échoué', + 'lock' => 'La sauvegarde :name a été verrouillée', + 'unlock' => 'La sauvegarde :name a été déverrouillée', + 'rename' => 'Sauvegarde renommée de ":old_name" en ":new_name', ], 'database' => [ - 'create' => 'Nouvelle base de données créée :name', - 'rotate-password' => 'Mot de passe renouvelé pour la base de données :name', - 'delete' => 'Base de données :name supprimée', + 'create' => 'Nouvelle base de données créée :name', + 'rotate-password' => 'Mot de passe renouvelé pour la base de données :name', + 'delete' => 'Base de données :name supprimée', ], 'file' => [ - 'compress_one' => ':directory:file compressé', - 'compress_other' => ':count fichiers compressés dans :directory', - 'read' => 'Consulté le contenu de :file', - 'copy' => 'Copie de :file créée', - 'create-directory' => 'Répertoire :directory:name créé', - 'decompress' => 'Décompressé :files dans :directory', - 'delete_one' => 'Supprimé :directory:files.0', - 'delete_other' => ':count fichiers supprimés dans :directory', - 'download' => ':file téléchargé', - 'pull' => 'Téléchargé un fichier distant depuis :url vers :directory', - 'rename_one' => ':directory:files.0.from renommé en :directory:files.0.to', - 'rename_other' => ':count fichiers renommés dans :directory', - 'write' => 'Nouveau contenu :file écrit', - 'upload' => 'Début du téléversement', - 'uploaded' => 'Ajouté (upload) :directory:file', + 'compress' => 'Compression de :directory:files|:count fichiers compressés dans :directory', + 'read' => 'Consulté le contenu de :file', + 'copy' => 'Copie de :file créée', + 'create-directory' => 'Répertoire :directory:name créé', + 'decompress' => 'Le fichier :file a été décompressée dans :directory', + 'delete' => 'Suppression de :directory:files|:count fichiers supprimer dans :directory', + 'download' => 'Téléchargement en cours de :file', + 'pull' => 'Téléchargé un fichier distant depuis :url vers :directory', + 'rename' => 'Déplacé/renommé :from to :to|Déplacé/ Renommé :count files in :directory', + 'write' => 'Nouveau contenu écrit dans le fichier :file', + 'upload' => 'Début de l\'envoi de fichier', + 'uploaded' => ':directory:file envoyée', ], 'sftp' => [ - 'denied' => 'Accès SFTP bloqué en raison d\'autorisations', - 'create_one' => ':files.0 créés', - 'create_other' => ':count nouveaux fichiers ont été créés', - 'write_one' => 'Modification du contenu de :files.0', - 'write_other' => ':count fichiers ont été modifiés', - 'delete_one' => 'Suppression de :files.0', - 'delete_other' => 'Suppression de :count fichiers', - 'create-directory_one' => 'Création du dossier :files.0', - 'create-directory_other' => ':count dossier ont été créé', - 'rename_one' => 'Le fichier a été renommé de :files.0.from à :files.0.to', - 'rename_other' => ':count fichiers ont été renommés ou déplacés', + 'denied' => 'Accès SFTP bloqué à cause des permissions', + 'create' => 'Création du fichier :files|:count nouveaux fichiers ont été crées', + 'write' => 'Modification du fichier :files|Le contenu de :count fichiers a été modifié', + 'delete' => 'Suppression du fichier :files|Suppression de :count fichiers', + 'create-directory' => 'Création du dossier :files|Création de :count dossiers', + 'rename' => 'Le fichier a été renommé de :from à :to|:count fichiers ont été renommés ou déplacer', ], 'allocation' => [ - 'create' => ':allocation a été ajoutée au serveur', - 'notes' => 'Mise à jour des notes pour :allocation de ":old" à ":new"', - 'primary' => 'Changement de :allocation en tant qu\'allocation principale du serveur', - 'delete' => 'Suppression de l\'allocation :allocation', + 'create' => ':allocation a été ajoutée au serveur', + 'notes' => 'Mise à jour des notes pour :allocation de ":old" à ":new"', + 'primary' => 'Change de :allocation en tant qu\'allocation principale du serveur', + 'delete' => 'Suppression de l\'allocation :allocation', ], 'schedule' => [ - 'create' => 'Création de la planification :name', - 'update' => 'Modification de la planification :name', - 'execute' => 'Exécution manuelle de la planification :name', - 'delete' => 'Suppression de la planification :name', + 'create' => 'Création de la planification :name', + 'update' => 'Mise à jour de la planification :name', + 'execute' => 'Exécution manuelle de la planification :name', + 'delete' => 'Suppression de la planification :name', ], 'task' => [ - 'create' => 'Création d\'une nouvelle tâche ":action" pour la planification :name', - 'update' => 'Modification de la tâche ":action" pour la planification :name', - 'delete' => 'Suppression de la planification :name', + 'create' => 'Création de l\'action ":action" pour la planification :name', + 'update' => 'Mise à jour de l\'action ":action" pour la planification :name', + 'delete' => 'Mise à jour de l\'action ":action" pour la planification :name', ], 'settings' => [ - 'rename' => 'Le serveur a été renommé de :old à :new', - 'description' => 'La description du serveur a été changée de :old à :new', + 'rename' => 'Le serveur a été renommé de ":old" à ":new"', + 'description' => 'La description du serveur a changé de ":old" à ":new"', + 'reinstall' => 'Serveur réinstallé', ], 'startup' => [ - 'edit' => 'La variable ":variable" a été changée de ":old" à ":new"', - 'image' => 'L\'image Docker a été changée de :old à :new', + 'edit' => 'Changement de la variable :variable de ":old" à ":new"', + 'image' => 'Mise à jour de l\'image Docker pour le serveur de :old à :new', + 'command' => 'Commande de démarrage mise à jour pour le serveur de :old à :new', ], 'subuser' => [ - 'create' => 'Ajout de :email en tant que sous-utilisateur', - 'update' => 'Modification des permissions du sous-utilisateur :email', - 'delete' => 'Suppression du sous-utilisateur :email', + 'create' => 'Ajout de :email en tant que sous-utilisateur', + 'update' => 'Modification des permissions du sous-utilisateur :email', + 'delete' => 'Suppression du sous-utilisateur :email', ], + 'crashed' => 'Le serveur a planté', ], ]; diff --git a/lang/fr/admin/apikey.php b/lang/fr/admin/apikey.php new file mode 100644 index 0000000000..57b88c59aa --- /dev/null +++ b/lang/fr/admin/apikey.php @@ -0,0 +1,27 @@ + 'Clés API de l\'application', + 'empty' => 'Aucunes clés API', + 'whitelist' => 'Adresses IP de la liste blanche', + 'whitelist_help' => 'Les clés API peuvent être limitées pour ne fonctionner qu\'à partir d\'adresses IPv4 spécifiques. Entrez chaque adresse sur une nouvelle ligne.', + 'whitelist_placeholder' => 'Exemple : 127.0.0.1 ou 192.168.1.1', + 'description' => 'Description', + 'description_help' => 'Une brève description de ce à quoi cette clé est destinée.', + 'nav_title' => 'Clés API', + 'model_label' => 'Clés API de l\'application', + 'model_label_plural' => 'Clés API de l\'application', + 'table' => [ + 'key' => 'Clé', + 'description' => 'Description', + 'last_used' => 'Dernière utilisation', + 'created' => 'Créé(e)', + 'created_by' => 'Créé par', + 'never_used' => 'Jamais utilisé', + ], + 'permissions' => [ + 'none' => 'Aucun', + 'read' => 'Lecture', + 'read_write' => 'Lecture / Écriture', + ], +]; diff --git a/lang/fr/admin/dashboard.php b/lang/fr/admin/dashboard.php new file mode 100644 index 0000000000..ddb972af4f --- /dev/null +++ b/lang/fr/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Bienvenue sur Pelican!', + 'version' => 'Version: :version', + 'advanced' => 'Avancé', + 'server' => 'Serveur', + 'user' => 'Utilisateur', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informations pour les développeurs', + 'content' => 'Merci d\'avoir essayé la version de développement !', + 'extra_note' => 'Si vous rencontrez des problèmes, veuillez les signaler sur GitHub.', + 'button_issues' => 'Signaler un problème', + 'button_features' => 'Discuter des fonctionnalités', + ], + 'intro-update-available' => [ + 'heading' => 'Une mise à jour est disponible', + 'content' => ':latestVersion est maintenant disponible ! Lisez notre documentation pour mettre à jour votre Panneau.', + 'button_changelog' => 'Quoi de neuf ?', + ], + 'intro-no-update' => [ + 'heading' => 'Votre panneau est à jour', + 'content' => 'Vous utilisez la version :version de Pelican. Votre panel est à jour !', + ], + 'intro-first-node' => [ + 'heading' => 'Aucun nœud détecté', + 'content' => "Il semble que vous n'ayez pas encore de nœuds configurés, mais pas d'inquiétude, vous pouvez cliquer sur le bouton d'action pour créer votre premier nœud!", + 'extra_note' => 'Si vous rencontrez des problèmes, merci de les signaler sur GitHub.', + 'button_label' => 'Créer le premier nœud dans Pelican', + ], + 'intro-support' => [ + 'heading' => 'Soutenir Pelican', + 'content' => 'Merci d\'utiliser Pelican, cela n\'aurait pas été possible sans votre soutien, celui de nos contributeurs, et de tous nos autres partisans !', + 'extra_note' => 'Nous apprécions tout soutien, quel qu\'il soit, de la part de tout le monde.', + 'button_translate' => 'Aider à traduire', + 'button_donate' => 'Faire un don', + ], + 'intro-help' => [ + 'heading' => 'Besoin d’aide ?', + 'content' => 'Jetez d\'abord un œil à la documentation ! Si vous avez toujours besoin d\'aide, rejoignez notre serveur Discord !', + 'button_docs' => 'Lire la documentation', + ], + ], +]; diff --git a/lang/fr/admin/databasehost.php b/lang/fr/admin/databasehost.php new file mode 100644 index 0000000000..56592ba6d3 --- /dev/null +++ b/lang/fr/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Hôte de base de données', + 'model_label' => 'Hôte de base de données', + 'model_label_plural' => 'Hôte de base de données', + 'table' => [ + 'database' => 'Base de données', + 'name' => 'Nom', + 'host' => 'Hôte', + 'port' => 'Port', + 'name_helper' => 'Laisser ce champ vide va générer automatiquement un nom aléatoire', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'remote' => 'Connexions depuis', + 'remote_helper' => 'Où les connexions doivent être autorisées. Laissez vide pour autoriser les connexions depuis n\'importe où.', + 'max_connections' => 'Nombre de connexions maximum', + 'created_at' => 'Créé le', + 'connection_string' => 'Chaîne de connexion JDBC', + ], + 'error' => 'Erreur de connexion à l\'hôte', + 'host' => 'Hôte', + 'host_help' => 'L’adresse IP ou le nom de domaine qui doit être utilisé lorsque vous tentez de vous connecter à cet hôte MySQL depuis ce panel pour créer de nouvelles bases de données.', + 'port' => 'Port', + 'port_help' => 'Le port sur lequel MySQL est en cours d\'exécution pour cette machine.', + 'max_database' => 'Nombre maximum de bases de données', + 'max_databases_help' => 'Le nombre maximum de bases de données pouvant être créées sur cet hôte. Si la limite est atteinte, aucune nouvelle base de données ne peut être créée sur cet hôte. Le vide est illimité.', + 'display_name' => 'Nom affiché', + 'display_name_help' => 'L’adresse IP ou le nom de domaine qui doit être affiché au client final.', + 'username' => 'Nom d\'utilisateur', + 'username_help' => 'Nom d’utilisateur d’un compte qui a suffisamment de permissions pour créer de nouveaux utilisateurs et bases de données sur le système.', + 'password' => 'Mot de passe', + 'password_help' => 'Le mot de passe pour l\'utilisateur de la base de données.', + 'linked_nodes' => 'Nœud lié', + 'linked_nodes_help' => 'Ce paramètre n’est défini par défaut que pour cet hôte de base de données lors de l’ajout d’une base de données à un serveur sur le nœud sélectionné.', + 'connection_error' => 'Erreur de connexion à l’hôte de la base de données', + 'no_database_hosts' => 'Aucun hôte de base de données', + 'no_nodes' => 'Aucun noeud', + 'delete_help' => 'L’hôte de base de données possède des bases de données', + 'unlimited' => 'Illimité', + 'anywhere' => 'N\'importe où', + + 'rotate' => 'Rotation', + 'rotate_password' => 'Réinitialiser le mot de passe', + 'rotated' => 'Mot de passe tourné', + 'rotate_error' => 'La rotation du mot de passe a échoué', + 'databases' => 'Bases de données', + + 'setup' => [ + 'preparations' => 'Préparations', + 'database_setup' => 'Configuration de la base de données', + 'panel_setup' => 'Configuration du panel', + + 'note' => 'Actuellement, seules les bases de données MySQL / MariaDB sont prises en charge pour les hôtes de base de données!', + 'different_server' => 'Le panel et la base de données sont-elles pas sur le même serveur ?', + + 'database_user' => 'Utilisateur de la base de données', + 'cli_login' => 'Utilisez mysql -u root -p pour accéder à mysql cli.', + 'command_create_user' => 'Commande pour créer l\'utilisateur', + 'command_assign_permissions' => 'Commande pour assigner les permissions', + 'cli_exit' => 'Pour sortir de mysql cli, exécutez exit.', + 'external_access' => 'Accès externe', + 'allow_external_access' => ' +

Il est probable que vous aurez besoin d\'autoriser l\'accès externe à cette instance MySQL afin de permettre aux serveurs de s\'y connecter

+
+

Pour ce faire, ouvrez my.cnf, qui varie en fonction de l\'emplacement du système d\'exploitation et de la façon dont MySQL a été installé. Vous pouvez taper find /etc -iname my.cnf pour le localiser.

+
+

Ouvrez my.cnf, ajouter le texte ci-dessous au bas du fichier et l\'enregistrer :
+ [mysqld]
bind-address=0.0.0.0.

+
+

Redémarrez MySQL / MariaDB pour appliquer ces modifications. Cela remplacera la configuration par défaut de MySQL, qui par défaut n\'acceptera que les requêtes de localhost. La mise à jour de cette option permettra des connexions sur toutes les interfaces, et donc des connexions externes. Assurez-vous d\'autoriser le port MySQL (par défaut 3306) dans votre pare-feu.

+ ', + ], +]; diff --git a/lang/fr/admin/egg.php b/lang/fr/admin/egg.php new file mode 100644 index 0000000000..2009e0d9f3 --- /dev/null +++ b/lang/fr/admin/egg.php @@ -0,0 +1,110 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => 'Configuration', + 'process_management' => 'Gestion des processus', + 'egg_variables' => 'Variable de l\'egg', + 'install_script' => 'Script d\'installation', + ], + 'import' => [ + 'file' => 'Fichier', + 'url' => 'URL', + 'image_url' => 'URL de l\'image', + 'image_error' => 'Impossible de récupérer l\'image', + 'image_too_large' => 'L\'image est trop grande. La limite est de 1024 Ko', + 'egg_help' => 'Ceci doit être le fichier .json brut ( egg-minecraft.json )', + 'url_help' => 'Les URL doivent pointer directement vers le fichier .json brut', + 'add_url' => 'Nouvelle URL', + 'import_failed' => 'Échec de l\'importation', + 'import_success' => 'Importation réussie', + 'github' => 'Ajouter depuis Github', + 'refresh' => 'Actualiser', + 'import_image' => 'Importer une image', + 'no_local_ip' => 'Les adresses IP locales ne sont pas autorisées', + 'unsupported_format' => 'Format non pris en charge. Les formats supportés sont : :formats', + 'invalid_url' => 'L\'URL spécifiée est invalide', + 'image_deleted' => 'Image Supprimée', + 'no_image' => 'Aucune Image Fournie', + 'image_updated' => 'Image mise à jour', + ], + 'export' => [ + 'modal' => 'Comme voulez-vous exporter :egg?', + 'as' => 'Comme .:format', + ], + 'in_use' => 'En Cours d\'Utilisation', + 'servers' => 'Serveurs', + 'name' => 'Nom', + 'egg_uuid' => 'UUID de l\'egg', + 'egg_id' => 'ID de l\'egg', + 'name_help' => 'Un nom simple et facile à lire à utiliser comme identifiant pour cet egg.', + 'author' => 'Auteur', + 'uuid_help' => 'Il s\'agit de l\'identifiant unique global pour cet egg que wings utilise comme identifiant.', + 'author_help' => 'L\'auteur de cette version de l\'egg.', + 'author_help_edit' => 'L\'auteur de cette version de l\'egg. Le téléchargement d\'une nouvelle configuration à partir d\'un autre auteur changera cela.', + 'description' => 'Description', + 'description_help' => 'Une description de cet egg qui sera affichée dans le panel selon les besoins.', + 'add_startup' => 'Ajouter une commande de démarrage', + 'startup_command' => 'Commande', + 'startup_commands' => 'Commandes de démarrage', + 'startup_name' => 'Nom d\'affichage', + 'startup_help' => 'Les commandes de démarrages disponibles aux serveurs utilisant cet œuf. La première est celle par défaut.', + 'file_denylist' => 'Liste de refus de fichier', + 'file_denylist_help' => 'Une liste de fichiers que l\'utilisateur n\'est pas autorisé à modifier.', + 'features' => 'Fonctionnalités', + 'force_ip' => 'Forcer l\'adresse IP sortante', + 'force_ip_help' => 'Force tout le trafic réseau sortant à avoir son adresse IP source traduite (NAT) avec l\'IP de l\'allocation principale du serveur. +Nécessaire pour que certains jeux fonctionnent correctement lorsque le nœud possède plusieurs adresses IP publiques. +L\'activation de cette option désactivera le réseau interne pour tous les serveurs utilisant cet Œuf, les empêchant ainsi d\'accéder à d\'autres serveurs sur le même nœud via le réseau interne.', + 'tags' => 'Tags', + 'update_url' => 'Mettre à jour l\'URL', + 'update_url_help' => 'Les URL doivent pointer directement vers le fichier .json brut', + 'add_image' => 'Ajouter une image Docker', + 'docker_images' => 'Images Docker', + 'docker_name' => 'Nom de l\'image', + 'docker_uri' => 'URI de l\'image', + 'docker_help' => 'Les images Docker disponibles aux serveurs utilisant ces œufs. La première est celle par défaut.', + + 'stop_command' => 'Commande d\'arrêt', + 'stop_command_help' => 'La commande qui doit être envoyée aux processus du serveur pour les arrêter gracieusement. Si vous avez besoin d\'envoyer un SIGINT, vous devez entrer ^C ici.', + 'copy_from' => 'Copier les paramètres depuis', + 'copy_from_help' => 'Si vous souhaitez utiliser les paramètres par défaut à partir d\'un autre Oeuf, sélectionnez-le dans le menu ci-dessus.', + 'none' => 'Aucun', + 'start_config' => 'Démarrer la configuration', + 'start_config_help' => 'Liste des valeurs que le démon devrait rechercher lors du démarrage d\'un serveur pour déterminer la complétion.', + 'config_files' => 'Fichiers de configuration', + 'config_files_help' => 'Ceci devrait être une représentation JSON des fichiers de configuration à modifier et quelles parties doivent être modifiées.', + 'log_config' => 'Configuration des logs', + 'log_config_help' => 'Cela devrait être une représentation JSON de l\'endroit où les fichiers journaux sont stockés, et si le démon doit ou non créer des journaux personnalisés.', + + 'environment_variable' => 'Variable d\'environnement', + 'default_value' => 'Valeur par Défaut', + 'user_permissions' => 'Permissions d\'un utilisateur', + 'viewable' => 'Visible', + 'editable' => 'Modifiable', + 'rules' => 'Règles', + 'add_new_variable' => 'Ajouter une nouvelle variable', + + 'error_unique' => 'La variable avec ce nom existe déjà', + 'error_required' => 'Le champ de variable d\'environnement est requis.', + 'error_reserved' => 'Cette variable d\'environnement est réservée et ne peut pas être utilisée.', + + 'script_from' => 'Script à partir de', + 'script_container' => 'Conteneur de script', + 'script_entry' => 'Saisie de script', + 'script_install' => 'Installer le script', + 'no_eggs' => 'Aucun œuf', + 'no_servers' => 'Aucun serveur!', + 'no_servers_help' => 'Aucun serveur n\'est assigné à cet œuf.', + + 'update' => 'Mise à Jour| Mettre à jour la sélection', + 'updated' => 'Oeuf mis à jour|:count/:total Oeufs mis à jour', + 'updated_failed' => ':count a échoué', + 'updated_skipped' => ':count ignorée', + 'update_question' => 'Êtes-vous sûr de vouloir mettre à jour cet œuf?|Êtes-vous sûr de vouloir mettre à jour les œufs sélectionnés ?', + 'update_description' => 'Si vous avez apporté des modifications à l\'oeuf, elles seront écrasées!|Si vous avez apporté des modifications aux oeufs, elles seront écrasées !', + 'no_updates' => 'Aucune mise à jour pour les oeufs sélectionnés disponible', +]; diff --git a/lang/fr/admin/eggs.php b/lang/fr/admin/eggs.php deleted file mode 100644 index bf1d57f0cc..0000000000 --- a/lang/fr/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Cet Œuf et ses variables ont été importés avec succès.', - 'updated_via_import' => 'Cet Œuf a été mis à jour en utilisant le fichier fourni.', - 'deleted' => 'L\'Œuf demandé a été supprimé du panneau.', - 'updated' => 'La configuration de l\'œuf a été mise à jour avec succès.', - 'script_updated' => 'Le script d\'installation d\'oeuf a été mis à jour et s\'exécutera chaque fois que les serveurs sont installés.', - 'egg_created' => 'Un nouvel œuf a été créé avec succès. Vous devrez redémarrer tous les démons en cours d\'exécution pour appliquer ce nouvel œuf.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'La variable ":variable" a été supprimée et ne sera plus disponible pour les serveurs une fois reconstruits.', - 'variable_updated' => 'La variable ":variable" a été mise à jour. Vous devrez reconstruire tous les serveurs utilisant cette variable pour appliquer les modifications.', - 'variable_created' => 'La nouvelle variable a été créée et affectée à cet œuf.', - ], - ], -]; diff --git a/lang/fr/admin/health.php b/lang/fr/admin/health.php new file mode 100644 index 0000000000..e9e6502d3d --- /dev/null +++ b/lang/fr/admin/health.php @@ -0,0 +1,60 @@ + 'Santé', + 'results_refreshed' => 'Les résultats du bilan de santé ont été mis à jour', + 'checked' => 'Résultats vérifiés à partir de :time', + 'refresh' => 'Actualiser', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'OK', + 'failed_retrieve' => 'Impossible de définir ou de récupérer une valeur de cache de l\'application.', + 'failed' => 'Une exception est survenue avec le cache de l\'application : :error', + ], + 'database' => [ + 'label' => 'Base de données', + 'ok' => 'OK', + 'failed' => 'Impossible de se connecter à la base de données: :error', + ], + 'debugmode' => [ + 'label' => 'Mode de débogage', + 'ok' => 'Le mode débogage est désactivé', + 'failed' => 'Le mode de débogage devait être :expected, mais était en fait :actual', + ], + 'environment' => [ + 'label' => 'Environnement', + 'ok' => 'Ok, réglé sur :actual', + 'failed' => 'L\'environnement est défini à :actual , attendu :expected', + ], + 'nodeversions' => [ + 'label' => 'Version du nœud', + 'ok' => 'Les nœuds sont à jour', + 'failed' => ':outdated/:all Nodes sont obsolètes', + 'no_nodes_created' => 'Aucun noeud créé', + 'no_nodes' => 'Aucun noeud', + 'all_up_to_date' => 'Tout est à jour', + 'outdated' => ':outdated/:all obsolète', + ], + 'panelversion' => [ + 'label' => 'Version du panel', + 'ok' => 'Votre panel est à jour', + 'failed' => 'La version installée est :currentVersion mais la dernière est :latestVersion', + 'up_to_date' => 'À jour', + 'outdated' => 'Obsolète', + ], + 'schedule' => [ + 'label' => 'Planifier', + 'ok' => 'OK', + 'failed_last_ran' => 'La dernière exécution du calendrier a été plus de :time minutes il y a plus de :time', + 'failed_not_ran' => 'Le calendrier n\'a pas encore été exécuté.', + ], + 'useddiskspace' => [ + 'label' => 'Espace disque', + ], + ], + 'checks' => [ + 'successful' => 'Succès', + 'failed' => 'Échec', + ], +]; diff --git a/lang/fr/admin/log.php b/lang/fr/admin/log.php new file mode 100644 index 0000000000..12056a243e --- /dev/null +++ b/lang/fr/admin/log.php @@ -0,0 +1,26 @@ + 'Super ! Aucune erreur !', + 'total_logs' => 'Logs totaux', + 'error' => 'Erreur', + 'warning' => 'Avertissement', + 'notice' => 'Remarque', + 'info' => 'Information', + 'debug' => 'Débogage', + 'navigation' => [ + 'panel_logs' => 'Logs du Panel', + ], + 'actions' => [ + 'upload_logs' => 'Envoyer les logs ?', + 'upload_logs_description' => 'Ceci enverra :file vers :url Êtes-vous sûr de vouloir effectuer cette action ?', + 'view_logs' => 'Voir les Logs', + 'log_not_found' => 'Log introuvable !', + 'log_not_found_description' => 'Impossible de trouver le log pour :filename', + 'failed_to_upload' => 'Échec du téléchargement.', + 'failed_to_upload_description' => 'Status HTTP : :status', + 'log_upload' => 'Logs envoyés !', + 'log_upload_action' => 'Voir le Log', + 'upload_tooltip' => 'Envoyer vers :url', + ], +]; diff --git a/lang/fr/admin/mount.php b/lang/fr/admin/mount.php new file mode 100644 index 0000000000..e461a3720d --- /dev/null +++ b/lang/fr/admin/mount.php @@ -0,0 +1,30 @@ + 'Montages', + 'model_label' => 'Monter', + 'model_label_plural' => 'Montages', + 'name' => 'Nom', + 'name_help' => 'Nom unique utilisé pour séparer ce montage d\'un autre.', + 'source' => 'Source', + 'source_help' => 'Chemin du fichier sur le système hôte à monter vers un conteneur.', + 'target' => 'Cible', + 'target_help' => 'Là où le support est accessible à l\'intérieur d\'un conteneur.', + 'read_only' => 'Lecture seule ?', + 'read_only_help' => 'La monture est-elle en lecture seule dans le conteneur ?', + 'description' => 'Description', + 'description_help' => 'Une description plus longue pour cette Monture', + 'no_mounts' => 'Aucune montagne', + 'eggs' => 'Œufs', + 'nodes' => 'Nœuds', + 'toggles' => [ + 'writable' => 'Écriture autorisée', + 'read_only' => 'Lecture seule', + ], + 'table' => [ + 'name' => 'Nom', + 'all_eggs' => 'Tous les eggs', + 'all_nodes' => 'Tous les nœuds', + 'read_only' => 'Lecture seule', + ], +]; diff --git a/lang/fr/admin/node.php b/lang/fr/admin/node.php index a1676324b3..b4fd11da1c 100644 --- a/lang/fr/admin/node.php +++ b/lang/fr/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'Le nom de domaine ou l\'adresse IP fournie ne correspond pas à une adresse IP valide.', - 'fqdn_required_for_ssl' => 'Un nom de domaine qui pointe vers une adresse IP publique est nécessaire pour utiliser SSL sur ce nœud.', + 'nav_title' => 'Nœuds', + 'model_label' => 'Nœud', + 'model_label_plural' => 'Nœuds', + 'create' => 'Créer un noeud', + 'tabs' => [ + 'overview' => 'Vue d\'ensemble', + 'basic_settings' => 'Réglages de base', + 'advanced_settings' => 'Réglages avancés', + 'config_file' => 'Fichier de configuration', + 'diagnostics' => 'Diagnostics', ], - 'notices' => [ - 'allocations_added' => 'Les allocations ont été ajoutées à ce nœud.', - 'node_deleted' => 'Le nœud a été supprimé du panneau avec succès.', - 'node_created' => 'Nouveau nœud créé avec succès. Vous pouvez configurer automatiquement ce dernier sur cette machine en allant dans l\'onglet \'Configuration\'. Avant de pouvoir ajouter des serveurs, vous devez d\'abord allouer au moins une adresse IP et un port.', - 'node_updated' => 'Les informations sur le nœud ont été mises à jour. Si des paramètres ont été modifiés, vous devrez le redémarrer le wings pour que ces modifications prennent effet.', - 'unallocated_deleted' => 'Suppression de tous les ports non alloués pour :ip.', + 'table' => [ + 'health' => 'Santé', + 'name' => 'Nom', + 'address' => 'Adresse', + 'public' => 'Public', + 'servers' => 'Serveurs', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Eggs', + 'owner' => 'Propriétaire', + 'allocation_notes' => 'Notes', + 'no_notes' => 'Pas de notes', ], + 'node_info' => 'Informations sur le nœud', + 'wings_version' => 'Version de Wings', + 'cpu_threads' => 'Tâches CPU', + 'architecture' => 'Architecture', + 'kernel' => 'Kernel', + 'unknown' => 'Inconnu', + 'latest' => 'Dernières ', + 'node_uuid' => 'Identifiants de nœuds', + 'node_id' => 'Identifiants de nœuds', + + 'ip_address' => 'Adresse IP', + 'ip_help' => 'Habituellement, l\'IP publique de votre machine à moins que vous ne fassiez une redirection de port.', + 'alias_help' => 'Nom d\'affichage facultatif pour vous aider à vous souvenir de ce que sont ces éléments.', + 'refresh' => 'Actualiser', + 'domain' => 'Nom de domaine', + 'ssl_ip' => 'Vous ne pouvez pas vous connecter à une adresse IP via SSL', + 'error' => 'Il s\'agit du nom de domaine qui pointe vers l\'adresse IP de votre noeud. Si vous avez déjà configuré ceci, vous pouvez le vérifier en cochant le champ suivant !', + 'fqdn_help' => 'Votre panneau est actuellement sécurisé via un certificat SSL et cela signifie que vos nœuds en ont besoin également. Vous devez utiliser un nom de domaine, parce que vous ne pouvez pas obtenir de certificats SSL pour les adresses IP.', + 'dns' => 'Vérification de l\'enregistrement DNS', + 'dns_help' => 'Ceci vous permet de savoir si votre enregistrement DNS pointe vers la bonne adresse IP.', + 'valid' => 'Valide', + 'invalid' => 'Invalide', + 'port' => 'Port', + 'ports' => 'Ports', + 'port_help' => 'Si vous exécutez le démon derrière Cloudflare, vous devez définir le port daemon à 8443 pour permettre le proxy websocket via SSL.', + 'connect_port' => 'Port de connexion', + 'connect_port_help' => 'Les connexions vers Wings vont utiliser ce port. Cela peux différer si vous utilisez un proxy inverse. Lorsque vous utilisez un proxy Cloudflare vous devez utiliser 8443.', + 'listen_port' => 'Port d\'écoute', + 'listen_port_help' => 'Wings va écouter sur ce port.', + 'display_name' => 'Nom affiché', + 'ssl' => 'Communiquer via SSL', + 'panel_on_ssl' => 'Votre panneau utilise une connexion SSL sécurisée,
donc votre démon doit aussi.', + 'ssl_help' => 'Une adresse IP ne peut pas utiliser le SSL.', + + 'tags' => 'Étiquettes', + 'upload_limit' => 'Limite de chargement', + 'upload_limit_help' => 'Entrez la taille maximale des fichiers qui peuvent être téléchargés via le gestionnaire de fichiers web.', + 'sftp_port' => 'Port SFTP', + 'sftp_alias' => 'Alias SFTP', + 'sftp_alias_help' => 'Afficher un alias pour l\'adresse SFTP. Laisser vide pour utiliser le FQDN du noeud.', + 'use_for_deploy' => 'Utiliser pour les déploiements ?', + 'maintenance_mode' => 'Mode de maintenance', + 'maintenance_mode_help' => 'Si le noeud est marqué \'En cours de maintenance\', les utilisateurs ne pourront pas accéder aux serveurs qui se trouvent sur ce noeud', + + 'cpu' => 'CPU', + 'cpu_limit' => 'Limite de CPU', + 'memory' => 'Mémoire', + 'memory_limit' => 'Limite de mémoire', + 'disk' => 'Disque', + 'disk_limit' => 'Limite de disque', + 'unlimited' => 'Illimité', + 'limited' => 'Limité', + 'overallocate' => 'Surallocation', + 'enabled' => 'Activé', + 'disabled' => 'Désactivé', + 'yes' => 'Oui', + 'no' => 'Non', + + 'instructions' => 'Instructions', + 'instructions_help' => 'Sauvegardez ce fichier dans le répertoire racine de votre démon, en le nommant config.yml', + + 'auto_deploy' => 'Commande de déploiement automatique', + 'auto_question' => 'Choisissez entre l\'installation Standalone ou Docker.', + 'auto_label' => 'Type', + 'standalone' => 'Standalone', + 'docker' => 'Docker', + 'auto_command' => 'Pour configurer automatiquement votre noeud, exécutez la commande suivante :', + 'reset_token' => 'Réinitialiser le jeton d\'autorisation', + 'token_reset' => 'Le jeton de démon a été réinitialisé.', + 'reset_help' => 'La réinitialisation du jeton de démon annulera toute requête provenant de l\'ancien jeton. Ce jeton est utilisé pour toutes les opérations sensibles sur le démon, y compris la création et la suppression du serveur. Nous vous suggérons de le modifier régulièrement pour des raisons de sécurité.', + + 'no_nodes' => 'Aucun noeud', + 'none' => 'Aucun', + 'cpu_chart' => 'CPU - :cpu% de :max%', + 'memory_chart' => 'Mémoire - :used sur :total', + 'disk_chart' => 'Mémoire - :used sur :total', + 'used' => 'Utilisé', + 'unused' => 'Inutilisé', + + 'next_step' => 'Etape suivante', + 'node_has_servers' => 'Le noeud dispose de serveurs', + 'create_allocation' => 'Créer une allocation', + 'primary_allocation' => 'Allocation principale', + 'databases' => 'Bases de données', + 'backups' => 'Sauvegardes', + + 'error_connecting' => 'Erreur de connexion au noeud', + 'error_connecting_description' => 'La configuration n\'a pas pu être mise à jour automatiquement sur Wings, vous devrez mettre à jour manuellement le fichier de configuration.', + 'allocation' => 'Allocation', + + 'diagnostics' => [ + 'header' => 'Diagnostiques du Nœud', + 'include_endpoints' => 'Inclure les Endpoints', + 'include_endpoints_hint' => 'Inclure les endpoints affichera les URL du panel dans les logs et ne les masquera pas.', + 'include_logs' => 'Inclure les logs', + 'include_logs_hint' => 'Inclure les logs affichera les logs récents et aidera à tracer les éventuels problèmes.', + 'run_diagnostics' => 'Lancer les diagnostics', + 'upload_to_pelican' => 'Envoyer les logs', + 'logs_pulled' => 'Logs extraits !', + 'logs_uploaded' => 'Logs envoyés !', + 'upload_failed' => 'Échec de l\'envoi des logs', + 'view_logs' => 'Voir les logs', + 'pull' => 'Extraire', + 'upload' => 'Envoyer', + 'clear' => 'Effacer', + '404' => 'Le rapport de diagnostic demandé est introuvable. Soyez sûr que wings est à jour et réessayez', + ], + + 'cloudflare_issue' => [ + 'title' => 'Problème Cloudflare', + 'body' => 'Votre nœud n\'est pas accessible depuis Cloudflare', + ], + + 'bulk_update_ip' => 'Mettre à jour les IP', + 'bulk_update_ip_description' => 'Remplace une ancienne adresse IP avec une nouvelle pour l\'allocation. Ceci est utile quand une adresse IP de nœud change', + 'update_ip' => 'Mettre à jour l\'IP', + 'old_ip' => 'Ancienne adresse IP', + 'new_ip' => 'Nouvelle adresse IP', + 'no_allocations_to_update' => 'Aucune allocation avec l\'ancienne adresse IP n\'a été trouvée', + 'ip_updated' => 'Mise à jour avec succès :count de :total allocation(s)', + 'ip_update_failed' => ':count allocation(s) échouée(s) à mettre à jour', ]; diff --git a/lang/fr/admin/plugin.php b/lang/fr/admin/plugin.php new file mode 100644 index 0000000000..af2f64393d --- /dev/null +++ b/lang/fr/admin/plugin.php @@ -0,0 +1,61 @@ + 'Extensions', + 'model_label' => 'Extension', + 'model_label_plural' => 'Extensions', + + 'name' => 'Nom', + 'update_available' => 'Une mise à jour de cette extension est disponible', + 'author' => 'Auteur', + 'version' => 'Version', + 'category' => 'Catégorie', + 'status' => 'État', + 'visit_website' => 'Visiter le site', + 'settings' => 'Paramètres', + 'install' => 'Installer', + 'uninstall' => 'Désinstaller', + 'update' => 'Mettre à jour', + 'enable' => 'Activer', + 'disable' => 'Désactiver', + 'import_from_file' => 'Importer depuis un fichier', + 'import_from_url' => 'Importer depuis une URL', + 'no_plugins' => 'Aucune extension', + 'all' => 'Tout', + 'change_load_order' => 'Modifier l’ordre de chargement', + 'apply_load_order' => 'Appliquer l’ordre de chargement', + + 'enable_theme_modal' => [ + 'heading' => 'Thème déjà activé', + 'description' => 'Vous avez déjà un thème activé. Activer plusieurs thèmes peut provoquer des bugs visuels. Voulez-vous continuer ?', + ], + + 'status_enum' => [ + 'not_installed' => 'Non installé', + 'disabled' => 'Désactivé', + 'enabled' => 'Activé', + 'errored' => 'Erreur', + 'incompatible' => 'Incompatible', + ], + + 'category_enum' => [ + 'plugin' => 'Extension', + 'theme' => 'Thème', + 'language' => 'Pack de langue', + ], + + 'notifications' => [ + 'installed' => 'Extension installée', + 'install_error' => 'Impossible d’installer l’extension', + 'uninstalled' => 'Extension désinstallée', + 'uninstall_error' => 'Impossible de désinstaller l’extension', + 'deleted' => 'Extension supprimée', + 'updated' => 'Extension mise à jour', + 'update_error' => 'Impossible de mettre à jour l’extension', + 'enabled' => 'Extension activée', + 'disabled' => 'Extension désactivée', + 'imported' => 'Extension importée', + 'import_exists' => 'Une extension avec cet Id existe déjà', + 'import_failed' => 'Impossible d’importer l’extension', + ], +]; diff --git a/lang/fr/admin/role.php b/lang/fr/admin/role.php new file mode 100644 index 0000000000..974d8bb170 --- /dev/null +++ b/lang/fr/admin/role.php @@ -0,0 +1,17 @@ + 'Rôles', + 'model_label' => 'Rôle', + 'model_label_plural' => 'Rôles', + 'no_roles' => 'Pas de rôles', + 'name' => 'Nom du rôle', + 'permissions' => 'Permissions', + 'in_use' => 'Active', + 'all' => 'Tout', + 'root_admin' => 'Le :role a toutes les permissions.', + 'root_admin_delete' => 'Impossible de supprimer l\'administrateur racine', + 'users' => 'Utilisateurs', + 'nodes' => 'Nœuds', + 'nodes_hint' => 'Laisser vide pour autoriser l\'accès à tous les nœuds.', +]; diff --git a/lang/fr/admin/server.php b/lang/fr/admin/server.php index 17b6244e4f..efb946a879 100644 --- a/lang/fr/admin/server.php +++ b/lang/fr/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Vous essayez de supprimer l\'allocation par défaut pour ce serveur, mais il n\'y a pas d\'allocation de secours à utiliser.', - 'marked_as_failed' => 'Ce serveur a été marqué comme ayant échoué à l\'installation précédente. Le statut actuel ne peut pas être basculé dans cet état.', - 'bad_variable' => 'Il y a eu une erreur de validation avec la variable :name.', - 'daemon_exception' => 'Une erreur est survenue lors de la tentative de communication avec le démon, entraînant un code de réponse HTTP/:code. Cette exception a été enregistrée. (request id: :request_id)', - 'default_allocation_not_found' => 'L\'allocation par défaut demandée n\'a pas été trouvée dans les allocations de ce serveur.', + 'nav_title' => 'Serveurs', + 'model_label' => 'Serveur', + 'model_label_plural' => 'Serveurs', + 'no_servers' => 'Aucun serveur', + 'create' => 'Créer un serveur', + 'next_step' => 'Etape suivante', + 'ip_address' => 'Adresse IP', + 'ip_address_helper' => 'Habituellement, l\'IP publique de votre machine à moins que vous ne fassiez une redirection de port.', + 'port' => 'Port', + 'ports' => 'Ports', + 'alias' => 'Alias', + 'alias_helper' => 'Nom d\'affichage facultatif pour vous aider à vous souvenir de ce que sont ces éléments.', + 'locked' => 'Verrouillé ?', + 'locked_helper' => 'Les utilisateurs ne seront pas en mesure de supprimer les allocations verrouillées', + 'lock' => 'Verrouiller', + 'unlock' => 'Déverrouiller', + 'name' => 'Nom', + 'external_id' => 'Identification externe', + 'owner' => 'Propriétaire', + 'description' => 'Description', + 'install_script' => 'Exécuter le script d\'installation ?', + 'start_after' => 'Démarrer après l\'installation ?', + 'yes' => 'Oui', + 'no' => 'Non', + 'skip' => 'Ignorer', + 'primary' => 'Principal', + 'already_primary' => 'Déjà Principal', + 'make_primary' => 'Définir comme principale', + 'startup_cmd' => 'Commande de démarrage', + 'startup_name' => 'Nom de démarrage', + 'default_startup' => 'Commande de démarrage par défaut', + 'startup_placeholder' => 'Entrez une commande de démarrage personnalisée', + 'variables' => 'Variables', + 'resource_limits' => 'Limites de ressources', + 'cpu' => 'CPU', + 'cpu_limit' => 'Limite de CPU', + 'cpu_helper' => '100% équivaut à un processeur cœur.', + 'unlimited' => 'Illimité', + 'limited' => 'Limité', + 'enabled' => 'Activé', + 'disabled' => 'Désactivé', + 'memory' => 'Mémoire', + 'memory_limit' => 'Limite de mémoire', + 'memory_helper' => 'Les ailes ajouteront une surcharge à cette valeur lors de la création du conteneur pour s\'assurer qu\'il ne disparaît pas en utilisant la mémoire maximale.', + 'disk' => 'Espace disque', + 'disk_limit' => 'Limite d\'espace disque', + 'advanced_limits' => 'Limites avancées', + 'cpu_pin' => 'Épinglage du CPU', + 'threads' => 'Threads épinglés', + 'pin_help' => 'Ajouter un fil épinglé, par exemple 0 ou 2-4', + 'swap' => 'Mémoire d\'échange', + 'swap_limit' => 'Limite de la mémoire d\'échange', + 'oom' => 'Tueur OOM', + 'feature_limits' => 'Limites de fonctionnalités', + 'docker_settings' => 'Paramètres Docker', + 'docker_image' => 'Image Docker', + 'image_name' => 'Nom de l\'image', + 'primary_allocation' => 'Allocation principale', + 'image' => 'Image', + 'image_placeholder' => 'Entrez une image personnalisée', + 'container_labels' => 'Étiquettes de conteneur', + 'title' => 'Titre', + 'actions' => 'Actions', + 'console' => 'Console', + 'suspend' => 'Suspendre', + 'unsuspend' => 'Retirer la suspension', + 'reinstall' => 'Réinstaller', + 'reinstall_help' => 'Cela réinstallera le serveur avec le script d\'installation d\'oeuf assigné.', + 'reinstall_modal_heading' => 'Êtes-vous sûr de vouloir réinstaller ce serveur ?', + 'reinstall_modal_description' => '!! Cela peut entraîner une perte de données non récupérable !!', + 'server_status' => 'État du serveur', + 'view_install_log' => 'Voir le journal d\'installation', + 'uuid' => 'UUID', + 'node' => 'Nœud', + 'short_uuid' => 'UUID Court', + 'toggle_install' => 'Activer/désactiver l\'état de l\'installation', + 'toggle_install_help' => 'Si vous avez besoin de changer l\'état de l\'installation de la désinstallation pour l\'installer, ou vice versa, vous pouvez le faire avec ce bouton.', + 'toggle_install_failed_header' => 'Le serveur est en état d\'échec', + 'toggle_install_failed_desc' => 'Voulez-vous réinstaller le serveur pour résoudre ce problème ?', + 'transfer' => 'Transfert', + 'transfer_help' => 'Transférer ce serveur à un autre noeud connecté à ce panneau.
Attention! Cette fonctionnalité est encore expérimentale. Pensez à faire une sauvegarde manuellement d\'abord pour éviter la perte de données !', + 'condition' => 'Condition', + 'suspend_all' => 'Suspendre tous les serveurs', + 'unsuspend_all' => 'Annuler la suspension de tous les serveurs', + 'select_allocation' => 'Sélectionner une allocation', + 'new_allocation' => 'Créer une nouvelle allocation', + 'additional_allocations' => 'Allocations supplémentaires', + 'select_additional' => 'Sélectionner des allocations supplémentaires', + 'no_variables' => 'L\'oeuf sélectionné n\'a pas de variables !', + 'select_egg' => 'Sélectionnez d\'abord un oeuf pour afficher ses variables!', + 'allocations' => 'Allocations', + 'databases' => 'Bases de données', + 'no_databases' => 'Aucune base de données n\'existe pour ce serveur', + 'delete_db' => 'Êtes-vous sûr de vouloir supprimer', + 'delete_db_heading' => 'Supprimer la base de données ?', + 'backups' => 'Sauvegardes', + 'egg' => 'Egg', + 'mounts' => 'Montages', + 'no_mounts' => 'Aucun montage n\'existe pour ce noeud', + 'create_database' => 'Créer une base de données', + 'no_db_hosts' => 'Aucun hôte de base de données', + 'failed_to_create' => 'Impossible de créer la base de données', + 'change_egg' => 'Changé d\'oeuf', + 'new_egg' => 'Nouvel Egg', + 'keep_old_variables' => 'Garder les anciennes variables si possible ?', + 'create_allocation' => 'Créer une allocation', + 'add_allocation' => 'Ajouter une allocation', + 'view' => 'Afficher', + 'no_log' => 'Pas de journal disponible', + 'tabs' => [ + 'information' => 'Information', + 'egg_configuration' => 'Configuration des oeufs', + 'environment_configuration' => 'Configuration de l\'environnement', ], - 'alerts' => [ - 'startup_changed' => 'La configuration de démarrage de ce serveur a été mise à jour. Si l\'œuf de ce serveur a été modifié, une réinstallation aura lieu maintenant.', - 'server_deleted' => 'Le serveur a été supprimé du système avec succès.', - 'server_created' => 'Le serveur a été créé avec succès. Veuillez patienter quelques minutes avant l\'installation complète du serveur.', - 'build_updated' => 'Les détails du build de ce serveur ont été mis à jour. Certains changements peuvent nécessiter un redémarrage pour prendre effet.', - 'suspension_toggled' => 'Le statut de suspension du serveur a été changé à :status.', - 'rebuild_on_boot' => 'Ce serveur a été marqué comme nécessitant une reconstruction du conteneur Docker. Cela se produira la prochaine fois que le serveur sera démarré.', - 'install_toggled' => 'Le status d\'installation de ce serveur à bien été basculé', - 'server_reinstalled' => 'Ce serveur a été mis en file d\'attente pour le début de la réinstallation.', - 'details_updated' => 'Les détails du serveur ont été mis à jour avec succès.', - 'docker_image_updated' => 'L\'image Docker par défaut a été modifiée avec succès pour ce serveur. Un redémarrage est nécessaire pour appliquer cette modification.', - 'node_required' => 'Vous devez avoir au moins un nœud configuré avant de pouvoir ajouter des serveurs à ce panel.', - 'transfer_nodes_required' => 'Vous devez avoir au moins deux nœuds configurés avant de pouvoir transférer des serveurs.', - 'transfer_started' => 'Le transfert du serveur a été démarré.', - 'transfer_not_viable' => 'Le nœud que vous avez sélectionné ne dispose pas de l\'espace disque ou de la mémoire nécessaire pour accueillir ce serveur.', + 'notifications' => [ + 'server_suspension' => 'Suspension du serveur', + 'server_suspended' => 'Le serveur a été suspendu', + 'server_already_suspended' => 'Le serveur est déjà suspendu !', + 'server_suspend_help' => 'Cela va suspendre le serveur, arrêter tous les processus en cours d\'exécution, et empêcher immédiatement l\'utilisateur d\'accéder à leurs fichiers ou de gérer le serveur par le biais du panel ou de l\'API.', + 'server_unsuspend_help' => 'Cela va annuler la suspension du serveur et restaurer l\'accès normal.', + 'server_unsuspended' => 'Le serveur a été non suspendu', + 'error_server_delete' => 'Le serveur n\'a pas pu être supprimé en toute sécurité.', + 'error_server_delete_body' => 'Vous pouvez forcer la suppression.', + 'create_failed' => 'Impossible de créer le serveur', + 'invalid_port_range' => 'Plage de port invalide', + 'invalid_port_range_body' => 'Votre plage de ports n\'est pas un entier valide : :port', + 'too_many_ports' => 'Trop de ports en même temps !', + 'too_many_ports_body' => 'La limite actuelle est :limit nombre de ports à la fois.', + 'invalid_port' => 'Port non valide', + 'invalid_port_body' => ':i n\'est pas dans la plage de ports valide entre :portFloor-:portCeil', + 'already_exists' => 'Port déjà utilisé', + 'already_exists_body' => ':i est déjà avec une allocation', + 'error_connecting' => 'Erreur de connexion au :node', + 'error_connecting_description' => 'La configuration n\'a pas pu être synchronisée automatiquement sur Wings, vous devrez redémarrer manuellement le serveur.', + 'install_toggled' => 'Changement de statut de l\'installation', + 'install_toggle_failed' => 'Impossible d\'activer le statut d\'installation', + 'reinstall_started' => 'Réinstallation démarrée', + 'reinstall_failed' => 'Impossible de démarrer la réinstallation', + 'log_failed' => 'Impossible de se connecter au serveur Wings pour récupérer le journal d\'installation du serveur.', + 'transfer_started' => 'Transfert démarré', + 'transfer_failed' => 'Échec du transfert', + 'already_transfering' => 'Le serveur est en cours de transfert.', ], + 'notes' => 'Notes', + 'no_notes' => 'Pas de notes', + 'none' => 'Aucun', ]; diff --git a/lang/fr/admin/setting.php b/lang/fr/admin/setting.php new file mode 100644 index 0000000000..957aaa2b46 --- /dev/null +++ b/lang/fr/admin/setting.php @@ -0,0 +1,157 @@ + 'Paramètres', + 'save_success' => 'Paramètres enregistrés', + 'save_failed' => 'Échec de l\'enregistrement des paramètres', + 'navigation' => [ + 'general' => 'Général', + 'captcha' => 'Captcha', + 'mail' => 'E-mail', + 'backup' => 'Sauvegarde', + 'oauth' => 'OAuth', + 'misc' => 'Divers', + ], + 'general' => [ + 'app_name' => 'Nom de l\'application', + 'app_logo' => 'Logo de l\'application', + 'app_logo_help' => 'Le logo doit être placé dans le dossier public situé dans le répertoire du panneau racine. Laissez vide pour utiliser le nom de l\'application à la place.', + 'app_favicon' => 'Favicon de l\'application', + 'app_favicon_help' => 'Les Favicons doivent être placés dans le dossier public, situé dans le répertoire racine du panel.', + 'debug_mode' => 'Mode de débogage', + 'navigation' => 'Navigation', + 'default_navigation' => 'Type de navigation par défaut', + 'sidebar' => 'Barre latérale', + 'topbar' => 'Entête de site', + 'mixed' => 'Mixte', + 'unit_prefix' => 'Préfixe de l\'unité', + 'decimal_prefix' => 'Préfixe décimal (MB/GB)', + 'binary_prefix' => 'Préfixe binaire (MiB/GiB)', + '2fa_requirement' => 'Exigences de 2FA', + 'not_required' => 'Non requis', + 'admins_only' => 'Requis pour les administrateurs seulement', + 'all_users' => 'Requis pour tous les utilisateurs', + 'trusted_proxies' => 'Proxys de confiance', + 'trusted_proxies_help' => 'Nouvelle IP ou plage d\'IP', + 'clear' => 'Effacer', + 'set_to_cf' => 'Définir sur les IP Cloudflare', + 'display_width' => 'Afficher la largeur', + 'avatar_provider' => 'Fournisseur d\'avatar', + 'uploadable_avatars' => 'Autoriser les utilisateurs à utiliser leur propre avatar ?', + ], + 'captcha' => [ + 'enable' => 'Activer', + 'disable' => 'Désactiver', + 'info_label' => 'Information', + 'info' => 'Vous pouvez générer les clés sur votre tableau de bord Cloudflare. Un compte Cloudflare est requis.', + 'site_key' => 'Clé du site', + 'secret_key' => 'Clé secrète', + 'verify' => 'Vérifier le domaine ?', + ], + 'mail' => [ + 'mail_driver' => 'Fournisseur d\'email', + 'test_mail' => 'Envoyer un e-mail de test', + 'test_mail_sent' => 'Courriel de test envoyé', + 'test_mail_failed' => 'Échec du test du mail', + 'from_settings' => 'Depuis les paramètres', + 'from_settings_help' => 'Définit l\'adresse et le nom utilisés comme "De" dans les mails.', + 'from_address' => 'De', + 'from_name' => 'Nom de l\'expéditeur', + 'smtp' => [ + 'smtp_title' => 'Configuration SMTP', + 'host' => 'Hôte', + 'port' => 'Port', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'scheme' => 'Classification', + ], + 'mailgun' => [ + 'mailgun_title' => 'Configuration Mailgun', + 'domain' => 'Domaine', + 'secret' => 'Secret', + 'endpoint' => 'Point de terminaison', + ], + ], + 'backup' => [ + 'backup_driver' => 'Pilote de sauvegarde', + 'throttle' => 'Limite', + 'throttle_help' => 'Configurer combien de sauvegardes peuvent être créées dans une période. Réglez la période à 0 pour désactiver cette limite.', + 'limit' => 'Limite', + 'period' => 'Période', + 'seconds' => 'Secondes', + 's3' => [ + 's3_title' => 'Configuration S3', + 'default_region' => 'Région par défaut', + 'access_key' => 'Identifiant de la clé d\'accès', + 'secret_key' => 'Clé d\'accès secrète', + 'bucket' => 'Seau', + 'endpoint' => 'Point de terminaison', + 'use_path_style_endpoint' => 'Utiliser le style de point de terminaison', + ], + ], + 'oauth' => [ + 'enable' => 'Activer', + 'enable_schema' => 'Activer :schema', + 'disable' => 'Désactiver', + 'client_id' => 'ID du client', + 'client_secret' => 'Secret client', + 'redirect' => 'URL de redirection', + 'web_api_key' => 'Clé Web API', + 'base_url' => 'URL de base', + 'display_name' => 'Nom affiché', + 'auth_url' => 'URL de retour d\'autorisation', + 'create_missing_users' => 'Créer automatiquement les utilisateurs manquants ?', + 'link_missing_users' => 'Lier automatiquement les utilisateurs manquants ?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Création automatique de l\'allocation', + 'helper' => 'Activer/désactiver si les utilisateurs peuvent créer des allocations via la zone client.', + 'question' => 'Autoriser les utilisateurs à créer des allocations ?', + 'create_new' => 'Créer de nouvelles allocations si aucune n\'est disponible ?', + 'create_new_help' => 'Lorsqu\'elle est activée, cette option crée de nouvelles affectations. Lorsqu\'elle est désactivée, elle n\'attribue que des ressources issues d\'allocations non attribuées existantes. Les deux options tiennent compte de la plage de ports ci-dessous.', + 'start' => 'Port de départ', + 'end' => 'Port de fin', + ], + 'mail_notifications' => [ + 'title' => 'Notifications par e-mail', + 'helper' => 'Activer/désactiver les notifications de courriel à envoyer aux utilisateurs.', + 'server_installed' => 'Serveur installé', + 'server_reinstalled' => 'Serveur réinstallé', + ], + 'connections' => [ + 'title' => 'Connexions', + 'helper' => 'Délai d\'expiration utilisé lors des requêtes.', + 'request_timeout' => 'Expiration de la requête', + 'connection_timeout' => 'Expiration de la connexion', + 'seconds' => 'Secondes', + ], + 'activity_log' => [ + 'title' => 'Journal des activités', + 'helper' => 'Configurer la fréquence à laquelle les anciens journaux d\'activité doivent être supprimés et si les activités d\'administration doivent être enregistrées.', + 'prune_age' => 'Durée de conservation', + 'days' => 'Jours', + 'log_admin' => 'Cacher les activités d\'administration ?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Définit le nombre de requêtes maximales, par minute, pouvant être exécutées.', + 'client_rate' => 'Limite de d\'API du client', + 'app_rate' => 'Limite d\'API de l\'application', + 'rpm' => 'Requêtes par minute', + ], + 'server' => [ + 'title' => 'Serveurs', + 'helper' => 'Paramètres pour les serveurs', + 'edit_server_desc' => 'Autoriser les utilisateurs à modifier les descriptions ?', + 'console_font_upload' => 'Envoyer la police pour la console', + 'console_font_hint' => 'Seules les polices au format .ttf sont prises en charge. Les polices mono sont fortement recommandées !', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => 'Configurer la fréquence à laquelle les anciens logs de webhook doivent être supprimés.', + 'prune_age' => 'Durée de conservation', + 'days' => 'Jours', + ], + ], +]; diff --git a/lang/fr/admin/user.php b/lang/fr/admin/user.php index 4b3d72e3e2..1a94a7de8e 100644 --- a/lang/fr/admin/user.php +++ b/lang/fr/admin/user.php @@ -1,12 +1,24 @@ [ - 'user_has_servers' => 'Impossible de supprimer un utilisateur avec des serveurs actifs attachés à son compte. Veuillez supprimer ses serveurs avant de continuer.', - 'user_is_self' => 'Vous ne pouvez pas supprimer votre propre compte.', - ], - 'notices' => [ - 'account_created' => 'Compte créé avec succès.', - 'account_updated' => 'Compte mis à jour avec succès.', - ], + 'nav_title' => 'Utilisateurs', + 'model_label' => 'Utilisateur', + 'model_label_plural' => 'Utilisateurs', + 'self_delete' => 'Vous ne pouvez pas vous supprimer', + 'has_servers' => 'L\'utilisateur dispose de serveurs', + 'email' => 'E-mail', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'external_id' => 'ID externe', + 'is_managed_externally' => 'Géré de l’extérieur ?', + 'is_managed_externally_helper' => 'Si vos utilisateurs sont gérés de l’extérieur (par ex. un logiciel de facturation), vous pouvez activer cette option pour empêcher la modification de leur nom d’utilisateur, e-mail ou mot de passe depuis l\'interface.', + 'password_help' => 'Fournir un mot de passe d\'utilisateur est optionnel. Le nouvel e-mail demandera aux utilisateurs de créer un mot de passe lors de leur première connexion.', + 'admin_roles' => 'Rôles d\'administrateur', + 'roles' => 'Rôles', + 'no_roles' => 'Aucun rôle', + 'servers' => 'Serveurs', + 'subusers' => 'Sous-utilisateur', + 'password_reset' => 'Réinitialiser le mot de passe', + 'password_reset_sent' => 'Message de réinitialisation du mot de passe envoyé', + 'password_reset_failed' => 'Échec de l\'envoi de l\'e-mail de réinitialisation du mot de passe', ]; diff --git a/lang/fr/admin/webhook.php b/lang/fr/admin/webhook.php new file mode 100644 index 0000000000..cb784af6d6 --- /dev/null +++ b/lang/fr/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Point de terminaison', + 'description' => 'Description', + 'no_webhooks' => 'Aucun webhook', + 'help' => 'Aide', + 'help_text' => 'Vous devez englober les noms de variables dans {{ }}. Par exemple, si vous voulez obtenir le nom depuis l\'api, vous pouvez utiliser {{name}}', + 'test_now' => 'Tester maintenant', + 'test_now_help' => 'Cela va lancer l\'événement `created: Server`', + 'table' => [ + 'description' => 'Description', + 'endpoint' => 'Point de terminaison', + ], + 'headers' => 'En-Têtes', + 'events' => 'Événements', + 'regular' => 'Standard', + 'reset_headers' => 'Réinitialiser les en-têtes', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Message', + 'username' => 'Nom d\'utilisateur', + 'avatar_url' => 'URL de l\'avatar', + 'forum_thread' => 'Nom du sujet de forum', + 'supress_embeds' => 'Supprimer les intégrations', + 'supress_embeds_text' => 'Ne pas inclure d\'intégrations lors de la sérialisation de ce message', + 'supress_notifications' => 'Supprimer les Notifications', + 'supress_notifications_text' => 'Ce message ne déclenchera pas les notifications push et de bureau', + ], + 'discord_embed' => [ + 'add_embed' => 'Ajouter une intégration', + 'flags' => 'Indicateurs', + 'thumbnail' => 'URL de miniature', + 'embeds' => 'Intégrations', + 'thread_name' => 'Nom du sujet de forum', + 'allowed_mentions' => 'Mentions autorisées', + 'roles' => 'Rôles', + 'users' => 'Utilisateurs', + 'everyone' => '@everyone et @here', + 'author' => 'Auteur', + 'author_url' => 'URL de l\'auteur', + 'author_icon_url' => 'URL de l\'icône de l\'auteur', + 'body' => 'Contenu', + 'title' => 'Titre', + 'color' => 'Couleur de l\'intégration', + 'url' => 'URL', + 'images' => 'Images', + 'image_url' => 'URL de l\'image', + 'image_thumbnail' => 'URL de miniature', + 'footer' => 'Pied de page', + 'has_timestamp' => 'A un horodatage', + 'footer_icon_url' => 'URL de l\'icône du pied de page', + 'add_field' => 'Ajouter un champ', + 'fields' => 'Champs', + 'field_name' => 'Nom du champ', + 'field_value' => 'Valeur du champ', + 'inline_field' => 'Champ en ligne', + ], +]; diff --git a/lang/fr/auth.php b/lang/fr/auth.php index 8ad4e7e780..51de518d89 100644 --- a/lang/fr/auth.php +++ b/lang/fr/auth.php @@ -1,27 +1,24 @@ 'Se connecter', - 'go_to_login' => 'Aller à la connexion', - 'failed' => 'Aucun compte correspondant à ces identifiants n\'a été trouvé.', - 'forgot_password' => [ - 'label' => 'Mot de passe oublié ?', - 'label_help' => 'Entrez votre adresse e-mail pour recevoir des instructions sur la réinitialisation de votre mot de passe.', - 'button' => 'Récupérer un compte', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Réinitialiser et se connecter', - ], + 'failed' => 'Ces identifiants ne correspondent à aucun compte existant.', + 'failed-two-factor' => 'Le code 2FA est incorrect', + 'two-factor-code' => 'Authentificateur à deux facteurs', + 'two-factor-hint' => 'Vous pouvez utiliser des codes de secours si vous avez perdu l\'accès à votre appareil.', + 'password' => 'Le mot de passe saisi est incorrect.', + 'throttle' => 'Trop de tentatives de connexion. Veuillez réessayer dans :secondes secondes.', + '2fa_must_be_enabled' => 'L\'administrateur a exigé que l\'authentification à 2 facteurs soit activée pour votre compte afin d\'utiliser le Panel.', - 'two_factor' => [ - 'label' => 'Jeton 2-Factor', - 'label_help' => 'Ce compte nécessite une deuxième authentification pour continuer. Veuillez entrer le code généré par votre appareil pour terminer cette connexion.', - 'checkpoint_failed' => 'Le jeton d\'authentification à deux facteurs (2-factor) est invalide.', - ], - - 'throttle' => 'Trop de tentatives de connexion. Merci de réessayer dans :seconds secondes.', - 'password_requirements' => 'Le mot de passe doit contenir au moins 8 caractères et doit être unique à ce site.', - '2fa_must_be_enabled' => 'L\'administrateur a demandé que soit activé une double authentification pour votre compte, afin d\'utiliser le Panel', ]; diff --git a/lang/fr/command/messages.php b/lang/fr/command/messages.php index 180d1ef22f..df09b86b82 100644 --- a/lang/fr/command/messages.php +++ b/lang/fr/command/messages.php @@ -2,28 +2,23 @@ return [ 'user' => [ - 'search_users' => 'Entrez un nom d\'utilisateur, un ID ou une adresse e-mail', - 'select_search_user' => 'ID de l\'utilisateur à supprimer (entrez \'0\' pour rechercher)', - 'deleted' => 'L\'utilisateur a bien été supprimé du panel', + 'search_users' => 'Entrez un nom d\'utilisateur, un identifiant d\'utilisateur ou une adresse e-mail', + 'select_search_user' => 'Identifiant de l\'utilisateur à supprimer (Entrez \'0\' pour relancer une recherche)', + 'deleted' => 'L\'utilisateur a bien été supprimé du Panel.', 'confirm_delete' => 'Êtes-vous sûr de vouloir supprimer cet utilisateur du panel ?', 'no_users_found' => 'Aucun utilisateur n\'a été trouvé pour le terme de recherche fourni.', - 'multiple_found' => 'Plusieurs comptes ont été trouvés pour l\'utilisateur fourni, impossible de supprimer un utilisateur à cause de l\'option --no-Interaction.', + 'multiple_found' => 'Plusieurs comptes ont été trouvés pour l\'utilisateur sélectionné, impossible de supprimer un utilisateur dû à la règle de non-interaction.', 'ask_admin' => 'Cet utilisateur est-il un administrateur ?', 'ask_email' => 'Adresse e-mail', 'ask_username' => 'Nom d\'utilisateur', - 'ask_name_first' => 'Prénom', - 'ask_name_last' => 'Nom', 'ask_password' => 'Mot de passe', 'ask_password_tip' => 'Si vous souhaitez créer un compte avec un mot de passe aléatoire envoyé à l\'utilisateur, ré-exécutez cette commande (CTRL+C) et passez le paramètre `--no-password`.', 'ask_password_help' => 'Les mots de passe doivent comporter au moins 8 caractères et contenir au moins une lettre majuscule et un chiffre.', - '2fa_help_text' => [ - 'Cette commande désactivera la double authentification pour le compte d\'un utilisateur s\'il est activé. Ceci ne devrait être utilisé comme une commande de récupération de compte que si l\'utilisateur est bloqué sur son compte.', - 'Si ce n\'étais pas ce que vous vouliez faire, appuyez sur CTRL + C pour quitter le processus.', - ], + '2fa_help_text' => 'Cette commande désactivera l\'authentification à deux facteurs pour le compte d\'un utilisateur s\'il est activé. Ceci ne devrait être utilisé comme une commande de récupération de compte que si l\'utilisateur a bloqué sur son compte. Si ce n\'est pas ce que vous vouliez faire, appuyez sur CTRL+C pour quitter ce processus.', '2fa_disabled' => 'L\'authentification à 2 facteurs a été désactivée pour :email.', ], 'schedule' => [ - 'output_line' => 'Envoi du travail pour la première tâche `:schedule` (:hash).', + 'output_line' => 'Répartition du travail pour la première tâche dans `:schedule` (:hash).', ], 'maintenance' => [ 'deleting_service_backup' => 'Suppression du fichier de sauvegarde :file.', @@ -51,8 +46,8 @@ 'ask_mandrill_secret' => 'Secret Mandrill', 'ask_postmark_username' => 'Clé API Postmark', 'ask_driver' => 'Quel pilote doit être utilisé pour envoyer des emails?', - 'ask_mail_from' => 'Les courriels de l\'adresse e-mail devraient provenir de', - 'ask_mail_name' => 'Nom à partir duquel les e-mails devraient apparaître', + 'ask_mail_from' => 'Adresse e-mail d\'où doivent provenir les e-mails', + 'ask_mail_name' => 'Nom à partir duquel les e-mails doivent venir', 'ask_encryption' => 'Méthode de chiffrement à utiliser', ], ], diff --git a/lang/fr/commands.php b/lang/fr/commands.php new file mode 100644 index 0000000000..7c46081bc8 --- /dev/null +++ b/lang/fr/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Indiquez l\'adresse e-mail utilisée pour l\'exportation des eggs par ce Panel. Elle doit être valide.', + 'url' => 'L\'URL de l\'application doit commencer par https:// ou http:// selon que vous utilisez SSL ou non. Si vous n\'incluez pas le schéma, les liens dans vos e-mails et autres contenus pointeront vers un emplacement incorrect.', + 'timezone' => "La timezone doit correspondre à une des timezones supporté par PHP. Si vous n'êtes pas sûr, merci de regarder les références https://php.net/manual/en/timezones.php.", + ], + 'redis' => [ + 'note' => 'Vous avez sélectionné le driver Redis pour une ou plusieurs options, merci de fournir des informations de connexion valide ci-dessous. Dans la plupart des cas, vous pouvez utiliser ceux fournit par défaut sauf si vous avec modifié votre installation.', + 'comment' => 'Par défaut une instance de serveur Redis a comme nom d\'utilisateur celui par défaut et n\'a pas de mot de passe tant qu\'elle fonctionne en local et est inaccessible depuis l\'extérieur. Si c\'est le cas, appuyez simplement sur Entrée sans saisir de valeur.', + 'confirm' => 'Il semblerait que :field est déjà défini pour Redis, êtes-vous sûr de vouloir le changer ?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Il est fortement recommandé de ne pas utiliser "localhost" pour votre base de donnée car nous remarquons fréquemment des erreurs de connexion au socket. Si vous souhaitez utiliser une connexion locale, vous devriez utiliser "127.0.0.1".', + 'DB_USERNAME_note' => "Utiliser le compte root pour les connexions MySQL n'est pas seulement fortement déconseillé, il est aussi interdit par cette application. Vous allez avoir besoin de créer un utilisateur MySQL pour ce logiciel.", + 'DB_PASSWORD_note' => 'Il semble que vous ayez déjà un mot de passe de connexion MySQL, voulez-vous le changer ?', + 'DB_error_2' => 'Vos identifiants de connexion n\'ont PAS été sauvegardé. Vous allez avoir besoin de fournir des informations de connexion valide avant de continuer.', + 'go_back' => 'Retourner en arrière et réessayer', + ], + 'make_node' => [ + 'name' => 'Entrez un identifiant court à utiliser pour distinguer cette node des autres', + 'description' => 'Entrer une description pour identifier cette node', + 'scheme' => 'Merci d\'entrer https pour une connexion SSL ou http pour une connexion non-SSL.', + 'fqdn' => 'Entrer un nom de domaine (ex : node.example.com) à utiliser pour se connecter au daemon. Une adresse IP peut seulement être utilisé si vous n\'utiliser par SSL pour cette node.', + 'public' => 'Est-ce que cette node doit être publique ? Remarque : en définissant une node comme privé, vous empêcherez le déploiement automatique sur cette node.', + 'behind_proxy' => 'Est-ce que votre FQDN est derrière un proxy ?', + 'maintenance_mode' => 'Le mode maintenance doit-il être activé ?', + 'memory' => 'Entrer la quantité maximale de mémoire', + 'memory_overallocate' => 'Entrer la quantité de mémoire à sur-allouer, -1 désactivera la vérification et 0 empêchera la création de nouveaux serveurs', + 'disk' => 'Entrer la quantité maximale de stockage', + 'disk_overallocate' => 'Entrer la quantité de stockage à sur-allouer, -1 désactivera la vérification et 0 empêchera la création de nouveau serveur', + 'cpu' => 'Entrer la quantité maximale de CPU', + 'cpu_overallocate' => 'Entrer la quantité de CPU à sur-allouer, -1 désactivera la vérification et 0 empêchera la création de nouveau serveur', + 'upload_size' => 'Saisir la taille maximale des fichiers à télécharger', + 'daemonListen' => 'Entrer le port du daemon', + 'daemonConnect' => 'Entrez le port de connexion du service (peut être le même que le port d\'écoute)', + 'daemonSFTP' => 'Entrer le port SFTP du daemon', + 'daemonSFTPAlias' => 'Saisir l\'alias SFTP du daemon (peut être vide)', + 'daemonBase' => 'Entrer le dossier de base', + 'success' => 'Une nouvelle node portant le nom :name a été créé avec succès avec l\'identifiant :id', + ], + 'node_config' => [ + 'error_not_exist' => 'La node choisi n\'existe pas.', + 'error_invalid_format' => 'Le format spécifié n\'est pas valide. Les formats valides sont yaml et json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Il semble que vous ayez déjà configuré une clé de cryptage d\'application. La poursuite de ce processus risque d\'écraser cette clé et de corrompre les données cryptées existantes. NE CONTINUEZ PAS SI VOUS NE SAVEZ PAS CE QUE VOUS FAITES.', + 'understand' => 'Je comprends les conséquences de l\'exécution de cette commande et accepte toute la responsabilité en cas de perte de données chiffrées.', + 'continue' => 'Êtes-vous sûr de vouloir continuer ? La modification de la clé de chiffrement de l\'application CAUSERA UNE PERTE DE DONNÉES.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Il n\'y a pas de tâches planifiées pour les serveurs qui doivent être exécutées.', + 'error_message' => 'Une erreur a été rencontrée lors du traitement de la planification : ', + ], + ], +]; diff --git a/lang/fr/dashboard/account.php b/lang/fr/dashboard/account.php deleted file mode 100644 index bdbb114a0c..0000000000 --- a/lang/fr/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Mettre à jour votre adresse e-mail', - 'updated' => 'Votre adresse e-mail a été mise à jour.', - ], - 'password' => [ - 'title' => 'Modifier votre mot de passe', - 'requirements' => 'Votre nouveau mot de passe doit comporter au moins 8 caractères.', - 'updated' => 'Votre mot de passe a été mis à jour.', - ], - 'two_factor' => [ - 'button' => 'Configurer l\'authentificateur à deux facteurs', - 'disabled' => 'L\'authentification à deux facteurs a été désactivée sur votre compte. Vous ne serez plus invité à fournir le code généré par votre appareil lors de votre connexion.', - 'enabled' => 'L\'authentification à deux facteurs a été activée sur votre compte ! Désormais, lorsque vous vous connectez, vous devrez fournir le code généré par votre appareil.', - 'invalid' => 'Le jeton fourni est invalide.', - 'setup' => [ - 'title' => 'Configurer l\'authentification à deux facteurs', - 'help' => 'Impossible de scanner le code QR ? Entrez le code ci-dessous dans votre application :', - 'field' => 'Saisir un jeton', - ], - 'disable' => [ - 'title' => 'Désactiver l\'authentification à deux facteurs', - 'field' => 'Saisir un jeton', - ], - ], -]; diff --git a/lang/fr/dashboard/index.php b/lang/fr/dashboard/index.php deleted file mode 100644 index a4b269c004..0000000000 --- a/lang/fr/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Rechercher des serveurs...', - 'no_matches' => 'Aucun serveur correspondant aux critères de recherche fournis n\'a été trouvé.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Mémoire', -]; diff --git a/lang/fr/exceptions.php b/lang/fr/exceptions.php index 790cccf695..a861ba8253 100644 --- a/lang/fr/exceptions.php +++ b/lang/fr/exceptions.php @@ -3,7 +3,8 @@ return [ 'daemon_connection_failed' => 'Une erreur est survenue lors de la tentative de communication avec le démon, entraînant un code de réponse HTTP/:code. Cette exception a été enregistrée.', 'node' => [ - 'servers_attached' => 'Un nœud ne doit avoir aucun serveur lié à lui pour être supprimé.', + 'servers_attached' => 'Une node ne doit avoir aucun serveur lié pour être supprimé.', + 'error_connecting' => 'Erreur de connexion au :node', 'daemon_off_config_updated' => 'La configuration du daemon a été mis à jour, cependant, une erreur s\'est produite lors de la tentative de mise à jour automatique du fichier de configuration sur le daemon. Vous devrez mettre à jour manuellement le fichier de configuration (core.json) pour qu\'il puisse appliquer ces modifications.', ], 'allocations' => [ @@ -15,7 +16,7 @@ ], 'egg' => [ 'delete_has_servers' => 'Un egg avec des serveurs actifs qui y sont attachés ne peuvent pas être supprimés du Panel.', - 'invalid_copy_id' => 'L\'Egg sélectionné pour la copie n\'existe pas ou n\'a aucune différence avec l\'original.', + 'invalid_copy_id' => 'L\'oeuf sélectionné pour copier un script de soit n\'existe pas, soit il copie un script lui-même.', 'has_children' => 'Cet Egg est un parent pour un ou plusieurs autres Egg. Veuillez supprimer ces Egg avant de supprimer celui-ci.', ], 'variables' => [ @@ -43,13 +44,21 @@ 'has_nodes' => 'Impossible de supprimer un emplacement auquel sont associés des nœuds actifs.', ], 'users' => [ + 'is_self' => 'Vous ne pouvez pas supprimer votre propre compte.', + 'has_servers' => 'Impossible de supprimer un utilisateur avec des serveurs actifs attachés à son compte. Veuillez supprimer ses serveurs avant de continuer.', 'node_revocation_failed' => 'Échec de la révocation des clés Node #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'Aucun nœud satisfaisant les exigences spécifiées pour le déploiement automatique n\'a pu être trouvé.', - 'no_viable_allocations' => 'Aucun nœud satisfaisant les exigences spécifiées pour le déploiement automatique n\'a pu être trouvé.', + 'no_viable_nodes' => 'Aucune node satisfaisant les exigences spécifiées pour le déploiement automatique n\'a pu être trouvé.', + 'no_viable_allocations' => 'Aucunes allocations satisfaisant les exigences pour le déploiement automatique n\'a pu être trouvé.', ], 'api' => [ 'resource_not_found' => 'La ressource demandée n\'existe pas sur ce serveur.', ], + 'mount' => [ + 'servers_attached' => 'Une node ne doit avoir aucun serveur lié pour être supprimé.', + ], + 'server' => [ + 'marked_as_failed' => 'Ce serveur n\'a pas encore terminé son processus d\'installation, veuillez réessayer plus tard.', + ], ]; diff --git a/lang/fr/installer.php b/lang/fr/installer.php new file mode 100644 index 0000000000..5fddbd04fe --- /dev/null +++ b/lang/fr/installer.php @@ -0,0 +1,114 @@ + 'Installateur du panneau de gestion', + 'requirements' => [ + 'title' => 'Configuration serveur requise', + 'sections' => [ + 'version' => [ + 'title' => 'Version de PHP', + 'or_newer' => ':version ou plus récent', + 'content' => 'Votre version de PHP est :version.', + ], + 'extensions' => [ + 'title' => 'Extensions PHP', + 'good' => 'Toutes les extensions PHP nécessaires sont installées.', + 'bad' => 'Les extensions PHP suivantes sont manquantes : :extensions', + ], + 'permissions' => [ + 'title' => 'Droits d\'accès au dossier', + 'good' => 'Tous les dossiers ont les droits corrects.', + 'bad' => 'Les dossiers suivants ont des droits incorrects : :folders', + ], + ], + 'exception' => 'Certaines exigences sont manquantes', + ], + 'environment' => [ + 'title' => 'Environnement', + 'fields' => [ + 'app_name' => 'Nom de l\'application', + 'app_name_help' => 'Ce sera le nom de votre panneau de gestion.', + 'app_url' => 'URL de l\'application', + 'app_url_help' => 'Ce sera l\'URL à partir de laquelle vous accéderez à votre panneau de gestion.', + 'account' => [ + 'section' => 'Administrateur', + 'email' => 'E-mail', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + ], + ], + ], + 'database' => [ + 'title' => 'Base de données', + 'driver' => 'Pilote de la base de données', + 'driver_help' => 'Le pilote utilisé pour la base de données du panneau de gestion. Nous vous recommandons "SQLite".', + 'fields' => [ + 'host' => 'Hôte de base de données', + 'host_help' => 'L\'hôte de votre base de données. Assurez-vous qu\'il est accessible.', + 'port' => 'Port de la base de données', + 'port_help' => 'Le port de votre base de données.', + 'path' => 'Chemin de la base de données', + 'path_help' => 'Le chemin de votre fichier .sqlite relatif au dossier de la base de données.', + 'name' => 'Nom de la base de donnée', + 'name_help' => 'Le nom de la base de données du panneau de gestion.', + 'username' => 'Nom d\'utilisateur de la base de données', + 'username_help' => 'Le nom de l\'utilisateur de votre base de données.', + 'password' => 'Mot de passe de la base de données', + 'password_help' => 'Le mot de passe de l\'utilisateur de votre base de données. Il peut être vide.', + ], + 'exceptions' => [ + 'connection' => 'Échec de la connexion à la base de données.', + 'migration' => 'Échec de la migration', + ], + ], + 'egg' => [ + 'title' => 'Œufs', + 'no_eggs' => 'Aucun œuf disponible', + 'background_install_started' => 'Installation de l’œuf démarrée', + 'background_install_description' => 'L’installation de :count œufs a été mise en file d\'attente et se poursuivra en arrière-plan.', + 'exceptions' => [ + 'failed_to_update' => 'Échec de la mise à jour de l’index des œufs', + 'no_eggs' => 'Aucun œuf n’est disponible pour l’installation pour le moment.', + 'installation_failed' => 'Échec de l’installation des œufs sélectionnés. Veuillez les importer après l’installation via la liste des œufs.', + ], + ], + 'session' => [ + 'title' => 'Session', + 'driver' => 'Pilote de session', + 'driver_help' => 'Le pilote utilisé pour stocker les sessions. Nous recommandons "Système de fichiers" ou "Base de données".', + ], + 'cache' => [ + 'title' => 'Cache', + 'driver' => 'Pilote du cache', + 'driver_help' => 'Le pilote utilisé pour la mise en cache. Nous recommandons "Système de fichiers".', + 'fields' => [ + 'host' => 'Hôte Redis', + 'host_help' => 'L\'hôte de votre serveur redis. Assurez-vous qu\'il est accessible.', + 'port' => 'Port Redis', + 'port_help' => 'Le port de votre serveur redis.', + 'username' => 'Nom d\'utilisateur Redis', + 'username_help' => 'Le nom de votre utilisateur redis. Il peut être vide', + 'password' => 'Mot de passe Redis', + 'password_help' => 'Le mot de passe de votre utilisateur redis. Peut-être vide.', + ], + 'exception' => 'Échec de la connexion à Redis', + ], + 'queue' => [ + 'title' => 'File d\'attente', + 'driver' => 'Pilote de file d\'attente', + 'driver_help' => 'Le pilote utilisé pour la gestion des files d\'attente. Nous vous recommandons "Base de données".', + 'fields' => [ + 'done' => 'J\'ai fait les deux étapes ci-dessous.', + 'done_validation' => 'Vous devez faire les deux étapes avant de continuer !', + 'crontab' => 'Exécutez la commande suivante pour configurer votre crontab. Notez que www-data est votre utilisateur du serveur web. Sur certains systèmes, ce nom d\'utilisateur peut être différent !', + 'service' => 'Pour configurer le queue worker, vous devez simplement exécuter la commande suivante.', + ], + ], + 'exceptions' => [ + 'write_env' => 'Impossible d\'écrire dans le fichier .env', + 'migration' => 'Impossible d\'exécuter les migrations', + 'create_user' => 'Impossible de créer l\'utilisateur admin', + ], + 'next_step' => 'Etape suivante', + 'finish' => 'Terminer', +]; diff --git a/lang/fr/notifications.php b/lang/fr/notifications.php new file mode 100644 index 0000000000..ac4d4cd54d --- /dev/null +++ b/lang/fr/notifications.php @@ -0,0 +1,18 @@ + 'Ouvrir le serveur', + 'installation_completed' => 'Installation du serveur terminée', + 'installation_failed' => 'Échec de l\'installation du serveur', + 'reinstallation_completed' => 'Réinstallation du serveur terminée', + 'reinstallation_failed' => 'Échec de la réinstallation du serveur', + 'failed' => 'Échec', + 'user_added' => [ + 'title' => 'Ajouté au serveur', + 'body' => 'Vous avez été ajouté en tant que sous-utilisateur à :server.', + ], + 'user_removed' => [ + 'title' => 'Retiré du serveur', + 'body' => 'Vous avez été retiré en tant que sous-utilisateur de :server.', + ], +]; diff --git a/lang/fr/pagination.php b/lang/fr/pagination.php deleted file mode 100644 index 85e0d87c86..0000000000 --- a/lang/fr/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Précédent', - 'next' => 'Suivant »', -]; diff --git a/lang/fr/passwords.php b/lang/fr/passwords.php deleted file mode 100644 index 93c272c2e3..0000000000 --- a/lang/fr/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Les mots de passe doivent contenir au moins six caractères et doivent être identiques.', - 'reset' => 'Votre mot de passe a été réinitialisé !', - 'sent' => 'Nous avons envoyé par e-mail le lien de réinitialisation de votre mot de passe !', - 'token' => 'Ce jeton de réinitialisation de mot de passe est invalide.', - 'user' => 'Nous n\'avons pas trouvé d\'utilisateur avec cette adresse email.', -]; diff --git a/lang/fr/profile.php b/lang/fr/profile.php new file mode 100644 index 0000000000..cd58be35be --- /dev/null +++ b/lang/fr/profile.php @@ -0,0 +1,70 @@ + 'Profil', + 'tabs' => [ + 'account' => 'Compte', + 'oauth' => 'OAuth', + 'activity' => 'Activité', + 'api_keys' => 'Clés API', + 'ssh_keys' => 'Clés SSH', + 'keys' => 'Clés', + '2fa' => '2FA', + 'customization' => 'Personnalisation', + ], + 'username' => 'Nom d\'utilisateur', + 'admin' => 'Administrateur', + 'exit_admin' => 'Quitter l\'admin', + 'server_list' => 'Liste des serveurs', + 'email' => 'E-mail', + 'password' => 'Mot de passe', + 'current_password' => 'Mot de passe actuel', + 'password_confirmation' => 'Confirmation du mot de passe', + 'timezone' => 'Fuseau Horaire', + 'language' => 'Langue', + 'language_help' => 'Votre langue :state n\'a pas encore été traduite !', + 'link' => 'Liens ', + 'unlink' => 'Retirer le lien ', + 'unlinked' => ':name dissocié', + 'scan_qr' => 'Scanner le QR code', + 'code' => 'Code', + 'setup_key' => 'Clé de configuration', + 'invalid_code' => 'Code 2FA invalide', + 'code_help' => 'Scannez le code QR ci-dessus en utilisant votre application d\'authentification en deux étapes, puis saisissez le code généré.', + '2fa_enabled' => 'L\'authentification à deux facteurs est actuellement activée.', + 'backup_help' => 'Celles-ci ne seront plus montrées!', + 'backup_codes' => 'Codes de Secours', + 'disable_2fa' => 'Désactiver 2FA', + 'disable_2fa_help' => 'Entrez votre code de 2FA actuel pour désactiver l\'authentification en deux étapes', + 'api_keys' => 'Clés API', + 'create_api_key' => 'Créer une nouvelle clé API', + 'api_key_created' => 'Clé API créée', + 'description' => 'Description', + 'allowed_ips' => 'Adresses IP autorisées', + 'allowed_ips_help' => 'Appuyez sur Entrée pour ajouter une nouvelle adresse IP ou laissez vide pour autoriser n\'importe quelle adresse IP', + 'ssh_keys' => 'Clés SSH', + 'create_ssh_key' => 'Créer une nouvelle clé SSH', + 'ssh_key_created' => 'Clé SSH créée', + 'name' => 'Nom', + 'public_key' => 'Clé publique', + 'could_not_create_ssh_key' => 'Impossible de créer la clé SSH', + 'dashboard' => 'Tableau de bord', + 'dashboard_layout' => 'Disposition du tableau de bord', + 'console' => 'Console', + 'grid' => 'Grille', + 'table' => 'Tableau', + 'rows' => 'Lignes', + 'font_size' => 'Taille de la police', + 'font' => 'Police de caractères', + 'font_preview' => 'Aperçu de la police', + 'seconds' => 'Secondes', + 'graph_period' => 'Période du graphique', + 'graph_period_helper' => 'Nombre de points de données, en secondes, affichés sur les graphiques de la console.', + 'navigation' => 'Type de navigation', + 'sidebar' => 'Barre latérale', + 'topbar' => 'Barre d\'entête', + 'mixed' => 'Mixte', + 'no_oauth' => 'Aucun compte lié', + 'no_api_keys' => 'Aucunes clés API', + 'no_ssh_keys' => 'Aucunes clés SSH', +]; diff --git a/lang/fr/search.php b/lang/fr/search.php new file mode 100644 index 0000000000..8a9cf65f03 --- /dev/null +++ b/lang/fr/search.php @@ -0,0 +1,9 @@ + 'Veuillez saisir au moins trois caractères pour commencer la recherche.', + 'term' => [ + 'label' => 'Terme de recherche', + 'description' => 'Entrez un nom de serveur, uuid ou une allocation pour commencer la recherche.', + ], +]; diff --git a/lang/fr/server/activity.php b/lang/fr/server/activity.php new file mode 100644 index 0000000000..70a406b9b9 --- /dev/null +++ b/lang/fr/server/activity.php @@ -0,0 +1,11 @@ + 'Activité', + 'event' => 'Événement', + 'user' => 'Utilisateur', + 'deleted_user' => 'Utilisateur supprimé', + 'system' => 'Système', + 'timestamp' => 'Horodatage', + 'metadata' => 'Metadonnée', +]; diff --git a/lang/fr/server/backup.php b/lang/fr/server/backup.php new file mode 100644 index 0000000000..3a84f28a6b --- /dev/null +++ b/lang/fr/server/backup.php @@ -0,0 +1,55 @@ + 'Sauvegardes', + 'empty' => 'Aucune sauvegarde', + 'size' => 'Taille', + 'created_at' => 'Créé à', + 'status' => 'Statut', + 'is_locked' => 'Statut de verrouillage', + 'backup_status' => [ + 'in_progress' => 'En cours', + 'successful' => 'Succès', + 'failed' => 'Échec', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Créer une sauvegarde', + 'limit' => 'Limite de sauvegarde atteinte', + 'created' => ':name créé', + 'notification_success' => 'Sauvegarde créée avec succès', + 'notification_fail' => 'Échec de la création de la sauvegarde', + 'name' => 'Nom', + 'ignored' => 'Fichiers et répertoires ignorés', + 'locked' => 'Verrouillé ?', + 'lock_helper' => 'Empêche cette sauvegarde d\'être supprimée jusqu\'à ce qu\'elle soit explicitement déverrouillée.', + ], + 'lock' => [ + 'lock' => 'Verrouiller', + 'unlock' => 'Déverrouiller', + ], + 'download' => 'Télécharger', + 'rename' => [ + 'title' => 'Renommer', + 'new_name' => 'Nom de la sauvegarde', + 'notification_success' => 'Sauvegarde renommée avec succès', + ], + 'restore' => [ + 'title' => 'Restaurer', + 'helper' => 'Votre serveur va être arrêté. Vous ne serez pas en mesure de contrôler l\'état d\'alimentation, d\'accéder au gestionnaire de fichiers ou de créer des sauvegardes supplémentaires tant que ce processus n\'est pas terminé.', + 'delete_all' => 'Supprimer tous les fichiers avant de restaurer la sauvegarde ?', + 'notification_started' => 'Restauration de la sauvegarde', + 'notification_success' => 'Sauvegarde restaurée avec succès', + 'notification_fail' => 'Échec de restauration de la sauvegarde', + 'notification_fail_body_1' => 'Ce serveur n\'est pas dans un état qui permet de restaurer une sauvegarde.', + 'notification_fail_body_2' => 'Cette sauvegarde ne peut pas être restaurée pour le moment : pas terminé ou a échoué.', + ], + 'delete' => [ + 'title' => 'Supprimer la sauvegarde', + 'description' => 'Voulez-vous supprimer :backup ?', + 'notification_success' => 'Sauvegarde supprimée', + 'notification_fail' => 'Impossible de supprimer la sauvegarde', + 'notification_fail_body' => 'La connexion au noeud a échoué. Veuillez réessayer.', + ], + ], +]; diff --git a/lang/fr/server/console.php b/lang/fr/server/console.php new file mode 100644 index 0000000000..057d9842aa --- /dev/null +++ b/lang/fr/server/console.php @@ -0,0 +1,43 @@ + 'Console', + 'command' => 'Tapez une commande...', + 'command_blocked' => 'Serveur hors ligne...', + 'command_blocked_title' => 'Impossible d\'envoyer la commande lorsque le serveur est hors ligne', + 'open_in_admin' => 'Ouvrir via le panneau admin', + 'power_actions' => [ + 'start' => 'Démarrer', + 'stop' => 'Arrêter', + 'restart' => 'Redémarrer', + 'kill' => 'Tuer', + 'kill_tooltip' => 'Cela peut entraîner une corruption des données et/ou une perte de données !', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Mémoire', + 'network' => 'Réseau', + 'disk' => 'Disque', + 'name' => 'Nom', + 'status' => 'Statut', + 'address' => 'Adresse', + 'unavailable' => 'Indisponible', + ], + 'status' => [ + 'created' => 'Créé', + 'starting' => 'Démarrage', + 'running' => 'En fonctionnement', + 'restarting' => 'Redémarrage', + 'exited' => 'Vous avez quitté', + 'paused' => 'En pause', + 'dead' => 'Mort', + 'removing' => '', + 'stopping' => 'En arrêt', + 'offline' => 'Hors-ligne', + 'missing' => 'Manquant', + ], + 'websocket_error' => [ + 'title' => 'Connexion au websocket impossible !', + 'body' => 'Consultez la console de votre navigateur pour plus de détails.', + ], +]; diff --git a/lang/fr/server/dashboard.php b/lang/fr/server/dashboard.php new file mode 100644 index 0000000000..867a441641 --- /dev/null +++ b/lang/fr/server/dashboard.php @@ -0,0 +1,28 @@ + 'Serveurs', + 'list' => 'Liste des serveurs', + 'tabs' => [ + 'my' => 'Mes serveurs', + 'other' => 'Serveurs d\'autrui', + 'all' => 'Tous les serveurs', + ], + 'empty_own' => 'Vous ne possédez aucun serveur !', + 'empty_other' => 'Vous n\'avez accès à aucun serveur !', + + 'status' => 'Statut', + 'server' => 'Serveur', + 'resources' => 'Ressources', + 'usage_limit' => 'Limite d\'utilisation : :resource', + + 'cpu' => 'CPU', + 'memory' => 'Mémoire', + 'disk' => 'Disque', + 'network' => 'Réseau', + 'none' => 'Aucun', + 'loading' => 'Chargement...', + + 'power_actions' => 'Actions d\'alimentation', + 'power_action_sent' => ':action envoyée à :name', +]; diff --git a/lang/fr/server/database.php b/lang/fr/server/database.php new file mode 100644 index 0000000000..aaea0a994f --- /dev/null +++ b/lang/fr/server/database.php @@ -0,0 +1,26 @@ + 'Bases de données', + 'empty' => 'Aucune base de données', + 'create_database' => 'Créer une base de données', + 'limit' => 'Limite de base de données atteinte', + 'viewing' => 'Consultation : :database', + 'host' => 'Hôte', + 'database' => 'Base de données', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'remote' => 'Distant', + 'created_at' => 'Créé à', + 'name' => 'Nom de la base de donnée', + 'name_hint' => 'Laisser vide va générer un nom aléatoire', + 'connections_from' => 'Connexions depuis', + 'max_connections' => 'Nombre de connexions maximum', + 'database_host' => 'Hôte de base de données', + 'database_host_select' => 'Sélectionner l\'hôte de la base de données', + 'jdbc' => 'Chaîne de connexion JDBC', + 'create_notification' => ':database créée', + 'create_notification_fail' => 'Impossible de créer :database', + 'delete_notification' => ':database supprimée', + 'delete_notification_fail' => 'Impossible de supprimer :database', +]; diff --git a/lang/fr/server/file.php b/lang/fr/server/file.php new file mode 100644 index 0000000000..896248136f --- /dev/null +++ b/lang/fr/server/file.php @@ -0,0 +1,111 @@ + 'Fichiers', + 'name' => 'Nom', + 'size' => 'Taille', + 'modified_at' => 'Modifié le', + 'actions' => [ + 'open' => 'Ouvrir', + 'download' => 'Télécharger', + 'copy' => [ + 'title' => 'Copier', + 'notification' => 'Fichier copié', + ], + 'upload' => [ + 'title' => 'Importer', + 'from_files' => 'Importer des fichiers', + 'from_url' => 'Importer depuis l\'URL', + 'url' => 'URL', + 'drop_files' => 'Déposez les fichiers à envoyer', + 'success' => 'Fichiers envoyés avec succès', + 'failed' => 'Impossible d\'envoyer les fichiers', + 'header' => 'Envoi des fichiers', + 'error' => 'Une erreur est survenue pendant l\'envoi', + ], + 'rename' => [ + 'title' => 'Renommer', + 'file_name' => 'Nom du fichier', + 'notification' => 'Fichier renommé', + ], + 'move' => [ + 'title' => 'Déplacer', + 'directory' => 'Dossier', + 'directory_hint' => 'Entrez le nouveau répertoire, relatif au répertoire courant.', + 'new_location' => 'Nouvel emplacement', + 'new_location_hint' => 'Entrez l\'emplacement de ce fichier ou du dossier, relatif au répertoire courant.', + 'notification' => 'Fichier déplacé', + 'bulk_notification' => ':count fichiers ont été déplacés vers :directory', + ], + 'permissions' => [ + 'title' => 'Permissions', + 'read' => 'Lecture', + 'write' => 'Écriture', + 'execute' => 'Exécution', + 'owner' => 'Propriétaire', + 'group' => 'Groupe', + 'public' => 'Public', + 'notification' => 'Permissions changées en :mode', + ], + 'archive' => [ + 'title' => 'Archiver', + 'archive_name' => 'Nom de l\'archive', + 'notification' => 'Archive créée', + 'extension' => 'Extension', + ], + 'unarchive' => [ + 'title' => 'Désarchiver', + 'notification' => 'Désarchivage terminé', + ], + 'new_file' => [ + 'title' => 'Nouveau fichier', + 'file_name' => 'Nom du nouveau fichier', + 'syntax' => 'Coloration syntaxique', + 'create' => 'Créer', + ], + 'new_folder' => [ + 'title' => 'Nouveau dossier', + 'folder_name' => 'Nouveau nom de dossier', + ], + 'nested_search' => [ + 'title' => 'Recherche imbriquée', + 'search_term' => 'Terme de recherche', + 'search_term_placeholder' => 'Saisissez un terme de recherche, par ex. *.txt', + 'search' => 'Rechercher', + 'search_for_term' => 'Recherche :term', + ], + 'delete' => [ + 'notification' => 'Fichier supprimé', + 'bulk_notification' => ':count fichiers ont été supprimés', + ], + 'edit' => [ + 'title' => 'Édition: :file', + 'save_close' => 'Enregistrer & Fermer', + 'save' => 'Enregistrer', + 'cancel' => 'Annuler', + 'notification' => 'Fichier enregistré', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name est trop grand !', + 'body' => 'Le max est de :max', + ], + 'file_not_found' => [ + 'title' => ':name introuvable !', + ], + 'file_not_editable' => [ + 'title' => ':name est un dossier', + ], + 'file_already_exists' => [ + 'title' => ':name existe déjà !', + ], + 'files_node_error' => [ + 'title' => 'Impossible de charger les fichiers !', + ], + 'pelicanignore' => [ + 'title' => 'Vous éditez un fichier .pelicanignore !', + 'body' => 'Tous les fichiers et dossiers listés ici vont être exclus des sauvegardes. Les wildcards sont supportées en utilisant un astérisque (*).
Vous pouvez annuler une règle précédente en préfixant un point d\'exclamation (!).', + ], + ], +]; diff --git a/lang/fr/server/network.php b/lang/fr/server/network.php new file mode 100644 index 0000000000..5c81357020 --- /dev/null +++ b/lang/fr/server/network.php @@ -0,0 +1,17 @@ + 'Réseau', + 'add' => 'Ajouter une allocation', + 'limit' => 'Limite d’allocation atteinte', + 'address' => 'Adresse', + 'port' => 'Port', + 'notes' => 'Notes', + 'no_notes' => 'Pas de notes', + 'make_primary' => 'Définir comme principale', + 'primary' => 'Principal', + 'make' => 'Assembler', + 'delete' => 'Supprimer', + 'locked' => 'Verrouillé ?', + 'locked_helper' => 'Les allocations verrouillées ne peuvent être supprimées que par les administrateurs', +]; diff --git a/lang/fr/server/schedule.php b/lang/fr/server/schedule.php new file mode 100644 index 0000000000..6707f45741 --- /dev/null +++ b/lang/fr/server/schedule.php @@ -0,0 +1,121 @@ + 'Planifications', + 'new' => 'Nouvelle planification', + 'edit' => 'Modifier la planification', + 'save' => 'Enregistrer la planification', + 'delete' => 'Supprimer la planification', + 'import' => 'Importer une planification', + 'export' => 'Exporter la planification', + 'name' => 'Nom', + 'cron' => 'Cron', + 'status' => 'Statut', + 'schedule_status' => [ + 'inactive' => 'Inactif', + 'processing' => 'Traitement en cours', + 'active' => 'Actif', + ], + 'no_tasks' => 'Aucune tâche', + 'run_now' => 'Exécuter maintenant', + 'online_only' => 'Uniquement lorsque connecté', + 'last_run' => 'Dernière exécution', + 'next_run' => 'Prochaine exécution', + 'never' => 'Jamais', + 'cancel' => 'Annuler', + + 'only_online' => 'Seulement lorsque le serveur est en ligne ?', + 'only_online_hint' => 'Exécute ce planning uniquement lorsque le serveur est en état d\'exécution.', + 'enabled' => 'Activer la planification ?', + 'enabled_hint' => 'Ce calendrier sera exécuté automatiquement si activé.', + + 'cron_body' => 'N\'oubliez pas que les entrées cron ci-dessous utilisent toujours UTC.', + 'cron_timezone' => 'Prochaine exécution dans votre fuseau horaire (:timezone): :next_run ', + + 'invalid' => 'Invalide', + + 'time' => [ + 'minute' => 'Minute', + 'hour' => 'Heure', + 'day' => 'Jour', + 'week' => 'Semaine', + 'month' => 'Mois', + 'day_of_month' => 'Jour du mois', + 'day_of_week' => 'Jour de la semaine', + + 'hourly' => 'Chaque heure', + 'daily' => 'Quotidiennement', + 'weekly_mon' => 'Hebdomadaire (lundi)', + 'weekly_sun' => 'Hebdomadaire (dimanche)', + 'monthly' => 'Mensuel', + 'every_min' => 'Toutes les x minutes', + 'every_hour' => 'Toutes les x heures', + 'every_day' => 'Tous les x jours', + 'every_week' => 'Toutes les x semaines', + 'every_month' => 'Tous les x mois', + 'every_day_of_week' => 'Tous les x jours de la semaine', + + 'every' => 'Tous les', + 'minutes' => 'Minutes', + 'hours' => 'Heures', + 'days' => 'Jours', + 'months' => 'Mois', + + 'monday' => 'Lundi', + 'tuesday' => 'Mardi', + 'wednesday' => 'Mercredi', + 'thursday' => 'Jeudi', + 'friday' => 'Vendredi', + 'saturday' => 'Samedi', + 'sunday' => 'Dimanche', + ], + + 'tasks' => [ + 'title' => 'Tâches', + 'create' => 'Créer une tâche', + 'limit' => 'Limite de tâche atteinte', + 'action' => 'Action', + 'payload' => 'Charge utile', + 'no_payload' => 'Aucune charge utile', + 'time_offset' => 'Décalage horaire', + 'first_task' => 'Première tâche', + 'seconds' => 'Secondes', + 'continue_on_failure' => 'Continuer en cas d\'échec', + + 'actions' => [ + 'title' => 'Action', + 'power' => [ + 'title' => 'Envoyer une action d\'alimentation', + 'action' => 'Action d\'alimentation', + 'start' => 'Démarrer', + 'stop' => 'Arrêter', + 'restart' => 'Redémarrer', + 'kill' => 'Tuer', + ], + 'command' => [ + 'title' => 'Envoyer une commande', + 'command' => 'Commande', + ], + 'backup' => [ + 'title' => 'Créer une sauvegarde', + 'files_to_ignore' => 'Fichiers à ignorer', + ], + 'delete_files' => [ + 'title' => 'Supprimer les fichiers', + 'files_to_delete' => 'Fichiers à supprimer', + ], + ], + ], + + 'notification_invalid_cron' => 'Les données cron fournies ne sont pas évaluées à une expression valide', + + 'import_action' => [ + 'file' => 'Fichier', + 'url' => 'URL', + 'schedule_help' => 'Ceci doit être le fichier .json brut ( schedule-daily-restart.json )', + 'url_help' => 'Les URL doivent pointer directement vers le fichier .json brut', + 'add_url' => 'Nouvelle URL', + 'import_failed' => 'Échec de l\'importation', + 'import_success' => 'Importation réussie', + ], +]; diff --git a/lang/fr/server/setting.php b/lang/fr/server/setting.php new file mode 100644 index 0000000000..ae407ef94c --- /dev/null +++ b/lang/fr/server/setting.php @@ -0,0 +1,55 @@ + 'Paramètres', + 'server_info' => [ + 'title' => 'Information serveur', + 'information' => 'Information', + 'name' => 'Nom du serveur', + 'server_name' => 'Nom du serveur: :name', + 'notification_name' => 'Nom du serveur mis à jour', + 'description' => 'Description du serveur', + 'notification_description' => 'Description du serveur mise à jour', + 'failed' => 'Échec', + 'uuid' => 'UUID du serveur', + 'uuid_short' => 'ID serveur', + 'node_name' => 'Nom du noeud', + 'icon' => [ + 'upload' => 'Téléverser une icône', + 'tooltip' => 'Utiliser l\'icône de l\'Oeuf', + 'updated' => 'Icône du serveur mise à jour', + 'deleted' => 'Icône du serveur supprimée', + ], + 'limits' => [ + 'title' => 'Limites', + 'unlimited' => 'Illimité', + 'of' => 'de', + 'cpu' => 'CPU', + 'memory' => 'Mémoire', + 'disk' => 'Espace disque', + 'backups' => 'Sauvegardes', + 'databases' => 'Bases de données', + 'allocations' => 'Allocations', + 'no_allocations' => 'Aucune allocation supplémentaire', + ], + 'sftp' => [ + 'title' => 'Informations SFTP', + 'connection' => 'Connexion', + 'action' => 'Se connecter au SFTP', + 'username' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'password_body' => 'Votre mot de passe SFTP est le même que celui que vous utilisez pour accéder à ce panneau.', + ], + ], + 'reinstall' => [ + 'title' => 'Réinstaller le serveur', + 'body' => 'Réinstaller votre serveur l\'arrêtera, puis va relancer le script d\'installation qui l\'a initialement configuré.', + 'body2' => 'Certains fichiers peuvent être supprimés ou modifiés durant ce processus, veuillez sauvegarder vos données avant de continuer.', + 'action' => 'Réinstaller', + 'modal' => 'Êtes-vous sûr de vouloir réinstaller ce serveur ?', + 'modal_description' => 'Certains fichiers peuvent être supprimés ou modifiés durant ce processus, veuillez sauvegarder vos données avant de continuer.', + 'yes' => 'Oui, réinstaller', + 'notification_start' => 'Réinstallation démarrée', + 'notification_fail' => 'Réinstallation échouée', + ], +]; diff --git a/lang/fr/server/startup.php b/lang/fr/server/startup.php new file mode 100644 index 0000000000..f97e3c05b1 --- /dev/null +++ b/lang/fr/server/startup.php @@ -0,0 +1,17 @@ + 'Démarrage', + 'command' => 'Commande de démarrage', + 'notification_startup' => 'Commande de démarrage mise à jour', + 'notification_startup_body' => 'Redémarrez le serveur pour utiliser la nouvelle commande de démarrage.', + 'enable_preview' => 'Activer l\'aperçu', + 'disable_preview' => 'Désactiver l\'aperçu', + 'docker_image' => 'Image Docker', + 'notification_docker' => 'Image Docker mise à jour', + 'notification_docker_body' => 'Redémarrez le serveur pour utiliser la nouvelle image.', + 'variables' => 'Variables serveur', + 'update' => 'Mis à jour : :variable', + 'fail' => 'Mis à jour : :variable', + 'validation_fail' => 'Échec de validation : :variable', +]; diff --git a/lang/fr/server/user.php b/lang/fr/server/user.php new file mode 100644 index 0000000000..2221812405 --- /dev/null +++ b/lang/fr/server/user.php @@ -0,0 +1,73 @@ + 'Utilisateurs', + 'username' => 'Nom d\'utilisateur', + 'email' => 'E-mail', + 'assign_all' => 'Assigner tout', + 'invite_user' => 'Inviter un utilisateur', + 'action' => 'Inviter', + 'remove' => 'Supprimer l\'utilisateur', + 'edit' => 'Editer l\'utilisateur', + 'editing' => 'Modification de :user', + 'delete' => 'Supprimer l\'utilisateur', + 'notification_add' => 'Utilisateur invité !', + 'notification_edit' => 'Utilisateur mis à jour !', + 'notification_delete' => 'Utilisateur supprimé !', + 'notification_failed' => 'Impossible d\'inviter l\'utilisateur !', + 'permissions' => [ + 'title' => 'Permissions', + 'activity_desc' => 'Autorisations qui contrôlent l\'accès d\'un utilisateur aux journaux d\'activité du serveur.', + 'startup_desc' => 'Autorisations qui contrôlent la capacité d\'un utilisateur à voir les paramètres de démarrage de ce serveur.', + 'settings_desc' => 'Autorisations qui contrôlent la capacité d\'un utilisateur à voir les paramètres de démarrage de ce serveur.', + 'control_desc' => 'Autorisations qui contrôlent la capacité d\'un utilisateur à contrôler l\'état de puissance d\'un serveur, ou envoyer des commandes.', + 'user_desc' => 'Permissions qui permettent à un utilisateur de gérer d\'autres sous-utilisateurs sur un serveur. Ils ne pourront jamais modifier leur propre compte ou assigner des autorisations qu\'ils n\'ont pas eux-mêmes.', + 'file_desc' => 'Autorisations qui contrôlent la possibilité pour un utilisateur de modifier le système de fichiers pour ce serveur.', + 'allocation_desc' => 'Autorisations qui contrôlent la possibilité pour un utilisateur de modifier les allocations de port pour ce serveur.', + 'database_desc' => 'Autorisations qui contrôlent l\'accès d\'un utilisateur à la gestion de la base de données pour ce serveur.', + 'backup_desc' => 'Autorisations qui contrôlent la capacité d\'un utilisateur à générer et gérer des sauvegardes de serveur.', + 'schedule_desc' => 'Autorisations qui contrôlent l\'accès d\'un utilisateur à la gestion des programmations pour ce serveur.', + 'startup_read' => 'Permet à un utilisateur de voir les variables de démarrage d\'un serveur.', + 'startup_update' => 'Permet à un utilisateur de voir les variables de démarrage d\'un serveur.', + 'startup_docker_image' => 'Permet à un utilisateur de modifier l\'image Docker utilisée lors de l\'exécution du serveur.', + 'settings_reinstall' => 'Permet à un utilisateur de déclencher une réinstallation de ce serveur.', + 'settings_rename' => 'Permet à un utilisateur de renommer et de modifier la description de ce serveur', + 'settings_description' => 'Permet à un utilisateur de changer la description de ce serveur.', + 'activity_read' => 'Permet à un utilisateur de voir les journaux d\'activité du serveur.', + 'websocket_connect' => 'Permet à un utilisateur d\'accéder à la Websocket pour ce serveur.', + 'control_console' => 'Permet à un utilisateur d\'envoyer des données à la console du serveur.', + 'control_start' => 'Permet à un utilisateur de démarrer l\'instance du serveur.', + 'control_stop' => 'Permet à un utilisateur d\'arrêter l\'instance du serveur.', + 'control_restart' => 'Permet à un utilisateur de redémarrer l\'instance du serveur.', + 'control_kill' => 'Permet à un utilisateur de tuer l\'instance du serveur.', + 'user_create' => 'Permet à un utilisateur de créer de nouveaux comptes utilisateur pour le serveur.', + 'user_read' => 'Autorise l\'utilisateur à voir les utilisateurs associés à ce serveur.', + 'user_update' => 'Autorise l\'utilisateur à modifier les autres utilisateurs associés à ce serveur.', + 'user_delete' => 'Autorise l\'utilisateur à supprimer les autres utilisateurs associés à ce serveur.', + 'file_create' => 'Autorise l\'utilisateur à créer de nouveaux fichiers et dossiers.', + 'file_read' => 'Permet à un utilisateur de visualiser le contenu d\'un répertoire, mais pas de visualiser le contenu ou de télécharger des fichiers.', + 'file_read_content' => 'Permet à un utilisateur de visualiser le contenu d\'un fichier donné. Cela permettra également à l\'utilisateur de télécharger des fichiers.', + 'file_update' => 'Permet à un utilisateur de mettre à jour les fichiers et dossiers associés au serveur.', + 'file_delete' => 'Permet à un utilisateur de supprimer des fichiers et des répertoires.', + 'file_archive' => 'Permet à un utilisateur de créer des archives de fichiers et de décompresser des archives existantes.', + 'file_sftp' => 'Permet à un utilisateur d\'effectuer les actions de fichier ci-dessus en utilisant un client SFTP.', + 'allocation_read' => 'Permet à un utilisateur de voir toutes les allocations actuellement assignées à ce serveur. Les utilisateurs ayant n\'importe quel niveau d\'accès à ce serveur peuvent toujours voir l\'allocation principale.', + 'allocation_update' => 'Permet à un utilisateur de modifier l\'allocation principale du serveur et d\'attacher des notes à chaque allocation.', + 'allocation_delete' => 'Permet à un utilisateur de supprimer une allocation du serveur.', + 'allocation_create' => 'Permet à un utilisateur d\'affecter des allocations supplémentaires au serveur.', + 'database_create' => 'Autorise un utilisateur à créer une nouvelle base de données pour le serveur.', + 'database_read' => 'Autorise un utilisateur à voir les bases de données du serveur.', + 'database_update' => 'Autorise un utilisateur à modifier une base de données. Si l\'utilisateur n\'a pas la permission "Voir le mot de passe", il ne sera pas en mesure de modifier le mot de passe.', + 'database_delete' => 'Autorise un utilisateur à supprimer une base de données.', + 'database_view_password' => 'Autorise un utilisateur à visualiser un mot de passe de base de données.', + 'schedule_create' => 'Autorise un utilisateur à créer une planification pour le serveur.', + 'schedule_read' => 'Autorise un utilisateur à voir les planifications d\'un serveur.', + 'schedule_update' => 'Autorise un utilisateur à apporter des modifications à une planification d\'un serveur existant.', + 'schedule_delete' => 'Autorise un utilisateur à supprimer une planification pour le serveur.', + 'backup_create' => 'Permet à un utilisateur de créer de nouveaux comptes utilisateur pour le serveur.', + 'backup_read' => 'Permet à un utilisateur de voir toutes les sauvegardes qui existent pour ce serveur.', + 'backup_delete' => 'Permet à un utilisateur de supprimer les sauvegardes du système.', + 'backup_download' => 'Permet à un utilisateur de télécharger une sauvegarde pour le serveur. Danger : cela permet à un utilisateur d\'accéder à tous les fichiers du serveur dans la sauvegarde.', + 'backup_restore' => 'Permet à un utilisateur de restaurer une sauvegarde pour le serveur. Danger : cela permet à l\'utilisateur de supprimer tous les fichiers du serveur.', + ], +]; diff --git a/lang/fr/server/users.php b/lang/fr/server/users.php deleted file mode 100644 index 3d57732c52..0000000000 --- a/lang/fr/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Autorise l\'accès au Websocket pour ce serveur.', - 'control_console' => 'Permet à l\'utilisateur d\'envoyer des commandes à la console du serveur.', - 'control_start' => 'Autorise l\'utilisateur à démarrer l\'instance du serveur.', - 'control_stop' => 'Autorise l\'utilisateur à arrêter l\'instance du serveur.', - 'control_restart' => 'Autorise l\'utilisateur à redémarrer l\'instance du serveur.', - 'control_kill' => 'Autorise l\'utilisateur à tuer l\'instance du serveur.', - 'user_create' => 'Permet à l\'utilisateur de créer de nouveaux comptes utilisateur pour le serveur.', - 'user_read' => 'Autorise l\'utilisateur à voir les utilisateurs associés à ce serveur.', - 'user_update' => 'Autorise l\'utilisateur à modifier les autres utilisateurs associés à ce serveur.', - 'user_delete' => 'Autorise l\'utilisateur à supprimer les autres utilisateurs associés à ce serveur.', - 'file_create' => 'Autorise l\'utilisateur à créer de nouveaux fichiers et dossiers.', - 'file_read' => 'Permet à l\'utilisateur de voir les fichiers et dossiers associés à cette instance de serveur, ainsi que de voir leur contenu.', - 'file_update' => 'Autorise l\'utilisateur à modifier les autres utilisateurs associés à ce serveur.', - 'file_delete' => 'Autorise l\'utilisateur à supprimer des fichiers et des dossiers.', - 'file_archive' => 'Autorise l\'utilisateur à créer des archives de fichiers et décompresser des archives existantes.', - 'file_sftp' => 'Autorise l\'utilisateur à effectuer les actions de fichier ci-dessus en utilisant un client SFTP.', - 'allocation_read' => 'Autorise l\'accès aux pages de gestion d\'allocation du serveur.', - 'allocation_update' => 'Autorise l\'utilisateur à apporter des modifications aux allocations du serveur.', - 'database_create' => 'Autorise l\'utilisateur à créer une nouvelle base de données pour le serveur.', - 'database_read' => 'Autorise l\'utilisateur à voir les bases de données du serveur.', - 'database_update' => 'Autorise un utilisateur à modifier une base de données. Si l\'utilisateur n\'a pas la permission "Voir le mot de passe", il ne sera pas en mesure de modifier le mot de passe.', - 'database_delete' => 'Autorise un utilisateur à supprimer une base de données.', - 'database_view_password' => 'Autorise un utilisateur à visualiser un mot de passe de base de données.', - 'schedule_create' => 'Autorise un utilisateur à créer une planification pour le serveur.', - 'schedule_read' => 'Autorise un utilisateur à voir les planifications d\'un serveur.', - 'schedule_update' => 'Autorise un utilisateur à apporter des modifications à une planification d\'un serveur existant.', - 'schedule_delete' => 'Autorise un utilisateur à supprimer une planification pour le serveur.', - ], -]; diff --git a/lang/fr/strings.php b/lang/fr/strings.php deleted file mode 100644 index 03491ea7dc..0000000000 --- a/lang/fr/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-mail', - 'email_address' => 'Adresse e-mail', - 'user_identifier' => 'Nom d\'utilisateur ou e-mail', - 'password' => 'Mot de passe', - 'new_password' => 'Nouveau mot de passe', - 'confirm_password' => 'Confirmer le nouveau mot de passe', - 'login' => 'Connexion', - 'home' => 'Accueil', - 'servers' => 'Serveurs', - 'id' => 'ID', - 'name' => 'Nom', - 'node' => 'Nœud', - 'connection' => 'Connexion', - 'memory' => 'Mémoire', - 'cpu' => 'CPU', - 'disk' => 'Disque', - 'status' => 'Statut', - 'search' => 'Rechercher', - 'suspended' => 'Suspendu', - 'account' => 'Compte', - 'security' => 'Sécurité', - 'ip' => 'Adresse IP', - 'last_activity' => 'Dernière activité', - 'revoke' => 'Révoquer', - '2fa_token' => 'Jeton d\'authentification', - 'submit' => 'Soumettre', - 'close' => 'Fermer', - 'settings' => 'Paramètres', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Bases de données', - 'memo' => 'Note', - 'created' => 'Créé(e)', - 'expires' => 'Expire le', - 'public_key' => 'Jeton', - 'api_access' => 'Accès API', - 'never' => 'jamais', - 'sign_out' => 'Déconnexion', - 'admin_control' => 'Panneau d\'administration', - 'required' => 'Requis', - 'port' => 'Port', - 'username' => 'Nom d\'utilisateur', - 'database' => 'Base de données', - 'new' => 'Nouveau', - 'danger' => 'Danger', - 'create' => 'Créer', - 'select_all' => 'Tout sélectionner', - 'select_none' => 'Annuler la sélection', - 'alias' => 'Alias', - 'primary' => 'Principal', - 'make_primary' => 'Définir comme principale', - 'none' => 'Aucun', - 'cancel' => 'Annuler', - 'created_at' => 'Créé à', - 'action' => 'Action', - 'data' => 'Données', - 'queued' => 'Ajouté à la file d\'attente', - 'last_run' => 'Dernière exécution', - 'next_run' => 'Prochaine exécution', - 'not_run_yet' => 'Pas encore exécuté', - 'yes' => 'Oui', - 'no' => 'Non', - 'delete' => 'Supprimer', - '2fa' => 'A2F', - 'logout' => 'Déconnexion', - 'admin_cp' => 'Panel d\'administration', - 'optional' => 'Facultatif', - 'read_only' => 'Lecture seule', - 'relation' => 'Relation', - 'owner' => 'Propriétaire', - 'admin' => 'Admin', - 'subuser' => 'Sous-utilisateur', - 'captcha_invalid' => 'Le captcha fourni est invalide.', - 'tasks' => 'Tâches', - 'seconds' => 'Secondes', - 'minutes' => 'Minutes', - 'under_maintenance' => 'En maintenance', - 'days' => [ - 'sun' => 'Dimanche', - 'mon' => 'Lundi', - 'tues' => 'Mardi', - 'wed' => 'Mercredi', - 'thurs' => 'Jeudi', - 'fri' => 'Vendredi', - 'sat' => 'Samedi', - ], - 'last_used' => 'Dernière utilisation', - 'enable' => 'Activer', - 'disable' => 'Désactiver', - 'save' => 'Enregistrer', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/fr/validation.php b/lang/fr/validation.php index 4e06fdb88c..189797cdd5 100644 --- a/lang/fr/validation.php +++ b/lang/fr/validation.php @@ -28,7 +28,7 @@ 'string' => 'Le champ :attribute doit contenir entre :min et :max caractères.', 'array' => 'Le champ :attribute doit avoir entre :min et :max éléments.', ], - 'boolean' => 'Le champ :attribute doit être vrai ou faux.', + 'confirmed' => 'La confirmation :attribute ne correspond pas.', 'date' => 'Le champ :attribute n\'est pas une date valide.', 'date_format' => 'Le champ :attribute ne correspond pas au format :format.', @@ -36,13 +36,13 @@ 'digits' => 'Le champ :attribute doit avoir :digits chiffres.', 'digits_between' => 'Le champ :attribute doit contenir entre :min et :max chiffres.', 'dimensions' => 'Les dimensions de l\'image pour le champ :attribute sont invalides.', - 'distinct' => 'Le champ :attribute a une valeur en double.', + 'email' => 'Le champ :attribute doit être une adresse e-mail valide.', - 'exists' => 'Le champ :attribute sélectionné n\'est pas valide.', + 'file' => 'Le champ :attribute doit être un fichier.', 'filled' => 'Le champ :attribute est requis.', 'image' => 'Le champ :attribute doit être une image.', - 'in' => 'Le champ :attribute sélectionné n\'est pas valide.', + 'in_array' => 'Le champ :attribute n\'existe pas dans :other.', 'integer' => 'Le champ :attribute doit être un entier.', 'ip' => 'Le champ :attribute doit être une adresse IP valide.', @@ -61,17 +61,13 @@ 'string' => 'Le champ :attribute doit contenir au moins :min caractères.', 'array' => 'Le champ :attribute doit avoir au moins :min éléments.', ], - 'not_in' => 'Le champ :attribute sélectionné n\'est pas valide.', + 'numeric' => 'Le champ :attribute doit être un nombre.', - 'present' => 'Le champ :attribute doit être présent.', + 'regex' => 'Le format du champ :attribute est invalide.', - 'required' => 'Le champ :attribute est requis.', - 'required_if' => 'Le champ :attribute est requis lorsque :other est :value.', - 'required_unless' => 'Le champ :attribute est requis sauf si :other est dans :values.', - 'required_with' => 'Le champ :attribute est requis lorsque :values est présent.', + 'required_with_all' => 'Le champ :attribute est requis lorsque :values est présent.', - 'required_without' => 'Le champ :attribute est obligatoire quand :values n\'est pas présent.', - 'required_without_all' => 'Le champ :attribute est requis quand aucune des :values n\'est présente.', + 'same' => 'Les champs :attribute et :other doivent être identiques.', 'size' => [ 'numeric' => 'Le champ :attribute doit être :size.', @@ -81,8 +77,7 @@ ], 'string' => 'Le champ :attribute doit être une chaîne de caractères.', 'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.', - 'unique' => 'Le champ :attribute a déjà été pris.', - 'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.', + 'url' => 'Le format du champ :attribute est invalide.', /* @@ -101,6 +96,6 @@ // Internal validation logic for Panel 'internal' => [ 'variable_value' => 'variable :env', - 'invalid_password' => 'Le mot de passe fourni n\'est pas valide pour ce compte.', + 'invalid_password' => 'Le mot de passe fourni est invalide pour ce compte.', ], ]; diff --git a/lang/he/activity.php b/lang/he/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/he/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/he/admin/eggs.php b/lang/he/admin/eggs.php deleted file mode 100644 index bdf4b4c222..0000000000 --- a/lang/he/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'ביצה זו והמשתנים הקשורים לה יובאו בהצלחה.', - 'updated_via_import' => 'ביצה זו עודכנה באמצעות הקובץ שסופק.', - 'deleted' => 'נמחקה בהצלחה הביצה המבוקשת מהחלונית.', - 'updated' => 'תצורת הביצה עודכנה בהצלחה.', - 'script_updated' => 'סקריפט התקנת הביצה עודכן ויפעל בכל פעם שיותקנו שרתים.', - 'egg_created' => 'ביצה חדשה הוטלה בהצלחה. תצטרך להפעיל מחדש את כל הדמונים הפועלים כדי להחיל את התיקון החדש הזה.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'המשתנה ":variable" נמחק ולא יהיה זמין יותר לשרתים לאחר הבנייה מחדש.', - 'variable_updated' => 'המשתנה ":variable" עודכן. תצטרך לבנות מחדש את כל השרתים המשתמשים במשתנה זה כדי להחיל שינויים.', - 'variable_created' => 'משתנה חדש נוצר בהצלחה והוקצה לביצה זו.', - ], - ], -]; diff --git a/lang/he/admin/node.php b/lang/he/admin/node.php deleted file mode 100644 index 7774102ea6..0000000000 --- a/lang/he/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'כתובת ה-FQDN או ה-IP שסופקו אינם פונים לכתובת IP חוקית.', - 'fqdn_required_for_ssl' => 'דרוש שם דומיין מוסמך במלואו שמגיע לכתובת IP ציבורית כדי להשתמש ב-SSL עבור צומת זה.', - ], - 'notices' => [ - 'allocations_added' => 'הקצאות נוספו בהצלחה לצומת זה.', - 'node_deleted' => 'הצומת הוסר מהחלונית בהצלחה.', - 'node_created' => 'צומת חדש נוצר בהצלחה. אתה יכול להגדיר באופן אוטומטי את הדמון במחשב זה על ידי ביקור בכרטיסייה \'תצורה\'. לפני שתוכל להוסיף שרתים, תחילה עליך להקצות לפחות כתובת IP אחת ויציאה אחת.', - 'node_updated' => 'מידע הצומת עודכן. אם הגדרות דמון כלשהן שונו, תצטרך לאתחל אותה כדי שהשינויים האלה ייכנסו לתוקף.', - 'unallocated_deleted' => 'מחק את כל היציאות שלא הוקצו עבור :ip.', - ], -]; diff --git a/lang/he/admin/server.php b/lang/he/admin/server.php deleted file mode 100644 index 4a181b1df5..0000000000 --- a/lang/he/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'אתה מנסה למחוק את הקצאת ברירת המחדל עבור שרת זה, אך אין הקצאה חוזרת לשימוש.', - 'marked_as_failed' => 'שרת זה סומן כנכשל בהתקנה קודמת. לא ניתן לשנות את המצב הנוכחי במצב זה.', - 'bad_variable' => 'אירעה שגיאת אימות עם המשתנה :name.', - 'daemon_exception' => 'היה חריג בעת ניסיון לתקשר עם הדמון וכתוצאה מכך קוד תגובה של HTTP/:code. חריג זה נרשם. (מזהה בקשה: :request_id)', - 'default_allocation_not_found' => 'הקצאת ברירת המחדל המבוקשת לא נמצאה בהקצאות של שרת זה.', - ], - 'alerts' => [ - 'startup_changed' => 'תצורת האתחול של שרת זה עודכנה. אם הביצה של שרת זה שונתה, תתבצע התקנה מחדש כעת.', - 'server_deleted' => 'השרת נמחק בהצלחה מהמערכת.', - 'server_created' => 'השרת נוצר בהצלחה בחלונית. אנא אפשר לדמון כמה דקות להתקין את השרת הזה לחלוטין.', - 'build_updated' => 'פרטי הבנייה של שרת זה עודכנו. שינויים מסוימים עשויים לדרוש הפעלה מחדש כדי להיכנס לתוקף.', - 'suspension_toggled' => 'סטטוס השעיית השרת שונה ל-:status.', - 'rebuild_on_boot' => 'שרת זה סומן כמי שדורש בנייה מחדש של קונטיינר Docker. זה יקרה בפעם הבאה שהשרת יופעל.', - 'install_toggled' => 'סטטוס ההתקנה של שרת זה השתנה.', - 'server_reinstalled' => 'שרת זה עמד בתור להתקנה מחדש שמתחילה כעת.', - 'details_updated' => 'פרטי השרת עודכנו בהצלחה.', - 'docker_image_updated' => 'שינה בהצלחה את תמונת ברירת המחדל של Docker לשימוש עבור שרת זה. נדרש אתחול כדי להחיל שינוי זה.', - 'node_required' => 'עליך להגדיר לפחות צומת אחד לפני שתוכל להוסיף שרת ללוח זה.', - 'transfer_nodes_required' => 'עליך להגדיר לפחות שני צמתים לפני שתוכל להעביר שרתים.', - 'transfer_started' => 'העברת השרת החלה.', - 'transfer_not_viable' => 'לצומת שבחרת אין את שטח הדיסק או הזיכרון הנדרשים כדי להכיל שרת זה.', - ], -]; diff --git a/lang/he/admin/user.php b/lang/he/admin/user.php deleted file mode 100644 index f2e2bd3ffd..0000000000 --- a/lang/he/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'לא ניתן למחוק משתמש עם שרתים פעילים המחוברים לחשבון שלו. נא למחוק את השרתים שלהם לפני שתמשיך.', - 'user_is_self' => 'לא ניתן למחוק את חשבון המשתמש שלך.', - ], - 'notices' => [ - 'account_created' => 'החשבון נוצר בהצלחה.', - 'account_updated' => 'החשבון עודכן בהצלחה.', - ], -]; diff --git a/lang/he/auth.php b/lang/he/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/he/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/he/command/messages.php b/lang/he/command/messages.php deleted file mode 100644 index 573334abb9..0000000000 --- a/lang/he/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'הזן שם משתמש, מזהה משתמש או כתובת דואר אלקטרוני', - 'select_search_user' => 'מזהה המשתמש שיש למחוק (הזן \'0\' כדי לחפש מחדש)', - 'deleted' => 'המשתמש נמחק בהצלחה מהחלונית.', - 'confirm_delete' => 'האם אתה בטוח שברצונך למחוק את המשתמש הזה מהחלונית?', - 'no_users_found' => 'לא נמצאו משתמשים עבור מונח החיפוש שסופק.', - 'multiple_found' => 'נמצאו חשבונות מרובים עבור המשתמש שסופק, לא ניתן למחוק משתמש בגלל הדגל --no-interaction.', - 'ask_admin' => 'האם משתמש זה הוא מנהל מערכת?', - 'ask_email' => 'כתובת דוא"ל', - 'ask_username' => 'שם משתמש', - 'ask_name_first' => 'שם פרטי', - 'ask_name_last' => 'שם משפחה', - 'ask_password' => 'סיסמה', - 'ask_password_tip' => 'אם ברצונך ליצור חשבון עם סיסמה אקראית שנשלחת באימייל למשתמש, הפעל מחדש את הפקודה הזו (CTRL+C) והעביר את הדגל `--no-password`.', - 'ask_password_help' => 'סיסמאות חייבות להיות באורך של לפחות 8 תווים ולהכיל לפחות אות גדולה ומספר אחד.', - '2fa_help_text' => [ - 'פקודה זו תשבית אימות דו-שלבי עבור חשבון משתמש אם היא מופעלת. זה אמור לשמש כפקודה לשחזור חשבון רק אם המשתמש ננעל מחוץ לחשבון שלו.', - 'אם זה לא מה שרצית לעשות, הקש CTRL+C כדי לצאת מהתהליך הזה.', - ], - '2fa_disabled' => 'אימות דו-שלבי הושבת עבור :email.', - ], - 'schedule' => [ - 'output_line' => 'שולח עבודה למשימה ראשונה ב-`:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'מחיקת קובץ גיבוי שירות: :file.', - ], - 'server' => [ - 'rebuild_failed' => 'בקשת בנייה מחדש עבור ":name" (#:id) בצומת ":node" נכשלה עם שגיאה: :message', - 'reinstall' => [ - 'failed' => 'בקשת התקנה מחדש עבור ":name" (#:id) בצומת ":node" נכשלה עם שגיאה: :message', - 'confirm' => 'אתה עומד להתקין מחדש מול קבוצת שרתים. האם אתה מקווה להמשיך?', - ], - 'power' => [ - 'confirm' => 'אתה עומד לבצע :פעולה נגד :count שרתים האם ברצונך להמשיך?', - 'action_failed' => 'בקשת פעולת הפעלה עבור ":name" (#:id) בצומת ":node" נכשלה עם שגיאה: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'מארח SMTP (למשל smtp.gmail.com)', - 'ask_smtp_port' => 'יציאת SMTP', - 'ask_smtp_username' => 'שם משתמש SMTP', - 'ask_smtp_password' => 'סיסמאת SMTP', - 'ask_mailgun_domain' => 'דומיין Mailgun', - 'ask_mailgun_endpoint' => 'נקודת קצה של Mailgun', - 'ask_mailgun_secret' => 'הסוד של Mailgun', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/he/dashboard/account.php b/lang/he/dashboard/account.php deleted file mode 100644 index abc0397b46..0000000000 --- a/lang/he/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'עדכנו את הדואר האלקטרוני שלכם', - 'updated' => 'כתובת הדוא"ל התעדכנה.', - ], - 'password' => [ - 'title' => 'שנה את סיסמתך', - 'requirements' => 'הסיסמה החדשה שלך צריכה להיות באורך של לפחות 8 תווים.', - 'updated' => 'הסיסמא שלך עודכנה.', - ], - 'two_factor' => [ - 'button' => 'הגדר אימות דו-שלבי', - 'disabled' => 'אימות דו-שלבי הושבת בחשבונך. לא תתבקש יותר לספק אסימון בעת הכניסה.', - 'enabled' => 'אימות דו-שלבי הופעל בחשבון שלך! מעתה, בעת הכניסה, תידרש לספק את הקוד שנוצר על ידי המכשיר שלך.', - 'invalid' => 'הטוקן שסופק היה לא חוקי.', - 'setup' => [ - 'title' => 'הגדר אימות דו-שלבי', - 'help' => 'לא מצליחים לסרוק את הקוד? הזן את הקוד למטה באפליקציה שלך:', - 'field' => 'הזן טוקן', - ], - 'disable' => [ - 'title' => 'השבת אימות דו-שלבי', - 'field' => 'הזן טוקן', - ], - ], -]; diff --git a/lang/he/dashboard/index.php b/lang/he/dashboard/index.php deleted file mode 100644 index f1ceaf526b..0000000000 --- a/lang/he/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'חפש שרתים...', - 'no_matches' => 'לא נמצאו שרתים התואמים לקריטריוני החיפוש שסופקו.', - 'cpu_title' => 'מעבד', - 'memory_title' => 'זיכרון', -]; diff --git a/lang/he/exceptions.php b/lang/he/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/he/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/he/pagination.php b/lang/he/pagination.php deleted file mode 100644 index 39a1e4b0f5..0000000000 --- a/lang/he/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« קודם', - 'next' => 'הבא »', -]; diff --git a/lang/he/passwords.php b/lang/he/passwords.php deleted file mode 100644 index 3e52b25f50..0000000000 --- a/lang/he/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'סיסמאות חייבות להיות לפחות שישה תווים ולהתאים לאישור.', - 'reset' => 'הסיסמה שלך אופסה!', - 'sent' => 'שלחנו באימייל קישור לאיפוס הסיסמה שלך!', - 'token' => 'טוקן איפוס סיסמה זה אינו חוקי.', - 'user' => 'אנחנו לא יכולים למצוא משתמש עם כתובת האימייל הזו.', -]; diff --git a/lang/he/server/users.php b/lang/he/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/he/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/he/strings.php b/lang/he/strings.php deleted file mode 100644 index 40e0f3d6b1..0000000000 --- a/lang/he/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'דוא"ל', - 'email_address' => 'כתובת דוא"ל', - 'user_identifier' => 'שם משתשמש או דואר אלקטרוני', - 'password' => 'סיסמה', - 'new_password' => 'סיסמה חדשה', - 'confirm_password' => 'תאשר סיסמא חדשה', - 'login' => 'התחברות', - 'home' => 'Home', - 'servers' => 'שרתים', - 'id' => 'מספר מזהה', - 'name' => 'שם', - 'node' => 'צומת', - 'connection' => 'חיבור', - 'memory' => 'זיכרון', - 'cpu' => 'מעבד', - 'disk' => 'דיסק', - 'status' => 'סטטוס', - 'search' => 'חיפוש', - 'suspended' => 'מושעה', - 'account' => 'חשבון', - 'security' => 'אבטחה', - 'ip' => '‏כתובת IP', - 'last_activity' => 'פעילות אחרונה', - 'revoke' => 'Revoke', - '2fa_token' => 'טוקן אימות', - 'submit' => 'Submit', - 'close' => 'סגור', - 'settings' => 'הגדרות', - 'configuration' => 'תצורה', - 'sftp' => 'SFTP', - 'databases' => 'מסדי נתונים', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'גישה ל- API', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/he/validation.php b/lang/he/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/he/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/hi/activity.php b/lang/hi/activity.php deleted file mode 100644 index 606004b7f6..0000000000 --- a/lang/hi/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'विफल लॉग इन', - 'success' => 'लॉग इन किया गया', - 'password-reset' => 'पासवर्ड रीसेट', - 'reset-password' => 'पासवर्ड रीसेट का अनुरोध किया गया', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'दो-कारक रिकवरी टोकन का उपयोग किया गया', - 'token' => 'दो-कारक चुनौती का समाधान किया गया', - 'ip-blocked' => 'अनसूचीबद्ध आईपी पते से :identifier के लिए अनुरोध अवरुद्ध किया गया', - 'sftp' => [ - 'fail' => 'एसएफटीपी लॉगइन विफल रहा', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'ईमेल :old से बदलकर :new कर दिया गया', - 'password-changed' => 'पासवर्ड बदल दिया गया', - ], - 'api-key' => [ - 'create' => 'नई एपीआई कुंजी :identifier बनाई गई', - 'delete' => 'हटाई गई एपीआई की: पहचानकर्ता', - ], - 'ssh-key' => [ - 'create' => 'खाते में एसएसएच कुंजी :fingerprint को जोड़ा गया', - 'delete' => 'खाते से एसएसएच कुंजी :fingerprint को हटा दिया गया', - ], - 'two-factor' => [ - 'create' => 'दो-कारक प्रमाणीकरण को सक्षम किया गया', - 'delete' => 'दो-कारक प्रमाणीकरण को निष्क्रिय कर दिया गया', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/hi/admin/eggs.php b/lang/hi/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/hi/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/hi/admin/node.php b/lang/hi/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/hi/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/hi/admin/server.php b/lang/hi/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/hi/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/hi/admin/user.php b/lang/hi/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/hi/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/hi/auth.php b/lang/hi/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/hi/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/hi/command/messages.php b/lang/hi/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/hi/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/hi/dashboard/account.php b/lang/hi/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/hi/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/hi/dashboard/index.php b/lang/hi/dashboard/index.php deleted file mode 100644 index 8aeb5f8a19..0000000000 --- a/lang/hi/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'सर्वर्स की खोज करें...', - 'no_matches' => 'प्रदान किए गए खोज मानदंडों से मेल खाने वाला कोई सर्वर नहीं मिला।', - 'cpu_title' => 'सीपीयू', - 'memory_title' => 'मेमोरी', -]; diff --git a/lang/hi/exceptions.php b/lang/hi/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/hi/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/hi/pagination.php b/lang/hi/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/hi/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/hi/passwords.php b/lang/hi/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/hi/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/hi/server/users.php b/lang/hi/server/users.php deleted file mode 100644 index b66d01d58f..0000000000 --- a/lang/hi/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'इस सर्वर के लिए वेबसॉकेट तक पहुँच देता है।', - 'control_console' => 'उपयोगकर्ता को सर्वर कंसोल में डेटा भेजने की अनुमति देता है।', - 'control_start' => 'उपयोगकर्ता को सर्वर उदाहरण को प्रारंभ करने की अनुमति देता है।', - 'control_stop' => 'उपयोगकर्ता को सर्वर उदाहरण को प्रारंभ करने की अनुमति देता है।', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/hi/strings.php b/lang/hi/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/hi/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/hi/validation.php b/lang/hi/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/hi/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/hr/activity.php b/lang/hr/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/hr/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/hr/admin/eggs.php b/lang/hr/admin/eggs.php deleted file mode 100644 index f489718c97..0000000000 --- a/lang/hr/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Uspješno ste uvezli ovaj Egg i njegove varijable.', - 'updated_via_import' => 'Ovaj Egg je ažuriran sa tom datotekom.', - 'deleted' => 'Uspješno ste obrisali taj Egg sa panel-a.', - 'updated' => 'Konfiguracija Egg-a je uspješno ažurirana.', - 'script_updated' => 'Egg skripta za instaliranje je ažurirana i pokreniti će se kada se serveri instaliraju.', - 'egg_created' => 'Uspješno ste napravili Egg. Morat ćete restartati sve pokrenute daemone da bih primjenilo ovaj novi Egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Varijabla ":variable" je uspješno obrisana i više neće biti dostupna za servera nakon obnovljenja.', - 'variable_updated' => 'Varijabla ":variable" je ažurirana. Morat ćete obnoviti sve servere koji koriste ovu varijablu kako biste primijenili promjene.', - 'variable_created' => 'Nova varijabla je uspješno napravljena i dodana ovom Egg-u.', - ], - ], -]; diff --git a/lang/hr/admin/node.php b/lang/hr/admin/node.php deleted file mode 100644 index 941708ed4d..0000000000 --- a/lang/hr/admin/node.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'Navedeni FQDN ili IP adresa nema valjanu IP adresu.', - 'fqdn_required_for_ssl' => 'Za korištenje SSL-a za ovaj node potreban je FQDN koji se pretvara u javnu IP adresu.', - ], - 'notices' => [ - 'allocations_added' => 'Portovi su uspješno dodane ovom čvoru.', - 'node_deleted' => 'Node je uspješno izbrisan sa panela.', - 'node_created' => 'Uspješno ste napravili novi node. Možete automatski konfigurirati daemon na toj mašini ako posjetite \'Konfiguriracija\' karticu. -Prije nego što napravite servere morate prvo dodijeliti barem jednu IP adresu i port.', - 'node_updated' => 'Node informacije su uspješno ažurirane. Ako su neke daemon postavke promjenjene morate ponovno pokreniti kako bi se promjene primjenile.', - 'unallocated_deleted' => 'Izbriši sve ne-nekorištene portovi za :ip.', - ], -]; diff --git a/lang/hr/admin/server.php b/lang/hr/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/hr/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/hr/admin/user.php b/lang/hr/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/hr/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/hr/auth.php b/lang/hr/auth.php deleted file mode 100644 index 7beef04469..0000000000 --- a/lang/hr/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Prijavi se', - 'go_to_login' => 'Idi na prijavu', - 'failed' => 'Nema računa sa tim podatcima.', - - 'forgot_password' => [ - 'label' => 'Zaboravio lozinku?', - 'label_help' => 'Napiši svoju email adresu računa kako bi dobio instrukcije da promjeniš lozinku.', - 'button' => 'Oporavi račun', - ], - - 'reset_password' => [ - 'button' => 'Promjeni i prijavi se', - ], - - 'two_factor' => [ - 'label' => '2 Faktor Token', - 'label_help' => 'Ovaj račun ima 2 sloja provjere sigurnosti. Kako bi ste nastavili napišite kod koji je generiran od vašeg uređaja.', - 'checkpoint_failed' => '2 Faktor Token nije točan.', - ], - - 'throttle' => 'Previše pokušaja prijave. Pokušajte ponovno za :seconds sekundi.', - 'password_requirements' => 'Lozinka mora imati makar 8 karaktera i biti samo za ovu stranicu.', - '2fa_must_be_enabled' => 'Administrator je odabrao da morate imate 2 Faktor kako bi ste koristli ovu stranicu.', -]; diff --git a/lang/hr/command/messages.php b/lang/hr/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/hr/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/hr/dashboard/account.php b/lang/hr/dashboard/account.php deleted file mode 100644 index 2d349df01d..0000000000 --- a/lang/hr/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Promjeni svoj email', - 'updated' => 'Vaša e-mail adresa je ažurirana.', - ], - 'password' => [ - 'title' => 'Promijeni lozinku', - 'requirements' => 'Vaša nova lozinka treba imati makar 8 karaktera.', - 'updated' => 'Vaša lozinka je ažurirana.', - ], - 'two_factor' => [ - 'button' => 'Konfiguriraj 2 Faktor authentikaciju.', - 'disabled' => '2 Faktor authentikacija je isključena na vašem računu. Više vas nećemo pitati za token kada se prijavljate.', - 'enabled' => '2 Faktor authentikacija je uključena na vašem računu. Od sada kada se prijavljate morate upisati kod koji je vaš uređaj generirio.', - 'invalid' => 'Token je netočan.', - 'setup' => [ - 'title' => 'Postavi 2 faktor autentikaciju.', - 'help' => 'Ne možeš skenirati kod? Napiši ovaj kod u svoju aplikaciju:', - 'field' => 'Upiši token', - ], - 'disable' => [ - 'title' => 'Isključi dva faktor autentikaciju', - 'field' => 'Upiši token', - ], - ], -]; diff --git a/lang/hr/dashboard/index.php b/lang/hr/dashboard/index.php deleted file mode 100644 index f2ee78d057..0000000000 --- a/lang/hr/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Pretraži servere...', - 'no_matches' => 'Nisu pronađeni serveri koji odgovaraju navedenim kriterijima pretraživanja.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memorija', -]; diff --git a/lang/hr/exceptions.php b/lang/hr/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/hr/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/hr/pagination.php b/lang/hr/pagination.php deleted file mode 100644 index 01e2fd5004..0000000000 --- a/lang/hr/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Prethodno', - 'next' => 'Slijedeće »', -]; diff --git a/lang/hr/passwords.php b/lang/hr/passwords.php deleted file mode 100644 index 5e671476b9..0000000000 --- a/lang/hr/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Lozinke moraju biti duge barem 6 znakova i moraju odgovarati potvrdi.', - 'reset' => 'Vaša lozinka je promijenjena!', - 'sent' => 'Na vaš email poslan je link za ponovno postavljanje!', - 'token' => 'Token za promjenu lozinke je nevažeći.', - 'user' => 'Ne možemo pronaći korisnika s tom email adresom.', -]; diff --git a/lang/hr/server/users.php b/lang/hr/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/hr/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/hr/strings.php b/lang/hr/strings.php deleted file mode 100644 index 0ea71a16a1..0000000000 --- a/lang/hr/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email adresa', - 'user_identifier' => 'Korisničko ime ili Email', - 'password' => 'Lozinka', - 'new_password' => 'Nova lozinka', - 'confirm_password' => 'Potvrdi novu lozinku', - 'login' => 'Prijava', - 'home' => 'Početna', - 'servers' => 'Serveri', - 'id' => 'ID', - 'name' => 'Ime', - 'node' => 'Node', - 'connection' => 'Veza', - 'memory' => 'Memorija', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Stanje', - 'search' => 'Pretraživanje', - 'suspended' => 'Suspendiran', - 'account' => 'Račun', - 'security' => 'Sigurnost', - 'ip' => 'IP Adresa', - 'last_activity' => 'Posljednja aktivnost', - 'revoke' => 'Ukloni', - '2fa_token' => '2 Faktor Token', - 'submit' => 'Potvrdi', - 'close' => 'Zatvori', - 'settings' => 'Postavke', - 'configuration' => 'Postavke', - 'sftp' => 'SFTP', - 'databases' => 'Databaze', - 'memo' => 'Zapis', - 'created' => 'Kreirano', - 'expires' => 'Istječe', - 'public_key' => 'Token', - 'api_access' => 'Api pristup', - 'never' => 'nikad', - 'sign_out' => 'Odjava', - 'admin_control' => 'Administrator Kontrola', - 'required' => 'Potrebno', - 'port' => 'Port', - 'username' => 'Ime', - 'database' => 'Databaza', - 'new' => 'Novo', - 'danger' => 'Opasno', - 'create' => 'Kreiraj', - 'select_all' => 'Odaberi sve', - 'select_none' => 'Odaberi ništa', - 'alias' => 'Drugo ime', - 'primary' => 'Glavni', - 'make_primary' => 'Označi kao glavni', - 'none' => 'Ništa', - 'cancel' => 'Odustani', - 'created_at' => 'Stvoreno', - 'action' => 'Akcija', - 'data' => 'Podaci', - 'queued' => 'U redu čekanja', - 'last_run' => 'Zadnje pokretanje', - 'next_run' => 'Sljedeće pokretanje', - 'not_run_yet' => 'Nije Pokrenuto', - 'yes' => 'Da', - 'no' => 'Ne', - 'delete' => 'Izbriši', - '2fa' => '2FA', - 'logout' => 'Odjava', - 'admin_cp' => 'Admin Panel', - 'optional' => 'Neobavezno', - 'read_only' => 'Samo za čitanje', - 'relation' => 'Odnos', - 'owner' => 'Vlasnik', - 'admin' => 'Admin', - 'subuser' => 'Podkorisnik', - 'captcha_invalid' => 'Ta captcha je netočna.', - 'tasks' => 'Zadatci', - 'seconds' => 'Sekunde', - 'minutes' => 'Minute', - 'under_maintenance' => 'Održavanje u tijeku', - 'days' => [ - 'sun' => 'Nedjelja', - 'mon' => 'Ponedjeljak', - 'tues' => 'Utorak', - 'wed' => 'Srijeda', - 'thurs' => 'Četvrtak', - 'fri' => 'Petak', - 'sat' => 'Subota', - ], - 'last_used' => 'Zadnje korišteno', - 'enable' => 'Omogući', - 'disable' => 'Onemogući', - 'save' => 'Spremi', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/hr/validation.php b/lang/hr/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/hr/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/hu/activity.php b/lang/hu/activity.php deleted file mode 100644 index 3df65f4e7c..0000000000 --- a/lang/hu/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Sikertelen bejelenzkezés', - 'success' => 'Bejelentkezve', - 'password-reset' => 'Jelszó helyreállítás', - 'reset-password' => 'Jelszó helyreállítási kérelem', - 'checkpoint' => 'Két-faktoros hitelesítési kérelem', - 'recovery-token' => 'Két-faktoros helyreállítási kulcs használata', - 'token' => 'Sikeres két-faktoros hitelesítés', - 'ip-blocked' => 'Blokkolt kérés a következő nem listázott IP-címről: :identifier', - 'sftp' => [ - 'fail' => 'Sikertelen SFTP bejelentkezés', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Email cím megváltoztatva :old -ról :new -ra', - 'password-changed' => 'Jelszó megváltoztatva', - ], - 'api-key' => [ - 'create' => 'Új API kulcs létrehozva :identifier', - 'delete' => 'API kulcs törölve :identifier', - ], - 'ssh-key' => [ - 'create' => 'SSH kulcs :fingerprint hozzáadva a fiókhoz', - 'delete' => 'SSH kulcs :fingerprint törölve a fiókból', - ], - 'two-factor' => [ - 'create' => 'Két-faktoros hitelesítés bekapcsolva', - 'delete' => 'Két-faktoros hitelesítés kikapcsolva', - ], - ], - 'server' => [ - 'reinstall' => 'Szerver újratelepítve', - 'console' => [ - 'command' => 'Végrehajtott ":command" parancs a szerveren', - ], - 'power' => [ - 'start' => 'Szerver elindítva', - 'stop' => 'Szerver leállítva', - 'restart' => 'Szerver újraindítva', - 'kill' => 'Szerver folyamat leállítva', - ], - 'backup' => [ - 'download' => ':name biztonsági mentés letöltve', - 'delete' => ':name biztonsági mentés törölve', - 'restore' => ':name biztonsági mentés helyreállítva. (törölt fájlok :truncate)', - 'restore-complete' => ':name biztonsági mentés helyreállítása befejezve', - 'restore-failed' => 'Nem sikerült visszaállítani a :name biztonsági mentést', - 'start' => 'Új biztonsági mentés :name', - 'complete' => ':name biztonsági mentés megjelölve befejezettként', - 'fail' => ':name biztonsági mentés sikertelennek jelölve', - 'lock' => ':name biztonsági mentés zárolva', - 'unlock' => ':name biztonsági mentés zárolása feloldva', - ], - 'database' => [ - 'create' => 'Új adatbázis létrehozva :name', - 'rotate-password' => 'Új jelszó létrehozva a(z) :name adatbázishoz', - 'delete' => ':name adatbázis törölve', - ], - 'file' => [ - 'compress_one' => ':directory:file tömörítve', - 'compress_other' => ':count tömörített fájl a :directory könyvtárban', - 'read' => 'Megtekintette a :file tartalmát', - 'copy' => 'Másolatot készített a :file -ról', - 'create-directory' => 'Könyvtár létrehozva :directory:name', - 'decompress' => 'Kicsomagolva :files a :directory könyvtárban', - 'delete_one' => ':directory:files.0 törölve', - 'delete_other' => ':count fájl törölve a :directory könyvtárban', - 'download' => ':file letölve', - 'pull' => 'Egy távoli fájl letöltve a :url -ról a :directory könyvtárba', - 'rename_one' => ':directory:files.0 átnevezve :directory:files.0.to -ra', - 'rename_other' => ':count fájl átnevezve a :directory könyvtárban', - 'write' => 'Új tartalom hozzáadva a :file -hoz', - 'upload' => 'Elkezdte egy fájl feltöltését', - 'uploaded' => ':direcotry:file feltöltve', - ], - 'sftp' => [ - 'denied' => 'SFTP hozzáférés megtagadva hiányzó jogosultságok miatt', - 'create_one' => 'Létrehozva :files.0', - 'create_other' => 'Létrehozva :count új fájl', - 'write_one' => ':files.0 tartalma módosítva', - 'write_other' => ':count fájl tartalma módosítva', - 'delete_one' => 'Törölve :files.0', - 'delete_other' => 'Törölve :count db fájl', - 'create-directory_one' => ':files.0 könyvtár létrehozva', - 'create-directory_other' => ':count darab könyvtár létrehozva', - 'rename_one' => 'Átnevezve :files.0.from -ról :files.0.to -ra', - 'rename_other' => 'Átnevezett vagy áthelyezett :count darab fájlt', - ], - 'allocation' => [ - 'create' => ':allocation allokáció hozzáadva a szerverhez', - 'notes' => 'Jegyzet frissítve :allocation -ról :new -ra', - 'primary' => ':allocation beállítása elsődlegesként', - 'delete' => ':allocation allokáció törölve', - ], - 'schedule' => [ - 'create' => ':name ütemezés létrehozva', - 'update' => ':name ütemezés frissítve', - 'execute' => ':name ütemezés manuálisan futtatva', - 'delete' => ':name ütemezés törölve', - ], - 'task' => [ - 'create' => 'Új ":action" feladat létrehozva a :name ütemezéshez', - 'update' => '":action" feladat frissítve a :name ütemezésnél', - 'delete' => '":action" feladat törölve a :name ütemezésnél', - ], - 'settings' => [ - 'rename' => 'Szerver átnevezve :old -ról :new -ra', - 'description' => 'Szerver leírás módosítva :old -ról :new -ra', - ], - 'startup' => [ - 'edit' => ':variable módosítva :old -ról :new -ra', - 'image' => 'Docker image frissítve ennél a szervernél :old -ról :new -ra', - ], - 'subuser' => [ - 'create' => ':email hozzáadva al- felhasználóként', - 'update' => ':email al-fiók jogosultságai frissítve', - 'delete' => ':email al-fiók eltávolítva', - ], - ], -]; diff --git a/lang/hu/admin/apikey.php b/lang/hu/admin/apikey.php new file mode 100644 index 0000000000..35945db95a --- /dev/null +++ b/lang/hu/admin/apikey.php @@ -0,0 +1,27 @@ + 'Alkalmazás API kulcsok', + 'empty' => 'Nincs API kulcs', + 'whitelist' => 'Fehér listás IPv4-címek', + 'whitelist_help' => 'Az API-kulcsok korlátozhatók, hogy csak bizonyos IPv4-címekről működjenek. Adjon meg minden címet egy új sorban.', + 'whitelist_placeholder' => 'Például: 127.0.0.1 vagy 192.168.1.1', + 'description' => 'Leírás', + 'description_help' => 'Egy rövid összefoglaló hogy mire van használva ez a kulcs', + 'nav_title' => 'API kulcs', + 'model_label' => 'Alkalmazás API kulcs', + 'model_label_plural' => 'Alkalmazás API kulcsok', + 'table' => [ + 'key' => 'Kulcs', + 'description' => 'Leírás', + 'last_used' => 'Legutóbb használt', + 'created' => 'Létrehozva', + 'created_by' => 'Létrehozta', + 'never_used' => 'Sosem használt', + ], + 'permissions' => [ + 'none' => 'Nincs', + 'read' => 'Olvasás', + 'read_write' => 'Olvasás és írás', + ], +]; diff --git a/lang/hu/admin/dashboard.php b/lang/hu/admin/dashboard.php new file mode 100644 index 0000000000..cfe2fe3478 --- /dev/null +++ b/lang/hu/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Üdvözöljük a Pelicanban!', + 'version' => 'Verzió: :version', + 'advanced' => 'Haladó', + 'server' => 'Szerver', + 'user' => 'Felhasználó', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Információk a fejlesztők számára', + 'content' => 'Köszönjük, hogy kipróbáltad a fejlesztői verziót!', + 'extra_note' => 'Ha bármilyen problémába ütközik, kérjük, jelentse a GitHubon.', + 'button_issues' => 'Hibajegy létrehozása', + 'button_features' => 'Megvitatjuk a funkciókat', + ], + 'intro-update-available' => [ + 'heading' => 'Frissítés érhető el', + 'content' => ':latestVersion már elérhető! Olvasd el dokumentációnkat a panel frissítéséhez.', + 'button_changelog' => 'Újdonságok', + ], + 'intro-no-update' => [ + 'heading' => 'A Panel naprakész', + 'content' => 'A Pelicanod :version verzióját futtatja. A paneled naprakész!', + ], + 'intro-first-node' => [ + 'heading' => 'Nincs észlelt csomópont', + 'content' => 'Úgy tűnik, hogy még nincs egyetlen csomópontod sem beállítva, de ne aggódj, mert a művelet gombra kattintva létrehozhatod az elsőt!', + 'extra_note' => 'Ha bármilyen problémába ütközik, kérjük jelentse a GitHubon.', + 'button_label' => 'Első csomópont létrehozása a Pelicanban', + ], + 'intro-support' => [ + 'heading' => 'Pelican támogatása', + 'content' => 'Köszönjük, hogy használja a Pelicant, ezt csak az Ön és a támogatóink segítségével tudtuk elérni!', + 'extra_note' => 'Nagyra értékelünk minden támogatást bárkitől.', + 'button_translate' => 'Segítség a fordításhoz', + 'button_donate' => 'Közvetlen adományozás', + ], + 'intro-help' => [ + 'heading' => 'Segítségre van szüksége?', + 'content' => 'Először nézd meg a dokumentációt! Ha még mindig segítségre van szükséged, látogass el a Discord szerverünkre!', + 'button_docs' => 'Dokumentáció olvasása', + ], + ], +]; diff --git a/lang/hu/admin/databasehost.php b/lang/hu/admin/databasehost.php new file mode 100644 index 0000000000..c38bff4693 --- /dev/null +++ b/lang/hu/admin/databasehost.php @@ -0,0 +1,75 @@ + 'Adatbázis szerverek', + 'model_label' => 'Adatbázis szerver', + 'model_label_plural' => 'Adatbázis szerverek', + 'table' => [ + 'database' => 'Adatbázis', + 'name' => 'Név', + 'host' => 'Hoszt', + 'port' => 'Port', + 'name_helper' => 'Ha ezt üresen hagyod, akkor automatikusan generál egy véletlenszerű nevet.', + 'username' => 'Felhasználónév', + 'password' => 'Jelszó', + 'remote' => 'Csatlakozás innen', + 'remote_helper' => 'Honnan legyenek engedélyezve a kapcsolatok. Hagyd üresen, ha bárhonnan engedélyezni szeretnéd a kapcsolatokat.', + 'max_connections' => 'Maximum kapcsolatok', + 'created_at' => 'Létrehozva', + 'connection_string' => 'JDBC kapcsolatlánc', + ], + 'error' => 'Hiba a hoszthoz való kapcsolódáskor', + 'host' => 'Hoszt', + 'host_help' => 'Az az IP-cím vagy domain név, amelyet a Panel használ a MySQL kiszolgálóhoz való csatlakozáskor új adatbázisok létrehozásához.', + 'port' => 'Port', + 'port_help' => 'Az a port, amelyen a MySQL elérhető ezen a kiszolgálón.', + 'max_database' => 'Maximum adatbázisok', + 'max_databases_help' => 'A kiszolgálón létrehozható adatbázisok maximális száma. Ha a megadott értéket elérik, nem lehet további adatbázisokat létrehozni. Üresen hagyva nincs korlátozás.', + 'display_name' => 'Megjelenítendő név', + 'display_name_help' => 'Egy rövid azonosító, amely megkülönbözteti ezt a kiszolgálót a többitől. 1 és 60 karakter között kell lennie, például: us.nyc.lvl3.', + 'username' => 'Felhasználónév', + 'username_help' => 'Egy olyan fiók felhasználóneve, amelynek elegendő jogosultsága van új felhasználók és adatbázisok létrehozására.', + 'password' => 'Jelszó', + 'password_help' => 'Az adatbázisfelhasználó jelszava.', + 'linked_nodes' => 'Kapcsolódó csomópont', + 'linked_nodes_help' => 'Ez a beállítás csak akkor lesz alapértelmezett ennél az adatbázis-kiszolgálónál, ha egy adatbázist adunk hozzá egy szerverhez a kiválasztott csomóponton.', + 'connection_error' => 'Hiba a hoszthoz való kapcsolódáskor', + 'no_database_hosts' => 'Nincs adatbázis kiszolgáló', + 'no_nodes' => 'Nincsenek csomópontok', + 'delete_help' => 'Az adatbázis hoszt adatbázisokkal rendelkezik', + 'unlimited' => 'Korlátlan', + 'anywhere' => 'Bárhol', + + 'rotate' => 'Csere', + 'rotate_password' => 'Jelszó frissítése', + 'rotated' => 'Jelszó cserélve', + 'rotate_error' => 'A jelszó cserélés meghiúsult', + 'databases' => 'Adatbázisok', + + 'setup' => [ + 'preparations' => 'Előkészületek', + 'database_setup' => 'Adatbázis beállítások', + 'panel_setup' => 'Panel beállítások', + + 'note' => 'Jelenleg csak a MySQL/ MariaDB adatbázisok támogatottak az adatbázis hosztok számára!', + 'different_server' => 'A panel és az adatbázis nem ugyanazon a szerveren van?', + + 'database_user' => 'Adatbázis felhasználó', + 'cli_login' => 'A mysql cli eléréséhez használd a mysql -u root -p parancsot.', + 'command_create_user' => 'Parancs a felhasználó létrehozására', + 'command_assign_permissions' => 'Engedélyek hozzárendelésének parancsa', + 'cli_exit' => 'A mysql cli elhagyásához futtasd a exit parancsot.', + 'external_access' => 'Külső hozzáférés', + 'allow_external_access' => ' +

Valószínű, hogy engedélyezned kell a külső hozzáférést ehhez a MySQL példányhoz, hogy a szerverek tudjanak csatlakozni hozzá.

+
+ +

Ehhez nyisd meg a my.cnf fájlt, amelynek elérési útja az operációs rendszertől és a MySQL telepítési módjától függ. A find /etc -iname my.cnf parancs segítségével megtalálhatod.

+
+

Nyisd meg a my.cnf fájlt, add hozzá az alábbi szöveget a fájl végéhez, majd mentsd el:
+ [mysqld]
bind-address=0.0.0.0

+
+

Indítsd újra a MySQL/MariaDB szolgáltatást, hogy az új beállítások érvénybe lépjenek. Ez felülírja az alapértelmezett MySQL konfigurációt, amely alapból csak a localhost-ról enged kéréseket. Ennek frissítésével az összes hálózati interfészen engedélyezett lesz a kapcsolat, így külső kapcsolatok is lehetségesek lesznek. Győződj meg róla, hogy a MySQL port (alapértelmezetten 3306) engedélyezve van a tűzfalban.

+ ', + ], +]; diff --git a/lang/hu/admin/eggs.php b/lang/hu/admin/eggs.php deleted file mode 100644 index 6a331c8559..0000000000 --- a/lang/hu/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Sikeresen importáltad ezt az Egg-et és a hozzátartozó változókat!', - 'updated_via_import' => 'Ez az Egg frissítve lett a megadott fájl segítségével!', - 'deleted' => 'Sikeresen törölted a kívánt Egg-et a panelből!', - 'updated' => 'Az Egg konfigurációja sikeresen frissítve lett!', - 'script_updated' => 'Az Egg telepítési scriptje frissítve lett, és szerver telepítésekor lefut!', - 'egg_created' => 'Sikeresen hozzá adtál egy új egg-et. Újra kell indítanod minden futó daemon-t az Egg alkalmazásához!', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'A ":változó" változó törlésre került, és az újratelepítés után már nem lesz elérhető a szerverek számára!', - 'variable_updated' => 'A ":változó" változót frissítettük. A változások alkalmazásához újra kell telepítenie az ezt a változót használó szervereket!', - 'variable_created' => 'Az új változót sikeresen létrehoztuk és hozzárendeltük ehhez az Egg-hez!', - ], - ], -]; diff --git a/lang/hu/admin/health.php b/lang/hu/admin/health.php new file mode 100644 index 0000000000..966989bfdd --- /dev/null +++ b/lang/hu/admin/health.php @@ -0,0 +1,60 @@ + 'Egészség', + 'results_refreshed' => 'Az egészség ellenőrzés eredményei frissítve', + 'checked' => 'Ellenőrzött eredmények :time', + 'refresh' => 'Újratöltés', + 'results' => [ + 'cache' => [ + 'label' => 'Gyorsítótár', + 'ok' => 'Oké', + 'failed_retrieve' => 'Nem sikerült beállítani vagy lekérni egy alkalmazás gyorsítótár értékét.', + 'failed' => 'Kivétel történt az alkalmazás gyorsítótárával kapcsolatban: :error', + ], + 'database' => [ + 'label' => 'Adatbázis', + 'ok' => 'Oké', + 'failed' => 'Nem lehet csatlakozni az adatbázishoz: :error', + ], + 'debugmode' => [ + 'label' => 'Hibakereső mód', + 'ok' => 'A hibakeresési mód le van tiltva', + 'failed' => 'A hibakeresési módnak :expected -nek kellett volna lennie, de valójában :actual volt.', + ], + 'environment' => [ + 'label' => 'Környezet', + 'ok' => 'Rendben, :actual -ra(re) lett állítva', + 'failed' => 'Környezet :actual -ra(re) van állítva, Elvárt visszont :expected', + ], + 'nodeversions' => [ + 'label' => 'Csomópont Verzió', + 'ok' => 'Csomópontok naprakészek', + 'failed' => ':all csomópont ból :outdated elavult', + 'no_nodes_created' => 'Nincsenek létrehozott csomópontok', + 'no_nodes' => 'Nincsenek csomópontok', + 'all_up_to_date' => 'Minden naprakész', + 'outdated' => ':outdated/:all elavult', + ], + 'panelversion' => [ + 'label' => 'Panel Verzió', + 'ok' => 'A Panel naprakész', + 'failed' => 'A telepített verzió :currentVersion, de a legújabb :latestVersion', + 'up_to_date' => 'Naprakész', + 'outdated' => 'Elavult', + ], + 'schedule' => [ + 'label' => 'Időzítő', + 'ok' => 'Oké', + 'failed_last_ran' => 'Az időzítő utolsó futása több mint :time perccel ezelőtt volt.', + 'failed_not_ran' => 'Az időzítő még nem futott le.', + ], + 'useddiskspace' => [ + 'label' => 'Lemezterület', + ], + ], + 'checks' => [ + 'successful' => 'Sikeres', + 'failed' => 'Sikertelen', + ], +]; diff --git a/lang/hu/admin/mount.php b/lang/hu/admin/mount.php new file mode 100644 index 0000000000..3d7709b6ff --- /dev/null +++ b/lang/hu/admin/mount.php @@ -0,0 +1,30 @@ + 'Mount-ok', + 'model_label' => 'Kötet', + 'model_label_plural' => 'Mount-ok', + 'name' => 'Név', + 'name_help' => 'Egyedi név, amely ezt a mount-ot egy másiktól megkülönbözteti.', + 'source' => 'Forrás', + 'source_help' => 'A konténerhez csatolandó fájl elérési útja a gazdarendszeren.', + 'target' => 'Cél', + 'target_help' => 'Ahol a csatlakozás elérhető lesz a konténeren belül.', + 'read_only' => 'Csak olvasható?', + 'read_only_help' => 'A mount csak olvasható a konténeren belül?', + 'description' => 'Leírás', + 'description_help' => 'Egy hosszabb leírás ehhez a mount-hoz', + 'no_mounts' => 'Nincs csatolás', + 'eggs' => 'Egg-ek', + 'nodes' => 'Csomópontok', + 'toggles' => [ + 'writable' => 'Írható', + 'read_only' => 'Csak olvasható', + ], + 'table' => [ + 'name' => 'Név', + 'all_eggs' => 'Minden Egg', + 'all_nodes' => 'Minden csomópont', + 'read_only' => 'Csak olvasható', + ], +]; diff --git a/lang/hu/admin/node.php b/lang/hu/admin/node.php deleted file mode 100644 index e81a9cb07f..0000000000 --- a/lang/hu/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'A megadott FQDN vagy IP-cím nem felel meg érvényes IP-címnek!', - 'fqdn_required_for_ssl' => 'Az SSL használatához ehhez a csomóponthoz egy teljesen minősített tartománynévre van szükség, amely nyilvános IP-címet eredményez!', - ], - 'notices' => [ - 'allocations_added' => 'Sikeresen hozzáadtad az allokációkat ehhez a node-hoz!', - 'node_deleted' => 'Sikeresen törölted a node-ot!', - 'node_created' => 'Sikeresen létrehoztál egy új node-ot. A daemon-t automatikusan konfigurálhatod a "Konfiguráció" fülön. Mielőtt új szervert készítenél, legalább egy IP címet és portot kell allokálnod.', - 'node_updated' => 'Node információk frissítve. Ha a daemon beállításait módosítottad, újra kell indítani a daemont a módosítások érvénybe léptetéséhez!', - 'unallocated_deleted' => 'Törölted a :ip összes ki nem osztott portját!', - ], -]; diff --git a/lang/hu/admin/role.php b/lang/hu/admin/role.php new file mode 100644 index 0000000000..ba9630ee56 --- /dev/null +++ b/lang/hu/admin/role.php @@ -0,0 +1,17 @@ + 'Szerepek', + 'model_label' => 'Szerepkör', + 'model_label_plural' => 'Szerepek', + 'no_roles' => 'Nincsenek Szerepek', + 'name' => 'Szerep Neve', + 'permissions' => 'Engedélyek', + 'in_use' => 'Használatban', + 'all' => 'Mind', + 'root_admin' => 'Ez a :role minden engedéllyel rendelkezik.', + 'root_admin_delete' => 'Root Adminisztrátort nem lehet törölni', + 'users' => 'Felhasználók', + 'nodes' => 'Csomópontok', + 'nodes_hint' => 'Hagyd üresen, ha minden csomóponthoz engedélyezed a hozzáférést.', +]; diff --git a/lang/hu/admin/server.php b/lang/hu/admin/server.php deleted file mode 100644 index 13f108c63d..0000000000 --- a/lang/hu/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'Megpróbáltad törölni az allokációt, de nincs másik alapértelmezett allokáció hozzáadva a szerverhez.', - 'marked_as_failed' => 'Ezt a kiszolgálót úgy jelölték meg, hogy egy korábbi telepítés sikertelen volt. Az állapot követés nem kapcsolható be ebben az állapotban!', - 'bad_variable' => 'Érvényesítési hiba történt a :name: váltózóval!', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Szerver sikeresen eltávolítva.', - 'server_created' => 'Szerver sikeresen létrehozva. Várj néhány percet, amíg a daemon teljesen feltelepíti a szervert.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'Legalább egy node-ot konfigurálni kell szerverek hozzáadásához.', - 'transfer_nodes_required' => 'Legalább két node-nak kell lennie szerverek költöztetéséhez.', - 'transfer_started' => 'Szerver költöztetés elindítva.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/hu/admin/user.php b/lang/hu/admin/user.php deleted file mode 100644 index 4af00658b8..0000000000 --- a/lang/hu/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Nem törölhető olyan felhasználó, amihez aktív szerver van társítva. Kérlek előbb töröld az összes szerverét a folytatáshoz.', - 'user_is_self' => 'A saját felhasználói fiókod nem törölheted.', - ], - 'notices' => [ - 'account_created' => 'Felhasználói fiók sikeresen létrehozva.', - 'account_updated' => 'Felhasználói fiók sikeresen frissítve.', - ], -]; diff --git a/lang/hu/admin/webhook.php b/lang/hu/admin/webhook.php new file mode 100644 index 0000000000..c5571ef8a4 --- /dev/null +++ b/lang/hu/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhookok', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhookok', + 'endpoint' => 'Végpont', + 'description' => 'Leírás', + 'no_webhooks' => 'Nincs Webhookok', + 'help' => 'Súgó', + 'help_text' => 'A változó nevét a {{ }}} közé kell tenned, például ha a nevet az api-ból akarod megkapni, használhatod a {{name}} változó.', + 'test_now' => 'Tesztelés', + 'test_now_help' => 'Ez egy `created: Server` esemény', + 'table' => [ + 'description' => 'Leírás', + 'endpoint' => 'Végpont', + ], + 'headers' => 'Fejlécek', + 'events' => 'Események', + 'regular' => 'Hagyományos', + 'reset_headers' => 'Fejlécek visszaállítása', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Üzenet', + 'username' => 'Felhasználónév', + 'avatar_url' => 'Profilkép URL', + 'forum_thread' => 'Fórum témájának neve', + 'supress_embeds' => 'Beágyazások elnyomása', + 'supress_embeds_text' => 'Ne tartalmazzon semmilyen beágyazott elemet az üzenet szerializálásakor.', + 'supress_notifications' => 'Értesítések felfüggesztése', + 'supress_notifications_text' => 'Ez az üzenet nem vált ki push és asztali értesítéseket', + ], + 'discord_embed' => [ + 'add_embed' => 'Beágyazás hozzáadása', + 'flags' => 'Flagek', + 'thumbnail' => 'Thumbnail URL', + 'embeds' => 'Beágyazások', + 'thread_name' => 'Fórum témájának neve', + 'allowed_mentions' => 'Engedélyezett említések', + 'roles' => 'Szerepek', + 'users' => 'Felhasználók', + 'everyone' => '@everyone & @here', + 'author' => 'Szerző', + 'author_url' => 'Szerző URL', + 'author_icon_url' => 'Szerző Ikon URL', + 'body' => 'Szöveg', + 'title' => 'Cím', + 'color' => 'Beágyazás Szín', + 'url' => 'URL', + 'images' => 'Képek', + 'image_url' => 'Kép URL', + 'image_thumbnail' => 'Thumbnail URL', + 'footer' => 'Lábléc', + 'has_timestamp' => 'Időbélyeg', + 'footer_icon_url' => 'Lábléc Ikon URL', + 'add_field' => 'Mező Hozzáadása', + 'fields' => 'Mezők', + 'field_name' => 'Mező neve', + 'field_value' => 'Mező értéke', + 'inline_field' => 'Soron bellüli mező', + ], +]; diff --git a/lang/hu/auth.php b/lang/hu/auth.php index d8bfa614f5..0ceed39200 100644 --- a/lang/hu/auth.php +++ b/lang/hu/auth.php @@ -1,27 +1,24 @@ 'Bejelentkezés', - 'go_to_login' => 'Ugrás a bejelentkezéshez', - 'failed' => 'A megadott adatokkal nem található felhasználó.', - 'forgot_password' => [ - 'label' => 'Elfelejtetted a jelszavad?', - 'label_help' => 'Add meg az email címed a jelszavad visszaállításához.', - 'button' => 'Fiók visszaállítása', - ], - - 'reset_password' => [ - 'button' => 'Visszaállítás és bejelentkezés', - ], - - 'two_factor' => [ - 'label' => '2-Faktoros kulcs', - 'label_help' => 'Ez a fiók egy második szintű hitelesítést igényel a folytatáshoz. Kérjük, add meg a hitelesítő alkalmazásod által generált kódot a bejelentkezés befejezéséhez.', - 'checkpoint_failed' => 'A két-faktoros hitelesítés kulcsa érvénytelen.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'A hitelesítő adatok nem egyeznek meg a nyilvántartásunkkal.', + 'failed-two-factor' => 'Helytelen 2FA Kód', + 'two-factor-code' => 'Kétfaktoros kód', + 'two-factor-hint' => 'Használhatod a biztonsági kódokat, ha elvesztetted a hozzáférést a készülékéhez.', + 'password' => 'A megadott jelszó helytelen.', 'throttle' => 'Túl sok bejelentkezési próbálkozás. Kérlek próbáld újra :seconds másodperc múlva.', - 'password_requirements' => 'A jelszónak legalább 8 karakter hosszúnak kell lennie.', - '2fa_must_be_enabled' => 'A panel használatához két-faktoros hitelesítés engedélyezése szükséges.', + '2fa_must_be_enabled' => 'Az adminisztrátor előírta, hogy a Panel használatához a fiókodhoz kötelező bekapcsolni a kétlépcsős azonosítást.', + ]; diff --git a/lang/hu/command/messages.php b/lang/hu/command/messages.php index 50cef8b628..3a603c29b6 100644 --- a/lang/hu/command/messages.php +++ b/lang/hu/command/messages.php @@ -2,58 +2,53 @@ return [ 'user' => [ - 'search_users' => 'Kérlek írd ide a Discord felhasználóneved, ID számod, vagy E-mail címed!', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', + 'search_users' => 'Kérlek írd ide a felhasználónevet, azonosító számot vagy E-mail címet!', + 'select_search_user' => 'A törölni kívánt felhasználó ID száma (Nyomj a \'0\' -ra az újra kereséshez)', + 'deleted' => 'A felhasználó törölve a panel adatbázisából.', + 'confirm_delete' => 'Biztos vagy benne, hogy törlöd a felhasználót a panel adatbázisából?', + 'no_users_found' => 'Nem található felhasználó a megadott keresési adatokkal.', + 'multiple_found' => 'Több felhasználói fiók is található a megadott felhasználói azonosító alatt, nem törölhető, mert --no-interaction.', + 'ask_admin' => 'Ez a felhasználó rendelkezik adminisztrátori jogosultsággal?', + 'ask_email' => 'E-mail cím', + 'ask_username' => 'Felhasználónév', + 'ask_password' => 'Jelszó', + 'ask_password_tip' => 'Ha olyan fiókot szeretne létrehozni, amelynek jelszavát véletlenszerűen küldi el e-mailben a felhasználónak, futtassa újra ezt a parancsot (CTRL+C), és adja meg a `--no-password` jelzőt.', + 'ask_password_help' => 'A jelszavaknak legalább 8 karakter hosszúságúnak kell lenniük, és legalább egy nagybetűt és egy számot kell tartalmazniuk.', + '2fa_help_text' => 'Ez a parancs letiltja a 2 faktoros azonosítást a felhasználó fiókjában, ha az engedélyezve van. Ezt kizárólag fiókhelyreállítás céljából szabad használni, ha a felhasználó nem tud hozzáférni a fiókjához. Ha nem ezt szeretnéd végrehajtani, nyomd meg a CTRL+C billentyűkombinációt a folyamat megszakításához.', + '2fa_disabled' => 'A 2-faktoros hitelesítés letiltásra került a :email esetében.', ], 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', + 'output_line' => 'Munkamenet indítása az első feladathoz a(z) `:schedule`-ban (:id).', ], 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', + 'deleting_service_backup' => 'Biztonsági mentési fájl törlése :file.', ], 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', + 'rebuild_failed' => 'A ":node” csomópont ":name” (#:id) újraépítési kérelme sikertelen volt, hiba: :message', 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', + 'failed' => 'A ":node” csomópont ":name” (#:id) újra telepítési kérelme sikertelen volt, hiba: :message', + 'confirm' => 'Egyszerre több szervert is újratelepíteni készülsz. Biztos, hogy folytatni szeretnéd?', ], 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', + 'confirm' => 'Ön egy :actiont készül végrehajtani :count szervernél. Szeretné folytatni?', + 'action_failed' => 'A ":name" (#:id) számára a ":node" csomóponton meghiúsult energiaellátási művelet kérése: :message', ], ], 'environment' => [ 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', + 'ask_smtp_host' => 'SMTP Kiszolgáló (pl.: smtp.gmail.com)', 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', + 'ask_smtp_username' => 'SMTP Felhasználónév', + 'ask_smtp_password' => 'SMTP Jelszó', + 'ask_mailgun_domain' => 'Mailgun tartomány', + 'ask_mailgun_endpoint' => 'Mailgun végpont', + 'ask_mailgun_secret' => 'Mailgun titkos kulcs', + 'ask_mandrill_secret' => 'Mandrill titkos kulcs', + 'ask_postmark_username' => 'Postmark API kulcs', + 'ask_driver' => 'Melyik illesztőprogramot szeretnél használni az e-mailek küldéséhez?', + 'ask_mail_from' => 'E-mail cím, ahonnan az e-maileknek származniuk kell', + 'ask_mail_name' => 'Név, amelyről az e-maileknek meg kell jelenniük', + 'ask_encryption' => 'Használandó titkosítási módszer', ], ], ]; diff --git a/lang/hu/commands.php b/lang/hu/commands.php new file mode 100644 index 0000000000..a5c0d8a637 --- /dev/null +++ b/lang/hu/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Adj meg egy e-mail címet, amire exportálni tudjuk az eggs-t. Mindenképp valós e-mail cím legyen.', + 'url' => 'Az URL címnek kötelező, hogy "https://" vagy "http://"-el kezdődjön, attól függően, hogy SSL-t használsz-e vagy nem. Hogyha hibásan adod meg, rossz helyre fog menni.', + 'timezone' => 'Az időzónának egyeznie kell a PHP által támogatott időzónákkal. Hogyha nem vagy biztos, kérlek, látogasd meg a https://php.net/manual/en/timezones.php oldalt.', + ], + 'redis' => [ + 'note' => 'A Redis drivert választottad egy vagy több beállításhoz, kérlek add meg az érvényes kapcsolati adatokat alább. A legtöbb esetben használhatod az alapértelmezett értékeket, hacsak nem módosítottad a beállításaidat.', + 'comment' => 'Alapértelmezés szerint a Redis szerver felhasználóneve "default" és nincs jelszava, mivel helyileg fut és kívülről nem elérhető. Ha ez a helyzet, egyszerűen nyomj Enter-t érték megadása nélkül.', + 'confirm' => 'Úgy tűnik, a :field már definiálva van a Redis-hez, szeretnéd megváltoztatni?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Erősen ajánlott, hogy ne használd a "localhost" megnevezést adatbázis hosztként, mivel gyakran találkoztunk csatlakozási problémákkal. Ha helyi kapcsolatot szeretnél használni, inkább a "127.0.0.1" címet használd.', + 'DB_USERNAME_note' => 'A root fiók használata MySQL kapcsolathoz nemcsak erősen ellenjavallt, hanem ez az alkalmazás által sem engedélyezett. Létre kell hoznod egy MySQL felhasználót a szoftver számára.', + 'DB_PASSWORD_note' => 'Úgy tűnik, már van MySQL kapcsolati jelszavad megadva, szeretnéd megváltoztatni?', + 'DB_error_2' => 'A kapcsolati adataid NINCSENEK elmentve. Érvényes kapcsolati információkat kell megadnod a folytatáshoz.', + 'go_back' => 'Menj vissza és próbáld újra', + ], + 'make_node' => [ + 'name' => 'Add meg egy rövid azonosítót, ami segít megkülönböztetni ezt a node-ot a többitől', + 'description' => 'Add meg a node leírását az azonosításhoz', + 'scheme' => 'Add meg a "https"-t SSL-hez vagy "http"-t nem SSL kapcsolathoz', + 'fqdn' => 'Add meg a domain nevet (pl. node.pelda.hu) ami a daemonhoz való csatlakozáshoz lesz használva. IP címet csak akkor használhatsz, ha nem használsz SSL-t ehhez a node-hoz', + 'public' => 'Legyen ez a node nyilvános? Megjegyzés: ha privátra állítod egy node-ot, akkor letiltod a rá történő automatikus telepítést.', + 'behind_proxy' => 'A domain neved proxy mögött van?', + 'maintenance_mode' => 'A karbantartás be legyen kapcsolva?', + 'memory' => 'Add meg a maximum memóriát.', + 'memory_overallocate' => 'Add meg a memória túlallokálás mértékét, -1 letiltja az ellenőrzést, 0 pedig megakadályozza az új szerverek létrehozását', + 'disk' => 'Add meg a maximális lemezterületet', + 'disk_overallocate' => 'Add meg a lemezterület túlallokálás mértékét, -1 letiltja az ellenőrzést, 0 pedig megakadályozza az új szerverek létrehozását', + 'cpu' => 'Add meg a maximális CPU mennyiséget', + 'cpu_overallocate' => 'Add meg a CPU túlallokálás mértékét, -1 letiltja az ellenőrzést, 0 pedig megakadályozza az új szerverek létrehozását', + 'upload_size' => 'Add meg a maximális fájlfeltöltési méretet', + 'daemonListen' => 'Add meg a daemon figyelő portját', + 'daemonConnect' => 'Add meg a "daemon" csatlakozási portját (lehet ugyanaz, mint a hallgató port).', + 'daemonSFTP' => 'Add meg a daemon SFTP figyelő portját', + 'daemonSFTPAlias' => 'Add meg a daemon SFTP álnevét (üres is lehet).', + 'daemonBase' => 'Írd be a fő mappát', + 'success' => 'Sikeresen létrehoztál egy új node-ot :name néven, melynek azonosítója :id', + ], + 'node_config' => [ + 'error_not_exist' => 'A kiválasztott node nem létezik.', + 'error_invalid_format' => 'Érvénytelen formátum. Elfogadott opciók: yaml és json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Úgy tűnik, már be van állítva egy alkalmazás titkosítási kulcs. Ha folytatod ezt a folyamatot, az felülírja a meglévő kulcsot, és adatkárosodást okozhat a már titkosított adatoknál. NE FOLYTASD, HACSAK NEM TUDOD PONTOSAN, MIT CSINÁLSZ.', + 'understand' => 'Megértem a parancs végrehajtásának következményeit, és vállalom a felelősséget a titkosított adatok elvesztéséért.', + 'continue' => 'Biztosan folytatni szeretnéd? Az alkalmazás titkosítási kulcsának megváltoztatása ADATVESZTÉSHET vezethet.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Nincsenek végrehajtandó időzített feladatok a szerverekhez.', + 'error_message' => 'Hiba történt az időzítő feldolgozása közben: ', + ], + ], +]; diff --git a/lang/hu/dashboard/account.php b/lang/hu/dashboard/account.php deleted file mode 100644 index 0da2e974e6..0000000000 --- a/lang/hu/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Email címed frissítése', - 'updated' => 'Az email címed frissítve lett.', - ], - 'password' => [ - 'title' => 'Jelszóváltoztatás', - 'requirements' => 'Az új jelszavadnak legalább 8 karakter hosszúnak kell lennie.', - 'updated' => 'A jelszavad frissítve lett.', - ], - 'two_factor' => [ - 'button' => 'Két-faktoros hitelesítés beállítása', - 'disabled' => 'A két-faktoros hitelesítés ki van kapcsolva a fiókodnál. Bejelentkezéskor nem szükséges már megadnod a két-faktoros kulcsot.', - 'enabled' => 'Két-faktoros hitelesítés be van kapcsolva a fiókodnál! Ezentúl bejelentkezésnél meg kell adnod a két-faktoros kulcsot, amit a hitelesítő alkalmazás generál.', - 'invalid' => 'A megadott kulcs érvénytelen.', - 'setup' => [ - 'title' => 'Két-faktoros hitelesítés beállítása', - 'help' => 'Nem tudod bescannelni a kódot? Írd be az alábbi kulcsot az alkalmazásba:', - 'field' => 'Kulcs megadása', - ], - 'disable' => [ - 'title' => 'Két-faktoros hitelesítés kikapcsolása', - 'field' => 'Kulcs megadása', - ], - ], -]; diff --git a/lang/hu/dashboard/index.php b/lang/hu/dashboard/index.php deleted file mode 100644 index 58f60cc4bd..0000000000 --- a/lang/hu/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Szerverek keresése...', - 'no_matches' => 'Nem található szerver a megadott feltételekkel.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memória', -]; diff --git a/lang/hu/exceptions.php b/lang/hu/exceptions.php index 3977c87c24..6b44a43c0e 100644 --- a/lang/hu/exceptions.php +++ b/lang/hu/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'Probléma lépett fel a daemonnal való kommunikáció során a HTTP/:code válasz kód alatt. Naplózásra került a probléma.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'A node nem tartalmazhat szervereket a törlés végrehajtásához.', + 'error_connecting' => 'Hiba a csatlakozásnál: :node', + 'daemon_off_config_updated' => 'A daemon konfigurációfrissítve, azonban probléma lépett fel a daemon automatikus konfiguráció frissítése során. Manuálisan kell frissítened a konfigurációs fájlt (config.yml) hogy életbe lépjenek a daemonon végzett módosítások.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'Ez a szerver társított egy allokációhoz, csak akkor törölhetsz egy allokációt ha ahhoz nincsen szerver társítva.', + 'too_many_ports' => 'Több mint 1000 port megadása egy megadott tartományban nem támogatott.', + 'invalid_mapping' => 'A következő porthoz érvénytelen a hozzárendelés és nem sikerült feldolgozni: {port}.', + 'cidr_out_of_range' => 'A CIDR maszk csak /25 és /32es tartomány között engedélyezett.', + 'port_out_of_range' => 'Az allokációban megadott portoknak 1024 és 65535 között kell lenniük.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Egy aktív szerverhez társított Egg nem törölhető a panelből.', + 'invalid_copy_id' => 'A script másolására kiválasztott Egg nem létezik, vagy magát a scriptet másolja.', + 'has_children' => 'Ez az Egg szülője egy vagy több más Egg-nek. Töröld először az alárendelt Egg-eket mielőtt ezt törölnéd.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'A(z) :name környezeti változónak egyedinek kell lennie ehhez az Egg-hez.', + 'reserved_name' => 'A(z) :name környezeti változó védett és nem lehet hozzárendelni.', + 'bad_validation_rule' => 'A(z) ":rule" érvényesítési szabály nem érvényes az alkalmazásban.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'Hiba történt a JSON fájl feldolgozása közben: :error.', + 'file_error' => 'A megadott JSON fájl érvénytelen.', + 'invalid_json_provided' => 'A megadott JSON fájl formátuma nem felismerhető.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Nem módosíthatod a saját alfelhasználói fiókodat.', + 'user_is_owner' => 'Nem adhatod hozzá a szerver tulajdonosát mint alfelhasználót.', + 'subuser_exists' => 'Ez az email cím már szerepel mint alfelhasználó ehhez a szerverhez.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Nem törölhetsz egy adatbázis hoszt szervert amihez aktív adatbázisok kapcsolódnak.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'A láncolt feladatok maximális időköze 15 perc lehet.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Nem törölhetsz egy lokációt amihez aktív node-ok kapcsolódnak.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Nem törölheted a saját felhasználói fiókodat.', + 'has_servers' => 'Nem törölhetsz egy felhasználót akinek aktív szerverei vannak. Töröld először a szervereit.', + 'node_revocation_failed' => 'Sikertelen kulcs visszavonás a(z) Node #:node esetén. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Nem található megfelelő node az automatikus telepítéshez megadott követelmények alapján.', + 'no_viable_allocations' => 'Nem található megfelelő allokáció az automatikus telepítéshez.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => 'A kért erőforrás nem létezik ezen a kiszolgálón.', + ], + 'mount' => [ + 'servers_attached' => 'Egy mount nem törölhető amíg szerverek kapcsolódnak hozzá.', + ], + 'server' => [ + 'marked_as_failed' => 'Ez a szerver még nem fejezte be a telepítési folyamatot, kérlek próbáld újra később.', ], ]; diff --git a/lang/hu/notifications.php b/lang/hu/notifications.php new file mode 100644 index 0000000000..bd7d4c161c --- /dev/null +++ b/lang/hu/notifications.php @@ -0,0 +1,18 @@ + 'Szerver megnyitása', + 'installation_completed' => 'Szerver telepítése sikeres.', + 'installation_failed' => 'Szerver telepítése sikertelen.', + 'reinstallation_completed' => 'Szerver újratelepítése kész.', + 'reinstallation_failed' => 'Szerver újratelepítése sikertelen.', + 'failed' => 'Sikertelen', + 'user_added' => [ + 'title' => 'Szerverhez hozzáadva.', + 'body' => 'Felvettek a :server szerverre másodlagos felhasználóként.', + ], + 'user_removed' => [ + 'title' => 'Eltávolítva a szerverről.', + 'body' => 'Töröltek a :server mint másodlagos felhasználó.', + ], +]; diff --git a/lang/hu/pagination.php b/lang/hu/pagination.php deleted file mode 100644 index 5e00d52fb2..0000000000 --- a/lang/hu/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Előző', - 'next' => 'Következő »', -]; diff --git a/lang/hu/passwords.php b/lang/hu/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/hu/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/hu/profile.php b/lang/hu/profile.php new file mode 100644 index 0000000000..7554bdd313 --- /dev/null +++ b/lang/hu/profile.php @@ -0,0 +1,70 @@ + 'Profil', + 'tabs' => [ + 'account' => 'Fiók', + 'oauth' => 'OAuth', + 'activity' => 'Tevékenység', + 'api_keys' => 'API kulcs', + 'ssh_keys' => 'SSH Kulcsok', + 'keys' => 'Kulcsok', + '2fa' => '2FA', + 'customization' => 'Testreszabás', + ], + 'username' => 'Felhasználónév', + 'admin' => 'Adminisztrátor', + 'exit_admin' => 'Adminból kilépés', + 'server_list' => 'Szerver Lista', + 'email' => 'Email', + 'password' => 'Jelszó', + 'current_password' => 'Jelenlegi jelszó', + 'password_confirmation' => 'Jelszó megerősítés', + 'timezone' => 'Időzóna', + 'language' => 'Nyelv', + 'language_help' => ':state még nincsen le forditva!', + 'link' => 'Összekapcsol', + 'unlink' => 'Szétkapcsol', + 'unlinked' => ':name Szétkapcsolva', + 'scan_qr' => 'QR-kód beolvasása', + 'code' => 'Kód', + 'setup_key' => 'Beállítási kulcs', + 'invalid_code' => 'Érvénytelen 2FA kód', + 'code_help' => 'Szkenneld be a fenti QR-kódot a kétfaktoros hitelesítési alkalmazással, majd add meg a generált kódot.', + '2fa_enabled' => 'Kétfaktoros Hitelesítés be van kapcsolva', + 'backup_help' => 'Ezeket nem fogják többé mutatni!', + 'backup_codes' => 'Biztonsági kódok', + 'disable_2fa' => '2FA kikapcsolása', + 'disable_2fa_help' => 'Add meg az aktuális 2FA-kódot a kéttényezős hitelesítés letiltásához.', + 'api_keys' => 'API kulcsok', + 'create_api_key' => 'API kulcs létrehozása', + 'api_key_created' => 'API kulcs létrehozva', + 'description' => 'Leírás', + 'allowed_ips' => 'Engedélyezett IP-k', + 'allowed_ips_help' => 'Nyomd meg az Entert egy új IP-cím hozzáadásához, vagy hagyd üresen, ha bármilyen IP-címet engedélyezni szeretnél.', + 'ssh_keys' => 'SSH kulcsok', + 'create_ssh_key' => 'SSH kulcs létrehozása', + 'ssh_key_created' => 'SSH kulcs létrehozva', + 'name' => 'Név', + 'public_key' => 'Publikus kulcs', + 'could_not_create_ssh_key' => 'Nem sikerült létrehozni az ssh kulcsot', + 'dashboard' => 'Irányítópult', + 'dashboard_layout' => 'Műszerfal elrendezése', + 'console' => 'Konzol', + 'grid' => 'Rács', + 'table' => 'Tábla', + 'rows' => 'Sorok', + 'font_size' => 'Betűméret', + 'font' => 'Betűtípus', + 'font_preview' => 'Betűtípus előnézet', + 'seconds' => 'Másodperc', + 'graph_period' => 'Grafikon Időszak', + 'graph_period_helper' => 'A konzol grafikonjain megjelenített adatpontok mennyisége, másodperce.', + 'navigation' => 'Navigáció tipus', + 'sidebar' => 'Oldalsáv', + 'topbar' => 'Felső sáv', + 'mixed' => 'Vegyes', + 'no_oauth' => 'Nincsenek összekapcsolt fiókok', + 'no_api_keys' => 'Nincsenek API-kulcsok', + 'no_ssh_keys' => 'Nincsenek SSH kulcsok', +]; diff --git a/lang/hu/search.php b/lang/hu/search.php new file mode 100644 index 0000000000..ea966efbf3 --- /dev/null +++ b/lang/hu/search.php @@ -0,0 +1,9 @@ + 'Kérlek adj meg három karakter hogy a keresést el lehessen kezdeni', + 'term' => [ + 'label' => 'Kifejezés keresése', + 'description' => 'Adj meg egy szerver nevet, uuid-t vagy egy helyet hogy a keresést el lehessen kezdeni', + ], +]; diff --git a/lang/hu/server/activity.php b/lang/hu/server/activity.php new file mode 100644 index 0000000000..ef3239b5f2 --- /dev/null +++ b/lang/hu/server/activity.php @@ -0,0 +1,11 @@ + 'Tevékenység', + 'event' => 'Esemény', + 'user' => 'Felhasználó', + 'deleted_user' => 'Törölt felhasználó', + 'system' => 'Rendszer', + 'timestamp' => 'Időbélyeg', + 'metadata' => 'Metaadat', +]; diff --git a/lang/hu/server/backup.php b/lang/hu/server/backup.php new file mode 100644 index 0000000000..f101a4de3c --- /dev/null +++ b/lang/hu/server/backup.php @@ -0,0 +1,55 @@ + 'Biztonsági mentések', + 'empty' => 'Nincs biztonsági mentés', + 'size' => 'Méret', + 'created_at' => 'Létrehozva', + 'status' => 'Állapot', + 'is_locked' => 'Zár státusza', + 'backup_status' => [ + 'in_progress' => 'Folyamatban', + 'successful' => 'Sikeres', + 'failed' => 'Sikertelen', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Biztonsági másolat létrehozása', + 'limit' => 'Elérte a biztonsági mentési korlátot', + 'created' => ':name létrehozta', + 'notification_success' => 'Biztonsági másolat sikeresen létrehozva', + 'notification_fail' => 'A biztonsági másolat létrehozása sikertelen', + 'name' => 'Név', + 'ignored' => 'Figyelmen kívül hagyott fájlok és könyvtárak', + 'locked' => 'Zárt?', + 'lock_helper' => 'Megakadályozza, hogy ez a biztonsági másolat törlésre kerüljön, amíg kifejezetten fel nem oldják.', + ], + 'lock' => [ + 'lock' => 'Zárolás', + 'unlock' => 'Feloldás', + ], + 'download' => 'Letöltés', + 'rename' => [ + 'title' => 'Átnevezés', + 'new_name' => 'A biztonsági mentés neve', + 'notification_success' => 'A biztonsági másolat visszaállítása sikeresen megtörtént', + ], + 'restore' => [ + 'title' => 'Visszaállítás', + 'helper' => 'A szerver leállításra kerül. Amíg a folyamat tart, nem tudja majd kezelni a szerver állapotát, használni a fájlkezelőt vagy új biztonsági mentést készíteni.', + 'delete_all' => 'A biztonsági másolat visszaállítása előtt töröli az összes fájlt?', + 'notification_started' => 'Mentés visszaállítása', + 'notification_success' => 'A biztonsági másolat visszaállítása sikeresen megtörtént', + 'notification_fail' => 'Mentés visszaállítása sikertelen', + 'notification_fail_body_1' => 'Ez a szerver jelenleg nem alkalmas biztonsági másolat visszaállítására.', + 'notification_fail_body_2' => 'Ez a biztonsági másolat jelenleg nem állítható vissza: nem fejeződött be vagy sikertelen volt.', + ], + 'delete' => [ + 'title' => 'Biztonsági másolat törlése', + 'description' => 'Szeretné törölni a következőt? :backup', + 'notification_success' => 'Biztonsági mentés törölve', + 'notification_fail' => 'A biztonsági másolat nem törölhető', + 'notification_fail_body' => 'A csomóponttal való kapcsolat megszakadt. Kérlek, próbáld meg újra.', + ], + ], +]; diff --git a/lang/hu/server/console.php b/lang/hu/server/console.php new file mode 100644 index 0000000000..3af768e51c --- /dev/null +++ b/lang/hu/server/console.php @@ -0,0 +1,43 @@ + 'Konzol', + 'command' => 'Írj be egy parancsot…', + 'command_blocked' => 'Szerver Offline...', + 'command_blocked_title' => 'A szerver offline állapotában nem lehet parancsot küldeni.', + 'open_in_admin' => 'Megnyitás adminból', + 'power_actions' => [ + 'start' => 'Indítás', + 'stop' => 'Leállítás', + 'restart' => 'Újraindítás', + 'kill' => 'Kilövés', + 'kill_tooltip' => 'Ez adatkorrupcióhoz és/vagy adatvesztéshez vezethet!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Memória', + 'network' => 'Hálózat', + 'disk' => 'Tárhely', + 'name' => 'Név', + 'status' => 'Státusz', + 'address' => 'Cím', + 'unavailable' => 'Nem elérhető', + ], + 'status' => [ + 'created' => 'Létrehozva', + 'starting' => 'Indítás', + 'running' => 'Folyamatban', + 'restarting' => 'Újraindítás', + 'exited' => 'Kilépett', + 'paused' => 'Szüneteltetve', + 'dead' => 'Halott', + 'removing' => 'Eltávolítás', + 'stopping' => 'Leállítás', + 'offline' => 'Offline', + 'missing' => 'Hiányzik', + ], + 'websocket_error' => [ + 'title' => 'Nem sikerült a websocket-re csatlakozni!', + 'body' => 'Nézd meg a böngésződ konzolját több információért.', + ], +]; diff --git a/lang/hu/server/dashboard.php b/lang/hu/server/dashboard.php new file mode 100644 index 0000000000..9342aff975 --- /dev/null +++ b/lang/hu/server/dashboard.php @@ -0,0 +1,28 @@ + 'Szerverek', + 'list' => 'Szerver Lista', + 'tabs' => [ + 'my' => 'Szervereim', + 'other' => 'Mások szerverei', + 'all' => 'Összes szerver', + ], + 'empty_own' => 'Nincs saját szervered!', + 'empty_other' => 'Nincs hozzáférésed egyetlen szerverhez sem!', + + 'status' => 'Állapot', + 'server' => 'Szerver', + 'resources' => 'Erőforrások', + 'usage_limit' => 'Felhasználási korlát: :resource', + + 'cpu' => 'Processzor', + 'memory' => 'Memória', + 'disk' => 'Lemez', + 'network' => 'Hálózat', + 'none' => 'Nincs', + 'loading' => 'Betöltés...', + + 'power_actions' => 'Erőforrás műveletek', + 'power_action_sent' => ':action elkülve neki :name', +]; diff --git a/lang/hu/server/database.php b/lang/hu/server/database.php new file mode 100644 index 0000000000..37ae271ccc --- /dev/null +++ b/lang/hu/server/database.php @@ -0,0 +1,26 @@ + 'Adatbázisok', + 'empty' => 'Nincs adatbázis', + 'create_database' => 'Adatbázis Létrehozása', + 'limit' => 'Adatbázis limit elérve', + 'viewing' => 'Megtekintés: :database', + 'host' => 'Hoszt', + 'database' => 'Adatbázis', + 'username' => 'Felhasználónév', + 'password' => 'Jelszó', + 'remote' => 'Távoli', + 'created_at' => 'Létrehozva', + 'name' => 'Adatbázis név', + 'name_hint' => 'Ha ezt üresen hagyod, akkor automatikusan generál egy véletlenszerű nevet.', + 'connections_from' => 'Csatlakozás innen', + 'max_connections' => 'Maximum kapcsolatok', + 'database_host' => 'Adatbázis szerver', + 'database_host_select' => 'Válaszd ki az adatbázis szervert', + 'jdbc' => 'JDBC kapcsolatlánc', + 'create_notification' => 'Létrehozva :database', + 'create_notification_fail' => 'A létrehozás nem sikerült :database', + 'delete_notification' => 'Törölve :database', + 'delete_notification_fail' => 'A törlés nem sikerült :database', +]; diff --git a/lang/hu/server/network.php b/lang/hu/server/network.php new file mode 100644 index 0000000000..f82b0ff589 --- /dev/null +++ b/lang/hu/server/network.php @@ -0,0 +1,17 @@ + 'Hálózat', + 'add' => 'Allokáció Hozzáadása', + 'limit' => 'Az allokációs limit elérve', + 'address' => 'Cím', + 'port' => 'Port', + 'notes' => 'Jegyzetek', + 'no_notes' => 'Nincsenek Jegyzetek', + 'make_primary' => 'Legyen elsődleges', + 'primary' => 'Elsődleges', + 'make' => 'Létrehozás', + 'delete' => 'Törlés', + 'locked' => 'Zárt?', + 'locked_helper' => 'A zárolt allokációkat csak az adminisztrátorok törölhetik.', +]; diff --git a/lang/hu/server/setting.php b/lang/hu/server/setting.php new file mode 100644 index 0000000000..f3ca55beab --- /dev/null +++ b/lang/hu/server/setting.php @@ -0,0 +1,60 @@ + 'Beállítások', + 'server_info' => [ + 'title' => 'Szerver Információ', + 'information' => 'Információ', + 'name' => 'Kiszolgáló neve', + 'server_name' => 'Szerver neve: :name', + 'notification_name' => 'Szerver név frissítve', + 'description' => 'Szerver leírás', + 'notification_description' => 'Szerver leírás frissítve', + 'failed' => 'Sikertelen', + 'uuid' => 'Szerver UUID', + 'uuid_short' => 'Szerver ID', + 'node_name' => 'Csomópont neve', + 'icon' => [ + 'upload' => 'Ikon feltöltése', + 'tooltip' => 'Egg ikon használata', + 'updated' => 'Szerver ikon frissítve', + 'deleted' => 'Szerver ikon törölve', + ], + 'limits' => [ + 'title' => 'Korlátok', + 'unlimited' => 'Korlátlan', + 'of' => 'of', + 'cpu' => 'CPU', + 'memory' => 'Memória', + 'disk' => 'Lemezterület', + 'backups' => 'Biztonsági mentések', + 'databases' => 'Adatbázisok', + 'allocations' => 'Kiosztások', + 'no_allocations' => 'Nincs további kiosztás. +', + ], + 'sftp' => [ + 'title' => 'SFTP információk', + 'connection' => 'Kapcsolat', + 'action' => 'Kapcsolódás az SFTPhez', + 'username' => 'Felhasználónév', + 'password' => 'Jelszó', + 'password_body' => 'Az SFTP jelszavad megeggyezik azzal a jelszóval amit a panel fiókodnál használsz.', + ], + ], + 'reinstall' => [ + 'title' => 'Szerver újratelepítése', + 'body' => 'A szerver újratelepítése leállítja azt, majd újra futtatja a telepítő scriptet, amely eredetileg beállította. +', + 'body2' => 'Ez a folyamat során egyes fájlok törlődhetnek vagy módosulhatnak, ezért folytatás előtt készíts biztonsági mentést az adataidról. +', + 'action' => 'Újratelepítés', + 'modal' => 'Biztosan újratelepíted a szervert? +', + 'modal_description' => 'Ez a folyamat során egyes fájlok törlődhetnek vagy módosulhatnak, ezért folytatás előtt készíts biztonsági mentést az adataidról. +', + 'yes' => 'Igen, telepítsd újra', + 'notification_start' => 'Újratelepítés elindítva', + 'notification_fail' => 'Sikertelen újratelepítés', + ], +]; diff --git a/lang/hu/server/startup.php b/lang/hu/server/startup.php new file mode 100644 index 0000000000..060e372f34 --- /dev/null +++ b/lang/hu/server/startup.php @@ -0,0 +1,19 @@ + 'Indítás', + 'command' => 'Indítási parancs', + 'notification_startup' => 'Indítási parancs frissítve', + 'notification_startup_body' => 'Indítsa újra a szervert az új indítási parancs használatához.', + 'enable_preview' => 'Előnézet engedélyezése', + 'disable_preview' => 'Előnézet letiltása', + 'docker_image' => 'Docker Image', + 'notification_docker' => 'A Docker kép frissítve. +', + 'notification_docker_body' => 'Indítsd újra a szervert az új kép használatához.', + 'variables' => 'Szerverváltozók', + 'update' => 'Frissítve: :variable', + 'fail' => 'Sikertelen: :variable', + 'validation_fail' => 'Érvényesítés sikertelen: :variable +', +]; diff --git a/lang/hu/server/user.php b/lang/hu/server/user.php new file mode 100644 index 0000000000..e36f0a4e3e --- /dev/null +++ b/lang/hu/server/user.php @@ -0,0 +1,74 @@ + 'Felhasználók', + 'username' => 'Felhasználónév', + 'email' => 'Email', + 'assign_all' => 'Mind hozzárendelése', + 'invite_user' => 'Felhasználó meghívása', + 'action' => 'Meghívás', + 'remove' => 'Felhasználó eltávolítása', + 'edit' => 'Felhasználó szerkesztése', + 'editing' => ':user szerkesztése', + 'delete' => 'Felhasználó törlése', + 'notification_add' => 'Felhasználó meghívva!', + 'notification_edit' => 'Felhasználó frissítve!', + 'notification_delete' => 'Felhasználó törölve!', + 'notification_failed' => 'A felhasználó meghívása sikertelen! +', + 'permissions' => [ + 'title' => 'Engedélyek', + 'activity_desc' => 'Jogosultságok a szerver tevékenységnaplóinak eléréséhez.', + 'startup_desc' => 'Jogosultságok a szerver indítási paramétereinek megtekintéséhez.', + 'settings_desc' => 'Jogosultságok a szerver beállításainak módosításához.', + 'control_desc' => 'Jogosultságok a szerver energiaállapotának vezérléséhez és parancsok küldéséhez.', + 'user_desc' => 'Jogosultságok más felhasználók kezeléséhez a szerveren. Saját fiókjukat nem szerkeszthetik, és olyan jogosultságot nem adhatnak, ami nincs meg nekik.', + 'file_desc' => 'Jogosultságok a szerver fájlrendszerének módosításához.', + 'allocation_desc' => 'Jogosultságok a szerver portallokációinak módosításához.', + 'database_desc' => 'Jogosultságok a szerver adatbázis-kezeléséhez.', + 'backup_desc' => 'Jogosultságok a szerver mentéseinek létrehozásához és kezeléséhez.', + 'schedule_desc' => 'Jogosultságok a szerver ütemezés-kezeléséhez.', + 'startup_read' => 'Lehetővé teszi a felhasználó számára a szerver indítási változóinak megtekintését.', + 'startup_update' => 'Lehetővé teszi a felhasználó számára a szerver indítási változóinak módosítását.', + 'startup_docker_image' => 'Lehetővé teszi a felhasználó számára a szerver Docker image-jének módosítását.', + 'settings_reinstall' => 'Lehetővé teszi a felhasználó számára a szerver újratelepítését.', + 'settings_rename' => 'Lehetővé teszi a felhasználó számára a szerver átnevezését és leírásának módosítását.', + 'settings_description' => 'Lehetővé teszi a felhasználó számára, hogy megváltoztassa a kiszolgáló leírását.', + 'activity_read' => 'Lehetővé teszi a felhasználó számára a szerver tevékenységnaplóinak megtekintését.', + 'websocket_connect' => 'Websocket elérését engedélyezik felhasználóknak.', + 'control_console' => 'Lehetővé teszi a felhasználó számára adatok küldését a szerver konzoljára.', + 'control_start' => 'Lehetővé teszi a felhasználó számára a szerver példány indítását.', + 'control_stop' => 'Lehetővé teszi a felhasználó számára a szerver példány leállítását.', + 'control_restart' => 'Lehetővé teszi a felhasználó számára a szerver példány újraindítását.', + 'control_kill' => 'Lehetővé teszi a felhasználó számára a szerver példány kényszerített leállítását.', + 'user_create' => 'Lehetővé teszi a felhasználó számára új felhasználói fiókok létrehozását a szerveren.', + 'user_read' => 'Lehetővé teszi a felhasználó számára a szerverhez társított felhasználók megtekintését.', + 'user_update' => 'Lehetővé teszi a felhasználó számára a szerverhez társított felhasználók módosítását.', + 'user_delete' => 'Lehetővé teszi a felhasználó számára a szerverhez társított felhasználók törlését.', + 'file_create' => 'Lehetővé teszi a felhasználó számára új fájlok és könyvtárak létrehozását.', + 'file_read' => 'Lehetővé teszi a felhasználó számára egy könyvtár tartalmának megtekintését, de nem engedi meg a fájlok tartalmának vagy letöltésének megtekintését.', + 'file_read_content' => 'Lehetővé teszi a felhasználó számára egy adott fájl tartalmának megtekintését. Ez lehetővé teszi a fájlok letöltését is.', + 'file_update' => 'Lehetővé teszi a felhasználó számára a szerverhez társított fájlok és mappák módosítását.', + 'file_delete' => 'Lehetővé teszi a felhasználó számára a fájlok és könyvtárak törlését.', + 'file_archive' => 'Lehetővé teszi a felhasználó számára fájlarchívumok létrehozását és meglévő archívumok kibontását.', + 'file_sftp' => 'Lehetővé teszi a felhasználó számára a fenti fájlműveletek végrehajtását SFTP kliens segítségével.', + 'allocation_read' => 'Lehetővé teszi a felhasználó számára a szerverhez jelenleg rendelt összes allokáció megtekintését. A szerverhez bármilyen hozzáféréssel rendelkező felhasználók mindig láthatják az elsődleges allokációt.', + 'allocation_update' => 'Lehetővé teszi a felhasználó számára a szerver elsődleges allokációjának megváltoztatását és megjegyzések csatolását az egyes allokációkhoz.', + 'allocation_delete' => 'Lehetővé teszi a felhasználó számára egy allokáció törlését a szerverről.', + 'allocation_create' => 'Lehetővé teszi a felhasználó számára további allokációk rendelését a szerverhez.', + 'database_create' => 'Lehetővé teszi a felhasználó számára új adatbázis létrehozását a szerveren.', + 'database_read' => 'Lehetővé teszi a felhasználó számára a szerver adatbázisainak megtekintését.', + 'database_update' => 'Elérés megadása a felhasználónak hogy módosításokat végezzen a szerver adatbázisaiban. Ha a felhasználó nem rendelkezik a "Jelszó Megtekintése" jogosultsággal nem képes módosítást végezni az adatbázis jelszavában.', + 'database_delete' => 'Elérés megadása a felhasználónak hogy képes legyen adatbázist törölni.', + 'database_view_password' => 'Elérés megadása a felhasználónak hogy adatbázis jelszó megtekintési lehetősége legyen.', + 'schedule_create' => 'Elérés megadása a felhasználónak hogy új időbeosztást társítson a szerverhez.', + 'schedule_read' => 'Elérés megadása a felhasználónak hogy megtekintse az időbeosztásokat a szerveren.', + 'schedule_update' => 'Elérés megadása a felhasználónak hogy módosítson már létrehozott időbeosztásokon.', + 'schedule_delete' => 'Elérés megadása a felhasználónak hogy törölhessen már meglévő időbeosztásokat.', + 'backup_create' => 'Lehetővé teszi a felhasználó számára új mentések létrehozását a szerverhez.', + 'backup_read' => 'Lehetővé teszi a felhasználó számára a szerver összes mentésének megtekintését.', + 'backup_delete' => 'Lehetővé teszi a felhasználó számára mentések eltávolítását a rendszerből.', + 'backup_download' => 'Lehetővé teszi a felhasználó számára a szerver mentésének letöltését. Figyelem: ez lehetővé teszi a felhasználó számára a mentésben lévő összes szerverfájl elérését.', + 'backup_restore' => 'Lehetővé teszi a felhasználó számára a szerver mentésből történő visszaállítását. Figyelem: ez lehetővé teszi a felhasználó számára az összes szerverfájl törlését a folyamat során.', + ], +]; diff --git a/lang/hu/server/users.php b/lang/hu/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/hu/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/hu/strings.php b/lang/hu/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/hu/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/hu/validation.php b/lang/hu/validation.php index 9cccf35080..25f9e80bb1 100644 --- a/lang/hu/validation.php +++ b/lang/hu/validation.php @@ -12,78 +12,75 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => 'A(z) :attribute el kell legyen fogadva!', + 'active_url' => 'A(z) :attribute nem érvényes URL!', + 'after' => 'A(z) :attribute :date utáni dátum kell, hogy legyen!', + 'after_or_equal' => 'A(z) :attribute a :date után vagy azzal megegyező dátumnak kell lennie.', + 'alpha' => ':attribute csak betűket tartalmazhat.', + 'alpha_dash' => ':attribute csak betűket, számokat és kötőjelet tartalmazhat.', + 'alpha_num' => 'A(z) :attribute kizárólag betűket és számokat tartalmazhat!', + 'array' => ':attribute csak tömb típusú lehet.', + 'before' => 'A(z) :attribute -nak a :date előtti dátumnak kell lennie.', + 'before_or_equal' => 'A(z) :attribute a :date előtti vagy azzal megegyező dátumnak kell lennie.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => 'A(z) :attribute :min és :max között kell lennie.', + 'file' => ':attribute értékének :min és :max kilobyte között kell lennie.', + 'string' => ':attribute :min és :max karakter között kell legyen.', + 'array' => ':attribute mennyiségének :min és :max elem között kell lennie.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => ':attribute megerősítése nem egyezik.', + 'date' => ':attribute nem egy érvényes dátum.', + 'date_format' => ':attribute nem egyezik :format formátummal.', + 'different' => ':attribute és :other értékének különböznie kell.', + 'digits' => ':attribute :digits számból kell álljon.', + 'digits_between' => ':attribute :min és :max számjegy között kell lennie.', + 'dimensions' => ':attribute attribútum képfelbontása érvénytelen.', + + 'email' => 'A(z) :attribute érvényes e-mail címnek kell lennie.', + + 'file' => 'A(z) :attribute fájlnak kell lennie.', + 'filled' => ':attribute mező kötelező.', + 'image' => 'A :attribute képnek kell lennie.', + + 'in_array' => ':attribute nem létezik itt: :other.', + 'integer' => 'A :attribute egész számnak kell lennie.', + 'ip' => ':attribute érvényes IP cím kell, hogy legyen.', + 'json' => ':attribute csak érvényes JSON lehet.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute nem lehet nagyobb mint :max.', + 'file' => ':attribute nem lehet nagyobb mint :max kilobyte.', + 'string' => ':attribute nem lehet nagyobb, mint :max karakter.', + 'array' => 'A :attribute nem tartalmazhat több adatot, mint :max.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => 'A :attribute kizárólag csak :value fájl formátum lehet.', + 'mimetypes' => 'A :attribute kizárólag csak :value fájl formátum lehet.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => 'A :attribute legalább :min kell lennie.', + 'file' => 'A :attribute legalább :min kilobytenak kell lennie.', + 'string' => 'A(z) :attribute minimum :min karakter hosszú kell, hogy legyen.', + 'array' => 'A(z) :attribute kell hogy legyen minimum :min elem.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => 'A(z) :attribute szám kell, hogy legyen.', + + 'regex' => 'A(z) :attribute formátum érvénytelen.', + + 'required_with_all' => 'A :attribute mező kötelező, amikor a :values jelenben van.', + + 'same' => ':attribute és :other értékének egyeznie kell.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => 'Az :attribute -nak :size-nak kell lennie. +', + 'file' => ':attribute :size kilobyte-nak kell lennie.', + 'string' => ':attribute :size karakter kell legyen.', + 'array' => ':attribute :size elemet kell tartalmazzon.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => 'A :attribute egy szövegnek kell lennie. +', + 'timezone' => 'A(z) :attribute létező zónának kell lennie.', + + 'url' => 'A(z) :attribute formátum érvénytelen.', /* |-------------------------------------------------------------------------- @@ -100,7 +97,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => ':env változó', + 'invalid_password' => 'A megadott jelszó érvénytelen volt ehhez a fiókhoz.', ], ]; diff --git a/lang/id/activity.php b/lang/id/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/id/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/id/admin/apikey.php b/lang/id/admin/apikey.php new file mode 100644 index 0000000000..e94aec4d9e --- /dev/null +++ b/lang/id/admin/apikey.php @@ -0,0 +1,27 @@ + 'Kunci API Aplikasi', + 'empty' => 'Tidak Ada Kunci API', + 'whitelist' => 'Alamat IPv4 yang diizinkan', + 'whitelist_help' => 'Kunci API bisa dibatasi untuk hanya bekerja dari alamat IPv4 tertentu. Masukkan satu alamat per baris.', + 'whitelist_placeholder' => 'Contoh: 127.0.0.1 atau 192.168.1.1', + 'description' => 'Deskripsi', + 'description_help' => 'Deskripsi singkat tentang kegunaan kunci ini.', + 'nav_title' => 'Kunci API', + 'model_label' => 'Kunci API Aplikasi', + 'model_label_plural' => 'Kunci-kunci API Aplikasi', + 'table' => [ + 'key' => 'Kunci', + 'description' => 'Deskripsi', + 'last_used' => 'Terakhir digunakan', + 'created' => 'Dibuat', + 'created_by' => 'Dibuat oleh', + 'never_used' => 'Tidak pernah digunakan', + ], + 'permissions' => [ + 'none' => 'Tidak ada', + 'read' => 'Akses baca', + 'read_write' => 'Akses baca dan tulis', + ], +]; diff --git a/lang/id/admin/eggs.php b/lang/id/admin/eggs.php deleted file mode 100644 index 133ac5e767..0000000000 --- a/lang/id/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Berhasil mengimport Egg dan variabel terkaitnya.', - 'updated_via_import' => 'Egg ini telah diperbarui menggunakan file yang disediakan.', - 'deleted' => 'Berhasil menghapus Egg dari Panel.', - 'updated' => 'Konfigurasi Egg ini telah berhasil diperbarui.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/id/admin/log.php b/lang/id/admin/log.php new file mode 100644 index 0000000000..30d4da5508 --- /dev/null +++ b/lang/id/admin/log.php @@ -0,0 +1,26 @@ + 'Hore! Tidak ada kesalahan!', + 'total_logs' => 'Total Log', + 'error' => 'Kesalahan', + 'warning' => 'Peringatan', + 'notice' => 'Pemberitahuan', + 'info' => 'Informasi', + 'debug' => 'Debug', + 'navigation' => [ + 'panel_logs' => 'Panel Log', + ], + 'actions' => [ + 'upload_logs' => 'Unggah Log?', + 'upload_logs_description' => ':berkas ini akan diunggah ke :url Apakah Anda yakin akan melakukannya?', + 'view_logs' => 'Lihat Log', + 'log_not_found' => 'Log tidak ditemukan!', + 'log_not_found_description' => 'Tidak bisa menemukan log untuk :namaberkas', + 'failed_to_upload' => 'Gagal mengunggah.', + 'failed_to_upload_description' => 'Status HTTP: :status', + 'log_upload' => 'Log berhasil diunggah!', + 'log_upload_action' => 'Lihat Log', + 'upload_tooltip' => 'Unggah ke :url', + ], +]; diff --git a/lang/id/admin/node.php b/lang/id/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/id/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/id/admin/server.php b/lang/id/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/id/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/id/admin/user.php b/lang/id/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/id/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/id/auth.php b/lang/id/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/id/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/id/command/messages.php b/lang/id/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/id/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/id/dashboard/account.php b/lang/id/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/id/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/id/dashboard/index.php b/lang/id/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/id/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/id/exceptions.php b/lang/id/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/id/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/id/pagination.php b/lang/id/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/id/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/id/passwords.php b/lang/id/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/id/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/id/search.php b/lang/id/search.php new file mode 100644 index 0000000000..2e7730a33f --- /dev/null +++ b/lang/id/search.php @@ -0,0 +1,9 @@ + 'Silahkan masukkan paling sedikit tiga karakter untuk memulai pencarian.', + 'term' => [ + 'label' => 'Istilah pencarian', + 'description' => 'Masukkan nama server, uuid, atau alokasi untuk memulai pencarian.', + ], +]; diff --git a/lang/id/server/activity.php b/lang/id/server/activity.php new file mode 100644 index 0000000000..625ffcf66d --- /dev/null +++ b/lang/id/server/activity.php @@ -0,0 +1,11 @@ + 'Aktivitas', + 'event' => 'Acara', + 'user' => 'Pengguna', + 'deleted_user' => 'Pengguna Dihapus', + 'system' => 'Sistem', + 'timestamp' => 'Keterangan Waktu', + 'metadata' => 'Metadata', +]; diff --git a/lang/id/server/console.php b/lang/id/server/console.php new file mode 100644 index 0000000000..8f30270c5f --- /dev/null +++ b/lang/id/server/console.php @@ -0,0 +1,43 @@ + 'Konsol', + 'command' => 'Tipe perintah...', + 'command_blocked' => 'Server Tidak Aktif...', + 'command_blocked_title' => 'Tidak bisa mengirimkan perintah ketika server tidak aktif', + 'open_in_admin' => 'Buka dalam Admin', + 'power_actions' => [ + 'start' => 'Mulai', + 'stop' => 'Berhenti', + 'restart' => 'Ulangi', + 'kill' => 'Matikan', + 'kill_tooltip' => 'Ini dapat terjadi kerusakan dan/atau kehilangan data!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Memori', + 'network' => 'Jaringan', + 'disk' => 'Penyimpanan', + 'name' => 'Nama', + 'status' => 'Status', + 'address' => 'Alamat', + 'unavailable' => 'Tidak Tersedia', + ], + 'status' => [ + 'created' => 'Dibuat', + 'starting' => 'Memulai', + 'running' => 'Menjalankan', + 'restarting' => 'Memuat Ulang', + 'exited' => 'Keluar', + 'paused' => 'Dijeda', + 'dead' => 'Mati', + 'removing' => 'Menghapus', + 'stopping' => 'Menghentikan', + 'offline' => 'Luring', + 'missing' => 'Hilang', + ], + 'websocket_error' => [ + 'title' => 'Tidak bisa menghungkan ke soket web!', + 'body' => 'Periksa konsol pencarian Anda untuk detail lainnya.', + ], +]; diff --git a/lang/id/server/dashboard.php b/lang/id/server/dashboard.php new file mode 100644 index 0000000000..0653a2c89d --- /dev/null +++ b/lang/id/server/dashboard.php @@ -0,0 +1,28 @@ + 'Server', + 'list' => 'Daftar Server', + 'tabs' => [ + 'my' => 'Server Saya', + 'other' => 'Server Lainnya', + 'all' => 'Semua Server', + ], + 'empty_own' => 'Anda tidak memiliki server apapun!', + 'empty_other' => 'Anda tidak memiliki Akses ke server apapun!', + + 'status' => 'Status', + 'server' => 'Server', + 'resources' => 'Sumber Daya', + 'usage_limit' => 'Limit Penggunaan: :sumber daya', + + 'cpu' => 'CPU', + 'memory' => 'Memori', + 'disk' => 'Penyimpanan', + 'network' => 'Jaringan', + 'none' => 'Tidak ada', + 'loading' => 'Memuat...', + + 'power_actions' => 'Kekuatan Aksi', + 'power_action_sent' => ':aksi dikirim ke :nama', +]; diff --git a/lang/id/server/network.php b/lang/id/server/network.php new file mode 100644 index 0000000000..53d5228fde --- /dev/null +++ b/lang/id/server/network.php @@ -0,0 +1,17 @@ + 'Jaringan', + 'add' => 'Tambah Alokasi', + 'limit' => 'Batas Alokasi Tercapai', + 'address' => 'Alamat', + 'port' => 'Port', + 'notes' => 'Catatan', + 'no_notes' => 'Tidak Ada Catatan', + 'make_primary' => 'Jadikan Primer', + 'primary' => 'Primer', + 'make' => 'Buat', + 'delete' => 'Hapus', + 'locked' => 'Terkunci?', + 'locked_helper' => 'Alokasi yang dikunci hanya bisa dihapus oleh admin', +]; diff --git a/lang/id/server/users.php b/lang/id/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/id/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/id/strings.php b/lang/id/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/id/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/id/validation.php b/lang/id/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/id/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/it/activity.php b/lang/it/activity.php index 42a53ac0ca..966a71cc6c 100644 --- a/lang/it/activity.php +++ b/lang/it/activity.php @@ -8,30 +8,30 @@ */ return [ 'auth' => [ - 'fail' => 'Accesso non riuscito', + 'fail' => 'Log in fallito', 'success' => 'Accesso effettuato', 'password-reset' => 'Reimposta Password', - 'reset-password' => 'Richiedi reimpostazione della password', 'checkpoint' => 'Autenticazione a due fattori necessaria', 'recovery-token' => 'Token di recupero a due fattori utilizzato', 'token' => 'Verifica a due fattori risolta', - 'ip-blocked' => 'Richiesta bloccata dall\'indirizzo IP non elencato per :identifier', + 'ip-blocked' => 'Richiesta bloccata da un indirizzo IP non elencato per :identifier', 'sftp' => [ 'fail' => 'Accesso SFTP non riuscito', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Email modificata da :old a :new', + 'username-changed' => 'Cambiato il nome utente da :old a :new', + 'email-changed' => 'Email modificata da :old a :new', 'password-changed' => 'Password modificata', ], 'api-key' => [ - 'create' => 'Creata una nuova chiave API :identifier', - 'delete' => 'Chiave API eliminata :identifier', + 'create' => 'Creata una nuova chiave API :identifier', + 'delete' => 'Chiave API :identifier eliminata', ], 'ssh-key' => [ - 'create' => 'Chiave SSH :fingerprint aggiunta all\'account', - 'delete' => 'Chiave SSH :impronta rimossa dall\'account', + 'create' => 'Aggiunta la chiave SSH :impronta digitale all\'account', + 'delete' => 'Chiave SSH :fingerprint rimossa dall\'account', ], 'two-factor' => [ 'create' => 'Autenticazione a due fattori attivata', @@ -39,9 +39,8 @@ ], ], 'server' => [ - 'reinstall' => 'Server reinstallato', 'console' => [ - 'command' => 'Eseguito ":command" sul server', + 'command' => 'Eseguito ":command" sul server', ], 'power' => [ 'start' => 'Server avviato', @@ -50,81 +49,77 @@ 'kill' => 'Processo del server terminato', ], 'backup' => [ - 'download' => 'Backup :name scaricato', - 'delete' => 'Backup :name eliminato', - 'restore' => 'Ripristinato il backup :name (file eliminati: :truncate)', - 'restore-complete' => 'Ripristino completato del backup :name', - 'restore-failed' => 'Impossibile completare il ripristino del backup :name', - 'start' => 'Avviato un nuovo backup :name', - 'complete' => 'Contrassegnato il backup :name come completato', - 'fail' => 'Contrassegnato il backup :name come fallito', - 'lock' => 'Bloccato il backup :name', - 'unlock' => 'Sbloccato il backup :name', + 'download' => 'Scaricato il backup :name', + 'delete' => 'Eliminato il backup :name', + 'restore' => 'Ripristinato il backup :name (file rimossi: :truncate)', + 'restore-complete' => 'Ripristino completato del backup :name', + 'restore-failed' => 'Impossibile completare il ripristino del backup :name', + 'start' => 'Avviato un nuovo backup :name', + 'complete' => 'Contrassegnato il backup :name come completo', + 'fail' => 'Contrassegnato il backup :name come non riuscito', + 'lock' => 'Bloccato il backup :name', + 'unlock' => 'Sbloccato il backup :name', + 'rename' => 'Backup rinominato da ":old_name" a ":new_name"', ], 'database' => [ - 'create' => 'Creato un nuovo database :name', - 'rotate-password' => 'Password ruotata per il database :name', - 'delete' => 'Database eliminato :name', + 'create' => 'Creato il database :name', + 'rotate-password' => 'Password ruotata per il database :name', + 'delete' => 'Database :name eliminato', ], 'file' => [ - 'compress_one' => 'Compresso :directory:file', - 'compress_other' => 'File :count compressi in :directory', - 'read' => 'Visualizzato il contenuto di :file', - 'copy' => 'Creato una copia di :file', - 'create-directory' => 'Cartella creata :directory:name', - 'decompress' => 'Decompresso :files in :directory', - 'delete_one' => 'Eliminato :directory:files.0', - 'delete_other' => 'Eliminati :count file in :directory', - 'download' => 'Scaricato :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', + 'compress' => 'Compresso :directory:files|Compresso :count file in :directory', + 'read' => 'Visualizzato i contenuti di :file', + 'copy' => 'Creato una copia di :file', + 'create-directory' => 'Creata cartella :directory:name', + 'decompress' => 'Decompresso :file in :directory', + 'delete' => 'Eliminati :directory:files|Eliminati :count file in :directory', + 'download' => 'Scaricato :file', + 'pull' => 'Scaricato un file remoto da :url in :directory', + 'rename' => 'Mosso/ Rinominato :from a :to|Mosso/ Rinominato :count file in :directory', + 'write' => 'Scritto il nuovo contenuto in :file', + 'upload' => 'Iniziato il caricamento di un file', + 'uploaded' => 'Caricato :directory:file', ], 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', + 'denied' => 'Accesso SFTP bloccato a causa di permessi', + 'create' => 'Creato :files|Creati :count nuovi file', + 'write' => 'Modificato i contenuti di :files|Modificati i contenuti di :count file', + 'delete' => 'Cancellato :files|Cancellati :count file', + 'create-directory' => 'Creata la cartella :files|Create :count cartelle', + 'rename' => 'Rinominato :from a :to|Rinominato o spostato :count file', ], 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', + 'create' => 'Aggiunto :allocation al server', + 'notes' => 'Aggiornate le note per :allocation da ":old" a":new"', + 'primary' => 'Impostato :allocation come allocazione primaria del server', + 'delete' => 'Rimosso la :allocation allocazione', ], 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', + 'create' => 'Creato la :name pianificazione', + 'update' => 'Aggiornato il programma con nome::name', + 'execute' => 'Hai eseguito manualmente il programma :name', + 'delete' => 'Aggiornato il programma :name', ], 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', + 'create' => 'Creato una nuova task ":action" per il programma :name', + 'update' => 'Aggiornata la task ":action" per il programma :name', + 'delete' => 'Eliminata la task ":action" per la pianificazione :name', ], 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', + 'rename' => 'Rinominato il server da ":old" a ":new"', + 'description' => 'Cambiata la descrizione del server da ":old" a ":new"', + 'reinstall' => 'Server reinstallato', ], 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', + 'edit' => 'Cambiata la variabile :variable da ":old" a ":new"', + 'image' => 'Aggiornato l\'immagine Docker per il server da :old a :new', + 'command' => 'Aggiornato il comando di avvio per il server da :old a :new', ], 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', + 'create' => 'Aggiunto :email come sotto-utente', + 'update' => 'Aggiornato i permessi del sotto-utente con email::email', + 'delete' => 'Rimosso :email come sotto-utente', ], + 'crashed' => 'Server crashato', ], ]; diff --git a/lang/it/admin/apikey.php b/lang/it/admin/apikey.php new file mode 100644 index 0000000000..d7bda28c68 --- /dev/null +++ b/lang/it/admin/apikey.php @@ -0,0 +1,27 @@ + 'Chiavi API dell\'applicazione', + 'empty' => 'Nessuna chiave API', + 'whitelist' => 'Indirizzi IPv4 autorizzati', + 'whitelist_help' => 'Le chiavi API possono essere ristrette a specifici indirizzi IPv4. Inserisci ogni indirizzo su una nuova riga.', + 'whitelist_placeholder' => 'Esempio: 127.0.0.1 o 192.168.1.1', + 'description' => 'Descrizione', + 'description_help' => 'Una breve descrizione della funzione di questa chiave.', + 'nav_title' => 'Chiavi API', + 'model_label' => 'Chiavi API dell\'applicazione', + 'model_label_plural' => 'Chiavi API dell\'applicazione', + 'table' => [ + 'key' => 'Chiave', + 'description' => 'Descrizione', + 'last_used' => 'Ultimo utilizzo', + 'created' => 'Data di creazione', + 'created_by' => 'Creatore', + 'never_used' => 'Mai usata', + ], + 'permissions' => [ + 'none' => 'Nessuna', + 'read' => 'Lettura', + 'read_write' => 'Lettura e scrittura', + ], +]; diff --git a/lang/it/admin/dashboard.php b/lang/it/admin/dashboard.php new file mode 100644 index 0000000000..64fb930218 --- /dev/null +++ b/lang/it/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Benvenuto in Pelican!', + 'version' => 'Versione: :version', + 'advanced' => 'Avanzato', + 'server' => 'Server', + 'user' => 'Utente', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informazioni per gli sviluppatori', + 'content' => 'Grazie per aver provato la versione in sviluppo!', + 'extra_note' => 'Se incontri errori segnalali su GitHub, grazie.', + 'button_issues' => 'Crea ticket', + 'button_features' => 'Discuti funzionalità', + ], + 'intro-update-available' => [ + 'heading' => 'Aggiornamento disponibile', + 'content' => ':latestVersion è ora disponibile! Leggi la nostra documentazione per aggiornare il pannello.', + 'button_changelog' => 'Cosa c\'è di nuovo?', + ], + 'intro-no-update' => [ + 'heading' => 'Il pannello è aggiornato', + 'content' => 'Stai usando :version. Il pannello è aggiornato!', + ], + 'intro-first-node' => [ + 'heading' => 'Nessun nodo trovato', + 'content' => 'Sembra che tu non abbia ancora configurato alcun nodo, ma non preoccuparti e premi il relativo pulsante per creare il tuo primo nodo!', + 'extra_note' => 'Se incontri errori segnalali su GitHub, grazie.', + 'button_label' => 'Crea il primo nodo in Pelican', + ], + 'intro-support' => [ + 'heading' => 'Supporta Pelican', + 'content' => 'Grazie per aver installato Pelican, questo è stato possibile solo con il tuo sostegno e quello dei nostri collaboratori e del resto dei nostri sostenitori!', + 'extra_note' => 'Apprezziamo qualsiasi forma di supporto, da chiunque.', + 'button_translate' => 'Contribuisci alla traduzione', + 'button_donate' => 'Fai una donazione', + ], + 'intro-help' => [ + 'heading' => 'Serve aiuto?', + 'content' => 'Leggi prima la documentazione! Se poi serve ancora aiuto entra e chiedi nel nostro server Discord!', + 'button_docs' => 'Leggi la documentazione', + ], + ], +]; diff --git a/lang/it/admin/databasehost.php b/lang/it/admin/databasehost.php new file mode 100644 index 0000000000..1e9a4a49d6 --- /dev/null +++ b/lang/it/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Host Database', + 'model_label' => 'Host Database', + 'model_label_plural' => 'Host Database', + 'table' => [ + 'database' => 'Database', + 'name' => 'Nome', + 'host' => 'Host', + 'port' => 'Porta', + 'name_helper' => 'Lasciando questo vuoto, verrà generato automaticamente un nome casuale', + 'username' => 'Nome utente', + 'password' => 'Password', + 'remote' => 'Connessioni Da', + 'remote_helper' => 'Da dove dovrebbero essere consentite le connessioni. Lasciare vuoto per consentire connessioni da qualsiasi parte.', + 'max_connections' => 'Numero massimo di connessioni', + 'created_at' => 'Creato il', + 'connection_string' => 'Stringa Di Connessione JDBC', + ], + 'error' => 'Errore nella connessione all\'host', + 'host' => 'Host', + 'host_help' => 'L\'indirizzo IP o il nome di dominio che dovrebbe essere utilizzato quando si tenta di connettersi a questo host MySQL da questo Pannello per creare nuovi database.', + 'port' => 'Porta', + 'port_help' => 'La porta su cui è attivo MySQL per questo host.', + 'max_database' => 'Numero massimo di database', + 'max_databases_help' => 'Il numero massimo di database che possono essere creati su questo host. Se il limite è raggiunto, nessun nuovo database può essere creato su questo host. Lasciare vuoto per illimitato.', + 'display_name' => 'Nome visualizzato', + 'display_name_help' => 'L\'indirizzo IP o il nome di dominio che deve essere mostrato all\'utente finale.', + 'username' => 'Nome Utente', + 'username_help' => 'Il nome utente di un account che ha abbastanza permessi per creare nuovi utenti e database sul sistema.', + 'password' => 'Password', + 'password_help' => 'La password per l\'utente del database.', + 'linked_nodes' => 'Nodi Collegati', + 'linked_nodes_help' => 'Questa impostazione rende questo host di database il predefinito solo quando si aggiunge un database a un server sul Nodo selezionato.', + 'connection_error' => 'Errore nella connessione all\'host del database', + 'no_database_hosts' => 'Nessun Host Dei Database', + 'no_nodes' => 'Nessun Nodo', + 'delete_help' => 'Questo Database Host Contiene Database', + 'unlimited' => 'Illimitato', + 'anywhere' => 'Ovunque', + + 'rotate' => 'Ruotare', + 'rotate_password' => 'Rotazione della Password', + 'rotated' => 'Password Ruotata', + 'rotate_error' => 'Rotazione Della Password Non Riuscita', + 'databases' => 'Database', + + 'setup' => [ + 'preparations' => 'Preparativi', + 'database_setup' => 'Configurazione del database', + 'panel_setup' => 'Configurazione Del Pannello', + + 'note' => 'Attualmente, solo i database MySQL/MariaDB sono supportati per gli host del database!', + 'different_server' => 'Il pannello e il database non sono sullo stesso server?', + + 'database_user' => 'Utente del Database', + 'cli_login' => 'Usa mysql -u root -p per accedere alla riga di comando mysql.', + 'command_create_user' => 'Comando per creare l\'utente', + 'command_assign_permissions' => 'Comando per assegnare i permessi', + 'cli_exit' => 'Per uscire da mysql cli esegui uscita.', + 'external_access' => 'Accesso esterno', + 'allow_external_access' => ' +

È probabile che dovrai consentire l\'accesso esterno a questa istanza MySQL per consentire ai server di connettersi ad essa.

+
+

Per fare ciò, apri my.cnf, che varia in posizione a seconda del tuo sistema operativo e di come è stato installato MySQL. Puoi digitare find /etc -iname my.cnf per individuarlo.

+
+

Apri my.cnf, aggiungi il testo in fondo al file e salvalo:
+ [mysqld]
indirizzo-bind=0.0.0.0

+
+

Riavvia MySQL/MariaDB per applicare queste modifiche. Ciò sovrascriverà la configurazione MySQL predefinita, che per impostazione predefinita accetterà solo richieste da localhost. L\'aggiornamento consentirà le connessioni su tutte le interfacce e, quindi, le connessioni esterne. Assicurati di consentire la porta MySQL (predefinita 3306) nel tuo firewall.

', + ], +]; diff --git a/lang/it/admin/egg.php b/lang/it/admin/egg.php new file mode 100644 index 0000000000..cdb678885d --- /dev/null +++ b/lang/it/admin/egg.php @@ -0,0 +1,108 @@ + 'Uova', + 'model_label' => 'Uovo', + 'model_label_plural' => 'Uova', + 'tabs' => [ + 'configuration' => 'Configurazione', + 'process_management' => 'Gestione dei processi', + 'egg_variables' => 'Variabili dell\'uovo', + 'install_script' => 'Script d\'installazione', + ], + 'import' => [ + 'file' => 'File', + 'url' => 'URL', + 'image_url' => 'URL dell\'immagine', + 'image_error' => 'Impossibile recuperare l\'immagine', + 'image_too_large' => 'Immagine troppo grande. Il limite è di 1024KB', + 'egg_help' => 'Questo dovrebbe essere il file .json ( egg-minecraft.json )', + 'url_help' => 'Gli URL devono puntare direttamente al file .json', + 'add_url' => 'Nuovo URL', + 'import_failed' => 'Import fallito', + 'import_success' => 'Import riuscito', + 'github' => 'Aggiungi da Github', + 'refresh' => 'Aggiorna', + 'import_image' => 'Importa Immagine', + 'no_local_ip' => 'Gli indirizzi IP locali non sono ammessi', + 'unsupported_format' => 'Formato Non supportato. Formati Supportati: :formats', + 'invalid_url' => 'L\'URL fornito non è valido', + 'image_deleted' => 'Immagine Eliminata', + 'no_image' => 'Nessuna Immagine Fornita', + 'image_updated' => 'Immagine Aggiornata', + ], + 'export' => [ + 'modal' => 'Come vuoi esportare :egg ?', + 'as' => 'Come .:format', + ], + 'in_use' => 'In uso', + 'servers' => 'Server', + 'name' => 'Nome', + 'egg_uuid' => 'UUID uovo', + 'egg_id' => 'ID uovo', + 'name_help' => 'Un nome semplice e leggibile da usare come identificatore per quest\'uovo.', + 'author' => 'Autore', + 'uuid_help' => 'Si tratta dell\'identificatore univoco e globale di questo uovo, usato come identificatore da Wings.', + 'author_help' => 'L\'autore di questa versione dell\'uovo.', + 'author_help_edit' => 'L\'autore di questa versione dell\'uovo. L\'upload di una nuova configurazione con autore diverso modificherà questo dato.', + 'description' => 'Descrizione', + 'description_help' => 'Una descrizione di quest\'uovo che verrà visualizzata ovunque nel pannello a seconda delle necessità.', + 'add_startup' => 'Aggiungi un Comando di Avvio', + 'startup_command' => 'Comando', + 'startup_commands' => 'Comandi di avvio', + 'startup_name' => 'Nome visualizzato', + 'startup_help' => 'I comandi di avvio disponibili per i server che usano questo Egg. Il primo è quello predefinito.', + 'file_denylist' => 'Lista di file negati', + 'file_denylist_help' => 'Un elenco di file che l\'utente finale non è autorizzato a modificare.', + 'features' => 'Funzionalità', + 'force_ip' => 'Forza IP In uscita', + 'force_ip_help' => 'Forza tutto il traffico di rete in uscita ad avere il suo IP sorgente NATtato all\'IP di allocazione primaria del server. È necessario per alcuni giochi in modo che funzionino correttamente quando il Nodo ha più indirizzi IP pubblici. Abilitando questa opzione, verrà disabilitata la rete interna per tutti i server che utilizzano questo Egg, impedendo loro di accedere internamente ad altri server sullo stesso nodo.', + 'tags' => 'Tag', + 'update_url' => 'Aggiorna URL', + 'update_url_help' => 'Gli URL devono puntare direttamente al file .json', + 'add_image' => 'Aggiungi immagine Docker', + 'docker_images' => 'Immagini Docker', + 'docker_name' => 'Nome dell\'immagine', + 'docker_uri' => 'URI dell\'immagine', + 'docker_help' => 'Le immagini docker disponibili per i server che usano questo Egg. La prima è quella predefinita.', + + 'stop_command' => 'Comando di arresto', + 'stop_command_help' => 'Il comando che dovrebbe essere inviato ai server per fermarli in modo sicuro. Se hai bisogno di inviare un SIGINT inserisci ^C qui.', + 'copy_from' => 'Copia impostazioni da', + 'copy_from_help' => 'Se vuoi usare le impostazioni da un altro uovo come quelle di default, selezionalo dal menu qui sopra.', + 'none' => 'Nessuno', + 'start_config' => 'Configurazione d\'avvio', + 'start_config_help' => 'Elenco di valori che il daemon va a cercarsi quando avvia un server per valutarne il completamento.', + 'config_files' => 'File di configurazione', + 'config_files_help' => 'Questa deve essere una rappresentazione JSON dei file di configurazione da modificare e di quali parti di tali file devono essere modificate.', + 'log_config' => 'Configurazione dei log', + 'log_config_help' => 'Questa deve essere una rappresentazione JSON di dove sono memorizzati i file di log, e se il daemon debba o meno creare log custom.', + + 'environment_variable' => 'Variabile d\'ambiente', + 'default_value' => 'Valore predefinito', + 'user_permissions' => 'Permessi degli utenti', + 'viewable' => 'Visualizzabile', + 'editable' => 'Modificabile', + 'rules' => 'Regole', + 'add_new_variable' => 'Aggiungi una nuova variabile', + + 'error_unique' => 'Esiste già una variabile con questo nome.', + 'error_required' => 'Il campo per la variabile d\'ambiente è obbligatorio.', + 'error_reserved' => 'Questa variabile d\'ambiente è riservata e non può essere utilizzata.', + + 'script_from' => 'Script Da', + 'script_container' => 'Container Dello Script', + 'script_entry' => 'Punto di ingresso dello script', + 'script_install' => 'Script d\'installazione', + 'no_eggs' => 'Nessun uovo', + 'no_servers' => 'Nessun server', + 'no_servers_help' => 'Nessun server è assegnato a quest\'uovo.', + + 'update' => 'Aggiorna|Aggiorna selezionati', + 'updated' => 'Egg aggiornato|:count/:total Egg aggiornati', + 'updated_failed' => ':count non riusciti', + 'updated_skipped' => ':count saltati', + 'update_question' => 'Sei sicuro che vuoi aggiornare questo Egg?|Sei sicuro che vuoi aggiornare gli Egg selezionati?', + 'update_description' => 'Se hai fatto delle modifiche all\'Egg saranno sovrascritte!|Se hai fatto delle modifiche agli Egg saranno sovrascritte!', + 'no_updates' => 'Nessun aggiornamento disponibile per gli Egg selezionati', +]; diff --git a/lang/it/admin/eggs.php b/lang/it/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/it/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/it/admin/health.php b/lang/it/admin/health.php new file mode 100644 index 0000000000..0671c70f89 --- /dev/null +++ b/lang/it/admin/health.php @@ -0,0 +1,60 @@ + 'Salute', + 'results_refreshed' => 'Risultato dei controlli di salute aggiornati', + 'checked' => 'Risultati verificati :time', + 'refresh' => 'Aggiorna', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Impossibile impostare o recuperare un valore di cache dell\'applicazione.', + 'failed' => 'Si è verificata un\'eccezione con la cache dell\'applicazione: :error', + ], + 'database' => [ + 'label' => 'Database', + 'ok' => 'Ok', + 'failed' => 'Impossibile connettersi al database: :error', + ], + 'debugmode' => [ + 'label' => 'Modalità di Debug', + 'ok' => 'La modalità debug è disabilitata', + 'failed' => 'La modalità debug era prevista :expected, ma in realtà era :actual', + ], + 'environment' => [ + 'label' => 'Ambiente', + 'ok' => 'Ok, impostato a :actual', + 'failed' => 'L\'ambiente è impostato su :actual, atteso :expected', + ], + 'nodeversions' => [ + 'label' => 'Versione Nodo', + 'ok' => 'I Nodi sono aggiornati', + 'failed' => ':outdated/:all Nodi sono obsoleti', + 'no_nodes_created' => 'Nessun Nodo creato', + 'no_nodes' => 'Nessun Nodo', + 'all_up_to_date' => 'Tutti aggiornati', + 'outdated' => ':outdated/:all obsoleti', + ], + 'panelversion' => [ + 'label' => 'Versione Pannello', + 'ok' => 'Il pannello è aggiornato', + 'failed' => 'La versione installata è :currentVersion ma l\'ultima è :latestVersion', + 'up_to_date' => 'Aggiornato', + 'outdated' => 'Obsoleto', + ], + 'schedule' => [ + 'label' => 'Pianificazioni', + 'ok' => 'Ok', + 'failed_last_ran' => 'L\'ultima esecuzione delle pianificazioni è stata più di :time minuti fa', + 'failed_not_ran' => 'Le pianificazioni non sono ancora state eseguite.', + ], + 'useddiskspace' => [ + 'label' => 'Spazio sul Disco', + ], + ], + 'checks' => [ + 'successful' => 'Riusciti', + 'failed' => 'Falliti :checks', + ], +]; diff --git a/lang/it/admin/mount.php b/lang/it/admin/mount.php new file mode 100644 index 0000000000..79bef3145a --- /dev/null +++ b/lang/it/admin/mount.php @@ -0,0 +1,30 @@ + 'Mount', + 'model_label' => 'Mount', + 'model_label_plural' => 'Mount', + 'name' => 'Nome', + 'name_help' => 'Nome univoco usato per identificare questo mount da un altro.', + 'source' => 'Origine', + 'source_help' => 'Percorso del file nel sistema host da montare ad un container.', + 'target' => 'Destinazione', + 'target_help' => 'Dove il mount sarà accessibile all\'interno di un container.', + 'read_only' => 'Sola Lettura?', + 'read_only_help' => 'Il mount è da impostare come sola lettura all\'interno del container?', + 'description' => 'Descrizione', + 'description_help' => 'Una descrizione più lunga per questo mount', + 'no_mounts' => 'Nessun Mount', + 'eggs' => 'Eggs', + 'nodes' => 'Nodes', + 'toggles' => [ + 'writable' => 'Scrivibile', + 'read_only' => 'Sola Lettura', + ], + 'table' => [ + 'name' => 'Nome', + 'all_eggs' => 'Tutti gli Egg', + 'all_nodes' => 'Tutti i Nodi', + 'read_only' => 'Sola Lettura', + ], +]; diff --git a/lang/it/admin/node.php b/lang/it/admin/node.php index fde28a25b3..a6db7a67fc 100644 --- a/lang/it/admin/node.php +++ b/lang/it/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', + 'nav_title' => 'Nodi', + 'model_label' => 'Nodo', + 'model_label_plural' => 'Nodi', + 'create' => 'Crea Nodo', + 'tabs' => [ + 'overview' => 'Panoramica', + 'basic_settings' => 'Impostazioni di Base', + 'advanced_settings' => 'Impostazioni Avanzate', + 'config_file' => 'File di Configurazione', + 'diagnostics' => 'Diagnostica', ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', + 'table' => [ + 'health' => 'Salute', + 'name' => 'Nome', + 'address' => 'Indirizzo', + 'public' => 'Pubblico', + 'servers' => 'Server', + 'alias' => 'Pseudonimo', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => 'Proprietario', + 'allocation_notes' => 'Note', + 'no_notes' => 'Nessuna nota', ], + 'node_info' => 'Informazioni sul Nodo', + 'wings_version' => 'Versione di Wings', + 'cpu_threads' => 'Thread CPU', + 'architecture' => 'Architettura', + 'kernel' => 'Kernel', + 'unknown' => 'Unknown', + 'latest' => '(Ultima: :version)', + 'node_uuid' => 'UUID del Nodo', + 'node_id' => 'ID del nodo', + + 'ip_address' => 'Indirizzo IP', + 'ip_help' => 'Di solito l\'IP pubblico della tua macchina a meno che tu non stia usando il port forwarding.', + 'alias_help' => 'Nome visualizzato opzionale per facilitare l\'identificazione.', + 'refresh' => 'Aggiorna', + 'domain' => 'Nome dominio', + 'ssl_ip' => 'Non è possibile connettersi a un indirizzo IP tramite SSL', + 'error' => 'Questo è il nome di dominio che punta all\'indirizzo IP del tuo nodo. Se lo hai già impostato, puoi verificarlo controllando il campo successivo!', + 'fqdn_help' => 'Il tuo pannello è attualmente protetto tramite un certificato SSL e ciò significa che anche i tuoi nodi ne richiedono uno. È necessario utilizzare un nome di dominio, perché non è possibile ottenere i certificati SSL per gli indirizzi IP.', + 'dns' => 'Controllo del Record DNS', + 'dns_help' => 'Questo ti permette di sapere se il tuo record DNS punta all\'indirizzo IP corretto.', + 'valid' => 'Valido', + 'invalid' => 'Invalido', + 'port' => 'Porta', + 'ports' => 'Porte', + 'port_help' => 'Se stai eseguendo il daemon dietro Cloudflare dovresti impostare la porta del daemon a 8443 per consentire il proxy del websocket su SSL.', + 'connect_port' => 'Porta di Connessione', + 'connect_port_help' => 'Le connessioni a Wings useranno questa porta. Se stai usando un proxy inverso, questo può differire dalla porta di ascolto. Quando si utilizza il proxy Cloudflare bisogna usare 8443.', + 'listen_port' => 'Porta di Ascolto', + 'listen_port_help' => 'Wings ascolterà su questa porta.', + 'display_name' => 'Nome visualizzato', + 'ssl' => 'Comunicazione su SSL', + 'panel_on_ssl' => 'Il tuo pannello sta usando una connessione SSL sicura,
quindi anche il daemon deve farlo.', + 'ssl_help' => 'Un indirizzo IP non può usare SSL.', + + 'tags' => 'Tag', + 'upload_limit' => 'Limite Di Caricamento', + 'upload_limit_help' => 'Inserisci la dimensione massima dei file che possono essere caricati attraverso il file manager basato sul web.', + 'sftp_port' => 'Porta SFTP', + 'sftp_alias' => 'Alias per l\'SFTP', + 'sftp_alias_help' => 'L\'alias mostrato per la connessione al servizio SFTP. Lascialo vuoto per usare il FQDN del Nodo.', + 'use_for_deploy' => 'Usare per le installazioni?', + 'maintenance_mode' => 'Modalità manutenzione', + 'maintenance_mode_help' => 'Se il nodo è contrassegnato come \'In manutenzione\' gli utenti non saranno in grado di accedere ai server che si trovano su questo nodo.', + + 'cpu' => 'CPU', + 'cpu_limit' => 'Limite Della Cpu', + 'memory' => 'Memoria', + 'memory_limit' => 'Limite di memoria', + 'disk' => 'Disco', + 'disk_limit' => 'Limite del Disco', + 'unlimited' => 'Illimitata', + 'limited' => 'Limitata', + 'overallocate' => 'Sovrallocazione', + 'enabled' => 'Abilitato', + 'disabled' => 'Disabilitato', + 'yes' => 'Si', + 'no' => 'No', + + 'instructions' => 'Istruzioni', + 'instructions_help' => 'Salva questo file nella directory radice del daemon, chiamato config.yml', + + 'auto_deploy' => 'Comando di Attivazione Automatica', + 'auto_question' => 'Scegli tra l\'installazione Standalone e Docker.', + 'auto_label' => 'Tipo', + 'standalone' => 'Standalone', + 'docker' => 'Docker', + 'auto_command' => 'Per configurare automaticamente il nodo eseguire il seguente comando:', + 'reset_token' => 'Reimposta Token Di Autorizzazione', + 'token_reset' => 'Il token del daemon è stato resettato.', + 'reset_help' => 'Il ripristino del token del daemon annullerà qualsiasi richiesta proveniente dal vecchio token. Questo token è usato per tutte le operazioni sensibili sul daemon, inclusa la creazione e l\'eliminazione del server. Ti consigliamo di modificare questo token regolarmente per la sicurezza.', + + 'no_nodes' => 'Nessun Nodo', + 'none' => 'Nessuno', + 'cpu_chart' => 'CPU - :cpu% di :max%', + 'memory_chart' => 'Memoria - :used of :total', + 'disk_chart' => 'Disco - :used di :total', + 'used' => 'Utilizzato', + 'unused' => 'Inutilizzato', + + 'next_step' => 'Passo Successivo', + 'node_has_servers' => 'Il Nodo Ha Server', + 'create_allocation' => 'Crea Allocazione', + 'primary_allocation' => 'Allocazione Primaria', + 'databases' => 'Database', + 'backups' => 'Backup', + + 'error_connecting' => 'Errore nella connessione a :node', + 'error_connecting_description' => 'La configurazione non può essere aggiornata automaticamente su Wings, è necessario aggiornare manualmente il file di configurazione.', + 'allocation' => 'Allocazione', + + 'diagnostics' => [ + 'header' => 'Diagnostica Del Nodo', + 'include_endpoints' => 'Includi Endpoint', + 'include_endpoints_hint' => 'Includere gli endpoint mostrerà i link del pannello nei log e NON li oscurerà.', + 'include_logs' => 'Includi i log', + 'include_logs_hint' => 'Includendo i log verranno mostrati quelli recenti, aiutando a individuare eventuali problemi.', + 'run_diagnostics' => 'Esegui la diagnostica', + 'upload_to_pelican' => 'Carica Logs', + 'logs_pulled' => 'Log Scaricati!', + 'logs_uploaded' => 'Log Caricati', + 'upload_failed' => 'Caricamento dei Log Non Riuscito', + 'view_logs' => 'Visualizza i log', + 'pull' => 'Preleva', + 'upload' => 'Carica', + 'clear' => 'Pulisci', + '404' => 'Il rapporto diagnostico richiesto non è stato trovato. Assicurati che Wings sia aggiornato e riprova.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Problema con Cloudflare', + 'body' => 'Il tuo Nodo non è accessibile da Cloudflare', + ], + + 'bulk_update_ip' => 'Aggiorna IP', + 'bulk_update_ip_description' => 'Sostituisci un vecchio indirizzo IP con uno nuovo per le allocazioni. Ciò è utile quando l\'indirizzo IP di un nodo cambia', + 'update_ip' => 'Aggiorna IP', + 'old_ip' => 'Vecchio Indirizzo IP', + 'new_ip' => 'Nuovo Indirizzo IP', + 'no_allocations_to_update' => 'Nessuna allocazione con il vecchio indirizzo IP selezionato è stata trovata', + 'ip_updated' => 'Aggiornate con successo :count di :total allocazioni', + 'ip_update_failed' => ':count allocazioni non riuscite ad aggiornare', ]; diff --git a/lang/it/admin/role.php b/lang/it/admin/role.php new file mode 100644 index 0000000000..f1264194e3 --- /dev/null +++ b/lang/it/admin/role.php @@ -0,0 +1,17 @@ + 'Ruoli', + 'model_label' => 'Ruolo', + 'model_label_plural' => 'Ruoli', + 'no_roles' => 'Nessun ruolo', + 'name' => 'Nome del ruolo', + 'permissions' => 'Permessi', + 'in_use' => 'In uso', + 'all' => 'Tutti', + 'root_admin' => 'Il :role ha tutti i permessi.', + 'root_admin_delete' => 'Impossibile eliminare Root Admin', + 'users' => 'Utenti', + 'nodes' => 'Nodi', + 'nodes_hint' => 'Lasciare vuoto per consentire l\'accesso a tutti i nodi.', +]; diff --git a/lang/it/admin/server.php b/lang/it/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/it/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/it/admin/user.php b/lang/it/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/it/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/it/auth.php b/lang/it/auth.php index 7e759f91ae..7951e475d8 100644 --- a/lang/it/auth.php +++ b/lang/it/auth.php @@ -1,27 +1,24 @@ 'Login', - 'go_to_login' => 'Vai all\'accesso', - 'failed' => 'Non è stato trovato alcun account corrispondente a queste credenziali.', - 'forgot_password' => [ - 'label' => 'Password Dimenticata?', - 'label_help' => 'Inserisci l\'indirizzo email del tuo account per ricevere le istruzioni per reimpostare la password.', - 'button' => 'Recupera Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reimposta e Accedi', - ], + 'failed' => 'Credenziali non valide.', + 'failed-two-factor' => 'Codice 2FA non valido', + 'two-factor-code' => 'Codice di verifica a due fattori', + 'two-factor-hint' => 'Puoi usare i codici di backup se hai perso l\'accesso al tuo dispositivo.', + 'password' => 'La password inserita non è corretta.', + 'throttle' => 'Troppi tentativi di accesso. Per favore riprova tra :seconds secondi.', + '2fa_must_be_enabled' => 'L\'amministratore ha richiesto che l\'autenticazione a due fattori sia abilitata per poter utilizzare il Pannello.', - 'two_factor' => [ - 'label' => 'Token a due fattori', - 'label_help' => 'Questo account richiede un secondo livello di autenticazione per continuare. Inserisci il codice generato dal tuo dispositivo per completare il login.', - 'checkpoint_failed' => 'Il token di autenticazione a due fattori non è valido.', - ], - - 'throttle' => 'Troppi tentativi di accesso. Riprova tra :seconds secondi.', - 'password_requirements' => 'La password deve essere di almeno 8 caratteri e deve essere unica per questo sito.', - '2fa_must_be_enabled' => 'L\'amministratore ha richiesto che l\'autenticazione a due fattori sia abilitata per il tuo account per poter utilizzare il pannello.', ]; diff --git a/lang/it/command/messages.php b/lang/it/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/it/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/it/commands.php b/lang/it/commands.php new file mode 100644 index 0000000000..ffe675df3b --- /dev/null +++ b/lang/it/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Fornisci l\'indirizzo email da cui dovrebbero provenire le eggs esportate da questo pannello. Deve essere un indirizzo email valido.', + 'url' => 'L\'URL dell\'applicazione DEVE iniziare con https:// o http:// a seconda se si utilizza SSL o meno. Se non includi lo schema, le tue email e altri contenuti si collegheranno alla posizione sbagliata.', + 'timezone' => 'Il fuso orario dovrebbe corrispondere a uno dei fusi orari supportati da PHP. Se non sei sicuro, fai riferimento a https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Hai selezionato il driver Redis per una o più opzioni, fornisci le informazioni di connessione valide qui sotto. Nella maggior parte dei casi puoi usare i valori predefiniti forniti a meno che tu non abbia modificato la tua configurazione.', + 'comment' => 'Per impostazione predefinita, l\'istanza Redis ha come nome utente "default" e nessuna password, perché è eseguito localmente e non è accessibile dall\'esterno. Se questo è il caso, basta premere invio senza inserire un valore.', + 'confirm' => 'Sembra che :field sia già stato definito per Redis, vorresti cambiarlo?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Si consiglia vivamente di non utilizzare "localhost" come host del database. Abbiamo visto frequenti problemi di connessione del socket . Se si desidera utilizzare una connessione locale si dovrebbe usare "127.0.0.1".', + 'DB_USERNAME_note' => "L'utilizzo dell'account root per le connessioni MySQL non solo è altamente disapprovato, ma non è nemmeno consentito da questa applicazione. Dovrai aver creato un utente MySQL per questo software.", + 'DB_PASSWORD_note' => 'Sembra che tu abbia già una password di connessione MySQL definita, vuoi cambiarla?', + 'DB_error_2' => 'Le tue credenziali di connessione NON sono state salvate. Prima di procedere, dovrai fornire informazioni di connessione valide.', + 'go_back' => 'Torna indietro e riprova', + ], + 'make_node' => [ + 'name' => 'Inserisci un breve identificatore usato per distinguere questo nodo dagli altri', + 'description' => 'Inserisci una descrizione per identificare il nodo', + 'scheme' => 'Inserisci https per SSL o http per una connessione non ssl', + 'fqdn' => 'Inserisci un nome di dominio (es. node.example.com) da usare per connettersi al daemon. Un indirizzo IP può essere utilizzato solo se non si utilizza SSL per questo nodo', + 'public' => 'Questo nodo dovrebbe essere pubblico? Come nota, impostando un nodo in privato negherai la possibilità di auto generazione di questo nodo.', + 'behind_proxy' => 'Il tuo FQDN è dietro un proxy?', + 'maintenance_mode' => 'La modalità di manutenzione deve essere attivata?', + 'memory' => 'Inserisci la quantità massima di memoria', + 'memory_overallocate' => 'Inserisci la quantità di memoria da allocare, -1 disabiliterà il controllo e 0 impedirà la creazione di nuovi server', + 'disk' => 'Inserisci la quantità massima di spazio su disco', + 'disk_overallocate' => 'Inserisci la quantità di disco da sovrallocare. -1 disabiliterà il controllo e 0 bloccherà la creazione di nuovi server', + 'cpu' => 'Inserisci la quantità massima di cpu', + 'cpu_overallocate' => 'Inserisci il quantitativo di cpu da sovrallocare, -1 disabiliterà il controllo e 0 bloccherà la creazione di nuovi server', + 'upload_size' => "'Inserisci la dimensione massima del file", + 'daemonListen' => 'Inserisci la porta di ascolto del daemon', + 'daemonConnect' => 'Inserisci la porta di connessione del daemon (può essere la stessa della porta di ascolto)', + 'daemonSFTP' => 'Inserisci la porta di ascolto SFTP del demone', + 'daemonSFTPAlias' => 'Inserisci l\'alias SFTP del daemon (può essere vuoto)', + 'daemonBase' => 'Inserisci la cartella di base', + 'success' => 'Creato con successo un nuovo nodo con il nome :name che ha id :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Il nodo selezionato non esiste.', + 'error_invalid_format' => 'Formato specificato non valido. Le opzioni valide sono yaml e json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Sembra che tu abbia già configurato una chiave di cifratura dell\'applicazione. Continuando con questo processo, sovrascriverai quella chiave causando la corruzione dei dati per qualsiasi dato crittografato esistente. NON CONTINUARE SE NON SAI COSA STAI FACENDO.', + 'understand' => 'Comprendo le conseguenze dell\'esecuzione di questo comando e accetto ogni responsabilità per la perdita di dati crittografati.', + 'continue' => 'Sei sicuro di voler continuare? Cambiare la chiave di crittografia dell\'applicazione COMPORTERA\' LA PERDITA DEI DATI', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Non ci sono attività pianificate per i server che devono essere eseguite.', + 'error_message' => 'Si è verificato un errore durante l\'elaborazione dello Schedule: ', + ], + ], +]; diff --git a/lang/it/dashboard/account.php b/lang/it/dashboard/account.php deleted file mode 100644 index 78eadb53e4..0000000000 --- a/lang/it/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Aggiorna la tua email', - 'updated' => 'Il tuo indirizzo email e stato aggiornato.', - ], - 'password' => [ - 'title' => 'Cambia la tua password', - 'requirements' => 'La tua nuova password deve essere lunga almeno 8 caratteri.', - 'updated' => 'La password è stata aggiornata.', - ], - 'two_factor' => [ - 'button' => 'Configura l\'autenticazione a due fattori', - 'disabled' => 'L\'autenticazione a due fattori è stata disabilitata sul tuo account. Non ti sarà più richiesto di fornire un token durante l\'accesso.', - 'enabled' => 'L\'autenticazione a due fattori è stata abilitata sul tuo account! D\'ora in poi, quando accedi, ti sarà richiesto di fornire il codice generato dal tuo dispositivo.', - 'invalid' => 'Il token fornito non è valido.', - 'setup' => [ - 'title' => 'Imposta l\'autenticazione a due fattori', - 'help' => 'Non puoi scansionare il codice? Inserisci il codice qui sotto nella tua applicazione:', - 'field' => 'Inserisci il token', - ], - 'disable' => [ - 'title' => 'Disabilita l\'autenticazione a due fattori', - 'field' => 'Inserisci il token', - ], - ], -]; diff --git a/lang/it/dashboard/index.php b/lang/it/dashboard/index.php deleted file mode 100644 index 6262c6d000..0000000000 --- a/lang/it/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Ricerca server...', - 'no_matches' => 'Non sono stati trovati server che corrispondono ai criteri di ricerca forniti.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memoria RAM', -]; diff --git a/lang/it/exceptions.php b/lang/it/exceptions.php index 3977c87c24..2d5cb12041 100644 --- a/lang/it/exceptions.php +++ b/lang/it/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'C\'è stata un\'eccezione durante il tentativo di comunicare con il daemon risultante in un codice di risposta HTTP/:code. Questa eccezione è stata registrata.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'Un nodo non deve avere server collegati ad esso per essere eliminato.', + 'error_connecting' => 'Errore nella connessione a :node', + 'daemon_off_config_updated' => 'La configurazione del demone è stata aggiornata, tuttavia si è verificato un errore durante il tentativo di aggiornare automaticamente il file di configurazione sul demone. Per applicare queste modifiche è necessario aggiornare manualmente il file di configurazione (config.yml).', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'Un server è attualmente assegnato a questa allocazione. Un\'allocazione può essere cancellata solo se nessun server è attualmente assegnato.', + 'too_many_ports' => 'Non è supportato aggiungere più di 1000 porte in un unico intervallo.', + 'invalid_mapping' => 'La mappatura fornita per :port non è valida e non può essere elaborata.', + 'cidr_out_of_range' => 'La notazione CIDR consente solo masks tra /25 e /32.', + 'port_out_of_range' => 'Le porte in un\'allocazione deve essere maggiori o uguali a 1024 e minori o uguali a 65535', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Un uovo con server attivi ad esso collegati non può essere eliminato dal pannello.', + 'invalid_copy_id' => 'L\'uovo selezionato per copiare uno script da entrambi non esiste o sta copiando uno script stesso.', + 'has_children' => 'Questo Uovo è genitore di una o più uova. Si prega di eliminare queste Uova prima di eliminare questo Uovo.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'La variabile d\' ambiente :name deve essere univoca per questo Uovo.', + 'reserved_name' => 'La variabile d\'ambiente :name è protetta e non può essere assegnata ad una variabile.', + 'bad_validation_rule' => 'La regola di validazione ":rule" non è una regola valida per questa applicazione.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'Si è verificato un errore durante il tentativo di analizzare il file JSON: :error.', + 'file_error' => 'Il file JSON fornito non è valido.', + 'invalid_json_provided' => 'Il file JSON fornito non è in un formato riconosciibile.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Modificare il proprio account subuser non è consentito.', + 'user_is_owner' => 'Non puoi aggiungere il proprietario del server come un sub-utente per questo server.', + 'subuser_exists' => 'Un utente con quell\'indirizzo email è già assegnato come un sub-utente per questo server.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Impossibile eliminare un server host del database che ha dei database attivi collegati ad esso.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Il tempo massimo di intervallo per un\'attività catenata è di 15 minuti.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Impossibile eliminare una posizione che ha nodi attivi ad essa collegati.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Non è possibile eliminare il proprio account.', + 'has_servers' => 'Impossibile eliminare un utente con server attivi collegati al proprio account. Si prega di eliminare i loro server prima di continuare.', + 'node_revocation_failed' => 'Impossibile revocare le chiavi sul nodo #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Non sono stati trovati nodi che soddisfano i requisiti specificati per la distribuzione automatica.', + 'no_viable_allocations' => 'Nessuna allocazione trovata soddisfa i requisiti per abilitare il deployment automatico su questo nodo.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => 'La risorsa richiesta non esiste su questo server.', + ], + 'mount' => [ + 'servers_attached' => 'Un mount non deve avere server collegati ad esso per essere eliminato.', + ], + 'server' => [ + 'marked_as_failed' => 'Questo server non ha ancora completato il processo di installazione, riprova più tardi.', ], ]; diff --git a/lang/it/pagination.php b/lang/it/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/it/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/it/passwords.php b/lang/it/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/it/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/it/profile.php b/lang/it/profile.php new file mode 100644 index 0000000000..e4870d8799 --- /dev/null +++ b/lang/it/profile.php @@ -0,0 +1,70 @@ + 'Profilo', + 'tabs' => [ + 'account' => 'Account', + 'oauth' => 'OAuth', + 'activity' => 'Attività', + 'api_keys' => 'Chiavi API', + 'ssh_keys' => 'Chiavi SSH', + 'keys' => 'Chiavi', + '2fa' => '2FA', + 'customization' => 'Personalizzazione', + ], + 'username' => 'Nome Utente', + 'admin' => 'Amministratore', + 'exit_admin' => 'Esci dal pannello', + 'server_list' => 'Lista server', + 'email' => 'Email', + 'password' => 'Password', + 'current_password' => 'Password Attuale', + 'password_confirmation' => 'Conferma Password', + 'timezone' => 'Fuso orario', + 'language' => 'Lingua', + 'language_help' => 'La tua lingua :state non è ancora stata tradotta!', + 'link' => 'Collega ', + 'unlink' => 'Scollega ', + 'unlinked' => ':name scollegato', + 'scan_qr' => 'Scansiona il Codice QR', + 'code' => 'Codice', + 'setup_key' => 'Chiave Di Setup: :secret', + 'invalid_code' => 'Codice 2FA non valido', + 'code_help' => 'Scansiona il codice QR qui sopra usando la tua app di autenticazione in due passaggi, quindi inserisci il codice generato.', + '2fa_enabled' => 'L\'autenticazione a due fattori è attualmente abilitata!', + 'backup_help' => 'Questi non verranno mostrati di nuovo!', + 'backup_codes' => 'Codici di Backup', + 'disable_2fa' => 'Disattiva 2FA', + 'disable_2fa_help' => 'Inserisci il tuo codice 2FA attuale per disabilitare l\'autenticazione a due fattori', + 'api_keys' => 'Chiavi API', + 'create_api_key' => 'Crea chiave API', + 'api_key_created' => 'Chiave API creata', + 'description' => 'Descrizione', + 'allowed_ips' => 'IP consentiti', + 'allowed_ips_help' => 'Premi Invio per aggiungere un nuovo indirizzo IP o lascia vuoto per consentire qualsiasi indirizzo IP', + 'ssh_keys' => 'Chiavi SSH', + 'create_ssh_key' => 'Crea chiave SSH', + 'ssh_key_created' => 'Chiave SSH creata', + 'name' => 'Nome', + 'public_key' => 'Chiave pubblica', + 'could_not_create_ssh_key' => 'Impossibile creare la chiave ssh', + 'dashboard' => 'Dashboard', + 'dashboard_layout' => 'Layout della Dashboard', + 'console' => 'Console', + 'grid' => 'Griglia', + 'table' => 'Tabella', + 'rows' => 'Righe', + 'font_size' => 'Grandezza carattere', + 'font' => 'Carattere', + 'font_preview' => 'Anteprima carattere', + 'seconds' => 'Secondi', + 'graph_period' => 'Periodo Del Grafico', + 'graph_period_helper' => 'La quantità di punti dati, secondi, mostrati sui grafici della console.', + 'navigation' => 'Tipo di Navigazione', + 'sidebar' => 'Barra laterale', + 'topbar' => 'Barra superiore', + 'mixed' => 'Mista', + 'no_oauth' => 'Nessun Account Collegato', + 'no_api_keys' => 'Nessuna chiave API.', + 'no_ssh_keys' => 'Nessuna chiave SSH.', +]; diff --git a/lang/it/search.php b/lang/it/search.php new file mode 100644 index 0000000000..0f1094d51b --- /dev/null +++ b/lang/it/search.php @@ -0,0 +1,9 @@ + 'Inserisci almeno tre caratteri per iniziare la ricerca.', + 'term' => [ + 'label' => 'Termine di ricerca', + 'description' => 'Inserisci un nome del server, un uuid o un\'allocazione per iniziare la ricerca.', + ], +]; diff --git a/lang/it/server/console.php b/lang/it/server/console.php new file mode 100644 index 0000000000..bc5d9fbe46 --- /dev/null +++ b/lang/it/server/console.php @@ -0,0 +1,43 @@ + 'Console', + 'command' => 'Digita un comando...', + 'command_blocked' => 'Server Offline...', + 'command_blocked_title' => 'Impossibile inviare il comando quando il server è offline', + 'open_in_admin' => 'Apri come admin', + 'power_actions' => [ + 'start' => 'Avvia', + 'stop' => 'Arresta', + 'restart' => 'Riavvia', + 'kill' => 'Termina', + 'kill_tooltip' => 'Questo può causare la corruzione dei dati e/o la perdita di dati!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Memoria', + 'network' => 'Rete', + 'disk' => 'Disco', + 'name' => 'Nome', + 'status' => 'Stato', + 'address' => 'Indirizzo', + 'unavailable' => 'Non disponibile', + ], + 'status' => [ + 'created' => 'Creato', + 'starting' => 'In Avvio', + 'running' => 'In esecuzione', + 'restarting' => 'Riavvio in corso', + 'exited' => 'Fermato', + 'paused' => 'In pausa', + 'dead' => 'Terminato', + 'removing' => 'Rimozione in corso', + 'stopping' => 'In arresto', + 'offline' => 'Offline', + 'missing' => 'Mancante', + ], + 'websocket_error' => [ + 'title' => 'Impossibile connettersi al websocket!', + 'body' => 'Controlla la console del browser per maggiori dettagli.', + ], +]; diff --git a/lang/it/server/dashboard.php b/lang/it/server/dashboard.php new file mode 100644 index 0000000000..26df1dc694 --- /dev/null +++ b/lang/it/server/dashboard.php @@ -0,0 +1,28 @@ + 'Server', + 'list' => 'Lista server', + 'tabs' => [ + 'my' => 'I Miei Server', + 'other' => 'Server degli Altri', + 'all' => 'Tutti i Server', + ], + 'empty_own' => 'Non possiedi nessun server!', + 'empty_other' => 'Non hai accesso a nessun server!', + + 'status' => 'Stato', + 'server' => 'Server', + 'resources' => 'Risorse', + 'usage_limit' => 'Limite Di Utilizzo: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Memoria', + 'disk' => 'Disco', + 'network' => 'Rete', + 'none' => 'Nessuno', + 'loading' => 'Caricamento...', + + 'power_actions' => 'Azioni di Controllo', + 'power_action_sent' => ':action inviata a :name', +]; diff --git a/lang/it/server/database.php b/lang/it/server/database.php new file mode 100644 index 0000000000..8f4eefca3e --- /dev/null +++ b/lang/it/server/database.php @@ -0,0 +1,26 @@ + 'Database', + 'empty' => 'Nessun Database', + 'create_database' => 'Crea un Database', + 'limit' => 'Limite dei database raggiunto', + 'viewing' => 'Visualizzando: :database', + 'host' => 'Host', + 'database' => 'Database', + 'username' => 'Nome Utente', + 'password' => 'Password', + 'remote' => 'Host', + 'created_at' => 'Creato il', + 'name' => 'Nome del database', + 'name_hint' => 'Lasciando questo vuoto, verrà generato automaticamente un nome casuale', + 'connections_from' => 'Connessioni Da', + 'max_connections' => 'Numero massimo di connessioni', + 'database_host' => 'Host Database', + 'database_host_select' => 'Seleziona Host Del Database', + 'jdbc' => 'Stringa Di Connessione JDBC', + 'create_notification' => 'Creato :database', + 'create_notification_fail' => 'Creazione di :database non riuscita', + 'delete_notification' => 'Eliminato :database', + 'delete_notification_fail' => 'Eliminazione di :database non riuscita', +]; diff --git a/lang/it/server/file.php b/lang/it/server/file.php new file mode 100644 index 0000000000..5b8ebd6f5e --- /dev/null +++ b/lang/it/server/file.php @@ -0,0 +1,111 @@ + 'File', + 'name' => 'Nome', + 'size' => 'Dimensione', + 'modified_at' => 'Modificato il', + 'actions' => [ + 'open' => 'Apri', + 'download' => 'Scarica', + 'copy' => [ + 'title' => 'Copia', + 'notification' => 'File Copiato', + ], + 'upload' => [ + 'title' => 'Carica', + 'from_files' => 'Carica File', + 'from_url' => 'Carica da URL', + 'url' => 'URL', + 'drop_files' => 'Trascina qui i file da caricare', + 'success' => 'File caricati correttamente', + 'failed' => 'Caricamento dei file non riuscito', + 'header' => 'Caricamento File', + 'error' => 'Si è verificato un errore durante il caricamento', + ], + 'rename' => [ + 'title' => 'Rinomina', + 'file_name' => 'Nome File', + 'notification' => 'Il file è stato rinominato', + ], + 'move' => [ + 'title' => 'Sposta', + 'directory' => 'Cartella', + 'directory_hint' => 'Inserisci la nuova cartella, relativa alla cartella corrente.', + 'new_location' => 'Nuova posizione', + 'new_location_hint' => 'Inserisci la posizione di questo file o cartella, relativa alla cartella corrente.', + 'notification' => 'File Spostato', + 'bulk_notification' => ':count file sono stati spostati in :directory', + ], + 'permissions' => [ + 'title' => 'Permessi', + 'read' => 'Lettura', + 'write' => 'Scrittura', + 'execute' => 'Esegui', + 'owner' => 'Proprietario', + 'group' => 'Gruppo', + 'public' => 'Pubblico', + 'notification' => 'Permessi cambiati in :mode', + ], + 'archive' => [ + 'title' => 'Archivio', + 'archive_name' => 'Nome archivio', + 'notification' => 'Archivio Creato', + 'extension' => 'Estensione', + ], + 'unarchive' => [ + 'title' => 'Disarchivia', + 'notification' => 'Disarchivio Completato', + ], + 'new_file' => [ + 'title' => 'Nuovo file', + 'file_name' => 'Nome del nuovo file', + 'syntax' => 'Evidenziazione della sintassi', + 'create' => 'Crea', + ], + 'new_folder' => [ + 'title' => 'Nuova cartella', + 'folder_name' => 'Nome della nuova cartella', + ], + 'nested_search' => [ + 'title' => 'Ricerca in tutte le cartelle', + 'search_term' => 'Termine di ricerca', + 'search_term_placeholder' => 'Inserisci un termine di ricerca, es. *.txt', + 'search' => 'Cerca', + 'search_for_term' => 'Ricerca :term', + ], + 'delete' => [ + 'notification' => 'File cancellato', + 'bulk_notification' => ':count file sono stati eliminati', + ], + 'edit' => [ + 'title' => 'Modificando: :file', + 'save_close' => 'Salva & Chiudi', + 'save' => 'Salva', + 'cancel' => 'Annulla', + 'notification' => 'File salvato', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name è troppo grande!', + 'body' => 'Il massimo è :max', + ], + 'file_not_found' => [ + 'title' => ':name non trovato!', + ], + 'file_not_editable' => [ + 'title' => ':name è una directory', + ], + 'file_already_exists' => [ + 'title' => ':name esiste già!', + ], + 'files_node_error' => [ + 'title' => 'Impossibile caricare i file!', + ], + 'pelicanignore' => [ + 'title' => 'Stai modificando un file .pelicanignore!', + 'body' => 'Tutti i file o le directory elencati qui saranno esclusi dai backup. Le caratteri jolly sono supportati utilizzando un asterisco (*).
Puoi negare una regola precedente preponendo un punto esclamativo (!).', + ], + ], +]; diff --git a/lang/it/server/network.php b/lang/it/server/network.php new file mode 100644 index 0000000000..e283306c40 --- /dev/null +++ b/lang/it/server/network.php @@ -0,0 +1,17 @@ + 'Rete', + 'add' => 'Aggiungi allocazione', + 'limit' => 'Limite di allocazione raggiunto', + 'address' => 'Indirizzo', + 'port' => 'Porta', + 'notes' => 'Note', + 'no_notes' => 'Nessuna nota', + 'make_primary' => 'Imposta come Principale', + 'primary' => 'Principale', + 'make' => 'Crea', + 'delete' => 'Elimina', + 'locked' => 'Bloccata?', + 'locked_helper' => 'Le allocazioni bloccate possono essere eliminate solo dagli amministratori', +]; diff --git a/lang/it/server/setting.php b/lang/it/server/setting.php new file mode 100644 index 0000000000..bd448d5e12 --- /dev/null +++ b/lang/it/server/setting.php @@ -0,0 +1,55 @@ + 'Impostazioni', + 'server_info' => [ + 'title' => 'Informazioni Server', + 'information' => 'Informazioni', + 'name' => 'Nome del server', + 'server_name' => 'Nome Del Server: :Name', + 'notification_name' => 'Nome del Server Aggiornato', + 'description' => 'Descrizione Del Server', + 'notification_description' => 'Descrizione Del Server Aggiornata', + 'failed' => 'Fallita', + 'uuid' => 'UUID Server', + 'uuid_short' => 'ID del server', + 'node_name' => 'Nome del nodo', + 'icon' => [ + 'upload' => 'Carica Icona', + 'tooltip' => 'Usa l\'Icona dell\'Egg', + 'updated' => 'Icona del server aggiornata', + 'deleted' => 'Icona del server eliminata', + ], + 'limits' => [ + 'title' => 'Limiti', + 'unlimited' => 'Illimitata', + 'of' => 'di :max', + 'cpu' => 'CPU', + 'memory' => 'Memoria', + 'disk' => 'Spazio sul Disco', + 'backups' => 'Backup', + 'databases' => 'Database', + 'allocations' => 'Allocazioni', + 'no_allocations' => 'Nessun Allocazione Aggiuntiva', + ], + 'sftp' => [ + 'title' => 'Informazioni SFTP', + 'connection' => 'Connessione', + 'action' => 'Connettiti con SFTP', + 'username' => 'Nome Utente', + 'password' => 'Password', + 'password_body' => 'La tua password per l\'SFTP è la stessa della password che usi per accedere a questo pannello.', + ], + ], + 'reinstall' => [ + 'title' => 'Reinstalla il Server', + 'body' => 'La reinstallazione del server lo fermerà, quindi rieseguirà lo script di installazione che inizialmente lo ha configurato.', + 'body2' => 'Alcuni file possono essere eliminati o modificati durante questo processo, si prega di eseguire il backup dei dati prima di continuare.', + 'action' => 'Reinstalla', + 'modal' => 'Sei sicuro di voler reinstallare questo server?', + 'modal_description' => 'Alcuni file possono essere eliminati o modificati durante questo processo, si prega di eseguire il backup dei dati prima di continuare.', + 'yes' => 'Sì, reinstalla', + 'notification_start' => 'Reinstallazione Iniziata', + 'notification_fail' => 'Reinstallazione Fallita', + ], +]; diff --git a/lang/it/server/startup.php b/lang/it/server/startup.php new file mode 100644 index 0000000000..b9be07f83b --- /dev/null +++ b/lang/it/server/startup.php @@ -0,0 +1,17 @@ + 'Avvio', + 'command' => 'Comando di avvio', + 'notification_startup' => 'Comando Di Avvio Aggiornato', + 'notification_startup_body' => 'Riavvia il server per usare il nuovo comando di avvio.', + 'enable_preview' => 'Abilita l\'anteprima', + 'disable_preview' => 'Disabilita anteprima', + 'docker_image' => 'Immagine Docker', + 'notification_docker' => 'Immagine Docker aggiornata', + 'notification_docker_body' => 'Riavvia il server per usare la nuova immagine.', + 'variables' => 'Variabili del server', + 'update' => ':variable aggiornata', + 'fail' => ':variable non riuscito', + 'validation_fail' => 'Impossibile verificare :variable', +]; diff --git a/lang/it/server/users.php b/lang/it/server/users.php deleted file mode 100644 index 8e51138dc2..0000000000 --- a/lang/it/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Consente l\'accesso al websocket per questo server.', - 'control_console' => 'Consente all\'utente di inviare dati alla console del server.', - 'control_start' => 'Consente all\'utente di avviare l\'istanza del server.', - 'control_stop' => 'Consente all\'utente di arrestare l\'istanza del server.', - 'control_restart' => 'Consente all\'utente di riavviare l\'istanza del server.', - 'control_kill' => 'Permette all\'utente di terminare l\'istanza del server.', - 'user_create' => 'Consente all\'utente di creare nuovi account utente per il server.', - 'user_read' => 'Permette all\'utente di visualizzare gli utenti associati a questo server.', - 'user_update' => 'Permette all\'utente di modificare altri utenti associati a questo server.', - 'user_delete' => 'Permette all\'utente di eliminare altri utenti associati a questo server.', - 'file_create' => 'Permette all\'utente di creare nuovi file e cartelle.', - 'file_read' => 'Consente all\'utente di vedere i file e le cartelle associati a questa istanza del server, così come di visualizzare il loro contenuto.', - 'file_update' => 'Consente all\'utente di aggiornare i file e le cartelle associati al server.', - 'file_delete' => 'Consente all\'utente di eliminare file e cartelle.', - 'file_archive' => 'Permette all\'utente di creare archivi di file e decomprimere gli archivi esistenti.', - 'file_sftp' => 'Consente all\'utente di eseguire le azioni di file sopra indicate utilizzando un client SFTP.', - 'allocation_read' => 'Consente l\'accesso alle pagine di gestione delle allocazioni del server.', - 'allocation_update' => 'Consente all\'utente di apportare modifiche alle allocazioni del server.', - 'database_create' => 'Permette all\'utente di creare un nuovo database per il server.', - 'database_read' => 'Permette all\'utente di visualizzare i database del server.', - 'database_update' => 'Consente all\'utente di apportare modifiche a un database. Se l\'utente non dispone dell\'autorizzazione "Mostra Password" non sarà in grado di modificare la password.', - 'database_delete' => 'Consente all\'utente di eliminare un\'istanza del database.', - 'database_view_password' => 'Consente a un utente di visualizzare una password del database nel sistema.', - 'schedule_create' => 'Consente a un utente di creare una nuova pianificazione per il server.', - 'schedule_read' => 'Consente all\'utente di visualizzare le pianificazioni per un server.', - 'schedule_update' => 'Consente all\'utente di apportare modifiche a una pianificazione server esistente.', - 'schedule_delete' => 'Consente all\'utente di eliminare una programmazione per il server.', - ], -]; diff --git a/lang/it/strings.php b/lang/it/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/it/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/it/validation.php b/lang/it/validation.php index 9cccf35080..f2bc76da87 100644 --- a/lang/it/validation.php +++ b/lang/it/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => 'Il campo :attribute deve essere accettato', + 'active_url' => 'Il campo :attribute non è un URL valido.', + 'after' => 'Il campo :attribute deve essere una data dopo il :date.', + 'after_or_equal' => ':attribute deve essere una data successiva o uguale al :date.', + 'alpha' => ':attribute può contenere solo lettere.', + 'alpha_dash' => ':attribute può contenere solo lettere, numeri e trattini.', + 'alpha_num' => ':attribute può contenere solo lettere e numeri.', + 'array' => ':attribute deve essere un array.', + 'before' => ':attribute deve essere una data precedente il :date .', + 'before_or_equal' => ':attribute deve essere una data precedente o uguale a :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => ':attribute deve essere tra :min e :max.', + 'file' => ':attribute deve essere compreso tra :min e :max kilobyte.', + 'string' => ':attribute deve essere tra :min e :max caratteri.', + 'array' => ':attribute deve avere tra :min e :max elementi.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => 'La conferma di :attribute non corrisponde.', + 'date' => 'Il campo :attribute non contiene una data valida.', + 'date_format' => ':attribute non corrisponde al formato :format.', + 'different' => ':attribute e :other devono essere differenti.', + 'digits' => ':attribute deve essere di :digits cifre.', + 'digits_between' => ':attribute deve essere tra :min e :max cifre.', + 'dimensions' => ':attribute ha dimensioni di immagine non valide.', + + 'email' => ':attribute deve essere un indirizzo email valido.', + + 'file' => ':attribute deve essere un file.', + 'filled' => 'Il campo :attribute è necessario.', + 'image' => ':attribute deve essere un immagine.', + + 'in_array' => 'Il campo :attribute non esiste in :other.', + 'integer' => ':attribute deve essere un numero intero.', + 'ip' => ':attribute deve essere un indirizzo IP valido.', + 'json' => ':attribute deve essere una stringa JSON valida.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute non può essere superiore a :max.', + 'file' => ':attribute non deve essere sopra i :max kilobyte.', + 'string' => ':attribute non può contenere più di :max caratteri.', + 'array' => ':attribute non può avere più di :max elementi.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute deve essere un file di tipo: :values.', + 'mimetypes' => ':attribute deve essere un file di tipo: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute deve essere almeno :min.', + 'file' => ':attribute deve essere almeno di :min kilobyte.', + 'string' => ':attribute deve contenere almeno :min caratteri.', + 'array' => ':attribute deve avere almeno :min elementi.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute deve essere un numero.', + + 'regex' => 'Il formato di :attribute non è valido.', + + 'required_with_all' => 'Il campo :attribute è obbligatorio quando :values è presente.', + + 'same' => ':attribute e :other devono coincidere.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute deve essere :size.', + 'file' => ':attribute deve essere :size kilobyte.', + 'string' => ':attribute deve essere di :size caratteri.', + 'array' => ':attribute deve contenere :size elementi.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute deve essere una stringa.', + 'timezone' => ':attribute deve essere una zona valida.', + + 'url' => 'Il formato di :attribute non è valido.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => 'variabile :env', + 'invalid_password' => 'La password fornita non è valida per questo account.', ], ]; diff --git a/lang/ja/activity.php b/lang/ja/activity.php deleted file mode 100644 index 86ba11df96..0000000000 --- a/lang/ja/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'ログインに失敗しました。', - 'success' => 'ログインしました。', - 'password-reset' => 'パスワードを再設定しました。', - 'reset-password' => 'パスワードの再設定が要求されました。', - 'checkpoint' => '二段階認証が要求されました。', - 'recovery-token' => '二段階認証の回復トークンを使用しました。', - 'token' => '二段階認証を有効化しました。', - 'ip-blocked' => '「:identifier」にないIPアドレスからのリクエストをブロックしました。', - 'sftp' => [ - 'fail' => 'SFTPのログインに失敗しました。', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'メールアドレスを「:old」から「:new」に変更しました。', - 'password-changed' => 'パスワードを変更しました。', - ], - 'api-key' => [ - 'create' => 'APIキー「:identifier」を作成しました。', - 'delete' => 'APIキー「:identifier」を削除しました。', - ], - 'ssh-key' => [ - 'create' => 'SSHキー「:identifier」を追加しました。', - 'delete' => 'SSHキー「:identifier」を削除しました。', - ], - 'two-factor' => [ - 'create' => '二段階認証を有効化しました。', - 'delete' => '二段階認証を無効化しました。', - ], - ], - 'server' => [ - 'reinstall' => 'サーバーを再インストールしました。', - 'console' => [ - 'command' => 'サーバーで「:command」を実行しました。', - ], - 'power' => [ - 'start' => 'サーバーを起動しました。', - 'stop' => 'サーバーを停止しました。', - 'restart' => 'サーバーを再起動しました。', - 'kill' => 'サーバーを強制停止しました。', - ], - 'backup' => [ - 'download' => 'バックアップ「:name」をダウンロードしました。', - 'delete' => 'バックアップ「:name」を削除しました。', - 'restore' => 'バックアップ「:name」を復元しました。(削除されたファイル: :truncate)', - 'restore-complete' => 'バックアップ「:name」から復元しました。', - 'restore-failed' => 'バックアップ「:name」からの復元に失敗しました。', - 'start' => 'バックアップ「:name」を開始しました。', - 'complete' => 'バックアップ「:name」が完了しました。', - 'fail' => 'バックアップ「:name」に失敗しました。', - 'lock' => 'バックアップ「:name」をロックしました。', - 'unlock' => 'バックアップ「:name」のロックを解除しました。', - ], - 'database' => [ - 'create' => 'データベース「:name」を作成しました。', - 'rotate-password' => 'データベース「:name」のパスワードを変更しました。', - 'delete' => 'データベース「:name」を削除しました。', - ], - 'file' => [ - 'compress_one' => 'ファイル「:directory:files」を圧縮しました。', - 'compress_other' => '「:directory」内の:count個のファイルを圧縮しました。', - 'read' => 'ファイル「:file」の内容を表示しました。', - 'copy' => 'ファイル「:file」を複製しました。', - 'create-directory' => 'ディレクトリ「:directory:name」を作成しました。', - 'decompress' => 'ディレクトリ「:directory」内の「:files」を展開しました。', - 'delete_one' => 'ファイル「:directory:file.0」を削除しました。', - 'delete_other' => 'ディレクトリ「:directory」内の:count個のファイルを削除しました。', - 'download' => 'ファイル「:file」をダウンロードしました。', - 'pull' => '「:url」から「:directory」にダウンロードしました。', - 'rename_one' => '「:directory:files.0.from」から「:directory:files.0.to」にファイル名を変更しました。', - 'rename_other' => '「:directory」内の:count個のファイル名を変更しました。', - 'write' => 'ファイル「:file」の内容を変更しました。', - 'upload' => 'ファイルをアップロードしました。', - 'uploaded' => 'ファイル「:directory:file」をアップロードしました。', - ], - 'sftp' => [ - 'denied' => 'SFTPアクセスをブロックしました。', - 'create_one' => 'ファイル「:files.0」を作成しました。', - 'create_other' => ':count個のファイルを作成しました。', - 'write_one' => '「:files.0」の内容を変更しました。', - 'write_other' => ':count個のファイルの内容を変更しました。', - 'delete_one' => 'ファイル「:files.0」を削除しました。', - 'delete_other' => ':count個のファイルを削除しました。', - 'create-directory_one' => 'ディレクトリ「:files.0」を作成しました。', - 'create-directory_other' => ':count個のディレクトリを作成しました。', - 'rename_one' => '「:files.0.from」から「:files.0.to」に名前を変更しました。', - 'rename_other' => ':count個のファイル名を変更しました。', - ], - 'allocation' => [ - 'create' => 'ポート「:allocation」を割り当てました。', - 'notes' => 'ポート「:allocation」のメモを「:old」から「:new」に更新しました。', - 'primary' => 'ポート「:allocation」をプライマリとして割り当てました。', - 'delete' => 'ポート「:allocation」を削除しました。', - ], - 'schedule' => [ - 'create' => 'スケジュール「:name」を作成しました。', - 'update' => 'スケジュール「:name」を更新しました。', - 'execute' => 'スケジュール「:name」を手動で実行しました。', - 'delete' => 'スケジュール「:name」を削除しました。', - ], - 'task' => [ - 'create' => 'スケジュール「:name」にタスク「:action」を作成しました。', - 'update' => 'スケジュール「:name」のタスク「:action」を更新しました。', - 'delete' => 'スケジュール「:name」のタスクを削除しました。', - ], - 'settings' => [ - 'rename' => 'サーバー名を「:old」から「:new」に変更しました。', - 'description' => 'サーバー説明を「:old」から「:new」に変更しました。', - ], - 'startup' => [ - 'edit' => '変数「:variable」を「:old」から「:new」に変更しました。', - 'image' => 'Dockerイメージを「:old」から「:new」に更新しました。', - ], - 'subuser' => [ - 'create' => 'サブユーザー「:email」を追加しました。', - 'update' => 'サブユーザー「:email」の権限を変更しました。', - 'delete' => 'サブユーザー「:email」を削除しました。', - ], - ], -]; diff --git a/lang/ja/admin/eggs.php b/lang/ja/admin/eggs.php deleted file mode 100644 index f0535553a7..0000000000 --- a/lang/ja/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'このEggと関連する変数を正常にインポートしました。', - 'updated_via_import' => 'ファイルを使用してこのEggを更新しました。', - 'deleted' => 'Eggを削除しました。', - 'updated' => 'Eggの設定を更新しました。', - 'script_updated' => 'Eggのインストールスクリプトが更新されました。サーバーのインストール時に実行されます。', - 'egg_created' => 'Eggを作成しました。このEggを適用するには、実行中のDaemonを再起動してください。', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => '変数「:variable」を削除しました。再起動後は使用できなくなります。', - 'variable_updated' => '変数「:variable」を更新しました。再起動後に適用されます。', - 'variable_created' => '変数が作成され、このEggに割り当てられました。', - ], - ], -]; diff --git a/lang/ja/admin/health.php b/lang/ja/admin/health.php new file mode 100644 index 0000000000..687864cf9e --- /dev/null +++ b/lang/ja/admin/health.php @@ -0,0 +1,60 @@ + 'ヘルス', + 'results_refreshed' => 'ヘルスチェック結果を更新しました', + 'checked' => ':time に結果を確認しました', + 'refresh' => '更新', + 'results' => [ + 'cache' => [ + 'label' => 'キャッシュ', + 'ok' => '正常', + 'failed_retrieve' => 'アプリケーションキャッシュの値を設定または取得できませんでした。', + 'failed' => 'アプリケーションキャッシュで例外が発生しました: :error', + ], + 'database' => [ + 'label' => 'データベース', + 'ok' => '正常', + 'failed' => 'データベースに接続できませんでした: :error', + ], + 'debugmode' => [ + 'label' => 'デバッグモード', + 'ok' => 'デバッグモードは無効です', + 'failed' => 'デバッグモードは :expected であることが期待しましたが、実際は :actual でした', + ], + 'environment' => [ + 'label' => '環境', + 'ok' => '正常, :actual に設定', + 'failed' => '環境は :actual に設定されていますが、期待値は :expected です', + ], + 'nodeversions' => [ + 'label' => 'ノードバージョン', + 'ok' => 'ノードは最新です', + 'failed' => ':outdated / :all のノードが古いです', + 'no_nodes_created' => 'ノードが作成されていません', + 'no_nodes' => 'ノードがありません', + 'all_up_to_date' => 'すべて最新です', + 'outdated' => ':outdated / :all 古い', + ], + 'panelversion' => [ + 'label' => 'パネルバージョン', + 'ok' => 'パネルは最新です', + 'failed' => 'インストールされているバージョンは :currentVersion ですが、最新は :latestVersion です', + 'up_to_date' => '最新', + 'outdated' => '古い', + ], + 'schedule' => [ + 'label' => 'スケジュール', + 'ok' => '正常', + 'failed_last_ran' => 'スケジュールの最終実行が :time 分以上前です', + 'failed_not_ran' => 'スケジュールはまだ実行されていません', + ], + 'useddiskspace' => [ + 'label' => 'ディスク容量', + ], + ], + 'checks' => [ + 'successful' => '成功', + 'failed' => '失敗', + ], +]; diff --git a/lang/ja/admin/log.php b/lang/ja/admin/log.php new file mode 100644 index 0000000000..f0129ea608 --- /dev/null +++ b/lang/ja/admin/log.php @@ -0,0 +1,26 @@ + 'やった!エラーはありません!', + 'total_logs' => 'すべてのログ', + 'error' => 'エラー', + 'warning' => '警告', + 'notice' => '注意', + 'info' => '情報', + 'debug' => 'Debug', + 'navigation' => [ + 'panel_logs' => 'パネル ログ', + ], + 'actions' => [ + 'upload_logs' => 'ログをアップロードしますか?', + 'upload_logs_description' => ':file が :url へアップロードされます。よろしいですか?', + 'view_logs' => 'ログを確認', + 'log_not_found' => 'ログが見つかりません', + 'log_not_found_description' => ':filename が見つかりませんでした', + 'failed_to_upload' => 'アップロードに失敗しました', + 'failed_to_upload_description' => 'HTTPステータス :status', + 'log_upload' => 'ログのアップロードに成功しました', + 'log_upload_action' => 'ログを確認', + 'upload_tooltip' => ':url にアップロードする', + ], +]; diff --git a/lang/ja/admin/node.php b/lang/ja/admin/node.php deleted file mode 100644 index 0eeea637fa..0000000000 --- a/lang/ja/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => '入力されたFQDNまたはIPアドレスは、有効なIPアドレスに解決しません。', - 'fqdn_required_for_ssl' => 'このノードにSSLを使用するには、公開IPアドレスに解決するFQDNが必要です。', - ], - 'notices' => [ - 'allocations_added' => '割り当てを追加しました。', - 'node_deleted' => 'ノードを削除しました。', - 'node_created' => 'ノードを作成しました。「設定」タブでDaemonを自動的に設定できます。 サーバーを追加する前に、割り当てを追加してください。', - 'node_updated' => 'ノードを更新しました。Deamon設定を変更した場合、適用のため再起動が必要です。', - 'unallocated_deleted' => ':ipに割り当てられていないポートをすべて削除しました。', - ], -]; diff --git a/lang/ja/admin/server.php b/lang/ja/admin/server.php deleted file mode 100644 index 3a08eb187d..0000000000 --- a/lang/ja/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'デフォルトの割り当て以外に割り当てがないため、デフォルトの割り当てを削除できません。', - 'marked_as_failed' => 'このサーバーは前回、インストールに失敗しています。この状態で現在の状態を切り替えることはできません。', - 'bad_variable' => '変数「:name」の検証エラーが発生しました。', - 'daemon_exception' => 'HTTP/:code応答コードを生成するデーモンと通信しようとしたときに例外が発生しました。この例外はログ収集されました。(リクエストID: :request_id)', - 'default_allocation_not_found' => 'リクエストされたデフォルトの割り当てがこのサーバーの割り当てに見つかりませんでした。', - ], - 'alerts' => [ - 'startup_changed' => 'このサーバーの起動設定が更新されました。このサーバーのEggが変更された場合、再インストールが行われます。', - 'server_deleted' => 'サーバーを削除しました。', - 'server_created' => 'サーバーを作成しました。Daemonがこのサーバーを完全にインストールするまで数分間お待ちください。', - 'build_updated' => 'ビルド詳細を更新しました。一部の変更を有効にするには再起動が必要な場合があります。', - 'suspension_toggled' => 'サーバーの状態が:statusに変更されました。', - 'rebuild_on_boot' => 'このサーバーはDockerコンテナの再構築が必要です。サーバーが次回起動されたときに行われます。', - 'install_toggled' => 'このサーバーのインストールステータスが切り替わりました。', - 'server_reinstalled' => 'このサーバーは今から再インストールを開始するためキューに入れられています。', - 'details_updated' => 'サーバーの詳細が更新されました。', - 'docker_image_updated' => 'このサーバーで使用するデフォルトの Docker イメージを変更しました。この変更を適用するには再起動が必要です。', - 'node_required' => 'このパネルにノードを追加する前に、ロケーションを設定する必要があります。', - 'transfer_nodes_required' => 'サーバーを転送するには、2つ以上のノードが設定されている必要があります。', - 'transfer_started' => 'サーバー転送を開始しました。', - 'transfer_not_viable' => '選択したノードには、このサーバに対応するために必要なディスク容量またはメモリが足りません。', - ], -]; diff --git a/lang/ja/admin/user.php b/lang/ja/admin/user.php deleted file mode 100644 index bd72937d91..0000000000 --- a/lang/ja/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'サーバーを所有しているユーザーは削除できません。ユーザーを削除する前にサーバーを削除してください。', - 'user_is_self' => '自分のアカウントは削除できません。', - ], - 'notices' => [ - 'account_created' => 'アカウントを作成しました。', - 'account_updated' => 'アカウントを更新しました。', - ], -]; diff --git a/lang/ja/auth.php b/lang/ja/auth.php deleted file mode 100644 index b19630781a..0000000000 --- a/lang/ja/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'ログイン', - 'go_to_login' => 'ログイン画面に移動', - 'failed' => '入力された情報に一致するアカウントが見つかりませんでした。', - - 'forgot_password' => [ - 'label' => 'パスワードを忘れた場合', - 'label_help' => 'パスワードを再設定する手順を受け取るには、アカウントのメールアドレスを入力してください。', - 'button' => 'アカウントの回復', - ], - - 'reset_password' => [ - 'button' => '再設定しログイン', - ], - - 'two_factor' => [ - 'label' => '二段階認証のトークン', - 'label_help' => '続行するには、6桁の認証コードが必要です。お使いのデバイスで生成されたコードを入力してください。', - 'checkpoint_failed' => '二段階認証のコードが無効です。', - ], - - 'throttle' => 'ログイン試行回数が多すぎます。:seconds秒後にもう一度お試しください。', - 'password_requirements' => 'パスワードは8文字以上で、推測されにくいパスワードを使用してください。', - '2fa_must_be_enabled' => '管理者は、このPanelの使用に二段階認証を必須にしています。', -]; diff --git a/lang/ja/command/messages.php b/lang/ja/command/messages.php deleted file mode 100644 index 03e0bb3406..0000000000 --- a/lang/ja/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'ユーザー名、ユーザーID、またはメールアドレスを入力してください。', - 'select_search_user' => '削除するユーザーID(再検索する場合は「0」を入力してください。)', - 'deleted' => 'ユーザーを削除しました。', - 'confirm_delete' => 'ユーザーを削除しますか?', - 'no_users_found' => '検索条件に一致するユーザーが見つかりませんでした。', - 'multiple_found' => '指定されたユーザーに対して複数のアカウントが見つかりました。「--no-interaction」フラグがあるため、ユーザーを削除できません。', - 'ask_admin' => 'このユーザーは管理者ですか?', - 'ask_email' => 'メールアドレス', - 'ask_username' => 'ユーザー名', - 'ask_name_first' => '名', - 'ask_name_last' => '姓', - 'ask_password' => 'パスワード', - 'ask_password_tip' => 'ランダムなパスワードでアカウントを作成したい場合は、コマンド「CTRL+C」を実行し、フラグ「--no-password」を設定してください。', - 'ask_password_help' => 'パスワードは8文字以上で、1文字以上の大文字、数字が必要です。', - '2fa_help_text' => [ - 'このコマンドが有効になっている場合、ユーザーのアカウントの二段階認証を無効にします。 これは、二段階認証アプリへのアクセス権を失った場合にのみ、アカウントを回復するためのコマンドとして使用してください。', - 'この動作を行わない場合は、「CTRL+C」でこのプロセスを終了します。', - ], - '2fa_disabled' => '「:email」で二段階認証が無効になりました。', - ], - 'schedule' => [ - 'output_line' => 'スケジュール「:schedule」(:hash)で最初のタスクのジョブを送信します。', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'サービスのバックアップファイル「:file」を削除します。', - ], - 'server' => [ - 'rebuild_failed' => 'ノード「:node」上の「:name」(#:id) の再構築リクエストがエラーで失敗しました: :message', - 'reinstall' => [ - 'failed' => 'ノード「:node」上の「:name」(#:id) の再インストールリクエストがエラーで失敗しました: :message', - 'confirm' => 'サーバーのグループに対して再インストールしようとしています。続行しますか?', - ], - 'power' => [ - 'confirm' => ':count個のサーバーに対して「:action」を実行しようとしています。続行しますか?', - 'action_failed' => 'ノード「:node」上の「:name」(#:id) の電源アクションリクエストがエラーで失敗しました: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTPホスト (例: smtp.gmail.com)', - 'ask_smtp_port' => 'SMTPポート', - 'ask_smtp_username' => 'SMTPユーザ名', - 'ask_smtp_password' => 'SMTPパスワード', - 'ask_mailgun_domain' => 'Mailgunドメイン', - 'ask_mailgun_endpoint' => 'Mailgun エンドポイント', - 'ask_mailgun_secret' => 'Mailgunシークレット', - 'ask_mandrill_secret' => 'Mandrillシークレット', - 'ask_postmark_username' => 'Postmark APIキー', - 'ask_driver' => 'どのドライバを使用してメールを送信しますか?', - 'ask_mail_from' => 'メールアドレスのメール送信元', - 'ask_mail_name' => 'メールアドレスの表示先名', - 'ask_encryption' => '暗号化方法', - ], - ], -]; diff --git a/lang/ja/dashboard/account.php b/lang/ja/dashboard/account.php deleted file mode 100644 index 941c3c71d1..0000000000 --- a/lang/ja/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'メールアドレスを変更', - 'updated' => 'メールアドレスを変更しました。', - ], - 'password' => [ - 'title' => 'パスワードを変更', - 'requirements' => '新しいパスワードは8文字以上で入力してください。', - 'updated' => 'パスワードを変更しました。', - ], - 'two_factor' => [ - 'button' => '二段階認証の設定', - 'disabled' => '二段階認証が無効化されています。ログイン時のトークン入力をスキップできます。', - 'enabled' => '二段階認証が有効化されています。ログイン時にトークン入力が必要です。', - 'invalid' => '入力されたトークンは無効です。', - 'setup' => [ - 'title' => '二段階認証のセットアップ', - 'help' => 'QRコードを読み込めませんか?以下のコードをアプリケーションに入力してください:', - 'field' => 'トークンを入力', - ], - 'disable' => [ - 'title' => '二段階認証の無効化', - 'field' => 'トークンを入力', - ], - ], -]; diff --git a/lang/ja/dashboard/index.php b/lang/ja/dashboard/index.php deleted file mode 100644 index 502918d845..0000000000 --- a/lang/ja/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'サーバーを検索...', - 'no_matches' => '検索条件に一致するサーバーが見つかりませんでした。', - 'cpu_title' => 'CPU', - 'memory_title' => 'メモリ', -]; diff --git a/lang/ja/exceptions.php b/lang/ja/exceptions.php deleted file mode 100644 index a5bd12d3da..0000000000 --- a/lang/ja/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'HTTP/:code応答コードを生成するデーモンと通信しようとしたときに例外が発生しました。この例外はログ収集されました。', - 'node' => [ - 'servers_attached' => '削除するには、ノードにサーバーがリンクされていない必要があります。', - 'daemon_off_config_updated' => 'デーモンの設定が更新されました。しかし、デーモンの設定ファイルを自動的に更新しようとする際にエラーが発生しました。 これらの変更を適用するには、デーモンの設定ファイル(config.yml)を手動で更新する必要があります。', - ], - 'allocations' => [ - 'server_using' => '現在サーバーは割り当てられています。割り当てはサーバーが現在割り当てられていない場合にのみ削除できます。', - 'too_many_ports' => '一度に1000以上のポートを追加することはできません。', - 'invalid_mapping' => ':port のマッピングは無効で、処理することができませんでした。', - 'cidr_out_of_range' => 'CIDR表記では/25から/32までのマスクのみ使用できます。', - 'port_out_of_range' => '割り当てのポートは 1024 以上、65535 以下である必要があります。', - ], - 'egg' => [ - 'delete_has_servers' => 'アクティブなサーバーがアタッチされたEggはパネルから削除できません。', - 'invalid_copy_id' => 'スクリプトをコピーするために選択されたEggが存在しないか、スクリプト自体をコピーしています。', - 'has_children' => 'このEggは、1つ以上の他のEggの親になっています。このEggを削除する前に、それらのEggを削除してください。', - ], - 'variables' => [ - 'env_not_unique' => '環境変数「:name」はこの卵に固有でなければなりません。', - 'reserved_name' => '環境変数「:name」は保護されているため、変数に割り当てることはできません。', - 'bad_validation_rule' => '検証ルール「:rule」は、このアプリケーションの有効なルールではありません。', - ], - 'importer' => [ - 'json_error' => 'JSON ファイルの解析中にエラーが発生しました: :error', - 'file_error' => '指定された JSON ファイルは無効です。', - 'invalid_json_provided' => '指定された JSON ファイルは認識可能な形式ではありません。', - ], - 'subusers' => [ - 'editing_self' => '自分のサブユーザーアカウントの編集は許可されていません。', - 'user_is_owner' => 'このサーバーのサブユーザーとしてサーバーの所有者を追加することはできません。', - 'subuser_exists' => 'そのメールアドレスを持つユーザーは、このサーバーのサブユーザーとしてすでに割り当てられています。', - ], - 'databases' => [ - 'delete_has_databases' => 'アクティブなデータベースがリンクされているデータベースサーバーは削除できません。', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'チェーンタスクの最大インターバルは15分です。', - ], - 'locations' => [ - 'has_nodes' => 'アクティブなノードがアタッチされている場所は削除できません。', - ], - 'users' => [ - 'node_revocation_failed' => 'Node #:nodeのキーの取り消しに失敗しました。:error', - ], - 'deployment' => [ - 'no_viable_nodes' => '自動デプロイメントのために指定された要件を満たすノードは見つかりませんでした。', - 'no_viable_allocations' => '自動デプロイの要件を満たす割り当ては見つかりませんでした。', - ], - 'api' => [ - 'resource_not_found' => 'リクエストされたリソースはこのサーバーに存在しません。', - ], -]; diff --git a/lang/ja/pagination.php b/lang/ja/pagination.php deleted file mode 100644 index 3c1e113791..0000000000 --- a/lang/ja/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« 前', - 'next' => '次 »', -]; diff --git a/lang/ja/passwords.php b/lang/ja/passwords.php deleted file mode 100644 index 2d2215cba5..0000000000 --- a/lang/ja/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'パスワードは6文字以上で確認と一致しなければなりません。', - 'reset' => 'パスワードを再設定しました。', - 'sent' => 'パスワードの再設定URLをメールアドレス宛に送信しました。', - 'token' => 'このパスワードの再設定トークンは無効です。', - 'user' => '入力されたメールアドレスのユーザーは見つかりません。', -]; diff --git a/lang/ja/search.php b/lang/ja/search.php new file mode 100644 index 0000000000..f2306a9436 --- /dev/null +++ b/lang/ja/search.php @@ -0,0 +1,9 @@ + '検索を開始するには、3文字以上を入力してください。', + 'term' => [ + 'label' => '検索ワード', + 'description' => '検索を開始するために、サーバー名、UUID、またはアロケーションを入力してください。', + ], +]; diff --git a/lang/ja/server/users.php b/lang/ja/server/users.php deleted file mode 100644 index c039acb14c..0000000000 --- a/lang/ja/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Websocketへのアクセスを許可します。', - 'control_console' => 'コンソールへのデータ送信を許可します。', - 'control_start' => 'サーバーの起動を許可します。', - 'control_stop' => 'サーバーの停止を許可します。', - 'control_restart' => 'サーバーの再起動を許可します。', - 'control_kill' => 'サーバーの強制終了を許可します。', - 'user_create' => 'サブユーザーの作成を許可します。', - 'user_read' => 'サブユーザーの閲覧を許可します。', - 'user_update' => 'サブユーザーの権限の変更を許可します。', - 'user_delete' => 'サブユーザーの削除を許可します。', - 'file_create' => 'ファイル・ディレクトリの作成を許可します。', - 'file_read' => 'ファイル・ディレクトリの閲覧を許可します。', - 'file_update' => 'ファイル・ディレクトリの編集を許可します。', - 'file_delete' => 'ファイル・ディレクトリの削除を許可します。', - 'file_archive' => 'ファイル・ディレクトリの展開、圧縮を許可します。', - 'file_sftp' => 'SFTPでのアクセスを許可します。', - 'allocation_read' => '割り当ての閲覧を許可します。', - 'allocation_update' => '割り当ての変更を許可します。', - 'database_create' => 'データベースの作成を許可します。', - 'database_read' => 'データベースの閲覧を許可します。', - 'database_update' => 'データベースの変更を許可します。(「パスワードの閲覧」権限がない場合、パスワードを変更できません。)', - 'database_delete' => 'データベースの削除を許可します。', - 'database_view_password' => 'データベースのパスワードの閲覧を許可します。', - 'schedule_create' => 'スケジュールの作成を許可します。', - 'schedule_read' => 'スケジュールの閲覧を許可します。', - 'schedule_update' => 'スケジュールの変更を許可します。', - 'schedule_delete' => 'スケジュールの削除を許可します。', - ], -]; diff --git a/lang/ja/strings.php b/lang/ja/strings.php deleted file mode 100644 index b2b0e6a29a..0000000000 --- a/lang/ja/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'メール', - 'email_address' => 'メールアドレス', - 'user_identifier' => 'ユーザー名またはメールアドレス', - 'password' => 'パスワード', - 'new_password' => '新しいパスワード', - 'confirm_password' => '新しいパスワードの確認', - 'login' => 'ログイン', - 'home' => 'ホーム', - 'servers' => 'サーバー', - 'id' => 'ID', - 'name' => '名前', - 'node' => 'ノード', - 'connection' => '接続', - 'memory' => 'メモリ', - 'cpu' => 'CPU', - 'disk' => 'ディスク', - 'status' => '状態', - 'search' => '検索', - 'suspended' => '一時停止中', - 'account' => 'アカウント', - 'security' => 'セキュリティ', - 'ip' => 'IPアドレス', - 'last_activity' => '最後のアクティビティ', - 'revoke' => '取り消す', - '2fa_token' => '認証トークン', - 'submit' => '送信', - 'close' => '閉じる', - 'settings' => '設定', - 'configuration' => '構成', - 'sftp' => 'SFTP', - 'databases' => 'データベース', - 'memo' => 'メモ', - 'created' => '作成', - 'expires' => '期限', - 'public_key' => 'トークン', - 'api_access' => 'APIアクセス', - 'never' => 'しない', - 'sign_out' => 'ログアウト', - 'admin_control' => '管理者コントロール', - 'required' => '必須', - 'port' => 'ポート', - 'username' => 'ユーザー名', - 'database' => 'データベース', - 'new' => '新規', - 'danger' => '危険', - 'create' => '作成', - 'select_all' => 'すべて選択', - 'select_none' => '選択なし', - 'alias' => 'エイリアス', - 'primary' => 'プライマリ', - 'make_primary' => 'プライマリに変更', - 'none' => 'なし', - 'cancel' => 'キャンセル', - 'created_at' => '作成日', - 'action' => 'アクション', - 'data' => 'データ', - 'queued' => '処理待ち', - 'last_run' => '前回実行', - 'next_run' => '次回実行', - 'not_run_yet' => '未実行', - 'yes' => 'はい', - 'no' => 'いいえ', - 'delete' => '削除', - '2fa' => '二段階認証', - 'logout' => 'ログアウト', - 'admin_cp' => '管理者コントロールパネル', - 'optional' => 'オプション', - 'read_only' => '読み取り専用', - 'relation' => '関連', - 'owner' => '所有者', - 'admin' => '管理者', - 'subuser' => 'サブユーザー', - 'captcha_invalid' => '指定されたCAPTCHAは無効です。', - 'tasks' => 'タスク', - 'seconds' => '秒', - 'minutes' => '分', - 'under_maintenance' => 'メンテナンス中', - 'days' => [ - 'sun' => '日曜日', - 'mon' => '月曜日', - 'tues' => '火曜日', - 'wed' => '水曜日', - 'thurs' => '木曜日', - 'fri' => '金曜日', - 'sat' => '土曜日', - ], - 'last_used' => '前回使用', - 'enable' => '有効', - 'disable' => '無効', - 'save' => '保存', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/ja/validation.php b/lang/ja/validation.php index e9e98d8bf5..5a5ff8ff3d 100644 --- a/lang/ja/validation.php +++ b/lang/ja/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => ':attributeを承認してください。', - 'active_url' => ':attributeは、有効なURLではありません。', - 'after' => ':attributeには、:dateより後の日付を指定してください。', - 'after_or_equal' => ':attribute は :date と同じ日付かそれ以降でなければいけません。', - 'alpha' => ':attributeには、アルファベッドのみ使用できます。', - 'alpha_dash' => ':attributeには、英数字(\'A-Z\',\'a-z\',\'0-9\')とハイフン(-)が使用できます。', - 'alpha_num' => ':attributeには、英数字(\'A-Z\',\'a-z\',\'0-9\')が使用できます。', - 'array' => ':attributeには、配列を指定してください。', - 'before' => ':attribute は :date よりも前の日付である必要があります。', - 'before_or_equal' => ':attributeには、:date以前の日付を指定してください。', + 'accepted' => ':attribute を受け入れる必要があります。', + 'active_url' => ':attribute は有効な URL ではありません。', + 'after' => ':attribute は :date より後の日付でなければなりません。', + 'after_or_equal' => ':attribute は :date 以降の日付でなければなりません。', + 'alpha' => ':attribute は英字のみで構成されなければなりません。', + 'alpha_dash' => ':attribute は英字、数字、及びダッシュのみで構成されなければなりません。', + 'alpha_num' => ':attribute は英数字のみで構成されなければなりません。', + 'array' => ':attribute は配列でなければなりません。', + 'before' => ':attribute は :date より前の日付でなければなりません。', + 'before_or_equal' => ':attribute は :date 以前の日付でなければなりません。', 'between' => [ - 'numeric' => ':attribute は :min から :max キロバイトである必要があります。', - 'file' => ':attributeには、:min KBから:max KBまでのサイズのファイルを指定してください。', - 'string' => ':attributeは、:min文字から:max文字にしてください。', - 'array' => ':attributeの項目は、:min個から:max個にしてください。', + 'numeric' => ':attribute は :min から :max の間でなければなりません。', + 'file' => ':attribute は :min から :max キロバイトの間でなければなりません。', + 'string' => ':attribute は :min 文字から :max 文字の間でなければなりません。', + 'array' => ':attribute の項目数は :min から :max の間でなければなりません。', ], - 'boolean' => ':attribute はtrueかfalseである必要があります。', + 'confirmed' => ':attribute の確認が一致しません。', - 'date' => ':attribute が正しい日付ではありません。', - 'date_format' => ':attribute は :format のフォーマットと一致しません。', - 'different' => ':attributeと:otherは異なる必要があります。', - 'digits' => ':attributeは:digits桁である必要があります。', - 'digits_between' => ':attribute は :min から :max 桁である必要があります。', - 'dimensions' => ':attribute は無効な画像サイズです。', - 'distinct' => ':attributeの値が重複しています。', - 'email' => ':attribute はメールアドレスの形式ではありません。', - 'exists' => '選択した :attributeは 無効です。', - 'file' => ':attribute はファイルである必要があります。', - 'filled' => ':attribute の項目は必ず入力する必要があります。', - 'image' => ':attribute は画像である必要があります。', - 'in' => '選択した :attributeは 無効です。', - 'in_array' => ':attributeが:otherに存在しません。', - 'integer' => ':attribute は整数である必要があります。', - 'ip' => ':attributeは正しいIPアドレスである必要があります。', - 'json' => ':attributeは有効なJSON文字列である必要があります。', + 'date' => ':attribute は有効な日付ではありません。', + 'date_format' => ':attribute は :format の形式と一致しません。', + 'different' => ':attribute と :other は異なっている必要があります。', + 'digits' => ':attribute は :digits 桁でなければなりません。', + 'digits_between' => ':attribute は :min 桁から :max 桁の間でなければなりません。', + 'dimensions' => ':attribute の画像サイズが無効です。', + + 'email' => ':attribute には有効なメールアドレスを指定してください。', + + 'file' => ':attribute はファイルでなければなりません。', + 'filled' => ':attribute には値を入力する必要があります。', + 'image' => ':attribute は画像ファイルでなければなりません。', + + 'in_array' => ':attribute は :other に存在しません。', + 'integer' => ':attribute は整数でなければなりません。', + 'ip' => ':attribute には有効な IP アドレスを指定してください。', + 'json' => ':attribute は有効な JSON 文字列でなければなりません。', 'max' => [ - 'numeric' => ':attributeは:max以下である必要があります。', - 'file' => ':attributeは:maxキロバイト以下である必要があります。', - 'string' => ':attribute は :max 文字以下である必要があります。', - 'array' => ':attributeは:max個のアイテム以下である必要があります。', + 'numeric' => ':attribute は :max 以下でなければなりません。', + 'file' => ':attribute は :max キロバイト以下でなければなりません。', + 'string' => ':attribute は :max 文字以下でなければなりません。', + 'array' => ':attribute の項目数は :max 個以下でなければなりません。', ], - 'mimes' => ':attributeは:valuesのファイル形式である必要があります。', - 'mimetypes' => ':attributeは:valuesのファイル形式である必要があります。', + 'mimes' => ':attribute は :values の形式のファイルでなければなりません。', + 'mimetypes' => ':attribute は :values の形式のファイルでなければなりません。', 'min' => [ - 'numeric' => ':attribute は :min 以上である必要があります。', - 'file' => ':attribute は最低 :min キロバイト以上である必要があります。', - 'string' => ':attribute は最低 :min 文字以上である必要があります。', - 'array' => ':attributeは:min個以上である必要があります。', + 'numeric' => ':attribute は少なくとも :min でなければなりません。', + 'file' => ':attribute は少なくとも :min キロバイトでなければなりません。', + 'string' => ':attribute は少なくとも :min 文字でなければなりません。', + 'array' => ':attribute には少なくとも :min 個の項目が必要です。', ], - 'not_in' => '選択した :attributeは 無効です。', - 'numeric' => ':attributeは数字である必要があります。', - 'present' => ':attribute の項目は必ず入力する必要があります。', - 'regex' => ':attributeの形式が無効です。', - 'required' => ':attribute は必須です。', - 'required_if' => ':other の項目が :value の場合、:attribute を入力する必要があります。', - 'required_unless' => ':other の項目が :value でない場合、:attribute を入力する必要があります。', - 'required_with' => ':valuesが指定されている場合、:attributeは必須です。', - 'required_with_all' => ':valuesが指定されている場合、:attributeは必須です。', - 'required_without' => ':valuesが設定されていない場合、:attributeは必須です。', - 'required_without_all' => ':valuesが一つも存在しない場合、:attributeの項目は必須です。', + + 'numeric' => ':attribute は数値でなければなりません。', + + 'regex' => ':attribute の形式が正しくありません。', + + 'required_with_all' => ':values が存在する場合、:attribute は必須です。', + 'same' => ':attribute と :other は一致している必要があります。', 'size' => [ - 'numeric' => ':attribute のサイズは :size である必要があります。', - 'file' => ':attribute のサイズは :size キロバイトである必要があります。', - 'string' => ':attribute は :size 文字である必要があります。', - 'array' => ':attribute は :size 個である必要があります。', + 'numeric' => ':attribute は :size でなければなりません。', + 'file' => ':attribute は :size キロバイトでなければなりません。', + 'string' => ':attribute は :size 文字でなければなりません。', + 'array' => ':attribute は :size 個の項目を含む必要があります。', ], - 'string' => ':attribute は文字列である必要があります。', - 'timezone' => ':attributeは有効なゾーンである必要があります。', - 'unique' => ':attribute は既に使用されています。', - 'uploaded' => ':attribute のアップロードに失敗しました。', - 'url' => ':attribute の形式が無効です。', + 'string' => ':attribute は文字列でなければなりません。', + 'timezone' => ':attribute には有効なタイムゾーンを指定してください。', + + 'url' => ':attribute の形式が正しくありません。', /* |-------------------------------------------------------------------------- @@ -101,6 +96,6 @@ // Internal validation logic for Panel 'internal' => [ 'variable_value' => ':env 変数', - 'invalid_password' => '入力されたパスワードは無効です。', + 'invalid_password' => 'このアカウントのパスワードが無効です。', ], ]; diff --git a/lang/ko/activity.php b/lang/ko/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/ko/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/ko/admin/apikey.php b/lang/ko/admin/apikey.php new file mode 100644 index 0000000000..35f8d341ae --- /dev/null +++ b/lang/ko/admin/apikey.php @@ -0,0 +1,27 @@ + '어플리케이션 API 키', + 'empty' => 'API 키가 없습니다.', + 'whitelist' => '허용된 IPv4 주소', + 'whitelist_help' => 'API 키는 특정 IPv4 주소에서만 작동하도록 제한할 수 있습니다. 각 주소를 새 줄에 입력하십시오.', + 'whitelist_placeholder' => '예: 127.0.0.1 또는 192.168.1.1', + 'description' => '설명', + 'description_help' => '이 키의 용도에 대한 간략한 설명입니다.', + 'nav_title' => 'API 키', + 'model_label' => '어플리케이션 API 키', + 'model_label_plural' => '어플리케이션 API 키', + 'table' => [ + 'key' => '키', + 'description' => '설명', + 'last_used' => '마지막 사용', + 'created' => '생성됨', + 'created_by' => '생성자', + 'never_used' => '사용된 적 없음', + ], + 'permissions' => [ + 'none' => '없음', + 'read' => '읽기', + 'read_write' => '읽기 및 쓰기', + ], +]; diff --git a/lang/ko/admin/databasehost.php b/lang/ko/admin/databasehost.php new file mode 100644 index 0000000000..8e132b296a --- /dev/null +++ b/lang/ko/admin/databasehost.php @@ -0,0 +1,74 @@ + '데이터베이스 호스트', + 'model_label' => '데이터베이스 호스트', + 'model_label_plural' => '데이터베이스 호스트', + 'table' => [ + 'database' => '데이터베이스', + 'name' => '이름', + 'host' => '호스트', + 'port' => '포트', + 'name_helper' => '이름을 비워두면 무작위 이름이 자동 생성됩니다.', + 'username' => '사용자 이름', + 'password' => '비밀번호', + 'remote' => '연결 허용', + 'remote_helper' => '연결을 허용해야 하는 위치입니다. 비워두면 모든 위치에서의 연결이 허용됩니다.', + 'max_connections' => '최대 연결 수', + 'created_at' => '생성됨', + 'connection_string' => 'JDBC 연결 문자열', + ], + 'error' => '호스트에 연결하는 중 오류 발생', + 'host' => '호스트', + 'host_help' => '이 패널에서 이 MySQL 호스트에 연결하여 새 데이터베이스를 생성할 때 사용해야 하는 IP 주소 또는 도메인 이름입니다.', + 'port' => '포트', + 'port_help' => '이 호스트에서 MySQL이 실행 중인 포트입니다.', + 'max_database' => '최대 데이터베이스', + 'max_databases_help' => '이 호스트에서 생성할 수 있는 최대 데이터베이스 수입니다. 한도가 초과되면 이 호스트에서 새 데이터베이스를 생성할 수 없습니다. 비워두면 무제한입니다.', + 'display_name' => '표시 이름', + 'display_name_help' => '최종 사용자에게 표시되어야 하는 IP 주소 또는 도메인 이름입니다.', + 'username' => '사용자 이름', + 'username_help' => '시스템에서 새 사용자 및 데이터베이스를 생성할 수 있는 충분한 권한이 있는 계정의 사용자 이름입니다.', + 'password' => '비밀번호', + 'password_help' => '데이터베이스 사용자의 비밀번호입니다.', + 'linked_nodes' => '연결된 노드', + 'linked_nodes_help' => '이 설정은 선택한 노드의 서버에 데이터베이스를 추가할 때만 이 데이터베이스 호스트에 기본값으로 설정됩니다.', + 'connection_error' => '데이터베이스 호스트에 연결하는 중 오류 발생', + 'no_database_hosts' => '데이터베이스 호스트가 없습니다.', + 'no_nodes' => '노드가 없습니다.', + 'delete_help' => '데이터베이스 호스트에 데이터베이스가 있습니다.', + 'unlimited' => '무제한', + 'anywhere' => '어디서나', + + 'rotate' => '비밀번호 변경', + 'rotate_password' => '비밀번호 변경', + 'rotated' => '비밀번호가 변경되었습니다.', + 'rotate_error' => '비밀번호 변경 실패', + 'databases' => '데이터베이스', + + 'setup' => [ + 'preparations' => '준비 작업', + 'database_setup' => '데이터베이스 설정', + 'panel_setup' => '패널 설정', + + 'note' => '현재 데이터베이스 호스트에 대해 MySQL/ MariaDB 데이터베이스만 지원됩니다!', + 'different_server' => '패널과 데이터베이스가 다른 서버에 있습니까?', + + 'database_user' => '데이터베이스 사용자', + 'cli_login' => 'mysql -u root -p를 사용하여 mysql cli에 접속하세요.', + 'command_create_user' => '사용자 생성 명령', + 'command_assign_permissions' => '권한 할당 명령', + 'cli_exit' => 'mysql cli를 종료하려면 exit를 실행하세요.', + 'external_access' => '외부 접근', + 'allow_external_access' => ' +

서버가 연결할 수 있도록 이 MySQL 인스턴스에 대한 외부 접근을 허용해야 할 수 있습니다.

+
+

이를 위해 my.cnf를 열어야 합니다. 이 파일의 위치는 OS 및 MySQL 설치 방법에 따라 다릅니다. find /etc -iname my.cnf를 입력하여 찾을 수 있습니다.

+
+

my.cnf를 열고 아래 텍스트를 파일 하단에 추가한 후 저장하세요:
+ [mysqld]
bind-address=0.0.0.0

+
+

변경 사항을 적용하려면 MySQL/ MariaDB를 재시작하세요. 이렇게 하면 기본적으로 localhost의 요청만 수락하는 기본 MySQL 구성이 재정의됩니다. 이를 업데이트하면 모든 인터페이스에서의 연결, 즉 외부 연결이 허용됩니다. 방화벽에서 MySQL 포트(기본값 3306)를 허용해야 합니다.

+ ', + ], +]; diff --git a/lang/ko/admin/eggs.php b/lang/ko/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/ko/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/ko/admin/health.php b/lang/ko/admin/health.php new file mode 100644 index 0000000000..e14e76c465 --- /dev/null +++ b/lang/ko/admin/health.php @@ -0,0 +1,60 @@ + '상태', + 'results_refreshed' => '상태 검사 결과가 업데이트되었습니다.', + 'checked' => ':time의 검사 결과', + 'refresh' => '새로 고침', + 'results' => [ + 'cache' => [ + 'label' => '캐시', + 'ok' => '완료', + 'failed_retrieve' => '애플리케이션 캐시 값을 설정하거나 검색할 수 없습니다.', + 'failed' => '애플리케이션 캐시에서 예외가 발생했습니다: :error', + ], + 'database' => [ + 'label' => '데이터베이스', + 'ok' => '완료', + 'failed' => '데이터베이스에 연결할 수 없습니다: :error', + ], + 'debugmode' => [ + 'label' => '디버그 모드', + 'ok' => '디버그 모드가 비활성화되었습니다.', + 'failed' => '디버그 모드는 :expected로 설정되어야 했지만 실제로는 :actual로 설정되었습니다.', + ], + 'environment' => [ + 'label' => '환경', + 'ok' => 'Ok, :actual로 설정됨', + 'failed' => '환경이 :actual로 설정되어 있으며, :expected로 설정되어야 했습니다.', + ], + 'nodeversions' => [ + 'label' => '노드 버전', + 'ok' => '노드가 최신 상태입니다', + 'failed' => ':outdated/:all 노드가 구식입니다', + 'no_nodes_created' => '노드가 생성되지 않았습니다', + 'no_nodes' => '노드가 없습니다', + 'all_up_to_date' => '모두 최신 상태입니다', + 'outdated' => ':outdated/:all 구식', + ], + 'panelversion' => [ + 'label' => '패널 버전', + 'ok' => '패널이 최신 상태입니다', + 'failed' => '설치된 버전은 :currentVersion이지만 최신 버전은 :latestVersion입니다', + 'up_to_date' => '최신 상태', + 'outdated' => '구식', + ], + 'schedule' => [ + 'label' => '일정', + 'ok' => '완료', + 'failed_last_ran' => '일정의 마지막 실행은 :time 분 이상 지났습니다', + 'failed_not_ran' => '일정이 아직 실행되지 않았습니다.', + ], + 'useddiskspace' => [ + 'label' => '디스크 공간', + ], + ], + 'checks' => [ + 'successful' => '성공', + 'failed' => '실패 :checks', + ], +]; diff --git a/lang/ko/admin/mount.php b/lang/ko/admin/mount.php new file mode 100644 index 0000000000..b36fad7eca --- /dev/null +++ b/lang/ko/admin/mount.php @@ -0,0 +1,30 @@ + '마운트', + 'model_label' => '마운트', + 'model_label_plural' => '마운트', + 'name' => '이름', + 'name_help' => '이 마운트를 다른 마운트와 구별하는 데 사용되는 고유한 이름입니다.', + 'source' => '소스', + 'source_help' => '컨테이너에 마운트할 호스트 시스템의 파일 경로입니다.', + 'target' => '대상', + 'target_help' => '컨테이너 내부에서 마운트에 액세스할 수 있는 위치입니다.', + 'read_only' => '읽기 전용?', + 'read_only_help' => '컨테이너 내부에서 마운트가 읽기 전용입니까?', + 'description' => '설명', + 'description_help' => '이 마운트에 대한 자세한 설명', + 'no_mounts' => '마운트 없음', + 'eggs' => 'Eggs', + 'nodes' => '노드', + 'toggles' => [ + 'writable' => '쓰기 가능', + 'read_only' => '읽기 전용', + ], + 'table' => [ + 'name' => '이름', + 'all_eggs' => '모든 Egg', + 'all_nodes' => '모든 노드', + 'read_only' => '읽기 전용', + ], +]; diff --git a/lang/ko/admin/node.php b/lang/ko/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/ko/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/ko/admin/role.php b/lang/ko/admin/role.php new file mode 100644 index 0000000000..5413ad9933 --- /dev/null +++ b/lang/ko/admin/role.php @@ -0,0 +1,17 @@ + '역할', + 'model_label' => '역할', + 'model_label_plural' => '역할', + 'no_roles' => '역할 없음', + 'name' => '역할 이름', + 'permissions' => '권한', + 'in_use' => '사용 중', + 'all' => '모두', + 'root_admin' => '이 역할은 모든 권한을 가지고 있습니다.', + 'root_admin_delete' => '루트 관리자를 삭제할 수 없습니다.', + 'users' => '사용자', + 'nodes' => '노드', + 'nodes_hint' => '모든 노드에 대한 액세스를 허용하려면 비워 두십시오.', +]; diff --git a/lang/ko/admin/server.php b/lang/ko/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/ko/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/ko/admin/user.php b/lang/ko/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/ko/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/ko/admin/webhook.php b/lang/ko/admin/webhook.php new file mode 100644 index 0000000000..ccb653aa36 --- /dev/null +++ b/lang/ko/admin/webhook.php @@ -0,0 +1,63 @@ + '웹훅', + 'model_label' => '웹훅', + 'model_label_plural' => '웹훅', + 'endpoint' => '엔드포인트', + 'description' => '설명', + 'no_webhooks' => 'Webhook 없음', + 'help' => '도움말', + 'help_text' => '변수 이름을 {{ }} 사이에 래핑해야 합니다. 예를 들어 API에서 이름을 가져오려면 {{name}}을 사용할 수 있습니다.', + 'test_now' => '지금 테스트', + 'test_now_help' => '`created: Server` 이벤트를 발생시킵니다', + 'table' => [ + 'description' => '설명', + 'endpoint' => '엔드포인트', + ], + 'headers' => '헤더', + 'events' => '이벤트', + 'regular' => '일반', + 'reset_headers' => '헤더 재설정', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => '프로필', + 'message' => '메시지', + 'username' => '사용자 이름', + 'avatar_url' => '아바타 URL', + 'forum_thread' => '포럼 스레드 이름', + 'supress_embeds' => '임베드 숨기기', + 'supress_embeds_text' => '이 메시지를 직렬화할 때 임베드를 포함하지 않습니다', + 'supress_notifications' => '알림 숨기기', + 'supress_notifications_text' => '이 메시지는 푸시 및 데스크톱 알림을 트리거하지 않습니다', + ], + 'discord_embed' => [ + 'add_embed' => '임베드 추가', + 'flags' => '플래그', + 'thumbnail' => '썸네일 URL', + 'embeds' => '임베드', + 'thread_name' => '포럼 스레드 이름', + 'allowed_mentions' => '허용된 멘션', + 'roles' => '역할', + 'users' => '사용자', + 'everyone' => '@everyone & @here', + 'author' => '작성자', + 'author_url' => '작성자 URL', + 'author_icon_url' => '작성자 아이콘 URL', + 'body' => '본문', + 'title' => '제목', + 'color' => '임베드 색상', + 'url' => 'URL', + 'images' => '이미지', + 'image_url' => '이미지 URL', + 'image_thumbnail' => '썸네일 URL', + 'footer' => '푸터', + 'has_timestamp' => '타임스탬프 포함', + 'footer_icon_url' => '푸터 아이콘 URL', + 'add_field' => '필드 추가', + 'fields' => '필드', + 'field_name' => '필드 이름', + 'field_value' => '필드 값', + 'inline_field' => '인라인 필드', + ], +]; diff --git a/lang/ko/auth.php b/lang/ko/auth.php index 2a3a452682..e5976e611b 100644 --- a/lang/ko/auth.php +++ b/lang/ko/auth.php @@ -1,27 +1,24 @@ 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], + 'failed' => '이 자격 증명들은 유효하지 않습니다.', + 'failed-two-factor' => '잘못된 2단계 인증 코드입니다.', + 'two-factor-code' => '2단계 인증 코드', + 'two-factor-hint' => '장치에 대한 액세스를 잃어버린 경우 백업 코드를 사용할 수 있습니다.', + 'password' => '제공된 비밀번호가 올바르지 않습니다.', + 'throttle' => '로그인 시도가 너무 많습니다. :seconds 초 후에 다시 시도하십시오.', + '2fa_must_be_enabled' => '관리자가 패널을 사용하기 위해 계정에 2단계 인증을 활성화해야 한다고 요구했습니다.', - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', ]; diff --git a/lang/ko/command/messages.php b/lang/ko/command/messages.php index 4e640b3fa5..406a94e22d 100644 --- a/lang/ko/command/messages.php +++ b/lang/ko/command/messages.php @@ -2,58 +2,53 @@ return [ 'user' => [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', + 'search_users' => '사용자 이름, 사용자 ID 또는 이메일 주소를 입력하세요', + 'select_search_user' => '삭제할 사용자 ID (재검색하려면 \'0\' 입력)', + 'deleted' => '패널에서 사용자가 성공적으로 삭제되었습니다.', + 'confirm_delete' => '패널에서 이 사용자를 삭제하시겠습니까?', + 'no_users_found' => '제공된 검색어에 대한 사용자를 찾을 수 없습니다.', + 'multiple_found' => '제공된 사용자에 대해 여러 계정이 발견되었습니다. --no-interaction 플래그로 인해 사용자를 삭제할 수 없습니다.', + 'ask_admin' => '이 사용자는 관리자입니까?', + 'ask_email' => '이메일 주소', + 'ask_username' => '사용자 이름', + 'ask_password' => '비밀번호', + 'ask_password_tip' => '사용자에게 이메일로 전송되는 무작위 비밀번호로 계정을 생성하려면 이 명령을 다시 실행(CTRL+C)하고 `--no-password` 플래그를 전달하세요.', + 'ask_password_help' => '비밀번호는 최소 8자 이상이어야 하며 대문자와 숫자를 하나 이상 포함해야 합니다.', + '2fa_help_text' => '이 명령은 활성화된 경우 사용자 계정의 2단계 인증을 비활성화합니다. 사용자가 계정에서 잠긴 경우에만 계정 복구 명령으로 사용해야 합니다. 이것이 원하는 작업이 아닌 경우 CTRL+C를 눌러 프로세스를 종료하세요.', + '2fa_disabled' => ':email에 대한 2단계 인증이 비활성화되었습니다.', ], 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', + 'output_line' => '`:schedule` (:id)의 첫 번째 작업에 대한 작업을 디스패치합니다.', ], 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', + 'deleting_service_backup' => '서비스 백업 파일 :file을 삭제합니다.', ], 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', + 'rebuild_failed' => '노드 ":node"의 ":name" (#:id)에 대한 재구축 요청이 오류와 함께 실패했습니다: :message', 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', + 'failed' => '노드 ":node"의 ":name" (#:id)에 대한 재설치 요청이 오류와 함께 실패했습니다: :message', + 'confirm' => '서버 그룹에 대해 재설치를 수행하려고 합니다. 계속하시겠습니까?', ], 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', + 'confirm' => ':count개의 서버에 대해 :action을 수행하려고 합니다. 계속하시겠습니까?', + 'action_failed' => '노드 ":node"의 ":name" (#:id)에 대한 전원 작업 요청이 오류와 함께 실패했습니다: :message', ], ], 'environment' => [ 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', + 'ask_smtp_host' => 'SMTP 호스트 (예: smtp.gmail.com)', + 'ask_smtp_port' => 'SMTP 포트', + 'ask_smtp_username' => 'SMTP 사용자 이름', + 'ask_smtp_password' => 'SMTP 비밀번호', + 'ask_mailgun_domain' => 'Mailgun 도메인', + 'ask_mailgun_endpoint' => 'Mailgun 엔드포인트', + 'ask_mailgun_secret' => 'Mailgun 시크릿', + 'ask_mandrill_secret' => 'Mandrill 시크릿', + 'ask_postmark_username' => 'Postmark API 키', + 'ask_driver' => '이메일 전송에 사용할 드라이버는 무엇입니까?', + 'ask_mail_from' => '이메일이 발신될 이메일 주소', + 'ask_mail_name' => '이메일에 표시될 이름', + 'ask_encryption' => '사용할 암호화 방법', ], ], ]; diff --git a/lang/ko/commands.php b/lang/ko/commands.php new file mode 100644 index 0000000000..558d804289 --- /dev/null +++ b/lang/ko/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => '이 패널에서 내보낸 egg의 발신자 이메일 주소를 입력하세요. 유효한 이메일 주소여야 합니다.', + 'url' => '애플리케이션 URL은 SSL 사용 여부에 따라 https:// 또는 http://로 시작해야 합니다. 스키마를 포함하지 않으면 이메일 및 기타 콘텐츠가 잘못된 위치로 링크됩니다.', + 'timezone' => '시간대는 PHP에서 지원하는 시간대 중 하나와 일치해야 합니다. 확실하지 않은 경우 https://php.net/manual/en/timezones.php를 참조하세요.', + ], + 'redis' => [ + 'note' => '하나 이상의 옵션에 대해 Redis 드라이버를 선택했습니다. 아래에 유효한 연결 정보를 제공하세요. 대부분의 경우 설정을 수정하지 않았다면 제공된 기본값을 사용할 수 있습니다.', + 'comment' => '기본적으로 Redis 서버 인스턴스는 사용자 이름이 default이고 비밀번호가 없습니다. 로컬에서 실행되며 외부에서 접근할 수 없기 때문입니다. 이 경우 값을 입력하지 않고 엔터를 누르세요.', + 'confirm' => 'Redis에 대한 :field가 이미 정의된 것 같습니다. 변경하시겠습니까?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => '데이터베이스 호스트로 "localhost"를 사용하지 않는 것이 좋습니다. 소켓 연결 문제가 자주 발생하기 때문입니다. 로컬 연결을 사용하려면 "127.0.0.1"을 사용해야 합니다.', + 'DB_USERNAME_note' => 'MySQL 연결에 root 계정을 사용하는 것은 권장되지 않을 뿐만 아니라 이 애플리케이션에서 허용되지 않습니다. 이 소프트웨어를 위한 MySQL 사용자를 생성해야 합니다.', + 'DB_PASSWORD_note' => 'MySQL 연결 비밀번호가 이미 정의된 것 같습니다. 변경하시겠습니까?', + 'DB_error_2' => '연결 자격 증명이 저장되지 않았습니다. 계속하기 전에 유효한 연결 정보를 제공해야 합니다.', + 'go_back' => '돌아가서 다시 시도', + ], + 'make_node' => [ + 'name' => '이 노드를 다른 노드와 구별하는 데 사용할 짧은 식별자를 입력하세요', + 'description' => '노드를 식별하기 위한 설명을 입력하세요', + 'scheme' => 'SSL의 경우 https를, 비-SSL 연결의 경우 http를 입력하세요', + 'fqdn' => '데몬에 연결하는 데 사용할 도메인 이름(예: node.example.com)을 입력하세요. IP 주소는 이 노드에 SSL을 사용하지 않는 경우에만 사용할 수 있습니다', + 'public' => '이 노드를 공개로 설정하시겠습니까? 참고로 노드를 비공개로 설정하면 이 노드에 자동 배포할 수 없습니다.', + 'behind_proxy' => 'FQDN이 프록시 뒤에 있습니까?', + 'maintenance_mode' => '유지 관리 모드를 활성화하시겠습니까?', + 'memory' => '최대 메모리 양을 입력하세요', + 'memory_overallocate' => '초과 할당할 메모리 양을 입력하세요. -1은 확인을 비활성화하고 0은 새 서버 생성을 방지합니다', + 'disk' => '최대 디스크 공간을 입력하세요', + 'disk_overallocate' => '초과 할당할 디스크 양을 입력하세요. -1은 확인을 비활성화하고 0은 새 서버 생성을 방지합니다', + 'cpu' => '최대 CPU 양을 입력하세요', + 'cpu_overallocate' => '초과 할당할 CPU 양을 입력하세요. -1은 확인을 비활성화하고 0은 새 서버 생성을 방지합니다', + 'upload_size' => "'최대 파일 업로드 크기를 입력하세요", + 'daemonListen' => '데몬 수신 포트를 입력하세요', + 'daemonConnect' => '데몬 연결 포트를 입력하세요 (수신 포트와 동일할 수 있음)', + 'daemonSFTP' => '데몬 SFTP 수신 포트를 입력하세요', + 'daemonSFTPAlias' => '데몬 SFTP 별칭을 입력하세요 (비워둘 수 있음)', + 'daemonBase' => '기본 폴더를 입력하세요', + 'success' => ':name 이름으로 새 노드를 성공적으로 생성했으며 ID는 :id입니다', + ], + 'node_config' => [ + 'error_not_exist' => '선택한 노드가 존재하지 않습니다.', + 'error_invalid_format' => '잘못된 형식이 지정되었습니다. 유효한 옵션은 yaml 및 json입니다.', + ], + 'key_generate' => [ + 'error_already_exist' => '이미 애플리케이션 암호화 키를 구성한 것 같습니다. 이 프로세스를 계속하면 해당 키를 덮어쓰고 기존 암호화된 데이터에 대한 데이터 손상이 발생합니다. 무엇을 하고 있는지 알지 못하는 한 계속하지 마십시오.', + 'understand' => '이 명령을 수행한 결과를 이해하며 암호화된 데이터 손실에 대한 모든 책임을 받아들입니다.', + 'continue' => '계속하시겠습니까? 애플리케이션 암호화 키를 변경하면 데이터 손실이 발생합니다.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => '실행해야 할 서버의 예약된 작업이 없습니다.', + 'error_message' => '일정 처리 중 오류가 발생했습니다: :schedules', + ], + ], +]; diff --git a/lang/ko/dashboard/account.php b/lang/ko/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/ko/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/ko/dashboard/index.php b/lang/ko/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/ko/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/ko/exceptions.php b/lang/ko/exceptions.php index 3977c87c24..bb52baa640 100644 --- a/lang/ko/exceptions.php +++ b/lang/ko/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => '데몬과 통신을 시도하는 중 HTTP/:code 응답 코드가 발생하여 예외가 발생했습니다. 이 예외는 기록되었습니다.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => '노드를 삭제하려면 연결된 서버가 없어야 합니다.', + 'error_connecting' => ':node에 연결하는 중 오류 발생', + 'daemon_off_config_updated' => '데몬 구성이 업데이트되었습니다. 하지만 데몬의 구성 파일을 자동으로 업데이트하는 중 오류가 발생했습니다. 이러한 변경 사항을 적용하려면 데몬의 구성 파일(config.yml)을 수동으로 업데이트해야 합니다.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => '현재 이 할당에 서버가 할당되어 있습니다. 할당은 현재 할당된 서버가 없는 경우에만 삭제할 수 있습니다.', + 'too_many_ports' => '한 번에 단일 범위에서 1000개 이상의 포트를 추가하는 것은 지원되지 않습니다.', + 'invalid_mapping' => ':port에 제공된 매핑이 유효하지 않아 처리할 수 없습니다.', + 'cidr_out_of_range' => 'CIDR 표기법은 /25에서 /32 사이의 마스크만 허용합니다.', + 'port_out_of_range' => '할당의 포트는 1024 이상 65535 이하여야 합니다.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => '활성 서버가 연결된 Egg는 패널에서 삭제할 수 없습니다.', + 'invalid_copy_id' => '스크립트를 복사하기 위해 선택한 Egg가 존재하지 않거나 스크립트 자체를 복사하고 있습니다.', + 'has_children' => '이 Egg는 하나 이상의 다른 Egg의 부모입니다. 이 Egg를 삭제하기 전에 해당 Egg를 삭제하세요.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => '환경 변수 :name은 이 Egg에 고유해야 합니다.', + 'reserved_name' => '환경 변수 :name은 보호되어 있으며 변수에 할당할 수 없습니다.', + 'bad_validation_rule' => '유효성 검사 규칙 ":rule"은 이 애플리케이션에 유효한 규칙이 아닙니다.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'JSON 파일을 구문 분석하는 중 오류가 발생했습니다: :error.', + 'file_error' => '제공된 JSON 파일이 유효하지 않습니다.', + 'invalid_json_provided' => '제공된 JSON 파일이 인식할 수 있는 형식이 아닙니다.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => '자신의 하위 사용자 계정을 편집할 수 없습니다.', + 'user_is_owner' => '서버 소유자를 이 서버의 하위 사용자로 추가할 수 없습니다.', + 'subuser_exists' => '해당 이메일 주소를 가진 사용자가 이미 이 서버의 하위 사용자로 할당되어 있습니다.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => '활성 데이터베이스가 연결된 데이터베이스 호스트 서버를 삭제할 수 없습니다.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => '체인 작업의 최대 간격 시간은 15분입니다.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => '활성 노드가 연결된 위치를 삭제할 수 없습니다.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => '자신의 사용자 계정을 삭제할 수 없습니다.', + 'has_servers' => '계정에 활성 서버가 연결된 사용자를 삭제할 수 없습니다. 계속하기 전에 해당 서버를 삭제하세요.', + 'node_revocation_failed' => '노드 #:node에서 키 해지에 실패했습니다. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => '자동 배포를 위해 지정된 요구 사항을 충족하는 노드를 찾을 수 없습니다.', + 'no_viable_allocations' => '자동 배포 요구 사항을 충족하는 할당을 찾을 수 없습니다.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => '요청한 리소스가 이 서버에 존재하지 않습니다.', + ], + 'mount' => [ + 'servers_attached' => '마운트를 삭제하려면 연결된 서버가 없어야 합니다.', + ], + 'server' => [ + 'marked_as_failed' => '이 서버는 아직 설치 프로세스를 완료하지 않았습니다. 나중에 다시 시도하세요.', ], ]; diff --git a/lang/ko/notifications.php b/lang/ko/notifications.php new file mode 100644 index 0000000000..74c66c15c7 --- /dev/null +++ b/lang/ko/notifications.php @@ -0,0 +1,18 @@ + '서버 열기', + 'installation_completed' => '서버 설치 완료', + 'installation_failed' => '서버 설치 실패', + 'reinstallation_completed' => '서버 재설치 완료', + 'reinstallation_failed' => '서버 재설치 실패', + 'failed' => '실패', + 'user_added' => [ + 'title' => '서버에 추가됨', + 'body' => ':server에 하위 사용자로 추가되었습니다.', + ], + 'user_removed' => [ + 'title' => '서버에서 제거됨', + 'body' => ':server에서 하위 사용자로부터 제거되었습니다.', + ], +]; diff --git a/lang/ko/pagination.php b/lang/ko/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/ko/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/ko/passwords.php b/lang/ko/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/ko/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/ko/search.php b/lang/ko/search.php new file mode 100644 index 0000000000..3381f718de --- /dev/null +++ b/lang/ko/search.php @@ -0,0 +1,9 @@ + '검색을 시작하려면 최소 3글자 이상 입력하세요.', + 'term' => [ + 'label' => '검색어', + 'description' => '검색을 시작하려면 서버 이름, UUID 또는 할당된 포트를 입력하세요.', + ], +]; diff --git a/lang/ko/server/activity.php b/lang/ko/server/activity.php new file mode 100644 index 0000000000..8f954b8a6c --- /dev/null +++ b/lang/ko/server/activity.php @@ -0,0 +1,11 @@ + '활동 로그', + 'event' => '이벤트', + 'user' => '사용자', + 'deleted_user' => '삭제된 사용자', + 'system' => '시스템', + 'timestamp' => '타임스탬프', + 'metadata' => '메타데이터', +]; diff --git a/lang/ko/server/backup.php b/lang/ko/server/backup.php new file mode 100644 index 0000000000..3384feae0c --- /dev/null +++ b/lang/ko/server/backup.php @@ -0,0 +1,55 @@ + '백업', + 'empty' => '백업 없음', + 'size' => '크기', + 'created_at' => '생성 시간', + 'status' => '상태', + 'is_locked' => '잠금 상태', + 'backup_status' => [ + 'in_progress' => '진행 중', + 'successful' => '성공', + 'failed' => '실패', + ], + 'actions' => [ + 'create' => [ + 'title' => '백업 생성', + 'limit' => '백업 제한에 도달했습니다', + 'created' => ':name 생성됨', + 'notification_success' => '백업이 성공적으로 생성되었습니다', + 'notification_fail' => '백업 생성 실패', + 'name' => '이름', + 'ignored' => '제외할 파일 및 디렉토리', + 'locked' => '잠금?', + 'lock_helper' => '명시적으로 잠금을 해제할 때까지 이 백업이 삭제되지 않도록 방지합니다.', + ], + 'lock' => [ + 'lock' => '잠금', + 'unlock' => '잠금 해제', + ], + 'download' => '다운로드', + 'rename' => [ + 'title' => '이름 변경', + 'new_name' => '백업 이름', + 'notification_success' => '백업 이름이 성공적으로 변경되었습니다', + ], + 'restore' => [ + 'title' => '복원', + 'helper' => '서버가 중지됩니다. 이 프로세스가 완료될 때까지 전원 상태를 제어하거나 파일 관리자에 액세스하거나 추가 백업을 생성할 수 없습니다.', + 'delete_all' => '백업을 복원하기 전에 모든 파일을 삭제하시겠습니까?', + 'notification_started' => '백업 복원 중', + 'notification_success' => '백업이 성공적으로 복원되었습니다', + 'notification_fail' => '백업 복원 실패', + 'notification_fail_body_1' => '이 서버는 현재 백업을 복원할 수 있는 상태가 아닙니다.', + 'notification_fail_body_2' => '이 백업은 현재 복원할 수 없습니다: 완료되지 않았거나 실패했습니다.', + ], + 'delete' => [ + 'title' => '백업 삭제', + 'description' => ':backup을 삭제하시겠습니까?', + 'notification_success' => '백업 삭제됨', + 'notification_fail' => '백업을 삭제할 수 없습니다', + 'notification_fail_body' => '노드에 연결하지 못했습니다. 다시 시도하세요.', + ], + ], +]; diff --git a/lang/ko/server/console.php b/lang/ko/server/console.php new file mode 100644 index 0000000000..06827d635d --- /dev/null +++ b/lang/ko/server/console.php @@ -0,0 +1,43 @@ + '콘솔', + 'command' => '명령어를 입력하세요...', + 'command_blocked' => '서버 오프라인...', + 'command_blocked_title' => '서버가 오프라인일 때 명령어를 보낼 수 없습니다', + 'open_in_admin' => '관리자 페이지에서 열기', + 'power_actions' => [ + 'start' => '시작', + 'stop' => '중지', + 'restart' => '재시작', + 'kill' => '강제 종료', + 'kill_tooltip' => '데이터 손상 및/또는 데이터 손실이 발생할 수 있습니다!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => '메모리', + 'network' => '네트워크', + 'disk' => '디스크', + 'name' => '이름', + 'status' => '상태', + 'address' => '주소', + 'unavailable' => '사용 불가', + ], + 'status' => [ + 'created' => '생성됨', + 'starting' => '시작 중', + 'running' => '실행 중', + 'restarting' => '재시작 중', + 'exited' => '종료됨', + 'paused' => '일시 중지됨', + 'dead' => '중단됨', + 'removing' => '제거 중', + 'stopping' => '중지 중', + 'offline' => '오프라인', + 'missing' => '누락됨', + ], + 'websocket_error' => [ + 'title' => 'WebSocket에 연결할 수 없습니다!', + 'body' => '자세한 내용은 브라우저 콘솔을 확인하세요.', + ], +]; diff --git a/lang/ko/server/dashboard.php b/lang/ko/server/dashboard.php new file mode 100644 index 0000000000..37044e9034 --- /dev/null +++ b/lang/ko/server/dashboard.php @@ -0,0 +1,28 @@ + '서버', + 'list' => '서버 목록', + 'tabs' => [ + 'my' => '내 서버', + 'other' => '다른 사용자의 서버', + 'all' => '모든 서버', + ], + 'empty_own' => '소유한 서버가 없습니다!', + 'empty_other' => '액세스 권한이 있는 서버가 없습니다!', + + 'status' => '상태', + 'server' => '서버', + 'resources' => '리소스', + 'usage_limit' => '사용 제한: :resource', + + 'cpu' => 'CPU', + 'memory' => '메모리', + 'disk' => '디스크', + 'network' => '네트워크', + 'none' => '없음', + 'loading' => '로딩 중...', + + 'power_actions' => '전원 작업', + 'power_action_sent' => ':action이(가) :name에 전송되었습니다', +]; diff --git a/lang/ko/server/database.php b/lang/ko/server/database.php new file mode 100644 index 0000000000..c0dd798d25 --- /dev/null +++ b/lang/ko/server/database.php @@ -0,0 +1,26 @@ + '데이터베이스', + 'empty' => '데이터베이스 없음', + 'create_database' => '데이터베이스 생성', + 'limit' => '데이터베이스 제한에 도달했습니다', + 'viewing' => '보기: :database', + 'host' => '호스트', + 'database' => '데이터베이스', + 'username' => '사용자 이름', + 'password' => '비밀번호', + 'remote' => '원격', + 'created_at' => '생성 시간', + 'name' => '데이터베이스 이름', + 'name_hint' => '비워두면 무작위 이름이 자동으로 생성됩니다', + 'connections_from' => '연결 출처', + 'max_connections' => '최대 연결 수', + 'database_host' => '데이터베이스 호스트', + 'database_host_select' => '데이터베이스 호스트 선택', + 'jdbc' => 'JDBC 연결 문자열', + 'create_notification' => ':database 생성됨', + 'create_notification_fail' => ':database 생성 실패', + 'delete_notification' => ':database 삭제됨', + 'delete_notification_fail' => ':database 삭제 실패', +]; diff --git a/lang/ko/server/user.php b/lang/ko/server/user.php new file mode 100644 index 0000000000..af1c9ddc9c --- /dev/null +++ b/lang/ko/server/user.php @@ -0,0 +1,73 @@ + '사용자', + 'username' => '사용자 이름', + 'email' => '이메일', + 'assign_all' => '모두 할당', + 'invite_user' => '사용자 초대', + 'action' => '초대', + 'remove' => '사용자 제거', + 'edit' => '사용자 편집', + 'editing' => ':user 편집 중', + 'delete' => '사용자 삭제', + 'notification_add' => '사용자가 초대되었습니다!', + 'notification_edit' => '사용자가 업데이트되었습니다!', + 'notification_delete' => '사용자가 삭제되었습니다!', + 'notification_failed' => '사용자 초대 실패!', + 'permissions' => [ + 'title' => '권한', + 'activity_desc' => '서버 활동 로그에 대한 사용자의 액세스를 제어하는 권한입니다.', + 'startup_desc' => '이 서버의 시작 매개변수를 볼 수 있는 사용자의 권한을 제어합니다.', + 'settings_desc' => '이 서버의 설정을 수정할 수 있는 사용자의 권한을 제어합니다.', + 'control_desc' => '서버의 전원 상태를 제어하거나 명령을 보낼 수 있는 사용자의 권한을 제어합니다.', + 'user_desc' => '서버의 다른 하위 사용자를 관리할 수 있는 권한입니다. 자신의 계정을 편집하거나 자신이 가지지 않은 권한을 할당할 수는 없습니다.', + 'file_desc' => '이 서버의 파일 시스템을 수정할 수 있는 사용자의 권한을 제어합니다.', + 'allocation_desc' => '이 서버의 포트 할당을 수정할 수 있는 사용자의 권한을 제어합니다.', + 'database_desc' => '이 서버의 데이터베이스 관리에 대한 사용자의 액세스를 제어하는 권한입니다.', + 'backup_desc' => '서버 백업을 생성하고 관리할 수 있는 사용자의 권한을 제어합니다.', + 'schedule_desc' => '이 서버의 스케줄 관리에 대한 사용자의 액세스를 제어하는 권한입니다.', + 'startup_read' => '서버의 시작 변수를 볼 수 있도록 허용합니다.', + 'startup_update' => '서버의 시작 변수를 수정할 수 있도록 허용합니다.', + 'startup_docker_image' => '서버를 실행할 때 사용하는 Docker 이미지를 수정할 수 있도록 허용합니다.', + 'settings_reinstall' => '이 서버의 재설치를 트리거할 수 있도록 허용합니다.', + 'settings_rename' => '이 서버의 이름을 변경할 수 있도록 허용합니다.', + 'settings_description' => '이 서버의 설명을 변경할 수 있도록 허용합니다.', + 'activity_read' => '서버의 활동 로그를 볼 수 있도록 허용합니다.', + 'websocket_connect' => '이 서버의 웹소켓에 액세스할 수 있도록 허용합니다.', + 'control_console' => '서버 콘솔에 데이터를 보낼 수 있도록 허용합니다.', + 'control_start' => '서버 인스턴스를 시작할 수 있도록 허용합니다.', + 'control_stop' => '서버 인스턴스를 중지할 수 있도록 허용합니다.', + 'control_restart' => '서버 인스턴스를 재시작할 수 있도록 허용합니다.', + 'control_kill' => '서버 인스턴스를 강제 종료할 수 있도록 허용합니다.', + 'user_create' => '서버에 대한 새 사용자 계정을 만들 수 있도록 허용합니다.', + 'user_read' => '이 서버와 연결된 사용자를 볼 수 있는 권한을 허용합니다.', + 'user_update' => '이 서버와 연결된 다른 사용자를 수정할 수 있도록 허용합니다.', + 'user_delete' => '이 서버와 연결된 다른 사용자를 삭제할 수 있도록 허용합니다.', + 'file_create' => '새 파일 및 디렉토리를 만들 수 있는 권한을 허용합니다.', + 'file_read' => '디렉토리의 내용을 볼 수 있지만 파일의 내용을 보거나 다운로드할 수는 없도록 허용합니다.', + 'file_read_content' => '지정된 파일의 내용을 볼 수 있도록 허용합니다. 사용자가 파일을 다운로드할 수도 있습니다.', + 'file_update' => '서버와 연결된 파일 및 폴더를 업데이트할 수 있도록 허용합니다.', + 'file_delete' => '파일 및 디렉토리를 삭제할 수 있도록 허용합니다.', + 'file_archive' => '파일 압축 파일을 만들고 기존 압축 파일을 압축 해제할 수 있도록 허용합니다.', + 'file_sftp' => 'SFTP 클라이언트를 사용하여 위의 파일 작업을 수행할 수 있도록 허용합니다.', + 'allocation_read' => '현재 이 서버에 할당된 모든 할당을 볼 수 있도록 허용합니다. 이 서버에 대한 모든 수준의 액세스 권한을 가진 사용자는 항상 기본 할당을 볼 수 있습니다.', + 'allocation_update' => '기본 서버 할당을 변경하고 각 할당에 노트를 첨부할 수 있도록 허용합니다.', + 'allocation_delete' => '서버에서 할당을 삭제할 수 있도록 허용합니다.', + 'allocation_create' => '서버에 추가 할당을 할당할 수 있도록 허용합니다.', + 'database_create' => '서버에 대한 새 데이터베이스를 만들 수 있는 권한을 허용합니다.', + 'database_read' => '서버 데이터베이스를 볼 수 있는 권한을 허용합니다.', + 'database_update' => '데이터베이스를 수정할 수 있는 권한을 허용합니다. 사용자에게 "비밀번호 보기" 권한도 없으면 비밀번호를 수정할 수 없습니다.', + 'database_delete' => '데이터베이스 인스턴스를 삭제할 수 있는 권한을 허용합니다.', + 'database_view_password' => '시스템에서 데이터베이스 비밀번호를 볼 수 있는 권한을 허용합니다.', + 'schedule_create' => '서버에 대한 새 스케줄을 만들 수 있도록 허용합니다.', + 'schedule_read' => '서버의 스케줄을 볼 수 있는 권한을 허용합니다.', + 'schedule_update' => '기존 서버 스케줄을 수정할 수 있는 권한을 허용합니다.', + 'schedule_delete' => '서버의 스케줄을 삭제할 수 있도록 허용합니다.', + 'backup_create' => '이 서버에 대한 새 백업을 만들 수 있도록 허용합니다.', + 'backup_read' => '이 서버에 존재하는 모든 백업을 볼 수 있도록 허용합니다.', + 'backup_delete' => '시스템에서 백업을 제거할 수 있도록 허용합니다.', + 'backup_download' => '서버의 백업을 다운로드할 수 있도록 허용합니다. 위험: 사용자가 백업의 서버에 대한 모든 파일에 액세스할 수 있습니다.', + 'backup_restore' => '서버의 백업을 복원할 수 있도록 허용합니다. 위험: 사용자가 프로세스에서 모든 서버 파일을 삭제할 수 있습니다.', + ], +]; diff --git a/lang/ko/server/users.php b/lang/ko/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/ko/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/ko/strings.php b/lang/ko/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/ko/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/ko/validation.php b/lang/ko/validation.php index 9cccf35080..c02db7de21 100644 --- a/lang/ko/validation.php +++ b/lang/ko/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => ':attribute을(를) 동의해야 합니다.', + 'active_url' => ':attribute은(는) 유효한 URL이 아닙니다.', + 'after' => ':attribute은(는) :date 이후의 날짜여야 합니다.', + 'after_or_equal' => ':attribute은(는) :date 이후 또는 같은 날짜여야 합니다.', + 'alpha' => ':attribute은(는) 문자만 포함할 수 있습니다.', + 'alpha_dash' => ':attribute은(는) 문자, 숫자 및 대시만 포함할 수 있습니다.', + 'alpha_num' => ':attribute은(는) 문자와 숫자만 포함할 수 있습니다.', + 'array' => ':attribute은(는) 배열이어야 합니다.', + 'before' => ':attribute은(는) :date 이전의 날짜여야 합니다.', + 'before_or_equal' => ':attribute은(는) :date 이전 또는 같은 날짜여야 합니다.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => ':attribute은(는) :min과(와) :max 사이여야 합니다.', + 'file' => ':attribute은(는) :min과(와) :max 킬로바이트 사이여야 합니다.', + 'string' => ':attribute은(는) :min과(와) :max 문자 사이여야 합니다.', + 'array' => ':attribute은(는) :min과(와) :max 항목을 포함해야 합니다.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => ':attribute 확인이 일치하지 않습니다.', + 'date' => ':attribute은(는) 유효한 날짜가 아닙니다.', + 'date_format' => ':attribute은(는) :format 형식과 일치하지 않습니다.', + 'different' => ':attribute과(와) :other은(는) 달라야 합니다.', + 'digits' => ':attribute은(는) :digits 자리 숫자여야 합니다.', + 'digits_between' => ':attribute은(는) :min과(와) :max 자리 숫자여야 합니다.', + 'dimensions' => ':attribute의 이미지 크기가 유효하지 않습니다.', + + 'email' => ':attribute은(는) 유효한 이메일 주소여야 합니다.', + + 'file' => ':attribute은(는) 파일이어야 합니다.', + 'filled' => ':attribute 필드는 필수입니다.', + 'image' => ':attribute은(는) 이미지여야 합니다.', + + 'in_array' => ':attribute 필드는 :other에 존재하지 않습니다.', + 'integer' => ':attribute은(는) 정수여야 합니다.', + 'ip' => ':attribute은(는) 유효한 IP 주소여야 합니다.', + 'json' => ':attribute은(는) 유효한 JSON 문자열이어야 합니다.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute은(는) :max보다 클 수 없습니다.', + 'file' => ':attribute은(는) :max 킬로바이트보다 클 수 없습니다.', + 'string' => ':attribute은(는) :max 문자보다 클 수 없습니다.', + 'array' => ':attribute은(는) :max 항목을 포함할 수 없습니다.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute은(는) 다음 유형의 파일이어야 합니다: :values.', + 'mimetypes' => ':attribute은(는) 다음 유형의 파일이어야 합니다: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute은(는) 최소 :min이어야 합니다.', + 'file' => ':attribute은(는) 최소 :min 킬로바이트이어야 합니다.', + 'string' => ':attribute은(는) 최소 :min 문자이어야 합니다.', + 'array' => ':attribute은(는) 최소 :min 항목을 포함해야 합니다.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute은(는) 숫자여야 합니다.', + + 'regex' => ':attribute 형식이 유효하지 않습니다.', + + 'required_with_all' => ':attribute 필드는 :values가 존재할 때 필수입니다.', + + 'same' => ':attribute과(와) :other은(는) 일치해야 합니다.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute은(는) :size이어야 합니다.', + 'file' => ':attribute은(는) :size 킬로바이트이어야 합니다.', + 'string' => ':attribute은(는) :size 문자이어야 합니다.', + 'array' => ':attribute은(는) :size 항목을 포함해야 합니다.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute은(는) 문자열이어야 합니다.', + 'timezone' => ':attribute은(는) 유효한 시간대이어야 합니다.', + + 'url' => ':attribute 형식이 유효하지 않습니다.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => ':env 변수', + 'invalid_password' => '제공된 비밀번호가 이 계정에 대해 유효하지 않습니다.', ], ]; diff --git a/lang/lt/activity.php b/lang/lt/activity.php new file mode 100644 index 0000000000..53e9b02fa3 --- /dev/null +++ b/lang/lt/activity.php @@ -0,0 +1,125 @@ + [ + 'fail' => 'Nepavyko prisijungti', + 'success' => 'Prisijungta', + 'password-reset' => 'Slaptažodžio atkūrimas', + 'checkpoint' => 'Prašyta Dviejų faktorių autentifikacija', + 'recovery-token' => 'Naudota dviejų faktorių atgavimo tokeną', + 'token' => 'Išspręstas dviejų faktorių autentifikacijos patikrinimas', + 'ip-blocked' => 'Užblokuota užklausa iš neįtraukto į sąrašą IP adreso identifikatoriaus: :identifier', + 'sftp' => [ + 'fail' => 'Nepavyko prisijungti prie SFTP', + ], + ], + 'user' => [ + 'account' => [ + 'username-changed' => 'Vartotojo vardas pakeistas iš :old į :new', + 'email-changed' => 'El. paštas pakeistas iš :old į :new', + 'password-changed' => 'Slaptažodis pakeistas', + ], + 'api-key' => [ + 'create' => 'Sukurtas naujas API raktas :identifier', + 'delete' => 'Ištrintas API raktas :identifier', + ], + 'ssh-key' => [ + 'create' => 'Prie paskyros pridėtas SSH raktas :fingerprint', + 'delete' => 'Iš paskyros pašalintas SSH raktas :fingerprint', + ], + 'two-factor' => [ + 'create' => 'Įjungta dviejų faktorių autentifikacija', + 'delete' => 'Išjungta dviejų faktorių autentifikacija', + ], + ], + 'server' => [ + 'console' => [ + 'command' => 'Serveryje įvykdyta komanda ":command"', + ], + 'power' => [ + 'start' => 'Serveris paleistas', + 'stop' => 'Serveris sustabdytas', + 'restart' => 'Serveris perkrautas', + 'kill' => 'Nužudė serverio procesą', + ], + 'backup' => [ + 'download' => 'Atsisiųstas :name atsarginės kopijos failas', + 'delete' => 'Ištrinta :name atsarginė kopija', + 'restore' => 'Atstatyta :name atsarginė kopija (ištrinti failai: :truncate)', + 'restore-complete' => 'Sėkmingai užbaigtas :name atsarginės kopijos atkūrimas', + 'restore-failed' => 'Nepavyko atkurti :name atsarginės kopijos', + 'start' => 'Pradėta nauja :name atsarginė kopija', + 'complete' => 'Pažymėta :name atsarginė kopija kaip užbaigta', + 'fail' => 'Pažymėta :name atsarginė kopija kaip nepavykus', + 'lock' => 'Užrakinta :name atsarginė kopija', + 'unlock' => 'Atrakinta :name atsarginė kopija', + 'rename' => 'Atsarginės kopijos pavadinimas pakeistas iš „:old_name“ į „:new_name“', + ], + 'database' => [ + 'create' => 'Sukurta nauja duomenų bazė :name', + 'rotate-password' => 'Atnaujintas slaptažodis duomenų bazei :name', + 'delete' => 'Ištrinta duomenų bazė :name', + ], + 'file' => [ + 'compress' => 'Suspausta :directory:files|Suspausta :count failų kataloge :directory', + 'read' => 'Peržiūrėtas :file turinys', + 'copy' => 'Nukopijuotas :file', + 'create-directory' => 'Sukurta katalogas :directory:name', + 'decompress' => 'Išpakuotas :file kataloge :directory', + 'delete' => 'Ištrinta :directory:files|Ištrinta :count failų kataloge :directory', + 'download' => 'Atsisiųstas :file', + 'pull' => 'Atsisiuntė nuotolinį failą iš :url į :directory', + 'rename' => 'Perkelta/Pervadinta iš :from į :to| Perkelta/Pervadinta :count failu į :directory', + 'write' => 'Įrašytas naujas turinys į :file', + 'upload' => 'Pradėjo failo įkėlimą', + 'uploaded' => 'Įkeltas :directory:file', + ], + 'sftp' => [ + 'denied' => 'Užblokavo SFTP prieeigą, dėl teisių', + 'create' => 'Sukurta :files|Sukurta :count naujų failų', + 'write' => 'Pakeistas :files turinys|Pakeista :count failų turinys', + 'delete' => 'Ištrinta :files|Ištrinta :count failų', + 'create-directory' => 'Sukurta :files direktorija|Sukurta :count direktorijų', + 'rename' => 'Pervadinta :from į :to|Pervadinta arba perkelta :count failų', + ], + 'allocation' => [ + 'create' => 'Pridėta :allocation prie serverio', + 'notes' => 'Atnaujinti užrašai prie :allocation nuo ":old" iki ":new"', + 'primary' => 'Nustatyta :allocation kaip pagrindinis serverio paskirstymas', + 'delete' => 'Ištrintas :allocation paskirstymas', + ], + 'schedule' => [ + 'create' => 'Sukurta :name tvarka', + 'update' => 'Atnaujinta :name tvarka', + 'execute' => 'Rankiniu būdu paleista :name tvarka', + 'delete' => 'Ištrinta :name tvarka', + ], + 'task' => [ + 'create' => 'Sukurta nauja užduotis ":action" :name tvarkai', + 'update' => 'Atnaujinta užduotis ":action" :name tvarkai', + 'delete' => 'Ištrinta ":action" užduotis :name grafikui', + ], + 'settings' => [ + 'rename' => 'Pervadintas serveris iš ":old" į ":new"', + 'description' => 'Pakeistas serverio aprašymas iš ":old" į ":new"', + 'reinstall' => 'Perinstaliuotas serveris', + ], + 'startup' => [ + 'edit' => 'Pakeista :variable reikšmė iš ":old" į ":new"', + 'image' => 'Atnaujintas „Docker“ atvaizdas serveriui iš :old į :new', + 'command' => 'Serverio paleisties komanda buvo atnaujinta iš :old į :new', + ], + 'subuser' => [ + 'create' => 'Pridėtas :email kaip papildomas vartotojas', + 'update' => 'Atnaujintos papildomo vartotojo teisės :email', + 'delete' => 'Pašalintas :email kaip papildomas vartotojas', + ], + 'crashed' => 'Serveris sugriuvo', + ], +]; diff --git a/lang/lt/admin/apikey.php b/lang/lt/admin/apikey.php new file mode 100644 index 0000000000..4e9b835252 --- /dev/null +++ b/lang/lt/admin/apikey.php @@ -0,0 +1,27 @@ + 'Programos API raktai.', + 'empty' => 'Nėra API raktų', + 'whitelist' => 'IPv4 adresai, įtraukti į leidžiamų sąrašą.', + 'whitelist_help' => 'API raktus galima apriboti, kad jie veiktų tik iš tam tikrų IPv4 adresų. Įveskite kiekvieną adresą naujoje eilutėje.', + 'whitelist_placeholder' => 'Pavyzdys: 127.0.0.1 arba 192.168.1.1', + 'description' => 'Aprašymas', + 'description_help' => 'Trumpas šio rakto paskirties aprašymas.', + 'nav_title' => 'API raktai', + 'model_label' => 'Aplikacijos API raktas', + 'model_label_plural' => 'Aplikacijos API raktai', + 'table' => [ + 'key' => 'Raktas', + 'description' => 'Aprašymas', + 'last_used' => 'Paskutinį kartą naudotas', + 'created' => 'Sukurta', + 'created_by' => 'Sukurta', + 'never_used' => 'Niekada nenaudota', + ], + 'permissions' => [ + 'none' => 'Nėra', + 'read' => 'Skaityti', + 'read_write' => 'Skaityti ir rašyti', + ], +]; diff --git a/lang/lt/admin/dashboard.php b/lang/lt/admin/dashboard.php new file mode 100644 index 0000000000..5f13238821 --- /dev/null +++ b/lang/lt/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Sveiki prisijungę prie Pelican!', + 'version' => 'Versija :version', + 'advanced' => 'Papildomi nustatymai', + 'server' => 'Serveris', + 'user' => 'Vartotojas', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informacija kūrėjams', + 'content' => 'Ačiū, kad išbandėte kūrimo versiją!', + 'extra_note' => 'Jei susidūrėte su kokiomis nors problemomis, prašome pranešti apie jas „GitHub“ platformoje.', + 'button_issues' => 'Sukurti užklausą', + 'button_features' => 'Aptarti funkcijas', + ], + 'intro-update-available' => [ + 'heading' => 'Galimas atnaujinimas', + 'content' => ':latestVersion versija dabar yra prieinama! Perskaitykite mūsų dokumentaciją, kad atnaujintumėte savo skydelį.', + 'button_changelog' => 'Kas Naujo?', + ], + 'intro-no-update' => [ + 'heading' => 'Jūsų skydelis yra atnaujintas', + 'content' => 'Šiuo metu naudojate :version. Jūsų skydelis yra atnaujintas!', + ], + 'intro-first-node' => [ + 'heading' => 'Nėra jokių „node“', + 'content' => 'Dar neturite sukonfigūruotų „node“, tačiau nesijaudinkite – galite paspausti veiksmų mygtuką, kad sukurtumėte pirmąjį!', + 'extra_note' => 'Jei susidūrėte su kokiomis nors problemomis, prašome pranešti apie jas „GitHub“ platformoje.', + 'button_label' => 'Sukurti pirmąjį „Pelican“ „node“', + ], + 'intro-support' => [ + 'heading' => 'Paremkite Pelican', + 'content' => 'Ačiū, kad naudojatės Pelican! Tai galėjo būti pasiekta tik su jūsų, mūsų prisidėjusių asmenų ir kitų mūsų rėmėjų pagalba!', + 'extra_note' => 'Mes labai vertiname bet kokią pagalbą iš visų rėmėjų.', + 'button_translate' => 'Padėti išversti', + 'button_donate' => 'Paremti tiesiogiai', + ], + 'intro-help' => [ + 'heading' => 'Reikia pagalbos?', + 'content' => 'Pirmiausia peržiūrėkite dokumentaciją! Jei vis dar reikia pagalbos, apsilankykite mūsų „Discord“ serveryje!', + 'button_docs' => 'Skaityti dokumentaciją', + ], + ], +]; diff --git a/lang/lt/admin/databasehost.php b/lang/lt/admin/databasehost.php new file mode 100644 index 0000000000..3a57f6825b --- /dev/null +++ b/lang/lt/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Duomenų bazės serveriai', + 'model_label' => 'Duomenų bazės serveris', + 'model_label_plural' => 'Duomenų bazės serveriai', + 'table' => [ + 'database' => 'Duomenų bazė', + 'name' => 'Pavadinimas', + 'host' => 'Serverio IP', + 'port' => 'Prievadas', + 'name_helper' => 'Palikus tuščią, bus automatiškai sugeneruotas atsitiktinis pavadinimas', + 'username' => 'Vartotojo vardas', + 'password' => 'Slaptažodis', + 'remote' => 'Prisijungimai iš', + 'remote_helper' => 'Iš kur būtų leidžiama prisijungti. Palikite tuščią, jeigu norite leisti jungtis iš bet kur.', + 'max_connections' => 'Didžiausia riba prisijungimams', + 'created_at' => 'Sukūrimo data', + 'connection_string' => 'JDBC prisijungimo tekstas', + ], + 'error' => 'Klaida jungiantis prie serverio', + 'host' => 'Serverio IP', + 'host_help' => 'IP adresas arba domeno vardas, kuris turėtų būti naudojamas bandant prisijungti prie šio „MySQL“ serverio iš šio valdymo punkto, kad būtų sukurtos naujos duomenų bazės.', + 'port' => 'Prievadas', + 'port_help' => 'Prievadas, kuris yra naudojamas šiame „MySQL“ serveryje.', + 'max_database' => 'Didžiausias duomenų bazių kiekis', + 'max_databases_help' => 'Didžiausias duomenų bazių kiekis, kurias galima sukurti šiame serveryje. Jei ši riba pasiekta, šiame serveryje negalės kurti naujų duomenų bazių. Tuščia reikšmė yra neribota.', + 'display_name' => 'Rodomas pavadinimas', + 'display_name_help' => 'Trumpas identifikatorius, naudojamas šiam serveriui atskirti nuo kitų. Turi būti nuo 1 iki 60 simbolių, pavyzdžiui, us.nyc.lvl3.', + 'username' => 'Vartotojo vardas', + 'username_help' => 'Paskyros, turinčios pakankamai teisių kurti naujus naudotojus ir duomenų bazes sistemoje, vartotojo vardas.', + 'password' => 'Slaptažodis', + 'password_help' => 'Duomenų bazės naudotojo slaptažodis.', + 'linked_nodes' => 'Prijungti „node“', + 'linked_nodes_help' => 'Šis nustatymas pagal numatytuosius nustatymus taikomas tik šiam duomenų bazės prievadui, kai duomenų bazė pridedama prie pasirinkto „node“ serverio.', + 'connection_error' => 'Klaida jungiantis prie duomenų bazės serverio', + 'no_database_hosts' => 'Duomenų bazės serverių nėra', + 'no_nodes' => 'Nėra nei vieno „node“', + 'delete_help' => 'Duomenų bazės serveris turi duomenų bazes', + 'unlimited' => 'Neribota', + 'anywhere' => 'Bet kur', + + 'rotate' => 'Pasukti', + 'rotate_password' => 'Pakeisti slaptažodį', + 'rotated' => 'Slaptažodis pakeistas', + 'rotate_error' => 'Slaptažodį pakeisti nepavyko', + 'databases' => 'Duomenų bazės', + + 'setup' => [ + 'preparations' => 'Paruošimai', + 'database_setup' => 'Duomenų bazės pradinė konfiguracija', + 'panel_setup' => 'Skydelio Sąranka', + + 'note' => 'Šiuo laiku, tik MySQL/MariaDB duomenų bazės yra palaikomos.', + 'different_server' => 'Ar skydelis ir duomenų bazė nėra tame pačiame serveryje?', + + 'database_user' => 'Duomenų bazės vartotojas', + 'cli_login' => 'Naudokite kodą mysql -u root -p jei norite prieiti mysql cli.', + 'command_create_user' => 'Komanda sukurti naudotoją.', + 'command_assign_permissions' => 'Komanda priskirti pareigas.', + 'cli_exit' => 'Kad išeitumete iš mysql cli naudokite kodą exit.', + 'external_access' => 'Išorinė prieiga.', + 'allow_external_access' => ' +

Tikėtina, kad turėsite leisti išorinę prieigą prie šios MySQL instancijos, kad serveriai galėtų prie jos prisijungti.

+
+

Norėdami tai padaryti, atidarykite failą my.cnf, kurio vieta priklauso nuo jūsų OS ir MySQL diegimo būdo. Galite įvesti find /etc -iname my.cnf, kad jį rastumėte.

+
+

Atidarykite failą my.cnf, pridėkite toliau pateiktą tekstą failo apačioje ir išsaugokite jį:
+[mysqld]
bind-address=0.0.0.0

+
+

Paleiskite MySQL / MariaDB iš naujo, kad pritaikytumėte šiuos pakeitimus. Tai pakeis numatytąją MySQL konfigūraciją, kuri pagal numatytuosius nustatymus priims užklausas tik iš localhost. Atnaujinus šią konfigūraciją, bus leidžiami ryšiai visose sąsajose, taigi, ir išoriniai ryšiai. Įsitikinkite, kad užkardoje leidžiamas MySQL prievadas (numatytasis 3306).

', + ], +]; diff --git a/lang/lt/admin/egg.php b/lang/lt/admin/egg.php new file mode 100644 index 0000000000..57f04c1395 --- /dev/null +++ b/lang/lt/admin/egg.php @@ -0,0 +1,108 @@ + '„Kiaušiniai“', + 'model_label' => '„Kiaušinis“', + 'model_label_plural' => '„Kiaušiniai“', + 'tabs' => [ + 'configuration' => 'Konfigūracija', + 'process_management' => 'Procesų valdymas', + 'egg_variables' => '„Kiaušinio“ kintamieji', + 'install_script' => 'Įdiegimo scenarijus', + ], + 'import' => [ + 'file' => 'Failas', + 'url' => 'Nuoroda', + 'image_url' => 'Vaizdo URL', + 'image_error' => 'Nepavyko gauti vaizdo', + 'image_too_large' => 'Vaizdas per didelis. Riba yra 1024 KB', + 'egg_help' => 'Tai turėtų būti neapdorotas .json failas (egg-minecraft.json)', + 'url_help' => 'Nuoroda(-os) turi nukreipti tiesiai į neapdorotą .json failą', + 'add_url' => 'Nauja nuoroda', + 'import_failed' => 'Importuoti nepavyko', + 'import_success' => 'Importuoti pavyko', + 'github' => 'Pridėti iš Github', + 'refresh' => 'Atnaujinti', + 'import_image' => 'Importuoti Vaizdą', + 'no_local_ip' => 'Vietiniai IP Adresai neleidžiami', + 'unsupported_format' => 'Nepalaikomas Formatas. Palaikomi Formatai: :formats', + 'invalid_url' => 'Pateiktas URL yra neteisingas', + 'image_deleted' => 'Vaizdas Ištrintas', + 'no_image' => 'Vaizdas Nepateiktas', + 'image_updated' => 'Vaizdas Atnaujintas', + ], + 'export' => [ + 'modal' => 'Kaip norėtumėte eksportuoti :egg ?', + 'as' => 'Kaip .:format', + ], + 'in_use' => 'Naudojama(-as)', + 'servers' => 'Serveriai', + 'name' => 'Pavadinimas', + 'egg_uuid' => '„Kiaušinio“ unikalus ID', + 'egg_id' => '„Kiaušinio“ ID', + 'name_help' => 'Paprastas, žmogui suprantamas pavadinimas, naudojamas kaip šio „kiaušinio“ identifikatorius.', + 'author' => 'Autorius', + 'uuid_help' => 'Tai visuotinai unikalus šio kiaušinio identifikatorius, kurį „Wings“ naudoja kaip identifikatorių.', + 'author_help' => 'Šio „kiaušinio“ versijos autorius.', + 'author_help_edit' => 'Šios „Kiaušinio“ versijos autorius. Įkėlus naują kito autoriaus konfigūraciją, šis parametras pasikeis.', + 'description' => 'Aprašymas', + 'description_help' => 'Šio „kiaušinio“ aprašymas, kuris prireikus bus rodomas visame valdymo punkte.', + 'add_startup' => 'Pridėti Paleisties Komanda', + 'startup_command' => 'Komanda', + 'startup_commands' => 'Paleisties Komandos', + 'startup_name' => 'Rodomas Pavadinimas', + 'startup_help' => 'Serveriams, naudojantiems šį „Egg“, prieinamos paleisties komandos. Pirmoji yra numatytoji.', + 'file_denylist' => 'Failų uždraustasis sąrašas', + 'file_denylist_help' => 'Failų, kurių vartotojas negalės redaguoti, sąrašas.', + 'features' => 'Funkcijos', + 'force_ip' => 'Priversti išeinantį IP', + 'force_ip_help' => 'Priverčia visą išeinančią tinklo srautą NAT\'inti jo šaltinio IP adresą į serverio pagrindinio paskirstymo IP adresą. Reikalaujama tam, kad kai kurie žaidimai tinkamai veiktų, kai „node“ turi kelis viešuosius IP adresus. Įjungus šią parinktį, bus išjungtas vidinis tinklas visiems serveriams, naudojantiems „kiaušinį“, todėl jie negalės viduje pasiekti kitų serverių tame pačiame „mazge“.', + 'tags' => 'Raktažodžiai', + 'update_url' => 'Atnaujinti nuorodą', + 'update_url_help' => 'Nuoroda(-os) turi nukreipti tiesiai į neapdorotą .json failą', + 'add_image' => 'Pridėti „Docker“ atvaizdą', + 'docker_images' => '„Docker“ atvaizdai', + 'docker_name' => 'Atvaizdo pavadinimas', + 'docker_uri' => 'Atvaizdo nuoroda', + 'docker_help' => 'Serveriams, naudojantiems šį „Egg“, prieinami „Docker“ atvaizdai. Pirmasis yra numatytasis.', + + 'stop_command' => 'Sustabdymo komanda', + 'stop_command_help' => 'Komanda, kuri turėtų būti siunčiama serverio procesams, kad jie būtų ramiai sustabdyti. Jei reikia siųsti „SIGINT“, čia reikia įvesti ^C.', + 'copy_from' => 'Kopijuoti nustatymus iš', + 'copy_from_help' => 'Jei norite, kad pagal numatytuosius nustatymus būtų naudojami kito „kiaušinio“ nustatymai, pasirinkite jį iš aukščiau esančio meniu.', + 'none' => 'Nėra', + 'start_config' => 'Pradžios konfigūracija', + 'start_config_help' => 'Vertės, kurių turėtų ieškoti „daemon“ paleisdamas serverį, kad nustatytų užbaigimą, sąrašas.', + 'config_files' => 'Konfigūracijos failai', + 'config_files_help' => 'Tai turėtų būti konfigūracijos failų, kuriuos reikia keisti, JSON atvaizdavimas ir nurodyti, kokias jų dalis reikia keisti.', + 'log_config' => 'Įvykių saugyklos konfigūracija', + 'log_config_help' => 'Tai turėtų būti JSON atvaizdavimas, kur saugomi įvykių failai ir ar „daemon“ turėtų kurti pasirinktinius įvykių failus, ar ne.', + + 'environment_variable' => 'Aplinkos kintamieji', + 'default_value' => 'Numatytoji reikšmė', + 'user_permissions' => 'Vartotojo teises', + 'viewable' => 'Galimybė peržiurėti', + 'editable' => 'Galimybė redaguoti', + 'rules' => 'Taisyklės', + 'add_new_variable' => 'Pridėti naują kintamąjį', + + 'error_unique' => 'Šio pavadinimo kintamasis jau egzistuoja.', + 'error_required' => 'Aplinkos kintamojo laukas yra privalomas.', + 'error_reserved' => 'Šis aplinkos kintamasis yra rezervuotas ir negali būti naudojamas.', + + 'script_from' => 'Scenarijus iš', + 'script_container' => 'Scenarijaus talpykla', + 'script_entry' => 'Scenarijaus įvestis', + 'script_install' => 'Įdiegimo scenarijus', + 'no_eggs' => 'Nėra „kiaušinių“', + 'no_servers' => 'Nėra serverių', + 'no_servers_help' => 'Šiam „kiaušiniui“ nepriskirti jokie serveriai.', + + 'update' => 'Atnaujinimas pasirinktas', + 'updated' => '„Egg“ atnaujintas|Atnaujinta „Egg“ :count/:total', + 'updated_failed' => ':count nepavyko', + 'updated_skipped' => ':count praleista', + 'update_question' => 'Ar tikrai norite atnaujinti šį „Egg“?|Ar tikrai norite atnaujinti pasirinktus „Egg“?', + 'update_description' => 'Jei atlikote kokių nors pakeitimų šiame „Egg“, jie bus perrašyti!|Jei atlikote kokių nors pakeitimų šiuose „Egg“, jie bus perrašyti!', + 'no_updates' => 'Nėra atnaujinimų pasirinktiems „Egg“', +]; diff --git a/lang/lt/admin/health.php b/lang/lt/admin/health.php new file mode 100644 index 0000000000..8cd8414cd6 --- /dev/null +++ b/lang/lt/admin/health.php @@ -0,0 +1,60 @@ + 'Sveikata', + 'results_refreshed' => 'Sveikatos patikrinimo rezultatai atnaujinti', + 'checked' => 'Paskutinį kartą tikrinta :time', + 'refresh' => 'Atnaujinti', + 'results' => [ + 'cache' => [ + 'label' => 'Talpykla', + 'ok' => 'Gera', + 'failed_retrieve' => 'Nepavyko nustatyti arba gauti programos talpyklos vertės.', + 'failed' => 'Su programos talpykla iškilo problema: :error', + ], + 'database' => [ + 'label' => 'Duomenų bazė', + 'ok' => 'Gera', + 'failed' => 'Nepavyko prisijungti prie duomenų bazės: :error', + ], + 'debugmode' => [ + 'label' => 'Tvarkymo režimas', + 'ok' => 'Tvarkymo režimas išjungtas', + 'failed' => 'Tikėtasi, kad tvarkymo režimas bus : expected ,bet iš tikrųjų buvo :actual', + ], + 'environment' => [ + 'label' => 'Aplinka', + 'ok' => 'Sėkmingai nustatyta į :actual', + 'failed' => 'Aplinka nustatyta į :actual ,tikėtasi :expected', + ], + 'nodeversions' => [ + 'label' => '„node“ versija', + 'ok' => 'Visi „node“ yra naujausios versijos', + 'failed' => ':outdaated/:all „node“ yra pasenę', + 'no_nodes_created' => 'Nesukurta jokių „node“', + 'no_nodes' => 'Nėra nei vieno „node“', + 'all_up_to_date' => 'Visi naujausi', + 'outdated' => ':outdated/:all pasenę', + ], + 'panelversion' => [ + 'label' => 'Valdymo punkto versija', + 'ok' => 'Jūsų valdymo punktas turi naujausią versiją', + 'failed' => 'Įdiegta versija yra :currentVersion ,bet naujausia yra :latestVersion', + 'up_to_date' => 'Naujausia', + 'outdated' => 'Pasenęs(-usi)', + ], + 'schedule' => [ + 'label' => 'Tvarkaraštis', + 'ok' => 'Geras', + 'failed_last_ran' => 'Paskutinį kartą tvarkaraštis buvo paleistas daugiau nei prieš :time minutes', + 'failed_not_ran' => 'Tvarkaraštis dar nebuvo paleistas.', + ], + 'useddiskspace' => [ + 'label' => 'Naudojama disko talpa', + ], + ], + 'checks' => [ + 'successful' => 'Sėkminga', + 'failed' => 'Nepavyko', + ], +]; diff --git a/lang/lt/admin/mount.php b/lang/lt/admin/mount.php new file mode 100644 index 0000000000..0756b525ea --- /dev/null +++ b/lang/lt/admin/mount.php @@ -0,0 +1,30 @@ + 'Diskų prijungimai', + 'model_label' => 'Disko prijungimas', + 'model_label_plural' => 'Diskų prijungimai', + 'name' => 'Pavadinimas', + 'name_help' => 'Unikalus pavadinimas atskirti šį disko prijungimą nuo kitų.', + 'source' => 'Šaltinis', + 'source_help' => 'Failų adresas priimančiojoje sistemoje, kurį reikia prijungti prie talpos.', + 'target' => 'Tikslas', + 'target_help' => 'Kur disko prijungimas bus prieinamas talpoje.', + 'read_only' => 'Tik skaitymui?', + 'read_only_help' => 'Ar disko prijungimas yra tik skaitymo reikalams talpoje?', + 'description' => 'Aprašymas', + 'description_help' => 'Ilgesnis šio disko prijungimo aprašymas', + 'no_mounts' => 'Nėra disko prijungimų', + 'eggs' => '„Kiaušiniai“', + 'nodes' => '„Nodes“', + 'toggles' => [ + 'writable' => 'Įrašomas', + 'read_only' => 'Tik skaitymui', + ], + 'table' => [ + 'name' => 'Pavadinimas', + 'all_eggs' => 'Visi „kiaušiniai“', + 'all_nodes' => 'Visi „nodes“', + 'read_only' => 'Tik skaitymui', + ], +]; diff --git a/lang/lt/auth.php b/lang/lt/auth.php new file mode 100644 index 0000000000..54c1219cdf --- /dev/null +++ b/lang/lt/auth.php @@ -0,0 +1,24 @@ + 'Šie prisijungimo duomenys neatitinka mūsų įrašų.', + 'failed-two-factor' => 'Neteisingas dviejų etapų kodas', + 'two-factor-code' => 'Dviejų etapų kodas', + 'two-factor-hint' => 'Jūs galite naudoti atsarginius kodus jeigu praradote prieigą prie jūsų įrenginio.', + 'password' => 'Netinkamas slaptažodis.', + 'throttle' => 'Per daug bandymų prisijungti. Bandykite po :seconds sekundžių.', + '2fa_must_be_enabled' => 'Administratorius reikalauja, kad dviejų faktorių autentifikacija būtų įjungta jūsų paskyrai, kad jūs galėtūmėte naudotis šiuo Panel.', + +]; diff --git a/lang/lt/commands.php b/lang/lt/commands.php new file mode 100644 index 0000000000..91c06bb93c --- /dev/null +++ b/lang/lt/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Nurodykite el. pašto adresą, iš kurio turėtų būti siunčiami „eggs“ iš valdymo punkto. Tai turi būti galiojantis el. pašto adresas.', + 'url' => 'Programos nuoroda PRIVALO prasidėti su https:// arba http://, priklausomai nuo to, ar naudojate „SSL“, ar ne. Jei nenurodysite schemos, jūsų el. laiškai ir kitas turinys nukreips į neteisingą vietą.', + 'timezone' => 'Laiko zona turėtų atitikti vieną iš „PHP“ palaikomų laiko zonų. Jei nesate tikri, peržiūrėkite https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Pasirinkote „Redis“ tvarkyklę vienai ar kelioms parinktim, pateikite tinkamą prisijungimo informaciją žemiau. Daugeliu atvejų galite naudoti numatytas reikšmes, nebent pakeitėte savo sąranką.', + 'comment' => 'Pagal nutylėjimą „Redis“ serverio instancijoje vartotojo vardas yra „default“ ir nėra slaptažodžio, nes jis veikia lokaliai ir yra neprieinamas išorės pasauliui. Jei taip yra, tiesiog paspauskite Enter, neįvedę jokios reikšmės.', + 'confirm' => 'Atrodo, kad laukas :field jau apibrėžtas „Redis“, ar norėtumėte jį pakeisti?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Geriausia nenaudoti „localhost“ kaip jūsų duomenų bazės šeimininko, nes pastebėta dažnų lizdo prisijungimo problemų. Jei norite naudoti vietinį prisijungimą, turėtumėte naudoti „127.0.0.1“.', + 'DB_USERNAME_note' => 'Naudoti „root“ paskyrą „MySQL“ prisijungimams ne tik yra labai nepageidaujama, bet ir šiai programai draudžiama. Turėsite sukurti „MySQL“ vartotoją šiai programai.', + 'DB_PASSWORD_note' => 'Atrodo, kad jau nustatytas „MySQL“ prisijungimo slaptažodis, ar norėtumėte jį pakeisti?', + 'DB_error_2' => 'Jūsų prisijungimo duomenys NEBUVO išsaugoti. Prieš tęsdami turėsite pateikti tinkamą prisijungimo informaciją.', + 'go_back' => 'Grįžkite atgal ir bandykite dar kartą', + ], + 'make_node' => [ + 'name' => 'Įveskite trumpą identifikatorių, skirtą atskirti šį „node“ nuo kitų', + 'description' => 'Įveskite aprašymą, skirtą identifikuoti šį „node“', + 'scheme' => 'Prašome įvesti https, jei naudojate „SSL“, arba http, jei nesinaudojate „SSL“', + 'fqdn' => 'Įveskite domeno vardą (pvz., node.example.com), kuris bus naudojamas prisijungimui prie „daemon“. IP adresą galima naudoti tik jei nesinaudojate „SSL“ šiam „node“', + 'public' => 'Ar šis „node“ turėtų būti viešas? Pastaba: nustatant mazgą kaip privatų, prarasite galimybę automatiškai diegti į šį mazgą.', + 'behind_proxy' => 'Ar jūsų „FQDN“ yra už tarpinio serverio?', + 'maintenance_mode' => 'Ar turi būti įjungtas techninio aptarnavimo režimas?', + 'memory' => 'Įveskite didžiausią atminties kiekį', + 'memory_overallocate' => 'Įveskite, kiek atminties perviršiai skiriama, -1 išjungs patikrinimą, o 0 neleis kurti naujų serverių', + 'disk' => 'Įveskite didžiausią disko vietos kiekį', + 'disk_overallocate' => 'Įveskite, kiek disko vietos perviršiai skiriama, -1 išjungs patikrinimą, o 0 neleis kurti naujo serverio', + 'cpu' => 'Įveskite didžiausią „CPU“ kiekį', + 'cpu_overallocate' => 'Įveskite, kiek „CPU“ perviršiai skiriama, -1 išjungs patikrinimą, o 0 neleis kurti naujo serverio', + 'upload_size' => 'Įveskite didžiausią failo įkėlimo dydį', + 'daemonListen' => 'Įveskite „daemon“ klausymo prievadą', + 'daemonConnect' => 'Įveskite „daemon“ prisijungimo prievadą (gali būti toks pat kaip klausymosi prievadas)', + 'daemonSFTP' => 'Įveskite „daemon“ „SFTP“ klausymo prievadą', + 'daemonSFTPAlias' => 'Įveskite „daemon“ „SFTP“ pseudonimą (gali būti tuščias)', + 'daemonBase' => 'Įveskite pagrindinį katalogą', + 'success' => 'Naujas „node“ sėkmingai sukurtas, pavadinimu :name ir su Id :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Pasirinktas „node“ neegzistuoja.', + 'error_invalid_format' => 'Nurodytas neteisingas formatas. Galimos reikšmės yra „yaml“ ir „json“.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Atrodo, kad jau sukonfigūruotas programos šifravimo raktas. Tęsdami šį procesą perrašysite tą raktą ir gali kilti esamų užšifruotų duomenų sugadinimas. NETĘSKITE, JEI NEŽINOTE, KĄ DARYTI.', + 'understand' => 'Suprantu šio komandos vykdymo pasekmes ir prisiimu visą atsakomybę už užšifruotų duomenų praradimą.', + 'continue' => 'Ar tikrai norite tęsti? Programos šifravimo rakto keitimas SUKELS DUOMENŲ PRARADIMĄ.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Nėra suplanuotų užduočių serveriams, kurias reikia vykdyti.', + 'error_message' => 'Apdorojant tvarkaraštį įvyko klaida: ', + ], + ], +]; diff --git a/lang/lt/exceptions.php b/lang/lt/exceptions.php new file mode 100644 index 0000000000..73a0b458cb --- /dev/null +++ b/lang/lt/exceptions.php @@ -0,0 +1,64 @@ + 'Bandant palaikyti ryšį su daemon įvyko išimtis, dėl kurios buvo gautas HTTP/:code atsakymo kodas. Ši išimtis buvo užregistruota.', + 'node' => [ + 'servers_attached' => 'Node neturi turėti nė vieno serverio, kad būtų galima ją ištrinti.', + 'error_connecting' => 'Klaida jungiantis prie „node“', + 'daemon_off_config_updated' => 'Daemon konfiguracija buvo atnaujinta, bet įvyko klaida kol bandėme automatiškai atnaujinti konfiguracijos failą Daemon. Jum reikės rankiniu atnaujini konfiguracijos failą(config.yml) Daemon\'ui, kad išsaugoti šiuos pakeitimus.', + ], + 'allocations' => [ + 'server_using' => 'Šiuo metu šiai alokacijai yra priskirtas serveris. Alokaciją galima ištrinti tik tuo atveju, jei šiuo metu jai nėra priskirtas joks serveris.', + 'too_many_ports' => 'Pridėti daugiau nei 1000 prievadų vienu diapazonu yra nepalaikoma.', + 'invalid_mapping' => 'Pateiktas :port atvaizdavimas buvo negaliojantis ir negalėjo būti apdorotas.', + 'cidr_out_of_range' => 'CIDR žymėjimas leidžia naudoti tik kaukes tarp /25 ir /32.', + 'port_out_of_range' => 'Paskirstymo prievadai turi būti didesni arba lygūs 1024 ir mažesni arba lygūs 65535.', + ], + 'egg' => [ + 'delete_has_servers' => 'Egg su aktyviais, prijungtais serveriais, negali būti ištrintas iš Panel.', + 'invalid_copy_id' => 'Pasirinktas Egg skripto kopijavimui neegzistuoja arba kopijuoja skriptą pats.', + 'has_children' => 'Šis Egg yra tėvas vienam ar daugiau kitems Eggs. Prašau ištrinti tuos Eggs prieš šio Egg ištrinimą.', + ], + 'variables' => [ + 'env_not_unique' => 'Aplinkos kintamasis :name turi būti unikalus šiam Egg.', + 'reserved_name' => 'Aplinkos kintamasis :name yra apsaugotas ir negali būti paskirtas kintamajam.', + 'bad_validation_rule' => 'Validacijos taisyklė ":rule" nėra galiojanti taisyklė šiai aplikacijai.', + ], + 'importer' => [ + 'json_error' => 'Buvo klaida bandant analizuojant JSON failą: :error.', + 'file_error' => 'Nurodytas JSON failas yra negaliojantis.', + 'invalid_json_provided' => 'Nurodytas JSON failas nėra formatavime, kuris gali būti atpažintas.', + ], + 'subusers' => [ + 'editing_self' => 'Redaguoti savo subnaudotojo paskyrą neleidžiama.', + 'user_is_owner' => 'Jūs negalite pridėti serverio savininko kaip subnaudotojas šiam serveriui.', + 'subuser_exists' => 'Naudotojas su šiuo el. pašto adresu jau egzistuoja kaip subnaudotojas šiam serveriui.', + ], + 'databases' => [ + 'delete_has_databases' => 'Negalite ištrinti databazės pagrindinio serverio, kol ji turi aktyvių databazių prijungtų prie jos.', + ], + 'tasks' => [ + 'chain_interval_too_long' => 'Didžiausias intervalo laikas grandininei užduočiai yra 15 minučių.', + ], + 'locations' => [ + 'has_nodes' => 'Negalite ištrinti lokacijos, kuri turi prijungtų aktyvių nodes.', + ], + 'users' => [ + 'is_self' => 'Negalima ištrinti savo naudojo paskyros.', + 'has_servers' => 'Negalima ištrinti naudotojo, prie kurio paskyros prijungti aktyvūs serveriai. Prieš tęsdami, ištrinkite jų serverius.', + 'node_revocation_failed' => 'Nepavyko atšaukti raktų Node #:node. :error', + ], + 'deployment' => [ + 'no_viable_nodes' => 'Nepavyko rasti nė vieno node, atitinkančio automatiniam diegimui nustatytus reikalavimus.', + 'no_viable_allocations' => 'Automatinio diegimo reikalavimus atitinkančių asignavimų nerasta.', + ], + 'api' => [ + 'resource_not_found' => 'Prašytas resursas neegzistuoja šiame serveryje.', + ], + 'mount' => [ + 'servers_attached' => 'Kad būtų galima ištrinti prijungtą vietą, prie jos neturi būti prijungtų serverių.', + ], + 'server' => [ + 'marked_as_failed' => 'Šis serveris dar nebaigė diegimo proceso, bandykite vėliau.', + ], +]; diff --git a/lang/lt/profile.php b/lang/lt/profile.php new file mode 100644 index 0000000000..ff0d21431d --- /dev/null +++ b/lang/lt/profile.php @@ -0,0 +1,70 @@ + 'Profilis', + 'tabs' => [ + 'account' => 'Paskyra', + 'oauth' => '„OAuth“', + 'activity' => 'Veikla', + 'api_keys' => '„API“ raktai', + 'ssh_keys' => '„SSH“ raktai', + 'keys' => 'Raktai', + '2fa' => '„2FA“', + 'customization' => 'Modifikacija', + ], + 'username' => 'Vartotojo vardas', + 'admin' => 'Administratorius', + 'exit_admin' => 'Išeiti iš adminitratoriaus valdymo punkto', + 'server_list' => 'Serverių Sąrašas', + 'email' => 'El. paštas', + 'password' => 'Slaptažodis', + 'current_password' => 'Dabartinis slaptažodis', + 'password_confirmation' => 'Pakartotinas slaptažodis', + 'timezone' => 'Laiko juosta', + 'language' => 'Kalba', + 'language_help' => 'Jūsų kalba :state dar nebuvo išversta!', + 'link' => 'Nuoroda', + 'unlink' => 'Atskirti', + 'unlinked' => ':name atjungtas', + 'scan_qr' => 'Nuskaityti QR kodą', + 'code' => 'Kodas', + 'setup_key' => 'Nustatymo raktas', + 'invalid_code' => 'Neteisingas „2FA“ kodas', + 'code_help' => 'Nuskaitykite aukščiau esantį QR kodą naudodami savo dviejų žingsnių autentifikacijos programėlę, tada įveskite sugeneruotą kodą.', + '2fa_enabled' => 'Dviejų faktorių autentifikacija šiuo metu įjungta!', + 'backup_help' => 'Šie nebus rodomi vėl!', + 'backup_codes' => 'Atsarginiai kodai', + 'disable_2fa' => 'Išjungti „2FA“', + 'disable_2fa_help' => 'Įveskite savo dabartinį „2FA“ kodą, kad išjungtumėte dviejų faktorių autentifikaciją', + 'api_keys' => '„API“ Raktai', + 'create_api_key' => 'Sukurti „API“ Raktą', + 'api_key_created' => '„API“ Raktas Sukurtas', + 'description' => 'Aprašymas', + 'allowed_ips' => 'Leidžiami IP adresai', + 'allowed_ips_help' => 'Paspauskite Enter, kad pridėtumėte naują IP adresą, arba palikite tuščią, kad leistumėte bet kurį IP adresą', + 'ssh_keys' => '„SSH“ Raktai', + 'create_ssh_key' => 'Sukurti „SSH“ Raktą', + 'ssh_key_created' => '„SSH“ Raktas Sukurtas', + 'name' => 'Pavadinimas', + 'public_key' => 'Viešasis Raktas', + 'could_not_create_ssh_key' => 'Nepavyko sukurti „SSH“ rakto', + 'dashboard' => 'Valdymo skydelis', + 'dashboard_layout' => 'Valdymo skydelio išdėstymas', + 'console' => 'Konsolė', + 'grid' => 'Tinklelis', + 'table' => 'Lentelė', + 'rows' => 'Eilutės', + 'font_size' => 'Šrifto dydis', + 'font' => 'Šriftas', + 'font_preview' => 'Šrifto peržiūra', + 'seconds' => 'Sekundės', + 'graph_period' => 'Grafiko Periodas', + 'graph_period_helper' => 'Duomenų taškų skaičius, sekundės, rodomi konsolės grafikuose.', + 'navigation' => 'Navigacijos Tipas', + 'sidebar' => 'Šoninė Juosta', + 'topbar' => 'Viršutinė Juosta', + 'mixed' => 'Mišrus', + 'no_oauth' => 'Nėra Susietų Paskyrų', + 'no_api_keys' => 'Nėra „API“ raktų', + 'no_ssh_keys' => 'Nėra „SSH“ raktų', +]; diff --git a/lang/lt/search.php b/lang/lt/search.php new file mode 100644 index 0000000000..9f9e45bcc5 --- /dev/null +++ b/lang/lt/search.php @@ -0,0 +1,9 @@ + 'Norėdami pradėti paiešką, įveskite bent tris simbolius.', + 'term' => [ + 'label' => 'Paieškos tekstas', + 'description' => 'Norėdami pradėti paiešką, įveskite serverio pavadinimą, unikalų ID arba paskirstymą.', + ], +]; diff --git a/lang/lt/server/activity.php b/lang/lt/server/activity.php new file mode 100644 index 0000000000..73dc2398b6 --- /dev/null +++ b/lang/lt/server/activity.php @@ -0,0 +1,11 @@ + 'Veikla', + 'event' => 'Įvykis', + 'user' => 'Naudotojas', + 'deleted_user' => 'Ištrintas Naudotojas', + 'system' => 'Sistema', + 'timestamp' => 'Laiko Žymė', + 'metadata' => 'Metaduomenys', +]; diff --git a/lang/lt/validation.php b/lang/lt/validation.php new file mode 100644 index 0000000000..99339a207f --- /dev/null +++ b/lang/lt/validation.php @@ -0,0 +1,101 @@ + 'Laukas :attribute turi būti patvirtintas.', + 'active_url' => 'Laukas :attribute nėra tinkama nuoroda.', + 'after' => 'Laukas :attribute turi būti data po :date.', + 'after_or_equal' => 'Laukas :attribute turi būti data po arba lygi :date.', + 'alpha' => 'Laukas :attribute gali sudaryti tik raidės.', + 'alpha_dash' => 'Laukas :attribute gali sudaryti tik raidės, skaičiai ir brūkšneliai.', + 'alpha_num' => 'Laukas :attribute gali sudaryti tik raidės ir skaičiai.', + 'array' => 'Laukas :attribute turi būti masyvas.', + 'before' => 'Laukas :attribute turi būti data prieš :date.', + 'before_or_equal' => 'Laukas :attribute turi būti data prieš arba lygi :date.', + 'between' => [ + 'numeric' => 'Laukas :attribute turi būti tarp :min ir :max.', + 'file' => 'Failo dydis lauke :attribute turi būti tarp :min ir :max kilobaitų.', + 'string' => 'Simbolių skaičius lauke :attribute turi būti tarp :min ir :max.', + 'array' => 'Lauke :attribute turi būti nuo :min iki :max elementų.', + ], + + 'confirmed' => 'Lauko :attribute patvirtinimas nesutampa.', + 'date' => 'Laukas :attribute nėra tinkama data.', + 'date_format' => 'Laukas :attribute neatitinka formato :format.', + 'different' => 'Laukai :attribute ir :other turi būti skirtingi.', + 'digits' => 'Laukas :attribute turi būti sudarytas iš :digits skaitmenų.', + 'digits_between' => 'Lauko :attribute skaitmenų skaičius turi būti tarp :min ir :max.', + 'dimensions' => 'Lauko :attribute paveikslėlio matmenys yra neteisingi.', + + 'email' => 'Laukas :attribute turi būti tinkamas el. pašto adresas.', + + 'file' => 'Laukas :attribute turi būti failas.', + 'filled' => 'Laukas :attribute yra privalomas.', + 'image' => 'Laukas :attribute turi būti paveikslėlis.', + + 'in_array' => 'Laukas :attribute neegzistuoja lauke :other.', + 'integer' => 'Laukas :attribute turi būti sveikasis skaičius.', + 'ip' => 'Laukas :attribute turi būti tinkamas IP adresas.', + 'json' => 'Laukas :attribute turi būti tinkama JSON eilutė.', + 'max' => [ + 'numeric' => 'Laukas :attribute negali būti didesnis nei :max.', + 'file' => 'Failo dydis lauke :attribute negali viršyti :max kilobaitų.', + 'string' => 'Simbolių skaičius lauke :attribute negali viršyti :max.', + 'array' => 'Laukas :attribute negali turėti daugiau nei :max elementų.', + ], + 'mimes' => 'Laukas :attribute turi būti failo tipo: :values.', + 'mimetypes' => 'Laukas :attribute turi būti failo tipo: :values.', + 'min' => [ + 'numeric' => 'Laukas :attribute turi būti ne mažesnis nei :min.', + 'file' => 'Failo dydis lauke :attribute turi būti ne mažesnis nei :min kilobaitų.', + 'string' => 'Simbolių skaičius lauke :attribute turi būti ne mažesnis nei :min.', + 'array' => 'Laukas :attribute turi turėti bent :min elementų.', + ], + + 'numeric' => 'Laukas :attribute turi būti skaičius.', + + 'regex' => 'Lauko :attribute formatas yra neteisingas.', + + 'required_with_all' => 'Laukas :attribute yra privalomas, kai :values yra pateikti.', + + 'same' => 'Laukai :attribute ir :other turi sutapti.', + 'size' => [ + 'numeric' => 'Laukas :attribute turi būti :size.', + 'file' => 'Failo dydis lauke :attribute turi būti :size kilobaitų.', + 'string' => 'Simbolių skaičius lauke :attribute turi būti :size.', + 'array' => 'Laukas :attribute turi turėti :size elementų.', + ], + 'string' => 'Laukas :attribute turi būti eilutė.', + 'timezone' => 'Laukas :attribute turi būti tinkama laiko zona.', + + 'url' => 'Lauko :attribute formatas yra neteisingas.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + + // Internal validation logic for Panel + 'internal' => [ + 'variable_value' => ':env kintamasis', + 'invalid_password' => 'Nurodytas slaptažodis yra neteisingas šiai paskyrai.', + ], +]; diff --git a/lang/nl/activity.php b/lang/nl/activity.php index 8e1d5726b4..b9ab21ca5d 100644 --- a/lang/nl/activity.php +++ b/lang/nl/activity.php @@ -11,27 +11,27 @@ 'fail' => 'Inloggen mislukt', 'success' => 'Ingelogd', 'password-reset' => 'Wachtwoord resetten', - 'reset-password' => 'Wachtwoord reset aangevraagd', 'checkpoint' => 'Tweestapsverificatie aangevraagd', 'recovery-token' => 'Token voor tweestapsverificatie herstel gebruikt', 'token' => 'Tweestapsverificatie voltooid', - 'ip-blocked' => 'Geblokkeerd verzoek van niet in de lijst opgenomen IP-adres voor :identifier', + 'ip-blocked' => 'Geblokkeerd verzoek van niet in de lijst opgenomen IP-adres voor :identifier:', 'sftp' => [ - 'fail' => 'Mislukte SFTP login', + 'fail' => 'Mislukte SFTP-login', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'E-mailadres gewijzigd van :old naar :new', + 'username-changed' => 'Gewijzigde e-mail van :old naar :new', + 'email-changed' => 'Gewijzigde e-mail van :old naar :new', 'password-changed' => 'Wachtwoord gewijzigd', ], 'api-key' => [ - 'create' => 'Nieuwe API-sleutel aangemaakt :identifier', - 'delete' => 'API-sleutel verwijderd :identifier', + 'create' => 'Nieuwe API-sleutel aangemaakt :identifier: ', + 'delete' => 'API-sleutel verwijderd :identifier', ], 'ssh-key' => [ - 'create' => 'SSH sleutel :fingerprint aan account toegevoegd', - 'delete' => 'SSH sleutel :fingerprint verwijderd van account', + 'create' => 'SSH sleutel :fingerprint aan account toegevoegd', + 'delete' => 'SSH sleutel :fingerprint verwijderd van account', ], 'two-factor' => [ 'create' => 'Tweestapsverificatie ingeschakeld', @@ -39,9 +39,8 @@ ], ], 'server' => [ - 'reinstall' => 'Opnieuw geinstalleerde server', 'console' => [ - 'command' => '":command" is uitgevoerd op de server', + 'command' => '":command" is uitgevoerd op de server', ], 'power' => [ 'start' => 'De server is gestart', @@ -50,7 +49,7 @@ 'kill' => 'De server is gekilled', ], 'backup' => [ - 'download' => ':name back-up is gedownload', + 'download' => ':name back-up is gedownload', 'delete' => 'De :name back-up verwijderd', 'restore' => 'De :name back-up hersteld (verwijderde bestanden: :truncate)', 'restore-complete' => 'Herstel van de :name back-up voltooid', @@ -60,71 +59,67 @@ 'fail' => 'De backup :name has failed', 'lock' => 'Backup :name vergrendeld', 'unlock' => 'Backup :name ontgrendeld', + 'rename' => 'Back-up hernoemd van ":old_name" naar ":new_name"', ], 'database' => [ - 'create' => 'Database :name gemaakt', - 'rotate-password' => 'Wachtwoord geroteerd voor database :name', - 'delete' => 'Database :name verwijderd', + 'create' => 'Nieuwe Database gemaakt', + 'rotate-password' => 'Wachtwoord geroteerd voor database ', + 'delete' => 'Database verwijderd', ], 'file' => [ - 'compress_one' => 'Gecomprimeerd :directory:bestand', - 'compress_other' => 'Gecomprimeerd :count bestanden in :directory', - 'read' => 'De inhoud van :file is bekeken', + 'compress' => 'Gecomprimeerd :directory:files|Gecomprimeerd : bestanden in', + 'read' => 'De inhoud van is bekeken', 'copy' => 'Kopie gemaakt van :file', 'create-directory' => 'Map :directory:name aangemaakt', - 'decompress' => 'Uitgepakt :files in :directory', - 'delete_one' => 'Verwijderd :directory:files.0', - 'delete_other' => 'Verwijderde :count bestanden in :directory', - 'download' => ':file gedownload', + 'decompress' => 'Uitgepakt :file in :directory', + 'delete' => 'Verwijderd :directory:files|Verwijderd :count bestanden in :directory', + 'download' => 'Gedownload :file', 'pull' => 'Een extern bestand gedownload van :url naar :directory', - 'rename_one' => ':directory:files.0.from naar :directory:files.0.to hernoemd', - 'rename_other' => ':count bestanden in :directory hernoemd', - 'write' => 'Nieuwe inhoud geschreven naar :file', + 'rename' => 'Verplaatsen/hernoemd :from naar :to|Verplaatst/ Hernoemd :count bestanden in :directory', + 'write' => 'Nieuwe inhoud geschreven naar :file', 'upload' => 'Bestandsupload is gestart', - 'uploaded' => ':directory:file geüpload', + 'uploaded' => 'Geüpload :directory:file', ], 'sftp' => [ - 'denied' => 'Geblokkeerde SFTP toegang vanwege machtigingen', - 'create_one' => ':files.0 aangemaakt', - 'create_other' => ':count nieuwe bestanden aangemaakt', - 'write_one' => 'De inhoud van :files.0 gewijzigd', - 'write_other' => 'De inhoud van :count bestanden gewijzigd', - 'delete_one' => ':files.0 verwijderd', - 'delete_other' => ':count bestanden verwijderd', - 'create-directory_one' => 'Map :files.0 aangemaakt', - 'create-directory_other' => ':count mappen aangemaakt', - 'rename_one' => ':files.0.from naar :files.0.to hernoemd', - 'rename_other' => ':count bestanden hernoemd of verplaatst', + 'denied' => 'SFTP-toegang geblokkeerd vanwege machtigingen', + 'create' => 'Aangemaakte :files|Aangemaakte :count nieuwe bestanden', + 'write' => 'De inhoud van :files gewijzigd | De inhoud van :count bestanden gewijzigd', + 'delete' => 'Verwijderde :files|Verwijderde :count bestanden', + 'create-directory' => 'De map :files aangemaakt|:count mappen aangemaakt', + 'rename' => 'Hernoemd :from naar :to|Hernoemd of verplaatst :count bestanden', ], 'allocation' => [ - 'create' => ':allocation aan de server toegevoegd', - 'notes' => 'De notitie voor :allocation van ":old" is gewijzigd naar ":new"', - 'primary' => ':allocation is als de primaire server toewijzing ingesteld', - 'delete' => ':allocation toewijzing verwijderd', + 'create' => ':allocation toegevoegd aan de server', + 'notes' => 'De notities voor :allocation bijgewerkt van ":old" naar ":new"', + 'primary' => ':allocation ingesteld als de primaire servertoewijzing', + 'delete' => 'De toewijzing :allocation verwijderd', ], 'schedule' => [ - 'create' => 'Taak :name aangemaakt', - 'update' => 'Taak :name bewerkt', - 'execute' => 'Taak :name handmatig uitgevoerd', - 'delete' => 'Taak :name verwijderd', + 'create' => 'Het :name-schema aangemaakt', + 'update' => 'Het :name-schema bijgewerkt', + 'execute' => 'Handmatig het :name schema uitgevoerd', + 'delete' => 'Verwijderde het :name schema', ], 'task' => [ - 'create' => 'Nieuwe ":action" opdracht aangemaakt voor de taak :name', - 'update' => '":action" opdracht aangepast voor de taak :name', - 'delete' => 'Opdracht verwijderd de taak :name', + 'create' => 'Een nieuwe :action taak aangemaakt voor het :name schema', + 'update' => 'Bijgewerkte de :action taak voor het :name schema', + 'delete' => 'Verwijderde de ":action" taak voor het :name schema', ], 'settings' => [ - 'rename' => 'Server hernoemd van :old naar :new', - 'description' => 'De beschrijving van de server veranderd van :old naar :new', + 'rename' => 'De server hernoemd van ":old" naar ":new"', + 'description' => 'De serverbeschrijving gewijzigd van ":old" naar ":new"', + 'reinstall' => 'Server opnieuw geïnstalleerd', ], 'startup' => [ - 'edit' => 'De :variable variabele van ":old" naar ":new" gewijzigd', - 'image' => 'Docker image van de server is aangepast van :old naar :new', + 'edit' => 'De :variable variabele gewijzigd van ":old" naar ":new"', + 'image' => 'De Docker-image voor de server bijgewerkt van :old naar :new', + 'command' => 'Het opstartcommando voor de server van :old bijgewerkt naar :new', ], 'subuser' => [ - 'create' => ':email toegevoegd als medegebruiker', - 'update' => 'Permissies van medegebruiker :email gewijzigd', - 'delete' => ':email verwijderd als medegebruiker', + 'create' => ':email toegevoegd als subgebruiker', + 'update' => 'De machtigingen van de subgebruiker bijgewerkt voor :email', + 'delete' => ':email verwijderd als subgebruiker', ], + 'crashed' => 'Server gecrasht', ], ]; diff --git a/lang/nl/admin/apikey.php b/lang/nl/admin/apikey.php new file mode 100644 index 0000000000..e1488202c3 --- /dev/null +++ b/lang/nl/admin/apikey.php @@ -0,0 +1,27 @@ + 'Applicatie API Sleutels', + 'empty' => 'Geen API sleutels', + 'whitelist' => 'Toegestane IPv4 adressen', + 'whitelist_help' => 'API-sleutels kunnen alleen gebruikt worden vanaf specifieke IPv4-adressen. Voer elk adres op een nieuwe regel in.', + 'whitelist_placeholder' => 'Bijvoorbeeld: 127.0.0.1 of 192.168.1.1', + 'description' => 'Beschrijving', + 'description_help' => 'Een korte beschrijving waarvoor de sleutel gebruikt wordt.', + 'nav_title' => 'API Sleutels', + 'model_label' => 'Applicatie API-sleutel', + 'model_label_plural' => 'Applicatie API Sleutels', + 'table' => [ + 'key' => 'Sleutel', + 'description' => 'Beschrijving', + 'last_used' => 'Laatst gebruikt', + 'created' => 'Aangemaakt', + 'created_by' => 'Gemaakt door', + 'never_used' => 'Nooit gebruikt', + ], + 'permissions' => [ + 'none' => 'Geen', + 'read' => 'Lezen', + 'read_write' => 'Lezen & schrijven', + ], +]; diff --git a/lang/nl/admin/dashboard.php b/lang/nl/admin/dashboard.php new file mode 100644 index 0000000000..69ad99fb6d --- /dev/null +++ b/lang/nl/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Welkom bij Pelican!', + 'version' => 'Versie: :version', + 'advanced' => 'Geavanceerd', + 'server' => 'Server', + 'user' => 'Gebruiker', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informatie voor Ontwikkelaars', + 'content' => 'Bedankt voor het uitproberen van de ontwikkelingsversie!', + 'extra_note' => 'Als u problemen ondervindt, meld ze dan op GitHub.', + 'button_issues' => 'Maak een issue aan', + 'button_features' => 'Discussieer over functionaliteiten', + ], + 'intro-update-available' => [ + 'heading' => 'Update beschikbaar', + 'content' => ':latestVersion is nu beschikbaar! Lees onze documentatie om uw paneel bij te werken.', + 'button_changelog' => 'Wat is er nieuw?', + ], + 'intro-no-update' => [ + 'heading' => 'Uw paneel is up to date', + 'content' => 'Je gebruikt Pelican versie :version. Je panel is up-to-date!', + ], + 'intro-first-node' => [ + 'heading' => 'Geen Nodes Gedetecteerd', + 'content' => 'Het lijkt erop dat je nog geen Nodes hebt ingesteld, maar maak je geen zorgen, door op de actieknop te klikken kan je jouw eerste Node maken!', + 'extra_note' => 'Als je problemen ondervindt, rapporteer deze dan op GitHub.', + 'button_label' => 'Eerste Node aanmaken in Pelican', + ], + 'intro-support' => [ + 'heading' => 'Steun Pelican', + 'content' => 'Dank u voor het gebruik van Pelican, dit kon alleen worden bereikt met de steun van u, onze contributers de rest van onze supporters!', + 'extra_note' => 'We waarderen elke en alle steun van iedereen.', + 'button_translate' => 'Help Vertalen', + 'button_donate' => 'Direct Doneren', + ], + 'intro-help' => [ + 'heading' => 'Hulp nodig?', + 'content' => 'Bekijk eerst de documentatie! Als je nog hulp nodig hebt, kijk dan naar onze Discord server!', + 'button_docs' => 'Documentatie lezen', + ], + ], +]; diff --git a/lang/nl/admin/databasehost.php b/lang/nl/admin/databasehost.php new file mode 100644 index 0000000000..74f4a63fa0 --- /dev/null +++ b/lang/nl/admin/databasehost.php @@ -0,0 +1,75 @@ + 'Database Hosts', + 'model_label' => 'Database Host', + 'model_label_plural' => 'Database Hosts', + 'table' => [ + 'database' => 'Database', + 'name' => 'Naam', + 'host' => 'Host', + 'port' => 'Poort', + 'name_helper' => 'Dit leeg laten zal automatisch een willekeurige naam genereren', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'remote' => 'Verbindingen van', + 'remote_helper' => 'Van waar verbindingen toegestaan moeten worden. Laat leeg om verbindingen van overal toe te staan.', + 'max_connections' => 'Max. Aantal verbindingen', + 'created_at' => 'Gemaakt Op', + 'connection_string' => 'JDBC Verbinding Koppeling', + ], + 'error' => 'Fout bij verbinden met host', + 'host' => 'Host', + 'host_help' => 'Het IP-adres of de domeinnaam die moet worden gebruikt bij het verbinden met deze MySQL-host vanuit dit paneel om nieuwe databases aan te maken.', + 'port' => 'Poort', + 'port_help' => 'De poort waarop MySQL draait voor deze host.', + 'max_database' => 'Maximaal aantal databases', + 'max_databases_help' => 'Het maximale aantal databases dat op deze host kan worden aangemaakt. Als de limiet is bereikt, kunnen er geen nieuwe databanken worden gecreëerd over deze host. Blank is onbeperkt.', + 'display_name' => 'Weergavenaam', + 'display_name_help' => 'Het IP-adres of domeinnaam die aan de eindgebruiker getoond moet worden.', + 'username' => 'Gebruikersnaam', + 'username_help' => 'De gebruikersnaam van een account die voldoende rechten heeft om nieuwe gebruikers en databases aan te maken op het systeem.', + 'password' => 'Wachtwoord', + 'password_help' => 'Het wachtwoord voor de gebruiker van de database.', + 'linked_nodes' => 'Gekoppelde Nodes', + 'linked_nodes_help' => 'Deze instelling is alleen standaard ingesteld op deze database host bij het toevoegen van een database aan een server op de geselecteerde Node.', + 'connection_error' => 'Fout bij het verbinden met database host', + 'no_database_hosts' => 'Geen Database Hosts', + 'no_nodes' => 'Geen Nodes', + 'delete_help' => 'De Database Host heeft Databases', + 'unlimited' => 'Onbeperkt', + 'anywhere' => 'Alle richtingen', + + 'rotate' => 'Roteren', + 'rotate_password' => 'Wachtwoord wijzigen', + 'rotated' => 'Wachtwoord gewijzigd', + 'rotate_error' => 'Wachtwoord Wijzigen mislukt', + 'databases' => 'Databases', + + 'setup' => [ + 'preparations' => 'Voorbereidingen', + 'database_setup' => 'Database Instellen', + 'panel_setup' => 'Paneel Instellen', + + 'note' => 'Momenteel worden alleen MySQL/ MariaDB databases ondersteund voor database hosts!', + 'different_server' => 'Zijn het paneel en de database niet op dezelfde server?', + + 'database_user' => 'Database Gebruiker', + 'cli_login' => 'Gebruik MySQL u root p voor toegang tot MySQL cli.', + 'command_create_user' => 'Commando om de gebruiker aan te maken', + 'command_assign_permissions' => 'Commando om machtigingen toe te wijzen', + 'cli_exit' => 'Om MySQL cli te verlaten voer exit uit.', + 'external_access' => 'Externe Toegang', + 'allow_external_access' => ' +

Kansen zult u externe toegang tot deze MySQL-instantie nodig hebben om servers verbinding te laten maken.

+
+

Om dit te doen open mijne. nf, welke de locatie varieert afhankelijk van uw besturingssysteem en hoe MySQL is geïnstalleerd. Je kunt /etc -iname my.cnf typen om het te vinden.

+
+

Open mijne. nf, voeg hieronder tekst toe aan de onderkant van het bestand en sla deze op:
+ [mysqld]
bind-address=0. .0.

+
+ +

Herstart MySQL/ MariaDB om deze wijzigingen toe te passen. Dit overschrijft de standaard MySQL configuratie, die standaard alleen verzoeken van localhost accepteert. Door dit te updaten worden verbindingen op alle interfaces mogelijk, dus externe verbindingen. Zorg ervoor dat de MySQL poort (standaard 3306) in uw firewall is toegestaan.

+ ', + ], +]; diff --git a/lang/nl/admin/egg.php b/lang/nl/admin/egg.php new file mode 100644 index 0000000000..f6e2c74927 --- /dev/null +++ b/lang/nl/admin/egg.php @@ -0,0 +1,110 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => 'Configuratie', + 'process_management' => 'Processen en verwerkingen', + 'egg_variables' => 'Egg Variabelen', + 'install_script' => 'Installatiescript', + ], + 'import' => [ + 'file' => 'Bestand', + 'url' => 'URL', + 'image_url' => 'Foto URL', + 'image_error' => 'Kan afbeelding niet ophalen', + 'image_too_large' => 'Afbeelding is te groot. Limiet is 1024KB', + 'egg_help' => 'Dit zou het raw .json bestand moeten zijn (egg-minecraft.json )', + 'url_help' => 'URL\'s moeten rechtstreeks naar het raw .json bestand verwijzen', + 'add_url' => 'Nieuwe URL', + 'import_failed' => 'Import niet geslaagd', + 'import_success' => 'Importeren gelukt', + 'github' => 'Voeg toe vanuit', + 'refresh' => 'Herlaad', + 'import_image' => 'Afbeelding importeren', + 'no_local_ip' => 'Lokale IP-adressen zijn niet toegestaan', + 'unsupported_format' => 'Niet ondersteunde indeling. Ondersteunde formaten: ', + 'invalid_url' => 'De opgegeven URL is ongeldig', + 'image_deleted' => 'Afbeelding verwijderd', + 'no_image' => 'Geen afbeelding opgegeven', + 'image_updated' => 'Afbeelding bijgewerkt', + ], + 'export' => [ + 'modal' => 'Hoe wil je :egg exporteren?', + 'as' => 'Als .:format', + ], + 'in_use' => 'In gebruik', + 'servers' => 'Servers', + 'name' => 'Naam', + 'egg_uuid' => 'Egg UUID', + 'egg_id' => 'Egg ID', + 'name_help' => 'Een eenvoudige, menselijk leesbare naam om te gebruiken als identificator voor deze Egg.', + 'author' => 'Auteur', + 'uuid_help' => 'Dit is de globaal unieke identificatie voor deze Egg dat Wings als een identificator gebruikt.', + 'author_help' => 'De auteur van deze versie van het Ei.', + 'author_help_edit' => 'De auteur van deze versie van de Egg. Het uploaden van een nieuwe configuratie van een andere auteur zal dit veranderen.', + 'description' => 'Beschrijving', + 'description_help' => 'Een beschrijving van deze Egg die zal worden weergegeven in het gehele Paneel indien nodig.', + 'add_startup' => 'Opstart commando toevoegen', + 'startup_command' => 'Commando', + 'startup_commands' => 'Opstart commando', + 'startup_name' => 'Weergavenaam', + 'startup_help' => 'De opstart commando\'s die beschikbaar zijn voor servers die dit ei gebruiken. De eerste is de standaard.', + 'file_denylist' => 'Bestand weigeringslijst', + 'file_denylist_help' => 'Een lijst met bestanden die de eindgebruiker niet mag bewerken.', + 'features' => 'Functies', + 'force_ip' => 'Forceer Uitgaande IP', + 'force_ip_help' => 'Dwingt al het uitgaande netwerkverkeer om zijn bron-IP te laten NATeren tot het IP-adres van de primaire allocatie van de server. +Vereist voor het goed functioneren van bepaalde spellen als de Node meerdere openbare IP-adressen heeft. +Het inschakelen van deze optie zal interne netwerken voor alle servers met deze egg uitschakelen, waardoor ze geen interne toegang hebben tot andere servers op dezelfde node.', + 'tags' => 'Tags', + 'update_url' => 'URL bijwerken', + 'update_url_help' => 'URL\'s moeten rechtstreeks naar het raw .json bestand verwijzen', + 'add_image' => 'Docker Image toevoegen', + 'docker_images' => 'Docker Images', + 'docker_name' => 'Image Naam', + 'docker_uri' => 'Image URI', + 'docker_help' => 'De Docker afbeeldingen beschikbaar voor servers die dit ei gebruiken. De eerste is de standaard.', + + 'stop_command' => 'Stop opdracht', + 'stop_command_help' => 'De opdracht die naar serverprocessen moet worden gestuurd om ze op een nette manier te stoppen. Als je een SIGINT moet sturen, moet je hier ^C invoeren.', + 'copy_from' => 'Instellingen kopiëren van', + 'copy_from_help' => 'Als u de standaardinstellingen wilt gebruiken in een ander Ei selecteer het in het menu hierboven.', + 'none' => 'Geen', + 'start_config' => 'Start Configuratie', + 'start_config_help' => 'Lijst met waarden die de daemon zou moeten zoeken bij het opstarten van een server om de voltooiing te bepalen.', + 'config_files' => 'Configuratiebestanden', + 'config_files_help' => 'Dit moet een JSON weergave zijn van de configuratiebestanden die u wilt wijzigen en welke onderdelen moeten worden gewijzigd.', + 'log_config' => 'Log Configuratie', + 'log_config_help' => 'Dit moet een JSON weergave zijn van waar logbestanden worden opgeslagen, en of de daemon al dan niet aangepaste logs moet maken.', + + 'environment_variable' => 'Omgevingsvariabele', + 'default_value' => 'Standaard waarde', + 'user_permissions' => 'Gebruikersrechten', + 'viewable' => 'Zichtbare', + 'editable' => 'Bewerkbaar', + 'rules' => 'Regels', + 'add_new_variable' => 'Voeg nieuwe variabele toe', + + 'error_unique' => 'Er bestaat al een variabel met deze naam!', + 'error_required' => 'Het omgevingsvariabele veld is vereist.', + 'error_reserved' => 'Deze omgevingsvariabele is gereserveerd en kan niet worden gebruikt.', + + 'script_from' => 'Script van', + 'script_container' => 'Script container', + 'script_entry' => 'Script Invoer', + 'script_install' => 'Installatiescript', + 'no_eggs' => 'Geen Eggs', + 'no_servers' => 'Geen Servers', + 'no_servers_help' => 'Er zijn geen servers toegewezen aan deze Egg', + + 'update' => 'Update|Update geselecteerd', + 'updated' => 'Egg bijgewerkt|:count/:total Eggs bijgewerkt', + 'updated_failed' => ':count mislukt', + 'updated_skipped' => ':count overgeslagen', + 'update_question' => 'Weet u zeker dat u deze egg wilt bijwerken?|Weet u zeker dat u de geselecteerde eggs wilt bijwerken?', + 'update_description' => 'Als u wijzigingen aanbrengt in de egg, zullen ze worden overschreven!|Wanneer u wijzigingen aanbrengt aan de eggs zullen ze worden overschreven!', + 'no_updates' => 'Geen updates voor de geselecteerde eggs beschikbaar', +]; diff --git a/lang/nl/admin/eggs.php b/lang/nl/admin/eggs.php deleted file mode 100644 index 8386da35b1..0000000000 --- a/lang/nl/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Het importeren van deze egg en de bijbehorende variabelen is geslaagd.', - 'updated_via_import' => 'Deze egg is bijgewerkt met behulp van het opgegeven bestand.', - 'deleted' => 'De aangevraagde egg is met succes uit het paneel verwijderd.', - 'updated' => 'Egg configuratie is met succes bijgewerkt.', - 'script_updated' => 'Egg install script is bijgewerkt en wordt uitgevoerd wanneer er servers worden geïnstalleerd.', - 'egg_created' => 'Een nieuw egg is met succes toegevoegd. U moet elke lopende daemon opnieuw opstarten om deze nieuwe egg toe te passen.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'De variabele ":variable" is verwijderd en zal niet meer beschikbaar zijn voor servers nadat deze opnieuw zijn opgebouwd.', - 'variable_updated' => 'De variabele ":variable" is bijgewerkt. Je moet elke server opnieuw opbouwen met deze variabele om wijzigingen toe te passen.', - 'variable_created' => 'Er is een nieuwe variabele aangemaakt en toegewezen aan deze egg.', - ], - ], -]; diff --git a/lang/nl/admin/health.php b/lang/nl/admin/health.php new file mode 100644 index 0000000000..c62af490b6 --- /dev/null +++ b/lang/nl/admin/health.php @@ -0,0 +1,60 @@ + 'Status ', + 'results_refreshed' => 'Resultaten van gezondheidscontrole bijgewerkt', + 'checked' => 'Gecontroleerde resultaten van :time', + 'refresh' => 'Vernieuw', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Oké', + 'failed_retrieve' => 'Kan de waarde van de applicatie-cache niet instellen of ophalen.', + 'failed' => 'Er is een uitzondering opgetreden in de applicatie cache: :error', + ], + 'database' => [ + 'label' => 'Database', + 'ok' => 'Oké', + 'failed' => 'Kan niet verbinden met de database: :error', + ], + 'debugmode' => [ + 'label' => 'Debugmodus', + 'ok' => 'Debugmodus is uitgeschakeld', + 'failed' => 'De debug modus zou :expected, maar eigenlijk :actual waren', + ], + 'environment' => [ + 'label' => 'Environment', + 'ok' => 'Oké, ingesteld op :actual', + 'failed' => 'Omgeving ingesteld op :actual , verwacht :expected', + ], + 'nodeversions' => [ + 'label' => 'Node Versie', + 'ok' => 'Nodes zijn up-to-date', + 'failed' => ':verouderd/:alle Nodes zijn verouderd', + 'no_nodes_created' => 'Geen Nodes Aangemaakt', + 'no_nodes' => 'Geen Nodes', + 'all_up_to_date' => 'Alle up-to-date', + 'outdated' => ':verouderd/:all verouderd', + ], + 'panelversion' => [ + 'label' => 'Paneel versie', + 'ok' => 'Uw paneel is up to date', + 'failed' => 'Geïnstalleerde versie is :currentVersion maar de laatste versie is :latestVersion', + 'up_to_date' => 'Up-to-date', + 'outdated' => 'Verouderd', + ], + 'schedule' => [ + 'label' => 'Planning', + 'ok' => 'Oké', + 'failed_last_ran' => 'De laatste uitvoering van de planning was meer dan :time minuten geleden', + 'failed_not_ran' => 'De planning is nog niet uitgevoerd.', + ], + 'useddiskspace' => [ + 'label' => 'Schijfruimte', + ], + ], + 'checks' => [ + 'successful' => 'Succesvol', + 'failed' => 'mislukt', + ], +]; diff --git a/lang/nl/admin/log.php b/lang/nl/admin/log.php new file mode 100644 index 0000000000..8d3d05156e --- /dev/null +++ b/lang/nl/admin/log.php @@ -0,0 +1,26 @@ + 'Ja! Geen fout!', + 'total_logs' => 'Totaal aantal logs', + 'error' => 'Error', + 'warning' => 'Waarschuwing', + 'notice' => 'Attentie', + 'info' => 'Informatie', + 'debug' => 'Foutopsporing', + 'navigation' => [ + 'panel_logs' => 'Paneel Logs', + ], + 'actions' => [ + 'upload_logs' => 'Logs uploaden?', + 'upload_logs_description' => 'Dit zal :file uploaden naar :url weet je zeker dat je dit wilt doen?', + 'view_logs' => 'Logboek weergeven', + 'log_not_found' => 'Log niet gevonden!', + 'log_not_found_description' => 'Kon het logboek voor :filename niet vinden', + 'failed_to_upload' => 'Het uploaden is mislukt.', + 'failed_to_upload_description' => 'HTTP Status: :status', + 'log_upload' => 'Log geüpload!', + 'log_upload_action' => 'Bekijk log', + 'upload_tooltip' => 'Uploaden naar :url', + ], +]; diff --git a/lang/nl/admin/mount.php b/lang/nl/admin/mount.php new file mode 100644 index 0000000000..4aaa724311 --- /dev/null +++ b/lang/nl/admin/mount.php @@ -0,0 +1,30 @@ + 'Mounts', + 'model_label' => 'Mount', + 'model_label_plural' => 'Mounts', + 'name' => 'Naam', + 'name_help' => 'Unieke naam die gebruikt wordt om deze mount te scheiden van een andere.', + 'source' => 'Bron', + 'source_help' => 'Bestandspad op het hostsysteem om te koppelen aan een container', + 'target' => 'Doel', + 'target_help' => 'Waar de mount toegankelijk zal zijn in een container.', + 'read_only' => 'Alleen lezen?', + 'read_only_help' => 'Is de mount alleen leesbaar in de container?', + 'description' => 'Beschrijving', + 'description_help' => 'Een langere beschrijving voor deze Mount', + 'no_mounts' => 'Geen Mounts', + 'eggs' => 'Eggs', + 'nodes' => 'Nodes', + 'toggles' => [ + 'writable' => 'Schrijfbaar', + 'read_only' => 'Alleen lezen', + ], + 'table' => [ + 'name' => 'Naam', + 'all_eggs' => 'Alle Eggs', + 'all_nodes' => 'Alle Nodes', + 'read_only' => 'Alleen lezen', + ], +]; diff --git a/lang/nl/admin/node.php b/lang/nl/admin/node.php index 7aeb8c611e..3d48bc18b2 100644 --- a/lang/nl/admin/node.php +++ b/lang/nl/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'De opgegeven FQDN of IP adres kan niet gekoppeld worden aan een geldig IP-adres.', - 'fqdn_required_for_ssl' => 'Een volledig domein naam welke naar een openbaar IP-adres wijst is nodig om SSL te gebruiken op deze node.', + 'nav_title' => 'Nodes', + 'model_label' => 'Node', + 'model_label_plural' => 'Nodes', + 'create' => 'Maak Node', + 'tabs' => [ + 'overview' => 'Overzicht', + 'basic_settings' => 'Basis instellingen', + 'advanced_settings' => 'Geavanceerde instellingen', + 'config_file' => 'Configuratiebestand', + 'diagnostics' => 'Diagnose', ], - 'notices' => [ - 'allocations_added' => 'Allocaties zijn succesvol toegevoegd aan deze node.', - 'node_deleted' => 'De node is succesvol verwijderd van het paneel.', - 'node_created' => 'De node is succesvol aangemaakt. Je kan automatisch de daemon configureren op deze machine door het tabje \'Configuratie\' te bezoeken. Voordat je servers kan aanmaken, moet je minimaal één IP-adres en poort toewijzen.', - 'node_updated' => 'Node informatie is bijgewerkt. Als de daemon instellingen zijn aangepast, dien je de daemon te herstarten om wijzigingen toe te passen.', - 'unallocated_deleted' => 'Alle niet toegewezen poorten zijn verwijderd voor: ip', + 'table' => [ + 'health' => 'Status', + 'name' => 'Naam', + 'address' => 'Adres', + 'public' => 'Openbaar', + 'servers' => 'Servers', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => 'Eigenaar', + 'allocation_notes' => 'Notities', + 'no_notes' => 'Geen notities', ], + 'node_info' => 'Node informatie', + 'wings_version' => 'Wings Versie', + 'cpu_threads' => 'CPU Threads', + 'architecture' => 'Architectuur', + 'kernel' => 'Kernel', + 'unknown' => 'Onbekend', + 'latest' => 'Laatste', + 'node_uuid' => 'Node UUID', + 'node_id' => 'Node ID', + + 'ip_address' => 'IP-adres', + 'ip_help' => 'Meestal het openbare IP-adres van uw machine, tenzij u poort-forwarding gebruikt.', + 'alias_help' => 'Optionele weergavenaam om u te helpen onthouden wat deze zijn.', + 'refresh' => 'Vernieuw', + 'domain' => 'Domeinnaam', + 'ssl_ip' => 'U kunt geen verbinding maken met een IP-adres via SSL', + 'error' => 'Dit is de domeinnaam die verwijst naar het IP-adres van uw node. Als u dit al hebt ingesteld, dan kunt u dit verifiëren door het volgende veld te controleren!', + 'fqdn_help' => 'Uw panel is momenteel beveiligd met een SSL-certificaat, wat betekent dat uw nodes er ook een nodig hebben. U moet een domeinnaam gebruiken, omdat u geen SSL-certificaten kunt verkrijgen voor IP-adressen.', + 'dns' => 'Controle DNS-record', + 'dns_help' => 'Dit laat u weten of u DNS-record wijst naar het juiste IP-adres.', + 'valid' => 'Geldig', + 'invalid' => 'Ongeldig', + 'port' => 'Poort', + 'ports' => 'Poorten', + 'port_help' => 'Als je de daemon achter Cloudflare draait, moet je de daemonpoort instellen op 8443 om websocket proxying over SSL toe te staan.', + 'connect_port' => 'Verbinding Port', + 'connect_port_help' => 'Verbindingen met wings gebruiken deze poort. Als u een reverse proxy gebruikt, kan deze poort afwijken van de luisterpoort. Gebruik bij gebruik van een Cloudflare proxy 8443.', + 'listen_port' => 'Luisterende Port', + 'listen_port_help' => 'Wings zal luisteren naar deze port.', + 'display_name' => 'Weergavenaam', + 'ssl' => 'Communiceer via SSL', + 'panel_on_ssl' => 'Je Panel gebruikt een beveiligde SSL-verbinding,
dus je Daemon moet dat ook zijn.', + 'ssl_help' => 'SSL kan niet gebruikt worden door een IP-adres.', + + 'tags' => 'Tags', + 'upload_limit' => 'Upload limiet', + 'upload_limit_help' => 'Vul de maximale grootte van bestanden in die kunnen worden geüpload via de op web-gebaseerde bestandsbeheerder.', + 'sftp_port' => 'SFTP Poort', + 'sftp_alias' => 'SFTP Alias', + 'sftp_alias_help' => 'Toon alias voor het SFTP-adres. Laat leeg om Node FQDN te gebruiken.', + 'use_for_deploy' => 'Gebruiken voor Deployments?', + 'maintenance_mode' => 'Onderhoudsmodus', + 'maintenance_mode_help' => 'Als de node is gemarkeerd \'Onderhoud\' zullen de gebruikers geen toegang hebben tot servers die op die node staan', + + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU Limiet', + 'memory' => 'Geheugen', + 'memory_limit' => 'Geheugen limiet', + 'disk' => 'Schijf', + 'disk_limit' => 'Schijf limiet', + 'unlimited' => 'Onbeperkt', + 'limited' => 'Gelimiteerd', + 'overallocate' => 'Overallocate', + 'enabled' => 'Ingeschakeld', + 'disabled' => 'Uitgeschakeld', + 'yes' => 'Ja', + 'no' => 'Nee', + + 'instructions' => 'Instructies', + 'instructions_help' => 'Sla dit bestand op in uw daemon\'s root directory, genaamd config.yml', + + 'auto_deploy' => 'Automatische deployment-opdracht', + 'auto_question' => 'Kies tussen Standalone en Docker installatie.', + 'auto_label' => 'Type', + 'standalone' => 'Standalone', + 'docker' => 'Docker', + 'auto_command' => 'Voer de volgende opdracht uit om uw node automatisch te configureren:', + 'reset_token' => 'Reset Autorisatie Token', + 'token_reset' => 'De daemon token is gereset.', + 'reset_help' => 'Het opnieuw instellen van de daemon-token maakt alle verzoeken ongeldig die afkomstig zijn van het oude token. Dit token wordt gebruikt voor alle gevoelige operaties op de daemon, waaronder het aanmaken en verwijderen van servers. We raden aan om dit token regelmatig te wijzigen voor de veiligheid.', + + 'no_nodes' => 'Geen Nodes', + 'none' => 'Geen', + 'cpu_chart' => 'CPU - :cpu% van :max%', + 'memory_chart' => 'Geheugen - :used van :total', + 'disk_chart' => 'Opslag - :used van :total', + 'used' => 'Gebruikt', + 'unused' => 'Ongebruikt', + + 'next_step' => 'Volgende stap', + 'node_has_servers' => 'Node heeft servers', + 'create_allocation' => 'Toewijzing aanmaken', + 'primary_allocation' => 'Primaire Toewijzing', + 'databases' => 'Databases', + 'backups' => 'Back-ups', + + 'error_connecting' => 'Fout bij verbinden met node', + 'error_connecting_description' => 'De configuratie kon niet automatisch worden bijgewerkt op Wings, u moet het configuratiebestand handmatig bijwerken.', + 'allocation' => 'Toewijzing', + + 'diagnostics' => [ + 'header' => 'Node diagnose', + 'include_endpoints' => 'Eindpunten inbegrepen', + 'include_endpoints_hint' => 'Met eindpunten worden paneel URL\'s in de logs getoond en deze NIET vervaagd.', + 'include_logs' => 'Logs toevoegen', + 'include_logs_hint' => 'Inclusief logs zal recente logs tonen en eventuele problemen opsporen.', + 'run_diagnostics' => 'Diagnose uitvoeren', + 'upload_to_pelican' => 'Logs uploaden', + 'logs_pulled' => 'Logboeken verzameld!', + 'logs_uploaded' => 'Logs geüpload', + 'upload_failed' => 'Logs Upload Mislukt', + 'view_logs' => 'Logboek weergeven', + 'pull' => 'Pull', + 'upload' => 'Uploaden', + 'clear' => 'Leegmaken', + '404' => 'Het gevraagde diagnostische rapport kan niet worden gevonden. Zorg ervoor dat de vleugels up-to-date zijn en probeer het opnieuw.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Cloudflare probleem', + 'body' => 'Uw node is niet toegankelijk via Cloudflare', + ], + + 'bulk_update_ip' => 'IP\'s bijwerken', + 'bulk_update_ip_description' => 'Vervang een oud IP-adres door een nieuwe voor toewijzingen. Dit is handig wanneer het IP-adres van een node verandert', + 'update_ip' => 'Wijzig IP', + 'old_ip' => 'Oud IP-adres', + 'new_ip' => 'Nieuw IP-adres', + 'no_allocations_to_update' => 'Er zijn geen toewijzingen met het geselecteerde oude IP-adres gevonden', + 'ip_updated' => 'Succesvol bijgewerkt :count van :total allocation(s)', + 'ip_update_failed' => ':count toewijzing(en) niet bijgewerkt', ]; diff --git a/lang/nl/admin/role.php b/lang/nl/admin/role.php new file mode 100644 index 0000000000..654db3ac74 --- /dev/null +++ b/lang/nl/admin/role.php @@ -0,0 +1,17 @@ + 'Rollen', + 'model_label' => 'Rol', + 'model_label_plural' => 'Rollen', + 'no_roles' => 'Geen rollen', + 'name' => 'Rol naam', + 'permissions' => 'Permissies', + 'in_use' => 'In gebruik', + 'all' => 'All', + 'root_admin' => 'De :role heeft alle rechten.', + 'root_admin_delete' => 'Kan Root Admin niet verwijderen', + 'users' => 'Gebruikers', + 'nodes' => 'Nodes', + 'nodes_hint' => 'Laat leeg om toegang tot alle nodes te hebben.', +]; diff --git a/lang/nl/admin/server.php b/lang/nl/admin/server.php index ba847100a9..7e6904dfc1 100644 --- a/lang/nl/admin/server.php +++ b/lang/nl/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Je probeert om een standaard toewijzing te verwijderen van de server, maar er is geen alternatieve toewijzing aanwezig.', - 'marked_as_failed' => 'De server heeft een fout gedetecteerd bij een voorgaande installatie. De huidige status kan niet worden veranderd in deze status.', - 'bad_variable' => 'Er was een validatie fout met de :name variabele.', - 'daemon_exception' => 'Er was een fout opgereden tijdens de poging om te communiceren met de daemon, met als resultaat een HTTP/:code code. Deze exceptie is opgeslagen. (aanvraag id: :request_id)', - 'default_allocation_not_found' => 'De aangevraagde standaard toewijzing is niet gevonden in de toewijzingen van deze server.', + 'nav_title' => 'Servers', + 'model_label' => 'Server', + 'model_label_plural' => 'Servers', + 'no_servers' => 'Geen Servers', + 'create' => 'Creëer server', + 'next_step' => 'Volgende stap', + 'ip_address' => 'IP-adres', + 'ip_address_helper' => 'Meestal het openbare IP-adres van uw machine, tenzij u poort-forwarding gebruikt.', + 'port' => 'Poort', + 'ports' => 'Poorten', + 'alias' => 'Alias', + 'alias_helper' => 'Optionele weergavenaam om u te helpen onthouden wat deze zijn.', + 'locked' => 'Vergrendeld?', + 'locked_helper' => 'Gebruikers kunnen de vergrendelde toewijzingen niet verwijderen', + 'lock' => 'Vergrendelen', + 'unlock' => 'Ontgrendelen', + 'name' => 'Naam', + 'external_id' => 'Extern ID', + 'owner' => 'Eigenaar', + 'description' => 'Beschrijving', + 'install_script' => 'Installatie script uitvoeren?', + 'start_after' => 'Starten na installeren?', + 'yes' => 'Ja', + 'no' => 'Nee', + 'skip' => 'Overslaan', + 'primary' => 'Primaire', + 'already_primary' => 'Al primair', + 'make_primary' => 'Primair maken', + 'startup_cmd' => 'Opstart opdracht', + 'startup_name' => 'Opstart naam', + 'default_startup' => 'Standaard startup commando', + 'startup_placeholder' => 'Voer een aangepaste opstart opdracht in', + 'variables' => 'Variabelen', + 'resource_limits' => 'Functie limieten', + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU Limiet', + 'cpu_helper' => '100% is gelijk aan één CPU kern.', + 'unlimited' => 'Onbeperkt', + 'limited' => 'Gelimiteerd', + 'enabled' => 'Ingeschakeld', + 'disabled' => 'Uitgeschakeld', + 'memory' => 'Geheugen', + 'memory_limit' => 'Geheugen limiet', + 'memory_helper' => 'Wings zal extra\'s toevoegen aan deze waarde bij het maken van de container om ervoor te zorgen dat deze niet uitvalt bij het gebruik van het maximale geheugen.', + 'disk' => 'Schijfruimte', + 'disk_limit' => 'Limiet schijfruimte', + 'advanced_limits' => 'Geavanceerde limieten', + 'cpu_pin' => 'CPU Pinnen', + 'threads' => 'Vastgezette Threads', + 'pin_help' => 'Voeg vastgepinde threads toe, bijv. 0 of 2-4', + 'swap' => 'Swap geheugen', + 'swap_limit' => 'Swap geheugen limiet', + 'oom' => 'OOM Stoppen', + 'feature_limits' => 'Functie limieten', + 'docker_settings' => 'Docker instellingen', + 'docker_image' => 'Docker Image', + 'image_name' => 'Image Naam', + 'primary_allocation' => 'Primaire Toewijzing', + 'image' => 'Image', + 'image_placeholder' => 'Voer een aangepaste Image in', + 'container_labels' => 'Container Labels', + 'title' => 'Titel', + 'actions' => 'Acties', + 'console' => 'Console', + 'suspend' => 'Schorsen', + 'unsuspend' => 'Schorsing opheffen', + 'reinstall' => 'Herinstalleren', + 'reinstall_help' => 'Dit zal de server opnieuw installeren met het toegewezen egg-installatiescript.', + 'reinstall_modal_heading' => 'Weet je zeker dat je deze server opnieuw wilt installeren?', + 'reinstall_modal_description' => '!! Dit kan leiden tot onherstelbaar data verlies !!', + 'server_status' => 'Serverstatus', + 'view_install_log' => 'Laat installatie log zien', + 'uuid' => 'UUID', + 'node' => 'Node', + 'short_uuid' => 'Korte UUID', + 'toggle_install' => 'Installatiestatus in-/uitschakelen', + 'toggle_install_help' => 'Als je de installatiestatus wilt wijzigen van gedeïnstalleerd naar geïnstalleerd, of vice versa, dan kan je dit doen met deze knop.', + 'toggle_install_failed_header' => 'Server is in de mislukte status', + 'toggle_install_failed_desc' => 'Wil je de server opnieuw installeren om dit op te lossen?', + 'transfer' => 'Overdracht', + 'transfer_help' => 'Zet deze server over naar een andere node die verbonden is met dit paneel.
Waarschuwing! Deze functie is nog steeds experimenteel. Overweeg handmatig een back-up te maken om gegevensverlies te voorkomen!', + 'condition' => 'Conditie', + 'suspend_all' => 'Alle servers schorsen', + 'unsuspend_all' => 'Alle servers schorsing opheffen', + 'select_allocation' => 'Selecteer Toewijzing', + 'new_allocation' => 'Maak nieuwe Toewijzing', + 'additional_allocations' => 'Extra toewijzingen', + 'select_additional' => 'Selecteer extra toewijzingen', + 'no_variables' => 'Het geselecteerde egg heeft geen variabelen!', + 'select_egg' => 'Selecteer een egg eerst om de variabelen te tonen!', + 'allocations' => 'Toewijzingen', + 'databases' => 'Databases', + 'no_databases' => 'Voor deze server bestaan geen Databases', + 'delete_db' => 'Weet je zeker dat je wilt verwijderen', + 'delete_db_heading' => 'Database verwijderen?', + 'backups' => 'Back-ups', + 'egg' => 'Egg', + 'mounts' => 'Mounts', + 'no_mounts' => 'Er bestaan geen Mounts voor deze node', + 'create_database' => 'Database aanmaken', + 'no_db_hosts' => 'Geen Database Hosts', + 'failed_to_create' => 'Aanmaken van database mislukt', + 'change_egg' => 'Egg wijzigen', + 'new_egg' => 'Nieuw Egg', + 'keep_old_variables' => 'Behoud indien mogelijk oude variabelen?', + 'create_allocation' => 'Toewijzing aanmaken', + 'add_allocation' => 'Toewijzing toevoegen', + 'view' => 'Bekijken', + 'no_log' => 'Geen log beschikbaar', + 'tabs' => [ + 'information' => 'Informatie', + 'egg_configuration' => 'Egg configuratie', + 'environment_configuration' => 'Omgeving configuratie', ], - 'alerts' => [ - 'startup_changed' => 'De start configuratie van deze server is bijgewerkt. Als de egg van de server is veranderd zal een herinstallatie nu plaatsvinden.', - 'server_deleted' => 'De server is succesvol verwijderd van het systeem.', - 'server_created' => 'De server is succesvol aangemaakt op het paneel. Gelieve een paar minuten wachten op de daemon totdat de server volledig is geïnstalleerd.', - 'build_updated' => 'De build details voor deze server zijn bijgewerkt. Voor sommige wijzigingen is een herstart nodig.', - 'suspension_toggled' => 'De opschorting status van de server is veranderd naar :status.', - 'rebuild_on_boot' => 'Deze server is gemarkeerd als een opnieuw opbouwen van een Docker Container. Dit zal gebeuren bij de volgende start van de server.', - 'install_toggled' => 'De installatie status voor deze server is veranderd.', - 'server_reinstalled' => 'Deze server is in de wachtrij gezet voor een herinstallatie, deze wordt nu gestart.', - 'details_updated' => 'Server details zijn succesvol bijgewerkt.', - 'docker_image_updated' => 'De standaard Docker image die voor deze server gebruikt wordt is veranderd. Een herstart is vereist om deze wijziging toe te passen.', - 'node_required' => 'Er moet ten minste één node geconfigureerd zijn voordat u een server aan dit paneel kunt toevoegen.', - 'transfer_nodes_required' => 'U moet ten minste twee nodes geconfigureerd hebben voordat u servers kunt overzetten.', - 'transfer_started' => 'De overzetting van de server is gestart.', - 'transfer_not_viable' => 'De node die u selecteerde heeft niet de vereiste schijfruimte of geheugen beschikbaar om deze server erop te laten draaien.', + 'notifications' => [ + 'server_suspension' => 'Server Schorsing', + 'server_suspended' => 'Server is geschorst', + 'server_already_suspended' => 'De server is al geschorst!', + 'server_suspend_help' => 'Dit zal de server onderbreken, alle lopende processen stopzetten, en blokkeert onmiddellijk dat de gebruiker toegang heeft tot zijn bestanden of de Server anders kan beheren via het paneel of API.', + 'server_unsuspend_help' => 'Dit zal de server opheffen en normale gebruikerstoegang herstellen.', + 'server_unsuspended' => 'Server schorsing is opgeheven', + 'error_server_delete' => 'Server kon niet veilig worden verwijderd.', + 'error_server_delete_body' => 'Je kunt het geforceerd verwijderen.', + 'create_failed' => 'Kon server niet aanmaken', + 'invalid_port_range' => 'Ongeldig poortbereik', + 'invalid_port_range_body' => 'Uw poortbereik is een ongeldig getal: :port', + 'too_many_ports' => 'Te veel poorten tegelijk!', + 'too_many_ports_body' => 'De huidige limiet is :limit aantal poorten per keer.', + 'invalid_port' => 'Poort niet in geldig bereik', + 'invalid_port_body' => ':i bevindt zich niet in het geldige poortbereik tussen :portFloor-:portCeil', + 'already_exists' => 'Poort is al in gebruik', + 'already_exists_body' => ':i is al met een toewijzing', + 'error_connecting' => 'Fout bij verbinden naar :node', + 'error_connecting_description' => 'De configuratie kan niet automatisch worden gesynchroniseerd op de Wings, u moet de server handmatig opnieuw opstarten.', + 'install_toggled' => 'Installatie status gewisseld', + 'install_toggle_failed' => 'Kon installatiestatus niet wisselen', + 'reinstall_started' => 'Opnieuw installeren gestart', + 'reinstall_failed' => 'Herinstallatie kan niet worden gestart', + 'log_failed' => 'Kan geen verbinding met Wings maken om server installatie logs op te halen', + 'transfer_started' => 'Overdracht gestart', + 'transfer_failed' => 'Overdracht mislukt', + 'already_transfering' => 'Server wordt momenteel overgedragen.', ], + 'notes' => 'Notities', + 'no_notes' => 'Geen notities beschikbaar', + 'none' => 'Geen', ]; diff --git a/lang/nl/admin/setting.php b/lang/nl/admin/setting.php new file mode 100644 index 0000000000..1a3a5d03e6 --- /dev/null +++ b/lang/nl/admin/setting.php @@ -0,0 +1,157 @@ + 'Instellingen', + 'save_success' => 'Instellingen opgeslagen', + 'save_failed' => 'Instellingen opslaan mislukt', + 'navigation' => [ + 'general' => 'Algemeen', + 'captcha' => 'CAPTCHA', + 'mail' => 'Mail', + 'backup' => 'Backup', + 'oauth' => 'OAuth', + 'misc' => 'Diversen', + ], + 'general' => [ + 'app_name' => 'Applicatie naam', + 'app_logo' => 'App Logo', + 'app_logo_help' => 'Logo moet worden geplaatst in de public map van het hoofdpaneel. Laat dit leeg om de App Naam te gebruiken.', + 'app_favicon' => 'App Favicon', + 'app_favicon_help' => 'Favicons moeten worden geplaatst in de public-map, die zich in de hoofdmap van het paneel bevindt.', + 'debug_mode' => 'Debugmodus', + 'navigation' => 'Navigatie', + 'default_navigation' => 'Standaard navigatie type', + 'sidebar' => 'Sidebar', + 'topbar' => 'Topbar', + 'mixed' => 'Gemengd', + 'unit_prefix' => 'Voorvoegsel eenheid', + 'decimal_prefix' => 'Decimaal voorvoegsel (MB/GB)', + 'binary_prefix' => 'Binair voorvoegsel (MiB/GiB)', + '2fa_requirement' => '2FA-vereisten', + 'not_required' => 'Niet vereist', + 'admins_only' => 'Alleen vereist voor beheerders', + 'all_users' => 'Vereist voor alle gebruikers', + 'trusted_proxies' => 'Vertrouwde Proxies', + 'trusted_proxies_help' => 'Nieuw IP of IP bereik', + 'clear' => 'Verwijderen', + 'set_to_cf' => 'Instellen op Cloudflare IP\'s', + 'display_width' => 'Weergavebreedte', + 'avatar_provider' => 'Avatar aanbieder', + 'uploadable_avatars' => 'Toestaan om user hun eigen avatar toe te voegen?', + ], + 'captcha' => [ + 'enable' => 'Inschakelen', + 'disable' => 'Uitschakelen', + 'info_label' => 'Info', + 'info' => 'Je kunt de sleutels genereren op je Cloudflare Dashboard. Een Cloudflare account is vereist.', + 'site_key' => 'Sitesleutel', + 'secret_key' => 'Geheime sleutel', + 'verify' => 'Domain verifiëren?', + ], + 'mail' => [ + 'mail_driver' => 'Mail Driver', + 'test_mail' => 'Test Mail verzenden', + 'test_mail_sent' => 'Test Mail verzonden', + 'test_mail_failed' => 'Test Mail is mislukt', + 'from_settings' => 'Van Instellingen', + 'from_settings_help' => 'Stel het adres en de naam in die wordt gebruikt als "Van" in mails.', + 'from_address' => 'Afzender adres', + 'from_name' => 'Van naam', + 'smtp' => [ + 'smtp_title' => 'SMTP-Configuratie', + 'host' => 'Host', + 'port' => 'Poort', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'scheme' => 'Schema', + ], + 'mailgun' => [ + 'mailgun_title' => 'Mailgun configuratie', + 'domain' => 'Domein', + 'secret' => 'Geheim', + 'endpoint' => 'Eindpunt', + ], + ], + 'backup' => [ + 'backup_driver' => 'Back-up stuurprogramma', + 'throttle' => 'Throttles', + 'throttle_help' => 'Configureer hoeveel back-ups kunnen worden gemaakt in een periode. Stel de periode in op 0 om deze beperking uit te schakelen.', + 'limit' => 'Limiet', + 'period' => 'Periode', + 'seconds' => 'Seconden', + 's3' => [ + 's3_title' => 'S3 configuratie', + 'default_region' => 'Standaardregio', + 'access_key' => 'Toegang sleutel ID', + 'secret_key' => 'Geheime toegangssleutel', + 'bucket' => 'Emmer', + 'endpoint' => 'Eindpunt', + 'use_path_style_endpoint' => 'Gebruik pad stijl eindpunt', + ], + ], + 'oauth' => [ + 'enable' => 'Inschakelen', + 'enable_schema' => ':schema inschakelen', + 'disable' => 'Uitschakelen', + 'client_id' => 'Client-ID', + 'client_secret' => 'Klant geheim', + 'redirect' => 'Omleidings URL', + 'web_api_key' => 'Web API-sleutel', + 'base_url' => 'Basis URL', + 'display_name' => 'Weergavenaam', + 'auth_url' => 'Autorisatie-callback URL', + 'create_missing_users' => 'Automatisch ontbrekende gebruikers aanmaken?', + 'link_missing_users' => 'Automatisch ontbrekende gebruikers koppelen?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Automatische toewijzing aanmaken', + 'helper' => 'Schakel of gebruikers toewijzingen kunnen maken via het client-gebied.', + 'question' => 'Gebruikers toestaan om Toewijzingen te maken?', + 'create_new' => 'Nieuwe toewijzingen aanmaken als er geen beschikbaar zijn?', + 'create_new_help' => 'Wanneer ingeschakeld, worden er nieuwe toewijzingen aangemaakt. Indien uitgeschakeld, wordt alleen toegewezen bij bestaande niet-toegewezen toewijzingen. Beide opties houden rekening met het poortbereik hieronder.', + 'start' => 'Start Poort', + 'end' => 'Eind Poort', + ], + 'mail_notifications' => [ + 'title' => 'E-mail notificaties', + 'helper' => 'Schakelen welke mailmeldingen naar gebruikers moeten worden verzonden.', + 'server_installed' => 'Server geïnstalleerd', + 'server_reinstalled' => 'Server opnieuw geïnstalleerd', + ], + 'connections' => [ + 'title' => 'Connecties', + 'helper' => 'Time-outs gebruikt bij het maken van verzoeken.', + 'request_timeout' => 'Verzoek time-out', + 'connection_timeout' => 'Time-out van de verbinding.', + 'seconds' => 'Seconden', + ], + 'activity_log' => [ + 'title' => 'Activiteitenlogboeken', + 'helper' => 'Stel in hoe vaak oude activiteitenlogs moeten worden verwijderd en of de activiteiten van beheerders moeten worden gelogd.', + 'prune_age' => 'Opschoon leeftijd', + 'days' => 'Dagen', + 'log_admin' => 'Verberg admin activiteiten?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Bepaalt de snelheidslimiet voor het aantal verzoeken per minuut dat kan worden uitgevoerd.', + 'client_rate' => 'Client-API snelheidslimiet', + 'app_rate' => 'Toepassings-API snelheidslimiet', + 'rpm' => 'Verzoeken per minuut', + ], + 'server' => [ + 'title' => 'Servers', + 'helper' => 'Instellingen voor servers', + 'edit_server_desc' => 'Gebruikers toestaan beschrijvingen te bewerken?', + 'console_font_upload' => 'Console lettertype upload', + 'console_font_hint' => 'Alleen lettertypes zijn ondersteunt. Mono lettertypes erg aangeraden!', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => 'Configureer hoe vaak oude webhook logs moeten worden verwijderd.', + 'prune_age' => 'Opschoon leeftijf', + 'days' => 'Dagen', + ], + ], +]; diff --git a/lang/nl/admin/user.php b/lang/nl/admin/user.php deleted file mode 100644 index 11abdba977..0000000000 --- a/lang/nl/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'De gebruiker kan niet worden verwijderd omdat er actieve servers aan dit account gekoppeld zijn. Gelieve de servers welke gekoppeld zijn aan dit account, te verwijderen voordat je doorgaat.', - 'user_is_self' => 'Je kunt je eigen gebruikersaccount niet verwijderen.', - ], - 'notices' => [ - 'account_created' => 'Het account is succesvol aangemaakt.', - 'account_updated' => 'Het account is succesvol bijgewerkt.', - ], -]; diff --git a/lang/nl/admin/webhook.php b/lang/nl/admin/webhook.php new file mode 100644 index 0000000000..2b0017cb74 --- /dev/null +++ b/lang/nl/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Eindpunt', + 'description' => 'Beschrijving', + 'no_webhooks' => 'Geen webhooks', + 'help' => 'Help', + 'help_text' => 'Je variabele naam moet tussen {{}} als voorbeeld {{name}}', + 'test_now' => 'Test nu', + 'test_now_help' => 'Dit voert een `aangemaakte: Server` event uit', + 'table' => [ + 'description' => 'Beschrijving', + 'endpoint' => 'Eindpunt', + ], + 'headers' => 'Kopteksten', + 'events' => 'Evenementen', + 'regular' => 'Gebruikelijk', + 'reset_headers' => 'Reset Headers', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profiel', + 'message' => 'Bericht', + 'username' => 'Gebruikersnaam', + 'avatar_url' => 'Avatar URL', + 'forum_thread' => 'Forum onderwerp naam', + 'supress_embeds' => 'Onderdruk ', + 'supress_embeds_text' => 'Voeg geen insluitingen toe bij het toevoegen van dit bericht', + 'supress_notifications' => 'Meldingen onderdrukken', + 'supress_notifications_text' => 'Dit bericht activeert geen push- en desktopmeldingen', + ], + 'discord_embed' => [ + 'add_embed' => 'Insluiten toevoegen', + 'flags' => 'Vlaggen', + 'thumbnail' => 'Miniatuurafbeelding URL', + 'embeds' => 'Insluiten', + 'thread_name' => 'Forum onderwerp naam', + 'allowed_mentions' => 'Toegestane vermeldingen', + 'roles' => 'Rollen', + 'users' => 'Gebruikers', + 'everyone' => '@everyone & @here', + 'author' => 'Auteur', + 'author_url' => 'Auteur URL', + 'author_icon_url' => 'Auteur Icon URL', + 'body' => 'Body', + 'title' => 'Titel', + 'color' => 'Embed kleur', + 'url' => 'URL', + 'images' => 'Fotos', + 'image_url' => 'Foto URL', + 'image_thumbnail' => 'Link naar miniatuur', + 'footer' => 'Onderkant', + 'has_timestamp' => 'Heeft Tijdstempel', + 'footer_icon_url' => 'Voettekst Icoon URL', + 'add_field' => 'Veld Toevoegen', + 'fields' => 'Velden', + 'field_name' => 'Veldnaam', + 'field_value' => 'Veld waarde', + 'inline_field' => 'Inline veld', + ], +]; diff --git a/lang/nl/auth.php b/lang/nl/auth.php index ac697bacfd..c2a28dedf0 100644 --- a/lang/nl/auth.php +++ b/lang/nl/auth.php @@ -1,27 +1,24 @@ 'Inloggen', - 'go_to_login' => 'Ga naar inloggen', - 'failed' => 'Er werd geen account gevonden dat overeenkomt met deze inloggegevens.', - 'forgot_password' => [ - 'label' => 'Wachtwoord Vergeten?', - 'label_help' => 'Voer het e-mailadres van uw account in om instructies te ontvangen over het opnieuw instellen van uw wachtwoord.', - 'button' => 'Account herstellen', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Herstel en log in', - ], + 'failed' => 'Deze inloggegevens komen niet overeen met onze database.', + 'failed-two-factor' => 'Incorrect 2FA code', + 'two-factor-code' => 'Tweestapsverificatie', + 'two-factor-hint' => 'U kunt back-upcodes gebruiken als u geen toegang meer hebt tot uw apparaat.', + 'password' => 'Wachtwoord is onjuist.', + 'throttle' => 'Te veel inlogpogingen. Probeer het over :seconds seconde(n) opnieuw.', + '2fa_must_be_enabled' => 'De beheerder heeft vereist dat twee stap verificatie is ingeschakeld voor uw account om Panel te kunnen gebruiken.', - 'two_factor' => [ - 'label' => 'Tweestapsverificatie code', - 'label_help' => 'Dit account heeft tweestapsverificatie aanstaan. Voer de door uw apparaat gegenereerde code in om deze login te voltooien.', - 'checkpoint_failed' => 'De tweestapsverificatie code was ongeldig.', - ], - - 'throttle' => 'Te veel inlogpogingen. Probeer het over :seconds seconden opnieuw.', - 'password_requirements' => 'Het wachtwoord moet minimaal 8 tekens lang zijn en moet uniek zijn voor deze site.', - '2fa_must_be_enabled' => 'De beheerder heeft vereist dat tweestapsverificatie voor je account is ingeschakeld om het paneel te kunnen gebruiken.', ]; diff --git a/lang/nl/command/messages.php b/lang/nl/command/messages.php index 5c93f92a83..201621f1c2 100644 --- a/lang/nl/command/messages.php +++ b/lang/nl/command/messages.php @@ -11,19 +11,14 @@ 'ask_admin' => 'Is deze gebruiker een beheerder?', 'ask_email' => 'E-mailadres', 'ask_username' => 'Gebruikersnaam', - 'ask_name_first' => 'Voornaam', - 'ask_name_last' => 'Achternaam', 'ask_password' => 'Wachtwoord', 'ask_password_tip' => 'Als je een account wilt aanmaken met een willekeurig wachtwoord dat naar de gebruiker wordt gestuurd, voer dit commando opnieuw uit (CTRL+C) en geef de `--no-password` parameter op.', 'ask_password_help' => 'Wachtwoorden moeten minstens 8 tekens lang zijn en minstens één hoofdletter en één cijfer bevatten.', - '2fa_help_text' => [ - 'Dit commando zal tweestapsverificatie voor een gebruikersaccount uitschakelen als het is ingeschakeld. Dit moet alleen worden gebruikt als een account herstel commando als de gebruiker buiten hun account is gesloten.', - 'Als dit niet is wat je wilde doen, druk dan op CTRL+C om dit proces af te sluiten.', - ], + '2fa_help_text' => 'Dit commando schakelt tweestapsverificatie uit voor het account van een gebruiker. Dit commando dient alleen te worden gebruikt als herstel optie wanneer een gebruiker is buitengesloten. Als dit niet is wat je wil doen sluit je het proces af door op CTRL+C te drukken.', '2fa_disabled' => 'Tweestapsverificatie is uitgeschakeld voor :email.', ], 'schedule' => [ - 'output_line' => 'Verzenden van de eerste taak voor `:schedule` (:hash).', + 'output_line' => 'Verzenden van de eerste taak voor `:schedule` (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'Verwijderen service back-up bestand :file.', diff --git a/lang/nl/commands.php b/lang/nl/commands.php new file mode 100644 index 0000000000..3090d15c05 --- /dev/null +++ b/lang/nl/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Geef het e-mailadres op waarvan eggs geëxporteerd worden vanuit dit Paneel. Dit moet een geldig e-mailadres zijn.', + 'url' => 'De applicatie-URL MOET beginnen met https:// of http:// afhankelijk van het gebruik van SSL of niet. Als u dit niet toevoegt zullen uw e-mails en andere inhoud linken naar de verkeerde locatie.', + 'timezone' => "De tijdzone moet overeenkomen met een van de ondersteunde tijdzones van PHP\\'s. Als u niet zeker bent, ga dan naar https://php.net/manual/en/timezones.php.", + ], + 'redis' => [ + 'note' => 'U heeft de Redis-driver geselecteerd voor één of meer opties, geef hieronder geldige verbindingsinformatie op. In de meeste gevallen kunt u de opgegeven standaardwaarden gebruiken, maar niet als u uw instellingen hebt gewijzigd.', + 'comment' => 'Standaard heeft een Redis-serverinstance de gebruikersnaam default en geen wachtwoord, omdat deze lokaal wordt uitgevoerd en niet toegankelijk is van buitenaf. Als dit het geval is, druk dan gewoon op Enter zonder een waarde in te voeren.', + 'confirm' => 'Het lijkt erop dat een :field al is gedefinieerd voor Redis, wilt u het wijzigen?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Het wordt sterk aangeraden om "localhost" niet als uw database-host te gebruiken, aangezien we frequente problemen met verbinding met socket hebben gezien. Als je een lokale verbinding wilt gebruiken, moet je "127.0.0.1" gebruiken.', + 'DB_USERNAME_note' => 'Het gebruik van het root-account voor MySQL verbindingen is niet alleen sterk afgeraden, het wordt ook niet toegestaan door deze applicatie. U heeft een MySQL gebruiker voor deze software nodig.', + 'DB_PASSWORD_note' => 'Het lijkt erop dat u al een MySQL wachtwoord hebt gedefinieerd, wilt u het wijzigen?', + 'DB_error_2' => 'Uw verbindingsgegevens zijn NIET opgeslagen. U moet geldige verbindingsinformatie verstrekken voordat u verder gaat.', + 'go_back' => 'Ga terug en probeer het opnieuw', + ], + 'make_node' => [ + 'name' => 'Voer een korte identificator in die gebruikt wordt om deze node te onderscheiden van anderen', + 'description' => 'Voer een beschrijving in om de node te identificeren', + 'scheme' => 'Voer alstublieft https in voor een SSL-verbinding of http voor een non-ssl verbinding', + 'fqdn' => 'Voer een domeinnaam (bijv. node.example.com) in om te gebruiken voor het verbinden met de daemon. Een IP-adres kan alleen worden gebruikt als u geen SSL gebruikt voor deze node', + 'public' => 'Moet deze node openbaar zijn? Ter uitbreiding, wanneer een node ingesteld wordt als privé node, dan zal het onmogelijk zijn om deze node te gebruiken voor het automatisch uitrollen.', + 'behind_proxy' => 'Staat uw FQDN achter een proxy?', + 'maintenance_mode' => 'Moet de onderhoudsmodus worden ingeschakeld?', + 'memory' => 'Vul de maximale hoeveelheid geheugen in', + 'memory_overallocate' => 'Voer de hoeveelheid geheugen in die toegestaan is boven het ingestelde geheugen, -1 zal de controle uitschakelen en 0 zal het maken van nieuwe servers voorkomen', + 'disk' => 'Voer het maximum aantal schijfruimte in', + 'disk_overallocate' => 'Voer de hoeveelheid geheugen in die toegestaan is boven het ingestelde geheugen, -1 zal de controle uitschakelen en 0 zal het maken van nieuwe servers voorkomen', + 'cpu' => 'Vul de maximale hoeveelheid geheugen in', + 'cpu_overallocate' => 'Voer de hoeveelheid geheugen in die toegestaan is boven het ingestelde geheugen, -1 zal de controle uitschakelen en 0 zal het maken van nieuwe servers voorkomen', + 'upload_size' => "'Voer de maximale bestandsgrootte upload in", + 'daemonListen' => 'Voer de daemon listening port in', + 'daemonConnect' => 'Voer de deamon connectie poort in (deze kan niet hetzelfde zijn als de luisterende poort)', + 'daemonSFTP' => 'Voer de daemon SFTP listening port in', + 'daemonSFTPAlias' => 'Voer de daemon SFTP alias in (kan leeg zijn)', + 'daemonBase' => 'Voer de basismap in', + 'success' => 'Nieuw Node met de naam :name is succesvol aangemaakt en heeft een id van :id', + ], + 'node_config' => [ + 'error_not_exist' => 'De geselecteerde node bestaat niet.', + 'error_invalid_format' => 'Ongeldig formaat opgegeven. Geldige opties zijn yaml en json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Het lijkt erop dat u al een applicatie encryptiesleutel hebt geconfigureerd. Doorgaan met dit proces zal leiden tot het overschrijven de deze sleutel en veroorzaakt datacorruptie voor bestaande versleutelde gegevens. GA NIET DOOR BEHALVE ALS JE WEET WAT JE AAN HET DOEN BENT.', + 'understand' => 'Ik begrijp de gevolgen van het uitvoeren van deze opdracht en neem de volledige verantwoordelijkheid op me voor het verlies van versleutelde gegevens.', + 'continue' => 'Weet je zeker dat je wilt doorgaan? Het wijzigen van de applicatiesleutel ZORGT VOOR VERLIES VAN DATA.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Er zijn geen geplande taken voor servers die uitgevoerd moeten worden.', + 'error_message' => 'Er is een fout opgetreden tijdens het verwerken van de Schema: ', + ], + ], +]; diff --git a/lang/nl/dashboard/account.php b/lang/nl/dashboard/account.php deleted file mode 100644 index 1551aa9766..0000000000 --- a/lang/nl/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'E-mailadres wijzigen', - 'updated' => 'Het e-mailadres is succesvol gewijzigd.', - ], - 'password' => [ - 'title' => 'Wachtwoord wijzigen', - 'requirements' => 'Je nieuwe wachtwoord moet minstens 8 tekens bevatten.', - 'updated' => 'Het wachtwoord is succesvol gewijzigd.', - ], - 'two_factor' => [ - 'button' => 'Tweestapsverificatie configureren', - 'disabled' => 'Tweestapsverificatie is uitgeschakeld voor je account. Je wordt niet meer gevraagd om een code op te geven bij het inloggen.', - 'enabled' => 'Tweestapsverificatie is ingeschakeld op je account! Vanaf nu moet je bij het inloggen de code opgeven die door je apparaat wordt gegenereerd.', - 'invalid' => 'De opgegeven code is ongeldig.', - 'setup' => [ - 'title' => 'Tweestapsverificatie instellen', - 'help' => 'Kan de code niet worden gescand? Voer de onderstaande code in je applicatie:', - 'field' => 'Code invoeren', - ], - 'disable' => [ - 'title' => 'Tweestapsverificatie uitschakelen', - 'field' => 'Code invoeren', - ], - ], -]; diff --git a/lang/nl/dashboard/index.php b/lang/nl/dashboard/index.php deleted file mode 100644 index 78db2377fc..0000000000 --- a/lang/nl/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Zoeken naar servers...', - 'no_matches' => 'Er zijn geen servers gevonden die voldoen aan de opgegeven zoekcriteria.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Geheugen', -]; diff --git a/lang/nl/exceptions.php b/lang/nl/exceptions.php index 6e2fe678f4..ce677e688b 100644 --- a/lang/nl/exceptions.php +++ b/lang/nl/exceptions.php @@ -4,6 +4,7 @@ 'daemon_connection_failed' => 'Er is een fout opgetreden tijdens het communiceren met de daemon wat resulteert in een HTTP/:code response code. Deze fout is opgeslagen.', 'node' => [ 'servers_attached' => 'Een node moet geen actieve servers meer hebben voordat deze kan worden verwijderd.', + 'error_connecting' => 'Fout bij het verbinden met', 'daemon_off_config_updated' => 'De daemonconfiguratie is bijgewerkt, er is echter een fout opgetreden bij het automatisch bijwerken van het configuratiebestand op de Daemon. U moet handmatig het configuratiebestand bijwerken (config.yml) voor de daemon om deze veranderingen toe te passen.', ], 'allocations' => [ @@ -43,6 +44,8 @@ 'has_nodes' => 'Kan een locatie niet verwijderen die actieve nodes heeft gekoppeld.', ], 'users' => [ + 'is_self' => 'Je kunt je eigen gebruikersaccount niet verwijderen.', + 'has_servers' => 'De gebruiker kan niet worden verwijderd omdat er actieve servers aan dit account gekoppeld zijn. Gelieve de servers welke gekoppeld zijn aan dit account, te verwijderen voordat je doorgaat.', 'node_revocation_failed' => 'Intrekken van sleutels op node #:nodeis mislukt. :error', ], 'deployment' => [ @@ -52,4 +55,10 @@ 'api' => [ 'resource_not_found' => 'Het opgevraagde onderdeel bestaat niet op deze server.', ], + 'mount' => [ + 'servers_attached' => 'Een koppeling mag geen servers eraan gekoppeld hebben om te kunnen worden verwijderd.', + ], + 'server' => [ + 'marked_as_failed' => 'Deze server is nog niet klaar met het installatieproces, probeer het later opnieuw.', + ], ]; diff --git a/lang/nl/notifications.php b/lang/nl/notifications.php new file mode 100644 index 0000000000..1393caba68 --- /dev/null +++ b/lang/nl/notifications.php @@ -0,0 +1,18 @@ + 'Open server', + 'installation_completed' => 'Server installatie afgerond', + 'installation_failed' => 'Server installatie mislukt', + 'reinstallation_completed' => 'Server opnieuw installeren voltooid', + 'reinstallation_failed' => 'Server opnieuw installeren mislukt', + 'failed' => 'Mislukt', + 'user_added' => [ + 'title' => 'Toegevoegd aan server', + 'body' => 'Je bent toegevoegd als sub gebruiker aan :server', + ], + 'user_removed' => [ + 'title' => 'Verwijderd van server', + 'body' => 'Je bent verwijderd als sub gebruiker van :server', + ], +]; diff --git a/lang/nl/pagination.php b/lang/nl/pagination.php deleted file mode 100644 index 8d6a62f7cf..0000000000 --- a/lang/nl/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Vorige', - 'next' => 'Volgende »', -]; diff --git a/lang/nl/passwords.php b/lang/nl/passwords.php deleted file mode 100644 index b260c54572..0000000000 --- a/lang/nl/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Wachtwoorden moeten minstens zes tekens bevatten en overeenkomen met de bevestiging.', - 'reset' => 'Je wachtwoord is opnieuw ingesteld!', - 'sent' => 'We hebben je een wachtwoord reset link gemaild!', - 'token' => 'Dit wachtwoord reset token is ongeldig.', - 'user' => 'We kunnen geen gebruiker met dat e-mailadres vinden.', -]; diff --git a/lang/nl/profile.php b/lang/nl/profile.php new file mode 100644 index 0000000000..70e0ddd447 --- /dev/null +++ b/lang/nl/profile.php @@ -0,0 +1,70 @@ + 'Profiel', + 'tabs' => [ + 'account' => 'Account', + 'oauth' => 'OAuth', + 'activity' => 'Activiteit', + 'api_keys' => 'API Sleutels', + 'ssh_keys' => 'SSH-sleutels', + 'keys' => 'Sleutels', + '2fa' => '2FA', + 'customization' => 'Aanpassing', + ], + 'username' => 'Gebruikersnaam', + 'admin' => 'Administrator', + 'exit_admin' => 'Sluit beheerderspaneel', + 'server_list' => 'Serverlijst', + 'email' => 'E-mail', + 'password' => 'Wachtwoord', + 'current_password' => 'Huidige wachtwoord', + 'password_confirmation' => 'Wachtwoord Bevestigen', + 'timezone' => 'Tijdzone', + 'language' => 'Taal', + 'language_help' => 'Uw taal :state is nog niet vertaald!', + 'link' => 'Koppeling ', + 'unlink' => 'Ontkoppelen ', + 'unlinked' => ':name losgekoppeld', + 'scan_qr' => 'Scan QR-code', + 'code' => 'Code', + 'setup_key' => 'Sleutel instellen', + 'invalid_code' => 'Ongeldige 2FA Code', + 'code_help' => 'Scan de QR-code hierboven met uw tweestapsverificatie-app, en voer de gegenereerde code in.', + '2fa_enabled' => '2FA is ingeschakeld!', + 'backup_help' => 'Deze worden niet meer getoond!', + 'backup_codes' => 'Back-up-code', + 'disable_2fa' => 'Deactiveer 2FA', + 'disable_2fa_help' => 'Voer je huidige 2FA code in om tweestapsverificatie uit te schakelen', + 'api_keys' => 'API sleutels', + 'create_api_key' => 'API sleutel maken', + 'api_key_created' => 'API sleutel gemaakt', + 'description' => 'Beschrijving', + 'allowed_ips' => 'Toegestane IP-adressen', + 'allowed_ips_help' => 'Druk op enter om een nieuw IP-adres toe te voegen of laat leeg om elk IP-adres toe te staan', + 'ssh_keys' => 'SSH sleutels', + 'create_ssh_key' => 'SSH sleutel maken', + 'ssh_key_created' => 'SSH sleutel gemaakt', + 'name' => 'Naam', + 'public_key' => 'Publieke sleutel', + 'could_not_create_ssh_key' => 'Kon geen SSH sleutel maken', + 'dashboard' => 'Dashboard', + 'dashboard_layout' => 'Dashboard lay-out', + 'console' => 'Console', + 'grid' => 'Raster', + 'table' => 'Tabel', + 'rows' => 'Rijen', + 'font_size' => 'Tekstgrootte', + 'font' => 'Lettertype', + 'font_preview' => 'Lettertype voorbeeld', + 'seconds' => 'Seconden', + 'graph_period' => 'Grafiek periode', + 'graph_period_helper' => 'Het aantal datapunten (seconden) dat in de grafieken op de console wordt weergegeven.', + 'navigation' => 'Navigatie type', + 'sidebar' => 'Balk aan de zijkant', + 'topbar' => 'Balk bovenin', + 'mixed' => 'Gemengd', + 'no_oauth' => 'Geen accounts gekoppeld', + 'no_api_keys' => 'Geen API-sleutels', + 'no_ssh_keys' => 'Geen SSH-sleutels', +]; diff --git a/lang/nl/search.php b/lang/nl/search.php new file mode 100644 index 0000000000..5da69d72e3 --- /dev/null +++ b/lang/nl/search.php @@ -0,0 +1,9 @@ + 'Voer ten minste drie tekens in om te beginnen met zoeken.', + 'term' => [ + 'label' => 'Zoekterm', + 'description' => 'Voer een servernaam, uuid of poort in om te beginnen met zoeken.', + ], +]; diff --git a/lang/nl/server/activity.php b/lang/nl/server/activity.php new file mode 100644 index 0000000000..133b31a3d9 --- /dev/null +++ b/lang/nl/server/activity.php @@ -0,0 +1,11 @@ + 'Activiteit', + 'event' => 'Gebeurtenis', + 'user' => 'Gebruiker', + 'deleted_user' => 'Verwijderde gebruikers', + 'system' => 'Systeem', + 'timestamp' => 'Tijdstip', + 'metadata' => 'Metadata', +]; diff --git a/lang/nl/server/backup.php b/lang/nl/server/backup.php new file mode 100644 index 0000000000..8442e1e60f --- /dev/null +++ b/lang/nl/server/backup.php @@ -0,0 +1,55 @@ + 'Back-ups', + 'empty' => 'Geen back-ups', + 'size' => 'Grootte', + 'created_at' => 'Aangemaakt op', + 'status' => 'Status', + 'is_locked' => 'Vergrendelstatus', + 'backup_status' => [ + 'in_progress' => 'Bezig', + 'successful' => 'Succesvol', + 'failed' => 'Mislukt', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Maak back-up', + 'limit' => 'Back-up limiet bereikt', + 'created' => ':name aangemaakt', + 'notification_success' => 'Back-up succesvol gemaakt', + 'notification_fail' => 'Back-up maken is mislukt', + 'name' => 'Naam', + 'ignored' => 'Genegeerde bestanden & mappen', + 'locked' => 'Vergrendeld?', + 'lock_helper' => 'Voorkomt dat deze back-up wordt verwijderd totdat deze expliciet is ontgrendeld.', + ], + 'lock' => [ + 'lock' => 'Vergrendelen', + 'unlock' => 'Ontgrendelen', + ], + 'download' => 'Downloaden', + 'rename' => [ + 'title' => 'Hernoem', + 'new_name' => 'Back-up naam', + 'notification_success' => 'Back-up succesvol hernoemd', + ], + 'restore' => [ + 'title' => 'Herstellen', + 'helper' => 'De server zal worden gestopt. Je kunt de server status niet beheren, toegang krijgen tot de bestandsbeheerder of extra back-ups maken totdat dit proces is voltooid.', + 'delete_all' => 'Alle bestanden verwijderen voordat de back-up hersteld wordt?', + 'notification_started' => 'Bezig met herstellen van back-up', + 'notification_success' => 'Back-up succesvol hersteld', + 'notification_fail' => 'Back-up herstellen mislukt', + 'notification_fail_body_1' => 'Deze server bevindt zich momenteel niet in een status die het mogelijk maakt om een back-up te herstellen.', + 'notification_fail_body_2' => 'Deze back-up kan op dit moment niet worden hersteld: niet voltooid of mislukt.', + ], + 'delete' => [ + 'title' => 'Back-up Verwijderen', + 'description' => 'Wilt u :backup verwijderen?', + 'notification_success' => 'Back-up verwijderd', + 'notification_fail' => 'Back-up kon niet worden verwijderd', + 'notification_fail_body' => 'Verbinding met node mislukt. Probeer het opnieuw.', + ], + ], +]; diff --git a/lang/nl/server/console.php b/lang/nl/server/console.php new file mode 100644 index 0000000000..f41e0da6a0 --- /dev/null +++ b/lang/nl/server/console.php @@ -0,0 +1,43 @@ + 'Console', + 'command' => 'Typ een commando...', + 'command_blocked' => 'Server Offline...', + 'command_blocked_title' => 'Kan geen commando verzenden als de server offline is', + 'open_in_admin' => 'Open als Beheerder', + 'power_actions' => [ + 'start' => 'Start', + 'stop' => 'Stop', + 'restart' => 'Herstarten', + 'kill' => 'Geforceerd stoppen', + 'kill_tooltip' => 'Dit kan leiden tot datacorruptie en/of gegevensverlies!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Geheugen', + 'network' => 'Netwerk', + 'disk' => 'Schijf', + 'name' => 'Naam', + 'status' => 'Status', + 'address' => 'IP-adres', + 'unavailable' => 'Niet beschikbaar', + ], + 'status' => [ + 'created' => 'Aangemaakt', + 'starting' => 'Bezig met opstarten', + 'running' => 'Actief', + 'restarting' => 'Bezig met herstarten', + 'exited' => 'Verlaten', + 'paused' => 'Gepauzeerd', + 'dead' => 'Dood', + 'removing' => 'Bezig met verwijderen', + 'stopping' => 'Bezig met Stoppen', + 'offline' => 'Offline', + 'missing' => 'Ontbrekend', + ], + 'websocket_error' => [ + 'title' => 'Kon geen verbinding maken met de websocket!', + 'body' => 'Bekijk de browser console voor meer details.', + ], +]; diff --git a/lang/nl/server/dashboard.php b/lang/nl/server/dashboard.php new file mode 100644 index 0000000000..a6c563ccf4 --- /dev/null +++ b/lang/nl/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servers', + 'list' => 'Server lijst', + 'tabs' => [ + 'my' => 'Mijn Servers', + 'other' => 'Servers van anderen', + 'all' => 'Alle Servers', + ], + 'empty_own' => 'Je hebt geen servers!', + 'empty_other' => 'Er zijn geen servers waar je toegang tot hebt', + + 'status' => 'Status', + 'server' => 'Server', + 'resources' => 'Resources', + 'usage_limit' => 'Gebruikslimiet :resource', + + 'cpu' => 'CPU', + 'memory' => 'Geheugen', + 'disk' => 'Schijf', + 'network' => 'Netwerk', + 'none' => 'Geen', + 'loading' => 'Bezig met laden...', + + 'power_actions' => 'Acties', + 'power_action_sent' => ':action verstuurd naar :name', +]; diff --git a/lang/nl/server/database.php b/lang/nl/server/database.php new file mode 100644 index 0000000000..88ccfe5e60 --- /dev/null +++ b/lang/nl/server/database.php @@ -0,0 +1,26 @@ + 'Database', + 'empty' => 'Geen Databases', + 'create_database' => 'Database aanmaken', + 'limit' => 'Database limiet bereikt', + 'viewing' => 'Weergeven: :database', + 'host' => 'Host', + 'database' => 'Databanken', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'remote' => 'Extern', + 'created_at' => 'Aangemaakt op', + 'name' => 'Databasenaam', + 'name_hint' => 'Als u dit leeg laat, wordt er automatisch een willekeurige naam gegenereerd', + 'connections_from' => 'Verbindingen vanaf', + 'max_connections' => 'Max. Aantal verbindingen', + 'database_host' => 'Database Host', + 'database_host_select' => 'Selecteer Database Host', + 'jdbc' => 'JDBC Verbinding Koppeling', + 'create_notification' => ':database aangemaakt', + 'create_notification_fail' => 'Aanmaken :database mislukt', + 'delete_notification' => ':database verwijderd', + 'delete_notification_fail' => 'Kan :database niet verwijderen', +]; diff --git a/lang/nl/server/file.php b/lang/nl/server/file.php new file mode 100644 index 0000000000..7d871fb5ac --- /dev/null +++ b/lang/nl/server/file.php @@ -0,0 +1,111 @@ + 'Bestanden', + 'name' => 'Naam', + 'size' => 'Grootte', + 'modified_at' => 'Gewijzigd op', + 'actions' => [ + 'open' => 'Openen', + 'download' => 'Downloaden', + 'copy' => [ + 'title' => 'Kopiëren', + 'notification' => 'Bestand gekopieerd', + ], + 'upload' => [ + 'title' => 'Uploaden', + 'from_files' => 'Bestanden uploaden', + 'from_url' => 'Uploaden vanaf URL', + 'url' => 'URL', + 'drop_files' => 'Sleep bestand om te uploaden', + 'success' => 'Bestand succesvol geüpload', + 'failed' => 'Kon de bestanden niet uploaden', + 'header' => 'Bestanden worden geüpload', + 'error' => 'Er is een fout opgetreden tijdens het uploaden', + ], + 'rename' => [ + 'title' => 'Naam Wijzigen', + 'file_name' => 'Bestandsnaam', + 'notification' => 'Bestandsnaam gewijzigd', + ], + 'move' => [ + 'title' => 'Verplaatsen', + 'directory' => 'Map', + 'directory_hint' => 'Voer de nieuwe map in, ten opzichte van de huidige map.', + 'new_location' => 'Nieuwe locatie', + 'new_location_hint' => 'Vul de locatie in van dit bestand of map, ten opzichte van de huidige map.', + 'notification' => 'Bestand verplaatst', + 'bulk_notification' => ':count bestanden zijn verplaatst naar :directory', + ], + 'permissions' => [ + 'title' => 'Rechten', + 'read' => 'Lezen', + 'write' => 'Schrijven', + 'execute' => 'Uitvoeren', + 'owner' => 'Eigenaar', + 'group' => 'Groep', + 'public' => 'Openbaar', + 'notification' => 'De rechten zijn gewijzigd naar :mode', + ], + 'archive' => [ + 'title' => 'Archiveren', + 'archive_name' => 'Archief Naam', + 'notification' => 'Archief aangemaakt', + 'extension' => 'Extensie', + ], + 'unarchive' => [ + 'title' => 'Dearchiveren', + 'notification' => 'Dearchiveren voltooid', + ], + 'new_file' => [ + 'title' => 'Nieuw bestand', + 'file_name' => 'Nieuwe bestandsnaam', + 'syntax' => 'Syntaxis markering', + 'create' => 'Aanmaken', + ], + 'new_folder' => [ + 'title' => 'Nieuwe map', + 'folder_name' => 'Nieuwe mapnaam', + ], + 'nested_search' => [ + 'title' => 'Geneste zoekopdracht', + 'search_term' => 'Zoekterm', + 'search_term_placeholder' => 'Voer een zoekterm in, bijvoorbeeld: *.txt', + 'search' => 'Zoeken', + 'search_for_term' => 'Zoek :term', + ], + 'delete' => [ + 'notification' => 'Bestand Verwijderd', + 'bulk_notification' => ':count bestanden zijn verwijderd', + ], + 'edit' => [ + 'title' => 'Aan het bewerken: :file', + 'save_close' => 'Opslaan & sluiten', + 'save' => 'Opslaan', + 'cancel' => 'Annuleren', + 'notification' => 'Bestand opgeslagen', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name is te groot!', + 'body' => 'Maximale is :max', + ], + 'file_not_found' => [ + 'title' => ':name niet gevonden!', + ], + 'file_not_editable' => [ + 'title' => ':name is een map', + ], + 'file_already_exists' => [ + 'title' => ':name bestaat al!', + ], + 'files_node_error' => [ + 'title' => 'Bestanden konden niet worden geladen!', + ], + 'pelicanignore' => [ + 'title' => 'Je bent een .pelicanignore bestand aan het aanpassen!', + 'body' => 'Alle bestanden en mappen in dit bestand zullen worden uitgesloten van backups. Wildcards worden ondersteund door het gebruik van een asterisk (*).
Je kunt een eerdere regel ontkennen door er een uitroepteken voor te plaatsen (!).', + ], + ], +]; diff --git a/lang/nl/server/network.php b/lang/nl/server/network.php new file mode 100644 index 0000000000..f88780a961 --- /dev/null +++ b/lang/nl/server/network.php @@ -0,0 +1,17 @@ + 'Netwerk', + 'add' => 'Poort toewijzing toevoegen', + 'limit' => 'Poort toewijzijngslimiet bereikt', + 'address' => 'IP-adres', + 'port' => 'Poort', + 'notes' => 'Notities', + 'no_notes' => 'Geen notities beschikbaar', + 'make_primary' => 'Primair maken', + 'primary' => 'Primaire', + 'make' => 'Maken', + 'delete' => 'Verwijderen', + 'locked' => 'Vergrendeld?', + 'locked_helper' => 'Vergrendelde toewijzingen kunnen alleen worden verwijderd door beheerders', +]; diff --git a/lang/nl/server/schedule.php b/lang/nl/server/schedule.php new file mode 100644 index 0000000000..f00463f6e0 --- /dev/null +++ b/lang/nl/server/schedule.php @@ -0,0 +1,121 @@ + 'Schema\'s', + 'new' => 'Nieuw Schema', + 'edit' => 'Schema bewerken', + 'save' => 'Schema opslaan', + 'delete' => 'Schema verwijderen', + 'import' => 'Schema importeren', + 'export' => 'Schema exporteren', + 'name' => 'Naam', + 'cron' => 'Cron', + 'status' => 'Status', + 'schedule_status' => [ + 'inactive' => 'Inactief', + 'processing' => 'Bezig met verwerken', + 'active' => 'Actief', + ], + 'no_tasks' => 'Geen taken', + 'run_now' => 'Nu uitvoeren', + 'online_only' => 'Alleen wanneer online', + 'last_run' => 'Laatst uitgevoerd', + 'next_run' => 'Volgende uitvoering', + 'never' => 'nooit', + 'cancel' => 'Annuleren', + + 'only_online' => 'Alleen wanneer de server Online is?', + 'only_online_hint' => 'Voer dit schema alleen uit als de server zich in een actieve staat bevindt.', + 'enabled' => 'Schema inschakelen?', + 'enabled_hint' => 'Dit schema zal automatisch worden uitgevoerd als dit is ingeschakeld.', + + 'cron_body' => 'Houd er rekening mee dat de cron invoer altijd UTC gebruikt.', + 'cron_timezone' => 'De volgende uitvoering in je eigen tijdzone (:timezone): :next_run ', + + 'invalid' => 'Ongeldig', + + 'time' => [ + 'minute' => 'Minuut', + 'hour' => 'Uur', + 'day' => 'Dag', + 'week' => 'Week', + 'month' => 'Maand', + 'day_of_month' => 'Dag van maand', + 'day_of_week' => 'Dag van de week', + + 'hourly' => 'Uurlijks', + 'daily' => 'Dagelijks', + 'weekly_mon' => 'Wekelijks (maandag)', + 'weekly_sun' => 'Wekelijks (zondag)', + 'monthly' => 'Maandelijks', + 'every_min' => 'Elke X minuten', + 'every_hour' => 'Elke X uur', + 'every_day' => 'Elke X dagen', + 'every_week' => 'Elke X weken', + 'every_month' => 'Elke X maanden', + 'every_day_of_week' => 'Elke X dag van de week', + + 'every' => 'Elke', + 'minutes' => 'Minuten', + 'hours' => 'Uren', + 'days' => 'Dagen', + 'months' => 'Maanden', + + 'monday' => 'Maandag', + 'tuesday' => 'Dinsdag', + 'wednesday' => 'Woensdag', + 'thursday' => 'Donderdag', + 'friday' => 'Vrijdag', + 'saturday' => 'Zaterdag', + 'sunday' => 'Zondag', + ], + + 'tasks' => [ + 'title' => 'Taken', + 'create' => 'Taak Aanmaken', + 'limit' => 'Taaklimiet bereikt', + 'action' => 'Actie', + 'payload' => 'Payload', + 'no_payload' => 'Geen Payload', + 'time_offset' => 'Tijdverschil', + 'first_task' => 'Eerste taak', + 'seconds' => 'Seconden', + 'continue_on_failure' => 'Doorgaan bij fouten', + + 'actions' => [ + 'title' => 'Actie', + 'power' => [ + 'title' => 'Verstuur server actie', + 'action' => 'Server actie', + 'start' => 'Start', + 'stop' => 'Stop', + 'restart' => 'Herstarten', + 'kill' => 'Geforceerd stoppen', + ], + 'command' => [ + 'title' => 'Commando versturen', + 'command' => 'Commando', + ], + 'backup' => [ + 'title' => 'Maak back-up', + 'files_to_ignore' => 'Bestanden om te negeren', + ], + 'delete_files' => [ + 'title' => 'Verwijder bestanden', + 'files_to_delete' => 'Te verwijderen bestanden', + ], + ], + ], + + 'notification_invalid_cron' => 'De verstrekte crongegevens worden niet geëvalueerd naar een geldige expressie', + + 'import_action' => [ + 'file' => 'Bestand', + 'url' => 'URL', + 'schedule_help' => 'Dit zou een raw .json bestand moeten zijn ( schedule-daily-restart.json )', + 'url_help' => 'URL\'s moeten gelijk verwijzen naar een raw .json bestand', + 'add_url' => 'Nieuwe URL', + 'import_failed' => 'Importeren mislukt', + 'import_success' => 'Importeren gelukt', + ], +]; diff --git a/lang/nl/server/setting.php b/lang/nl/server/setting.php new file mode 100644 index 0000000000..4b5da00075 --- /dev/null +++ b/lang/nl/server/setting.php @@ -0,0 +1,55 @@ + 'Instellingen', + 'server_info' => [ + 'title' => 'Server Informatie', + 'information' => 'Informatie', + 'name' => 'Server naam', + 'server_name' => 'Servernaam :name', + 'notification_name' => 'Servernaam bijgewerkt', + 'description' => 'Serveromschrijving', + 'notification_description' => 'Serveromschrijving bijgewerkt', + 'failed' => 'Mislukt', + 'uuid' => 'Server UUID', + 'uuid_short' => 'Server ID', + 'node_name' => 'Node naam', + 'icon' => [ + 'upload' => 'Upload Icoontje', + 'tooltip' => 'Egg Icoon gebruiken', + 'updated' => 'Server icoon bijgewerkt', + 'deleted' => 'Server icoon verwijderd', + ], + 'limits' => [ + 'title' => 'Limieten', + 'unlimited' => 'Onbeperkt', + 'of' => 'van', + 'cpu' => 'CPU', + 'memory' => 'Geheugen', + 'disk' => 'Schijfruimte', + 'backups' => 'Back-ups', + 'databases' => 'Databases', + 'allocations' => 'Poort toewijzingen', + 'no_allocations' => 'Geen extra poort toewijzingen', + ], + 'sftp' => [ + 'title' => 'SFTP informatie', + 'connection' => 'Verbinding', + 'action' => 'Verbind met SFTP', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'password_body' => 'Je SFTP wachtwoord is hetzelfde wachtwoord dat je gebruikt om dit paneel te gebruiken.', + ], + ], + 'reinstall' => [ + 'title' => 'Server herinstalleren', + 'body' => 'Het herinstalleren zal uw server stoppen, en vervolgens het installatiescript dat het oorspronkelijk heeft ingesteld opnieuw uitvoeren.', + 'body2' => 'Sommige bestanden kunnen tijdens dit proces worden verwijderd of gewijzigd. Maak een back-up van uw gegevens voordat u doorgaat.', + 'action' => 'Herinstalleren', + 'modal' => 'Weet je zeker dat je deze server opnieuw wilt installeren?', + 'modal_description' => 'Sommige bestanden kunnen tijdens dit proces worden verwijderd of gewijzigd. Maak een back-up van uw gegevens voordat u doorgaat.', + 'yes' => 'Ja, Herinstalleren', + 'notification_start' => 'Herinstallatie gestart', + 'notification_fail' => 'Herinstallatie mislukt', + ], +]; diff --git a/lang/nl/server/startup.php b/lang/nl/server/startup.php new file mode 100644 index 0000000000..d192f1e447 --- /dev/null +++ b/lang/nl/server/startup.php @@ -0,0 +1,17 @@ + 'Opstarten', + 'command' => 'Opstart commando', + 'notification_startup' => 'Opstart opdracht bijgewerkt', + 'notification_startup_body' => 'Herstart de server om de nieuwe image te gebruiken.', + 'enable_preview' => 'Voorvertoning Inschakelen', + 'disable_preview' => 'Voorvertoning uitschakelen', + 'docker_image' => 'Docker Image', + 'notification_docker' => 'Docker image bijgewerkt', + 'notification_docker_body' => 'Herstart de server om de nieuwe image te gebruiken.', + 'variables' => 'Server variabelen', + 'update' => 'Bijgewerkt: :variable', + 'fail' => 'Mislukt: :variable', + 'validation_fail' => 'Validatie mislukt: :variable', +]; diff --git a/lang/nl/server/user.php b/lang/nl/server/user.php new file mode 100644 index 0000000000..f4cc53477a --- /dev/null +++ b/lang/nl/server/user.php @@ -0,0 +1,73 @@ + 'Gebruikers', + 'username' => 'Gebruikersnaam', + 'email' => 'E-mail', + 'assign_all' => 'Alle toewijzen', + 'invite_user' => 'Gebruiker uitnodigen', + 'action' => 'Uitnodigen', + 'remove' => 'Verwijder gebruiker', + 'edit' => 'Gebruiker bewerken', + 'editing' => 'Aan het bewerken: :user', + 'delete' => 'Verwijder gebruiker', + 'notification_add' => 'Gebruiker uitgenodigd!', + 'notification_edit' => 'Gebruiker bijgewerkt!', + 'notification_delete' => 'Gebruiker verwijderd!', + 'notification_failed' => 'Uitnodigen gebruiker mislukt!', + 'permissions' => [ + 'title' => 'Rechten', + 'activity_desc' => 'Machtigingen die de toegang van een gebruiker tot de activiteiten van de server beheren.', + 'startup_desc' => 'Machtigingen die de mogelijkheid van een gebruiker om de opstartparameters van deze server te bekijken beheren.', + 'settings_desc' => 'Machtigingen die de mogelijkheid van een gebruiker om de opstartparameters van deze server te bekijken beheren.', + 'control_desc' => 'Machtigingen die de mogelijkheid van een gebruiker regelen om de stroomstatus van een server te beheren of opdrachten te verzenden.', + 'user_desc' => 'Machtigingen die een gebruiker toestaan andere subgebruikers op een server te beheren. Ze kunnen nooit hun eigen account bewerken of machtigingen toewijzen die ze zelf niet hebben.', + 'file_desc' => 'Machtigingen die bepalen of een gebruiker het bestandssysteem van deze server mag wijzigen.', + 'allocation_desc' => 'Machtigingen die de mogelijkheid van een gebruiker bedienen om de poort toewijzingen voor deze server te wijzigen.', + 'database_desc' => 'Machtigingen die de toegang van een gebruiker tot databasebeheer voor deze server regelen.', + 'backup_desc' => 'Machtigingen die de mogelijkheid van een gebruiker bedienen om back-ups van de server te maken en te beheren.', + 'schedule_desc' => 'Machtigingen die de toegang van een gebruiker tot het schema beheer van deze server regelen.', + 'startup_read' => 'Staat een gebruiker toe om de opstartvariabelen voor een server te bekijken.', + 'startup_update' => 'Staat een gebruiker toe om de opstartvariabelen voor de server te wijzigen.', + 'startup_docker_image' => 'Hiermee kan een gebruiker de Docker-image wijzigen die wordt gebruikt bij het uitvoeren van de server.', + 'settings_reinstall' => 'Staat een gebruiker toe om een herinstallatie van deze server te starten.', + 'settings_rename' => 'Staat een gebruiker toe deze server te hernoemen.', + 'settings_description' => 'Staat een gebruiker toe om de beschrijving van de server te wijzigen.', + 'activity_read' => 'Geeft de gebruiker toegang om de logs te bekijken van deze server.', + 'websocket_connect' => 'Geeft een gebruiker toestemming om te verbinden met de websocket van deze server', + 'control_console' => 'Geeft de gebruiker toegang tot het versturen van data in de server console.', + 'control_start' => 'Geeft de gebruiker toegang tot het starten van de server.', + 'control_stop' => 'Geeft de gebruiker toegang tot het stoppen van de server.', + 'control_restart' => 'Geeft de gebruiker toegang tot het herstarten van de server.', + 'control_kill' => 'Geeft de gebruiker toegang tot het forceer stoppen van de server.', + 'user_create' => 'Geeft de gebruiker toegang tot het maken van medegebruikers voor de server.', + 'user_read' => 'Geeft de gebruiker toegang tot het weergeven van medegebruikers op de server.', + 'user_update' => 'Geeft de gebruiker toegang tot het aanpassen van medegebruikers die gekoppeld zijn aan de server.', + 'user_delete' => 'Geeft de gebruiker toegang tot het verwijderen van medegebruikers die gekoppeld zijn aan server.', + 'file_create' => 'Geeft de gebruiker toegang tot het aanmaken van nieuwe bestanden en mappen op de server.', + 'file_read' => 'Staat een gebruiker toe de inhoud van een map te bekijken, maar niet de inhoud van of bestanden te downloaden.', + 'file_read_content' => 'Hiermee kan een gebruiker de inhoud van een bepaald bestand bekijken. Hierdoor kan de gebruiker ook bestanden downloaden.', + 'file_update' => 'Geeft de gebruiker toegang tot het aanpassen van bestaande bestanden en mappen op de server.', + 'file_delete' => 'Geeft de gebruiker toegang tot het verwijderen van bestanden en mappen op de server.', + 'file_archive' => 'Geeft de gebruiker toegang tot het aanmaken van nieuwe bestandsarchieven en het uitpakken van bestaande bestandsarchieven op de server.', + 'file_sftp' => 'Geeft de gebruiker toegang tot de bovenstaande acties via de SFTP-client van de server.', + 'allocation_read' => 'Staat een gebruiker toe om alle toewijzingen te bekijken die momenteel aan deze server zijn toegewezen. Gebruikers met enig niveau van toegang tot deze server kunnen de primaire allocatie altijd bekijken.', + 'allocation_update' => 'Geeft de gebruiker toegang om de primaire server toewijzing te wijzigen en notities toe te voegen aan elke toewijzing.', + 'allocation_delete' => 'Geeft de gebruiker toegang om toewijzingen te verwijderen van de server.', + 'allocation_create' => 'Geeft de gebruiker toegang om extra toewijzingen toe te wijzen aan de server.', + 'database_create' => 'Geeft de gebruiker toegang tot het aanmaken van databases voor de server.', + 'database_read' => 'Geeft de gebruiker toegang tot het weergeven van databases voor de server.', + 'database_update' => 'Geeft de gebruiker toegang tot het aanpassen van databases voor de server. Als de gebruiker niet de "Bekijk wachtwoord" permissie heeft, kan het wachtwoord niet gewijzigd worden.', + 'database_delete' => 'Geeft de gebruiker toegang tot het verwijderen van databases voor de server.', + 'database_view_password' => 'Geeft de gebruiker toegang tot het weergeven van database wachtwoorden voor de server.', + 'schedule_create' => 'Geeft de gebruiker toegang tot het aanmaken van taken voor de server.', + 'schedule_read' => 'Geeft de gebruiker toegang tot het bekijken van taken voor de server.', + 'schedule_update' => 'Geeft de gebruiker toegang tot het bewerken van bestaande taken voor de server.', + 'schedule_delete' => 'Geeft de gebruiker toegang tot het verwijderen van taken voor de server.', + 'backup_create' => 'Geeft de gebruiker toegang tot het aanmaken van backups voor de server.', + 'backup_read' => 'Geeft de gebruiker toegang om alle back-ups te bekijken die bestaan voor deze server.', + 'backup_delete' => 'Geeft de gebruiker toegang om back-ups van het systeem te verwijderen.', + 'backup_download' => 'Geeft de gebruiker toegang om een back-up voor de server te downloaden. Let op!: hiermee kan een gebruiker toegang krijgen tot alle bestanden van de server in de back-up.', + 'backup_restore' => 'Geeft de gebruiker toegang om een back-up voor de server te downloaden. Let op!: hiermee kan een gebruiker toegang krijgen tot alle bestanden van de server in de back-up.', + ], +]; diff --git a/lang/nl/server/users.php b/lang/nl/server/users.php deleted file mode 100644 index 9e0a47f809..0000000000 --- a/lang/nl/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Geeft toegang tot de websocket voor deze server.', - 'control_console' => 'Geeft de gebruiker toegang tot het versturen van data in de server console.', - 'control_start' => 'Geeft de gebruiker toegang tot het starten van de server.', - 'control_stop' => 'Geeft de gebruiker toegang tot het stoppen van de server.', - 'control_restart' => 'Geeft de gebruiker toegang tot het herstarten van de server.', - 'control_kill' => 'Geeft de gebruiker toegang tot het forceer stoppen van de server.', - 'user_create' => 'Geeft de gebruiker toegang tot het maken van medegebruikers voor de server.', - 'user_read' => 'Geeft de gebruiker toegang tot het weergeven van medegebruikers op de server.', - 'user_update' => 'Geeft de gebruiker toegang tot het aanpassen van medegebruikers die gekoppeld zijn aan de server.', - 'user_delete' => 'Geeft de gebruiker toegang tot het verwijderen van medegebruikers die gekoppeld zijn aan server.', - 'file_create' => 'Geeft de gebruiker toegang tot het aanmaken van nieuwe bestanden en mappen op de server.', - 'file_read' => 'Geeft de gebruiker toegang tot het weergeven van bestaande bestanden en mappen op de server, evenals de inhoud ervan bekijken.', - 'file_update' => 'Geeft de gebruiker toegang tot het aanpassen van bestaande bestanden en mappen op de server.', - 'file_delete' => 'Geeft de gebruiker toegang tot het verwijderen van bestanden en mappen op de server.', - 'file_archive' => 'Geeft de gebruiker toegang tot het aanmaken van nieuwe bestandsarchieven en het uitpakken van bestaande bestandsarchieven op de server.', - 'file_sftp' => 'Geeft de gebruiker toegang tot de bovenstaande acties via de SFTP-client van de server.', - 'allocation_read' => 'Geeft de gebruiker toegang tot de toewijzingspagina\'s van de server.', - 'allocation_update' => 'Geeft de gebruiker toegang tot het aanpassen van toewijzingen van de server.', - 'database_create' => 'Geeft de gebruiker toegang tot het aanmaken van databases voor de server.', - 'database_read' => 'Geeft de gebruiker toegang tot het weergeven van databases voor de server.', - 'database_update' => 'Geeft de gebruiker toegang tot het aanpassen van databases voor de server. Als de gebruiker niet de "Bekijk wachtwoord" permissie heeft, kan het wachtwoord niet gewijzigd worden.', - 'database_delete' => 'Geeft de gebruiker toegang tot het verwijderen van databases voor de server.', - 'database_view_password' => 'Geeft de gebruiker toegang tot het weergeven van database wachtwoorden voor de server.', - 'schedule_create' => 'Geeft de gebruiker toegang tot het aanmaken van taken voor de server.', - 'schedule_read' => 'Geeft de gebruiker toegang tot het bekijken van taken voor de server.', - 'schedule_update' => 'Geeft de gebruiker toegang tot het bewerken van bestaande taken voor de server.', - 'schedule_delete' => 'Geeft de gebruiker toegang tot het verwijderen van taken voor de server.', - ], -]; diff --git a/lang/nl/strings.php b/lang/nl/strings.php deleted file mode 100644 index bfc650bf29..0000000000 --- a/lang/nl/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-mail', - 'email_address' => 'E-mailadres', - 'user_identifier' => 'Gebruikersnaam of e-mail', - 'password' => 'Wachtwoord', - 'new_password' => 'Nieuw wachtwoord', - 'confirm_password' => 'Bevestig nieuw wachtwoord', - 'login' => 'Inloggen', - 'home' => 'Startpagina', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Naam', - 'node' => 'Node', - 'connection' => 'Verbinding', - 'memory' => 'Geheugen', - 'cpu' => 'CPU', - 'disk' => 'Schijf', - 'status' => 'Status', - 'search' => 'Zoeken', - 'suspended' => 'Opgeheven', - 'account' => 'Account', - 'security' => 'Beveiliging', - 'ip' => 'IP adres', - 'last_activity' => 'Laatste Activiteit', - 'revoke' => 'Intrekken', - '2fa_token' => 'Authenticatietoken', - 'submit' => 'Bevestigen', - 'close' => 'Sluiten', - 'settings' => 'Instellingen', - 'configuration' => 'Configuratie', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Notitie', - 'created' => 'Aangemaakt', - 'expires' => 'Vervalt', - 'public_key' => 'Token', - 'api_access' => 'Api toegang', - 'never' => 'nooit', - 'sign_out' => 'Afmelden', - 'admin_control' => 'Admin Beheer', - 'required' => 'Vereist', - 'port' => 'Poort', - 'username' => 'Gebruikersnaam', - 'database' => 'Database', - 'new' => 'Nieuw', - 'danger' => 'Gevaar', - 'create' => 'Aanmaken', - 'select_all' => 'Alles Selecteren', - 'select_none' => 'Selecteer Geen', - 'alias' => 'Alias', - 'primary' => 'Primaire', - 'make_primary' => 'Primair maken', - 'none' => 'Geen', - 'cancel' => 'Annuleren', - 'created_at' => 'Gemaakt Op', - 'action' => 'Actie', - 'data' => 'Gegevens', - 'queued' => 'In wachtrij', - 'last_run' => 'Laatst uitgevoerd', - 'next_run' => 'Volgende uitvoering', - 'not_run_yet' => 'Nog niet uitgevoerd', - 'yes' => 'Ja', - 'no' => 'Nee', - 'delete' => 'Verwijderen', - '2fa' => 'Tweestapsverificatie', - 'logout' => 'Uitloggen', - 'admin_cp' => 'Admin Controle Paneel', - 'optional' => 'Optioneel', - 'read_only' => 'Alleen lezen', - 'relation' => 'Relatie', - 'owner' => 'Eigenaar', - 'admin' => 'Beheerder', - 'subuser' => 'Medegebruiker', - 'captcha_invalid' => 'De uitgevoerde captcha is ongeldig.', - 'tasks' => 'Taken', - 'seconds' => 'Seconden', - 'minutes' => 'Minuten', - 'under_maintenance' => 'In onderhoud', - 'days' => [ - 'sun' => 'Zondag', - 'mon' => 'Maandag', - 'tues' => 'Dinsdag', - 'wed' => 'Woensdag', - 'thurs' => 'Donderdag', - 'fri' => 'Vrijdag', - 'sat' => 'Zaterdag', - ], - 'last_used' => 'Laatst gebruikt', - 'enable' => 'Inschakelen', - 'disable' => 'Uitschakelen', - 'save' => 'Opslaan', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/nl/validation.php b/lang/nl/validation.php index a45a02dac6..87614e3cf5 100644 --- a/lang/nl/validation.php +++ b/lang/nl/validation.php @@ -28,7 +28,7 @@ 'string' => ':attribute moet tussen :min en :max karakters zijn.', 'array' => ':attribute moet tussen de :min en :max items bevatten.', ], - 'boolean' => ':attribute moet ja of nee zijn.', + 'confirmed' => ':attribute bevestiging komt niet overeen.', 'date' => ':attribute is geen geldige datum.', 'date_format' => ':attribute komt niet overeen met het formaat :format.', @@ -36,13 +36,13 @@ 'digits' => ':attribute moet :digits cijfers lang zijn.', 'digits_between' => ':attribute moet tussen de :min en :max cijfers bevatten.', 'dimensions' => ':attribute heeft ongeldige afbeelding afmetingen.', - 'distinct' => ':attribute heeft een dubbele waarde.', + 'email' => ':attribute is geen geldig e-mailadres.', - 'exists' => ':attribute is ongeldig.', + 'file' => ':attribute moet een bestand zijn.', 'filled' => ':attribute is verplicht.', 'image' => ':attribute moet een afbeelding zijn.', - 'in' => 'De geselecteerde :attribute is ongeldig.', + 'in_array' => ':attribute veld bestaat niet in :other.', 'integer' => ':attribute moet een getal zijn.', 'ip' => ':attribute moet een geldig IP-adres zijn.', @@ -61,17 +61,13 @@ 'string' => ':attribute moet tenminste :min karakters bevatten.', 'array' => ':attribute moet minimaal :min items bevatten.', ], - 'not_in' => 'De geselecteerde :attribute is ongeldig.', + 'numeric' => ':attribute moet een nummer zijn.', - 'present' => ':attribute moet bestaan.', + 'regex' => ':attribute formaat is ongeldig.', - 'required' => ':attribute is verplicht.', - 'required_if' => ':attribute is verplicht indien :other gelijk is aan :value.', - 'required_unless' => ':attribute is verplicht tenzij :other gelijk is aan :values.', - 'required_with' => ':attribute is verplicht in combinatie met :values.', + 'required_with_all' => ':attribute is verplicht in combinatie met :values.', - 'required_without' => ':attribute is verplicht als :values niet ingevuld is.', - 'required_without_all' => ':attribute is verplicht als :values niet ingevuld zijn.', + 'same' => ':attribute en :other moeten overeenkomen.', 'size' => [ 'numeric' => ':attribute moet :size zijn.', @@ -81,8 +77,7 @@ ], 'string' => ':attribute moet een tekenreeks zijn.', 'timezone' => ':attribute moet een geldige tijdzone zijn.', - 'unique' => ':attribute is al in gebruik.', - 'uploaded' => ':attribute kon niet worden geüpload.', + 'url' => ':attribute formaat is ongeldig.', /* diff --git a/lang/no/activity.php b/lang/no/activity.php index a09fc4cd20..9a72a7a5ad 100644 --- a/lang/no/activity.php +++ b/lang/no/activity.php @@ -8,123 +8,118 @@ */ return [ 'auth' => [ - 'fail' => 'Innlogging feilet', + 'fail' => 'Mislykket innlogging', 'success' => 'Logget inn', - 'password-reset' => 'Tilbakestill passord', - 'reset-password' => 'Tilbakestilling av passord forespurt', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', + 'password-reset' => 'Passord tilbakestilt', + 'checkpoint' => 'Tofaktorautentisering forespurt', + 'recovery-token' => 'Brukte tofaktor gjenopprettingskode', + 'token' => 'Løste tofaktor utfordring', + 'ip-blocked' => 'Blokkerte forespørsel fra ikke-listet IP-adresse for :identifier', 'sftp' => [ - 'fail' => 'Failed SFTP log in', + 'fail' => 'Mislykket SFTP-innlogging', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Changed email from :old to :new', + 'username-changed' => 'Endret brukernavn fra :old til :new', + 'email-changed' => 'Endret e-post fra :old til :new', 'password-changed' => 'Endret passord', ], 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', + 'create' => 'Opprettet ny API-nøkkel :identifier', + 'delete' => 'Slettet API-nøkkel :identifier', ], 'ssh-key' => [ - 'create' => 'SSH-nøkkel :fingerprint ble lagt til kontoen', - 'delete' => 'SSH-nøkkel :fingerprint ble fjernet fra kontoen', + 'create' => 'La til SSH-nøkkel :fingerprint på kontoen', + 'delete' => 'Fjernet SSH-nøkkel :fingerprint fra kontoen', ], 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', + 'create' => 'Aktiverte tofaktorautentisering', + 'delete' => 'Deaktiverte tofaktorautentisering', ], ], 'server' => [ - 'reinstall' => 'Reinstallete server', 'console' => [ - 'command' => 'Utføre ":command" på serveren', + 'command' => 'Utførte ":command" på serveren', ], 'power' => [ 'start' => 'Startet serveren', 'stop' => 'Stoppet serveren', - 'restart' => 'Restartet serveren', - 'kill' => 'Drepte serverprosessen', + 'restart' => 'Omstartet serveren', + 'kill' => 'Tvunget avslutning av serverprosessen', ], 'backup' => [ - 'download' => 'Lastet ned :name sikkerhetskopi', - 'delete' => 'Sikkerhetskopi :name ble slettet', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', + 'download' => 'Lastet ned sikkerhetskopi :name', + 'delete' => 'Slettet sikkerhetskopi :name', + 'restore' => 'Gjenopprettet sikkerhetskopi :name (slettede filer: :truncate)', + 'restore-complete' => 'Fullførte gjenoppretting av sikkerhetskopi :name', + 'restore-failed' => 'Kunne ikke fullføre gjenoppretting av sikkerhetskopi :name', + 'start' => 'Startet en ny sikkerhetskopi :name', + 'complete' => 'Merked sikkerhetskopi :name som fullført', + 'fail' => 'Merked sikkerhetskopi :name som mislykket', + 'lock' => 'Låste sikkerhetskopi :name', + 'unlock' => 'Låste opp sikkerhetskopi :name', + 'rename' => 'Omdøpt sikkerhetskopi fra ":old_name" til ":new_name"', ], 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Slettet databasen :name', + 'create' => 'Opprettet ny database :name', + 'rotate-password' => 'Passord rotert for database :name', + 'delete' => 'Slettet database :name', ], 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Opprettet en kopi av :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Slettet :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Lastet ned :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Startet filopplasting', - 'uploaded' => 'Lastet opp :katalog:file', + 'compress' => 'Komprimerte :directory:files|Komprimerte :count filer i :directory', + 'read' => 'Viste innholdet i :file', + 'copy' => 'Opprettet en kopi av :file', + 'create-directory' => 'Opprettet mappe :directory:name', + 'decompress' => 'Pakket ut :file i :directory', + 'delete' => 'Slettet :directory:files|Slettet :count filer i :directory', + 'download' => 'Lastet ned :file', + 'pull' => 'Lastet ned en ekstern fil fra :url til :directory', + 'rename' => 'Flyttet/byttet navn på :from til :to|Flyttet/byttet navn på :count filer i :directory', + 'write' => 'Skrev nytt innhold til :file', + 'upload' => 'Startet en filopplasting', + 'uploaded' => 'Lastet opp :directory:file', ], 'sftp' => [ - 'denied' => 'Tilgang til SFTP er blokkert på grunn av tilgangsstyring', - 'create_one' => 'Opprettet :files.0', - 'create_other' => 'Opprettet :count nye filer', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Slettet :files.0', - 'delete_other' => 'Slettet :count filer', - 'create-directory_one' => 'Opprettet :files.0 mappen', - 'create-directory_other' => 'Opprettet :count mapper', - 'rename_one' => 'Endret navn på :files.0.from til :files.0.to', - 'rename_other' => 'Renamed or moved :count files', + 'denied' => 'Blokkerte SFTP-tilgang på grunn av manglende tillatelser', + 'create' => 'Opprettet :files|Opprettet :count nye filer', + 'write' => 'Endret innholdet i :files|Endret innholdet i :count filer', + 'delete' => 'Slettet :files|Slettet :count filer', + 'create-directory' => 'Opprettet mappen :files|Opprettet :count mapper', + 'rename' => 'Endret navn fra :from til :to|Endret navn på eller flyttet :count filer', ], 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', + 'create' => 'La til :allocation på serveren', + 'notes' => 'Oppdaterte notatene for :allocation fra ":old" til ":new"', + 'primary' => 'Satte :allocation som primær serverallokering', + 'delete' => 'Slettet allokeringen :allocation', ], 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', + 'create' => 'Opprettet tidsplanen :name', + 'update' => 'Oppdaterte tidsplanen :name', + 'execute' => 'Manuelt kjørte tidsplanen :name', + 'delete' => 'Slettet tidsplanen :name', ], 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', + 'create' => 'Opprettet en ny ":action" oppgave for tidsplanen :name', + 'update' => 'Oppdaterte oppgaven ":action" for tidsplanen :name', + 'delete' => 'Slettet ":action" oppgaven for :name tidsplanen', ], 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', + 'rename' => 'Endret servernavnet fra ":old" til ":new"', + 'description' => 'Endret serverbeskrivelsen fra ":old" til ":new"', + 'reinstall' => 'Reinstallerte server', ], 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', + 'edit' => 'Endret variabelen :variable fra ":old" til ":new"', + 'image' => 'Oppdaterte Docker-bildet for serveren fra :old til :new', + 'command' => 'Oppdaterte oppstartskommandoen for serveren fra :old til :new', ], 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', + 'create' => 'La til :email som underbruker', + 'update' => 'Oppdaterte underbrukerens tillatelser for :email', + 'delete' => 'Fjernet :email som underbruker', ], + 'crashed' => 'Serveren krasjet', ], ]; diff --git a/lang/no/admin/apikey.php b/lang/no/admin/apikey.php new file mode 100644 index 0000000000..25c7ec62b7 --- /dev/null +++ b/lang/no/admin/apikey.php @@ -0,0 +1,27 @@ + 'Applikasjon API-nøkler', + 'empty' => 'Ingen API-nøkler.', + 'whitelist' => 'Hvitelistede IPv4-adresser', + 'whitelist_help' => 'API-nøkler kan begrenses til kun å fungere fra spesifikke IPv4-adresser. Skriv inn hver adresse på en ny linje.', + 'whitelist_placeholder' => 'Eksempel: 127.0.0.1 eller 192.168.1.1', + 'description' => 'Beskrivelse', + 'description_help' => 'En kort beskrivelse av hva denne nøkkelen brukes til.', + 'nav_title' => 'API-nøkler', + 'model_label' => 'Applikasjon API-nøkkel', + 'model_label_plural' => 'Applikasjon API-nøkler', + 'table' => [ + 'key' => 'Nøkkel', + 'description' => 'Beskrivelse', + 'last_used' => 'Sist brukt', + 'created' => 'Opprettet', + 'created_by' => 'Opprettet av', + 'never_used' => 'Aldri brukt', + ], + 'permissions' => [ + 'none' => 'Ingen', + 'read' => 'Les', + 'read_write' => 'Les og skriv', + ], +]; diff --git a/lang/no/admin/dashboard.php b/lang/no/admin/dashboard.php new file mode 100644 index 0000000000..b9c88328b0 --- /dev/null +++ b/lang/no/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Velkommen til Pelican!', + 'version' => 'Versjon: :version', + 'advanced' => 'Avansert', + 'server' => 'Server', + 'user' => 'Bruker', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informasjon for utviklere', + 'content' => 'Takk for at du prøver utviklingsversjonen!', + 'extra_note' => 'Hvis du støter på problemer, vennligst rapporter dem på GitHub.', + 'button_issues' => 'Opprett problem', + 'button_features' => 'Diskuter funksjoner', + ], + 'intro-update-available' => [ + 'heading' => 'Oppdatering tilgjengelig', + 'content' => ':latestVersion er nå tilgjengelig! Les dokumentasjonen vår for å oppdatere panelet ditt.', + 'button_changelog' => 'Hva er nytt?', + ], + 'intro-no-update' => [ + 'heading' => 'Panelet ditt er oppdatert', + 'content' => 'Du bruker for øyeblikket :version. Panelet ditt er oppdatert!', + ], + 'intro-first-node' => [ + 'heading' => 'Ingen noder oppdaget', + 'content' => 'Det ser ut til at du ikke har satt opp noen noder ennå, men ikke bekymre deg! Klikk på handlingsknappen for å opprette din første node.', + 'extra_note' => 'Hvis du støter på problemer, vennligst rapporter dem på GitHub.', + 'button_label' => 'Opprett første node i Pelican', + ], + 'intro-support' => [ + 'heading' => 'Støtt Pelican', + 'content' => 'Takk for at du bruker Pelican! Dette har kun vært mulig gjennom støtten fra deg, våre bidragsytere og resten av våre støttespillere!', + 'extra_note' => 'Vi setter pris på all støtte fra hvem som helst.', + 'button_translate' => 'Hjelp med oversettelse', + 'button_donate' => 'Donér direkte', + ], + 'intro-help' => [ + 'heading' => 'Trenger du hjelp?', + 'content' => 'Sjekk ut dokumentasjonen først! Hvis du fortsatt trenger hjelp, besøk vår Discord-server!', + 'button_docs' => 'Les dokumentasjon', + ], + ], +]; diff --git a/lang/no/admin/eggs.php b/lang/no/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/no/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/no/admin/health.php b/lang/no/admin/health.php new file mode 100644 index 0000000000..a386ef3286 --- /dev/null +++ b/lang/no/admin/health.php @@ -0,0 +1,60 @@ + 'Helse', + 'results_refreshed' => 'Helsesjekkresultater oppdatert', + 'checked' => 'Sjekkede resultater fra :time', + 'refresh' => 'Oppdater', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Kunne ikke sette eller hente en applikasjonsbufferverdi.', + 'failed' => 'En feil oppstod med applikasjonsbufferen: :error', + ], + 'database' => [ + 'label' => 'Database', + 'ok' => 'Ok', + 'failed' => 'Kunne ikke koble til databasen: :error', + ], + 'debugmode' => [ + 'label' => 'Feilsøkingsmodus', + 'ok' => 'Feilsøkingsmodus er deaktivert', + 'failed' => 'Feilsøkingsmodus var forventet å være :expected, men var faktisk :actual', + ], + 'environment' => [ + 'label' => 'Miljø', + 'ok' => 'Ok, satt til :actual', + 'failed' => 'Miljøet er satt til :actual, forventet :expected', + ], + 'nodeversions' => [ + 'label' => 'Nodeversjoner', + 'ok' => 'Nodene er oppdatert', + 'failed' => ':outdated/:all noder er utdaterte', + 'no_nodes_created' => 'Ingen noder opprettet', + 'no_nodes' => 'Ingen noder', + 'all_up_to_date' => 'Alle er oppdatert', + 'outdated' => ':outdated/:all utdaterte', + ], + 'panelversion' => [ + 'label' => 'Panelversjon', + 'ok' => 'Panelet er oppdatert', + 'failed' => 'Installert versjon er :currentVersion, men nyeste er :latestVersion', + 'up_to_date' => 'Oppdatert', + 'outdated' => 'Utdatert', + ], + 'schedule' => [ + 'label' => 'Tidsplan', + 'ok' => 'Ok', + 'failed_last_ran' => 'Den siste kjøringen av tidsplanen var for mer enn :time minutter siden', + 'failed_not_ran' => 'Tidsplanen har ikke blitt kjørt ennå.', + ], + 'useddiskspace' => [ + 'label' => 'Diskplass', + ], + ], + 'checks' => [ + 'successful' => 'Vellykket', + 'failed' => 'Mislykket', + ], +]; diff --git a/lang/no/admin/node.php b/lang/no/admin/node.php deleted file mode 100644 index d68305e3a8..0000000000 --- a/lang/no/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'FQDN eller IP-adressen som er gitt, går ikke til en gyldig IP-adresse.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/no/admin/server.php b/lang/no/admin/server.php deleted file mode 100644 index 5dbd23e624..0000000000 --- a/lang/no/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'Det oppstod en valideringsfeil med :name variabelen.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Serveren er slettet fra systemet.', - 'server_created' => 'Serveren ble opprettet i panelet. Vennligst tillat tjerneren noen minutter å installere denne serveren..', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'Serveren er satt i kø for en reinstallasjon som begynner nå.', - 'details_updated' => 'Serverdetaljer har blitt oppdatert.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Serveroverføringen har startet.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/no/admin/user.php b/lang/no/admin/user.php deleted file mode 100644 index 33ea534e17..0000000000 --- a/lang/no/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Kan ikke slette din egen brukerkonto.', - ], - 'notices' => [ - 'account_created' => 'Kontoen er opprettet.', - 'account_updated' => 'Kontoen har blitt oppdatert.', - ], -]; diff --git a/lang/no/auth.php b/lang/no/auth.php index 712f7f8023..0ff0fd411b 100644 --- a/lang/no/auth.php +++ b/lang/no/auth.php @@ -1,27 +1,24 @@ 'Logg inn', - 'go_to_login' => 'Gå til pålogging', - 'failed' => 'Ingen konto som samsvarer med disse opplysningene ble funnet.', - 'forgot_password' => [ - 'label' => 'Glemt passord?', - 'label_help' => 'Skriv inn din epostadresse for å motta instuksjoner for å resette passordet ditt.', - 'button' => 'Gjenopprett konto', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Tilbakestill og logg inn', - ], + 'failed' => 'Disse legitimasjonene samsvarer ikke med våre oppføringer.', + 'failed-two-factor' => 'Feil 2FA-kode', + 'two-factor-code' => 'To-faktor kode', + 'two-factor-hint' => 'Du kan bruke sikkerhetskoder hvis du mistet tilgang til din enhet.', + 'password' => 'Det angitte passordet er feil.', + 'throttle' => 'For mange påloggingsforsøk. Vennligst prøv igjen om :seconds sekunder.', + '2fa_must_be_enabled' => 'Administratoren har påkrevd at to-faktor autentisering må aktiveres på din konto for å kunne bruke Panelet.', - 'two_factor' => [ - 'label' => 'Tofaktorautentiserings kode', - 'label_help' => 'Kontoen krever en tostegsautentiserings kode for å kunne fortsette. Skriv inn koden fra din registerte enhet for å logge inn.', - 'checkpoint_failed' => 'Tofaktorautentiseringskoden var ugyldig.', - ], - - 'throttle' => 'For mange påloggingsforsøk. Prøv igjen om :seconds sekunder.', - 'password_requirements' => 'Passordet må være minst 8 tegn langt og bør være unikt for denne siden.', - '2fa_must_be_enabled' => 'Administratoren krever at tofaktorautentisering aktiveres på din konto for å kunne bruke panelet.', ]; diff --git a/lang/no/command/messages.php b/lang/no/command/messages.php deleted file mode 100644 index 09c8281668..0000000000 --- a/lang/no/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Skriv inn brukernavn, bruker-ID, eller epostadresse', - 'select_search_user' => 'ID for brukeren som skal slettes (Angi \'0\' for å søke på nytt)', - 'deleted' => 'Brukeren ble slettet fra panelet.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Er denne brukeren en administrator?', - 'ask_email' => 'E-postadresse', - 'ask_username' => 'Brukernavn', - 'ask_name_first' => 'Fornavn', - 'ask_name_last' => 'Etternavn', - 'ask_password' => 'Passord', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP-vert (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP-port', - 'ask_smtp_username' => 'SMTP brukernavn', - 'ask_smtp_password' => 'SMTP passord', - 'ask_mailgun_domain' => 'Mailgun domene', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API nøkkel', - 'ask_driver' => 'Hvilken driver skal brukes for å sende e-post?', - 'ask_mail_from' => 'E-postadresse som e-poster skal bruke som avsender', - 'ask_mail_name' => 'Navnet på e-posten, epostene skal komme fra', - 'ask_encryption' => 'Krypteringsmetode som skal brukes', - ], - ], -]; diff --git a/lang/no/dashboard/account.php b/lang/no/dashboard/account.php deleted file mode 100644 index ff52388c9e..0000000000 --- a/lang/no/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Oppdater e-postadressen din', - 'updated' => 'Din epost har blitt oppdatert', - ], - 'password' => [ - 'title' => 'Endre passoret ditt', - 'requirements' => 'Ditt nye passord må ha minst 8 tegn', - 'updated' => 'Ditt passord er oppdatert.', - ], - 'two_factor' => [ - 'button' => 'Konfigurer tofaktorautentisering', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'Koden som ble oppgitt var ugyldig', - 'setup' => [ - 'title' => 'Sett opp tofaktorautentisering', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Skriv inn autentiserings-kode', - ], - 'disable' => [ - 'title' => 'Deaktiver tofaktorautentisering', - 'field' => 'Skriv inn autentiserings-kode', - ], - ], -]; diff --git a/lang/no/dashboard/index.php b/lang/no/dashboard/index.php deleted file mode 100644 index e345b1bbc3..0000000000 --- a/lang/no/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Søk etter servere...', - 'no_matches' => 'Det ble ikke funnet noen servere som matcher søkekriteriene', - 'cpu_title' => 'CPU', - 'memory_title' => 'Minne', -]; diff --git a/lang/no/exceptions.php b/lang/no/exceptions.php index f9a65b7448..fb5c782165 100644 --- a/lang/no/exceptions.php +++ b/lang/no/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'Det oppstod en feil under forsøk på å kommunisere med daemonen, noe som resulterte i en HTTP/:code feilkode. Denne feilen har blitt loggført.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'En node må ikke ha noen servere tilknyttet for å kunne slettes.', + 'error_connecting' => 'Feil ved tilkobling til :node', + 'daemon_off_config_updated' => 'Daemon-konfigurasjonen har blitt oppdatert, men det oppstod en feil under forsøk på å automatisk oppdatere konfigurasjonsfilen på daemonen. Du må manuelt oppdatere konfigurasjonsfilen (config.yml) for at endringene skal tre i kraft.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'En server er for øyeblikket tilordnet denne allokeringen. En allokering kan kun slettes hvis ingen server er tilknyttet.', + 'too_many_ports' => 'Det er ikke støttet å legge til mer enn 1000 porter i en enkelt rekke samtidig.', + 'invalid_mapping' => 'Kartleggingen oppgitt for :port var ugyldig og kunne ikke behandles.', + 'cidr_out_of_range' => 'CIDR-notasjon tillater kun masker mellom /25 og /32.', + 'port_out_of_range' => 'Porter i en allokering må være større enn eller lik 1024 og mindre enn eller lik 65535.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Et egg med aktive servere tilknyttet kan ikke slettes fra panelet.', + 'invalid_copy_id' => 'Egget som er valgt for å kopiere et skript fra, eksisterer enten ikke eller kopierer allerede et annet skript.', + 'has_children' => 'Dette egget er en overordnet til ett eller flere andre egg. Vennligst slett disse eggene før du sletter dette egget.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'Miljøvariabelen :name må være unik for dette egget.', + 'reserved_name' => 'Miljøvariabelen :name er beskyttet og kan ikke tildeles en variabel.', + 'bad_validation_rule' => 'Valideringsregelen ":rule" er ikke en gyldig regel for denne applikasjonen.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'JSON-filen som ble oppgitt er ugyldig.', - 'invalid_json_provided' => 'JSON-filen som er angitt er ikke i et format som kan gjenkjennes.', + 'json_error' => 'Det oppstod en feil under forsøk på å analysere JSON-filen: :error.', + 'file_error' => 'Den oppgitte JSON-filen var ikke gyldig.', + 'invalid_json_provided' => 'Den oppgitte JSON-filen er ikke i et format som kan gjenkjennes.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Det er ikke tillatt å redigere din egen underbrukerkonto.', + 'user_is_owner' => 'Du kan ikke legge til servereieren som en underbruker for denne serveren.', + 'subuser_exists' => 'En bruker med den e-postadressen er allerede tilknyttet som en underbruker for denne serveren.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Kan ikke slette en databasevert som har aktive databaser tilknyttet.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Den maksimale intervalltiden for en kjedet oppgave er 15 minutter.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Kan ikke slette en lokasjon som har aktive noder tilknyttet.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Kan ikke slette din egen brukerkonto.', + 'has_servers' => 'Kan ikke slette en bruker med aktive servere tilknyttet kontoen deres. Vennligst slett serverene deres før du fortsetter.', + 'node_revocation_failed' => 'Kunne ikke tilbakekalle nøkler på Node #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Ingen noder som oppfyller kravene for automatisk distribusjon ble funnet.', + 'no_viable_allocations' => 'Ingen allokeringer som oppfyller kravene for automatisk distribusjon ble funnet.', ], 'api' => [ - 'resource_not_found' => 'Den forespurte ressursen finnes ikke på denne serveren.', + 'resource_not_found' => 'Den forespurte ressursen eksisterer ikke på denne serveren.', + ], + 'mount' => [ + 'servers_attached' => 'En montering må ikke ha noen servere tilknyttet for å kunne slettes.', + ], + 'server' => [ + 'marked_as_failed' => 'Denne serveren har ikke fullført installasjonsprosessen ennå, prøv igjen senere.', ], ]; diff --git a/lang/no/pagination.php b/lang/no/pagination.php deleted file mode 100644 index 372946c673..0000000000 --- a/lang/no/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Forrige', - 'next' => 'Neste »', -]; diff --git a/lang/no/passwords.php b/lang/no/passwords.php deleted file mode 100644 index 73f86df60c..0000000000 --- a/lang/no/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Ditt passord har blitt tilbakestilt!', - 'sent' => 'Vi har sendt deg en e-post med en tilbakestillingslink for ditt passord!', - 'token' => 'Koden for å nullstille passordet er ugyldig.', - 'user' => 'Vi kan ikke finne en bruker med den e-postadressen.', -]; diff --git a/lang/no/profile.php b/lang/no/profile.php new file mode 100644 index 0000000000..d32650b412 --- /dev/null +++ b/lang/no/profile.php @@ -0,0 +1,70 @@ + 'Profil', + 'tabs' => [ + 'account' => 'Konto', + 'oauth' => 'OAuth', + 'activity' => 'Aktivitet', + 'api_keys' => 'API-nøkler', + 'ssh_keys' => 'SSH-nøkler', + 'keys' => 'Nøkler', + '2fa' => '2FA', + 'customization' => 'Tilpasning', + ], + 'username' => 'Brukernavn', + 'admin' => 'Administrator', + 'exit_admin' => 'Avslutt Admin', + 'server_list' => 'Serverliste', + 'email' => 'E-post', + 'password' => 'Passord', + 'current_password' => 'Nåværende passord', + 'password_confirmation' => 'Bekreft passord', + 'timezone' => 'Tidssone', + 'language' => 'Språk', + 'language_help' => 'Språket ditt :state har ikke blitt oversatt ennå!', + 'link' => 'Koble til', + 'unlink' => 'Koble fra', + 'unlinked' => ':name frakoblet', + 'scan_qr' => 'Skann QR-kode', + 'code' => 'Kode', + 'setup_key' => 'Oppsettsnøkkel', + 'invalid_code' => 'Ugyldig 2FA-kode', + 'code_help' => 'Skann QR-koden ovenfor med din tofaktorautentiseringsapp, og skriv deretter inn koden som genereres.', + '2fa_enabled' => 'Tofaktorautentisering er aktivert!', + 'backup_help' => 'Disse vil ikke bli vist igjen!', + 'backup_codes' => 'Sikkerhetskopikoder', + 'disable_2fa' => 'Deaktiver 2FA', + 'disable_2fa_help' => 'Skriv inn din nåværende 2FA-kode for å deaktivere tofaktorautentisering', + 'api_keys' => 'API-nøkler', + 'create_api_key' => 'Opprett API-nøkkel', + 'api_key_created' => 'API-nøkkel opprettet', + 'description' => 'Beskrivelse', + 'allowed_ips' => 'Tillatte IP-er', + 'allowed_ips_help' => 'Trykk enter for å legge til en ny IP-adresse, eller la det stå tomt for å tillate alle IP-adresser', + 'ssh_keys' => 'SSH-nøkler', + 'create_ssh_key' => 'Opprett SSH-nøkkel', + 'ssh_key_created' => 'SSH-nøkkel opprettet', + 'name' => 'Navn', + 'public_key' => 'Offentlig nøkkel', + 'could_not_create_ssh_key' => 'Klarte ikke opprette ssh-nøkkel', + 'dashboard' => 'Kontrollsenter', + 'dashboard_layout' => 'Dashboard oppsett', + 'console' => 'Konsoll', + 'grid' => 'Rutenett', + 'table' => 'Tabell', + 'rows' => 'Rader', + 'font_size' => 'Skriftstørrelse', + 'font' => 'Font', + 'font_preview' => 'Font forhåndsvisning', + 'seconds' => 'Sekunder', + 'graph_period' => 'Grafperiode', + 'graph_period_helper' => 'Antall datapunkter, sekunder, vist på konsollgrafene.', + 'navigation' => 'Navigasjons type', + 'sidebar' => 'Sidepanel', + 'topbar' => 'Toppmeny', + 'mixed' => 'Blandet', + 'no_oauth' => 'Ingen kontoer tilkoblet', + 'no_api_keys' => 'Ingen API-nøkler.', + 'no_ssh_keys' => 'Ingen SSH-nøkler.', +]; diff --git a/lang/no/search.php b/lang/no/search.php new file mode 100644 index 0000000000..4779413319 --- /dev/null +++ b/lang/no/search.php @@ -0,0 +1,9 @@ + 'Vennligst skriv inn minst tre tegn for å starte søket.', + 'term' => [ + 'label' => 'Søkeord', + 'description' => 'Skriv inn et servernavn, UUID eller allokering for å starte søket.', + ], +]; diff --git a/lang/no/server/users.php b/lang/no/server/users.php deleted file mode 100644 index 8879cf4ca5..0000000000 --- a/lang/no/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Gir tilgang til websocketen for denne serveren.', - 'control_console' => 'Tillater brukeren å sende data til server konsollet.', - 'control_start' => 'Tillater brukeren å starte serverinstansen.', - 'control_stop' => 'Tillater brukeren å stoppe serverinstansen.', - 'control_restart' => 'Tillater brukeren å restarte serverinstansen.', - 'control_kill' => 'Tillater brukeren å drepe serveren.', - 'user_create' => 'Tillater brukeren å opprette nye brukerkontoer for serveren.', - 'user_read' => 'Tillater bruker å se brukere tilknyttet denne serveren.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/no/strings.php b/lang/no/strings.php deleted file mode 100644 index 523b218d13..0000000000 --- a/lang/no/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-post', - 'email_address' => 'E-postadresse', - 'user_identifier' => 'Brukernavn eller e-post', - 'password' => 'Passord', - 'new_password' => 'Nytt passord', - 'confirm_password' => 'Bekreft nytt passord', - 'login' => 'Logg inn', - 'home' => 'Hjem', - 'servers' => 'Servere', - 'id' => 'ID', - 'name' => 'Navn', - 'node' => 'Node', - 'connection' => 'Tilkobling', - 'memory' => 'Minne', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Søk', - 'suspended' => 'Suspendert', - 'account' => 'Konto', - 'security' => 'Sikkerhet', - 'ip' => 'IP adresse', - 'last_activity' => 'Siste aktivitet', - 'revoke' => 'Tilbakekall', - '2fa_token' => 'Autentiseringskode', - 'submit' => 'Lagre', - 'close' => 'Lukk', - 'settings' => 'Innstillinger', - 'configuration' => 'Konfigurasjon', - 'sftp' => 'SFTP', - 'databases' => 'Databaser', - 'memo' => 'Memo', - 'created' => 'Opprettet', - 'expires' => 'Utløper', - 'public_key' => 'Kode', - 'api_access' => 'Api-tilgang', - 'never' => 'aldri', - 'sign_out' => 'Logg av', - 'admin_control' => 'Administratorkontroll', - 'required' => 'Obligatorisk', - 'port' => 'Port', - 'username' => 'Brukernavn', - 'database' => 'Database', - 'new' => 'Ny', - 'danger' => 'Fare', - 'create' => 'Opprett', - 'select_all' => 'Velg alle', - 'select_none' => 'Velg Ingen', - 'alias' => 'Kallenavn', - 'primary' => 'Primær', - 'make_primary' => 'Gjør til primær', - 'none' => 'Ingen', - 'cancel' => 'Avbryt', - 'created_at' => 'Opprettet', - 'action' => 'Handling', - 'data' => 'Data', - 'queued' => 'Lagt i kø', - 'last_run' => 'Sist kjørt', - 'next_run' => 'Neste kjøring', - 'not_run_yet' => 'Ikke kjørt ennå', - 'yes' => 'Ja', - 'no' => 'Nei', - 'delete' => 'Slett', - '2fa' => '2FA', - 'logout' => 'Logg ut', - 'admin_cp' => 'Admin kontrollpanel', - 'optional' => 'Valgfritt', - 'read_only' => 'Skrivebeskyttet', - 'relation' => 'Relasjon', - 'owner' => 'Eier', - 'admin' => 'Administrator', - 'subuser' => 'Underbruker', - 'captcha_invalid' => 'Den oppgitte captchaen er ugyldig.', - 'tasks' => 'Oppgaver', - 'seconds' => 'Sekunder', - 'minutes' => 'Minutter', - 'under_maintenance' => 'Under vedlikehold', - 'days' => [ - 'sun' => 'Søndag', - 'mon' => 'Mandag', - 'tues' => 'Tirsdag', - 'wed' => 'Onsdag', - 'thurs' => 'Torsdag', - 'fri' => 'Fredag', - 'sat' => 'Lørdag', - ], - 'last_used' => 'Sist brukt', - 'enable' => 'Aktiver', - 'disable' => 'Deaktiver', - 'save' => 'Lagre', - 'copyright' => '® 2024 - :year Pelican*', -]; diff --git a/lang/no/validation.php b/lang/no/validation.php index 7bbf101819..dc0444ca4d 100644 --- a/lang/no/validation.php +++ b/lang/no/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => ':attribute må aksepteres.', + 'active_url' => ':attribute er ikke en gyldig URL.', + 'after' => ':attribute må være en dato etter :date.', + 'after_or_equal' => ':attribute må være en dato etter eller lik :date.', + 'alpha' => ':attribute kan kun inneholde bokstaver.', + 'alpha_dash' => ':attribute kan kun inneholde bokstaver, tall og bindestreker.', + 'alpha_num' => ':attribute kan kun inneholde bokstaver og tall.', + 'array' => ':attribute må være en liste.', + 'before' => ':attribute må være en dato før :date.', + 'before_or_equal' => ':attribute må være en dato før eller lik :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => ':attribute må være mellom :min og :max.', + 'file' => ':attribute må være mellom :min og :max kilobytes.', + 'string' => ':attribute må være mellom :min og :max tegn.', + 'array' => ':attribute må ha mellom :min og :max elementer.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', + + 'confirmed' => ':attribute-bekreftelsen samsvarer ikke.', 'date' => ':attribute er ikke en gyldig dato.', 'date_format' => ':attribute samsvarer ikke med formatet :format.', 'different' => ':attribute og :other må være forskjellige.', - 'digits' => ':attribute må være :digits sifre.', + 'digits' => ':attribute må være :digits siffer.', 'digits_between' => ':attribute må være mellom :min og :max siffer.', - 'dimensions' => ':attribute har ugyldig bildedimensjoner.', - 'distinct' => ':attribute har en duplikat verdi.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', + 'dimensions' => ':attribute har ugyldige bildedimensjoner.', + + 'email' => ':attribute må være en gyldig e-postadresse.', + 'file' => ':attribute må være en fil.', - 'filled' => ':attribute feltet er påkrevd.', + 'filled' => ':attribute-feltet er påkrevd.', 'image' => ':attribute må være et bilde.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => ':attribute må være ett helt tall.', + + 'in_array' => ':attribute-feltet eksisterer ikke i :other.', + 'integer' => ':attribute må være et heltall.', 'ip' => ':attribute må være en gyldig IP-adresse.', - 'json' => ':attribute må være en gyldig JSON streng.', + 'json' => ':attribute må være en gyldig JSON-streng.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute kan ikke være større enn :max.', + 'file' => ':attribute kan ikke være større enn :max kilobytes.', + 'string' => ':attribute kan ikke være lengre enn :max tegn.', + 'array' => ':attribute kan ikke ha mer enn :max elementer.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute må være en fil av typen: :values.', + 'mimetypes' => ':attribute må være en fil av typen: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute må være minst :min.', + 'file' => ':attribute må være minst :min kilobytes.', + 'string' => ':attribute må være minst :min tegn.', + 'array' => ':attribute må ha minst :min elementer.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => ':attribute formatet er ugyldig.', - 'required' => ':attribute feltet er påkrevd.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute må være et tall.', + + 'regex' => ':attribute har et ugyldig format.', + + 'required_with_all' => ':attribute-feltet er påkrevd når :values er til stede.', + + 'same' => ':attribute og :other må samsvare.', 'size' => [ 'numeric' => ':attribute må være :size.', 'file' => ':attribute må være :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'string' => ':attribute må være :size tegn.', + 'array' => ':attribute må inneholde :size elementer.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute må være en streng.', + 'timezone' => ':attribute må være en gyldig tidssone.', + + 'url' => ':attribute har et ugyldig format.', /* |-------------------------------------------------------------------------- @@ -101,6 +96,6 @@ // Internal validation logic for Panel 'internal' => [ 'variable_value' => ':env variabel', - 'invalid_password' => 'The password provided was invalid for this account.', + 'invalid_password' => 'Det oppgitte passordet var ugyldig for denne kontoen.', ], ]; diff --git a/lang/pl/activity.php b/lang/pl/activity.php index 04a7ed9ae5..c2070f27a1 100644 --- a/lang/pl/activity.php +++ b/lang/pl/activity.php @@ -11,27 +11,27 @@ 'fail' => 'Nie udało się zalogować', 'success' => 'Zalogowano', 'password-reset' => 'Zresetuj hasło', - 'reset-password' => 'Zażądano zresetowania hasła', 'checkpoint' => 'Zażądano uwierzytelnienia dwuetapowego', 'recovery-token' => 'Użyto tokena odzyskiwania uwierzytelnienia dwuetapowego', 'token' => 'Udane uwierzytelnienie dwuetapowe', - 'ip-blocked' => 'Zablokowano żądanie z nieuwzględnionego adresu IP dla :identifer', + 'ip-blocked' => 'Zablokowano żądanie z nieuwzględnionego adresu IP dla :identifier', 'sftp' => [ 'fail' => 'Nie udało się zalogować do SFTP', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Zmieniono adres e-mail z :old na :new', + 'username-changed' => 'Zmieniono nazwę użytkownika z :old na :new', + 'email-changed' => 'Zmieniono e-mail z :old na :new', 'password-changed' => 'Hasło zostało zmienione', ], 'api-key' => [ - 'create' => 'Stwórz nowy klucz API :identifier', - 'delete' => 'Usuń klucz API :identifier', + 'create' => 'Utworzono nowy klucz API :identifier', + 'delete' => 'Usunięto klucz API :identifier', ], 'ssh-key' => [ - 'create' => 'Dodano klucz SSH :fingerprint do konta', - 'delete' => 'Usunięto klucz SSH :fingerprint z konta', + 'create' => 'Dodano klucz SSH :fingerprint do konta', + 'delete' => 'Usunięto klucz SSH :fingerprint z konta', ], 'two-factor' => [ 'create' => 'Włączono autoryzację dwuetapową', @@ -39,92 +39,87 @@ ], ], 'server' => [ - 'reinstall' => 'Zainstalowano ponownie serwer', 'console' => [ - 'command' => 'Wykonano ":command" na serwerze', + 'command' => 'Wykonano ":command" na serwerze', ], 'power' => [ 'start' => 'Uruchomiono serwer', 'stop' => 'Zatrzymano serwer', 'restart' => 'Zrestartowano serwer', - 'kill' => 'Zatrzymano proces serwera', + 'kill' => 'Zabito proces serwera', ], 'backup' => [ - 'download' => 'Pobrano kopię zapasową o nazwie :name', - 'delete' => 'Usunięto kopię zapasową :name', - 'restore' => 'Przywrócono kopię zapasową o nazwie :name (usunięte pliki: :truncate)', - 'restore-complete' => 'Zakończono przywracanie kopii zapasowej o nazwie :name', - 'restore-failed' => 'Nie udało się zakończyć przywracania kopii zapasowej o nazwie :name', - 'start' => 'Rozpoczęto tworzenie kopii zapasowej :name', - 'complete' => 'Tworzenie kopii zapasowej :name zakończyło się pomyślnie', - 'fail' => 'Tworzenie kopii zapasowej :name nie powiodło się', - 'lock' => 'Zablokowano kopie zapasową :name', - 'unlock' => 'Odblokowano kopię zapasową :name', + 'download' => 'Pobrano kopię zapasową o nazwie :name', + 'delete' => 'Usunięto kopię zapasową o nazwie :name', + 'restore' => 'Przywrócono kopię zapasową o nazwie :name (usunięte pliki: :truncate)', + 'restore-complete' => 'Zakończono przywracanie kopii zapasowej o nazwie :name', + 'restore-failed' => 'Nie udało się ukończyć przywracania kopii zapasowej o nazwie :name', + 'start' => 'Rozpoczęto tworzenie kopii zapasowej o nazwie :name', + 'complete' => 'Tworzenie kopii zapasowej :name zostało ukończone', + 'fail' => 'Tworzenie kopii zapasowej :name nie powiodło się', + 'lock' => 'Zablokowano kopię zapasową :name', + 'unlock' => 'Odblokowano kopię zapasową :name', + 'rename' => 'Zmieniono nazwę kopii zapasowej z ":old_name" na ":new_name"', ], 'database' => [ - 'create' => 'Utwórz nową bazę danych :name', - 'rotate-password' => 'Zmieniono hasło dla bazy danych o nazwie :name', - 'delete' => 'Usunięto bazę danych o nazwie :name', + 'create' => 'Utworzono nową bazę danych o nazwie :name', + 'rotate-password' => 'Hasło dla bazy danych :name zostało zmienione', + 'delete' => 'Usunięto bazę danych o nazwie :name', ], 'file' => [ - 'compress_one' => 'Skompresowano :directory:file', - 'compress_other' => 'Skompresowano :count plików w katalogu :directory', - 'read' => 'Sprawdzono zawartość pliku :file', - 'copy' => 'Utworzono kopię pliku :file', - 'create-directory' => 'Utworzono katalog :directory:name', - 'decompress' => 'Rozpakowano :files w :directory', - 'delete_one' => 'Usunięto :directory:files.0', - 'delete_other' => 'Usunięto :count plików w katalogu :directory', - 'download' => 'Pobrano plik: :file', - 'pull' => 'Pobrano pliki z :url do :directory', - 'rename_one' => 'Zmieniono nazwę :directory:files.0.from na :directory:files.0.to', - 'rename_other' => 'Zmieniono nazwy :count plików w katalogu :directory.', - 'write' => 'Dokonano zapisu nowej zawartości do pliku :file', + 'compress' => 'Skompresowano :directory:files | Skompresowano :count plików w :directory', + 'read' => 'Wyświetlono zawartość pliku :file', + 'copy' => 'Utworzono kopię pliku :file', + 'create-directory' => 'Utworzono katalog :directory:name', + 'decompress' => 'Rozpakowano plik :file w katalogu :directory', + 'delete' => 'Usunięto :directory:files | Usunięto :count plików w :directory', + 'download' => 'Pobrano plik :file', + 'pull' => 'Pobrano plik zdalny z :url do :directory', + 'rename' => 'Przeniesiono/Zmieniono nazwę z :from na :to | Przeniesiono/Zmieniono nazwę :count plików w :directory', + 'write' => 'Wpisano nową zawartość do pliku :file', 'upload' => 'Rozpoczęto przesyłanie pliku', - 'uploaded' => 'Przesłano :directory:file', + 'uploaded' => 'Przesłano :directory:file', ], 'sftp' => [ 'denied' => 'Dostęp SFTP został zablokowany z powodu braku uprawnień', - 'create_one' => 'Utworzono :files.0', - 'create_other' => 'Utworzono :count nowych plików', - 'write_one' => 'Zmodyfikowano zawartość pliku :files.0', - 'write_other' => 'Zmodyfikowano zawartość :count plików', - 'delete_one' => 'Usunięto :files.0', - 'delete_other' => 'Usunięto :count plików', - 'create-directory_one' => 'Utworzono katalog :files.0', - 'create-directory_other' => 'Utworzono :count katalogów', - 'rename_one' => 'Zmieniono nazwę :files.0.from na :files.0.to', - 'rename_other' => 'Zmieniono nazwę lub przeniesiono :count plików', + 'create' => 'Utworzono :files | Utworzono :count nowych plików', + 'write' => 'Zmodyfikowano zawartość pliku :files | Zmieniono zawartość :count plików', + 'delete' => 'Usunięto :files | Usunięto :count plików', + 'create-directory' => 'Utworzono katalog :files | Utworzono :count katalogów', + 'rename' => 'Zmieniono nazwę :from na :to | Zmieniono nazwę lub przeniesiono :count plików', ], 'allocation' => [ - 'create' => 'Dodano :allocation do serwera', - 'notes' => 'Zaktualizowano informacje dla :allocation z ":old" na ":new".', - 'primary' => 'Ustawiono :allocation jako główną alokację serwera.', - 'delete' => 'Usunięto alokację :allocation', + 'create' => 'Dodano :allocation do serwera', + 'notes' => 'Zaktualizowano notatki dla :allocation z ":old" na ":new"', + 'primary' => 'Ustaw :allocation jako główną alokację serwera', + 'delete' => 'Usunięto alokację :allocation', ], 'schedule' => [ - 'create' => 'Utworzono harmonogram o nazwie :name', - 'update' => 'Zaktualizowano harmonogram o nazwie :name', - 'execute' => 'Ręcznie wykonano harmonogram o nazwie :name', - 'delete' => 'Usunięto harmonogram o nazwie :name', + 'create' => 'Utworzono harmonogram :name', + 'update' => 'Zaktualizowano harmonogram :name', + 'execute' => 'Ręcznie aktywowano harmonogram o nazwie :name', + 'delete' => 'Usunięto harmonogram :name', ], 'task' => [ - 'create' => 'Utworzono nowe zadanie ":action" dla harmonogramu o nazwie :name', - 'update' => 'Zaktualizowano zadanie ":action" dla harmonogramu o nazwie :name.', - 'delete' => 'Usunięto zadanie dla harmonogramu o nazwie :name.', + 'create' => 'Utworzono nowe zadanie ":action" dla harmonogramu :name', + 'update' => 'Zaktualizowano zadanie ":action" dla harmonogramu :name', + 'delete' => 'Usunięto zadanie ":action" z harmonogramu :name', ], 'settings' => [ - 'rename' => 'Zmieniono nazwę serwera z :old na :new', - 'description' => 'Zmieniono opis serwera z :old na :new', + 'rename' => 'Zmieniono nazwę serwera z ":old" na ":new"', + 'description' => 'Zmieniono opis serwera z ":old" na ":new"', + 'reinstall' => 'Serwer został zreinstalowany', ], 'startup' => [ - 'edit' => 'Zmieniono zmienną :variable z ":old" na ":new".', - 'image' => 'Zaktualizowano obraz Docker dla serwera z :old na :new.', + 'edit' => 'Zmieniono zmienną :variable z ":old" na ":new"', + 'image' => 'Zaktualizowano obraz Dockera dla serwera z :old na :new', + 'command' => 'Zaktualizowano Komendę Startową dla serwera z :old na :new', ], 'subuser' => [ - 'create' => 'Dodano :email jako drugiego użytkownika.', - 'update' => 'Zaktualizowano uprawnienia dla użytkownika :email', - 'delete' => 'Usunięto :email jako współpracownika.', + 'create' => 'Dodano :email jako podużytkownika', + 'update' => 'Zaktualizowano uprawnienia podużytkownika dla :email', + 'delete' => 'Usunięto :email jako podużytkownika', ], + 'crashed' => 'Serwer uległ awarii', ], ]; diff --git a/lang/pl/admin/apikey.php b/lang/pl/admin/apikey.php new file mode 100644 index 0000000000..df5ae4ef3b --- /dev/null +++ b/lang/pl/admin/apikey.php @@ -0,0 +1,27 @@ + 'Klucze API aplikacji', + 'empty' => 'Brak kluczy API', + 'whitelist' => 'Adresy IPv4 z whitelisty', + 'whitelist_help' => 'Klucze API mogą być ograniczone tylko do pracy z określonych adresów IPv4. Wprowadź każdy adres w nowej linii.', + 'whitelist_placeholder' => 'Przykład: 127.0.0.1, 192.168.1.1', + 'description' => 'Opis', + 'description_help' => 'Krótki opis tego, do czego służy ten klucz.', + 'nav_title' => 'Klucze API', + 'model_label' => 'Klucz API aplikacji', + 'model_label_plural' => 'Klucze API aplikacji', + 'table' => [ + 'key' => 'Klucz', + 'description' => 'Opis', + 'last_used' => 'Ostatnio użyty', + 'created' => 'Utworzono', + 'created_by' => 'Utworzone przez', + 'never_used' => 'Nigdy nieużywane', + ], + 'permissions' => [ + 'none' => 'Brak', + 'read' => 'Odczyt', + 'read_write' => 'Odczyt i zapis', + ], +]; diff --git a/lang/pl/admin/dashboard.php b/lang/pl/admin/dashboard.php new file mode 100644 index 0000000000..ba0ac29e2f --- /dev/null +++ b/lang/pl/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Witaj w Pelican!', + 'version' => 'Wersja: :version', + 'advanced' => 'Zaawansowane', + 'server' => 'Serwer', + 'user' => 'Użytkownik', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informacje dla programistów', + 'content' => 'Dziękujemy za wypróbowanie wersji rozwojowej!', + 'extra_note' => 'Jeśli napotkasz jakieś problemy, zgłoś je na GitHubie.', + 'button_issues' => 'Utwórz zgłoszenie', + 'button_features' => 'Omówienie funkcji', + ], + 'intro-update-available' => [ + 'heading' => 'Dostępna aktualizacja', + 'content' => ':latestVersion jest teraz dostępny! Przeczytaj naszą dokumentację, aby zaktualizować swój panel.', + 'button_changelog' => 'Co nowego?', + ], + 'intro-no-update' => [ + 'heading' => 'Twój Panel jest aktualny', + 'content' => 'Używasz Pelican w wersji :version. Twój panel jest aktualny!', + ], + 'intro-first-node' => [ + 'heading' => 'Nie wykryto żadnych węzłów', + 'content' => 'Wygląda na to, że nie masz jeszcze skonfigurowanych żadnych węzłów, ale nie martw się, ponieważ wystarczy, że klikniesz przycisk akcji, aby utworzyć swój pierwszy węzeł!', + 'extra_note' => 'Jeśli napotkasz jakieś problemy, zgłoś je na GitHubie.', + 'button_label' => 'Stwórz pierwszy węzeł w Pelican', + ], + 'intro-support' => [ + 'heading' => 'Wspomóż Pelican', + 'content' => 'Dziękujemy za korzystanie z Pelican, jest to możliwe jedynie dzięki waszemu wsparciu, naszym współtwórcom i pozostałym naszym zwolennikom!', + 'extra_note' => 'Doceniamy wszelkie wsparcie ze strony każdego.', + 'button_translate' => 'Pomóż w tłumaczeniu', + 'button_donate' => 'Darowizna', + ], + 'intro-help' => [ + 'heading' => 'Potrzebujesz pomocy?', + 'content' => 'Najpierw sprawdź dokumentację! Jeśli nadal potrzebujesz pomocy, wejdź na nasz serwer Discord!', + 'button_docs' => 'Przeczytaj dokumentację', + ], + ], +]; diff --git a/lang/pl/admin/databasehost.php b/lang/pl/admin/databasehost.php new file mode 100644 index 0000000000..cb6779a351 --- /dev/null +++ b/lang/pl/admin/databasehost.php @@ -0,0 +1,75 @@ + 'Hosty bazy danych', + 'model_label' => 'Host bazy danych', + 'model_label_plural' => 'Hosty bazy danych', + 'table' => [ + 'database' => 'Baza danych', + 'name' => 'Nazwa', + 'host' => 'Host', + 'port' => 'Port', + 'name_helper' => 'Pozostawienie pustego pola spowoduje automatyczne wygenerowanie losowej nazwy', + 'username' => 'Użytkownik', + 'password' => 'Hasło', + 'remote' => 'Połączenia z', + 'remote_helper' => 'Skąd połączenia powinny być dozwolone. Pozostawienie pustego pola pozwoli na połączenia z dowolnego miejsca.', + 'max_connections' => 'Maksymalna ilość połączeń', + 'created_at' => 'Data utworzenia', + 'connection_string' => 'Połączenie JDBC', + ], + 'error' => 'Błąd połączenia z hostem', + 'host' => 'Host', + 'host_help' => 'Adres IP lub nazwa domeny, które powinny być używane podczas próby połączenia się z tym hostem MySQL z tego Panelu do tworzenia nowych baz danych.', + 'port' => 'Port', + 'port_help' => 'Port używany przez MySQL na tym hoście', + 'max_database' => 'Maksymalna liczba baz danych', + 'max_databases_help' => 'Maksymalna liczba baz danych, które można utworzyć na tym hoście. Jeśli limit zostanie osiągnięty, nie będzie można utworzyć nowych baz danych dla tego hosta. Pozostawienie pustego pola pozwala na nieograniczoną ilość baz danych.', + 'display_name' => 'Wyświetlana nazwa', + 'display_name_help' => 'Krótki identyfikator używany do odróżnienia tej lokalizacji od innych. Musi mieć od 1 do 60 znaków, na przykład nas.nyc.lvl3.', + 'username' => 'Użytkownik', + 'username_help' => 'Nazwa użytkownika konta, które ma wystarczające uprawnienia do tworzenia nowych użytkowników i baz danych w systemie.', + 'password' => 'Hasło', + 'password_help' => 'Hasło dla użytkownika bazy danych.', + 'linked_nodes' => 'Połączone węzły', + 'linked_nodes_help' => 'To ustawienie jest domyślne tylko dla tego hosta bazy danych podczas dodawania bazy danych do serwera na wybranym Node.', + 'connection_error' => 'Błąd połączenia z hostem bazy danych', + 'no_database_hosts' => 'Brak hostów bazy danych', + 'no_nodes' => 'Brak węzłów', + 'delete_help' => 'Host bazy danych posiada bazy danych', + 'unlimited' => 'Bez ograniczeń', + 'anywhere' => 'Gdziekolwiek', + + 'rotate' => 'Zmień', + 'rotate_password' => 'Zaktualizuj hasło', + 'rotated' => 'Hasło zostało zmienione', + 'rotate_error' => 'Zmiana hasła nie powiodła się', + 'databases' => 'Bazy danych', + + 'setup' => [ + 'preparations' => 'Przygotowanie', + 'database_setup' => 'Konfiguracja bazy danych', + 'panel_setup' => 'Ustawienia Panelu', + + 'note' => 'Obecnie obsługiwane są tylko bazy danych MySQL/ MariaDB dla hostów bazy danych!', + 'different_server' => 'Czy panel i baza danych nie są na tym samym serwerze?', + + 'database_user' => 'Użytkownik bazy danych', + 'cli_login' => 'Użyj mysql -u root -p aby uzyskać dostęp do mysql cli.', + 'command_create_user' => 'Polecenie do tworzenia użytkownika', + 'command_assign_permissions' => 'Polecenie do przydzielenia uprawnień', + 'cli_exit' => 'Aby wyjść z mysql cli uruchom exit.', + 'external_access' => 'Dostęp zewnętrzny', + 'allow_external_access' => ' +

Prawdopodobieństwa, że będziesz musiał zezwolić na dostęp zewnętrzny do tej instancji MySQL, aby serwery mogły się z nią połączyć.

+
+

Aby to zrobić, otwórz my. nf, które różnią się w zależności od Twojego systemu operacyjnego i jak zainstalowano MySQL. Możesz znaleźć /etc -iname my.cnf , aby go zlokalizować.

+
+

Otwórz my. nfdodaj tekst poniżej na dole pliku i zapisz:
+ [mysqld]
bind-address=0.0.0.0

+
+

Uruchom ponownie MySQL/ MariaDB aby zastosować te zmiany. To zastąpi domyślną konfigurację MySQL, która domyślnie będzie przyjmować żądania tylko od hosta lokalnego. Aktualizacja tego pozwoli na połączenia we wszystkich interfejsach, a tym samym na połączenia zewnętrzne. Upewnij się, że zezwolisz na port MySQL (domyślnie 3306) w zaporze.

+ + ', + ], +]; diff --git a/lang/pl/admin/egg.php b/lang/pl/admin/egg.php new file mode 100644 index 0000000000..3ede325d88 --- /dev/null +++ b/lang/pl/admin/egg.php @@ -0,0 +1,110 @@ + 'Jajka', + 'model_label' => 'Jajko', + 'model_label_plural' => 'Jajka', + 'tabs' => [ + 'configuration' => 'Konfiguracja', + 'process_management' => 'Zarządzanie procesami', + 'egg_variables' => 'Zmienne Jajka', + 'install_script' => 'Skrypt instalacji', + ], + 'import' => [ + 'file' => 'Plik', + 'url' => 'URL', + 'image_url' => 'URL Obrazu', + 'image_error' => 'Nie udało się pobrać obrazu', + 'image_too_large' => 'Obraz jest za duży. Limit to 1024KB', + 'egg_help' => 'To powinien być plik .json (egg-minecraft.json)', + 'url_help' => 'Adresy URL muszą wskazywać bezpośrednio do pliku .json', + 'add_url' => 'Nowy adres URL', + 'import_failed' => 'Importowanie nie powiodło się', + 'import_success' => 'Zaimportowano pomyślnie', + 'github' => 'Dodaj z GitHub\'a', + 'refresh' => 'Odśwież', + 'import_image' => 'Importuj Obraz', + 'no_local_ip' => 'Lokalne adresy IP nie są dozwolone', + 'unsupported_format' => 'Nieobsługiwany format. Obsługiwane formaty: :formats', + 'invalid_url' => 'Podany adres URL jest nieprawidłowy', + 'image_deleted' => 'Usunięto obraz', + 'no_image' => 'Nie podano obrazu', + 'image_updated' => 'Obraz zaktualizowany', + ], + 'export' => [ + 'modal' => 'Jak chcesz wyeksportować :egg ?', + 'as' => 'Jako .:format', + ], + 'in_use' => 'W użyciu', + 'servers' => 'Serwery', + 'name' => 'Nazwa', + 'egg_uuid' => 'UUID Jajka', + 'egg_id' => 'UUID Jajka', + 'name_help' => 'Prosta, czytelna nazwa do użycia jako identyfikator dla tego Jajka.', + 'author' => 'Autor', + 'uuid_help' => 'To jest globalnie unikalny identyfikator dla tego Jajka, którego Wings używa jako identyfikatora.', + 'author_help' => 'Autor tej wersji Jajka.', + 'author_help_edit' => 'Autor tej wersji Jajka. Wgranie nowej konfiguracji Jajka od innego autora spowoduje zmianę tego pola.', + 'description' => 'Opis', + 'description_help' => 'Opis tego Jajka, które będzie wyświetlane w Panelu w razie potrzeby.', + 'add_startup' => 'Dodaj Komendę Startową', + 'startup_command' => 'Polecenie', + 'startup_commands' => 'Komendy Startowe', + 'startup_name' => 'Wyświetlana nazwa', + 'startup_help' => 'Komendy Startowe są dostępne dla serwerów używających tego Egg\'a. Pierwszy jest domyślny.', + 'file_denylist' => 'Lista odrzuconych plików', + 'file_denylist_help' => 'Lista plików, których użytkownik końcowy nie może edytować.', + 'features' => 'Funkcje', + 'force_ip' => 'Wymuś wychodzący adres IP', + 'force_ip_help' => 'Wymusza, aby cały wychodzący ruch sieciowy miał źródłowy adres IP NATowany na adres IP podstawowej alokacji IP serwera. +Wymagane do prawidłowego działania niektórych gier, gdy węzeł ma wiele publicznych adresów IP. +Włączenie tej opcji spowoduje wyłączenie wewnętrznej sieci dla wszystkich serwerów korzystających z tego Jajka, powodując, że nie będą one w stanie uzyskać wewnętrznego dostępu do innych serwerów w tym samym węźle.', + 'tags' => 'Tagi', + 'update_url' => 'Adres URL aktualizacji', + 'update_url_help' => 'Adresy URL muszą wskazywać bezpośrednio do pliku .json', + 'add_image' => 'Dodaj obraz Dockera', + 'docker_images' => 'Obrazy Dockera', + 'docker_name' => 'Nazwa obrazu', + 'docker_uri' => 'Adres URL obrazu', + 'docker_help' => 'Zdjęcia dockera dostępne dla serwerów używających tego Egg\'a. Pierwszy jest domyślny.', + + 'stop_command' => 'Komenda stop', + 'stop_command_help' => 'Polecenie, które powinno zostać wysłane na procesy serwera, aby je zatrzymać. Jeśli chcesz wysłać SIGINT powinieneś wprowadzić tutaj ^ C.', + 'copy_from' => 'Kopiuj ustawienia z', + 'copy_from_help' => 'Jeśli chcesz domyślnie wybrać ustawienia z innego Jajka, wybierz je z menu powyżej.', + 'none' => 'Brak', + 'start_config' => 'Konfiguracja startowa', + 'start_config_help' => 'Lista wartości, których daemon powinien szukać podczas uruchamiania serwera w celu określenia ukończenia.', + 'config_files' => 'Pliki konfiguracyjne', + 'config_files_help' => 'To powinno być reprezentacja JSON plików konfiguracyjnych do zmodyfikowania i jakie części powinny zostać zmienione.', + 'log_config' => 'Konfiguracja dziennika', + 'log_config_help' => 'To powinna być reprezentacja JSON gdzie przechowywane są pliki dziennika i czy daemon powinien tworzyć niestandardowe logi czy nie.', + + 'environment_variable' => 'Zmienna środowiskowa', + 'default_value' => 'Wartość domyślna', + 'user_permissions' => 'Uprawnienia użytkownika', + 'viewable' => 'Widoczny', + 'editable' => 'Edytowalne', + 'rules' => 'Zasady', + 'add_new_variable' => 'Dodaj nową zmienną', + + 'error_unique' => 'Zmienna o tej nazwie już istnieje.', + 'error_required' => 'Wymagane jest pole zmiennej środowiskowej.', + 'error_reserved' => 'Ta zmienna środowiskowa jest zarezerwowana i nie może być użyta.', + + 'script_from' => 'Skrypt z', + 'script_container' => 'Kontener skryptu', + 'script_entry' => 'Wpis skryptu', + 'script_install' => 'Skrypt instalacji', + 'no_eggs' => 'Brak Jajek', + 'no_servers' => 'Brak serwerów!', + 'no_servers_help' => 'Do tego Jajka nie przypisano żadnych serwerów.', + + 'update' => 'Aktualizuj | Zaktualizuj wybrane', + 'updated' => 'Jajko zostało zaktualizowane | Zaktualizowano :count z :total jajek', + 'updated_failed' => ':count nie powiodło się', + 'updated_skipped' => ':count pominięto', + 'update_question' => 'Czy na pewno chcesz zaktualizować to jajko?|Czy na pewno chcesz zaktualizować wybrane jajka?', + 'update_description' => 'Jeśli wprowadziłeś jakiekolwiek zmiany w jajku, zostaną one nadpisane!|Jeśli wprowadziłeś jakiekolwiek zmiany w jajku, zostaną one nadpisane!', + 'no_updates' => 'Brak dostępnych aktualizacji dla wybranych jajek', +]; diff --git a/lang/pl/admin/eggs.php b/lang/pl/admin/eggs.php deleted file mode 100644 index f9bf363d73..0000000000 --- a/lang/pl/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Pomyślnie zaimportowano to jądro i związane z nim zmienne.', - 'updated_via_import' => 'To jądro zostało zaktualizowane przy użyciu dostarczonego pliku.', - 'deleted' => 'Pomyślnie usunięto żądane jądro z Panelu.', - 'updated' => 'Konfiguracja jądra została pomyślnie zaktualizowana.', - 'script_updated' => 'Skrypt instalacyjny jądra został zaktualizowany i zostanie uruchomiony za każdym razem, gdy serwery zostaną zainstalowane.', - 'egg_created' => 'Nowe jądro zostało dodane. Musisz zrestartować wszystkie uruchomione Daemon\'y, aby zastosować nowe jądro.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Zmienna ":variable" została usunięta i nie będzie już dostępna dla serwerów po przebudowie.', - 'variable_updated' => 'Zmienna ":variable" została zaktualizowana. Musisz przebudować serwery za pomocą tej zmiennej, aby zastosować zmiany.', - 'variable_created' => 'Nowa zmienna została pomyślnie stworzona i przypisana do tego jądra.', - ], - ], -]; diff --git a/lang/pl/admin/health.php b/lang/pl/admin/health.php new file mode 100644 index 0000000000..90a6c7864e --- /dev/null +++ b/lang/pl/admin/health.php @@ -0,0 +1,60 @@ + 'Kondycja', + 'results_refreshed' => 'Wyniki oceny kondycji zaktualizowane', + 'checked' => 'Wyniki sprawdzone od :time', + 'refresh' => 'Odśwież', + 'results' => [ + 'cache' => [ + 'label' => 'Pamięć podręczna', + 'ok' => 'OK', + 'failed_retrieve' => 'Nie można ustawić lub pobrać wartości pamięci podręcznej aplikacji.', + 'failed' => 'Wystąpił błąd z pamięcią podręczną aplikacji: :error', + ], + 'database' => [ + 'label' => 'Baza danych', + 'ok' => 'OK', + 'failed' => 'Nie można połączyć się z bazą danych: :error', + ], + 'debugmode' => [ + 'label' => 'Tryb debugowania', + 'ok' => 'Tryb debugowania jest wyłączony', + 'failed' => 'Tryb debugowania powinien być :expected ale jest :actual', + ], + 'environment' => [ + 'label' => 'Środowisko', + 'ok' => 'Ok, ustawiony na :actual', + 'failed' => 'Środowisko jest ustawione na :actual , oczekiwano :expected', + ], + 'nodeversions' => [ + 'label' => 'Wersje węzłów', + 'ok' => 'Węzły są aktualne', + 'failed' => ':outdated/:all węzły są nieaktualne', + 'no_nodes_created' => 'Brak utworzonych węzłów', + 'no_nodes' => 'Brak węzłów', + 'all_up_to_date' => 'Wszystko aktualne', + 'outdated' => ':outdated/:all nieaktualne', + ], + 'panelversion' => [ + 'label' => 'Wersja panelu', + 'ok' => 'Panel jest aktualny', + 'failed' => 'Zainstalowana wersja to :currentVersion ale najnowsza to :latestVersion', + 'up_to_date' => 'Aktualne', + 'outdated' => 'Nieaktualne', + ], + 'schedule' => [ + 'label' => 'Harmonogram', + 'ok' => 'OK', + 'failed_last_ran' => 'Ostatnie uruchomienie harmonogramu było więcej niż :time minut temu', + 'failed_not_ran' => 'Harmonogram nie został jeszcze uruchomiony.', + ], + 'useddiskspace' => [ + 'label' => 'Miejsce na dysku', + ], + ], + 'checks' => [ + 'successful' => 'Sukces', + 'failed' => 'Niepowodzenie', + ], +]; diff --git a/lang/pl/admin/log.php b/lang/pl/admin/log.php new file mode 100644 index 0000000000..ceb232d435 --- /dev/null +++ b/lang/pl/admin/log.php @@ -0,0 +1,26 @@ + 'Hura! Brak błędów!', + 'total_logs' => 'Całkowita liczba logów', + 'error' => 'Błąd', + 'warning' => 'Uwaga', + 'notice' => 'Powiadomienie', + 'info' => 'Info', + 'debug' => 'Debugowanie', + 'navigation' => [ + 'panel_logs' => 'Logi Panelu', + ], + 'actions' => [ + 'upload_logs' => 'Przesłać Logi?', + 'upload_logs_description' => 'Spowoduje to przesłanie pliku :file do :url Czy na pewno chcesz to zrobić?', + 'view_logs' => 'Zobacz Logi', + 'log_not_found' => 'Nie znaleziono logów!', + 'log_not_found_description' => 'Nie można odnaleźć logu dla :filename', + 'failed_to_upload' => 'Przesyłanie nie powiodło się', + 'failed_to_upload_description' => 'Status HTTP: :status', + 'log_upload' => 'Przesłano Logi!', + 'log_upload_action' => 'Zobacz Logi', + 'upload_tooltip' => 'Prześlij do :url', + ], +]; diff --git a/lang/pl/admin/mount.php b/lang/pl/admin/mount.php new file mode 100644 index 0000000000..99d6cad1da --- /dev/null +++ b/lang/pl/admin/mount.php @@ -0,0 +1,30 @@ + 'Punkty montowania', + 'model_label' => 'Punkt montowania', + 'model_label_plural' => 'Punkty montowania', + 'name' => 'Nazwa', + 'name_help' => 'Unikalna nazwa używana do oddzielenia tego punktu montowania od innego.', + 'source' => 'Źródło', + 'source_help' => 'Ścieżka pliku w systemie hostów do punktu zamontowania kontenera.', + 'target' => 'Cel', + 'target_help' => 'Gdzie punkt zamontowania będzie dostępny wewnątrz kontenera.', + 'read_only' => 'Tylko do odczytu?', + 'read_only_help' => 'Czy punkt zamontowania jest odczytywany tylko wewnątrz kontenera?', + 'description' => 'Opis', + 'description_help' => 'Dłuższy opis dla tego punktu montowania', + 'no_mounts' => 'Brak punktów montowania', + 'eggs' => 'Jajka', + 'nodes' => 'Węzły', + 'toggles' => [ + 'writable' => 'Zapisywalne', + 'read_only' => 'Tylko do odczytu', + ], + 'table' => [ + 'name' => 'Nazwa', + 'all_eggs' => 'Wszystkie Jajka', + 'all_nodes' => 'Wszystkie Węzły', + 'read_only' => 'Tylko do odczytu', + ], +]; diff --git a/lang/pl/admin/node.php b/lang/pl/admin/node.php index 7023a8852b..3a6e3f1eba 100644 --- a/lang/pl/admin/node.php +++ b/lang/pl/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'Podany adres FQDN lub IP nie jest poprawnym adresem IP.', - 'fqdn_required_for_ssl' => 'Aby używać SSL dla tego węzła, wymagana jest pełna nazwa domeny, która nawiązuje do publicznego adresu IP.', + 'nav_title' => 'Węzły', + 'model_label' => 'Węzeł', + 'model_label_plural' => 'Węzły', + 'create' => 'Utwórz węzeł', + 'tabs' => [ + 'overview' => 'Przegląd', + 'basic_settings' => 'Podstawowe ustawienia', + 'advanced_settings' => 'Zaawansowane ustawienia', + 'config_file' => 'Plik konfiguracyjny', + 'diagnostics' => 'Diagnostyka', ], - 'notices' => [ - 'allocations_added' => 'Pomyślnie dodano alokacje do tego węzła.', - 'node_deleted' => 'Pomyślnie usunięto węzeł z panelu.', - 'node_created' => 'Pomyślnie utworzono nowy węzeł. Możesz automatycznie skonfigurować demona na tej maszynie, odwiedzając zakładkę \'Konfiguracja\'. Przed dodaniem serwerów musisz najpierw przydzielić co najmniej jeden adres IP i port.', - 'node_updated' => 'Informacje o węźle zostały zaktualizowane. Jeśli jakiekolwiek ustawienia demona zostały zmienione, konieczne będzie jego ponowne uruchomienie, aby te zmiany zaczęły obowiązywać', - 'unallocated_deleted' => 'Usunięto wszystkie nieprzydzielone porty dla :ip', + 'table' => [ + 'health' => 'Kondycja', + 'name' => 'Nazwa', + 'address' => 'Adres', + 'public' => 'Publiczny', + 'servers' => 'Serwery', + 'alias' => 'Alias', + 'ip' => 'Adres IP', + 'egg' => 'Jajko', + 'owner' => 'Właściciel', + 'allocation_notes' => 'Notatki', + 'no_notes' => 'Brak notatek', ], + 'node_info' => 'Informacje o węźle', + 'wings_version' => 'Wersja Wings', + 'cpu_threads' => 'Wątki procesora', + 'architecture' => 'Architektura', + 'kernel' => 'Kernel', + 'unknown' => 'Nieznany', + 'latest' => 'Najnowszy', + 'node_uuid' => 'UUID węzła', + 'node_id' => 'ID węzła', + + 'ip_address' => 'Adres IP', + 'ip_help' => 'Zwykle publiczny adres IP urządzenia, chyba że przekierowywujesz port.', + 'alias_help' => 'Opcjonalna nazwa, która pomoże Ci zapamiętać co to jest.', + 'refresh' => 'Odśwież', + 'domain' => 'Nazwa domeny', + 'ssl_ip' => 'Nie możesz połączyć się z adresem IP poprzez SSL', + 'error' => 'To jest nazwa domeny, która wskazuje na adres IP Twojego węzła. Jeśli już to skonfigurowałeś, możesz go zweryfikować zaznaczając następne pole!', + 'fqdn_help' => 'Twój panel jest obecnie zabezpieczony za pomocą certyfikatu SSL, co oznacza, że węzły również wymagają niego. Musisz użyć nazwy domeny, ponieważ nie możesz uzyskać certyfikatów SSL dla adresów IP.', + 'dns' => 'Sprawdzanie rekordu DNS', + 'dns_help' => 'To pozwala Ci wiedzieć, czy rekord DNS wskazuje na poprawny adres IP.', + 'valid' => 'Prawidłowy', + 'invalid' => 'Nieprawidłowy', + 'port' => 'Port', + 'ports' => 'Porty', + 'port_help' => 'Jeśli używasz daemona za Cloudflare powinieneś ustawić port daemona na 8443, aby umożliwić proxy websocket przez SSL.', + 'connect_port' => 'Port Połączenia', + 'connect_port_help' => 'Połączenia z Wings będą używać tego portu. Jeśli używasz reverse proxy, to może się różnić od portu nasłuchiwania. Podczas używania proxy z Cloudflare należy stosować 8443.', + 'listen_port' => 'Port Nasłuchujący', + 'listen_port_help' => 'Wings będzie nasłuchiwał tego portu.', + 'display_name' => 'Wyświetlana nazwa', + 'ssl' => 'Komunikacja przez SSL', + 'panel_on_ssl' => 'Twój panel używa bezpiecznego połączenia SSL,
, więc Twój daemon również musi również go mieć.', + 'ssl_help' => 'Adres IP nie może korzystać z SSL.', + + 'tags' => 'Tagi', + 'upload_limit' => 'Limit przesyłania', + 'upload_limit_help' => 'Wprowadź maksymalny rozmiar plików, które można przesłać za pośrednictwem internetowego menedżera plików.', + 'sftp_port' => 'Port SFTP', + 'sftp_alias' => 'Alias SFTP', + 'sftp_alias_help' => 'Wyświetl alias dla adresu SFTP. Pozostaw puste, aby użyć węzła FQDN.', + 'use_for_deploy' => 'Używać do wdrożeń?', + 'maintenance_mode' => 'Tryb konserwacji', + 'maintenance_mode_help' => 'Jeśli węzeł jest oznaczony jako \'W konserwacji\' użytkownicy nie będą mogli uzyskać dostępu do serwerów na tym węźle', + + 'cpu' => 'Procesor', + 'cpu_limit' => 'Limit procesora', + 'memory' => 'Pamięć', + 'memory_limit' => 'Limit pamięci', + 'disk' => 'Dysk', + 'disk_limit' => 'Limit dysku', + 'unlimited' => 'Nieograniczone', + 'limited' => 'Ograniczone', + 'overallocate' => 'Nadmiarowa alokacja', + 'enabled' => 'Włączony', + 'disabled' => 'Wyłączony', + 'yes' => 'Tak', + 'no' => 'Nie', + + 'instructions' => 'Instrukcje', + 'instructions_help' => 'Zapisz ten plik w katalogu głównym swojego demona, nazwany config.yml.', + + 'auto_deploy' => 'Polecenie automatycznego wdrożenia', + 'auto_question' => 'Wybierz pomiędzy instalacją Standalone a instalacją Docker.', + 'auto_label' => 'Typ', + 'standalone' => 'Samodzielny', + 'docker' => 'Docker', + 'auto_command' => 'Aby automatycznie skonfigurować swój węzeł, uruchom poniższe polecenie:', + 'reset_token' => 'Zresetuj token autoryzacyjny', + 'token_reset' => 'Token demona został zresetowany.', + 'reset_help' => 'Zresetowanie tokena demona spowoduje unieważnienie wszelkich żądań pochodzących ze starego tokena. Ten token jest używany do wszystkich wrażliwych operacji na demonie, w tym tworzenia i usuwania serwerów. Zalecamy regularną zmianę tego tokena w celu zwiększenia bezpieczeństwa.', + + 'no_nodes' => 'Brak węzłów', + 'none' => 'Brak', + 'cpu_chart' => 'CPU - :cpu% z :max%', + 'memory_chart' => 'Pamięć - :used z :total', + 'disk_chart' => 'Pamięć - :used z :total', + 'used' => 'Używane', + 'unused' => 'Nieużywane', + + 'next_step' => 'Następny Krok', + 'node_has_servers' => 'Węzeł ma serwery', + 'create_allocation' => 'Utwórz alokację', + 'primary_allocation' => 'Podstawowa alokacja', + 'databases' => 'Bazy danych', + 'backups' => 'Kopie zapasowe', + + 'error_connecting' => 'Błąd połączenia z węzłem :node', + 'error_connecting_description' => 'Konfiguracja nie mogła zostać automatycznie zaktualizowana na Wings. Będziesz musiał ręcznie zaktualizować plik konfiguracyjny.', + 'allocation' => 'Alokacja', + + 'diagnostics' => [ + 'header' => 'Diagnostyka Node', + 'include_endpoints' => 'Uwzględnij Endpoint\'y', + 'include_endpoints_hint' => 'Uwzględnienie endpoint\'ów pokaże adresy URL panelu w logach i NIE zaciemni ich.', + 'include_logs' => 'Dołącz logi', + 'include_logs_hint' => 'Uwzględnienie logów pokaże ostatnie logi i pomoże wyśledzić możliwe problemy.', + 'run_diagnostics' => 'Uruchom Diagnostykę', + 'upload_to_pelican' => 'Prześlij Logi', + 'logs_pulled' => 'Pobrano Logi!', + 'logs_uploaded' => 'Przesłano Logi', + 'upload_failed' => 'Przesyłanie logów nie powiodło się', + 'view_logs' => 'Pokaż Logi', + 'pull' => 'Pobierz', + 'upload' => 'Prześlij', + 'clear' => 'Wyczyść', + '404' => 'Żądany raport diagnostyczny nie został znaleziony. Upewnij się, że Wings są aktualne i spróbuj ponownie.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Problem z Cloudflare', + 'body' => 'Twój węzeł nie jest dostępny dla Cloudflare.', + ], + + 'bulk_update_ip' => 'Aktualizuj adresy IP', + 'bulk_update_ip_description' => 'Zastąp stary adres IP nowym adresem dla alokacji. Jest to użyteczne, gdy zmienia się adres IP Node', + 'update_ip' => 'Zaktualizuj adres IP', + 'old_ip' => 'Stary adres IP', + 'new_ip' => 'Nowy adres IP', + 'no_allocations_to_update' => 'Nie znaleziono alokacji z wybranym starym adresem IP', + 'ip_updated' => 'Pomyślnie zaktualizowano :count z :total alokacji', + 'ip_update_failed' => ':count alokacji nie udało się zaktualizować', ]; diff --git a/lang/pl/admin/plugin.php b/lang/pl/admin/plugin.php new file mode 100644 index 0000000000..a434af9256 --- /dev/null +++ b/lang/pl/admin/plugin.php @@ -0,0 +1,61 @@ + 'Wtyczki', + 'model_label' => 'Wtyczka', + 'model_label_plural' => 'Wtyczki', + + 'name' => 'Nazwa', + 'update_available' => 'Dostępna jest aktualizacja dla tej wtyczki', + 'author' => 'Autor', + 'version' => 'Wersja', + 'category' => 'Kategoria', + 'status' => 'Status', + 'visit_website' => 'Odwiedzić stronę internetową', + 'settings' => 'Ustawienia', + 'install' => 'Zainstaluj', + 'uninstall' => 'Odinstaluj', + 'update' => 'Aktualizuj', + 'enable' => 'Włącz', + 'disable' => 'Wyłącz', + 'import_from_file' => 'Importuj z pliku', + 'import_from_url' => 'Importuj z URL', + 'no_plugins' => 'Brak wtyczek', + 'all' => 'Wszystko', + 'change_load_order' => 'Zmień kolejność ładowania', + 'apply_load_order' => 'Zastosuj kolejność ładowania', + + 'enable_theme_modal' => [ + 'heading' => 'Motyw jest już włączony', + 'description' => 'Masz już włączony motyw. Włączenie wielu motywów może powodować błędy wizualne. Czy chcesz kontynuować?', + ], + + 'status_enum' => [ + 'not_installed' => 'Niezainstalowane', + 'disabled' => 'Wyłączone', + 'enabled' => 'Włączone', + 'errored' => 'Błąd', + 'incompatible' => 'Niekompatybilny', + ], + + 'category_enum' => [ + 'plugin' => 'Wtyczka', + 'theme' => 'Motyw', + 'language' => 'Pakiet językowy', + ], + + 'notifications' => [ + 'installed' => 'Wtyczka zainstalowana', + 'install_error' => 'Nie można zainstalować wtyczki', + 'uninstalled' => 'Wtyczka odinstalowana', + 'uninstall_error' => 'Nie można odinstalować wtyczki', + 'deleted' => 'Wtyczka usunięta', + 'updated' => 'Wtyczka zaktualizowana', + 'update_error' => 'Nie można zaktualizować wtyczki', + 'enabled' => 'Wtyczka została włączona', + 'disabled' => 'Wtyczka została wyłączona', + 'imported' => 'Wtyczka zaimportowana', + 'import_exists' => 'Wtyczka o tym id już istnieje', + 'import_failed' => 'Nie można zaimportować wtyczki', + ], +]; diff --git a/lang/pl/admin/role.php b/lang/pl/admin/role.php new file mode 100644 index 0000000000..8dc36bcadf --- /dev/null +++ b/lang/pl/admin/role.php @@ -0,0 +1,17 @@ + 'Role', + 'model_label' => 'Rola', + 'model_label_plural' => 'Role', + 'no_roles' => 'Brak ról', + 'name' => 'Nazwa roli', + 'permissions' => 'Uprawnienia', + 'in_use' => 'W użyciu', + 'all' => 'Wszystkie', + 'root_admin' => ':role ma wszystkie uprawnienia.', + 'root_admin_delete' => 'Nie można usunąć głównego administratora', + 'users' => 'Użytkownicy', + 'nodes' => 'Węzły', + 'nodes_hint' => 'Pozostaw puste, aby zezwolić na dostęp do wszystkich węzłów.', +]; diff --git a/lang/pl/admin/server.php b/lang/pl/admin/server.php index ed7129c92d..f102369c3f 100644 --- a/lang/pl/admin/server.php +++ b/lang/pl/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Chcesz usunąć domyślną alokację dla tego serwera, ale nie ma alternatywnej alokacji do wykorzystania.', - 'marked_as_failed' => 'Ten serwer został zidentyfikowany jako mający nieudaną wcześniejszą instalację. Nie można zmienić jego aktualnego statusu w tej sytuacji.', - 'bad_variable' => 'Wystąpił błąd walidacji zmiennych :name', - 'daemon_exception' => 'Wystąpił błąd podczas próby komunikacji z demonem, co spowodowało kod odpowiedzi HTTP/:code. Ten błąd został zarejestrowany. (ID żądania: :request_id)', - 'default_allocation_not_found' => 'Nie znaleziono żądanej domyślnej alokacji w alokacjach tego serwera.', + 'nav_title' => 'Serwery', + 'model_label' => 'Serwer', + 'model_label_plural' => 'Serwery', + 'no_servers' => 'Brak serwerów', + 'create' => 'Utwórz serwer', + 'next_step' => 'Następny Krok', + 'ip_address' => 'Adres IP', + 'ip_address_helper' => 'Zwykle publiczny adres IP urządzenia, chyba że przekierowywujesz port.', + 'port' => 'Port', + 'ports' => 'Porty', + 'alias' => 'Alias', + 'alias_helper' => 'Opcjonalna nazwa, która pomoże Ci zapamiętać co to jest.', + 'locked' => 'Zablokowany?', + 'locked_helper' => 'Użytkownicy nie będą mogli usuwać zablokowanych alokacji', + 'lock' => 'Zablokuj', + 'unlock' => 'Odblokuj', + 'name' => 'Nazwa', + 'external_id' => 'Zewnętrzne ID', + 'owner' => 'Właściciel', + 'description' => 'Opis', + 'install_script' => 'Uruchomić skrypt instalacyjny?', + 'start_after' => 'Uruchomić po zainstalowaniu?', + 'yes' => 'Tak', + 'no' => 'Nie', + 'skip' => 'Pomiń', + 'primary' => 'Podstawowy', + 'already_primary' => 'Jest już głównym', + 'make_primary' => 'Ustaw jako główny', + 'startup_cmd' => 'Komenda startowa', + 'startup_name' => 'Nazwa Komendy Startowej', + 'default_startup' => 'Domyślna komenda startowa', + 'startup_placeholder' => 'Wprowadź niestandardową komendę startową', + 'variables' => 'Zmienne', + 'resource_limits' => 'Limity zasobów', + 'cpu' => 'Procesor', + 'cpu_limit' => 'Limit procesora', + 'cpu_helper' => '100% równa się jednemu rdzeniu procesora.', + 'unlimited' => 'Nieograniczone', + 'limited' => 'Ograniczone', + 'enabled' => 'Włączony', + 'disabled' => 'Wyłączony', + 'memory' => 'Pamięć', + 'memory_limit' => 'Limit pamięci', + 'memory_helper' => 'Wings doda trochę dodatkowej pamięci do tej wartości podczas tworzenia kontenera, aby upewnić się, że nie dojdzie do wyczerpania pamięci przy używaniu maksymalnej ilości pamięci.', + 'disk' => 'Miejsce na dysku', + 'disk_limit' => 'Limit przestrzeni dyskowej', + 'advanced_limits' => 'Zaawansowane limity', + 'cpu_pin' => 'Przypisywanie rdzeni CPU', + 'threads' => 'Przypięte wątki', + 'pin_help' => 'Dodaj przypięty wątek, np. 0 lub 2-4', + 'swap' => 'Pamięć Swap', + 'swap_limit' => 'Limit pamięci Swap', + 'oom' => 'OOM Killer', + 'feature_limits' => 'Limity funkcji', + 'docker_settings' => 'Ustawienia Dockera', + 'docker_image' => 'Obraz dockera', + 'image_name' => 'Nazwa obrazu', + 'primary_allocation' => 'Podstawowa alokacja', + 'image' => 'Obraz', + 'image_placeholder' => 'Wprowadź niestandardowy obraz', + 'container_labels' => 'Etykiety kontenerów', + 'title' => 'Tytuł', + 'actions' => 'Działania', + 'console' => 'Konsola', + 'suspend' => 'Zawieś', + 'unsuspend' => 'Odwieś', + 'reinstall' => 'Zainstaluj ponownie', + 'reinstall_help' => 'Spowoduje to ponowną instalację serwera z przypisanym skryptem instalacyjnym jaja.', + 'reinstall_modal_heading' => 'Czy na pewno chcesz przeinstalować serwer?', + 'reinstall_modal_description' => '!! Może to spowodować nieodwracalną utratę danych !!!', + 'server_status' => 'Status serwera', + 'view_install_log' => 'Zobacz dziennik instalacji', + 'uuid' => 'UUID', + 'node' => 'Węzeł', + 'short_uuid' => 'Krótki UUID', + 'toggle_install' => 'Przełącz status instalacji', + 'toggle_install_help' => 'Jeśli chcesz zmienić status instalacji z „niezainstalowany” na „zainstalowany” lub odwrotnie, możesz to zrobić za pomocą tego przycisku.', + 'toggle_install_failed_header' => 'Serwer jest w stanie niepowodzenia', + 'toggle_install_failed_desc' => 'Czy chcesz przeinstalować serwer, aby to naprawić?', + 'transfer' => 'Przeniesienie', + 'transfer_help' => 'Przenieś ten serwer na inny węzeł połączony z tym panelem.
Uwaga! Ta funkcja jest wciąż eksperymentalna. Zastanów się nad ręcznym wykonaniem kopii zapasowej, aby uniknąć utraty danych!', + 'condition' => 'Warunek', + 'suspend_all' => 'Zawieś wszystkie serwery', + 'unsuspend_all' => 'Cofnij zawieszenie wszystkich serwerów', + 'select_allocation' => 'Wybierz alokację', + 'new_allocation' => 'Utwórz nowe alokacje', + 'additional_allocations' => 'Dodatkowe alokacje', + 'select_additional' => 'Wybierz dodatkowe alokacje', + 'no_variables' => 'Wybrane jajko nie ma zmiennych!', + 'select_egg' => 'Najpierw wybierz jajo, aby wyświetlić jego zmienne!', + 'allocations' => 'Alokacje', + 'databases' => 'Bazy danych', + 'no_databases' => 'Brak baz danych dla tego serwera', + 'delete_db' => 'Czy jesteś pewny że chcesz to usunąć?', + 'delete_db_heading' => 'Usuń Bazę Danych', + 'backups' => 'Kopie zapasowe', + 'egg' => 'Jajko', + 'mounts' => 'Punkty montowania', + 'no_mounts' => 'Brak punktów montowania dla tego węzła.', + 'create_database' => 'Utwórz bazę danych', + 'no_db_hosts' => 'Brak hostów bazy danych', + 'failed_to_create' => 'Nie udało się utworzyć bazy danych', + 'change_egg' => 'Zmień Jajko', + 'new_egg' => 'Nowe Jajko', + 'keep_old_variables' => 'Jeśli to możliwe, zachować stare zmienne?', + 'create_allocation' => 'Utwórz alokację', + 'add_allocation' => 'Dodaj alokację', + 'view' => 'Wyświetl', + 'no_log' => 'Brak dostępnych dzienników', + 'tabs' => [ + 'information' => 'Informacje', + 'egg_configuration' => 'Konfiguracja Jajka', + 'environment_configuration' => 'Konfiguracja środowiska', ], - 'alerts' => [ - 'startup_changed' => 'Zaktualizowano konfigurację startową tego serwera. Jeśli nastąpiła zmiana jajka dla tego serwera, zostanie przeprowadzona ponowna instalacja w tym momencie.', - 'server_deleted' => 'Serwer został pomyślnie usunięty z systemu.', - 'server_created' => 'Serwer został pomyślnie utworzony w panelu. Proszę poczekać kilka minut, aby demon zakończył instalację tego serwera.', - 'build_updated' => 'Zaktualizowano szczegóły konfiguracji dla tego serwera. Pewne zmiany mogą wymagać ponownego uruchomienia, aby zacząć obowiązywać.', - 'suspension_toggled' => 'Status zawieszenia serwera został zmieniony na :status', - 'rebuild_on_boot' => 'Ten serwer został oznaczony jako wymagający ponownej budowy kontenera Docker. Zostanie to wykonane przy następnym uruchomieniu serwera.', - 'install_toggled' => 'Status instalacji dla tego serwera został zmieniony.', - 'server_reinstalled' => 'Ten serwer został umieszczony w kolejce do ponownej instalacji, która rozpoczyna się w tym momencie.', - 'details_updated' => 'Szczegóły serwera zostały pomyślnie zaktualizowane.', - 'docker_image_updated' => 'Pomyślnie zmieniono domyślny obraz Docker do użycia dla tego serwera. Konieczne jest ponowne uruchomienie, aby zastosować tę zmianę.', - 'node_required' => 'Musisz mieć skonfigurowany co najmniej jeden węzeł, zanim będziesz mógł dodać serwer do tego panelu.', - 'transfer_nodes_required' => 'Musisz mieć skonfigurowanych co najmniej dwa węzły, zanim będziesz mógł przenosić serwery.', - 'transfer_started' => 'Rozpoczęto transfer serwera.', - 'transfer_not_viable' => 'Wybrany węzeł nie ma wystarczającej ilości dostępnej przestrzeni dyskowej ani pamięci, aby pomieścić ten serwer.', + 'notifications' => [ + 'server_suspension' => 'Zawieszenie serwera', + 'server_suspended' => 'Serwer został zawieszony', + 'server_already_suspended' => 'Serwer został już zawieszony!', + 'server_suspend_help' => 'Spowoduje to zawieszenie serwera, zatrzymanie wszystkich uruchomionych procesów, i natychmiast blokuje użytkownikowi dostęp do swoich plików lub zarządzanie serwerem w inny sposób za pośrednictwem panelu lub API.', + 'server_unsuspend_help' => 'Spowoduje to odwieszenie serwera i przywrócenie normalnego dostępu użytkownikom.', + 'server_unsuspended' => 'Serwer został odwieszony.', + 'error_server_delete' => 'Serwer nie mógł zostać bezpiecznie usunięty.', + 'error_server_delete_body' => 'Możesz wymusić jego usunięcie.', + 'create_failed' => 'Nie można utworzyć serwera', + 'invalid_port_range' => 'Nieprawidłowy zakres portu', + 'invalid_port_range_body' => 'Zakres portów nie jest prawidłową liczbą całkowitą: :port', + 'too_many_ports' => 'Zbyt wiele portów jednocześnie!', + 'too_many_ports_body' => 'Obecny limit wynosi :limit liczby portów jednocześnie.', + 'invalid_port' => 'Port nie jest w prawidłowym zakresie', + 'invalid_port_body' => ':i nie mieści się w dozwolonym zakresie portów między :portFloor a :portCeil.', + 'already_exists' => 'Port jest już używany', + 'already_exists_body' => ':i jest już przypisany do alokacji.', + 'error_connecting' => 'Błąd połączenia z węzłem :node', + 'error_connecting_description' => 'Konfiguracja nie mogła zostać automatycznie zsynchronizowana na Wings, konieczny będzie ręczny restart serwera.', + 'install_toggled' => 'Status instalacji zmieniony', + 'install_toggle_failed' => 'Nie można zmienić statusu instalacji', + 'reinstall_started' => 'Rozpoczęto reinstalację', + 'reinstall_failed' => 'Nie można uruchomić reinstalacji', + 'log_failed' => 'Nie udało się nawiązać połączenia z Wings, aby pobrać dziennik instalacji serwera.', + 'transfer_started' => 'Transfer rozpoczęty', + 'transfer_failed' => 'Transfer nie powiódł się', + 'already_transfering' => 'Serwer jest obecnie przenoszony.', ], + 'notes' => 'Notatki', + 'no_notes' => 'Brak Notatek', + 'none' => 'Brak', ]; diff --git a/lang/pl/admin/setting.php b/lang/pl/admin/setting.php new file mode 100644 index 0000000000..535f479d07 --- /dev/null +++ b/lang/pl/admin/setting.php @@ -0,0 +1,157 @@ + 'Ustawienia', + 'save_success' => 'Ustawienia zostały zapisane', + 'save_failed' => 'Nie udało się zapisać ustawień', + 'navigation' => [ + 'general' => 'Ogólne', + 'captcha' => 'Captcha', + 'mail' => 'Mail', + 'backup' => 'Kopia zapasowa', + 'oauth' => 'OAuth', + 'misc' => 'Różne', + ], + 'general' => [ + 'app_name' => 'Nazwa aplikacji', + 'app_logo' => 'Logo aplikacji', + 'app_logo_help' => 'Logo powinno być umieszczone w folderze publicznym znajdującym się w katalogu głównym panelu. Pozostaw puste, aby zamiast tego użyć nazwy aplikacji.', + 'app_favicon' => 'Favicon aplikacji', + 'app_favicon_help' => 'Favicon powinien być umieszczony w folderze publicznym, znajdującym się w katalogu głównym.', + 'debug_mode' => 'Tryb debugowania', + 'navigation' => 'Nawigacja', + 'default_navigation' => 'Domyślny typ nawigacji', + 'sidebar' => 'Pasek boczny', + 'topbar' => 'Pasek górny', + 'mixed' => 'Zmieszane', + 'unit_prefix' => 'Prefiks jednostki', + 'decimal_prefix' => 'Prefiks dziesiętny (MB/GB)', + 'binary_prefix' => 'Prefiks binarny (MiB/GiB)', + '2fa_requirement' => 'Wymóg 2FA', + 'not_required' => 'Niewymagane', + 'admins_only' => 'Wymagane tylko dla administratorów', + 'all_users' => 'Wymagane dla wszystkich użytkowników', + 'trusted_proxies' => 'Zaufane proxy', + 'trusted_proxies_help' => 'Nowe IP lub zakres IP', + 'clear' => 'Wyczyść', + 'set_to_cf' => 'Ustaw na adresy IP Cloudflare', + 'display_width' => 'Szerokość wyświetlania', + 'avatar_provider' => 'Dostawca awataru', + 'uploadable_avatars' => 'Zezwolić użytkownikom na ustawianie własnego awataru?', + ], + 'captcha' => [ + 'enable' => 'Włącz', + 'disable' => 'Wyłącz', + 'info_label' => 'Info', + 'info' => 'Możesz wygenerować klucze na swoim Panelu Cloudflare. Wymagane jest konto Cloudflare.', + 'site_key' => 'Klucz strony', + 'secret_key' => 'Sekretny Klucz', + 'verify' => 'Zweryfikować domenę?', + ], + 'mail' => [ + 'mail_driver' => 'Sposób wysyłania wiadomości e-mail', + 'test_mail' => 'Wyślij e-mail testowy', + 'test_mail_sent' => 'Mail testowy wysłany', + 'test_mail_failed' => 'Wiadomość testowa nie powiodła się', + 'from_settings' => 'Z ustawień', + 'from_settings_help' => 'Ustaw adres i nazwę używaną jako "Nadawca" w wiadomościach e-mail.', + 'from_address' => 'Z adresu', + 'from_name' => 'Nadawca', + 'smtp' => [ + 'smtp_title' => 'Konfiguracja SMTP', + 'host' => 'Host', + 'port' => 'Port', + 'username' => 'Nazwa użytkownika', + 'password' => 'Hasło', + 'scheme' => 'Schemat', + ], + 'mailgun' => [ + 'mailgun_title' => 'Konfiguracja Mailgun', + 'domain' => 'Domena', + 'secret' => 'Sekret', + 'endpoint' => 'Punkt końcowy', + ], + ], + 'backup' => [ + 'backup_driver' => 'Sterownik kopii zapasowej', + 'throttle' => 'Ograniczenia', + 'throttle_help' => 'Skonfiguruj, ile kopii zapasowych może zostać utworzonych w danym okresie. Ustaw okres na 0, aby wyłączyć to ograniczenie.', + 'limit' => 'Limit', + 'period' => 'Okres', + 'seconds' => 'Sekundy', + 's3' => [ + 's3_title' => 'Konfiguracja S3', + 'default_region' => 'Domyślny region', + 'access_key' => 'Identyfikator klucza dostępu', + 'secret_key' => 'Sekretny klucz dostępu', + 'bucket' => 'Bucket', + 'endpoint' => 'Punkt końcowy', + 'use_path_style_endpoint' => 'Użyj Endpoint w stylu ścieżki.', + ], + ], + 'oauth' => [ + 'enable' => 'Włącz', + 'enable_schema' => 'Włącz :schema', + 'disable' => 'Wyłącz', + 'client_id' => 'Identyfikator Klienta', + 'client_secret' => 'Sekret klienta', + 'redirect' => 'Adres URL przekierowania', + 'web_api_key' => 'Klucz Web API', + 'base_url' => 'Podstawowy adres URL', + 'display_name' => 'Wyświetlana nazwa', + 'auth_url' => 'Adres URL zwrotnego wywołania autoryzacji', + 'create_missing_users' => 'Czy tworzyć automatycznie brakujących użytkowników?', + 'link_missing_users' => 'Czy chcesz automatycznie powiązać brakujących użytkowników?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Automatyczne tworzenie alokacji', + 'helper' => 'Zmień ustawienie, jeśli użytkownicy mogą tworzyć alokacje za pomocą strefy klienta.', + 'question' => 'Zezwalać użytkownikom na tworzenie alokacji?', + 'create_new' => 'Utworzyć nowe alokacje, jeśli żadne nie są dostępne?', + 'create_new_help' => 'Gdy włączone, tworzy nowe alokacje. Gdy wyłączone, przypisuje tylko istniejące nieprzypisane alokacje. Obie opcje uwzględniają zakres portów poniżej.', + 'start' => 'Port początkowy', + 'end' => 'Port końcowy', + ], + 'mail_notifications' => [ + 'title' => 'Powiadomienia e-mail', + 'helper' => 'Wybierz, które powiadomienia mailowe mają być wysyłane do użytkowników.', + 'server_installed' => 'Serwer zainstalowany', + 'server_reinstalled' => 'Serwer został ponownie zainstalowany', + ], + 'connections' => [ + 'title' => 'Połączenia', + 'helper' => 'Czasy oczekiwania używane podczas wysyłania żądań.', + 'request_timeout' => 'Upłynął Limit czasu żądania', + 'connection_timeout' => 'Przekroczenie limitu czasu połączenia', + 'seconds' => 'Sekundy', + ], + 'activity_log' => [ + 'title' => 'Dziennik aktywności', + 'helper' => 'Skonfiguruj, jak często stare dzienniki aktywności powinny być usuwane oraz czy aktywności administratorów powinny być rejestrowane.', + 'prune_age' => 'Okres przechowywania przed usunięciem', + 'days' => 'Dni', + 'log_admin' => 'Ukryj działania administratora?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Określa limit liczby żądań na minutę, które mogą zostać wykonane.', + 'client_rate' => 'Limit API klienta', + 'app_rate' => 'Limit API aplikacji', + 'rpm' => 'Zapytania na minutę', + ], + 'server' => [ + 'title' => 'Serwery', + 'helper' => 'Ustawienia serwerów', + 'edit_server_desc' => 'Zezwolić użytkownikom na edycję opisów?', + 'console_font_upload' => 'Prześlij Czcionkę Konsoli', + 'console_font_hint' => 'Obsługiwane są tylko czcionki *.ttf. Mocno zalecamy czcionki Mono!', + ], + 'webhook' => [ + 'title' => 'Webhooki', + 'helper' => 'Skonfiguruj, jak często stare logi webhooków powinny być usuwane.', + 'prune_age' => 'Wyczyść Wiek', + 'days' => 'Dni', + ], + ], +]; diff --git a/lang/pl/admin/user.php b/lang/pl/admin/user.php index be1e9d3668..7f798e76a6 100644 --- a/lang/pl/admin/user.php +++ b/lang/pl/admin/user.php @@ -1,12 +1,24 @@ [ - 'user_has_servers' => 'Nie można usunąć użytkownika, który ma przypisane do swojego konta aktywne serwery. Proszę usunąć serwery przypisane do tego konta przed kontynuowaniem.', - 'user_is_self' => 'Nie można usunąć własnego konta użytkownika.', - ], - 'notices' => [ - 'account_created' => 'Konto zostało pomyślnie utworzone.', - 'account_updated' => 'Konto zostało pomyślnie zaktualizowane.', - ], + 'nav_title' => 'Użytkownicy', + 'model_label' => 'Użytkownik', + 'model_label_plural' => 'Użytkownicy', + 'self_delete' => 'Nie możesz usunąć siebie', + 'has_servers' => 'Użytkownik ma serwery', + 'email' => 'E-mail', + 'username' => 'Nazwa użytkownika', + 'password' => 'Hasło', + 'external_id' => 'Zewnętrzne ID', + 'is_managed_externally' => 'Czy jest zarządzany zewnętrznie?', + 'is_managed_externally_helper' => 'Jeśli Twoi użytkownicy są zarządzani przez zewnętrzne oprogramowanie (np. oprogramowanie do rozliczeń), możesz włączyć tę opcję, aby uniemożliwić użytkownikom zmianę nazwy użytkownika, adresu e-mail i hasła z poziomu panelu.', + 'password_help' => 'Podanie hasła użytkownika jest opcjonalne. Nowy użytkownik otrzyma e-mail, który poprosi go o utworzenie hasła podczas pierwszego logowania.', + 'admin_roles' => 'Role Administratora', + 'roles' => 'Role', + 'no_roles' => 'Brak ról', + 'servers' => 'Serwery', + 'subusers' => 'Podużytkownicy', + 'password_reset' => 'Zresetuj hasło', + 'password_reset_sent' => 'Wysłano wiadomość e-mail umożliwiającą zresetowanie hasła', + 'password_reset_failed' => 'Nie udało się wysłać e-mail resetujący hasło', ]; diff --git a/lang/pl/admin/webhook.php b/lang/pl/admin/webhook.php new file mode 100644 index 0000000000..f8d80dce00 --- /dev/null +++ b/lang/pl/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooki', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooki', + 'endpoint' => 'Punkt końcowy', + 'description' => 'Opis', + 'no_webhooks' => 'Brak webhooków', + 'help' => 'Wsparcie', + 'help_text' => 'Musisz owijać nazwę zmiennej między {{ }} na przykład jeśli chcesz użyć nazwy z api, możesz użyć {{name}}.', + 'test_now' => 'Sprawdź Teraz', + 'test_now_help' => 'Spowoduje to uruchomienie zdarzenia `utworzono: Serwer`', + 'table' => [ + 'description' => 'Opis', + 'endpoint' => 'Punkt końcowy', + ], + 'headers' => 'Nagłówki', + 'events' => 'Wydarzenia', + 'regular' => 'Standardowe', + 'reset_headers' => 'Zresetuj nagłówki', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Wiadomość', + 'username' => 'Nazwa użytkownika', + 'avatar_url' => 'Link do awatara', + 'forum_thread' => 'Nazwa wątku na forum', + 'supress_embeds' => 'Wyłącz Embedy', + 'supress_embeds_text' => 'Nie załączaj żadnych embedów podczas serializacji tej wiadomości.', + 'supress_notifications' => 'Wyłącz Powiadomienia', + 'supress_notifications_text' => 'Ta wiadomość nie uruchomi powiadomień Push i Pulpitowych', + ], + 'discord_embed' => [ + 'add_embed' => 'Dodaj Embed', + 'flags' => 'Flagi', + 'thumbnail' => 'Link do miniatury', + 'embeds' => 'Embedy', + 'thread_name' => 'Nazwa wątku na forum', + 'allowed_mentions' => 'Dozwolone wzmianki', + 'roles' => 'Role', + 'users' => 'Użytkownicy', + 'everyone' => '@everyone i @here', + 'author' => 'Autor', + 'author_url' => 'Adres URL Autora', + 'author_icon_url' => 'Adres URL ikony Autora', + 'body' => 'Zawartość', + 'title' => 'Tytuł', + 'color' => 'Kolor Embeda', + 'url' => 'URL', + 'images' => 'Obrazy', + 'image_url' => 'URL obrazu', + 'image_thumbnail' => 'Link do miniatury', + 'footer' => 'Stopka', + 'has_timestamp' => 'Posiada znacznik czasu', + 'footer_icon_url' => 'Adres URL ikony stopki', + 'add_field' => 'Dodaj Pole', + 'fields' => 'Pola', + 'field_name' => 'Nazwa Pola', + 'field_value' => 'Wartość Pola', + 'inline_field' => 'Pole w linii', + ], +]; diff --git a/lang/pl/auth.php b/lang/pl/auth.php index 4dd3f0fb89..1fbc4632f3 100644 --- a/lang/pl/auth.php +++ b/lang/pl/auth.php @@ -1,27 +1,24 @@ 'Zaloguj', - 'go_to_login' => 'Przejdź do logowania', - 'failed' => 'Nie znaleziono konta pasującego do tych danych.', - 'forgot_password' => [ - 'label' => 'Nie pamiętasz hasła?', - 'label_help' => 'Wprowadź swój adres e-mail, aby otrzymać instrukcje resetowania hasła.', - 'button' => 'Odzyskaj konto', - ], - - 'reset_password' => [ - 'button' => 'Zresetuj i zaloguj się', - ], - - 'two_factor' => [ - 'label' => 'Token logowania 2-etapowego', - 'label_help' => 'To konto wymaga uwierzytelniania 2-etapowego, aby kontynuować. Wprowadź wygenerowany kod, aby dokończyć logowanie.', - 'checkpoint_failed' => 'Kod uwierzytelniania 2-etapowego jest nieprawidłowy.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'Podane dane uwierzytelniające nie są zgodne z naszymi danymi.', + 'failed-two-factor' => 'Nieprawidłowy kod 2FA', + 'two-factor-code' => 'Kod 2FA', + 'two-factor-hint' => 'Możesz użyć kodów zapasowych, jeśli utraciłeś dostęp do swojego urządzenia.', + 'password' => 'Podane hasło jest nieprawidłowe.', 'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds sekund.', - 'password_requirements' => 'Hasło musi mieć co najmniej 8 znaków.', '2fa_must_be_enabled' => 'Administrator zażądał włączenia uwierzytelniania dwuetapowego dla Twojego konta, by móc korzystać z Panelu.', + ]; diff --git a/lang/pl/command/messages.php b/lang/pl/command/messages.php index c7bfbf77aa..641d33d1c1 100644 --- a/lang/pl/command/messages.php +++ b/lang/pl/command/messages.php @@ -2,40 +2,35 @@ return [ 'user' => [ - 'search_users' => 'Wprowadź nazwę użytkownika, identyfikator użytkownika lub adres e-mail', - 'select_search_user' => 'ID użytkownika do usunięcia (Wpisz \'0\' aby wyszukać ponownie)', - 'deleted' => 'Użytkownik został pomyślnie usunięty z Panelu.', + 'search_users' => 'Wprowadź nazwę użytkownika, identyfikator użytkownika lub adres e-mail.', + 'select_search_user' => 'ID użytkownika do usunięcia (Wprowadź „0”, aby ponownie wyszukać)', + 'deleted' => 'Użytkownik został pomyślnie usunięty z panelu.', 'confirm_delete' => 'Czy na pewno chcesz usunąć tego użytkownika z Panelu?', 'no_users_found' => 'Nie znaleziono użytkowników dla podanego terminu wyszukiwania.', - 'multiple_found' => 'Znaleziono wiele kont dla podanego użytkownika, nie można usunąć użytkownika z powodu flagi --no-interaction', + 'multiple_found' => 'Znaleziono wiele kont dla podanego użytkownika, nie można usunąć użytkownika z powodu flagi --no-interaction.', 'ask_admin' => 'Czy ten użytkownik jest administratorem?', 'ask_email' => 'Adres E-mail', 'ask_username' => 'Nazwa Użytkownika', - 'ask_name_first' => 'Imię', - 'ask_name_last' => 'Nazwisko', 'ask_password' => 'Hasło', - 'ask_password_tip' => 'Jeśli chcesz utworzyć konto z losowym hasłem wysłanym e-mailem do użytkownika, ponownie uruchom tę komendę (CTRL+C) i przekaż flagę `--no-password`.', - 'ask_password_help' => 'Hasła muszą mieć co najmniej 8 znaków i zawierać co najmniej jedną wielką literę oraz cyfrę.', - '2fa_help_text' => [ - 'Ta komenda wyłączy uwierzytelnianie dwuskładnikowe dla konta użytkownika, jeśli jest włączone. Powinna być używana tylko jako polecenie odzyskiwania konta, jeśli użytkownik jest zablokowany na swoim koncie.', - 'Jeśli to nie jest to, co chciałeś zrobić, naciśnij CTRL+C, aby zakończyć ten proces.', - ], - '2fa_disabled' => 'Uwierzytelnianie dwuskładnikowe zostało wyłączone dla :email', + 'ask_password_tip' => 'Jeśli chcesz utworzyć konto z losowym hasłem wysyłanym do użytkownika, uruchom ponownie tę komendę (CTRL+C) i użyj flagi --no-password.', + 'ask_password_help' => 'Hasła muszą mieć co najmniej 8 znaków i zawierać przynajmniej jedną wielką literę oraz cyfrę.', + '2fa_help_text' => 'To polecenie wyłączy uwierzytelnianie dwuskładnikowe dla konta użytkownika, jeśli jest ono włączone. Powinno być używane wyłącznie jako polecenie odzyskiwania konta, jeśli użytkownik nie ma dostępu do swojego konta. Jeśli nie jest to zamierzone działanie, naciśnij klawisze CTRL+C, aby zakończyć ten proces.', + '2fa_disabled' => 'Uwierzytelnianie dwuetapowe zostało wyłączone dla :email.', ], 'schedule' => [ - 'output_line' => 'Wysyłanie żądania dla pierwszego zadania w `:schedule` (:hash).', + 'output_line' => 'Wysyłanie zadania dla pierwszego zadania w :schedule (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'Usuwanie pliku kopii zapasowej usługi :file.', ], 'server' => [ - 'rebuild_failed' => 'Żądanie przebudowy dla ":name" (#:id) na węźle ":node" nie powiodło się z błędem: :message', + 'rebuild_failed' => 'Żądanie ponownej budowy dla ":name" (#:id) na węźle ":node" nie powiodło się z błędem: :message', 'reinstall' => [ 'failed' => 'Żądanie ponownej instalacji dla ":name" (#:id) na węźle ":node" nie powiodło się z błędem: :message', - 'confirm' => 'Przed Tobą ponowna instalacja na grupie serwerów. Czy chcesz kontynuować?', + 'confirm' => 'Zaraz wykonasz ponowną instalację na grupie serwerów. Czy chcesz kontynuować?', ], 'power' => [ - 'confirm' => 'Zamierzasz wykonać :action przeciwko :count serwerom. Czy chcesz kontynuować?', + 'confirm' => 'Zaraz wykonasz akcję :action na :count serwerach. Czy chcesz kontynuować?', 'action_failed' => 'Żądanie akcji zasilania dla ":name" (#:id) na węźle ":node" nie powiodło się z błędem: :message', ], ], @@ -45,15 +40,15 @@ 'ask_smtp_port' => 'Port SMTP', 'ask_smtp_username' => 'Nazwa użytkownika SMTP', 'ask_smtp_password' => 'Hasło SMTP', - 'ask_mailgun_domain' => 'Serwer Mailgun', - 'ask_mailgun_endpoint' => 'Punkt dostępowy Mailgun', + 'ask_mailgun_domain' => 'Domena Mailgun', + 'ask_mailgun_endpoint' => 'Punkt końcowy Mailgun', 'ask_mailgun_secret' => 'Sekret Mailgun', 'ask_mandrill_secret' => 'Sekret Mandrill', 'ask_postmark_username' => 'Klucz API Postmark', - 'ask_driver' => 'Który sterownik powinien być używany do wysyłania e-maili?', - 'ask_mail_from' => 'Adres e-mail, z którego mają pochodzić wiadomości e-mail', - 'ask_mail_name' => 'Nazwa, z której powinny się pojawić wiadomości e-mail', - 'ask_encryption' => 'Metoda szyfrowania do użycia', + 'ask_driver' => 'Który dostawca powinien być użyty do wysyłania e-maili?', + 'ask_mail_from' => 'Adres e-mail, z którego powinny być wysyłane wiadomości', + 'ask_mail_name' => 'Nazwa, która powinna być wyświetlana jako nadawca e-maili', + 'ask_encryption' => 'Używana metoda szyfrowania', ], ], ]; diff --git a/lang/pl/commands.php b/lang/pl/commands.php new file mode 100644 index 0000000000..7629fe6f56 --- /dev/null +++ b/lang/pl/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Podaj adres e-mail, z którego powinny być eksportowane jaja przez ten panel. To powinien być poprawny adres e-mail.', + 'url' => 'Adres URL aplikacji MUSI zaczynać się od https:// lub http:// w zależności od tego, czy używasz SSL, czy nie. Jeśli nie zastosujesz tego schematu, adresy e-mail i inne treści będą linkować do złej lokalizacji.', + 'timezone' => 'Strefa czasowa powinna odpowiadać jednej z obsługiwanych stref czasowych PHP. Jeśli nie jesteś pewien, sprawdź stronę https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Wybrałeś sterownik Redis dla jednej lub więcej opcji, podaj poniżej poprawne informacje o połączeniu. W większości przypadków możesz użyć domyślnych ustawień chyba że zmodyfikowałeś ustawienia.', + 'comment' => 'Domyślnie instancja serwera Redis ma nazwę użytkownika „default” i nie posiada hasła, ponieważ działa lokalnie i jest niedostępna z zewnątrz. Jeśli tak jest, po prostu naciśnij Enter bez wpisywania wartości.', + 'confirm' => 'Wygląda na to, że :field jest już zdefiniowane dla Redis. Czy chcesz to zmienić?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Zaleca się, aby nie używać „localhost” jako hosta bazy danych, ponieważ często występują problemy z połączeniami gniazdowymi. Jeśli chcesz używać połączenia lokalnego, powinieneś użyć „127.0.0.1”.', + 'DB_USERNAME_note' => 'Używanie konta root do połączeń z MySQL jest nie tylko zdecydowanie odradzane, ale także niedozwolone przez tę aplikację. Musisz utworzyć użytkownika MySQL dla tego oprogramowania.', + 'DB_PASSWORD_note' => 'Wygląda na to, że masz już zdefiniowane hasło do połączenia z MySQL. Czy chcesz je zmienić?', + 'DB_error_2' => 'Twoje dane logowania nie zostały zapisane. Będziesz musiał podać prawidłowe informacje o połączeniu przed kontynuowaniem.', + 'go_back' => 'Wróć i spróbuj ponownie', + ], + 'make_node' => [ + 'name' => 'Wprowadź krótki identyfikator używany do odróżnienia tego węzła od innych.', + 'description' => 'Wprowadź opis identyfikujący węzeł', + 'scheme' => 'Proszę wprowadzić https dla połączenia SSL lub http dla połączenia bez SSL.', + 'fqdn' => 'Wprowadź nazwę domeny (np. node.example.com), która będzie używana do łączenia się z daemon\'em. Adres IP może być użyty tylko wtedy, gdy nie używasz SSL dla tego węzła.', + 'public' => 'Czy ten węzeł ma być publiczny? Zauważ, że ustawienie węzła jako prywatnego spowoduje uniemożliwienie automatycznego wdrażania na tym węźle.', + 'behind_proxy' => 'Czy Twój FQDN znajduje się za serwerem proxy?', + 'maintenance_mode' => 'Czy tryb konserwacji powinien być włączony?', + 'memory' => 'Wprowadź maksymalną ilość pamięci', + 'memory_overallocate' => 'Wprowadź ilość pamięci, którą chcesz przypisać; -1 wyłączy sprawdzanie, a 0 uniemożliwi tworzenie nowych serwerów.', + 'disk' => 'Wprowadź maksymalną ilość przestrzeni dyskowej', + 'disk_overallocate' => 'Wprowadź ilość przestrzeni dyskowej, którą chcesz przypisać; -1 wyłączy sprawdzanie, a 0 uniemożliwi tworzenie nowych serwerów.', + 'cpu' => 'Wprowadź maksymalną ilość cpu', + 'cpu_overallocate' => 'Wprowadź ilość cpu, którą chcesz przypisać; -1 wyłączy sprawdzanie, a 0 uniemożliwi tworzenie nowych serwerów.', + 'upload_size' => 'Wprowadź maksymalny rozmiar pliku do przesłania', + 'daemonListen' => 'Wprowadź port, na którym nasłuchuje daemon', + 'daemonConnect' => 'Podaj port łączenia daemon (może być taki sam jak port nasłuchu).', + 'daemonSFTP' => 'Wprowadź port nasłuchujący daemona SFTP', + 'daemonSFTPAlias' => 'Wprowadź alias SFTP dla daemon\'a (może być pusty)', + 'daemonBase' => 'Wprowadź folder bazowy', + 'success' => 'Pomyślnie utworzono nowy węzeł o nazwie :name i identyfikatorze :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Wybrany węzeł nie istnieje.', + 'error_invalid_format' => 'Podany format jest nieprawidłowy. Dostępne opcje to yaml i json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Wygląda na to, że już skonfigurowałeś klucz szyfrowania aplikacji. Kontynuowanie tego procesu spowoduje nadpisanie tego klucza i może doprowadzić do uszkodzenia danych, które zostały już zaszyfrowane. NIE KONTYNUUJ, JEŚLI NIE WIESZ, CO ROBISZ.', + 'understand' => 'Rozumiem konsekwencje wykonania tego polecenia i akceptuję całą odpowiedzialność za utratę zaszyfrowanych danych.', + 'continue' => 'Czy na pewno chcesz kontynuować? Zmiana klucza szyfrowania aplikacji SPOWODUJE UTRATĘ DANYCH.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Nie ma zaplanowanych zadań dla serwerów, które muszą zostać wykonane.', + 'error_message' => 'Wystąpił błąd podczas przetwarzania harmonogramu: ', + ], + ], +]; diff --git a/lang/pl/dashboard/account.php b/lang/pl/dashboard/account.php deleted file mode 100644 index ec13c62f80..0000000000 --- a/lang/pl/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Zaktualizuj swój e-mail', - 'updated' => 'Twój adres e-mail został zaktualizowany.', - ], - 'password' => [ - 'title' => 'Zmień swoje hasło', - 'requirements' => 'Twoje nowe hasło powinno mieć co najmniej 8 znaków.', - 'updated' => 'Twoje hasło zostało zaktualizowane.', - ], - 'two_factor' => [ - 'button' => 'Skonfiguruj uwierzytelnianie dwuetapowe', - 'disabled' => 'Uwierzytelnianie dwuetapowe zostało wyłączone na Twoim koncie. Nie będziesz już proszony o podanie tokenu podczas logowania.', - 'enabled' => 'Uwierzytelnianie dwuetapowe zostało włączone na Twoim koncie! Od teraz podczas logowania będziesz musiał podać kod wygenerowany przez swoje urządzenie.', - 'invalid' => 'Podany token jest nieprawidłowy.', - 'setup' => [ - 'title' => 'Skonfiguruj uwierzytelnianie dwuetapowe.', - 'help' => 'Nie udało Ci się zeskanować kodu? Wprowadź poniższy kod do swojej aplikacji:', - 'field' => 'Wprowadź token', - ], - 'disable' => [ - 'title' => 'Wyłącz uwierzytelnianie dwuetapowe', - 'field' => 'Wprowadź token', - ], - ], -]; diff --git a/lang/pl/dashboard/index.php b/lang/pl/dashboard/index.php deleted file mode 100644 index a94a163b6e..0000000000 --- a/lang/pl/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Wyszukaj serwery...', - 'no_matches' => 'Nie znaleziono żadnych serwerów spełniających podane kryteria wyszukiwania.', - 'cpu_title' => 'Procesor', - 'memory_title' => 'Pamięć', -]; diff --git a/lang/pl/exceptions.php b/lang/pl/exceptions.php index d821676b12..4f15120e63 100644 --- a/lang/pl/exceptions.php +++ b/lang/pl/exceptions.php @@ -1,55 +1,64 @@ 'Wystąpił wyjątek podczas próby komunikacji z demonem skutkujący kodem odpowiedzi HTTP/:code. Wyjątek ten został zarejestrowany.', + 'daemon_connection_failed' => 'Wystąpił wyjątek podczas próby komunikacji z daemon\'em skutkujący kodem odpowiedzi HTTP/:code. Wyjątek ten został zarejestrowany.', 'node' => [ - 'servers_attached' => 'Aby usunąć ten węzeł, nie możesz mieć podłączonych do niego serwerów.', - 'daemon_off_config_updated' => 'Konfiguracja deamona została zaktualizowana, jednak wystąpił błąd podczas próby automatycznej aktualizacji pliku konfiguracyjnego deamona. Aby zastosować te zmiany, należy ręcznie zaktualizować plik konfiguracyjny (config.yml).', + 'servers_attached' => 'Aby węzeł mógł zostać usunięty, nie może być z nim powiązany żaden serwer.', + 'error_connecting' => 'Błąd połączenia z węzłem :node', + 'daemon_off_config_updated' => 'Konfiguracja daemon\'a została zaktualizowana, jednak wystąpił błąd podczas próby automatycznej aktualizacji pliku konfiguracyjnego daemon\'a. Będziesz musiał ręcznie zaktualizować plik konfiguracyjny (config.yml) dla daemon\'a, aby zastosować te zmiany.', ], 'allocations' => [ - 'server_using' => 'Serwer jest obecnie przypisany do tej alokacji. Alokację można usunąć tylko wtedy, gdy żaden serwer nie jest do niej przypisany.', - 'too_many_ports' => 'Dodawanie więcej niż 1000 portów w jednym zakresie nie jest obsługiwane.', - 'invalid_mapping' => 'Mapowanie podane dla :port było nieprawidłowe i nie mogło zostać przetworzone.', + 'server_using' => 'Serwer jest aktualnie przypisany do tej alokacji. Alokacje można usunąć tylko wtedy, gdy żaden serwer nie jest aktualnie przypisany.', + 'too_many_ports' => 'Dodanie więcej niż 1000 portów w jednym zakresie jednocześnie nie jest obsługiwane.', + 'invalid_mapping' => 'Mapowanie dla portu :port było nieprawidłowe i nie mogło zostać przetworzone.', 'cidr_out_of_range' => 'Notacja CIDR dopuszcza tylko maski od /25 do /32.', - 'port_out_of_range' => 'Porty w alokacji muszą być większe niż 1024 i mniejsze lub równe 65535.', + 'port_out_of_range' => 'Porty w alokacji muszą być większe lub równe 1024 i mniejsze lub równe 65535.', ], 'egg' => [ - 'delete_has_servers' => 'Jajo z aktywnymi serwerami przypisanymi do niego nie może zostać usunięte z Panelu.', - 'invalid_copy_id' => 'Jajo wybrane do skopiowania skryptu albo nie istnieje, albo samo posiada kopię skryptu.', - 'has_children' => 'Jajo jest nadrzędne dla jednego lub więcej innych jajek. Proszę najpierw usunąć te jajka przed usunięciem tego.', + 'delete_has_servers' => 'Jajo z aktywnymi serwerami nie może zostać usunięte z panelu.', + 'invalid_copy_id' => 'Jajo wybrane do skopiowania skryptu albo nie istnieje, albo kopiuje sam skrypt.', + 'has_children' => 'To jajo jest rodzicem jednego lub więcej innych jaj. Usuń te jaja przed usunięciem tego jaja.', ], 'variables' => [ - 'env_not_unique' => 'Zmienna środowiskowa :name musi być unikalna dla tego jajka.', + 'env_not_unique' => 'Zmienna środowiskowa :name musi być unikalna dla tego Egg.', 'reserved_name' => 'Zmienna środowiskowa :name jest chroniona i nie może być przypisana do zmiennej.', - 'bad_validation_rule' => 'Reguła walidacji ":rule" nie jest prawidłową regułą dla tej aplikacji.', + 'bad_validation_rule' => 'Reguła walidacji ":rule” nie jest prawidłową regułą dla tej aplikacji.', ], 'importer' => [ - 'json_error' => 'Wystąpił błąd podczas próby analizy pliku JSON: :error', - 'file_error' => 'Podany plik JSON jest nieprawidłowy.', - 'invalid_json_provided' => 'Podany plik JSON nie jest w formacie, który może być rozpoznany.', + 'json_error' => 'Wystąpił błąd podczas próby przeanalizowania pliku JSON: :error....', + 'file_error' => 'Podany plik JSON był nieprawidłowy.', + 'invalid_json_provided' => 'Dostarczony plik JSON nie jest w formacie, który można rozpoznać.', ], 'subusers' => [ - 'editing_self' => 'Edytowanie własnego konta podużytkownika jest niedozwolone.', - 'user_is_owner' => 'Nie można dodać właściciela serwera jako podużytkownika tego serwera.', - 'subuser_exists' => 'Użytkownik z tym adresem e-mail jest już przypisany jako podużytkownik dla tego serwera.', + 'editing_self' => 'Edycja własnego konta subużytkownika jest niedozwolona.', + 'user_is_owner' => 'Nie można dodać właściciela serwera jako subużytkownika tego serwera.', + 'subuser_exists' => 'Użytkownik o tym adresie e-mail jest już przypisany jako subużytkownik tego serwera.', ], 'databases' => [ 'delete_has_databases' => 'Nie można usunąć serwera hosta bazy danych, z którym powiązane są aktywne bazy danych.', ], 'tasks' => [ - 'chain_interval_too_long' => 'Maksymalny odstęp czasu dla zadania, które zostało zablokowane wynosi 15 minut.', + 'chain_interval_too_long' => 'Maksymalny czas interwału dla zadania powiązanego wynosi 15 minut.', ], 'locations' => [ 'has_nodes' => 'Nie można usunąć lokalizacji, do której dołączone są aktywne węzły.', ], 'users' => [ - 'node_revocation_failed' => 'Nie udało się odwołać kluczy na węźle #:node. :error', + 'is_self' => 'Nie można usunąć swojego konta użytkownika.', + 'has_servers' => 'Nie można usunąć użytkownika, który ma przypisane aktywne serwery. Przed kontynuowaniem usuń przypisane serwery.', + 'node_revocation_failed' => 'Nie udało się cofnąć kluczy na Węźle #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'Nie znaleziono węzłów spełniających wymagania dla automatycznego wdrażania.', - 'no_viable_allocations' => 'Nie znaleziono portów spełniających wymagania dla automatycznego wdrażania.', + 'no_viable_nodes' => 'Nie znaleziono węzłów spełniających wymagania określone dla automatycznego wdrożenia.', + 'no_viable_allocations' => 'Nie znaleziono alokacji spełniających wymagania dla automatycznego wdrożenia.', ], 'api' => [ 'resource_not_found' => 'Żądany zasób nie istnieje na tym serwerze.', ], + 'mount' => [ + 'servers_attached' => 'Aby usunąć punkt montowania, nie mogą być do niego przypisane żadne serwery.', + ], + 'server' => [ + 'marked_as_failed' => 'Ten serwer nie zakończył jeszcze procesu instalacji, proszę spróbować ponownie później.', + ], ]; diff --git a/lang/pl/installer.php b/lang/pl/installer.php new file mode 100644 index 0000000000..e627222341 --- /dev/null +++ b/lang/pl/installer.php @@ -0,0 +1,115 @@ + 'Instalator panelu', + 'requirements' => [ + 'title' => 'Wymagania serwera', + 'sections' => [ + 'version' => [ + 'title' => 'Wersja PHP', + 'or_newer' => ':version lub nowsza', + 'content' => 'Twoja wersja PHP to :version.', + ], + 'extensions' => [ + 'title' => 'Rozszerzenia PHP', + 'good' => 'Wszystkie potrzebne rozszerzenia PHP są zainstalowane.', + 'bad' => 'Brakuje następujących rozszerzeń PHP: :extensions', + ], + 'permissions' => [ + 'title' => 'Uprawnienia folderów', + 'good' => 'Wszystkie foldery mają odpowiednie uprawnienia.', + 'bad' => 'Następujące foldery mają nieprawidłowe uprawnienia: :folders', + ], + ], + 'exception' => 'Brakuje niektórych wymogów', + ], + 'environment' => [ + 'title' => 'Środowisko', + 'fields' => [ + 'app_name' => 'Nazwa aplikacji', + 'app_name_help' => 'To będzie nazwa Twojego panelu.', + 'app_url' => 'Adres URL aplikacji', + 'app_url_help' => 'Będzie to adres URL, pod którym uzyskasz dostęp do swojego Panelu.', + 'account' => [ + 'section' => 'Administrator', + 'email' => 'Adres e-mail', + 'username' => 'Nazwa użytkownika', + 'password' => 'Hasło', + ], + ], + ], + 'database' => [ + 'title' => 'Baza danych', + 'driver' => 'Sterownik bazy danych', + 'driver_help' => 'Sterownik używany do bazy danych panelu. Zalecamy "SQLite".', + 'fields' => [ + 'host' => 'Host bazy danych', + 'host_help' => 'Host bazy danych. Upewnij się, że jest osiągalny.', + 'port' => 'Port bazy danych', + 'port_help' => 'Port twojej bazy danych', + 'path' => 'Ścieżka do bazy danych', + 'path_help' => 'Ścieżka do pliku .sqlite względem folderu bazy danych.', + 'name' => 'Nazwa bazy danych', + 'name_help' => 'Nazwa bazy danych panelu.', + 'username' => 'Nazwa użytkownika bazy danych', + 'username_help' => 'Nazwa użytkownika bazy danych.', + 'password' => 'Hasło do bazy danych', + 'password_help' => 'Hasło użytkownika bazy danych. Może być puste.', + ], + 'exceptions' => [ + 'connection' => 'Nie udało się nawiązać połączenia z bazą danych.', + 'migration' => 'Migracja nie powiodła się', + ], + ], + 'egg' => [ + 'title' => 'Jajka', + 'no_eggs' => 'Brak jajek', + 'background_install_started' => 'Rozpoczęto instalację jajka', + 'background_install_description' => 'Instalacja :count eggs została umieszczona w kolejce i będzie kontynuowana w tle.', + 'exceptions' => [ + 'failed_to_update' => 'Nie udało się zaktualizować indeksu egg', + 'no_eggs' => 'W tej chwili nie ma dostępnych jajek do zainstalowania.', + 'installation_failed' => 'Nie udało się zainstalować wybranych jajek. Proszę je zaimportować po instalacji z listy jajek.', + ], + ], + 'session' => [ + 'title' => 'Sesja', + 'driver' => 'Sterownik sesji', + 'driver_help' => 'Sterownik używany do przechowywania sesji. Zalecamy "System plików" lub "Baza danych".', + ], + 'cache' => [ + 'title' => 'Pamięć podręczna', + 'driver' => 'Sterownik pamięci podręcznej', + 'driver_help' => 'Sterownik używany do buforowania. Zalecamy „System plików”.', + 'fields' => [ + 'host' => 'Host Redis', + 'host_help' => 'Host serwera redis. Upewnij się, że jest osiągalny.', + 'port' => 'Port Redis', + 'port_help' => 'Port serwera redis.', + 'username' => 'Nazwa użytkownika Redis', + 'username_help' => 'Nazwa użytkownika redis. Może być pusta.', + 'password' => 'Hasło Redis', + 'password_help' => 'Hasło dla użytkownika redis. Może być puste.', + ], + 'exception' => 'Nie udało się nawiązać połączenia z Redis', + ], + 'queue' => [ + 'title' => 'Kolejka', + 'driver' => 'Sterownik kolejki', + 'driver_help' => 'Sterownik używany do obsługi kolejek. Zalecamy „Baza danych”.', + 'fields' => [ + 'done' => 'Wykonałem oba poniższe kroki.', + 'done_validation' => 'Przed kontynuowaniem należy wykonać oba kroki!', + 'crontab' => 'Uruchom poniższe polecenie, aby skonfigurować crontab. Pamiętaj, że www-data to użytkownik Twojego serwera WWW +. W niektórych systemach nazwa ta może być inna!', + 'service' => 'Aby skonfigurować usługę kolejki zadań, wystarczy uruchomić następujące polecenie.', + ], + ], + 'exceptions' => [ + 'write_env' => 'Nie można zapisać pliku .env', + 'migration' => 'Nie można uruchomić migracji', + 'create_user' => 'Nie można utworzyć użytkownika administratora.', + ], + 'next_step' => 'Następny krok', + 'finish' => 'Zakończ', +]; diff --git a/lang/pl/notifications.php b/lang/pl/notifications.php new file mode 100644 index 0000000000..8ea4cc4f23 --- /dev/null +++ b/lang/pl/notifications.php @@ -0,0 +1,18 @@ + 'Otwórz serwer', + 'installation_completed' => 'Instalacja serwera zakończona', + 'installation_failed' => 'Instalacja serwera nie powiodła się', + 'reinstallation_completed' => 'Reinstalacja serwera zakończona pomyślnie', + 'reinstallation_failed' => 'Reinstalacja serwera nie powiodła się', + 'failed' => 'Niepowodzenie', + 'user_added' => [ + 'title' => 'Dodano do serwera', + 'body' => 'Zostałeś dodany jako podużytkownik do :server.', + ], + 'user_removed' => [ + 'title' => 'Usunięto z serwera', + 'body' => 'Zostałeś usunięty jako podużytkownik z :server.', + ], +]; diff --git a/lang/pl/pagination.php b/lang/pl/pagination.php deleted file mode 100644 index 29ddd85bf3..0000000000 --- a/lang/pl/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Powrót', - 'next' => 'Dalej »', -]; diff --git a/lang/pl/passwords.php b/lang/pl/passwords.php deleted file mode 100644 index f53b792db5..0000000000 --- a/lang/pl/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Hasło musi zawierać co najmniej 6 znaków.', - 'reset' => 'Twoje hasło zostało zresetowane!', - 'sent' => 'Wysłaliśmy ci wiadomość e-mail z linkiem do zresetowania hasła!', - 'token' => 'Kod potwierdzający resetowanie hasła jest nieprawidłowy.', - 'user' => 'Nie znaleziono użytkownika o takim adresie e-mail.', -]; diff --git a/lang/pl/profile.php b/lang/pl/profile.php new file mode 100644 index 0000000000..c1c363627f --- /dev/null +++ b/lang/pl/profile.php @@ -0,0 +1,70 @@ + 'Profil', + 'tabs' => [ + 'account' => 'Konto', + 'oauth' => 'OAuth', + 'activity' => 'Aktywność', + 'api_keys' => 'Klucze API', + 'ssh_keys' => 'Klucze SSH', + 'keys' => 'Klucze', + '2fa' => '2FA', + 'customization' => 'Dostosowywanie', + ], + 'username' => 'Nazwa użytkownika', + 'admin' => 'Administrator', + 'exit_admin' => 'Wyjdź z trybu administratora', + 'server_list' => 'Lista serwerów', + 'email' => 'E-mail', + 'password' => 'Hasło', + 'current_password' => 'Obecne hasło', + 'password_confirmation' => 'Potwierdzenie hasła', + 'timezone' => 'Strefa czasowa', + 'language' => 'Język', + 'language_help' => 'Twój język :state nie został jeszcze przetłumaczony!', + 'link' => 'Link ', + 'unlink' => 'Odłącz ', + 'unlinked' => ':name odłączony', + 'scan_qr' => 'Zeskanuj kod QR', + 'code' => 'Kod', + 'setup_key' => 'Klucz konfiguracji', + 'invalid_code' => 'Nieprawidłowy kod 2FA', + 'code_help' => 'Zeskanuj powyższy kod QR za pomocą aplikacji do uwierzytelniania dwuetapowego, a następnie wprowadź wygenerowany kod.', + '2fa_enabled' => 'Uwierzytelnianie dwuskładnikowe jest obecnie włączone!', + 'backup_help' => 'Nie będzie można ich ponownie zobaczyć!', + 'backup_codes' => 'Kody zapasowe', + 'disable_2fa' => 'Wyłącz 2FA', + 'disable_2fa_help' => 'Wprowadź aktualny kod 2FA, aby wyłączyć uwierzytelnianie dwuetapowe.', + 'api_keys' => 'Klucze API', + 'create_api_key' => 'Utwórz klucz API', + 'api_key_created' => 'Sukces! Klucz API został utworzony.', + 'description' => 'Opis', + 'allowed_ips' => 'Dozwolone adresy IP', + 'allowed_ips_help' => 'Naciśnij Enter, aby dodać nowy adres IP lub pozostaw puste pole, aby zezwolić na dowolny adres IP.', + 'ssh_keys' => 'Klucze SSH', + 'create_ssh_key' => 'Utwórz klucz SSH', + 'ssh_key_created' => 'Klucz SSH został utworzony', + 'name' => 'Nazwa', + 'public_key' => 'Klucz publiczny', + 'could_not_create_ssh_key' => 'Nie udało się utworzyć klucza ssh.', + 'dashboard' => 'Panel', + 'dashboard_layout' => 'Układ panelu', + 'console' => 'Konsola', + 'grid' => 'Siatka', + 'table' => 'Tabela', + 'rows' => 'Wiersze', + 'font_size' => 'Rozmiar czcionki', + 'font' => 'Czcionka', + 'font_preview' => 'Podgląd Czcionki', + 'seconds' => 'Sekundy', + 'graph_period' => 'Okres Wykresu', + 'graph_period_helper' => 'Ilość punktów danych oraz sekund wyświetlanych w wykresach konsoli.', + 'navigation' => 'Typ nawigacji', + 'sidebar' => 'Boczny pasek', + 'topbar' => 'Górny pasek', + 'mixed' => 'Zmieszane', + 'no_oauth' => 'Brak połączonych kont', + 'no_api_keys' => 'Brak kluczy API', + 'no_ssh_keys' => 'Brak kluczy SSH', +]; diff --git a/lang/pl/search.php b/lang/pl/search.php new file mode 100644 index 0000000000..674362ed98 --- /dev/null +++ b/lang/pl/search.php @@ -0,0 +1,9 @@ + 'Wprowadź co najmniej trzy znaki, aby rozpocząć wyszukiwanie.', + 'term' => [ + 'label' => 'Wyszukiwana fraza', + 'description' => 'Wprowadź nazwę serwera, identyfikator uuid lub alokację, aby rozpocząć wyszukiwanie', + ], +]; diff --git a/lang/pl/server/activity.php b/lang/pl/server/activity.php new file mode 100644 index 0000000000..5c7f599053 --- /dev/null +++ b/lang/pl/server/activity.php @@ -0,0 +1,11 @@ + 'Aktywność', + 'event' => 'Zdarzenie', + 'user' => 'Użytkownik', + 'deleted_user' => 'Użytkownik Usunięty', + 'system' => 'System', + 'timestamp' => 'Znacznik czasowy', + 'metadata' => 'Metadane', +]; diff --git a/lang/pl/server/backup.php b/lang/pl/server/backup.php new file mode 100644 index 0000000000..9862f7d62f --- /dev/null +++ b/lang/pl/server/backup.php @@ -0,0 +1,55 @@ + 'Kopie zapasowe', + 'empty' => 'Brak kopii zapasowych', + 'size' => 'Rozmiar', + 'created_at' => 'Data utworzenia', + 'status' => 'Stan', + 'is_locked' => 'Status Blokady', + 'backup_status' => [ + 'in_progress' => 'W trakcie', + 'successful' => 'Zakończono pomyślnie', + 'failed' => 'Nie powiodło się', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Utwórz kopię zapasową', + 'limit' => 'Osiągnięto limit kopii zapasowych', + 'created' => ':name został utworzony', + 'notification_success' => 'Kopia zapasowa została utworzona pomyślnie', + 'notification_fail' => 'Tworzenie kopii zapasowej nie powiodło się', + 'name' => 'Nazwa', + 'ignored' => 'Ignorowane Pliki & Foldery', + 'locked' => 'Zablokowane?', + 'lock_helper' => 'Zapobiega usunięciu tej kopii zapasowej do czasu jej wyraźnego odblokowania.', + ], + 'lock' => [ + 'lock' => 'Zablokuj', + 'unlock' => 'Odblokuj', + ], + 'download' => 'Pobierz', + 'rename' => [ + 'title' => 'Zmień nazwę', + 'new_name' => 'Nazwa kopii zapasowej', + 'notification_success' => 'Nazwa kopii zapasowej została zmieniona', + ], + 'restore' => [ + 'title' => 'Przywróć', + 'helper' => 'Twój serwer zostanie zatrzymany. Nie będziesz w stanie kontrolować stanu zasilania, uzyskać dostępu do menedżera plików lub utworzyć dodatkowe kopie zapasowe do czasu zakończenia tego procesu.', + 'delete_all' => 'Usunąć wszystkie pliki przed przywróceniem kopii zapasowej?', + 'notification_started' => 'Przywracanie kopii zapasowej', + 'notification_success' => 'Kopia zapasowa została przywrócona pomyślnie', + 'notification_fail' => 'Nie udało się przywrócić kopii zapasowej', + 'notification_fail_body_1' => 'Ten serwer nie jest obecnie w stanie umożliwiającym przywrócenie kopii zapasowej.', + 'notification_fail_body_2' => 'Ta kopia zapasowa nie może zostać przywrócona w tym momencie: nie została zakończona lub nie powiodła się.', + ], + 'delete' => [ + 'title' => 'Usuń kopię zapasową', + 'description' => 'Czy chcesz usunąć :backup?', + 'notification_success' => 'Kopia zapasowa została usunięta', + 'notification_fail' => 'Nie udało się usunąć kopii zapasowej', + 'notification_fail_body' => 'Połączenie z węzłem nie powiodło się. Spróbuj ponownie.', + ], + ], +]; diff --git a/lang/pl/server/console.php b/lang/pl/server/console.php new file mode 100644 index 0000000000..949f48ae3d --- /dev/null +++ b/lang/pl/server/console.php @@ -0,0 +1,43 @@ + 'Konsola', + 'command' => 'Wpisz polecenie...', + 'command_blocked' => 'Serwer offline...', + 'command_blocked_title' => 'Nie można wysłać polecenia, gdy serwer jest offline', + 'open_in_admin' => 'Otwórz w Adminie', + 'power_actions' => [ + 'start' => 'Uruchom', + 'stop' => 'Zatrzymaj', + 'restart' => 'Zrestartuj', + 'kill' => 'Zabij', + 'kill_tooltip' => 'Może to spowodować uszkodzenie lub utratę danych!', + ], + 'labels' => [ + 'cpu' => 'CPU:', + 'memory' => 'Pamięć:', + 'network' => 'Sieć:', + 'disk' => 'Dysk:', + 'name' => 'Nazwa', + 'status' => 'Status', + 'address' => 'Adres:', + 'unavailable' => 'Niedostępny', + ], + 'status' => [ + 'created' => 'Utworzono', + 'starting' => 'Uruchamianie', + 'running' => 'Uruchomiony', + 'restarting' => 'Restartowanie', + 'exited' => 'Zakończono', + 'paused' => 'Zatrzymano', + 'dead' => 'Martwy', + 'removing' => 'Usuwanie', + 'stopping' => 'Zatrzymywanie', + 'offline' => 'Offline', + 'missing' => 'Brakuje', + ], + 'websocket_error' => [ + 'title' => 'Nie można nawiązać połączenia z websocketem!', + 'body' => 'Więcej szczegółów znajdziesz w konsoli przeglądarki.', + ], +]; diff --git a/lang/pl/server/dashboard.php b/lang/pl/server/dashboard.php new file mode 100644 index 0000000000..f1e1f97a67 --- /dev/null +++ b/lang/pl/server/dashboard.php @@ -0,0 +1,28 @@ + 'Serwery', + 'list' => 'Lista serwerów', + 'tabs' => [ + 'my' => 'Moje serwery', + 'other' => 'Serwery innych', + 'all' => 'Wszystkie serwery', + ], + 'empty_own' => 'Nie posiadasz żadnych serwerów!', + 'empty_other' => 'Nie masz dostępu do żadnego serwera!', + + 'status' => 'Stan', + 'server' => 'Serwer', + 'resources' => 'Zasoby', + 'usage_limit' => 'Limit użycia: :resource', + + 'cpu' => 'Procesor', + 'memory' => 'Pamięć', + 'disk' => 'Dysk', + 'network' => 'Sieć', + 'none' => 'Brak', + 'loading' => 'Wczytywanie…', + + 'power_actions' => 'Akcja zasilania', + 'power_action_sent' => ':action wysłana do :name', +]; diff --git a/lang/pl/server/database.php b/lang/pl/server/database.php new file mode 100644 index 0000000000..414e794560 --- /dev/null +++ b/lang/pl/server/database.php @@ -0,0 +1,26 @@ + 'Bazy danych', + 'empty' => 'Brak baz danych', + 'create_database' => 'Utwórz bazę danych', + 'limit' => 'Osiągnięto limit baz danych', + 'viewing' => 'Przeglądanie: :database', + 'host' => 'Host', + 'database' => 'Baza danych', + 'username' => 'Nazwa użytkownika', + 'password' => 'Hasło', + 'remote' => 'Zdalne', + 'created_at' => 'Utworzono:', + 'name' => 'Nazwa bazy danych', + 'name_hint' => 'Pozostawienie pustego pola spowoduje automatyczne wygenerowanie losowej nazwy', + 'connections_from' => 'Połączenia z', + 'max_connections' => 'Maksymalna ilość połączeń', + 'database_host' => 'Host bazy danych', + 'database_host_select' => 'Wybierz hosta bazy danych', + 'jdbc' => 'Połączenie JDBC', + 'create_notification' => 'Utworzono :database', + 'create_notification_fail' => 'Nie udało się utworzyć :database', + 'delete_notification' => 'Usunięto :database', + 'delete_notification_fail' => 'Nie udało się usunąć :database', +]; diff --git a/lang/pl/server/file.php b/lang/pl/server/file.php new file mode 100644 index 0000000000..c858e2843e --- /dev/null +++ b/lang/pl/server/file.php @@ -0,0 +1,111 @@ + 'Pliki', + 'name' => 'Nazwa', + 'size' => 'Rozmiar', + 'modified_at' => 'Zmodyfikowano:', + 'actions' => [ + 'open' => 'Otwórz', + 'download' => 'Pobierz', + 'copy' => [ + 'title' => 'Kopiuj', + 'notification' => 'Plik skopiowany', + ], + 'upload' => [ + 'title' => 'Prześlij', + 'from_files' => 'Prześlij pliki', + 'from_url' => 'Prześlij z adresu URL', + 'url' => 'URL', + 'drop_files' => 'Upuść plik, aby przesłać', + 'success' => 'Pliki zostały przesłane pomyślnie', + 'failed' => 'Nie udało się przesłać plików', + 'header' => 'Przesyłanie plików...', + 'error' => 'Wystąpił błąd podczas przesyłania', + ], + 'rename' => [ + 'title' => 'Zmień nazwę', + 'file_name' => 'Nazwa pliku', + 'notification' => 'Zmieniono nazwę pliku', + ], + 'move' => [ + 'title' => 'Przenieś', + 'directory' => 'Katalog', + 'directory_hint' => 'Wprowadź nowy katalog względem aktualnego katalogu.', + 'new_location' => 'Nowa lokalizacja', + 'new_location_hint' => 'Wprowadź lokalizację tego pliku lub folderu, w stosunku do bieżącego katalogu.', + 'notification' => 'Plik przeniesiony', + 'bulk_notification' => ':count plików zostało przeniesionych do :directory', + ], + 'permissions' => [ + 'title' => 'Uprawnienia', + 'read' => 'Odczyt', + 'write' => 'Pisanie', + 'execute' => 'Wykonywanie', + 'owner' => 'Właściciel', + 'group' => 'Grupa', + 'public' => 'Publiczna', + 'notification' => 'Uprawnienia zmienione na :mode', + ], + 'archive' => [ + 'title' => 'Archiwum', + 'archive_name' => 'Nazwa archiwum', + 'notification' => 'Archiwum utworzone', + 'extension' => 'Rozszerzenie', + ], + 'unarchive' => [ + 'title' => 'Rozpakuj', + 'notification' => 'Rozpakowywanie zakończone', + ], + 'new_file' => [ + 'title' => 'Nowy plik', + 'file_name' => 'Nazwa nowego pliku', + 'syntax' => 'Podświetlanie składni', + 'create' => 'Utwórz', + ], + 'new_folder' => [ + 'title' => 'Nowy folder', + 'folder_name' => 'Nazwa nowego folderu', + ], + 'nested_search' => [ + 'title' => 'Wyszukiwanie zagnieżdżone', + 'search_term' => 'Wyszukiwana fraza', + 'search_term_placeholder' => 'Wprowadź wyszukiwaną frazę, np. *.txt', + 'search' => 'Wyszukaj', + 'search_for_term' => 'Wyszukiwanie :term', + ], + 'delete' => [ + 'notification' => 'Plik usunięty', + 'bulk_notification' => ':count plików zostało usuniętych', + ], + 'edit' => [ + 'title' => 'Edytowanie: :file', + 'save_close' => 'Zapisz & Zamknij', + 'save' => 'Zapisz', + 'cancel' => 'Anuluj', + 'notification' => 'Zapisano plik', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name jest zbyt duża!', + 'body' => 'Max to :max', + ], + 'file_not_found' => [ + 'title' => 'Nie znaleziono :name!', + ], + 'file_not_editable' => [ + 'title' => ':name jest katalogiem', + ], + 'file_already_exists' => [ + 'title' => ':name już istnieje!', + ], + 'files_node_error' => [ + 'title' => 'Nie można załadować plików!', + ], + 'pelicanignore' => [ + 'title' => 'Edytujesz plik .pelicanignore!', + 'body' => 'Wszelkie pliki lub katalogi wymienione w tym miejscu zostaną wykluczone z kopii zapasowych. Symbole wieloznaczne są obsługiwane za pomocą gwiazdki (*).
Można unieważnić poprzednią regułę, dodając przed nią wykrzyknik (!).', + ], + ], +]; diff --git a/lang/pl/server/network.php b/lang/pl/server/network.php new file mode 100644 index 0000000000..58847b354f --- /dev/null +++ b/lang/pl/server/network.php @@ -0,0 +1,17 @@ + 'Sieć', + 'add' => 'Dodaj alokację', + 'limit' => 'Osiągnięto limit alokacji', + 'address' => 'Adres', + 'port' => 'Port', + 'notes' => 'Notatki', + 'no_notes' => 'Brak Notatek', + 'make_primary' => 'Ustaw jako główny', + 'primary' => 'Podstawowy', + 'make' => 'Zrób', + 'delete' => 'Usuń', + 'locked' => 'Zablokowany?', + 'locked_helper' => 'Zablokowane alokacje mogą zostać usunięte tylko przez administratorów', +]; diff --git a/lang/pl/server/schedule.php b/lang/pl/server/schedule.php new file mode 100644 index 0000000000..8df66c8f9f --- /dev/null +++ b/lang/pl/server/schedule.php @@ -0,0 +1,121 @@ + 'Harmonogramy', + 'new' => 'Nowy Harmonogram', + 'edit' => 'Edytuj Harmonogram', + 'save' => 'Zapisz Harmonogram', + 'delete' => 'Usuń Harmonogram', + 'import' => 'Importuj harmonogram', + 'export' => 'Eksportuj harmonogram', + 'name' => 'Nazwa', + 'cron' => 'Cron', + 'status' => 'Stan', + 'schedule_status' => [ + 'inactive' => 'Nieaktywny', + 'processing' => 'Przetwarzanie', + 'active' => 'Aktywny', + ], + 'no_tasks' => 'Brak Zadań', + 'run_now' => 'Uruchom teraz', + 'online_only' => 'Tylko gdy Online', + 'last_run' => 'Ostatnie uruchomienie', + 'next_run' => 'Następne uruchomienie', + 'never' => 'nigdy', + 'cancel' => 'Anuluj', + + 'only_online' => 'Tylko gdy serwer jest online?', + 'only_online_hint' => 'Wykonaj ten harmonogram tylko wtedy, gdy serwer jest uruchomiony.', + 'enabled' => 'Włączyć harmonogram?', + 'enabled_hint' => 'Ten harmonogram zostanie wykonany automatycznie, jeśli jest włączony.', + + 'cron_body' => 'Pamiętaj, że dane wejściowe cron zawsze zakładają czas UTC.', + 'cron_timezone' => 'Następne uruchomienie w twojej strefie czasowej (:timezone): :next_run ', + + 'invalid' => 'Nieprawidłowy', + + 'time' => [ + 'minute' => 'Minut', + 'hour' => 'Godzin', + 'day' => 'Dni', + 'week' => 'Tydzień', + 'month' => 'Miesiąc', + 'day_of_month' => 'Dzień miesiąca', + 'day_of_week' => 'Dzień tygodnia', + + 'hourly' => 'Co godzinę', + 'daily' => 'Codziennie', + 'weekly_mon' => 'Tygodniowo (poniedziałek)', + 'weekly_sun' => 'Tygodniowo (niedziela)', + 'monthly' => 'Co miesiąc', + 'every_min' => 'Co x minut', + 'every_hour' => 'Co x godzin', + 'every_day' => 'Co x dni', + 'every_week' => 'Co x tygodni', + 'every_month' => 'Co x miesięcy', + 'every_day_of_week' => 'Każdego x dnia tygodnia', + + 'every' => 'Co', + 'minutes' => 'Minuty', + 'hours' => 'Godziny', + 'days' => 'Dni', + 'months' => 'Miesięcy', + + 'monday' => 'Poniedziałek', + 'tuesday' => 'Wtorek', + 'wednesday' => 'Środa', + 'thursday' => 'Czwartek', + 'friday' => 'Piątek', + 'saturday' => 'Sobota', + 'sunday' => 'Niedziela', + ], + + 'tasks' => [ + 'title' => 'Zadania', + 'create' => 'Utwórz zadanie', + 'limit' => 'Osiągnięto limit zadań', + 'action' => 'Działania', + 'payload' => 'Ładunek', + 'no_payload' => 'Brak danych', + 'time_offset' => 'Przesunięcie czasu', + 'first_task' => 'Pierwsze zadanie', + 'seconds' => 'Sekundy', + 'continue_on_failure' => 'Kontynuuj przy niepowodzeniu', + + 'actions' => [ + 'title' => 'Działania', + 'power' => [ + 'title' => 'Wyślij akcję zasilania', + 'action' => 'Akcja zasilania', + 'start' => 'Uruchom', + 'stop' => 'Zatrzymaj', + 'restart' => 'Zrestartuj', + 'kill' => 'Zabij', + ], + 'command' => [ + 'title' => 'Wyślij polecenie', + 'command' => 'Polecenie', + ], + 'backup' => [ + 'title' => 'Utwórz kopię zapasową', + 'files_to_ignore' => 'Pliki do ignorowania', + ], + 'delete_files' => [ + 'title' => 'Usuń pliki', + 'files_to_delete' => 'Pliki do usunięcia', + ], + ], + ], + + 'notification_invalid_cron' => 'Podane dane crona nie pasują do poprawnego wyrażenia', + + 'import_action' => [ + 'file' => 'Plik', + 'url' => 'Adres URL', + 'schedule_help' => 'To powinien być plik .json w formacie raw (schedule-daily-restart.json).', + 'url_help' => 'Adresy URL muszą wskazywać bezpośrednio na plik .json w formacie raw.', + 'add_url' => 'Nowy adres URL', + 'import_failed' => 'Import nie powiódł się', + 'import_success' => 'Import powiódł się', + ], +]; diff --git a/lang/pl/server/setting.php b/lang/pl/server/setting.php new file mode 100644 index 0000000000..2713b71c0c --- /dev/null +++ b/lang/pl/server/setting.php @@ -0,0 +1,55 @@ + 'Ustawienia', + 'server_info' => [ + 'title' => 'Informacje o serwerze', + 'information' => 'Informacje', + 'name' => 'Nazwa serwera', + 'server_name' => 'Nazwa serwera: :name', + 'notification_name' => 'Zaktualizowano nazwę serwera', + 'description' => 'Opis serwera', + 'notification_description' => 'Zaktualizowano opis serwera', + 'failed' => 'Nie powiodło się', + 'uuid' => 'UUID serwera', + 'uuid_short' => 'ID Serwera', + 'node_name' => 'Nazwa węzła', + 'icon' => [ + 'upload' => 'Prześlij ikonę', + 'tooltip' => 'Używanie ikony Egg\'a', + 'updated' => 'Ikona serwera została zaktualizowana', + 'deleted' => 'Ikona serwera została usunięta', + ], + 'limits' => [ + 'title' => 'Limity', + 'unlimited' => 'Nieograniczone', + 'of' => 'z', + 'cpu' => 'CPU', + 'memory' => 'Pamięć', + 'disk' => 'Miejsce na dysku', + 'backups' => 'Kopie zapasowe', + 'databases' => 'Bazy danych', + 'allocations' => 'Alokacje', + 'no_allocations' => 'Brak dodatkowych alokacji', + ], + 'sftp' => [ + 'title' => 'Informacje o SFTP', + 'connection' => 'Połączenie', + 'action' => 'Połącz z SFTP', + 'username' => 'Nazwa użytkownika', + 'password' => 'Hasło', + 'password_body' => 'Twoje hasło SFTP jest takie samo jak hasło używane do uzyskania dostępu do tego panelu.', + ], + ], + 'reinstall' => [ + 'title' => 'Zainstaluj serwer ponownie', + 'body' => 'Ponowna instalacja serwera zatrzyma go, a następnie uruchomi skrypt instalacyjny, który początkowo go ustawił.', + 'body2' => 'Niektóre pliki mogą zostać usunięte lub zmodyfikowane podczas tego procesu, wykonaj kopię zapasową swoich danych przed kontynuowaniem.', + 'action' => 'Zainstaluj ponownie', + 'modal' => 'Czy na pewno chcesz przeinstalować serwer?', + 'modal_description' => 'Niektóre pliki mogą zostać usunięte lub zmodyfikowane podczas tego procesu, wykonaj kopię zapasową swoich danych przed kontynuowaniem.', + 'yes' => 'Tak, zainstaluj ponownie', + 'notification_start' => 'Rozpoczęto reinstalację', + 'notification_fail' => 'Reinstalacja nie powiodła się', + ], +]; diff --git a/lang/pl/server/startup.php b/lang/pl/server/startup.php new file mode 100644 index 0000000000..7f9030150e --- /dev/null +++ b/lang/pl/server/startup.php @@ -0,0 +1,17 @@ + 'Uruchamianie', + 'command' => 'Komenda startowa', + 'notification_startup' => 'Komenda startowa została zaktualizowana', + 'notification_startup_body' => 'Uruchom ponownie serwer, aby użyć nowej komendy startowej.', + 'enable_preview' => 'Włącz Podgląd', + 'disable_preview' => 'Wyłącz Podgląd', + 'docker_image' => 'Obraz dockera', + 'notification_docker' => 'Zdjęcie Dockera zaktualizowane', + 'notification_docker_body' => 'Uruchom ponownie serwer, aby użyć nowego obrazu.', + 'variables' => 'Zmienne serwera', + 'update' => 'Zaktualizowano: :variable', + 'fail' => 'Nie powiodło się: :variable', + 'validation_fail' => 'Walidacja nie powiodła się: :variable', +]; diff --git a/lang/pl/server/user.php b/lang/pl/server/user.php new file mode 100644 index 0000000000..8fb0903b37 --- /dev/null +++ b/lang/pl/server/user.php @@ -0,0 +1,73 @@ + 'Użytkownicy', + 'username' => 'Nazwa użytkownika', + 'email' => 'E-mail', + 'assign_all' => 'Przypisz wszystkie', + 'invite_user' => 'Zaproś użytkownika', + 'action' => 'Zaproś', + 'remove' => 'Usuń Użytkownika', + 'edit' => 'Edytuj użytkownika', + 'editing' => 'Edytowanie :user', + 'delete' => 'Usuń użytkownika', + 'notification_add' => 'Użytkownik zaproszony!', + 'notification_edit' => 'Użytkownik zaktualizowany!', + 'notification_delete' => 'Użytkownik usunięty!', + 'notification_failed' => 'Nie udało się zaprosić użytkownika!', + 'permissions' => [ + 'title' => 'Uprawnienia', + 'activity_desc' => 'Uprawnienia kontrolujące dostęp użytkownika do dzienników aktywności serwera.', + 'startup_desc' => 'Uprawnienia kontrolujące możliwość przeglądania parametrów uruchamiania tego serwera.', + 'settings_desc' => 'Uprawnienia kontrolujące możliwość modyfikowania ustawień tego serwera.', + 'control_desc' => 'Uprawnienia kontrolujące zdolność użytkownika do kontrolowania stanu zasilania serwera lub wysyłania poleceń.', + 'user_desc' => 'Uprawnienia umożliwiające użytkownikowi zarządzanie innymi podużytkownikami na serwerze. Nigdy nie będą w stanie edytować własnego konta ani przydzielać uprawnień, których sami nie posiadają.', + 'file_desc' => 'Uprawnienia kontrolujące zdolność użytkownika do modyfikowania systemu plików dla tego serwera.', + 'allocation_desc' => 'Uprawnienia kontrolujące zdolność użytkownika do modyfikowania alokacji portów dla tego serwera.', + 'database_desc' => 'Uprawnienia kontrolujące dostęp użytkownika do zarządzania bazą danych dla tego serwera.', + 'backup_desc' => 'Uprawnienia kontrolujące zdolność użytkownika do generowania i zarządzania kopiami zapasowymi serwera.', + 'schedule_desc' => 'Uprawnienia kontrolujące dostęp użytkownika do zarządzania harmonogramem dla tego serwera.', + 'startup_read' => 'Pozwala użytkownikowi na wyświetlanie zmiennych uruchamiania serwera.', + 'startup_update' => 'Pozwala użytkownikowi modyfikować zmienne uruchamiania serwera.', + 'startup_docker_image' => 'Pozwala użytkownikowi modyfikować obraz dockera używany podczas uruchamiania serwera.', + 'settings_reinstall' => 'Umożliwia użytkownikowi ponowną instalację tego serwera.', + 'settings_rename' => 'Umożliwia użytkownikowi zmianę nazwy oraz opisu tego serwera.', + 'settings_description' => 'Pozwala użytkownikowi na zmianę opisu tego serwera.', + 'activity_read' => 'Umożliwia użytkownikowi usunięcie harmonogramu zadań serwera.', + 'websocket_connect' => 'Umożliwia użytkownikowi dostęp do websocket dla tego serwera.', + 'control_console' => 'Pozwala użytkownikowi wysyłać dane do konsoli serwera.', + 'control_start' => 'Pozwala użytkownikowi na uruchomienie instancji serwera.', + 'control_stop' => 'Pozwala użytkownikowi zatrzymać instancję serwera.', + 'control_restart' => 'Pozwala użytkownikowi na ponowne uruchomienie serwera.', + 'control_kill' => 'Pozwala użytkownikowi na natychmiastowe zatrzymanie serwera.', + 'user_create' => 'Pozwala użytkownikowi na tworzenie nowych kont użytkowników dla serwera.', + 'user_read' => 'Pozwala użytkownikowi na wyświetlanie użytkowników powiązanych z tym serwerem.', + 'user_update' => 'Pozwala użytkownikowi modyfikować innych użytkowników powiązanych z tym serwerem.', + 'user_delete' => 'Pozwala użytkownikowi na usunięcie innych użytkowników powiązanych z tym serwerem.', + 'file_create' => 'Zezwala użytkownikowi na tworzenie nowych plików i katalogów.', + 'file_read' => 'Pozwala użytkownikowi na oglądanie zawartości katalogu, ale nie przeglądanie zawartości lub pobieranie plików.', + 'file_read_content' => 'Pozwala użytkownikowi na oglądanie zawartości danego pliku. Pozwoli to również użytkownikowi na pobieranie plików.', + 'file_update' => 'Pozwala użytkownikowi aktualizować pliki i foldery powiązane z serwerem.', + 'file_delete' => 'Pozwala użytkownikowi na usuwanie plików i katalogów.', + 'file_archive' => 'Pozwala użytkownikowi na tworzenie archiwów plików i rozpakowywanie istniejących archiwów.', + 'file_sftp' => 'Umożliwia użytkownikowi wykonywanie powyższych czynności na plikach przy użyciu klienta SFTP.', + 'allocation_read' => 'Pozwala użytkownikowi na oglądanie wszystkich alokacji obecnie przypisanych do tego serwera. Użytkownicy z dowolnym poziomem dostępu do tego serwera mogą zawsze przeglądać pierwotną alokację.', + 'allocation_update' => 'Pozwala użytkownikowi na zmianę przydziału serwera podstawowego i załączenie notatek do każdej alokacji.', + 'allocation_delete' => 'Umożliwia użytkownikowi usunięcie harmonogramu zadań serwera.', + 'allocation_create' => 'Pozwala użytkownikowi na przypisanie dodatkowych alokacji do serwera.', + 'database_create' => 'Zezwala użytkownikowi na tworzenie nowej bazy danych serwera.', + 'database_read' => 'Pozwala użytkownikowi na przeglądanie baz danych serwera.', + 'database_update' => 'Zezwala użytkownikowi na dokonywanie modyfikacji w bazie danych. Jeśli użytkownik nie ma uprawnień "Zobacz hasło", nie będzie mógł modyfikować hasła.', + 'database_delete' => 'Zezwala użytkownikowi na usunięcie instancji bazy danych.', + 'database_view_password' => 'Zezwala użytkownikowi na wyświetlanie hasła do bazy danych w systemie.', + 'schedule_create' => 'Umożliwia użytkownikowi utworzenie nowego harmonogramu zadań dla serwera.', + 'schedule_read' => 'Umożliwia użytkownikowi przeglądanie harmonogramów zadań serwera.', + 'schedule_update' => 'Zezwala użytkownikowi na dokonywanie modyfikacji istniejącego harmonogramu zadań serwera.', + 'schedule_delete' => 'Umożliwia użytkownikowi usunięcie harmonogramu zadań serwera.', + 'backup_create' => 'Umożliwia użytkownikowi utworzenie nowego harmonogramu zadań dla serwera.', + 'backup_read' => 'Pozwala użytkownikowi na oglądanie wszystkich kopii zapasowych, które istnieją dla tego serwera.', + 'backup_delete' => 'Pozwala użytkownikowi na usuwanie kopii zapasowych z systemu.', + 'backup_download' => 'Pozwala użytkownikowi na pobranie kopii zapasowej serwera. Niebezpieczeństwo: umożliwia to użytkownikowi dostęp do wszystkich plików dla serwera w kopii zapasowej.', + 'backup_restore' => 'Pozwala użytkownikowi na pobranie kopii zapasowej serwera. Niebezpieczeństwo: umożliwia to użytkownikowi dostęp do wszystkich plików dla serwera w kopii zapasowej.', + ], +]; diff --git a/lang/pl/server/users.php b/lang/pl/server/users.php deleted file mode 100644 index a414f250bf..0000000000 --- a/lang/pl/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Umożliwia dostęp do websocket dla tego serwera.', - 'control_console' => 'Pozwala użytkownikowi na wysyłanie danych do konsoli serwera.', - 'control_start' => 'Pozwala użytkownikowi na uruchomienie serwera.', - 'control_stop' => 'Pozwala użytkownikowi na zatrzymanie serwera.', - 'control_restart' => 'Pozwala użytkownikowi na ponowne uruchomienie serwera.', - 'control_kill' => 'Pozwala użytkownikowi na natychmiastowe zatrzymanie serwera.', - 'user_create' => 'Pozwala użytkownikowi na tworzenie nowych kont użytkowników dla serwera.', - 'user_read' => 'Pozwala użytkownikowi na wyświetlanie użytkowników powiązanych z tym serwerem.', - 'user_update' => 'Pozwala użytkownikowi modyfikować innych użytkowników powiązanych z tym serwerem.', - 'user_delete' => 'Pozwala użytkownikowi na usunięcie innych użytkowników powiązanych z tym serwerem.', - 'file_create' => 'Zezwala użytkownikowi na tworzenie nowych plików i katalogów.', - 'file_read' => 'Pozwala użytkownikowi na wyświetlanie plików i folderów powiązanych z tą instancją serwera, a także na wyświetlanie ich zawartości.', - 'file_update' => 'Pozwala użytkownikowi aktualizować pliki i foldery powiązane z serwerem.', - 'file_delete' => 'Pozwala użytkownikowi na usuwanie plików i katalogów.', - 'file_archive' => 'Pozwala użytkownikowi na tworzenie archiwów plików i rozpakowywanie istniejących archiwów.', - 'file_sftp' => 'Umożliwia użytkownikowi wykonywanie powyższych czynności na plikach przy użyciu klienta SFTP.', - 'allocation_read' => 'Umożliwia dostęp do stron zarządzania alokacją serwera.', - 'allocation_update' => 'Zezwala użytkownikowi na modyfikowanie alokacji serwera.', - 'database_create' => 'Pozwala użytkownikowi na tworzenie nowej bazy danych.', - 'database_read' => 'Zezwala użytkownikowi na przeglądanie baz danych serwera.', - 'database_update' => 'Zezwala użytkownikowi na dokonywanie modyfikacji w bazie danych. Jeśli użytkownik nie ma uprawnień "View Password", nie będzie mógł modyfikować hasła.', - 'database_delete' => 'Zezwala użytkownikowi na usunięcie instancji bazy danych.', - 'database_view_password' => 'Zezwala użytkownikowi na wyświetlanie hasła do bazy danych w systemie.', - 'schedule_create' => 'Umożliwia użytkownikowi utworzenie nowego harmonogramu zadań dla serwera.', - 'schedule_read' => 'Umożliwia użytkownikowi przeglądanie harmonogramów zadań serwera.', - 'schedule_update' => 'Zezwala użytkownikowi na dokonywanie modyfikacji istniejącego harmonogramu zadań serwera.', - 'schedule_delete' => 'Umożliwia użytkownikowi usunięcie harmonogramu zadań serwera.', - ], -]; diff --git a/lang/pl/strings.php b/lang/pl/strings.php deleted file mode 100644 index 3638ed4712..0000000000 --- a/lang/pl/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-mail', - 'email_address' => 'Adres e-mail', - 'user_identifier' => 'Nazwa użytkownika lub e-mail', - 'password' => 'Hasło', - 'new_password' => 'Nowe hasło', - 'confirm_password' => 'Potwierdź nowe hasło', - 'login' => 'Logowanie', - 'home' => 'Strona główna', - 'servers' => 'Serwery', - 'id' => 'ID', - 'name' => 'Nazwa', - 'node' => 'Węzeł', - 'connection' => 'Połączenie', - 'memory' => 'Pamięć', - 'cpu' => 'Procesor', - 'disk' => 'Dysk', - 'status' => 'Stan', - 'search' => 'Wyszukaj', - 'suspended' => 'Zawieszony', - 'account' => 'Konto', - 'security' => 'Bezpieczeństwo', - 'ip' => 'Adres IP', - 'last_activity' => 'Ostatnia aktywność', - 'revoke' => 'Unieważnij', - '2fa_token' => 'Token uwierzytelniania', - 'submit' => 'Zatwierdź', - 'close' => 'Zamknij', - 'settings' => 'Ustawienia', - 'configuration' => 'Konfiguracja', - 'sftp' => 'SFTP', - 'databases' => 'Bazy danych', - 'memo' => 'Notatka', - 'created' => 'Data utworzenia', - 'expires' => 'Wygasa', - 'public_key' => 'Token', - 'api_access' => 'Dostęp do API', - 'never' => 'nigdy', - 'sign_out' => 'Wyloguj się', - 'admin_control' => 'Ustawienia administratora', - 'required' => 'Wymagane', - 'port' => 'Port', - 'username' => 'Użytkownik', - 'database' => 'Baza danych', - 'new' => 'Nowy', - 'danger' => 'Niebezpieczeństwo', - 'create' => 'Utwórz', - 'select_all' => 'Zaznacz wszystko', - 'select_none' => 'Odznacz wszystko', - 'alias' => 'Alias', - 'primary' => 'Podstawowy', - 'make_primary' => 'Ustaw jako główny', - 'none' => 'Brak', - 'cancel' => 'Anuluj', - 'created_at' => 'Data utworzenia', - 'action' => 'Akcje', - 'data' => 'Data', - 'queued' => 'W kolejce', - 'last_run' => 'Ostatnie uruchomienie', - 'next_run' => 'Następne uruchomienie', - 'not_run_yet' => 'Jeszcze nie uruchomiono', - 'yes' => 'Tak', - 'no' => 'Nie', - 'delete' => 'Usuń', - '2fa' => 'Uwierzytelnianie dwustopniowe', - 'logout' => 'Wyloguj się', - 'admin_cp' => 'Panel administracyjny', - 'optional' => 'Opcjonalnie', - 'read_only' => 'Tylko do odczytu', - 'relation' => 'Relacja', - 'owner' => 'Właściciel', - 'admin' => 'Administrator', - 'subuser' => 'Podużytkownik', - 'captcha_invalid' => 'Podany kod captcha jest nieprawidłowy.', - 'tasks' => 'Zadania', - 'seconds' => 'Sekundy', - 'minutes' => 'Minuty', - 'under_maintenance' => 'Przerwa Techniczna', - 'days' => [ - 'sun' => 'Niedziela', - 'mon' => 'Poniedziałek', - 'tues' => 'Wtorek', - 'wed' => 'Środa', - 'thurs' => 'Czwartek', - 'fri' => 'Piątek', - 'sat' => 'Sobota', - ], - 'last_used' => 'Ostatnio używane', - 'enable' => 'Włącz', - 'disable' => 'Wyłącz', - 'save' => 'Zapisz', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/pl/validation.php b/lang/pl/validation.php index e507ecae60..db530b4b3a 100644 --- a/lang/pl/validation.php +++ b/lang/pl/validation.php @@ -13,77 +13,72 @@ */ 'accepted' => ':attribute musi zostać zaakceptowany.', - 'active_url' => ':attribute jest nieprawidłowym adresem URL.', - 'after' => ':attribute musi być późniejszą datą w stosunku do :date.', - 'after_or_equal' => ':attribute musi być datą późniejszą lub tą samą co :date.', + 'active_url' => ':attribute nie jest poprawnym adresem URL', + 'after' => ':attribute musi być datą późniejszą niż :date.', + 'after_or_equal' => ':attribute musi być datą późniejszą lub równą :date.', 'alpha' => ':attribute może zawierać wyłącznie litery.', 'alpha_dash' => ':attribute może zawierać tylko litery, cyfry i myślniki.', - 'alpha_num' => ':attribute może zawierać jedynie litery oraz cyfry.', + 'alpha_num' => ':attribute może zawierać wyłącznie litery i cyfry.', 'array' => ':attribute musi być array\'em.', - 'before' => ':attribute musi być datą przed :date.', - 'before_or_equal' => ':attribute musi być datą przed albo równą dacie :date.', + 'before' => ':attribute musi być datą wcześniejszą niż :date.', + 'before_or_equal' => ':attribute musi być datą wcześniejszą lub równą :date.', 'between' => [ - 'numeric' => ':attribute musi być w zakresie od :min do :max.', - 'file' => 'Waga :attribute musi wynosić pomiędzy :min, a :max kilobajtów.', - 'string' => 'Długość :attribute musi wynosić pomiędzy :min, a :max znaków', - 'array' => ':attribute musi zawierać pomiędzy :min a :max elementów.', + 'numeric' => ':attribute musi wynosić między :min i :max.', + 'file' => ':attribute musi wynosić między :min a :max kilobajtów.', + 'string' => ':attribute musi wynosić między :min a :max znakami.', + 'array' => ':attribute musi mieć między :min a :max elementów.', ], - 'boolean' => ':attribute musi być true lub false.', - 'confirmed' => 'Potwierdzenie :attribute nie jest zgodne.', - 'date' => ':attribute nie jest prawidłową datą.', - 'date_format' => ':attribute musi mieć format :format.', + + 'confirmed' => ':attribute nie pasuje.', + 'date' => ':attribute nie jest poprawną datą.', + 'date_format' => ':attribute nie jest zgodny z formatem :format.', 'different' => ':attribute i :other muszą się różnić.', - 'digits' => ':attribute musi składać się z :digits cyfr.', - 'digits_between' => ':attribute musi mieć od :min do :max cyfr.', - 'dimensions' => ':attribute ma niepoprawne wymiary.', - 'distinct' => 'Pole :attribute zawiera zduplikowaną wartość.', - 'email' => ':attribute musi być prawidłowym adresem email.', - 'exists' => 'Wybrany :attribute jest nieprawidłowy.', - 'file' => ':attrivute musi być plikiem.', + 'digits' => ':attribute musi wynosić :digits cyfr.', + 'digits_between' => ':attribute musi wynosić między :min a :max cyfr.', + 'dimensions' => ':attribute ma niepoprawne wymiary obrazu.', + + 'email' => ':attribute musi być poprawnym adresem e-mail.', + + 'file' => 'Wybrany :attribute musi być plikiem.', 'filled' => 'Pole :attribute jest wymagane.', - 'image' => ':attribute musi być obrazem.', - 'in' => 'Wybrany :attribute jest nieprawidłowy.', + 'image' => 'Wybrany :attribute musi być obrazem.', + 'in_array' => 'Pole :attribute nie istnieje w :other.', - 'integer' => ':attribute musi być liczbą.', - 'ip' => ':attribute musi być prawidłowym adresem IP.', - 'json' => ':attribute musi być prawidłowym ciągiem JSON.', + 'integer' => ':attribute musi być liczbą całkowitą.', + 'ip' => ':attribute musi być poprawnym adresem IP.', + 'json' => ':attribute musi być poprawnym ciągiem JSON.', 'max' => [ - 'numeric' => ':attribute nie może być większa niż :max.', - 'file' => 'Wielkość :attribute nie może być większa niż :max kilobajtów.', - 'string' => ':attribute nie może być dłuższy niż :max znaków.', + 'numeric' => ':attribute nie może być większy niż :max.', + 'file' => ':attribute nie może być większy niż :max kilobajtów.', + 'string' => ':attribute nie może być większe niż :max znaków.', 'array' => ':attribute nie może mieć więcej niż :max elementów.', ], 'mimes' => ':attribute musi być plikiem typu: :values.', 'mimetypes' => ':attribute musi być plikiem typu: :values.', 'min' => [ - 'numeric' => ':attribute musi mieć co najmniej :min.', - 'file' => ':attribute musi mieć co najmniej :min kilobajtów.', - 'string' => ':attribute musi mieć przynajmniej :min znaków.', + 'numeric' => ':attribute musi wynosić co najmniej :min.', + 'file' => ':attribute musi wynosić co najmniej :min kilobajtów.', + 'string' => ':attribute musi mieć co najmniej :min znaków.', 'array' => ':attribute musi mieć co najmniej :min elementów.', ], - 'not_in' => 'Wybrany :attribute jest nieprawidłowy.', + 'numeric' => ':attribute musi być liczbą.', - 'present' => 'Pole :attribute musi być wypełnione.', - 'regex' => 'Format :attribute jest niewłaściwy.', - 'required' => 'Pole :attribute jest wymagane.', - 'required_if' => 'Pole :attribute jest wymagane, gdy :other jest :value.', - 'required_unless' => ':attribute jest wymagany jeżeli :other nie znajduje się w :values.', - 'required_with' => 'Pole :attribute jest wymagane gdy :values jest obecny.', - 'required_with_all' => 'Pole :attribute jest wymagane gdy :values jest obecny.', - 'required_without' => 'Pole :attribute jest wymagane gdy :values nie jest podana.', - 'required_without_all' => 'Pole :attribute jest wymagane, gdy żadna z :values nie jest obecna.', - 'same' => 'Pole :attribute oraz :other muszą być takie same.', + + 'regex' => 'Format :attribute jest nieprawidłowy.', + + 'required_with_all' => 'Pole :attribute jest wymagane, gdy :values jest obecne.', + + 'same' => ':attribute i :other muszą być zgodne.', 'size' => [ - 'numeric' => 'Atrybut :attribute musi mieć wartość :size.', - 'file' => 'Pole :attribute musi mieć :size kilobajtów.', + 'numeric' => ':attribute musi mieć :size.', + 'file' => ':attribute musi wynosić :size kilobajty.', 'string' => ':attribute musi mieć :size znaków.', 'array' => ':attribute musi zawierać :size elementów.', ], - 'string' => ':attribute musi być typu string.', - 'timezone' => ':attribute musi być prawidłową strefą.', - 'unique' => ':attribute został już pobrany.', - 'uploaded' => 'Nie udało się przesłać :attribute.', - 'url' => 'Format :attribute jest niewłaściwy.', + 'string' => ':attribute musi być ciągiem znaków.', + 'timezone' => ':attribute musi być poprawną strefą.', + + 'url' => 'Format :attribute jest niepoprawny.', /* |-------------------------------------------------------------------------- @@ -101,6 +96,6 @@ // Internal validation logic for Panel 'internal' => [ 'variable_value' => 'Zmienna :env', - 'invalid_password' => 'Podane hasło jest nieprawidłowe.', + 'invalid_password' => 'Hasło podane dla tego konta jest nieprawidłowe.', ], ]; diff --git a/lang/pt/activity.php b/lang/pt/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/pt/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/pt/admin/databasehost.php b/lang/pt/admin/databasehost.php new file mode 100644 index 0000000000..66fe65256e --- /dev/null +++ b/lang/pt/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Servidores de Banco de Dados', + 'model_label' => 'Servidor de Banco de Dados', + 'model_label_plural' => 'Servidores Banco de Dados', + 'table' => [ + 'database' => 'Banco de Dados', + 'name' => 'Nome', + 'host' => 'Servidor', + 'port' => 'Porta', + 'name_helper' => 'Deixar essa opção em branco irá gerar um nome aleatório.', + 'username' => 'Nome de Usuário', + 'password' => 'Senha', + 'remote' => 'Conexões de', + 'remote_helper' => 'De onde devem ser permitidas as conexões. Deixar em branco para permitir conexões a partir de qualquer local.', + 'max_connections' => 'Conexões máximas', + 'created_at' => 'Criado em', + 'connection_string' => 'Ligação de conexão JDBC', + ], + 'error' => 'Erro ao ligar ao servidor', + 'host' => 'Servidor', + 'host_help' => 'O endereço IP ou o nome de domínio que deve ser utilizado quando se tenta ligar a este servidor MySQL a partir deste Painel para criar novas bases de dados.', + 'port' => 'Porta', + 'port_help' => 'A porta em que o MySQL está a ser executado para este servidor.', + 'max_database' => 'Máximo de bases de dados', + 'max_databases_help' => 'O número máximo de bases de dados que podem ser criadas neste servidor. Se o limite for atingido, não podem ser criadas novas bases de dados neste servidor. Em branco é ilimitado.', + 'display_name' => 'Nome de exibição', + 'display_name_help' => 'Um identificador curto utilizado para distinguir esta localização de outras. Deve ter entre 1 e 60 caracteres, por exemplo, pt.lx.01.', + 'username' => 'Nome de utilizador', + 'username_help' => 'O nome de utilizador de uma conta que tem permissões suficientes para criar novos utilizadores e bases de dados no sistema.', + 'password' => 'Senha', + 'password_help' => 'A palavra-passe do utilizador da base de dados.', + 'linked_nodes' => 'Nós lincado', + 'linked_nodes_help' => 'Esta definição só é predefinida para este servidor de base de dados quando se adiciona uma base de dados a um servidor no Node selecionado.', + 'connection_error' => 'Erro ao ligar ao servidor da base de dados', + 'no_database_hosts' => 'Sem servidores de bases de dados', + 'no_nodes' => 'Sem Nós', + 'delete_help' => 'O servidor da base de dados tem bases de dados', + 'unlimited' => 'Sem limite', + 'anywhere' => 'Qualquer lugar', + + 'rotate' => 'Alterar', + 'rotate_password' => 'Alterar palavra-passe', + 'rotated' => 'Palavra-passe alterada', + 'rotate_error' => 'Falha na alteração da palavra-passe', + 'databases' => 'Bases de Dados', + + 'setup' => [ + 'preparations' => 'Preparações', + 'database_setup' => 'Configurações do Banco de Dados', + 'panel_setup' => 'Configuração do Painel', + + 'note' => 'No momento, apenas bancos de dados MySQL/ MariaDB são suportados!', + 'different_server' => 'O painel e o banco de dados não estão no mesmo servidor?', + + 'database_user' => 'Utilizador do Banco de Dados', + 'cli_login' => 'Use mysql -u root -p para acessar o MySQL CLI.', + 'command_create_user' => 'Comando para criar o utilizador', + 'command_assign_permissions' => 'Comando para atribuir permissões', + 'cli_exit' => 'Para sair do mysql cli execute exit.', + 'external_access' => 'Acesso externo', + 'allow_external_access' => ' +

Talvez você precise permitir o acesso externo a essa instância do MySQL para permitir que os servidores se conectem a ele.

+
+

Para fazer isso, abra my.cnf, que muda de localização dependendo do seu sistema operacional e como o MySQL foi instalado. Você pode digitar find /etc -iname my.cnf para localizá-lo.

+
+

Abra my.cnf, adicione o texto abaixo ao final do arquivo e salve-o:
+ [mysqld]
bind-address=0.0.0.0

+
+

Reinicie o MySQL/ MariaDB para aplicar essas alterações. Isso irá substituir a configuração padrão do MySQL, que por padrão só aceitará solicitações de localhost. Atualizar isso permitirá conexões em todas as interfaces e, portanto, conexões externas. Certifique-se de permitir a porta do MySQL (padrão 3306) no seu firewall.

', + ], +]; diff --git a/lang/pt/admin/eggs.php b/lang/pt/admin/eggs.php deleted file mode 100644 index 8f8e5e8cdd..0000000000 --- a/lang/pt/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'As eggs e as suas variáveis de ambiente foram importadas com sucesso.', - 'updated_via_import' => 'Essa egg foi atualizada usando o arquivo fornecido.', - 'deleted' => 'A egg solicitada foi removida com sucesso do Painel.', - 'updated' => 'As configurações da egg foi atualizada com sucesso.', - 'script_updated' => 'O script de instação da egg foi atualizado e poderá ser executado quando os servidores forem instalados.', - 'egg_created' => 'Um novo egg \'foi criado com sucesso. Reinicie os daemons em execução para aplicar essa nova egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'A variável ":variable" foi removida com sucesso e não estará mais disponível para os servidores após a reinstalação.', - 'variable_updated' => 'A variável ":variable" foi atualizada. Reinstale os servidores utilizando essa variável para as aplicações serem alteradas.', - 'variable_created' => 'Essa variável foi criada com sucesso e vinculada com a egg.', - ], - ], -]; diff --git a/lang/pt/admin/mount.php b/lang/pt/admin/mount.php new file mode 100644 index 0000000000..7322a9f10e --- /dev/null +++ b/lang/pt/admin/mount.php @@ -0,0 +1,30 @@ + 'Montagens', + 'model_label' => 'Montagem', + 'model_label_plural' => 'Montagens', + 'name' => 'Nome', + 'name_help' => 'Nome único usado para diferenciar esta montagem de outra.', + 'source' => 'Origem', + 'source_help' => 'Caminho do sistema host que será montado no container.', + 'target' => 'Destino', + 'target_help' => 'Local onde a montagem estará disponível dentro do container.', + 'read_only' => 'Somente Leitura?', + 'read_only_help' => 'A montagem é somente leitura dentro do container?', + 'description' => 'Descrição', + 'description_help' => 'Uma descrição mais detalhada para esta montagem', + 'no_mounts' => 'Sem Montagens', + 'eggs' => 'Eggs', + 'nodes' => 'Nós', + 'toggles' => [ + 'writable' => 'Gravável', + 'read_only' => 'Somente Leitura', + ], + 'table' => [ + 'name' => 'Nome', + 'all_eggs' => 'Todos os Eggs', + 'all_nodes' => 'Todos os Nós', + 'read_only' => 'Somente Leitura', + ], +]; diff --git a/lang/pt/admin/node.php b/lang/pt/admin/node.php deleted file mode 100644 index d536c2ec56..0000000000 --- a/lang/pt/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'O FQDN ou endereço IP providenciado não é valido.', - 'fqdn_required_for_ssl' => 'É necessário de um FQDN para ser utilizado o SSL.', - ], - 'notices' => [ - 'allocations_added' => 'As alocações foram adicionadas com sucesso no node.', - 'node_deleted' => 'O node foi removido com sucesso do painel.', - 'node_created' => 'O node foi criado com sucesso. Você pode automaticamente configurar esse node na máquina entrando na aba Configurações. Antes de adicionar os servidores, é necessário criar uma alocação com endereço IP da máquina e a porta.', - 'node_updated' => 'As informações do node foi atualizada. Caso foi feito uma configuração na máquina do node, será necessário reiniciar para aplicar as alterações.', - 'unallocated_deleted' => 'Foram removidos todas as portas não alocadas para :ip', - ], -]; diff --git a/lang/pt/admin/role.php b/lang/pt/admin/role.php new file mode 100644 index 0000000000..e327815718 --- /dev/null +++ b/lang/pt/admin/role.php @@ -0,0 +1,17 @@ + 'Permissões', + 'model_label' => 'Permissão', + 'model_label_plural' => 'Permissões', + 'no_roles' => 'Sem permissões', + 'name' => 'Nome da Permissão', + 'permissions' => 'Permissões', + 'in_use' => 'Em Uso', + 'all' => 'Todos(as)', + 'root_admin' => 'O :role tem todas as permissões.', + 'root_admin_delete' => 'Não é possível apagar a permissão Root Admin', + 'users' => 'Usuários', + 'nodes' => 'Nós', + 'nodes_hint' => 'Deixe em branco para permitir acesso a todos os nós.', +]; diff --git a/lang/pt/admin/server.php b/lang/pt/admin/server.php deleted file mode 100644 index b855807863..0000000000 --- a/lang/pt/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'Você não pode remover uma alocação de um servidor sem possuir outras alocações.', - 'marked_as_failed' => 'Este servidor falhou durante uma instalação anterior. O status atual não pode ser alterado nesse estado.', - 'bad_variable' => 'Ocorreu um erro de validação na varável :name.', - 'daemon_exception' => 'Ocorreu um erro ao tentar se comunicar com a máquina, resultando um status code HTTP/:code. Esse problema foi gerado com request id :request_id', - 'default_allocation_not_found' => 'A alocação padrão não foi encontrado nas alocações dos servidores.', - ], - 'alerts' => [ - 'startup_changed' => 'A configuração de inicialização foi atualizada com sucesso. Caso a egg deste servidor tenha sido atualizado, reinstale o servidor.', - 'server_deleted' => 'Este servidor foi removido do sistema com sucesso.', - 'server_created' => 'O servidor foi criado com sucesso no painel. Aguarde alguns minutos a máquina terminar de instalar o servidor.', - 'build_updated' => 'As configurações de build foram atualizadas. Será necessário reiniciar o servidor para aplicar algumas alterações.', - 'suspension_toggled' => 'O status de suspensão do servidor foi alterada para :status', - 'rebuild_on_boot' => 'Esse servidor foi alterado para reinstalar o Docker Container. Isso será aplicado na próxima vez que o servidor for iniciado.', - 'install_toggled' => 'O status de instalação foi ativado para esse servidor.', - 'server_reinstalled' => 'Este servidor foi colocado na fila para reinstalação a partir de agora.', - 'details_updated' => 'Os detalhes do servidor foram atualizadas.', - 'docker_image_updated' => 'A imagem do docker foi atualizada para ser utilizado neste servidor com sucesso. É necessário reiniciar o servidor para aplicar as alterações.', - 'node_required' => 'É necessário de um node configurado antes de adicionar esse servidor ao painel.', - 'transfer_nodes_required' => 'É necessário de pelo menos dois nodes para transferir os servidores.', - 'transfer_started' => 'A transferência de servidores começou.', - 'transfer_not_viable' => 'O node selecionado não há espaço em disco ou memória suficiente para acomodar esse servidor.', - ], -]; diff --git a/lang/pt/admin/user.php b/lang/pt/admin/user.php deleted file mode 100644 index f1093029ab..0000000000 --- a/lang/pt/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Não é possível excluir este usuário porque ele possui servidores ativos na conta. Remova os servidores na conta antes de continuar.', - 'user_is_self' => 'Não é possível excluir a sua própria conta.', - ], - 'notices' => [ - 'account_created' => 'A conta foi criada com sucesso.', - 'account_updated' => 'A conta foi atualizada com sucesso.', - ], -]; diff --git a/lang/pt/auth.php b/lang/pt/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/pt/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/pt/command/messages.php b/lang/pt/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/pt/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/pt/dashboard/account.php b/lang/pt/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/pt/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/pt/dashboard/index.php b/lang/pt/dashboard/index.php deleted file mode 100644 index abcda4e6b7..0000000000 --- a/lang/pt/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Procure por servidores.', - 'no_matches' => 'Não foi possível encontrar servidores que batem com os requisitos de busca.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memória', -]; diff --git a/lang/pt/exceptions.php b/lang/pt/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/pt/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/pt/pagination.php b/lang/pt/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/pt/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/pt/passwords.php b/lang/pt/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/pt/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/pt/search.php b/lang/pt/search.php new file mode 100644 index 0000000000..48b1d79b7d --- /dev/null +++ b/lang/pt/search.php @@ -0,0 +1,9 @@ + 'Introduza pelo menos três caracteres para iniciar a pesquisa.', + 'term' => [ + 'label' => 'Termo de pesquisa', + 'description' => 'Introduza um nome de servidor, UUID ou alocação para iniciar a pesquisa.', + ], +]; diff --git a/lang/pt/server/users.php b/lang/pt/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/pt/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/pt/strings.php b/lang/pt/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/pt/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/pt/validation.php b/lang/pt/validation.php index 9cccf35080..9d0dd40834 100644 --- a/lang/pt/validation.php +++ b/lang/pt/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => 'O campo :attribute deve ser aceito.', + 'active_url' => 'O campo :attribute não é uma URL válida.', + 'after' => 'O campo :attribute deve ser uma data posterior a :date.', + 'after_or_equal' => 'O campo :attribute deve ser uma data posterior ou igual a :date.', + 'alpha' => 'O campo :attribute pode conter apenas letras.', + 'alpha_dash' => 'O campo :attribute pode conter apenas letras, números e traços.', + 'alpha_num' => 'O campo :attribute pode conter apenas letras e números.', + 'array' => 'O campo :attribute deve ser uma matriz.', + 'before' => 'O campo :attribute deve ser uma data anterior a :date.', + 'before_or_equal' => 'O campo :attribute deve ser uma data anterior ou igual a :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => 'O campo :attribute deve estar entre :min e :max.', + 'file' => 'O campo :attribute deve estar entre :min e :max kilobytes.', + 'string' => 'O campo :attribute deve estar entre :min e :max caracteres.', + 'array' => 'O campo :attribute deve ter entre :min e :max itens.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => 'A confirmação do campo :attribute não corresponde.', + 'date' => 'O campo :attribute não é uma data válida.', + 'date_format' => 'O campo :attribute não corresponde ao formato :format.', + 'different' => 'Os campos :attribute e :other devem ser diferentes.', + 'digits' => 'O campo :attribute deve ter :digits dígitos.', + 'digits_between' => 'O campo :attribute deve ter entre :min e :max dígitos.', + 'dimensions' => 'O campo :attribute tem dimensões de imagem inválidas.', + + 'email' => 'O campo :attribute deve ser um endereço de e-mail válido.', + + 'file' => 'O campo :attribute deve ser um arquivo.', + 'filled' => 'O campo :attribute é obrigatório.', + 'image' => 'O campo :attribute deve ser uma imagem.', + + 'in_array' => 'O campo :attribute não existe em :other.', + 'integer' => 'O campo :attribute deve ser um número inteiro.', + 'ip' => 'O campo :attribute deve ser um endereço de IP válido.', + 'json' => 'O campo :attribute deve ser uma string JSON válida.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => 'O campo :attribute não pode ser maior que :max.', + 'file' => 'O campo :attribute não pode ser maior que :max kilobytes.', + 'string' => 'O campo :attribute não pode ser maior que :max caracteres.', + 'array' => 'O campo :attribute não pode ter mais que :max itens.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => 'O campo :attribute deve ser um arquivo do tipo: :values.', + 'mimetypes' => 'O campo :attribute deve ser um arquivo do tipo: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => 'O campo :attribute deve ser pelo menos :min.', + 'file' => 'O campo :attribute deve ter pelo menos :min kilobytes.', + 'string' => 'O campo :attribute deve ter pelo menos :min caracteres.', + 'array' => 'O campo :attribute deve ter pelo menos :min itens.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => 'O campo :attribute deve ser um número.', + + 'regex' => 'O formato do campo :attribute é inválido.', + + 'required_with_all' => 'O campo :attribute é obrigatório quando :values está presente.', + + 'same' => 'Os campos :attribute e :other devem corresponder.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => 'O campo :attribute deve ser :size.', + 'file' => 'O campo :attribute deve ter :size kilobytes.', + 'string' => 'O campo :attribute deve ter :size caracteres.', + 'array' => 'O campo :attribute deve conter :size itens.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => 'O campo :attribute deve ser uma string.', + 'timezone' => 'O campo :attribute deve ser uma zona válida.', + + 'url' => 'O formato do campo :attribute é inválido.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => 'Variável :env', + 'invalid_password' => 'A senha fornecida é inválida para esta conta.', ], ]; diff --git a/lang/pt_BR/activity.php b/lang/pt_BR/activity.php new file mode 100644 index 0000000000..4a595b9788 --- /dev/null +++ b/lang/pt_BR/activity.php @@ -0,0 +1,125 @@ + [ + 'fail' => 'Falhou ao fazer login', + 'success' => 'Logou', + 'password-reset' => 'Resetou a senha', + 'checkpoint' => 'Autenticação em dois fatores solicitada', + 'recovery-token' => 'Usou token de recuperação da autenticação em dois fatores', + 'token' => 'Resolveu o desafio da autenticação de dois fatores', + 'ip-blocked' => 'Solicitação bloqueada de IP não listado para :identifier', + 'sftp' => [ + 'fail' => 'Falhou no login via SFTP', + ], + ], + 'user' => [ + 'account' => [ + 'username-changed' => 'Alterou o nome de usuário de :old para :new', + 'email-changed' => 'Alterou o email de :old para :new', + 'password-changed' => 'Alterou a senha', + ], + 'api-key' => [ + 'create' => 'Criou uma Chave API :identifier', + 'delete' => 'Deletou uma Chave API :identifier', + ], + 'ssh-key' => [ + 'create' => 'Adicionou uma Chave SSH :fingerprint para a conta', + 'delete' => 'Removou uma Chave SSH :fingerprint da conta', + ], + 'two-factor' => [ + 'create' => 'Ativou a autenticação em dois fatores', + 'delete' => 'Desativou a autenticação em dois fatores', + ], + ], + 'server' => [ + 'console' => [ + 'command' => 'Executou ":command" no servidor', + ], + 'power' => [ + 'start' => 'Iniciou o servidor', + 'stop' => 'Parou o servidor', + 'restart' => 'Reiniciou o servidor', + 'kill' => 'Encerrou o processo do servidor', + ], + 'backup' => [ + 'download' => 'Baixou o backup :name', + 'delete' => 'Deletou o backup :name', + 'restore' => 'Restaurou o backup :name (arquivos deletados: :truncate)', + 'restore-complete' => 'Completou a restauração do backup :name', + 'restore-failed' => 'Falhou ao completar a restauração do backup :name', + 'start' => 'Iniciou um novo backup :name', + 'complete' => 'Marcou o backup :name como completo', + 'fail' => 'Marcou o backup :name como falhado', + 'lock' => 'Bloqueou o backup :name', + 'unlock' => 'Desbloqueou o backup :name', + 'rename' => 'Renomeou o backup de ":old_name" para ":new_name"', + ], + 'database' => [ + 'create' => 'Criou uma base de dados :name', + 'rotate-password' => 'Gerou uma nova senha para a base de dados :name', + 'delete' => 'Deletou a base de dados :name', + ], + 'file' => [ + 'compress' => 'Comprimiu :directory:files|Comprimiu :count arquivos em :directory', + 'read' => 'Visualizou o conteúdo de :file', + 'copy' => 'Criou uma cópia de :file', + 'create-directory' => 'Criou um diretório :directory:name', + 'decompress' => 'Extraiu :file em :directory', + 'delete' => 'Deletou:directory:files|Deletou:count arquivos em :directory', + 'download' => 'Baixou :file', + 'pull' => 'Baixou um arquivo remoto de :url para :directory', + 'rename' => 'Moveu/ Renomeou :from para :to|Moveu/ Renomeou:count arquivos em :directory', + 'write' => 'Escreveu um novo conteúdo em :file', + 'upload' => 'Começou o upload de um arquivo', + 'uploaded' => 'Fez upload de :directory:file', + ], + 'sftp' => [ + 'denied' => 'Acesso SFTP bloqueado devido a permissões', + 'create' => 'Criou:files|Criou:count novos arquivos', + 'write' => 'Modificou o conteúdo de :files|Modificou o conteúdo de :count arquivos', + 'delete' => 'Deletou:files|Deletou:count arquivos', + 'create-directory' => 'Criou o :files diretório|Criou :count diretórios', + 'rename' => 'Renomeou :from para :to|Renomeou ou moveu :count arquivos', + ], + 'allocation' => [ + 'create' => 'Adicionou :allocation para o servidor', + 'notes' => 'Atualizou as anotações para :allocation de ":old" para ":new"', + 'primary' => 'Definiu :allocation como a alocação primária', + 'delete' => 'Deletou a alocação :allocation', + ], + 'schedule' => [ + 'create' => 'Criou o agendamento :name', + 'update' => 'Atualizou o agendamento :name', + 'execute' => 'Executou manualmente o agendamento :name', + 'delete' => 'Deletou o agendamento :name', + ], + 'task' => [ + 'create' => 'Criou uma nova tarefa ":action" para o agendamento :name', + 'update' => 'Atualizou a tarefa ":action" para o agendamento :name', + 'delete' => 'Deletou a tarefa ":action" do agendamento :name', + ], + 'settings' => [ + 'rename' => 'Renomeou o servidor de ":old" para ":new"', + 'description' => 'Alterou a descrição do servidor de ":old" para ":new"', + 'reinstall' => 'Reinstalou o servidor', + ], + 'startup' => [ + 'edit' => 'Alterou a variável :variable de ":old" para ":new"', + 'image' => 'Atualizou a imagem Docker de :old para :new', + 'command' => 'Atualizou o comando de inicialização do servidor de :old para :new', + ], + 'subuser' => [ + 'create' => 'Adicionou :email como sub-usuário', + 'update' => 'Atualizou as permissões do sub-usuário :email', + 'delete' => 'Removeu :email como sub-usuário', + ], + 'crashed' => 'Servidor Falhou', + ], +]; diff --git a/lang/pt_BR/admin/apikey.php b/lang/pt_BR/admin/apikey.php new file mode 100644 index 0000000000..cb044fc0ff --- /dev/null +++ b/lang/pt_BR/admin/apikey.php @@ -0,0 +1,27 @@ + 'Chaves API do Aplicativo', + 'empty' => 'Nenhuma chave API', + 'whitelist' => 'Endereços IPv4 com Permissão', + 'whitelist_help' => 'As chaves API podem ser restritas a funcionarem apenas a partir de endereços IPv4 específicos. Insira cada endereço em uma nova linha.', + 'whitelist_placeholder' => 'Exemplo: 127.0.0.1 ou 192.168.1.1', + 'description' => 'Descrição', + 'description_help' => 'Uma breve descrição para o que esta chave serve.', + 'nav_title' => 'Chaves API', + 'model_label' => 'Chave API do Aplicativo', + 'model_label_plural' => 'Chaves API do Aplicativo', + 'table' => [ + 'key' => 'Chave', + 'description' => 'Descrição', + 'last_used' => 'Último Uso', + 'created' => 'Criado em', + 'created_by' => 'Criado por', + 'never_used' => 'Nunca usada', + ], + 'permissions' => [ + 'none' => 'Nenhum', + 'read' => 'Leitura', + 'read_write' => 'Leitura & Escrita', + ], +]; diff --git a/lang/pt_BR/admin/dashboard.php b/lang/pt_BR/admin/dashboard.php new file mode 100644 index 0000000000..94ac470384 --- /dev/null +++ b/lang/pt_BR/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Bem-vindo(a) ao Pelican!', + 'version' => 'Versão: :version', + 'advanced' => 'Avançado', + 'server' => 'Servidor', + 'user' => 'Usuário', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Informações para Desenvolvedores', + 'content' => 'Obrigado por experimentar a versão de desenvolvimento!', + 'extra_note' => 'Se você encontrar quaisquer problemas, por favor relate-os no GitHub.', + 'button_issues' => 'Reportar Problema', + 'button_features' => 'Discutir Características', + ], + 'intro-update-available' => [ + 'heading' => 'Atualização Disponível', + 'content' => ':latestVersion está disponível! Leia nossa documentação para atualizar seu painel.', + 'button_changelog' => 'O que há de novo?', + ], + 'intro-no-update' => [ + 'heading' => 'Seu painel está atualizado', + 'content' => 'Atualmente você está usando a versão :version. Seu painel está atualizado!', + ], + 'intro-first-node' => [ + 'heading' => 'Nenhum Node detectado', + 'content' => 'Parece que você ainda não configurou nenhum Node, mas não se preocupe, é só clicar no botão de ação para criar o seu primeiro!', + 'extra_note' => 'Se você encontrar quaisquer problemas, por favor relate-os no GitHub.', + 'button_label' => 'Criar primeiro Node no Pelican', + ], + 'intro-support' => [ + 'heading' => 'Apoie o Pelican', + 'content' => 'Obrigado por usar o Pelican, isso só foi possível através do apoio de vocês, dos nossos colaboradores e dos nossos apoiadores!', + 'extra_note' => 'Apreciamos todo e qualquer apoio de qualquer um.', + 'button_translate' => 'Ajudar na Tradução', + 'button_donate' => 'Doar Diretamente', + ], + 'intro-help' => [ + 'heading' => 'Precisa de Ajuda?', + 'content' => 'Confira a documentação primeiro! Se você ainda precisa de ajuda vá para o nosso servidor Discord!', + 'button_docs' => 'Ler a Documentação', + ], + ], +]; diff --git a/lang/pt_BR/admin/databasehost.php b/lang/pt_BR/admin/databasehost.php new file mode 100644 index 0000000000..62c1a02882 --- /dev/null +++ b/lang/pt_BR/admin/databasehost.php @@ -0,0 +1,74 @@ + 'Hosts do Banco de Dados', + 'model_label' => 'Host do Banco de Dados', + 'model_label_plural' => 'Hosts do Banco de Dados', + 'table' => [ + 'database' => 'Banco de Dados', + 'name' => 'Nome', + 'host' => 'Host', + 'port' => 'Porta', + 'name_helper' => 'Deixar isso em branco irá gerar automaticamente um nome aleatório', + 'username' => 'Nome de Usuário', + 'password' => 'Senha', + 'remote' => 'Conexões de', + 'remote_helper' => 'Para onde as conexões devem ser permitidas. Deixe em branco para permitir conexões de qualquer lugar.', + 'max_connections' => 'Máximo de Conexões', + 'created_at' => 'Criado em', + 'connection_string' => 'String de Conexão JDBC', + ], + 'error' => 'Erro ao conectar-se ao host', + 'host' => 'Host', + 'host_help' => 'O endereço IP ou nome de domínio que deve ser usado quando tentar conectar a este host MySQL deste Painel para criar novas bases de dados.', + 'port' => 'Porta', + 'port_help' => 'A porta na qual o MySQL está sendo executado neste host.', + 'max_database' => 'Máximo de Bancos de Dados', + 'max_databases_help' => 'O número máximo de bancos de dados que podem ser criados neste host. Se o limite for atingido, não será possível criar novos bancos de dados neste host. Deixar em branco significa ilimitado.', + 'display_name' => 'Nome de Exibição', + 'display_name_help' => 'O endereço IP ou nome de domínio que deve ser mostrado ao usuário final.', + 'username' => 'Nome de Usuário', + 'username_help' => 'O nome de usuário de uma conta que possui permissões suficientes para criar novos usuários e bancos de dados no sistema.', + 'password' => 'Senha', + 'password_help' => 'Senha para o usuário do banco de dados.', + 'linked_nodes' => 'Nodes vinculados', + 'linked_nodes_help' => 'Esta configuração é apenas o padrão para esta máquina do banco de dados ao adicionar um banco de dados a um servidor no Node selecionado.', + 'connection_error' => 'Erro ao conectar-se host do banco de dados', + 'no_database_hosts' => 'Nenhum host de Banco de Dados', + 'no_nodes' => 'Sem Nodes', + 'delete_help' => 'Host do Banco de Dados possui Bancos de Dados', + 'unlimited' => 'Ilimitado', + 'anywhere' => 'Qualquer', + + 'rotate' => 'Gerar', + 'rotate_password' => 'Gerar Senha', + 'rotated' => 'Senha Gerada', + 'rotate_error' => 'Falha na Geração da Senha', + 'databases' => 'Bancos de Dados', + + 'setup' => [ + 'preparations' => 'Preparações', + 'database_setup' => 'Configuração do Banco de Dados', + 'panel_setup' => 'Configuração do Painel', + + 'note' => 'Atualmente, apenas bancos de dados MySQL/ MariaDB são suportados para servidores de banco de dados!', + 'different_server' => 'O painel e o banco de dados não são no mesmo servidor?', + + 'database_user' => 'Usuário do Banco de Dados', + 'cli_login' => 'Use mysql -u root -p para acessar o mysql cli.', + 'command_create_user' => 'Comando para criar o usuário', + 'command_assign_permissions' => 'Comando para atribuir permissões', + 'cli_exit' => 'Para sair do mysql cli execute exit', + 'external_access' => 'Acesso Externo', + 'allow_external_access' => ' +

Provavelmente você vai precisar liberar o acesso externo a essa instância do MySQL para permitir que servidores se conectem a ela.

+
+

Para fazer isso, abra o arquivo my.cnf, que pode estar em locais diferentes dependendo do seu sistema operacional e de como o MySQL foi instalado. Você pode usar o comando find /etc -iname my.cnf para localizá-lo.

+
+

Abra o arquivo my.cnf, adicione o texto abaixo no final do arquivo e salve:
+ [mysqld]
bind-address=0.0.0.0

+
+

Reinicie o MySQL/MariaDB para aplicar essas mudanças. Isso vai sobrescrever a configuração padrão do MySQL, que por padrão aceita conexões apenas do localhost. Atualizar essa configuração permitirá conexões em todas as interfaces, ou seja, conexões externas. Certifique-se de liberar a porta do MySQL (padrão 3306) no seu firewall.

+ ', + ], +]; diff --git a/lang/pt_BR/admin/egg.php b/lang/pt_BR/admin/egg.php new file mode 100644 index 0000000000..fa86aa9d9c --- /dev/null +++ b/lang/pt_BR/admin/egg.php @@ -0,0 +1,109 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => 'Configuração', + 'process_management' => 'Gerenciamento de Processo', + 'egg_variables' => 'Variáveis do Egg', + 'install_script' => 'Instalação do Script', + ], + 'import' => [ + 'file' => 'Arquivo', + 'url' => 'URL', + 'image_url' => 'URL da Imagem', + 'image_error' => 'Não foi possível obter a imagem', + 'image_too_large' => 'Imagem muito grande. Limite é 1024KB', + 'egg_help' => 'Este deve ser o arquivo JSON (egg-minecraft.json)', + 'url_help' => 'URLs devem apontar diretamente para o arquivo JSON', + 'add_url' => 'Nova URL', + 'import_failed' => 'Falha ao Importar', + 'import_success' => 'Sucesso ao Importar', + 'github' => 'Adicionar do Github', + 'refresh' => 'Atualizar', + 'import_image' => 'Importar imagem', + 'no_local_ip' => 'Endereços IP locais não são permitidos', + 'unsupported_format' => 'Formato não suportado. Formatos suportados: :formatos:', + 'invalid_url' => 'O link fornecido é inválido', + 'image_deleted' => 'Imagem excluída', + 'no_image' => 'Nenhuma imagem fornecida', + 'image_updated' => 'Imagem atualizada', + ], + 'export' => [ + 'modal' => 'Como você gostaria de exportar :egg ?', + 'as' => 'Como .:format', + ], + 'in_use' => 'Em Uso', + 'servers' => 'Servidores', + 'name' => 'Nome', + 'egg_uuid' => 'UUID do Egg', + 'egg_id' => 'ID do Egg', + 'name_help' => 'Um simples nome para ser usado como identificador para este Egg.', + 'author' => 'Autor', + 'uuid_help' => 'Este é o identificador único global deste Egg, usado pelo Wings como identificador.', + 'author_help' => 'O autor desta versão do Egg.', + 'author_help_edit' => 'O autor desta versão do Egg. Enviar uma nova configuração de um autor diferente irá alterar isso.', + 'description' => 'Descrição', + 'description_help' => 'Uma descrição deste Egg que será exibida pelo Painel sempre que necessário.', + 'add_startup' => 'Adicionar comando de inicialização', + 'startup_command' => 'Comando', + 'startup_commands' => 'Comandos de inicialização', + 'startup_name' => 'Nome de exibição', + 'startup_help' => 'Comandos de inicialização disponíveis usando esse Egg. O primeiro é o padrão.', + 'file_denylist' => 'Lista de Arquivos Bloqueados', + 'file_denylist_help' => 'Uma lista de arquivos que o usuário final não terá permissão para edição.', + 'features' => 'Características', + 'force_ip' => 'Forçar IP de Saída', + 'force_ip_help' => 'Força todo o tráfego de rede de saída a ter o IP de origem convertido (NAT) para o IP principal de alocação do servidor. Isso é necessário para que alguns jogos funcionem corretamente quando o Node possui múltiplos IPs públicos. +Ativar esta opção desativa a comunicação interna entre servidores usando este Egg, impedindo que eles acessem outros servidores no mesmo Node pela rede interna.', + 'tags' => 'Marcadores', + 'update_url' => 'Atualizar URL', + 'update_url_help' => 'URLs devem apontar diretamente para um arquivo JSON', + 'add_image' => 'Adicionar Imagem Docker', + 'docker_images' => 'Imagens Docker', + 'docker_name' => 'Nome da Imagem', + 'docker_uri' => 'URI da Imagem', + 'docker_help' => 'Imagens docker disponíveis para servidores usando esse Egg. O primeiro é o padrão.', + + 'stop_command' => 'Comando de Parada', + 'stop_command_help' => 'O comando que deve ser enviado para os processos do servidor para pará-los graciosamente. Se você precisar enviar um SIGINT, você deve digitar ^C aqui.', + 'copy_from' => 'Copiar Configurações de', + 'copy_from_help' => 'Se você quiser usar as configurações padrão de outro Egg, selecione-o no menu acima.', + 'none' => 'Nenhum', + 'start_config' => 'Configuração de Inicialização', + 'start_config_help' => 'Lista de valores que o daemon deve procurar ao iniciar o servidor para determinar quando a inicialização foi concluída.', + 'config_files' => 'Arquivos de Configuração', + 'config_files_help' => 'Deve ser uma representação JSON dos arquivos de configuração e as partes que devem ser alteradas.', + 'log_config' => 'Configuração de Log', + 'log_config_help' => 'Deve ser uma representação em JSON de onde os arquivos de log são armazenados e se o daemon deve ou não criar logs personalizados.', + + 'environment_variable' => 'Variável de Ambiente', + 'default_value' => 'Valor Padrão', + 'user_permissions' => 'Permissões do Usuário', + 'viewable' => 'Visível', + 'editable' => 'Editável', + 'rules' => 'Regras', + 'add_new_variable' => 'Adicionar Nova Variável', + + 'error_unique' => 'Já existe uma variável com este nome.', + 'error_required' => 'O campo variável de ambiente é obrigatório.', + 'error_reserved' => 'Esta variável de ambiente é reservada e não pode ser utilizada.', + + 'script_from' => 'Script de', + 'script_container' => 'Contêiner de Script', + 'script_entry' => 'Entrada do Script', + 'script_install' => 'Script de Instalação', + 'no_eggs' => 'Sem Eggs', + 'no_servers' => 'Sem Servidores', + 'no_servers_help' => 'Nenhum servidor foi atribuído a este Egg', + + 'update' => 'Atualizar|Atualizar selecionado(s)', + 'updated' => 'Egg atualizado|:count/:total Eggs atualizados', + 'updated_failed' => ':count falhou', + 'updated_skipped' => ':count skipped', + 'update_question' => 'Tem certeza que deseja atualizar este Egg?|Tem certeza que deseja atualizar os Eggs selecionados?', + 'update_description' => 'Se você fez alguma alteração no Egg, elas serão sobrescritas!|Se você fez alguma alteração nos Eggs, elas serão sobrescritas!', + 'no_updates' => 'Não há atualizações disponíveis para os Eggs selecionados', +]; diff --git a/lang/pt_BR/admin/health.php b/lang/pt_BR/admin/health.php new file mode 100644 index 0000000000..81ef35b0b3 --- /dev/null +++ b/lang/pt_BR/admin/health.php @@ -0,0 +1,60 @@ + 'Saúde', + 'results_refreshed' => 'Resultados do Exame de Saúde atualizados', + 'checked' => 'Resultados verificados de :time', + 'refresh' => 'Atualizar', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Não foi possível definir ou recuperar o valor de cache da aplicação.', + 'failed' => 'Ocorreu uma exceção com o cache do aplicativo: :error', + ], + 'database' => [ + 'label' => 'Banco de dados', + 'ok' => 'Ok', + 'failed' => 'Não foi possível conectar ao banco de dados: :error', + ], + 'debugmode' => [ + 'label' => 'Modo de Depuração', + 'ok' => 'Modo de Depuração desativado', + 'failed' => 'O modo de depuração era esperado como :expected, mas na verdade foi :actual.', + ], + 'environment' => [ + 'label' => 'Ambiente', + 'ok' => 'Ok, Definido como :actual', + 'failed' => 'Ambiente está definido como :real , esperado :expected', + ], + 'nodeversions' => [ + 'label' => 'Versão do Node', + 'ok' => 'Os Nodes estão atualizados', + 'failed' => ':outdated/:all Nodes estão desatualizados', + 'no_nodes_created' => 'Nenhum Node criado', + 'no_nodes' => 'Sem Nodes', + 'all_up_to_date' => 'Tudo atualizado', + 'outdated' => ':outdated/:all desatualizado', + ], + 'panelversion' => [ + 'label' => 'Versão do Painel', + 'ok' => 'Painel está atualizado', + 'failed' => 'A versão instalada é :currentVersion, mas a última é :latestVersion', + 'up_to_date' => 'Atualizado', + 'outdated' => 'Desatualizado', + ], + 'schedule' => [ + 'label' => 'Agendamento', + 'ok' => 'Ok', + 'failed_last_ran' => 'A última execução do Agendamento foi maior que :time minutos atrás', + 'failed_not_ran' => 'O Agendamento ainda não foi executado.', + ], + 'useddiskspace' => [ + 'label' => 'Espaço em Disco', + ], + ], + 'checks' => [ + 'successful' => 'Bem-sucedido', + 'failed' => 'Falhou', + ], +]; diff --git a/lang/pt_BR/admin/log.php b/lang/pt_BR/admin/log.php new file mode 100644 index 0000000000..abd225c456 --- /dev/null +++ b/lang/pt_BR/admin/log.php @@ -0,0 +1,26 @@ + 'Oba! Sem erros!', + 'total_logs' => 'Total de registros', + 'error' => 'Erro', + 'warning' => 'Aviso', + 'notice' => 'Nota', + 'info' => 'Informação', + 'debug' => 'Depuração', + 'navigation' => [ + 'panel_logs' => 'Registros do painel', + ], + 'actions' => [ + 'upload_logs' => 'Enviar arquivos de log?', + 'upload_logs_description' => 'Isso irá enviar o arquivo :file para :url. Você tem certeza de que deseja fazer isso?', + 'view_logs' => 'Visualizar registros', + 'log_not_found' => 'Registro não encontrado!', + 'log_not_found_description' => 'Não foi possível encontrar o log em :filename', + 'failed_to_upload' => 'Falha ao enviar arquivos.', + 'failed_to_upload_description' => 'Status HTTP: :status', + 'log_upload' => 'Registro enviado!', + 'log_upload_action' => 'Ver registro', + 'upload_tooltip' => 'Enviar para :url', + ], +]; diff --git a/lang/pt_BR/admin/mount.php b/lang/pt_BR/admin/mount.php new file mode 100644 index 0000000000..dd0d5caae0 --- /dev/null +++ b/lang/pt_BR/admin/mount.php @@ -0,0 +1,30 @@ + 'Montagens', + 'model_label' => 'Montagem', + 'model_label_plural' => 'Montagens', + 'name' => 'Nome', + 'name_help' => 'Nome exclusivo usado para separar esta montagem de outra.', + 'source' => 'Origem', + 'source_help' => 'Caminho do arquivo no sistema host para montar para um contêiner.', + 'target' => 'Destino', + 'target_help' => 'Onde a montagem estará acessível dentro de um contêiner.', + 'read_only' => 'Somente Leitura?', + 'read_only_help' => 'A montagem é somente leitura dentro do contêiner?', + 'description' => 'Descrição', + 'description_help' => 'Uma descrição mais longa para esta Montagem', + 'no_mounts' => 'Sem Montagens', + 'eggs' => 'Eggs', + 'nodes' => 'Nodes', + 'toggles' => [ + 'writable' => 'Gravável', + 'read_only' => 'Somente Leitura', + ], + 'table' => [ + 'name' => 'Nome', + 'all_eggs' => 'Todos os Eggs', + 'all_nodes' => 'Todos os Nodes', + 'read_only' => 'Somente Leitura', + ], +]; diff --git a/lang/pt_BR/admin/node.php b/lang/pt_BR/admin/node.php new file mode 100644 index 0000000000..e23020239e --- /dev/null +++ b/lang/pt_BR/admin/node.php @@ -0,0 +1,149 @@ + 'Nodes', + 'model_label' => 'Node', + 'model_label_plural' => 'Nodes', + 'create' => 'Criar Node', + 'tabs' => [ + 'overview' => 'Visão Geral', + 'basic_settings' => 'Configurações Básicas', + 'advanced_settings' => 'Configurações Avançadas', + 'config_file' => 'Arquivo de Configuração', + 'diagnostics' => 'Diagnósticos', + ], + 'table' => [ + 'health' => 'Saúde', + 'name' => 'Nome', + 'address' => 'Endereço', + 'public' => 'Público', + 'servers' => 'Servidores', + 'alias' => 'Alias', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => 'Proprietário', + 'allocation_notes' => 'Anotações', + 'no_notes' => 'Sem anotações', + ], + 'node_info' => 'Informações do Node', + 'wings_version' => 'Versão do Wings', + 'cpu_threads' => 'Núcleos da CPU', + 'architecture' => 'Arquitetura', + 'kernel' => 'Kernel', + 'unknown' => 'Desconhecido', + 'latest' => 'Última', + 'node_uuid' => 'UUID do Node', + 'node_id' => 'ID do Node', + + 'ip_address' => 'Endereço IP', + 'ip_help' => 'Normalmente é o IP público da sua máquina, a menos que você esteja usando redirecionamento de portas.', + 'alias_help' => 'Nome de exibição opcional para te ajudar a lembrar do que se trata.', + 'refresh' => 'Atualizar', + 'domain' => 'Nome de Domínio', + 'ssl_ip' => 'Você não pode se conectar a um endereço IP através de SSL', + 'error' => 'Esse é o nome de domínio que aponta para o IP do seu node. Se você já configurou isso, pode verificar no próximo campo!', + 'fqdn_help' => 'Seu painel está atualmente protegido por um certificado SSL, o que significa que seus Nodes também precisam de um. Você deve usar um nome de domínio, porque você não pode obter um certificado SSL para seu endereço IP.', + 'dns' => 'Verificação de registro DNS', + 'dns_help' => 'Isso permite que você saiba se o seu registro DNS está apontando para o endereço IP correto.', + 'valid' => 'Válido', + 'invalid' => 'Inválido', + 'port' => 'Porta', + 'ports' => 'Portas', + 'port_help' => 'Se você estiver executando o daemon atrás do Cloudflare, deve configurar a porta do daemon para 8443 para permitir o proxy de WebSocket sobre SSL.', + 'connect_port' => 'Porta de Conexão', + 'connect_port_help' => 'As conexões com o Wings usarão essa porta. Se você estiver usando um proxy reverso, essa porta pode ser diferente da porta de escuta. Ao usar o proxy do Cloudflare, você deve utilizar a porta 8443.', + 'listen_port' => 'Porta de Escuta', + 'listen_port_help' => 'O Wings irá escutar nessa porta.', + 'display_name' => 'Nome de Exibição', + 'ssl' => 'Comunicação via SSL', + 'panel_on_ssl' => 'Seu painel está atualmente protegido por um certificado SSL,
então seu Daemon também deve usar.', + 'ssl_help' => 'Um endereço IP não pode usar SSL.', + + 'tags' => 'Marcadores', + 'upload_limit' => 'Limite de Upload', + 'upload_limit_help' => 'Insira o tamanho máximo de arquivos que podem ser carregados através do gerenciador de arquivos na web.', + 'sftp_port' => 'Porta SFTP', + 'sftp_alias' => 'SFTP Alias', + 'sftp_alias_help' => 'Exibe o apelido para o endereço SFTP. Deixe em branco para usar o Node FQDN.', + 'use_for_deploy' => 'Usar para Deployments?', + 'maintenance_mode' => 'Modo De Manutenção', + 'maintenance_mode_help' => 'Se o Node estiver marcado como \'Em Manutenção\' os usuários não poderão acessar os servidores que estão neste Node.', + + 'cpu' => 'CPU', + 'cpu_limit' => 'Limite de CPU', + 'memory' => 'Memória', + 'memory_limit' => 'Limite de Memória', + 'disk' => 'Disco', + 'disk_limit' => 'Limite de Disco', + 'unlimited' => 'Ilimitado', + 'limited' => 'Limitado', + 'overallocate' => 'Superalocação', + 'enabled' => 'Ativado', + 'disabled' => 'Desativado', + 'yes' => 'Sim', + 'no' => 'Não', + + 'instructions' => 'Instruções', + 'instructions_help' => 'Salve este arquivo na pasta raiz do seu daemon, chamada config.yml', + + 'auto_deploy' => 'Comando de Auto Implementação', + 'auto_question' => 'Escolha entre instalação Standalone e Docker.', + 'auto_label' => 'Tipo', + 'standalone' => 'Standalone', + 'docker' => 'Docker', + 'auto_command' => 'Para configurar automaticamente o seu Node execute o seguinte comando:', + 'reset_token' => 'Redefinir Token de Autorização', + 'token_reset' => 'O token do daemon foi redefinido.', + 'reset_help' => 'Redefinir o token daemon anulará qualquer requisição proveniente do token antigo. Este token é usado para todas as operações confidenciais no daemon, incluindo a criação e exclusão de servidor. Sugerimos alterar este token regularmente para segurança.', + + 'no_nodes' => 'Sem Nodes', + 'none' => 'Nenhum', + 'cpu_chart' => 'CPU - :cpu% de :max%', + 'memory_chart' => 'Memória - :used de :total', + 'disk_chart' => 'Armazenamento - :used de :total', + 'used' => 'Usado', + 'unused' => 'Não utilizado', + + 'next_step' => 'Próxima Etapa', + 'node_has_servers' => 'Node Possui Servidores', + 'create_allocation' => 'Criar Alocação', + 'primary_allocation' => 'Alocação Primária', + 'databases' => 'Bancos de dados', + 'backups' => 'Backups', + + 'error_connecting' => 'Erro ao conectar-se ao :node', + 'error_connecting_description' => 'A configuração não pôde ser atualizada automaticamente no Wings, você precisará atualizar manualmente o arquivo de configuração.', + 'allocation' => 'Alocação', + + 'diagnostics' => [ + 'header' => 'Diagnóstico do nó', + 'include_endpoints' => 'Incluir endpoints', + 'include_endpoints_hint' => 'Incluindo endpoints exibirá as urls do painel dentro dos logs e NÃO os obscurecerá.', + 'include_logs' => 'Incluir registros', + 'include_logs_hint' => 'Incluindo os logs mostrará logs recentes e ajudará a rastrear possíveis problemas.', + 'run_diagnostics' => 'Executar diagnósticos', + 'upload_to_pelican' => 'Enviar arquivos de log', + 'logs_pulled' => 'Logs extraidos!', + 'logs_uploaded' => 'Logs enviados', + 'upload_failed' => 'Falha no envio de logs', + 'view_logs' => 'Ver logs', + 'pull' => 'Extrair', + 'upload' => 'Enviar', + 'clear' => 'Limpar', + '404' => 'O relatório de diagnóstico solicitado não foi encontrado. Certifique-se de que o wings está atualizado e tente novamente.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Problema no Cloudflare', + 'body' => 'Seu node não é acessível pelo Cloudflare', + ], + + 'bulk_update_ip' => 'Atualizar IPs', + 'bulk_update_ip_description' => 'Substituir um endereço IP antigo por um novo para alocações. Isto é útil quando o endereço IP de um nó for alterado', + 'update_ip' => 'Atualizar IP', + 'old_ip' => 'Endereço IP antigo', + 'new_ip' => 'Novo endereço IP', + 'no_allocations_to_update' => 'Nenhuma alocação com o endereço IP antigo selecionado foi encontrada', + 'ip_updated' => 'Atualizado com êxito :count de :total alocação(ões)', + 'ip_update_failed' => ':count alocação(ões) falhou(aram) para atualizar', +]; diff --git a/lang/pt_BR/admin/plugin.php b/lang/pt_BR/admin/plugin.php new file mode 100644 index 0000000000..24bb6b7c35 --- /dev/null +++ b/lang/pt_BR/admin/plugin.php @@ -0,0 +1,61 @@ + 'Extensões', + 'model_label' => 'Extensão', + 'model_label_plural' => 'Extensões', + + 'name' => 'Nome', + 'update_available' => 'Uma atualização está disponível para essa extensão', + 'author' => 'Autor', + 'version' => 'Versão', + 'category' => 'Categoria', + 'status' => 'Estado', + 'visit_website' => 'Visitar Site', + 'settings' => 'Configurações', + 'install' => 'Instalar', + 'uninstall' => 'Desinstalar', + 'update' => 'Atualizar', + 'enable' => 'Ativar', + 'disable' => 'Desativar', + 'import_from_file' => 'Importar de Arquivo', + 'import_from_url' => 'Importar de URL', + 'no_plugins' => 'Sem Extensões', + 'all' => 'Todos', + 'change_load_order' => 'Alterar ordem de carregamento', + 'apply_load_order' => 'Aplicar ordem de carregamento', + + 'enable_theme_modal' => [ + 'heading' => 'Tema já habilitado', + 'description' => 'Você já tem um tema habilitado. Habilitar vários temas pode resultar em erros visuais. Deseja continuar?', + ], + + 'status_enum' => [ + 'not_installed' => 'Não Instalado', + 'disabled' => 'Desativado', + 'enabled' => 'Ativado', + 'errored' => 'Erro', + 'incompatible' => 'Incompatível', + ], + + 'category_enum' => [ + 'plugin' => 'Extensão', + 'theme' => 'Tema', + 'language' => 'Pacote de Idioma', + ], + + 'notifications' => [ + 'installed' => 'Extensão instalada', + 'install_error' => 'Não foi possível instalar a extensão', + 'uninstalled' => 'Extensão desinstalada', + 'uninstall_error' => 'Não foi possível desinstalar a extensão', + 'deleted' => 'Extensão deletada', + 'updated' => 'Extensão atualizada', + 'update_error' => 'Não foi possível atualizar a extensão', + 'enabled' => 'Extensão ativada', + 'disabled' => 'Extensão desativada', + 'imported' => 'Extensão importada', + 'import_exists' => 'Uma extensão com esse ID já existe', + 'import_failed' => 'Não foi possível importar extensão', + ], +]; diff --git a/lang/pt_BR/admin/role.php b/lang/pt_BR/admin/role.php new file mode 100644 index 0000000000..19121e189b --- /dev/null +++ b/lang/pt_BR/admin/role.php @@ -0,0 +1,17 @@ + 'Permissões', + 'model_label' => 'Permissão', + 'model_label_plural' => 'Permissões', + 'no_roles' => 'Sem Permissões', + 'name' => 'Nome da Permissão', + 'permissions' => 'Permissões', + 'in_use' => 'Em Uso', + 'all' => 'Todas', + 'root_admin' => 'O :role tem todas as permissões.', + 'root_admin_delete' => 'Não é possível excluir o Root Admin', + 'users' => 'Usuários', + 'nodes' => 'Nodes', + 'nodes_hint' => 'Deixe em branco para permitir acesso a todos os Nodes.', +]; diff --git a/lang/pt_BR/admin/server.php b/lang/pt_BR/admin/server.php new file mode 100644 index 0000000000..93b32d64d6 --- /dev/null +++ b/lang/pt_BR/admin/server.php @@ -0,0 +1,150 @@ + 'Servidores', + 'model_label' => 'Servidor', + 'model_label_plural' => 'Servidores', + 'no_servers' => 'Sem Servidores', + 'create' => 'Criar Servidor', + 'next_step' => 'Próxima Etapa', + 'ip_address' => 'Endereço IP', + 'ip_address_helper' => 'Normalmente é o IP público da sua máquina, a menos que você esteja usando redirecionamento de portas.', + 'port' => 'Porta', + 'ports' => 'Portas', + 'alias' => 'Alias', + 'alias_helper' => 'Nome de exibição opcional para lhe ajudar a lembrar do que se trata.', + 'locked' => 'Bloqueado?', + 'locked_helper' => 'Usuário não serão capazes de deletar alocações bloqueadas', + 'lock' => 'Bloquear', + 'unlock' => 'Desbloquear', + 'name' => 'Nome', + 'external_id' => 'ID Externo', + 'owner' => 'Proprietário', + 'description' => 'Descrição', + 'install_script' => 'Executar Script de Instalação?', + 'start_after' => 'Iniciar após a Instalação?', + 'yes' => 'Sim', + 'no' => 'Não', + 'skip' => 'Pular', + 'primary' => 'Primário', + 'already_primary' => 'Já é o Primário', + 'make_primary' => 'Tornar Primário', + 'startup_cmd' => 'Comando de Inicialização', + 'startup_name' => 'Nome de inicialização', + 'default_startup' => 'Comando de inicialização Padrão', + 'startup_placeholder' => 'Insira um comando de inicialização personalizado', + 'variables' => 'Variáveis', + 'resource_limits' => 'Limites de Recursos', + 'cpu' => 'CPU', + 'cpu_limit' => 'Limite de CPU', + 'cpu_helper' => '100% é igual a um núcleo da CPU.', + 'unlimited' => 'Ilimitado', + 'limited' => 'Limitado', + 'enabled' => 'Ativado', + 'disabled' => 'Desativado', + 'memory' => 'Memória', + 'memory_limit' => 'Limite de Memória', + 'memory_helper' => 'O Wings adicionará uma margem a esse valor ao criar o contêiner para garantir que ele não fique sem recursos ao usar a memória máxima.', + 'disk' => 'Espaço em Disco', + 'disk_limit' => 'Limite de Espaço em Disco', + 'advanced_limits' => 'Limite Avançado', + 'cpu_pin' => 'Fixação de CPU', + 'threads' => 'Fixação de Núcleos', + 'pin_help' => 'Adicionar núcleo fixado, por exemplo, 0 ou 2-4', + 'swap' => 'Memória SWAP', + 'swap_limit' => 'Limite de Memória SWAP', + 'oom' => 'Finalizador por Falta de Memória', + 'feature_limits' => 'Limites das Características', + 'docker_settings' => 'Configurações do Docker', + 'docker_image' => 'Imagem Docker', + 'image_name' => 'Nome da Imagem', + 'primary_allocation' => 'Alocação Primária', + 'image' => 'Imagem', + 'image_placeholder' => 'Insira uma imagem personalizada', + 'container_labels' => 'Etiquetas do Contêiner', + 'title' => 'Título', + 'actions' => 'Ações', + 'console' => 'Console', + 'suspend' => 'Suspender', + 'unsuspend' => 'Reativar', + 'reinstall' => 'Reinstalar', + 'reinstall_help' => 'Isto irá reinstalar o servidor com o Script de instalação do Egg', + 'reinstall_modal_heading' => 'Você tem certeza que deseja reinstalar este servidor?', + 'reinstall_modal_description' => '!! Isso pode resultar em uma perda de dados irrecuperável!!', + 'server_status' => 'Status do Servidor', + 'view_install_log' => 'Visualizar log da Instalação', + 'uuid' => 'UUID', + 'node' => 'Node', + 'short_uuid' => 'UUID Curto', + 'toggle_install' => 'Alternar Status de Instalação', + 'toggle_install_help' => 'Se você precisar alternar o status de instalação de desinstalado para instalado, ou vice-versa, você pode fazer isso com este botão.', + 'toggle_install_failed_header' => 'O servidor falhou', + 'toggle_install_failed_desc' => 'Você quer reinstalar o servidor para corrigir isto?', + 'transfer' => 'Transferir', + 'transfer_help' => 'Transferir este servidor para outro Node conectado a este painel.
Aviso! Este recurso ainda é experimental. Considere fazer um backup manualmente para evitar a perda de dados!', + 'condition' => 'Condição', + 'suspend_all' => 'Suspender Todos os Servidores', + 'unsuspend_all' => 'Reativar Todos os Servidores', + 'select_allocation' => 'Selecionar Alocação', + 'new_allocation' => 'Criar Nova Alocação', + 'additional_allocations' => 'Alocações Adicionais', + 'select_additional' => 'Selecione Alocações Adicionais', + 'no_variables' => 'O Egg selecionado não tem variáveis!', + 'select_egg' => 'Selecione um Egg primeiro para mostrar suas variáveis!', + 'allocations' => 'Alocações', + 'databases' => 'Bancos de Dados', + 'no_databases' => 'Não existem bases de dados para este Servidor', + 'delete_db' => 'Tem certeza que deseja apagar :name ?', + 'delete_db_heading' => 'Apagar o Banco de Dados?', + 'backups' => 'Backups', + 'egg' => 'Egg', + 'mounts' => 'Montagens', + 'no_mounts' => 'Não existem montagens para este Node', + 'create_database' => 'Criar Banco de Dados', + 'no_db_hosts' => 'Nenhum host de Banco de Dados', + 'failed_to_create' => 'Falha ao criar o Banco de Dados', + 'change_egg' => 'Alterar Egg', + 'new_egg' => 'Novo Egg', + 'keep_old_variables' => 'Manter as variáveis antigas, se possível?', + 'create_allocation' => 'Criar Alocação', + 'add_allocation' => 'Adicionar Alocação', + 'view' => 'Visualizar', + 'no_log' => 'Nenhum Registro Disponível', + 'tabs' => [ + 'information' => 'Informação', + 'egg_configuration' => 'Configuração do Egg', + 'environment_configuration' => 'Configuração do Ambiente', + ], + 'notifications' => [ + 'server_suspension' => 'Suspensão do Servidor', + 'server_suspended' => 'O servidor foi suspenso', + 'server_already_suspended' => 'Servidor já está suspenso!', + 'server_suspend_help' => 'Isso irá suspender o servidor, interromper qualquer processo em execução e bloquear imediatamente o usuário de poder acessar seus arquivos. Também impedirá de gerenciar o servidor através do painel ou API.', + 'server_unsuspend_help' => 'Isso irá cancelar a suspensão do Servidor e restaurar o acesso normal aos usuários.', + 'server_unsuspended' => 'O servidor foi reativado', + 'error_server_delete' => 'O servidor não pôde ser excluído com segurança.', + 'error_server_delete_body' => 'Você pode Forçar a Excluir.', + 'create_failed' => 'Não foi possível criar o servidor', + 'invalid_port_range' => 'Intervalo de Portas Inválido', + 'invalid_port_range_body' => 'O seu intervalo de portas não é válido: :port', + 'too_many_ports' => 'Muitos portas de uma só vez!', + 'too_many_ports_body' => 'O limite atual é :limit número de portas de uma vez.', + 'invalid_port' => 'Porta não está no intervalo válido', + 'invalid_port_body' => ':i não está no intervalo de portas válido, entre :portFloor-:portCeil', + 'already_exists' => 'A porta já está em uso', + 'already_exists_body' => ':i já está como uma alocação', + 'error_connecting' => 'Erro ao conectar-se ao :node', + 'error_connecting_description' => 'A configuração não pôde ser atualizada automaticamente no Wings, você precisará atualizar manualmente o arquivo de configuração.', + 'install_toggled' => 'Status da instalação foi alternado', + 'install_toggle_failed' => 'Não foi possível alternar o estado de instalação', + 'reinstall_started' => 'Reinstalação iniciada', + 'reinstall_failed' => 'Não foi possível iniciar a reinstalação', + 'log_failed' => 'Não foi possível conectar ao Wings para recuperar o log de instalação do servidor.', + 'transfer_started' => 'Transferência iniciada', + 'transfer_failed' => 'Falha na transferência', + 'already_transfering' => 'O servidor está sendo transferido no momento.', + ], + 'notes' => 'Anotações', + 'no_notes' => 'Sem anotações', + 'none' => 'Nenhum', +]; diff --git a/lang/pt_BR/admin/setting.php b/lang/pt_BR/admin/setting.php new file mode 100644 index 0000000000..1e7a8ffcd8 --- /dev/null +++ b/lang/pt_BR/admin/setting.php @@ -0,0 +1,157 @@ + 'Configurações', + 'save_success' => 'Configurações salvas', + 'save_failed' => 'Falha ao salvar as configurações.', + 'navigation' => [ + 'general' => 'Geral', + 'captcha' => 'Captcha', + 'mail' => 'Email', + 'backup' => 'Backup', + 'oauth' => 'OAuth', + 'misc' => 'Diversos', + ], + 'general' => [ + 'app_name' => 'Nome do Aplicativo', + 'app_logo' => 'Logo do Aplicativo', + 'app_logo_help' => 'A logo deve ser colocada na pasta public localizada no diretório raiz do painel. Deixe em branco para usar o nome do aplicativo.', + 'app_favicon' => 'Favicon do Aplicativo', + 'app_favicon_help' => 'O Favicon deve ser colocada na pasta public localizada no diretório raiz do painel.', + 'debug_mode' => 'Modo de Depuração', + 'navigation' => 'Navegação', + 'default_navigation' => 'Tipo de navegação padrão', + 'sidebar' => 'Barra Lateral', + 'topbar' => 'Barra Superior', + 'mixed' => 'Misto', + 'unit_prefix' => 'Prefixo da Unidade', + 'decimal_prefix' => 'Prefixo decimal (MB/GB)', + 'binary_prefix' => 'Prefixo Binário (MiB/GiB)', + '2fa_requirement' => 'Requisito do 2FA', + 'not_required' => 'Não obrigatório', + 'admins_only' => 'Apenas para Admins', + 'all_users' => 'Para todos os usuários', + 'trusted_proxies' => 'Proxies Confiáveis', + 'trusted_proxies_help' => 'Novo IP ou faixa de IP', + 'clear' => 'Limpar', + 'set_to_cf' => 'Definir para IPs do Cloudflare', + 'display_width' => 'Largura do Display', + 'avatar_provider' => 'Provedor do Avatar', + 'uploadable_avatars' => 'Permitir que os usuários façam upload do seu próprio avatar?', + ], + 'captcha' => [ + 'enable' => 'Ativar', + 'disable' => 'Desativar', + 'info_label' => 'Informação', + 'info' => 'VocÊ pode gerar as chaves em Cloudflare Dashboard. Uma conta Cloudflare é necessária.', + 'site_key' => 'Site Key', + 'secret_key' => 'Secret Key', + 'verify' => 'Verificar Domínio?', + ], + 'mail' => [ + 'mail_driver' => 'Driver do Email', + 'test_mail' => 'Enviar Email de Teste', + 'test_mail_sent' => 'Email de Teste Enviado', + 'test_mail_failed' => 'Email de Teste Falhou', + 'from_settings' => 'Configurações de Remetente', + 'from_settings_help' => 'Defina o endereço e o nome usados como "De" nos e-mails.', + 'from_address' => 'Endereço do Remetente', + 'from_name' => 'Nome do Remetente', + 'smtp' => [ + 'smtp_title' => 'Configuração do SMTP', + 'host' => 'Host', + 'port' => 'Porta', + 'username' => 'Nome de Usuário', + 'password' => 'Senha', + 'scheme' => 'Esquema', + ], + 'mailgun' => [ + 'mailgun_title' => 'Configurações do Mailgun', + 'domain' => 'Domínio', + 'secret' => 'Secret', + 'endpoint' => 'Endpoint', + ], + ], + 'backup' => [ + 'backup_driver' => 'Driver de Backup', + 'throttle' => 'Limites', + 'throttle_help' => 'Configurar quantos backups podem ser criados em um período. Defina o período 0 para desativar este limite.', + 'limit' => 'Limite', + 'period' => 'Período', + 'seconds' => 'Segundos', + 's3' => [ + 's3_title' => 'Configurações do S3', + 'default_region' => 'Default Region', + 'access_key' => 'Access Key ID', + 'secret_key' => 'Secret Access Key', + 'bucket' => 'Bucket', + 'endpoint' => 'Endpoint', + 'use_path_style_endpoint' => 'Usar Endpoint no estilo Path', + ], + ], + 'oauth' => [ + 'enable' => 'Ativar', + 'enable_schema' => 'Habilitar :schema', + 'disable' => 'Desativar', + 'client_id' => 'Client ID', + 'client_secret' => 'Client Secret', + 'redirect' => 'Redirect URL', + 'web_api_key' => 'Chave API do Aplicativo', + 'base_url' => 'Base URL', + 'display_name' => 'Nome de Exibição', + 'auth_url' => 'URL de callback de autorização', + 'create_missing_users' => 'Criar usuários que faltam automaticamente?', + 'link_missing_users' => 'Vincular usuários que faltam automaticamente?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Criação Automática de Alocação', + 'helper' => 'Alternar se os usuários podem criar alocações através da área do cliente.', + 'question' => 'Permitir que os Usuários criem Alocações?', + 'create_new' => 'Create new allocations if none available?', + 'create_new_help' => 'When enabled, creates new allocations. When disabled, only assigns from existing unassigned allocations. Both options factor the port range below into account.', + 'start' => 'Porta Inicial', + 'end' => 'Porta Final', + ], + 'mail_notifications' => [ + 'title' => 'Notificações por Email', + 'helper' => 'Alternar quais notificações devem ser enviadas aos usuários.', + 'server_installed' => 'Servidor Instalado', + 'server_reinstalled' => 'Servidor Reinstalado', + ], + 'connections' => [ + 'title' => 'Conexões', + 'helper' => 'Tempo Limite ao fazer requisições.', + 'request_timeout' => 'Tempo Limite de Requisição', + 'connection_timeout' => 'Tempo Limite de Requisição', + 'seconds' => 'Segundos', + ], + 'activity_log' => [ + 'title' => 'Registros de Atividade', + 'helper' => 'Configurar quantas vezes os logs de atividades antigos devem ser removidos e se as atividades de administrador devem ser registradas.', + 'prune_age' => 'Período de Limpeza', + 'days' => 'Dias', + 'log_admin' => 'Ocultar atividades do Admin?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Define o limite de taxa para o número de solicitações por minuto que podem ser executadas.', + 'client_rate' => 'Limite de Requisições da API para o Cliente', + 'app_rate' => 'Limite de Requisições da API do Aplicativo', + 'rpm' => 'Requisições por Minuto', + ], + 'server' => [ + 'title' => 'Servidores', + 'helper' => 'Configurações para Servidores', + 'edit_server_desc' => 'Permitir que os usuários editem as descrições?', + 'console_font_upload' => 'Upload da Fonte do Console', + 'console_font_hint' => 'Somente fontes *.ttf são suportadas. Fontes Mono são fortemente recomendadas!', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => 'Configurar com que frequência os logs de Webhook antigos devem ser removidos.', + 'prune_age' => 'Período de Limpeza', + 'days' => 'Dias', + ], + ], +]; diff --git a/lang/pt_BR/admin/user.php b/lang/pt_BR/admin/user.php new file mode 100644 index 0000000000..45bdc8b07f --- /dev/null +++ b/lang/pt_BR/admin/user.php @@ -0,0 +1,24 @@ + 'Usuários', + 'model_label' => 'Usuário', + 'model_label_plural' => 'Usuários', + 'self_delete' => 'Não é possível excluir você mesmo', + 'has_servers' => 'O Usuário Possui Servidores', + 'email' => 'Email', + 'username' => 'Nome de Usuário', + 'password' => 'Senha', + 'external_id' => 'Id externo', + 'is_managed_externally' => 'É gerenciado externamente?', + 'is_managed_externally_helper' => 'Se seus usuários são gerenciados por um software externo (por exemplo, um software de cobrança) você pode habilitar isto para impedir que usuários alterem seu nome de usuário, e-mail e senha dentro do painel.', + 'password_help' => 'Fornecer uma senha de usuário é opcional. Um novo email de usuário solicitará que os usuários criem uma senha na primeira tentativa de login.', + 'admin_roles' => 'Permissões de Administrador', + 'roles' => 'Permissões', + 'no_roles' => 'Sem Permissões', + 'servers' => 'Servidores', + 'subusers' => 'Sub-usuários', + 'password_reset' => 'Redefinir senha', + 'password_reset_sent' => 'E-mail de redefinição de senha enviado', + 'password_reset_failed' => 'Falha ao enviar e-mail de redefinição de senha', +]; diff --git a/lang/pt_BR/admin/webhook.php b/lang/pt_BR/admin/webhook.php new file mode 100644 index 0000000000..21c9fc1b61 --- /dev/null +++ b/lang/pt_BR/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Endpoint', + 'description' => 'Descrição', + 'no_webhooks' => 'Sem Webhooks', + 'help' => 'Ajuda', + 'help_text' => 'Você precisa envolver o nome da variável entre {{ }}. Por exemplo, se quiser obter o nome da API, pode usar {{name}}.', + 'test_now' => 'Teste Agora', + 'test_now_help' => 'Isso irá disparar um evento `created: Server`', + 'table' => [ + 'description' => 'Descrição', + 'endpoint' => 'Endpoint', + ], + 'headers' => 'Cabeçalhos ', + 'events' => 'Eventos', + 'regular' => 'Normal', + 'reset_headers' => 'Redefinir Cabeçalhos', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Perfil', + 'message' => 'Mensagem', + 'username' => 'Nome de Usuário', + 'avatar_url' => 'URL do Avatar', + 'forum_thread' => 'Nome do Fórum Tópico', + 'supress_embeds' => 'Suprimir Incorporações', + 'supress_embeds_text' => 'Não inclua nenhum embed ao serializar esta mensagem', + 'supress_notifications' => 'Suprimir Notificações', + 'supress_notifications_text' => 'Esta mensagem não irá ativar notificações push e desktop', + ], + 'discord_embed' => [ + 'add_embed' => 'Adicionar Balão', + 'flags' => 'Flags', + 'thumbnail' => 'URL da Miniatura', + 'embeds' => 'Balões', + 'thread_name' => 'Nome do Fórum Tópico', + 'allowed_mentions' => 'Menções Permitidas', + 'roles' => 'Permissões', + 'users' => 'Usuários', + 'everyone' => '@everyone e @here', + 'author' => 'Autor', + 'author_url' => 'URL do Autor', + 'author_icon_url' => 'URL do Ícone do Autor', + 'body' => 'Corpo', + 'title' => 'Título', + 'color' => 'Cor do Balão', + 'url' => 'URL', + 'images' => 'Imagens', + 'image_url' => 'URL da Imagem', + 'image_thumbnail' => 'URL da Miniatura', + 'footer' => 'Rodapé', + 'has_timestamp' => 'Tem Timestamp', + 'footer_icon_url' => 'URL do Ícone do Rodapé', + 'add_field' => 'Adicionar Campo', + 'fields' => 'Campos', + 'field_name' => 'Nome do Campo', + 'field_value' => 'Valor do Campo', + 'inline_field' => 'Campo em linha', + ], +]; diff --git a/lang/pt_BR/auth.php b/lang/pt_BR/auth.php new file mode 100644 index 0000000000..f25c1cc78a --- /dev/null +++ b/lang/pt_BR/auth.php @@ -0,0 +1,24 @@ + 'Essas credenciais não correspondem aos nossos registros.', + 'failed-two-factor' => 'Código de autenticação incorreto!', + 'two-factor-code' => 'Código de Dois Fatores', + 'two-factor-hint' => 'Você pode usar códigos de backup se você perder o acesso ao seu dispositivo.', + 'password' => 'A senha inserida está incorreta.', + 'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.', + '2fa_must_be_enabled' => 'O administrador exigiu que a Autenticação de 2 Fatores esteja habilitada para a sua conta para poder usar o Painel.', + +]; diff --git a/lang/pt_BR/command/messages.php b/lang/pt_BR/command/messages.php new file mode 100644 index 0000000000..9de4655410 --- /dev/null +++ b/lang/pt_BR/command/messages.php @@ -0,0 +1,54 @@ + [ + 'search_users' => 'Insira um Nome de Usuário, ID de Usuário ou Endereço Email', + 'select_search_user' => 'ID do usuário para apagar (Digite \'0\' para pesquisar novamente)', + 'deleted' => 'Usuário apagado do Painel com sucesso.', + 'confirm_delete' => 'Você tem certeza que deseja apagar esse usuário do Painel?', + 'no_users_found' => 'Nenhum usuário foi encontrado com o termo de pesquisa fornecido.', + 'multiple_found' => 'Foram encontradas várias contas para o usuário fornecido, não é possível excluir um usuário devido à flag --no-interaction', + 'ask_admin' => 'Este usuário é um administrador?', + 'ask_email' => 'Endereço de Email', + 'ask_username' => 'Nome de Usuário', + 'ask_password' => 'Senha', + 'ask_password_tip' => 'Se você gostaria de criar uma conta com uma senha aleatória enviada por e-mail para o usuário, execute novamente este comando (CTRL+C) e passe a flag `--no-password`.', + 'ask_password_help' => 'Senhas devem conter pelo menos 8 caracteres e pelo menos uma letra maiúscula e um número.', + '2fa_help_text' => 'Este comando desativará a autenticação de dois fatores para a conta de um usuário se estiver ativada. Isso só deve ser usado como um comando de recuperação de conta se o usuário tiver perdido completamente o acesso à conta. Se isso não é o que você queria fazer, pressione CTRL+C para sair desse processo.', + '2fa_disabled' => 'A autenticação de dois fatores foi desativada para o email :email.', + ], + 'schedule' => [ + 'output_line' => 'Executando a primeira tarefa de :schedule (:id).', + ], + 'maintenance' => [ + 'deleting_service_backup' => 'Apagando arquivo de backup do serviço :file.', + ], + 'server' => [ + 'rebuild_failed' => 'Pedido de reconstrução para ":name" (#:id) no Node ":node" falhou com o erro: :message', + 'reinstall' => [ + 'failed' => 'Pedido de reinstalação para ":name" (#:id) no Node ":node" falhou com o erro: :message', + 'confirm' => 'Você está prestes a reinstalar em um grupo de servidores. Quer continuar?', + ], + 'power' => [ + 'confirm' => 'Você está prestes a executar a ação :action em :count servidores. Deseja continuar?', + 'action_failed' => 'Pedido de ação de energia para ":name" (#:id) no Node ":node" falhou com o erro: :message', + ], + ], + 'environment' => [ + 'mail' => [ + 'ask_smtp_host' => 'Host SMTP (ex. smtp.gmail.com)', + 'ask_smtp_port' => 'Porta SMTP', + 'ask_smtp_username' => 'Nome de Usuário SMTP', + 'ask_smtp_password' => 'Senha SMTP', + 'ask_mailgun_domain' => 'Domínio do Mailgun', + 'ask_mailgun_endpoint' => 'Endpoint do Mailgun', + 'ask_mailgun_secret' => 'Secret do Mailgun', + 'ask_mandrill_secret' => 'Secret do Mandrill', + 'ask_postmark_username' => 'Chave API do Postmark', + 'ask_driver' => 'Qual driver deve ser usado para enviar emails?', + 'ask_mail_from' => 'Endereço de e-mail de onde os e-mails devem ser enviados', + 'ask_mail_name' => 'Nome que deve aparecer nos e-mails', + 'ask_encryption' => 'Método de criptografia a ser usado', + ], + ], +]; diff --git a/lang/pt_BR/commands.php b/lang/pt_BR/commands.php new file mode 100644 index 0000000000..761f92cb35 --- /dev/null +++ b/lang/pt_BR/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Forneça o endereço de email que os Eggs exportados por esse painel devem ter. Esse deve ser um endereço de email válido.', + 'url' => 'A URL da aplicação DEVE começar com https:// ou http://, dependendo se você está usando SSL ou não. Se você não incluir o esquema, seus e-mails e outros conteúdos irão apontar para o local incorreto.', + 'timezone' => 'O fuso horário deve corresponder a um dos fusos horários suportados pelo PHP. Se você não tiver certeza, consulte: https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Você selecionou o driver Redis para uma ou mais opções, por favor forneça as informações de conexão válidas abaixo. Na maioria dos casos, você pode usar os valores padrão fornecidos, a menos que tenha modificado sua configuração.', + 'comment' => 'Por padrão, uma instância do servidor Redis usa o nome de usuário default e não possui senha, pois está sendo executada localmente e é inacessível ao mundo externo. Se este for o seu caso, basta pressionar Enter sem digitar nenhum valor.', + 'confirm' => 'Parece que o campo :field já está definido para o Redis. Você gostaria de alterá-lo?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'É altamente recomendável não usar "localhost" como host do banco de dados, pois observamos problemas frequentes de conexão via socket. Se quiser usar uma conexão local, utilize "127.0.0.1".', + 'DB_USERNAME_note' => 'Usar a conta root para conexões MySQL não é apenas altamente desencorajado, como também não é permitido por este aplicativo. Você precisará criar um usuário MySQL específico para este software.', + 'DB_PASSWORD_note' => 'Parece que você já tem uma senha de conexão MySQL definida, gostaria de alterá-la?', + 'DB_error_2' => 'Suas credenciais de conexão NÃO foram salvas. Você precisará fornecer informações de conexão válidas antes de prosseguir.', + 'go_back' => 'Voltar e tentar novamente', + ], + 'make_node' => [ + 'name' => 'Insira um identificador curto usado para distinguir este Node dos outros', + 'description' => 'Insira uma descrição para identificar o Node', + 'scheme' => 'Por favor, digite https para SSL ou http para uma conexão sem conexão SSL', + 'fqdn' => 'Digite um nome de domínio (ex: node.example.com) a ser usado para conexão com o Daemon. Um endereço IP só pode ser usado se você não estiver usando SSL para este Node', + 'public' => 'Este Node deve ser público? Como nota, definir um Node como privado irá negar a capacidade de auto-implantar para este Node.', + 'behind_proxy' => 'Seu FQDN está por trás de um proxy?', + 'maintenance_mode' => 'O modo de manutenção deve ser habilitado?', + 'memory' => 'Digite a quantidade máxima de memória', + 'memory_overallocate' => 'Informe a quantidade de memória a ser superalocada. Use -1 para desativar a verificação e 0 para impedir a criação de novos servidores.', + 'disk' => 'Insira a quantidade máxima de espaço em disco', + 'disk_overallocate' => 'Informe a quantidade de disco a ser superalocada. Use -1 para desativar a verificação e 0 para impedir a criação de novos servidores.', + 'cpu' => 'Insira a quantidade máxima de CPU', + 'cpu_overallocate' => 'Informe a quantidade de CPU a ser superalocada. Use -1 para desativar a verificação e 0 para impedir a criação de novos servidores.', + 'upload_size' => "'Digite o tamanho máximo para upload de arquivos", + 'daemonListen' => 'Digite a porta do Daemon', + 'daemonConnect' => 'Digite a conexão da porta do daemon (pode ser a mesma que a porta de escuta)', + 'daemonSFTP' => 'Digite a porta do Daemon SFTP', + 'daemonSFTPAlias' => 'Digite o alias do Daemon SFTP (pode estar vazio)', + 'daemonBase' => 'Digite a pasta base', + 'success' => 'Um novo Node foi criado com sucesso com o nome :name e tem um ID de :id', + ], + 'node_config' => [ + 'error_not_exist' => 'O Node selecionado não existe.', + 'error_invalid_format' => 'Formato inválido especificado. As opções válidas são YAML e JSON', + ], + 'key_generate' => [ + 'error_already_exist' => 'Parece que você já configurou uma chave de criptografia da aplicação. Continuar com este processo irá sobrescrever essa chave e causar corrupção dos dados já criptografados. NÃO CONTINUE, A MENOS QUE SAIBA EXATAMENTE O QUE ESTÁ FAZENDO.', + 'understand' => 'Eu entendo as consequências de executar este comando e aceito toda a responsabilidade pela perda dos dados criptografados.', + 'continue' => 'Tem certeza que deseja continuar? Alterar a chave de criptografia da aplicação VAI CAUSAR PERDA DE DADOS.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Não há tarefas agendadas para servidores que precisem ser executadas.', + 'error_message' => 'Ocorreu um erro ao processar o agendamento: ', + ], + ], +]; diff --git a/lang/pt_BR/exceptions.php b/lang/pt_BR/exceptions.php new file mode 100644 index 0000000000..dffc848a3b --- /dev/null +++ b/lang/pt_BR/exceptions.php @@ -0,0 +1,64 @@ + 'Ocorreu uma exceção ao tentar se comunicar com o Daemon, resultando em um código de resposta HTTP/:code. Essa exceção foi registrada nos logs.', + 'node' => [ + 'servers_attached' => 'Um Node não pode ter servidores vinculados a ele para ser excluído.', + 'error_connecting' => 'Erro ao conectar-se ao :node', + 'daemon_off_config_updated' => 'A configuração do Daemon foi atualizada, porém ocorreu um erro ao tentar atualizar automaticamente o arquivo de configuração no Daemon. Você precisará atualizar manualmente o arquivo de configuração (config.yml) para que as alterações tenham efeito.', + ], + 'allocations' => [ + 'server_using' => 'Um servidor está atualmente atribuído a esta alocação. Uma alocação só pode ser excluída se nenhum servidor estiver atribuído a ela.', + 'too_many_ports' => 'Adicionar mais de 1000 portas em um único intervalo de uma vez não é suportado.', + 'invalid_mapping' => 'O mapeamento fornecido para :port é inválido e não pôde ser processado.', + 'cidr_out_of_range' => 'A notação CIDR permite apenas máscaras entre /25 e /32.', + 'port_out_of_range' => 'As portas em uma alocação devem ser maiores ou iguais a 1024 e menores ou iguais a 65535.', + ], + 'egg' => [ + 'delete_has_servers' => 'Um Egg com servidores ativos vinculados a ele não pode ser excluído do Painel.', + 'invalid_copy_id' => 'O Egg selecionado para copiar o script ou não existe, ou está copiando um script de outro Egg.', + 'has_children' => 'Este Egg é pai de um ou mais outros Eggs. Por favor, exclua esses Eggs antes de excluir este.', + ], + 'variables' => [ + 'env_not_unique' => 'A variável de ambiente :name deve ser única para este Egg.', + 'reserved_name' => 'A variável de ambiente :name é protegida e não pode ser atribuída a uma variável.', + 'bad_validation_rule' => 'A regra de validação ":rule" não é uma regra válida para esta aplicação.', + ], + 'importer' => [ + 'json_error' => 'Ocorreu um erro ao tentar analisar o arquivo JSON: :error.', + 'file_error' => 'O arquivo JSON fornecido não é válido.', + 'invalid_json_provided' => 'O arquivo JSON fornecido não está em um formato reconhecível.', + ], + 'subusers' => [ + 'editing_self' => 'Editar sua própria conta de sub-usuário não é permitido.', + 'user_is_owner' => 'Você não pode adicionar o proprietário do servidor como sub-usuário deste servidor.', + 'subuser_exists' => 'Um usuário com esse endereço de e-mail já está designado como sub-usuário deste servidor.', + ], + 'databases' => [ + 'delete_has_databases' => 'Não é possível excluir um servidor host de banco de dados que possui bancos de dados ativos vinculados a ele.', + ], + 'tasks' => [ + 'chain_interval_too_long' => 'O tempo máximo de intervalo para uma tarefa encadeada é de 15 minutos.', + ], + 'locations' => [ + 'has_nodes' => 'Não é possível excluir um local que possui Nodes ativos vinculados a ele.', + ], + 'users' => [ + 'is_self' => 'Não é possível excluir sua própria conta de usuário.', + 'has_servers' => 'Não é possível excluir um usuário que possui servidores ativos vinculados à sua conta. Por favor, exclua os servidores dele antes de continuar.', + 'node_revocation_failed' => 'Falha ao revogar chaves no Node #:node. \:error', + ], + 'deployment' => [ + 'no_viable_nodes' => 'Nenhum Node que atenda aos requisitos especificados para implantação automática foi encontrado.', + 'no_viable_allocations' => 'Nenhuma alocação que atenda aos requisitos para implantação automática foi encontrada.', + ], + 'api' => [ + 'resource_not_found' => 'O recurso solicitado não existe neste servidor.', + ], + 'mount' => [ + 'servers_attached' => 'Uma montagem não deve ter servidores anexados a ela para ser excluída.', + ], + 'server' => [ + 'marked_as_failed' => 'Este servidor ainda não concluiu seu processo de instalação, por favor, tente novamente mais tarde.', + ], +]; diff --git a/lang/pt_BR/installer.php b/lang/pt_BR/installer.php new file mode 100644 index 0000000000..e119e48499 --- /dev/null +++ b/lang/pt_BR/installer.php @@ -0,0 +1,114 @@ + 'Instalador do painel', + 'requirements' => [ + 'title' => 'Requisitos do servidor', + 'sections' => [ + 'version' => [ + 'title' => 'Versão do PHP', + 'or_newer' => ':version ou mais recente', + 'content' => 'Sua versão do PHP é :version.', + ], + 'extensions' => [ + 'title' => 'Extensões PHP', + 'good' => 'Todas as extensões PHP necessárias estão instaladas.', + 'bad' => 'As seguintes extensões do PHP estão faltando: :extensions', + ], + 'permissions' => [ + 'title' => 'Permissões da pasta', + 'good' => 'Todas as pastas têm as permissões corretas.', + 'bad' => 'As seguintes pastas têm permissões incorretas: :folders', + ], + ], + 'exception' => 'Alguns requisitos estão faltando', + ], + 'environment' => [ + 'title' => 'Ambiente', + 'fields' => [ + 'app_name' => 'Nome do Aplicativo', + 'app_name_help' => 'Este será o nome do seu painel.', + 'app_url' => 'URL do aplicativo', + 'app_url_help' => 'Esta será a URL de acesso ao seu painel.', + 'account' => [ + 'section' => 'Usuário administrador', + 'email' => 'E-mail', + 'username' => 'Nome de usuário', + 'password' => 'Senha', + ], + ], + ], + 'database' => [ + 'title' => 'Banco de dados', + 'driver' => 'Driver do banco de dados', + 'driver_help' => 'O driver utilizado para o banco de dados do painel. Recomendamos "SQLite".', + 'fields' => [ + 'host' => 'Host do banco de dados', + 'host_help' => 'Host do banco de dados. Certifique-se de que está acessível.', + 'port' => 'Porta do banco de dados', + 'port_help' => 'A porta do seu banco de dados.', + 'path' => 'Caminho do banco de dados', + 'path_help' => 'O caminho do seu arquivo .sqlite relativo à pasta do banco de dados.', + 'name' => 'Nome do banco de dados', + 'name_help' => 'O nome do banco de dados do painel.', + 'username' => 'Usuário do banco de dados', + 'username_help' => 'O username do seu banco de dados.', + 'password' => 'Senha do banco de dados', + 'password_help' => 'A senha do usuário do banco de dados. Pode estar vazio.', + ], + 'exceptions' => [ + 'connection' => 'Falha na conexão com o banco de dados', + 'migration' => 'Falha na migrações', + ], + ], + 'egg' => [ + 'title' => 'Eggs', + 'no_eggs' => 'Sem eggs disponíveis', + 'background_install_started' => 'Instalação de egg iniciada', + 'background_install_description' => 'A instalação de :count eggs foi colocada na fila e continuará em segundo plano.', + 'exceptions' => [ + 'failed_to_update' => 'Falha ao atualizar index de eggs', + 'no_eggs' => 'Não há eggs disponíveis para instalação neste momento.', + 'installation_failed' => 'Falha ao instalar eggs selecionados. Por favor, importe-os após a instalação ultilizando a lista de eggs.', + ], + ], + 'session' => [ + 'title' => 'Sessão', + 'driver' => 'Drivers de sessão', + 'driver_help' => 'O driver usado para armazenar as sessões. Recomendamos "Filesystem" ou "Database".', + ], + 'cache' => [ + 'title' => 'Cache', + 'driver' => 'Driver de cache', + 'driver_help' => 'O driver usado para cache. Recomendamos o "Filesystem".', + 'fields' => [ + 'host' => 'Host do Redis', + 'host_help' => 'O host do seu servidor redis. Certifique-se de que esteja acessível.', + 'port' => 'Porta do Redis', + 'port_help' => 'A porta do seu servidor redis.', + 'username' => 'Usuário do Redis', + 'username_help' => 'O username do seu servidor Redis. Pode ser vazio', + 'password' => 'Senha do Redis', + 'password_help' => 'A senha do usuário Redis. Pode estar vazia.', + ], + 'exception' => 'Falha na conexão com o Redis', + ], + 'queue' => [ + 'title' => 'Fila', + 'driver' => 'Driver da fila', + 'driver_help' => 'O driver usado para lidar com filas. Recomendamos "Database".', + 'fields' => [ + 'done' => 'Eu fiz os dois passos abaixo.', + 'done_validation' => 'Você precisa fazer os dois passos antes de continuar!', + 'crontab' => 'Execute o comando a seguir para configurar seu crontab. Note que www-data é o usuário do seu servidor web. Em alguns sistemas, este nome de usuário pode ser diferente!', + 'service' => 'Para configurar a fila de serviço do worker você simplesmente tem que executar o seguinte comando.', + ], + ], + 'exceptions' => [ + 'write_env' => 'Não foi possível escrever no arquivo .env', + 'migration' => 'Não foi possível executar as migrações', + 'create_user' => 'Não foi possível criar o usuário administrador', + ], + 'next_step' => 'Próximo passo', + 'finish' => 'Finalizar', +]; diff --git a/lang/pt_BR/notifications.php b/lang/pt_BR/notifications.php new file mode 100644 index 0000000000..b58e148ced --- /dev/null +++ b/lang/pt_BR/notifications.php @@ -0,0 +1,18 @@ + 'Abrir servidor', + 'installation_completed' => 'Instalação do servidor concluída', + 'installation_failed' => 'Instalação do servidor falhou', + 'reinstallation_completed' => 'Reinstalação do servidor concluída', + 'reinstallation_failed' => 'Reinstalação de servidor falhou', + 'failed' => 'Falhou', + 'user_added' => [ + 'title' => 'Adicionado ao servidor', + 'body' => 'Você foi adicionado como um sub usuário ao servidor :server.', + ], + 'user_removed' => [ + 'title' => 'Removido do servidor', + 'body' => 'Você foi removido como um sub-usuário do servidor :server.', + ], +]; diff --git a/lang/pt_BR/profile.php b/lang/pt_BR/profile.php new file mode 100644 index 0000000000..6f0c286ff6 --- /dev/null +++ b/lang/pt_BR/profile.php @@ -0,0 +1,70 @@ + 'Perfil', + 'tabs' => [ + 'account' => 'Conta', + 'oauth' => 'OAuth', + 'activity' => 'Atividade', + 'api_keys' => 'Chaves API', + 'ssh_keys' => 'Chaves SSH', + 'keys' => 'Chaves', + '2fa' => '2FA', + 'customization' => 'Customização', + ], + 'username' => 'Nome de Usuário', + 'admin' => 'Administrador', + 'exit_admin' => 'Sair do Administrador', + 'server_list' => 'Lista de servidores', + 'email' => 'E-mail', + 'password' => 'Senha', + 'current_password' => 'Senha Atual', + 'password_confirmation' => 'Confirmação de Senha', + 'timezone' => 'Fuso Horário', + 'language' => 'Idioma', + 'language_help' => 'Seu idioma :state ainda não foi traduzido!', + 'link' => 'Vincular ', + 'unlink' => 'Desvincular ', + 'unlinked' => ':name Desvinculado(a)', + 'scan_qr' => 'Escaneie o código QR', + 'code' => 'Código', + 'setup_key' => 'Chave de Configuração', + 'invalid_code' => 'Código 2FA inválido', + 'code_help' => 'Leia o código QR acima usando o seu aplicativo de autenticação em duas etapas e digite o código gerado.', + '2fa_enabled' => 'A Autenticação em Duas Etapas está habilitada!', + 'backup_help' => 'Não será possível voltar a mostrá-los!', + 'backup_codes' => 'Códigos de Backup', + 'disable_2fa' => 'Desativar 2FA', + 'disable_2fa_help' => 'Digite seu código 2FA atual para desativar a Autenticação em Duas Etapas', + 'api_keys' => 'Chaves de API', + 'create_api_key' => 'Criar chave de API', + 'api_key_created' => 'Chave de API criada', + 'description' => 'Descrição', + 'allowed_ips' => 'IPs Permitidos', + 'allowed_ips_help' => 'Pressione enter para adicionar um novo endereço IP ou deixe em branco para permitir que qualquer endereço IP', + 'ssh_keys' => 'Chaves SSH', + 'create_ssh_key' => 'Criar chave SSH', + 'ssh_key_created' => 'Chave SSH criada', + 'name' => 'Nome', + 'public_key' => 'Chave pública', + 'could_not_create_ssh_key' => 'Não foi possível criar a chave ssh', + 'dashboard' => 'Painel', + 'dashboard_layout' => 'Layout do Painel', + 'console' => 'Console', + 'grid' => 'Grade', + 'table' => 'Tabela', + 'rows' => 'Linhas', + 'font_size' => 'Tamanho da Fonte', + 'font' => 'Fonte', + 'font_preview' => 'Visualização de Fonte', + 'seconds' => 'Segundos', + 'graph_period' => 'Período do Gráfico', + 'graph_period_helper' => 'A quantidade de pontos de dados, segundos, mostrados nos gráficos de console.', + 'navigation' => 'Tipo de navegação', + 'sidebar' => 'Barra lateral', + 'topbar' => 'Barra superior', + 'mixed' => 'Misto', + 'no_oauth' => 'Nenhuma conta vinculada', + 'no_api_keys' => 'Nenhuma chave API', + 'no_ssh_keys' => 'Nenhuma chave SSH', +]; diff --git a/lang/pt_BR/search.php b/lang/pt_BR/search.php new file mode 100644 index 0000000000..f09baea3d8 --- /dev/null +++ b/lang/pt_BR/search.php @@ -0,0 +1,9 @@ + 'Por favor, insira pelo menos três caracteres para começar a busca.', + 'term' => [ + 'label' => 'Termo de pesquisa', + 'description' => 'Digite um nome do servidor, UUID ou alocação para começar a busca.', + ], +]; diff --git a/lang/pt_BR/server/activity.php b/lang/pt_BR/server/activity.php new file mode 100644 index 0000000000..d72df9d58c --- /dev/null +++ b/lang/pt_BR/server/activity.php @@ -0,0 +1,11 @@ + 'Atividade', + 'event' => 'Evento', + 'user' => 'Usuário', + 'deleted_user' => 'Usuário excluído', + 'system' => 'Sistema', + 'timestamp' => 'Marcação de data/hora', + 'metadata' => 'Metadados', +]; diff --git a/lang/pt_BR/server/backup.php b/lang/pt_BR/server/backup.php new file mode 100644 index 0000000000..27e5000583 --- /dev/null +++ b/lang/pt_BR/server/backup.php @@ -0,0 +1,55 @@ + 'Backups', + 'empty' => 'Nenhum backup', + 'size' => 'Tamanho', + 'created_at' => 'Criado em', + 'status' => 'Status', + 'is_locked' => 'Status de bloqueio', + 'backup_status' => [ + 'in_progress' => 'Em andamento', + 'successful' => 'Bem-sucedido', + 'failed' => 'Falhou', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Criar Backup', + 'limit' => 'Limite de Backup Atingido', + 'created' => ':name criado', + 'notification_success' => 'Backup Criado com Sucesso', + 'notification_fail' => 'Criação de Backup Falhou', + 'name' => 'Nome', + 'ignored' => 'Arquivos e Diretórios Ignorados', + 'locked' => 'Bloqueado?', + 'lock_helper' => 'Impede que esse backup seja excluído até ser explicitamente desbloqueado.', + ], + 'lock' => [ + 'lock' => 'Bloquear', + 'unlock' => 'Desbloquear', + ], + 'download' => 'Fazer Download', + 'rename' => [ + 'title' => 'Renomear', + 'new_name' => 'Nome do backup', + 'notification_success' => 'Backup renomeado com sucesso', + ], + 'restore' => [ + 'title' => 'Restaurar', + 'helper' => 'Seu servidor será desligado. Durante esse processo, você não poderá ligá-lo ou desligá-lo, acessar o gerenciador de arquivos ou criar backups adicionais.', + 'delete_all' => 'Excluir todos os arquivos antes de restaurar o backup?', + 'notification_started' => 'Restaurando Backup', + 'notification_success' => 'Backup Restaurado com Sucesso', + 'notification_fail' => 'Falha ao Restaurar Backup', + 'notification_fail_body_1' => 'Este servidor não está em um estado que permita a restauração de um backup.', + 'notification_fail_body_2' => 'Este backup não pode restaurado no momento: não concluído ou falhou.', + ], + 'delete' => [ + 'title' => 'Excluir Backup', + 'description' => 'Você deseja excluir :backup?', + 'notification_success' => 'Backup Excluído', + 'notification_fail' => 'Não foi possível excluir backup', + 'notification_fail_body' => 'Falha na conexão com o servidor. Por favor, tente novamente.', + ], + ], +]; diff --git a/lang/pt_BR/server/console.php b/lang/pt_BR/server/console.php new file mode 100644 index 0000000000..beb6ec4a83 --- /dev/null +++ b/lang/pt_BR/server/console.php @@ -0,0 +1,43 @@ + 'Console', + 'command' => 'Digite um comando...', + 'command_blocked' => 'Servidor Offline...', + 'command_blocked_title' => 'Não é possível enviar um comando quando o servidor está Offline', + 'open_in_admin' => 'Abrir como Administrador', + 'power_actions' => [ + 'start' => 'Iniciar', + 'stop' => 'Parar', + 'restart' => 'Reiniciar', + 'kill' => 'Forçar Parada', + 'kill_tooltip' => 'Isso pode resultar em corrupção e/ou perda de dados!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Memória', + 'network' => 'Rede', + 'disk' => 'Disco', + 'name' => 'Nome', + 'status' => 'Status', + 'address' => 'Endereço', + 'unavailable' => 'Indisponível', + ], + 'status' => [ + 'created' => 'Criado', + 'starting' => 'Iniciando', + 'running' => 'Em execução', + 'restarting' => 'Reiniciando', + 'exited' => 'Encerrado', + 'paused' => 'Pausado', + 'dead' => 'Encerrado Forçadamente', + 'removing' => 'Excluindo', + 'stopping' => 'Parando', + 'offline' => 'Offline', + 'missing' => 'Ausente', + ], + 'websocket_error' => [ + 'title' => 'Não foi possível conectar ao websocket!', + 'body' => 'Verifique o console do seu navegador para mais detalhes.', + ], +]; diff --git a/lang/pt_BR/server/dashboard.php b/lang/pt_BR/server/dashboard.php new file mode 100644 index 0000000000..7d7b65a709 --- /dev/null +++ b/lang/pt_BR/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servidores', + 'list' => 'Lista de Servidores', + 'tabs' => [ + 'my' => 'Meus servidores', + 'other' => 'Outros servidores', + 'all' => 'Todos os servidores', + ], + 'empty_own' => 'Você não possui servidores!', + 'empty_other' => 'Você não tem acesso a nenhum servidor!', + + 'status' => 'Status', + 'server' => 'Servidor', + 'resources' => 'Recursos', + 'usage_limit' => 'Limite de Uso: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Memória', + 'disk' => 'Disco', + 'network' => 'Rede', + 'none' => 'Nenhum', + 'loading' => 'Carregando...', + + 'power_actions' => 'Ações de Energia', + 'power_action_sent' => ':action enviada para :name', +]; diff --git a/lang/pt_BR/server/database.php b/lang/pt_BR/server/database.php new file mode 100644 index 0000000000..821dfab151 --- /dev/null +++ b/lang/pt_BR/server/database.php @@ -0,0 +1,26 @@ + 'Bancos de Dados', + 'empty' => 'Nenhum banco de dados', + 'create_database' => 'Criar Banco de Dados', + 'limit' => 'Limite do banco de dados atingido', + 'viewing' => 'Visualizando: :database', + 'host' => 'Host', + 'database' => 'Banco de dados', + 'username' => 'Nome de Usuário', + 'password' => 'Senha', + 'remote' => 'Remoto', + 'created_at' => 'Criado em', + 'name' => 'Nome do Banco de Dados', + 'name_hint' => 'Deixar este campo em branco irá gerar um nome aleatório automaticamente', + 'connections_from' => 'Conexões De', + 'max_connections' => 'Máximo de Conexões', + 'database_host' => 'Host do Banco de Dados', + 'database_host_select' => 'Selecionar Host do Banco de Dados', + 'jdbc' => 'String de Conexão JDBC', + 'create_notification' => ':database criado', + 'create_notification_fail' => 'Falha ao criar :database', + 'delete_notification' => ':database deletado', + 'delete_notification_fail' => 'Falha ao deletar :database', +]; diff --git a/lang/pt_BR/server/file.php b/lang/pt_BR/server/file.php new file mode 100644 index 0000000000..1b627e71b3 --- /dev/null +++ b/lang/pt_BR/server/file.php @@ -0,0 +1,111 @@ + 'Arquivos', + 'name' => 'Nome', + 'size' => 'Tamanho', + 'modified_at' => 'Modificado em', + 'actions' => [ + 'open' => 'Abrir', + 'download' => 'Fazer Download', + 'copy' => [ + 'title' => 'Copiar', + 'notification' => 'Arquivo Copiado', + ], + 'upload' => [ + 'title' => 'Fazer Upload', + 'from_files' => 'Enviar Arquivos', + 'from_url' => 'Upload da URL', + 'url' => 'URL', + 'drop_files' => 'Arraste os arquivos para enviar', + 'success' => 'Arquivos enviados com sucesso', + 'failed' => 'Falha ao enviar arquivos', + 'header' => 'Enviando arquivos', + 'error' => 'Ocorreu um erro ao enviar', + ], + 'rename' => [ + 'title' => 'Renomear', + 'file_name' => 'Nome do Arquivo', + 'notification' => 'Arquivo Renomeado', + ], + 'move' => [ + 'title' => 'Mover', + 'directory' => 'Diretório', + 'directory_hint' => 'Informe o novo diretório, relativo ao diretório atual', + 'new_location' => 'Novo Local', + 'new_location_hint' => 'Informe o local deste arquivo ou pasta, relativo ao diretório atual.', + 'notification' => 'Arquivo Movido', + 'bulk_notification' => ':count arquivos foram movidos para :directory', + ], + 'permissions' => [ + 'title' => 'Permissões', + 'read' => 'Leitura', + 'write' => 'Escrita', + 'execute' => 'Executar', + 'owner' => 'Proprietário', + 'group' => 'Grupo', + 'public' => 'Público', + 'notification' => 'Permissões alteradas para :mode', + ], + 'archive' => [ + 'title' => 'Arquivar', + 'archive_name' => 'Nome do Arquivo', + 'notification' => 'Arquivo Criado', + 'extension' => 'Extensão', + ], + 'unarchive' => [ + 'title' => 'Desarquivar', + 'notification' => 'Desarquivamento Concluído', + ], + 'new_file' => [ + 'title' => 'Novo arquivo', + 'file_name' => 'Nome do novo arquivo', + 'syntax' => 'Destaque de Sintaxe', + 'create' => 'Criar', + ], + 'new_folder' => [ + 'title' => 'Nova pasta', + 'folder_name' => 'Nome da nova pasta', + ], + 'nested_search' => [ + 'title' => 'Nested Search', + 'search_term' => 'Search term', + 'search_term_placeholder' => 'Enter a search term, ex. *.txt', + 'search' => 'Search', + 'search_for_term' => 'Search :term', + ], + 'delete' => [ + 'notification' => 'Arquivo Excluído', + 'bulk_notification' => ':count arquivos foram excluídos', + ], + 'edit' => [ + 'title' => 'Editando: :file', + 'save_close' => 'Salvar e Fechar', + 'save' => 'Salvar', + 'cancel' => 'Cancelar', + 'notification' => 'Arquivo Salvo', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name é muito grande!', + 'body' => 'O máximo é :max', + ], + 'file_not_found' => [ + 'title' => ':name não encontrado!', + ], + 'file_not_editable' => [ + 'title' => ':name é um diretório', + ], + 'file_already_exists' => [ + 'title' => ':name já existe!', + ], + 'files_node_error' => [ + 'title' => 'Não foi possível carregar os arquivos!', + ], + 'pelicanignore' => [ + 'title' => 'Você está editando um arquivo .pelicanignore!', + 'body' => 'Quaisquer arquivos ou diretórios listados aqui serão excluídos dos backups. Curingas são suportados ao usar um asterisco (*).
Você pode negar uma regra prévia adicionando um ponto de exclamação (!).', + ], + ], +]; diff --git a/lang/pt_BR/server/network.php b/lang/pt_BR/server/network.php new file mode 100644 index 0000000000..cbb6d967bd --- /dev/null +++ b/lang/pt_BR/server/network.php @@ -0,0 +1,17 @@ + 'Rede', + 'add' => 'Adicionar Alocação', + 'limit' => 'Limite de alocação atingido', + 'address' => 'Endereço', + 'port' => 'Porta', + 'notes' => 'Anotações', + 'no_notes' => 'Sem anotações', + 'make_primary' => 'Tornar Primário', + 'primary' => 'Primário', + 'make' => 'Fazer', + 'delete' => 'Excluir', + 'locked' => 'Bloqueado?', + 'locked_helper' => 'Alocações bloqueadas só podem ser excluídas por administradores', +]; diff --git a/lang/pt_BR/server/schedule.php b/lang/pt_BR/server/schedule.php new file mode 100644 index 0000000000..cdabcd2321 --- /dev/null +++ b/lang/pt_BR/server/schedule.php @@ -0,0 +1,121 @@ + 'Agendamentos', + 'new' => 'Novo agendamento', + 'edit' => 'Editar agendamento', + 'save' => 'Salvar agendamento', + 'delete' => 'Excluir agendamento', + 'import' => 'Importar agendamento', + 'export' => 'Exportar agendamento', + 'name' => 'Nome', + 'cron' => 'Cron', + 'status' => 'Status', + 'schedule_status' => [ + 'inactive' => 'Inativo', + 'processing' => 'Processando', + 'active' => 'Ativo', + ], + 'no_tasks' => 'Sem tarefas', + 'run_now' => 'Executar agora', + 'online_only' => 'Somente quando estiver on-line', + 'last_run' => 'Última execução', + 'next_run' => 'Próxima execução', + 'never' => 'Nunca', + 'cancel' => 'Cancelar', + + 'only_online' => 'Somente quando o servidor estiver on-line?', + 'only_online_hint' => 'Só executa essa agenda quando o servidor está em estado de execução.', + 'enabled' => 'Habilitar agendamento?', + 'enabled_hint' => 'Este agendamento será executado automaticamente se ativado.', + + 'cron_body' => 'Tenha em mente que as entradas do cron abaixo sempre assumem UTC.', + 'cron_timezone' => 'Próxima execução em seu fuso horário (:timezone): :next_run ', + + 'invalid' => 'Inválido', + + 'time' => [ + 'minute' => 'Minuto', + 'hour' => 'Hora', + 'day' => 'Dia', + 'week' => 'Semana', + 'month' => 'Mês', + 'day_of_month' => 'Dia do mês', + 'day_of_week' => 'Dia da Semana', + + 'hourly' => 'De hora em hora', + 'daily' => 'Diariamente', + 'weekly_mon' => 'Semanalmente (Segunda-feira)', + 'weekly_sun' => 'Semanalmente (Domingo)', + 'monthly' => 'Mensalmente', + 'every_min' => 'A cada X minutos', + 'every_hour' => 'A cada X horas', + 'every_day' => 'A cada X dias', + 'every_week' => 'A cada X semanas', + 'every_month' => 'A cada X meses', + 'every_day_of_week' => 'Todo dia X da semana', + + 'every' => 'Todo', + 'minutes' => 'Minutos', + 'hours' => 'Horas', + 'days' => 'Dias', + 'months' => 'Meses', + + 'monday' => 'Segunda-feira', + 'tuesday' => 'Terça-feira', + 'wednesday' => 'Quarta-feira', + 'thursday' => 'Quinta-feira', + 'friday' => 'Sexta-feira', + 'saturday' => 'Sábado', + 'sunday' => 'Domingo', + ], + + 'tasks' => [ + 'title' => 'Tarefas', + 'create' => 'Criar Tarefa', + 'limit' => 'Limite de Tarefas Alcançado', + 'action' => 'Ação', + 'payload' => 'Carga útil', + 'no_payload' => 'No Payload', + 'time_offset' => 'Diferença horária', + 'first_task' => 'Primeira tarefa', + 'seconds' => 'Segundos', + 'continue_on_failure' => 'Continuar ao falhar', + + 'actions' => [ + 'title' => 'Ação', + 'power' => [ + 'title' => 'Enviar ação de energia', + 'action' => 'Ação de energia', + 'start' => 'Iniciar', + 'stop' => 'Parar', + 'restart' => 'Reiniciar', + 'kill' => 'Forçar Parada', + ], + 'command' => [ + 'title' => 'Enviar comando', + 'command' => 'Comando', + ], + 'backup' => [ + 'title' => 'Criar Backup', + 'files_to_ignore' => 'Arquivos para ignorar', + ], + 'delete_files' => [ + 'title' => 'Delete Files', + 'files_to_delete' => 'Files to Delete', + ], + ], + ], + + 'notification_invalid_cron' => 'Os dados cron fornecidos não correspondem a uma expressão válida.', + + 'import_action' => [ + 'file' => 'Arquivo', + 'url' => 'URL', + 'schedule_help' => 'Este deve ser um arquivo JSON bruto (schedule-daily-restart.json)', + 'url_help' => 'URLs devem apontar diretamente para o arquivo .json bruto', + 'add_url' => 'Nova URL', + 'import_failed' => 'Importação falhou', + 'import_success' => 'Importação bem-sucedida', + ], +]; diff --git a/lang/pt_BR/server/setting.php b/lang/pt_BR/server/setting.php new file mode 100644 index 0000000000..4232404562 --- /dev/null +++ b/lang/pt_BR/server/setting.php @@ -0,0 +1,55 @@ + 'Configurações', + 'server_info' => [ + 'title' => 'Informações do servidor', + 'information' => 'Informação', + 'name' => 'Nome do servidor', + 'server_name' => 'Nome do servidor: :name', + 'notification_name' => 'Nome do servidor atualizado', + 'description' => 'Descrição do Servidor', + 'notification_description' => 'Descrição do servidor atualizada', + 'failed' => 'Falhou', + 'uuid' => 'UUID do servidor', + 'uuid_short' => 'ID do servidor', + 'node_name' => 'Nome do nó', + 'icon' => [ + 'upload' => 'Upload Icon', + 'tooltip' => 'Using Egg Icon', + 'updated' => 'Server icon updated', + 'deleted' => 'Server icon deleted', + ], + 'limits' => [ + 'title' => 'Limites', + 'unlimited' => 'Ilimitado', + 'of' => 'de', + 'cpu' => 'CPU', + 'memory' => 'Memória', + 'disk' => 'Espaço em Disco', + 'backups' => 'Backups', + 'databases' => 'Bancos de Dados', + 'allocations' => 'Alocações', + 'no_allocations' => 'Sem Alocações Adicionais', + ], + 'sftp' => [ + 'title' => 'Informações do SFTP', + 'connection' => 'Conexão', + 'action' => 'Conectar ao SFTP', + 'username' => 'Nome de usuário', + 'password' => 'Senha', + 'password_body' => 'Sua senha do SFTP é a mesma que senha que você usa para acessar este painel.', + ], + ], + 'reinstall' => [ + 'title' => 'Reinstalar Servidor', + 'body' => 'Reinstalar seu servidor irá pará-lo, e em seguida execute novamente o script de instalação que o configurou inicialmente.', + 'body2' => 'Alguns arquivos podem ser deletados ou modificados durante esse processo. Por favor, faça um backup dos seus arquivos antes de continuar.', + 'action' => 'Reinstalar', + 'modal' => 'Você tem certeza que deseja reinstalar este servidor?', + 'modal_description' => 'Alguns arquivos podem ser deletados ou modificados durante esse processo. Por favor, faça um backup dos seus arquivos antes de continuar.', + 'yes' => 'Sim, reinstalar', + 'notification_start' => 'Reinstalação iniciada', + 'notification_fail' => 'Falha ao reinstalar', + ], +]; diff --git a/lang/pt_BR/server/startup.php b/lang/pt_BR/server/startup.php new file mode 100644 index 0000000000..1ee2844993 --- /dev/null +++ b/lang/pt_BR/server/startup.php @@ -0,0 +1,17 @@ + 'Inicialização', + 'command' => 'Comando de Inicialização', + 'notification_startup' => 'Comando de inicialização atualizado', + 'notification_startup_body' => 'Reinicie o servidor para usar o novo comando de inicialização.', + 'enable_preview' => 'Habilitar pré-visualização', + 'disable_preview' => 'Desativar pré-visualização', + 'docker_image' => 'Imagem Docker', + 'notification_docker' => 'Imagem Docker atualizada', + 'notification_docker_body' => 'Reinicie o servidor para usar a nova imagem.', + 'variables' => 'Variáveis do Servidor', + 'update' => 'Atualizada: :variable', + 'fail' => 'Falha: :variable', + 'validation_fail' => 'Falha na validação: :variable', +]; diff --git a/lang/pt_BR/server/user.php b/lang/pt_BR/server/user.php new file mode 100644 index 0000000000..54c3579674 --- /dev/null +++ b/lang/pt_BR/server/user.php @@ -0,0 +1,73 @@ + 'Usuários', + 'username' => 'Nome de Usuário', + 'email' => 'Email', + 'assign_all' => 'Atribuir tudo', + 'invite_user' => 'Convidar usuário', + 'action' => 'Convidar', + 'remove' => 'Remover usuário', + 'edit' => 'Editar usuário', + 'editing' => 'Editando :user', + 'delete' => 'Deletar usuário', + 'notification_add' => 'Usuário convidado!', + 'notification_edit' => 'Usuário atualizado!', + 'notification_delete' => 'Usuário deletado!', + 'notification_failed' => 'Falha ao convidar usuário!', + 'permissions' => [ + 'title' => 'Permissões', + 'activity_desc' => 'Permissões que controlam o acesso do usuário aos registros de atividade do servidor.', + 'startup_desc' => 'Permissões que controlam a capacidade do usuário de visualizar os parâmetros de inicialização deste servidor.', + 'settings_desc' => 'Permissões que controlam a capacidade do usuário de modificar as configurações deste servidor.', + 'control_desc' => 'Permissões que controlam a capacidade do usuário de controlar o estado de energia do servidor ou enviar comandos.', + 'user_desc' => 'Permissões que permitem a um usuário gerenciar outros sub-usuários em um servidor. Eles nunca poderão editar a própria conta ou conceder permissões que não possuam.', + 'file_desc' => 'Permissões que controlam a capacidade do usuário de modificar o sistema de arquivos deste servidor.', + 'allocation_desc' => 'Permissões que controlam a capacidade do usuário de modificar as alocações de portas deste servidor.', + 'database_desc' => 'Permissões que controlam o acesso do usuário ao gerenciamento de banco de dados deste servidor.', + 'backup_desc' => 'Permissões que controlam a capacidade do usuário de gerar e gerenciar backups do servidor.', + 'schedule_desc' => 'Permissões que controlam o acesso do usuário ao gerenciamento de agendamentos deste servidor.', + 'startup_read' => 'Permite o usuário visualizar os parâmetros de inicialização do servidor', + 'startup_update' => 'Permite o usuário editar os parâmetros de inicialização do servidor', + 'startup_docker_image' => 'Permite que o usuário modifique a imagem Docker usada ao executar o servidor.', + 'settings_reinstall' => 'Permite que o usuário reinstale o servidor.', + 'settings_rename' => 'Permite que o usuário renomeie este servidor.', + 'settings_description' => 'Permite que o usuário troque a descrição desse servidor.', + 'activity_read' => 'Permite que o usuário visualize os registros de atividades deste servidor.', + 'websocket_connect' => 'Permite que um usuário acesse o websocket para este servidor.', + 'control_console' => 'Permite que o usuário envie dados no console desse servidor.', + 'control_start' => 'Permite que o usuário inicie esse servidor.', + 'control_stop' => 'Permite que o usuário pare esse servidor.', + 'control_restart' => 'Permite que o usuário reinicie esse servidor.', + 'control_kill' => 'Permite que o usuário encerre esse servidor.', + 'user_create' => 'Permite que o usuário crie contas de usuário para o servidor.', + 'user_read' => 'Permite que o usuário veja os usuários associados a esse servidor.', + 'user_update' => 'Permite que o usuário modifique outros usuários associados a esse servidor.', + 'user_delete' => 'Permite que o usuário delete outros usuários associados a esse servidor.', + 'file_create' => 'Permite que o usuário crie arquivos e diretórios.', + 'file_read' => 'Permite que o usuário veja o conteúdo de um diretório, mas não visualize nem baixe os arquivos.', + 'file_read_content' => 'Permite que o usuário veja o conteúdo de um arquivo específico. Isso também permite que o usuário faça o download dos arquivos.', + 'file_update' => 'Permite que o usuário atualize arquivos e pastas associados ao servidor.', + 'file_delete' => 'Permite que o usuário apague arquivos e diretórios.', + 'file_archive' => 'Permite que o usuário crie arquivos compactados e descompacte arquivos existentes.', + 'file_sftp' => 'Permite que o usuário execute as ações de arquivo acima usando um cliente SFTP.', + 'allocation_read' => 'Permite que o usuário veja todas as alocações atualmente atribuídas a este servidor. Usuários com qualquer nível de acesso a este servidor sempre podem ver a alocação primária.', + 'allocation_update' => 'Permite que o usuário altere a alocação primária do servidor e adicione notas a cada alocação.', + 'allocation_delete' => 'Permite que o usuário apague uma alocação do servidor.', + 'allocation_create' => 'Permite que o usuário atribua novas alocações a esse servidor.', + 'database_create' => 'Permite que o usuário crie uma base de dados para o servidor.', + 'database_read' => 'Permite que usuários visualize as bases de dados do servidor', + 'database_update' => 'Permite que o usuário faça modificações em um banco de dados. Se o usuário não tiver a permissão para visualizar a senha, ele não poderá modificar a senha.', + 'database_delete' => 'Permite que o usuário apague um banco de dados.', + 'database_view_password' => 'Permite que o usuário veja a senha de um banco de dados no sistema.', + 'schedule_create' => 'Permite que o usuário crie agendamentos para esse servidor.', + 'schedule_read' => 'Permite que o usuário veja os agendamentos desse servidor.', + 'schedule_update' => 'Permite que o usuário faça modificações em agendamentos já existentes.', + 'schedule_delete' => 'Permite que o usuário delete um agendamento desse servidor.', + 'backup_create' => 'Permite que o usuário crie backups do servidor.', + 'backup_read' => 'Permite que o usuário veja todos os backups existentes desse servidor.', + 'backup_delete' => 'Permite que o usuário apague backups desse servidor.', + 'backup_download' => 'Permite que o usuário faça download dos backups desse servidor. Perigo: isso permite que um usuário acesse todos os arquivos do servidor no backup.', + 'backup_restore' => 'Permite que o usuário restaure um backup desse servidor. Perigo: isso permite que um usuário acesse todos os arquivos do servidor no backup.', + ], +]; diff --git a/lang/pt_BR/validation.php b/lang/pt_BR/validation.php new file mode 100644 index 0000000000..f43d34af8f --- /dev/null +++ b/lang/pt_BR/validation.php @@ -0,0 +1,101 @@ + 'O campo :attribute deve ser aceito.', + 'active_url' => 'O campo :attribute não é uma URL válida.', + 'after' => 'O campo :attribute deve ser uma data posterior a :date.', + 'after_or_equal' => 'O campo :attribute deve ser uma data posterior ou igual a :date.', + 'alpha' => 'O campo :attribute pode conter apenas letras.', + 'alpha_dash' => 'O campo :attribute pode conter apenas letras, números e traços.', + 'alpha_num' => 'O campo :attribute pode conter apenas letras e números.', + 'array' => 'O campo :attribute deve ser um array.', + 'before' => 'O campo :attribute deve ser uma data anterior a :date.', + 'before_or_equal' => 'O campo :attribute deve ser uma data anterior ou igual a :date.', + 'between' => [ + 'numeric' => 'O campo :attribute deve estar entre :min e :max.', + 'file' => 'O campo :attribute deve estar entre :min e :max kilobytes.', + 'string' => 'O campo :attribute deve estar entre :min e :max caracteres.', + 'array' => 'O campo :attribute deve ter entre :min e :max itens.', + ], + + 'confirmed' => 'A confirmação do campo :attribute não corresponde.', + 'date' => 'O campo :attribute não é uma data válida.', + 'date_format' => 'O campo :attribute não corresponde ao formato :format.', + 'different' => 'Os campos :attribute e :other devem ser diferentes.', + 'digits' => 'O campo :attribute deve ter :digits dígitos.', + 'digits_between' => 'O campo :attribute deve ter entre :min e :max dígitos.', + 'dimensions' => 'O campo :attribute tem dimensões de imagem inválidas.', + + 'email' => 'O campo :attribute deve ser um endereço de e-mail válido.', + + 'file' => 'O campo :attribute deve ser um arquivo.', + 'filled' => 'O campo :attribute é obrigatório.', + 'image' => 'O campo :attribute deve ser uma imagem.', + + 'in_array' => 'O campo :attribute não existe em :other.', + 'integer' => 'O campo :attribute deve ser um número inteiro.', + 'ip' => 'O campo :attribute deve ser um endereço de IP válido.', + 'json' => 'O campo :attribute deve ser uma string JSON válida.', + 'max' => [ + 'numeric' => 'O campo :attribute não pode ser maior que :max.', + 'file' => 'O campo :attribute não pode ser maior que :max kilobytes.', + 'string' => 'O campo :attribute não pode ser maior que :max caracteres.', + 'array' => 'O campo :attribute não pode ter mais que :max itens.', + ], + 'mimes' => 'O campo :attribute deve ser um arquivo do tipo: :values.', + 'mimetypes' => 'O campo :attribute deve ser um arquivo do tipo: :values.', + 'min' => [ + 'numeric' => 'O campo :attribute deve ser pelo menos :min.', + 'file' => 'O campo :attribute deve ter pelo menos :min kilobytes.', + 'string' => 'O campo :attribute deve ter pelo menos :min caracteres.', + 'array' => 'O campo :attribute deve ter pelo menos :min itens.', + ], + + 'numeric' => 'O campo :attribute deve ser um número.', + + 'regex' => 'O formato do campo :attribute é inválido.', + + 'required_with_all' => 'O campo :attribute é obrigatório quando :values está presente.', + + 'same' => 'Os campos :attribute e :other devem corresponder.', + 'size' => [ + 'numeric' => 'O campo :attribute deve ser :size.', + 'file' => 'O campo :attribute deve ter :size kilobytes.', + 'string' => 'O campo :attribute deve ter :size caracteres.', + 'array' => 'O campo :attribute deve conter :size itens.', + ], + 'string' => 'O campo :attribute deve ser uma string.', + 'timezone' => 'O campo :attribute deve ser uma zona válida.', + + 'url' => 'O formato do campo :attribute é inválido.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + + // Internal validation logic for Panel + 'internal' => [ + 'variable_value' => 'variável :env', + 'invalid_password' => 'A senha fornecida é inválida para esta conta.', + ], +]; diff --git a/lang/ro/activity.php b/lang/ro/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/ro/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/ro/admin/apikey.php b/lang/ro/admin/apikey.php new file mode 100644 index 0000000000..21ca7b4251 --- /dev/null +++ b/lang/ro/admin/apikey.php @@ -0,0 +1,27 @@ + 'Chei API pentru aplicație', + 'empty' => 'Nu există chei API', + 'whitelist' => 'Adrese IPv4 permise', + 'whitelist_help' => 'Cheiele API pot fi restricționate doar la a funcționa de pe adrese IPv4 specifice. Introduceți fiecare adresă pe o linie nouă.', + 'whitelist_placeholder' => 'Exemplu: 127.0.0,1 sau 192.168.1.1', + 'description' => 'Descriere', + 'description_help' => 'O scurtă descriere a scopului acestei chei.', + 'nav_title' => 'Chei API', + 'model_label' => 'Chei API pentru aplicație', + 'model_label_plural' => 'Chei API pentru aplicație', + 'table' => [ + 'key' => 'Cheie', + 'description' => 'Descriere', + 'last_used' => 'Ultima utilizare', + 'created' => 'Creat', + 'created_by' => 'Creat de', + 'never_used' => 'Niciodată utilizat', + ], + 'permissions' => [ + 'none' => 'Niciunul', + 'read' => 'Citește', + 'read_write' => 'Citește și scrie', + ], +]; diff --git a/lang/ro/admin/databasehost.php b/lang/ro/admin/databasehost.php new file mode 100644 index 0000000000..43c456e93e --- /dev/null +++ b/lang/ro/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Gazde Baze de date', + 'model_label' => 'Gazda bazei de date', + 'model_label_plural' => 'Gazde Baze de date', + 'table' => [ + 'database' => 'Bază de Date', + 'name' => 'Nume', + 'host' => 'Host', + 'port' => 'Port', + 'name_helper' => 'Lăsând acest câmp gol se va genera automat un nume aleatoriu', + 'username' => 'Nume de utilizator', + 'password' => 'Parolă', + 'remote' => 'Conexiuni de la', + 'remote_helper' => 'Unde conexiunile ar trebui să fie permise. Lăsați necompletat pentru a permite conexiuni de oriunde.', + 'max_connections' => 'Conexiuni maxime', + 'created_at' => 'Creat la', + 'connection_string' => 'Șirul de conexiune JDBC', + ], + 'error' => 'Eroare de conectare la gazdă', + 'host' => 'Host', + 'host_help' => 'Adresa IP sau numele de domeniu care ar trebui să fie utilizate la conectarea la acest gazdă MySQL din acest Panou pentru a crea noi baze de date.', + 'port' => 'Port', + 'port_help' => 'Portul pe care MySQL rulează pentru această gazdă.', + 'max_database' => 'Maxim baze de date', + 'max_databases_help' => 'Numărul maxim de baze de date care pot fi create pe această gazdă. Dacă limita este atinsă, nu pot fi create noi baze de date pe această gazdă. Lăsând loc liber setați nelimitat.', + 'display_name' => 'Nume afișat', + 'display_name_help' => 'Un identificator scurt folosit pentru a distinge această gazdă de celelalte. Trebuie să fie între 1 și 60 de caractere, de exemplu, us.nyc.lvl3.', + 'username' => 'Nume de utilizator', + 'username_help' => 'Numele de utilizator al unui cont care are suficiente permisiuni pentru a crea noi utilizatori și baze de date în sistem.', + 'password' => 'Parola', + 'password_help' => 'Parola pentru utilizatorul bazei de date.', + 'linked_nodes' => 'Noduri asociate', + 'linked_nodes_help' => 'Această setare este doar cea implicită pentru această bază de date gazdă atunci când se adaugă o bază de date la un server din modulul selectat.', + 'connection_error' => 'Eroare la conectarea la gazda de date', + 'no_database_hosts' => 'Nu sunt gazde baze de date', + 'no_nodes' => 'Nici un Nod', + 'delete_help' => 'Baza de date gazdă are bazele de date', + 'unlimited' => 'Nelimitat', + 'anywhere' => 'Oriunde', + + 'rotate' => 'Rotire', + 'rotate_password' => 'Rotește parola', + 'rotated' => 'Parolă rotită', + 'rotate_error' => 'Rotirea parolei a eșuat', + 'databases' => 'Baze de date', + + 'setup' => [ + 'preparations' => 'Pregătiri', + 'database_setup' => 'Configurare bază de date', + 'panel_setup' => 'Configurare Panou', + + 'note' => 'În prezent, sunt suportate doar bazele de date MySQL/MariaDB pentru gazdele bazelor de date!', + 'different_server' => 'Panoul și baza de date NU sunt pe același server?', + + 'database_user' => 'Utilizator bază de date', + 'cli_login' => 'Folosește mysql -u root -p pentru a accesa mysql cli.', + 'command_create_user' => 'Comanda pentru a crea utilizatorul', + 'command_assign_permissions' => 'Comanda pentru a atribui permisiuni', + 'cli_exit' => 'Pentru a ieși din mysql cli foloseste comanda exit.', + 'external_access' => 'Acces Extern', + 'allow_external_access' => ' +

Este posibil să fie necesar să permiți accesul extern la această instanță MySQL pentru a permite serverelor să se conecteze la ea.

+
+

Pentru a face acest lucru, deschide my.cnf, a cărui locație variază în funcție de sistemul de operare și modul în care MySQL a fost instalat. Poți folosi comanda find /etc -iname my.cnf pentru a o localiza.

+
+

Deschide my.cnf, adaugă textul de mai jos la finalul fișierului și salvează:
+ [mysqld]
bind-address=0.0.0.0

+
+

Repornește MySQL/ MariaDB pentru ca aceste modificări să aibă efect. Aceasta va suprascrie configurația implicită MySQL, care în mod normal acceptă cereri doar de la localhost. Actualizarea acesteia va permite conexiuni pe toate interfețele și, implicit, conexiuni externe. Asigură-te că permiți portul MySQL (implicit 3306) în firewall.

', + ], +]; diff --git a/lang/ro/admin/eggs.php b/lang/ro/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/ro/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/ro/admin/health.php b/lang/ro/admin/health.php new file mode 100644 index 0000000000..2d1a23b5ef --- /dev/null +++ b/lang/ro/admin/health.php @@ -0,0 +1,60 @@ + 'Viață', + 'results_refreshed' => 'Rezultatele controlului de viață actualizate', + 'checked' => 'Rezultate verificate din :time', + 'refresh' => 'Reimprospatare', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Nu s-a putut seta sau recupera o valoare de cache a aplicației.', + 'failed' => 'O excepție a avut loc cu cache-ul aplicației: :error', + ], + 'database' => [ + 'label' => 'Baza de date', + 'ok' => 'Ok', + 'failed' => 'Nu s-a putut efectua conexiunea la baza de date: :error', + ], + 'debugmode' => [ + 'label' => 'Mod depanare', + 'ok' => 'Modul depanare este dezactivat', + 'failed' => 'Se aștepta ca modul de depanare să fie :expected, dar de fapt a fost :actual', + ], + 'environment' => [ + 'label' => 'Mediu', + 'ok' => 'Ok, Setat la :actual', + 'failed' => 'Mediul este setat la :actual , Așteptat :expected', + ], + 'nodeversions' => [ + 'label' => 'Versiune Node', + 'ok' => 'Nodurile sunt actualizate', + 'failed' => ':outdated/:toate Nodurile sunt depășite', + 'no_nodes_created' => 'Nici un Nod creat', + 'no_nodes' => 'Nici un Nod', + 'all_up_to_date' => 'Toate la zi', + 'outdated' => ':outdate/:all învechit', + ], + 'panelversion' => [ + 'label' => 'Versiune panou', + 'ok' => 'Panoul are cea mai recentă versiune', + 'failed' => 'Versiunea instalată este :currentVersion dar ultima este :latestVersion', + 'up_to_date' => 'La zi', + 'outdated' => 'Învechit', + ], + 'schedule' => [ + 'label' => 'Planificare', + 'ok' => 'Ok', + 'failed_last_ran' => 'Ultima execuție a programului a fost cu mai mult de :time minute în urmă', + 'failed_not_ran' => 'Programul nu s-a executat încă.', + ], + 'useddiskspace' => [ + 'label' => 'Spațiu pe disc', + ], + ], + 'checks' => [ + 'successful' => 'Reușit', + 'failed' => 'Eșuat', + ], +]; diff --git a/lang/ro/admin/mount.php b/lang/ro/admin/mount.php new file mode 100644 index 0000000000..094c920332 --- /dev/null +++ b/lang/ro/admin/mount.php @@ -0,0 +1,30 @@ + 'Montări', + 'model_label' => 'Montează', + 'model_label_plural' => 'Montări', + 'name' => 'Nume', + 'name_help' => 'Nume unic folosit pentru a separa această montare de alta.', + 'source' => 'Sursă', + 'source_help' => 'Calea fişierelor de pe sistemul gazdă pentru montarea într-un container.', + 'target' => 'Destinație', + 'target_help' => 'Acolo unde montarea va fi accesibilă în interiorul unui container.', + 'read_only' => 'Doar Citire?', + 'read_only_help' => 'Este montarea doar citită în interiorul containerului?', + 'description' => 'Descriere', + 'description_help' => 'O descriere mai lungă pentru această montare', + 'no_mounts' => 'Fără montări', + 'eggs' => 'Ouă', + 'nodes' => 'Noduri', + 'toggles' => [ + 'writable' => 'Care poate fi scris', + 'read_only' => 'Doar Citire', + ], + 'table' => [ + 'name' => 'Nume', + 'all_eggs' => 'Toate ouăle', + 'all_nodes' => 'Toate Nodurile', + 'read_only' => 'Doar Citire', + ], +]; diff --git a/lang/ro/admin/node.php b/lang/ro/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/ro/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/ro/admin/role.php b/lang/ro/admin/role.php new file mode 100644 index 0000000000..6e4ce14c07 --- /dev/null +++ b/lang/ro/admin/role.php @@ -0,0 +1,17 @@ + 'Roluri', + 'model_label' => 'Rol', + 'model_label_plural' => 'Roluri', + 'no_roles' => 'Fără roluri', + 'name' => 'Nume Rol', + 'permissions' => 'Permisiuni', + 'in_use' => 'În uz', + 'all' => 'Tot', + 'root_admin' => 'Rolul :rol are toate permisiunile.', + 'root_admin_delete' => 'Nu se poate șterge administratorul Root', + 'users' => 'Utilizatori', + 'nodes' => 'Noduri', + 'nodes_hint' => 'Lasă gol pentru a permite accesul la toate nodurile.', +]; diff --git a/lang/ro/admin/server.php b/lang/ro/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/ro/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/ro/admin/user.php b/lang/ro/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/ro/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/ro/admin/webhook.php b/lang/ro/admin/webhook.php new file mode 100644 index 0000000000..05d5ad6cf5 --- /dev/null +++ b/lang/ro/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Endpoint', + 'description' => 'Descriere', + 'no_webhooks' => 'Fără webhook-uri', + 'help' => 'Ajutor', + 'help_text' => 'Trebuie să încadrezi numele variabilei între {{ }}, de exemplu, dacă vrei să preiei numele din Api, poți folosi {{name}}.', + 'test_now' => 'Testează acum', + 'test_now_help' => 'Aceasta va declanșa un eveniment created: Server', + 'table' => [ + 'description' => 'Descriere', + 'endpoint' => 'Endpoint', + ], + 'headers' => 'Headere', + 'events' => 'Evenimente', + 'regular' => 'Regular', + 'reset_headers' => 'Resetează anteturile', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Mesaj', + 'username' => 'Nume de utilizator', + 'avatar_url' => 'URL Avatar', + 'forum_thread' => 'Nume Thread', + 'supress_embeds' => 'Ascunde embed-urile', + 'supress_embeds_text' => 'Nu include niciun embed atunci când se serializează acest mesaj.', + 'supress_notifications' => 'Dezactivează notificările', + 'supress_notifications_text' => 'Acest mesaj nu va declanșa notificări push sau pe desktop.', + ], + 'discord_embed' => [ + 'add_embed' => 'Adaugă Embed', + 'flags' => 'Flags', + 'thumbnail' => 'URL Thumbnail', + 'embeds' => 'Embed-uri', + 'thread_name' => 'Nume Thread', + 'allowed_mentions' => 'Mențiuni permise', + 'roles' => 'Roluri', + 'users' => 'Utilizatori', + 'everyone' => '@everyone & @here', + 'author' => 'Autor', + 'author_url' => 'URL Autor', + 'author_icon_url' => 'Iconiță Autor URL', + 'body' => 'Conținut', + 'title' => 'Titlu', + 'color' => 'Culoare Embed', + 'url' => 'URL', + 'images' => 'Imagini', + 'image_url' => 'URL imagine', + 'image_thumbnail' => 'URL Thumbnail', + 'footer' => 'Footer', + 'has_timestamp' => 'Are timestamp', + 'footer_icon_url' => 'URL Icon Footer', + 'add_field' => 'Adaugă câmp', + 'fields' => 'Câmpuri', + 'field_name' => 'Numele campului', + 'field_value' => 'Valoare câmp', + 'inline_field' => 'Câmp în linie', + ], +]; diff --git a/lang/ro/auth.php b/lang/ro/auth.php index 2a3a452682..6704da1cad 100644 --- a/lang/ro/auth.php +++ b/lang/ro/auth.php @@ -1,27 +1,24 @@ 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], + 'failed' => 'Aceste date nu corespund înregistrărilor noastre.', + 'failed-two-factor' => 'Cod 2FA incorect', + 'two-factor-code' => 'Autentificare in doi pași', + 'two-factor-hint' => 'Poți folosi codurile de rezervă dacă ți-ai pierdut accesul la dispozitiv.', + 'password' => 'Parola introdusă este incorectă.', + 'throttle' => 'Prea multe încercări de conectare. Te rugăm să încerci din nou în :seconds secunde.', + '2fa_must_be_enabled' => 'Administratorul a cerut ca autentificarea cu 2 factori să fie activată pentru contul tău pentru a utiliza Panoul.', - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', ]; diff --git a/lang/ro/command/messages.php b/lang/ro/command/messages.php index 457947d29a..8f4584790c 100644 --- a/lang/ro/command/messages.php +++ b/lang/ro/command/messages.php @@ -6,54 +6,49 @@ 'select_search_user' => 'ID-ul utilizatorului pentru șters (Introduceți \'0\' pentru a căuta din nou)', 'deleted' => 'Utilizatorul a fost șters din Panou cu succes.', 'confirm_delete' => 'Sunteți sigur ca doriți sa ștergeți utilizatorul din Panou?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', + 'no_users_found' => 'Nu au fost găsiți utilizatori pentru termenul de căutare furnizat.', + 'multiple_found' => 'Au fost găsite mai multe conturi pentru utilizatorul furnizat, incapabil să ștergi un utilizator din cauza flag-ului --no-interaction ence.', + 'ask_admin' => 'Este acest utilizator un administrator?', + 'ask_email' => 'Adresa de e-mail', + 'ask_username' => 'Nume de utilizator', + 'ask_password' => 'Parolă', + 'ask_password_tip' => 'Dacă doriți să creați un cont cu o parolă aleatorie trimisă prin e-mail utilizatorului, re-rulați această comandă (CTRL+C) și pasați steagul `--no-password`.', + 'ask_password_help' => 'Parolele trebuie să aibă cel puțin 8 caractere și să conțină cel puțin o literă majusculă și un număr.', + '2fa_help_text' => 'Această comandă va dezactiva autentificarea în doi pași pentru contul unui utilizator dacă este activată. Ar trebui folosită doar ca o comandă de recuperare a contului dacă utilizatorul este blocat. Dacă nu asta voiai să faci, apasă CTRL+C pentru a ieși din proces.', + '2fa_disabled' => 'Autentificarea cu doi factori a fost dezactivată pentru :email.', ], 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', + 'output_line' => 'Expedierea jobului pentru prima sarcină în `:schedule` (:id).', ], 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', + 'deleting_service_backup' => 'Ștergere copie de siguranță a serviciului :file.', ], 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', + 'rebuild_failed' => 'Solicitarea de reconstruire pentru ":name" (#:id) pe nodul ":node" a eșuat cu eroare: :message', 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', + 'failed' => 'Solicitarea de reinstalare pentru ":name" (#:id) pe nodul ":node" a eșuat cu eroare: :message', + 'confirm' => 'Sunteți pe cale să reinstalați împotriva unui grup de servere. Doriți să continuați?', ], 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', + 'confirm' => 'Sunteți pe cale să efectuați o :action împotriva serverelor :count . Doriți să continuați?', + 'action_failed' => 'Cererea de pornire pentru ":name" (#:id) pe nodul ":node" a eșuat cu eroare: :message', ], ], 'environment' => [ 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', + 'ask_smtp_host' => 'Gazda SMTP (de ex. smtp.gmail.com)', + 'ask_smtp_port' => 'Port SMTP', + 'ask_smtp_username' => 'Utilizator SMTP', + 'ask_smtp_password' => 'Parolă SMTP', + 'ask_mailgun_domain' => 'Domeniul Mailgun', 'ask_mailgun_endpoint' => 'Mailgun Endpoint', 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', + 'ask_mandrill_secret' => 'Secret Mandrill', + 'ask_postmark_username' => 'Cheie API Postmark', + 'ask_driver' => 'Ce driver ar trebui folosit pentru trimiterea de e-mailuri?', + 'ask_mail_from' => 'E-mailurile cu adresa de e-mail trebuie să provină de la', + 'ask_mail_name' => 'Numele de la care ar trebui să apară e-mailurile', + 'ask_encryption' => 'Metoda de criptare folosită', ], ], ]; diff --git a/lang/ro/commands.php b/lang/ro/commands.php new file mode 100644 index 0000000000..e1bad4f130 --- /dev/null +++ b/lang/ro/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Furnizați adresa de e-mail de la care ar trebui să fie exportate ouăle prin acest Panou. Aceasta ar trebui să fie o adresă de e-mail validă.', + 'url' => 'Aplicaţia URL TREBUIE să înceapă cu http:// sau http:// în funcţie de dacă utilizaţi SSL sau nu. Dacă nu includeți schema de e-mailuri și alte conținuturi se vor conecta la locația greșită.', + 'timezone' => 'Fusul orar ar trebui să se potrivească cu unul dintre fusele orare acceptate de PHP. Dacă nu sunteți sigur, vă rugăm să faceți referire la\\ https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Ați selectat driverul Redis pentru una sau mai multe opțiuni, vă rugăm să furnizați informații valide de conectare de mai jos. În cele mai multe cazuri puteți utiliza valorile implicite furnizate, cu excepția cazului în care ați modificat configurarea.', + 'comment' => 'În mod implicit, o instanță de server Redis are pentru numele de utilizator implicit și nicio parolă deoarece rulează local și este inaccesibilă pentru lumea din afară. În acest caz, apăsați butonul de intrare fără a introduce o valoare.', + 'confirm' => 'Se pare că un :field este deja definit pentru Redis, doriți să îl schimbați?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Este recomandat sa nu se foloseasca "localhost" ca gazda ta de baza de date pentru ca am vazut probleme frecvente legate de conexiunea socket-ului. Dacă doriți să utilizați o conexiune locală, ar trebui să utilizați "127.0.0.1".', + 'DB_USERNAME_note' => 'Folosirea contului root pentru conexiunile MySQL nu este doar foarte înspăimântată, dar nici nu este permisă de această aplicație. Va trebui să vă creați un utilizator MySQL pentru acest software.', + 'DB_PASSWORD_note' => 'Se pare ca aveti deja o parola pentru conexiunea MySQL, doriti sa o schimbati?', + 'DB_error_2' => 'Datele de conectare NU au fost salvate. Va trebui să furnizați informații valide despre conexiune înainte de a continua.', + 'go_back' => 'Întoarce-te și încearcă din nou', + ], + 'make_node' => [ + 'name' => 'Introduceți un identificator scurt folosit pentru a distinge acest modul de altele', + 'description' => 'Introduceți o descriere pentru a identifica nodul', + 'scheme' => 'Vă rugăm să introduceți https pentru SSL sau http pentru o conexiune non-ssl', + 'fqdn' => 'Introduceți un nume de subdomeniu (de ex. node.example.com) pentru a fi utilizat pentru conectarea la daemon. O adresă IP poate fi utilizată numai dacă nu utilizați SSL pentru acest modul', + 'public' => 'Ar trebui ca acest nod să fie public? Ca o notă, setând un nod la privat veți nega capacitatea de auto-implementare la acest modul.', + 'behind_proxy' => 'Este FQDN în spatele unui proxy? (Exemplu: CloudFlare)', + 'maintenance_mode' => 'Ar trebui activat modul de mentenanță?', + 'memory' => 'Introduceţi numărul maxim de memorie', + 'memory_overallocate' => 'Introduceți memoria peste alocare, -1 va dezactiva verificarea și 0 va împiedica crearea de noi servere', + 'disk' => 'Introduceți limita maximă de spațiu pe disc', + 'disk_overallocate' => 'Introduceți cantitatea de disc pentru a fi suprasolicitată de, -1 va dezactiva verificarea și 0 va împiedica crearea unui nou server', + 'cpu' => 'Introduceți valoarea maximă a cpu', + 'cpu_overallocate' => 'Introduceți cantitatea de disc pentru a fi suprasolicitată, -1 va dezactiva verificarea și 0 va împiedica crearea unui nou server', + 'upload_size' => 'Introduceți dimensiunea maximă a fișierului', + 'daemonListen' => 'Introduceți portul de ascultare al daemon-ului', + 'daemonConnect' => 'Introdu portul de conectare al daemon-ului (poate fi același ca portul de ascultare)', + 'daemonSFTP' => 'Introduceți portul de ascultare al daemon-ului pentru SFTP', + 'daemonSFTPAlias' => 'Introduceți aliasul pentru SFTP-ul daemon-ului (poate fi lăsat liber)', + 'daemonBase' => 'Introduceți directorul de bază', + 'success' => 'A fost creat cu succes un nod nou cu numele :name și are id-ul :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Nodul selectat nu există.', + 'error_invalid_format' => 'Format invalid specificat. Opţiunile valide sunt yaml şi json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Se pare că aţi configurat deja o cheie de criptare a aplicaţiei. Continuarea acestui proces cu suprascrierea acelei chei și cauzează corupție de date pentru orice date criptate existente. NU CONTINUAȚI DECÂT DACĂ ȘTIȚI BINE CE FACEȚI', + 'understand' => 'Înțeleg consecințele efectuării acestei comenzi și accept toată responsabilitatea pentru pierderea datelor criptate.', + 'continue' => 'Sunteți sigur că doriți să continuați? Schimbarea cheii de criptare a aplicației VA CAUZA PIERDERI DE DATE', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Nu există sarcini programate pentru servere care trebuie să fie rulate.', + 'error_message' => 'A apărut o eroare la procesarea sarcinii: ', + ], + ], +]; diff --git a/lang/ro/dashboard/account.php b/lang/ro/dashboard/account.php deleted file mode 100644 index f0ae0d5baf..0000000000 --- a/lang/ro/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Actualizează emailul', - 'updated' => 'Adresa ta de email a fost actualizată.', - ], - 'password' => [ - 'title' => 'Schimbă-ți parola', - 'requirements' => 'Noua ta parolă ar trebui să aibă cel puțin 8 caractere.', - 'updated' => 'Parola ta a fost actualizată.', - ], - 'two_factor' => [ - 'button' => 'Configurează autentificarea cu doi factori', - 'disabled' => 'Autentificarea cu doi factori a fost dezactivată din contul tău Nu vei mai fi solicitat să furnizezi un token la autentificare.', - 'enabled' => 'Autentificarea cu doi factori a fost activată în contul tău! De acum înainte, când te conectezi, va trebui să introduci codul generat de pe dispozitivul tău.', - 'invalid' => 'Token-ul furnizat nu a fost valid.', - 'setup' => [ - 'title' => 'Setează autentificarea cu doi factori', - 'help' => 'Nu poți scana codul? Introdu codul de mai jos din aplicație:', - 'field' => 'Introdu token-ul', - ], - 'disable' => [ - 'title' => 'Dezactivează autentificarea cu doi factori', - 'field' => 'Introdu token-ul', - ], - ], -]; diff --git a/lang/ro/dashboard/index.php b/lang/ro/dashboard/index.php deleted file mode 100644 index 3ae7a3f325..0000000000 --- a/lang/ro/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Caută servere...', - 'no_matches' => 'Nu au fost găsite servere care să corespundă criteriilor de căutare furnizate.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memorie', -]; diff --git a/lang/ro/exceptions.php b/lang/ro/exceptions.php index 3977c87c24..722319e492 100644 --- a/lang/ro/exceptions.php +++ b/lang/ro/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'A existat o excepție în timpul încercării de a comunica cu daemonul rezultând într-un cod de răspuns HTTP/:code. Această excepție a fost înregistrată.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'Un nod nu trebuie să aibă servere conectate la el pentru a putea fi șters.', + 'error_connecting' => 'Eroare de conectare la nod', + 'daemon_off_config_updated' => 'Configurația daemon a fost actualizată, cu toate acestea, a apărut o eroare la încercarea de a actualiza automat fișierul de configurare din Daemon. Va trebui să actualizați manual fișierul de configurare (config.yml) pentru ca daemonul să aplice aceste schimbări.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'Un server este în prezent atribuit acestei alocări. O alocare poate fi ștearsă numai dacă nici un server nu este atribuit momentan.', + 'too_many_ports' => 'Adăugarea simultană a mai mult de 1000 de porturi într-o singură cerere nu este acceptată.', + 'invalid_mapping' => 'Maparea furnizată pentru :port nu a fost validă și nu a putut fi procesată.', + 'cidr_out_of_range' => 'Notația CIDR permite masca doar între /25 și /32.', + 'port_out_of_range' => 'Sumele alocate porturilor trebuie să fie mai mari sau egale cu 1024 şi mai mici sau egale cu 65535.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Un ou cu servere active atașate nu poate fi șters din Panou.', + 'invalid_copy_id' => 'Oul selectat pentru copierea unui script fie nu există, fie copiază un script în sine.', + 'has_children' => 'Acest ou este un părinte pentru unul sau mai multe alte ouă. Vă rugăm să ștergeți acele ouă înainte de a șterge acest ou.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'Variabila de mediu :name trebuie să fie unică pentru acest ou.', + 'reserved_name' => 'Variabila de mediu :name este protejată și nu poate fi atribuită unei variabile.', + 'bad_validation_rule' => 'Regula de validare ":rule" nu este o regulă validă pentru această aplicație.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'A apărut o eroare la analizarea fișierului JSON: :error.', + 'file_error' => 'Fișierul JSON furnizat nu este valid.', + 'invalid_json_provided' => 'Fișierul JSON furnizat nu este într-un format care poate fi recunoscut.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Editarea propriului cont de subuser nu este permisă.', + 'user_is_owner' => 'Nu puteți adăuga proprietarul serverului ca subuser pentru acest server.', + 'subuser_exists' => 'Un utilizator cu această adresă de e-mail este deja atribuit ca subuser pentru acest server.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Nu se poate șterge un server gazdă de baze de date care are baze de date active conectate la acesta.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Intervalul maxim de timp pentru o sarcină legată este de 15 minute.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Nu se poate șterge o locație care are noduri active atașate la ea.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Nu puteți șterge propriul cont de utilizator.', + 'has_servers' => 'Nu se poate șterge un utilizator cu servere active atașate la contul său. Vă rugăm să ștergeți serverele lor înainte de a continua.', + 'node_revocation_failed' => 'Nu s-au putut revoca cheile de pe Nodul #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Nu a putut fi găsit niciun nod care să satisfacă cerințele specificate pentru deploy-ul automat.', + 'no_viable_allocations' => 'Nu a putut fi găsită nicio alocare care să satisfacă cerințele specificate pentru deploy-ul automat.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => 'Resursa solicitată nu există pe acest server.', + ], + 'mount' => [ + 'servers_attached' => 'O montare nu trebuie să aibă servere atașate la ea pentru a fi ștearsă', + ], + 'server' => [ + 'marked_as_failed' => 'Acest server nu a finalizat încă procesul de instalare, vă rugăm să încercaţi din nou mai târziu.', ], ]; diff --git a/lang/ro/notifications.php b/lang/ro/notifications.php new file mode 100644 index 0000000000..e2db029fe8 --- /dev/null +++ b/lang/ro/notifications.php @@ -0,0 +1,18 @@ + 'Deschide serverul', + 'installation_completed' => 'Instalarea serverului a fost finalizată', + 'installation_failed' => 'Instalarea serverului a eșuat', + 'reinstallation_completed' => 'Reinstalarea serverului a fost finalizată', + 'reinstallation_failed' => 'Reinstalarea serverului a eșuat', + 'failed' => 'Eșuat', + 'user_added' => [ + 'title' => 'Adăugat la Server', + 'body' => 'Ai fost adăugat ca subutilizator la :server.', + ], + 'user_removed' => [ + 'title' => 'Eliminat din Server', + 'body' => 'Ai fost eliminat ca subutilizator de la :server.', + ], +]; diff --git a/lang/ro/pagination.php b/lang/ro/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/ro/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/ro/passwords.php b/lang/ro/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/ro/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/ro/search.php b/lang/ro/search.php new file mode 100644 index 0000000000..387374dd20 --- /dev/null +++ b/lang/ro/search.php @@ -0,0 +1,9 @@ + 'Vă rugăm să introduceţi cel puţin trei caractere pentru a începe căutarea.', + 'term' => [ + 'label' => 'Caută termen', + 'description' => 'Introduceți un nume de server, uuid, sau o alocare pentru a începe căutarea.', + ], +]; diff --git a/lang/ro/server/activity.php b/lang/ro/server/activity.php new file mode 100644 index 0000000000..06a23fe771 --- /dev/null +++ b/lang/ro/server/activity.php @@ -0,0 +1,11 @@ + 'Activitate', + 'event' => 'Eveniment', + 'user' => 'Utilizator', + 'deleted_user' => 'Utilizator Șters', + 'system' => 'Sistem', + 'timestamp' => 'Marcaj de timp', + 'metadata' => 'Metadate', +]; diff --git a/lang/ro/server/backup.php b/lang/ro/server/backup.php new file mode 100644 index 0000000000..8c7214d31c --- /dev/null +++ b/lang/ro/server/backup.php @@ -0,0 +1,55 @@ + 'Copii de rezervă', + 'empty' => 'Nicio copie de rezervă', + 'size' => 'Dimensiune', + 'created_at' => 'Creat pe', + 'status' => 'Status', + 'is_locked' => 'Stare de blocare', + 'backup_status' => [ + 'in_progress' => 'În progres', + 'successful' => 'Reușit', + 'failed' => 'Eșuat', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Creează copie de rezervă', + 'limit' => 'Limita de copii de rezervă atinsă', + 'created' => ':name creat', + 'notification_success' => 'Copie de rezervă creată cu succes', + 'notification_fail' => 'Crearea copiei de rezervă a eșuat', + 'name' => 'Nume', + 'ignored' => 'Fişiere şi directoare ignorate', + 'locked' => 'Blocat?', + 'lock_helper' => 'Împiedică ștergerea acestei copii de rezervă până când este deblocată în mod explicit.', + ], + 'lock' => [ + 'lock' => 'Blochează', + 'unlock' => 'Deblochează', + ], + 'download' => 'Descarcă', + 'rename' => [ + 'title' => 'Redenumește', + 'new_name' => 'Numele copiei de rezervă', + 'notification_success' => 'Copia de rezervă a fost redenumită cu succes', + ], + 'restore' => [ + 'title' => 'Restaurează', + 'helper' => 'Serverul tău va fi oprit. Nu vei putea controla starea de alimentare, accesa managerul de fișiere sau crea copii de rezervă suplimentare până când acest proces nu se va finaliza.', + 'delete_all' => 'Ștergi toate fișierele înainte de a restaura copia de rezervă?', + 'notification_started' => 'Se restaurează copia de rezervă', + 'notification_success' => 'Copie de rezervă restaurată cu succes', + 'notification_fail' => 'Restaurarea copiei de rezervă a eșuat', + 'notification_fail_body_1' => 'Acest server nu se află momentan într-o stare care să permită restaurarea unei copii de rezervă', + 'notification_fail_body_2' => 'Această copie de rezervă nu poate fi restaurată în acest moment: nu este finalizată sau a eșuat.', + ], + 'delete' => [ + 'title' => 'Șterge copia de rezervă', + 'description' => 'Dorești să ștergi :backup?', + 'notification_success' => 'Copie de rezervă ștearsă', + 'notification_fail' => 'Nu s-a putut șterge copia de rezervă', + 'notification_fail_body' => 'Conexiunea la nod a eșuat. Te rugăm să încerci din nou.', + ], + ], +]; diff --git a/lang/ro/server/console.php b/lang/ro/server/console.php new file mode 100644 index 0000000000..7f02db4d05 --- /dev/null +++ b/lang/ro/server/console.php @@ -0,0 +1,43 @@ + 'Consolă', + 'command' => 'Scrie o comandă...', + 'command_blocked' => 'Server offline...', + 'command_blocked_title' => 'Nu se poate trimite comanda atunci când serverul este offline', + 'open_in_admin' => 'Deschide în Admin', + 'power_actions' => [ + 'start' => 'Pornește', + 'stop' => 'Oprește', + 'restart' => 'Repornește', + 'kill' => 'Oprește forțat', + 'kill_tooltip' => 'Acest lucru poate duce la corupție și/sau pierdere de date!', + ], + 'labels' => [ + 'cpu' => 'Procesor', + 'memory' => 'Memorie', + 'network' => 'Rețea', + 'disk' => 'Stocare', + 'name' => 'Nume', + 'status' => 'Status', + 'address' => 'Adresă', + 'unavailable' => 'Indisponibil', + ], + 'status' => [ + 'created' => 'Creat', + 'starting' => 'În pornire', + 'running' => 'În rulare', + 'restarting' => 'În repornire', + 'exited' => 'Ieșit', + 'paused' => 'Pauză', + 'dead' => 'Inactiv', + 'removing' => 'Se elimină', + 'stopping' => 'Oprire', + 'offline' => 'Offline', + 'missing' => 'Lipsă', + ], + 'websocket_error' => [ + 'title' => 'Nu s-a putut conecta la websocket!', + 'body' => 'Verifică consola browser-ului pentru mai multe detalii.', + ], +]; diff --git a/lang/ro/server/dashboard.php b/lang/ro/server/dashboard.php new file mode 100644 index 0000000000..9958b3b20d --- /dev/null +++ b/lang/ro/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servere', + 'list' => 'Listă de servere', + 'tabs' => [ + 'my' => 'Serverele mele', + 'other' => 'Alte servere', + 'all' => 'Toate serverele', + ], + 'empty_own' => 'Nu deții niciun server!', + 'empty_other' => 'Nu ai acces la niciun server!', + + 'status' => 'Status', + 'server' => 'Server', + 'resources' => 'Resurse', + 'usage_limit' => 'Limită de utilizare: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Memorie', + 'disk' => 'Stocare', + 'network' => 'Rețea', + 'none' => 'Niciunul', + 'loading' => 'Se încarcă...', + + 'power_actions' => 'Acțiuni de alimentare', + 'power_action_sent' => ':action trimisă către :name', +]; diff --git a/lang/ro/server/database.php b/lang/ro/server/database.php new file mode 100644 index 0000000000..4266ad0eb7 --- /dev/null +++ b/lang/ro/server/database.php @@ -0,0 +1,26 @@ + 'Baze de date', + 'empty' => 'Nicio bază de date', + 'create_database' => 'Creare bază de date', + 'limit' => 'Limita bazelor de date atinsă', + 'viewing' => 'Vizualizare: :database', + 'host' => 'Host', + 'database' => 'Bază de Date', + 'username' => 'Nume de utilizator', + 'password' => 'Parola', + 'remote' => 'Remote', + 'created_at' => 'Creat pe', + 'name' => 'Numele bazei de date', + 'name_hint' => 'Lăsând acest câmp gol se va genera automat un nume aleatoriu', + 'connections_from' => 'Conexiuni de la', + 'max_connections' => 'Conexiuni maxime', + 'database_host' => 'Gazda bazei de date', + 'database_host_select' => 'Selectați Gazda Bazei de Date', + 'jdbc' => 'Șirul de conexiune JDBC', + 'create_notification' => 'Creat :database', + 'create_notification_fail' => 'Crearea :database a eșuat', + 'delete_notification' => ':database șters', + 'delete_notification_fail' => 'Ștergerea :database a eșuat', +]; diff --git a/lang/ro/server/user.php b/lang/ro/server/user.php new file mode 100644 index 0000000000..988b729900 --- /dev/null +++ b/lang/ro/server/user.php @@ -0,0 +1,73 @@ + 'Utilizatori', + 'username' => 'Nume de utilizator', + 'email' => 'Email', + 'assign_all' => 'Atribuie tot', + 'invite_user' => 'Invită utilizatorul', + 'action' => 'Invită', + 'remove' => 'Elimină utilizatorul', + 'edit' => 'Editează Utilizatorul', + 'editing' => 'Se editează :user', + 'delete' => 'Elimină utilizatorul', + 'notification_add' => 'Utilizatorul a fost invitat!', + 'notification_edit' => 'Utilizatorul a fost actualizat!', + 'notification_delete' => 'Utilizatorul a fost șters!', + 'notification_failed' => 'Invitarea utilizatorului a eșuat!', + 'permissions' => [ + 'title' => 'Permisiuni', + 'activity_desc' => 'Permisiuni care controlează accesul unui utilizator la jurnalele de activitate ale serverului.', + 'startup_desc' => 'Permisiuni care controlează abilitatea unui utilizator de a vizualiza parametrii de pornire ai acestui server.', + 'settings_desc' => 'Permisiuni care controlează abilitatea unui utilizator de a modifica setările acestui server.', + 'control_desc' => 'Permisiuni care controlează capacitatea unui utilizator de a controla pornirea unui server sau de a trimite comenzi.', + 'user_desc' => 'Permisiuni care permit unui utilizator să gestioneze alti subuseri pe un server. Nu vor putea niciodată să își editeze propriul cont sau să își atribuie permisiunile pe care nu le au singuri.', + 'file_desc' => 'Permisiuni care controlează abilitatea unui utilizator de a modifica sistemul de fişiere pentru acest server.', + 'allocation_desc' => 'Permisiuni care controlează capacitatea unui utilizator de a modifica alocările portului pentru acest server.', + 'database_desc' => 'Permisiuni care controlează accesul unui utilizator la gestionarea bazei de date pentru acest server.', + 'backup_desc' => 'Permisiuni care controlează capacitatea unui utilizator de a genera și de a gestiona copii de rezervă ale serverului.', + 'schedule_desc' => 'Permisiuni care controlează accesul unui utilizator la gestionarea programului pentru acest server.', + 'startup_read' => 'Permite unui utilizator să vadă variabilele de pornire pentru un server.', + 'startup_update' => 'Permite unui utilizator să modifice variabilele de pornire pentru server.', + 'startup_docker_image' => 'Permite unui utilizator să modifice imaginea folosită de Docker la rularea serverului.', + 'settings_reinstall' => 'Permite utilizatorului să inițieze reinstalarea acestui server.', + 'settings_rename' => 'Permite utilizatorului să redenumească acest server.', + 'settings_description' => 'Permite utilizatorului să schimbe descrierea acestui server.', + 'activity_read' => 'Permite unui utilizator să vizualizeze jurnalele de activitate ale serverului.', + 'websocket_connect' => 'Permite unui utilizator accesul la websocket pentru acest server.', + 'control_console' => 'Permite unui utilizator să trimită date către consola serverului.', + 'control_start' => 'Permite utilizatorului să pornească serverul.', + 'control_stop' => 'Permite utilizatorului să oprească serverul.', + 'control_restart' => 'Permite utilizatorului să repornească serverul.', + 'control_kill' => 'Permite utilizatorului oprească forțat serverul.', + 'user_create' => 'Permite utilizatorului să creeze noi conturi de utilizator pentru server.', + 'user_read' => 'Permite utilizatorului să vizualizeze utilizatorii asociați cu acest server.', + 'user_update' => 'Permite utilizatorului să modifice alți utilizatori asociați cu acest server.', + 'user_delete' => 'Permite utilizatorului să șteargă alți utilizatori asociați cu acest server.', + 'file_create' => 'Permite utilizatorului să creeze fişiere şi directoare noi.', + 'file_read' => 'Permite unui utilizator să vizualizeze conținutul unui director, dar nu să vizualizeze conținutul sau să descarce fișiere.', + 'file_read_content' => 'Permite unui utilizator să vizualizeze conținutul unui fișier dat. Acest lucru va permite, de asemenea, utilizatorului să descarce fișiere.', + 'file_update' => 'Permite utilizatorului să actualizeze fişierele şi dosarele asociate cu serverul.', + 'file_delete' => 'Permite utilizatorului să șteargă fișiere și directoare.', + 'file_archive' => 'Permite utilizatorului să creeze arhive de fișiere și să extragă arhivele existente.', + 'file_sftp' => 'Permite utilizatorului să efectueze acțiunile fișierelor de mai sus folosind un client SFTP.', + 'allocation_read' => 'Permite unui utilizator să vizualizeze toate alocările alocate în prezent acestui server. Utilizatorii cu orice nivel de acces la acest server pot vizualiza întotdeauna alocarea primară.', + 'allocation_update' => 'Permite unui utilizator să modifice alocarea primară a serverului și să atașeze note la fiecare alocare.', + 'allocation_delete' => 'Permite unui utilizator să șteargă o alocare de pe server.', + 'allocation_create' => 'Permite unui utilizator să aloce alocări suplimentare serverului.', + 'database_create' => 'Permite unui utilizator să creeze o bază de date nouă pentru server.', + 'database_read' => 'Permite utilizatorului să vizualizeze bazele de date ale serverului.', + 'database_update' => 'Permite utilizatorului să facă modificări într-o bază de date. În cazul în care utilizatorul nu are permisiunea "Vizualizare parolă", de asemenea, acesta nu va putea modifica parola.', + 'database_delete' => 'Permite unui utilizator să șteargă o instanță a bazei de date.', + 'database_view_password' => 'Permite utilizatorului sa vadă parola bazei de date în sistem.', + 'schedule_create' => 'Permite unui utilizator să creeze un nou orar pentru server.', + 'schedule_read' => 'Permite unui utilizator permisiunea de a vizualiza programările pentru un server.', + 'schedule_update' => 'Permite unui utilizator să facă modificări la un program de server existent.', + 'schedule_delete' => 'Permite unui utilizator să șteargă un program pentru server.', + 'backup_create' => 'Permite unui utilizator să creeze noi copii de rezervă pentru acest server.', + 'backup_read' => 'Permite unui utilizator să vizualizeze toate copiile de rezervă care există pentru acest server.', + 'backup_delete' => 'Permite unui utilizator să elimine copiile de rezervă din sistem.', + 'backup_download' => 'Permite unui utilizator să descarce o copie de rezervă a serverului. Acest lucru permite utilizatorului să acceseze toate fişierele serverului din copia de rezervă.', + 'backup_restore' => 'Permite unui utilizator să restabilească o copie de rezervă a serverului. Perturbator: acest lucru permite utilizatorului să șteargă toate fișierele serverului din proces.', + ], +]; diff --git a/lang/ro/server/users.php b/lang/ro/server/users.php deleted file mode 100644 index f9baf4f54d..0000000000 --- a/lang/ro/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Permite accesul la websocket pentru acest server.', - 'control_console' => 'Permite utilizatorului să trimită date către consola serverului.', - 'control_start' => 'Permite utilizatorului să pornească serverul.', - 'control_stop' => 'Permite utilizatorului să oprească serverul.', - 'control_restart' => 'Permite utilizatorului să repornească serverul.', - 'control_kill' => 'Permite utilizatorului oprească forțat serverul.', - 'user_create' => 'Permite utilizatorului să creeze noi conturi de utilizator pentru server.', - 'user_read' => 'Permite utilizatorului să vizualizeze utilizatorii asociați cu acest server.', - 'user_update' => 'Permite utilizatorului să modifice alți utilizatori asociați cu acest server.', - 'user_delete' => 'Permite utilizatorului să șteargă alți utilizatori asociați cu acest server.', - 'file_create' => 'Permite utilizatorului să creeze fişiere şi directoare noi.', - 'file_read' => 'Permite utilizatorului să vadă fișierele și dosarele asociate cu această instanță de server, precum și să vizualizeze conținutul acestora.', - 'file_update' => 'Permite utilizatorului să actualizeze fişierele şi dosarele asociate cu serverul.', - 'file_delete' => 'Permite utilizatorului să șteargă fișiere și directoare.', - 'file_archive' => 'Permite utilizatorului să creeze arhive de fișiere și să descompună arhivele existente.', - 'file_sftp' => 'Permite utilizatorului să efectueze acțiunile fișierelor de mai sus folosind un client SFTP.', - 'allocation_read' => 'Permite accesul la paginile de administrare a alocărilor de la server.', - 'allocation_update' => 'Permite utilizatorului să facă modificări la alocările serverului.', - 'database_create' => 'Permite utilizatorului să creeze o nouă bază de date pentru server.', - 'database_read' => 'Permite utilizatorului să vizualizeze bazele de date ale serverului.', - 'database_update' => 'Permite utilizatorului să facă modificări într-o bază de date. În cazul în care utilizatorul nu are permisiunea "Vizualizare parolă", de asemenea, acesta nu va putea modifica parola.', - 'database_delete' => 'Permite unui utilizator să șteargă o instanță a bazei de date.', - 'database_view_password' => 'Permite utilizatorului sa vadă parola bazei de date în sistem.', - 'schedule_create' => 'Permite unui utilizator să creeze un nou orar pentru server.', - 'schedule_read' => 'Permite unui utilizator permisiunea de a vizualiza programările pentru un server.', - 'schedule_update' => 'Permite unui utilizator să facă modificări la un program de server existent.', - 'schedule_delete' => 'Permite unui utilizator să șteargă un program pentru server.', - ], -]; diff --git a/lang/ro/strings.php b/lang/ro/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/ro/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/ro/validation.php b/lang/ro/validation.php index 9cccf35080..b4484a69bc 100644 --- a/lang/ro/validation.php +++ b/lang/ro/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => ':attribute trebuie să fie acceptat.', + 'active_url' => 'Câmpul :attribute nu este un URL valid.', + 'after' => ':attribute trebuie sa fie o dată după :date.', + 'after_or_equal' => ':attribute trebuie să fie o dată mai mare sau egală cu :date.', + 'alpha' => ':attribute poate să conțină numai litere.', + 'alpha_dash' => ':attribute poate conține numai litere, numere și liniuțe.', + 'alpha_num' => 'Câmpul :attribute poate conține doar litere și numere.', + 'array' => ':attribute trebuie să fie un vector.', + 'before' => ':attribute trebuie sa contina o data inainte de :date.', + 'before_or_equal' => 'Câmpul :attribute trebuie să fie o dată înainte sau egală cu :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => ':attribute trebuie să fie între :min și :max.', + 'file' => ':attribute trebuie să fie între :min și :max kilobytes.', + 'string' => ':attribute trebuie să fie între :min și :max caractere.', + 'array' => ':attribute trebuie să aibă între :min şi :max elemente.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => 'Confirmarea :attribute nu se potrivește.', + 'date' => ':attribute nu este o dată valida.', + 'date_format' => ':attribute nu se potrivește cu formatul :format.', + 'different' => ':attribute și :other trebuie să fie diferite.', + 'digits' => ':attribute trebuie să fie de :digits cifre.', + 'digits_between' => ':attribute trebuie să aibă între :min și :max cifre.', + 'dimensions' => ':attribute are dimensiuni nevalide ale imaginii.', + + 'email' => ':attribute trebuie să fie o adresă de email validă.', + + 'file' => ':attribute trebuie să fie un fișier.', + 'filled' => 'Câmpul :attribute este obligatoriu.', + 'image' => ':attribute trebuie să fie o imagine.', + + 'in_array' => 'Câmpul :attribute nu există în :other.', + 'integer' => ':attribute trebuie să fie un număr întreg.', + 'ip' => 'Câmpul :attribute trebuie să fie o adresă IP validă.', + 'json' => 'Acest :attribute trebuie să fie un sir JSON valid.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute nu poate fi mai mare decât :max.', + 'file' => 'Câmpul :attribute nu poate avea mai mult de :max kiloocteți.', + 'string' => ':attribute nu poate fi mai mare decât :max caractere.', + 'array' => ':attribute nu poate avea mai mult de :max elemente.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => 'Câmpul :attribute trebuie să fie un fișier de tipul: :values.', + 'mimetypes' => 'Câmpul :attribute trebuie să fie un fișier de tipul: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute trebuie să aibă cel puțin :min.', + 'file' => ':attribute trebuie să aibă cel puțin :min kilobytes.', + 'string' => ':attribute trebuie să fie de minim :min caractere.', + 'array' => ':attribute trebuie să aibă cel puțin :min elemente.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute trebuie sa fie un numar.', + + 'regex' => 'Formatul :attribute este invalid.', + + 'required_with_all' => 'Câmpul :attribute este obligatoriu atunci când :values este prezent.', + + 'same' => 'Câmpul :attribute și :other trebuie să fie identice.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute trebuie să fie :size.', + 'file' => 'Acest :attribute trebuie sa aibă :size kilobiți.', + 'string' => 'Câmpul :attribute trebuie să aibă :size caractere.', + 'array' => ':attribute trebuie să conțină :size elemente.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute trebuie să fie un șir.', + 'timezone' => ':attribute trebuie să fie o zonă validă.', + + 'url' => 'Formatul :attribute este invalid.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => 'Variabilă :env', + 'invalid_password' => 'Parola furnizată nu a fost validă pentru acest cont.', ], ]; diff --git a/lang/ru/activity.php b/lang/ru/activity.php index a63b6eaa49..fb07e3065e 100644 --- a/lang/ru/activity.php +++ b/lang/ru/activity.php @@ -8,123 +8,118 @@ */ return [ 'auth' => [ - 'fail' => 'Не удалось войти', - 'success' => 'Вход выполнен', + 'fail' => 'Не удалось войти в аккаунт', + 'success' => 'Успешный вход', 'password-reset' => 'Пароль сброшен', - 'reset-password' => 'Запрошен сброс пароля', - 'checkpoint' => 'Двухфакторная аутентификация включена', - 'recovery-token' => 'Использован резервный код 2FA', - 'token' => 'Пройдена двухфакторная проверка', - 'ip-blocked' => 'Заблокирован запрос с IP адреса не внесенного в список для :identifier', + 'checkpoint' => 'Запрошена двухфакторная аутентификация', + 'recovery-token' => 'Использован резервный ключ 2FA', + 'token' => 'Двухфакторная проверка пройдена', + 'ip-blocked' => 'Заблокирован запрос с незарегистрированного IP для :identifier', 'sftp' => [ - 'fail' => 'Не удалось войти в SFTP', + 'fail' => 'Неудачный вход в SFTP', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Изменена эл. почта с :old на :new', - 'password-changed' => 'Изменен пароль', + 'username-changed' => 'Сменено имя пользователя с :old на :new', + 'email-changed' => 'Смена почты с :old на :new', + 'password-changed' => 'Пароль изменён', ], 'api-key' => [ - 'create' => 'Создан новый API ключ :identifier', - 'delete' => 'Удален API ключ :identifier', + 'create' => 'Создан API-ключ :identifier', + 'delete' => 'API-ключ :identifier удалён', ], 'ssh-key' => [ - 'create' => 'Добавлен SSH ключ :fingerprint в аккаунт', - 'delete' => 'SSH ключ :fingerprint удален из аккаунта', + 'create' => 'Добавлен SSH ключ :fingerprint на аккаунт', + 'delete' => 'SSH ключ :fingerprint удалён с аккаунта', ], 'two-factor' => [ - 'create' => 'Включена двухфакторная авторизация', - 'delete' => 'Двухфакторная авторизация отключена', + 'create' => 'Включено подтверждение через 2FA', + 'delete' => '2FA отключено', ], ], 'server' => [ - 'reinstall' => 'Сервер переустановлен', 'console' => [ - 'command' => 'Выполнено ":command" на сервере', + 'command' => 'Выполнил ":command" на сервере', ], 'power' => [ - 'start' => 'Сервер запущен', - 'stop' => 'Сервер остановлен', - 'restart' => 'Сервер перезапущен', - 'kill' => 'Процесс сервера принудительно завершен', + 'start' => 'Запустил сервер', + 'stop' => 'Остановил сервер', + 'restart' => 'Перезапустил сервер', + 'kill' => 'Убил процесс сервера', ], 'backup' => [ - 'download' => 'Скачана резервная копия :name', - 'delete' => 'Удалена резервная копия :name', - 'restore' => 'Восстановлена резервная копия :name (удалены файлы: :truncate)', - 'restore-complete' => 'Восстановление резервной копии :name завершено', - 'restore-failed' => 'Не удалось восстановить резервную копию :name', - 'start' => 'Запущено резервное копирование :name', - 'complete' => 'Резервная копия :name отмечена как завершенная', - 'fail' => 'Не удалось создать резервную копию :name', - 'lock' => 'Защищена резервная копия :name', - 'unlock' => 'Разблокирована резервная копия :name', + 'download' => 'Скачал бэкап :name', + 'delete' => 'Удалил бэкап :name', + 'restore' => 'Восстановил бэкап :name (удалённые файлы: :truncate)', + 'restore-complete' => 'Восстановление бэкапа :name завершено', + 'restore-failed' => 'Не удалось восстановить бэкап :name', + 'start' => 'Запустил новый бэкап :name', + 'complete' => 'Бэкап :name обозначен как завершённый', + 'fail' => 'Бэкап :name обозначен как неуспешный', + 'lock' => 'Заблокировал бэкап :name', + 'unlock' => 'Разблокировал бэкап :name', + 'rename' => 'Резервная копия была переименована с ":old_name" в ":new_name"', ], 'database' => [ - 'create' => 'Создана база данных :name', - 'rotate-password' => 'Изменен пароль для базы данных :name', - 'delete' => 'Удалена база данных :name', + 'create' => 'Создал новую базу данных :name', + 'rotate-password' => 'Сбросил пароль базы данных :name', + 'delete' => 'Удалил базу данных :name', ], 'file' => [ - 'compress_one' => ':directory:file архивирован', - 'compress_other' => 'Архивировано :count файлов из директории :directory', - 'read' => 'Просмотрено содержимое :file', - 'copy' => 'Создана копия :file', - 'create-directory' => 'Создана директория :directory:name', - 'decompress' => 'Разархивировано :files файлов в :directory', - 'delete_one' => 'Удалено :directory:files.0', - 'delete_other' => 'Удалено :count файлов из :directory', - 'download' => 'Скачан :file', - 'pull' => 'Скачан файл из :url в :directory', - 'rename_one' => ':directory:files.0.from переименован в :directory:files.0.to', - 'rename_other' => 'Переименовано :count файлов в :directory', - 'write' => 'Обновлено содержание :file', - 'upload' => 'Начата загрузка файлов', - 'uploaded' => 'Загружено :directory:file', + 'compress' => 'Сжал :directory:files|Сжато :count файлов в :directory', + 'read' => 'Просмотрел содержимое :file', + 'copy' => 'Создал копию файла :file', + 'create-directory' => 'Создал директорию :directory:name', + 'decompress' => 'Распаковал :file в :directory', + 'delete' => 'Удалил :directory:files|Удалено :count файлов в :directory', + 'download' => 'Скачал :file', + 'pull' => 'Скачал удалённый файл по адресу :url в :directory', + 'rename' => 'Переместил/ Переименовал :from в :to|Переместил/ Переименовал :count файлов в директорию :directory', + 'write' => 'Обновил содержимое :file', + 'upload' => 'Начал выгрузку файла', + 'uploaded' => 'Загрузил :directory:file', ], 'sftp' => [ 'denied' => 'Подключение по SFTP заблокировано из-за отсутствия разрешений', - 'create_one' => 'Создан :files.0', - 'create_other' => 'Создано :count новых файлов', - 'write_one' => 'Изменено содержание файла :files.0', - 'write_other' => 'Изменено содержание :count файлов', - 'delete_one' => 'Удален :files.0', - 'delete_other' => 'Удалено :count файлов', - 'create-directory_one' => 'Создана директория :files.0', - 'create-directory_other' => 'Создано :count директорий', - 'rename_one' => ':files.0.from переименован в :files.0.to', - 'rename_other' => 'Переименовано или перемещено :count файлов', + 'create' => 'Создал :files|Создано :count новых файлов', + 'write' => 'Изменил содержимое :files|Изменено содержимое :count файлов', + 'delete' => 'Удалил :files|Удалено :count файлов', + 'create-directory' => 'Создал директорию :files|Создано :count директорий', + 'rename' => 'Переименовал :from в :to|Переименовано или перемещено :count файлов', ], 'allocation' => [ - 'create' => 'Добавлен порт :allocation', - 'notes' => 'Обновлены заметки для :allocation с ":old" на ":new"', - 'primary' => ':allocation установлен как основной порт сервера', - 'delete' => 'Порт :allocation был удален', + 'create' => 'Добавил порт :allocation к серверу', + 'notes' => 'Обновил заметку порта :allocation с ":old" на ":new"', + 'primary' => 'Назначил порт :allocation как основной', + 'delete' => 'Удалил порт :allocation', ], 'schedule' => [ - 'create' => 'Создано расписание :name', - 'update' => 'Изменено расписание :name', - 'execute' => 'Вручную выполнено расписание :name', - 'delete' => 'Удалено расписание :name', + 'create' => 'Создал расписание :name', + 'update' => 'Изменил расписание :name', + 'execute' => 'Выполнил расписание :name вручную', + 'delete' => 'Удалил расписание :name', ], 'task' => [ - 'create' => 'Создана новая задача ":action" для расписания :name', - 'update' => 'Изменена задача ":action" для расписания :name', - 'delete' => 'Удалена задача в расписании :name', + 'create' => 'Создал задачу ":action" в расписании :name', + 'update' => 'Обновил задачу ":action" в расписании :name', + 'delete' => 'Удалил задачу ":action" в расписании :name', ], 'settings' => [ - 'rename' => 'Название сервера изменено с :old на :new', - 'description' => 'Описание сервера изменено с :old на :new', + 'rename' => 'Переименовал сервер с ":old" на ":new"', + 'description' => 'Изменил описание сервера с ":old" на ":new"', + 'reinstall' => 'Переустановил сервер', ], 'startup' => [ - 'edit' => 'Переменная :variable изменена с ":old" на ":new"', - 'image' => 'Образ Docker обновлен с :old на :new', + 'edit' => 'Изменил переменную :variable с ":old" на ":new"', + 'image' => 'Образ Docker обновлён с :old на :new', + 'command' => 'Обновлена команда запуска для сервера с :old на :new', ], 'subuser' => [ - 'create' => 'Добавлен подпользователь :email', - 'update' => 'Обновлены права подпользователя :email', - 'delete' => 'Подпользователь :email удален', + 'create' => 'Добавил :email как субпользователя', + 'update' => 'Обновил права субпользователя :email', + 'delete' => 'Удалил :email из субпользователей', ], + 'crashed' => 'Сервер принудительно завершил процесс', ], ]; diff --git a/lang/ru/admin/apikey.php b/lang/ru/admin/apikey.php new file mode 100644 index 0000000000..5d7489f9d2 --- /dev/null +++ b/lang/ru/admin/apikey.php @@ -0,0 +1,27 @@ + 'Ключи API приложения', + 'empty' => 'Нет ключей API', + 'whitelist' => 'Список белых IPv4 адресов', + 'whitelist_help' => 'Допускает для работы с API ключами только записанные IPv4 адреса. Каждый адрес должен быть на новой строке.', + 'whitelist_placeholder' => 'Пример: 127.0.0.1 или 192.168.1.1', + 'description' => 'Описание', + 'description_help' => 'Краткое описание этого ключа.', + 'nav_title' => 'API-ключи', + 'model_label' => 'API-ключ приложения', + 'model_label_plural' => 'API-ключи приложения', + 'table' => [ + 'key' => 'Ключ', + 'description' => 'Описание', + 'last_used' => 'Последнее использование', + 'created' => 'Создан', + 'created_by' => 'Создал', + 'never_used' => 'Никогда', + ], + 'permissions' => [ + 'none' => 'Ничего', + 'read' => 'Чтение', + 'read_write' => 'Чтение и запись', + ], +]; diff --git a/lang/ru/admin/dashboard.php b/lang/ru/admin/dashboard.php new file mode 100644 index 0000000000..776b36ad10 --- /dev/null +++ b/lang/ru/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Добро пожаловать в Pelican!', + 'version' => 'Версия: :version', + 'advanced' => 'Дополнительно', + 'server' => 'Сервер', + 'user' => 'Пользователь', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Информация для разработчиков', + 'content' => 'Спасибо за тестирование версии для разработки!', + 'extra_note' => 'Если вы столкнётесь с какими-либо проблемами, пожалуйста, сообщите о них на GitHub.', + 'button_issues' => 'Сообщить о проблеме', + 'button_features' => 'Обсудить функционал', + ], + 'intro-update-available' => [ + 'heading' => 'Доступно обновление', + 'content' => ':latestVersion теперь доступна! Прочтите нашу документацию, чтобы обновить вашу панель.', + 'button_changelog' => 'Что нового?', + ], + 'intro-no-update' => [ + 'heading' => 'Версия вашей панели актуальна', + 'content' => 'Сейчас вы используете версию :version. Свежих обновлений нет!', + ], + 'intro-first-node' => [ + 'heading' => 'Узлы не обнаружены', + 'content' => 'Похоже, что вы ещё не добавили ни одного узла. Нажмите кнопку, чтобы добавить новый узел!', + 'extra_note' => 'Если вы столкнулись с какими-либо проблемами, пожалуйста, сообщите о них на GitHub.', + 'button_label' => 'Создать первый узел в Pelican', + ], + 'intro-support' => [ + 'heading' => 'Поддержка Pelican', + 'content' => 'Благодарим вас за использование Pelican, всё это возможно только благодаря вашей поддержке, наших участников и всех остальных!', + 'extra_note' => 'Мы ценим любую поддержку со стороны каждого.', + 'button_translate' => 'Помочь с переводом', + 'button_donate' => 'Пожертвовать напрямую', + ], + 'intro-help' => [ + 'heading' => 'Нужна помощь?', + 'content' => 'Перед тем, как спрашивать помощи на нашем сервере Discord, прочитайте документацию!', + 'button_docs' => 'Документация', + ], + ], +]; diff --git a/lang/ru/admin/databasehost.php b/lang/ru/admin/databasehost.php new file mode 100644 index 0000000000..5da0c000a4 --- /dev/null +++ b/lang/ru/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Хосты Баз Данных', + 'model_label' => 'Хост баз данных', + 'model_label_plural' => 'Хосты баз данных', + 'table' => [ + 'database' => 'База данных', + 'name' => 'Название', + 'host' => 'Хост', + 'port' => 'Порт', + 'name_helper' => 'Если оставить поле пустым, то будет сгенерировано случайное название', + 'username' => 'Пользователь', + 'password' => 'Пароль', + 'remote' => 'Соединения от', + 'remote_helper' => 'Где подключения должны быть разрешены. Оставьте пустым, чтобы разрешить подключения куда угодно.', + 'max_connections' => 'Макс. Подключений', + 'created_at' => 'Создан', + 'connection_string' => 'Строка подключения JDBC', + ], + 'error' => 'Ошибка подключения к хосту', + 'host' => 'Хост', + 'host_help' => 'IP-адрес или домен, которые будут использоваться панелью при попытке подключения к MySQL хосту для создания новых баз данных.', + 'port' => 'Порт', + 'port_help' => 'Порт, на котором работает хост MySQL.', + 'max_database' => 'Макс. Баз данных', + 'max_databases_help' => 'Максимальное количество баз данных, которые могут быть созданы на этом хосте. При достижении лимита новые базы данных создаваться не будут. Оставьте пустым, чтобы убрать ограничение.', + 'display_name' => 'Отображаемое название', + 'display_name_help' => 'IP-адрес или имя домена, которые будут показаны конечному пользователю.', + 'username' => 'Имя пользователя', + 'username_help' => 'Имя пользователя, имеющего достаточно прав для создания новых пользователей и баз данных на данном хосте.', + 'password' => 'Пароль', + 'password_help' => 'Пароль пользователя базы данных.', + 'linked_nodes' => 'Связанные узлы', + 'linked_nodes_help' => 'Эта настройка будет по умолчанию при создании баз данных на серверах на выбранном узле.', + 'connection_error' => 'Ошибка подключения к хосту базы данных', + 'no_database_hosts' => 'Нет хостов баз данных', + 'no_nodes' => 'Нет узлов', + 'delete_help' => 'Хост баз данных имеет базы данных', + 'unlimited' => 'Неограниченно', + 'anywhere' => 'Везде', + + 'rotate' => 'Сбросить', + 'rotate_password' => 'Сбросить пароль', + 'rotated' => 'Пароль сброшен', + 'rotate_error' => 'Сброс пароля не удался', + 'databases' => 'Базы данных', + + 'setup' => [ + 'preparations' => 'Подготовка', + 'database_setup' => 'Установка базы данных', + 'panel_setup' => 'Установка панели', + + 'note' => 'На текущее время, может использоваться исключительно MySQL или MariaDB.', + 'different_server' => 'База данных запущена не на том же сервере, что и панель?', + + 'database_user' => 'Пользователь базы данных', + 'cli_login' => 'Используйте mysql -u root -p для получения доступа к mysql cli.', + 'command_create_user' => 'Команда для создания пользователя', + 'command_assign_permissions' => 'Команда для выдачи прав пользователям', + 'cli_exit' => 'Для выхода с mysql cli напишите exit', + 'external_access' => 'Внешний доступ', + 'allow_external_access' => ' +

Скорее всего, вам потребуется разрешить внешний доступ к этому экземпляру MySQL, чтобы серверы могли к нему подключаться.

+
+

Для этого откройте my.cnf, нахождение которого варьируется в зависимости от вашей операционной системы и того, каким образом был установлен MySQL. Вы можете использовать /etc -iname my.cnf чтобы найти его.

+
+

Откройте my.cnf, добавьте следующий текст в конец файла и сохраните его:
+ [mysqld]
bind-address=0.0.0.0

+
+

Перезапустите MySQL или MariaDB чтобы применить ваши изменения. Это изменит стандартную конфигурацию MySQL, которая по умолчанию принимает запросы только внутри вашей сети. Данная настройка позволит совершать внешние подключения к вашей базе данных. Убедитесь, что на сервере открыт MySQL порт (3306 по умолчанию) в вашем фаерволе.

', + ], +]; diff --git a/lang/ru/admin/egg.php b/lang/ru/admin/egg.php new file mode 100644 index 0000000000..e5c1d29619 --- /dev/null +++ b/lang/ru/admin/egg.php @@ -0,0 +1,109 @@ + 'Яйца', + 'model_label' => 'Яйцо', + 'model_label_plural' => 'Яйца', + 'tabs' => [ + 'configuration' => 'Конфигурация', + 'process_management' => 'Управление процессами', + 'egg_variables' => 'Переменные Яйца', + 'install_script' => 'Скрипт установки', + ], + 'import' => [ + 'file' => 'Файл', + 'url' => 'Ссылка', + 'image_url' => 'URL изображения', + 'image_error' => 'Не удалось загрузить изображение', + 'image_too_large' => 'Изображение слишком велико. Лимит составляет 1024 КБ', + 'egg_help' => 'Это должен быть файл .json (например, egg-minecraft.json)', + 'url_help' => 'Ссылка должна указывать непосредственно на файл .json', + 'add_url' => 'Новый URL', + 'import_failed' => 'Импорт не удался', + 'import_success' => 'Импорт успешен', + 'github' => 'Добавить из Github', + 'refresh' => 'Обновить', + 'import_image' => 'Загрузить изображение', + 'no_local_ip' => 'Локальные IP-адреса не разрешены', + 'unsupported_format' => 'Формат не поддерживается. Поддерживаемые форматы: :formats', + 'invalid_url' => 'Предоставленный URL недействителен', + 'image_deleted' => 'Изображение удалено', + 'no_image' => 'Нет изображения', + 'image_updated' => 'Изображение обновлено', + ], + 'export' => [ + 'modal' => 'Как бы вы хотели экспортировать :egg?', + 'as' => 'В качестве .:format', + ], + 'in_use' => 'Используется', + 'servers' => 'Серверы', + 'name' => 'Название', + 'egg_uuid' => 'UUID Яйца', + 'egg_id' => 'ID Яйца', + 'name_help' => 'Простое, понятное человеку название для использования в качестве идентификатора для этого Яйца.', + 'author' => 'Автор', + 'uuid_help' => 'Это глобальный уникальный идентификатор для этого Яйца, который Wings использует в качестве идентификатора.', + 'author_help' => 'Автор этой версии Яйца.', + 'author_help_edit' => 'Автор этой версии Яйца. Загрузка новой конфигурации от другого автора изменит эту.', + 'description' => 'Описание', + 'description_help' => 'Описание для этого Яйца, которое будет отображаться в панели при необходимости.', + 'add_startup' => 'Добавить команду запуска', + 'startup_command' => 'Команда', + 'startup_commands' => 'Команды запуска', + 'startup_name' => 'Отображаемое имя', + 'startup_help' => 'Команды запуска, доступные серверам, использующим это яйцо. Первый команды по умолчанию.', + 'file_denylist' => 'Чёрный список файлов', + 'file_denylist_help' => 'Список файлов, которые пользователю нельзя редактировать.', + 'features' => 'Особенности', + 'force_ip' => 'Принудительно установить исходящий IP', + 'force_ip_help' => 'Принуждает весь исходящий сетевой трафик к тому, чтобы его IP-адрес источника NAT был привязан к IP-адресу первичного распределения сервера. +Требуется для правильной работы некоторых игр, когда узел имеет несколько публичных IP-адресов. Включение этой опции отключит внутреннюю сеть для всех серверов, использующих это Яйцо, в результате чего они не смогут получить внутренний доступ к другим серверам на том же узле.', + 'tags' => 'Теги', + 'update_url' => 'Адрес обновления', + 'update_url_help' => 'Ссылка должна указывать непосредственно на файл .json', + 'add_image' => 'Добавить образ Docker', + 'docker_images' => 'Образы Docker', + 'docker_name' => 'Название образа', + 'docker_uri' => 'Ссылка на образ', + 'docker_help' => 'Образы Docker, доступные на серверах с использованием этого яйца. Первый по умолчанию.', + + 'stop_command' => 'Команда остановки', + 'stop_command_help' => 'Команда, которая будет использоваться для аккуратной остановки процесса сервера. Если вам нужно отправить SIGINT, введите сюда ^C.', + 'copy_from' => 'Скопировать настройки из', + 'copy_from_help' => 'Если вы хотите скопировать настройки из другого Яйца, выберите их из меню выше.', + 'none' => 'Ничего', + 'start_config' => 'Настройка запуска', + 'start_config_help' => 'Список значений, которые демон будет искать при загрузке сервера, чтобы определить окончание.', + 'config_files' => 'Файлы конфигурации', + 'config_files_help' => 'Это должно быть JSON представление конфигурационных файлов для изменения и какие части можно будет изменить.', + 'log_config' => 'Настройка журналирования', + 'log_config_help' => 'Это должно быть JSON представление того, где хранятся файлы журналов, и должен ли демон создавать свои собственные журналы.', + + 'environment_variable' => 'Переменные среды', + 'default_value' => 'Значение по умолчанию', + 'user_permissions' => 'Права пользователя', + 'viewable' => 'Просматриваемые', + 'editable' => 'Редактируемые', + 'rules' => 'Правила', + 'add_new_variable' => 'Добавить новую переменную', + + 'error_unique' => 'Переменная с данным названием уже существует.', + 'error_required' => 'Введите значение переменной.', + 'error_reserved' => 'Это значение зарезервировано и не может быть использовано.', + + 'script_from' => 'Скрипт из', + 'script_container' => 'Контейнер скриптов', + 'script_entry' => 'Запись скрипта', + 'script_install' => 'Скрипт установки', + 'no_eggs' => 'Нет Яиц', + 'no_servers' => 'Нет серверов', + 'no_servers_help' => 'Нет серверов с этим Яйцом.', + + 'update' => 'Обновить|Обновить выбранное', + 'updated' => 'Яйцо обновлено|:count/:total яиц обновлено', + 'updated_failed' => 'Не удалось обновить :count яиц', + 'updated_skipped' => ':count пропущено', + 'update_question' => 'Вы уверены в том, что хотите обновить это яйцо?|Вы уверены в том, что хотите обновить эти яйца?', + 'update_description' => 'Если вы сделали какие-либо изменения в яйце, они будут перезаписаны!|Если вы сделали какие-либо изменения в яйцах, они будут перезаписаны!', + 'no_updates' => 'Нет обновлений у выбранных яиц', +]; diff --git a/lang/ru/admin/eggs.php b/lang/ru/admin/eggs.php deleted file mode 100644 index 14f8651d68..0000000000 --- a/lang/ru/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Яйцо и его переменные успешно импортированы.', - 'updated_via_import' => 'Яйцо успешно обновлено из файла.', - 'deleted' => 'Яйцо успешно удалено из панели.', - 'updated' => 'Конфигурация яйца успешно изменена.', - 'script_updated' => 'Скрипт установки яйца был успешно обновлен и будет выполняться при установке серверов.', - 'egg_created' => 'Яйцо успешно создано. Для применения изменений перезагрузите Wings.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Переменная ":variable" удалена, после пересборки серверов она более не будет им доступна.', - 'variable_updated' => 'Переменная ":variable" обновлена. Для применения изменений на серверах необходимо их пересобрать.', - 'variable_created' => 'Новая переменная создана и назначена яйцу успешно.', - ], - ], -]; diff --git a/lang/ru/admin/health.php b/lang/ru/admin/health.php new file mode 100644 index 0000000000..04dc9d2d57 --- /dev/null +++ b/lang/ru/admin/health.php @@ -0,0 +1,60 @@ + 'Состояние', + 'results_refreshed' => 'Результаты проверки состояния обновлены', + 'checked' => 'Состояние проверено :time', + 'refresh' => 'Обновить', + 'results' => [ + 'cache' => [ + 'label' => 'Кэш', + 'ok' => 'Ок', + 'failed_retrieve' => 'Не удалось установить или получить состояние кэша.', + 'failed' => 'Произошла ошибка с кэшем приложения: :error', + ], + 'database' => [ + 'label' => 'База данных', + 'ok' => 'Ок', + 'failed' => 'Не удалось подключиться к базе данных: :error', + ], + 'debugmode' => [ + 'label' => 'Режим отладки', + 'ok' => 'Режим отладки выключен', + 'failed' => 'Режим отладки должен был быть :expected, но на самом деле :actual', + ], + 'environment' => [ + 'label' => 'Окружение', + 'ok' => 'Ок, установлено на :actual', + 'failed' => 'Окружение установлено на :actual, ожидалось :expected', + ], + 'nodeversions' => [ + 'label' => 'Версии узлов', + 'ok' => 'Узлы обновлены', + 'failed' => ':outdated/:all Узлов устарели', + 'no_nodes_created' => 'Узлы не обнаружены', + 'no_nodes' => 'Нет узлов', + 'all_up_to_date' => 'Все актуальны', + 'outdated' => ':outdated/:all устарели', + ], + 'panelversion' => [ + 'label' => 'Версия панели', + 'ok' => 'Версия вашей панели актуальна', + 'failed' => 'Установленная версия :currentVersion, но последняя это :latestVersion', + 'up_to_date' => 'Актуальна', + 'outdated' => 'Устарела', + ], + 'schedule' => [ + 'label' => 'Расписания', + 'ok' => 'Ок', + 'failed_last_ran' => 'Последний запуск расписания был более чем :time минут назад', + 'failed_not_ran' => 'Расписания ещё не запускались', + ], + 'useddiskspace' => [ + 'label' => 'Использование диска', + ], + ], + 'checks' => [ + 'successful' => 'Успешно', + 'failed' => 'Не удалось', + ], +]; diff --git a/lang/ru/admin/log.php b/lang/ru/admin/log.php new file mode 100644 index 0000000000..d43e46c104 --- /dev/null +++ b/lang/ru/admin/log.php @@ -0,0 +1,26 @@ + 'Ошибки не найдены', + 'total_logs' => 'Всего записей', + 'error' => 'Ошибка', + 'warning' => 'Предупреждение', + 'notice' => 'Уведомление', + 'info' => 'Информация', + 'debug' => 'Отладка', + 'navigation' => [ + 'panel_logs' => 'Записи панели', + ], + 'actions' => [ + 'upload_logs' => 'Загрузить записи?', + 'upload_logs_description' => ':file будет загружен на :url. Подтвердите, что желаете сделать это.', + 'view_logs' => 'Посмотреть записи', + 'log_not_found' => 'Записи не найдены', + 'log_not_found_description' => 'Не удалось найти запись для :filename', + 'failed_to_upload' => 'Не удалось загрузить.', + 'failed_to_upload_description' => 'HTTP-статус: :status', + 'log_upload' => 'Записи загружены.', + 'log_upload_action' => 'Посмотреть запись', + 'upload_tooltip' => 'Загрузить на :url', + ], +]; diff --git a/lang/ru/admin/mount.php b/lang/ru/admin/mount.php new file mode 100644 index 0000000000..5a65d83bfb --- /dev/null +++ b/lang/ru/admin/mount.php @@ -0,0 +1,30 @@ + 'Хранилища', + 'model_label' => 'Хранилище', + 'model_label_plural' => 'Хранилища', + 'name' => 'Название', + 'name_help' => 'Уникальное имя, чтобы отличать это хранилище от других.', + 'source' => 'Источник', + 'source_help' => 'Путь на хосте для монтирования в контейнер.', + 'target' => 'Цель', + 'target_help' => 'Где хранилище будет доступно в контейнере.', + 'read_only' => 'Только чтение?', + 'read_only_help' => 'Хранилище только для чтения в контейнере?', + 'description' => 'Описание', + 'description_help' => 'Более длинное описание для этого хранилища', + 'no_mounts' => 'Нет хранилищ', + 'eggs' => 'Яйца', + 'nodes' => 'Узлы', + 'toggles' => [ + 'writable' => 'Изменяемый', + 'read_only' => 'Только чтение', + ], + 'table' => [ + 'name' => 'Название', + 'all_eggs' => 'Все Яйца', + 'all_nodes' => 'Все узлы', + 'read_only' => 'Только чтение', + ], +]; diff --git a/lang/ru/admin/node.php b/lang/ru/admin/node.php index 40c01df7d1..4a74375ad0 100644 --- a/lang/ru/admin/node.php +++ b/lang/ru/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'Введенные IP адрес или домен не преобразуются в IP-адрес.', - 'fqdn_required_for_ssl' => 'Для использования SSL на этом узле необходимо полное доменное имя, преобразующееся в действительный публичный IP-адрес.', + 'nav_title' => 'Узлы', + 'model_label' => 'Узел', + 'model_label_plural' => 'Узлы', + 'create' => 'Создать узел', + 'tabs' => [ + 'overview' => 'Обзор', + 'basic_settings' => 'Основные настройки', + 'advanced_settings' => 'Дополнительные настройки', + 'config_file' => 'Файл конфигурации', + 'diagnostics' => 'Диагностика', ], - 'notices' => [ - 'allocations_added' => 'Местоположения успешно добавлены в этот узел.', - 'node_deleted' => 'Узел успешно удален из панели.', - 'node_created' => 'Узел успешно создан. Вы можете автоматически настроить демон на нем, используя вкладку Конфигурация. Перед созданием серверов на этом узле Вы должны выделить как минимум один IP-адрес и порт.', - 'node_updated' => 'Информация об узле успешно обновлена. Если Вы изменили настройки демона, нужно будет перезагрузить его на узле для применения изменений.', - 'unallocated_deleted' => 'Удалены все не назначенные порты для :ip.', + 'table' => [ + 'health' => 'Состояние', + 'name' => 'Название', + 'address' => 'Адрес', + 'public' => 'Публичный', + 'servers' => 'Сервера', + 'alias' => 'Псевдоним', + 'ip' => 'IP', + 'egg' => 'Яйцо', + 'owner' => 'Владелец', + 'allocation_notes' => 'Заметки', + 'no_notes' => 'Нет заметок', ], + 'node_info' => 'Информация об узле', + 'wings_version' => 'Версия Wings', + 'cpu_threads' => 'Потоков процессора', + 'architecture' => 'Архитектура', + 'kernel' => 'Ядро', + 'unknown' => 'Неизвестно', + 'latest' => 'Последнее', + 'node_uuid' => 'UUID узла', + 'node_id' => 'ID узла', + + 'ip_address' => 'IP адрес', + 'ip_help' => 'Обычно публичный IP адрес вашей машины, если вы не пробросили порт.', + 'alias_help' => 'Дополнительное отображаемое имя, чтобы не забыть что это.', + 'refresh' => 'Обновить', + 'domain' => 'Домен', + 'ssl_ip' => 'Вы не можете подключиться к IP-адресу через SSL', + 'error' => 'Это домен, который указывает на IP-адрес вашего узла. Если вы уже настроили это, вы можете проверить его, глянув следующее поле!', + 'fqdn_help' => 'Ваша панель использует SSL, что значит, что вашим узлам тоже требуется SSL-сертификат. Вы должны использовать домен, т.к. нельзя получить SSL-сертификат на IP адрес.', + 'dns' => 'Проверка DNS записи', + 'dns_help' => 'Это позволит вам знать, указывает ли ваша DNS запись на правильный IP-адрес.', + 'valid' => 'Верно', + 'invalid' => 'Неверно', + 'port' => 'Порт', + 'ports' => 'Порты', + 'port_help' => 'Если вы используете демон через Cloudflare, вы должны установить порт 8443, чтобы разрешить проксирование WebSocket через SSL.', + 'connect_port' => 'Порт подключения', + 'connect_port_help' => 'Для подключения к wings будет использоваться этот порт. Если вы используете обратный прокси-сервер, он может отличаться от порта прослушивания. При использовании прокси-сервера Cloudflare вам следует использовать 8443.', + 'listen_port' => 'Прослушиваемый порт', + 'listen_port_help' => 'Wings будет прослушивать этот порт.', + 'display_name' => 'Отображаемое название', + 'ssl' => 'Общение по SSL', + 'panel_on_ssl' => 'Ваша панель использует SSL,
демон тоже должен его использовать.', + 'ssl_help' => 'IP-адрес не может использовать SSL.', + + 'tags' => 'Теги', + 'upload_limit' => 'Лимит загрузок', + 'upload_limit_help' => 'Укажите максимальный размер файлов для загрузки через веб-интерфейс.', + 'sftp_port' => 'Порт SFTP', + 'sftp_alias' => 'Сокращение для SFTP', + 'sftp_alias_help' => 'Отображает сокращение для SFTP. Оставьте пустым, чтобы использовать домен узла.', + 'use_for_deploy' => 'Использовать для развёртывания?', + 'maintenance_mode' => 'Режим обслуживания', + 'maintenance_mode_help' => 'Если узел помечен как \'На обслуживании\', пользователи не смогут получить доступ к серверам на этом узле.', + + 'cpu' => 'Процессор', + 'cpu_limit' => 'Лимит процессора', + 'memory' => 'Память', + 'memory_limit' => 'Лимит памяти', + 'disk' => 'Диск', + 'disk_limit' => 'Лимит диска', + 'unlimited' => 'Неограниченно', + 'limited' => 'Ограничено', + 'overallocate' => 'Перерасход', + 'enabled' => 'Включено', + 'disabled' => 'Выключено', + 'yes' => 'Да', + 'no' => 'Нет', + + 'instructions' => 'Инструкции', + 'instructions_help' => 'Сохраните этот файл в корневой каталог вашего демона с именем config.yml', + + 'auto_deploy' => 'Команда автоустановки', + 'auto_question' => 'Выберите между автономной или Docker установкой.', + 'auto_label' => 'Тип', + 'standalone' => 'Автономно', + 'docker' => 'Docker', + 'auto_command' => 'Для автоматической настройки узла выполните следующую команду:', + 'reset_token' => 'Сбросить токен авторизации', + 'token_reset' => 'Ключ демона был сброшен.', + 'reset_help' => 'Сброс токена демона аннулирует любые запросы, поступающие со старым токеном. Этот токен используется для всех важных операций демона, включая создание и удаление серверов. Мы рекомендуем регулярно менять этот токен в целях безопасности.', + + 'no_nodes' => 'Нет узлов', + 'none' => 'Ничего', + 'cpu_chart' => 'Процессор - :cpu% из :max%', + 'memory_chart' => 'Память - :used из :total', + 'disk_chart' => 'Диск - :used из :total', + 'used' => 'Используется', + 'unused' => 'Не используется', + + 'next_step' => 'Следующий шаг', + 'node_has_servers' => 'У узла есть сервера', + 'create_allocation' => 'Создать порты', + 'primary_allocation' => 'Основной порт', + 'databases' => 'Базы данных', + 'backups' => 'Бэкапы', + + 'error_connecting' => 'Ошибка подключения к узлу', + 'error_connecting_description' => 'Нам не удалось автоматически обновить конфигурацию на Wings, вам придется вручную обновить конфигурационный файл.', + 'allocation' => 'Распределение', + + 'diagnostics' => [ + 'header' => 'Диагностика узла', + 'include_endpoints' => 'Включить конечные точки', + 'include_endpoints_hint' => 'Включая конечные точки, будут отображать адреса панели в логах и они НЕ будут скрыты.', + 'include_logs' => 'Включить логи', + 'include_logs_hint' => 'Включение логов покажет последние логи и поможет отследить возможные проблемы.', + 'run_diagnostics' => 'Запустить диагностику', + 'upload_to_pelican' => 'Загрузить записи', + 'logs_pulled' => 'Записи запрошены.', + 'logs_uploaded' => 'Записи загружены', + 'upload_failed' => 'Произошла ошибка при загрузке записей', + 'view_logs' => 'Посмотреть записи', + 'pull' => 'Запросить', + 'upload' => 'Загрузить', + 'clear' => 'Очистить', + '404' => 'Запрашиваемый диагностический отчет не найден. Убедитесь, что Wings обновлен и повторите попытку.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Проблема с Cloudflare', + 'body' => 'Ваш узел недоступен для Cloudflare', + ], + + 'bulk_update_ip' => 'Обновить IP-адреса', + 'bulk_update_ip_description' => 'Заменить старый IP-адрес новым в записях портов. Это полезно, когда IP-адрес узла меняется', + 'update_ip' => 'Обновить IP-адрес', + 'old_ip' => 'Старый IP-адрес', + 'new_ip' => 'Новый IP-адрес', + 'no_allocations_to_update' => 'Не найдено ни одного порта со старым IP-адресом', + 'ip_updated' => 'Успешно обновлено :count портов из :total', + 'ip_update_failed' => 'Произошла ошибка при обновлении :count портов', ]; diff --git a/lang/ru/admin/plugin.php b/lang/ru/admin/plugin.php new file mode 100644 index 0000000000..50f07d162d --- /dev/null +++ b/lang/ru/admin/plugin.php @@ -0,0 +1,61 @@ + 'Плагины', + 'model_label' => 'Плагин', + 'model_label_plural' => 'Плагины', + + 'name' => 'Название', + 'update_available' => 'Доступно обновление для этого плагина', + 'author' => 'Автор', + 'version' => 'Версия', + 'category' => 'Категория', + 'status' => 'Статус', + 'visit_website' => 'Посетить сайт', + 'settings' => 'Настройки', + 'install' => 'Установить', + 'uninstall' => 'Удалить', + 'update' => 'Обновить', + 'enable' => 'Включить', + 'disable' => 'Выключить', + 'import_from_file' => 'Импорт из файла', + 'import_from_url' => 'Импорт из URL', + 'no_plugins' => 'Нет плагином', + 'all' => 'Все', + 'change_load_order' => 'Изменить порядок загрузки', + 'apply_load_order' => 'Применить порядок загрузки', + + 'enable_theme_modal' => [ + 'heading' => 'Тема уже установлена', + 'description' => 'У вас уже включена тема. Включение нескольких тем может привести к визуальным ошибкам. Вы хотите продолжить?', + ], + + 'status_enum' => [ + 'not_installed' => 'Не установлено', + 'disabled' => 'Выключено', + 'enabled' => 'Включено', + 'errored' => 'Ошибка', + 'incompatible' => 'Несовместимо', + ], + + 'category_enum' => [ + 'plugin' => 'Плагин', + 'theme' => 'Тема', + 'language' => 'Языковой пакет', + ], + + 'notifications' => [ + 'installed' => 'Плагин установлен', + 'install_error' => 'Не удалось установить плагин', + 'uninstalled' => 'Плагин удален', + 'uninstall_error' => 'Не удалось удалить плагин', + 'deleted' => 'Плагин удален', + 'updated' => 'Плагин обновлен', + 'update_error' => 'Не удалось обновить плагин', + 'enabled' => 'Плагин включен', + 'disabled' => 'Плагин отключен', + 'imported' => 'Плагин импортирован', + 'import_exists' => 'Плагин с таким id уже существует', + 'import_failed' => 'Не удалось импортировать плагин', + ], +]; diff --git a/lang/ru/admin/role.php b/lang/ru/admin/role.php new file mode 100644 index 0000000000..f36e711ca9 --- /dev/null +++ b/lang/ru/admin/role.php @@ -0,0 +1,17 @@ + 'Роли', + 'model_label' => 'Роль', + 'model_label_plural' => 'Роли', + 'no_roles' => 'Нет ролей', + 'name' => 'Название роли', + 'permissions' => 'Права', + 'in_use' => 'Используется', + 'all' => 'Все', + 'root_admin' => ':role имеет все права.', + 'root_admin_delete' => 'Нельзя удалить Root Admin', + 'users' => 'Пользователи', + 'nodes' => 'Узлы', + 'nodes_hint' => 'Оставьте поле пустым, чтобы разрешить доступ ко всем узлам.', +]; diff --git a/lang/ru/admin/server.php b/lang/ru/admin/server.php index f8684d0133..1b96062ee6 100644 --- a/lang/ru/admin/server.php +++ b/lang/ru/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'Вы пытаетесь удалить основное выделение для этого сервера, но нет резервного выделения для использования.', - 'marked_as_failed' => 'Этот сервер был отмечен как не прошедший предыдущую установку. Текущий статус не может быть изменен в этом состоянии.', - 'bad_variable' => 'Произошла ошибка проверки переменной :name.', - 'daemon_exception' => 'Возникло исключение при попытке связи с демоном, что привело к коду ответа HTTP/:code. Это исключение было записано в журнал. (идентификатор запроса: :request_id)', - 'default_allocation_not_found' => 'Запрашиваемое основное выделение не найдено в выделениях этого сервера.', + 'nav_title' => 'Сервера', + 'model_label' => 'Сервер', + 'model_label_plural' => 'Сервера', + 'no_servers' => 'Нет серверов', + 'create' => 'Создать сервер', + 'next_step' => 'Следующий шаг', + 'ip_address' => 'IP адрес', + 'ip_address_helper' => 'Обычно публичный IP адрес вашей машины, если вы не пробросили порт.', + 'port' => 'Порт', + 'ports' => 'Порты', + 'alias' => 'Псевдоним', + 'alias_helper' => 'Дополнительное отображаемое имя, чтобы не забыть что это.', + 'locked' => 'Заблокировано?', + 'locked_helper' => 'Пользователи не смогут удалять заблокированные порты', + 'lock' => 'Заблокировать', + 'unlock' => 'Разблокировать', + 'name' => 'Название', + 'external_id' => 'Внешний ID', + 'owner' => 'Владелец', + 'description' => 'Описание', + 'install_script' => 'Запустить установочный скрипт?', + 'start_after' => 'Запустить после установки?', + 'yes' => 'Да', + 'no' => 'Нет', + 'skip' => 'Пропустить', + 'primary' => 'Основной', + 'already_primary' => 'Уже основной', + 'make_primary' => 'Сделать основным', + 'startup_cmd' => 'Команда запуска', + 'startup_name' => 'Имя запуска', + 'default_startup' => 'Стандартная команда запуска', + 'startup_placeholder' => 'Введите пользовательскую команду запуска', + 'variables' => 'Переменные', + 'resource_limits' => 'Лимит ресурсов', + 'cpu' => 'ЦП', + 'cpu_limit' => 'Лимит процессора', + 'cpu_helper' => '100% равно одному потоку ЦП.', + 'unlimited' => 'Неограничено', + 'limited' => 'Ограничено', + 'enabled' => 'Включено', + 'disabled' => 'Выключено', + 'memory' => 'Память', + 'memory_limit' => 'Лимит памяти', + 'memory_helper' => 'Wings при создании контейнера к этому значению выделит дополнительной объем памяти, чтобы гарантировать, что контейнер не будет испытывать её нехватку при использовании максимального объёма.', + 'disk' => 'Дисковое пространство', + 'disk_limit' => 'Ограничение места на диске', + 'advanced_limits' => 'Дополнительные ограничения', + 'cpu_pin' => 'Закрепление ЦП', + 'threads' => 'Закрепленные потоки', + 'pin_help' => 'Добавьте закреплённые потоки, например: 0 или 2-4.', + 'swap' => 'Память подкачки', + 'swap_limit' => 'Лимит памяти подкачки', + 'oom' => 'Убивать процесс при нехватке памяти?', + 'feature_limits' => 'Ограниченные возможности', + 'docker_settings' => 'Параметры докера', + 'docker_image' => 'Образ докера', + 'image_name' => 'Имя образа', + 'primary_allocation' => 'Основной порт', + 'image' => 'Образ', + 'image_placeholder' => 'Введите пользовательский образ', + 'container_labels' => 'Метка контейнера', + 'title' => 'Название', + 'actions' => 'Действия', + 'console' => 'Консоль', + 'suspend' => 'Заморозить', + 'unsuspend' => 'Разморозить', + 'reinstall' => 'Переустановить', + 'reinstall_help' => 'Это переустановит сервер с назначенным скриптом установки яйца.', + 'reinstall_modal_heading' => 'Вы уверены, что хотите переустановить сервер?', + 'reinstall_modal_description' => '!! Это может привести к необратимой потере данных !!', + 'server_status' => 'Статус сервера', + 'view_install_log' => 'Просмотр журнала установки', + 'uuid' => 'UUID', + 'node' => 'Узел', + 'short_uuid' => 'Короткий UUID', + 'toggle_install' => 'Переключить статус установки', + 'toggle_install_help' => 'Если вам необходимо изменить статус установки с "не установлен" на "установлен" или наоборот, вы можете сделать это с помощью этой кнопки.', + 'toggle_install_failed_header' => 'Сервер находится в состоянии ошибки', + 'toggle_install_failed_desc' => 'Вы желаете переустановить сервер, чтобы исправить это?', + 'transfer' => 'Переместить', + 'transfer_help' => 'Переместить этот сервер на другой узел, который подключен к этой панели.
Обратите внимание! Эта функция экспериментальная, рекомендуем создать резервную копию, чтобы избежать потери данных.', + 'condition' => 'Условие', + 'suspend_all' => 'Заморозить все сервера', + 'unsuspend_all' => 'Разморозить все сервера', + 'select_allocation' => 'Выбрать распределение', + 'new_allocation' => 'Создать распределение', + 'additional_allocations' => 'Доп. распределения', + 'select_additional' => 'Выбрать доп. распределения', + 'no_variables' => 'У выбранного яйца нет переменных!', + 'select_egg' => 'Сначала выберите яйцо, чтобы отобразить его переменные!', + 'allocations' => 'Распределения', + 'databases' => 'Базы данных', + 'no_databases' => 'Базы данных для этого сервера отсутствуют', + 'delete_db' => 'Вы уверены, что хотите удалить?', + 'delete_db_heading' => 'Удалить базу данных?', + 'backups' => 'Бэкапы', + 'egg' => 'Яйцо', + 'mounts' => 'Точки монтирования', + 'no_mounts' => 'Для этого узла нет точек монтирования', + 'create_database' => 'Создать базу данных', + 'no_db_hosts' => 'Нет хостов баз данных', + 'failed_to_create' => 'Не удалось создать базу данных', + 'change_egg' => 'Сменить яйцо', + 'new_egg' => 'Новое яйцо', + 'keep_old_variables' => 'Сохранить старые переменные, если возможно?', + 'create_allocation' => 'Создать порты', + 'add_allocation' => 'Добавить распределение', + 'view' => 'Просмотр', + 'no_log' => 'Нет доступных журналов', + 'tabs' => [ + 'information' => 'Информация', + 'egg_configuration' => 'Конфигурация яйца', + 'environment_configuration' => 'Настройки переменных', ], - 'alerts' => [ - 'startup_changed' => 'Конфигурация запуска для этого сервера была обновлена. Если яйцо этого сервера было изменено, начнется переустановка.', - 'server_deleted' => 'Сервер успешно удален из системы.', - 'server_created' => 'Сервер успешно создан в панели. Пожалуйста, дайте демону несколько минут, чтобы полностью установить этот сервер.', - 'build_updated' => 'Сведения о сборке для этого сервера были обновлены. Некоторые изменения могут потребовать перезагрузки для вступления в силу.', - 'suspension_toggled' => 'Статус приостановки сервера изменен на :status.', - 'rebuild_on_boot' => 'Этот сервер отмечен как требующий перестройки контейнера Docker. Это произойдет при следующем запуске сервера.', - 'install_toggled' => 'Статус установки для этого сервера был переключен.', - 'server_reinstalled' => 'Этот сервер поставлен в очередь на переустановку, начиная сейчас.', - 'details_updated' => 'Сведения о сервере успешно обновлены.', - 'docker_image_updated' => 'Успешно изменен образ Docker по умолчанию для этого сервера. Для применения этого изменения требуется перезагрузка.', - 'node_required' => 'Перед добавлением сервера в эту панель вы должны настроить хотя бы один узел.', - 'transfer_nodes_required' => 'Перед переносом серверов необходимо настроить как минимум два узла.', - 'transfer_started' => 'Перенос сервера был начат.', - 'transfer_not_viable' => 'Выбранный вами узел не имеет достаточного дискового пространства или доступной памяти для размещения этого сервера.', + 'notifications' => [ + 'server_suspension' => 'Сервер заморожен', + 'server_suspended' => 'Сервер был заморожен', + 'server_already_suspended' => 'Сервер уже заморожен!', + 'server_suspend_help' => 'Это приостановит работу сервера, остановит все запущенные процессы и немедленно заблокирует пользователю доступ к файлам и управлению сервером через панель или API.', + 'server_unsuspend_help' => 'Это разморозит сервер и восстановит обычный доступ пользователю.', + 'server_unsuspended' => 'Сервер был разморожен', + 'error_server_delete' => 'Сервер не может быть безопасно удален.', + 'error_server_delete_body' => 'Вы можете принудительно удалить его.', + 'create_failed' => 'Не удалось создать сервер', + 'invalid_port_range' => 'Недопустимый диапазон портов', + 'invalid_port_range_body' => 'Диапазон портов не является допустимыми числами: :port', + 'too_many_ports' => 'Слишком много портов одновременно!', + 'too_many_ports_body' => 'Текущий лимит - :limit портов за один раз.', + 'invalid_port' => 'Порт вне допустимого диапазона', + 'invalid_port_body' => ':i не находится в допустимом диапазоне портов между :portFloor-:portCeil', + 'already_exists' => 'Порт уже используется', + 'already_exists_body' => ':i уже имеет распределение', + 'error_connecting' => 'Ошибка подключения к :node', + 'error_connecting_description' => 'Не удалось автоматический изменить конфигурацию у Wings, вам требуется сделать это вручную.', + 'install_toggled' => 'Статус установки был изменен', + 'install_toggle_failed' => 'Не удалось изменить статус', + 'reinstall_started' => 'Процесс переустановки запущен', + 'reinstall_failed' => 'Не удалось начать процесс переустановки', + 'log_failed' => 'Не удалось подключиться к Wings для получения журнала установки сервера.', + 'transfer_started' => 'Процесс переноса запущен', + 'transfer_failed' => 'Процесс переноса не удался', + 'already_transfering' => 'Сервер в настоящее время переносится', ], + 'notes' => 'Заметки', + 'no_notes' => 'Нет заметок', + 'none' => 'Ничего', ]; diff --git a/lang/ru/admin/setting.php b/lang/ru/admin/setting.php new file mode 100644 index 0000000000..64bb323765 --- /dev/null +++ b/lang/ru/admin/setting.php @@ -0,0 +1,157 @@ + 'Настройки', + 'save_success' => 'Настройки сохранены', + 'save_failed' => 'Не удалось сохранить настройки', + 'navigation' => [ + 'general' => 'Главная', + 'captcha' => 'Каптча', + 'mail' => 'Почта', + 'backup' => 'Бэкап', + 'oauth' => 'OAuth', + 'misc' => 'Прочее', + ], + 'general' => [ + 'app_name' => 'Имя приложения', + 'app_logo' => 'Логотип приложения', + 'app_logo_help' => 'Логотип должен быть размещен в публичной папке, расположенной в корневой директории. Оставьте пустым, чтобы использовать название приложения.', + 'app_favicon' => 'Значок приложения', + 'app_favicon_help' => 'Значок должен быть помещен в публичную папку, расположенную в корневой директории.', + 'debug_mode' => 'Режим отладки', + 'navigation' => 'Навигация', + 'default_navigation' => 'Тип навигации по умолчанию', + 'sidebar' => 'Боковая панель', + 'topbar' => 'Верхняя панель', + 'mixed' => 'Смешанное', + 'unit_prefix' => 'Единица измерения', + 'decimal_prefix' => 'Префикс в десятичной системе (МБ/ГБ)', + 'binary_prefix' => 'Бинарный префикс (MiB/GiB)', + '2fa_requirement' => 'Требование 2FA', + 'not_required' => 'Не требуется', + 'admins_only' => 'Необходимо только админам', + 'all_users' => 'Требуется для всех пользователей', + 'trusted_proxies' => 'Доверенные прокси', + 'trusted_proxies_help' => 'Новый IP или диапазон IP', + 'clear' => 'Очистить', + 'set_to_cf' => 'Установить на Cloudflare IPs', + 'display_width' => 'Ширина дисплея', + 'avatar_provider' => 'Сервис аватаров', + 'uploadable_avatars' => 'Разрешить пользователям загружать свой аватар?', + ], + 'captcha' => [ + 'enable' => 'Включить', + 'disable' => 'Выключить', + 'info_label' => 'Информация', + 'info' => 'Вы можете сгенерировать ключи в панели управления Cloudflare. Для этого вам потребуется иметь Cloudflare аккаунт.', + 'site_key' => 'Ключ сайта', + 'secret_key' => 'Секретный ключ', + 'verify' => 'Подтвердить домен?', + ], + 'mail' => [ + 'mail_driver' => 'Почтовый сервис', + 'test_mail' => 'Отправить тестовое сообщение', + 'test_mail_sent' => 'Тестовое сообщение отправлено', + 'test_mail_failed' => 'Тест почты провален', + 'from_settings' => 'Из настроек', + 'from_settings_help' => 'Укажите адрес и имя, используемые в письмах.', + 'from_address' => 'Адрес отправителя', + 'from_name' => 'Имя отправителя', + 'smtp' => [ + 'smtp_title' => 'Конфигурация SMTP', + 'host' => 'Адрес сервера', + 'port' => 'Порт', + 'username' => 'Имя пользователя', + 'password' => 'Пароль', + 'scheme' => 'Схема', + ], + 'mailgun' => [ + 'mailgun_title' => 'Настройка почтового пушки', + 'domain' => 'Домен', + 'secret' => 'Секретный ключ', + 'endpoint' => 'Адрес сервера', + ], + ], + 'backup' => [ + 'backup_driver' => 'Драйвер резервного копирования', + 'throttle' => 'Ограничения', + 'throttle_help' => 'Настройте количество резервных копий за период. Установите 0 для отключения этого дросселя.', + 'limit' => 'Ограничение', + 'period' => 'Период', + 'seconds' => 'Секунд', + 's3' => [ + 's3_title' => 'Конфигурация S3', + 'default_region' => 'Регион по умолчанию', + 'access_key' => 'Код доступа', + 'secret_key' => 'Секретный ключ', + 'bucket' => 'Хранилище', + 'endpoint' => 'Адрес сервера', + 'use_path_style_endpoint' => 'Использовать конечную точку пути', + ], + ], + 'oauth' => [ + 'enable' => 'Включено', + 'enable_schema' => 'Включить :schema', + 'disable' => 'Отключено', + 'client_id' => 'Идентификатор клиента', + 'client_secret' => 'Закрытый ключ клиента', + 'redirect' => 'URL перенаправления', + 'web_api_key' => 'Ключ WEB API', + 'base_url' => 'Основной URL', + 'display_name' => 'Отображаемое имя', + 'auth_url' => 'URL для обратного вызова авторизации', + 'create_missing_users' => 'Автоматически создавать отсутствующих пользователей?', + 'link_missing_users' => 'Автоматическая ссылка на отсутствующих пользователей?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Автоматическое создание распределений', + 'helper' => 'Разрешите пользователям добавлять распределения через клиентскую зону.', + 'question' => 'Разрешить пользователям создавать распределения?', + 'create_new' => 'Создать новые порты, если нет доступных?', + 'create_new_help' => 'Когда включено, создает новые порты. При отключении, назначается только из существующих неназначенных портов. Оба параметра учитывают диапазон портов.', + 'start' => 'Начальный порт', + 'end' => 'Конечный порт', + ], + 'mail_notifications' => [ + 'title' => 'Уведомления по почте', + 'helper' => 'Должны ли пользователи получать уведомления по почте?', + 'server_installed' => 'Сервер установлен', + 'server_reinstalled' => 'Сервер переустановлен', + ], + 'connections' => [ + 'title' => 'Подключения', + 'helper' => 'Таймауты, используемые при выполнении запросов.', + 'request_timeout' => 'Таймаут запроса', + 'connection_timeout' => 'Время подключения истекло', + 'seconds' => 'Секунды', + ], + 'activity_log' => [ + 'title' => 'Логи активности', + 'helper' => 'Настройте очистку журналов активности и логирование действий администратора.', + 'prune_age' => 'Возраст для очистки', + 'days' => 'Дни', + 'log_admin' => 'Скрыть активность администратора?', + ], + 'api' => [ + 'title' => 'АПИ', + 'helper' => 'Определяет количество запросов, которое может быть выполнено за минуту.', + 'client_rate' => 'Лимит запросов Client API', + 'app_rate' => 'Лимит запросов API приложения', + 'rpm' => 'Запросы в минуту', + ], + 'server' => [ + 'title' => 'Сервера', + 'helper' => 'Настройки серверов', + 'edit_server_desc' => 'Разрешить пользователям редактировать описания?', + 'console_font_upload' => 'Загрузить шрифт для консоли', + 'console_font_hint' => 'Поддерживаются только *.ttf шрифты. Настоятельно рекомендуется Mono шрифты!', + ], + 'webhook' => [ + 'title' => 'Вебхуки', + 'helper' => 'Настройте очистку старых журналов вебхуков.', + 'prune_age' => 'Возраст для очистки', + 'days' => 'Дней', + ], + ], +]; diff --git a/lang/ru/admin/user.php b/lang/ru/admin/user.php index a37cbd6a46..77f7649590 100644 --- a/lang/ru/admin/user.php +++ b/lang/ru/admin/user.php @@ -1,12 +1,24 @@ [ - 'user_has_servers' => 'Невозможно удалить пользователя с активными серверами, привязанными к его учетной записи. Пожалуйста, удалите его серверы, прежде чем продолжить.', - 'user_is_self' => 'Невозможно удалить свою учетную запись.', - ], - 'notices' => [ - 'account_created' => 'Учетная запись успешно создана!', - 'account_updated' => 'Аккаунт был успешно изменен.', - ], + 'nav_title' => 'Пользователи', + 'model_label' => 'Пользователь', + 'model_label_plural' => 'Пользователи', + 'self_delete' => 'Вы не можете удалить самого себя', + 'has_servers' => 'У пользователя есть сервера', + 'email' => 'Почта', + 'username' => 'Имя пользователя', + 'password' => 'Пароль', + 'external_id' => 'Внешний ID', + 'is_managed_externally' => 'Контролируется извне?', + 'is_managed_externally_helper' => 'Если ваши пользователи контролируются внешним программным обеспечением (например, платежной системой), вы можете включить эту опцию, чтобы запретить им изменять логин, электронную почту и пароль прямо в панели управления.', + 'password_help' => 'Указание пароля пользователя необязательно. Если оставить пустым, то при входе пользователя попросит создать пароль.', + 'admin_roles' => 'Роли администратора', + 'roles' => 'Роли', + 'no_roles' => 'Нет ролей', + 'servers' => 'Сервера', + 'subusers' => 'Субпользователи', + 'password_reset' => 'Сбросить пароль', + 'password_reset_sent' => 'Письмо для сброса пароля отправлено', + 'password_reset_failed' => 'Не удалось отправить письмо для сброса пароля', ]; diff --git a/lang/ru/admin/webhook.php b/lang/ru/admin/webhook.php new file mode 100644 index 0000000000..c2bb9f6131 --- /dev/null +++ b/lang/ru/admin/webhook.php @@ -0,0 +1,63 @@ + 'Вебхуки', + 'model_label' => 'Вебхук', + 'model_label_plural' => 'Вебхуки', + 'endpoint' => 'Конечная точка', + 'description' => 'Описание', + 'no_webhooks' => 'Нет вебхуков', + 'help' => 'Справка', + 'help_text' => 'Вы должны поместить имя переменной между {{ }}, например, если вы хотите получить имя из api, вы можете использовать {{name}}.', + 'test_now' => 'Проверить сейчас', + 'test_now_help' => 'Это вызовет событие `created: Server`', + 'table' => [ + 'description' => 'Описание', + 'endpoint' => 'Конечная точка', + ], + 'headers' => 'Заголовки', + 'events' => 'События', + 'regular' => 'Обычный', + 'reset_headers' => 'Сбросить заголовки', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Профиль', + 'message' => 'Сообщение', + 'username' => 'Имя пользователя', + 'avatar_url' => 'URL Аватара', + 'forum_thread' => 'Название темы форума', + 'supress_embeds' => 'Подавлять вложения', + 'supress_embeds_text' => 'Не включать вложения при сериализации этого сообщения', + 'supress_notifications' => 'Подавлять уведомления', + 'supress_notifications_text' => 'Это сообщение не вызовет push-уведомлений и уведомлений на рабочем столе', + ], + 'discord_embed' => [ + 'add_embed' => 'Добавить вложение', + 'flags' => 'Флаги', + 'thumbnail' => 'URL-адрес миниатюры', + 'embeds' => 'Вложения', + 'thread_name' => 'Название темы форума', + 'allowed_mentions' => 'Разрешённые упоминания', + 'roles' => 'Роли', + 'users' => 'Пользователи', + 'everyone' => '@everyone и @here', + 'author' => 'Автор', + 'author_url' => 'URL Автора', + 'author_icon_url' => 'URL значка автора', + 'body' => 'Тело', + 'title' => 'Заголовок', + 'color' => 'Цвет вложения', + 'url' => 'URL-адрес', + 'images' => 'Изображения', + 'image_url' => 'URL изображения', + 'image_thumbnail' => 'URL-адрес миниатюры', + 'footer' => 'Нижний колонтитул', + 'has_timestamp' => 'Имеет метку времени', + 'footer_icon_url' => 'URL значка нижнего колонтитула', + 'add_field' => 'Добавить поле', + 'fields' => 'Поля', + 'field_name' => 'Название поля', + 'field_value' => 'Значение поля', + 'inline_field' => 'Встроенное поле', + ], +]; diff --git a/lang/ru/auth.php b/lang/ru/auth.php index 72c2cfd44a..20ac3ef429 100644 --- a/lang/ru/auth.php +++ b/lang/ru/auth.php @@ -1,27 +1,24 @@ 'Войти', - 'go_to_login' => 'Перейти к входу', - 'failed' => 'Не удалось найти аккаунт', - 'forgot_password' => [ - 'label' => 'Забыл пароль?', - 'label_help' => 'Введите свой адрес электронной почты для получения инструкций по сбросу пароля.', - 'button' => 'Восстановить пароль', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Сбросить и войти', - ], + 'failed' => 'Неправильный логин или пароль.', + 'failed-two-factor' => 'Некорректный код 2FA', + 'two-factor-code' => 'Код двухфакторной аутентификации', + 'two-factor-hint' => 'Вы можете использовать резервные коды, если потеряли доступ к своему устройству.', + 'password' => 'Неверный пароль.', + 'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте ещё раз через :seconds секунд.', + '2fa_must_be_enabled' => 'Администратор потребовал, чтобы для вашей учетной записи была включена 2FA для доступа к панели', - 'two_factor' => [ - 'label' => 'Код 2FA', - 'label_help' => 'На этом аккаунте включена двухфакторная аутентификация. Пожалуйста, введите код из приложения аутентификатора.', - 'checkpoint_failed' => 'Неверный код 2FA', - ], - - 'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте снова через :seconds секунд.', - 'password_requirements' => 'Пароль должен быть длиной не менее 8 символов.', - '2fa_must_be_enabled' => 'Администратор потребовал, чтобы для вашей учетной записи была включена 2FA для доступа к панели.', ]; diff --git a/lang/ru/command/messages.php b/lang/ru/command/messages.php index 8584dee2d2..3e51304108 100644 --- a/lang/ru/command/messages.php +++ b/lang/ru/command/messages.php @@ -4,26 +4,21 @@ 'user' => [ 'search_users' => 'Введите ID пользователя, его имя или адрес эл. Почты', 'select_search_user' => 'ID пользователя для удаления (введите \'0\' для повторного поиска)', - 'deleted' => 'Пользователь успешно удален из панели.', - 'confirm_delete' => 'Вы уверены, что хотите удалить этого пользователя из панели?', + 'deleted' => 'Пользователь успешно удален из Panel\'и.', + 'confirm_delete' => 'Вы уверены, что хотите удалить этого пользователя из Panel\'и?', 'no_users_found' => 'По Вашему запросу не найдено ни одного пользователя.', 'multiple_found' => 'По Вашему запросу найдено несколько аккаунтов пользователей. Ничего не было предпринято, так как установлен флаг --no-interaction.', 'ask_admin' => 'Является ли пользователь администратором?', 'ask_email' => 'Адрес эл. почты', 'ask_username' => 'Имя пользователя', - 'ask_name_first' => 'Имя', - 'ask_name_last' => 'Фамилия', 'ask_password' => 'Пароль', 'ask_password_tip' => 'Если Вы хотите создать пользователя со случайным паролем, который будет отправлен ему на адрес эл. почты, выполните эту команду снова, нажав CTRL+C и добавив флаг `--no-password`.', 'ask_password_help' => 'Пароль должен содержать минимум одну заглавную букву и число, а также иметь длину не менее 8 символов.', - '2fa_help_text' => [ - 'Эта команда отключает двухфакторную аутентификацию для учетной записи пользователя, если она включена. Это должно использоваться только в качестве команды восстановления учетной записи, если пользователь заблокирован из своей учетной записи.', - 'Если это не то, что вы хотите сделать, нажмите CTRL+C для выхода из этого процесса.', - ], + '2fa_help_text' => 'Эта команда отключит двухфакторную аутентификацию для учётной записи пользователя, если она включена. Используйте её только для восстановления доступа, если пользователь не может войти в свой аккаунт. Если вы не хотите выполнять это действие, нажмите CTRL+C, чтобы выйти из процесса.', '2fa_disabled' => 'Двухфакторная аутентификация была отключена для :email.', ], 'schedule' => [ - 'output_line' => 'Диспетчер задания для первой задачи в папке `:schedule` (:hash).', + 'output_line' => 'Отправка задания для первой задачи в `:schedule` (:id).', ], 'maintenance' => [ 'deleting_service_backup' => 'Удаление файла резервной копии :file.', @@ -42,7 +37,7 @@ 'environment' => [ 'mail' => [ 'ask_smtp_host' => 'SMTP хост (например, smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Порт', + 'ask_smtp_port' => 'SMTP порт', 'ask_smtp_username' => 'SMTP логин', 'ask_smtp_password' => 'SMTP пароль', 'ask_mailgun_domain' => 'Домен Mailgun', diff --git a/lang/ru/commands.php b/lang/ru/commands.php new file mode 100644 index 0000000000..eb083de5f2 --- /dev/null +++ b/lang/ru/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Укажите адрес электронной почты, который будет использоваться для экспортируемых яиц на этой Панели. Это должен быть действительный email-адрес.', + 'url' => 'URL-адрес приложения ДОЛЖЕН начинаться с https:// или http:// в зависимости от того, используете ли вы SSL или нет. Если вы не указали схему, ваши письма и другие материалы будут ссылаться на неверное местоположение.', + 'timezone' => 'Часовой пояс должен совпадать с одним из часовых поясов PHP. Если вы не уверены, обратитесь к https://php.net/manual/ru/timezones.php.', + ], + 'redis' => [ + 'note' => 'Вы выбрали драйвер Redis для одного или нескольких вариантов. Пожалуйста, предоставьте корректную информацию о соединении. В большинстве случаев вы можете использовать значения по умолчанию, если вы не изменили свою установку.', + 'comment' => 'По умолчанию экземпляр Redis сервера имеет имя пользователя по умолчанию и не имеет пароля, так как он работает локально и недоступен для внешнего мира. Если это так, просто нажмите ввести без ввода значения.', + 'confirm' => 'Кажется, что значение ":field" уже определено для Redis, вы хотите изменить его?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Настоятельно рекомендуем не использовать "localhost" в качестве хоста базы данных, так как часто возникали проблемы с подключением к сокету. Если вы хотите использовать локальное соединение, то лучше использовать "127.0.0.1".', + 'DB_USERNAME_note' => 'Использование учётной записи root для MySQL соединений не только слишком небезопасно, но и недопустимо этим приложением. Вам нужно будет создать пользователя MySQL для этого ПО.', + 'DB_PASSWORD_note' => 'Похоже, вы уже определили пароль подключения к MySQL, вы хотите изменить его?', + 'DB_error_2' => 'Ваши учетные данные для подключения не были сохранены. Вам нужно предоставить корректную информацию для подключения.', + 'go_back' => 'Вернитесь назад и попробуйте снова', + ], + 'make_node' => [ + 'name' => 'Введите короткий идентификатор, используемый для уникальности этого узла от других', + 'description' => 'Введите описание для идентификации узла', + 'scheme' => 'Пожалуйста, введите HTTPS для SSL, или HTTP для Non-SSL соединения', + 'fqdn' => 'Введите имя домена (например node.example.com) для подключения к демону. IP-адрес может быть использовать только в том случае, если вы не используете SSL для этой ноды.', + 'public' => 'Должен ли этот узел быть публичным? Примечание: установка узла в приватный режим будет запрещать возможность автоматического развертывания на этот узел.', + 'behind_proxy' => 'Ваш FQDN проксируется?', + 'maintenance_mode' => 'Должен ли быть включен режим технических работ?', + 'memory' => 'Введите максимальное количество ОЗУ', + 'memory_overallocate' => 'Введите объем памяти для избыточного выделения. Значение -1 отключит проверку, а 0 запретит создание новых серверов.', + 'disk' => 'Введите максимальный размер диска', + 'disk_overallocate' => 'Введите объем дискового пространства для избыточного выделения. Значение -1 отключит проверку, а 0 запретит создание новых серверов.', + 'cpu' => 'Введите максимальное количество cpu', + 'cpu_overallocate' => 'Введите количество cpu для избыточного выделения. Значение -1 отключит проверку, а 0 запретит создание новых серверов.', + 'upload_size' => "'Введите максимальный размер загружаемых файлов", + 'daemonListen' => 'Введите порт работы демона', + 'daemonConnect' => 'Введите порт для подключения демона (может быть таким же, как и порт прослушивания)', + 'daemonSFTP' => 'Введите порт работы SFTP', + 'daemonSFTPAlias' => 'Введите псевдоним для SFTP-демона (может быть пустым).', + 'daemonBase' => 'Введите каталог по умолчанию', + 'success' => 'Успешно создан новый узел с именем ":name" и идентификатором ":id"', + ], + 'node_config' => [ + 'error_not_exist' => 'Выбранный узел не существует.', + 'error_invalid_format' => 'Указан неверный формат. Допустимыми вариантами являются yaml и json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Похоже, вы уже настроили ключ шифрования приложения. Продолжение этого процесса перезаписать этот ключ и привести к повреждению данных для любых существующих зашифрованных данных. НЕ СОДЕРЖАЙТЕ НЕОБХОДИМО ВЫ знаете, что ВЫ ДЕЛАЕТЕ.', + 'understand' => 'Я понимаю последствия выполнения этой команды и принимаю на себя всю ответственность за потерю зашифрованных данных.', + 'continue' => 'Вы уверены, что хотите продолжить? Изменение ключа шифрования приложения приведет к потере всех данных.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Нет запланированных задач для серверов, которые должны быть запущены.', + 'error_message' => 'При обработке задачи произошла ошибка: ', + ], + ], +]; diff --git a/lang/ru/dashboard/account.php b/lang/ru/dashboard/account.php deleted file mode 100644 index 645653ecbf..0000000000 --- a/lang/ru/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Изменить эл. почту', - 'updated' => 'Ваш адрес эл. почты успешно изменен.', - ], - 'password' => [ - 'title' => 'Изменить пароль', - 'requirements' => 'Длина вашего нового пароля должна быть не менее 8 символов.', - 'updated' => 'Ваш пароль был изменен.', - ], - 'two_factor' => [ - 'button' => 'Настроить двухфакторную аутентификацию', - 'disabled' => 'Двухфакторная аутентификация была отключена для вашего аккаунта. Вам больше не будет предлагаться подтвердить авторизацию.', - 'enabled' => 'Двухфакторная аутентификация была включена для вашего аккаунта! Теперь при входе вам необходимо будет предоставить код, сгенерированный вашим устройством.', - 'invalid' => 'Указанный код недействителен.', - 'setup' => [ - 'title' => 'Настройка двухфакторной авторизации', - 'help' => 'Не удается просканировать код? Введите код ниже в приложение:', - 'field' => 'Введите код', - ], - 'disable' => [ - 'title' => 'Отключить двухфакторную авторизацию', - 'field' => 'Введите код', - ], - ], -]; diff --git a/lang/ru/dashboard/index.php b/lang/ru/dashboard/index.php deleted file mode 100644 index 6ceac4347b..0000000000 --- a/lang/ru/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Поиск серверов...', - 'no_matches' => 'Не найдено серверов, соответствующих указанным критериям поиска.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Память', -]; diff --git a/lang/ru/exceptions.php b/lang/ru/exceptions.php index 0054e46bea..0b4d120447 100644 --- a/lang/ru/exceptions.php +++ b/lang/ru/exceptions.php @@ -4,22 +4,23 @@ 'daemon_connection_failed' => 'При попытке связи с узлом произошла ошибка HTTP/:code. Информация была передана администрации. (идентификатор запроса: :request_id)', 'node' => [ 'servers_attached' => 'Узел не должен иметь подключенных к нему серверов, чтобы быть удален.', - 'daemon_off_config_updated' => 'Конфигурация демона была обновлена, но при попытке автоматического обновления конфигурационного файла произошла ошибка. Вам нужно вручную обновить конфигурационный файл (config.yml) для применения этих изменений.', + 'error_connecting' => 'Ошибка подключения к :node', + 'daemon_off_config_updated' => 'Конфигурация Daemon\'а была обновлена, но при попытке автоматического обновления конфигурационного файла произошла ошибка. Вам нужно вручную обновить конфигурационный файл (config.yml) для применения этих изменений.', ], 'allocations' => [ 'server_using' => 'Сервер в настоящее время назначается для этого размещения. Распределение может быть удалено, только если ни один сервер не назначен.', 'too_many_ports' => 'Добавление более 1000 портов в одном диапазоне за раз не поддерживается.', 'invalid_mapping' => 'Сопоставление, предоставленное для порта {port}, было недопустимым и не могло быть обработано.', 'cidr_out_of_range' => 'Нотация CIDR допускает только маски между /25 и /32.', - 'port_out_of_range' => 'Порты в распределении должны быть больше 1024 и меньше или равны 65535.', + 'port_out_of_range' => 'Порты в распределении должны находиться в диапазоне от 1024 до 65535 включительно.', ], 'egg' => [ - 'delete_has_servers' => 'Яйцо с подключенными к нему серверами не может быть удалено из панели.', - 'invalid_copy_id' => 'Яйцо, выбранное для копирования сценария, либо не существует, либо копирует сценарий из самого себя.', - 'has_children' => 'Это яйцо является родительским для одного или нескольких других яиц. Пожалуйста, удалите эти яйца, прежде чем удалять это яйцо.', + 'delete_has_servers' => 'Egg с подключенными к нему серверами не может быть удален из Panel\'и.', + 'invalid_copy_id' => 'Egg, выбранный для копирования сценария, либо не существует, либо копирует сценарий из самого себя.', + 'has_children' => 'Этот Egg является родительским для одного или нескольких других Egg\'ов. Пожалуйста, удалите эти Egg\'ы, прежде чем удалять этот Egg.', ], 'variables' => [ - 'env_not_unique' => 'Переменная окружения :name должна быть уникальной для этого яйца.', + 'env_not_unique' => 'Переменная окружения :name должна быть уникальной для этого Egg\'а.', 'reserved_name' => 'Переменная окружения :name защищена и не может быть назначена переменной.', 'bad_validation_rule' => 'Правило проверки ":rule" не является правилом для этого приложения.', ], @@ -43,6 +44,8 @@ 'has_nodes' => 'Невозможно удалить местоположение, в котором к нему прикреплены активные узлы.', ], 'users' => [ + 'is_self' => 'Вы не можете удалить свой аккаунт.', + 'has_servers' => 'Нельзя удалить пользователя, пока у него есть активные серверы. Сначала удалите серверы, чтобы продолжить.', 'node_revocation_failed' => 'Не удалось отозвать ключи на узле #:node. :error', ], 'deployment' => [ @@ -52,4 +55,10 @@ 'api' => [ 'resource_not_found' => 'Запрашиваемый ресурс не существует на сервере.', ], + 'mount' => [ + 'servers_attached' => 'Точку монтирования можно удалить только без подключённых серверов.', + ], + 'server' => [ + 'marked_as_failed' => 'Этот сервер ещё не завершил процесс установки, пожалуйста, попробуйте позже.', + ], ]; diff --git a/lang/ru/installer.php b/lang/ru/installer.php new file mode 100644 index 0000000000..6f8db83502 --- /dev/null +++ b/lang/ru/installer.php @@ -0,0 +1,114 @@ + 'Установка панели', + 'requirements' => [ + 'title' => 'Требования к серверу', + 'sections' => [ + 'version' => [ + 'title' => 'Версия PHP', + 'or_newer' => ':version или выше', + 'content' => 'Версия вашего PHP: :version.', + ], + 'extensions' => [ + 'title' => 'Расширения PHP', + 'good' => 'Все необходимые PHP расширения установлены.', + 'bad' => 'Отсутствуют следующие PHP расширения: :extensions', + ], + 'permissions' => [ + 'title' => 'Права доступа к папке', + 'good' => 'Все папки имеют правильные права доступа.', + 'bad' => 'Следующие папки имеют неправильные разрешения: :folders', + ], + ], + 'exception' => 'Отсутствуют некоторые требования', + ], + 'environment' => [ + 'title' => 'Окружение', + 'fields' => [ + 'app_name' => 'Имя панели', + 'app_name_help' => 'Это имя вашей панели.', + 'app_url' => 'URL-адрес панели', + 'app_url_help' => 'Это будет URL-адрес, с которого вы получите доступ к панели управления.', + 'account' => [ + 'section' => 'Администратор', + 'email' => 'Электронная почта', + 'username' => 'Имя пользователя', + 'password' => 'Пароль', + ], + ], + ], + 'database' => [ + 'title' => 'База данных', + 'driver' => 'Тип базы данных', + 'driver_help' => 'К использованию рекомендуется "SQLite".', + 'fields' => [ + 'host' => 'Сервер базы данных', + 'host_help' => 'Сервер базы данных. Убедитесь, что он доступен.', + 'port' => 'Порт базы данных', + 'port_help' => 'Порт вашей базы данных.', + 'path' => 'Путь к базе данных', + 'path_help' => 'Путь к вашему файлу .sqlite относительно папки базы данных.', + 'name' => 'Имя базы данных', + 'name_help' => 'Название базы данных.', + 'username' => 'Имя пользователя базы данных', + 'username_help' => 'Имя пользователя базы данных.', + 'password' => 'Пароль базы данных', + 'password_help' => 'Пароль пользователя базы данных. Может быть пустым.', + ], + 'exceptions' => [ + 'connection' => 'Ошибка подключения к базе данных', + 'migration' => 'Не удалось перенести данные', + ], + ], + 'egg' => [ + 'title' => 'Яйца', + 'no_eggs' => 'Нет доступных яиц', + 'background_install_started' => 'Установка яйца началась', + 'background_install_description' => 'Установка :count яиц поставлена в очередь и будет продолжаться в фоновом режиме.', + 'exceptions' => [ + 'failed_to_update' => 'Не удалось обновить индекс яйца', + 'no_eggs' => 'В данный момент нет доступных яиц.', + 'installation_failed' => 'Не удалось установить выбранные яйца. Пожалуйста, импортируйте их после установки через список яиц.', + ], + ], + 'session' => [ + 'title' => 'Сеанс', + 'driver' => 'Хранилище сеансов', + 'driver_help' => 'Способ, используемый для хранения сессий. Рекомендуется к использованию "Файловая система" или "База данных".', + ], + 'cache' => [ + 'title' => 'Кэш', + 'driver' => 'Хранилище кеша', + 'driver_help' => 'Способ, используемый для кэширования. Рекомендуется к использованию "Файловая система".', + 'fields' => [ + 'host' => 'Хост Redis', + 'host_help' => 'Хост вашего сервера Redis. Убедитесь, что он доступен.', + 'port' => 'Порт Redis', + 'port_help' => 'Порт вашего Redis сервера.', + 'username' => 'Имя пользователя Redis', + 'username_help' => 'Может быть пустым', + 'password' => 'Пароль Redis', + 'password_help' => 'Пароль для пользователя Redis. Может быть пустым.', + ], + 'exception' => 'Ошибка подключения к Redis', + ], + 'queue' => [ + 'title' => 'Очередь', + 'driver' => 'Хранилище очереди', + 'driver_help' => 'Способ использования обработки очередей действий. Рекомендуется к использованию "База данных"', + 'fields' => [ + 'done' => 'Я выполнил оба шага ниже.', + 'done_validation' => 'Вам нужно сделать оба шага, прежде чем продолжить!', + 'crontab' => 'Выполните следующую команду, чтобы настроить crontab. Обратите внимание, что www-data — это пользователь вашего веб-сервера. На некоторых системах имя пользователя может отличаться!', + 'service' => 'Чтобы настроить службу обработки очередей, просто выполните следующую команду.', + ], + ], + 'exceptions' => [ + 'write_env' => 'Не удалось записать в .env файл', + 'migration' => 'Не удалось запустить процесс миграции', + 'create_user' => 'Не удаётся создать пользователя администратора', + ], + 'next_step' => 'Следующий шаг', + 'finish' => 'Завершить', +]; diff --git a/lang/ru/notifications.php b/lang/ru/notifications.php new file mode 100644 index 0000000000..0f660138c9 --- /dev/null +++ b/lang/ru/notifications.php @@ -0,0 +1,18 @@ + 'Открыть сервер', + 'installation_completed' => 'Установка сервера завершена', + 'installation_failed' => 'Установка сервера не удалась', + 'reinstallation_completed' => 'Переустановка сервера завершена', + 'reinstallation_failed' => 'Переустановка сервера не удалась', + 'failed' => 'Не удалось', + 'user_added' => [ + 'title' => 'Добавлен на сервер', + 'body' => 'Вы были добавлены в качестве субпользователя на :server.', + ], + 'user_removed' => [ + 'title' => 'Удален с сервера', + 'body' => 'Вы были удалены как субпользователь с :server.', + ], +]; diff --git a/lang/ru/pagination.php b/lang/ru/pagination.php deleted file mode 100644 index c7a629e1bc..0000000000 --- a/lang/ru/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Назад', - 'next' => 'Вперёд »', -]; diff --git a/lang/ru/passwords.php b/lang/ru/passwords.php deleted file mode 100644 index 1ec3bea479..0000000000 --- a/lang/ru/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Длина пароля менее шести символов или пароли не совпадают.', - 'reset' => 'Ваш пароль был сброшен!', - 'sent' => 'Мы отправили ссылку для сброса пароля на ваш адрес эл. почты!', - 'token' => 'Этот токен сброса пароля недействителен.', - 'user' => 'Мы не можем найти пользователя с таким адресом электронной почты.', -]; diff --git a/lang/ru/profile.php b/lang/ru/profile.php new file mode 100644 index 0000000000..62c61a5e07 --- /dev/null +++ b/lang/ru/profile.php @@ -0,0 +1,70 @@ + 'Профиль', + 'tabs' => [ + 'account' => 'Аккаунт', + 'oauth' => 'OAuth', + 'activity' => 'Активность', + 'api_keys' => 'API Ключи', + 'ssh_keys' => 'SSH ключи', + 'keys' => 'Ключи', + '2fa' => '2FA', + 'customization' => 'Кастомизация', + ], + 'username' => 'Пользователь', + 'admin' => 'Администратор', + 'exit_admin' => 'Выйти из админ панели', + 'server_list' => 'Список серверов', + 'email' => 'Почта', + 'password' => 'Пароль', + 'current_password' => 'Текущий пароль', + 'password_confirmation' => 'Подтверждение пароля', + 'timezone' => 'Часовой пояс', + 'language' => 'Язык', + 'language_help' => 'Ваш язык :state ещё не переведен!', + 'link' => 'Связать ', + 'unlink' => 'Отвязать ', + 'unlinked' => ':name успешно отвязан', + 'scan_qr' => 'Сканировать QR', + 'code' => 'Код', + 'setup_key' => 'Ключ настройки', + 'invalid_code' => 'Неправильный ключ 2FA', + 'code_help' => 'Просканируйте QR-код выше с помощью приложения для двухфакторной аутентификации, затем введите сгенерированный код.', + '2fa_enabled' => 'Двухфакторная аутентификация включена!', + 'backup_help' => 'Они не будут отображаться снова!', + 'backup_codes' => 'Коды восстановления', + 'disable_2fa' => 'Отключить 2FA', + 'disable_2fa_help' => 'Для отключения двухэтапной аутентификации введите код 2FA.', + 'api_keys' => 'Ключи API', + 'create_api_key' => 'Создать API ключ', + 'api_key_created' => 'API ключ создан', + 'description' => 'Описание', + 'allowed_ips' => 'Разрешенные IP адреса', + 'allowed_ips_help' => 'Нажмите ENTER для добавления нового IP или оставьте пустым для доступа с любого IP', + 'ssh_keys' => 'Ключи SSH', + 'create_ssh_key' => 'Создать SSH ключ', + 'ssh_key_created' => 'SSH ключ создан', + 'name' => 'Имя', + 'public_key' => 'Публичный ключ', + 'could_not_create_ssh_key' => 'Не удалось создать SSH ключ', + 'dashboard' => 'Главная', + 'dashboard_layout' => 'Макет главной страницы', + 'console' => 'Терминал', + 'grid' => 'Сетка', + 'table' => 'Таблица', + 'rows' => 'Колонки', + 'font_size' => 'Размер шрифта', + 'font' => 'Шрифт', + 'font_preview' => 'Предпросмотр шрифта', + 'seconds' => 'Секунды', + 'graph_period' => 'Период', + 'graph_period_helper' => 'Количество точек данных, секунд, отображаемых на консольном графике.', + 'navigation' => 'Тип панели', + 'sidebar' => 'Боковая панель', + 'topbar' => 'Верхняя панель', + 'mixed' => 'Смешанное', + 'no_oauth' => 'Нет привязанных аккаунтов', + 'no_api_keys' => 'Нет API ключей', + 'no_ssh_keys' => 'Нет SSH ключей', +]; diff --git a/lang/ru/search.php b/lang/ru/search.php new file mode 100644 index 0000000000..2b75c608a8 --- /dev/null +++ b/lang/ru/search.php @@ -0,0 +1,9 @@ + 'Пожалуйста, введите как минимум три символа для начала поиска.', + 'term' => [ + 'label' => 'Поиск по выражению', + 'description' => 'Введите название сервера, UUID или порт для начала поиска.', + ], +]; diff --git a/lang/ru/server/activity.php b/lang/ru/server/activity.php new file mode 100644 index 0000000000..4614e53a36 --- /dev/null +++ b/lang/ru/server/activity.php @@ -0,0 +1,11 @@ + 'Активность', + 'event' => 'Событие', + 'user' => 'Пользователь', + 'deleted_user' => 'Удалённый пользователь', + 'system' => 'Система', + 'timestamp' => 'Метка времени', + 'metadata' => 'Свойства', +]; diff --git a/lang/ru/server/backup.php b/lang/ru/server/backup.php new file mode 100644 index 0000000000..9c9aa75159 --- /dev/null +++ b/lang/ru/server/backup.php @@ -0,0 +1,55 @@ + 'Резервные копии', + 'empty' => 'Нет резервных копий', + 'size' => 'Размер', + 'created_at' => 'Создано', + 'status' => 'Статус', + 'is_locked' => 'Статус блокировки', + 'backup_status' => [ + 'in_progress' => 'Выполняется', + 'successful' => 'Успешно', + 'failed' => 'Ошибка', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Создать копию', + 'limit' => 'Достигнут лимит резервных копий', + 'created' => ':name создан', + 'notification_success' => 'Резервная копия успешно создана', + 'notification_fail' => 'Не удалось создать резервную копию', + 'name' => 'Имя', + 'ignored' => 'Игнорируемые файлы и каталоги', + 'locked' => 'Заблокировать?', + 'lock_helper' => 'Предотвращает удаление этой резервной копии до явной разблокировки.', + ], + 'lock' => [ + 'lock' => 'Заблокировать', + 'unlock' => 'Разблокировать', + ], + 'download' => 'Скачать', + 'rename' => [ + 'title' => 'Переименовать', + 'new_name' => 'Имя резервной копии', + 'notification_success' => 'Резервная копия успешно переименована', + ], + 'restore' => [ + 'title' => 'Восстановить', + 'helper' => 'Ваш сервер будет остановлен. Вы не сможете включить сервер, доступ к файловому менеджеру или создавать дополнительные резервные копии до завершения этого процесса.', + 'delete_all' => 'Удалить все файлы перед восстановлением резервной копии?', + 'notification_started' => 'Восстановление резервной копии...', + 'notification_success' => 'Резервная копия успешно восстановлена', + 'notification_fail' => 'Ошибка восстановления из резерной копии', + 'notification_fail_body_1' => 'Этот сервер в настоящее время не находится в состоянии, которое позволяет восстановить резервную копию.', + 'notification_fail_body_2' => 'Эта резервная копия не может быть восстановлена в данное время: не завершена или не удалась.', + ], + 'delete' => [ + 'title' => 'Удалить копию', + 'description' => 'Вы хотите удалить :backup?', + 'notification_success' => 'Резервная копия удалена', + 'notification_fail' => 'Не удалось удалить резервную копию', + 'notification_fail_body' => 'Не удалось подключиться к узлу. Повторите попытку.', + ], + ], +]; diff --git a/lang/ru/server/console.php b/lang/ru/server/console.php new file mode 100644 index 0000000000..f02c9ec0e0 --- /dev/null +++ b/lang/ru/server/console.php @@ -0,0 +1,43 @@ + 'Консоль', + 'command' => 'Введите команду...', + 'command_blocked' => 'Сервер Выключен...', + 'command_blocked_title' => 'Невозможно отправить команду, когда сервер выключен', + 'open_in_admin' => 'Открыть в Админе', + 'power_actions' => [ + 'start' => 'Запуск', + 'stop' => 'Остановить', + 'restart' => 'Перезапуск', + 'kill' => 'Убить', + 'kill_tooltip' => 'Это может привести к повреждению данных и/или потере данных!', + ], + 'labels' => [ + 'cpu' => 'ЦП', + 'memory' => 'Память', + 'network' => 'Сеть', + 'disk' => 'Диск', + 'name' => 'Название', + 'status' => 'Статус', + 'address' => 'Адрес', + 'unavailable' => 'Недоступен', + ], + 'status' => [ + 'created' => 'Создан', + 'starting' => 'Запускается', + 'running' => 'Работает', + 'restarting' => 'Перезапускается', + 'exited' => 'Остановлен', + 'paused' => 'Приостановлен', + 'dead' => 'Мёртв', + 'removing' => 'Удаление', + 'stopping' => 'Остановка', + 'offline' => 'Выключен', + 'missing' => 'Отсутствует', + ], + 'websocket_error' => [ + 'title' => 'Не удалось подключиться к веб-сокету!', + 'body' => 'Проверьте консоль браузера для получения более подробной информации.', + ], +]; diff --git a/lang/ru/server/dashboard.php b/lang/ru/server/dashboard.php new file mode 100644 index 0000000000..42e36b9589 --- /dev/null +++ b/lang/ru/server/dashboard.php @@ -0,0 +1,28 @@ + 'Серверы', + 'list' => 'Список серверов', + 'tabs' => [ + 'my' => 'Мои сервера', + 'other' => 'Другие сервера', + 'all' => 'Все сервера', + ], + 'empty_own' => 'У вас нет серверов!', + 'empty_other' => 'У вас нет доступа к каким либо серверам!', + + 'status' => 'Статус', + 'server' => 'Сервер', + 'resources' => 'Ресурсы', + 'usage_limit' => 'Лимит использования: :resource', + + 'cpu' => 'ЦП', + 'memory' => 'Память', + 'disk' => 'Диск', + 'network' => 'Сеть', + 'none' => 'Ничего', + 'loading' => 'Загрузка...', + + 'power_actions' => 'Действия питания', + 'power_action_sent' => ':action отправлено на :name', +]; diff --git a/lang/ru/server/database.php b/lang/ru/server/database.php new file mode 100644 index 0000000000..a544c78cb9 --- /dev/null +++ b/lang/ru/server/database.php @@ -0,0 +1,26 @@ + 'Базы данных', + 'empty' => 'Нет баз данных', + 'create_database' => 'Создать базу данных', + 'limit' => 'Достигнут предел базы данных', + 'viewing' => 'Просмотр: :database', + 'host' => 'Хост', + 'database' => 'База данных', + 'username' => 'Пользователь', + 'password' => 'Пароль', + 'remote' => 'Удалённый', + 'created_at' => 'Создано', + 'name' => 'Имя базы данных', + 'name_hint' => 'Если оставить поле пустым, то будет сгенерировано случайное название', + 'connections_from' => 'Подключение из', + 'max_connections' => 'Максимум подключений', + 'database_host' => 'Сервер базы данных', + 'database_host_select' => 'Выберите сервер базы данных', + 'jdbc' => 'Строка подключения JDBC', + 'create_notification' => 'Создано :database', + 'create_notification_fail' => 'Не удалось создать :database', + 'delete_notification' => 'Удалено :database', + 'delete_notification_fail' => 'Не удалось удалить :database', +]; diff --git a/lang/ru/server/file.php b/lang/ru/server/file.php new file mode 100644 index 0000000000..f760d65624 --- /dev/null +++ b/lang/ru/server/file.php @@ -0,0 +1,111 @@ + 'Файлы', + 'name' => 'Название', + 'size' => 'Размер', + 'modified_at' => 'Изменен', + 'actions' => [ + 'open' => 'Открыть', + 'download' => 'Скачать', + 'copy' => [ + 'title' => 'Копировать', + 'notification' => 'Файл скопирован', + ], + 'upload' => [ + 'title' => 'Загрузить', + 'from_files' => 'Загрузить файлы', + 'from_url' => 'Загрузить с URL', + 'url' => 'URL-адрес', + 'drop_files' => 'Перетащите файлы в данную область для загрузки', + 'success' => 'Файлы успешно загружены', + 'failed' => 'Не удалось загрузить файлы', + 'header' => 'Загрузка файлов', + 'error' => 'Произошла ошибка при загрузке файлов', + ], + 'rename' => [ + 'title' => 'Переименовать', + 'file_name' => 'Имя файла', + 'notification' => 'Файл переименован', + ], + 'move' => [ + 'title' => 'Переместить', + 'directory' => 'Каталог', + 'directory_hint' => 'Введите новую директорию, относительно текущей директории.', + 'new_location' => 'Новое местоположение', + 'new_location_hint' => 'Введите расположение этого файла или папки, относительно текущей директории.', + 'notification' => 'Файл перемещён', + 'bulk_notification' => ':count файлов были перемещены в :directory', + ], + 'permissions' => [ + 'title' => 'Права доступа', + 'read' => 'Чтение', + 'write' => 'Запись', + 'execute' => 'Выполнение', + 'owner' => 'Владелец', + 'group' => 'Группа', + 'public' => 'Публичный', + 'notification' => 'Права изменены на :mode', + ], + 'archive' => [ + 'title' => 'Архивировать', + 'archive_name' => 'Имя архива', + 'notification' => 'Архив создан', + 'extension' => 'Расширение', + ], + 'unarchive' => [ + 'title' => 'Разархивировать', + 'notification' => 'Разархивирование завершено', + ], + 'new_file' => [ + 'title' => 'Новый файл', + 'file_name' => 'Имя нового файла', + 'syntax' => 'Выделить синтаксис', + 'create' => 'Создать', + ], + 'new_folder' => [ + 'title' => 'Новая папка', + 'folder_name' => 'Название новой папки', + ], + 'nested_search' => [ + 'title' => 'Вложенный поиск', + 'search_term' => 'Поиск по выражению', + 'search_term_placeholder' => 'Введите слово для поиска, напр. *.txt', + 'search' => 'Поиск', + 'search_for_term' => 'Поиск :term', + ], + 'delete' => [ + 'notification' => 'Файл Удалён', + 'bulk_notification' => ':count файлов были удалены', + ], + 'edit' => [ + 'title' => 'Редактирование: :file', + 'save_close' => 'Сохранить и закрыть', + 'save' => 'Сохранить', + 'cancel' => 'Отмена', + 'notification' => 'Файл сохранен', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name слишком большой!', + 'body' => 'Максимум — :max', + ], + 'file_not_found' => [ + 'title' => ':name не найден!', + ], + 'file_not_editable' => [ + 'title' => ':name является каталогом', + ], + 'file_already_exists' => [ + 'title' => ':name уже существует!', + ], + 'files_node_error' => [ + 'title' => 'Не удалось загрузить файлы!', + ], + 'pelicanignore' => [ + 'title' => 'Вы редактируете файл .pelicanignore!', + 'body' => 'Все файлы и каталоги, перечисленные здесь, будут исключены из резервных копий. Подстановочные знаки поддерживаются с помощью символа звёздочки (*).
Вы можете отменить предыдущее правило, добавив восклицательный знак в начале (!).', + ], + ], +]; diff --git a/lang/ru/server/network.php b/lang/ru/server/network.php new file mode 100644 index 0000000000..55ea8dec0a --- /dev/null +++ b/lang/ru/server/network.php @@ -0,0 +1,17 @@ + 'Сеть', + 'add' => 'Добавить порты', + 'limit' => 'Достигнут предел портов', + 'address' => 'Адрес', + 'port' => 'Порт', + 'notes' => 'Заметки', + 'no_notes' => 'Нет заметок', + 'make_primary' => 'Сделать основным', + 'primary' => 'Основной', + 'make' => 'Сделать', + 'delete' => 'Удалить', + 'locked' => 'Заблокировано?', + 'locked_helper' => 'Заблокированные порты могут быть удалены только администраторами', +]; diff --git a/lang/ru/server/schedule.php b/lang/ru/server/schedule.php new file mode 100644 index 0000000000..c44589554a --- /dev/null +++ b/lang/ru/server/schedule.php @@ -0,0 +1,121 @@ + 'Планировки', + 'new' => 'Новая планировка', + 'edit' => 'Редактировать планировку', + 'save' => 'Сохранить планировку', + 'delete' => 'Удалить планировку', + 'import' => 'Импортировать планировку', + 'export' => 'Экспортировать планировку', + 'name' => 'Название', + 'cron' => 'Cron', + 'status' => 'Статус', + 'schedule_status' => [ + 'inactive' => 'Неактивен', + 'processing' => 'В процессе', + 'active' => 'Активен', + ], + 'no_tasks' => 'Нет задач', + 'run_now' => 'Запустить сейчас', + 'online_only' => 'Только когда запущен', + 'last_run' => 'Последний запуск', + 'next_run' => 'Следующий запуск', + 'never' => 'Никогда', + 'cancel' => 'Отменить', + + 'only_online' => 'Только когда сервер запущен?', + 'only_online_hint' => 'Выполнить это расписание только когда сервер находится в рабочем состоянии.', + 'enabled' => 'Включить задачу?', + 'enabled_hint' => 'Эта задача будет выполнена автоматически, если она включена.', + + 'cron_body' => 'Пожалуйста, имейте в виду, что значения cron ниже всегда указываются в формате UTC.', + 'cron_timezone' => 'Следующий запуск в вашем часовом поясе (:timezone): :next_run ', + + 'invalid' => 'Некорректный', + + 'time' => [ + 'minute' => 'Минута', + 'hour' => 'Час', + 'day' => 'День', + 'week' => 'Неделя', + 'month' => 'Месяц', + 'day_of_month' => 'День месяца', + 'day_of_week' => 'День недели', + + 'hourly' => 'Почасово', + 'daily' => 'Ежедневно', + 'weekly_mon' => 'Еженедельно (Понедельник)', + 'weekly_sun' => 'Еженедельно (Суббота)', + 'monthly' => 'Ежемесячно', + 'every_min' => 'Каждые x минут', + 'every_hour' => 'Каждые x часов', + 'every_day' => 'Каждые x дней', + 'every_week' => 'Каждые x недель', + 'every_month' => 'Каждые x месяцев', + 'every_day_of_week' => 'Каждые x дней недели', + + 'every' => 'Каждое', + 'minutes' => 'Минуты', + 'hours' => 'Часы', + 'days' => 'Дни', + 'months' => 'Месяцы', + + 'monday' => 'Понедельник', + 'tuesday' => 'Вторник', + 'wednesday' => 'Среда', + 'thursday' => 'Четверг', + 'friday' => 'Пятница', + 'saturday' => 'Суббота', + 'sunday' => 'Воскресенье', + ], + + 'tasks' => [ + 'title' => 'Задачи', + 'create' => 'Создать задачу', + 'limit' => 'Достигнут лимит возможных задач', + 'action' => 'Действие', + 'payload' => 'Данные', + 'no_payload' => 'Нет данных', + 'time_offset' => 'Смещение времени', + 'first_task' => 'Первая задача', + 'seconds' => 'Секунды', + 'continue_on_failure' => 'Продолжить при сбое', + + 'actions' => [ + 'title' => 'Действие', + 'power' => [ + 'title' => 'Изменить статус', + 'action' => 'Статус', + 'start' => 'Запустить', + 'stop' => 'Остановить', + 'restart' => 'Перезапустить', + 'kill' => 'Прервать', + ], + 'command' => [ + 'title' => 'Отправить команду', + 'command' => 'Команда', + ], + 'backup' => [ + 'title' => 'Создать резервную копию', + 'files_to_ignore' => 'Игнорировать файлы', + ], + 'delete_files' => [ + 'title' => 'Удалить файлы', + 'files_to_delete' => 'Файлы для удаления', + ], + ], + ], + + 'notification_invalid_cron' => 'Предоставленные данные cron не вычисляются для допустимого выражения', + + 'import_action' => [ + 'file' => 'Файл', + 'url' => 'URL-адрес', + 'schedule_help' => 'Это должен быть файл .json (schedule-daily-restart.json)', + 'url_help' => 'URL-адреса должны указывать непосредственно на файл .json', + 'add_url' => 'Новый URL-адрес', + 'import_failed' => 'Импорт не удался', + 'import_success' => 'Импортировано успешно', + ], +]; diff --git a/lang/ru/server/setting.php b/lang/ru/server/setting.php new file mode 100644 index 0000000000..bd8f0986dc --- /dev/null +++ b/lang/ru/server/setting.php @@ -0,0 +1,55 @@ + 'Настройки', + 'server_info' => [ + 'title' => 'Информация о сервере', + 'information' => 'Информация', + 'name' => 'Имя сервера', + 'server_name' => 'Имя сервера: :name', + 'notification_name' => 'Имя сервера обновлено', + 'description' => 'Описание сервера', + 'notification_description' => 'Описание сервера обновлено', + 'failed' => 'Ошибка', + 'uuid' => 'UUID сервера', + 'uuid_short' => 'ID сервера', + 'node_name' => 'Имя узла', + 'icon' => [ + 'upload' => 'Загрузить иконку', + 'tooltip' => 'Используется значок Egg', + 'updated' => 'Значок сервера обновлён', + 'deleted' => 'Значок сервера удален', + ], + 'limits' => [ + 'title' => 'Ограничения', + 'unlimited' => 'Неограниченно', + 'of' => 'из', + 'cpu' => 'ЦП', + 'memory' => 'ОЗУ', + 'disk' => 'Дисковое пространство', + 'backups' => 'Резервные копии', + 'databases' => 'Базы данных', + 'allocations' => 'Распределения', + 'no_allocations' => 'Нет дополнительных распределений', + ], + 'sftp' => [ + 'title' => 'Информация о SFTP', + 'connection' => 'Подключение', + 'action' => 'Подключение к SFTP', + 'username' => 'Пользователь', + 'password' => 'Пароль', + 'password_body' => 'Ваш SFTP пароль совпадает с паролем, используемым для доступа к этой панели.', + ], + ], + 'reinstall' => [ + 'title' => 'Переустановить сервер', + 'body' => 'Переустановка сервера остановит его и заново запустит скрипт установки.', + 'body2' => 'Во время этого процесса некоторые файлы могут быть удалены или изменены. Пожалуйста, сделайте резервную копию данных перед продолжением.', + 'action' => 'Переустановить', + 'modal' => 'Вы уверены, что хотите переустановить этот сервер?', + 'modal_description' => 'Во время этого процесса некоторые файлы могут быть удалены или изменены. Пожалуйста, сделайте резервную копию данных перед продолжением.', + 'yes' => 'Да, переустановить', + 'notification_start' => 'Переустановка началась', + 'notification_fail' => 'Сбой переустановки', + ], +]; diff --git a/lang/ru/server/startup.php b/lang/ru/server/startup.php new file mode 100644 index 0000000000..8d3838b354 --- /dev/null +++ b/lang/ru/server/startup.php @@ -0,0 +1,17 @@ + 'Запуск', + 'command' => 'Команда запуска', + 'notification_startup' => 'Команда запуска обновлена', + 'notification_startup_body' => 'Перезапустите сервер для использования новой команды запуска.', + 'enable_preview' => 'Включить предпросмотр', + 'disable_preview' => 'Отключить предпросмотр', + 'docker_image' => 'Образ докера', + 'notification_docker' => 'Докер образ обновлен', + 'notification_docker_body' => 'Перезапустите сервер для использования нового образа.', + 'variables' => 'Серверные переменные', + 'update' => 'Переменная :variable обновлена', + 'fail' => 'Ошибка: :variable', + 'validation_fail' => 'Не пройдена проверка :variable', +]; diff --git a/lang/ru/server/user.php b/lang/ru/server/user.php new file mode 100644 index 0000000000..eb7f3d8f7b --- /dev/null +++ b/lang/ru/server/user.php @@ -0,0 +1,73 @@ + 'Пользователи', + 'username' => 'Пользователь', + 'email' => 'Почта', + 'assign_all' => 'Назначить всех', + 'invite_user' => 'Пригласить пользователя', + 'action' => 'Пригласить', + 'remove' => 'Удалить пользователя', + 'edit' => 'Редактировать пользователя', + 'editing' => 'Изменение :user', + 'delete' => 'Удалить пользователя', + 'notification_add' => 'Пользователь приглашен!', + 'notification_edit' => 'Пользователь обновлен!', + 'notification_delete' => 'Пользователь удален!', + 'notification_failed' => 'Невозможно пригласить пользователя!', + 'permissions' => [ + 'title' => 'Разрешения', + 'activity_desc' => 'Разрешения, управляющие доступом пользователя к журналам активности сервера.', + 'startup_desc' => 'Разрешения, управляющие доступом пользователя к параметрам запуска сервера.', + 'settings_desc' => 'Разрешения, управляющие доступом пользователя к изменению настроек сервера.', + 'control_desc' => 'Разрешения, управляющие доступом пользователя к управлению состоянием сервера или отправке команд в консоль.', + 'user_desc' => 'Разрешения, управляющие возможностью пользователя к управлению другими подпользователями сервера. Это разрешение никогда не позволит пользователю изменять свои права или назначать те, которых у него нет.', + 'file_desc' => 'Разрешения, управляющие доступом пользователя к управлению файлами сервера.', + 'allocation_desc' => 'Разрешения, управляющие доступом пользователя к распределению портов сервера.', + 'database_desc' => 'Разрешения, управляющие доступом пользователя к управлению базами данных сервера.', + 'backup_desc' => 'Разрешения, управляющие доступом пользователя к управлению резервными копиями сервера.', + 'schedule_desc' => 'Разрешения, управляющие доступом пользователя к управлению планировщиком на сервере.', + 'startup_read' => 'Разрешает пользователю просматривать переменные запуска.', + 'startup_update' => 'Разрешает пользователю изменять переменные запуска.', + 'startup_docker_image' => 'Разрешает пользователю изменять образ докера для сервера.', + 'settings_reinstall' => 'Позволяет пользователю переустановить этот сервер.', + 'settings_rename' => 'Позволяет пользователю переименовать этот сервер и изменить его описание.', + 'settings_description' => 'Позволяет пользователю изменить описание этого сервера.', + 'activity_read' => 'Разрешает пользователю просматривать логи активности на сервере.', + 'websocket_connect' => 'Разрешает пользователю доступ к серверу по веб-сокету.', + 'control_console' => 'Разрешает пользователю отправлять команды в консоль сервера.', + 'control_start' => 'Разрешает пользователю запускать сервер.', + 'control_stop' => 'Разрешает пользователю останавливать сервер.', + 'control_restart' => 'Разрешает пользователю перезапускать сервер.', + 'control_kill' => 'Разрешает пользователю убить сервер.', + 'user_create' => 'Разрешает пользователю создавать новые аккаунты для сервера.', + 'user_read' => 'Разрешает пользователю просматривать список подпользователей связанных с сервером.', + 'user_update' => 'Разрешает пользователю изменять подпользователей.', + 'user_delete' => 'Разрешает пользователю удалять подпользователей.', + 'file_create' => 'Разрешает пользователю создавать файлы и дириктории', + 'file_read' => 'Разрешает пользователю просматривать содержимое папок.', + 'file_read_content' => 'Разрешает пользователю просматривать и скачивать файлы.', + 'file_update' => 'Разрешает пользователю изменять папки и файлы на сервере.', + 'file_delete' => 'Разрешает пользователю удалять файлы и папки.', + 'file_archive' => 'Разрешает пользователю архивировать файлы и распаковывать архивы.', + 'file_sftp' => 'Разрешает пользователю доступ к файлам сервера по SFTP. Пользователь сможет делать всё вышеуказанное через SFTP.', + 'allocation_read' => 'Разрешает пользователю видеть все распределения связанные с сервером. Пользователи с любым уровнем доступа к серверу могут видеть основное распределение.', + 'allocation_update' => 'Разрешает пользователю изменять основное распределение сервера и добавлять заметки к любому распределению.', + 'allocation_delete' => 'Разрешает пользователю удалять распределения сервера.', + 'allocation_create' => 'Разрешает пользователю добавлять распределения.', + 'database_create' => 'Разрешает пользователю создавать базы данных для сервера.', + 'database_read' => 'Позволяет пользователю видеть список баз данных сервера.', + 'database_update' => 'Предоставляет пользователю разрешение на внесение изменений в базу данных. Если у пользователя нет разрешения "Просмотр пароля", он не сможет изменить пароль.', + 'database_delete' => 'Предоставляет пользователю разрешение на удаление экземпляра базы данных.', + 'database_view_password' => 'Позволяет пользователю просматривать пароль базы данных в системе.', + 'schedule_create' => 'Позволяет пользователю создавать новое расписание для сервера.', + 'schedule_read' => 'Предоставляет пользователю разрешение на просмотр расписаний для сервера.', + 'schedule_update' => 'Позволяет пользователю вносить изменения в существующее расписание сервера.', + 'schedule_delete' => 'Позволяет пользователю удалять расписание для сервера.', + 'backup_create' => 'Позволяет пользователю создавать резервные копии.', + 'backup_read' => 'Позволяет пользователю видеть все резервные копии сервера.', + 'backup_delete' => 'Позволяет пользователю удалять резервные копии.', + 'backup_download' => 'Разрешает пользователю скачивать резервные копии. Внимание: это позволяет пользователю получить доступ ко всем файлам сервера находящимся в копии!', + 'backup_restore' => 'Позволяет пользователю восстановить состояние сервера из резервной копии. Внимание: это позволит удалить все файлы в процессе восстановления!', + ], +]; diff --git a/lang/ru/server/users.php b/lang/ru/server/users.php deleted file mode 100644 index 68fad8814c..0000000000 --- a/lang/ru/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Позволяет доступ к веб-сокету для этого сервера.', - 'control_console' => 'Позволяет пользователю отправлять данные в консоль сервера.', - 'control_start' => 'Позволяет пользователю запустить экземпляр сервера.', - 'control_stop' => 'Позволяет пользователю остановить экземпляр сервера.', - 'control_restart' => 'Позволяет пользователю перезапустить экземпляр сервера.', - 'control_kill' => 'Позволяет пользователю прервать процесс сервера.', - 'user_create' => 'Позволяет пользователю создавать новые учетные записи пользователей для сервера.', - 'user_read' => 'Предоставляет пользователю разрешение на просмотр пользователей, связанных с этим сервером.', - 'user_update' => 'Позволяет пользователю изменять других пользователей, связанных с этим сервером.', - 'user_delete' => 'Позволяет пользователю удалять других пользователей, связанных с этим сервером.', - 'file_create' => 'Предоставляет пользователю разрешение на создание новых файлов и каталогов.', - 'file_read' => 'Позволяет пользователю видеть файлы и папки, связанные с этим экземпляром сервера, а также просматривать их содержимое.', - 'file_update' => 'Позволяет пользователю обновлять файлы и папки, связанные с сервером.', - 'file_delete' => 'Позволяет пользователю удалять файлы и каталоги.', - 'file_archive' => 'Позволяет пользователю создавать архивы файлов и распаковывать существующие архивы.', - 'file_sftp' => 'Позволяет пользователю выполнять вышеуказанные действия с файлами с использованием клиента SFTP.', - 'allocation_read' => 'Предоставляет доступ к страницам управления выделением сервера.', - 'allocation_update' => 'Предоставляет пользователю разрешение на внесение изменений в выделения сервера.', - 'database_create' => 'Предоставляет пользователю разрешение на создание новой базы данных для сервера.', - 'database_read' => 'Предоставляет пользователю разрешение на просмотр баз данных сервера.', - 'database_update' => 'Предоставляет пользователю разрешение на внесение изменений в базу данных. Если у пользователя нет разрешения "Просмотр пароля", он не сможет изменить пароль.', - 'database_delete' => 'Предоставляет пользователю разрешение на удаление экземпляра базы данных.', - 'database_view_password' => 'Позволяет пользователю просматривать пароль базы данных в системе.', - 'schedule_create' => 'Позволяет пользователю создавать новое расписание для сервера.', - 'schedule_read' => 'Предоставляет пользователю разрешение на просмотр расписаний для сервера.', - 'schedule_update' => 'Позволяет пользователю вносить изменения в существующее расписание сервера.', - 'schedule_delete' => 'Позволяет пользователю удалять расписание для сервера.', - ], -]; diff --git a/lang/ru/strings.php b/lang/ru/strings.php deleted file mode 100644 index eecc08f7cc..0000000000 --- a/lang/ru/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Почта', - 'email_address' => 'Почта', - 'user_identifier' => 'Имя пользователя или адрес эл. почты', - 'password' => 'Пароль', - 'new_password' => 'Новый пароль', - 'confirm_password' => 'Повторите пароль', - 'login' => 'Авторизация', - 'home' => 'Главная', - 'servers' => 'Серверы', - 'id' => 'ID', - 'name' => 'Имя', - 'node' => 'Узел', - 'connection' => 'Подключение', - 'memory' => 'Память', - 'cpu' => 'Процессор', - 'disk' => 'Диск', - 'status' => 'Статус', - 'search' => 'Поиск', - 'suspended' => 'Приостановлена', - 'account' => 'Учетная Запись', - 'security' => 'Безопасность', - 'ip' => 'IP-адрес', - 'last_activity' => 'Последняя активность', - 'revoke' => 'Отозвать', - '2fa_token' => 'Токен аутентификации', - 'submit' => 'Подтвердить', - 'close' => 'Закрыть', - 'settings' => 'Настройки', - 'configuration' => 'Конфигурация', - 'sftp' => 'SFTP', - 'databases' => 'Базы данных', - 'memo' => 'Заметка', - 'created' => 'Создан', - 'expires' => 'Истекает', - 'public_key' => 'Токен', - 'api_access' => 'Api Доступ', - 'never' => 'никогда', - 'sign_out' => 'Выйти', - 'admin_control' => 'Панель администратора', - 'required' => 'Обязательно', - 'port' => 'Порт', - 'username' => 'Имя пользователя', - 'database' => 'База данных', - 'new' => 'Создать', - 'danger' => 'Важно!', - 'create' => 'Создать', - 'select_all' => 'Выбрать всё', - 'select_none' => 'Ни один из предложенных', - 'alias' => 'Псевдоним', - 'primary' => 'Основной', - 'make_primary' => 'Сделать основным', - 'none' => 'Ничего', - 'cancel' => 'Отменить', - 'created_at' => 'Создан', - 'action' => 'Действие', - 'data' => 'Данные', - 'queued' => 'В очереди', - 'last_run' => 'Последний Запуск', - 'next_run' => 'Следующий Запуск', - 'not_run_yet' => 'Ещё Не Запущено', - 'yes' => 'Да', - 'no' => 'Нет', - 'delete' => 'Удалить', - '2fa' => '2FA', - 'logout' => 'Выйти', - 'admin_cp' => 'Панель администратора', - 'optional' => 'Необязательно', - 'read_only' => 'Только для чтения', - 'relation' => 'Отношение', - 'owner' => 'Владелец', - 'admin' => 'Администратор', - 'subuser' => 'Подпользователь', - 'captcha_invalid' => 'Проверка на робота не пройдена.', - 'tasks' => 'Задачи', - 'seconds' => 'Секунды', - 'minutes' => 'Минуты', - 'under_maintenance' => 'На Технических Работах', - 'days' => [ - 'sun' => 'Воскресенье', - 'mon' => 'Понедельник', - 'tues' => 'Вторник', - 'wed' => 'Среда', - 'thurs' => 'Четверг', - 'fri' => 'Пятница', - 'sat' => 'Суббота', - ], - 'last_used' => 'Последнее использование', - 'enable' => 'Включить', - 'disable' => 'Отключить', - 'save' => 'Сохранить', - 'copyright' => '® 2024 - :year Pelican | При поддержке PM-Kirill', -]; diff --git a/lang/ru/validation.php b/lang/ru/validation.php index dae981ccf5..f58eae39c9 100644 --- a/lang/ru/validation.php +++ b/lang/ru/validation.php @@ -28,7 +28,7 @@ 'string' => ':attribute должен содержать :min - :max символов.', 'array' => ':attribute должен содержать от :min и до :max.', ], - 'boolean' => ':attribute должен иметь значение true или false.', + 'confirmed' => ':attribute подтверждение не совпадает.', 'date' => ':attribute не является верной датой.', 'date_format' => 'Атрибут: не соответствует формату: формат.', @@ -36,13 +36,13 @@ 'digits' => ':attribute должен содержать :digits цифр.', 'digits_between' => ':attribute должен быть между :min и :max цифр.', 'dimensions' => 'Поле :attribute имеет недопустимые размеры изображения.', - 'distinct' => 'Поле :attribute содержит повторяющееся значение.', + 'email' => 'Значение :attribute должно быть действительным адресом электронной почты.', - 'exists' => 'Выбранный :attribute неправильный.', + 'file' => ':attribute должен быть файлом.', 'filled' => 'Поле :attribute обязательно', 'image' => ':attribute должен быть изображением.', - 'in' => 'Выбранный :attribute неправильный.', + 'in_array' => 'Поле :attribute не существует в :other.', 'integer' => ':attribute должен быть целым числом.', 'ip' => ':attribute должно быть IP-адресом.', @@ -61,17 +61,13 @@ 'string' => ':attribute должен быть не менее :min символов.', 'array' => ':attribute должен быть как минимум :min пунктов.', ], - 'not_in' => 'Выбранный :attribute неправильный.', + 'numeric' => 'Атрибут : должен быть числом.', - 'present' => ':attribute должно присутствовать.', + 'regex' => 'Выбранный формат для :attribute ошибочный.', - 'required' => 'Поле :attribute обязательно', - 'required_if' => 'Поле :attribute обязательно для заполнения, когда :other равно :value.', - 'required_unless' => 'Поле :attribute обязательно для заполнения, когда :other не равно :values.', - 'required_with' => 'Значение :attribute обязательно, когда все из следующих значений :values существуют.', + 'required_with_all' => 'Значение :attribute обязательно, когда все из следующих значений :values существуют.', - 'required_without' => ':attribute обязательное поле, когда отсутствует :values.', - 'required_without_all' => 'Поле :attribute обязателен, если ни одно из :values не присутствует.', + 'same' => 'Значение :attribute должно совпадать с :other.', 'size' => [ 'numeric' => 'Атрибут: должен быть: размер.', @@ -81,8 +77,7 @@ ], 'string' => ':attribute должен быть строкой.', 'timezone' => ':attribute должно быть корректным часовым поясом.', - 'unique' => 'Такое значение поля :attribute уже существует.', - 'uploaded' => 'Не удалось загрузить :attribute.', + 'url' => 'Выбранный формат для :attribute ошибочный.', /* diff --git a/lang/sk/activity.php b/lang/sk/activity.php deleted file mode 100644 index 200434a49a..0000000000 --- a/lang/sk/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Nepodarilo sa prihlásiť', - 'success' => 'Prihlásený', - 'password-reset' => 'Resetovať heslo', - 'reset-password' => 'Požiadané o reset hesla', - 'checkpoint' => 'Požadované dvoj-faktorové overenie', - 'recovery-token' => 'Použitý dvoj-faktorový obnovovací token', - 'token' => 'Dvoj-faktorové overenie vyriešené', - 'ip-blocked' => 'Požiadavka bola zablokovaná z neuvedenej IP adresy pre :identifier ', - 'sftp' => [ - 'fail' => 'Prihlásenie SFTP zlyhalo', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Email bol zmenený z :old na :new', - 'password-changed' => 'Heslo bolo zmenené', - ], - 'api-key' => [ - 'create' => 'Vytvorený nový API kľúč :identifier', - 'delete' => 'Odstránený API kľúč :identifier', - ], - 'ssh-key' => [ - 'create' => 'Pridaný SSH kľúč :fingerprint k účtu', - 'delete' => 'Zmazaný SSH kľúč :fingerprint z účtu', - ], - 'two-factor' => [ - 'create' => 'Dvoj-faktorové overenie zapnuté', - 'delete' => 'Dvoj-faktorové overenie vypnuté', - ], - ], - 'server' => [ - 'reinstall' => 'Server bol preinštalovaný', - 'console' => [ - 'command' => 'Príkaz ":command" sa vykonal na servery', - ], - 'power' => [ - 'start' => 'Server bol spustený', - 'stop' => 'Server bol zastavený', - 'restart' => 'Server bol reštartovaný', - 'kill' => 'Proces serveru bol vynútene ukončený', - ], - 'backup' => [ - 'download' => 'Záloha :name bola stiahnutá', - 'delete' => 'Záloha :name bola odstránená', - 'restore' => 'Záloha :name bola obnovená (zmazané súbory: :truncate)', - 'restore-complete' => 'Obnova zálohy :name bola dokončená', - 'restore-failed' => 'Obnova zálohy :name nebola ukončená úspešne', - 'start' => 'Spustenie zálohovania :name', - 'complete' => 'Záloha :name bola označená ako dokončená', - 'fail' => 'Záloha :name bola označená ako zlyhaná', - 'lock' => 'Záloha :name uzamknutá', - 'unlock' => 'Záloha :name odomknutá', - ], - 'database' => [ - 'create' => 'Bola vytvorená nová databáza :name', - 'rotate-password' => 'Heslo bolo zmenené pre databázu :name', - 'delete' => 'Odstránená databáza :name', - ], - 'file' => [ - 'compress_one' => 'Súbor :directory:file bol skomprimovaný', - 'compress_other' => 'Skomprimovaných :count súborov v :directory', - 'read' => 'Zobrazený obsah :file', - 'copy' => 'Vytvorená kópia :file', - 'create-directory' => 'Vytvorený priečinok :directory:name', - 'decompress' => 'Rozbalené :files v :directory', - 'delete_one' => 'Zmazané :directory:files.0', - 'delete_other' => 'Zmazaných :count súborov v :directory', - 'download' => 'Stiahnuté :file', - 'pull' => 'Stiahnutý vzdialený súbor z :url do :directory', - 'rename_one' => 'Premenované :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Premenovaných :count súborov v :directory', - 'write' => 'Nový obsah zapísaný do :file', - 'upload' => 'Začalo nahrávanie súboru', - 'uploaded' => 'Nahrané :directory:file', - ], - 'sftp' => [ - 'denied' => 'SFTP prístup bol zablokovaný kvôli právam', - 'create_one' => 'Vytvorené :files.0', - 'create_other' => 'Vytvorených :count nových súborov', - 'write_one' => 'Upravený obsah :files.0', - 'write_other' => 'Upravený obsah :count súborov', - 'delete_one' => 'Zmazané :files.0', - 'delete_other' => 'Zmazaných :count súborov', - 'create-directory_one' => 'Vytvorený :files.0 priečinok', - 'create-directory_other' => 'Vytvorených :count priečinkov', - 'rename_one' => 'Premenované :files.0.from na :files.0.to', - 'rename_other' => 'Premenovaných alebo presunutých :count súborov', - ], - 'allocation' => [ - 'create' => 'Pridaná alokácia :allocation k serveru', - 'notes' => 'Aktualizované poznámky k :allocation z ":old" na ":new"', - 'primary' => 'Nastavená alokácia :allocation ako primárna alokácia serveru', - 'delete' => 'Alokácia :allocation bola zmazaná', - ], - 'schedule' => [ - 'create' => 'Vytvorené načasovanie :name', - 'update' => 'Aktualizované načasovanie :name', - 'execute' => 'Manuálne spustené načasovanie :name', - 'delete' => 'Zmazané načasovanie :name', - ], - 'task' => [ - 'create' => 'Vytvorená nová úloha ":action" pre načasovanie :name', - 'update' => 'Aktualizovaná úloha ":action" pre načasovanie :name', - 'delete' => 'Úloha pre načasovanie :name bola odstránená', - ], - 'settings' => [ - 'rename' => 'Server bol premenovaný z :old na :new', - 'description' => 'Popis servera bol zmenený z :old na :new', - ], - 'startup' => [ - 'edit' => 'Premenná :variable bola zmenená z ":old" na ":new"', - 'image' => 'Docker Image pre server bol aktualizovaný z :old na :new', - ], - 'subuser' => [ - 'create' => 'Pridaný :email ako podpoužívateľ', - 'update' => 'Aktualizované práva podpoužívateľa pre :email', - 'delete' => 'Odstránený :email ako podpoužívateľ', - ], - ], -]; diff --git a/lang/sk/admin/apikey.php b/lang/sk/admin/apikey.php new file mode 100644 index 0000000000..12a55a6153 --- /dev/null +++ b/lang/sk/admin/apikey.php @@ -0,0 +1,27 @@ + 'Aplikačný API Kľúč', + 'empty' => 'Žiadne API kľúče', + 'whitelist' => 'IPv4 Adresy na bielej listine', + 'whitelist_help' => 'Kľúče API môžu byť obmedzené tak, aby fungovali iba z konkrétnych adries IPv4. Zadajte každú adresu do nového riadku.', + 'whitelist_placeholder' => 'Ukážka: 127.0.0.1 alebo 192.168.1.1', + 'description' => 'Popis', + 'description_help' => 'Stručný popis toho, na čo slúži tento kľúč.', + 'nav_title' => 'API Kľúče', + 'model_label' => 'Aplikačný API Kľúč', + 'model_label_plural' => 'Aplikačné API Kľúče', + 'table' => [ + 'key' => 'Kľúč', + 'description' => 'Popis', + 'last_used' => 'Naposledy použitý', + 'created' => 'Vytvorený', + 'created_by' => 'Vytvoril', + 'never_used' => 'Nikdy nepoužitý', + ], + 'permissions' => [ + 'none' => 'Žiadny', + 'read' => 'Čítať', + 'read_write' => 'Čítať a Zapisovať', + ], +]; diff --git a/lang/sk/admin/databasehost.php b/lang/sk/admin/databasehost.php new file mode 100644 index 0000000000..6396759b04 --- /dev/null +++ b/lang/sk/admin/databasehost.php @@ -0,0 +1,72 @@ + 'Hostitelia databáz', + 'model_label' => 'Hostiteľ databázy', + 'model_label_plural' => 'Hostitelia databáz', + 'table' => [ + 'database' => 'Databáza', + 'name' => 'Meno', + 'host' => 'Hostiteľ', + 'port' => 'Port', + 'name_helper' => 'Ak toto pole necháte prázdne, automaticky sa vygeneruje náhodné meno', + 'username' => 'Používateľské meno', + 'password' => 'Heslo', + 'remote' => 'Pripojenia z', + 'remote_helper' => 'Odkiaľ by mali byť povolené pripojenia. Nechajte prázdne, aby boli povolené pripojenia odkiaľkoľvek.', + 'max_connections' => 'Maximálne pripojenia', + 'created_at' => 'Vytvorené', + 'connection_string' => 'JDBC pripojovací reťazec', + ], + 'error' => 'Chyba pri pripojovaní k hostiteľovi', + 'host' => 'Hostiteľ', + 'host_help' => 'IP adresa alebo doménové meno, ktoré sa má použiť pri pokuse o pripojenie k tomuto MySQL hostiteľovi z tohto panelu na vytvorenie nových databáz.', + 'port' => 'Port', + 'port_help' => 'Port pre hostiteľa na ktorom beží MySQL.', + 'max_database' => 'Maximálny počet databáz', + 'max_databases_help' => 'Maximálny počet databáz, ktoré je možné vytvoriť na tomto hostiteľovi. Ak je limit dosiahnutý, nové databázy už nebude možné na tomto hostiteľovi vytvárať. Prázdne pole znamená neobmedzený počet.', + 'display_name' => 'Zobrazované Meno', + 'display_name_help' => 'IP adresa alebo názov domény, ktorý by mal byť zobrazený koncovému používateľovi.', + 'username' => 'Používateľské meno', + 'username_help' => 'Používateľské meno účtu, ktorý má dostatočné oprávnenia na vytváranie nových používateľov a databáz v systéme.', + 'password' => 'Heslo', + 'password_help' => 'Heslo pre používateľa databázy.', + 'linked_nodes' => 'Prepojené Uzly', + 'linked_nodes_help' => 'Toto nastavenie predvolene použije tohto hostiteľa databázy, keď sa pridáva databáza na server na vybranom uzle.', + 'connection_error' => 'Chyba pri pripojení k hostiteľovi databázy.', + 'no_database_hosts' => 'Žiadni hostitelia databázy.', + 'no_nodes' => 'Žiadne Uzly', + 'delete_help' => 'Hostiteľ Databázy má Databázy', + 'unlimited' => 'Neobmedzený', + 'anywhere' => 'Kdekoľvek', + + 'rotate' => 'Zmeniť', + 'rotate_password' => 'Zmeniť heslo', + 'rotated' => 'Heslo zmenené', + 'rotate_error' => 'Zmena hesla neúspešná', + 'databases' => 'Databázy', + + 'setup' => [ + 'preparations' => 'Prípravy', + 'database_setup' => 'Nastavenie databázy', + 'panel_setup' => 'Nastavenie panelu', + + 'note' => 'Momentálne sú podporované iba MySQL/MariaDB databázy!', + 'different_server' => 'Panel a databáza niesu na tom istom servery?', + + 'database_user' => 'Databázový používateľ', + 'cli_login' => 'Na prístup do MySQL CLI použite mysql -u root -p', + 'command_create_user' => 'Príkaz na vytvorenie ďalšieho používateľa', + 'command_assign_permissions' => 'Príkaz na priradenie oprávnení', + 'cli_exit' => 'Na ukončenie MySQL CLI napíšte exit.', + 'external_access' => 'Externý prístup', + 'allow_external_access' => '

Je pravdepodobné, že budete musieť povoliť externý prístup k tejto inštancii MySQL, aby sa k nej mohli pripojiť servery.

+
+

Preto otvorte súbor my.cnf, ktorého umiestnenie sa líši v závislosti od vášho operačného systému a spôsobu inštalácie MySQL. Na jeho vyhľadanie môžete zadať príkaz find /etc -iname my.cnf

. +
+

Otvorte súbor my.cnf, pridajte nasledujúci text na koniec súboru a uložte ho:
+[mysqld]
[object Object],bind-address=0.0.0.0

+
+

Reštartujte MySQL/MariaDB, aby sa tieto zmeny uplatnili. Týmto sa prepíše predvolená konfigurácia MySQL, ktorá štandardne akceptuje požiadavky iba z localhostu. Aktualizáciou tejto konfigurácie povolíte pripojenia na všetkých rozhraniach, a teda aj externé pripojenia. Uistite sa, že v bráne firewall povolíte port MySQL (predvolene 3306).

', + ], +]; diff --git a/lang/sk/admin/eggs.php b/lang/sk/admin/eggs.php deleted file mode 100644 index 838d1a7f3f..0000000000 --- a/lang/sk/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Toto vajce a jeho potrebné premenné boli importované úspešne.', - 'updated_via_import' => 'Toto vajce bolo aktualizované pomocou nahraného súboru.', - 'deleted' => 'Požadované vajce bolo úspešne odstránené z panelu.', - 'updated' => 'Konfigurácia vajca bola aktualizovaná úspešne.', - 'script_updated' => 'Inštalačný skript vajca bol aktualizovaný a bude spustený vždy pri inštalácii servera.', - 'egg_created' => 'Nové vajce bolo znesené úspešne. Budete musieť reštartovať spustené daemony na aplikovanie nového vajca.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Premenná ":variable" bola zmazaná a po prestavaní nebude pre servery dostupná.', - 'variable_updated' => 'Premenná ":variable" bola aktualizovaná. Servery, ktoré používajú danú premennú je potrebné prestavať pre aplikovanie zmien.', - 'variable_created' => 'Nová premenná bola úspešne vytvorená a priradená k tomuto vajcu.', - ], - ], -]; diff --git a/lang/sk/admin/health.php b/lang/sk/admin/health.php new file mode 100644 index 0000000000..f7919ce06b --- /dev/null +++ b/lang/sk/admin/health.php @@ -0,0 +1,60 @@ + 'Zdravie', + 'results_refreshed' => 'Výsledky kontroly zdravia boli aktualizované', + 'checked' => 'Skontrolované výsledky z', + 'refresh' => 'Obnoviť', + 'results' => [ + 'cache' => [ + 'label' => 'Vyrovnávacia pamäť', + 'ok' => 'Ok', + 'failed_retrieve' => 'Nepodarilo sa nastaviť alebo získať hodnotu z aplikačnej vyrovnávacej pamäte.', + 'failed' => 'V aplikácii došlo k chybe s vyrovnávacou pamäťou: :error', + ], + 'database' => [ + 'label' => 'Databáza', + 'ok' => 'Ok', + 'failed' => 'Nepodarilo sa pripojiť k databáze: :error', + ], + 'debugmode' => [ + 'label' => 'Režim ladenia', + 'ok' => 'Režim ladenia je vypnutý', + 'failed' => 'Režim ladenia bol predpokladaný :expected, ale reálne bol :actual', + ], + 'environment' => [ + 'label' => 'Prostredie', + 'ok' => 'Ok, nastaviť na :actual', + 'failed' => 'Prostredie je nastavené na :actual, bolo predpokladané :expected', + ], + 'nodeversions' => [ + 'label' => 'Verzie uzlov', + 'ok' => 'Uzly sú aktualizované', + 'failed' => ':outdated/:all uzly sú zastaralé', + 'no_nodes_created' => 'Žiadne vytvorené uzly', + 'no_nodes' => 'Žiadne uzly', + 'all_up_to_date' => 'Všetko je aktualizované', + 'outdated' => ':outdated/:all zastaralé', + ], + 'panelversion' => [ + 'label' => 'Verzia panelu', + 'ok' => 'Panel je aktualizovaný', + 'failed' => 'Nainštalovaná verzia je :current , ale najnovšia verzia je :latestVersion', + 'up_to_date' => 'Aktualizované', + 'outdated' => 'Zastaralé', + ], + 'schedule' => [ + 'label' => 'Naplánovať', + 'ok' => 'Ok', + 'failed_last_ran' => 'Posledné spustenie naplánovanej udalosti bolo viac ako pred :time minútami', + 'failed_not_ran' => 'Naplánovaná udalosť sa ešte nespustila.', + ], + 'useddiskspace' => [ + 'label' => 'Miesto na disku', + ], + ], + 'checks' => [ + 'successful' => 'Úspešné', + 'failed' => 'Zlyhalo', + ], +]; diff --git a/lang/sk/admin/mount.php b/lang/sk/admin/mount.php new file mode 100644 index 0000000000..0cc63ae844 --- /dev/null +++ b/lang/sk/admin/mount.php @@ -0,0 +1,30 @@ + 'Úložiská', + 'model_label' => 'Úložisko', + 'model_label_plural' => 'Úložiská', + 'name' => 'Meno', + 'name_help' => 'Unikátne meno použité na oddelenie tohto úložiska od iného.', + 'source' => 'Zdroj', + 'source_help' => 'Cesta súboru na hostiteľskom systéme pre pripojenie úložiska ku kontajneru.', + 'target' => 'Cieľ', + 'target_help' => 'Kde bude úložisko dostupné v kontajneri.', + 'read_only' => 'Iba na čítanie?', + 'read_only_help' => 'Je úložisko v kontajneri iba na čítanie?', + 'description' => 'Popis', + 'description_help' => 'Dlhší popis pre toto úložisko', + 'no_mounts' => 'Žiadne úložiská', + 'eggs' => 'Vajcia', + 'nodes' => 'Uzly', + 'toggles' => [ + 'writable' => 'Zapisovateľné', + 'read_only' => 'Iba čitateľné', + ], + 'table' => [ + 'name' => 'Meno', + 'all_eggs' => 'Všetky vajcia', + 'all_nodes' => 'Všetky uzly', + 'read_only' => 'Iba čitateľné', + ], +]; diff --git a/lang/sk/admin/node.php b/lang/sk/admin/node.php deleted file mode 100644 index a6ee81e814..0000000000 --- a/lang/sk/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'Poskytnutá FQDN neodkazuje na platnú IP adresu.', - 'fqdn_required_for_ssl' => 'Na použitie SSL pre tento uzol je potrebná plnohodnotná doména ukazujúca na verejnú IP adresu.', - ], - 'notices' => [ - 'allocations_added' => 'Alokácie pre tento uzol boli úspešne pridané.', - 'node_deleted' => 'Uzol bol úspešne vymazaný z panelu.', - 'node_created' => 'Nový uzol bol úspešne vytvorený. Daemon na tomto uzle môžete automaticky nakonfigurovať na karte "Konfigurácie". Pred tým ako pridáte nové servery musíte prideliť aspoň jednu IP adresu a port.', - 'node_updated' => 'Informácie o uzle boli aktualizované. Ak sa zmenili akékoľvek nastavenia daemonu, budete ho musieť reštartovať na aplikovanie týchto nastavení.', - 'unallocated_deleted' => 'Boli zmazané všetky nepriradené porty pre :ip.', - ], -]; diff --git a/lang/sk/admin/role.php b/lang/sk/admin/role.php new file mode 100644 index 0000000000..d68e6eda3a --- /dev/null +++ b/lang/sk/admin/role.php @@ -0,0 +1,17 @@ + 'Roly', + 'model_label' => 'Rola', + 'model_label_plural' => 'Roly', + 'no_roles' => 'Žiadne roly', + 'name' => 'Názov role', + 'permissions' => 'Oprávnenia', + 'in_use' => 'Používa sa', + 'all' => 'Všetky', + 'root_admin' => ':role má všetky oprávnenia.', + 'root_admin_delete' => 'Nieje možné zmazať koreňového admina', + 'users' => 'Používatelia', + 'nodes' => 'Uzly', + 'nodes_hint' => 'Ponechajte prázdne aby ste povolili prístup ku všetkým uzlom.', +]; diff --git a/lang/sk/admin/server.php b/lang/sk/admin/server.php deleted file mode 100644 index 7d2bbd2b8b..0000000000 --- a/lang/sk/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'Pokúšate sa odstrániť predvolené pridelenie pre tento server, ale nie je možné použiť žiadne záložné pridelenie.', - 'marked_as_failed' => 'Tento server bol označený ako neúspešný pri predchádzajúcej inštalácii. V tomto stave nie je možné prepnúť aktuálny stav.', - 'bad_variable' => 'Pri overení premennej :name sa vyskytla chyba.', - 'daemon_exception' => 'Pri pokuse o komunikáciu s daémonom sa vyskytla chyba, čo malo za následok kód odpovede HTTP/:code. Táto chyba bola zaznamenaná. (id žiadosti: :request_id)', - 'default_allocation_not_found' => 'Požadované predvolené pridelenie sa nenašlo v pridelení tohto servera.', - ], - 'alerts' => [ - 'startup_changed' => 'Konfigurácia spúšťania pre tento server bola aktualizovaná. Ak sa vajíčko tohto servera zmenilo, dôjde k preinštalovaniu.', - 'server_deleted' => 'Server bol úspešne odstránený zo systému.', - 'server_created' => 'Server bol úspešne vytvorený na paneli. Nechajte daémonovi niekoľko minút na úplnú inštaláciu tohto servera.', - 'build_updated' => 'Podrobnosti zostavy pre tento server boli aktualizované. Niektoré zmeny môžu vyžadovať reštart, aby sa prejavili.', - 'suspension_toggled' => 'Stav pozastavenia servera sa zmenil na :status.', - 'rebuild_on_boot' => 'Tento server bol označený ako server vyžadujúci prebudovanie kontajnera Docker. Stane sa tak pri ďalšom spustení servera.', - 'install_toggled' => 'Stav inštalácie pre tento server bol prepnutý.', - 'server_reinstalled' => 'Tento server bol zaradený do poradia na preinštalovanie, ktoré sa teraz začína.', - 'details_updated' => 'Podrobnosti servera boli úspešne aktualizované.', - 'docker_image_updated' => 'Úspešne sa zmenil predvolený Docker image na použitie pre tento server. Na uplatnenie tejto zmeny je potrebný reštart.', - 'node_required' => 'Pred pridaním servera na tento panel musíte mať nakonfigurovaný aspoň jednu node.', - 'transfer_nodes_required' => 'Pred prenosom serverov musíte mať nakonfigurované aspoň dve nody.', - 'transfer_started' => 'Prenos servera bol spustený.', - 'transfer_not_viable' => 'Nodu, ktorú ste vybrali, nemá k dispozícii požadovaný diskový priestor alebo pamäť na umiestnenie tohto servera.', - ], -]; diff --git a/lang/sk/admin/user.php b/lang/sk/admin/user.php deleted file mode 100644 index 97172717c6..0000000000 --- a/lang/sk/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Nie je možné odstrániť používateľa s aktívnymi servermi pripojenými k ich účtu. Pred pokračovaním odstráňte ich servery.', - 'user_is_self' => 'Nie je možné odstrániť svoj vlastný používateľský účet.', - ], - 'notices' => [ - 'account_created' => 'Účet bol úspešne vytvorený.', - 'account_updated' => 'Účet bol úspešne aktualizovaný.', - ], -]; diff --git a/lang/sk/admin/webhook.php b/lang/sk/admin/webhook.php new file mode 100644 index 0000000000..f734e32626 --- /dev/null +++ b/lang/sk/admin/webhook.php @@ -0,0 +1,65 @@ + 'Webhooky', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooky', + 'endpoint' => 'Koncový bod', + 'description' => 'Popis', + 'no_webhooks' => 'Žiadne webhooky', + 'help' => 'Pomoc', + 'help_text' => 'Názov premennej musíte vložiť medzi {{ }}. Napríklad, ak chcete získať názov z API, môžete použiť {{name}}.', + 'test_now' => 'Otestovať teraz', + 'test_now_help' => 'Toto spustí \'created: Server\' udalosť', + 'table' => [ + 'description' => 'Popis', + 'endpoint' => 'Koncový bod', + ], + 'headers' => 'Hlavičky', + 'events' => 'Udalosti', + 'regular' => 'Bežné', + 'reset_headers' => 'Resetovať hlavičky', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profil', + 'message' => 'Správa', + 'username' => 'Používateľské meno', + 'avatar_url' => 'URL Avatara', + 'forum_thread' => 'Názov vlákna fóra', + 'supress_embeds' => 'Potlačiť vloženia', + 'supress_embeds_text' => 'Pri serializácii tejto správy nezahŕňajte žiadne vloženia.', + 'supress_notifications' => 'Potlačiť upozornenia', + 'supress_notifications_text' => 'Táto správa nespustí push a desktopové notifikácie. + +', + ], + 'discord_embed' => [ + 'add_embed' => 'Pridať vloženie', + 'flags' => 'Vlajky', + 'thumbnail' => 'URL náhľadu ', + 'embeds' => 'Vloženia', + 'thread_name' => 'Názov vlákna fóra', + 'allowed_mentions' => 'Povolené zmienky', + 'roles' => 'Roly', + 'users' => 'Používatelia', + 'everyone' => '@everyone & @here', + 'author' => 'Autor', + 'author_url' => 'URL autora', + 'author_icon_url' => 'URL ikonky autora', + 'body' => 'Telo', + 'title' => 'Názov', + 'color' => 'Farba vloženia', + 'url' => 'URL', + 'images' => 'Obrazy', + 'image_url' => 'URL obrazu', + 'image_thumbnail' => 'URL náhľadu ', + 'footer' => 'Pätička', + 'has_timestamp' => 'Má časovú pečiatku', + 'footer_icon_url' => 'URL ikonky pätičky', + 'add_field' => 'Pridať pole', + 'fields' => 'Polia', + 'field_name' => 'Názov poľa', + 'field_value' => 'Hodnota poľa', + 'inline_field' => 'Vložené pole', + ], +]; diff --git a/lang/sk/auth.php b/lang/sk/auth.php index 347df77106..7d27bf9a32 100644 --- a/lang/sk/auth.php +++ b/lang/sk/auth.php @@ -1,27 +1,24 @@ 'Prihlásiť sa', - 'go_to_login' => 'Prejsť na prihlásenie', - 'failed' => 'Účet s týmito údajmi nebol nájdený.', - 'forgot_password' => [ - 'label' => 'Zabudnuté heslo?', - 'label_help' => 'Zadajte emailovú adresu svojho účtu, aby ste dostali pokyny na reset hesla.', - 'button' => 'Obnoviť účet', - ], - - 'reset_password' => [ - 'button' => 'Resetovať a prihlásiť sa', - ], - - 'two_factor' => [ - 'label' => 'Dvoj-faktorový kód', - 'label_help' => 'Tento účet vyžaduje dvoj-faktorové overenie. Prosím zadajte kód vygenerovaný Vašim zariadením.', - 'checkpoint_failed' => 'Dvoj-faktorový kód bol nesprávny.', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + 'failed' => 'Tieto prihlasovacie údaje sa nezhodujú s našimi záznamami.', + 'failed-two-factor' => 'Nesprávny 2FA kód', + 'two-factor-code' => 'Dvojstupňový kód', + 'two-factor-hint' => 'Môžete použiť záložný kód, ak ste stratili prístup k svojmu zariadeniu.', + 'password' => 'Zadané heslo je nesprávne.', 'throttle' => 'Príliš veľa pokusov o prihlásnie. Prosím skúste to znovu o :seconds sekund.', - 'password_requirements' => 'Heslo musí mať aspoň 8 znakov a malo by byť výnimočné pre túto stránku.', '2fa_must_be_enabled' => 'Administrátor vyžaduje, aby bolo 2-faktorové overenie pre Váš účet zapnuté, aby ste mohli panel používať.', + ]; diff --git a/lang/sk/command/messages.php b/lang/sk/command/messages.php deleted file mode 100644 index 3d26554eac..0000000000 --- a/lang/sk/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Zadajte Používateľské meno, ID Používateľa, alebo Emailovú Adresu', - 'select_search_user' => 'ID používateľa, ktorého chcete odstrániť (Zadajte "0" pre opätovné vyhľadávanie)', - 'deleted' => 'Používateľ bol úspešne odstránený z Panela.', - 'confirm_delete' => 'Naozaj chcete odstrániť tohto používateľa z panela?', - 'no_users_found' => 'Pre zadaný hľadaný výraz sa nenašli žiadni používatelia.', - 'multiple_found' => 'Pre zadaného používateľa sa našlo viacero účtov. Používateľa nebolo možné odstrániť kvôli flagu --no-interaction.', - 'ask_admin' => 'Je tento používateľ správcom?', - 'ask_email' => 'Emailová Adresa', - 'ask_username' => 'Používateľské meno', - 'ask_name_first' => 'Krstné meno', - 'ask_name_last' => 'Priezvisko', - 'ask_password' => 'Heslo', - 'ask_password_tip' => 'Ak by ste chceli vytvoriť účet s náhodným heslom zaslaným používateľovi e-mailom, spustite tento príkaz znova (CTRL+C) a zadajte flag `--no-password`.', - 'ask_password_help' => 'Heslá musia mať dĺžku aspoň 8 znakov a musia obsahovať aspoň jedno veľké písmeno a číslo.', - '2fa_help_text' => [ - 'Tento príkaz zakáže 2-faktorové overenie pre používateľský účet, ak je povolené. Toto by sa malo používať iba ako príkaz na obnovenie účtu, ak je používateľ zablokovaný vo svojom účte.', - 'Ak to nie je to, čo ste chceli urobiť, stlačte CTRL+C na ukončenie tohto procesu.', - ], - '2fa_disabled' => '2-Faktorové overenie bolo pre :email zakázané.', - ], - 'schedule' => [ - 'output_line' => 'Odosiela sa práca pre prvú úlohu v `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Odstraňuje sa záložný súbor služby :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Žiadosť o opätovné vytvorenie ":name" (#:id) v node ":node" zlyhala s chybou: :message', - 'reinstall' => [ - 'failed' => 'Žiadosť o opätovnú inštaláciu ":name" (#:id) v node ":node" zlyhala s chybou: :message', - 'confirm' => 'Chystáte sa preinštalovať proti skupine serverov. Chcete pokračovať?', - ], - 'power' => [ - 'confirm' => 'Chystáte sa vykonať :akciu proti :count serverom. Chcete pokračovať?', - 'action_failed' => 'Žiadosť o akciu napájania pre ":name" (#:id) v node ":node" zlyhala s chybou: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (napr. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Používateľské meno', - 'ask_smtp_password' => 'SMTP Heslo', - 'ask_mailgun_domain' => 'Mailgun Doména', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Klúč', - 'ask_driver' => 'Ktorý ovládač by sa mal použiť na odosielanie e-mailov?', - 'ask_mail_from' => 'E-mailové adresy by mali pochádzať z', - 'ask_mail_name' => 'Meno, z ktorého sa majú e-maily zobrazovať', - 'ask_encryption' => 'Spôsob šifrovania, ktorý sa má použiť', - ], - ], -]; diff --git a/lang/sk/dashboard/account.php b/lang/sk/dashboard/account.php deleted file mode 100644 index 0b8ddb6c67..0000000000 --- a/lang/sk/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Aktualizujte svoj e-mail', - 'updated' => 'Vaša e-mailová adresa bola aktualizovaná.', - ], - 'password' => [ - 'title' => 'Zmeň si heslo', - 'requirements' => 'Vaše nové heslo by malo mať aspoň 8 znakov.', - 'updated' => 'Vaše heslo bolo aktualizované.', - ], - 'two_factor' => [ - 'button' => 'Nakonfigurujte 2-Faktorové overenie', - 'disabled' => 'Dvojfaktorová autentifikácia bola vo vašom účte zakázaná. Pri prihlásení sa vám už nebude zobrazovať výzva na zadanie tokenu.', - 'enabled' => 'Na vašom účte bola aktivovaná dvojfaktorová autentifikácia! Odteraz budete pri prihlasovaní musieť zadať kód vygenerovaný vaším zariadením.', - 'invalid' => 'Poskytnutý token bol neplatný.', - 'setup' => [ - 'title' => 'Nastavte dvojfaktorové overenie', - 'help' => 'Nemôžete naskenovať kód? Do svojej aplikácie zadajte nižšie uvedený kód:', - 'field' => 'Zadajte token', - ], - 'disable' => [ - 'title' => 'Zakázať dvojfaktorové overenie', - 'field' => 'Zadajte token', - ], - ], -]; diff --git a/lang/sk/dashboard/index.php b/lang/sk/dashboard/index.php deleted file mode 100644 index 5bd352a2c1..0000000000 --- a/lang/sk/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Hľadať servery...', - 'no_matches' => 'Nenašli sa žiadne servery zodpovedajúce zadaným kritériám vyhľadávania.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Pamäť', -]; diff --git a/lang/sk/exceptions.php b/lang/sk/exceptions.php index 56a7b8424c..ffb929a737 100644 --- a/lang/sk/exceptions.php +++ b/lang/sk/exceptions.php @@ -4,6 +4,7 @@ 'daemon_connection_failed' => 'Pri pokuse o komunikáciu s daemonom sa vyskytla chyba s kódom HTTP/:code. Táto chyba bola zaznamenaná.', 'node' => [ 'servers_attached' => 'Uzol nemôže mať priradené žiadne servery aby mohol byť vymazaný.', + 'error_connecting' => 'Chyba pri pripojení k :node', 'daemon_off_config_updated' => 'Konfigurácia daemonu bola aktualizovaná, no pri pokuse o automatickú aktualizáciu konfigurácie na daemonovi sa vyskytla chyba. Budete musieť manuálne aktualizovať konfiguračný súbor (config.yml) aby sa táto zmena aplikovala na daemon.', ], 'allocations' => [ @@ -43,6 +44,8 @@ 'has_nodes' => 'Nieje možné zmazať lokáciu, ktorá má priradené aktívne uzly.', ], 'users' => [ + 'is_self' => 'Nie je možné odstrániť svoj vlastný používateľský účet.', + 'has_servers' => 'Nie je možné odstrániť používateľa s aktívnymi servermi pripojenými k ich účtu. Pred pokračovaním odstráňte ich servery.', 'node_revocation_failed' => 'Nebolo možné odobrať kľúče na Uzol #:node. :error', ], 'deployment' => [ @@ -52,4 +55,10 @@ 'api' => [ 'resource_not_found' => 'Požadovaný zdroj neexistuje na tomto servery.', ], + 'mount' => [ + 'servers_attached' => 'Úložisko nemôže byť priradené k žiadnym serverom aby mohlo byť zmazané.', + ], + 'server' => [ + 'marked_as_failed' => 'Tento server ešte nedokončil svoj proces inštalácie, prosím, skúste to znovu.', + ], ]; diff --git a/lang/sk/pagination.php b/lang/sk/pagination.php deleted file mode 100644 index b2d590dd38..0000000000 --- a/lang/sk/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Predchádzajúce', - 'next' => 'Ďalšie »', -]; diff --git a/lang/sk/passwords.php b/lang/sk/passwords.php deleted file mode 100644 index 0fca72bf1f..0000000000 --- a/lang/sk/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Heslá musia mať aspoň 6 znakov a musia sa zhodovať s potvrdením.', - 'reset' => 'Vaše heslo bolo resetované!', - 'sent' => 'Link na resetovanie hesla Vám bol zaslaný na email!', - 'token' => 'Tento token na reset hesla je invalidný.', - 'user' => 'Používateľa s danou emailovou adresou sme nenašli.', -]; diff --git a/lang/sk/search.php b/lang/sk/search.php new file mode 100644 index 0000000000..07d54b0d64 --- /dev/null +++ b/lang/sk/search.php @@ -0,0 +1,9 @@ + 'Zadajte aspoň tri znaky aby ste začali vyhľadávať.', + 'term' => [ + 'label' => 'Hľadaný výraz', + 'description' => 'Zadajte meno servera, uuid, alebo alokáciu na začatie vyhľadávania.', + ], +]; diff --git a/lang/sk/server/console.php b/lang/sk/server/console.php new file mode 100644 index 0000000000..ecb214ba5c --- /dev/null +++ b/lang/sk/server/console.php @@ -0,0 +1,43 @@ + 'Konzola', + 'command' => 'Napíšte príkaz...', + 'command_blocked' => 'Server je offline...', + 'command_blocked_title' => 'Nieje možné zadať príkaz kým je server offline', + 'open_in_admin' => 'Otvoriť v Admine', + 'power_actions' => [ + 'start' => 'Štart', + 'stop' => 'Stop', + 'restart' => 'Reštart', + 'kill' => 'Ukončiť', + 'kill_tooltip' => 'Toto môže viesť k poškodeniu a/alebo strate dát!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Pamäť', + 'network' => 'Sieť', + 'disk' => 'Disk', + 'name' => 'Meno', + 'status' => 'Stav', + 'address' => 'Adresa', + 'unavailable' => 'Nedostupné', + ], + 'status' => [ + 'created' => 'Vytvorené', + 'starting' => 'Štartuje sa', + 'running' => 'Beží', + 'restarting' => 'Reštartuje', + 'exited' => 'Ukončené', + 'paused' => 'Pozastavený', + 'dead' => 'Mŕtvy', + 'removing' => 'Odstraňuje sa', + 'stopping' => 'Zastavuje', + 'offline' => 'Offline', + 'missing' => '', + ], + 'websocket_error' => [ + 'title' => 'Nepodarilo sa pripojiť na websocket!', + 'body' => 'Skontrolujte konzolu prehliadača pre viac detailov.', + ], +]; diff --git a/lang/sk/server/dashboard.php b/lang/sk/server/dashboard.php new file mode 100644 index 0000000000..9d3197c8fc --- /dev/null +++ b/lang/sk/server/dashboard.php @@ -0,0 +1,28 @@ + 'Servery', + 'list' => 'Zoznam serverov', + 'tabs' => [ + 'my' => 'Moje servery', + 'other' => 'Servery iných', + 'all' => 'Všetky servery', + ], + 'empty_own' => 'Nevlastníte žiadne servery!', + 'empty_other' => 'Nemáte prístup k žiadnym serverom!', + + 'status' => 'Status', + 'server' => 'Server', + 'resources' => 'Zdroje', + 'usage_limit' => 'Limit využitia: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Pamäť', + 'disk' => 'Disk', + 'network' => 'Sieť', + 'none' => 'Žiadne', + 'loading' => 'Načítava sa...', + + 'power_actions' => 'Možnosti napájania', + 'power_action_sent' => ':action odoslané na :name', +]; diff --git a/lang/sk/server/user.php b/lang/sk/server/user.php new file mode 100644 index 0000000000..64d0820e24 --- /dev/null +++ b/lang/sk/server/user.php @@ -0,0 +1,77 @@ + 'Používatelia', + 'username' => 'Používateľské meno', + 'email' => 'Email', + 'assign_all' => 'Priradiť všetko', + 'invite_user' => 'Pozvať používateľa', + 'action' => 'Pozvať', + 'remove' => 'Odstrániť používateľa', + 'edit' => 'Upraviť používateľa', + 'editing' => 'Upravuje sa :user', + 'delete' => 'Odstrániť používateľa', + 'notification_add' => 'Používateľ pozvaný!', + 'notification_edit' => 'Používateľ aktualizovaný!', + 'notification_delete' => 'Používateľ odstránený!', + 'notification_failed' => 'Pozvanie používateľa zlyhalo!', + 'permissions' => [ + 'title' => 'Oprávnenia', + 'activity_desc' => 'Oprávnenia, ktoré určujú prístup používateľa k záznamom aktivity servera.', + 'startup_desc' => 'Oprávnenia, ktoré určujú možnosť používateľa zobraziť počiatočné parametre tohto servera.', + 'settings_desc' => 'Oprávnenia, ktoré určujú možnosť používateľa upravovať nastavenia tohto servera.', + 'control_desc' => 'Oprávnenia, ktoré určujú možnosť používateľa ovládať napájanie servera alebo posielať príkazy.', + 'user_desc' => 'Oprávnenia, ktoré umožňujú používateľovi spravovať ostatných podužívateľov na serveri. +Nikdy nebudú môcť upravovať svoj vlastný účet ani priraďovať oprávnenia, ktoré sami nemajú.', + 'file_desc' => 'Oprávnenia, ktoré určujú možnosť používateľa upravovať súborový systém tohto servera.', + 'allocation_desc' => 'Oprávnenia, ktoré určujú možnosť používateľa upravovať alokácie portov pre tento server.', + 'database_desc' => 'Oprávnenia, ktoré určujú prístup používateľa k správe databáz tohto servera.', + 'backup_desc' => 'Oprávnenia, ktoré určujú schopnosť používateľa vytvárať a spravovať zálohy servera.', + 'schedule_desc' => 'Oprávnenia, ktoré určujú prístup používateľa k správe harmonogramu tohto servera.', + 'startup_read' => 'Umožňuje používateľovi zobraziť počiatočné premenné servera.', + 'startup_update' => 'Umožňuje používateľovi upravovať počiatočné premenné servera.', + 'startup_docker_image' => 'Umožňuje používateľovi upraviť Docker image použitý pri spustení servera.', + 'settings_reinstall' => 'Umožňuje používateľovi spustiť preinštalovanie tohto servera.', + 'settings_rename' => 'Umožňuje používateľovi premenovať tento server.', + 'settings_description' => 'Umožňuje používateľovi zmeniť popis tohto servera.', + 'activity_read' => 'Umožňuje používateľovi zobraziť záznamy aktivity servera.', + 'websocket_connect' => 'Umožňuje používateľovi prístup k websocketu tohto servera.', + 'control_console' => 'Umožňuje používateľovi odosielať dáta do konzoly servera.', + 'control_start' => 'Umožňuje používateľovi spustiť inštanciu servera.', + 'control_stop' => 'Umožňuje používateľovi zastaviť inštanciu servera.', + 'control_restart' => 'Umožňuje používateľovi reštartovať inštanciu servera.', + 'control_kill' => 'Umožňuje používateľovi ukončiť inštanciu servera.', + 'user_create' => 'Umožňuje používateľovi vytvárať nové používateľské účty pre server.', + 'user_read' => 'Umožňuje používateľovi zobraziť používateľov priradených k tomuto serveru.', + 'user_update' => 'Umožňuje používateľovi upravovať iných používateľov priradených k tomuto serveru.', + 'user_delete' => 'Umožňuje používateľovi odstrániť iných používateľov priradených k tomuto serveru.', + 'file_create' => 'Umožňuje používateľovi vytvárať nové súbory a priečinky.', + 'file_read' => 'Umožňuje používateľovi zobraziť obsah priečinka, ale nie obsah alebo sťahovanie súborov.', + 'file_read_content' => 'Umožňuje používateľovi zobraziť obsah daného súboru. To taktiež umožní sťahovanie súborov.', + 'file_update' => 'Umožňuje používateľovi upravovať súbory a priečinky priradené k serveru.', + 'file_delete' => 'Umožňuje používateľovi mazať súbory a priečinky.', + 'file_archive' => 'Umožňuje používateľovi vytvárať archívy súborov a rozbaľovať existujúce archívy.', + 'file_sftp' => 'Umožňuje používateľovi vykonávať vyššie uvedené operácie so súbormi pomocou SFTP klienta.', + 'allocation_read' => 'Umožňuje používateľovi zobraziť všetky alokácie aktuálne priradené k tomuto serveru. +Používatelia s akoukoľvek úrovňou prístupu k tomuto serveru môžu vždy zobraziť primárnu alokáciu.', + 'allocation_update' => 'Umožňuje používateľovi zmeniť primárnu alokáciu servera a pridať poznámky ku každej alokácii.', + 'allocation_delete' => 'Umožňuje používateľovi odstrániť alokáciu zo servera.', + 'allocation_create' => 'Umožňuje používateľovi priradiť ďalšie alokácie k serveru.', + 'database_create' => 'Umožňuje používateľovi vytvoriť novú databázu pre server.', + 'database_read' => 'Umožňuje používateľovi zobraziť databázy servera.', + 'database_update' => 'Umožňuje používateľovi vykonávať úpravy v databáze. Ak používateľ nemá povolenie "Zobraziť heslo", nebude môcť heslo zmeniť.', + 'database_delete' => 'Umožňuje používateľovi vymazať inštanciu databázy.', + 'database_view_password' => 'Umožňuje používateľovi zobraziť heslo databázy v systéme.', + 'schedule_create' => 'Umožňuje používateľovi vytvoriť nový časovač pre server.', + 'schedule_read' => 'Umožňuje používateľovi zobraziť časovače pre server.', + 'schedule_update' => 'Umožňuje používateľovi vykonávať úpravy existujúceho časovača.', + 'schedule_delete' => 'Umožňuje používateľovi odstrániť časovač pre server.', + 'backup_create' => 'Umožňuje používateľovi vytvárať nové zálohy pre tento server.', + 'backup_read' => 'Umožňuje používateľovi zobraziť všetky existujúce zálohy pre tento server.', + 'backup_delete' => 'Umožňuje používateľovi odstrániť zálohy zo systému.', + 'backup_download' => 'Umožňuje používateľovi stiahnuť zálohu servera. +Nebezpečenstvo: toto umožňuje používateľovi prístup ku všetkým súborom servera v zálohe.', + 'backup_restore' => 'Umožňuje používateľovi obnoviť zálohu servera. +Nebezpečenstvo: toto umožňuje používateľovi počas procesu vymazať všetky súbory servera.', + ], +]; diff --git a/lang/sk/server/users.php b/lang/sk/server/users.php deleted file mode 100644 index a476183f1f..0000000000 --- a/lang/sk/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Umožňuje prístup k websocketu pre tento server.', - 'control_console' => 'Umožňuje používateľovi odosielať údaje do konzoly servera.', - 'control_start' => 'Umožňuje používateľovi spustiť server.', - 'control_stop' => 'Umožňuje používateľovi zastaviť server.', - 'control_restart' => 'Umožňuje používateľovi reštartovať server.', - 'control_kill' => 'Umožňuje používateľovi zabiť server.', - 'user_create' => 'Umožňuje používateľovi vytvárať nové používateľské účty pre server.', - 'user_read' => 'Umožňuje používateľovi zobraziť používateľov priradených k tomuto serveru.', - 'user_update' => 'Umožňuje používateľovi upravovať ostatných používateľov priradených k tomuto serveru.', - 'user_delete' => 'Umožňuje používateľovi odstrániť ostatných používateľov priradených k tomuto serveru.', - 'file_create' => 'Umožňuje používateľovi vytvárať nové súbory a adresáre.', - 'file_read' => 'Umožňuje používateľovi vidieť súbory a priečinky spojené s touto inštanciou servera, ako aj zobraziť ich obsah.', - 'file_update' => 'Umožňuje používateľovi aktualizovať súbory a priečinky priradené k serveru.', - 'file_delete' => 'Umožňuje užívateľovi mazať súbory a adresáre.', - 'file_archive' => 'Umožňuje používateľovi vytvárať archívy súborov a dekomprimovať existujúce archívy.', - 'file_sftp' => 'Umožňuje používateľovi vykonávať vyššie uvedené akcie so súbormi pomocou klienta SFTP.', - 'allocation_read' => 'Umožňuje prístup k stránkam správy prideľovania serverov.', - 'allocation_update' => 'Umožňuje používateľovi vykonávať úpravy pridelení servera.', - 'database_create' => 'Umožňuje používateľovi vytvoriť novú databázu pre server.', - 'database_read' => 'Umožňuje používateľovi prezerať databázy servera.', - 'database_update' => 'Umožňuje používateľovi vykonávať úpravy v databáze. Ak používateľ nemá povolenie "Zobraziť heslo", nebude môcť heslo zmeniť.', - 'database_delete' => 'Umožňuje používateľovi vymazať inštanciu databázy.', - 'database_view_password' => 'Umožňuje používateľovi zobraziť heslo databázy v systéme.', - 'schedule_create' => 'Umožňuje používateľovi vytvoriť nový časovač pre server.', - 'schedule_read' => 'Umožňuje používateľovi zobraziť časovače pre server.', - 'schedule_update' => 'Umožňuje používateľovi vykonávať úpravy existujúceho časovača.', - 'schedule_delete' => 'Umožňuje používateľovi odstrániť časovač pre server.', - ], -]; diff --git a/lang/sk/strings.php b/lang/sk/strings.php deleted file mode 100644 index 63706f127b..0000000000 --- a/lang/sk/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Emailová adresa', - 'user_identifier' => 'Používateľské meno alebo Email', - 'password' => 'Heslo', - 'new_password' => 'Nové heslo', - 'confirm_password' => 'Potvrdenie nového hesla', - 'login' => 'Prihlásenie', - 'home' => 'Domov', - 'servers' => 'Servery', - 'id' => 'ID', - 'name' => 'Meno', - 'node' => 'Uzol', - 'connection' => 'Pripojenie', - 'memory' => 'Pamäť', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Hľadať', - 'suspended' => 'Pozastavené', - 'account' => 'Účet', - 'security' => 'Bezpečnosť', - 'ip' => 'IP Adresa', - 'last_activity' => 'Posledná Aktivita', - 'revoke' => 'Odvolať', - '2fa_token' => 'Autentifikačný Token', - 'submit' => 'Predložiť', - 'close' => 'Zatvoriť', - 'settings' => 'Nastavenia', - 'configuration' => 'Konfigurácia', - 'sftp' => 'SFTP', - 'databases' => 'Databázy', - 'memo' => 'Memo', - 'created' => 'Vytvorené', - 'expires' => 'Vyprší', - 'public_key' => 'Token', - 'api_access' => 'Api prístup', - 'never' => 'nikdy', - 'sign_out' => 'Odhlásiť sa', - 'admin_control' => 'Správcovská Kontrola', - 'required' => 'Požadovaný', - 'port' => 'Port', - 'username' => 'Používaťelské Meno', - 'database' => 'Databáza', - 'new' => 'Nové', - 'danger' => 'Nebezpečenstvo', - 'create' => 'Vytvoriť', - 'select_all' => 'Vybrať Všetky', - 'select_none' => 'Nevybrať Nič', - 'alias' => 'Alias', - 'primary' => 'Hlavný', - 'make_primary' => 'Vytvoriť Hlavným', - 'none' => 'Žiadne', - 'cancel' => 'Zrušiť', - 'created_at' => 'Vytvorené o', - 'action' => 'Akcia', - 'data' => 'Dáta', - 'queued' => 'Vo fronte', - 'last_run' => 'Posledne Spustený', - 'next_run' => 'Ďalšie Spustenie', - 'not_run_yet' => 'Ešte Nebolo Pustené', - 'yes' => 'Áno', - 'no' => 'Nie', - 'delete' => 'Vymazať', - '2fa' => '2FA', - 'logout' => 'Odhlásiť sa', - 'admin_cp' => 'Ovládací Panel Správcu', - 'optional' => 'Voliteľné', - 'read_only' => 'Iba na čítanie', - 'relation' => 'Súvislosť', - 'owner' => 'Majiteľ', - 'admin' => 'Admin', - 'subuser' => 'Podpoužívateľ', - 'captcha_invalid' => 'Overenie captcha je nesprávne.', - 'tasks' => 'Úlohy', - 'seconds' => 'Sekundy', - 'minutes' => 'Minúty', - 'under_maintenance' => 'Pod údržbou', - 'days' => [ - 'sun' => 'Nedeľa', - 'mon' => 'Pondelok', - 'tues' => 'Utorok', - 'wed' => 'Streda', - 'thurs' => 'Štvrtok', - 'fri' => 'Piatok', - 'sat' => 'Sobota', - ], - 'last_used' => 'Naposledy použité', - 'enable' => 'Zapnúť', - 'disable' => 'Vypnúť', - 'save' => 'Uložiť', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/sk/validation.php b/lang/sk/validation.php index 185e74cb42..d47bda8f1f 100644 --- a/lang/sk/validation.php +++ b/lang/sk/validation.php @@ -28,7 +28,7 @@ 'string' => ':attribute musí byť medzi :min a :max znakmi.', 'array' => ':attribute musí byť medzi :min a :max položkami.', ], - 'boolean' => ':attribute musí byť true alebo false.', + 'confirmed' => ':attribute sa nezhoduje.', 'date' => ':attribute nie je platný dátum.', 'date_format' => ':attribute nezodpovedá formátu :formát.', @@ -36,13 +36,13 @@ 'digits' => ':attribute musí byť :digits číslice.', 'digits_between' => ':attribute musí byť medzi :min a :max číslicami.', 'dimensions' => ':attribute má neplatné rozmery obrázka.', - 'distinct' => ':attribute má duplicitnú hodnotu.', + 'email' => ':attribute musí byť platná e-mailová adresa.', - 'exists' => 'Vybraný :attribute je neplatný.', + 'file' => ':attribute musí byť súbor.', 'filled' => ':attribute je povinné.', 'image' => ':attribute musí byť obrázok.', - 'in' => 'Vybraný :attribute je neplatný.', + 'in_array' => ':attribute pole neexistuje v :other.', 'integer' => ':attribute musí byť celé číslo.', 'ip' => ':attribute musí byť platná IP adresa.', @@ -61,17 +61,13 @@ 'string' => ':attribute musí mať aspoň :min znakov.', 'array' => ':attribute musí mať aspoň :min položiek.', ], - 'not_in' => 'Vybratý atribút :attribute je neplatný.', + 'numeric' => ':attribute musí byť číslo.', - 'present' => ':attribute musí byť prítomné.', + 'regex' => ':attribute formát je neplatný.', - 'required' => ':attribute je povinné.', - 'required_if' => ':attribute je povinné, keď :other je :value.', - 'required_unless' => ':attribute je povinné, pokiaľ :other nie je v :values.', - 'required_with' => ':attribute je povinné, keď je prítomný :values.', + 'required_with_all' => ':attribute je povinné, keď je prítomný :values.', - 'required_without' => ':attribute je povinné, keď :values ​​nie je prítomný.', - 'required_without_all' => ':attribute je povinné, ak nie je prítomná žiadna z hodnôt :values.', + 'same' => ':attribute a :other sa musia zhodovať.', 'size' => [ 'numeric' => ':attribute musí byť :size.', @@ -81,8 +77,7 @@ ], 'string' => ':attribute musí byť string.', 'timezone' => ':attribute musí byť platná zóna.', - 'unique' => ':atribút už bol použitý.', - 'uploaded' => ':attribute sa nepodarilo uploadnuť.', + 'url' => ':attribute formát je neplatný.', /* diff --git a/lang/sl/activity.php b/lang/sl/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/sl/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/sl/admin/eggs.php b/lang/sl/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/sl/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/sl/admin/node.php b/lang/sl/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/sl/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/sl/admin/server.php b/lang/sl/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/sl/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/sl/admin/user.php b/lang/sl/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/sl/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/sl/auth.php b/lang/sl/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/sl/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/sl/command/messages.php b/lang/sl/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/sl/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/sl/dashboard/account.php b/lang/sl/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/sl/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/sl/dashboard/index.php b/lang/sl/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/sl/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/sl/exceptions.php b/lang/sl/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/sl/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/sl/pagination.php b/lang/sl/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/sl/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/sl/passwords.php b/lang/sl/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/sl/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/sl/server/users.php b/lang/sl/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/sl/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/sl/strings.php b/lang/sl/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/sl/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/sl/validation.php b/lang/sl/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/sl/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/sr/activity.php b/lang/sr/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/sr/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/sr/admin/databasehost.php b/lang/sr/admin/databasehost.php new file mode 100644 index 0000000000..73910a52bd --- /dev/null +++ b/lang/sr/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Hostovi baze podataka', + 'model_label' => 'Host baze podataka', + 'model_label_plural' => 'Hostovi baza podataka', + 'table' => [ + 'database' => 'Baza podataka', + 'name' => 'Ime', + 'host' => 'Host', + 'port' => 'Port', + 'name_helper' => 'Ostavi prazno kako bi samo generisalo ime.', + 'username' => 'Korisničko ime', + 'password' => 'Šifra', + 'remote' => 'Konekcija sa', + 'remote_helper' => 'Odakle bi trebalo da budu dozvoljene konekcije. Ostavite prazno da biste dozvolili konekcije sa bilo kog mesta.', + 'max_connections' => 'Maksimalne konekcije', + 'created_at' => 'Kreirano u', + 'connection_string' => 'JDBC konekciona stringa.', + ], + 'error' => 'Greška prilikom povezivanja sa hostom', + 'host' => 'Host', + 'host_help' => 'IP adresa ili Domen koje treba koristiti prilikom pokušaja povezivanja sa ovim MySQL hostom sa ovog panela za kreiranje novih baza podataka.', + 'port' => 'Port', + 'port_help' => 'Port na kojem MySQL radi za ovaj host.', + 'max_database' => 'Maksimalan broj baza podataka', + 'max_databases_help' => 'Maksimalni broj baza podataka koje mogu biti kreirane na ovom hostu. Ako je limit dostignut, nove baze podataka neće moći da budu kreirane na ovom hostu. Prazno znači neograničeno.', + 'display_name' => 'Prikazano ime', + 'display_name_help' => 'Kratak identifikator koji se koristi za razlikovanje ovog hosta od drugih. Mora biti između 1 i 60 karaktera, na primer, srbija.beograd.lvl3.', + 'username' => 'Korisničko ime', + 'username_help' => 'Korisničko ime naloga koji ima dovoljno dozvola za kreiranje novih korisnika i baza podataka na sistemu.', + 'password' => 'Šifra', + 'password_help' => 'Lozinka za korisnika baze podataka.', + 'linked_nodes' => 'Povezani Čvorovi', + 'linked_nodes_help' => 'Ova postavka se podrazumevano primenjuje na ovaj host baze podataka prilikom dodavanja baze podataka na server na odabranom Čvoru.', + 'connection_error' => 'Greška pri povezivanju na database host', + 'no_database_hosts' => 'Nema hostova baza podataka', + 'no_nodes' => 'Nema Čvorova', + 'delete_help' => 'Database Host Ima Baze Podataka', + 'unlimited' => 'Neograničeno', + 'anywhere' => 'Bilo gde', + + 'rotate' => 'Rotiraj', + 'rotate_password' => 'Rotiraj Lozinku', + 'rotated' => 'Šifra je rotirana', + 'rotate_error' => 'Rotiranje šifre nije uspelo', + 'databases' => 'Baze podataka', + + 'setup' => [ + 'preparations' => 'Pripreme', + 'database_setup' => 'Podešavanje baze podataka', + 'panel_setup' => 'Podešavanje panela', + + 'note' => 'Trenutno su podržane samo MySQL/MariaDB baze podataka za hostovanje baze podataka!', + 'different_server' => 'Da li panel i baza podataka nisu na istom serveru?', + + 'database_user' => 'Korisnik baze podataka', + 'cli_login' => 'Koristi mysql -u root -p za pristup MySQL komandnoj liniji.', + 'command_create_user' => 'Komanda za kreiranje korisnika', + 'command_assign_permissions' => 'Komanda za dodelu dozvola', + 'cli_exit' => 'Za izlazak iz MySQL komandne linije pokreni exit.', + 'external_access' => 'Spoljni pristup', + 'allow_external_access' => ' +

Verovatno ćete morati da omogućite spoljni pristup ovoj MySQL instanci kako biste omogućili serverima da se povežu na nju.

+
+

Za to, otvorite my.cnf, čija lokacija zavisi od vašeg operativnog sistema i načina na koji je MySQL instaliran. Možete ukucati find /etc -iname my.cnf da biste je pronašli.

+
+

Otvorite my.cnf, dodajte sledeći tekst na kraj fajla i sačuvajte ga:
+ [mysqld]
bind-address=0.0.0.0

+
+

Restartujte MySQL/MariaDB da biste primenili ove promene. Ovo će zameniti podrazumevanu MySQL konfiguraciju, koja po defaultu prihvata samo zahteve sa localhost-a. Ažuriranjem ove postavke omogućite povezivanje na svim interfejsima, pa tako i spoljne veze. Pobrinite se da dozvolite MySQL port (podrazumevano 3306) u vašem firewall-u.

', + ], +]; diff --git a/lang/sr/admin/eggs.php b/lang/sr/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/sr/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/sr/admin/health.php b/lang/sr/admin/health.php new file mode 100644 index 0000000000..e53b7c2d47 --- /dev/null +++ b/lang/sr/admin/health.php @@ -0,0 +1,60 @@ + 'Status', + 'results_refreshed' => 'Rezultati provere statusa ažurirani', + 'checked' => 'Provereni rezultati od :time', + 'refresh' => 'Osveži', + 'results' => [ + 'cache' => [ + 'label' => 'Keš', + 'ok' => 'U redu', + 'failed_retrieve' => 'Nije bilo moguće postaviti ili dohvatiti vrednost keš memorije aplikacije.', + 'failed' => 'Došlo je do izuzetka sa keš memorijom aplikacije: :error', + ], + 'database' => [ + 'label' => 'Baza podataka', + 'ok' => 'U redu', + 'failed' => 'Nije bilo moguće povezati se sa bazom podataka: :error', + ], + 'debugmode' => [ + 'label' => 'Režim za otklanjanje grešaka', + 'ok' => 'Režim za otklanjanje grešaka je isključen', + 'failed' => 'Režim za otklanjanje grešaka je očekivan da bude :expectes, ali zapravo je :actual', + ], + 'environment' => [ + 'label' => 'Okruženje', + 'ok' => 'U redu, postavljeno na :actual', + 'failed' => 'Okruženje je postavljeno na :actual, očekivano :expected', + ], + 'nodeversions' => [ + 'label' => 'Verzije Čvora', + 'ok' => 'Čvorovi su ažurirani', + 'failed' => ':outdated/:all Čvorovi su zastareli', + 'no_nodes_created' => 'Nema kreiranih čvorova', + 'no_nodes' => 'Nema čvorova', + 'all_up_to_date' => 'Sve je ažurirano', + 'outdated' => ':outdated/:all zastarelo', + ], + 'panelversion' => [ + 'label' => 'Panel verzija', + 'ok' => 'Panel je ažuriran', + 'failed' => 'Instalirana verzija je :currentVersion, ali najnovija verzija je :latestVersion', + 'up_to_date' => 'Ažurirano', + 'outdated' => 'Zastarelo', + ], + 'schedule' => [ + 'label' => 'Raspored', + 'ok' => 'U redu', + 'failed_last_ran' => 'Poslednje izvršenje rasporeda bilo je pre više od :time minuta', + 'failed_not_ran' => 'Raspored još nije izvršen.', + ], + 'useddiskspace' => [ + 'label' => 'Prostor na disku', + ], + ], + 'checks' => [ + 'successful' => 'Uspešno', + 'failed' => 'Neuspešno', + ], +]; diff --git a/lang/sr/admin/mount.php b/lang/sr/admin/mount.php new file mode 100644 index 0000000000..7757d7ae80 --- /dev/null +++ b/lang/sr/admin/mount.php @@ -0,0 +1,30 @@ + 'Montiranje', + 'model_label' => 'Montiranje', + 'model_label_plural' => 'Montiranja', + 'name' => 'Ime', + 'name_help' => 'Jedinstveno ime koje se koristi za odvajanje ovog montiranja od drugog.', + 'source' => 'Izvor', + 'source_help' => 'Putanja fajla na host sistemu koja se montira u kontejner.', + 'target' => 'Cilj', + 'target_help' => 'Mesto gde će montiranje biti dostupno unutar kontejnera.', + 'read_only' => 'Samo za čitanje?', + 'read_only_help' => 'Da li je montiranje samo za čitanje unutar kontejnera?', + 'description' => 'Opis', + 'description_help' => 'Duži opis za ovo Montiranje', + 'no_mounts' => 'Nema Montiranja', + 'eggs' => 'Jaja', + 'nodes' => 'Čvorovi', + 'toggles' => [ + 'writable' => 'Za pisanje', + 'read_only' => 'Samo za čitanje', + ], + 'table' => [ + 'name' => 'Ime', + 'all_eggs' => 'Sva Jaja', + 'all_nodes' => 'Svi Čvorovi', + 'read_only' => 'Samo za čitanje', + ], +]; diff --git a/lang/sr/admin/node.php b/lang/sr/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/sr/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/sr/admin/role.php b/lang/sr/admin/role.php new file mode 100644 index 0000000000..ec8676fd75 --- /dev/null +++ b/lang/sr/admin/role.php @@ -0,0 +1,17 @@ + 'Uloge', + 'model_label' => 'Uloga', + 'model_label_plural' => 'Uloge', + 'no_roles' => 'Nema uloga', + 'name' => 'Ime uloge', + 'permissions' => 'Dozvole', + 'in_use' => 'Koristi se', + 'all' => 'Sve', + 'root_admin' => 'Uloga :role ima sve dozvole.', + 'root_admin_delete' => 'Ne možete obrisati Root Administratora', + 'users' => 'Korisnici', + 'nodes' => 'Čvorovi', + 'nodes_hint' => 'Ostavi prazno da bi ste omogućili pristup svim čvorovima.', +]; diff --git a/lang/sr/admin/server.php b/lang/sr/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/sr/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/sr/admin/user.php b/lang/sr/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/sr/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/sr/auth.php b/lang/sr/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/sr/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/sr/command/messages.php b/lang/sr/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/sr/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/sr/dashboard/account.php b/lang/sr/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/sr/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/sr/dashboard/index.php b/lang/sr/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/sr/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/sr/exceptions.php b/lang/sr/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/sr/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/sr/pagination.php b/lang/sr/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/sr/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/sr/passwords.php b/lang/sr/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/sr/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/sr/search.php b/lang/sr/search.php new file mode 100644 index 0000000000..273cae472c --- /dev/null +++ b/lang/sr/search.php @@ -0,0 +1,9 @@ + 'Unesite najmanje tri karaktera da biste započeli pretragu.', + 'term' => [ + 'label' => 'Pojam za pretragu', + 'description' => 'Unesite naziv servera, UUID ili alokaciju da biste započeli pretragu.', + ], +]; diff --git a/lang/sr/server/users.php b/lang/sr/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/sr/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/sr/strings.php b/lang/sr/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/sr/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/sr/validation.php b/lang/sr/validation.php index 9cccf35080..d98b99dc79 100644 --- a/lang/sr/validation.php +++ b/lang/sr/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => 'Polje :attribute mora biti prihvaćeno.', + 'active_url' => 'Polje :attribute nije validan URL.', + 'after' => 'Polje :attribute mora biti datum nakon :date.', + 'after_or_equal' => 'Polje :attribute mora biti datum nakon ili jednak :date.', + 'alpha' => 'Polje :attribute može sadržati samo slova.', + 'alpha_dash' => 'Polje :attribute može sadržati samo slova, brojeve i crte.', + 'alpha_num' => 'Polje :attribute može sadržati samo slova i brojeve.', + 'array' => 'Polje :attribute mora biti niz.', + 'before' => 'Polje :attribute mora biti datum pre :date.', + 'before_or_equal' => 'Polje :attribute mora biti datum pre ili jednak :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => 'Polje :attribute mora biti između :min i :max.', + 'file' => 'Polje :attribute mora biti između :min i :max kilobajta.', + 'string' => 'Polje :attribute mora biti između :min i :max karaktera.', + 'array' => 'Polje :attribute mora imati između :min i :max stavki.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => 'Potvrda za polje :attribute se ne poklapa.', + 'date' => 'Polje :attribute nije validan datum.', + 'date_format' => 'Polje :attribute se ne poklapa sa formatom :format.', + 'different' => 'Polje :attribute i :other moraju biti različiti.', + 'digits' => ':attribute mora imati :digits cifara.', + 'digits_between' => ':attribute mora biti između :min i :max cifara.', + 'dimensions' => ':attribute ima nevažeće dimenzije slike.', + + 'email' => ':attribute mora biti važeća email adresa.', + + 'file' => ':attribute mora biti fajl.', + 'filled' => 'Polje :attribute je obavezno.', + 'image' => ':attribute mora biti slika.', + + 'in_array' => 'Polje :attribute ne postoji u :other.', + 'integer' => ':attribute mora biti ceo broj. :attribute mora biti ceo broj.', + 'ip' => ':attribute mora biti važeća IP adresa.', + 'json' => ':attribute mora biti važeći JSON string.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute ne može biti veći od :max.', + 'file' => ':attribute ne može biti veći od :max kilobajta.', + 'string' => ':attribute ne može imati više od :max karaktera.', + 'array' => ':attribute ne može imati više od :max stavki.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute mora biti fajl tipa: :values.', + 'mimetypes' => ':attribute mora biti fajl tipa: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute mora biti najmanje :min.', + 'file' => ':attribute mora imati najmanje :min kilobajta.', + 'string' => ':attribute mora imati najmanje :min karaktera.', + 'array' => ':attribute mora imati najmanje :min stavki.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute mora biti broj.', + + 'regex' => 'Format polja :attribute je nevažeći.', + + 'required_with_all' => 'Polje :attribute je obavezno kada je vrednost :values prisutna.', + + 'same' => ':attribute i :other moraju da se poklapaju.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute mora biti :size.', + 'file' => ':attribute mora imati :size kilobajta.', + 'string' => ':attribute mora imati :size karaktera.', + 'array' => ':attribute mora sadržati :size stavki.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute mora biti tekstualni niz.', + 'timezone' => ':attribute mora biti validna zona.', + + 'url' => 'Format za :attribute je nevažeći.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => ':env varijabla', + 'invalid_password' => 'Šifra koju ste uneli nije važeća za ovaj nalog.', ], ]; diff --git a/lang/sv/activity.php b/lang/sv/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/sv/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/sv/admin/apikey.php b/lang/sv/admin/apikey.php new file mode 100644 index 0000000000..be7c6c75c4 --- /dev/null +++ b/lang/sv/admin/apikey.php @@ -0,0 +1,27 @@ + 'Applikationens API-nycklar', + 'empty' => 'Inga API-nycklar', + 'whitelist' => 'Vitlistade IPv4-adresser', + 'whitelist_help' => 'API nycklar kan begränsas till att endast fungera från specifika IPv4-adresser. Ange varje adress på en ny rad.', + 'whitelist_placeholder' => 'Exempel: 127.0.0.1 eller 192.168.1.1', + 'description' => 'Beskrivning', + 'description_help' => 'En kort beskrivning av vad denna nyckel är till för.', + 'nav_title' => 'API-nycklar', + 'model_label' => 'Applikationens API-nyckel', + 'model_label_plural' => 'Applikationens API-nycklar', + 'table' => [ + 'key' => 'Nyckel', + 'description' => 'Beskrivning', + 'last_used' => 'Senast använd', + 'created' => 'Skapad', + 'created_by' => 'Skapad av', + 'never_used' => 'Aldrig använd', + ], + 'permissions' => [ + 'none' => 'Inga', + 'read' => 'Läsa', + 'read_write' => 'Läsa och skriva', + ], +]; diff --git a/lang/sv/admin/dashboard.php b/lang/sv/admin/dashboard.php new file mode 100644 index 0000000000..79d7e33fe5 --- /dev/null +++ b/lang/sv/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Välkommen till Pelican!', + 'version' => 'Version: :version', + 'advanced' => 'Avancerat', + 'server' => 'Server', + 'user' => 'Användare', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Information till Utvecklare', + 'content' => 'Tack för att du provar utvecklingsversionen!', + 'extra_note' => 'Ifall du stöter på några problem, vänligen rapportera dem på GitHub.', + 'button_issues' => 'Skapa ärende', + 'button_features' => 'Diskutera funktioner', + ], + 'intro-update-available' => [ + 'heading' => 'Uppdatering tillgänglig', + 'content' => ':latestVersion finns nu tillgänglig! Läs vår dokumentation för att uppdatera din panel.', + 'button_changelog' => 'Vad är nytt?', + ], + 'intro-no-update' => [ + 'heading' => 'Din Panel är uppdaterad', + 'content' => 'Du använder för närvarande :version. Din panel är uppdaterad!', + ], + 'intro-first-node' => [ + 'heading' => 'Inga noder upptäckta', + 'content' => 'Det verkar som att du inte har några noder uppsatta än, men oroa dig inte - du kan klicka på åtgärdsknappen för att skapa din första!', + 'extra_note' => 'Om du stöter på några problem, vänligen rapportera dem på GitHub.', + 'button_label' => 'Skapa första noden i Pelican', + ], + 'intro-support' => [ + 'heading' => 'Stöd Pelican', + 'content' => 'Tack för att du använder Pelican, detta kunde endast uppnås genom stödet från dig, våra bidragsgivare och resten av våra supportrar!', + 'extra_note' => 'Vi uppskattar allt stöd från alla.', + 'button_translate' => 'Hjälp till med att översätta', + 'button_donate' => 'Donera direkt', + ], + 'intro-help' => [ + 'heading' => 'Behöver du hjälp?', + 'content' => 'Kolla i dokumentationen först! Om du fortfarande behöver hjälp, kom över till vår Discord-server!', + 'button_docs' => 'Läs dokumentationen', + ], + ], +]; diff --git a/lang/sv/admin/eggs.php b/lang/sv/admin/eggs.php deleted file mode 100644 index a6912c819a..0000000000 --- a/lang/sv/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Lyckades importera detta ägg och dess associerade variabler.', - 'updated_via_import' => 'Detta ägg har uppdaterats med den fil som tillhandahållits.', - 'deleted' => 'Lyckades radera det begärda ägget från panelen.', - 'updated' => 'Äggkonfigurationen har uppdaterats framgångsrikt.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/sv/admin/health.php b/lang/sv/admin/health.php new file mode 100644 index 0000000000..98df7561c6 --- /dev/null +++ b/lang/sv/admin/health.php @@ -0,0 +1,60 @@ + 'Hälsa', + 'results_refreshed' => 'Hälsokontrollens resultat är uppdaterade', + 'checked' => 'Kontrollerade resultat från :time', + 'refresh' => 'Uppdatera', + 'results' => [ + 'cache' => [ + 'label' => 'Cache', + 'ok' => 'Ok', + 'failed_retrieve' => 'Kunde inte ställa in eller hämta ett programmets cachevärde.', + 'failed' => 'Ett fel inträffade med applikations cache :error', + ], + 'database' => [ + 'label' => 'Databas', + 'ok' => 'Ok', + 'failed' => 'Kunde inte ansluta till databasen: :error', + ], + 'debugmode' => [ + 'label' => 'Felsökningsläge', + 'ok' => 'Felsökningsläget är inaktiverat', + 'failed' => 'Felsökningsläget förväntades vara :expected, men var faktiskt :actual', + ], + 'environment' => [ + 'label' => 'Miljö', + 'ok' => 'Ok, satt till :actual', + 'failed' => 'Miljö är satt till :actual , Förväntad :expected', + ], + 'nodeversions' => [ + 'label' => 'Node versioner', + 'ok' => 'Noderna är uppdaterade', + 'failed' => ':outdated/:all noder är utdaterade', + 'no_nodes_created' => 'Inga noder skapade', + 'no_nodes' => 'Inga noder', + 'all_up_to_date' => 'Alla är aktuella', + 'outdated' => ':outdated/:all utdaterad', + ], + 'panelversion' => [ + 'label' => 'Panelens version', + 'ok' => 'Panelen är uppdaterad', + 'failed' => 'Installerad version är :currentVersion men senaste är :latestVersion', + 'up_to_date' => 'Aktuell', + 'outdated' => 'Utdaterad', + ], + 'schedule' => [ + 'label' => 'Schema', + 'ok' => 'Ok', + 'failed_last_ran' => 'Den senaste körningen av schemat var mer än :time minuter sedan', + 'failed_not_ran' => 'Schemat har inte körts än.', + ], + 'useddiskspace' => [ + 'label' => 'Diskutrymme', + ], + ], + 'checks' => [ + 'successful' => 'Lyckad', + 'failed' => 'Misslyckad', + ], +]; diff --git a/lang/sv/admin/node.php b/lang/sv/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/sv/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/sv/admin/server.php b/lang/sv/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/sv/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/sv/admin/user.php b/lang/sv/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/sv/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/sv/auth.php b/lang/sv/auth.php index 2a3a452682..4c0349a373 100644 --- a/lang/sv/auth.php +++ b/lang/sv/auth.php @@ -1,27 +1,24 @@ 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], + 'failed' => 'Dessa autentiseringsuppgifter matchar inte våra register.', + 'failed-two-factor' => 'Felaktig 2FA-kod', + 'two-factor-code' => 'Tvåfaktorsautentisering', + 'two-factor-hint' => 'Du kan använda reservkoder om du har förlorat åtkomst till din enhet.', + 'password' => 'Det angivna lösenordet är felaktigt.', + 'throttle' => 'För många inloggningsförsök. Försök igen om :seconds sekunder.', + '2fa_must_be_enabled' => 'Administratören har krävt att 2 Faktors autentisering måste vara aktiverat för ditt konto för att kunna använda panelen.', - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', ]; diff --git a/lang/sv/command/messages.php b/lang/sv/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/sv/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/sv/dashboard/account.php b/lang/sv/dashboard/account.php deleted file mode 100644 index 05c8d36b3f..0000000000 --- a/lang/sv/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Uppdatera din e-post', - 'updated' => 'Din e-post adress har varit uppdaterad', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/sv/dashboard/index.php b/lang/sv/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/sv/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/sv/exceptions.php b/lang/sv/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/sv/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/sv/pagination.php b/lang/sv/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/sv/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/sv/passwords.php b/lang/sv/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/sv/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/sv/search.php b/lang/sv/search.php new file mode 100644 index 0000000000..2212fe7765 --- /dev/null +++ b/lang/sv/search.php @@ -0,0 +1,9 @@ + 'Ange minst tre tecken för att börja söka.', + 'term' => [ + 'label' => 'Sök fråga', + 'description' => 'Ange ett servernamn, uuid, eller allokering för att börja söka.', + ], +]; diff --git a/lang/sv/server/activity.php b/lang/sv/server/activity.php new file mode 100644 index 0000000000..f81a602b27 --- /dev/null +++ b/lang/sv/server/activity.php @@ -0,0 +1,11 @@ + 'Aktivitet', + 'event' => 'Händelse', + 'user' => 'Användare', + 'deleted_user' => 'Borttagen användare', + 'system' => 'System', + 'timestamp' => 'Tidsstämpel', + 'metadata' => 'Metadata', +]; diff --git a/lang/sv/server/users.php b/lang/sv/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/sv/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/sv/strings.php b/lang/sv/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/sv/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/sv/validation.php b/lang/sv/validation.php index 9cccf35080..d137e39854 100644 --- a/lang/sv/validation.php +++ b/lang/sv/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => ':attribute måste accepteras.', + 'active_url' => ':attribute är inte en giltig webbadress.', + 'after' => ':attribute måste vara ett datum efter :date.', + 'after_or_equal' => ':attribute måste vara ett datum efter eller lika med :date.', + 'alpha' => ':attribute får enbart innehålla bokstäver.', + 'alpha_dash' => ':attribute får endast innehålla bokstäver, siffror och bindestreck.', + 'alpha_num' => ':attribute får endast innehålla bokstäver, siffror och bindestreck.', + 'array' => ':attribute måste vara en lista.', + 'before' => ':attribute måste vara ett datum före :date.', + 'before_or_equal' => ':attribute måste vara ett datum före eller lika med :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => ':attribute måste vara mellan :min och :max.', + 'file' => ':attribute måste vara mellan :min och :max kilobytes.', + 'string' => ':attribute måste vara mellan :min och :max tecken.', + 'array' => ':attribute måste vara mellan :min och :max föremål.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', + + 'confirmed' => ':attribute bekräftelsen matchar inte.', + 'date' => ':attribute är inte ett giltigt datum.', + 'date_format' => ':attribute matchar inte formatet :format.', + 'different' => ':attribute och :other måste vara olika.', + 'digits' => ':attribute måste vara :digits siffror.', + 'digits_between' => ':attribute måste vara mellan :min och :max siffror.', + 'dimensions' => ':attribute har ogiltiga bilddimensioner.', + + 'email' => ':attribute måste vara en giltig e-postadress.', + + 'file' => ':attribute måste vara en fil.', + 'filled' => ':attribute fältet är obligatoriskt.', + 'image' => ':attribute måste vara en bild.', + + 'in_array' => 'Fältet :attribute existerar inte i :other.', + 'integer' => ':attribute måste vara en siffra.', + 'ip' => ':attribute måste vara en giltig IP-adress.', + 'json' => ':attribute måste vara en giltig JSON-sträng.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute får inte vara större än :max.', + 'file' => ':attribute får inte vara större än :max kilobytes.', + 'string' => ':attribute får inte vara större än :max tecken.', + 'array' => ':attribute får inte ha mer än :max artiklar.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute måste vara filtyp: :values', + 'mimetypes' => ':attribute måste vara filtyp: :values', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute måste vara minst :min.', + 'file' => ':attribute måste vara minst :min kilobytes.', + 'string' => ':attribute måste vara längre än :min tecken.', + 'array' => ':attribute måste innehålla minst :min artiklar.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute måste vara en siffra.', + + 'regex' => ':attribute formatet är ogiltigt.', + + 'required_with_all' => ':attribute fältet är obligatoriskt när :values är angivet.', + + 'same' => ':attribute och :other måste stämma överens.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute måste vara :size.', + 'file' => ':attribute måste vara :size kilobytes.', + 'string' => ':attribute måste vara :size tecken.', + 'array' => ':attribute måste innehålla :size artiklar.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute måste vara en sträng.', + 'timezone' => ':attribute måste vara en giltig tidszon.', + + 'url' => ':attribute formatet är ogiltigt.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => ':env variabel', + 'invalid_password' => 'Lösenordet som angavs var ogiltigt för detta konto.', ], ]; diff --git a/lang/th/activity.php b/lang/th/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/th/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/th/admin/eggs.php b/lang/th/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/th/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/th/admin/node.php b/lang/th/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/th/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/th/admin/server.php b/lang/th/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/th/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/th/admin/user.php b/lang/th/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/th/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/th/auth.php b/lang/th/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/th/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/th/command/messages.php b/lang/th/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/th/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/th/dashboard/account.php b/lang/th/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/th/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/th/dashboard/index.php b/lang/th/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/th/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/th/exceptions.php b/lang/th/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/th/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/th/pagination.php b/lang/th/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/th/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/th/passwords.php b/lang/th/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/th/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/th/server/users.php b/lang/th/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/th/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/th/strings.php b/lang/th/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/th/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/th/validation.php b/lang/th/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/th/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/tr/activity.php b/lang/tr/activity.php deleted file mode 100644 index ac266eae23..0000000000 --- a/lang/tr/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Giriş yapılamadı', - 'success' => 'Giriş yapıldı', - 'password-reset' => 'Şifre sıfırlama', - 'reset-password' => 'Şifre sıfırlama istendi', - 'checkpoint' => 'İki faktörlü kimlik doğrulama istendi', - 'recovery-token' => 'İki faktörlü kurtarma tokeni kullanıldı', - 'token' => 'İki faktörlü doğrulama çözüldü', - 'ip-blocked' => ':identifier olarak listelenmemiş IP adresinden gelen istek engellendi', - 'sftp' => [ - 'fail' => 'SFTP girişi yapılamadı', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Email :old yerine :new ile değiştirildi', - 'password-changed' => 'Şifre değiştirildi', - ], - 'api-key' => [ - 'create' => 'API anahtarı :fingerprint hesaba eklendi', - 'delete' => 'API anahtarı :identifier kaldırıldı', - ], - 'ssh-key' => [ - 'create' => 'SSH anahtarı :fingerprint hesaba eklendi', - 'delete' => 'SSH anahtarı :fingerprint kaldırıldı', - ], - 'two-factor' => [ - 'create' => 'İki Adımlı Doğrulama etkinleştirildi', - 'delete' => 'İki Adımlı Doğrulama devre dışı bırakıldı', - ], - ], - 'server' => [ - 'reinstall' => 'Sunucu yeniden kuruldu', - 'console' => [ - 'command' => 'Sunucuda :command komutu çalıştırıldı', - ], - 'power' => [ - 'start' => 'Sunucu başlatıldı', - 'stop' => 'Sunucu durduruldu', - 'restart' => 'Sunucu yeniden başlatıldı', - 'kill' => 'Sunucu zorla kapatıldı', - ], - 'backup' => [ - 'download' => 'Yedek :name indirildi', - 'delete' => 'Yedek :name silindi', - 'restore' => 'Yedek :name yüklendi (silinen dosyalar: :truncate)', - 'restore-complete' => ':name adlı yedeğin yüklenmesi sona erdi', - 'restore-failed' => ':name adlı yedeğin yüklenmesi başarısız oldu', - 'start' => 'Yeni yedek :name başlatıldı', - 'complete' => ':name yedeği başarılı olarak kaydedildi', - 'fail' => ':name yedeklemesi başarısız olarak işaretlendi', - 'lock' => ':name yedeği kilitlendi', - 'unlock' => ':name yedeklemesinin kilidi açıldı', - ], - 'database' => [ - 'create' => ':name veritabanı oluşturuldu', - 'rotate-password' => ':name veritabanı için şifre değiştirildi', - 'delete' => ':name veritabanı silindi', - ], - 'file' => [ - 'compress_one' => ':directory:file sıkıştırıldı', - 'compress_other' => ':directory \'deki :count dosya sıkıştırıldı', - 'read' => ':files. dosyasının içeriği gösterildi', - 'copy' => ':file belgenin kopyası oluşturuldu', - 'create-directory' => ':directory:name klasör oluşturuldu.', - 'decompress' => ':files dosyası :directory içinde çıkartıldı', - 'delete_one' => ':directory:files.0 silindi', - 'delete_other' => ':directory klasöründe :count belge silindi', - 'download' => ':file indirildi', - 'pull' => ':directory klasörüne :url bağlantısından dosya indirildi', - 'rename_one' => ':directory:files.0.from :directory:files.0.to olarak yeniden adlandırıldı', - 'rename_other' => ':directory klasöründe :count dosyanın adı değiştirildi', - 'write' => ':file dosyasına yeni içerik eklendi', - 'upload' => 'Dosya yüklemesi başlatıldı', - 'uploaded' => ':directory:file yüklendi', - ], - 'sftp' => [ - 'denied' => 'SFTP erişimi izinler yüzünden engellendi', - 'create_one' => ':files.0 oluşturuldu', - 'create_other' => ':count belge oluşturuldu', - 'write_one' => ':files.0 dosyasının içeriği değiştirildi', - 'write_other' => ':count dosyanın içeriği değiştirildi', - 'delete_one' => ':files.0 silindi', - 'delete_other' => ':count dosya silindi', - 'create-directory_one' => ':files.0 klasörü oluşturuldu', - 'create-directory_other' => ':count klasör oluşturuldu', - 'rename_one' => ':directory:files.0.from :directory:files.0.to olarak yeniden adlandırıldı', - 'rename_other' => ':count belge yeniden isimlendirildi veya taşındı', - ], - 'allocation' => [ - 'create' => ':allocation lokasyonuna sunucu eklendi', - 'notes' => ':allocation notları ":old" yerine ":new" olarak güncellendi', - 'primary' => ':allocation birincil sunucu lokasyonu seçildi', - 'delete' => ':allocation lokasyonu silindi', - ], - 'schedule' => [ - 'create' => ':name programı oluşturuldu', - 'update' => ':name programı güncellendi', - 'execute' => ':name zamanlaması manuel olarak yürütüldü', - 'delete' => ':name programı silindi', - ], - 'task' => [ - 'create' => ':name planı için yeni bir ":action" görevi oluşturuldu', - 'update' => ':name zamanlaması için ":action" görevi güncellendi', - 'delete' => ':name planı için bir görev silindi', - ], - 'settings' => [ - 'rename' => 'Sunucunun adı :old\'den :new olarak değiştirildi', - 'description' => 'Sunucu açıklamasını :old yerine :new olarak değiştirdik', - ], - 'startup' => [ - 'edit' => ':variable değişkeni ":old" yerine ":new" olarak değiştirildi', - 'image' => 'Sunucunun Docker Görüntüsü :old\'den :new\'ye güncellendi', - ], - 'subuser' => [ - 'create' => 'Alt kullanıcı olarak :email eklendi', - 'update' => ':email için alt kullanıcı izinleri güncellendi', - 'delete' => ':email kullanıcısı silindi', - ], - ], -]; diff --git a/lang/tr/admin/apikey.php b/lang/tr/admin/apikey.php new file mode 100644 index 0000000000..da5b6deffb --- /dev/null +++ b/lang/tr/admin/apikey.php @@ -0,0 +1,27 @@ + 'Uygulama API Anahtarları', + 'empty' => 'API anahtarı yok', + 'whitelist' => 'İzin Verilen IPv4 Adresleri', + 'whitelist_help' => 'API anahtarları, yalnızca belirli IPv4 adreslerinden erişime izin verecek şekilde kısıtlanabilir. Her adresi yeni bir satıra girin.', + 'whitelist_placeholder' => 'Örnek: 127.0.0.1 veya 192.168.1.1', + 'description' => 'Açıklama', + 'description_help' => 'Bu anahtarın ne için kullanıldığına dair kısa bir açıklama.', + 'nav_title' => 'API Anahtarları', + 'model_label' => 'Uygulama API Anahtarı', + 'model_label_plural' => 'Uygulama API Anahtarları', + 'table' => [ + 'key' => 'Anahtar', + 'description' => 'Açıklama', + 'last_used' => 'Son Kullanım', + 'created' => 'Oluşturulma Tarihi', + 'created_by' => 'Oluşturan', + 'never_used' => 'Hiç Kullanılmadı', + ], + 'permissions' => [ + 'none' => 'Hiçbiri', + 'read' => 'Okuma', + 'read_write' => 'Okuma & Yazma', + ], +]; diff --git a/lang/tr/admin/dashboard.php b/lang/tr/admin/dashboard.php new file mode 100644 index 0000000000..8dca8e07ff --- /dev/null +++ b/lang/tr/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Pelican\'a Hoş Geldiniz!', + 'version' => 'Sürüm: :version', + 'advanced' => 'Gelişmiş', + 'server' => 'Sunucu', + 'user' => 'Kullanıcı', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Geliştiriciler İçin Bilgiler', + 'content' => 'Geliştirme sürümünü denediğiniz için teşekkür ederiz!', + 'extra_note' => 'Herhangi bir sorunla karşılaşırsanız, lütfen GitHub üzerinde bildirin.', + 'button_issues' => 'Sorun Oluştur', + 'button_features' => 'Özellikleri Tartış', + ], + 'intro-update-available' => [ + 'heading' => 'Güncelleme Mevcut', + 'content' => ':latestVersion sürümü şimdi kullanılabilir! Panelinizi güncellemek için belgelerimizi okuyun.', + 'button_changelog' => 'Neler değişti?', + ], + 'intro-no-update' => [ + 'heading' => 'Paneliniz Güncel', + 'content' => 'Şu anda :version sürümünü kullanıyorsunuz. Paneliniz güncel!', + ], + 'intro-first-node' => [ + 'heading' => 'Hiç Düğüm Algılanmadı', + 'content' => 'Görünüşe göre henüz herhangi bir Düğüm ayarlamadınız, ancak endişelenmeyin çünkü ilk düğümünüzü oluşturmak için eylem düğmesine tıklayabilirsiniz!', + 'extra_note' => 'Herhangi bir sorunla karşılaşırsanız, lütfen GitHub üzerinde bildirin.', + 'button_label' => 'Pelican\'da İlk Düğümü Oluştur', + ], + 'intro-support' => [ + 'heading' => 'Pelican\'ı Destekleyin', + 'content' => 'Pelican\'ı kullandığınız için teşekkür ederiz, bu yalnızca sizin, katkıda bulunanlarımızın ve diğer destekçilerimizin desteğiyle başarılabildi!', + 'extra_note' => 'Her türlü desteği takdir ediyoruz.', + 'button_translate' => 'Çeviriye Yardım Et', + 'button_donate' => 'Doğrudan Bağış Yap', + ], + 'intro-help' => [ + 'heading' => 'Yardıma mı İhtiyacınız Var?', + 'content' => 'Önce belgeleri kontrol edin! Hala yardıma ihtiyacınız varsa Discord sunucumuza katılın!', + 'button_docs' => 'Belgeleri Oku', + ], + ], +]; diff --git a/lang/tr/admin/databasehost.php b/lang/tr/admin/databasehost.php new file mode 100644 index 0000000000..fa8c792010 --- /dev/null +++ b/lang/tr/admin/databasehost.php @@ -0,0 +1,72 @@ + 'Veritabanı Sunucuları', + 'model_label' => 'Veritabanı Sunucusu', + 'model_label_plural' => 'Veritabanı Sunucuları', + 'table' => [ + 'database' => 'Veritabanı', + 'name' => 'Ad', + 'host' => 'Sunucu', + 'port' => 'Port', + 'name_helper' => 'Boş bırakılırsa rastgele bir ad otomatik olarak oluşturulur.', + 'username' => 'Kullanıcı Adı', + 'password' => 'Şifre', + 'remote' => 'Bağlantı Kaynağı', + 'remote_helper' => 'Bağlantıların nereden izin verileceği. Her yerden bağlantıya izin vermek için boş bırakın.', + 'max_connections' => 'Maksimum Bağlantı', + 'created_at' => 'Oluşturulma Tarihi', + 'connection_string' => 'JDBC Bağlantı Dizesi', + ], + 'error' => 'Sunucuya bağlanırken hata oluştu', + 'host' => 'Sunucu', + 'host_help' => 'Bu Panelden yeni veritabanları oluşturmak için bu MySQL sunucusuna bağlanırken kullanılacak IP adresi veya alan adı.', + 'port' => 'Port', + 'port_help' => 'Bu sunucu için MySQL\'in çalıştığı port.', + 'max_database' => 'Maksimum Veritabanı', + 'max_databases_help' => 'Bu sunucu üzerinde oluşturulabilecek maksimum veritabanı sayısı. Limit dolduğunda, bu sunucu üzerinde yeni veritabanı oluşturulamaz. Boş bırakılırsa sınırsızdır.', + 'display_name' => 'Görünen Ad', + 'display_name_help' => 'Bu konumu diğerlerinden ayırt etmek için kullanılan kısa bir tanımlayıcı. 1 ile 60 karakter arasında olmalıdır, örneğin, us.nyc.lvl3.', + 'username' => 'Kullanıcı Adı', + 'username_help' => 'Sistem üzerinde yeni kullanıcılar ve veritabanları oluşturmak için yeterli izinlere sahip bir hesabın kullanıcı adı.', + 'password' => 'Şifre', + 'password_help' => 'Veritabanı kullanıcısının şifresi.', + 'linked_nodes' => 'Bağlı Düğümler', + 'linked_nodes_help' => 'Bu ayar, yalnızca seçilen Düğüm üzerindeki bir sunucuya veritabanı eklerken bu veritabanı sunucusunu varsayılan olarak kullanır.', + 'connection_error' => 'Veritabanı sunucusuna bağlanırken hata oluştu', + 'no_database_hosts' => 'Veritabanı Sunucusu Yok', + 'no_nodes' => 'Düğüm Yok', + 'delete_help' => 'Veritabanı Sunucusunda Veritabanları Var', + 'unlimited' => 'Sınırsız', + 'anywhere' => 'Her Yerden', + + 'rotate' => 'Döndür', + 'rotate_password' => 'Şifreyi Döndür', + 'rotated' => 'Şifre Döndürüldü', + 'rotate_error' => 'Şifre Döndürme Başarısız', + 'databases' => 'Veritabanları', + + 'setup' => [ + 'preparations' => 'Hazırlıklar', + 'database_setup' => 'Veritabanı Kurulumu', + 'panel_setup' => 'Panel Kurulumu', + + 'note' => 'Şu anda yalnızca MySQL/MariaDB veritabanları veritabanı sunucuları için desteklenmektedir!', + 'different_server' => 'Panel ve veritabanı aynı sunucuda değil mi?', + + 'database_user' => 'Veritabanı Kullanıcısı', + 'cli_login' => 'MySQL CLI\'ye erişmek için mysql -u root -p komutunu kullanın.', + 'command_create_user' => 'Kullanıcı oluşturma komutu', + 'command_assign_permissions' => 'Yetki atama komutu', + 'cli_exit' => 'MySQL CLI\'den çıkmak için exit komutunu çalıştırın.', + 'external_access' => 'Harici Erişim', + 'allow_external_access' => '

Sunucuların bu MySQL örneğine bağlanabilmesi için büyük ihtimalle harici erişime izin vermeniz gerekecek.

+
+

Bunu yapmak için, işletim sisteminize ve MySQL’in nasıl kurulduğuna bağlı olarak konumu değişen my.cnf dosyasını açın. Dosyayı bulmak için find /etc -iname my.cnf komutunu çalıştırabilirsiniz.

+
+

my.cnf dosyasını açın, aşağıdaki metni dosyanın en altına ekleyip kaydedin:
+[mysqld]
bind-address=0.0.0.0

+
+

Değişikliklerin uygulanması için MySQL/MariaDB’yi yeniden başlatın. Bu işlem, varsayılan olarak yalnızca localhost’tan gelen istekleri kabul eden MySQL yapılandırmasını geçersiz kılar. Güncellemeden sonra tüm arayüzlerden, dolayısıyla harici bağlantılardan erişim sağlanabilir. Ayrıca güvenlik duvarınızda MySQL portuna (varsayılan 3306) izin verdiğinizden emin olun.

', + ], +]; diff --git a/lang/tr/admin/eggs.php b/lang/tr/admin/eggs.php deleted file mode 100644 index f2a1f8421e..0000000000 --- a/lang/tr/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Bu Egg ve ilişkili değişkenleri başarıyla içe aktarıldı.', - 'updated_via_import' => 'Bu Egg sağlanan dosya kullanılarak güncellendi.', - 'deleted' => 'İstenen Egg panelden başarıyla silindi.', - 'updated' => 'Egg konfigürasyonu başarıyla güncellendi.', - 'script_updated' => 'Egg kurulum scripti güncellendi ve sunucular kurulduğunda çalıştırılacaktır..', - 'egg_created' => 'Yeni bir Egg başarıyla eklendi. Bu yeni Egg\'i uygulamak için çalışan tüm arka plan programlarını yeniden başlatmanız gerekecek.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => '":variable" değişkeni silindi ve yeniden oluşturulduktan sonra artık sunucular tarafından kullanılamayacak.', - 'variable_updated' => '":variable" değişkeni güncellendi. Değişiklikleri uygulamak için bu değişkeni kullanarak tüm sunucuları yeniden oluşturmanız gerekecektir.', - 'variable_created' => 'Yeni değişken başarıyla oluşturuldu ve bu Egg atandı.', - ], - ], -]; diff --git a/lang/tr/admin/health.php b/lang/tr/admin/health.php new file mode 100644 index 0000000000..40d224a4df --- /dev/null +++ b/lang/tr/admin/health.php @@ -0,0 +1,60 @@ + 'Sağlık', + 'results_refreshed' => 'Sağlık raporları güncellendi.', + 'checked' => ':time tarihinden itibaren sonuçlar kontrol edildi', + 'refresh' => 'Yenile', + 'results' => [ + 'cache' => [ + 'label' => 'Önbellek', + 'ok' => 'Tamam', + 'failed_retrieve' => 'Uygulama önbellek değeri ayarlanamadı veya alınamadı.', + 'failed' => 'Uygulama önbelleği ile ilgili bir istisna oluştu: :error', + ], + 'database' => [ + 'label' => 'Veritabanı', + 'ok' => 'Tamam', + 'failed' => 'Veritabanına bağlanılamadı: :error', + ], + 'debugmode' => [ + 'label' => 'Hata Ayıklama Modu', + 'ok' => 'Hata ayıklama modu devre dışı', + 'failed' => 'Hata ayıklama modunun :expected olması bekleniyordu, ancak :actual olarak ayarlı', + ], + 'environment' => [ + 'label' => 'Ortam', + 'ok' => 'Tamam, :actual olarak ayarlı', + 'failed' => 'Ortam :actual olarak ayarlı, Beklenen: :expected', + ], + 'nodeversions' => [ + 'label' => 'Node Sürümleri', + 'ok' => 'Node\'lar güncel', + 'failed' => ':outdated/:all Node güncel değil', + 'no_nodes_created' => 'Node oluşturulmadı', + 'no_nodes' => 'Node yok', + 'all_up_to_date' => 'Tümü güncel', + 'outdated' => ':outdated/:all güncel değil', + ], + 'panelversion' => [ + 'label' => 'Panel Sürümü', + 'ok' => 'Panel güncel', + 'failed' => 'Yüklü sürüm: :currentVersion, ancak en son sürüm: :latestVersion', + 'up_to_date' => 'Güncel', + 'outdated' => 'Güncel Değil', + ], + 'schedule' => [ + 'label' => 'Zamanlama', + 'ok' => 'Tamam', + 'failed_last_ran' => 'Zamanlamanın son çalıştırılması :time dakikadan daha önce gerçekleşti', + 'failed_not_ran' => 'Zamanlama henüz çalıştırılmadı.', + ], + 'useddiskspace' => [ + 'label' => 'Disk Alanı', + ], + ], + 'checks' => [ + 'successful' => 'Başarılı', + 'failed' => 'Başarısız', + ], +]; diff --git a/lang/tr/admin/mount.php b/lang/tr/admin/mount.php new file mode 100644 index 0000000000..7428149673 --- /dev/null +++ b/lang/tr/admin/mount.php @@ -0,0 +1,30 @@ + 'Bağlamalar', + 'model_label' => 'Bağlama', + 'model_label_plural' => 'Bağlamalar', + 'name' => 'Ad', + 'name_help' => 'Bu bağlamayı diğerlerinden ayırmak için kullanılan benzersiz ad.', + 'source' => 'Kaynak', + 'source_help' => 'Bir konteynere bağlanacak olan ana sistemdeki dosya yolu.', + 'target' => 'Hedef', + 'target_help' => 'Bağlamanın bir konteyner içinde erişilebilir olacağı yer.', + 'read_only' => 'Salt Okunur?', + 'read_only_help' => 'Bağlama konteyner içinde salt okunur mu?', + 'description' => 'Açıklama', + 'description_help' => 'Bu bağlama için daha uzun bir açıklama.', + 'no_mounts' => 'Bağlama Yok', + 'eggs' => 'Yumurtalar', + 'nodes' => 'Düğümler', + 'toggles' => [ + 'writable' => 'Yazılabilir', + 'read_only' => 'Salt Okunur', + ], + 'table' => [ + 'name' => 'Ad', + 'all_eggs' => 'Tüm Yumurtalar', + 'all_nodes' => 'Tüm Düğümler', + 'read_only' => 'Salt Okunur', + ], +]; diff --git a/lang/tr/admin/node.php b/lang/tr/admin/node.php deleted file mode 100644 index bbefba956b..0000000000 --- a/lang/tr/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'Sağlanan FQDN veya IP adresi geçerli bir IP adresine çözümlenmiyor.', - 'fqdn_required_for_ssl' => 'Bu düğüm için SSL kullanmak amacıyla genel bir IP adresine çözümlenen tam nitelikli bir alan adı gereklidir.', - ], - 'notices' => [ - 'allocations_added' => 'Tahsisler bu node\'a başarıyla eklendi.', - 'node_deleted' => 'Node başarılı şekilde kaldırıldı.', - 'node_created' => 'Yeni node başarıyla oluşturuldu. \'Yapılandırma\' sekmesini ziyaret ederek bu makinedeki arka plan programını otomatik olarak yapılandırabilirsiniz. Herhangi bir sunucu ekleyebilmeniz için öncelikle en az bir IP adresi ve bağlantı noktası ayırmanız gerekir.', - 'node_updated' => 'Node bilgileri güncellendi. Herhangi bir daemon ayarı değiştirildiyse, bu değişikliklerin etkili olması için onu yeniden başlatmanız gerekecektir.', - 'unallocated_deleted' => ':ip için ayrılmamış tüm portlar silindi.', - ], -]; diff --git a/lang/tr/admin/role.php b/lang/tr/admin/role.php new file mode 100644 index 0000000000..f6632528d5 --- /dev/null +++ b/lang/tr/admin/role.php @@ -0,0 +1,17 @@ + 'Roller', + 'model_label' => 'Rol', + 'model_label_plural' => 'Roller', + 'no_roles' => 'Rol Yok', + 'name' => 'Rol Adı', + 'permissions' => 'İzinler', + 'in_use' => 'Kullanımda', + 'all' => 'Tümü', + 'root_admin' => ':role tüm izinlere sahiptir.', + 'root_admin_delete' => 'Root Admin silinemez', + 'users' => 'Kullanıcılar', + 'nodes' => 'Düğümler', + 'nodes_hint' => 'Tüm node\'lara erişim sağlamak için boş bırakın.', +]; diff --git a/lang/tr/admin/server.php b/lang/tr/admin/server.php deleted file mode 100644 index 70082a56fb..0000000000 --- a/lang/tr/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'Bu sunucunun varsayılan lokasyonunu silmeye çalışıyorsunuz ancak kullanılacak bir yedek lokasyon yok.', - 'marked_as_failed' => 'Bu sunucu önceki yüklemede başarısız olarak işaretlendi. Bu durumda mevcut durum değiştirilemez.', - 'bad_variable' => ':name değişkeninde bir hata oluştu.', - 'daemon_exception' => 'Arka plan programıyla iletişim kurmaya çalışırken bir HTTP/:code yanıt koduyla sonuçlanan bir hata oluştu. Bu haya günlüğe kaydedildi. (istek kimliği: :request_id)', - 'default_allocation_not_found' => 'İstenen varsayılan tahsis, bu sunucunun tahsislerinde bulunamadı.', - ], - 'alerts' => [ - 'startup_changed' => 'Bu sunucunun başlangıç yapılandırması güncellendi. Bu sunucunun Egg\'i değiştirildiyse şimdi yeniden yükleme gerçekleştirilecek.', - 'server_deleted' => 'Sunucu sistemden başarıyla silindi.', - 'server_created' => 'Sunucu panelde başarıyla oluşturuldu. Lütfen arka plan programının bu sunucuyu tamamen kurması için birkaç dakika bekleyin.', - 'build_updated' => 'Bu sunucunun yapı ayrıntıları güncellendi. Bazı değişikliklerin geçerli olması için yeniden başlatma gerekebilir.', - 'suspension_toggled' => 'Sunucunun askıya alınma durumu :status olarak değiştirildi.', - 'rebuild_on_boot' => 'Bu sunucu, Docker Container\'ın yeniden oluşturulmasını gerektiriyor olarak işaretlendi. Bu, sunucunun bir sonraki başlatılışında gerçekleşecektir.', - 'install_toggled' => 'Bu sunucunun kurulum durumu değiştirildi.', - 'server_reinstalled' => 'Bu sunucu şu andan itibaren yeniden kurulum için sıraya alındı.', - 'details_updated' => 'Sunucu ayrıntıları başarıyla güncellendi.', - 'docker_image_updated' => 'Bu sunucu için kullanılacak varsayılan Docker görüntüsü başarıyla değiştirildi. Bu değişikliğin uygulanması için yeniden başlatma gereklidir.', - 'node_required' => 'Bu panele sunucu ekleyebilmeniz için en az bir node yapılandırılmış olması gerekir.', - 'transfer_nodes_required' => 'Sunucuları aktarabilmeniz için en az iki node yapılandırılmış olması gerekir.', - 'transfer_started' => 'Sunucu transferi başlatılmıştır.', - 'transfer_not_viable' => 'Seçtiğiniz node, bu sunucuyu barındırmak için gerekli disk alanına veya belleğe sahip değil.', - ], -]; diff --git a/lang/tr/admin/user.php b/lang/tr/admin/user.php deleted file mode 100644 index 136953fd18..0000000000 --- a/lang/tr/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Hesabına bağlı sunucular bulunuyor. Devam etmeden önce lütfen sunucularını silin', - 'user_is_self' => 'Kendi kullanıcı hesabınızı silemezsiniz.', - ], - 'notices' => [ - 'account_created' => 'Hesap başarıyla oluşturuldu.', - 'account_updated' => 'Hesap başarıyla güncellendi.', - ], -]; diff --git a/lang/tr/auth.php b/lang/tr/auth.php deleted file mode 100644 index 071a2171e9..0000000000 --- a/lang/tr/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Giriş Yap', - 'go_to_login' => 'Oturum açmaya gidin', - 'failed' => 'Bu kimlik bilgileriyle eşleşen hesap bulunamadı.', - - 'forgot_password' => [ - 'label' => 'Şifremi Unuttum', - 'label_help' => 'Şifrenizi sıfırlama talimatlarını almak için e-posta adresinizi giriniz.', - 'button' => 'Hesap kurtarma', - ], - - 'reset_password' => [ - 'button' => 'Sıfırla ve Oturum Aç', - ], - - 'two_factor' => [ - 'label' => 'İki Faktörlü Doğrulama Tokeni', - 'label_help' => 'Bu hesabın devam edebilmesi için ikinci bir kimlik doğrulama katmanı gerekiyor. Bu girişi tamamlamak için lütfen cihazınız tarafından oluşturulan kodu girin.', - 'checkpoint_failed' => 'İki faktörlü kimlik doğrulama jetonu geçersiz.', - ], - - 'throttle' => 'Çok fazla hatalı giriş yaptınız. Lütfen :seconds saniye sonra tekrar deneyiniz.', - 'password_requirements' => 'Şifre en az 8 karakter uzunluğunda olmalı.', - '2fa_must_be_enabled' => 'Yönetici, Paneli kullanabilmeniz için hesabınızda 2 Faktörlü Kimlik Doğrulamanın etkinleştirilmesini zorunlu kılmıştır.', -]; diff --git a/lang/tr/command/messages.php b/lang/tr/command/messages.php index 90597de226..331a719706 100644 --- a/lang/tr/command/messages.php +++ b/lang/tr/command/messages.php @@ -3,27 +3,22 @@ return [ 'user' => [ 'search_users' => 'Lütfen Kullanıcı Adı, Kullancı ID veya E-posta girin', - 'select_search_user' => 'Silinecek kullanıcının ID\'si (Yeniden aramak için \'0\' girin', + 'select_search_user' => 'Silinecek kullanıcının ID\'si (Yeniden aramak için \'0\' girin)', 'deleted' => 'Kullanıcı başarılı şekilde Panelden silindi.', 'confirm_delete' => 'Bu kullanıcıyı Panelden silmek istediğinizden emin misiniz?', 'no_users_found' => 'Arama kayıtlarına göre kullanıcı bulunamadı.', - 'multiple_found' => 'Bulunan kullanıcı için birden fazla hesap bulundu; --no-interaction işareti nedeniyle bir kullanıcı silinemedi.', + 'multiple_found' => 'Belirtilen kullanıcı için birden fazla hesap bulundu; --no-interaction işareti nedeniyle bir kullanıcı silinemedi.', 'ask_admin' => 'Kullanıcı yönetici olarak mı eklensin?', - 'ask_email' => 'E-Posta', + 'ask_email' => 'E-posta Adresi', 'ask_username' => 'Kullanıcı Adı', - 'ask_name_first' => 'Adı', - 'ask_name_last' => 'Soyadı', 'ask_password' => 'Parola', 'ask_password_tip' => 'Kullanıcıya e-postayla gönderilen rastgele bir parolayla bir hesap oluşturmak istiyorsanız, bu komutu (CTRL+C) yeniden çalıştırın ve "--no-password" işaretini iletin.', 'ask_password_help' => 'Şifreler en az 8 karakter uzunluğunda olmalı ve en az bir büyük harf ve rakam içermelidir.', - '2fa_help_text' => [ - 'Bu komut, eğer etkinleştirilmişse, kullanıcı hesabı için 2 faktörlü kimlik doğrulamayı devre dışı bırakacaktır. Bu yalnızca kullanıcının hesabının kilitlenmesi durumunda hesap kurtarma komutu olarak kullanılmalıdır.', - 'Yapmak istediğiniz bu değilse CTRL+C tuşlarına basarak bu işlemden çıkın.', - ], + '2fa_help_text' => 'Bu komut, etkin ise kullanıcının hesabındaki 2 faktörlü kimlik doğrulamayı devre dışı bırakır. Bu işlem, yalnızca kullanıcı hesabına erişemiyorsa bir hesap kurtarma yöntemi olarak kullanılmalıdır. Yapmak istediğiniz işlem bu değilse, çıkmak için CTRL+C tuşlarına basın.', '2fa_disabled' => ':email kullanıcısına ait iki adımlı doğrulama devredışı bırakıldı.', ], 'schedule' => [ - 'output_line' => '`:schedule` (:hash) içindeki ilk görev için iş gönderiliyor.', + 'output_line' => '`:schedule` (:id) içindeki ilk görev için iş gönderiliyor.', ], 'maintenance' => [ 'deleting_service_backup' => ':file adlı servis yedeği silindi.', @@ -31,12 +26,12 @@ 'server' => [ 'rebuild_failed' => '":node" düğümünde ":name" (#:id) için yeniden oluşturma isteği şu hatayla başarısız oldu: :message', 'reinstall' => [ - 'failed' => '":name" (#:id) için ":node" düğümüne yeniden yükleme isteği hatayla başarısız oldu: :message', + 'failed' => '":name" (#:id) için ":node" düğümüne yeniden yükleme isteği şu hata ile başarısız oldu: :message', 'confirm' => 'Bir grup sunucuya yeniden kurulum yapmak üzeresiniz. Devam etmek istiyor musunuz?', ], 'power' => [ 'confirm' => ':count sunucularına karşı bir :action gerçekleştirmek üzeresiniz. Devam etmek ister misiniz?', - 'action_failed' => '":node" düğümündeki ":name" (#:id) için güç eylemi isteği şu hatayla başarısız oldu: :message', + 'action_failed' => '":node" düğümündeki ":name" (#:id) için güç eylemi isteği şu hata ile başarısız oldu: :message', ], ], 'environment' => [ diff --git a/lang/tr/commands.php b/lang/tr/commands.php new file mode 100644 index 0000000000..3bd51c89a3 --- /dev/null +++ b/lang/tr/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Bu Panel tarafından dışa aktarılan yumurtaların (eggs) hangi e-posta adresinden gönderileceğini belirtin. Bu, geçerli bir e-posta adresi olmalıdır.', + 'url' => 'Uygulama URL\'si, SSL kullanıp kullanmadığınıza bağlı olarak https:// veya http:// ile başlamalıdır. Şema eklemezseniz, e-postalarınız ve diğer içerikler yanlış konuma bağlanacaktır.', + 'timezone' => "Saat dilimi, PHP'nin desteklediği saat dilimlerinden biriyle eşleşmelidir. Emin değilseniz, lütfen https://php.net/manual/en/timezones.php adresine bakın.", + ], + 'redis' => [ + 'note' => 'Bir veya daha fazla seçenek için Redis sürücüsünü seçtiniz, lütfen aşağıya geçerli bağlantı bilgilerini girin. Çoğu durumda, kurulumunuzu değiştirmediyseniz sağlanan varsayılanları kullanabilirsiniz.', + 'comment' => 'Varsayılan olarak bir Redis sunucusu örneği, kullanıcı adı olarak "default" kullanır ve yerel olarak çalıştığı ve dış dünyaya erişilemediği için şifre gerektirmez. Bu durumda, bir değer girmeden Enter tuşuna basmanız yeterlidir.', + 'confirm' => 'Redis için bir :field zaten tanımlanmış gibi görünüyor, değiştirmek ister misiniz?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Veritabanı ana bilgisayarı olarak "localhost" kullanmanız şiddetle tavsiye edilmez çünkü sık sık soket bağlantı sorunları yaşanmaktadır. Yerel bir bağlantı kullanmak istiyorsanız "127.0.0.1" kullanmalısınız.', + 'DB_USERNAME_note' => 'MySQL bağlantıları için root hesabı kullanmak sadece tavsiye edilmez, aynı zamanda bu uygulama tarafından da izin verilmez. Bu yazılım için bir MySQL kullanıcısı oluşturmuş olmanız gerekiyor.', + 'DB_PASSWORD_note' => 'Görünüşe göre zaten bir MySQL bağlantı şifreniz tanımlanmış, değiştirmek ister misiniz?', + 'DB_error_2' => 'Bağlantı bilgileriniz KAYDEDİLMEDİ. Devam etmeden önce geçerli bağlantı bilgileri sağlamanız gerekecek.', + 'go_back' => 'Geri dön ve tekrar dene', + ], + 'make_node' => [ + 'name' => 'Bu düğümü diğerlerinden ayırt etmek için kısa bir tanımlayıcı girin', + 'description' => 'Düğümü tanımlamak için bir açıklama girin', + 'scheme' => 'Lütfen SSL için https veya SSL olmayan bağlantılar için http girin', + 'fqdn' => 'Daemona bağlanmak için kullanılacak bir alan adı girin (örneğin node.example.com). Bu düğüm için SSL kullanmıyorsanız yalnızca bir IP adresi kullanabilirsiniz.', + 'public' => 'Bu düğüm herkese açık olmalı mı? Bir düğümü özel olarak ayarlamak, bu düğüme otomatik dağıtım yapma yeteneğini reddedecektir.', + 'behind_proxy' => 'FQDN\'niz bir proxy arkasında mı?', + 'maintenance_mode' => 'Bakım modu etkinleştirilsin mi?', + 'memory' => 'Maksimum bellek miktarını girin', + 'memory_overallocate' => 'Fazla tahsis edilecek bellek miktarını girin, -1 kontrolü devre dışı bırakır ve 0 yeni sunucu oluşturmayı engeller', + 'disk' => 'Maksimum disk alanı miktarını girin', + 'disk_overallocate' => 'Fazla tahsis edilecek disk miktarını girin, -1 kontrolü devre dışı bırakır ve 0 yeni sunucu oluşturmayı engeller', + 'cpu' => 'Maksimum CPU miktarını girin', + 'cpu_overallocate' => 'Fazla tahsis edilecek CPU miktarını girin, -1 kontrolü devre dışı bırakır ve 0 yeni sunucu oluşturmayı engeller', + 'upload_size' => 'Maksimum dosya yükleme boyutunu girin', + 'daemonListen' => 'Daemon dinleme portunu girin', + 'daemonConnect' => 'Daemon bağlantı portunu girin (dinleme portuyla aynı olabilir)', + 'daemonSFTP' => 'Daemon SFTP dinleme portunu girin', + 'daemonSFTPAlias' => 'Daemon SFTP takma adını girin (boş bırakılabilir)', + 'daemonBase' => 'Temel klasörü girin', + 'success' => ':name adında yeni bir düğüm başarıyla oluşturuldu ve kimliği :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Seçilen düğüm mevcut değil.', + 'error_invalid_format' => 'Geçersiz format belirtildi. Geçerli seçenekler yaml ve json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Görünüşe göre zaten bir uygulama şifreleme anahtarı yapılandırmışsınız. Bu işleme devam etmek, bu anahtarı üzerine yazacak ve mevcut şifrelenmiş veriler için veri bozulmasına neden olacaktır. NE YAPTIĞINIZI BİLMİYORSANIZ DEVAM ETMEYİN.', + 'understand' => 'Bu komutu çalıştırmanın sonuçlarını anlıyorum ve şifrelenmiş verilerin kaybından tamamen sorumluluğu kabul ediyorum.', + 'continue' => 'Devam etmek istediğinizden emin misiniz? Uygulama şifreleme anahtarını değiştirmek VERİ KAYBINA NEDEN OLACAKTIR.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Çalıştırılması gereken zamanlanmış görevler bulunmamaktadır.', + 'error_message' => 'Zamanlanmış görev işlenirken bir hata oluştu: ', + ], + ], +]; diff --git a/lang/tr/dashboard/account.php b/lang/tr/dashboard/account.php deleted file mode 100644 index ae612ff6f0..0000000000 --- a/lang/tr/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'E-Postanı güncelle', - 'updated' => 'E-Posta adresin güncellendi.', - ], - 'password' => [ - 'title' => 'Parolanı değiştir.', - 'requirements' => 'Yeni parolan 8 karakterden az olamaz.', - 'updated' => 'Parolan güncellendi.', - ], - 'two_factor' => [ - 'button' => 'İki faktörlü doğrulamayı yapılandır.', - 'disabled' => 'Hesabınızda iki faktörlü kimlik doğrulama devre dışı bırakıldı. Artık oturum açarken bir jeton sağlamanız istenmeyecek.', - 'enabled' => 'Hesabınızda iki faktörlü kimlik doğrulama etkinleştirildi! Artık giriş yaparken cihazınız tarafından oluşturulan kodu girmeniz istenecektir.', - 'invalid' => 'Sağlanan token geçersiz.', - 'setup' => [ - 'title' => 'İki faktörlü doğrulamayı kur', - 'help' => 'Kodu tarayamıyor musunuz? Aşağıdaki kodu :application girin', - 'field' => 'Token gir', - ], - 'disable' => [ - 'title' => 'İki faktörlü kimlik doğrulamayı devre dışı bırak', - 'field' => 'Token gir', - ], - ], -]; diff --git a/lang/tr/dashboard/index.php b/lang/tr/dashboard/index.php deleted file mode 100644 index fe534ac7bc..0000000000 --- a/lang/tr/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Sunucu ara...', - 'no_matches' => 'Sağlanan arama kriterleriyle eşleşen sunucu bulunamadı.', - 'cpu_title' => 'İşlemci (CPU)', - 'memory_title' => 'Bellek (Ram)', -]; diff --git a/lang/tr/exceptions.php b/lang/tr/exceptions.php index cdf44c0891..67c1eb8bee 100644 --- a/lang/tr/exceptions.php +++ b/lang/tr/exceptions.php @@ -1,55 +1,64 @@ 'Arka plan programıyla iletişim kurmaya çalışırken bir HTTP/:code yanıt koduyla sonuçlanan bir hata oluştu. Bu hata günlüğe kaydedildi.', + 'daemon_connection_failed' => 'Daemon ile iletişim kurulmaya çalışılırken bir istisna oluştu ve HTTP/:code yanıt kodu alındı. Bu istisna kaydedildi.', 'node' => [ - 'servers_attached' => 'Bir node\'un silinebilmesi için kendisine bağlı hiçbir sunucunun olmaması gerekir.', - 'daemon_off_config_updated' => 'Daemon yapılandırması güncellendi, ancak Daemon\'daki yapılandırma dosyası otomatik olarak güncellenmeye çalışılırken bir hatayla karşılaşıldı. Bu değişiklikleri uygulamak için arka plan programının yapılandırma dosyasını (config.yml) manuel olarak güncellemeniz gerekecektir.', + 'servers_attached' => 'Bir düğümün silinebilmesi için hiçbir sunucuya bağlı olmaması gerekir.', + 'error_connecting' => ':node ile bağlantı kurulurken hata oluştu', + 'daemon_off_config_updated' => 'Daemon yapılandırması güncellendi, ancak Daemon üzerindeki yapılandırma dosyasını otomatik olarak güncellemeye çalışırken bir hata oluştu. Bu değişiklikleri uygulamak için yapılandırma dosyasını (config.yml) manuel olarak güncellemeniz gerekecek.', ], 'allocations' => [ - 'server_using' => 'Şu anda bu lokasyon bir sunucu atanmış. Bir lokasyon yalnızca şu anda hiçbir sunucu atanmamışsa silinebilir.', - 'too_many_ports' => 'Tek bir aralığa 1000\'den fazla port (Bağlantı noktası) aynı anda eklenmesi desteklenmez.', - 'invalid_mapping' => ':port için sağlanan eşleme geçersizdi ve uyhulanmadı.', - 'cidr_out_of_range' => 'CIDR gösterimi yalnızca /25 ile /32 arasındaki maskelere izin verir.', - 'port_out_of_range' => 'Bir tahsisteki bağlantı noktaları 1024\'ten büyük ve 65535\'ten küçük veya ona eşit olmalıdır.', + 'server_using' => 'Bu tahsis, şu anda bir sunucuya atanmış durumda. Bir tahsis yalnızca hiçbir sunucuya atanmamışsa silinebilir.', + 'too_many_ports' => 'Tek seferde 1000\'den fazla port eklemek desteklenmiyor.', + 'invalid_mapping' => ':port için sağlanan eşleme geçersiz ve işlenemedi.', + 'cidr_out_of_range' => 'CIDR notasyonu yalnızca /25 ile /32 arasındaki maskelere izin verir.', + 'port_out_of_range' => 'Bir tahsisdeki portlar 1024\'ten büyük veya eşit ve 65535\'ten küçük veya eşit olmalıdır.', ], 'egg' => [ - 'delete_has_servers' => 'Aktif sunucuların bağlı olduğu bir Node Panelden silinemez.', - 'invalid_copy_id' => 'Bir komut dosyasını kopyalamak için seçilen Node mevcut değil veya bir komut dosyasının kendisini kopyalıyor.', - 'has_children' => 'Bu Node bir veya daha fazla Node\'un ebeveynidir. Lütfen bu Node\'u silmeden önce bu Yumurtaları silin.', + 'delete_has_servers' => 'Üzerinde aktif sunucular bulunan bir Egg, Panel\'den silinemez.', + 'invalid_copy_id' => 'Komut dosyası kopyalamak için seçilen Egg ya mevcut değil ya da kendisi bir komut dosyası kopyalıyor.', + 'has_children' => 'Bu Egg, bir veya daha fazla Egg\'in ebeveynidir. Lütfen bu Egg\'i silmeden önce diğer Egg\'leri silin.', ], 'variables' => [ - 'env_not_unique' => ':name ortam değişkeni bu Egg\'e özgü olmalıdır.', - 'reserved_name' => 'Ortam değişkeni :name korunur ve bir değişkene atanamaz.', - 'bad_validation_rule' => 'Doğrulama kuralı ":rule" bu uygulama için geçerli bir kural değil.', + 'env_not_unique' => ':name ortam değişkeni bu Egg için benzersiz olmalıdır.', + 'reserved_name' => ':name ortam değişkeni korumalıdır ve bir değişkene atanamaz.', + 'bad_validation_rule' => '":rule" doğrulama kuralı bu uygulama için geçerli bir kural değildir.', ], 'importer' => [ - 'json_error' => 'JSON dosyası ayrıştırılmaya çalışılırken bir hata oluştu: :error.', - 'file_error' => 'Sağlanan JSON dosyası geçerli değildi.', - 'invalid_json_provided' => 'Sağlanan JSON dosyası tanınabilecek bir formatta değil.', + 'json_error' => 'JSON dosyası ayrıştırılırken bir hata oluştu: :error.', + 'file_error' => 'Sağlanan JSON dosyası geçerli değil.', + 'invalid_json_provided' => 'Sağlanan JSON dosyası tanınabilir bir biçimde değil.', ], 'subusers' => [ 'editing_self' => 'Kendi alt kullanıcı hesabınızı düzenlemenize izin verilmez.', 'user_is_owner' => 'Sunucu sahibini bu sunucu için alt kullanıcı olarak ekleyemezsiniz.', - 'subuser_exists' => 'Bu e-posta adresine sahip bir kullanıcı zaten bu sunucu için bir alt kullanıcı olarak atanmış.', + 'subuser_exists' => 'Bu e-posta adresine sahip bir kullanıcı zaten bu sunucuya alt kullanıcı olarak atanmış.', ], 'databases' => [ - 'delete_has_databases' => 'Kendisine bağlı etkin veritabanları bulunan bir veritabanı ana bilgisayar sunucusu silinemez.', + 'delete_has_databases' => 'Üzerinde aktif veritabanları bulunan bir veritabanı sunucusu silinemez.', ], 'tasks' => [ 'chain_interval_too_long' => 'Zincirleme bir görev için maksimum aralık süresi 15 dakikadır.', ], 'locations' => [ - 'has_nodes' => 'Etkin nodeların eklendiği konum silinemez.', + 'has_nodes' => 'Üzerinde aktif düğümler bulunan bir konum silinemez.', ], 'users' => [ - 'node_revocation_failed' => 'Node #:node\'daki anahtarlar iptal edilemedi. :hata', + 'is_self' => 'Kendi kullanıcı hesabınızı silemezsiniz.', + 'has_servers' => 'Hesabında aktif sunucular bulunan bir kullanıcı silinemez. Lütfen devam etmeden önce sunucularını silin.', + 'node_revocation_failed' => '#:node Düğümü üzerinde anahtarlar iptal edilemedi. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'Otomatik dağıtım için belirtilen gereksinimleri karşılayan node bulunamadı.', - 'no_viable_allocations' => 'Otomatik dağıtım gereksinimlerini karşılayan hiçbir ayırma bulunamadı.', + 'no_viable_nodes' => 'Otomatik dağıtım için belirtilen gereksinimleri karşılayan hiçbir düğüm bulunamadı.', + 'no_viable_allocations' => 'Otomatik dağıtım için gereksinimleri karşılayan hiçbir tahsis bulunamadı.', ], 'api' => [ - 'resource_not_found' => 'İstenen kaynak bu sunucuda mevcut değil.', + 'resource_not_found' => 'İstenen kaynak bu sunucuda bulunamadı.', + ], + 'mount' => [ + 'servers_attached' => 'Bir bağlama noktasının silinebilmesi için hiçbir sunucuya bağlı olmaması gerekir.', + ], + 'server' => [ + 'marked_as_failed' => 'Bu sunucu henüz kurulum sürecini tamamlamadı, lütfen daha sonra tekrar deneyin.', ], ]; diff --git a/lang/tr/pagination.php b/lang/tr/pagination.php deleted file mode 100644 index c94aeea85c..0000000000 --- a/lang/tr/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Önceki', - 'next' => 'Sonraki »', -]; diff --git a/lang/tr/passwords.php b/lang/tr/passwords.php deleted file mode 100644 index 7c38d42f57..0000000000 --- a/lang/tr/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Şifreniz en az altı karakterden oluşmalı ve şifre doğrulaması ile eşleşmelidir.', - 'reset' => 'Parolanız sıfırlandı!', - 'sent' => 'Parola sıfırlama bağlantısı eposta adresinize yollandı!', - 'token' => 'Parola sıfırlama kodu geçersiz.', - 'user' => 'Bu e-posta adresine sahip bir kullanıcı bulunamadı.', -]; diff --git a/lang/tr/search.php b/lang/tr/search.php new file mode 100644 index 0000000000..99dca836d7 --- /dev/null +++ b/lang/tr/search.php @@ -0,0 +1,9 @@ + 'Lütfen aramaya başlamak için en az üç karakter girin.', + 'term' => [ + 'label' => 'Arama terimi', + 'description' => 'Aramaya başlamak için bir sunucu adı, uuid veya tahsis girin.', + ], +]; diff --git a/lang/tr/server/users.php b/lang/tr/server/users.php deleted file mode 100644 index b2622149ec..0000000000 --- a/lang/tr/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Bu sunucunun web soketine erişime izin verir.', - 'control_console' => 'Kullanıcıya sunucu konsoluna veri gönderme izni verir.', - 'control_start' => 'Kullanıcıya sunucu örneğini başlatma izni verir.', - 'control_stop' => 'Kullanıcıya sunucu örneğini durdurma izni verir.', - 'control_restart' => 'Kullanıcıya sunucu örneğini yeniden başlatma izni verir.', - 'control_kill' => 'Kullanıcıya sunucu örneğini sonlandırma izni verir.', - 'user_create' => 'Kullanıcıya sunucu için yeni kullanıcı hesapları oluşturma izni verir.', - 'user_read' => 'Kullanıcıya, bu sunucuyla ilişkili kullanıcıları görüntüleme izni verir.', - 'user_update' => 'Kullanıcıya bu sunucuyla ilişkili diğer kullanıcıları değiştirme izni verir', - 'user_delete' => 'Kullanıcıya bu sunucuyla ilişkili diğer kullanıcıları silme izni verir.', - 'file_create' => 'Kullanıcıya yeni dosyalar ve dizinler oluşturma izni verir.', - 'file_read' => 'Kullanıcıya bu sunucu örneği ile ilişkilendirilmiş dosya ve klasörleri görmesine ve içeriklerini görüntülemesine izin verir.', - 'file_update' => 'Kullanıcıya sunucu ile ilişkilendirilmiş dosyaları ve klasörleri güncelleme izni verir.', - 'file_delete' => 'Kullanıcıya dosyaları ve dizinleri silme izni verir.', - 'file_archive' => 'Kullanıcının dosya arşivleri oluşturmasına ve arşivden çıkartmasına izin verir.', - 'file_sftp' => 'Kullanıcının SFTP kullanarak dosyalarda işlem yapmasına izin verir.', - 'allocation_read' => 'Sunucu tahsis yönetim sayfalarına erişim izni verir.', - 'allocation_update' => 'Kullanıcıya sunucunun tahsislerine değişiklik yapma izni verir.', - 'database_create' => 'Kullanıcının yeni veritabanı oluşturmasına izin verir.', - 'database_read' => 'Kullanıcının veritabanlarını görmesine izin verir.', - 'database_update' => 'Kullanıcının veritabanında düzenlemeler yapmasına izin verir. Eğer kullanıcının veritabanı şifresini görüntüleme izni yok ise şifreyi düzenleyemez.', - 'database_delete' => 'Kullanıcının veritabanı silmesine izin verir.', - 'database_view_password' => 'Kullanıcının veritabanı şifresini görmesine izin verir.', - 'schedule_create' => 'Kullanıcı yeni zamanlı görevler oluşturmasına izin verir.', - 'schedule_read' => 'Kullanıcının zamanlı görevleri görmesine izin verir.', - 'schedule_update' => 'Kullanıcının var olan zamanlı görevde düzenleme yapmasına izin verir.', - 'schedule_delete' => 'Kullanıcının sunucu için bir zamanlı görevi silmesine izin verir.', - ], -]; diff --git a/lang/tr/strings.php b/lang/tr/strings.php deleted file mode 100644 index 60de0fbdd9..0000000000 --- a/lang/tr/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'E-Posta', - 'email_address' => 'E-Posta adresi', - 'user_identifier' => 'Kullanıcı adı veya E-Posta', - 'password' => 'Parola', - 'new_password' => 'Yeni parola', - 'confirm_password' => 'Yeni parolayı doğrula', - 'login' => 'Giriş Yap', - 'home' => 'Ana Sayfa', - 'servers' => 'Sunucular', - 'id' => 'ID', - 'name' => 'Ad', - 'node' => 'Node', - 'connection' => 'Bağlantı', - 'memory' => 'Ram', - 'cpu' => 'CPU', - 'disk' => 'Depolama', - 'status' => 'Durum', - 'search' => 'Ara', - 'suspended' => 'Askıya alındı', - 'account' => 'Hesap', - 'security' => 'Güvenlik', - 'ip' => 'IP Adresi', - 'last_activity' => 'Son Aktivite', - 'revoke' => 'İptal Et', - '2fa_token' => 'Giriş Token\'i', - 'submit' => 'Gönder', - 'close' => 'Kapat', - 'settings' => 'Ayarlar', - 'configuration' => 'Yapılandırma', - 'sftp' => 'SFTP', - 'databases' => 'Veritabanları', - 'memo' => 'Not', - 'created' => 'Oluşturuldu', - 'expires' => 'Bitiş süresi', - 'public_key' => 'Token', - 'api_access' => 'Api Erişimi', - 'never' => 'asla', - 'sign_out' => 'Çıkış Yap', - 'admin_control' => 'Yönetici Paneli', - 'required' => 'Gerekli', - 'port' => 'Bağlantı Noktası (port)', - 'username' => 'Kullanıcı Adı', - 'database' => 'Veritabanı', - 'new' => 'Yeni', - 'danger' => 'Tehlikeli', - 'create' => 'Oluştur', - 'select_all' => 'Tümünü Seç', - 'select_none' => 'Tümünü Kaldır', - 'alias' => 'Takma Ad', - 'primary' => 'Birincil', - 'make_primary' => 'Birincil Yap', - 'none' => 'Yok', - 'cancel' => 'İptal Et', - 'created_at' => 'Oluşturma Tarihi', - 'action' => 'Eylem', - 'data' => 'Veri', - 'queued' => 'Sıraya alındı', - 'last_run' => 'Son Çalıştırma', - 'next_run' => 'Sonraki Çalışma', - 'not_run_yet' => 'Henüz çalıştırılmadı', - 'yes' => 'Evet', - 'no' => 'Hayır', - 'delete' => 'Sil', - '2fa' => '2FA', - 'logout' => 'Çıkış yap', - 'admin_cp' => 'Yönetici Paneli', - 'optional' => 'İsteğe bağlı', - 'read_only' => 'Salt Okunur', - 'relation' => 'İlişki', - 'owner' => 'Sahibi', - 'admin' => 'Yönetici', - 'subuser' => 'Alt Kullanıcılar', - 'captcha_invalid' => 'Captcha doğrulaması geçersiz.', - 'tasks' => 'Görevler', - 'seconds' => 'Saniye', - 'minutes' => 'Dakika', - 'under_maintenance' => 'Bakımda', - 'days' => [ - 'sun' => 'Pazar', - 'mon' => 'Pazartesi', - 'tues' => 'Salı', - 'wed' => 'Çarşamba', - 'thurs' => 'Perşembe', - 'fri' => 'Cuma', - 'sat' => 'Cumartesi', - ], - 'last_used' => 'Son Kullanılan', - 'enable' => 'Aktif', - 'disable' => 'Kapalı', - 'save' => 'Kaydet', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/tr/validation.php b/lang/tr/validation.php index 23bafe75b8..59eb7909ff 100644 --- a/lang/tr/validation.php +++ b/lang/tr/validation.php @@ -13,77 +13,72 @@ */ 'accepted' => ':attribute kabul edilmelidir.', - 'active_url' => ':attribute geçerli bir URL değil.', - 'after' => ':attribute şu tarihten :date sonra olmalı.', - 'after_or_equal' => ':attribute, :date tarihi ile aynı veya bundan sonraki bir tarih olmalıdır.', - 'alpha' => ':attribute sadece harf içerebilir.', - 'alpha_dash' => ':attribute sadece harf, sayı ve kısa çizgi içerebilir.', - 'alpha_num' => ':attribute sadece harf ve sayı içerebilir.', + 'active_url' => ':attribute geçerli bir URL olmalıdır.', + 'after' => ':attribute, :date tarihinden sonra olmalıdır.', + 'after_or_equal' => ':attribute, :date tarihi ile aynı veya sonrası olmalıdır.', + 'alpha' => ':attribute yalnızca harfler içerebilir.', + 'alpha_dash' => ':attribute yalnızca harfler, sayılar ve tireler içerebilir.', + 'alpha_num' => ':attribute yalnızca harfler ve sayılar içerebilir.', 'array' => ':attribute bir dizi olmalıdır.', - 'before' => ':attribute, :date tarihinden önceki bir tarih olmalıdır.', - 'before_or_equal' => ':attribute, :date tarihi ile aynı veya sonraki bir tarih olmalıdır.', + 'before' => ':attribute, :date tarihinden önce olmalıdır.', + 'before_or_equal' => ':attribute, :date tarihi ile aynı veya öncesi olmalıdır.', 'between' => [ - 'numeric' => ':attribute, :min ve :max arasında olmalıdır.', - 'file' => ':attribute, :min ve :max kilobyte boyutları arasında olmalıdır.', - 'string' => ':attribute :min karakter ve :max karakter arasında olmalıdır.', - 'array' => ':attribute, :min ve :max öge arasında olmalıdır.', + 'numeric' => ':attribute, :min ile :max arasında olmalıdır.', + 'file' => ':attribute, :min ile :max kilobayt arasında olmalıdır.', + 'string' => ':attribute, :min ile :max karakter arasında olmalıdır.', + 'array' => ':attribute, :min ile :max öğe arasında olmalıdır.', ], - 'boolean' => ':attribute sadece doğru veya yanlış olmalıdır.', - 'confirmed' => ':attribute doğrulaması uyuşmuyor.', - 'date' => ':attribute geçersiz bir tarih.', - 'date_format' => ':attribute :format formatına uymuyor.', - 'different' => ':attribute ve :other birbirinden farklı olmalıdır.', - 'digits' => ':attribute, :digits rakam olmalıdır.', - 'digits_between' => ':attribute :min ile :max arasında rakam olmalıdır.', - 'dimensions' => ':attribute geçersiz görüntü boyutlarına sahip.', - 'distinct' => ':attribute alanında tekrarlanan bir değer var.', + + 'confirmed' => ':attribute doğrulaması eşleşmiyor.', + 'date' => ':attribute geçerli bir tarih olmalıdır.', + 'date_format' => ':attribute, :format biçimiyle eşleşmiyor.', + 'different' => ':attribute ve :other farklı olmalıdır.', + 'digits' => ':attribute, :digits haneli olmalıdır.', + 'digits_between' => ':attribute, :min ile :max haneli olmalıdır.', + 'dimensions' => ':attribute geçersiz resim boyutlarına sahiptir.', + 'email' => ':attribute geçerli bir e-posta adresi olmalıdır.', - 'exists' => 'Seçilen :attribute geçersiz.', + 'file' => ':attribute bir dosya olmalıdır.', - 'filled' => ':attribute alanı zorunludur.', + 'filled' => ':attribute alanı gereklidir.', 'image' => ':attribute bir resim olmalıdır.', - 'in' => 'Seçilen :attribute geçersiz.', - 'in_array' => ':attribute alanı :other içinde mevcut değil.', + + 'in_array' => ':attribute alanı, :other içinde bulunmalıdır.', 'integer' => ':attribute bir tam sayı olmalıdır.', 'ip' => ':attribute geçerli bir IP adresi olmalıdır.', 'json' => ':attribute geçerli bir JSON dizesi olmalıdır.', 'max' => [ - 'numeric' => ':attribute, :max değerinden büyük olmayabilir.', - 'file' => ':attribute, :max kilobayttan daha büyük olmamalıdır.', - 'string' => ':attribute değeri :max karakter değerinden küçük olmalıdır.', - 'array' => ':attribute değeri :max adedinden az nesneye sahip olmamalıdır.', + 'numeric' => ':attribute, :max değerinden büyük olmamalıdır.', + 'file' => ':attribute, :max kilobayttan büyük olmamalıdır.', + 'string' => ':attribute, :max karakterden uzun olmamalıdır.', + 'array' => ':attribute, :max öğeden fazla içermemelidir.', ], 'mimes' => ':attribute, :values türünde bir dosya olmalıdır.', 'mimetypes' => ':attribute, :values türünde bir dosya olmalıdır.', 'min' => [ - 'numeric' => ':attribute :min den küçük olmalı.', - 'file' => ':attribute, :min kilobayttan küçük olmamalıdır.', + 'numeric' => ':attribute en az :min olmalıdır.', + 'file' => ':attribute en az :min kilobayt olmalıdır.', 'string' => ':attribute en az :min karakter olmalıdır.', - 'array' => ':attribute en az :min öğeye sahip olmalıdır.', + 'array' => ':attribute en az :min öğe içermelidir.', ], - 'not_in' => 'Seçilen :attribute geçersiz.', + 'numeric' => ':attribute bir sayı olmalıdır.', - 'present' => ':attribute alanı mevcut olmalıdır.', - 'regex' => ':attribute formatı geçersiz.', - 'required' => ':attribute alanı zorunludur.', - 'required_if' => ':other :value iken :attribute alanı gereklidir.', - 'required_unless' => ':attribute alanı, :other alanı :value değerlerinden birine sahip olmadığında zorunludur.', - 'required_with' => ':values varsa :attribute alanı zorunludur.', - 'required_with_all' => ':values varsa :attribute alanı zorunludur.', - 'required_without' => ':values mevcut değilken :attribute alanı zorunludur.', - 'required_without_all' => 'Mevcut :values değerlerinden biri olmadığında :attribute alanı zorunludur.', - 'same' => ':attribute ve :other aynı olmalı.', + + 'regex' => ':attribute biçimi geçersiz.', + + 'required_with_all' => ':attribute alanı, :values mevcut olduğunda gereklidir.', + + 'same' => ':attribute ve :other eşleşmelidir.', 'size' => [ - 'numeric' => ':attribute, :size boyutunda olmalıdır.', - 'file' => ':attribute :size kilobayt olmalıdır.', - 'string' => ': attribute en az :size karakter olmalıdır.', - 'array' => ':attribute :size nesneye sahip olmalıdır.', + 'numeric' => ':attribute, :size olmalıdır.', + 'file' => ':attribute, :size kilobayt olmalıdır.', + 'string' => ':attribute, :size karakter olmalıdır.', + 'array' => ':attribute, :size öğe içermelidir.', ], - 'string' => ':attribute bir dizi olmalıdır.', - 'timezone' => ':attribute geçerli bir bölge olmalıdır.', - 'unique' => ':attribute zaten alınmış.', - 'uploaded' => ':attribute yüklenemedi.', - 'url' => ':attribute formatı geçersiz.', + 'string' => ':attribute bir metin olmalıdır.', + 'timezone' => ':attribute geçerli bir saat dilimi olmalıdır.', + + 'url' => ':attribute biçimi geçersiz.', /* |-------------------------------------------------------------------------- @@ -101,6 +96,6 @@ // Internal validation logic for Panel 'internal' => [ 'variable_value' => ':env değişkeni', - 'invalid_password' => 'Bu kullanıcı için girilen şifre hatalıdır.', + 'invalid_password' => 'Sağlanan şifre bu hesap için geçersizdir.', ], ]; diff --git a/lang/uk/activity.php b/lang/uk/activity.php index 501a1dcde6..902519f59e 100644 --- a/lang/uk/activity.php +++ b/lang/uk/activity.php @@ -8,123 +8,118 @@ */ return [ 'auth' => [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', + 'fail' => 'Не вдалося увійти', + 'success' => 'Увійшов', + 'password-reset' => 'Скидання пароля', + 'checkpoint' => 'Потрібна двофакторна автентифікація', + 'recovery-token' => 'Використано токен відновлення двофакторної автентифікації', + 'token' => 'Пройдено двофакторну аутентифікацію', + 'ip-blocked' => 'Заблоковано запит із невідомої IP-адреси для :identifier', 'sftp' => [ - 'fail' => 'Failed SFTP log in', + 'fail' => 'Помилка входу через SFTP', ], ], 'user' => [ 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', + 'username-changed' => 'Змінено ім\'я користувача з :old на :new', + 'email-changed' => 'Змінити адресу електронної пошти з :old на :new', + 'password-changed' => 'Змінено пароль', ], 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', + 'create' => 'Створено новий ключ API :identifier', + 'delete' => 'Видалено ключ API :identifier', ], 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', + 'create' => 'Додано SSH ключ :fingerprint для облікового запису', + 'delete' => 'Видалено SSH ключ :fingerprint для облікового запису', ], 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', + 'create' => 'Увімкнено двофакторну аутентифікацію', + 'delete' => 'Вимкнено двофакторну аутентифікацію', ], ], 'server' => [ - 'reinstall' => 'Reinstalled server', 'console' => [ - 'command' => 'Executed ":command" on the server', + 'command' => 'Виконано ":command" на сервері', ], 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', + 'start' => 'Сервер запущено', + 'stop' => 'Сервер зупинено', + 'restart' => 'Сервер перезапущено', + 'kill' => 'Завершено серверний процес', ], 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', + 'download' => 'Завантажено резервну копію :name', + 'delete' => 'Видалено резервну копію :name', + 'restore' => 'Відновлено резервну копію :name (видалені файли: :truncate)', + 'restore-complete' => 'Завершено відновлення резервної копії :name', + 'restore-failed' => 'Не вдалося виконати відновлення резервної копії :name', + 'start' => 'Запущено створення резервної копії :name', + 'complete' => 'Позначено резервну копію :name як завершену', + 'fail' => 'Позначено резервну копію :name як невдалу', + 'lock' => 'Заблоковано резервну копію :name', + 'unlock' => 'Розблоковано резервну копію :name', + 'rename' => 'Перейменування резервної копії з ":old_name" на ":new_name"', ], 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', + 'create' => 'Створено нову базу даних :name', + 'rotate-password' => 'Пароль змінено для бази даних :name', + 'delete' => 'Видалено базу даних :name', ], 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', + 'compress' => 'Стиснуто :directory:files | Стиснуто :count файлів у :directory', + 'read' => 'Переглянуто вміст :file', + 'copy' => 'Створено копію :file', + 'create-directory' => 'Створено каталог :directory:name', + 'decompress' => 'Розпаковано :file у :directory', + 'delete' => 'Видалено :directory:files | Видалено :count файлів у :directory', + 'download' => 'Завантажено :file', + 'pull' => 'Завантажено віддалений файл з :url до :directory', + 'rename' => 'Переміщено/перейменовано :from у :to|Переміщено/перейменовано :count файлів у :directory', + 'write' => 'Записано новий вміст у :file', + 'upload' => 'Розпочато завантаження файлу', + 'uploaded' => 'Завантажено :directory:file', ], 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', + 'denied' => 'Заблоковано доступ SFTP через обмеження прав', + 'create' => 'Створено :files | Створено :count нових файлів', + 'write' => 'Змінено вміст :files | Змінено вміст :count файлів', + 'delete' => 'Видалено :files | Видалено :count файлів', + 'create-directory' => 'Створено каталог :files | Створено :count каталогів', + 'rename' => 'Перейменовано :from у :to | Перейменовано або переміщено :count файлів', ], 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', + 'create' => 'Додано :allocation на сервер', + 'notes' => 'Оновлено нотатки для :allocation з ":old" на ":new"', + 'primary' => 'Встановлено :allocation як основний порт сервера', + 'delete' => 'Видалено :allocation порт', ], 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', + 'create' => 'Створено :name розклад', + 'update' => 'Оновлено :name розклад', + 'execute' => 'Вручну виконано розклад :name', + 'delete' => 'Видалено :name розклад', ], 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', + 'create' => 'Створено нове завдання ":action" для :name', + 'update' => 'Оновлено завдання ":action" для :name', + 'delete' => 'Видалено завдання ":action" для розкладу :name', ], 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', + 'rename' => 'Перейменовано сервер з ":old" на ":new"', + 'description' => 'Змінено опис сервера з ":old" на ":new"', + 'reinstall' => 'Сервер перевстановлено', ], 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', + 'edit' => 'Змінено параметр :variable з ":old" на ":new"', + 'image' => 'Оновлено Docker зображення для сервера з :old на :new', + 'command' => 'Оновлено Docker образ для сервера з :old на :new', ], 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', + 'create' => 'Додано :email як субкористувача', + 'update' => 'Оновлено дозволи субкористувача для :email', + 'delete' => 'Видалено :email як субкористувача', ], + 'crashed' => 'Сервер зазнав помилки', ], ]; diff --git a/lang/uk/admin/apikey.php b/lang/uk/admin/apikey.php new file mode 100644 index 0000000000..bf08966f30 --- /dev/null +++ b/lang/uk/admin/apikey.php @@ -0,0 +1,27 @@ + 'API Ключі застосунку', + 'empty' => 'Немає ключів API', + 'whitelist' => 'Дозволені IPv4-адреси', + 'whitelist_help' => 'API Ключі можна обмежити для використання лише з певних IPv4-адрес. Введіть кожну адресу з нового рядка.', + 'whitelist_placeholder' => 'Приклад: 127.0.0.1 або 192.168.1.1', + 'description' => 'Опис', + 'description_help' => 'Короткий опис призначення цього ключа.', + 'nav_title' => 'API Ключі', + 'model_label' => 'API Ключ застосунку', + 'model_label_plural' => 'API Ключі застосунку', + 'table' => [ + 'key' => 'Ключ', + 'description' => 'Опис', + 'last_used' => 'Останнє використання', + 'created' => 'Створено', + 'created_by' => 'Створив', + 'never_used' => 'Ніколи не використовувався', + ], + 'permissions' => [ + 'none' => 'Немає', + 'read' => 'Читання', + 'read_write' => 'Читання та Запис', + ], +]; diff --git a/lang/uk/admin/dashboard.php b/lang/uk/admin/dashboard.php new file mode 100644 index 0000000000..95a13aaf36 --- /dev/null +++ b/lang/uk/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Ласкаво просимо до Pelican!', + 'version' => 'Версія: :version', + 'advanced' => 'Розширені налаштування', + 'server' => 'Сервер', + 'user' => 'Користувач', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Інформація для розробників', + 'content' => 'Дякуємо, що випробовуєте версію для розробників!', + 'extra_note' => 'Якщо ви зіткнулися з проблемами, будь ласка, повідомте про них на GitHub.', + 'button_issues' => 'Створити проблему', + 'button_features' => 'Обговорити функції', + ], + 'intro-update-available' => [ + 'heading' => 'Доступне оновлення', + 'content' => ':latestVersion вже доступна! Ознайомтеся з нашою документацією, щоб оновити свою панель.', + 'button_changelog' => 'Що нового?', + ], + 'intro-no-update' => [ + 'heading' => 'Ваша панель останньої версії', + 'content' => 'Ви зараз використовуєте :version. Ваша панель останньої версії!', + ], + 'intro-first-node' => [ + 'heading' => 'Вузлів не знайдено', + 'content' => 'Здається, у вас ще немає налаштованих вузлів, але не хвилюйтеся! Натисніть кнопку дії, щоб створити перший вузол!', + 'extra_note' => 'Якщо ви зіткнулися з проблемами, будь ласка, повідомте про них на GitHub.', + 'button_label' => 'Створити перший вузол у Pelican', + ], + 'intro-support' => [ + 'heading' => 'Підтримайте Pelican', + 'content' => 'Дякуємо, що використовуєте Pelican! Цього вдалося досягти лише завдяки підтримці від вас, наших учасників та всіх інших користувачів!', + 'extra_note' => 'Ми вдячні за будь-яку підтримку від кожного з вас.', + 'button_translate' => 'Допомогти з перекладом', + 'button_donate' => 'Підтримати фінансово', + ], + 'intro-help' => [ + 'heading' => 'Потрібна допомога?', + 'content' => 'Спочатку перегляньте документацію! Якщо вам все ще потрібна допомога, приєднуйтеся до нашого Discord-сервера!', + 'button_docs' => 'Читати документацію', + ], + ], +]; diff --git a/lang/uk/admin/databasehost.php b/lang/uk/admin/databasehost.php new file mode 100644 index 0000000000..3dc39411d6 --- /dev/null +++ b/lang/uk/admin/databasehost.php @@ -0,0 +1,73 @@ + 'Хости баз даних', + 'model_label' => 'Хост бази даних', + 'model_label_plural' => 'Хости баз даних', + 'table' => [ + 'database' => 'База даних', + 'name' => 'Ім’я', + 'host' => 'Хост', + 'port' => 'Порт', + 'name_helper' => 'Якщо залишити порожнім, буде автоматично згенеровано випадкове ім’я', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + 'remote' => 'Дозволені підключення', + 'remote_helper' => 'Звідки дозволені підключення. Залиште порожнім, щоб дозволити підключення звідусіль.', + 'max_connections' => 'Максимальна кількість з\'єднань', + 'created_at' => 'Створено', + 'connection_string' => 'JDBC-рядок підключення', + ], + 'error' => 'Помилка підключення до хоста', + 'host' => 'Хост', + 'host_help' => 'IP-адреса або доменне ім’я, яке використовується для підключення до цього MySQL-хоста з панелі для створення нових баз даних.', + 'port' => 'Порт', + 'port_help' => 'Порт, на якому працює MySQL для цього хоста.', + 'max_database' => 'Максимальна кількість баз даних', + 'max_databases_help' => 'Максимальна кількість баз даних, які можна створити на цьому хості. Якщо ліміт досягнуто, нові бази даних не можна створювати. Якщо залишити порожнім — без обмежень.', + 'display_name' => 'Відображуване ім’я', + 'display_name_help' => 'IP-адреса або доменне ім\'я, яке має відображатися кінцевому користувачеві.', + 'username' => 'Ім\'я користувача', + 'username_help' => 'Ім’я користувача облікового запису, який має достатньо прав для створення нових користувачів і баз даних у системі.', + 'password' => 'Пароль', + 'password_help' => 'Пароль для користувача бази даних.', + 'linked_nodes' => 'Пов’язані вузли', + 'linked_nodes_help' => 'Це налаштування використовується за замовчуванням для цього хоста бази даних при додаванні бази даних до сервера на вибраному вузлі.', + 'connection_error' => 'Помилка підключення до хоста бази даних', + 'no_database_hosts' => 'Немає хостів баз даних', + 'no_nodes' => 'Немає вузлів', + 'delete_help' => 'Хост бази даних містить бази даних', + 'unlimited' => 'Необмежено', + 'anywhere' => 'Будь-де', + + 'rotate' => 'Оновити', + 'rotate_password' => 'Оновити пароль', + 'rotated' => 'Пароль оновлено', + 'rotate_error' => 'Помилка оновлення пароля', + 'databases' => 'Бази даних', + + 'setup' => [ + 'preparations' => 'Підготовка', + 'database_setup' => 'Налаштування бази даних', + 'panel_setup' => 'Налаштування панелі', + + 'note' => 'Зараз підтримуються лише бази даних MySQL/ MariaDB для хостів!', + 'different_server' => 'Панель і база даних не на одному сервері?', + + 'database_user' => 'Користувач бази даних', + 'cli_login' => 'Використовуйте mysql -u root -p для доступу до mysql cli.', + 'command_create_user' => 'Команда, що створює користувача', + 'command_assign_permissions' => 'Команда, що назначає дозволи', + 'cli_exit' => 'Для виходу з mysql cli запустіть exit.', + 'external_access' => 'Зовнішній доступ', + 'allow_external_access' => ' +

Швидше за все, вам потрібно буде дозволити зовнішній доступ до цього екземпляра MySQL, щоб дозволити серверам підключатися до нього.

+
+

Для цього відкрийте my.cnf, розташування якого залежить від вашої ОС і способу встановлення MySQL. Ви можете ввести find /etc -iname my.cnf, щоб знайти його.

+
+

Відкрийте my.cnf, додайте текст нижче внизу файлу та збережіть його:
+ [mysqld]
bind-address=0.0.0.0

+
+

Перезапустіть MySQL/ MariaDB, щоб застосувати ці зміни. Це перевизначить стандартну конфігурацію MySQL, яка за замовчуванням прийматиме лише запити від localhost. Оновлення цього дозволить з’єднання на всіх інтерфейсах, а отже, зовнішні з’єднання. Переконайтеся, що дозволено порт MySQL (за замовчуванням 3306) у вашому брандмауері.

', + ], +]; diff --git a/lang/uk/admin/egg.php b/lang/uk/admin/egg.php new file mode 100644 index 0000000000..e830449dfb --- /dev/null +++ b/lang/uk/admin/egg.php @@ -0,0 +1,108 @@ + 'Яйця', + 'model_label' => 'Яйце', + 'model_label_plural' => 'Яйця', + 'tabs' => [ + 'configuration' => 'Налаштування', + 'process_management' => 'Керування процесом', + 'egg_variables' => 'Змінні яйця', + 'install_script' => 'Скрипт встановлення', + ], + 'import' => [ + 'file' => 'Файл', + 'url' => 'URL', + 'image_url' => 'URL зображення', + 'image_error' => 'Не вдається отримати зображення', + 'image_too_large' => 'Зображення занадто велике. Обмеження - 1024KB', + 'egg_help' => 'Це має бути безпосередньо .json файл (наприклад, egg-minecraft.json)', + 'url_help' => 'URL-адреси повинні вказувати безпосередньо до файлу .json', + 'add_url' => 'Нова URL-адреса', + 'import_failed' => 'Помилка імпорту', + 'import_success' => 'Імпорт успішний', + 'github' => 'Додати з Github', + 'refresh' => 'Оновити', + 'import_image' => 'Завантажити зображення', + 'no_local_ip' => 'Локальні IP-адреси не дозволені', + 'unsupported_format' => 'Непідтримуваний формат. Підтримувані формати: :formats', + 'invalid_url' => 'Наданий URL недійсний', + 'image_deleted' => 'Зображення видалено', + 'no_image' => 'Не вказано жодного зображення', + 'image_updated' => 'Зображення оновлено', + ], + 'export' => [ + 'modal' => 'Як би ви хотіли експортувати :egg ?', + 'as' => 'Як .:format', + ], + 'in_use' => 'Використовується', + 'servers' => 'Сервери', + 'name' => 'Назва', + 'egg_uuid' => 'UUID яйця', + 'egg_id' => 'ID яйця', + 'name_help' => 'Просте, зрозуміле ім’я, яке буде використовуватися як ідентифікатор цього яйця.', + 'author' => 'Автор', + 'uuid_help' => 'Це глобально унікальний ідентифікатор цього яйця, який використовується у Wings.', + 'author_help' => 'Автор цієї версії яйця.', + 'author_help_edit' => 'Автор цієї версії яйця. Завантаження нової конфігурації від іншого автора змінить це поле.', + 'description' => 'Опис', + 'description_help' => 'Опис цього яйця, який буде відображатися у панелі за потреби.', + 'add_startup' => 'Додати команду запуску', + 'startup_command' => 'Команда', + 'startup_commands' => 'Команди запуску', + 'startup_name' => 'Відображувана назва', + 'startup_help' => 'Команди запуску, доступні на серверах із цим яйцем. Перша — за замовчуванням.', + 'file_denylist' => 'Список заборонених файлів', + 'file_denylist_help' => 'Список файлів, які користувач не може редагувати.', + 'features' => 'Функції', + 'force_ip' => 'Примусова вихідна IP-адреса', + 'force_ip_help' => 'Примушує весь вихідний трафік мати IP-джерело, яке відповідає основному виділеному IP сервера. Необхідно для деяких ігор, якщо вузол має кілька публічних IP-адрес. Увімкнення цього параметра вимкне внутрішню мережу для серверів, які використовують це яйце, через що вони не зможуть підключатися до інших серверів на тому ж вузлі.', + 'tags' => 'Теги', + 'update_url' => 'URL-адреса оновлення', + 'update_url_help' => 'URL-адреси повинні вказувати безпосередньо до файлу .json', + 'add_image' => 'Додати Docker зображення', + 'docker_images' => 'Docker зображення', + 'docker_name' => 'Назва зображення', + 'docker_uri' => 'URI зображення', + 'docker_help' => 'Образи докера, доступні для серверів, що використовують це яйце. Перший - за замовчуванням.', + + 'stop_command' => 'Команда зупинки', + 'stop_command_help' => 'Команда, яка надсилається процесу сервера для його коректного завершення. Якщо потрібно надіслати SIGINT, введіть тут ^C.', + 'copy_from' => 'Скопіювати налаштування з', + 'copy_from_help' => 'Якщо ви хочете використовувати налаштування іншого яйця за замовчуванням, виберіть його зі списку вище.', + 'none' => 'Нічого', + 'start_config' => 'Конфігурація запуску', + 'start_config_help' => 'Список значень, які Daemon має перевіряти при запуску сервера для визначення його готовності.', + 'config_files' => 'Конфігураційні файли', + 'config_files_help' => 'JSON-репрезентація конфігураційних файлів для зміни та частин, які потрібно змінити.', + 'log_config' => 'Конфігурація журналу', + 'log_config_help' => 'JSON-репрезентація місць збереження логів і того, чи повинен Daemon створювати власні логи.', + + 'environment_variable' => 'Змінна середовища', + 'default_value' => 'Значення за замовчуванням', + 'user_permissions' => 'Дозволи користувача', + 'viewable' => 'Доступний для перегляду', + 'editable' => 'Доступний для редагування', + 'rules' => 'Правила', + 'add_new_variable' => 'Додати нову змінну', + + 'error_unique' => 'Змінна з таким ім\'ям уже існує.', + 'error_required' => 'Поле змінної середовища є обов\'язковим.', + 'error_reserved' => 'Ця змінна середовища зарезервована і не може бути використана.', + + 'script_from' => 'Скрипт із', + 'script_container' => 'Контейнер скрипту', + 'script_entry' => 'Точка входу скрипту', + 'script_install' => 'Скрипт встановлення', + 'no_eggs' => 'Немає яєць', + 'no_servers' => 'Немає серверів', + 'no_servers_help' => 'Жоден сервер не призначено цьому яйцю.', + + 'update' => 'Оновити|Оновити вибране', + 'updated' => 'Яйце оновлено|:count/:total Яйця оновлено', + 'updated_failed' => 'Невдало :count', + 'updated_skipped' => ':count пропущено', + 'update_question' => 'Ви впевнені, що хочете оновити це яйце?|Ви впевнені, що хочете оновити вибрані яйця?', + 'update_description' => 'Якщо ви внесли будь-які зміни в яйце, вони будуть перезаписані!|Якщо ви внесли будь-які зміни в яйця, вони будуть перезаписані!', + 'no_updates' => 'Немає оновлень для вибраних яєць', +]; diff --git a/lang/uk/admin/eggs.php b/lang/uk/admin/eggs.php deleted file mode 100644 index 578847b0cf..0000000000 --- a/lang/uk/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Яйце та його змінні успішно імпортовано.', - 'updated_via_import' => 'Яйце було оновлено з файлу.', - 'deleted' => 'Яйце було видалено з панелі.', - 'updated' => 'Налаштування яйця були успішно оновленні.', - 'script_updated' => 'Скрипт установки яйця був успішно оновлений і буде виконуватися під час встановлення серверів.', - 'egg_created' => 'Нове яйце було успішно створено. Щоб застосувати це нове яйце Вам знадобиться перезавантажити Wings.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Змінна ":variable" була видалена і більше не є доступна для серверів після перезавантаження.', - 'variable_updated' => 'Змінна ":variable" була оновлена. Вам знадобиться перезавантажити будь-які сервери які використовують цю змінну щоб зміни ввійшли в силу.', - 'variable_created' => 'Нову змінну успішно створено та призначено цьому яйцю.', - ], - ], -]; diff --git a/lang/uk/admin/health.php b/lang/uk/admin/health.php new file mode 100644 index 0000000000..9d1f21f6f7 --- /dev/null +++ b/lang/uk/admin/health.php @@ -0,0 +1,60 @@ + 'Стан системи', + 'results_refreshed' => 'Результати перевірки стану оновлено', + 'checked' => 'Перевірені результати від :time', + 'refresh' => 'Оновити', + 'results' => [ + 'cache' => [ + 'label' => 'Кеш', + 'ok' => 'Ок', + 'failed_retrieve' => 'Не вдалося встановити або отримати значення кешу застосунку.', + 'failed' => 'Сталася помилка в кеші застосунку: :error', + ], + 'database' => [ + 'label' => 'База даних', + 'ok' => 'Ок', + 'failed' => 'Не вдалося під\'єднатися до бази даних: :error', + ], + 'debugmode' => [ + 'label' => 'Режим налагодження', + 'ok' => 'Режим налагодження вимкнено', + 'failed' => 'Очікувалося значення :expected, але отримано :actual', + ], + 'environment' => [ + 'label' => 'Середовище', + 'ok' => 'Ок, встановлено :actual', + 'failed' => 'Середовище встановлено як :actual, очікувалося :expected', + ], + 'nodeversions' => [ + 'label' => 'Версії вузлів', + 'ok' => 'Всі вузли оновлені', + 'failed' => ':outdated із :all вузлів застарілі', + 'no_nodes_created' => 'Не створено жодного вузла', + 'no_nodes' => 'Немає вузлів', + 'all_up_to_date' => 'Всі актуальні', + 'outdated' => ':outdated із :all застарілі', + ], + 'panelversion' => [ + 'label' => 'Версія панелі', + 'ok' => 'Панель останньої версії', + 'failed' => 'Встановлена версія :currentVersion, але остання доступна версія :latestVersion', + 'up_to_date' => 'Остання версія', + 'outdated' => 'Застаріла', + ], + 'schedule' => [ + 'label' => 'Розклад', + 'ok' => 'Ок', + 'failed_last_ran' => 'Останнє виконання розкладу було більше ніж :time хвилин тому', + 'failed_not_ran' => 'Розклад ще не виконувався.', + ], + 'useddiskspace' => [ + 'label' => 'Дисковий простір', + ], + ], + 'checks' => [ + 'successful' => 'Успішно', + 'failed' => 'Помилка', + ], +]; diff --git a/lang/uk/admin/log.php b/lang/uk/admin/log.php new file mode 100644 index 0000000000..ce438f110a --- /dev/null +++ b/lang/uk/admin/log.php @@ -0,0 +1,26 @@ + 'Славно! Немає помилок!', + 'total_logs' => 'Всього логів', + 'error' => 'Помилка', + 'warning' => 'Попередження', + 'notice' => 'Повідомлення', + 'info' => 'Інформація', + 'debug' => 'Дебаг', + 'navigation' => [ + 'panel_logs' => 'Журнал панелі', + ], + 'actions' => [ + 'upload_logs' => 'Скачати журнали?', + 'upload_logs_description' => 'Скачування :file на :url Ви впевнені, що хочете це зробити?', + 'view_logs' => 'Перегляд логів', + 'log_not_found' => 'Логи не знайдені!', + 'log_not_found_description' => 'Не вдалося знайти логи для :filename', + 'failed_to_upload' => 'Не вдалося передати.', + 'failed_to_upload_description' => 'Статус HTTP: :status', + 'log_upload' => 'Логи завантажено!', + 'log_upload_action' => 'Перегляд логів', + 'upload_tooltip' => 'Завантажити на : url', + ], +]; diff --git a/lang/uk/admin/mount.php b/lang/uk/admin/mount.php new file mode 100644 index 0000000000..99ea1d31bc --- /dev/null +++ b/lang/uk/admin/mount.php @@ -0,0 +1,30 @@ + 'Точки монтування', + 'model_label' => 'Точка монтування', + 'model_label_plural' => 'Точки монтування', + 'name' => 'Назва', + 'name_help' => 'Унікальна назва, яка використовується для відокремлення цієї точки монтування від інших.', + 'source' => 'Джерело', + 'source_help' => 'Шлях до файлу на хост-системі, який потрібно змонтувати в контейнер.', + 'target' => 'Цільове розташування', + 'target_help' => 'Де ця точка монтування буде доступна всередині контейнера.', + 'read_only' => 'Тільки для читання?', + 'read_only_help' => 'Чи буде ця точка монтування доступною тільки для читання в контейнері?', + 'description' => 'Опис', + 'description_help' => 'Детальний опис цієї точки монтування.', + 'no_mounts' => 'Немає точок монтування', + 'eggs' => 'Яйця', + 'nodes' => 'Вузли', + 'toggles' => [ + 'writable' => 'Доступний для запису', + 'read_only' => 'Тільки для читання', + ], + 'table' => [ + 'name' => 'Назва', + 'all_eggs' => 'Усі яйця', + 'all_nodes' => 'Усі вузли', + 'read_only' => 'Тільки для читання', + ], +]; diff --git a/lang/uk/admin/node.php b/lang/uk/admin/node.php index 330c258188..8314e3d198 100644 --- a/lang/uk/admin/node.php +++ b/lang/uk/admin/node.php @@ -1,15 +1,149 @@ [ - 'fqdn_not_resolvable' => 'Наданий домен або IP-адреса не перетворюється на дійсну IP-адресу.', - 'fqdn_required_for_ssl' => 'Щоб використовувати SSL для цього вузла, потрібне повне доменне ім’я, яке перетворюється на дійсну загальнодоступну IP-адресу.', + 'nav_title' => 'Вузли', + 'model_label' => 'Вузол', + 'model_label_plural' => 'Вузли', + 'create' => 'Створити вузол', + 'tabs' => [ + 'overview' => 'Огляд', + 'basic_settings' => 'Основні налаштування', + 'advanced_settings' => 'Розширені налаштування', + 'config_file' => 'Файл конфігурації', + 'diagnostics' => 'Діагностика', ], - 'notices' => [ - 'allocations_added' => 'Призначення успішно додано до цього вузла.', - 'node_deleted' => 'Вузол було успішно видалено з панелі.', - 'node_created' => 'Успішно створений новий вузол. Ви можете автоматично налаштувати демон на ньому, відвідавши вкладку \'Налаштування\'. Перед доданням будь-яких серверів, ви повинні спочатку виділити хоча б одну IP адресу та порт.', - 'node_updated' => 'Інформація вузла була успішно оновлена. Якщо Ви змінили налаштування демона, то Вам необхідно перезапустити вузол для застосування змін.', - 'unallocated_deleted' => 'Видалено всі невиділені порти для :ip.', + 'table' => [ + 'health' => 'Стан', + 'name' => 'Назва', + 'address' => 'Адреса', + 'public' => 'Публічний', + 'servers' => 'Сервери', + 'alias' => 'Псевдонім', + 'ip' => 'IP', + 'egg' => 'Яйце', + 'owner' => 'Власник', + 'allocation_notes' => 'Примітки', + 'no_notes' => 'Немає приміток', ], + 'node_info' => 'Інформація про вузол', + 'wings_version' => 'Версія Wings', + 'cpu_threads' => 'Потоки CPU', + 'architecture' => 'Архітектура', + 'kernel' => 'Ядро', + 'unknown' => 'Невідомо', + 'latest' => 'Остання', + 'node_uuid' => 'UUID вузла', + 'node_id' => 'ID вузла', + + 'ip_address' => 'IP адреса', + 'ip_help' => 'Зазвичай це публічна IP-адреса вашого сервера, якщо ви не використовуєте прокидання портів.', + 'alias_help' => 'Необов’язкове відображуване ім’я для ідентифікації сервера.', + 'refresh' => 'Оновити', + 'domain' => 'Доменне ім\'я', + 'ssl_ip' => 'Не можна під\'єднатися до IP-адреси через SSL', + 'error' => 'Це доменне ім’я, яке вказує на IP-адресу вашого вузла. Якщо ви вже налаштували його, перевірте наступне поле!', + 'fqdn_help' => 'Ваша панель наразі захищена SSL-сертифікатом, що означає, що ваші вузли також мають його використовувати. Потрібно використовувати доменне ім’я, оскільки для IP-адрес сертифікати отримати неможливо.', + 'dns' => 'Перевірка DNS-запису', + 'dns_help' => 'Переконайтеся, що ваш DNS-запис вказує на правильну IP-адресу.', + 'valid' => 'Дійсний', + 'invalid' => 'Недійсний', + 'port' => 'Порт', + 'ports' => 'Порти', + 'port_help' => 'Якщо демон працює за Cloudflare, встановіть порт Daemon на 8443, щоб дозволити проксування WebSocket через SSL.', + 'connect_port' => 'Порт підключення', + 'connect_port_help' => 'Підключення до wings використовуватимуть цей порт. Якщо ви використовуєте зворотний проксі-сервер, він може відрізнятися від порту прослуховування. Під час використання проксі-сервера Cloudflare слід використовувати 8443.', + 'listen_port' => 'Порт прослуховування', + 'listen_port_help' => 'Wings буде прослуховувати цей порт', + 'display_name' => 'Відображуване ім’я', + 'ssl' => 'Використовувати SSL', + 'panel_on_ssl' => 'Ваша панель використовує безпечне SSL-з\'єднання,
тому ваш Daemon також повинен його використовувати.', + 'ssl_help' => 'IP-адреса не може використовувати SSL.', + + 'tags' => 'Теги', + 'upload_limit' => 'Ліміт завантаження', + 'upload_limit_help' => 'Введіть максимальний розмір файлу який можна завантажити через веб-інтерфейс', + 'sftp_port' => 'SFTP порт', + 'sftp_alias' => 'SFTP псевдонім', + 'sftp_alias_help' => 'Відображуваний псевдонім для SFTP адреси. Залиште порожнім, щоб використовувати FQDN вузла.', + 'use_for_deploy' => 'Використовувати для розгортання?', + 'maintenance_mode' => 'Режим обслуговування', + 'maintenance_mode_help' => 'Якщо вузол позначено як "На обслуговуванні", користувачі не зможуть отримати доступ до серверів на цьому вузлі.', + + 'cpu' => 'CPU', + 'cpu_limit' => 'Обмеження CPU', + 'memory' => 'Оперативна пам\'ять', + 'memory_limit' => 'Обмеження пам\'яті', + 'disk' => 'Диск', + 'disk_limit' => 'Обмеження дискового простору', + 'unlimited' => 'Без обмежень', + 'limited' => 'Обмежено', + 'overallocate' => 'Перерозподілити', + 'enabled' => 'Увімкнено', + 'disabled' => 'Вимкнено', + 'yes' => 'Так', + 'no' => 'Ні', + + 'instructions' => 'Інструкції', + 'instructions_help' => 'Збережіть цей файл у кореневий каталог демона під назвою config.yml', + + 'auto_deploy' => 'Команда автоналаштування', + 'auto_question' => 'Оберіть між самостійним розгортанням або встановленням через Docker.', + 'auto_label' => 'Тип', + 'standalone' => 'Самостійний режим', + 'docker' => 'Docker', + 'auto_command' => 'Щоб автоматично налаштувати вузол, виконайте наступну команду:', + 'reset_token' => 'Скинути авторизаційний токен', + 'token_reset' => 'Токен Daemon скинуто.', + 'reset_help' => 'Скидання токена демона анулює всі запити, які надходять зі старого токена. Цей токен використовується для всіх чутливих операцій на Daemon, включаючи створення та видалення серверів. Ми рекомендуємо змінювати цей токен регулярно для безпеки.', + + 'no_nodes' => 'Немає вузлів', + 'none' => 'Немає', + 'cpu_chart' => 'CPU - :cpu% із :max%', + 'memory_chart' => 'RAM - :used із :total', + 'disk_chart' => 'Сховище - :used із :total', + 'used' => 'Використано', + 'unused' => 'Не використано', + + 'next_step' => 'Наступний крок', + 'node_has_servers' => 'Вузол містить сервери', + 'create_allocation' => 'Створити Порт', + 'primary_allocation' => 'Основний Порт', + 'databases' => 'Бази даних', + 'backups' => 'Резервні копії', + + 'error_connecting' => 'Помилка підключення до вузла', + 'error_connecting_description' => 'Конфігурація не змогла автоматично оновитися на Wings. Вам потрібно вручну оновити файл конфігурації.', + 'allocation' => 'Порт', + + 'diagnostics' => [ + 'header' => 'Діагностика вузла', + 'include_endpoints' => 'Включати кінцеві точки', + 'include_endpoints_hint' => 'Включаючи тільки кінцеві точки, ви не побачите URL, у логах і не приховуєте їх.', + 'include_logs' => 'Додати логи', + 'include_logs_hint' => 'Увімкнення журналів покаже останні журнали та допоможе відстежити можливі проблеми.', + 'run_diagnostics' => 'Виконати діагностику', + 'upload_to_pelican' => 'Завантажити логи', + 'logs_pulled' => 'Логи отримано!', + 'logs_uploaded' => 'Логи завантажено', + 'upload_failed' => 'Помилка завантаження логів', + 'view_logs' => 'Переглянути логи', + 'pull' => 'Витягнути', + 'upload' => 'Завантажити', + 'clear' => 'Очистити', + '404' => 'Запитаний діагностичний звіт не знайдено. Переконайтеся, що wings в актуальному стані та спробуйте ще раз.', + ], + + 'cloudflare_issue' => [ + 'title' => 'Проблема Cloudflare', + 'body' => 'Cloudflare не має доступу до вашого вузла', + ], + + 'bulk_update_ip' => 'Оновити IPs', + 'bulk_update_ip_description' => 'Замінити стару IP-адресу новим для виділення. Це зручно, якщо IP адреса вузла змінюється', + 'update_ip' => 'Оновити IP', + 'old_ip' => 'Стара IP-адреса', + 'new_ip' => 'Нова IP адреса', + 'no_allocations_to_update' => 'Не знайдено розташувань з вибраною старою IP-адресою', + 'ip_updated' => 'Успішно оновлено :count із :total allocation(s)', + 'ip_update_failed' => 'Не вдалося оновити : :count allocation(s)', ]; diff --git a/lang/uk/admin/role.php b/lang/uk/admin/role.php new file mode 100644 index 0000000000..f75b99d501 --- /dev/null +++ b/lang/uk/admin/role.php @@ -0,0 +1,17 @@ + 'Ролі', + 'model_label' => 'Роль', + 'model_label_plural' => 'Ролі', + 'no_roles' => 'Немає ролей', + 'name' => 'Назва Ролі', + 'permissions' => 'Дозволи', + 'in_use' => 'Використовується', + 'all' => 'Усі', + 'root_admin' => ':role має всі дозволи.', + 'root_admin_delete' => 'Не можна видалити головного адміністратора', + 'users' => 'Користувачі', + 'nodes' => 'Вузли', + 'nodes_hint' => 'Залиште пустим, щоб дозволити доступ до всіх вузлів.', +]; diff --git a/lang/uk/admin/server.php b/lang/uk/admin/server.php index 057bd3ca58..1b5f34bec1 100644 --- a/lang/uk/admin/server.php +++ b/lang/uk/admin/server.php @@ -1,27 +1,150 @@ [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', + 'nav_title' => 'Сервери', + 'model_label' => 'Сервер', + 'model_label_plural' => 'Сервери', + 'no_servers' => 'Немає серверів', + 'create' => 'Створити сервер', + 'next_step' => 'Наступний крок', + 'ip_address' => 'IP адреса', + 'ip_address_helper' => 'Зазвичай це публічна IP адреса вашого сервера, якщо ви не використовуєте прокидання портів.', + 'port' => 'Порт', + 'ports' => 'Порти', + 'alias' => 'Псевдонім', + 'alias_helper' => 'Необов’язкове відображуване ім’я для ідентифікації сервера.', + 'locked' => 'Заблоковано?', + 'locked_helper' => 'Користувачі не зможуть видаляти заблоковані розміщення', + 'lock' => 'Блокувати', + 'unlock' => 'Розблокувати', + 'name' => 'Назва', + 'external_id' => 'Зовнішній ID', + 'owner' => 'Власник', + 'description' => 'Опис', + 'install_script' => 'Запустити скрипт встановлення?', + 'start_after' => 'Запустити після встановлення?', + 'yes' => 'Так', + 'no' => 'Ні', + 'skip' => 'Пропустити', + 'primary' => 'Основний', + 'already_primary' => 'Вже Основна', + 'make_primary' => 'Зробити основним', + 'startup_cmd' => 'Команда запуску', + 'startup_name' => 'Назва Запуску', + 'default_startup' => 'Команда запуску за замовчуванням', + 'startup_placeholder' => 'Введіть спеціальну команду запуску', + 'variables' => 'Змінні', + 'resource_limits' => 'Обмеження ресурсів', + 'cpu' => 'CPU', + 'cpu_limit' => 'Обмеження CPU', + 'cpu_helper' => '100% відповідає одному ядру процесора.', + 'unlimited' => 'Необмежено', + 'limited' => 'Обмежено', + 'enabled' => 'Увімкнено', + 'disabled' => 'Вимкнено', + 'memory' => 'Оперативна пам’ять', + 'memory_limit' => 'Обмеження пам’яті', + 'memory_helper' => 'Wings додасть накладні витрати до цього значення під час створення контейнера, щоб переконатися, що він не виснажується під час використання максимальної пам’яті.', + 'disk' => 'Дисковий простір', + 'disk_limit' => 'Обмеження дискового простору', + 'advanced_limits' => 'Додаткові обмеження', + 'cpu_pin' => 'Закріплення CPU', + 'threads' => 'Закріплені потоки', + 'pin_help' => 'Вкажіть закріплені потоки, наприклад 0 або 2-4', + 'swap' => 'Віртуальна пам’ять (Swap)', + 'swap_limit' => 'Обмеження Swap', + 'oom' => 'OOM Killer', + 'feature_limits' => 'Обмеження функціоналу', + 'docker_settings' => 'Налаштування Docker', + 'docker_image' => 'Docker зображення', + 'image_name' => 'Назва зображення', + 'primary_allocation' => 'Основний порт', + 'image' => 'Зображення', + 'image_placeholder' => 'Введіть власне зображення', + 'container_labels' => 'Мітки контейнера', + 'title' => 'Заголовок', + 'actions' => 'Дії', + 'console' => 'Консоль', + 'suspend' => 'Призупинити', + 'unsuspend' => 'Відновити', + 'reinstall' => 'Перевстановити', + 'reinstall_help' => 'Це перевстановить сервер з використанням скрипту встановлення яйця.', + 'reinstall_modal_heading' => 'Ви впевнені, що хочете перевстановити цей сервер?', + 'reinstall_modal_description' => '!! Це може призвести до безповоротної втрати даних !!', + 'server_status' => 'Стан сервера', + 'view_install_log' => 'Переглянути журнал встановлення', + 'uuid' => 'UUID', + 'node' => 'Вузол', + 'short_uuid' => 'Короткий UUID', + 'toggle_install' => 'Перемкнути статус встановлення', + 'toggle_install_help' => 'Якщо потрібно змінити статус встановлення сервера (з встановленого на невстановлений або навпаки), використовуйте цю кнопку.', + 'toggle_install_failed_header' => 'Сервер у несправному стані', + 'toggle_install_failed_desc' => 'Ви хочете перевстановити сервер, щоб виправити це?', + 'transfer' => 'Перенести', + 'transfer_help' => 'Перенесіть цей сервер на інший вузол, підключений до цієї панелі.
Увага! Ця функція все ще експериментальна. Спершу спробуйте створити резервну копію вручну, щоб уникнути втрати даних!', + 'condition' => 'Умова', + 'suspend_all' => 'Призупинити всі сервери', + 'unsuspend_all' => 'Відновити всі сервери', + 'select_allocation' => 'Вибрати порт', + 'new_allocation' => 'Створити новий порт', + 'additional_allocations' => 'Додаткові порти', + 'select_additional' => 'Виберіть додаткові порти', + 'no_variables' => 'Вибране яйце не містить змінних!', + 'select_egg' => 'Виберіть яйце, щоб відобразити його змінні!', + 'allocations' => 'Порти', + 'databases' => 'Бази даних', + 'no_databases' => 'Немає баз даних для цього сервера', + 'delete_db' => 'Ви впевнені, що хочете видалити', + 'delete_db_heading' => 'Видалити базу даних?', + 'backups' => 'Резервні копії', + 'egg' => 'Яйце', + 'mounts' => 'Точки монтування', + 'no_mounts' => 'Немає точок монтування для цього вузла', + 'create_database' => 'Створити базу даних', + 'no_db_hosts' => 'Немає хостів баз даних', + 'failed_to_create' => 'Не вдалося створити базу даних', + 'change_egg' => 'Змінити Яйце', + 'new_egg' => 'Нове Яйце', + 'keep_old_variables' => 'Зберегти старі змінні, якщо можливо?', + 'create_allocation' => 'Створити порт', + 'add_allocation' => 'Додати порт', + 'view' => 'Перегляд', + 'no_log' => 'Немає доступних записів', + 'tabs' => [ + 'information' => 'Інформація', + 'egg_configuration' => 'Конфігурація яйця', + 'environment_configuration' => 'Конфігурація середовища', ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', + 'notifications' => [ + 'server_suspension' => 'Призупинення сервера', + 'server_suspended' => 'Сервер призупинено', + 'server_already_suspended' => 'Сервер вже призупинено!', + 'server_suspend_help' => 'Це призупинить сервер, зупинить усі запущені процеси та негайно заблокує користувача від доступу до файлів або керування сервером через панель чи API.', + 'server_unsuspend_help' => 'Це відновить роботу сервера та поверне доступ користувачам.', + 'server_unsuspended' => 'Сервер відновлено', + 'error_server_delete' => 'Не вдалося безпечно видалити сервер.', + 'error_server_delete_body' => 'Ви можете Примусово видалити це.', + 'create_failed' => 'Не вдалося створити сервер', + 'invalid_port_range' => 'Некоректний діапазон портів', + 'invalid_port_range_body' => 'Ваш діапазон портів містить недійсні значення: :port', + 'too_many_ports' => 'Забагато портів одночасно!', + 'too_many_ports_body' => 'Поточний ліміт — :limit портів одночасно.', + 'invalid_port' => 'Порт не входить у допустимий діапазон', + 'invalid_port_body' => ':i не входить у допустимий діапазон портів :portFloor-:portCeil', + 'already_exists' => 'Порт уже використовується', + 'already_exists_body' => ':i вже має порт', + 'error_connecting' => 'Помилка підключення до :node', + 'error_connecting_description' => 'Конфігурація не може бути автоматично синхронізована на Wings, вам потрібно буде вручну перезапустити сервер.', + 'install_toggled' => 'Статус інсталяції змінено', + 'install_toggle_failed' => 'Не вдалося перемкнути статус встановлення', + 'reinstall_started' => 'Перевстановлення запущено', + 'reinstall_failed' => 'Не вдалося розпочати перевстановлення', + 'log_failed' => 'Не вдалося з\'єднатися з Wings для отримання журналу встановлення сервера.', + 'transfer_started' => 'Перенесення розпочато', + 'transfer_failed' => 'Помилка перенесення', + 'already_transfering' => 'Сервер зараз переноситься.', ], + 'notes' => 'Примітки', + 'no_notes' => 'Без приміток', + 'none' => 'Немає', ]; diff --git a/lang/uk/admin/setting.php b/lang/uk/admin/setting.php new file mode 100644 index 0000000000..80e110fcf1 --- /dev/null +++ b/lang/uk/admin/setting.php @@ -0,0 +1,157 @@ + 'Налаштування', + 'save_success' => 'Налаштування збережено', + 'save_failed' => 'Не вдалося зберегти налаштування', + 'navigation' => [ + 'general' => 'Загальні', + 'captcha' => 'Капча', + 'mail' => 'Пошта', + 'backup' => 'Резервне копіювання', + 'oauth' => 'OAuth', + 'misc' => 'Інше', + ], + 'general' => [ + 'app_name' => 'Назва застосунку', + 'app_logo' => 'Логотип застосунку', + 'app_logo_help' => 'Логотип слід розмістити в загальнодоступній теці, розташованій у кореневому каталозі панелі. Залиште поле порожнім, щоб замість цього використовувати назву програми.', + 'app_favicon' => 'Favicon застосунку', + 'app_favicon_help' => 'Favicon слід розмістити в загальнодоступній теці, розташованій у кореневому каталозі панелі.', + 'debug_mode' => 'Режим налагодження', + 'navigation' => 'Навігація', + 'default_navigation' => 'Тип навігації за замовчуванням', + 'sidebar' => 'Бічна панель', + 'topbar' => 'Верхня панель', + 'mixed' => 'Змішаний', + 'unit_prefix' => 'Префікс одиниць', + 'decimal_prefix' => 'Десятковий префікс (MB/GB)', + 'binary_prefix' => 'Двійковий префікс (MiB/GiB)', + '2fa_requirement' => 'Вимога 2FA', + 'not_required' => 'Не потрібно', + 'admins_only' => 'Тільки для адміністраторів', + 'all_users' => 'Для всіх користувачів', + 'trusted_proxies' => 'Довірені проксі', + 'trusted_proxies_help' => 'Нова IP-адреса або діапазон IP', + 'clear' => 'Очистити', + 'set_to_cf' => 'Встановити IP Cloudflare', + 'display_width' => 'Ширина відображення', + 'avatar_provider' => 'Постачальник Аватарів', + 'uploadable_avatars' => 'Дозволити користувачам завантажувати власний аватар?', + ], + 'captcha' => [ + 'enable' => 'Увімкнути', + 'disable' => 'Вимкнути', + 'info_label' => 'Інформація', + 'info' => 'Ви можете згенерувати ключі на своїй інформаційній панелі Cloudflare. Потрібен обліковий запис Cloudflare.', + 'site_key' => 'Ключ сайту', + 'secret_key' => 'Секретний ключ', + 'verify' => 'Перевірити домен?', + ], + 'mail' => [ + 'mail_driver' => 'Поштовий драйвер', + 'test_mail' => 'Надіслати тестовий лист', + 'test_mail_sent' => 'Тестовий лист надіслано', + 'test_mail_failed' => 'Не вдалося надіслати тестовий лист', + 'from_settings' => 'Параметри відправника', + 'from_settings_help' => 'Встановіть адресу та ім’я, які будуть використовуватися як "Відправник" у листах.', + 'from_address' => 'Адреса відправника', + 'from_name' => 'Ім’я відправника', + 'smtp' => [ + 'smtp_title' => 'Налаштування SMTP', + 'host' => 'Хост', + 'port' => 'Порт', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + 'scheme' => 'Схема', + ], + 'mailgun' => [ + 'mailgun_title' => 'Налаштування Mailgun', + 'domain' => 'Домен', + 'secret' => 'Секретний ключ', + 'endpoint' => 'Кінцева точка', + ], + ], + 'backup' => [ + 'backup_driver' => 'Драйвер резервного копіювання', + 'throttle' => 'Обмеження', + 'throttle_help' => 'Налаштуйте, скільки резервних копій можна створити за певний період. Встановіть 0, щоб вимкнути це обмеження.', + 'limit' => 'Ліміт', + 'period' => 'Період', + 'seconds' => 'Секунди', + 's3' => [ + 's3_title' => 'Налаштування S3', + 'default_region' => 'Регіон за замовчуванням', + 'access_key' => 'Ключ доступу ID', + 'secret_key' => 'Секретний ключ доступу', + 'bucket' => 'Бакет', + 'endpoint' => 'Кінцева точка', + 'use_path_style_endpoint' => 'Використовувати стиль шляху для кінцевої точки', + ], + ], + 'oauth' => [ + 'enable' => 'Увімкнути', + 'enable_schema' => 'Увімкнути :schema', + 'disable' => 'Вимкнути', + 'client_id' => 'ID клієнта', + 'client_secret' => 'Секретний ключ клієнта', + 'redirect' => 'URL перенаправлення', + 'web_api_key' => 'Ключ веб-API', + 'base_url' => 'Базовий URL', + 'display_name' => 'Відображуване ім’я', + 'auth_url' => 'URL зворотного виклику авторизації', + 'create_missing_users' => 'Автоматичне створення відсутніх користувачів?', + 'link_missing_users' => 'Автоматичне лінкування відсутніх користувачів?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => 'Автоматичне створення портів', + 'helper' => 'Увімкніть, щоб користувачі могли створювати порти в клієнтській панелі.', + 'question' => 'Дозволити користувачам створювати порти?', + 'create_new' => 'Створити порти, якщо немає доступних?', + 'create_new_help' => 'Коли ввімкнено, створюються нові порти. Коли вимкнено, призначено лише з теперішніх непризначених портів. Обидві опції визначають діапазон портів в обліковий запис.', + 'start' => 'Початковий порт', + 'end' => 'Кінцевий порт', + ], + 'mail_notifications' => [ + 'title' => 'Поштові сповіщення', + 'helper' => 'Увімкніть, які сповіщення мають надсилатися користувачам.', + 'server_installed' => 'Сервер встановлено', + 'server_reinstalled' => 'Сервер перевстановлено', + ], + 'connections' => [ + 'title' => 'З\'єднання', + 'helper' => 'Час очікування при запитах.', + 'request_timeout' => 'Час очікування запиту', + 'connection_timeout' => 'Час очікування з\'єднання', + 'seconds' => 'Секунди', + ], + 'activity_log' => [ + 'title' => 'Журнал активності', + 'helper' => 'Налаштуйте, як часто мають очищатися старі журнали активності та чи слід вести журнали дій адміністраторів.', + 'prune_age' => 'Період очищення', + 'days' => 'Днів', + 'log_admin' => 'Приховати активність адміністраторів?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => 'Визначає ліміт запитів за хвилину.', + 'client_rate' => 'Ліміт запитів клієнтського API', + 'app_rate' => 'Ліміт запитів API застосунку', + 'rpm' => 'Запитів на хвилину', + ], + 'server' => [ + 'title' => 'Сервери', + 'helper' => 'Налаштування серверів', + 'edit_server_desc' => 'Дозволити користувачам редагувати описи?', + 'console_font_upload' => 'Завантаження шрифтів консолі', + 'console_font_hint' => 'Підтримуються лише шрифти формату *.ttf. Наполегливо рекомендується шрифти типу Mono!', + ], + 'webhook' => [ + 'title' => 'Вебхуки', + 'helper' => 'Налаштуйте, як часто слід очищати старі журнали вебхуків.', + 'prune_age' => 'Період очищення', + 'days' => 'Днів', + ], + ], +]; diff --git a/lang/uk/admin/user.php b/lang/uk/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/uk/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/uk/admin/webhook.php b/lang/uk/admin/webhook.php new file mode 100644 index 0000000000..3c80ab5888 --- /dev/null +++ b/lang/uk/admin/webhook.php @@ -0,0 +1,63 @@ + 'Вебхуки', + 'model_label' => 'Вебхук', + 'model_label_plural' => 'Вебхуки', + 'endpoint' => 'Кінцева точка', + 'description' => 'Опис', + 'no_webhooks' => 'Немає вебхуків', + 'help' => 'Довідка', + 'help_text' => 'Вам потрібно помістити ім\'я змінної (name) між {{ }}, наприклад, якщо Ви хочете отримати назву з Api, Ви можете використовувати {{name}}.', + 'test_now' => 'Перевірити зараз', + 'test_now_help' => 'Це викличе подію `created: Server`', + 'table' => [ + 'description' => 'Опис', + 'endpoint' => 'Кінцева точка', + ], + 'headers' => 'Заголовки', + 'events' => 'Події', + 'regular' => 'Звичайний', + 'reset_headers' => 'Скинути заголовки', + 'discord' => 'Дискорд', + 'discord_message' => [ + 'profile' => 'Профіль', + 'message' => 'Повідомлення', + 'username' => 'Ім\'я користувача', + 'avatar_url' => 'URL-адреса аватара', + 'forum_thread' => 'Назва теми форуму', + 'supress_embeds' => 'Приховувати Embeds', + 'supress_embeds_text' => 'Не включайте жодних вбудованих елементів під час серіалізації цього повідомлення', + 'supress_notifications' => 'Ігнорувати сповіщення', + 'supress_notifications_text' => 'Це повідомлення не запускатиме push-сповіщення та сповіщення на робочому столі', + ], + 'discord_embed' => [ + 'add_embed' => 'Додати Embed', + 'flags' => 'Flags', + 'thumbnail' => 'URL мініатюри', + 'embeds' => 'Embeds', + 'thread_name' => 'Назва теми форуму', + 'allowed_mentions' => 'Дозволені згадки', + 'roles' => 'Ролі', + 'users' => 'Користувачі', + 'everyone' => '@everyone & @here', + 'author' => 'Автор', + 'author_url' => 'URL автора', + 'author_icon_url' => 'URL значка автора', + 'body' => 'Вміст', + 'title' => 'Заголовок', + 'color' => 'Колір Embed', + 'url' => 'URL', + 'images' => 'Зображення', + 'image_url' => 'URL зображення', + 'image_thumbnail' => 'URL мініатюри', + 'footer' => 'Нижній колонтитул', + 'has_timestamp' => 'Має Часові Мітки', + 'footer_icon_url' => 'URL значка в нижньому колонтитулі', + 'add_field' => 'Додати поле', + 'fields' => 'Поля', + 'field_name' => 'Назва поля', + 'field_value' => 'Значення поля', + 'inline_field' => 'Inline поле', + ], +]; diff --git a/lang/uk/auth.php b/lang/uk/auth.php index 2a3a452682..958b03faca 100644 --- a/lang/uk/auth.php +++ b/lang/uk/auth.php @@ -1,27 +1,24 @@ 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], + 'failed' => 'Ці облікові дані не збігаються з нашими записами.', + 'failed-two-factor' => 'Неправильний код 2FA', + 'two-factor-code' => 'Код 2FA', + 'two-factor-hint' => 'Ви можете використовувати резервні коди, якщо втратили доступ до вашого пристрою.', + 'password' => 'Вказаний пароль є некоректним.', + 'throttle' => 'Забагато спроб входу. Спробуйте ще раз через :seconds сек.', + '2fa_must_be_enabled' => 'Адміністратор примусово вимагає включення двофакторної аутентифікації для Вашого облікового запису, щоб використовувати панель.', - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', ]; diff --git a/lang/uk/command/messages.php b/lang/uk/command/messages.php index 0d723eddc7..8f71c91285 100644 --- a/lang/uk/command/messages.php +++ b/lang/uk/command/messages.php @@ -2,58 +2,53 @@ return [ 'user' => [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', + 'search_users' => 'Введіть ім\'я, ID Користувача або адресу електронної пошти', + 'select_search_user' => 'ID користувача, який потрібно видалити (Введіть \'0\' для повторного пошуку)', + 'deleted' => 'Користувача успішно видалено з панелі.', + 'confirm_delete' => 'Ви впевнені, що хочете видалити цього користувача з панелі?', + 'no_users_found' => 'Користувачів за вказаним пошуковим запитом не знайдено.', + 'multiple_found' => 'Знайдено кілька облікових записів для вказаного користувача, неможливо видалити користувача через параметр --no-interaction.', 'ask_admin' => 'Цей користувач є адміністратором?', - 'ask_email' => 'Адрес електронної пошти', + 'ask_email' => 'Адреса електронної пошти', 'ask_username' => 'Ім\'я користувача', - 'ask_name_first' => 'Ім’я', - 'ask_name_last' => 'Прізвище', 'ask_password' => 'Пароль', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', + 'ask_password_tip' => 'Якщо ви хочете створити обліковий запис с випадковим паролем та надіслати його до користувача, повторно запустіть цю команду (CTRL+C) з прапорцем \'--no-password\'.', + 'ask_password_help' => 'Пароль має містити принаймні 8 символів та містити хоча б одну велику літеру та цифру.', + '2fa_help_text' => 'Ця команда вимкне 2-факторну автентифікацію для облікового запису користувача, якщо її ввімкнено. Цю команду слід використовувати лише як команду відновлення облікового запису, якщо користувач заблоковано доступ до свого облікового запису. Якщо це не те, що ви хотіли зробити, натисніть CTRL+C, щоб вийти з цього процесу.', + '2fa_disabled' => 'Двофакторна аутентифікація була вимкнена для: email.', ], 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', + 'output_line' => 'Виконання завдання для першого процесу у `:schedule` (:id).', ], 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', + 'deleting_service_backup' => 'Видалення файлу резервної копії служби :file.', ], 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', + 'rebuild_failed' => 'Помилка при запиті на перебудову сервера ":name" (#:id) на вузлі ":node": :message', 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', + 'failed' => 'Помилка при запиті на перевстановлення сервера ":name" (#:id) на вузлі ":node": :message', + 'confirm' => 'Ви збираєтеся перевстановити групу серверів. Бажаєте продовжити?', ], 'power' => [ - 'confirm' => 'Ви збираєтесь виконати :action проти :count серверів. Бажаєте продовжити?', - 'action_failed' => 'Не вдалося виконати запит дії живлення для ":name" (#:id) на вузол ":node" з помилкою: :message', + 'confirm' => 'Ви збираєтеся виконати :action для :count серверів. Бажаєте продовжити?', + 'action_failed' => 'Помилка при виконанні команди живлення для ":name" (#:id) на вузлі ":node": :message', ], ], 'environment' => [ 'mail' => [ - 'ask_smtp_host' => 'SMTP Хост (напр. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Порт', - 'ask_smtp_username' => 'SMTP Логін', - 'ask_smtp_password' => 'SMTP Пароль', + 'ask_smtp_host' => 'SMTP хост (наприклад, smtp.gmail.com)', + 'ask_smtp_port' => 'SMTP порт', + 'ask_smtp_username' => 'SMTP-ім\'я користувача', + 'ask_smtp_password' => 'SMTP пароль', 'ask_mailgun_domain' => 'Домен Mailgun', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Секрет Mailgun', - 'ask_mandrill_secret' => 'Секрет Mandrill', - 'ask_postmark_username' => 'Ключ API Postmark', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Ім\'я, з яких повинні розсилатися електронні листи', - 'ask_encryption' => 'Метод шифрування', + 'ask_mailgun_endpoint' => 'Кінцева точка Mailgun', + 'ask_mailgun_secret' => 'Секретний ключ Mailgun', + 'ask_mandrill_secret' => 'Секретний ключ Mandrill', + 'ask_postmark_username' => 'API-ключ Postmark', + 'ask_driver' => 'Який драйвер слід використовувати для відправки електронної пошти?', + 'ask_mail_from' => 'Адреса електронної пошти відправника', + 'ask_mail_name' => 'Ім\'я відправника', + 'ask_encryption' => 'Метод шифрування для використання', ], ], ]; diff --git a/lang/uk/commands.php b/lang/uk/commands.php new file mode 100644 index 0000000000..2b742c38f6 --- /dev/null +++ b/lang/uk/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => 'Вкажіть адресу електронної пошти, яка буде використовуватися для експортованих яєць у цій панелі. Це повинна бути дійсна електронна адреса.', + 'url' => 'URL застосунку МАЄ починатися з https:// або http://, залежно від того, чи використовуєте ви SSL. Якщо не включити схему, ваші електронні листи та інший контент будуть містити некоректні посилання.', + 'timezone' => 'Часовий пояс має відповідати одному із підтримуваних часових поясів PHP. Якщо ви не впевнені, зверніться за посиланням: https://php.net/manual/en/timezones.php.', + ], + 'redis' => [ + 'note' => 'Ви вибрали драйвер Redis для одного або кількох параметрів. Будь ласка, надайте дійсну інформацію для підключення. У більшості випадків можна використовувати значення за замовчуванням, якщо ви не змінювали конфігурацію.', + 'comment' => 'За замовчуванням сервер Redis використовує ім’я користувача "default" і не має пароля, оскільки він працює локально і недоступний зовні. Якщо це ваш випадок, просто натисніть Enter без введення значення.', + 'confirm' => 'Здається, параметр :field уже визначено для Redis. Ви хочете змінити його?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => 'Настійно рекомендується не використовувати "localhost" як хост бази даних, оскільки це часто призводить до проблем із підключенням через сокети. Для локального підключення слід використовувати "127.0.0.1".', + 'DB_USERNAME_note' => 'Використання root-акаунта для підключення до MySQL не тільки не рекомендується, але й заборонене цим застосунком. Вам потрібно створити окремого користувача MySQL для цієї програми.', + 'DB_PASSWORD_note' => 'Здається, у вас уже є пароль підключення до MySQL. Ви хочете змінити його?', + 'DB_error_2' => 'Ваші облікові дані НЕ було збережено. Вам потрібно вказати коректну інформацію для підключення перед продовженням.', + 'go_back' => 'Повернутися назад і спробувати ще раз', + ], + 'make_node' => [ + 'name' => 'Введіть короткий ідентифікатор для розрізнення цього вузла від інших', + 'description' => 'Введіть опис для ідентифікації вузла', + 'scheme' => 'Вкажіть https для SSL або http для незахищеного з’єднання', + 'fqdn' => 'Введіть доменне ім\'я (наприклад, node.example.com) для підключення до Daemon. IP-адреса може використовуватися тільки якщо SSL не використовується.', + 'public' => 'Чи повинен цей вузол бути публічним? Якщо вузол є приватним, можливість автоматичного розгортання на ньому буде вимкнена.', + 'behind_proxy' => 'Чи ваш FQDN розташований за проксі?', + 'maintenance_mode' => 'Увімкнути режим обслуговування?', + 'memory' => 'Вкажіть максимальний обсяг оперативної пам’яті', + 'memory_overallocate' => 'Вкажіть обсяг перевиділення пам’яті, -1 вимкне перевірку, 0 заборонить створення нових серверів', + 'disk' => 'Вкажіть максимальний обсяг дискового простору', + 'disk_overallocate' => 'Вкажіть обсяг перевиділення диска, -1 вимкне перевірку, 0 заборонить створення нових серверів', + 'cpu' => 'Вкажіть максимальне використання CPU', + 'cpu_overallocate' => 'Вкажіть обсяг перевиділення CPU, -1 вимкне перевірку, 0 заборонить створення нових серверів', + 'upload_size' => 'Вкажіть максимальний розмір файлу для завантаження', + 'daemonListen' => 'Вкажіть порт прослуховування Daemon', + 'daemonConnect' => 'Введіть порт підключення демона (може бути таким же, як порт прослуховування)', + 'daemonSFTP' => 'Вкажіть порт SFTP Daemon', + 'daemonSFTPAlias' => 'Вкажіть псевдонім SFTP Daemon (може бути порожнім)', + 'daemonBase' => 'Вкажіть базовий каталог', + 'success' => 'Успішно створено вузол з назвою :name та ідентифікатором :id', + ], + 'node_config' => [ + 'error_not_exist' => 'Вибраний вузол не існує.', + 'error_invalid_format' => 'Вказано невірний формат. Доступні варіанти: yaml і json.', + ], + 'key_generate' => [ + 'error_already_exist' => 'Здається, у вас уже налаштовано ключ шифрування застосунку. Продовження цього процесу перезапише ключ і може спричинити втрату зашифрованих даних. НЕ ПРОДОВЖУЙТЕ, ЯКЩО НЕ РОЗУМІЄТЕ НАСЛІДКІВ.', + 'understand' => 'Я розумію наслідки виконання цієї команди та беру на себе відповідальність за можливу втрату зашифрованих даних.', + 'continue' => 'Ви впевнені, що хочете продовжити? Зміна ключа шифрування застосунку ПРИЗВЕДЕ ДО ВТРАТИ ДАНИХ.', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => 'Немає запланованих завдань для серверів, які потрібно виконати.', + 'error_message' => 'Під час обробки розкладу виникла помилка: ', + ], + ], +]; diff --git a/lang/uk/dashboard/account.php b/lang/uk/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/uk/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/uk/dashboard/index.php b/lang/uk/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/uk/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/uk/exceptions.php b/lang/uk/exceptions.php index 3977c87c24..eafbecce25 100644 --- a/lang/uk/exceptions.php +++ b/lang/uk/exceptions.php @@ -1,55 +1,64 @@ 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', + 'daemon_connection_failed' => 'Сталася помилка під час спроби зв’язку з Daemon, що призвело до відповіді HTTP/:code. Ця помилка була зафіксована.', 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', + 'servers_attached' => 'Вузол не може бути видалений, якщо до нього прив’язані сервери.', + 'error_connecting' => 'Помилка підключення до :node', + 'daemon_off_config_updated' => 'Конфігурація Daemon була оновлена, однак сталася помилка при спробі автоматичного оновлення конфігураційного файлу демона. Вам потрібно вручну оновити файл конфігурації (config.yml), щоб зміни набрали чинності.', ], 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', + 'server_using' => 'Цей ресурс уже використовується сервером. Видалення можливе лише після відключення сервера від нього.', + 'too_many_ports' => 'Додавання понад 1000 портів у одному діапазоні одночасно не підтримується.', + 'invalid_mapping' => 'Неправильне зіставлення для :port, неможливо обробити.', + 'cidr_out_of_range' => 'CIDR-нотація допускає маски тільки в діапазоні від /25 до /32.', + 'port_out_of_range' => 'Порти у виділенні повинні бути в діапазоні від 1024 до 65535.', ], 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', + 'delete_has_servers' => 'Неможливо видалити яйце, до якого прив’язані активні сервери.', + 'invalid_copy_id' => 'Вибране яйце для копіювання скрипту не існує або саме копіює скрипт.', + 'has_children' => 'Це яйце є основою для одного або декількох інших яєць. Будь ласка, спочатку видаліть їх.', ], 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', + 'env_not_unique' => 'Змінна середовища :name повинна бути унікальною для цього яйця.', + 'reserved_name' => 'Змінна середовища :name зарезервована та не може бути використана.', + 'bad_validation_rule' => 'Правило валідації ":rule" є некоректним для цього застосунку.', ], 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', + 'json_error' => 'Сталася помилка під час обробки JSON-файлу: :error.', + 'file_error' => 'Наданий JSON-файл є некоректним.', + 'invalid_json_provided' => 'Наданий JSON-файл має некоректний формат.', ], 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', + 'editing_self' => 'Редагування власного субкористувацького облікового запису заборонено.', + 'user_is_owner' => 'Неможливо додати власника сервера як субкористувача.', + 'subuser_exists' => 'Користувач з цією електронною адресою вже є субкористувачем цього сервера.', ], 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', + 'delete_has_databases' => 'Неможливо видалити сервер баз даних, якщо до нього підключені активні бази.', ], 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', + 'chain_interval_too_long' => 'Максимальний інтервал для ланцюгового завдання – 15 хвилин.', ], 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', + 'has_nodes' => 'Неможливо видалити локацію, якщо в ній є активні вузли.', ], 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', + 'is_self' => 'Неможливо видалити власний обліковий запис.', + 'has_servers' => 'Неможливо видалити користувача, у якого є активні сервери. Будь ласка, спочатку видаліть їх.', + 'node_revocation_failed' => 'Не вдалося відкликати ключі на Вузлі #:node. :error', ], 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', + 'no_viable_nodes' => 'Не знайдено жодного вузла, що відповідає критеріям автоматичного розгортання.', + 'no_viable_allocations' => 'Не знайдено жодного виділення, що відповідає критеріям автоматичного розгортання.', ], 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', + 'resource_not_found' => 'Запитуваний ресурс не існує на цьому сервері.', + ], + 'mount' => [ + 'servers_attached' => 'Неможливо видалити точку монтування, якщо до неї підключені сервери.', + ], + 'server' => [ + 'marked_as_failed' => 'Цей сервер ще не завершив процес встановлення. Будь ласка, спробуйте пізніше.', ], ]; diff --git a/lang/uk/notifications.php b/lang/uk/notifications.php new file mode 100644 index 0000000000..085b4aae7e --- /dev/null +++ b/lang/uk/notifications.php @@ -0,0 +1,18 @@ + 'Відкрити сервер', + 'installation_completed' => 'Встановлення сервера завершено', + 'installation_failed' => 'Помилка встановлення сервера', + 'reinstallation_completed' => 'Перевстановлення сервера завершено', + 'reinstallation_failed' => 'Помилка перевстановлення сервера', + 'failed' => 'Помилка', + 'user_added' => [ + 'title' => 'Додано на сервер', + 'body' => 'Вас додано як користувача до :server.', + ], + 'user_removed' => [ + 'title' => 'Вилучено з сервера', + 'body' => 'Вас було видалено як користувач з :server.', + ], +]; diff --git a/lang/uk/pagination.php b/lang/uk/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/uk/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/uk/passwords.php b/lang/uk/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/uk/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/uk/profile.php b/lang/uk/profile.php new file mode 100644 index 0000000000..1bd4fa7c7c --- /dev/null +++ b/lang/uk/profile.php @@ -0,0 +1,70 @@ + 'Профіль', + 'tabs' => [ + 'account' => 'Обліковий запис', + 'oauth' => 'OAuth', + 'activity' => 'Активність', + 'api_keys' => 'Ключі API', + 'ssh_keys' => 'SSH-ключі', + 'keys' => 'Ключі', + '2fa' => '2FA', + 'customization' => 'Персоналізація', + ], + 'username' => 'Ім\'я користувача', + 'admin' => 'Адмін', + 'exit_admin' => 'Вийти з режиму адміністратора', + 'server_list' => 'Список серверів', + 'email' => 'Електронна пошта', + 'password' => 'Пароль', + 'current_password' => 'Поточний пароль', + 'password_confirmation' => 'Підтвердження пароля', + 'timezone' => 'Часовий пояс', + 'language' => 'Мова', + 'language_help' => 'Ваша мова :state ще не була перекладена!', + 'link' => 'Прив\'язати ', + 'unlink' => 'Відв’язати ', + 'unlinked' => ':name відв’язано', + 'scan_qr' => 'Сканувати QR-код', + 'code' => 'Код', + 'setup_key' => 'Ключ налаштування', + 'invalid_code' => 'Невірний код 2FA', + 'code_help' => 'Скануйте QR-код вище у вашому додатку двоетапної автентифікації, а потім введіть згенерований код.', + '2fa_enabled' => 'Двофакторна автентифікація увімкнена!', + 'backup_help' => 'Ці коди не будуть показані знову!', + 'backup_codes' => 'Резервні коди', + 'disable_2fa' => 'Вимкнути 2FA', + 'disable_2fa_help' => 'Введіть ваш поточний код 2FA для вимкнення двофакторної автентифікації', + 'api_keys' => 'API ключі', + 'create_api_key' => 'Створити API ключ', + 'api_key_created' => 'API ключ створено', + 'description' => 'Опис', + 'allowed_ips' => 'Дозволені IP-адреси', + 'allowed_ips_help' => 'Натисніть Enter, щоб додати нову IP-адресу, або залиште поле порожнім, щоб дозволити будь-яку IP-адресу', + 'ssh_keys' => 'SSH-ключі', + 'create_ssh_key' => 'Створити SSH ключ', + 'ssh_key_created' => 'SSH ключ створено', + 'name' => 'Ім’я', + 'public_key' => 'Публічний ключ', + 'could_not_create_ssh_key' => 'Не вдалося створити ssh ключ', + 'dashboard' => 'Панель керування', + 'dashboard_layout' => 'Схема панелі', + 'console' => 'Консоль', + 'grid' => 'Сітка', + 'table' => 'Таблиця', + 'rows' => 'Рядків', + 'font_size' => 'Розмір шрифту', + 'font' => 'Шрифт', + 'font_preview' => 'Попередній перегляд шрифту', + 'seconds' => 'Секунди', + 'graph_period' => 'Період графіку', + 'graph_period_helper' => 'Кількість значень, секунд, показаних на консольних графіках.', + 'navigation' => 'Тип навігації', + 'sidebar' => 'Бічна панель', + 'topbar' => 'Верхня панель', + 'mixed' => 'Змішаний', + 'no_oauth' => 'Облікові записи не пов’язані', + 'no_api_keys' => 'Немає ключів API', + 'no_ssh_keys' => 'Немає SSH ключів', +]; diff --git a/lang/uk/search.php b/lang/uk/search.php new file mode 100644 index 0000000000..ce9421e945 --- /dev/null +++ b/lang/uk/search.php @@ -0,0 +1,9 @@ + 'Будь ласка, введіть принаймні три символи для початку пошуку.', + 'term' => [ + 'label' => 'Пошуковий запит', + 'description' => 'Введіть ім\'я сервера, uid або порт для початку пошуку.', + ], +]; diff --git a/lang/uk/server/activity.php b/lang/uk/server/activity.php new file mode 100644 index 0000000000..99489aae41 --- /dev/null +++ b/lang/uk/server/activity.php @@ -0,0 +1,11 @@ + 'Активність', + 'event' => 'Подія', + 'user' => 'Користувач', + 'deleted_user' => 'Видалений користувач', + 'system' => 'Система', + 'timestamp' => 'Мітка часу', + 'metadata' => 'Метадані', +]; diff --git a/lang/uk/server/backup.php b/lang/uk/server/backup.php new file mode 100644 index 0000000000..066eeb92f7 --- /dev/null +++ b/lang/uk/server/backup.php @@ -0,0 +1,55 @@ + 'Резервні копії', + 'empty' => 'Немає резервних копій', + 'size' => 'Розмір', + 'created_at' => 'Дата створення', + 'status' => 'Стан', + 'is_locked' => 'Статус блокування', + 'backup_status' => [ + 'in_progress' => 'У процесі...', + 'successful' => 'Успішно', + 'failed' => 'Помилка', + ], + 'actions' => [ + 'create' => [ + 'title' => 'Створити резервну копію', + 'limit' => 'Досягнуто ліміт резервних копій', + 'created' => ':name створено', + 'notification_success' => 'Резервну копію вдало створено', + 'notification_fail' => 'Помилка створення резервної копії', + 'name' => 'Ім’я', + 'ignored' => 'Ігноровані файли та каталоги', + 'locked' => 'Заблоковано?', + 'lock_helper' => 'Запобігає видаленню цієї резервної копії поки не буде знято блокування для видалення.', + ], + 'lock' => [ + 'lock' => 'Блокувати', + 'unlock' => 'Розблокувати', + ], + 'download' => 'Завантажити', + 'rename' => [ + 'title' => 'Перейменувати', + 'new_name' => 'Ім\'я резервної копії', + 'notification_success' => 'Резервну копію успішно відновлено', + ], + 'restore' => [ + 'title' => 'Відновити', + 'helper' => 'Ваш сервер буде зупинено. Ви не зможете контролювати стан живлення, доступ до файлового менеджера або створення додаткових резервних копій до завершення процесу.', + 'delete_all' => 'Видалити всі файли перед відновленням резервної копії?', + 'notification_started' => 'Відновлення з резервної копії', + 'notification_success' => 'Резервну копію успішно відновлено', + 'notification_fail' => 'Помилка відновлення з резервної копії', + 'notification_fail_body_1' => 'Цей сервер зараз не перебуває у стані, який дозволяє відновити резервну копію.', + 'notification_fail_body_2' => 'Цю резервну копію не можна відновити зараз: не завершено або не вдалося відновити.', + ], + 'delete' => [ + 'title' => 'Видалити резервну копію', + 'description' => 'Бажаєте видалити :backup?', + 'notification_success' => 'Резервна копія видалена', + 'notification_fail' => 'Не вдалося видалити резервну копію', + 'notification_fail_body' => 'Помилка підключення до вузла. Будь ласка, спробуйте ще раз.', + ], + ], +]; diff --git a/lang/uk/server/console.php b/lang/uk/server/console.php new file mode 100644 index 0000000000..9e81f410a8 --- /dev/null +++ b/lang/uk/server/console.php @@ -0,0 +1,43 @@ + 'Консоль', + 'command' => 'Введіть команду...', + 'command_blocked' => 'Сервер офлайн...', + 'command_blocked_title' => 'Не вдається надіслати команду, якщо сервер знаходиться офлайн', + 'open_in_admin' => 'Відкрити в адмін панелі', + 'power_actions' => [ + 'start' => 'Запустити', + 'stop' => 'Зупинити', + 'restart' => 'Перезапустити', + 'kill' => 'Завершити', + 'kill_tooltip' => 'Це може призвести до пошкодження даних і/або втрати даних!', + ], + 'labels' => [ + 'cpu' => 'ЦП', + 'memory' => 'Памʼять', + 'network' => 'Мережа', + 'disk' => 'Диск', + 'name' => 'Ім’я', + 'status' => 'Статус', + 'address' => 'Адреса', + 'unavailable' => 'Недоступно', + ], + 'status' => [ + 'created' => 'Створено', + 'starting' => 'Запускається', + 'running' => 'Працює', + 'restarting' => 'Перезавантаження', + 'exited' => 'Вихід', + 'paused' => 'Призупинено', + 'dead' => 'Помер', + 'removing' => 'Видалення', + 'stopping' => 'Зупиняється', + 'offline' => 'Офлайн', + 'missing' => 'Відсутні', + ], + 'websocket_error' => [ + 'title' => 'Не вдалося підключитися до веб-сокету!', + 'body' => 'Перевірте вашу консоль браузера для більш детальної інформації.', + ], +]; diff --git a/lang/uk/server/dashboard.php b/lang/uk/server/dashboard.php new file mode 100644 index 0000000000..130dd29103 --- /dev/null +++ b/lang/uk/server/dashboard.php @@ -0,0 +1,28 @@ + 'Сервери', + 'list' => 'Список серверів', + 'tabs' => [ + 'my' => 'Мої сервери', + 'other' => 'Інші сервери', + 'all' => 'Всі Сервери', + ], + 'empty_own' => 'У вас немає жодного сервера!', + 'empty_other' => 'Ви не маєте доступу до жодних серверів!', + + 'status' => 'Стан', + 'server' => 'Сервер', + 'resources' => 'Ресурси', + 'usage_limit' => 'Ліміт використання: :resource', + + 'cpu' => 'CPU', + 'memory' => 'Оперативна пам’ять', + 'disk' => 'Диск', + 'network' => 'Мережа', + 'none' => 'Немає', + 'loading' => 'Завантаження...', + + 'power_actions' => 'Дії живлення', + 'power_action_sent' => ':action відправлено на :name', +]; diff --git a/lang/uk/server/database.php b/lang/uk/server/database.php new file mode 100644 index 0000000000..1f938d7072 --- /dev/null +++ b/lang/uk/server/database.php @@ -0,0 +1,26 @@ + 'Бази даних', + 'empty' => 'Немає баз даних', + 'create_database' => 'Створити базу даних', + 'limit' => 'Досягнуто ліміту бази даних', + 'viewing' => 'Перегляд: :database', + 'host' => 'Хост', + 'database' => 'База даних', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + 'remote' => 'Віддалений сервер', + 'created_at' => 'Дата створення', + 'name' => 'Назва бази даних', + 'name_hint' => 'Якщо залишити порожнім, буде автоматично згенеровано випадкове ім’я', + 'connections_from' => 'Дозволені підключення', + 'max_connections' => 'Максимальна кількість з\'єднань', + 'database_host' => 'Хост бази даних', + 'database_host_select' => 'Виберіть хост бази даних', + 'jdbc' => 'JDBC-рядок підключення', + 'create_notification' => 'Створено :database', + 'create_notification_fail' => 'Помилка створення :database', + 'delete_notification' => 'Видалено :database', + 'delete_notification_fail' => 'Не вдалося видалити :database', +]; diff --git a/lang/uk/server/file.php b/lang/uk/server/file.php new file mode 100644 index 0000000000..c7829987d7 --- /dev/null +++ b/lang/uk/server/file.php @@ -0,0 +1,111 @@ + 'Файли', + 'name' => 'Назва', + 'size' => 'Розмір', + 'modified_at' => 'Дата зміни', + 'actions' => [ + 'open' => 'Відкрити', + 'download' => 'Вивантаження', + 'copy' => [ + 'title' => 'Копіювати', + 'notification' => 'Файл скопійовано', + ], + 'upload' => [ + 'title' => 'Залити', + 'from_files' => 'Вивантажити файли', + 'from_url' => 'Завантажити з URL', + 'url' => 'URL', + 'drop_files' => 'Перетягніть файли, щоб завантажити', + 'success' => 'Файли успішно вивантажено', + 'failed' => 'Не вдалося завантажити файли', + 'header' => 'Завантаження файлів', + 'error' => 'Виникла помилка під час завантаження', + ], + 'rename' => [ + 'title' => 'Перейменувати', + 'file_name' => 'Ім\'я файлу', + 'notification' => 'Файл перейменовано', + ], + 'move' => [ + 'title' => 'Перемістити', + 'directory' => 'Каталог', + 'directory_hint' => 'Введіть новий каталог, відносно поточної директорії.', + 'new_location' => 'Нове розташування', + 'new_location_hint' => 'Введіть розташування цього файлу або каталогу, відносно поточної директорії.', + 'notification' => 'Файл переміщено', + 'bulk_notification' => ':count файлів було переміщено в :directory', + ], + 'permissions' => [ + 'title' => 'Доступи', + 'read' => 'Читання', + 'write' => 'Запис', + 'execute' => 'Виконання', + 'owner' => 'Власник', + 'group' => 'Група', + 'public' => 'Публічний', + 'notification' => 'Доступи змінено на :mode', + ], + 'archive' => [ + 'title' => 'Архів', + 'archive_name' => 'Назва архіву', + 'notification' => 'Архів створено', + 'extension' => 'Розширення', + ], + 'unarchive' => [ + 'title' => 'Розархівувати', + 'notification' => 'Розархівування завершено', + ], + 'new_file' => [ + 'title' => 'Новий файл', + 'file_name' => 'Нове ім\'я файлу', + 'syntax' => 'Підсвічування синтаксису', + 'create' => 'Створити', + ], + 'new_folder' => [ + 'title' => 'Нова тека', + 'folder_name' => 'Нова назва теки', + ], + 'nested_search' => [ + 'title' => 'Пошук в файлах', + 'search_term' => 'Пошуковий запит', + 'search_term_placeholder' => 'Введіть слово для пошуку, наприклад *.txt', + 'search' => 'Пошук', + 'search_for_term' => 'Пошук в :term', + ], + 'delete' => [ + 'notification' => 'Файл видалено', + 'bulk_notification' => 'Видалено :count файлів', + ], + 'edit' => [ + 'title' => 'Редагування: :file', + 'save_close' => 'Зберегти та закрити', + 'save' => 'Зберегти', + 'cancel' => 'Скасувати', + 'notification' => 'Файл збережено', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name завеликий!', + 'body' => 'Макс :max', + ], + 'file_not_found' => [ + 'title' => ':name не знайдено!', + ], + 'file_not_editable' => [ + 'title' => ':name це каталог', + ], + 'file_already_exists' => [ + 'title' => ':name вже існує!', + ], + 'files_node_error' => [ + 'title' => 'Не вдалося завантажити файли!', + ], + 'pelicanignore' => [ + 'title' => 'Ви редагуєте .pelicanignore файл!', + 'body' => 'Усі перелічені тут файли чи каталоги буде виключено з резервних копій. Символи підстановки підтримуються за допомогою зірочки (*).
Ви можете скасувати попереднє правило, додавши перед ним знак оклику (!).', + ], + ], +]; diff --git a/lang/uk/server/network.php b/lang/uk/server/network.php new file mode 100644 index 0000000000..720b486278 --- /dev/null +++ b/lang/uk/server/network.php @@ -0,0 +1,17 @@ + 'Мережа', + 'add' => 'Додати порт', + 'limit' => 'Досягнуто ліміту портів', + 'address' => 'Адреса', + 'port' => 'Порт', + 'notes' => 'Примітки', + 'no_notes' => 'Без приміток', + 'make_primary' => 'Зробити основним', + 'primary' => 'Основний', + 'make' => 'Створити', + 'delete' => 'Видалити', + 'locked' => 'Заблоковано?', + 'locked_helper' => 'Заблоковані розміщення можуть бути видалені тільки адміністраторами', +]; diff --git a/lang/uk/server/schedule.php b/lang/uk/server/schedule.php new file mode 100644 index 0000000000..c99eeed735 --- /dev/null +++ b/lang/uk/server/schedule.php @@ -0,0 +1,121 @@ + 'Розклади', + 'new' => 'Новий Розклад', + 'edit' => 'Редагувати розклад', + 'save' => 'Зберегти розклад', + 'delete' => 'Видалити розклад', + 'import' => 'Імпортувати розклад', + 'export' => 'Експортувати розклад', + 'name' => 'Назва', + 'cron' => 'Планувальник', + 'status' => 'Стан', + 'schedule_status' => [ + 'inactive' => 'Неактивний', + 'processing' => 'Виконується', + 'active' => 'Активний', + ], + 'no_tasks' => 'Немає завдань', + 'run_now' => 'Запустити зараз', + 'online_only' => 'Тільки в режимі онлайн', + 'last_run' => 'Останній запуск', + 'next_run' => 'Наступний запуск', + 'never' => 'Ніколи', + 'cancel' => 'Скасувати', + + 'only_online' => 'Лише коли на сервері працює?', + 'only_online_hint' => 'Виконувати тільки цей розклад, коли сервер працює.', + 'enabled' => 'Увімкнути розклад?', + 'enabled_hint' => 'Цей розклад буде виконано автоматично, якщо увімкнено.', + + 'cron_body' => 'Будь ласка, майте на увазі, що крон подано нижче значення UTC.', + 'cron_timezone' => 'Наступний запуск у часовому поясі (:timezone): :next_run ', + + 'invalid' => 'Недійсний', + + 'time' => [ + 'minute' => 'Хвилина', + 'hour' => 'Година', + 'day' => 'День', + 'week' => 'Тиждень', + 'month' => 'Місяць', + 'day_of_month' => 'День місяця', + 'day_of_week' => 'День тижня', + + 'hourly' => 'Щогодини', + 'daily' => 'Щоденно', + 'weekly_mon' => 'Щотижневий (понеділок)', + 'weekly_sun' => 'Щотижневий (неділя)', + 'monthly' => 'Щомісяця', + 'every_min' => 'Кожні x хвилин', + 'every_hour' => 'Кожні x годин', + 'every_day' => 'Кожні x днів', + 'every_week' => 'Кожні x тижнів', + 'every_month' => 'Кожні x місяців', + 'every_day_of_week' => 'Кожного дня тижня', + + 'every' => 'Кожен', + 'minutes' => 'Хвилини', + 'hours' => 'Години', + 'days' => 'Дні', + 'months' => 'Місяці', + + 'monday' => 'Понеділок', + 'tuesday' => 'Вівторок', + 'wednesday' => 'Середа', + 'thursday' => 'Четвер', + 'friday' => 'П’ятниця', + 'saturday' => 'Субота', + 'sunday' => 'Неділя', + ], + + 'tasks' => [ + 'title' => 'Завдання', + 'create' => 'Створити завдання', + 'limit' => 'Досягнуто ліміту завдань', + 'action' => 'Дія', + 'payload' => 'Корисне навантаження', + 'no_payload' => 'Дані Payload відсутні', + 'time_offset' => 'Часовий пояс', + 'first_task' => 'Перше завдання', + 'seconds' => 'Секунди', + 'continue_on_failure' => 'Продовжити при помилці', + + 'actions' => [ + 'title' => 'Дія', + 'power' => [ + 'title' => 'Відправити дії живлення', + 'action' => 'Дії живлення', + 'start' => 'Запустити', + 'stop' => 'Зупинити', + 'restart' => 'Перезапустити', + 'kill' => 'Завершити', + ], + 'command' => [ + 'title' => 'Надіслати команду', + 'command' => 'Команда', + ], + 'backup' => [ + 'title' => 'Створити резервну копію', + 'files_to_ignore' => 'Файли для ігнорування', + ], + 'delete_files' => [ + 'title' => 'Видалити файли', + 'files_to_delete' => 'Файли для видалення', + ], + ], + ], + + 'notification_invalid_cron' => 'Надані дані cron не обчислюються для правильного виразу', + + 'import_action' => [ + 'file' => 'Файл', + 'url' => 'URL', + 'schedule_help' => 'Це має бути безпосередньо .json файл (наприклад, schedule-daily-restart.json)', + 'url_help' => 'URL-адреси мають вказувати безпосередньо на необроблений .json файл.', + 'add_url' => 'Нова URL-адреса', + 'import_failed' => 'Імпорт не вдався', + 'import_success' => 'Імпорт успішний', + ], +]; diff --git a/lang/uk/server/setting.php b/lang/uk/server/setting.php new file mode 100644 index 0000000000..2a8a96caa5 --- /dev/null +++ b/lang/uk/server/setting.php @@ -0,0 +1,55 @@ + 'Налаштування', + 'server_info' => [ + 'title' => 'Інформація про сервер', + 'information' => 'Інформація', + 'name' => 'Ім\'я сервера', + 'server_name' => 'Ім\'я сервера: :name', + 'notification_name' => 'Оновлено ім\'я сервера', + 'description' => 'Опис Сервера', + 'notification_description' => 'Оновлено опис серверу', + 'failed' => 'Помилка', + 'uuid' => 'UUID серверу', + 'uuid_short' => 'ID серверу', + 'node_name' => 'Назва вузла', + 'icon' => [ + 'upload' => 'Завантажити іконку', + 'tooltip' => 'Використовуємо іконку яйця', + 'updated' => 'Іконку сервера оновлено', + 'deleted' => 'Іконку сервера видалено', + ], + 'limits' => [ + 'title' => 'Ліміти', + 'unlimited' => 'Без обмежень', + 'of' => 'із', + 'cpu' => 'ЦП', + 'memory' => 'Памʼять', + 'disk' => 'Дисковий простір', + 'backups' => 'Резервні копії', + 'databases' => 'Бази даних', + 'allocations' => 'Порти', + 'no_allocations' => 'Немає додаткових портів', + ], + 'sftp' => [ + 'title' => 'Інформація про SFTP', + 'connection' => 'Підключення', + 'action' => 'Підключення до SFTP', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + 'password_body' => 'Ваш пароль до SFTP такий самий, як і пароль, який ви використовуєте для доступу до цієї панелі.', + ], + ], + 'reinstall' => [ + 'title' => 'Перевстановити сервер', + 'body' => 'Перевстановлення вашого сервера зупинить його, а потім перезапустить скрипт для установки, який спочатку його встановив.', + 'body2' => 'Деякі файли можуть бути видалені або змінені в цьому процесі, будь ласка, зробіть резервну копію ваших даних, перш ніж продовжити.', + 'action' => 'Перевстановлення', + 'modal' => 'Ви впевнені, що хочете перевстановити цей сервер?', + 'modal_description' => 'Деякі файли можуть бути видалені або змінені в цьому процесі, будь ласка, зробіть резервну копію ваших даних, перш ніж продовжити.', + 'yes' => 'Так, перевстановити', + 'notification_start' => 'Перевстановлення запущено', + 'notification_fail' => 'Невдале перевстановлення', + ], +]; diff --git a/lang/uk/server/startup.php b/lang/uk/server/startup.php new file mode 100644 index 0000000000..546745e5c4 --- /dev/null +++ b/lang/uk/server/startup.php @@ -0,0 +1,17 @@ + 'При запуску', + 'command' => 'Команда запуску', + 'notification_startup' => 'Команду запуску оновлено', + 'notification_startup_body' => 'Перезавантажте сервер, щоб використати новий образ.', + 'enable_preview' => 'Перевірка', + 'disable_preview' => 'Вимкнути перевірку', + 'docker_image' => 'Docker зображення', + 'notification_docker' => 'Docker образ оновлено', + 'notification_docker_body' => 'Перезавантажте сервер, щоб використати новий образ.', + 'variables' => 'Змінні сервера', + 'update' => 'Оновлено: :variable', + 'fail' => 'Помилка: :variable', + 'validation_fail' => 'Помилка валідації: :variable', +]; diff --git a/lang/uk/server/user.php b/lang/uk/server/user.php new file mode 100644 index 0000000000..79f915b8ad --- /dev/null +++ b/lang/uk/server/user.php @@ -0,0 +1,73 @@ + 'Користувачі', + 'username' => 'Ім\'я користувача', + 'email' => 'Електронна пошта', + 'assign_all' => 'Вибрати все', + 'invite_user' => 'Запросити користувача', + 'action' => 'Запросити', + 'remove' => 'Видалити користувача', + 'edit' => 'Редагувати користувача', + 'editing' => 'Редагування :user', + 'delete' => 'Видалити користувача', + 'notification_add' => 'Користувача запрошено!', + 'notification_edit' => 'Користувача оновлено!', + 'notification_delete' => 'Користувача видалено!', + 'notification_failed' => 'Не вдалося запросити користувача!', + 'permissions' => [ + 'title' => 'Дозволи', + 'activity_desc' => 'Дозволи, які керують доступом користувача до журналів активності серверу.', + 'startup_desc' => 'Дозволи, які визначають можливість перегляду параметрів запуску сервера.', + 'settings_desc' => 'Дозволи, які визначають можливість зміни налаштувань сервера.', + 'control_desc' => 'Дозволи, які визначають можливість керування живленням сервера або відправлення команд.', + 'user_desc' => 'Дозволи, які дають користувачеві змогу керувати іншими субкористувачами сервера. Вони не можуть змінювати власний акаунт або призначати права, яких у них самих немає.', + 'file_desc' => 'Дозволи, які визначають можливість змінювати файлову систему сервера.', + 'allocation_desc' => 'Дозволи, які визначають можливість змінювати виділення портів для сервера.', + 'database_desc' => 'Дозволи, які керують доступом користувача до управління базами даних сервера.', + 'backup_desc' => 'Дозволи, які визначають можливість створення та управління резервними копіями сервера.', + 'schedule_desc' => 'Дозволи, які визначають можливість управління розкладами сервера.', + 'startup_read' => 'Дозволяє користувачеві переглядати змінні запуску сервера.', + 'startup_update' => 'Дозволяє користувачеві змінювати змінні запуску сервера.', + 'startup_docker_image' => 'Дозволяє користувачеві змінювати Docker зображення, що використовується для запуску сервера.', + 'settings_reinstall' => 'Дозволяє користувачеві зробити перевстановлення цього серверу.', + 'settings_rename' => 'Дозволяє користувачеві перейменувати цей сервер.', + 'settings_description' => 'Дозволяє користувачеві змінювати опис цього сервера.', + 'activity_read' => 'Дозволяє користувачеві переглядати журнали активності сервера.', + 'websocket_connect' => 'Дозволяє користувачеві доступ до WebSocket цього сервера.', + 'control_console' => 'Дозволяє користувачеві відправляти дані в консоль сервера.', + 'control_start' => 'Дозволяє користувачеві запускати сервер.', + 'control_stop' => 'Дозволяє користувачеві зупиняти сервер.', + 'control_restart' => 'Дозволяє користувачеві перезапускати сервер.', + 'control_kill' => 'Дозволяє користувачеві завершувати роботу сервера примусово.', + 'user_create' => 'Дозволяє користувачеві створювати нові акаунти для сервера.', + 'user_read' => 'Дозволяє користувачеві переглядати список користувачів, пов’язаних із сервером.', + 'user_update' => 'Дозволяє користувачеві змінювати інших користувачів сервера.', + 'user_delete' => 'Дозволяє користувачеві видаляти інших користувачів сервера.', + 'file_create' => 'Дозволяє користувачеві створювати нові файли та каталоги.', + 'file_read' => 'Дозволяє користувачеві переглядати вміст директорій, але не переглядати або завантажувати файли.', + 'file_read_content' => 'Дозволяє користувачеві переглядати вміст файлів і завантажувати їх.', + 'file_update' => 'Дозволяє користувачеві оновлювати файли та каталоги сервера.', + 'file_delete' => 'Дозволяє користувачеві видаляти файли та каталоги.', + 'file_archive' => 'Дозволяє користувачеві створювати архіви файлів та розпаковувати існуючі.', + 'file_sftp' => 'Дозволяє користувачеві виконувати вищезазначені дії з файлами через SFTP клієнт.', + 'allocation_read' => 'Дозволяє користувачеві переглядати всі поточні виділення сервера. Користувачі з будь-яким рівнем доступу до сервера завжди можуть переглядати основне виділення.', + 'allocation_update' => 'Дозволяє користувачеві змінювати основні порти сервера та додавати примітки до кожного порту.', + 'allocation_delete' => 'Дозволяє користувачеві видаляти порти сервера.', + 'allocation_create' => 'Дозволяє користувачеві додавати додаткові порти сервера.', + 'database_create' => 'Дозволяє користувачеві створювати нову базу даних для сервера.', + 'database_read' => 'Дозволяє користувачеві переглядати бази даних сервера.', + 'database_update' => 'Дозволяє користувачеві змінювати базу даних. Якщо користувач не має права "Перегляд пароля", він не зможе змінити пароль.', + 'database_delete' => 'Дозволяє користувачеві видаляти базу даних сервера.', + 'database_view_password' => 'Дозволяє користувачеві переглядати пароль до бази даних.', + 'schedule_create' => 'Дозволяє користувачеві створювати нові розклади для сервера.', + 'schedule_read' => 'Дозволяє користувачеві переглядати розклади сервера.', + 'schedule_update' => 'Дозволяє користувачеві змінювати існуючі розклади сервера.', + 'schedule_delete' => 'Дозволяє користувачеві видаляти розклади сервера.', + 'backup_create' => 'Дозволяє користувачеві створювати нові резервні копії сервера.', + 'backup_read' => 'Дозволяє користувачеві переглядати всі резервні копії сервера', + 'backup_delete' => 'Дозволяє користувачеві видаляти резервні копії із системи.', + 'backup_download' => 'Дозволяє користувачеві завантажувати резервну копію сервера. Увага: це надає доступ до всіх файлів сервера в резервній копії.', + 'backup_restore' => 'Дозволяє користувачеві відновлювати резервну копію сервера. Увага: під час відновлення всі файли сервера будуть видалені.', + ], +]; diff --git a/lang/uk/server/users.php b/lang/uk/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/uk/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/uk/strings.php b/lang/uk/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/uk/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/uk/validation.php b/lang/uk/validation.php index 5e842264c8..376cad3c4d 100644 --- a/lang/uk/validation.php +++ b/lang/uk/validation.php @@ -12,78 +12,73 @@ | */ - 'accepted' => 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'accepted' => ':attribute повинен бути прийнятий.', + 'active_url' => ':attribute не є дійсним URL.', + 'after' => ':attribute повинен бути датою після :date.', + 'after_or_equal' => ':attribute повинен бути датою після або рівною :date.', + 'alpha' => ':attribute може містити лише літери.', + 'alpha_dash' => ':attribute може містити лише літери, цифри та дефіси.', + 'alpha_num' => ':attribute може містити лише літери та цифри.', + 'array' => ':attribute повинен бути масивом.', + 'before' => ':attribute повинен бути датою до :date.', + 'before_or_equal' => ':attribute повинен бути датою до або рівною :date.', 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'numeric' => ':attribute повинен бути між :min та :max.', + 'file' => ':attribute повинен бути між :min та :max кілобайтами.', + 'string' => ':attribute повинен містити від :min до :max символів.', + 'array' => ':attribute повинен містити від :min до :max елементів.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'Вибране поле :attribute є недійсним.', - 'in_array' => 'Значення поля :attribute не існує в :other.', - 'integer' => 'Значення поля :attribute має бути цілим числом.', - 'ip' => 'Значення поля :attribute має бути дійсною IP адресою.', - 'json' => 'Значення поля :attribute має бути дійсним JSON рядком.', + + 'confirmed' => 'Підтвердження :attribute не співпадає.', + 'date' => ':attribute не є дійсною датою.', + 'date_format' => ':attribute не відповідає формату :format.', + 'different' => ':attribute та :other повинні відрізнятися.', + 'digits' => ':attribute повинен містити :digits цифр.', + 'digits_between' => ':attribute повинен містити від :min до :max цифр.', + 'dimensions' => ':attribute має недійсні розміри зображення.', + + 'email' => ':attribute повинен бути дійсною електронною адресою.', + + 'file' => ':attribute повинен бути файлом.', + 'filled' => 'Поле :attribute є обов’язковим.', + 'image' => ':attribute повинен бути зображенням.', + + 'in_array' => 'Поле :attribute не існує в :other.', + 'integer' => ':attribute повинен бути цілим числом.', + 'ip' => ':attribute повинен бути дійсною IP-адресою.', + 'json' => ':attribute повинен бути дійсним JSON-рядком.', 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', + 'numeric' => ':attribute не може бути більше ніж :max.', + 'file' => ':attribute не може перевищувати :max кілобайтів.', + 'string' => ':attribute не може містити більше ніж :max символів.', + 'array' => ':attribute не може містити більше ніж :max елементів.', ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'mimes' => ':attribute повинен бути файлом типу: :values.', + 'mimetypes' => ':attribute повинен бути файлом типу: :values.', 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + 'numeric' => ':attribute повинен бути не менше ніж :min.', + 'file' => ':attribute повинен бути не менше ніж :min кілобайтів.', + 'string' => ':attribute повинен містити принаймні :min символів.', + 'array' => ':attribute повинен містити принаймні :min елементів.', ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', + + 'numeric' => ':attribute повинен бути числом.', + + 'regex' => 'Формат :attribute є недійсним.', + + 'required_with_all' => 'Поле :attribute є обов’язковим, коли присутні :values.', + + 'same' => ':attribute та :other повинні збігатися.', 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + 'numeric' => ':attribute повинен бути :size.', + 'file' => ':attribute повинен бути :size кілобайтів.', + 'string' => ':attribute повинен містити :size символів.', + 'array' => ':attribute повинен містити :size елементів.', ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', + 'string' => ':attribute повинен бути рядком.', + 'timezone' => ':attribute повинен бути дійсною часовою зоною.', + + 'url' => 'Формат :attribute є недійсним.', /* |-------------------------------------------------------------------------- @@ -100,7 +95,7 @@ // Internal validation logic for Panel 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', + 'variable_value' => 'Змінна :env', + 'invalid_password' => 'Наданий пароль є недійсним для цього облікового запису.', ], ]; diff --git a/lang/vi/activity.php b/lang/vi/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/vi/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/vi/admin/apikey.php b/lang/vi/admin/apikey.php new file mode 100644 index 0000000000..8bcbdd8439 --- /dev/null +++ b/lang/vi/admin/apikey.php @@ -0,0 +1,27 @@ + 'Khóa API của ứng dụng', + 'empty' => 'Không có khóa API', + 'whitelist' => 'Địa chỉ IPv4 được đưa vào danh sách trắng', + 'whitelist_help' => 'Khóa API có thể bị giới hạn chỉ hoạt động với các địa chỉ IPv4 cụ thể. Nhập mỗi địa chỉ trên một dòng mới.', + 'whitelist_placeholder' => 'Ví dụ: 127.0.0.01 hoặc 192.168.1.1', + 'description' => 'Mô tả', + 'description_help' => 'Mô tả ngắn gọn về chức năng của khoá này.', + 'nav_title' => 'Khóa API', + 'model_label' => 'Khóa API của ứng dụng', + 'model_label_plural' => 'Khóa API của ứng dụng', + 'table' => [ + 'key' => 'Khóa', + 'description' => 'Mô tả', + 'last_used' => 'Lần sử dụng cuối cùng', + 'created' => 'Ngày tạo', + 'created_by' => 'Được tạo bởi', + 'never_used' => 'Chưa bao giờ dùng', + ], + 'permissions' => [ + 'none' => 'Trống', + 'read' => 'Đọc', + 'read_write' => 'Đọc & Ghi', + ], +]; diff --git a/lang/vi/admin/dashboard.php b/lang/vi/admin/dashboard.php new file mode 100644 index 0000000000..8961cd4cba --- /dev/null +++ b/lang/vi/admin/dashboard.php @@ -0,0 +1,45 @@ + 'Chào mừng bạn đến với Pelican!', + 'version' => 'Phiên bản: :version', + 'advanced' => 'Nâng cao', + 'server' => 'Máy chủ', + 'user' => 'Người dùng', + 'sections' => [ + 'intro-developers' => [ + 'heading' => 'Thông tin dành cho nhà phát triển', + 'content' => 'Cảm ơn bạn đã dùng thử phiên bản phát triển!', + 'extra_note' => 'Nếu bạn gặp bất kỳ sự cố nào, vui lòng báo cáo trên GitHub.', + 'button_issues' => 'Tạo vấn đề', + 'button_features' => 'Thảo luận về các tính năng', + ], + 'intro-update-available' => [ + 'heading' => 'Bản cập nhật có sẵn', + 'content' => ':latestVersion hiện đã có sẵn! Đọc tài liệu của chúng tôi để cập nhật Bảng điều khiển của bạn.', + 'button_changelog' => 'Có gì mới?', + ], + 'intro-no-update' => [ + 'heading' => 'Bảng điều khiển của bạn đã được cập nhật', + 'content' => 'Bạn đang sử dụng :version. Bảng điều khiển của bạn đã được cập nhật!', + ], + 'intro-first-node' => [ + 'heading' => 'Không phát hiện thấy nhánh nào', + 'content' => 'Có vẻ như bạn chưa thiết lập bất kỳ Nhánh nào, nhưng đừng lo lắng vì bạn đã nhấp vào nút hành động để tạo Nhánh đầu tiên!', + 'extra_note' => 'Nếu bạn gặp bất kỳ sự cố nào, vui lòng báo cáo trên GitHub.', + 'button_label' => 'Tạo Nhánh đầu tiên trong Pelican', + ], + 'intro-support' => [ + 'heading' => 'Hỗ trợ Pelican', + 'content' => 'Cảm ơn bạn đã sử dụng Pelican, thành quả này chỉ có thể đạt được nhờ sự hỗ trợ của bạn, những người đóng góp và những người ủng hộ khác!', + 'extra_note' => 'Chúng tôi trân trọng tất cả sự hỗ trợ từ mọi người.', + 'button_translate' => 'Giúp phiên dịch', + 'button_donate' => 'Ủng hộ trực tiếp', + ], + 'intro-help' => [ + 'heading' => 'Cần giúp đỡ?', + 'content' => 'Hãy xem tài liệu trước! Nếu bạn vẫn cần trợ giúp, hãy truy cập máy chủ Discord của chúng tôi!', + 'button_docs' => 'Đọc tài liệu hướng dẫn', + ], + ], +]; diff --git a/lang/vi/admin/eggs.php b/lang/vi/admin/eggs.php deleted file mode 100644 index a18a8fba0e..0000000000 --- a/lang/vi/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Thành công thêm vào Egg này và những biến thể liên quan.', - 'updated_via_import' => 'Egg này đã được cập nhật sử dụng tập tin được cung cấp.', - 'deleted' => 'Thành công xóa egg được yêu cầu khỏi bảng điều khiển.', - 'updated' => 'Cấu hình cho Egg đã được cập nhật thành công.', - 'script_updated' => 'Tập lệnh cài đặt Egg đã được cập nhật và sẽ chạy bất cứ khi nào máy chủ được cài đặt.', - 'egg_created' => 'Một quả trứng mới đã được đẻ thành công. Bạn sẽ cần phải khởi động lại những daemon đang chạy để áp dụng egg mới này.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'Biến ".variable" đã được xóa và sẽ không còn khả dụng với máy chủ một khi được dựng lại.', - 'variable_updated' => 'Biến ".variable" đã được cập nhật. Bạn sẽ cần phải dựng lại những máy chủ nào sử dụng biến này để áp dụng các thay đổi.', - 'variable_created' => 'Biến mới đã được tạo thành công và được gán cho egg này.', - ], - ], -]; diff --git a/lang/vi/admin/log.php b/lang/vi/admin/log.php new file mode 100644 index 0000000000..4180871fe9 --- /dev/null +++ b/lang/vi/admin/log.php @@ -0,0 +1,26 @@ + 'Tuyệt vời! Không có lỗi nào cả!', + 'total_logs' => 'Tất cả bản ghi', + 'error' => 'Lỗi', + 'warning' => 'Cảnh báo', + 'notice' => 'Chú ý', + 'info' => 'Thông tin', + 'debug' => 'Gỡ lỗi', + 'navigation' => [ + 'panel_logs' => 'Bản ghi bản điều khiển', + ], + 'actions' => [ + 'upload_logs' => 'Tải lên bản ghi?', + 'upload_logs_description' => 'Thao tác này sẽ tải :file lên :url Bạn có chắc chắn muốn thực hiện?', + 'view_logs' => 'Xem bản ghi', + 'log_not_found' => 'Không tìm thấy bản ghi!', + 'log_not_found_description' => 'Không tìm thấy bản ghi :filename', + 'failed_to_upload' => 'Tải lên thất bại', + 'failed_to_upload_description' => 'Trạng thái HTTP :status', + 'log_upload' => 'Bản ghi đã được tải lên!', + 'log_upload_action' => 'Xem bản ghi', + 'upload_tooltip' => 'Tải lên đến :url', + ], +]; diff --git a/lang/vi/admin/node.php b/lang/vi/admin/node.php deleted file mode 100644 index 7b049862e2..0000000000 --- a/lang/vi/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'FQDN hoặc địa chỉ IP được cung cấp không cho ra địa chỉ IP hợp lệ.', - 'fqdn_required_for_ssl' => 'Một tên miền đầy đủ có thể cho ra một địa chỉ IP công cộng là cần thiết để sử dụng SSL cho node này.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node đã được xóa thành công khỏi bảng điều khiển.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/vi/admin/role.php b/lang/vi/admin/role.php new file mode 100644 index 0000000000..10a8971fd8 --- /dev/null +++ b/lang/vi/admin/role.php @@ -0,0 +1,17 @@ + 'Vai trò', + 'model_label' => 'Vai trò', + 'model_label_plural' => 'Vai trò', + 'no_roles' => 'Không có vai trò', + 'name' => 'Tên vai trò', + 'permissions' => 'Phân quyền', + 'in_use' => 'Đang sử dụng', + 'all' => 'Tất cả', + 'root_admin' => ':role đã có tất cả các quyền.', + 'root_admin_delete' => 'Không thể xóa Quản trị viên gốc', + 'users' => 'Người dùng', + 'nodes' => 'Nút', + 'nodes_hint' => 'Để trống để cho phép truy cập vào tất cả các nút.', +]; diff --git a/lang/vi/admin/server.php b/lang/vi/admin/server.php deleted file mode 100644 index 08d64ed508..0000000000 --- a/lang/vi/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'Không tìm thấy phân bổ mặc định được yêu cầu trong phân bổ của máy chủ này.', - ], - 'alerts' => [ - 'startup_changed' => 'Thiết lập cho trình khởi động của máy chủ này đã được cập nhật. Nếu egg của máy chủ này đã thay đổi thì việc tái cài đặt sẽ được bắt đầu ngay bây giờ.', - 'server_deleted' => 'Máy chủ đã được xóa thành công khỏi hệ thống.', - 'server_created' => 'Máy chủ đã được khởi tạo thành công trên bản điều khiển. Xin hãy cho daemon một ít phút để hoàn thiện việc cài đặt máy chủ này.', - 'build_updated' => 'Chi tiết bản dựng của máy chủ này đã được cập nhật. Một số thay đổi sẽ cần phải khởi động lại để có hiệu lực.', - 'suspension_toggled' => 'Trạng thái tạm dừng của máy chủ đã được thay đổi thành :status.', - 'rebuild_on_boot' => 'Máy chủ này đã được đánh dấu là cần phải xây dựng lại Docker Container. Điều này sẽ xảy ra ở lần khởi động máy chủ tiếp theo.', - 'install_toggled' => 'Tình trạng cài đặt của máy chủ này đã được thay đổi.', - 'server_reinstalled' => 'Máy chủ này đã được đưa vào hàng chờ cho việc tái cài đặt ngay bây giờ.', - 'details_updated' => 'Chi tiết về máy chủ đã được cập nhật thành công.', - 'docker_image_updated' => 'Đã thành công thay đổi gói Docker mặc định để sử dụng cho server này. Việc khởi động lại là cần thiết để áp dụng thay đổi này.', - 'node_required' => 'Bạn cần ít nhất một node đã được thiết lập trước khi bạn có thể thêm máy chủ vào bản điều khiển.', - 'transfer_nodes_required' => 'Bạn cần có ít nhất hai node đã được thiết lập trước khi bạn có thể chuyển dời máy chủ.', - 'transfer_started' => 'Việc chuyển dời máy chủ đã được bắt đầu.', - 'transfer_not_viable' => 'Node bạn đang chọn không có dung lượng ổ cứng hoặc bộ nhớ cần thiết để chứa máy chủ này.', - ], -]; diff --git a/lang/vi/admin/user.php b/lang/vi/admin/user.php deleted file mode 100644 index 6fb0a62f3a..0000000000 --- a/lang/vi/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Không thể xóa một người dùng có máy chủ đang hoạt động có gắn kết với tài khoản của họ. Xin hãy xóa máy chủ của họ trước khi tiếp tục.', - 'user_is_self' => 'Không thể xóa tài khoản người dùng của riêng bạn.', - ], - 'notices' => [ - 'account_created' => 'Tài khoản đã được tạo thành công.', - 'account_updated' => 'Tài khoản đã được cập nhật thành công.', - ], -]; diff --git a/lang/vi/auth.php b/lang/vi/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/vi/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/vi/command/messages.php b/lang/vi/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/vi/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/vi/dashboard/account.php b/lang/vi/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/vi/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/vi/dashboard/index.php b/lang/vi/dashboard/index.php deleted file mode 100644 index 95f62fdae9..0000000000 --- a/lang/vi/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Tìm kiếm máy chủ...', - 'no_matches' => 'Không có máy chủ nào trùng khớp với tiêu chí tìm kiếm được cung cấp.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Bộ nhớ', -]; diff --git a/lang/vi/exceptions.php b/lang/vi/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/vi/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/vi/pagination.php b/lang/vi/pagination.php deleted file mode 100644 index 62afffed1b..0000000000 --- a/lang/vi/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Trước', - 'next' => 'Tiếp theo »', -]; diff --git a/lang/vi/passwords.php b/lang/vi/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/vi/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/vi/server/console.php b/lang/vi/server/console.php new file mode 100644 index 0000000000..d2aeab046d --- /dev/null +++ b/lang/vi/server/console.php @@ -0,0 +1,43 @@ + 'Cửa sổ lệnh', + 'command' => 'Nhập lệnh', + 'command_blocked' => 'Server ngoại tuyến...', + 'command_blocked_title' => 'Không thể gửi lệnh khi server ngoại tuyến', + 'open_in_admin' => 'Mở quản trị', + 'power_actions' => [ + 'start' => 'Bật', + 'stop' => 'Dừng', + 'restart' => 'Khởi động lại', + 'kill' => 'Dừng ngay', + 'kill_tooltip' => 'Dừng ngay có thể khiến server bị mất dữ liệu', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => 'Bộ nhớ', + 'network' => 'Mạng', + 'disk' => 'Lưu trữ', + 'name' => 'Tên', + 'status' => 'Trạng thái', + 'address' => 'Địa chỉ', + 'unavailable' => 'Không có', + ], + 'status' => [ + 'created' => 'Đã tạo', + 'starting' => 'Đang khởi động', + 'running' => 'Đang chạy', + 'restarting' => 'Đang khởi động lại', + 'exited' => 'Đã thoát', + 'paused' => 'Đã tạm dừng', + 'dead' => 'Đã văng', + 'removing' => 'Đang xóa', + 'stopping' => 'Đang dừng', + 'offline' => 'Ngoại tuyến', + 'missing' => 'Bị thiếu', + ], + 'websocket_error' => [ + 'title' => 'Không thể kết nối vào websocket', + 'body' => 'Hãy mở devtool trình duyệt.', + ], +]; diff --git a/lang/vi/server/users.php b/lang/vi/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/vi/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/vi/strings.php b/lang/vi/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/vi/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/vi/validation.php b/lang/vi/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/vi/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/zh/activity.php b/lang/zh/activity.php deleted file mode 100644 index 501a1dcde6..0000000000 --- a/lang/zh/activity.php +++ /dev/null @@ -1,130 +0,0 @@ - [ - 'fail' => 'Failed log in', - 'success' => 'Logged in', - 'password-reset' => 'Password reset', - 'reset-password' => 'Requested password reset', - 'checkpoint' => 'Two-factor authentication requested', - 'recovery-token' => 'Used two-factor recovery token', - 'token' => 'Solved two-factor challenge', - 'ip-blocked' => 'Blocked request from unlisted IP address for :identifier', - 'sftp' => [ - 'fail' => 'Failed SFTP log in', - ], - ], - 'user' => [ - 'account' => [ - 'email-changed' => 'Changed email from :old to :new', - 'password-changed' => 'Changed password', - ], - 'api-key' => [ - 'create' => 'Created new API key :identifier', - 'delete' => 'Deleted API key :identifier', - ], - 'ssh-key' => [ - 'create' => 'Added SSH key :fingerprint to account', - 'delete' => 'Removed SSH key :fingerprint from account', - ], - 'two-factor' => [ - 'create' => 'Enabled two-factor auth', - 'delete' => 'Disabled two-factor auth', - ], - ], - 'server' => [ - 'reinstall' => 'Reinstalled server', - 'console' => [ - 'command' => 'Executed ":command" on the server', - ], - 'power' => [ - 'start' => 'Started the server', - 'stop' => 'Stopped the server', - 'restart' => 'Restarted the server', - 'kill' => 'Killed the server process', - ], - 'backup' => [ - 'download' => 'Downloaded the :name backup', - 'delete' => 'Deleted the :name backup', - 'restore' => 'Restored the :name backup (deleted files: :truncate)', - 'restore-complete' => 'Completed restoration of the :name backup', - 'restore-failed' => 'Failed to complete restoration of the :name backup', - 'start' => 'Started a new backup :name', - 'complete' => 'Marked the :name backup as complete', - 'fail' => 'Marked the :name backup as failed', - 'lock' => 'Locked the :name backup', - 'unlock' => 'Unlocked the :name backup', - ], - 'database' => [ - 'create' => 'Created new database :name', - 'rotate-password' => 'Password rotated for database :name', - 'delete' => 'Deleted database :name', - ], - 'file' => [ - 'compress_one' => 'Compressed :directory:file', - 'compress_other' => 'Compressed :count files in :directory', - 'read' => 'Viewed the contents of :file', - 'copy' => 'Created a copy of :file', - 'create-directory' => 'Created directory :directory:name', - 'decompress' => 'Decompressed :files in :directory', - 'delete_one' => 'Deleted :directory:files.0', - 'delete_other' => 'Deleted :count files in :directory', - 'download' => 'Downloaded :file', - 'pull' => 'Downloaded a remote file from :url to :directory', - 'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to', - 'rename_other' => 'Renamed :count files in :directory', - 'write' => 'Wrote new content to :file', - 'upload' => 'Began a file upload', - 'uploaded' => 'Uploaded :directory:file', - ], - 'sftp' => [ - 'denied' => 'Blocked SFTP access due to permissions', - 'create_one' => 'Created :files.0', - 'create_other' => 'Created :count new files', - 'write_one' => 'Modified the contents of :files.0', - 'write_other' => 'Modified the contents of :count files', - 'delete_one' => 'Deleted :files.0', - 'delete_other' => 'Deleted :count files', - 'create-directory_one' => 'Created the :files.0 directory', - 'create-directory_other' => 'Created :count directories', - 'rename_one' => 'Renamed :files.0.from to :files.0.to', - 'rename_other' => 'Renamed or moved :count files', - ], - 'allocation' => [ - 'create' => 'Added :allocation to the server', - 'notes' => 'Updated the notes for :allocation from ":old" to ":new"', - 'primary' => 'Set :allocation as the primary server allocation', - 'delete' => 'Deleted the :allocation allocation', - ], - 'schedule' => [ - 'create' => 'Created the :name schedule', - 'update' => 'Updated the :name schedule', - 'execute' => 'Manually executed the :name schedule', - 'delete' => 'Deleted the :name schedule', - ], - 'task' => [ - 'create' => 'Created a new ":action" task for the :name schedule', - 'update' => 'Updated the ":action" task for the :name schedule', - 'delete' => 'Deleted a task for the :name schedule', - ], - 'settings' => [ - 'rename' => 'Renamed the server from :old to :new', - 'description' => 'Changed the server description from :old to :new', - ], - 'startup' => [ - 'edit' => 'Changed the :variable variable from ":old" to ":new"', - 'image' => 'Updated the Docker Image for the server from :old to :new', - ], - 'subuser' => [ - 'create' => 'Added :email as a subuser', - 'update' => 'Updated the subuser permissions for :email', - 'delete' => 'Removed :email as a subuser', - ], - ], -]; diff --git a/lang/zh/admin/eggs.php b/lang/zh/admin/eggs.php deleted file mode 100644 index ffd9b08e14..0000000000 --- a/lang/zh/admin/eggs.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'imported' => 'Successfully imported this Egg and its associated variables.', - 'updated_via_import' => 'This Egg has been updated using the file provided.', - 'deleted' => 'Successfully deleted the requested egg from the Panel.', - 'updated' => 'Egg configuration has been updated successfully.', - 'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.', - 'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.', - ], - 'variables' => [ - 'notices' => [ - 'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.', - 'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.', - 'variable_created' => 'New variable has successfully been created and assigned to this egg.', - ], - ], -]; diff --git a/lang/zh/admin/node.php b/lang/zh/admin/node.php deleted file mode 100644 index fde28a25b3..0000000000 --- a/lang/zh/admin/node.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.', - 'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.', - ], - 'notices' => [ - 'allocations_added' => 'Allocations have successfully been added to this node.', - 'node_deleted' => 'Node has been successfully removed from the panel.', - 'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. Before you can add any servers you must first allocate at least one IP address and port.', - 'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.', - 'unallocated_deleted' => 'Deleted all un-allocated ports for :ip.', - ], -]; diff --git a/lang/zh/admin/server.php b/lang/zh/admin/server.php deleted file mode 100644 index 057bd3ca58..0000000000 --- a/lang/zh/admin/server.php +++ /dev/null @@ -1,27 +0,0 @@ - [ - 'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.', - 'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.', - 'bad_variable' => 'There was a validation error with the :name variable.', - 'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)', - 'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.', - ], - 'alerts' => [ - 'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.', - 'server_deleted' => 'Server has successfully been deleted from the system.', - 'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.', - 'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.', - 'suspension_toggled' => 'Server suspension status has been changed to :status.', - 'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.', - 'install_toggled' => 'The installation status for this server has been toggled.', - 'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.', - 'details_updated' => 'Server details have been successfully updated.', - 'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.', - 'node_required' => 'You must have at least one node configured before you can add a server to this panel.', - 'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.', - 'transfer_started' => 'Server transfer has been started.', - 'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.', - ], -]; diff --git a/lang/zh/admin/user.php b/lang/zh/admin/user.php deleted file mode 100644 index 4134c15b40..0000000000 --- a/lang/zh/admin/user.php +++ /dev/null @@ -1,12 +0,0 @@ - [ - 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', - 'user_is_self' => 'Cannot delete your own user account.', - ], - 'notices' => [ - 'account_created' => 'Account has been created successfully.', - 'account_updated' => 'Account has been successfully updated.', - ], -]; diff --git a/lang/zh/auth.php b/lang/zh/auth.php deleted file mode 100644 index 2a3a452682..0000000000 --- a/lang/zh/auth.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sign In', - 'go_to_login' => 'Go to Login', - 'failed' => 'No account matching those credentials could be found.', - - 'forgot_password' => [ - 'label' => 'Forgot Password?', - 'label_help' => 'Enter your account email address to receive instructions on resetting your password.', - 'button' => 'Recover Account', - ], - - 'reset_password' => [ - 'button' => 'Reset and Sign In', - ], - - 'two_factor' => [ - 'label' => '2-Factor Token', - 'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.', - 'checkpoint_failed' => 'The two-factor authentication token was invalid.', - ], - - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.', - '2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.', -]; diff --git a/lang/zh/command/messages.php b/lang/zh/command/messages.php deleted file mode 100644 index 4e640b3fa5..0000000000 --- a/lang/zh/command/messages.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'search_users' => 'Enter a Username, User ID, or Email Address', - 'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)', - 'deleted' => 'User successfully deleted from the Panel.', - 'confirm_delete' => 'Are you sure you want to delete this user from the Panel?', - 'no_users_found' => 'No users were found for the search term provided.', - 'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.', - 'ask_admin' => 'Is this user an administrator?', - 'ask_email' => 'Email Address', - 'ask_username' => 'Username', - 'ask_name_first' => 'First Name', - 'ask_name_last' => 'Last Name', - 'ask_password' => 'Password', - 'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.', - 'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.', - '2fa_help_text' => [ - 'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.', - 'If this is not what you wanted to do, press CTRL+C to exit this process.', - ], - '2fa_disabled' => '2-Factor authentication has been disabled for :email.', - ], - 'schedule' => [ - 'output_line' => 'Dispatching job for first task in `:schedule` (:hash).', - ], - 'maintenance' => [ - 'deleting_service_backup' => 'Deleting service backup file :file.', - ], - 'server' => [ - 'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message', - 'reinstall' => [ - 'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message', - 'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?', - ], - 'power' => [ - 'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?', - 'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message', - ], - ], - 'environment' => [ - 'mail' => [ - 'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)', - 'ask_smtp_port' => 'SMTP Port', - 'ask_smtp_username' => 'SMTP Username', - 'ask_smtp_password' => 'SMTP Password', - 'ask_mailgun_domain' => 'Mailgun Domain', - 'ask_mailgun_endpoint' => 'Mailgun Endpoint', - 'ask_mailgun_secret' => 'Mailgun Secret', - 'ask_mandrill_secret' => 'Mandrill Secret', - 'ask_postmark_username' => 'Postmark API Key', - 'ask_driver' => 'Which driver should be used for sending emails?', - 'ask_mail_from' => 'Email address emails should originate from', - 'ask_mail_name' => 'Name that emails should appear from', - 'ask_encryption' => 'Encryption method to use', - ], - ], -]; diff --git a/lang/zh/dashboard/account.php b/lang/zh/dashboard/account.php deleted file mode 100644 index 85411ef652..0000000000 --- a/lang/zh/dashboard/account.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'title' => 'Update your email', - 'updated' => 'Your email address has been updated.', - ], - 'password' => [ - 'title' => 'Change your password', - 'requirements' => 'Your new password should be at least 8 characters in length.', - 'updated' => 'Your password has been updated.', - ], - 'two_factor' => [ - 'button' => 'Configure 2-Factor Authentication', - 'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.', - 'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.', - 'invalid' => 'The token provided was invalid.', - 'setup' => [ - 'title' => 'Setup two-factor authentication', - 'help' => 'Can\'t scan the code? Enter the code below into your application:', - 'field' => 'Enter token', - ], - 'disable' => [ - 'title' => 'Disable two-factor authentication', - 'field' => 'Enter token', - ], - ], -]; diff --git a/lang/zh/dashboard/index.php b/lang/zh/dashboard/index.php deleted file mode 100644 index 8ab11e9944..0000000000 --- a/lang/zh/dashboard/index.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Search for servers...', - 'no_matches' => 'There were no servers found matching the search criteria provided.', - 'cpu_title' => 'CPU', - 'memory_title' => 'Memory', -]; diff --git a/lang/zh/exceptions.php b/lang/zh/exceptions.php deleted file mode 100644 index 3977c87c24..0000000000 --- a/lang/zh/exceptions.php +++ /dev/null @@ -1,55 +0,0 @@ - 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.', - 'node' => [ - 'servers_attached' => 'A node must have no servers linked to it in order to be deleted.', - 'daemon_off_config_updated' => 'The daemon configuration has been updated, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.', - ], - 'allocations' => [ - 'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.', - 'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.', - 'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.', - 'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.', - 'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.', - ], - 'egg' => [ - 'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.', - 'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.', - 'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.', - ], - 'variables' => [ - 'env_not_unique' => 'The environment variable :name must be unique to this Egg.', - 'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.', - 'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.', - ], - 'importer' => [ - 'json_error' => 'There was an error while attempting to parse the JSON file: :error.', - 'file_error' => 'The JSON file provided was not valid.', - 'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.', - ], - 'subusers' => [ - 'editing_self' => 'Editing your own subuser account is not permitted.', - 'user_is_owner' => 'You cannot add the server owner as a subuser for this server.', - 'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.', - ], - 'databases' => [ - 'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.', - ], - 'tasks' => [ - 'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.', - ], - 'locations' => [ - 'has_nodes' => 'Cannot delete a location that has active nodes attached to it.', - ], - 'users' => [ - 'node_revocation_failed' => 'Failed to revoke keys on Node #:node. :error', - ], - 'deployment' => [ - 'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.', - 'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.', - ], - 'api' => [ - 'resource_not_found' => 'The requested resource does not exist on this server.', - ], -]; diff --git a/lang/zh/pagination.php b/lang/zh/pagination.php deleted file mode 100644 index ecac3aa331..0000000000 --- a/lang/zh/pagination.php +++ /dev/null @@ -1,17 +0,0 @@ - '« Previous', - 'next' => 'Next »', -]; diff --git a/lang/zh/passwords.php b/lang/zh/passwords.php deleted file mode 100644 index bde70f915e..0000000000 --- a/lang/zh/passwords.php +++ /dev/null @@ -1,19 +0,0 @@ - 'Passwords must be at least six characters and match the confirmation.', - 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', - 'token' => 'This password reset token is invalid.', - 'user' => 'We can\'t find a user with that e-mail address.', -]; diff --git a/lang/zh/server/users.php b/lang/zh/server/users.php deleted file mode 100644 index ce77c41010..0000000000 --- a/lang/zh/server/users.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - 'websocket_*' => 'Allows access to the websocket for this server.', - 'control_console' => 'Allows the user to send data to the server console.', - 'control_start' => 'Allows the user to start the server instance.', - 'control_stop' => 'Allows the user to stop the server instance.', - 'control_restart' => 'Allows the user to restart the server instance.', - 'control_kill' => 'Allows the user to kill the server instance.', - 'user_create' => 'Allows the user to create new user accounts for the server.', - 'user_read' => 'Allows the user permission to view users associated with this server.', - 'user_update' => 'Allows the user to modify other users associated with this server.', - 'user_delete' => 'Allows the user to delete other users associated with this server.', - 'file_create' => 'Allows the user permission to create new files and directories.', - 'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.', - 'file_update' => 'Allows the user to update files and folders associated with the server.', - 'file_delete' => 'Allows the user to delete files and directories.', - 'file_archive' => 'Allows the user to create file archives and decompress existing archives.', - 'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.', - 'allocation_read' => 'Allows access to the server allocation management pages.', - 'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.', - 'database_create' => 'Allows user permission to create a new database for the server.', - 'database_read' => 'Allows user permission to view the server databases.', - 'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.', - 'database_delete' => 'Allows a user permission to delete a database instance.', - 'database_view_password' => 'Allows a user permission to view a database password in the system.', - 'schedule_create' => 'Allows a user to create a new schedule for the server.', - 'schedule_read' => 'Allows a user permission to view schedules for a server.', - 'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.', - 'schedule_delete' => 'Allows a user to delete a schedule for the server.', - ], -]; diff --git a/lang/zh/strings.php b/lang/zh/strings.php deleted file mode 100644 index 58071426a9..0000000000 --- a/lang/zh/strings.php +++ /dev/null @@ -1,95 +0,0 @@ - 'Email', - 'email_address' => 'Email address', - 'user_identifier' => 'Username or Email', - 'password' => 'Password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm new password', - 'login' => 'Login', - 'home' => 'Home', - 'servers' => 'Servers', - 'id' => 'ID', - 'name' => 'Name', - 'node' => 'Node', - 'connection' => 'Connection', - 'memory' => 'Memory', - 'cpu' => 'CPU', - 'disk' => 'Disk', - 'status' => 'Status', - 'search' => 'Search', - 'suspended' => 'Suspended', - 'account' => 'Account', - 'security' => 'Security', - 'ip' => 'IP Address', - 'last_activity' => 'Last Activity', - 'revoke' => 'Revoke', - '2fa_token' => 'Authentication Token', - 'submit' => 'Submit', - 'close' => 'Close', - 'settings' => 'Settings', - 'configuration' => 'Configuration', - 'sftp' => 'SFTP', - 'databases' => 'Databases', - 'memo' => 'Memo', - 'created' => 'Created', - 'expires' => 'Expires', - 'public_key' => 'Token', - 'api_access' => 'Api Access', - 'never' => 'never', - 'sign_out' => 'Sign out', - 'admin_control' => 'Admin Control', - 'required' => 'Required', - 'port' => 'Port', - 'username' => 'Username', - 'database' => 'Database', - 'new' => 'New', - 'danger' => 'Danger', - 'create' => 'Create', - 'select_all' => 'Select All', - 'select_none' => 'Select None', - 'alias' => 'Alias', - 'primary' => 'Primary', - 'make_primary' => 'Make Primary', - 'none' => 'None', - 'cancel' => 'Cancel', - 'created_at' => 'Created At', - 'action' => 'Action', - 'data' => 'Data', - 'queued' => 'Queued', - 'last_run' => 'Last Run', - 'next_run' => 'Next Run', - 'not_run_yet' => 'Not Run Yet', - 'yes' => 'Yes', - 'no' => 'No', - 'delete' => 'Delete', - '2fa' => '2FA', - 'logout' => 'Logout', - 'admin_cp' => 'Admin Control Panel', - 'optional' => 'Optional', - 'read_only' => 'Read Only', - 'relation' => 'Relation', - 'owner' => 'Owner', - 'admin' => 'Admin', - 'subuser' => 'Subuser', - 'captcha_invalid' => 'The provided captcha is invalid.', - 'tasks' => 'Tasks', - 'seconds' => 'Seconds', - 'minutes' => 'Minutes', - 'under_maintenance' => 'Under Maintenance', - 'days' => [ - 'sun' => 'Sunday', - 'mon' => 'Monday', - 'tues' => 'Tuesday', - 'wed' => 'Wednesday', - 'thurs' => 'Thursday', - 'fri' => 'Friday', - 'sat' => 'Saturday', - ], - 'last_used' => 'Last Used', - 'enable' => 'Enable', - 'disable' => 'Disable', - 'save' => 'Save', - 'copyright' => '® 2024 - :year Pelican', -]; diff --git a/lang/zh/validation.php b/lang/zh/validation.php deleted file mode 100644 index 9cccf35080..0000000000 --- a/lang/zh/validation.php +++ /dev/null @@ -1,106 +0,0 @@ - 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'present' => 'The :attribute field must be present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - - // Internal validation logic for Panel - 'internal' => [ - 'variable_value' => ':env variable', - 'invalid_password' => 'The password provided was invalid for this account.', - ], -]; diff --git a/lang/zh_CN/activity.php b/lang/zh_CN/activity.php new file mode 100644 index 0000000000..30210cd66d --- /dev/null +++ b/lang/zh_CN/activity.php @@ -0,0 +1,125 @@ + [ + 'fail' => '登录失败', + 'success' => '已登入', + 'password-reset' => '重设密码', + 'checkpoint' => '请求动态口令认证', + 'recovery-token' => '使用了动态口令恢复代码', + 'token' => '正确输入了动态口令', + 'ip-blocked' => '阻止不在IP白名单外对:identifier的请求', + 'sftp' => [ + 'fail' => 'SFTP 登录失败', + ], + ], + 'user' => [ + 'account' => [ + 'username-changed' => '已将用户名从:old更改为:new', + 'email-changed' => '已将电子邮箱从:old更改为:new', + 'password-changed' => '已更改密码', + ], + 'api-key' => [ + 'create' => '创建新的 API 密钥 :identifier', + 'delete' => '已删除 API 密钥 :identifier', + ], + 'ssh-key' => [ + 'create' => '将 SSH 私钥 :fingerprint 添加到帐户', + 'delete' => '从帐户中删除了 SSH 私钥 :fingerprint', + ], + 'two-factor' => [ + 'create' => '启用动态口令认证', + 'delete' => '禁用动态口令认证', + ], + ], + 'server' => [ + 'console' => [ + 'command' => '在服务器上执行 ":command"', + ], + 'power' => [ + 'start' => '启动了服务器', + 'stop' => '停止了服务器', + 'restart' => '重启了服务器', + 'kill' => '强制停止了服务器', + ], + 'backup' => [ + 'download' => '下载了 :name 备份', + 'delete' => '删除了 :name 备份', + 'restore' => '恢复了 :name 备份 (已删除文件: :truncate)', + 'restore-complete' => '已成功恢复 :name 备份', + 'restore-failed' => ':name 备份恢复失败', + 'start' => ':name 开始了新的一轮备份', + 'complete' => '已将 :name 备份标记为完成', + 'fail' => '已将 :name 备份标记为失败', + 'lock' => '锁定了 :name 备份', + 'unlock' => '解锁了 :name 备份', + 'rename' => '重命名备份从 ":old_name" 到 ":new_name"', + ], + 'database' => [ + 'create' => '创建新数据库 :name', + 'rotate-password' => '为数据库 :name 轮换密码', + 'delete' => '已删除数据库 :name', + ], + 'file' => [ + 'compress' => '已删除 :directory:files|已删除 A:count 文件在 :directory', + 'read' => '查看了 :file 的内容', + 'copy' => '创建了 :file 的副本', + 'create-directory' => '已创建目录 :directory:name', + 'decompress' => '解压了 :directory 路径下的 :files', + 'delete' => '压缩的 :directory:files|压缩的 :count 文件在 :directory', + 'download' => '下载 :file', + 'pull' => '从 :url 下载远程文件到 :directory 路径下', + 'rename' => '移动/重命名 :从:to|Moved/ 重命名 :count 文件在 :directory', + 'write' => '写了一些新内容到 :file 中', + 'upload' => '上传了一些文件', + 'uploaded' => '已上传 :directory:file', + ], + 'sftp' => [ + 'denied' => '由于权限原因阻止了 SFTP 访问', + 'create' => '已删除 :files|已删除 :count 文件', + 'write' => '修改了 :files|修改了 :count 文件的内容', + 'delete' => '已创建 :files|已创建 :count 新文件', + 'create-directory' => '已创建 :files 目录|已创建 :count 目录', + 'rename' => '重命名 :从:to|重命名或移动 :count 文件', + ], + 'allocation' => [ + 'create' => '添加 :allocation 到服务器', + 'notes' => '将 :allocation 的备注从 ":old" 更新为 ":new"', + 'primary' => '将 :allocation 设置为服务器首选', + 'delete' => '删除了 :allocation 分配', + ], + 'schedule' => [ + 'create' => '创建了 :name 计划', + 'update' => '更新了 :name 计划', + 'execute' => '手动执行了 :name 计划', + 'delete' => '删除了 :name 计划', + ], + 'task' => [ + 'create' => '为 :name 计划创建了一个新的 ":action" 任务', + 'update' => '更新了 :name 计划的 ":action" 任务', + 'delete' => '删除了:name计划的“:action”任务', + ], + 'settings' => [ + 'rename' => '将服务器从 :old 重命名为 :new', + 'description' => '将服务器描述从 :old 更改为 :new', + 'reinstall' => '重装服务器', + ], + 'startup' => [ + 'edit' => '将 :variable 变量从 ":old" 更改为 ":new"', + 'image' => '将服务器的 Docker 映像从 :old 更新为 :new', + 'command' => '将服务器的 启动命令从 :old 更新为 :new', + ], + 'subuser' => [ + 'create' => '将 :email 添加为子用户', + 'update' => '更新了 :email 的子用户权限', + 'delete' => '将 :email 从子用户中删除', + ], + 'crashed' => '服务器崩溃', + ], +]; diff --git a/lang/zh_CN/admin/apikey.php b/lang/zh_CN/admin/apikey.php new file mode 100644 index 0000000000..98fdf29b87 --- /dev/null +++ b/lang/zh_CN/admin/apikey.php @@ -0,0 +1,27 @@ + '应用程序 API 密钥', + 'empty' => '无 API 密钥', + 'whitelist' => '白名单IPv4地址', + 'whitelist_help' => 'API 密钥只能从指定的IPv4地址进行操作。在新行上输入每个地址。', + 'whitelist_placeholder' => '例如:127.0.0.1或192.168.1.1', + 'description' => '描述', + 'description_help' => '简短描述此密钥的目的。', + 'nav_title' => 'API 密钥', + 'model_label' => '应用程序 API 密钥', + 'model_label_plural' => '应用程序 API 密钥', + 'table' => [ + 'key' => '密钥', + 'description' => '描述', + 'last_used' => '上次使用', + 'created' => '已创建', + 'created_by' => '创建者', + 'never_used' => '从未使用', + ], + 'permissions' => [ + 'none' => '无', + 'read' => '只读', + 'read_write' => '读写', + ], +]; diff --git a/lang/zh_CN/admin/dashboard.php b/lang/zh_CN/admin/dashboard.php new file mode 100644 index 0000000000..7f137d67a8 --- /dev/null +++ b/lang/zh_CN/admin/dashboard.php @@ -0,0 +1,45 @@ + '欢迎来到Pelican!', + 'version' => '版本: :version', + 'advanced' => '高级', + 'server' => '服务器', + 'user' => '用户', + 'sections' => [ + 'intro-developers' => [ + 'heading' => '面向开发者的信息', + 'content' => '感谢您尝试开发版本!', + 'extra_note' => '如果您遇到任何问题,请在GitHub上报告它们。', + 'button_issues' => '创建 Issue', + 'button_features' => '讨论功能', + ], + 'intro-update-available' => [ + 'heading' => '有可用更新', + 'content' => ':latest版本现在可用!阅读我们的文档以更新您的面板。', + 'button_changelog' => '新功能', + ], + 'intro-no-update' => [ + 'heading' => '您的面板是最新的', + 'content' => '您正运行的 Pelican 版本为 :version。您的面板目前是最新的!', + ], + 'intro-first-node' => [ + 'heading' => '侦测不到任何节点', + 'content' => '看起来您还没有设置任何节点,但不用担心,因为您可以点击操作按钮来创建第一个节点!', + 'extra_note' => '如果您遇到任何问题,请在GitHub上报告它们。', + 'button_label' => '在Pelican建立第一个节点', + ], + 'intro-support' => [ + 'heading' => '支持Pelican', + 'content' => '感谢您使用Pelican!这得益于您的支持、我们贡献者的努力以及所有支持者的帮助。', + 'extra_note' => '我们感谢任何人的任何支持。', + 'button_translate' => '协助翻译', + 'button_donate' => '支持此项目', + ], + 'intro-help' => [ + 'heading' => '需要帮助?', + 'content' => '请先查阅文档!如果您仍然需要帮助,请加入我们的 Discord 服务器!', + 'button_docs' => '阅读文档', + ], + ], +]; diff --git a/lang/zh_CN/admin/databasehost.php b/lang/zh_CN/admin/databasehost.php new file mode 100644 index 0000000000..06d1e52aaf --- /dev/null +++ b/lang/zh_CN/admin/databasehost.php @@ -0,0 +1,74 @@ + '数据库主机', + 'model_label' => '数据库主机', + 'model_label_plural' => '数据库主机', + 'table' => [ + 'database' => '数据库', + 'name' => '名称', + 'host' => '主机', + 'port' => '端口', + 'name_helper' => '留空将自动生成随机名称', + 'username' => '用户名', + 'password' => '密码', + 'remote' => '连接来自', + 'remote_helper' => '允许连接的地方。留空以允许任何地方的连接。', + 'max_connections' => '最大连接数', + 'created_at' => '创建于', + 'connection_string' => 'JDBC 连接字符串', + ], + 'error' => '连接到 :node 时出错', + 'host' => '主机', + 'host_help' => '尝试从本面板连接到此 MySQL 主机以创建新数据库时应使用的 IP 地址或域名。', + 'port' => '端口', + 'port_help' => 'MySQL 正在为此主机运行的端口。', + 'max_database' => '最大数据库', + 'max_databases_help' => '可以在此主机上创建的数据库的最大数量。 如果达到限制,无法在此主机上创建新的数据库。空白是无限的。', + 'display_name' => '显示名称', + 'display_name_help' => '应该显示给端用户的IP地址或域名。', + 'username' => '用户名', + 'username_help' => '拥有足够权限在系统上创建新用户和数据库的账户用户名。', + 'password' => '密码', + 'password_help' => '数据库用户的密码。', + 'linked_nodes' => '已连接的节点', + 'linked_nodes_help' => '此设置仅在将数据库添加到所选节点服务器时默认此数据库主机。', + 'connection_error' => '连接到主机出错', + 'no_database_hosts' => '没有数据库主机', + 'no_nodes' => '无节点', + 'delete_help' => '数据库主机有数据库', + 'unlimited' => '无限制', + 'anywhere' => '任何地方', + + 'rotate' => '旋转', + 'rotate_password' => '更改您的密码', + 'rotated' => '密码已旋转', + 'rotate_error' => '密码旋转失败', + 'databases' => '数据库', + + 'setup' => [ + 'preparations' => '准备工作', + 'database_setup' => '数据库设定', + 'panel_setup' => '面板设定', + + 'note' => '目前,数据库主机只支持 MySQL/MariaDB 数据库!', + 'different_server' => '同一服务器上的面板和数据库 难道不是 吗?', + + 'database_user' => '数据库用户', + 'cli_login' => '使用 mysql -u root -p 访问mysql cli。', + 'command_create_user' => '创建用户的命令', + 'command_assign_permissions' => '分配权限的命令', + 'cli_exit' => '若要退出mysql cli 请运行 exit。', + 'external_access' => '外部访问', + 'allow_external_access' => ' + 您需要允许外部访问此 MySQL 实例,以便允许服务器连接到它。

+
+

做到这一点, 打开 my。 nf, 因您的操作系统和如何安装 MySQL 的不同位置而异。 您可以输入 /etc -iname my.cnf 来定位它。

+
+

Open my nf, 将以下文本添加到文件底部并保存:
+ [mysqld]
bind-address=0.0.0.0

+
+

重新启动MySQL/ MariaDB 以应用这些更改。 这将覆盖默认的 MySQL 配置,默认只接受本地主机的请求。 更新这将允许所有接口上的连接,从而允许外部连接。 请确保在防火墙中允许 MySQL 端口 (默认 3306)。

+ ', + ], +]; diff --git a/lang/zh_CN/admin/egg.php b/lang/zh_CN/admin/egg.php new file mode 100644 index 0000000000..63482e371f --- /dev/null +++ b/lang/zh_CN/admin/egg.php @@ -0,0 +1,110 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => '配置', + 'process_management' => '进程管理', + 'egg_variables' => 'Egg 变量', + 'install_script' => '安装脚本', + ], + 'import' => [ + 'file' => '文件', + 'url' => 'URL', + 'image_url' => '图片地址', + 'image_error' => '无法获取图像', + 'image_too_large' => '图片过大,限制为 1024KB', + 'egg_help' => '这应该是原始.json 文件(egg-minecraft.json )', + 'url_help' => 'URL必须直接指向原始.json 文件', + 'add_url' => '新 URL', + 'import_failed' => '导入失败', + 'import_success' => '导入成功', + 'github' => '从Github添加', + 'refresh' => '刷新', + 'import_image' => '导入图像', + 'no_local_ip' => '不允许本地IP地址', + 'unsupported_format' => '不支持的格式。支持的格式: :formats', + 'invalid_url' => '所提供的 URL 无效。', + 'image_deleted' => '图像已删除', + 'no_image' => '未提供图像', + 'image_updated' => '图片已更新', + ], + 'export' => [ + 'modal' => '您想如何导出 :egg ?', + 'as' => '作为 .:format', + ], + 'in_use' => '使用中', + 'servers' => '服务器', + 'name' => '名称', + 'egg_uuid' => 'Egg UUID', + 'egg_id' => 'Egg ID', + 'name_help' => '一个简单的、易读的,用作此预设的标识符。', + 'author' => '作者', + 'uuid_help' => '这是这个预设的全局唯一标识符,守护进程将其用作预设分辨依据。', + 'author_help' => '这个版本的Egg的作者', + 'author_help_edit' => '该预设作者默认不可修改,仅在新建预设时才可填写。', + 'description' => '描述', + 'description_help' => '将根据需要在整个面板中显示的此预设的描述。', + 'add_startup' => '启动命令', + 'startup_command' => '命令', + 'startup_commands' => '启动命令', + 'startup_name' => '显示名称', + 'startup_help' => '使用这个 Egg 的服务器可用的启动命令。默认是第一个。', + 'file_denylist' => '文件 Denylist', + 'file_denylist_help' => '不允许用户编辑的文件列表。', + 'features' => '特征', + 'force_ip' => '强制外部IP', + 'force_ip_help' => '强制所有传出的网络流量将其源 IP地址转换(NAT)到服务器首选IP 的 IP地址。 +当节点具有多个公共IP地址时,某些游戏需要它才能正常运行。 +启用此选项将禁用任何使用此预设的服务器内网,这将导致它们无法从内部访问同一节点上的其他服务器。', + 'tags' => '标签', + 'update_url' => '更新网址', + 'update_url_help' => 'URL必须直接指向原始.json 文件', + 'add_image' => '添加 Docker 镜像', + 'docker_images' => 'Docker映像', + 'docker_name' => '镜像名称', + 'docker_uri' => '图片 URI', + 'docker_help' => '使用这个 Egg 的服务器可用的 Docker 镜像。默认是第一个。', + + 'stop_command' => '关闭命令', + 'stop_command_help' => '应发送到服务器进程的命令来阻止它们。如果你需要发送一个SIGINT,你应该在这里输入^C。', + 'copy_from' => '复制设置从', + 'copy_from_help' => '如果您想要从另一个彩蛋中默认设置,请从上面的菜单中选择它。', + 'none' => '无', + 'start_config' => '开始配置', + 'start_config_help' => '当启动服务器以确定完成时,守护进程应该寻找的值列表。', + 'config_files' => '配置文件', + 'config_files_help' => '这应该是要修改的配置文件的 JSON 表示以及应该修改哪些部件。', + 'log_config' => '日志配置', + 'log_config_help' => '这应该是一个 JSON 表示日志文件存放的地方,守护进程是否应该创建自定义日志。', + + 'environment_variable' => '环境变量', + 'default_value' => '默认值', + 'user_permissions' => '用户权限', + 'viewable' => '可查看', + 'editable' => '编辑', + 'rules' => '规则说明', + 'add_new_variable' => '添加新的变量', + + 'error_unique' => '具有此名称的变量已存在。', + 'error_required' => '环境变量字段是必需的。', + 'error_reserved' => '此环境变量是保留的,无法使用。', + + 'script_from' => '脚本来自', + 'script_container' => '脚本容器', + 'script_entry' => '脚本条目', + 'script_install' => '安装脚本', + 'no_eggs' => '没有 Eggs', + 'no_servers' => '没有任何服务器', + 'no_servers_help' => '没有指定服务器到这个Egg', + + 'update' => '更新 | 更新已选择', + 'updated' => 'Egg 已更新 |:count/:total Eggs 已更新', + 'updated_failed' => ':count 失败', + 'updated_skipped' => '已跳过 :count 个', + 'update_question' => '您确定要更新这个蛋吗?| 您确定要更新选定的蛋?', + 'update_description' => '如果您对egg做了任何更改,它们将被覆盖!|如果您对蛋做了任何更改,它们将被覆盖!', + 'no_updates' => '所选egg无可用更新', +]; diff --git a/lang/zh_CN/admin/health.php b/lang/zh_CN/admin/health.php new file mode 100644 index 0000000000..9780dfe875 --- /dev/null +++ b/lang/zh_CN/admin/health.php @@ -0,0 +1,60 @@ + '健康', + 'results_refreshed' => '健康检查结果已更新', + 'checked' => '检查来自 :time 的结果', + 'refresh' => '刷新', + 'results' => [ + 'cache' => [ + 'label' => '缓存', + 'ok' => 'OK', + 'failed_retrieve' => '无法设置或检索应用程序缓存值。', + 'failed' => '应用程序缓存发生异常: :错误', + ], + 'database' => [ + 'label' => '数据库', + 'ok' => 'OK', + 'failed' => '无法连接到数据库: :错误', + ], + 'debugmode' => [ + 'label' => 'Debug模式', + 'ok' => '调试模式已禁用', + 'failed' => '调试模式预计是 :expected, 但实际是 :actual', + ], + 'environment' => [ + 'label' => '环境', + 'ok' => '好的,设置为 :actual', + 'failed' => '环境设置为 :actual , 预期的 :expected', + ], + 'nodeversions' => [ + 'label' => '节点版本', + 'ok' => '节点是最新的', + 'failed' => ':过时/:所有节点已经过时。', + 'no_nodes_created' => '侦测不到任何节点', + 'no_nodes' => '无节点', + 'all_up_to_date' => '所有最新的', + 'outdated' => ':过时/:所有已经过时', + ], + 'panelversion' => [ + 'label' => '面板版本', + 'ok' => '您的面板是最新的', + 'failed' => '安装的版本是 :currentversion 但最新版本是 :latestversion', + 'up_to_date' => '最新', + 'outdated' => '已过时', + ], + 'schedule' => [ + 'label' => '日程', + 'ok' => 'OK', + 'failed_last_ran' => '最后一次运行的时间安排超过:time 前', + 'failed_not_ran' => '计划尚未运行。', + ], + 'useddiskspace' => [ + 'label' => '磁盘空间', + ], + ], + 'checks' => [ + 'successful' => '成功', + 'failed' => '失败', + ], +]; diff --git a/lang/zh_CN/admin/log.php b/lang/zh_CN/admin/log.php new file mode 100644 index 0000000000..6250db595e --- /dev/null +++ b/lang/zh_CN/admin/log.php @@ -0,0 +1,26 @@ + '是的!没有错误!', + 'total_logs' => '总日志', + 'error' => '错误', + 'warning' => '警告', + 'notice' => '注意', + 'info' => '信息', + 'debug' => '调试', + 'navigation' => [ + 'panel_logs' => '面板日志', + ], + 'actions' => [ + 'upload_logs' => '上传日志?', + 'upload_logs_description' => '这将上传 :file 到 :url 你确定要这样做吗?', + 'view_logs' => '查看日志', + 'log_not_found' => '找不到日志!', + 'log_not_found_description' => '找不到 :filename 日志', + 'failed_to_upload' => '上传失败。', + 'failed_to_upload_description' => 'HTTP 状态: :status', + 'log_upload' => '已上传日志!', + 'log_upload_action' => '查看记录', + 'upload_tooltip' => '上传到 :url', + ], +]; diff --git a/lang/zh_CN/admin/mount.php b/lang/zh_CN/admin/mount.php new file mode 100644 index 0000000000..8a838d475c --- /dev/null +++ b/lang/zh_CN/admin/mount.php @@ -0,0 +1,30 @@ + '挂载', + 'model_label' => '挂载', + 'model_label_plural' => '挂载', + 'name' => '名称', + 'name_help' => '用于将这个挂载与另一个挂载分开的唯一名称。', + 'source' => '来源', + 'source_help' => '要挂载到容器的主机系统上的文件路径。', + 'target' => '目标', + 'target_help' => '挂载可在容器内访问。', + 'read_only' => '只读?', + 'read_only_help' => '挂载是否只读在容器内?', + 'description' => '描述', + 'description_help' => '此挂载的较长描述', + 'no_mounts' => '没有挂载', + 'eggs' => 'Eggs', + 'nodes' => '节点', + 'toggles' => [ + 'writable' => '可写入', + 'read_only' => '只读', + ], + 'table' => [ + 'name' => '名称', + 'all_eggs' => '所有 Eggs', + 'all_nodes' => '所有节点', + 'read_only' => '只读', + ], +]; diff --git a/lang/zh_CN/admin/node.php b/lang/zh_CN/admin/node.php new file mode 100644 index 0000000000..d980658e61 --- /dev/null +++ b/lang/zh_CN/admin/node.php @@ -0,0 +1,149 @@ + '节点', + 'model_label' => '节点', + 'model_label_plural' => '节点', + 'create' => '创建节点', + 'tabs' => [ + 'overview' => '概览', + 'basic_settings' => '基本设置', + 'advanced_settings' => '高级设置', + 'config_file' => '配置文件', + 'diagnostics' => '诊断', + ], + 'table' => [ + 'health' => '健康', + 'name' => '名称', + 'address' => '地址', + 'public' => '公开', + 'servers' => '服务器', + 'alias' => '别名', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => '所有者', + 'allocation_notes' => '备注', + 'no_notes' => '无备注', + ], + 'node_info' => '节点信息', + 'wings_version' => 'Wings 版本', + 'cpu_threads' => 'CPU 线程', + 'architecture' => '架构', + 'kernel' => '内核', + 'unknown' => '未知', + 'latest' => '最新', + 'node_uuid' => '节点UUID', + 'node_id' => '节点ID', + + 'ip_address' => 'IP 地址', + 'ip_help' => '请直接使用您的外网IP,除非您的服务器处于VPC网络中', + 'alias_help' => '可选的显示名称帮助您记住这些是什么。', + 'refresh' => '刷新', + 'domain' => '域名', + 'ssl_ip' => '您不能通过 SSL 连接到IP地址', + 'error' => '这是指向节点IP地址的域名。 如果你已经设置了这个字段,你可以通过检查下一个字段来验证它!', + 'fqdn_help' => '您的面板目前通过SSL证书安全,这意味着您的节点也需要一个。 您必须使用域名,因为您无法获取 IP 地址的 SSL 证书。', + 'dns' => 'DNS记录检查', + 'dns_help' => '这让您知道DNS记录指向正确的 IP 地址。', + 'valid' => '有效', + 'invalid' => '无效', + 'port' => '端口', + 'ports' => '端口', + 'port_help' => '如果您正在运行 Cloudflare背后的守护程序,您应该设置守护端口为8443,以便允许通过 SSL 进行websocket 代理操作。', + 'connect_port' => '连接端口', + 'connect_port_help' => '连接到翼飞机将使用此端口。如果您使用反向代理,可能不同于监听端口。 当使用 Cloudflare 代理时,您应该使用 8443。', + 'listen_port' => '监听端口', + 'listen_port_help' => 'Wings 将监听此端口。', + 'display_name' => '显示名称', + 'ssl' => '通过 SSL 通信', + 'panel_on_ssl' => '您的面板正在使用安全的 SSL 连接,
因此您的守护进程也必须如此。', + 'ssl_help' => 'IP地址不能使用 SSL。', + + 'tags' => '标签', + 'upload_limit' => '上传限制', + 'upload_limit_help' => '输入可以通过网络文件管理器上传的文件的最大大小。', + 'sftp_port' => 'SFTP 端口', + 'sftp_alias' => 'SFTP Alias', + 'sftp_alias_help' => '显示 SFTP 地址的别名。留空则使用节点FQDN。', + 'use_for_deploy' => '用于部署?', + 'maintenance_mode' => '维护模式', + 'maintenance_mode_help' => '如果该节点被标记为“正在维护”,用户将无法访问该节点上的服务器', + + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU 可用线程上限', + 'memory' => '内存', + 'memory_limit' => '内存分配上限', + 'disk' => '存储空间', + 'disk_limit' => '磁盘限制', + 'unlimited' => '无限制', + 'limited' => '上限', + 'overallocate' => '过度分配', + 'enabled' => '已启用', + 'disabled' => '已禁用', + 'yes' => '是', + 'no' => '否', + + 'instructions' => '说明', + 'instructions_help' => '将此文件保存到您的守护进程根目录,命名为 config.yml', + + 'auto_deploy' => '自动部署命令', + 'auto_question' => '在独立或Docker安装之间进行选择。', + 'auto_label' => '类型', + 'standalone' => '单独', + 'docker' => 'Docker', + 'auto_command' => '要自动配置您的节点,请运行以下命令:', + 'reset_token' => '重置授权令牌', + 'token_reset' => '守护进程令已被重置。', + 'reset_help' => '重置守护令将使来自旧令牌的任何请求无效。 此令牌用于守护进程中的所有敏感操作,包括服务器创建和删除。我们建议为了安全定期更改此令牌。', + + 'no_nodes' => '无节点', + 'none' => '无', + 'cpu_chart' => 'CPU - :cpu% of :max%', + 'memory_chart' => '内存 - :used of :total', + 'disk_chart' => '存储 - :used of :total', + 'used' => '已用', + 'unused' => '未使用', + + 'next_step' => '下一步', + 'node_has_servers' => '节点有服务器', + 'create_allocation' => '创建分配', + 'primary_allocation' => '主要分配', + 'databases' => '数据库', + 'backups' => '备份', + + 'error_connecting' => '连接到 :node 时出错', + 'error_connecting_description' => '配置无法自动更新到Wings,您需要手动更新配置文件。', + 'allocation' => '分配', + + 'diagnostics' => [ + 'header' => '节点检测', + 'include_endpoints' => '包括端点', + 'include_endpoints_hint' => '包括端点将在日志中显示面板网址,不会掩盖它们。', + 'include_logs' => '包括日志', + 'include_logs_hint' => '包括日志将显示最近的日志,并有助于追踪可能的问题。', + 'run_diagnostics' => '运行诊断程序', + 'upload_to_pelican' => '上传日志', + 'logs_pulled' => '日志已拉取!', + 'logs_uploaded' => '已上传日志', + 'upload_failed' => '日志上传失败', + 'view_logs' => '查看日志', + 'pull' => '请求', + 'upload' => '上传', + 'clear' => '清空', + '404' => '找不到所要求的诊断报告。请确认翼已经更新,然后重试。', + ], + + 'cloudflare_issue' => [ + 'title' => 'Cloudflare问题', + 'body' => 'Cloudflare无法访问您的节点', + ], + + 'bulk_update_ip' => '更新 IP', + 'bulk_update_ip_description' => '用新的 IP 地址替换旧的 IP 地址,以供分配。当节点的 IP 地址发生变化时,这将是有用的', + 'update_ip' => '更新IP', + 'old_ip' => '旧 IP 地址', + 'new_ip' => '新 IP 地址', + 'no_allocations_to_update' => '找不到所选旧IP地址的分配', + 'ip_updated' => '成功更新 :count / :total 个分配', + 'ip_update_failed' => ':count 个分配更新失败', +]; diff --git a/lang/zh_CN/admin/role.php b/lang/zh_CN/admin/role.php new file mode 100644 index 0000000000..643db13872 --- /dev/null +++ b/lang/zh_CN/admin/role.php @@ -0,0 +1,17 @@ + '角色', + 'model_label' => '角色', + 'model_label_plural' => '角色', + 'no_roles' => '无角色', + 'name' => '角色名称', + 'permissions' => '权限', + 'in_use' => '使用中', + 'all' => '全部', + 'root_admin' => ':role 具有所有权限。', + 'root_admin_delete' => '无法删除Root管理员', + 'users' => '用户', + 'nodes' => '节点', + 'nodes_hint' => '留空则代表允许访问所有节点。', +]; diff --git a/lang/zh_CN/admin/server.php b/lang/zh_CN/admin/server.php new file mode 100644 index 0000000000..5fa4a239df --- /dev/null +++ b/lang/zh_CN/admin/server.php @@ -0,0 +1,150 @@ + '服务器', + 'model_label' => '服务器', + 'model_label_plural' => '服务器', + 'no_servers' => '没有任何服务器', + 'create' => '创建服务器', + 'next_step' => '下一步', + 'ip_address' => 'IP 地址', + 'ip_address_helper' => '请直接使用您的外网IP,除非您的服务器处于VPC网络中', + 'port' => '端口', + 'ports' => '端口', + 'alias' => '别名', + 'alias_helper' => '可选的显示名称帮助您记住这些是什么。', + 'locked' => '锁定?', + 'locked_helper' => '用户将无法删除锁定的分配', + 'lock' => '锁定', + 'unlock' => '解锁', + 'name' => '名称', + 'external_id' => '外部 ID', + 'owner' => '所有者', + 'description' => '描述', + 'install_script' => '运行安装脚本?', + 'start_after' => '安装后启动吗?', + 'yes' => '是', + 'no' => '否', + 'skip' => '略过', + 'primary' => '首选', + 'already_primary' => '已经是主要的', + 'make_primary' => '设为首选', + 'startup_cmd' => '启动命令', + 'startup_name' => '启动名称', + 'default_startup' => '默认启动命令', + 'startup_placeholder' => '输入自定义启动命令', + 'variables' => '变量', + 'resource_limits' => '资源上限', + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU 上限', + 'cpu_helper' => '每100%即一个CPU线程', + 'unlimited' => '无限制', + 'limited' => '上限', + 'enabled' => '已启用', + 'disabled' => '已禁用', + 'memory' => '内存', + 'memory_limit' => '内存分配上限', + 'memory_helper' => '当创建容器以确保在使用最大内存时不会饿死时,翼形将会将间接费用添加到这个值。', + 'disk' => '磁盘空间', + 'disk_limit' => '磁盘空间上限', + 'advanced_limits' => '高级限制', + 'cpu_pin' => 'CPU 固定模式', + 'threads' => '固定线程', + 'pin_help' => '添加固定线程,例如 0 或 2-4', + 'swap' => '交换内存', + 'swap_limit' => '交换内存限制', + 'oom' => 'OOM Killer', + 'feature_limits' => '功能限制', + 'docker_settings' => 'Docker设置', + 'docker_image' => 'Docker 镜像', + 'image_name' => '镜像名称', + 'primary_allocation' => '主要分配', + 'image' => '镜像', + 'image_placeholder' => '输入一个自定义Docker镜像', + 'container_labels' => '容器标签', + 'title' => '标题', + 'actions' => '操作', + 'console' => '控制台', + 'suspend' => '冻结', + 'unsuspend' => '解除冻结', + 'reinstall' => '重新安装', + 'reinstall_help' => '这将重新安装指定的 egg 安装脚本的服务器。', + 'reinstall_modal_heading' => '您确定要重新安装此服务器吗?', + 'reinstall_modal_description' => '!! 这可能导致无法恢复的数据丢失!', + 'server_status' => '服务器状态', + 'view_install_log' => '查看安装日志', + 'uuid' => 'UUID', + 'node' => '节点', + 'short_uuid' => '短UUID', + 'toggle_install' => '切换安装状态', + 'toggle_install_help' => '如果您需要更改安装状态从卸载到安装状态,或者反之亦然,您可以使用此按钮。', + 'toggle_install_failed_header' => '服务器处于失败状态', + 'toggle_install_failed_desc' => '你想要重新安装服务器来修复这个问题吗?', + 'transfer' => '转移', + 'transfer_help' => '将此服务器转移到与此控制面板中的另一个节点。
警告! 此功能仍处于试验阶段。请先手动备份以避免数据丢失!', + 'condition' => '状况', + 'suspend_all' => '冻结所有服务器', + 'unsuspend_all' => '解除冻结所有服务器', + 'select_allocation' => '选择端口', + 'new_allocation' => '创建新端口', + 'additional_allocations' => '分配额外的端口', + 'select_additional' => '选择分配额外的端口', + 'no_variables' => '选中的蛋没有变量!', + 'select_egg' => '请先选择一个蛋来显示其变量!', + 'allocations' => '网络', + 'databases' => '数据库', + 'no_databases' => '此服务器没有任何数据库', + 'delete_db' => '是否确实要删除:name?', + 'delete_db_heading' => '删除数据库吗?', + 'backups' => '备份', + 'egg' => 'Egg', + 'mounts' => '挂载', + 'no_mounts' => '此节点没有挂载', + 'create_database' => '新建数据库', + 'no_db_hosts' => '没有数据库主机', + 'failed_to_create' => '创建数据库失败', + 'change_egg' => '修改Egg', + 'new_egg' => '新的Egg', + 'keep_old_variables' => '尽可能保留旧变量?', + 'create_allocation' => '创建端口', + 'add_allocation' => '新的端口', + 'view' => '查看', + 'no_log' => '没有可用的日志', + 'tabs' => [ + 'information' => '消息', + 'egg_configuration' => 'Egg信息', + 'environment_configuration' => '环境配置', + ], + 'notifications' => [ + 'server_suspension' => '服务器暂停', + 'server_suspended' => '服务器已被解除冻结', + 'server_already_suspended' => '服务器已暂停!', + 'server_suspend_help' => '这将暂停服务器,停止当前正在运行的进程 并立即阻止用户通过面板或API访问他们的文件或以其他方式管理服务器。', + 'server_unsuspend_help' => '这将解除服务器的冻结,并恢复正常用户访问。', + 'server_unsuspended' => '服务器已被解除冻结', + 'error_server_delete' => '服务器无法安全删除。', + 'error_server_delete_body' => '您可以强制删除它。', + 'create_failed' => '无法创建服务器', + 'invalid_port_range' => '无效的端口范围', + 'invalid_port_range_body' => '您的端口范围不是有效整数: :port', + 'too_many_ports' => '单次提交的端口过多!', + 'too_many_ports_body' => '当前限制为 :limit单次端口数量。', + 'invalid_port' => '端口不在有效范围', + 'invalid_port_body' => ':i 不在 :portFloor-:portCeil 之间的有效端口范围', + 'already_exists' => '端口已被占用', + 'already_exists_body' => ':i 已经被分配了', + 'error_connecting' => '连接到 :node 时出错', + 'error_connecting_description' => '配置无法自动同步到Wings,您需要手动重启服务器。', + 'install_toggled' => '安装状态已切换', + 'install_toggle_failed' => '无法切换安装状态', + 'reinstall_started' => '重新安装已开始', + 'reinstall_failed' => '无法重新安装', + 'log_failed' => '无法连接到 Wings 来检索服务器安装日志。', + 'transfer_started' => '传输已开始', + 'transfer_failed' => '传输失败', + 'already_transfering' => '服务器正在传输中。', + ], + 'notes' => '备注', + 'no_notes' => '无备注', + 'none' => '无', +]; diff --git a/lang/zh_CN/admin/setting.php b/lang/zh_CN/admin/setting.php new file mode 100644 index 0000000000..cf52f03383 --- /dev/null +++ b/lang/zh_CN/admin/setting.php @@ -0,0 +1,157 @@ + '设置', + 'save_success' => '设置已保存', + 'save_failed' => '无法保存设置', + 'navigation' => [ + 'general' => '常规', + 'captcha' => '人机验证', + 'mail' => '邮箱', + 'backup' => '备份', + 'oauth' => '第三方登录', + 'misc' => '其他​​设置', + ], + 'general' => [ + 'app_name' => '网站名称', + 'app_logo' => '网站Logo', + 'app_logo_help' => '网站Logo应该放在网站根目录下的Public中,留空即使默认。', + 'app_favicon' => '应用图标', + 'app_favicon_help' => '网站图标应该放在根目录中的Public文件夹中', + 'debug_mode' => 'Debug模式', + 'navigation' => '导航栏', + 'default_navigation' => '默认导航类型', + 'sidebar' => '侧边导航栏', + 'topbar' => '顶部导航栏', + 'mixed' => '混合', + 'unit_prefix' => '单位前缀', + 'decimal_prefix' => '小数前缀 (MB/GB)', + 'binary_prefix' => '二进制前缀 (MiB/Gib)', + '2fa_requirement' => '两步验证要求', + 'not_required' => '不要求', + 'admins_only' => '仅限管理员', + 'all_users' => '所有用户', + 'trusted_proxies' => '信任的代理', + 'trusted_proxies_help' => '新 IP 或 IP 范围', + 'clear' => '清空', + 'set_to_cf' => '设置为 Cloudflare的IP', + 'display_width' => '显示器宽度', + 'avatar_provider' => '第三方头像来源', + 'uploadable_avatars' => '是否允许用户上传头像?', + ], + 'captcha' => [ + 'enable' => '启用', + 'disable' => '禁用', + 'info_label' => '信息', + 'info' => '您可以在您的 Cloudflare用户中心生成密钥。但是您需要一个Cloudflare账户。', + 'site_key' => 'Site Key', + 'secret_key' => 'Secret Key', + 'verify' => '验证域名?', + ], + 'mail' => [ + 'mail_driver' => '邮件发送方式', + 'test_mail' => '发送测试邮件', + 'test_mail_sent' => '发送测试邮件', + 'test_mail_failed' => '测试邮件发送失败', + 'from_settings' => '来自设置', + 'from_settings_help' => '在邮件中设置地址和名称为“发件人”.', + 'from_address' => '发件人地址', + 'from_name' => '发件人名称', + 'smtp' => [ + 'smtp_title' => 'SMTP配置', + 'host' => '主机', + 'port' => '端口', + 'username' => '用户名', + 'password' => '密码', + 'scheme' => '方案', + ], + 'mailgun' => [ + 'mailgun_title' => '邮件枪配置', + 'domain' => '网域', + 'secret' => '密钥', + 'endpoint' => '端点', + ], + ], + 'backup' => [ + 'backup_driver' => '备份到', + 'throttle' => '阈值', + 'throttle_help' => '配置在一段时间内可以创建多少备份。设置为 0 以禁用此Throtle。', + 'limit' => '限制', + 'period' => '句号', + 'seconds' => '秒', + 's3' => [ + 's3_title' => 'S3对象存储 配置', + 'default_region' => '默认区域', + 'access_key' => 'Access Key ID', + 'secret_key' => 'Secret Access Key', + 'bucket' => '桶', + 'endpoint' => '端点', + 'use_path_style_endpoint' => '使用路径样式端点', + ], + ], + 'oauth' => [ + 'enable' => '启用', + 'enable_schema' => '启用 :schema', + 'disable' => '禁用', + 'client_id' => '客户端 ID', + 'client_secret' => '客户端密钥', + 'redirect' => '重定向 URL', + 'web_api_key' => 'Web API 密钥', + 'base_url' => '默认地址', + 'display_name' => '显示名称', + 'auth_url' => '授权回调 URL', + 'create_missing_users' => '自动创建缺失用户?', + 'link_missing_users' => '自动链接缺少用户?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => '自动分配创建', + 'helper' => '切换用户是否可以通过客户端区域创建配置。', + 'question' => '允许用户创建指定位置?', + 'create_new' => '若无可用分配则自动创建?', + 'create_new_help' => '启用后,将自动创建新的分配。禁用后,仅从现有的未分配端口中进行指派。这两个选项都会遵循下方的端口范围设置。', + 'start' => '开始端口', + 'end' => '结束端口', + ], + 'mail_notifications' => [ + 'title' => '邮件提醒', + 'helper' => '切换哪些邮件通知应发送给用户。', + 'server_installed' => '服务器已安装完成', + 'server_reinstalled' => '服务器已重新安装完成', + ], + 'connections' => [ + 'title' => '连接', + 'helper' => '请求时使用超时。', + 'request_timeout' => '请求超时', + 'connection_timeout' => '连接超时', + 'seconds' => '秒', + ], + 'activity_log' => [ + 'title' => '活动日志', + 'helper' => '配置如何打印旧的活动日志以及是否应该记录管理活动。', + 'prune_age' => '', + 'days' => '天', + 'log_admin' => '隐藏管理员活动?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => '定义可以执行的每分钟请求数的比率限制。', + 'client_rate' => '客户端API频率上限', + 'app_rate' => '应用程序API频率上限', + 'rpm' => '每分钟请求数', + ], + 'server' => [ + 'title' => '服务器', + 'helper' => '服务器设置', + 'edit_server_desc' => '允许用户编辑描述吗?', + 'console_font_upload' => '上传控制台字体', + 'console_font_hint' => '仅支持 *.ttf 字体。强烈推荐单字体!', + ], + 'webhook' => [ + 'title' => 'Webhook', + 'helper' => '配置打印旧的 web 钩子日志的频率。', + 'prune_age' => '清理时间', + 'days' => '天', + ], + ], +]; diff --git a/lang/zh_CN/admin/webhook.php b/lang/zh_CN/admin/webhook.php new file mode 100644 index 0000000000..c008ec4571 --- /dev/null +++ b/lang/zh_CN/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => 'Url链接', + 'description' => '描述', + 'no_webhooks' => '没有任何Webhook', + 'help' => '帮助', + 'help_text' => '您必须将变量名称包装在 {{ }} 之间,例如,如果您想从 api 获取名称,则可以使用 {{name}}', + 'test_now' => '立即测试', + 'test_now_help' => '这将触发一个 `created: Server` 事件', + 'table' => [ + 'description' => '描述', + 'endpoint' => 'Url链接', + ], + 'headers' => '请求头', + 'events' => '事件', + 'regular' => '常规', + 'reset_headers' => '重置标题', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => '资料', + 'message' => '信息', + 'username' => '用户名', + 'avatar_url' => '头像链接', + 'forum_thread' => '讨论区主题名称', + 'supress_embeds' => '禁止嵌入', + 'supress_embeds_text' => '在序列化此消息时不包含任何嵌入项', + 'supress_notifications' => '禁止通知', + 'supress_notifications_text' => '此消息不会触发推送和桌面通知', + ], + 'discord_embed' => [ + 'add_embed' => '添加嵌入', + 'flags' => '标志', + 'thumbnail' => '缩略图网址', + 'embeds' => 'Embeds', + 'thread_name' => '讨论区主题名称', + 'allowed_mentions' => '允许提及的内容', + 'roles' => '角色', + 'users' => '用户', + 'everyone' => '@everyone & @here', + 'author' => '作者', + 'author_url' => '作者 URL', + 'author_icon_url' => '作者图标URL', + 'body' => '身体', + 'title' => '标题', + 'color' => '嵌入颜色', + 'url' => 'URL', + 'images' => '图片', + 'image_url' => '图片地址', + 'image_thumbnail' => '缩略图网址', + 'footer' => '页脚', + 'has_timestamp' => '具有时间戳', + 'footer_icon_url' => '页脚图标URL', + 'add_field' => '添加字段', + 'fields' => '字段', + 'field_name' => '字段名', + 'field_value' => '取值', + 'inline_field' => '内嵌字段', + ], +]; diff --git a/lang/zh_CN/auth.php b/lang/zh_CN/auth.php new file mode 100644 index 0000000000..ef76325f94 --- /dev/null +++ b/lang/zh_CN/auth.php @@ -0,0 +1,24 @@ + '用户名或密码错误。', + 'failed-two-factor' => '两步验证码不正确', + 'two-factor-code' => '两步验证码', + 'two-factor-hint' => '如果您无法访问您的设备,您可以使用备份代码。', + 'password' => '密码错误', + 'throttle' => '登录尝试次数过多。请在 :seconds 秒后重试。', + '2fa_must_be_enabled' => '管理员要求您的帐户必须启用动态口令认证才能正常使用面板', + +]; diff --git a/lang/zh_CN/command/messages.php b/lang/zh_CN/command/messages.php new file mode 100644 index 0000000000..5c123fe892 --- /dev/null +++ b/lang/zh_CN/command/messages.php @@ -0,0 +1,54 @@ + [ + 'search_users' => '输入用户名、用户 ID 或电子邮箱地址', + 'select_search_user' => '要删除的用户ID (输入\'0\'重新搜索)', + 'deleted' => '已成功将该用户从面板中删除。', + 'confirm_delete' => '您确定要从面板中删除此用户吗?', + 'no_users_found' => '提供的搜索词未能找到相符的用户。', + 'multiple_found' => '提供的搜索词找到多个帐户,由于 --no-interaction 标签而无法删除用户。', + 'ask_admin' => '此用户是否为管理员?', + 'ask_email' => '电子邮箱地址', + 'ask_username' => '用户名', + 'ask_password' => '密码', + 'ask_password_tip' => '如果您想使用通过电子邮件发送给用户的随机密码创建一个帐户,请重新运行此命令 (CTRL+C) 并传递 `--no-password` 标签。', + 'ask_password_help' => '密码长度必须至少为 8 个字符,并且至少包含一个大写字母和数字。', + '2fa_help_text' => '', + '2fa_disabled' => '已为 :email 禁用动态口令认证。', + ], + 'schedule' => [ + 'output_line' => '为 `:schedule` (:hash) 中的第一个任务分配作业。', + ], + 'maintenance' => [ + 'deleting_service_backup' => '删除服务备份文件 :file。', + ], + 'server' => [ + 'rebuild_failed' => '在节点 ":node" 上对 ":name" (#:id) 的重建请求失败并出现错误::message', + 'reinstall' => [ + 'failed' => '在节点 ":node" 上重新安装 ":name" (#:id) 请求失败并出现错误: :message', + 'confirm' => '您即将针对一组服务器重新安装。你想继续吗?', + ], + 'power' => [ + 'confirm' => '您即将对 :count 服务器执行 :action。你想继续吗?', + 'action_failed' => '节点 ":node" 上 ":name" (#:id) 的电源操作请求失败并出现错误: :message', + ], + ], + 'environment' => [ + 'mail' => [ + 'ask_smtp_host' => 'SMTP 主机 (例如 smtp.gmail.com)', + 'ask_smtp_port' => 'SMTP 端口', + 'ask_smtp_username' => 'SMTP 用户名', + 'ask_smtp_password' => 'SMTP 密码', + 'ask_mailgun_domain' => 'Mailgun 域名', + 'ask_mailgun_endpoint' => 'Mailgun 节点', + 'ask_mailgun_secret' => 'Mailgun 密钥', + 'ask_mandrill_secret' => 'Mandrill 密钥', + 'ask_postmark_username' => 'Postmark API 密钥', + 'ask_driver' => '应该使用哪个驱动程序来发送电子邮件?', + 'ask_mail_from' => '发件人地址', + 'ask_mail_name' => '发件人', + 'ask_encryption' => '加密方式', + ], + ], +]; diff --git a/lang/zh_CN/commands.php b/lang/zh_CN/commands.php new file mode 100644 index 0000000000..a65c0e5c28 --- /dev/null +++ b/lang/zh_CN/commands.php @@ -0,0 +1,61 @@ + [ + 'comment' => [ + 'author' => '请提供预设导出中作者所使用的有效电子邮箱地址。', + 'url' => '应用程序的URL必须根据您是否使用SSL,以https://(如果使用SSL)或http://(如果不使用SSL)开头。如果不包含协议部分,您的电子邮件和其他内容将会链接到错误的地址。', + 'timezone' => '时区应该与 PHP 支持的时区之一相匹配。如果您不确定,请参考 +https://php.net/manual/zh/timezones.php。', + ], + 'redis' => [ + 'note' => '您为一个或多个选项选择了Redis驱动程序,请在下方提供有效的连接信息。在大多数情况下,除非您修改了设置,否则您可以使用提供的默认值。', + 'comment' => '默认情况下,Redis服务器实例没有密码,并且它在本地运行且外界无法访问。如果是这种情况,只需按回车键而不输入任何值。', + 'confirm' => '它似乎是一个 :field 已经定义为 Redis, 你想要更改它吗?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => '强烈建议不要使用“localhost”作为您的数据库主机,因为我们经常遇到socket连接问题。如果您想使用本地连接,您应该使用“127.0.0.1”。', + 'DB_USERNAME_note' => '使用MySQL的root账户进行连接是极其不推荐的做法,而且本应用程序也不允许这样做。您需要为此面板专门创建一个MySQL用户。', + 'DB_PASSWORD_note' => '似乎您已经设置了MySQL连接密码,您想更改它吗?', + 'DB_error_2' => '您的连接凭据尚未保存。在继续之前,您需要提供有效的连接信息。', + 'go_back' => '返回并重试', + ], + 'make_node' => [ + 'name' => '输入一个简短的标识符,用于将此节点与其他节点区分开来', + 'description' => '输入描述以识别该节点', + 'scheme' => '请为SSL连接输入https,或者为非SSL连接输入http', + 'fqdn' => '请输入用于连接守护程序的域名 (例如 node.example.com)。仅在您没有为此节点使用 SSL 连接的情况下才可以使用 IP 地址。', + 'public' => '是否公开此节点?请注意,如果将节点设置为私有,该节点将无法使用自动部署功能', + 'behind_proxy' => '您的 FQDN 是否在代理伺服器后运作?', + 'maintenance_mode' => '是否启用维护模式?', + 'memory' => '输入可用于新服务器的内存总量', + 'memory_overallocate' => '请输入要过度分配的内存量百分比,要禁用检查过度分配,请输入 -1 于此处,如果输入 0 这将在可能超出节点的最大内存总量时阻止创建新服务器', + 'disk' => '输入可用于新服务器的存储空间总量', + 'disk_overallocate' => '请输入要过度分配的存储空间百分比,要禁用检查过度分配,请输入 -1 于此处. 如果输入 0 这将在可能超出节点的最大存储空间总量时阻止创建新服务器', + 'cpu' => '输入可用于新服务器的内存总量', + 'cpu_overallocate' => '请输入要过度分配的存储空间百分比,要禁用检查过度分配,请输入 -1 于此处. 如果输入 0 这将在可能超出节点的最大存储空间总量时阻止创建新服务器', + 'upload_size' => '输入文件上传大小上限', + 'daemonListen' => '输入后端程序的监听端口', + 'daemonConnect' => '输入守护进程连接端口 (可以与监听端口相同)', + 'daemonSFTP' => '输入 SFTP 后端的监听端口', + 'daemonSFTPAlias' => '输入守护进程别名 (可以为空)', + 'daemonBase' => '输入根文件夹', + 'success' => '成功创建了一个名叫:name 的新节点并且具有一个 :id 的 id', + ], + 'node_config' => [ + 'error_not_exist' => '所选的节点不存在。', + 'error_invalid_format' => '无效的格式。有效的格式为 yaml 和 json', + ], + 'key_generate' => [ + 'error_already_exist' => '看来您已经配置了应用程序加密密钥。继续此过程将覆盖该密钥并损坏所有加密数据。除非您知道自己在做什么,否则请勿继续。', + 'understand' => '我了解执行此命令的后果并对加密数据的丢失承担全部责任。', + 'continue' => '您确定要继续吗?更改应用程序加密密钥将导致数据丢失。', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => '没有需要运行的服务器计划任务。', + 'error_message' => '处理以下计划任务时遇​​到错误: ', + ], + ], +]; diff --git a/lang/zh_CN/exceptions.php b/lang/zh_CN/exceptions.php new file mode 100644 index 0000000000..511bc14519 --- /dev/null +++ b/lang/zh_CN/exceptions.php @@ -0,0 +1,64 @@ + '尝试与守护程序通信时出现异常,导致 HTTP/:code 响应代码。已记录此异常。', + 'node' => [ + 'servers_attached' => '一个节点必须没有关联任何服务器时才能被删除。', + 'error_connecting' => '连接到 :node 时出错', + 'daemon_off_config_updated' => '守护程序配置已更新,但是在尝试自动更新守护程序上的配置文件时遇到错误。您需要手动更新配置文件 (config.yml) 以使守护程序应用这些更改。', + ], + 'allocations' => [ + 'server_using' => '此分配正在被一台服务器使用,只有此分配未被服务器使用时才能删除此分配。', + 'too_many_ports' => '不支持一次在单个范围内添加超过 1000 个端口。', + 'invalid_mapping' => '为 :port 提供的映射无效并且无法处理。', + 'cidr_out_of_range' => 'CIDR 表示法只允许 /25 于 /32 之间的掩码。', + 'port_out_of_range' => '分配中的端口必须大于 1024 且小于或等于 65535。', + ], + 'egg' => [ + 'delete_has_servers' => '无法从面板中删除关联了服务器的预设。', + 'invalid_copy_id' => '用于复制选择用于复制脚本的预设不存在,或正在复制脚本本身。', + 'has_children' => '此预设是一个或多个其他预设的父级。请在删除此预设之前删除这些预设。', + ], + 'variables' => [ + 'env_not_unique' => '环境变量 :name 对于此预设必须是独一无二的。', + 'reserved_name' => '环境变量 :name 是受保护的,不能给分配变量。', + 'bad_validation_rule' => '验证规则 ":rule" 不是此应用程序的有效规则。', + ], + 'importer' => [ + 'json_error' => '尝试分析 JSON 文件时出现错误: :error 。', + 'file_error' => '提供的 JSON 文件无效。', + 'invalid_json_provided' => '提供的 JSON 文件是不可识别的格式。', + ], + 'subusers' => [ + 'editing_self' => '不允许您修改自己的子用户帐户。', + 'user_is_owner' => '您不能将服务器所有者添加为此服务器的子用户。', + 'subuser_exists' => '具有该电子邮箱地址的用户已被指定为该服务器的子用户。', + ], + 'databases' => [ + 'delete_has_databases' => '无法删除关联了数据库的数据库主机服务器。', + ], + 'tasks' => [ + 'chain_interval_too_long' => '链式任务的最大间隔时间是 15 分钟。', + ], + 'locations' => [ + 'has_nodes' => '无法删除关联了节点的地域。', + ], + 'users' => [ + 'is_self' => '', + 'has_servers' => '无法删除账户下有服务器的用户,请将其全部删除,然后再继续此操作。', + 'node_revocation_failed' => '无法撤销 节点 #:node 上的密钥。:error', + ], + 'deployment' => [ + 'no_viable_nodes' => '找不到满足自动部署要求的节点。', + 'no_viable_allocations' => '未找到满足自动部署要求的分配。', + ], + 'api' => [ + 'resource_not_found' => '请求的资源在此服务器上不存在。', + ], + 'mount' => [ + 'servers_attached' => '一个节点必须没有关联任何服务器时才能被删除。', + ], + 'server' => [ + 'marked_as_failed' => '此服务器尚未完成安装过程,请稍后再试。', + ], +]; diff --git a/lang/zh_CN/notifications.php b/lang/zh_CN/notifications.php new file mode 100644 index 0000000000..2d66df6922 --- /dev/null +++ b/lang/zh_CN/notifications.php @@ -0,0 +1,18 @@ + '打开服务器', + 'installation_completed' => '服务器安装完成', + 'installation_failed' => '服务器安装失败', + 'reinstallation_completed' => '服务器重新安装完成', + 'reinstallation_failed' => '服务器重新安装失败', + 'failed' => '失败', + 'user_added' => [ + 'title' => '已添加到服务器', + 'body' => '您已被添加为 :server。', + ], + 'user_removed' => [ + 'title' => '已从服务器删除', + 'body' => '您已经被从 :server 移除为子用户。', + ], +]; diff --git a/lang/zh_CN/profile.php b/lang/zh_CN/profile.php new file mode 100644 index 0000000000..ad2acfd17f --- /dev/null +++ b/lang/zh_CN/profile.php @@ -0,0 +1,70 @@ + '资料', + 'tabs' => [ + 'account' => '账户', + 'oauth' => '第三方登录', + 'activity' => '活动', + 'api_keys' => 'API 密钥', + 'ssh_keys' => 'SSH密钥', + 'keys' => '密钥', + '2fa' => '动态口令认证', + 'customization' => '自定义设置', + ], + 'username' => '用户名', + 'admin' => '管理员', + 'exit_admin' => '退出管理', + 'server_list' => '服务器列表', + 'email' => '电子邮箱', + 'password' => '密码', + 'current_password' => '当前密码', + 'password_confirmation' => '密码确认', + 'timezone' => '时区', + 'language' => '语言', + 'language_help' => '您的语言 :state尚未翻译!', + 'link' => '链接 ', + 'unlink' => '取消链接 ', + 'unlinked' => ':name 已取消关联', + 'scan_qr' => '扫描二维码', + 'code' => '验证码', + 'setup_key' => '设置密钥', + 'invalid_code' => '无效的2FA验证码', + 'code_help' => '使用您的两步身份验证应用程序扫描上方的二维码,然后输入生成的代码。', + '2fa_enabled' => '双重校验现已被启用.', + 'backup_help' => '这些将不会再显示!', + 'backup_codes' => '备份码', + 'disable_2fa' => '关闭双重身份验证', + 'disable_2fa_help' => '输入您当前的 2FA 代码来禁用两步验证', + 'api_keys' => 'API 密钥', + 'create_api_key' => '创建 API 密钥', + 'api_key_created' => 'API 密钥已创建', + 'description' => '描述', + 'allowed_ips' => '允许的 IP 地址', + 'allowed_ips_help' => '按回车键添加新的 IP 地址或留空以允许任何IP地址', + 'ssh_keys' => 'SSH密钥', + 'create_ssh_key' => '创建 API 密钥', + 'ssh_key_created' => '密钥已创建', + 'name' => '名称', + 'public_key' => '公钥', + 'could_not_create_ssh_key' => '无法创建服务器', + 'dashboard' => '控制面板', + 'dashboard_layout' => '仪表板布局', + 'console' => '控制台', + 'grid' => '网格', + 'table' => '表格', + 'rows' => '行', + 'font_size' => '字体大小', + 'font' => '字体', + 'font_preview' => '预览字体', + 'seconds' => '秒', + 'graph_period' => '图形周期', + 'graph_period_helper' => '控制台图中显示的数据点数量,秒数。', + 'navigation' => '导航类型', + 'sidebar' => '侧边导航栏', + 'topbar' => '顶部导航栏', + 'mixed' => '混合', + 'no_oauth' => '没有关联的账户', + 'no_api_keys' => '无 API 密钥', + 'no_ssh_keys' => '无 SSH 密钥', +]; diff --git a/lang/zh_CN/search.php b/lang/zh_CN/search.php new file mode 100644 index 0000000000..34f0df12ca --- /dev/null +++ b/lang/zh_CN/search.php @@ -0,0 +1,9 @@ + '请输入至少三个字符以开始搜索。', + 'term' => [ + 'label' => '搜索关键字', + 'description' => '输入服务器名称、Uuid 或分配以开始搜索。', + ], +]; diff --git a/lang/zh_CN/server/activity.php b/lang/zh_CN/server/activity.php new file mode 100644 index 0000000000..d70b2f6a26 --- /dev/null +++ b/lang/zh_CN/server/activity.php @@ -0,0 +1,11 @@ + '活动', + 'event' => '事件', + 'user' => '用户', + 'deleted_user' => '已删除用户', + 'system' => '系统', + 'timestamp' => '时间戳', + 'metadata' => '元数据', +]; diff --git a/lang/zh_CN/server/backup.php b/lang/zh_CN/server/backup.php new file mode 100644 index 0000000000..8e3df63dd0 --- /dev/null +++ b/lang/zh_CN/server/backup.php @@ -0,0 +1,55 @@ + '备份', + 'empty' => '无备份', + 'size' => '大小', + 'created_at' => '创建于', + 'status' => '状态', + 'is_locked' => '锁定状态', + 'backup_status' => [ + 'in_progress' => '进行中', + 'successful' => '成功', + 'failed' => '失败', + ], + 'actions' => [ + 'create' => [ + 'title' => '创建备份', + 'limit' => '已达备份上限', + 'created' => '成功创建 :name', + 'notification_success' => '备份已成功创建', + 'notification_fail' => '备份创建失败', + 'name' => '名称', + 'ignored' => '忽略的文件和目录', + 'locked' => '锁定?', + 'lock_helper' => '防止此备份被删除,直到被明确解锁。', + ], + 'lock' => [ + 'lock' => '锁定', + 'unlock' => '解锁', + ], + 'download' => '下载', + 'rename' => [ + 'title' => '重命名', + 'new_name' => '备份名称', + 'notification_success' => '备份重命名成功', + ], + 'restore' => [ + 'title' => '还原', + 'helper' => '您的服务器将被停止。 您将无法控制电源状态,无法访问文件管理器,也无法创建额外的备份,直到此过程完成。', + 'delete_all' => '还原备份前删除所有文件吗?', + 'notification_started' => '还原备份', + 'notification_success' => '备份成功恢复', + 'notification_fail' => '恢复备份失败', + 'notification_fail_body_1' => '此服务器目前不处于允许恢复备份的状态。', + 'notification_fail_body_2' => '此备份当前无法恢复:未完成或失败。', + ], + 'delete' => [ + 'title' => '删除备份', + 'description' => '您想要删除 :backup 吗?', + 'notification_success' => '备份已删除', + 'notification_fail' => '无法删除备份', + 'notification_fail_body' => '连接到节点失败。请重试。', + ], + ], +]; diff --git a/lang/zh_CN/server/console.php b/lang/zh_CN/server/console.php new file mode 100644 index 0000000000..7fef00d35b --- /dev/null +++ b/lang/zh_CN/server/console.php @@ -0,0 +1,43 @@ + '控制台', + 'command' => '输入命令...', + 'command_blocked' => '服务器离线...', + 'command_blocked_title' => '当服务器处于离线状态时无法发送命令', + 'open_in_admin' => '在管理员中打开', + 'power_actions' => [ + 'start' => '启动', + 'stop' => '停止', + 'restart' => '重新启动', + 'kill' => '结束进程', + 'kill_tooltip' => '这可能导致数据损坏和/或数据丢失!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => '内存', + 'network' => '网络', + 'disk' => '磁盘', + 'name' => '名称', + 'status' => '状态', + 'address' => '地址', + 'unavailable' => '不可用', + ], + 'status' => [ + 'created' => '已创建', + 'starting' => '正在启动', + 'running' => '运行中', + 'restarting' => '正在重启', + 'exited' => '已退出', + 'paused' => '已暂停', + 'dead' => '死亡', + 'removing' => '正在删除', + 'stopping' => '正在停止', + 'offline' => '离线', + 'missing' => '丢失', + ], + 'websocket_error' => [ + 'title' => '无法连接到 websocket!', + 'body' => '查看您的浏览器控制台了解更多详情。', + ], +]; diff --git a/lang/zh_CN/server/dashboard.php b/lang/zh_CN/server/dashboard.php new file mode 100644 index 0000000000..b8d9001453 --- /dev/null +++ b/lang/zh_CN/server/dashboard.php @@ -0,0 +1,28 @@ + '服务器', + 'list' => '服务器列表', + 'tabs' => [ + 'my' => '我的服务器', + 'other' => '其他人的服务器', + 'all' => '所有服务器', + ], + 'empty_own' => '您没有任何服务器!', + 'empty_other' => '您没有访问任何服务器的权限', + + 'status' => '状态', + 'server' => '服务器', + 'resources' => '资源', + 'usage_limit' => '使用限制: :resource', + + 'cpu' => 'CPU', + 'memory' => '内存', + 'disk' => '存储空间', + 'network' => '网络', + 'none' => '无', + 'loading' => '载入中...', + + 'power_actions' => '电源操作', + 'power_action_sent' => ':action 发送到 :name', +]; diff --git a/lang/zh_CN/server/database.php b/lang/zh_CN/server/database.php new file mode 100644 index 0000000000..3bd331243a --- /dev/null +++ b/lang/zh_CN/server/database.php @@ -0,0 +1,26 @@ + '数据库', + 'empty' => '没有数据库', + 'create_database' => '新建数据库', + 'limit' => '已达到数据库限制', + 'viewing' => '查看: :database', + 'host' => '主机', + 'database' => '数据库', + 'username' => '用户名', + 'password' => '密码', + 'remote' => '远端', + 'created_at' => '创建于', + 'name' => '数据库名称', + 'name_hint' => '留空将自动随机生成名称', + 'connections_from' => '连接来自', + 'max_connections' => '最大连接数', + 'database_host' => '数据库主机', + 'database_host_select' => '选择数据库主机', + 'jdbc' => 'JDBC 连接字符串', + 'create_notification' => '已创建 :database', + 'create_notification_fail' => '创建 :database 失败', + 'delete_notification' => '已删除 :database', + 'delete_notification_fail' => '删除 :database 失败', +]; diff --git a/lang/zh_CN/server/file.php b/lang/zh_CN/server/file.php new file mode 100644 index 0000000000..27399cec1f --- /dev/null +++ b/lang/zh_CN/server/file.php @@ -0,0 +1,111 @@ + '文件', + 'name' => '名称', + 'size' => '大小', + 'modified_at' => '修改于', + 'actions' => [ + 'open' => '打开', + 'download' => '下载', + 'copy' => [ + 'title' => '复制', + 'notification' => '文件复制成功', + ], + 'upload' => [ + 'title' => '上传', + 'from_files' => '上传文件', + 'from_url' => '从网址上传', + 'url' => 'URL', + 'drop_files' => '拖拽文件并上传', + 'success' => '文件上传成功', + 'failed' => '文件上传失败', + 'header' => '上传文件中', + 'error' => '上传过程中发生错误', + ], + 'rename' => [ + 'title' => '重命名', + 'file_name' => '文件名', + 'notification' => '文件已重命名', + ], + 'move' => [ + 'title' => '移动', + 'directory' => '目录', + 'directory_hint' => '输入相对于当前目录的新目录。', + 'new_location' => '新位置', + 'new_location_hint' => '输入此文件或文件夹相对于当前目录的位置。', + 'notification' => '文件已移动', + 'bulk_notification' => ':count 文件已移动到 :directory', + ], + 'permissions' => [ + 'title' => '权限', + 'read' => '读取', + 'write' => '写入', + 'execute' => '执行', + 'owner' => '所有者', + 'group' => '组', + 'public' => '公开', + 'notification' => '权限更改为 :mode', + ], + 'archive' => [ + 'title' => '存档', + 'archive_name' => '存档名称', + 'notification' => '存档已创建', + 'extension' => '扩展', + ], + 'unarchive' => [ + 'title' => '取消存档', + 'notification' => '取消存档完成', + ], + 'new_file' => [ + 'title' => '新建文件', + 'file_name' => '新文件名', + 'syntax' => '语法高亮', + 'create' => '创建', + ], + 'new_folder' => [ + 'title' => '新建文件夹', + 'folder_name' => '新文件夹名称', + ], + 'nested_search' => [ + 'title' => '嵌套搜索', + 'search_term' => '搜索关键词', + 'search_term_placeholder' => '输入搜索关键词,例如 *.txt', + 'search' => '搜索', + 'search_for_term' => '搜索 :term', + ], + 'delete' => [ + 'notification' => '文件已删除', + 'bulk_notification' => ':count 文件已删除', + ], + 'edit' => [ + 'title' => '编辑: :file', + 'save_close' => '保存并关闭', + 'save' => '保存', + 'cancel' => '取消', + 'notification' => '文件已保存', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name 太大了!', + 'body' => '最大值 :max', + ], + 'file_not_found' => [ + 'title' => ':name 未找到 !', + ], + 'file_not_editable' => [ + 'title' => ':name 是一个目录', + ], + 'file_already_exists' => [ + 'title' => ':name 已经存在!', + ], + 'files_node_error' => [ + 'title' => '无法加载文件!', + ], + 'pelicanignore' => [ + 'title' => '您正在编辑 .pelicanover 文件!', + 'body' => '此处列出的任何文件或目录将被排除在备份之外。通配符将被星号支持(*)。
您可以通过预置一个采集点来否定先前的规则 ()。', + ], + ], +]; diff --git a/lang/zh_CN/server/network.php b/lang/zh_CN/server/network.php new file mode 100644 index 0000000000..abfc3b1965 --- /dev/null +++ b/lang/zh_CN/server/network.php @@ -0,0 +1,17 @@ + '网络', + 'add' => '添加分配', + 'limit' => '已达到分配限制', + 'address' => '地址', + 'port' => '端口', + 'notes' => '备注', + 'no_notes' => '无备注', + 'make_primary' => '设为首选', + 'primary' => '首选', + 'make' => '创建', + 'delete' => '删除', + 'locked' => '锁定?', + 'locked_helper' => '锁定的分配只能由管理员删除', +]; diff --git a/lang/zh_CN/server/schedule.php b/lang/zh_CN/server/schedule.php new file mode 100644 index 0000000000..16c88d6cb5 --- /dev/null +++ b/lang/zh_CN/server/schedule.php @@ -0,0 +1,121 @@ + '计划', + 'new' => '新计划', + 'edit' => '编辑计划', + 'save' => '保存计划', + 'delete' => '删除计划', + 'import' => '导入计划', + 'export' => '导出计划', + 'name' => '名称', + 'cron' => '自定义频率(Cron)', + 'status' => '状态', + 'schedule_status' => [ + 'inactive' => '未启用', + 'processing' => '处理中', + 'active' => '已启用', + ], + 'no_tasks' => '无任务', + 'run_now' => '现在运行', + 'online_only' => '仅在线时', + 'last_run' => '上次运行于', + 'next_run' => '下次运行于', + 'never' => '从来没有', + 'cancel' => '取消', + + 'only_online' => '仅当服务器在线时?', + 'only_online_hint' => '只在服务器处于运行状态时执行此时间表。', + 'enabled' => '启用计划?', + 'enabled_hint' => '如果启用,此计划将自动执行。', + + 'cron_body' => '请记住,下面的 cron 输入总是使用 UTC 。', + 'cron_timezone' => '下次运行于您的时区 (:timezon): :next_run ', + + 'invalid' => '无效', + + 'time' => [ + 'minute' => '分钟', + 'hour' => '小时', + 'day' => '天', + 'week' => '周', + 'month' => '月', + 'day_of_month' => '月份的日', + 'day_of_week' => '周中的日', + + 'hourly' => '每小时', + 'daily' => '每天', + 'weekly_mon' => '每周(星期一)', + 'weekly_sun' => '每周(星期天)', + 'monthly' => '每月', + 'every_min' => '每 X 分钟', + 'every_hour' => '每 X 小时', + 'every_day' => '每 X 天', + 'every_week' => '每 X 周', + 'every_month' => '每 X 月', + 'every_day_of_week' => '每周 X 天', + + 'every' => '每 ', + 'minutes' => '分钟', + 'hours' => '小时', + 'days' => '天', + 'months' => '月', + + 'monday' => '星期一', + 'tuesday' => '星期二', + 'wednesday' => '星期三', + 'thursday' => '星期四', + 'friday' => '星期五', + 'saturday' => '星期六', + 'sunday' => '星期天', + ], + + 'tasks' => [ + 'title' => '任务', + 'create' => '创建任务', + 'limit' => '已达到任务限制', + 'action' => '操作', + 'payload' => '负载', + 'no_payload' => '无负载', + 'time_offset' => '时间偏移', + 'first_task' => '首个任务', + 'seconds' => '秒', + 'continue_on_failure' => '在失败时继续', + + 'actions' => [ + 'title' => '操作', + 'power' => [ + 'title' => '发送电源操作', + 'action' => '电源操作', + 'start' => '启动', + 'stop' => '停止', + 'restart' => '重新启动', + 'kill' => '结束进程', + ], + 'command' => [ + 'title' => '发送命令', + 'command' => '命令', + ], + 'backup' => [ + 'title' => '创建备份', + 'files_to_ignore' => '忽略的文件', + ], + 'delete_files' => [ + 'title' => '删除文件', + 'files_to_delete' => '要删除的文件', + ], + ], + ], + + 'notification_invalid_cron' => '提供的 cron 数据没有计算到一个有效表达式', + + 'import_action' => [ + 'file' => '文件', + 'url' => 'URL', + 'schedule_help' => '这应该是原始.json 文件(schedule-daily-restart.json )', + 'url_help' => 'URL必须直接指向原始.json 文件', + 'add_url' => '新 URL', + 'import_failed' => '导入失败', + 'import_success' => '导入成功', + ], +]; diff --git a/lang/zh_CN/server/setting.php b/lang/zh_CN/server/setting.php new file mode 100644 index 0000000000..e711e08709 --- /dev/null +++ b/lang/zh_CN/server/setting.php @@ -0,0 +1,55 @@ + '设置', + 'server_info' => [ + 'title' => '服务器信息', + 'information' => '信息', + 'name' => '服务器名称', + 'server_name' => '服务器名称: :name', + 'notification_name' => '更新服务器名称', + 'description' => '服务器描述', + 'notification_description' => '更新服务器描述', + 'failed' => '失败', + 'uuid' => '服务器UUID', + 'uuid_short' => '服务器 ID', + 'node_name' => '节点名称', + 'icon' => [ + 'upload' => '上传图标', + 'tooltip' => '使用预设图标', + 'updated' => '服务器图标已更新', + 'deleted' => '服务器图标已删除', + ], + 'limits' => [ + 'title' => '限制', + 'unlimited' => '无限制', + 'of' => '于', + 'cpu' => 'CPU', + 'memory' => '内存', + 'disk' => '磁盘空间', + 'backups' => '备份', + 'databases' => '数据库', + 'allocations' => '分配', + 'no_allocations' => '分配额外的端口', + ], + 'sftp' => [ + 'title' => 'SFTP 信息', + 'connection' => '连接地址', + 'action' => '连接至 SFTP', + 'username' => '用户名', + 'password' => '密码', + 'password_body' => '您的 SFTP 密码与您访问此面板时使用的密码相同。', + ], + ], + 'reinstall' => [ + 'title' => '重装服务器', + 'body' => '重新安装您的服务器将停止它,然后重新运行最初设置它的安装脚本。', + 'body2' => '在此过程中,一些文件可能被删除或修改。请在继续之前备份您的数据。', + 'action' => '重新安装', + 'modal' => '您确定要重新安装此服务器吗?', + 'modal_description' => '在此过程中,一些文件可能被删除或修改。请在继续之前备份您的数据。', + 'yes' => '是,重新安装', + 'notification_start' => '重新安装已开始', + 'notification_fail' => '重新安装失败', + ], +]; diff --git a/lang/zh_CN/server/startup.php b/lang/zh_CN/server/startup.php new file mode 100644 index 0000000000..288d47719d --- /dev/null +++ b/lang/zh_CN/server/startup.php @@ -0,0 +1,17 @@ + '启动', + 'command' => '启动命令', + 'notification_startup' => '启动命令已更新', + 'notification_startup_body' => '重新启动服务器以使用新启动命令', + 'enable_preview' => '启用预览', + 'disable_preview' => '关闭预览', + 'docker_image' => 'Docker 镜像', + 'notification_docker' => 'Docker 镜像已更新', + 'notification_docker_body' => '重新启动服务器以使用新镜像。', + 'variables' => '服务器变量', + 'update' => '已更新: :variable', + 'fail' => '失败: :variable', + 'validation_fail' => '验证失败: :variable', +]; diff --git a/lang/zh_CN/server/user.php b/lang/zh_CN/server/user.php new file mode 100644 index 0000000000..ea5b03fab3 --- /dev/null +++ b/lang/zh_CN/server/user.php @@ -0,0 +1,73 @@ + '用户', + 'username' => '用户名', + 'email' => '电子邮箱', + 'assign_all' => '分配所有', + 'invite_user' => '邀请成员', + 'action' => '邀请', + 'remove' => '删除用户', + 'edit' => '编辑用户', + 'editing' => '编辑:user', + 'delete' => '删除用户', + 'notification_add' => '用户已邀请!', + 'notification_edit' => '用户已更新!', + 'notification_delete' => '用户已删除!', + 'notification_failed' => '邀请用户失败', + 'permissions' => [ + 'title' => '权限', + 'activity_desc' => '控制用户访问服务器活动日志的权限。', + 'startup_desc' => '控制用户修改此服务器设置能力的权限。', + 'settings_desc' => '控制用户修改此服务器设置能力的权限。', + 'control_desc' => '控制用户控制服务器电源状态或发送命令的能力。', + 'user_desc' => '允许用户在服务器上管理其他子用户的权限。 他们永远无法编辑自己的帐户,也无法分配他们自己没有的权限。', + 'file_desc' => '控制用户修改此服务器文件系统的能力的权限。', + 'allocation_desc' => '权限控制用户修改此服务器端口分配的能力。', + 'database_desc' => '控制用户访问此服务器的数据库管理的权限。', + 'backup_desc' => '控制用户生成和管理服务器备份能力的权限。', + 'schedule_desc' => '控制用户访问此服务器的schedule管理的权限。', + 'startup_read' => '允许用户查看服务器的启动变量。', + 'startup_update' => '允许用户修改服务器的启动变量。', + 'startup_docker_image' => '允许用户修改运行服务器时使用的 Docker 镜像。', + 'settings_reinstall' => '允许用户重新安装此服务器。', + 'settings_rename' => '允许用户重命名此服务器并更改其描述。', + 'settings_description' => '允许用户更改此服务器的描述。', + 'activity_read' => '允许用户查看服务器的启动变量。', + 'websocket_connect' => '允许访问此服务器的 websocket。', + 'control_console' => '允许用户通过控制台向服务器实例发送命令。', + 'control_start' => '允许用户在服务器停止时启动它。', + 'control_stop' => '允许用户停止正在运行的服务器。', + 'control_restart' => '允许用户重新启动服务器实例。', + 'control_kill' => '允许用户强制停止服务器实例。', + 'user_create' => '允许用户为服务器创建新的子用户。', + 'user_read' => '允许用户查看与此服务器关联的子用户权限。', + 'user_update' => '允许用户修改与此服务器关联的子用户。', + 'user_delete' => '允许用户删除与此服务器关联的子用户。', + 'file_create' => '允许用户通过面板或直接上传、创建其他文件和文件夹。', + 'file_read' => '允许用户查看目录的内容,但不能查看或下载文件的内容。', + 'file_read_content' => '允许用户查看指定文件的内容。这也将允许用户下载文件。', + 'file_update' => '允许用户更新现有文件或目录的内容。', + 'file_delete' => '允许用户删除文件或目录。', + 'file_archive' => '允许用户压缩系统上的的文件以及解压系统上的现有压缩文件。', + 'file_sftp' => '允许用户使用其他分配的文件权限连接到 SFTP 并管理服务器文件。', + 'allocation_read' => '允许访问服务器分配管理页面。', + 'allocation_update' => '允许用户修改服务器分配的权限。', + 'allocation_delete' => '允许用户从服务器删除配置。', + 'allocation_create' => '允许用户为服务器分配额外的配置。', + 'database_create' => '允许用户为服务器创建新数据库的权限。', + 'database_read' => '允许用户查看服务器数据库的权限。', + 'database_update' => '允许用户修改数据库的权限。如果用户没有 "VIEW_PASSWORD" 权限,那么他将无法修改密码。', + 'database_delete' => '允许用户删除数据库实例的权限。', + 'database_view_password' => '允许用户在系统中查看数据库密码。', + 'schedule_create' => '允许用户为此服务器创建新计划。', + 'schedule_read' => '允许用户查看此服务器的计划和与其关联的任务。', + 'schedule_update' => '允许用户更新此服务器的计划和计划中的任务。', + 'schedule_delete' => '允许用户删除此服务器的计划。', + 'backup_create' => '允许用户为此服务器创建新的备份。', + 'backup_read' => '允许用户查看此服务器存在的所有备份。', + 'backup_delete' => '允许用户从系统中删除备份。', + 'backup_download' => '允许用户下载服务器的备份。危险:允许用户在备份中访问服务器的所有文件。', + 'backup_restore' => '允许用户恢复服务器的备份。危险:这允许用户在过程中删除所有服务器文件。', + ], +]; diff --git a/lang/zh_CN/validation.php b/lang/zh_CN/validation.php new file mode 100644 index 0000000000..53cce67a7b --- /dev/null +++ b/lang/zh_CN/validation.php @@ -0,0 +1,101 @@ + '您必须接受 :attribute。', + 'active_url' => ':attribute 不是一个有效的网址。', + 'after' => ':attribute 必须要晚于 :date。', + 'after_or_equal' => ':attribute 必须要等于 :date 或更晚。', + 'alpha' => ':attribute 只能由字母组成。', + 'alpha_dash' => ':attribute 只能由字母、数字、短划线(-)和下划线(_)组成。', + 'alpha_num' => ':attribute 只能由字母和数字组成。', + 'array' => ':attribute 必须是一个数组。', + 'before' => ':attribute 必须要早于 :date。', + 'before_or_equal' => ':attribute 必须要等于 :date 或更早。', + 'between' => [ + 'numeric' => ':attribute 必须介于 :min - :max 之间。', + 'file' => ':attribute 必须介于 :min - :max KB 之间。', + 'string' => ':attribute 必须介于 :min - :max 个字符之间。', + 'array' => ':attribute 必须只有 :min - :max 个单元。', + ], + + 'confirmed' => ':attribute 两次输入不一致。', + 'date' => ':attribute 不是一个有效的日期。', + 'date_format' => ':attribute 的格式必须为 :format。', + 'different' => ':attribute 和 :other 必须不同。', + 'digits' => ':attribute 必须是 :digits 位数字。', + 'digits_between' => ':attribute 必须是介于 :min 和 :max 位的数字。', + 'dimensions' => ':attribute 图片尺寸不正确。', + + 'email' => ':attribute 不是一个合法的邮箱。', + + 'file' => ':attribute 必须是文件。', + 'filled' => ':attribute 不能为空。', + 'image' => ':attribute 必须是图片。', + + 'in_array' => ':attribute 必须在 :other 中。', + 'integer' => ':attribute 必须是整数。', + 'ip' => ':attribute 必须是有效的 IP 地址。', + 'json' => ':attribute 必须是正确的 JSON 格式。', + 'max' => [ + 'numeric' => ':attribute 不能大于 :max。', + 'file' => ':attribute 不能大于 :max KB。', + 'string' => ':attribute 不能大于 :max 个字符。', + 'array' => ':attribute 最多只有 :max 个单元。', + ], + 'mimes' => ':attribute 必须是一个 :values 类型的文件。', + 'mimetypes' => ':attribute 必须是一个 :values 类型的文件。', + 'min' => [ + 'numeric' => ':attribute 必须大于等于 :min。', + 'file' => ':attribute 大小不能小于 :min KB。', + 'string' => ':attribute 至少为 :min 个字符。', + 'array' => ':attribute 至少有 :min 个单元。', + ], + + 'numeric' => ':attribute 必须是一个数字。', + + 'regex' => ':attribute 格式不正确。', + + 'required_with_all' => '当 :values 存在时 :attribute 不能为空。', + + 'same' => ':attribute 和 :other 必须相同。', + 'size' => [ + 'numeric' => ':attribute 大小必须为 :size。', + 'file' => ':attribute 大小必须为 :size KB。', + 'string' => ':attribute 必须是 :size 个字符。', + 'array' => ':attribute 必须为 :size 个单元。', + ], + 'string' => ':attribute 必须是一个字符串。', + 'timezone' => ':attribute 必须是一个合法的时区值。', + + 'url' => ':attribute 格式不正确。', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + + // Internal validation logic for Panel + 'internal' => [ + 'variable_value' => ':env 变量', + 'invalid_password' => '提供的密码对此帐户无效。', + ], +]; diff --git a/lang/zh_TW/activity.php b/lang/zh_TW/activity.php new file mode 100644 index 0000000000..15b7469c6f --- /dev/null +++ b/lang/zh_TW/activity.php @@ -0,0 +1,125 @@ + [ + 'fail' => '登入失敗', + 'success' => '已登入', + 'password-reset' => '重置密碼', + 'checkpoint' => '雙重認證為必要的', + 'recovery-token' => '已使用雙重認證恢復令牌', + 'token' => '已通過雙重驗證', + 'ip-blocked' => '封鎖了來自未列出的 IP 位址的 :identifier 請求', + 'sftp' => [ + 'fail' => 'SFTP 登入失敗', + ], + ], + 'user' => [ + 'account' => [ + 'username-changed' => '已將使用者名稱從 :old 更新為 :new', + 'email-changed' => '將電子郵件從 :old 更新為 :new', + 'password-changed' => '修改密碼', + ], + 'api-key' => [ + 'create' => '建立新的 API 金鑰 :identifier', + 'delete' => '刪除 API 金鑰 :identifier', + ], + 'ssh-key' => [ + 'create' => '已將 SSH 金鑰 :fingerprint 新增至帳戶', + 'delete' => '已將 SSH 金鑰 :fingerprint 從帳戶刪除', + ], + 'two-factor' => [ + 'create' => '已啟用雙重認證', + 'delete' => '已禁用雙重認證', + ], + ], + 'server' => [ + 'console' => [ + 'command' => '在伺服器上執行 ":command"', + ], + 'power' => [ + 'start' => '啟動伺服器', + 'stop' => '停止伺服器', + 'restart' => '重新啟動伺服器', + 'kill' => '停止伺服器進程', + ], + 'backup' => [ + 'download' => '下載 :name 備份', + 'delete' => '刪除 :name 備份', + 'restore' => '還原了 :name 備份(已刪除檔案::truncate)', + 'restore-complete' => '已完成備份 :name 的恢復', + 'restore-failed' => '無法完成備份 :name 的恢復', + 'start' => '開始新的備份 :name', + 'complete' => '創建備份 :name 成功', + 'fail' => '創建備份 :name 失敗', + 'lock' => '鎖定 :name 備份', + 'unlock' => '解除鎖定 :name 備份', + 'rename' => '已將備份名稱從 ":old_name" 更新為 ":new_name"', + ], + 'database' => [ + 'create' => '創建新的資料庫 :name', + 'rotate-password' => '資料庫 :name 的密碼已輪換', + 'delete' => '刪除資料庫 :name', + ], + 'file' => [ + 'compress' => '已壓縮的 :directory:files|:directory 中已壓縮的 :count 個文件', + 'read' => '查看了 :file 的內容', + 'copy' => '已複製 :file', + 'create-directory' => '建立目錄 :directory:name', + 'decompress' => '解壓縮後的 :file 位於 :directory 中', + 'delete' => '已刪除 :directory:files|:directory 中已刪除的 :count 個文件', + 'download' => '已下載:file', + 'pull' => '已將遠端檔案從 :url 下載到 :directory', + 'rename' => '已將 :from 移動/重新命名為 :to|已將 :directory 中的 :count 個檔案移動/重新命名', + 'write' => '將新內容寫入:file', + 'upload' => '開始上傳文件', + 'uploaded' => '已上傳 :directory:file', + ], + 'sftp' => [ + 'denied' => '由於權限問題,SFTP 存取被拒絕', + 'create' => '建立了 :files|建立了 :count 個新文件', + 'write' => '修改了 :files 的內容|修改了 :count 個檔案的內容', + 'delete' => '刪除了 :files|刪除了 :count 個文件', + 'create-directory' => '建立了 :files 目錄 | 建立了 :count 個目錄', + 'rename' => '已將 :from 重新命名為 :to|已重新命名或移動 :count 個文件', + ], + 'allocation' => [ + 'create' => '已將 :allocation 新增至伺服器', + 'notes' => '已將 :allocation 的備註從 ":old" 更新為 ":new"', + 'primary' => '已將 :allocation 設為伺服器的主要配置', + 'delete' => '已刪除 :allocation 配置', + ], + 'schedule' => [ + 'create' => '已建立排程 :name', + 'update' => '已更新排程 :name', + 'execute' => '已手動執行排程 :name', + 'delete' => '已刪除排程 :name', + ], + 'task' => [ + 'create' => '已為排程 :name 建立新的「:action」任務', + 'update' => '已更新排程 :name 的「:action」任務', + 'delete' => '已刪除排程 :name 的「:action」任務', + ], + 'settings' => [ + 'rename' => '已將伺服器名稱從「:old」變更為「:new」', + 'description' => '已將伺服器描述從「:old」變更為「:new」', + 'reinstall' => '已重新安裝伺服器', + ], + 'startup' => [ + 'edit' => '已將變數 :variable 從「:old」變更為「:new」', + 'image' => '已將伺服器的 Docker 映像從 :old 更新為 :new', + 'command' => '已將伺服器的啟動指令從 :old 更新為 :new', + ], + 'subuser' => [ + 'create' => '已將 :email 新增為子使用者', + 'update' => '已更新 :email 的子使用者權限', + 'delete' => '已將 :email 從子使用者中移除', + ], + 'crashed' => '伺服器已崩潰', + ], +]; diff --git a/lang/zh_TW/admin/apikey.php b/lang/zh_TW/admin/apikey.php new file mode 100644 index 0000000000..0911903eea --- /dev/null +++ b/lang/zh_TW/admin/apikey.php @@ -0,0 +1,27 @@ + '應用程式 API 金鑰', + 'empty' => '沒有 API 金鑰', + 'whitelist' => 'IPv4 位址白名單', + 'whitelist_help' => 'API 金鑰可以限制僅從特定的 IPv4 位址使用。請每行輸入一個IP位址。', + 'whitelist_placeholder' => '範例:127.0.0.1 或 192.168.1.1', + 'description' => '敘述', + 'description_help' => '此金鑰用途的簡要說明', + 'nav_title' => 'API 金鑰', + 'model_label' => '應用程式 API 金鑰', + 'model_label_plural' => '應用程式 API 金鑰', + 'table' => [ + 'key' => '金鑰', + 'description' => '敘述', + 'last_used' => '最後使用', + 'created' => '建立時間', + 'created_by' => '建立者', + 'never_used' => '從未用過', + ], + 'permissions' => [ + 'none' => '無', + 'read' => '讀', + 'read_write' => '讀 / 寫', + ], +]; diff --git a/lang/zh_TW/admin/dashboard.php b/lang/zh_TW/admin/dashboard.php new file mode 100644 index 0000000000..aea3504c10 --- /dev/null +++ b/lang/zh_TW/admin/dashboard.php @@ -0,0 +1,45 @@ + '歡迎來到 Pelican!', + 'version' => '版本::version', + 'advanced' => '進階設定', + 'server' => '伺服器', + 'user' => '使用者', + 'sections' => [ + 'intro-developers' => [ + 'heading' => '為開發人員提供的資訊', + 'content' => '感謝您試用開發版本!', + 'extra_note' => '如果您遇到任何問題,請在 GitHub 上回報。', + 'button_issues' => '回報問題', + 'button_features' => '參與功能討論', + ], + 'intro-update-available' => [ + 'heading' => '有可用的更新', + 'content' => ':latestVersion 現已推出!請閱讀我們的文件以更新您的管理面板。', + 'button_changelog' => '有什麼新功能?', + ], + 'intro-no-update' => [ + 'heading' => '你的面板已是最新版本', + 'content' => '目前使用的版本為: :version。 您的面板已是最新版本!', + ], + 'intro-first-node' => [ + 'heading' => '未偵測到節點', + 'content' => '看起來您尚未設定任何節點,不過別擔心,您可以點擊操作按鈕來建立第一個節點!', + 'extra_note' => '如果您遇到任何問題,請在 GitHub 上回報。', + 'button_label' => '在 Pelican 建立第一個節點', + ], + 'intro-support' => [ + 'heading' => '支持 Pelican', + 'content' => '感謝您使用 Pelican!這一切的成就都要歸功於您、我們的貢獻者,以及所有支持者的協助與支持!', + 'extra_note' => '我們由衷感謝任何形式的支持。', + 'button_translate' => '協助翻譯', + 'button_donate' => '直接抖內', + ], + 'intro-help' => [ + 'heading' => '需要幫助?', + 'content' => '建議先閱讀文檔,如果還有需要幫助的地方,歡迎到我們的 Discord 伺服器詢問!', + 'button_docs' => '閱讀文檔', + ], + ], +]; diff --git a/lang/zh_TW/admin/databasehost.php b/lang/zh_TW/admin/databasehost.php new file mode 100644 index 0000000000..90b0e79ac7 --- /dev/null +++ b/lang/zh_TW/admin/databasehost.php @@ -0,0 +1,74 @@ + '資料庫主機', + 'model_label' => '資料庫主機', + 'model_label_plural' => '資料庫主機', + 'table' => [ + 'database' => '資料庫', + 'name' => '名稱', + 'host' => '主機', + 'port' => '連接埠', + 'name_helper' => '將此欄位保留空白將自動生成名稱', + 'username' => '使用者名稱', + 'password' => '密碼', + 'remote' => '連線來自', + 'remote_helper' => '允許連接的地方。留空以允許任何地方的連接。', + 'max_connections' => '最大連線數', + 'created_at' => '建立於', + 'connection_string' => 'JDBC 連接字串', + ], + 'error' => '連接到主機時發生錯誤', + 'host' => '主機', + 'host_help' => '嘗試從本面板連接到此 MySQL 主機以建立新資料庫時應使用的 IP 位址或網域名稱。', + 'port' => '連接埠', + 'port_help' => 'MySQL 在此主機的運行的連接埠。', + 'max_database' => '最大資料庫', + 'max_databases_help' => '可以在此主機上建立的資料庫的最大數量。 如果達到限制,無法在此主機上建立新的資料庫。空白是無限的。', + 'display_name' => '顯示名稱', + 'display_name_help' => '應該向終端用戶顯示的 IP 位址或網域名稱。', + 'username' => '使用者名稱', + 'username_help' => '具有足夠權限在系統上建立新使用者和資料庫的帳戶的使用者名稱。', + 'password' => '密碼', + 'password_help' => '資料庫使用者的密碼。', + 'linked_nodes' => '已連接的節點', + 'linked_nodes_help' => '此設定只在添加資料庫到所選節點上的伺服器時預設為此資料庫主機。', + 'connection_error' => '連接到資料庫主機時發生錯誤', + 'no_database_hosts' => '沒有資料庫主機', + 'no_nodes' => '沒有節點', + 'delete_help' => '資料庫主機有資料庫', + 'unlimited' => '無限制', + 'anywhere' => '任何地方', + + 'rotate' => '旋轉', + 'rotate_password' => '更改你的密碼', + 'rotated' => '密碼已輪替', + 'rotate_error' => '密碼輪替失敗', + 'databases' => '資料庫', + + 'setup' => [ + 'preparations' => '準備工作', + 'database_setup' => '資料庫設定', + 'panel_setup' => '面板設定', + + 'note' => '目前,資料庫主機僅支援 MySQL / MariaDB 資料庫!', + 'different_server' => '面板和資料庫在同一個伺服器上嗎?', + + 'database_user' => '資料庫使用者', + 'cli_login' => '使用 mysql -u root -p 存取 mysql cli。', + 'command_create_user' => '建立使用者的指令', + 'command_assign_permissions' => '指派權限的指令', + 'cli_exit' => '要離開 mysql cli,執行 exit。', + 'external_access' => '外部存取', + 'allow_external_access' => ' +

您可能需要允許外部存取此 MySQL 執行個體,以便允許伺服器連接到它。

+
+

為此,請開啟my.cnf,其位置根據您的作業系統和 MySQL 的安裝方式而異。您可以輸入 find /etc -iname my.cnf 來尋找它。

+
+

開啟 my.cnf,將以下文字新增到檔案底部並儲存:
+ [mysqld]
bind-address=0.0.0.0

+
+

重新啟動 MySQL / MariaDB 以套用這些變更。這會覆蓋預設 MySQL 設定,預設配置僅接受來自本機的請求。更新此配置後,將允許所有介面的連接,從而允許外部連接。請確保在防火牆中允許 MySQL 連接埠(預設為 3306)。

+ ', + ], +]; diff --git a/lang/zh_TW/admin/egg.php b/lang/zh_TW/admin/egg.php new file mode 100644 index 0000000000..fec8c00a1a --- /dev/null +++ b/lang/zh_TW/admin/egg.php @@ -0,0 +1,108 @@ + 'Eggs', + 'model_label' => 'Egg', + 'model_label_plural' => 'Eggs', + 'tabs' => [ + 'configuration' => '設定', + 'process_management' => '進程管理', + 'egg_variables' => 'Egg 變數', + 'install_script' => '安裝腳本', + ], + 'import' => [ + 'file' => '檔案', + 'url' => 'URL', + 'image_url' => '映像網址', + 'image_error' => '無法擷取映像', + 'image_too_large' => '映像過大,限制為 1024KB', + 'egg_help' => '這應該是個原始 .json/.yaml 檔案', + 'url_help' => 'URL必須指向原始 .json/.yaml 檔案', + 'add_url' => '新 URL', + 'import_failed' => '匯入失敗', + 'import_success' => '匯入成功', + 'github' => '從 Github 新增', + 'refresh' => '重新整理', + 'import_image' => '匯入映像', + 'no_local_ip' => '不允許本地 IP 位址', + 'unsupported_format' => '不支援的格式。支援的格式::formats', + 'invalid_url' => '所提供的網址無效', + 'image_deleted' => '映像已刪除', + 'no_image' => '未提供映像', + 'image_updated' => '映像已更新', + ], + 'export' => [ + 'modal' => '您想如何匯出 :egg ?', + 'as' => '使用 .:format', + ], + 'in_use' => '使用中', + 'servers' => '伺服器', + 'name' => '名稱', + 'egg_uuid' => 'Egg UUID', + 'egg_id' => 'Egg ID', + 'name_help' => '一個簡單易讀的名稱,用作該 Egg 的識別碼。', + 'author' => '作者', + 'uuid_help' => '這是這個 Egg 的全域唯一識別碼,Wings 將其用作識別碼。', + 'author_help' => '這個版本的 Egg 的作者。', + 'author_help_edit' => '此版本 Egg 的作者。上傳來自不同作者的新設定檔將變更此項目。', + 'description' => '敘述', + 'description_help' => '此 Egg 的說明,將在面板中按需要顯示。', + 'add_startup' => '新增啟動指令', + 'startup_command' => '指令', + 'startup_commands' => '啟動指令', + 'startup_name' => '顯示名稱', + 'startup_help' => '使用此 Egg 的伺服器可用的啟動指令。第一個是預設值。', + 'file_denylist' => '拒絕檔案清單', + 'file_denylist_help' => '不允許終端使用者編輯的檔案清單。', + 'features' => '特徵', + 'force_ip' => '強制外部 IP', + 'force_ip_help' => '強制所有外送的網路流量,其來源 IP 都會被 NAT 成伺服器主要分配的 IP。當節點擁有多個公用 IP 位址時,某些遊戲需要這項設定才能正常運作。啟用此選項後,使用該 Egg 的所有伺服器將無法使用內部網路,並因此無法在同一個節點上互相透過內部位址進行存取。', + 'tags' => '標籤', + 'update_url' => '更新網址', + 'update_url_help' => '網址必須直接指向原始 .json 檔案', + 'add_image' => '新增 Docker 映像', + 'docker_images' => 'Docker 映像', + 'docker_name' => '映像名稱', + 'docker_uri' => '映像 URI', + 'docker_help' => '使用此 Egg 的伺服器可用的 Docker 映像。第一個是預設值。', + + 'stop_command' => '關閉指令', + 'stop_command_help' => '應該傳送到伺服器處理程序以優雅地停止它們的指令。如果需要傳送 SIGINT,應該在此輸入 ^C。', + 'copy_from' => '從中複製設定', + 'copy_from_help' => '如果你想使用其他 Egg 的預設設定,請從上方的選單中選取', + 'none' => '無', + 'start_config' => '啟動設定', + 'start_config_help' => '伺服器開機時,守護進程用來判斷是否啟動完成的一組值。', + 'config_files' => '設定檔案', + 'config_files_help' => '這裡應該填入一個 JSON,用來表示要修改哪些設定檔,以及哪些部分需要變更。', + 'log_config' => '日誌設定', + 'log_config_help' => '這裡要填一段 JSON,用來指定日誌存放在哪裡,以及要不要讓 daemon 建立自訂的日誌檔。', + + 'environment_variable' => '環境變數', + 'default_value' => '預設值', + 'user_permissions' => '使用者權限', + 'viewable' => '可檢視', + 'editable' => '可編輯', + 'rules' => '規則', + 'add_new_variable' => '新增變數', + + 'error_unique' => '已存在具有此名稱的變數。', + 'error_required' => '環境變數欄位為必需。', + 'error_reserved' => '此環境變數已保留且無法使用。', + + 'script_from' => '腳本來自', + 'script_container' => '腳本容器', + 'script_entry' => '腳本進入點', + 'script_install' => '安裝腳本', + 'no_eggs' => '無 Egg', + 'no_servers' => '無伺服器', + 'no_servers_help' => '沒有伺服器分配給此 Egg。', + + 'update' => '更新|更新 所選項目', + 'updated' => 'Egg 已更新|:count/:total Eggs 已更新', + 'updated_failed' => ':count 個失敗', + 'updated_skipped' => ':count 個跳過', + 'update_question' => '您確定要更新此 Egg 嗎?|您確定要更新所選的 Egg 嗎?', + 'update_description' => '如果對 Egg 進行了任何變更,它們將被覆蓋!|如果對這些 Egg 進行了任何變更,它們將被覆蓋!', + 'no_updates' => '所選的 Egg 沒有可用更新', +]; diff --git a/lang/zh_TW/admin/health.php b/lang/zh_TW/admin/health.php new file mode 100644 index 0000000000..33d9fff287 --- /dev/null +++ b/lang/zh_TW/admin/health.php @@ -0,0 +1,60 @@ + '健康狀態', + 'results_refreshed' => '健康狀態已更新', + 'checked' => '檢查時間::time', + 'refresh' => '重新整理', + 'results' => [ + 'cache' => [ + 'label' => '快取', + 'ok' => '確定', + 'failed_retrieve' => '無法設定或讀取應用程式快取值。', + 'failed' => '應用程式快取發生錯誤::error', + ], + 'database' => [ + 'label' => '資料庫', + 'ok' => '確定', + 'failed' => '無法連接到資料庫::error', + ], + 'debugmode' => [ + 'label' => '除錯模式', + 'ok' => '除錯模式已停用', + 'failed' => '除錯模式預期為 :expected,但實際為 :actual', + ], + 'environment' => [ + 'label' => '環境', + 'ok' => '已成功設為 :actual', + 'failed' => '系統環境設定為 :actual,但預期為 :expected', + ], + 'nodeversions' => [ + 'label' => '節點版本', + 'ok' => '節點已是最新版本', + 'failed' => ':outdated/:all 個節點不是最新版本', + 'no_nodes_created' => '沒有建立任何節點', + 'no_nodes' => '沒有節點', + 'all_up_to_date' => '全部為最新版本', + 'outdated' => ':outdated/:all 已過時', + ], + 'panelversion' => [ + 'label' => '面板版本', + 'ok' => '面板已是最新版本', + 'failed' => '目前安裝的版本為 :currentVersion,最新版本為 :latestVersion', + 'up_to_date' => '已是最新', + 'outdated' => '已過時', + ], + 'schedule' => [ + 'label' => '排程', + 'ok' => '確定', + 'failed_last_ran' => '排程上次執行是在 :time 分鐘前', + 'failed_not_ran' => '排程尚未執行。', + ], + 'useddiskspace' => [ + 'label' => '磁碟空間', + ], + ], + 'checks' => [ + 'successful' => '成功', + 'failed' => '失敗', + ], +]; diff --git a/lang/zh_TW/admin/log.php b/lang/zh_TW/admin/log.php new file mode 100644 index 0000000000..5d3f348a68 --- /dev/null +++ b/lang/zh_TW/admin/log.php @@ -0,0 +1,26 @@ + '耶!沒有錯誤!', + 'total_logs' => '總 logs', + 'error' => '錯誤', + 'warning' => '警告', + 'notice' => '通知', + 'info' => '資訊', + 'debug' => '除錯', + 'navigation' => [ + 'panel_logs' => '面板日誌', + ], + 'actions' => [ + 'upload_logs' => '上傳日誌?', + 'upload_logs_description' => '這將上傳 :file 到 :url 你確定要這麼做嗎', + 'view_logs' => '查看日誌', + 'log_not_found' => '找不到日誌!', + 'log_not_found_description' => '找不到 :filename 日誌', + 'failed_to_upload' => '上傳失敗。', + 'failed_to_upload_description' => 'HTTP 狀態: :status', + 'log_upload' => '已上傳日誌!', + 'log_upload_action' => '查看日誌', + 'upload_tooltip' => '上傳到 :url', + ], +]; diff --git a/lang/zh_TW/admin/mount.php b/lang/zh_TW/admin/mount.php new file mode 100644 index 0000000000..05b577e34d --- /dev/null +++ b/lang/zh_TW/admin/mount.php @@ -0,0 +1,30 @@ + 'Mounts', + 'model_label' => '掛載', + 'model_label_plural' => 'Mounts', + 'name' => '名稱', + 'name_help' => '用來區分此掛載點與其他掛載點的唯一名稱。', + 'source' => '來源', + 'source_help' => '要掛載到容器中的主機系統路徑。', + 'target' => '目標', + 'target_help' => '掛載點在容器內可存取的位置。', + 'read_only' => '唯讀?', + 'read_only_help' => '此掛載在容器內是唯讀的嗎?', + 'description' => '敘述', + 'description_help' => '此掛載點的詳細描述', + 'no_mounts' => '沒有任何掛載點', + 'eggs' => 'Eggs', + 'nodes' => '節點', + 'toggles' => [ + 'writable' => '可寫', + 'read_only' => '唯讀', + ], + 'table' => [ + 'name' => '名稱', + 'all_eggs' => '所有 Eggs', + 'all_nodes' => '所有節點', + 'read_only' => '唯讀', + ], +]; diff --git a/lang/zh_TW/admin/node.php b/lang/zh_TW/admin/node.php new file mode 100644 index 0000000000..7d5ecd8ca4 --- /dev/null +++ b/lang/zh_TW/admin/node.php @@ -0,0 +1,149 @@ + '節點', + 'model_label' => '節點', + 'model_label_plural' => '節點', + 'create' => '建立節點', + 'tabs' => [ + 'overview' => '總覽', + 'basic_settings' => '基本設定', + 'advanced_settings' => '進階設定', + 'config_file' => '配置文件', + 'diagnostics' => '診斷', + ], + 'table' => [ + 'health' => '健康狀況', + 'name' => '名稱', + 'address' => '位址', + 'public' => '公開', + 'servers' => '伺服器', + 'alias' => '別名', + 'ip' => 'IP', + 'egg' => 'Egg', + 'owner' => '擁有者', + 'allocation_notes' => '備註', + 'no_notes' => '無備註', + ], + 'node_info' => '節點資訊', + 'wings_version' => 'Wings 版本', + 'cpu_threads' => 'CPU 執行緒', + 'architecture' => '架構', + 'kernel' => '核心', + 'unknown' => '不明', + 'latest' => '(最新版本::version)', + 'node_uuid' => '節點 UUID', + 'node_id' => '節點 ID', + + 'ip_address' => 'IP 位址', + 'ip_help' => '請直接使用您的外部 IP,除非你正在進行 port 轉發。', + 'alias_help' => '選擇性的顯示名稱以幫助您記住這些內容。', + 'refresh' => '重新整理', + 'domain' => '域名', + 'ssl_ip' => '您無法透過 SSL 連接到 IP 位址。', + 'error' => '這是指向您節點 IP 位址的域名。如果您已經設置此項,您可以通過檢查下一欄位來驗證它!', + 'fqdn_help' => '您的面板目前通過 SSL 憑證保護,這意味著您的節點也需要。您必須使用域名,因為您無法為 IP 位址取得 SSL 憑證。', + 'dns' => 'DNS 記錄檢查', + 'dns_help' => '這讓您知道 DNS 記錄是否指向正確的 IP 位址。', + 'valid' => '有效', + 'invalid' => '無效', + 'port' => '連接埠', + 'ports' => '連接埠', + 'port_help' => '如果您在 Cloudflare 後面執行守護程式,您應該將守護程式連接埠設置為 8443 以允許 websocket 通過 SSL 代理。', + 'connect_port' => '連接連接埠', + 'connect_port_help' => '連接到 Wings 的連接將使用此連接埠。如果您使用反向代理,這可能與監聽連接埠不同。當使用 Cloudflare 代理時,您應該使用 8443。', + 'listen_port' => '監聽連接埠', + 'listen_port_help' => 'Wings 將在此連接埠上監聽。', + 'display_name' => '顯示名稱', + 'ssl' => '透過 SSL 通訊', + 'panel_on_ssl' => '您的面板正在使用安全的 SSL 連接,
所以您的守護程式也必須。', + 'ssl_help' => 'IP 位址無法使用 SSL。', + + 'tags' => '標籤', + 'upload_limit' => '上傳限制', + 'upload_limit_help' => '輸入可以通過網路檔案管理器上傳的最大檔案大小。', + 'sftp_port' => 'SFTP 連接埠', + 'sftp_alias' => 'SFTP 別名', + 'sftp_alias_help' => '顯示 SFTP 位址的別名。留空以使用節點 FQDN。', + 'use_for_deploy' => '用於部署?', + 'maintenance_mode' => '維護模式', + 'maintenance_mode_help' => '如果節點被標記為「維護中」,用戶將無法存取該節點上的伺服器。', + + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU 限制', + 'memory' => '記憶體', + 'memory_limit' => '記憶體限制', + 'disk' => '磁碟', + 'disk_limit' => '磁碟限制', + 'unlimited' => '無限制', + 'limited' => '上限', + 'overallocate' => '超額分配', + 'enabled' => '已啟用', + 'disabled' => '已停用', + 'yes' => '是', + 'no' => '否', + + 'instructions' => '說明', + 'instructions_help' => '將此檔案保存到守護程式的根目錄,名稱為 config.yml', + + 'auto_deploy' => '自動部署指令', + 'auto_question' => '選擇獨立安裝或是 Docker 安裝。', + 'auto_label' => '類型', + 'standalone' => '獨立', + 'docker' => 'Docker', + 'auto_command' => '要自動配置您的節點,請執行以下指令:', + 'reset_token' => '重設授權令牌', + 'token_reset' => '守護程式令牌已被重設。', + 'reset_help' => '重設守護程式令牌將使舊令牌的任何請求無效。此令牌用於守護程式上的所有敏感操作,包括伺服器建立和刪除。我們建議定期更改此令牌以確保安全。', + + 'no_nodes' => '沒有節點', + 'none' => '無', + 'cpu_chart' => 'CPU - :cpu% of :max%', + 'memory_chart' => '記憶體 - :used of :total', + 'disk_chart' => '儲存 - :used of :total', + 'used' => '已使用', + 'unused' => '未使用', + + 'next_step' => '下一步', + 'node_has_servers' => '節點有伺服器', + 'create_allocation' => '建立網路分配', + 'primary_allocation' => '主要網路分配', + 'databases' => '資料庫', + 'backups' => '備份', + + 'error_connecting' => '連接到節點 :node 時發生錯誤', + 'error_connecting_description' => '無法自動更新 Wings 配置,您需要手動更新配置文件。', + 'allocation' => '網路分配', + + 'diagnostics' => [ + 'header' => '節點診斷', + 'include_endpoints' => '包含端點', + 'include_endpoints_hint' => '包含端點會在記錄中顯示面板 URL,並且不會隱藏它們。', + 'include_logs' => '包含記錄', + 'include_logs_hint' => '包含記錄會顯示最近的記錄,並幫助追蹤可能的問題。', + 'run_diagnostics' => '執行診斷', + 'upload_to_pelican' => '上傳記錄', + 'logs_pulled' => '記錄已提取!', + 'logs_uploaded' => '記錄已上傳', + 'upload_failed' => '記錄上傳失敗', + 'view_logs' => '檢視記錄', + 'pull' => '提取', + 'upload' => '上傳', + 'clear' => '清除', + '404' => '找不到請求的診斷報告。請確保 Wings 已更新至最新版本,然後重試。', + ], + + 'cloudflare_issue' => [ + 'title' => 'Cloudflare 問題', + 'body' => '您的節點無法透過 Cloudflare 存取。', + ], + + 'bulk_update_ip' => '更新 IP', + 'bulk_update_ip_description' => '為網路分配中的 IP 位址進行替換,使用新 IP 位址取代舊 IP 位址。當節點的 IP 位址變更時很有用。', + 'update_ip' => '更新 IP 位址', + 'old_ip' => '舊 IP 位址', + 'new_ip' => '新 IP 位址', + 'no_allocations_to_update' => '找不到使用所選舊 IP 位址的網路分配', + 'ip_updated' => '成功更新了 :count 個網路分配(共 :total 個)', + 'ip_update_failed' => ':count 個網路分配更新失敗', +]; diff --git a/lang/zh_TW/admin/role.php b/lang/zh_TW/admin/role.php new file mode 100644 index 0000000000..ceb0d418ea --- /dev/null +++ b/lang/zh_TW/admin/role.php @@ -0,0 +1,17 @@ + '身分組', + 'model_label' => '身分組', + 'model_label_plural' => '身分組', + 'no_roles' => '沒有身分組', + 'name' => '身分組名稱', + 'permissions' => '權限', + 'in_use' => '使用中', + 'all' => '全部', + 'root_admin' => ':role 擁有所有權限。', + 'root_admin_delete' => '無法刪除主管理員', + 'users' => '使用者', + 'nodes' => '節點', + 'nodes_hint' => '留空以允許存取所有節點。', +]; diff --git a/lang/zh_TW/admin/server.php b/lang/zh_TW/admin/server.php new file mode 100644 index 0000000000..f4eb11aa36 --- /dev/null +++ b/lang/zh_TW/admin/server.php @@ -0,0 +1,150 @@ + '伺服器', + 'model_label' => '伺服器', + 'model_label_plural' => '伺服器', + 'no_servers' => '沒有伺服器', + 'create' => '建立伺服器', + 'next_step' => '下一步', + 'ip_address' => 'IP 位址', + 'ip_address_helper' => '請直接使用您的外部 IP,除非你正在進行 port 轉發。', + 'port' => '連接埠', + 'ports' => '連接埠', + 'alias' => '別名', + 'alias_helper' => '可選的顯示名稱幫助你記住這些是什麼。', + 'locked' => '鎖定?', + 'locked_helper' => '使用者將無法刪除鎖定的網路分配', + 'lock' => '鎖定', + 'unlock' => '解除鎖定', + 'name' => '名稱', + 'external_id' => '外部 ID', + 'owner' => '擁有者', + 'description' => '敘述', + 'install_script' => '執行安裝腳本?', + 'start_after' => '安裝後啟動嗎?', + 'yes' => '是', + 'no' => '否', + 'skip' => '跳過', + 'primary' => '主要', + 'already_primary' => '已經是主要的', + 'make_primary' => '設為主要', + 'startup_cmd' => '啟動指令', + 'startup_name' => '啟動名稱', + 'default_startup' => '預設啟動指令', + 'startup_placeholder' => '輸入自定義啟動指令', + 'variables' => '變數', + 'resource_limits' => '資源限制', + 'cpu' => 'CPU', + 'cpu_limit' => 'CPU 限制', + 'cpu_helper' => '每 100% 即為一個 CPU 線程。', + 'unlimited' => '無限制', + 'limited' => '上限', + 'enabled' => '已啟用', + 'disabled' => '已停用', + 'memory' => '記憶體', + 'memory_limit' => '記憶體限制', + 'memory_helper' => 'Wings 在建立容器時會在這個值的基礎上額外增加一些記憶體,以確保容器在使用最大記憶體時不會因資源不足而出現問題。', + 'disk' => '磁碟空間', + 'disk_limit' => '磁碟空間限制', + 'advanced_limits' => '高級限制', + 'cpu_pin' => 'CPU 固定', + 'threads' => '執行緒固定', + 'pin_help' => '添加固定執行緒,例如 0 或是 2-4', + 'swap' => 'Swap 記憶體', + 'swap_limit' => 'Swap 記憶體限制', + 'oom' => 'OOM Killer', + 'feature_limits' => '功能限制', + 'docker_settings' => 'Docker 設定', + 'docker_image' => 'Docker 映像', + 'image_name' => '映像名稱', + 'primary_allocation' => '主要網路分配', + 'image' => '映像', + 'image_placeholder' => '輸入一個自定義映像', + 'container_labels' => '容器標籤', + 'title' => '標題', + 'actions' => '動作', + 'console' => '控制台', + 'suspend' => '停用', + 'unsuspend' => '解除停用', + 'reinstall' => '重新安裝', + 'reinstall_help' => '這將會透過 egg 安裝腳本重新安裝伺服器。', + 'reinstall_modal_heading' => '您確定要重新安裝這個伺服器嗎?', + 'reinstall_modal_description' => '!! 這可能導致無法恢復的資料遺失 !!', + 'server_status' => '伺服器狀態', + 'view_install_log' => '查看安裝日誌', + 'uuid' => 'UUID', + 'node' => '節點', + 'short_uuid' => '短 UUID', + 'toggle_install' => '切換安裝狀態', + 'toggle_install_help' => '如果您需要將安裝狀態從已卸載更改為已安裝,反之亦然,您可以使用此按鈕執行此操作。', + 'toggle_install_failed_header' => '伺服器處於失敗狀態', + 'toggle_install_failed_desc' => '您要重新安裝伺服器來修復此問題嗎?', + 'transfer' => '轉移', + 'transfer_help' => '將此伺服器轉移到連接到此面板的另一個節點。
警告! 此功能仍處於實驗階段。建議您先手動製作備份,以避免資料遺失!', + 'condition' => '狀態', + 'suspend_all' => '停用所有伺服器', + 'unsuspend_all' => '解除停用所有伺服器', + 'select_allocation' => '選擇網路分配', + 'new_allocation' => '建立新網路分配', + 'additional_allocations' => '額外網路分配', + 'select_additional' => '選擇網路分配', + 'no_variables' => '選擇的 egg 沒有變數!', + 'select_egg' => '選擇一個 egg 來顯示其變數!', + 'allocations' => '網路分配', + 'databases' => '資料庫', + 'no_databases' => '此伺服器沒有任何資料庫', + 'delete_db' => '您確定要刪除 :name 嗎?', + 'delete_db_heading' => '刪除資料庫?', + 'backups' => '備份', + 'egg' => 'Egg', + 'mounts' => 'Mounts', + 'no_mounts' => '此節點沒有 Mounts', + 'create_database' => '建立資料庫', + 'no_db_hosts' => '沒有資料庫主機', + 'failed_to_create' => '建立資料庫失敗', + 'change_egg' => '更換 Egg', + 'new_egg' => '新 Egg', + 'keep_old_variables' => '盡可能保留舊變數?', + 'create_allocation' => '建立網路分配', + 'add_allocation' => '新增網路分配', + 'view' => '檢視', + 'no_log' => '沒有日誌', + 'tabs' => [ + 'information' => '資訊', + 'egg_configuration' => 'Egg 設定', + 'environment_configuration' => '環境配置', + ], + 'notifications' => [ + 'server_suspension' => '伺服器暫停', + 'server_suspended' => '伺服器已被暫停', + 'server_already_suspended' => '伺服器已被停用!', + 'server_suspend_help' => '這將暫停伺服器,停止任何運行的進程,並立即阻止使用者訪問其檔案或以其他方式通過面板或 API 管理伺服器。', + 'server_unsuspend_help' => '這將取消暫停伺服器並恢復正常的使用者存取。', + 'server_unsuspended' => '伺服器已被取消暫停', + 'error_server_delete' => '伺服器無法安全刪除。', + 'error_server_delete_body' => '您可以強制刪除它。', + 'create_failed' => '無法建立伺服器', + 'invalid_port_range' => '無效的連接阜範圍', + 'invalid_port_range_body' => '您的連接阜範圍不是有效的整數::port', + 'too_many_ports' => '一次開啟太多連接埠!', + 'too_many_ports_body' => '目前的限制是一次最多 :limit 個連接埠。', + 'invalid_port' => '連接埠不在有效範圍內', + 'invalid_port_body' => ':i 不在有效的連接埠範圍內 :portFloor-:portCeil', + 'already_exists' => '連接埠已在使用中', + 'already_exists_body' => ':i 已經被分配了', + 'error_connecting' => '連接到 :node 時出錯', + 'error_connecting_description' => '該配置無法在 Wings 上自動同步,您將需要手動重新啟動伺服器。', + 'install_toggled' => '安裝狀態已切換', + 'install_toggle_failed' => '無法切換安裝狀態', + 'reinstall_started' => '重新安裝已啟動', + 'reinstall_failed' => '無法開始重新安裝', + 'log_failed' => '無法連接到 Wings 來檢索伺服器安裝日誌。', + 'transfer_started' => '轉移開始', + 'transfer_failed' => '轉移失敗', + 'already_transfering' => '伺服器正在轉移中', + ], + 'notes' => '備註', + 'no_notes' => '沒有備註', + 'none' => '無', +]; diff --git a/lang/zh_TW/admin/setting.php b/lang/zh_TW/admin/setting.php new file mode 100644 index 0000000000..8fcedbeeb1 --- /dev/null +++ b/lang/zh_TW/admin/setting.php @@ -0,0 +1,157 @@ + '設定', + 'save_success' => '設定已儲存', + 'save_failed' => '設定儲存失敗', + 'navigation' => [ + 'general' => '一般', + 'captcha' => 'Captcha', + 'mail' => '郵件', + 'backup' => '備份', + 'oauth' => 'OAuth', + 'misc' => '其他設定', + ], + 'general' => [ + 'app_name' => '面板名稱', + 'app_logo' => '面板 Logo', + 'app_logo_help' => '標誌應放置在位於根目錄的 public 資料夾中。保留空白以使用面板名稱代替。', + 'app_favicon' => '面板網站圖示', + 'app_favicon_help' => '網站圖示應放置在位於根目錄的 public 資料夾中。', + 'debug_mode' => '偵錯模式', + 'navigation' => '導覽列', + 'default_navigation' => '預設導覽列類型', + 'sidebar' => '側邊欄', + 'topbar' => '頂部欄', + 'mixed' => '混合', + 'unit_prefix' => '單位前綴', + 'decimal_prefix' => '十進制前綴 (MB/GB)', + 'binary_prefix' => '二進制前綴 (MiB/GiB)', + '2fa_requirement' => '兩部驗證要求', + 'not_required' => '不需要', + 'admins_only' => '僅管理員需要', + 'all_users' => '所有使用者都需要', + 'trusted_proxies' => '受信任的代理', + 'trusted_proxies_help' => '新增 IP 或 IP 範圍', + 'clear' => '清除', + 'set_to_cf' => '設定為 Cloudflare IP', + 'display_width' => '顯示寬度', + 'avatar_provider' => '頭像提供者', + 'uploadable_avatars' => '允許使用者上傳自己的頭像?', + ], + 'captcha' => [ + 'enable' => '啟用', + 'disable' => '停用', + 'info_label' => '資訊', + 'info' => '您可以在您的 Cloudflare Dashboard上產生金鑰。需要 Cloudflare 帳號。', + 'site_key' => '網站金鑰', + 'secret_key' => '密鑰', + 'verify' => '驗證網域?', + ], + 'mail' => [ + 'mail_driver' => '郵件驅動程式', + 'test_mail' => '發送測試郵件', + 'test_mail_sent' => '測試郵件已發送', + 'test_mail_failed' => '測試郵件發送失敗', + 'from_settings' => '寄件人設定', + 'from_settings_help' => '設定在郵件中用作「寄件人」的地址和名稱。', + 'from_address' => '寄件者地址', + 'from_name' => '寄件人名稱', + 'smtp' => [ + 'smtp_title' => 'SMTP 設定', + 'host' => '主機', + 'port' => '連接埠', + 'username' => '使用者名稱', + 'password' => '密碼', + 'scheme' => '模式', + ], + 'mailgun' => [ + 'mailgun_title' => 'Mailgun 設定', + 'domain' => '網域', + 'secret' => '秘密', + 'endpoint' => '端點', + ], + ], + 'backup' => [ + 'backup_driver' => '備份方式', + 'throttle' => '限流', + 'throttle_help' => '設定在一定期間內可以建立多少個備份。將期間設定為 0 可停用此限流。', + 'limit' => '限制', + 'period' => '期間', + 'seconds' => '秒', + 's3' => [ + 's3_title' => 'S3 設定', + 'default_region' => '預設地區', + 'access_key' => '存取金鑰 ID', + 'secret_key' => '秘密存取金鑰', + 'bucket' => '儲存桶', + 'endpoint' => '端點', + 'use_path_style_endpoint' => '使用路徑式端點', + ], + ], + 'oauth' => [ + 'enable' => '啟用', + 'enable_schema' => '啟用 :schema', + 'disable' => '停用', + 'client_id' => '客戶端 ID', + 'client_secret' => '客戶端金鑰', + 'redirect' => '重導向網址', + 'web_api_key' => 'Web API 金鑰', + 'base_url' => 'Base URL', + 'display_name' => '顯示名稱', + 'auth_url' => '授權回呼 URL', + 'create_missing_users' => '自動建立缺失的使用者?', + 'link_missing_users' => '自動連結缺失的使用者?', + ], + 'misc' => [ + 'auto_allocation' => [ + 'title' => '自動網路分配建立', + 'helper' => '切換是否使用者可以通過客戶區域建立網路分配。', + 'question' => '允許使用者建立網路分配?', + 'create_new' => '自動建立新的網路分配?', + 'create_new_help' => '啟用時,會建立新的網路分配。停用時,僅從現有的可用網路分配中指派。無論選擇何者都會考慮下方的連接埠範圍。', + 'start' => '起始連接阜', + 'end' => '結束連接阜', + ], + 'mail_notifications' => [ + 'title' => '郵件通知', + 'helper' => '切換哪些郵件通知應該被傳給使用者。', + 'server_installed' => '伺服器已安裝完成', + 'server_reinstalled' => '伺服器已重新安裝完成', + ], + 'connections' => [ + 'title' => '連接', + 'helper' => '發送請求時使用的逾時設定。', + 'request_timeout' => '請求逾時', + 'connection_timeout' => '連線逾時', + 'seconds' => '秒', + ], + 'activity_log' => [ + 'title' => '活動記錄', + 'helper' => '設定舊活動日誌的清理頻率,以及是否記錄管理員操作。', + 'prune_age' => '清理期限', + 'days' => '天', + 'log_admin' => '隱藏管理員活動?', + ], + 'api' => [ + 'title' => 'API', + 'helper' => '定義每分鐘可執行的請求數量的上限。', + 'client_rate' => '客戶端 API 速率上限', + 'app_rate' => '應用程式 API 速率上限', + 'rpm' => '每分鐘請求數', + ], + 'server' => [ + 'title' => '伺服器', + 'helper' => '伺服器設定', + 'edit_server_desc' => '允許使用者編輯描述?', + 'console_font_upload' => '上傳控制台字體', + 'console_font_hint' => '只支持 *.ttf 字體。強力建議使用等寬字體!', + ], + 'webhook' => [ + 'title' => 'Webhooks', + 'helper' => '設定舊 Webhook 日誌的清理頻率。', + 'prune_age' => '清理時間', + 'days' => '天', + ], + ], +]; diff --git a/lang/zh_TW/admin/webhook.php b/lang/zh_TW/admin/webhook.php new file mode 100644 index 0000000000..9c90a99ed3 --- /dev/null +++ b/lang/zh_TW/admin/webhook.php @@ -0,0 +1,63 @@ + 'Webhooks', + 'model_label' => 'Webhook', + 'model_label_plural' => 'Webhooks', + 'endpoint' => '端點', + 'description' => '敘述', + 'no_webhooks' => '沒有 Webhooks', + 'help' => '幫助', + 'help_text' => '你必須要將變數使用 {{ }} 包起來,例如如果你想要取得 API 名稱則可以使用 {{name}}', + 'test_now' => '立即測試', + 'test_now_help' => '這將會觸發一個 `created: Server` 事件', + 'table' => [ + 'description' => '描述', + 'endpoint' => '端點', + ], + 'headers' => '標頭', + 'events' => '事件', + 'regular' => '常規', + 'reset_headers' => '重設表頭', + 'discord' => 'Discord', + 'discord_message' => [ + 'profile' => 'Profile', + 'message' => '訊息', + 'username' => '使用者名稱', + 'avatar_url' => '頭像網址', + 'forum_thread' => '討論串名稱', + 'supress_embeds' => '隱藏 Embeds', + 'supress_embeds_text' => '序列化此訊息時不包括任何 Embeds', + 'supress_notifications' => '不傳送通知', + 'supress_notifications_text' => '此訊息不會觸發推播和桌面通知', + ], + 'discord_embed' => [ + 'add_embed' => '新增 Embed', + 'flags' => '功能', + 'thumbnail' => '縮圖網址', + 'embeds' => 'Embeds', + 'thread_name' => '討論串名稱', + 'allowed_mentions' => '允許提及', + 'roles' => '身分組', + 'users' => '使用者', + 'everyone' => '@everyone & @here', + 'author' => '作者', + 'author_url' => '作者網址', + 'author_icon_url' => '作者圖標網址', + 'body' => '內文', + 'title' => '標題', + 'color' => 'Embed 顏色', + 'url' => '網址', + 'images' => '圖片', + 'image_url' => '圖片網址', + 'image_thumbnail' => '縮圖網址', + 'footer' => '頁腳', + 'has_timestamp' => '具有時間戳', + 'footer_icon_url' => '頁腳圖標網址', + 'add_field' => '新增欄位', + 'fields' => '欄位', + 'field_name' => '欄位名稱', + 'field_value' => '欄位內容', + 'inline_field' => '行內欄位', + ], +]; diff --git a/lang/zh_TW/auth.php b/lang/zh_TW/auth.php new file mode 100644 index 0000000000..c3b8e27c37 --- /dev/null +++ b/lang/zh_TW/auth.php @@ -0,0 +1,24 @@ + '帳號或密碼不正確。', + 'failed-two-factor' => '雙重驗證碼不正確', + 'two-factor-code' => '雙重驗證碼', + 'two-factor-hint' => '如果你無法存取裝置,可以使用備用驗證碼。', + 'password' => '密碼不正確。', + 'throttle' => '嘗試登入次數過多,請在 :seconds 秒後再試。', + '2fa_must_be_enabled' => '管理員已要求你的帳號必須啟用雙重驗證,才能使用控制面板。', + +]; diff --git a/lang/zh_TW/command/messages.php b/lang/zh_TW/command/messages.php new file mode 100644 index 0000000000..5a68c06159 --- /dev/null +++ b/lang/zh_TW/command/messages.php @@ -0,0 +1,54 @@ + [ + 'search_users' => '輸入使用者名稱、使用者 ID 或電子郵件地址', + 'select_search_user' => '要刪除的使用者 ID(輸入 \'0\' 可重新搜尋)', + 'deleted' => '已成功刪除使用者。', + 'confirm_delete' => '你確定要從控制面板中刪除這位使用者嗎?', + 'no_users_found' => '找不到符合搜尋條件的使用者。', + 'multiple_found' => '找到多個符合的帳號,因為使用了 --no-interaction 參數,無法進行刪除。', + 'ask_admin' => '此使用者是否為管理員?', + 'ask_email' => '電子郵件地址', + 'ask_username' => '使用者名稱', + 'ask_password' => '密碼', + 'ask_password_tip' => '如果你想建立一個帳號並讓系統隨機產生密碼後寄送給使用者,請重新運行此指令(按 CTRL+C)並加上 --no-password 參數。', + 'ask_password_help' => '密碼必須至少 8 個字元,並包含至少一個大寫字母和一個數字。', + '2fa_help_text' => '此指令將會停用使用者帳號的雙重驗證。僅建議在使用者無法存取帳號時,作為帳號復原用途使用。如果這不是您想要執行的操作,請按 CTRL+C 退出此程序。', + '2fa_disabled' => '已停用 :email 的雙重驗證功能。', + ], + 'schedule' => [ + 'output_line' => '正在為 :schedule(:id)中的第一個任務排程作業。', + ], + 'maintenance' => [ + 'deleting_service_backup' => '正在刪除服務備份檔案 :file。', + ], + 'server' => [ + 'rebuild_failed' => '對 ":name"(#:id)執行重新建構請求時,在節點 ":node" 發生錯誤::message。', + 'reinstall' => [ + 'failed' => '對 ":name"(#:id)執行重新安裝請求時,在節點 ":node" 發生錯誤::message。', + 'confirm' => '你即將對一組伺服器執行重新安裝操作,是否確定繼續?', + ], + 'power' => [ + 'confirm' => '你即將對 :count 台伺服器執行 :action 操作,確定要繼續嗎?', + 'action_failed' => '對 \':name\'(#:id)執行電源操作請求時,在節點 \':node\' 發生錯誤::message。', + ], + ], + 'environment' => [ + 'mail' => [ + 'ask_smtp_host' => 'SMTP 主機(例如:smtp.gmail.com)', + 'ask_smtp_port' => 'SMTP 端口', + 'ask_smtp_username' => 'SMTP 使用者名稱', + 'ask_smtp_password' => 'SMTP 密碼', + 'ask_mailgun_domain' => 'Mailgun 域名', + 'ask_mailgun_endpoint' => 'Mailgun API 端點網址', + 'ask_mailgun_secret' => 'Mailgun 密鑰', + 'ask_mandrill_secret' => 'Mandrill 密鑰', + 'ask_postmark_username' => 'Postmark API 密鑰', + 'ask_driver' => '要使用哪一種郵件傳送方式?', + 'ask_mail_from' => '寄件者電子郵件', + 'ask_mail_name' => '寄件人名稱', + 'ask_encryption' => '加密方式', + ], + ], +]; diff --git a/lang/zh_TW/commands.php b/lang/zh_TW/commands.php new file mode 100644 index 0000000000..4f289736c2 --- /dev/null +++ b/lang/zh_TW/commands.php @@ -0,0 +1,60 @@ + [ + 'comment' => [ + 'author' => '請提供此面板匯出 Eggs 時所使用的寄件人電子郵件。這必須是一個有效的電子郵件。', + 'url' => '應用程式網址必須以 https:// 或 http:// 開頭,依照你是否使用 SSL 而定。如果未包含這個開頭,郵件與其他內容中的連結將會導向錯誤的位置。', + 'timezone' => '時區應符合 PHP 支援的時區格式。如不確定,請參考:https://php.net/manual/en/timezones.php。', + ], + 'redis' => [ + 'note' => '「你已為一個或多個選項選擇使用 Redis ,請在下方提供有效的連線資訊。大多數情況下,除非你有自行修改設定,否則可使用預設值。', + 'comment' => '預設情況下,Redis 伺服器執行於本機,無法從外部存取,使用者名稱為 default,且沒有密碼。如果你的情況也是如此,請直接按 Enter 鍵,不需輸入任何值。', + 'confirm' => '看起來 Redis 已經定義了 :field,你想要變更它嗎?', + ], + ], + 'database_settings' => [ + 'DB_HOST_note' => '強烈建議不要將資料庫主機設定為 \'localhost\',因為這常會導致 Socket 連線問題。如果你要使用本機連線,應改用 "127.0.0.1"。', + 'DB_USERNAME_note' => '使用 root 帳號連接 MySQL 是極度不建議的做法,且本應用程式也不允許這麼做。你必須為此面板專門建立一個 MySQL 使用者帳號。', + 'DB_PASSWORD_note' => '你似乎已經設定了 MySQL 連線密碼,是否要變更它?', + 'DB_error_2' => '你的連線憑證尚未儲存。請先提供有效的連線資訊才能繼續。', + 'go_back' => '返回並重試', + ], + 'make_node' => [ + 'name' => '輸入一個簡短的識別名稱,用於區分此節點與其他節點', + 'description' => '輸入一段描述,用來辨識此節點', + 'scheme' => '請輸入 https 以使用 SSL,或輸入 http 以不使用 SSL', + 'fqdn' => '請輸入用來連接守護程式的網域名稱(例如:node.example.com)。若此節點未使用 SSL,也可以使用 IP 位址。', + 'public' => '此節點是否應設為公開?請注意,若設為私有,將無法自動部署至此節點。', + 'behind_proxy' => '你的 FQDN 是否在代理伺服器後運作?', + 'maintenance_mode' => '是否啟用維護模式?', + 'memory' => '輸入可用的最大記憶體容量', + 'memory_overallocate' => '輸入要超額分配的記憶體大小百分比。若要停用超額分配檢查,請輸入 -1;若輸入 0,則當可能超出此節點的記憶體總上限時,將會阻止建立新伺服器。', + 'disk' => '輸入可用的最大磁碟空間容量', + 'disk_overallocate' => '輸入要超額分配的磁碟空間容量百分比。若要停用超額分配檢查,請輸入 -1;若輸入 0,則當可能超出此節點的磁碟空間總上限時,將會阻止建立新伺服器。', + 'cpu' => '輸入可用的最大cpu使用率', + 'cpu_overallocate' => '輸入要超額分配的cpu使用率百分比。若要停用超額分配檢查,請輸入 -1;若輸入 0,則當可能超出此節點的cpu使用率總上限時,將會阻止建立新伺服器。', + 'upload_size' => '輸入最大上傳檔案大小', + 'daemonListen' => '輸入守護程式監聽的連接埠', + 'daemonConnect' => '輸入守護進程連接阜(可與監聽連接阜相同)', + 'daemonSFTP' => '輸入守護程式 SFTP 監聽的連接埠', + 'daemonSFTPAlias' => '輸入守護程式 SFTP 別名(可留空)', + 'daemonBase' => '輸入根資料夾', + 'success' => '成功建立名稱為 :name、ID 為 :id 的新節點', + ], + 'node_config' => [ + 'error_not_exist' => '所選的節點不存在。', + 'error_invalid_format' => '指定的格式無效。有效的選項為 yaml 和 json。', + ], + 'key_generate' => [ + 'error_already_exist' => '你已設定應用程式加密金鑰。繼續此流程將會覆寫該金鑰,並導致現有加密資料損毀。除非你完全了解後果,否則請勿繼續。', + 'understand' => '我了解執行此指令的後果,並願意承擔所有因加密資料遺失所產生的責任。', + 'continue' => '你確定要繼續嗎?更改應用程式加密金鑰將會導致資料遺失。', + ], + 'schedule' => [ + 'process' => [ + 'no_tasks' => '目前沒有需要執行的伺服器排程任務。', + 'error_message' => '處理排程時發生錯誤: ', + ], + ], +]; diff --git a/lang/zh_TW/exceptions.php b/lang/zh_TW/exceptions.php new file mode 100644 index 0000000000..d4412f8688 --- /dev/null +++ b/lang/zh_TW/exceptions.php @@ -0,0 +1,64 @@ + '嘗試與守護程式通訊時發生意外情況,導致 HTTP/:code 回應碼。此意外已被記錄。', + 'node' => [ + 'servers_attached' => '節點必須沒有連結任何伺服器才能刪除。', + 'error_connecting' => '連接到節點 :node 時發生錯誤', + 'daemon_off_config_updated' => '守護程式設定已更新,但嘗試自動更新守護程式上的設定檔時發生錯誤。你需要手動更新守護程式的設定檔(config.yml)以套用這些變更。', + ], + 'allocations' => [ + 'server_using' => '此配置目前已指派給伺服器。只有在沒有伺服器指派時,才能刪除配置。', + 'too_many_ports' => '不支援一次性在單一範圍內新增超過 1000 個連接埠。', + 'invalid_mapping' => '提供的 :port 映射無效,無法處理。', + 'cidr_out_of_range' => 'CIDR 表示法僅允許遮罩在 /25 到 /32 之間。', + 'port_out_of_range' => '配置中的連接埠必須大於或等於 1024,且小於或等於 65535。', + ], + 'egg' => [ + 'delete_has_servers' => '已使用在活躍伺服器的 Egg 無法從面板刪除。', + 'invalid_copy_id' => '選擇用來複製腳本的 Egg 不存在,或該 Egg 本身正在複製腳本。', + 'has_children' => '此 Egg 是一個或多個其他 Egg 的父項。請先刪除那些 Egg,才能刪除此 Egg。', + ], + 'variables' => [ + 'env_not_unique' => '環境變數 :name 在此 Egg 中必須是唯一的。', + 'reserved_name' => '環境變數 :name 受到保護,無法被指派為變數。', + 'bad_validation_rule' => '驗證規則「:rule」並非本應用程式有效的規則。', + ], + 'importer' => [ + 'json_error' => '嘗試解析 JSON 檔案時發生錯誤::error。', + 'file_error' => '提供的 JSON 檔案無效。', + 'invalid_json_provided' => '提供的 JSON 檔案格式無法被識別。', + ], + 'subusers' => [ + 'editing_self' => '不允許編輯自己的子使用者帳號。', + 'user_is_owner' => '無法將伺服器擁有者新增為該伺服器的子使用者。', + 'subuser_exists' => '已有使用該電子郵件地址的使用者被指派為此伺服器的子使用者。', + ], + 'databases' => [ + 'delete_has_databases' => '無法刪除仍有連結活躍資料庫的資料庫主機。', + ], + 'tasks' => [ + 'chain_interval_too_long' => '鏈式任務的最大間隔時間為 15 分鐘。', + ], + 'locations' => [ + 'has_nodes' => '無法刪除仍有活躍節點連結的地點。', + ], + 'users' => [ + 'is_self' => '無法刪除自己的使用者帳號。', + 'has_servers' => '無法刪除擁有活躍伺服器的使用者帳號。請先刪除其伺服器後再繼續。', + 'node_revocation_failed' => '撤銷 節點 #:node 上的金鑰失敗。錯誤訊息::error', + ], + 'deployment' => [ + 'no_viable_nodes' => '找不到符合自動部署要求的節點。', + 'no_viable_allocations' => '找不到符合自動部署需求的配置。', + ], + 'api' => [ + 'resource_not_found' => '請求的資源在此伺服器上不存在。', + ], + 'mount' => [ + 'servers_attached' => '掛載點必須沒有連結任何伺服器才能刪除。', + ], + 'server' => [ + 'marked_as_failed' => '此伺服器尚未完成安裝程序,請稍後再試。', + ], +]; diff --git a/lang/zh_TW/notifications.php b/lang/zh_TW/notifications.php new file mode 100644 index 0000000000..6fd880451b --- /dev/null +++ b/lang/zh_TW/notifications.php @@ -0,0 +1,18 @@ + '開啟伺服器', + 'installation_completed' => '服务器安装完成', + 'installation_failed' => '伺服器安裝失敗', + 'reinstallation_completed' => '伺服器重新安裝完成', + 'reinstallation_failed' => '伺服器重新安裝失敗', + 'failed' => '失敗', + 'user_added' => [ + 'title' => '已添加到伺服器', + 'body' => '你已被新增為 :server 子用戶', + ], + 'user_removed' => [ + 'title' => '已從伺服器移除', + 'body' => '你已被從 :server 子用戶移除', + ], +]; diff --git a/lang/zh_TW/profile.php b/lang/zh_TW/profile.php new file mode 100644 index 0000000000..1d2ca15be1 --- /dev/null +++ b/lang/zh_TW/profile.php @@ -0,0 +1,70 @@ + '個人資料', + 'tabs' => [ + 'account' => '帳號', + 'oauth' => 'OAuth 驗證', + 'activity' => '活動', + 'api_keys' => 'API 金鑰', + 'ssh_keys' => 'SSH 金鑰', + 'keys' => '金鑰', + '2fa' => '雙重驗證', + 'customization' => '個人化', + ], + 'username' => '使用者名稱', + 'admin' => '管理員', + 'exit_admin' => '退出管理員身分', + 'server_list' => '伺服器列表', + 'email' => '電子郵件', + 'password' => '密碼', + 'current_password' => '目前密碼', + 'password_confirmation' => '確認密碼', + 'timezone' => '時區', + 'language' => '語言', + 'language_help' => '你的語言 :state 尚未完成翻譯!', + 'link' => '連結 ', + 'unlink' => '解除連結 ', + 'unlinked' => '已解除連結 :name', + 'scan_qr' => '掃描 QR Code', + 'code' => '驗證碼', + 'setup_key' => '設定金鑰', + 'invalid_code' => '無效的雙重驗證碼', + 'code_help' => '請使用你的雙重驗證 App 掃描上方 QR 碼,然後輸入產生的驗證碼。', + '2fa_enabled' => '雙重驗證目前已啟用!', + 'backup_help' => '這些將不會再顯示第二次!', + 'backup_codes' => '備用碼', + 'disable_2fa' => '停用雙重驗證', + 'disable_2fa_help' => '輸入你目前的雙重驗證碼以停用雙重驗證', + 'api_keys' => 'API 金鑰', + 'create_api_key' => '建立 API 金鑰', + 'api_key_created' => '已創建 API 金鑰', + 'description' => '敘述', + 'allowed_ips' => '允許的IP', + 'allowed_ips_help' => '按 Enter 鍵新增新的 IP 位址,或留空以允許所有 IP 位址', + 'ssh_keys' => 'SSH 金鑰', + 'create_ssh_key' => '建立 SSH 金鑰', + 'ssh_key_created' => '已創建 SSH 金鑰', + 'name' => '名稱', + 'public_key' => '公鑰', + 'could_not_create_ssh_key' => '無法建立 SSH 金鑰', + 'dashboard' => '儀表板', + 'dashboard_layout' => '控制面板佈局', + 'console' => '控制台', + 'grid' => '網格', + 'table' => '表格', + 'rows' => '行', + 'font_size' => '字體大小', + 'font' => '字體', + 'font_preview' => '字體預覽', + 'seconds' => '秒', + 'graph_period' => '圖形週期', + 'graph_period_helper' => '控制台圖表上顯示的資料點數(以秒為單位)。', + 'navigation' => '導航類別', + 'sidebar' => '側邊欄', + 'topbar' => '頂部工具列', + 'mixed' => '混合', + 'no_oauth' => '沒有已連接的帳號', + 'no_api_keys' => '沒有 API 金鑰', + 'no_ssh_keys' => '沒有 SSH 金鑰', +]; diff --git a/lang/zh_TW/search.php b/lang/zh_TW/search.php new file mode 100644 index 0000000000..fbdcbf3db6 --- /dev/null +++ b/lang/zh_TW/search.php @@ -0,0 +1,9 @@ + '請至少輸入三個字以開始搜尋。', + 'term' => [ + 'label' => '搜尋字詞', + 'description' => '輸入伺服器名稱、UUID 或 allocation 以開始搜尋。', + ], +]; diff --git a/lang/zh_TW/server/activity.php b/lang/zh_TW/server/activity.php new file mode 100644 index 0000000000..d67c2795dc --- /dev/null +++ b/lang/zh_TW/server/activity.php @@ -0,0 +1,11 @@ + '活動', + 'event' => '事件', + 'user' => '使用者', + 'deleted_user' => '已刪除的使用者', + 'system' => '系統', + 'timestamp' => '時間', + 'metadata' => '原始資料', +]; diff --git a/lang/zh_TW/server/backup.php b/lang/zh_TW/server/backup.php new file mode 100644 index 0000000000..2d25b6e223 --- /dev/null +++ b/lang/zh_TW/server/backup.php @@ -0,0 +1,55 @@ + '備份', + 'empty' => '沒有備份', + 'size' => '大小', + 'created_at' => '建立時間', + 'status' => '狀態', + 'is_locked' => '鎖定狀態', + 'backup_status' => [ + 'in_progress' => '進行中', + 'successful' => '成功', + 'failed' => '失敗', + ], + 'actions' => [ + 'create' => [ + 'title' => '建立備份', + 'limit' => '已達備份上限', + 'created' => '已建立 :name', + 'notification_success' => '備份建立成功', + 'notification_fail' => '備份建立失敗', + 'name' => '名稱', + 'ignored' => '已忽略的檔案與目錄', + 'locked' => '是否鎖定?', + 'lock_helper' => '在手動解除鎖定前,將防止此備份被刪除。', + ], + 'lock' => [ + 'lock' => '鎖定', + 'unlock' => '解除鎖定', + ], + 'download' => '下載', + 'rename' => [ + 'title' => '重新命名', + 'new_name' => '備份名稱', + 'notification_success' => '備份重新命名成功', + ], + 'restore' => [ + 'title' => '還原', + 'helper' => '伺服器將會停止,在此流程完成之前,你將無法控制電源狀態、存取檔案管理器或建立其他備份。', + 'delete_all' => '在還原備份前要刪除所有檔案嗎?', + 'notification_started' => '正在還原備份', + 'notification_success' => '備份還原成功', + 'notification_fail' => '備份還原失敗', + 'notification_fail_body_1' => '此伺服器目前的狀態不允許還原備份。', + 'notification_fail_body_2' => '目前無法還原此備份:尚未完成或已失敗。', + ], + 'delete' => [ + 'title' => '刪除備份', + 'description' => '確定要刪除 :backup 嗎?', + 'notification_success' => '備份已刪除', + 'notification_fail' => '無法刪除備份', + 'notification_fail_body' => '無法連線到節點,請再試一次。', + ], + ], +]; diff --git a/lang/zh_TW/server/console.php b/lang/zh_TW/server/console.php new file mode 100644 index 0000000000..5b5d9cf4ad --- /dev/null +++ b/lang/zh_TW/server/console.php @@ -0,0 +1,43 @@ + '控制台', + 'command' => '輸入指令…', + 'command_blocked' => '伺服器離線...', + 'command_blocked_title' => '伺服器離線時無法發送指令', + 'open_in_admin' => '在管理頁面開啟', + 'power_actions' => [ + 'start' => '啟動', + 'stop' => '關閉', + 'restart' => '重新啟動', + 'kill' => '強制停止', + 'kill_tooltip' => '這可能導致資料損壞和/或資料遺失!', + ], + 'labels' => [ + 'cpu' => 'CPU', + 'memory' => '記憶體', + 'network' => '網路', + 'disk' => '儲存空間', + 'name' => '名稱', + 'status' => '狀態', + 'address' => '位址', + 'unavailable' => '無法取得', + ], + 'status' => [ + 'created' => '已建立', + 'starting' => '啟動中', + 'running' => '運行中', + 'restarting' => '正在重啟', + 'exited' => '已退出', + 'paused' => '已暫停', + 'dead' => '死亡', + 'removing' => '移除中', + 'stopping' => '停止中', + 'offline' => '離線', + 'missing' => '遺失', + ], + 'websocket_error' => [ + 'title' => '無法連線到 WebSocket!', + 'body' => '請查看瀏覽器控制台以獲取更多詳細資訊。', + ], +]; diff --git a/lang/zh_TW/server/dashboard.php b/lang/zh_TW/server/dashboard.php new file mode 100644 index 0000000000..54f428c3e9 --- /dev/null +++ b/lang/zh_TW/server/dashboard.php @@ -0,0 +1,28 @@ + '伺服器', + 'list' => '伺服器列表', + 'tabs' => [ + 'my' => '我的伺服器', + 'other' => '其他人的伺服器', + 'all' => '所有伺服器', + ], + 'empty_own' => '你沒有任何伺服器!', + 'empty_other' => '您沒有存取任何伺服器的權限!', + + 'status' => '狀態', + 'server' => '伺服器', + 'resources' => '資源', + 'usage_limit' => '使用限制::resource', + + 'cpu' => 'CPU', + 'memory' => '記憶體', + 'disk' => '儲存空間', + 'network' => '網路', + 'none' => '無', + 'loading' => '載入中...', + + 'power_actions' => '電源動作', + 'power_action_sent' => ':action 已傳送至 :name', +]; diff --git a/lang/zh_TW/server/database.php b/lang/zh_TW/server/database.php new file mode 100644 index 0000000000..a28b38abe6 --- /dev/null +++ b/lang/zh_TW/server/database.php @@ -0,0 +1,26 @@ + '資料庫', + 'empty' => '無資料庫', + 'create_database' => '建立資料庫', + 'limit' => '已達到資料庫上限', + 'viewing' => '正在檢視::database', + 'host' => '主機', + 'database' => '資料庫', + 'username' => '使用者名稱', + 'password' => '密碼', + 'remote' => '遠端', + 'created_at' => '創建於', + 'name' => '資料庫名稱', + 'name_hint' => '此欄位留空會自動產生隨機名稱', + 'connections_from' => '連線來自', + 'max_connections' => '最大連線數', + 'database_host' => '資料庫主機', + 'database_host_select' => '選擇資料庫主機', + 'jdbc' => 'JDBC 連接字串', + 'create_notification' => '已建立 :database', + 'create_notification_fail' => '建立 :database 失敗', + 'delete_notification' => '已刪除 :database', + 'delete_notification_fail' => '刪除 :database 失敗', +]; diff --git a/lang/zh_TW/server/file.php b/lang/zh_TW/server/file.php new file mode 100644 index 0000000000..202a6beaa2 --- /dev/null +++ b/lang/zh_TW/server/file.php @@ -0,0 +1,111 @@ + '檔案', + 'name' => '名稱', + 'size' => '大小', + 'modified_at' => '修改於', + 'actions' => [ + 'open' => '開啟', + 'download' => '下載', + 'copy' => [ + 'title' => '複製', + 'notification' => '檔案複製成功', + ], + 'upload' => [ + 'title' => '上傳', + 'from_files' => '上傳檔案', + 'from_url' => '通過 URL 上傳', + 'url' => '網址', + 'drop_files' => '投下要上傳的檔案', + 'success' => '成功上傳檔案', + 'failed' => '上傳檔案失敗', + 'header' => '正在上傳檔案', + 'error' => '上傳檔案時發生錯誤', + ], + 'rename' => [ + 'title' => '重新命名', + 'file_name' => '檔案名稱', + 'notification' => '已重新命名', + ], + 'move' => [ + 'title' => '移動', + 'directory' => '目錄', + 'directory_hint' => '輸入新目錄,相對於當前目錄。', + 'new_location' => '新的位置', + 'new_location_hint' => '輸入此檔案或資料夾的位置,相對於當前目錄。', + 'notification' => '檔案已移動', + 'bulk_notification' => ':count 個檔案已移至 :directory', + ], + 'permissions' => [ + 'title' => '權限', + 'read' => '讀', + 'write' => '寫', + 'execute' => '執行', + 'owner' => '擁有者', + 'group' => '群組', + 'public' => '公開', + 'notification' => '權限已變更為 :mode', + ], + 'archive' => [ + 'title' => '壓縮檔', + 'archive_name' => '壓縮檔名稱', + 'notification' => '已建立壓縮檔', + 'extension' => '副檔名', + ], + 'unarchive' => [ + 'title' => '解壓縮', + 'notification' => '解除封存完成', + ], + 'new_file' => [ + 'title' => '新檔案', + 'file_name' => '新檔案名稱', + 'syntax' => '語法高亮', + 'create' => '建立', + ], + 'new_folder' => [ + 'title' => '新資料夾', + 'folder_name' => '新資料夾名稱', + ], + 'nested_search' => [ + 'title' => '深度搜尋', + 'search_term' => '搜尋詞', + 'search_term_placeholder' => '輸入搜尋詞,例如:*.txt', + 'search' => '搜尋', + 'search_for_term' => '搜尋 :term', + ], + 'delete' => [ + 'notification' => '檔案已刪除', + 'bulk_notification' => ':count 個檔案已刪除', + ], + 'edit' => [ + 'title' => '編輯::file', + 'save_close' => '儲存並關閉', + 'save' => '儲存', + 'cancel' => '取消', + 'notification' => '檔案已儲存', + ], + ], + 'alerts' => [ + 'file_too_large' => [ + 'title' => ':name 過大!', + 'body' => '最大為 :max', + ], + 'file_not_found' => [ + 'title' => ':name 未找到!', + ], + 'file_not_editable' => [ + 'title' => ':name 是一個目錄', + ], + 'file_already_exists' => [ + 'title' => ':name 已存在!', + ], + 'files_node_error' => [ + 'title' => '無法載入檔案!', + ], + 'pelicanignore' => [ + 'title' => '你正在編輯 .pelicanignore 檔案!', + 'body' => '此處列出的任何檔案或目錄都將從備份中排除。支援使用星號 (*) 作為通配符。
你可以在規則前加上驚嘆號 (!) 來否定之前的規則。', + ], + ], +]; diff --git a/lang/zh_TW/server/network.php b/lang/zh_TW/server/network.php new file mode 100644 index 0000000000..210099cc60 --- /dev/null +++ b/lang/zh_TW/server/network.php @@ -0,0 +1,17 @@ + '網路', + 'add' => '新增配置', + 'limit' => '已達網路分配上限', + 'address' => '地址', + 'port' => '連接埠', + 'notes' => '備註', + 'no_notes' => '沒有備註', + 'make_primary' => '設為主要', + 'primary' => '主要', + 'make' => '建立', + 'delete' => '刪除', + 'locked' => '鎖定?', + 'locked_helper' => '已鎖定的配置只能由管理員刪除', +]; diff --git a/lang/zh_TW/server/schedule.php b/lang/zh_TW/server/schedule.php new file mode 100644 index 0000000000..04072d3893 --- /dev/null +++ b/lang/zh_TW/server/schedule.php @@ -0,0 +1,121 @@ + '排程', + 'new' => '新排程', + 'edit' => '編輯排程', + 'save' => '儲存排程', + 'delete' => '刪除排程', + 'import' => '匯入排程', + 'export' => '匯出排程', + 'name' => '名稱', + 'cron' => 'Cron', + 'status' => '狀態', + 'schedule_status' => [ + 'inactive' => '未啟用', + 'processing' => '處理中', + 'active' => '已啟用', + ], + 'no_tasks' => '沒有工作', + 'run_now' => '立即執行', + 'online_only' => '僅在上線時', + 'last_run' => '上次執行', + 'next_run' => '下次執行', + 'never' => '從不', + 'cancel' => '取消', + + 'only_online' => '僅當伺服器在線時?', + 'only_online_hint' => '僅當伺服器處於執行狀態時才執行此排程。', + 'enabled' => '啟用排程?', + 'enabled_hint' => '啟用時,此排程將自動執行。', + + 'cron_body' => '請記住,下面的 cron 輸入始終假定為 UTC。', + 'cron_timezone' => '你時區中的下次執行 (:timezone)::next_run', + + 'invalid' => '無效', + + 'time' => [ + 'minute' => '分鐘', + 'hour' => '小時', + 'day' => '天', + 'week' => '週', + 'month' => '月', + 'day_of_month' => '月的日期', + 'day_of_week' => '週的日期', + + 'hourly' => '每小時', + 'daily' => '每天', + 'weekly_mon' => '週一', + 'weekly_sun' => '週日', + 'monthly' => '每月', + 'every_min' => '每 x 分鐘', + 'every_hour' => '每 x 小時', + 'every_day' => '每 x 天', + 'every_week' => '每 x 週', + 'every_month' => '每 x 月', + 'every_day_of_week' => '每 x 週的日期', + + 'every' => '每', + 'minutes' => '分鐘', + 'hours' => '小時', + 'days' => '天', + 'months' => '月', + + 'monday' => '星期一', + 'tuesday' => '星期二', + 'wednesday' => '星期三', + 'thursday' => '星期四', + 'friday' => '星期五', + 'saturday' => '星期六', + 'sunday' => '星期日', + ], + + 'tasks' => [ + 'title' => '工作', + 'create' => '建立工作', + 'limit' => '達到工作限制', + 'action' => '動作', + 'payload' => '負載', + 'no_payload' => '無參數', + 'time_offset' => '時間偏移', + 'first_task' => '首個工作', + 'seconds' => '秒', + 'continue_on_failure' => '失敗時繼續', + + 'actions' => [ + 'title' => '動作', + 'power' => [ + 'title' => '發送電源動作', + 'action' => '電源動作', + 'start' => '啟動', + 'stop' => '停止', + 'restart' => '重新啟動', + 'kill' => '強制停止', + ], + 'command' => [ + 'title' => '發送命令', + 'command' => '命令', + ], + 'backup' => [ + 'title' => '建立備份', + 'files_to_ignore' => '要忽略的檔案', + ], + 'delete_files' => [ + 'title' => '刪除檔案', + 'files_to_delete' => '要刪除的檔案', + ], + ], + ], + + 'notification_invalid_cron' => '提供的 cron 資料不符合有效表達式', + + 'import_action' => [ + 'file' => '檔案', + 'url' => '網址', + 'schedule_help' => '應為原始 .json 檔案 (schedule-daily-restart.json)', + 'url_help' => '網址必須直接指向原始 .json 檔案', + 'add_url' => '新網址', + 'import_failed' => '匯入失敗', + 'import_success' => '匯入成功', + ], +]; diff --git a/lang/zh_TW/server/setting.php b/lang/zh_TW/server/setting.php new file mode 100644 index 0000000000..0160f04aa4 --- /dev/null +++ b/lang/zh_TW/server/setting.php @@ -0,0 +1,55 @@ + '設定', + 'server_info' => [ + 'title' => '伺服器資訊', + 'information' => '資訊', + 'name' => '伺服器名稱', + 'server_name' => '伺服器名稱::name', + 'notification_name' => '伺服器名稱已更新', + 'description' => '伺服器描述', + 'notification_description' => '伺服器描述已更新', + 'failed' => '失敗', + 'uuid' => '伺服器 UUID', + 'uuid_short' => '伺服器 ID', + 'node_name' => '節點名稱', + 'icon' => [ + 'upload' => '上傳圖標', + 'tooltip' => '使用 Egg 圖標', + 'updated' => '伺服器圖標已更新', + 'deleted' => '伺服器圖標已刪除', + ], + 'limits' => [ + 'title' => '限制', + 'unlimited' => '無限制', + 'of' => '共 :max', + 'cpu' => 'CPU', + 'memory' => '記憶體', + 'disk' => '磁碟空間', + 'backups' => '備份', + 'databases' => '資料庫', + 'allocations' => '網路分配', + 'no_allocations' => '沒有額外網路分配', + ], + 'sftp' => [ + 'title' => 'SFTP 資訊', + 'connection' => '連線', + 'action' => '連接到 SFTP', + 'username' => '使用者名稱', + 'password' => '密碼', + 'password_body' => '您的 SFTP 密碼與用於存取此面板的密碼相同。', + ], + ], + 'reinstall' => [ + 'title' => '重新安裝伺服器', + 'body' => '重新安裝您的伺服器將停止伺服器,然後重新執行最初設定伺服器的安裝指令碼。', + 'body2' => '在此過程中,某些檔案可能會遭刪除或修改。請在繼續前備份您的資料。', + 'action' => '重新安裝', + 'modal' => '您確定要重新安裝伺服器嗎?', + 'modal_description' => '在此過程中,某些檔案可能會遭刪除或修改。請在繼續前備份您的資料。', + 'yes' => '是的,重新安裝', + 'notification_start' => '重新安裝已開始', + 'notification_fail' => '重新安裝失敗', + ], +]; diff --git a/lang/zh_TW/server/startup.php b/lang/zh_TW/server/startup.php new file mode 100644 index 0000000000..8628f8f9d2 --- /dev/null +++ b/lang/zh_TW/server/startup.php @@ -0,0 +1,17 @@ + '啟動', + 'command' => '啟動指令', + 'notification_startup' => '啟動指令已更新', + 'notification_startup_body' => '重新啟動伺服器以使用新的啟動指令。', + 'enable_preview' => '啟用預覽', + 'disable_preview' => '停用預覽', + 'docker_image' => 'Docker 映像', + 'notification_docker' => 'Docker 映像已更新', + 'notification_docker_body' => '重新啟動伺服器以使用新的映像。', + 'variables' => '伺服器變數', + 'update' => '已更新::variable', + 'fail' => '失敗::variable', + 'validation_fail' => '驗證失敗::variable', +]; diff --git a/lang/zh_TW/server/user.php b/lang/zh_TW/server/user.php new file mode 100644 index 0000000000..7aab589d2a --- /dev/null +++ b/lang/zh_TW/server/user.php @@ -0,0 +1,73 @@ + '使用者', + 'username' => '使用者名稱', + 'email' => '電子郵件', + 'assign_all' => '全部分配', + 'invite_user' => '邀請成員', + 'action' => '邀請', + 'remove' => '移除使用者', + 'edit' => '編輯使用者', + 'editing' => '編輯 :user', + 'delete' => '刪除使用者', + 'notification_add' => '已邀請使用者!', + 'notification_edit' => '已更新使用者!', + 'notification_delete' => '已刪除使用者!', + 'notification_failed' => '邀請使用者失敗!', + 'permissions' => [ + 'title' => '權限', + 'activity_desc' => '控制使用者存取伺服器活動紀錄的權限。', + 'startup_desc' => '控制使用者檢視伺服器啟動參數的權限。', + 'settings_desc' => '控制使用者修改此伺服器設定的權限。', + 'control_desc' => '控制使用者操作伺服器電源狀態或發送指令的權限。', + 'user_desc' => '允許使用者管理伺服器中的其他子使用者的權限。他們無法編輯自己的帳號,也不能指派自己沒有的權限。', + 'file_desc' => '控制使用者修改此伺服器檔案系統的權限。', + 'allocation_desc' => '控制使用者修改此伺服器埠口分配的權限。', + 'database_desc' => '控制使用者存取此伺服器資料庫管理功能的權限。', + 'backup_desc' => '控制使用者建立與管理伺服器備份的權限。', + 'schedule_desc' => '控制使用者存取此伺服器排程管理功能的權限。', + 'startup_read' => '允許使用者查看伺服器的啟動變數。', + 'startup_update' => '允許使用者修改伺服器的啟動變數。', + 'startup_docker_image' => '允許使用者修改伺服器執行時所使用的 Docker 映像。', + 'settings_reinstall' => '允許使用者重新安裝此伺服器。', + 'settings_rename' => '允許使用者重新命名此伺服器。', + 'settings_description' => '允許使用者修改此伺服器的描述。', + 'activity_read' => '允許使用者查看伺服器的活動紀錄。', + 'websocket_connect' => '允許使用者存取此伺服器的 WebSocket。', + 'control_console' => '允許使用者透過伺服器控制台向伺服器發送指令。', + 'control_start' => '允許使用者啟動伺服器。', + 'control_stop' => '允許使用者停止伺服器。', + 'control_restart' => '允許使用者重啟伺服器。', + 'control_kill' => '允許使用者強制停止伺服器。', + 'user_create' => '允許使用者為伺服器建立新使用者帳號。', + 'user_read' => '允許使用者檢視與此伺服器相關的使用者。', + 'user_update' => '允許使用者修改與此伺服器相關的其他使用者資料。', + 'user_delete' => '允許使用者刪除與此伺服器相關的其他使用者。', + 'file_create' => '允許使用者建立新檔案和資料夾。', + 'file_read' => '允許使用者瀏覽資料夾內容,但無法查看或下載檔案。', + 'file_read_content' => '允許使用者查看指定檔案內容,並可下載該檔案。', + 'file_update' => '允許使用者更新與伺服器相關的檔案和資料夾。', + 'file_delete' => '允許使用者刪除檔案和資料夾。', + 'file_archive' => '允許使用者建立壓縮檔和解壓縮檔案。', + 'file_sftp' => '允許使用者使用 SFTP 用戶端執行上述檔案操作。', + 'allocation_read' => '允許使用者查看目前指派給此伺服器的所有配置。具有任何存取權限的使用者皆可查看主要配置。', + 'allocation_update' => '允許使用者變更伺服器主要配置並為每個配置添加備註。', + 'allocation_delete' => '允許使用者從伺服器刪除配置。', + 'allocation_create' => '允許使用者指派額外配置給伺服器。', + 'database_create' => '允許使用者為伺服器建立新的資料庫。', + 'database_read' => '允許使用者檢視伺服器上的資料庫。', + 'database_update' => '允許使用者修改資料庫。若未同時具備「檢視密碼」權限,將無法修改密碼。', + 'database_delete' => '允許使用者刪除資料庫實例。', + 'database_view_password' => '允許使用者檢視系統中的資料庫密碼。', + 'schedule_create' => '允許使用者為伺服器建立新的排程。', + 'schedule_read' => '允許使用者檢視伺服器的排程。', + 'schedule_update' => '允許使用者修改現有的伺服器排程。', + 'schedule_delete' => '允許使用者刪除伺服器排程。', + 'backup_create' => '允許使用者為此伺服器建立新的備份。', + 'backup_read' => '允許使用者查看此伺服器的所有備份。', + 'backup_delete' => '允許使用者從系統中刪除備份。', + 'backup_download' => '允許使用者下載伺服器備份。注意:此權限將讓使用者取得備份中伺服器的所有檔案。', + 'backup_restore' => '允許使用者還原伺服器備份。注意:此操作會刪除伺服器中的所有檔案。', + ], +]; diff --git a/lang/zh_TW/validation.php b/lang/zh_TW/validation.php new file mode 100644 index 0000000000..26f467e73f --- /dev/null +++ b/lang/zh_TW/validation.php @@ -0,0 +1,101 @@ + '必須同意 :attribute。', + 'active_url' => ':attribute 不是有效的網址。', + 'after' => ':attribute 必須是在 :date 後的日期。', + 'after_or_equal' => ':attribute 必須是一個在 :date 或之後的日期。', + 'alpha' => ':attribute 只能包含字母。', + 'alpha_dash' => ':attribute 只允許數字,字母,和下劃線。', + 'alpha_num' => ':attribute 只能包含數字和字母。', + 'array' => ':attribute 必須是陣列。', + 'before' => ':attribute 必須在 :date 之前', + 'before_or_equal' => ':attribute 必須是一個在 :date 或之前的日期。', + 'between' => [ + 'numeric' => ':attribute 必須介於 :min 和 :max 之間。', + 'file' => ':attribute 必須介於 :min 至 :max KB 之間。', + 'string' => ':attribute 必須介於 :min 到 :max 個字元之間。', + 'array' => ':attribute 的數目必須在 :min 到 :max 之間。', + ], + + 'confirmed' => ':attribute 的確認欄位內容不符。', + 'date' => ':attribute 不是有效的日期。', + 'date_format' => ':attribute 不符合 :format 的格式', + 'different' => ':attribute 與 :other 必須不同。', + 'digits' => ':attribute 必須是 :digits 位數字。', + 'digits_between' => ':attribute 必須介於 :min 至 :max 位數字。', + 'dimensions' => ':attribute 的圖片尺寸無效。', + + 'email' => ':attribute 必須是有效的電子郵件地址。', + + 'file' => ':attribute 必須是一個檔案。', + 'filled' => ':attribute 欄位是必填的。', + 'image' => ':attribute 必須是圖片。', + + 'in_array' => ':attribute 沒有在 :other 中。', + 'integer' => ':attribute 必須是整數。', + 'ip' => ':attribute 必須是一個有效的 IP 地址。', + 'json' => ':attribute 必須是有效的 JSON 字串。', + 'max' => [ + 'numeric' => ':attribute 不能大於 :max。', + 'file' => ':attribute 不能超過 :max KB。', + 'string' => ':attribute 不能大於 :max 字元。', + 'array' => ':attribute 不能有超過 :max 個的項目。', + ], + 'mimes' => ':attribute 檔案類型必須是 :values', + 'mimetypes' => ':attribute 檔案類型必須是 :values', + 'min' => [ + 'numeric' => ':attribute 必須至少是 :min。', + 'file' => ':attribute 必須至少為 :min KB。', + 'string' => ':attribute 最少需要有 :min 個字元。', + 'array' => ':attribute 至少需要有 :min 個項目。', + ], + + 'numeric' => ':attribute 必須是數字。', + + 'regex' => ':attribute 的格式錯誤。', + + 'required_with_all' => '當 :values 存在時,:attribute 欄位是必填的。', + + 'same' => ':attribute 與 :other 必須匹配。', + 'size' => [ + 'numeric' => ':attribute 必須為 :size。', + 'file' => ':attribute 的大小必須是 :size KB。', + 'string' => ':attribute 必須是 :size 個字元。', + 'array' => ':attribute 必須包含 :size 個項目。', + ], + 'string' => ':attribute 必須是字串。', + 'timezone' => ':attribute 必須是有效的區域。', + + 'url' => ':attribute 的格式錯誤。', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + + // Internal validation logic for Panel + 'internal' => [ + 'variable_value' => ':env 環境變數', + 'invalid_password' => '提供的密碼對此帳號無效。', + ], +]; diff --git a/package.json b/package.json index 713b5cbafb..47ca60a886 100644 --- a/package.json +++ b/package.json @@ -1,158 +1,28 @@ { - "name": "panel", - "engines": { - "node": ">=18" - }, - "dependencies": { - "@floating-ui/react-dom-interactions": "^0.6.6", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.1", - "@fortawesome/react-fontawesome": "^0.1.11", - "@headlessui/react": "^1.6.4", - "@heroicons/react": "^1.0.6", - "@hot-loader/react-dom": "^16.14.0", - "@preact/signals-react": "^1.2.1", - "@tailwindcss/forms": "^0.5.2", - "@tailwindcss/line-clamp": "^0.4.0", - "axios": "^1.6.7", - "boring-avatars": "^1.7.0", - "chart.js": "^3.8.0", - "classnames": "^2.3.1", - "codemirror": "^5.58.2", - "copy-to-clipboard": "^3.3.1", - "date-fns": "^2.28.0", - "debounce": "^1.2.0", - "deepmerge-ts": "^4.2.1", - "easy-peasy": "^4.0.1", - "events": "^3.0.0", - "formik": "^2.2.6", - "framer-motion": "^6.3.10", - "i18next": "^21.8.9", - "i18next-http-backend": "^1.4.1", - "i18next-multiload-backend-adapter": "^1.0.0", - "qrcode.react": "^1.0.1", - "react": "^16.14.0", - "react-chartjs-2": "^4.2.0", - "react-dom": "npm:@hot-loader/react-dom", - "react-fast-compare": "^3.2.0", - "react-hot-loader": "^4.12.21", - "react-i18next": "^11.2.1", - "react-router-dom": "^5.1.2", - "react-transition-group": "^4.4.1", - "reaptcha": "^1.7.2", - "rimraf": "^4", - "sockette": "^2.0.6", - "styled-components": "^5.2.1", - "styled-components-breakpoint": "^3.0.0-preview.20", - "swr": "^0.2.3", - "tailwindcss": "^3.0.24", - "use-fit-text": "^2.4.0", - "uuid": "^8.3.2", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-addon-search": "^0.9.0", - "xterm-addon-search-bar": "^0.2.0", - "xterm-addon-web-links": "^0.6.0", - "yup": "^0.29.1" + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" }, "devDependencies": { - "@babel/core": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-runtime": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.1", - "@babel/preset-typescript": "^7.12.1", - "@babel/runtime": "^7.12.1", - "@testing-library/dom": "^8.14.0", - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "12.1.5", - "@testing-library/user-event": "^14.2.1", - "@types/codemirror": "^0.0.98", - "@types/debounce": "^1.2.0", - "@types/events": "^3.0.0", - "@types/jest": "^28.1.3", - "@types/node": "^14.11.10", - "@types/qrcode.react": "^1.0.1", - "@types/react": "^16.14.0", - "@types/react-copy-to-clipboard": "^4.3.0", - "@types/react-dom": "^16.9.16", - "@types/react-redux": "^7.1.1", - "@types/react-router": "^5.1.3", - "@types/react-router-dom": "^5.1.3", - "@types/react-transition-group": "^4.4.0", - "@types/styled-components": "^5.1.7", - "@types/uuid": "^3.4.5", - "@types/webpack-env": "^1.15.2", - "@types/yup": "^0.29.3", - "@typescript-eslint/eslint-plugin": "^5.29.0", - "@typescript-eslint/parser": "^5.29.0", - "autoprefixer": "^10.4.7", - "babel-jest": "^28.1.1", - "babel-loader": "^8.2.5", - "babel-plugin-styled-components": "^2.0.7", - "cross-env": "^7.0.2", - "css-loader": "^5.2.7", - "eslint": "^8.18.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest-dom": "^4.0.2", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "fork-ts-checker-webpack-plugin": "^6.2.10", - "identity-obj-proxy": "^3.0.0", - "jest": "^28.1.1", - "postcss": "^8.4.35", - "postcss-import": "^14.1.0", - "postcss-loader": "^4.0.0", - "postcss-nesting": "^10.1.8", - "postcss-preset-env": "^7.7.1", - "prettier": "^2.7.1", - "redux-devtools-extension": "^2.13.8", - "source-map-loader": "^1.1.3", - "style-loader": "^2.0.0", - "svg-url-loader": "^7.1.1", - "terser-webpack-plugin": "^4.2.3", - "ts-essentials": "^9.1.2", - "ts-jest": "^28.0.5", - "twin.macro": "^2.8.2", - "typescript": "^4.7.3", - "webpack": "^4.47.0", - "webpack-assets-manifest": "^3.1.1", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0", - "yarn-deduplicate": "^1.1.1" + "@tailwindcss/forms": "^0.5.9", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "^4.1.4", + "autoprefixer": "^10.4.21", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^1.0", + "prettier": "^3.4.2", + "tailwindcss": "^4.1.4", + "vite": "7.1.11" }, - "scripts": { - "clean": "cd public/assets && rimraf -g *.js *.map", - "test": "jest", - "lint": "eslint ./resources/scripts/**/*.{ts,tsx} --ext .ts,.tsx", - "watch": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --watch --progress", - "build": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --progress", - "build:production": "yarn run clean && cross-env NODE_ENV=production ./node_modules/.bin/webpack --mode production", - "serve": "yarn run clean && cross-env WEBPACK_PUBLIC_PATH=/webpack@hmr/ NODE_ENV=development webpack-dev-server --host 0.0.0.0 --port 8080 --public https://panel.test --hot" - }, - "browserslist": [ - "> 0.5%", - "last 2 versions", - "firefox esr", - "not dead" - ], - "babelMacros": { - "twin": { - "preset": "styled-components" - }, - "styledComponents": { - "pure": true, - "displayName": true, - "fileName": true - } + "dependencies": { + "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-search": "^0.15.0", + "@xterm/addon-web-links": "^0.11.0", + "@xterm/addon-webgl": "^0.18.0", + "@xterm/xterm": "^5.5.0", + "glob": "^11.0.3", + "xterm-addon-search-bar": "^0.2.0" } } diff --git a/phpstan.neon b/phpstan.neon index 58b6c8e913..ffe47a1643 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,20 +1,26 @@ includes: - vendor/larastan/larastan/extension.neon +rules: + - App\PHPStan\ForbiddenGlobalFunctionsRule + parameters: paths: - - app/ + - app - # Level 9 is the highest level - level: 5 + level: 6 ignoreErrors: - # Prologue\Alerts defines its methods from its configuration file dynamically - - '#^Call to an undefined method Prologue\\Alerts\\AlertsMessageBag::(danger|success|info|warning)\(\)\.$#' - -# excludePaths: -# - ./*/*/FileToBeExcluded.php -# -# checkMissingIterableValueType: false + - identifier: argument.templateType + - identifier: missingType.generics + - '#Call to an undefined method Filament\\Forms\\Components\\(.+)::hintCopy\(\)#' + # We are getting and setting environment variables directly + - + identifier: larastan.noEnvCallsOutsideOfConfig + paths: + - app/Console/Commands/Environment/*.php + - app/Extensions/Captcha/Schemas/*.php + - app/Extensions/OAuth/Schemas/*.php + - app/Filament/Admin/Pages/Settings.php diff --git a/phpunit.xml b/phpunit.xml index 610eac74ed..10ec42c7c4 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,26 +1,34 @@ - - - - ./tests/Integration - - - ./tests/Unit - - - - - - - - - - - - - - - ./app - - + + + + ./tests/Integration + + + ./tests/Unit + + + + + + + + + + + + + + + + + + + app + + diff --git a/pint.json b/pint.json index 4d7ccf1135..f1cd82476d 100644 --- a/pint.json +++ b/pint.json @@ -1,12 +1,11 @@ { "preset": "laravel", "rules": { - "class_attributes_separation": false, "concat_space": false, + "new_with_parentheses": { + "anonymous_class": false + }, "not_operator_with_successor_space": false, - "nullable_type_declaration_for_default_null_value": false, - "ordered_imports": false, - "phpdoc_align": false, - "phpdoc_separation": false + "single_line_comment_spacing": false } -} +} \ No newline at end of file diff --git a/plugins/.gitignore b/plugins/.gitignore new file mode 100644 index 0000000000..c96a04f008 --- /dev/null +++ b/plugins/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 0cc56abe40..0000000000 --- a/postcss.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - plugins: [ - require('postcss-import'), - // We want to make use of nesting following the CSS Nesting spec, and not the - // SASS style nesting. - // - // @see https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-nesting - require('tailwindcss/nesting')(require('postcss-nesting')), - require('tailwindcss'), - require('autoprefixer'), - require('postcss-preset-env')({ - features: { - 'nesting-rules': false, - }, - }), - ], -}; diff --git a/public/.htaccess b/public/.htaccess index b75525bedc..fa2217f8fc 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -5,16 +5,24 @@ RewriteEngine On + # Handle X-Forwarded-Proto Header + RewriteCond %{HTTP:X-Forwarded-Proto} =https [NC] + RewriteRule .* - [E=HTTPS:on] + # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] - # Handle Front Controller... + # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] diff --git a/public/assets/svgs/not_found.svg b/public/assets/svgs/not_found.svg deleted file mode 100644 index 222a4152e3..0000000000 --- a/public/assets/svgs/not_found.svg +++ /dev/null @@ -1 +0,0 @@ -not found \ No newline at end of file diff --git a/public/assets/svgs/server_error.svg b/public/assets/svgs/server_error.svg deleted file mode 100644 index 726fa106df..0000000000 --- a/public/assets/svgs/server_error.svg +++ /dev/null @@ -1 +0,0 @@ -server down \ No newline at end of file diff --git a/public/assets/svgs/server_installing.svg b/public/assets/svgs/server_installing.svg deleted file mode 100644 index d2a0ae48bf..0000000000 --- a/public/assets/svgs/server_installing.svg +++ /dev/null @@ -1 +0,0 @@ -uploading \ No newline at end of file diff --git a/public/css/filament-monaco-editor/filament-monaco-editor-styles.css b/public/css/filament-monaco-editor/filament-monaco-editor-styles.css deleted file mode 100644 index 7192499bd1..0000000000 --- a/public/css/filament-monaco-editor/filament-monaco-editor-styles.css +++ /dev/null @@ -1 +0,0 @@ -.fme-wrapper{display:flex;width:100%;flex-direction:column}.fme-full-screen{position:fixed;top:0;left:0;z-index:9999;height:100vh;width:100vw;overflow:hidden;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.fme-control-section{display:flex;justify-content:space-between;padding:.5rem}.fme-code-preview-tab-item{position:relative;z-index:20;display:inline-flex;height:2rem;cursor:pointer;align-items:center;justify-content:center;white-space:nowrap;border-radius:.375rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.fme-code-preview-tab-marker-container{position:absolute;left:0;z-index:10;height:100%;width:50%;transition-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1)}.fme-code-preview-tab-marker{height:100%;width:100%;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 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)}.fme-full-screen-btn{border-radius:.25rem;padding:.25rem .5rem}.fme-full-screen-btn:focus{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity));--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(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)}.fme-full-screen-btn-icon{height:1rem;width:1rem;--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fme-code-preview-tab{display:inline-grid;height:2.5rem;width:auto;-webkit-user-select:none;-moz-user-select:none;user-select:none;grid-template-columns:repeat(2,minmax(0,1fr));justify-content:center;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity));padding:.25rem;--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fme-code-preview-tab,.fme-container{position:relative;align-items:center}.fme-container{min-height:250px;flex-direction:column;justify-content:flex-start;--tw-bg-opacity:1;background-color:rgb(12 16 33/var(--tw-bg-opacity));padding-top:.75rem}.fme-container,.fme-loader{display:flex;height:100%;width:100%}.fme-loader{position:absolute;inset:0;z-index:20;align-items:center;justify-content:center;transition-duration:1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.fme-loader-icon{height:1rem;width:1rem;animation:spin 1s linear infinite;--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fme-element-wrapper{position:relative;z-index:10;height:100%;width:100%;border-radius:.25rem}.fme-element{height:100%;width:100%;font-size:1.125rem;line-height:1.75rem}.fme-placeholder{position:absolute;left:0;top:0;z-index:50;margin-left:3.5rem;margin-top:.125rem;width:100%;--tw-translate-x:-0.125rem;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));font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fme-preview-wrapper{height:100%;width:100%;border-radius:.25rem;border-width:1px;--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity));padding:1rem}.fme-preview{display:flex;height:100%;width:100%}.grow{flex-grow:1}.-translate-x-5,.-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))}.translate-x-0,.translate-x-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))}.translate-x-5,.translate-x-full{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))}.-rotate-180,.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))}.rotate-180,.scale-100{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))}.scale-95,.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))}.truncate,.whitespace-nowrap{white-space:nowrap}.\!bg-gray-50,.\!bg-gray-700{--tw-bg-opacity:1!important}.pb-6,.py-6{padding-bottom:1.5rem}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.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)}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.focus-visible\:ring-1:focus-visible,.focus-visible\:ring-2:focus-visible{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::-moz-placeholder,.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.group\/button:hover .group-hover\/button\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group\/item:focus-visible .group-focus-visible\/item\:underline,.group\/link:focus-visible .group-focus-visible\/link\:underline{text-decoration-line:underline}.dark\:divide-white\/10:is(.dark *)>:not([hidden])~:not([hidden]){border-color:#ffffff1a}.dark\:divide-white\/5:is(.dark *)>:not([hidden])~:not([hidden]){border-color:#ffffff0d}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-700),var(--tw-border-opacity))}.dark\:border-primary-500:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:border-white\/10:is(.dark *){border-color:#ffffff1a}.dark\:border-t-white\/10:is(.dark *){border-top-color:#ffffff1a}.dark\:\!bg-gray-700:is(.dark *){--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.dark\:bg-custom-400\/10:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.dark\:bg-custom-500\/20:is(.dark *){background-color:rgba(var(--c-500),.2)}.dark\:bg-gray-400\/10:is(.dark *){background-color:rgba(var(--gray-400),.1)}.dark\:bg-gray-500\/20:is(.dark *){background-color:rgba(var(--gray-500),.2)}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.dark\:bg-gray-900\/30:is(.dark *){background-color:rgba(var(--gray-900),.3)}.dark\:bg-gray-950\/75:is(.dark *){background-color:rgba(var(--gray-950),.75)}.dark\:bg-primary-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:bg-transparent:is(.dark *){background-color:initial}.dark\:bg-white\/5:is(.dark *){background-color:#ffffff0d}.dark\:fill-current:is(.dark *){fill:currentColor}.dark\:text-custom-300\/50:is(.dark *){color:rgba(var(--c-300),.5)}.dark\:text-custom-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.dark\:text-danger-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-400),var(--tw-text-opacity))}.dark\:text-danger-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-500),var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:text-gray-300\/50:is(.dark *){color:rgba(var(--gray-300),.5)}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:text-gray-700:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.dark\:text-primary-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:text-white\/5:is(.dark *){color:#ffffff0d}.dark\:ring-custom-400\/30:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.3)}.dark\:ring-custom-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:ring-danger-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:ring-gray-400\/20:is(.dark *){--tw-ring-color:rgba(var(--gray-400),0.2)}.dark\:ring-gray-50\/10:is(.dark *){--tw-ring-color:rgba(var(--gray-50),0.1)}.dark\:ring-gray-700:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-700),var(--tw-ring-opacity))}.dark\:ring-gray-900:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-900),var(--tw-ring-opacity))}.dark\:ring-white\/10:is(.dark *){--tw-ring-color:#ffffff1a}.dark\:ring-white\/20:is(.dark *){--tw-ring-color:#fff3}.dark\:placeholder\:text-gray-500:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:placeholder\:text-gray-500:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:before\:bg-primary-500:is(.dark *):before{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:checked\:bg-danger-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--danger-500),var(--tw-bg-opacity))}.dark\:checked\:bg-primary-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}.dark\:hover\:bg-custom-400\/10:hover:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:hover\:bg-white\/10:hover:is(.dark *){background-color:#ffffff1a}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:#ffffff0d}.dark\:hover\:text-custom-300:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-300),var(--tw-text-opacity))}.dark\:hover\:text-custom-300\/75:hover:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:hover\:text-gray-300\/75:hover:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:hover\:text-gray-400:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:focus\:ring-danger-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:focus\:ring-primary-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:checked\:focus\:ring-danger-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--danger-400),0.5)}.dark\:checked\:focus\:ring-primary-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--primary-400),0.5)}.dark\:focus-visible\:border-primary-500:focus-visible:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:focus-visible\:bg-custom-400\/10:focus-visible:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:focus-visible\:bg-white\/5:focus-visible:is(.dark *){background-color:#ffffff0d}.dark\:focus-visible\:text-custom-300\/75:focus-visible:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:focus-visible\:text-gray-300\/75:focus-visible:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:focus-visible\:ring-custom-400\/50:focus-visible:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}.dark\:focus-visible\:ring-custom-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:focus-visible\:ring-primary-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:disabled\:bg-transparent:disabled:is(.dark *){background-color:initial}.dark\:disabled\:text-gray-400:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:disabled\:ring-white\/10:disabled:is(.dark *){--tw-ring-color:#ffffff1a}.dark\:disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled:is(.dark *){-webkit-text-fill-color:rgba(var(--gray-400),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::-moz-placeholder,.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:checked\:bg-gray-600:checked:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.group\/button:hover .dark\:group-hover\/button\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-200:is(.dark *),.group:hover .dark\:group-hover\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:\[\&\.trix-active\]\:bg-white\/5.trix-active:is(.dark *){background-color:#ffffff0d}.dark\:\[\&\.trix-active\]\:text-primary-400.trix-active:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.white\/20\%\)\]:not(:nth-child(1 of .fi-btn)):is(.dark *){--tw-shadow:-1px 0 0 0 #fff3;--tw-shadow-colored:-1px 0 0 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)}.\[\&_optgroup\]\:dark\:bg-gray-900:is(.dark *) optgroup{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.\[\&_option\]\:dark\:bg-gray-900:is(.dark *) option{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}:checked+*>.\[\:checked\+\*\>\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}input:checked+.\[input\:checked\+\&\]\:bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}input:checked+.\[input\:checked\+\&\]\:ring-0{--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(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)}input:checked+.\[input\:checked\+\&\]\:hover\:bg-custom-500:hover,input:checked+.dark\:\[input\:checked\+\&\]\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}input:checked:focus-visible+.\[input\:checked\:focus-visible\+\&\]\:ring-custom-500\/50{--tw-ring-color:rgba(var(--c-500),0.5)}input:checked:focus-visible+.dark\:\[input\:checked\:focus-visible\+\&\]\:ring-custom-400\/50:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}input:focus-visible+.\[input\:focus-visible\+\&\]\:z-10{z-index:10}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-2{--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(2px + 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)}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}input:focus-visible+.dark\:\[input\:focus-visible\+\&\]\:ring-white\/20:is(.dark *){--tw-ring-color:#fff3} \ No newline at end of file diff --git a/public/css/filament/filament/app.css b/public/css/filament/filament/app.css index bb61be9017..7709800cef 100644 --- a/public/css/filament/filament/app.css +++ b/public/css/filament/filament/app.css @@ -1 +1,2 @@ -*,: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:rgba(59,130,246,.5);--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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--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:rgba(59,130,246,.5);--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: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com*/*,:after,:before{border-color:rgba(var(--gray-200),1);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-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{color:rgba(var(--gray-400),1);opacity:1}input::placeholder,textarea::placeholder{color:rgba(var(--gray-400),1);opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:rgba(var(--gray-500),var(--tw-border-opacity,1));border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:rgba(var(--gray-500),var(--tw-text-opacity,1));opacity:1}input::placeholder,textarea::placeholder{color:rgba(var(--gray-500),var(--tw-text-opacity,1));opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:rgba(var(--gray-500),var(--tw-border-opacity,1));border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:transparent}[type=checkbox]:indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}@media (forced-colors:active) {[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:transparent}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root.dark{color-scheme:dark}[data-field-wrapper]{scroll-margin-top:8rem}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.8888889em;margin-top:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;line-height:1.2;margin-bottom:.8em;margin-top:0}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;line-height:1.4;margin-bottom:.8em;margin-top:1.6em}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.5555556em}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.4285714;margin-bottom:.5714286em;margin-top:1.4285714em}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8571429em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-top:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.25rem;font-size:.8571429em;line-height:1.6666667;margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.2857143em;margin-top:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8571429em;margin-top:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-base{font-size:1rem;line-height:1.75}.prose-base :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose-base :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em}.prose-base :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.25em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose-base :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose-base :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose-base :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose-base :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose-base :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-base :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-base :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-base :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.875em;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose-base :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose-base :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose-base :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose-base :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose-base :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose-base :where(.prose-base>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(.prose-base>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose-base>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(.prose-base>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose-base>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose-base :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3em;margin-top:3em}.prose-base :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857}.prose-base :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose-base :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-base :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-base :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose-base :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-base :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-base :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose-base :where(.prose-base>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(.prose-base>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(.prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(.prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg :where(.prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(.prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-4{inset:1rem}.inset-x-0{left:0;right:0}.inset-x-4{left:1rem;right:1rem}.inset-y-0{bottom:0;top:0}.-bottom-1\/2{bottom:-50%}.-top-1{top:-.25rem}.-top-1\/2{top:-50%}.-top-2{top:-.5rem}.-top-3{top:-.75rem}.bottom-0{bottom:0}.bottom-1\/2{bottom:50%}.end-0{inset-inline-end:0}.end-4{inset-inline-end:1rem}.end-6{inset-inline-end:1.5rem}.left-3{left:.75rem}.start-0{inset-inline-start:0}.start-full{inset-inline-start:100%}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-6{top:1.5rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.order-first{order:-9999}.col-\[--col-span-default\]{grid-column:var(--col-span-default)}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-\[--col-start-default\]{grid-column-start:var(--col-start-default)}.row-start-2{grid-row-start:2}.-m-0\.5{margin:-.125rem}.-m-1{margin:-.25rem}.-m-1\.5{margin:-.375rem}.-m-2{margin:-.5rem}.-m-2\.5{margin:-.625rem}.-m-3{margin:-.75rem}.-m-3\.5{margin:-.875rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-16{margin-bottom:4rem;margin-top:4rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-auto{margin-bottom:auto;margin-top:auto}.\!mt-0{margin-top:0!important}.-mb-4{margin-bottom:-1rem}.-mb-6{margin-bottom:-1.5rem}.-me-2{margin-inline-end:-.5rem}.-ms-0\.5{margin-inline-start:-.125rem}.-ms-1{margin-inline-start:-.25rem}.-ms-2{margin-inline-start:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.-mt-7{margin-top:-1.75rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.me-1{margin-inline-end:.25rem}.me-4{margin-inline-end:1rem}.me-6{margin-inline-end:1.5rem}.ml-auto{margin-left:auto}.ms-1{margin-inline-start:.25rem}.ms-auto{margin-inline-start:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-\[--line-clamp\]{-webkit-box-orient:vertical;-webkit-line-clamp:var(--line-clamp);display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.h-0{height:0}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[100dvh\],.h-dvh{height:100dvh}.h-full{height:100%}.h-screen{height:100vh}.max-h-96{max-height:24rem}.min-h-\[theme\(spacing\.48\)\]{min-height:12rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-16{width:4rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[--sidebar-width\]{width:var(--sidebar-width)}.w-\[calc\(100\%\+2rem\)\]{width:calc(100% + 2rem)}.w-auto{width:auto}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[theme\(spacing\.4\)\]{min-width:1rem}.min-w-\[theme\(spacing\.5\)\]{min-width:1.25rem}.min-w-\[theme\(spacing\.6\)\]{min-width:1.5rem}.min-w-\[theme\(spacing\.8\)\]{min-width:2rem}.\!max-w-2xl{max-width:42rem!important}.\!max-w-3xl{max-width:48rem!important}.\!max-w-4xl{max-width:56rem!important}.\!max-w-5xl{max-width:64rem!important}.\!max-w-6xl{max-width:72rem!important}.\!max-w-7xl{max-width:80rem!important}.\!max-w-\[14rem\]{max-width:14rem!important}.\!max-w-lg{max-width:32rem!important}.\!max-w-md{max-width:28rem!important}.\!max-w-sm{max-width:24rem!important}.\!max-w-xl{max-width:36rem!important}.\!max-w-xs{max-width:20rem!important}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-md{max-width:28rem}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.table-auto{table-layout:auto}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-1\/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))}.-translate-x-1\/4{--tw-translate-x:-25%}.-translate-x-12{--tw-translate-x:-3rem}.-translate-x-12,.-translate-x-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))}.-translate-x-5{--tw-translate-x:-1.25rem}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.-translate-y-1\/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))}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-12,.-translate-y-3\/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))}.-translate-y-3\/4{--tw-translate-y:-75%}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-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))}.translate-x-12{--tw-translate-x:3rem}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-x-full{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))}.translate-x-full{--tw-translate-x:100%}.translate-y-12{--tw-translate-y:3rem}.-rotate-180,.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))}.-rotate-180{--tw-rotate:-180deg}.rotate-180{--tw-rotate:180deg}.rotate-180,.scale-100{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))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-95,.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))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize{resize:both}.scroll-mt-9{scroll-margin-top:2.25rem}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.columns-\[--cols-default\]{-moz-columns:var(--cols-default);columns:var(--cols-default)}.break-inside-avoid{-moz-column-break-inside:avoid;break-inside:avoid}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[--cols-default\]{grid-template-columns:var(--cols-default)}.grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.grid-cols-\[repeat\(7\2c minmax\(theme\(spacing\.7\)\2c 1fr\)\)\]{grid-template-columns:repeat(7,minmax(1.75rem,1fr))}.grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.grid-rows-\[1fr_auto_1fr\]{grid-template-rows:1fr auto 1fr}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-start{justify-items:start}.justify-items-center{justify-items:center}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-6{row-gap:1.5rem}.gap-y-7{row-gap:1.75rem}.gap-y-8{row-gap:2rem}.gap-y-px{row-gap:1px}.-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.25rem*var(--tw-space-x-reverse))}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.5rem*var(--tw-space-x-reverse))}.-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.75rem*var(--tw-space-x-reverse))}.-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1rem*var(--tw-space-x-reverse))}.-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.25rem*var(--tw-space-x-reverse))}.-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.5rem*var(--tw-space-x-reverse))}.-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.75rem*var(--tw-space-x-reverse))}.-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-2rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(var(--gray-100),var(--tw-divide-opacity))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(var(--gray-200),var(--tw-divide-opacity))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-x-\[0\.5px\]{border-left-width:.5px;border-right-width:.5px}.border-y{border-bottom-width:1px;border-top-width:1px}.\!border-t-0{border-top-width:0!important}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0}.border-e{border-inline-end-width:1px}.border-s{border-inline-start-width:1px}.border-t{border-top-width:1px}.\!border-none{border-style:none!important}.border-none{border-style:none}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--gray-100),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--gray-300),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.border-primary-500{--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.border-primary-600{--tw-border-opacity:1;border-color:rgba(var(--primary-600),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-t-gray-200{--tw-border-opacity:1;border-top-color:rgba(var(--gray-200),var(--tw-border-opacity))}.\!bg-gray-50{--tw-bg-opacity:1!important;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))!important}.\!bg-gray-700{--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-custom-100{--tw-bg-opacity:1;background-color:rgba(var(--c-100),var(--tw-bg-opacity))}.bg-custom-50{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(var(--gray-200),var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.bg-gray-950\/50{background-color:rgba(var(--gray-950),.5)}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-white\/0{background-color:hsla(0,0%,100%,0)}.bg-white\/5{background-color:hsla(0,0%,100%,.05)}.\!bg-none{background-image:none!important}.bg-cover{background-size:cover}.bg-center{background-position:50%}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-3\.5{padding-bottom:.875rem;padding-top:.875rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pe-0{padding-inline-end:0}.pe-1{padding-inline-end:.25rem}.pe-2{padding-inline-end:.5rem}.pe-3{padding-inline-end:.75rem}.pe-4{padding-inline-end:1rem}.pe-6{padding-inline-end:1.5rem}.pe-8{padding-inline-end:2rem}.ps-0{padding-inline-start:0}.ps-1{padding-inline-start:.25rem}.ps-2{padding-inline-start:.5rem}.ps-3{padding-inline-start:.75rem}.ps-4{padding-inline-start:1rem}.ps-\[5\.25rem\]{padding-inline-start:5.25rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-start{text-align:start}.text-end{text-align:end}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.font-thin{font-weight:100}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-loose{line-height:2}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.text-custom-400{--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.text-custom-50{--tw-text-opacity:1;color:rgba(var(--c-50),var(--tw-text-opacity))}.text-custom-500{--tw-text-opacity:1;color:rgba(var(--c-500),var(--tw-text-opacity))}.text-custom-600{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.text-custom-700\/50{color:rgba(var(--c-700),.5)}.text-danger-600{--tw-text-opacity:1;color:rgba(var(--danger-600),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--gray-100),var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.text-gray-700\/50{color:rgba(var(--gray-700),.5)}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-0{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-0{--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(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1{--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)}.ring-1,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--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(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-4{--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(4px + 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)}.ring-inset{--tw-ring-inset:inset}.ring-custom-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-600),var(--tw-ring-opacity))}.ring-custom-600\/10{--tw-ring-color:rgba(var(--c-600),0.1)}.ring-custom-600\/20{--tw-ring-color:rgba(var(--c-600),0.2)}.ring-danger-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-300),var(--tw-ring-opacity))}.ring-gray-600\/10{--tw-ring-color:rgba(var(--gray-600),0.1)}.ring-gray-900\/10{--tw-ring-color:rgba(var(--gray-900),0.1)}.ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}.ring-gray-950\/5{--tw-ring-color:rgba(var(--gray-950),0.05)}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-white\/10{--tw-ring-color:hsla(0,0%,100%,.1)}.blur{--tw-blur:blur(8px)}.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)}.transition{transition-duration:.15s;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:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.delay-100{transition-delay:.1s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[transform\:translateZ\(0\)\]{transform:translateZ(0)}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-y-0:before{bottom:0;content:var(--tw-content);top:0}.before\:start-0:before{content:var(--tw-content);inset-inline-start:0}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-0\.5:before{content:var(--tw-content);width:.125rem}.before\:bg-primary-600:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity));content:var(--tw-content)}.first\:border-s-0:first-child{border-inline-start-width:0}.first\:border-t-0:first-child{border-top-width:0}.last\:border-e-0:last-child{border-inline-end-width:0}.first-of-type\:ps-1:first-of-type{padding-inline-start:.25rem}.last-of-type\:pe-1:last-of-type{padding-inline-end:.25rem}.checked\:ring-0:checked{--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(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)}.focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.hover\:bg-custom-400\/10:hover{background-color:rgba(var(--c-400),.1)}.hover\:bg-custom-50:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.hover\:bg-custom-500:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.hover\:bg-gray-400\/10:hover{background-color:rgba(var(--gray-400),.1)}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.hover\:text-custom-600:hover{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.hover\:text-custom-700\/75:hover{color:rgba(var(--c-700),.75)}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.hover\:text-gray-700\/75:hover{color:rgba(var(--gray-700),.75)}.hover\:opacity-100:hover{opacity:1}.focus\:ring-0:focus{--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(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--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(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-danger-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.focus\:ring-primary-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.checked\:focus\:ring-danger-500\/50:focus:checked{--tw-ring-color:rgba(var(--danger-500),0.5)}.checked\:focus\:ring-primary-500\/50:focus:checked{--tw-ring-color:rgba(var(--primary-500),0.5)}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:border-primary-500:focus-visible{--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.focus-visible\:bg-custom-50:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.focus-visible\:bg-gray-100:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.focus-visible\:bg-gray-50:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.focus-visible\:text-custom-700\/75:focus-visible{color:rgba(var(--c-700),.75)}.focus-visible\:text-gray-500:focus-visible{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.focus-visible\:text-gray-700\/75:focus-visible{color:rgba(var(--gray-700),.75)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--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)}.focus-visible\:ring-2:focus-visible{--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(2px + 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)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.focus-visible\:ring-custom-500\/50:focus-visible{--tw-ring-color:rgba(var(--c-500),0.5)}.focus-visible\:ring-custom-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-600),var(--tw-ring-opacity))}.focus-visible\:ring-gray-400\/40:focus-visible{--tw-ring-color:rgba(var(--gray-400),0.4)}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.focus-visible\:ring-primary-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.enabled\:cursor-wait:enabled{cursor:wait}.enabled\:opacity-70:enabled{opacity:.7}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:bg-gray-50:disabled{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.disabled\:text-gray-50:disabled{--tw-text-opacity:1;color:rgba(var(--gray-50),var(--tw-text-opacity))}.disabled\:text-gray-500:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.disabled\:opacity-70:disabled{opacity:.7}.disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled{-webkit-text-fill-color:rgba(var(--gray-500),1)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::-moz-placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.disabled\:checked\:bg-current:checked:disabled{background-color:currentColor}.disabled\:checked\:text-gray-400:checked:disabled{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group\/item:first-child .group-first\/item\:rounded-s-lg{border-end-start-radius:.5rem;border-start-start-radius:.5rem}.group\/item:last-child .group-last\/item\:rounded-e-lg{border-end-end-radius:.5rem;border-start-end-radius:.5rem}.group:hover .group-hover\:text-gray-500,.group\/button:hover .group-hover\/button\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.group\/item:hover .group-hover\/item\:underline,.group\/link:hover .group-hover\/link\:underline{text-decoration-line:underline}.group:focus-visible .group-focus-visible\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group:focus-visible .group-focus-visible\:text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.group\/item:focus-visible .group-focus-visible\/item\:underline{text-decoration-line:underline}.group\/link:focus-visible .group-focus-visible\/link\:underline{text-decoration-line:underline}.dark\:flex:is(.dark *){display:flex}.dark\:hidden:is(.dark *){display:none}.dark\:divide-white\/10:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsla(0,0%,100%,.1)}.dark\:divide-white\/5:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsla(0,0%,100%,.05)}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-700),var(--tw-border-opacity))}.dark\:border-primary-500:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:border-white\/10:is(.dark *){border-color:hsla(0,0%,100%,.1)}.dark\:border-white\/5:is(.dark *){border-color:hsla(0,0%,100%,.05)}.dark\:border-t-white\/10:is(.dark *){border-top-color:hsla(0,0%,100%,.1)}.dark\:\!bg-gray-700:is(.dark *){--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.dark\:bg-custom-400\/10:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.dark\:bg-custom-500\/20:is(.dark *){background-color:rgba(var(--c-500),.2)}.dark\:bg-gray-400\/10:is(.dark *){background-color:rgba(var(--gray-400),.1)}.dark\:bg-gray-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}.dark\:bg-gray-500\/20:is(.dark *){background-color:rgba(var(--gray-500),.2)}.dark\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.dark\:bg-gray-900\/30:is(.dark *){background-color:rgba(var(--gray-900),.3)}.dark\:bg-gray-950:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-950),var(--tw-bg-opacity))}.dark\:bg-gray-950\/75:is(.dark *){background-color:rgba(var(--gray-950),.75)}.dark\:bg-primary-400:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity))}.dark\:bg-primary-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:bg-white\/10:is(.dark *){background-color:hsla(0,0%,100%,.1)}.dark\:bg-white\/5:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:fill-current:is(.dark *){fill:currentColor}.dark\:text-custom-300\/50:is(.dark *){color:rgba(var(--c-300),.5)}.dark\:text-custom-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.dark\:text-custom-400\/10:is(.dark *){color:rgba(var(--c-400),.1)}.dark\:text-danger-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-400),var(--tw-text-opacity))}.dark\:text-danger-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-500),var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:text-gray-300\/50:is(.dark *){color:rgba(var(--gray-300),.5)}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:text-gray-700:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.dark\:text-gray-800:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-800),var(--tw-text-opacity))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.dark\:text-primary-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:text-white\/5:is(.dark *){color:hsla(0,0%,100%,.05)}.dark\:ring-custom-400\/30:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.3)}.dark\:ring-custom-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:ring-danger-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:ring-gray-400\/20:is(.dark *){--tw-ring-color:rgba(var(--gray-400),0.2)}.dark\:ring-gray-50\/10:is(.dark *){--tw-ring-color:rgba(var(--gray-50),0.1)}.dark\:ring-gray-700:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-700),var(--tw-ring-opacity))}.dark\:ring-gray-900:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-900),var(--tw-ring-opacity))}.dark\:ring-white\/10:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1)}.dark\:ring-white\/20:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)}.dark\:placeholder\:text-gray-500:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:placeholder\:text-gray-500:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:before\:bg-primary-500:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity));content:var(--tw-content)}.dark\:checked\:bg-danger-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--danger-500),var(--tw-bg-opacity))}.dark\:checked\:bg-primary-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:focus-within\:bg-white\/5:focus-within:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}.dark\:hover\:bg-custom-400\/10:hover:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:hover\:bg-white\/10:hover:is(.dark *){background-color:hsla(0,0%,100%,.1)}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:hover\:text-custom-300:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-300),var(--tw-text-opacity))}.dark\:hover\:text-custom-300\/75:hover:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:hover\:text-gray-300\/75:hover:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:hover\:text-gray-400:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:hover\:ring-white\/20:hover:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)}.dark\:focus\:ring-danger-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:focus\:ring-primary-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:checked\:focus\:ring-danger-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--danger-400),0.5)}.dark\:checked\:focus\:ring-primary-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--primary-400),0.5)}.dark\:focus-visible\:border-primary-500:focus-visible:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:focus-visible\:bg-custom-400\/10:focus-visible:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:focus-visible\:bg-white\/5:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:focus-visible\:text-custom-300\/75:focus-visible:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:focus-visible\:text-gray-300\/75:focus-visible:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:focus-visible\:text-gray-400:focus-visible:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:focus-visible\:ring-custom-400\/50:focus-visible:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}.dark\:focus-visible\:ring-custom-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:focus-visible\:ring-primary-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:disabled\:bg-transparent:disabled:is(.dark *){background-color:transparent}.dark\:disabled\:text-gray-400:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:disabled\:ring-white\/10:disabled:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1)}.dark\:disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled:is(.dark *){-webkit-text-fill-color:rgba(var(--gray-400),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::-moz-placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:checked\:bg-gray-600:checked:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.group\/button:hover .dark\:group-hover\/button\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:hover .dark\:group-hover\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.group:hover .dark\:group-hover\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}@media (min-width:640px){.sm\:relative{position:relative}.sm\:inset-x-auto{left:auto;right:auto}.sm\:end-0{inset-inline-end:0}.sm\:col-\[--col-span-sm\]{grid-column:var(--col-span-sm)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-start-\[--col-start-sm\]{grid-column-start:var(--col-start-sm)}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-my-2{margin-bottom:-.5rem;margin-top:-.5rem}.sm\:ms-auto{margin-inline-start:auto}.sm\:mt-7{margin-top:1.75rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:table-cell{display:table-cell}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:hidden{display:none}.sm\:w-\[calc\(100\%\+3rem\)\]{width:calc(100% + 3rem)}.sm\:w-screen{width:100vw}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-7xl{max-width:80rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-xs{max-width:20rem}.sm\:columns-\[--cols-sm\]{-moz-columns:var(--cols-sm);columns:var(--cols-sm)}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[--cols-sm\]{grid-template-columns:var(--cols-sm)}.sm\:grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.sm\:grid-rows-\[1fr_auto_3fr\]{grid-template-rows:1fr auto 3fr}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-1{gap:.25rem}.sm\:gap-3{gap:.75rem}.sm\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:p-10{padding:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.sm\:pe-3{padding-inline-end:.75rem}.sm\:pe-6{padding-inline-end:1.5rem}.sm\:ps-3{padding-inline-start:.75rem}.sm\:ps-6{padding-inline-start:1.5rem}.sm\:pt-1\.5{padding-top:.375rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:first-of-type\:ps-3:first-of-type{padding-inline-start:.75rem}.sm\:first-of-type\:ps-6:first-of-type{padding-inline-start:1.5rem}.sm\:last-of-type\:pe-3:last-of-type{padding-inline-end:.75rem}.sm\:last-of-type\:pe-6:last-of-type{padding-inline-end:1.5rem}}@media (min-width:768px){.md\:bottom-4{bottom:1rem}.md\:order-first{order:-9999}.md\:col-\[--col-span-md\]{grid-column:var(--col-span-md)}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-start-\[--col-start-md\]{grid-column-start:var(--col-start-md)}.md\:block{display:block}.md\:flex{display:flex}.md\:table-cell{display:table-cell}.md\:inline-grid{display:inline-grid}.md\:hidden{display:none}.md\:w-max{width:-moz-max-content;width:max-content}.md\:max-w-60{max-width:15rem}.md\:columns-\[--cols-md\]{-moz-columns:var(--cols-md);columns:var(--cols-md)}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[--cols-md\]{grid-template-columns:var(--cols-md)}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-1{gap:.25rem}.md\:gap-3{gap:.75rem}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(0px*var(--tw-divide-y-reverse));border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)))}.md\:overflow-x-auto{overflow-x:auto}.md\:rounded-xl{border-radius:.75rem}.md\:p-20{padding:5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:pe-6{padding-inline-end:1.5rem}.md\:ps-3{padding-inline-start:.75rem}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:z-0{z-index:0}.lg\:col-\[--col-span-lg\]{grid-column:var(--col-span-lg)}.lg\:col-start-\[--col-start-lg\]{grid-column-start:var(--col-start-lg)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:inline-grid{display:inline-grid}.lg\:hidden{display:none}.lg\:h-full{height:100%}.lg\:max-w-xs{max-width:20rem}.lg\:-translate-x-full{--tw-translate-x:-100%}.lg\:-translate-x-full,.lg\: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))}.lg\:translate-x-0{--tw-translate-x:0px}.lg\:columns-\[--cols-lg\]{-moz-columns:var(--cols-lg);columns:var(--cols-lg)}.lg\:grid-cols-\[--cols-lg\]{grid-template-columns:var(--cols-lg)}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:gap-1{gap:.25rem}.lg\:gap-3{gap:.75rem}.lg\:bg-transparent{background-color:transparent}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pe-8{padding-inline-end:2rem}.lg\:shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.lg\:shadow-none,.lg\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lg\:ring-0{--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(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)}.lg\:transition{transition-duration:.15s;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:cubic-bezier(.4,0,.2,1)}.lg\:transition-none{transition-property:none}.lg\:delay-100{transition-delay:.1s}.dark\:lg\:bg-transparent:is(.dark *){background-color:transparent}}@media (min-width:1280px){.xl\:col-\[--col-span-xl\]{grid-column:var(--col-span-xl)}.xl\:col-start-\[--col-start-xl\]{grid-column-start:var(--col-start-xl)}.xl\:block{display:block}.xl\:table-cell{display:table-cell}.xl\:inline-grid{display:inline-grid}.xl\:hidden{display:none}.xl\:columns-\[--cols-xl\]{-moz-columns:var(--cols-xl);columns:var(--cols-xl)}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[--cols-xl\]{grid-template-columns:var(--cols-xl)}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:gap-1{gap:.25rem}.xl\:gap-3{gap:.75rem}}@media (min-width:1536px){.\32xl\:col-\[--col-span-2xl\]{grid-column:var(--col-span-2xl)}.\32xl\:col-start-\[--col-start-2xl\]{grid-column-start:var(--col-start-2xl)}.\32xl\:block{display:block}.\32xl\:table-cell{display:table-cell}.\32xl\:inline-grid{display:inline-grid}.\32xl\:hidden{display:none}.\32xl\:columns-\[--cols-2xl\]{-moz-columns:var(--cols-2xl);columns:var(--cols-2xl)}.\32xl\:grid-cols-\[--cols-2xl\]{grid-template-columns:var(--cols-2xl)}.\32xl\:flex-row{flex-direction:row}.\32xl\:items-start{align-items:flex-start}.\32xl\:items-end{align-items:flex-end}.\32xl\:items-center{align-items:center}.\32xl\:gap-1{gap:.25rem}.\32xl\:gap-3{gap:.75rem}}.ltr\:hidden:where([dir=ltr],[dir=ltr] *){display:none}.rtl\:hidden:where([dir=rtl],[dir=rtl] *){display:none}.rtl\:-translate-x-0:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-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))}.rtl\:-translate-x-5:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-1.25rem;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))}.rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-100%;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))}.rtl\:translate-x-1\/2:where([dir=rtl],[dir=rtl] *){--tw-translate-x:50%;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))}.rtl\:translate-x-1\/4:where([dir=rtl],[dir=rtl] *){--tw-translate-x:25%;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))}.rtl\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:100%;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))}.rtl\:rotate-180:where([dir=rtl],[dir=rtl] *){--tw-rotate:180deg;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))}.rtl\:flex-row-reverse:where([dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.rtl\:divide-x-reverse:where([dir=rtl],[dir=rtl] *)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}@media (min-width:1024px){.rtl\:lg\:-translate-x-0:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-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))}.rtl\:lg\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:100%;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))}}.\[\&\.trix-active\]\:bg-gray-50.trix-active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.\[\&\.trix-active\]\:text-primary-600.trix-active{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity))}.dark\:\[\&\.trix-active\]\:bg-white\/5.trix-active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:\[\&\.trix-active\]\:text-primary-400.trix-active:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.\[\&\:\:-ms-reveal\]\:hidden::-ms-reveal{display:none}.\[\&\:not\(\:first-of-type\)\]\:border-s:not(:first-of-type){border-inline-start-width:1px}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-2:focus-within:not(:has(.fi-ac-action:focus)){--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(2px + 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)}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-600:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-600:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.\[\&\:not\(\:last-of-type\)\]\:border-e:not(:last-of-type){border-inline-end-width:1px}.\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.gray\.200\)\]:not(:nth-child(1 of .fi-btn)){--tw-shadow:-1px 0 0 0 rgba(var(--gray-200),1);--tw-shadow-colored:-1px 0 0 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)}.dark\:\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.white\/20\%\)\]:not(:nth-child(1 of .fi-btn)):is(.dark *){--tw-shadow:-1px 0 0 0 hsla(0,0%,100%,.2);--tw-shadow-colored:-1px 0 0 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)}.\[\&\:not\(\:nth-last-child\(1_of_\.fi-btn\)\)\]\:me-px:not(:nth-last-child(1 of .fi-btn)){margin-inline-end:1px}.\[\&\:nth-child\(1_of_\.fi-btn\)\]\:rounded-s-lg:nth-child(1 of .fi-btn){border-end-start-radius:.5rem;border-start-start-radius:.5rem}.\[\&\:nth-last-child\(1_of_\.fi-btn\)\]\:rounded-e-lg:nth-last-child(1 of .fi-btn){border-end-end-radius:.5rem;border-start-end-radius:.5rem}.\[\&\>\*\:first-child\]\:relative>:first-child{position:relative}.\[\&\>\*\:first-child\]\:mt-0>:first-child{margin-top:0}.\[\&\>\*\:first-child\]\:before\:absolute>:first-child:before{content:var(--tw-content);position:absolute}.\[\&\>\*\:first-child\]\:before\:inset-y-0>:first-child:before{bottom:0;content:var(--tw-content);top:0}.\[\&\>\*\:first-child\]\:before\:start-0>:first-child:before{content:var(--tw-content);inset-inline-start:0}.\[\&\>\*\:first-child\]\:before\:w-0\.5>:first-child:before{content:var(--tw-content);width:.125rem}.\[\&\>\*\:first-child\]\:before\:bg-primary-600>:first-child:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity));content:var(--tw-content)}.\[\&\>\*\:first-child\]\:dark\:before\:bg-primary-500:is(.dark *)>:first-child:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity));content:var(--tw-content)}.\[\&\>\*\:last-child\]\:mb-0>:last-child{margin-bottom:0}.\[\&_\.choices\\_\\_inner\]\:ps-0 .choices__inner{padding-inline-start:0}.\[\&_\.fi-badge-delete-button\]\:hidden .fi-badge-delete-button{display:none}.\[\&_\.filepond--root\]\:font-sans .filepond--root{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.\[\&_optgroup\]\:bg-white optgroup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.\[\&_optgroup\]\:dark\:bg-gray-900:is(.dark *) optgroup{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.\[\&_option\]\:bg-white option{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.\[\&_option\]\:dark\:bg-gray-900:is(.dark *) option{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}:checked+*>.\[\:checked\+\*\>\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}@media(hover:hover){.\[\@media\(hover\:hover\)\]\:transition{transition-duration:.15s;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:cubic-bezier(.4,0,.2,1)}.\[\@media\(hover\:hover\)\]\:duration-75{transition-duration:75ms}}input:checked+.\[input\:checked\+\&\]\:bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}input:checked+.\[input\:checked\+\&\]\:ring-0{--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(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)}input:checked+.\[input\:checked\+\&\]\:hover\:bg-custom-500:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-gray-500:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}input:checked:focus-visible+.\[input\:checked\:focus-visible\+\&\]\:ring-custom-500\/50{--tw-ring-color:rgba(var(--c-500),0.5)}input:checked:focus-visible+.dark\:\[input\:checked\:focus-visible\+\&\]\:ring-custom-400\/50:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}input:focus-visible+.\[input\:focus-visible\+\&\]\:z-10{z-index:10}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-2{--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(2px + 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)}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}input:focus-visible+.dark\:\[input\:focus-visible\+\&\]\:ring-white\/20:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)} \ No newline at end of file +/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-tracking:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-ease:initial;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-content:"";--tw-outline-style:solid;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-mono:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-sky-400:oklch(74.6% .16 232.661);--color-gray-100:var(--gray-100);--color-gray-200:var(--gray-200);--color-gray-300:var(--gray-300);--color-gray-400:var(--gray-400);--color-gray-500:var(--gray-500);--color-gray-600:var(--gray-600);--color-gray-700:var(--gray-700);--color-gray-900:var(--gray-900);--color-gray-950:var(--gray-950);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--leading-loose:2;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--default-mono-font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-primary-400:var(--primary-400)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}:root.dark{color-scheme:dark}[data-field-wrapper]{scroll-margin-top:8rem}}@layer components{.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{color:#fff;white-space:normal;background-color:#333;border-radius:4px;outline:0;font-size:14px;line-height:1.4;transition-property:transform,visibility,opacity;position:relative}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-width:8px 8px 0;border-top-color:initial;transform-origin:top;bottom:-7px;left:0}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-width:0 8px 8px;border-bottom-color:initial;transform-origin:bottom;top:-7px;left:0}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;transform-origin:0;right:-7px}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:100%;left:-7px}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;width:16px;height:16px}.tippy-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.tippy-content{z-index:1;padding:5px 9px;position:relative}.tippy-box[data-theme~=light]{color:#26323d;background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fi-avatar{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8);border-radius:var(--radius-md);object-fit:cover;object-position:center}.fi-avatar.fi-circular{border-radius:3.40282e38px}.fi-avatar.fi-size-sm{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.fi-avatar.fi-size-lg{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.fi-badge{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*1);border-radius:var(--radius-md);background-color:var(--gray-50);min-width:1.5rem;padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.fi-badge{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.fi-badge{--tw-ring-inset:inset}.fi-badge:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.fi-badge:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.fi-badge:not(.fi-wrapped){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-badge.fi-disabled:not(.fi-force-enabled),.fi-badge[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-badge.fi-disabled:not(.fi-force-enabled),.fi-badge[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-badge .fi-badge-label-ctn{display:grid}.fi-badge .fi-badge-label.fi-wrapped{text-wrap:wrap;word-break:break-word}.fi-badge .fi-badge-label:not(.fi-wrapped){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-badge .fi-icon{flex-shrink:0}.fi-badge.fi-size-xs{min-width:1rem;padding-inline:calc(var(--spacing)*.5);padding-block:calc(var(--spacing)*0);--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.fi-badge.fi-size-sm{min-width:1.25rem;padding-inline:calc(var(--spacing)*1.5);padding-block:calc(var(--spacing)*.5);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.fi-badge.fi-color{background-color:var(--color-50);color:var(--text);--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)10%,transparent)}}.fi-badge.fi-color:where(.dark,.dark *){background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-badge.fi-color:where(.dark,.dark *){color:var(--dark-text);--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon{color:var(--color-700)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon{color:color-mix(in oklab,var(--color-700)50%,transparent)}}.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:var(--color-300)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:color-mix(in oklab,var(--color-300)50%,transparent)}}.fi-badge:not(.fi-color) .fi-icon{color:var(--gray-400)}.fi-badge:not(.fi-color) .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-badge .fi-badge-delete-btn{margin-block:calc(var(--spacing)*-1);padding:calc(var(--spacing)*1);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;justify-content:center;align-items:center;margin-inline-start:calc(var(--spacing)*-1);margin-inline-end:calc(var(--spacing)*-2);transition-duration:75ms;display:flex}.fi-badge .fi-badge-delete-btn>.fi-icon{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-badge .fi-badge-delete-btn>.fi-icon{color:color-mix(in oklab,var(--gray-700)50%,transparent)}}.fi-badge .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-badge .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)50%,transparent)}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:focus-visible{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:focus-visible{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}@media (hover:hover){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:color-mix(in oklab,var(--gray-300)75%,transparent)}}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:color-mix(in oklab,var(--gray-300)75%,transparent)}}@media (hover:hover){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:hover{color:var(--color-700)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:hover{color:color-mix(in oklab,var(--color-700)75%,transparent)}}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:focus-visible{color:var(--color-700)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:focus-visible{color:color-mix(in oklab,var(--color-700)75%,transparent)}}@media (hover:hover){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:var(--color-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:color-mix(in oklab,var(--color-300)75%,transparent)}}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:var(--color-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:color-mix(in oklab,var(--color-300)75%,transparent)}}.fi-breadcrumbs ol{align-items:center;column-gap:calc(var(--spacing)*2);flex-wrap:wrap;display:flex}.fi-breadcrumbs ol li{align-items:center;column-gap:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);display:flex}.fi-breadcrumbs ol li:where(.dark,.dark *){color:var(--gray-400)}.fi-breadcrumbs ol li a{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-breadcrumbs ol li a:hover{color:var(--gray-700)}.fi-breadcrumbs ol li a:where(.dark,.dark *):hover{color:var(--gray-200)}}.fi-breadcrumbs ol li .fi-icon{color:var(--gray-400);display:flex}.fi-breadcrumbs ol li .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-breadcrumbs ol li .fi-icon.fi-ltr:where(:dir(rtl),[dir=rtl],[dir=rtl] *),.fi-breadcrumbs ol li .fi-icon.fi-rtl:where(:dir(ltr),[dir=ltr],[dir=ltr] *){display:none}.fi-btn{justify-content:center;align-items:center;gap:calc(var(--spacing)*1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;grid-auto-flow:column;transition-duration:75ms;display:inline-grid;position:relative}:is(.fi-btn.fi-force-enabled,.fi-btn:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn.fi-disabled:not(.fi-force-enabled),.fi-btn[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-btn.fi-disabled:not(.fi-force-enabled),.fi-btn[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-btn>.fi-icon{color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-btn.fi-size-xs{gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-btn.fi-size-sm{gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-btn.fi-size-lg{gap:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3.5);padding-block:calc(var(--spacing)*2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-btn.fi-size-xl{gap:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-btn.fi-outlined{color:var(--gray-950);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-300)}.fi-btn.fi-outlined:where(.dark,.dark *){color:var(--color-white);--tw-ring-color:var(--gray-700)}@media (hover:hover){:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):hover{background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}}:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--gray-400)40%,transparent)}}.fi-btn.fi-outlined.fi-color{color:var(--text);--tw-ring-color:var(--color-600)}.fi-btn.fi-outlined.fi-color:where(.dark,.dark *){color:var(--dark-text);--tw-ring-color:var(--color-500)}@media (hover:hover){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):hover{background-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):hover{background-color:color-mix(in oklab,var(--color-500)10%,transparent)}}}:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-500)40%,transparent)}}@media (hover:hover){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-600)10%,transparent)}}}:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-400)40%,transparent)}}.fi-btn.fi-outlined.fi-color>.fi-icon{color:var(--color-600)}.fi-btn.fi-outlined.fi-color>.fi-icon:where(.dark,.dark *){color:var(--color-400)}.fi-btn:not(.fi-outlined){background-color:var(--color-white);color:var(--gray-950)}.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-btn:not(.fi-outlined):where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){:is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-50)}:is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}}input:checked+label.fi-btn:not(.fi-outlined){background-color:var(--gray-400);color:var(--color-white);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:checked+label.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:var(--gray-600)}@media (hover:hover){:is(input:checked+label.fi-btn:not(.fi-outlined).fi-force-enabled,input:checked+label.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-300)}:is(input:checked+label.fi-btn:not(.fi-outlined).fi-force-enabled,input:checked+label.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--gray-500)}}.fi-btn:not(.fi-outlined).fi-color:not(label){background-color:var(--bg);color:var(--text)}.fi-btn:not(.fi-outlined).fi-color:not(label):where(.dark,.dark *){background-color:var(--dark-bg);color:var(--dark-text)}@media (hover:hover){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):hover{background-color:var(--hover-bg);color:var(--hover-text)}}:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-500)50%,transparent)}}@media (hover:hover){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--dark-hover-bg);color:var(--dark-hover-text)}}:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-400)50%,transparent)}}.fi-btn:not(.fi-outlined).fi-color:not(label)>.fi-icon{color:var(--text)}.fi-btn:not(.fi-outlined).fi-color:not(label)>.fi-icon:where(.dark,.dark *){color:var(--dark-text)}input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color){background-color:var(--bg);color:var(--text);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color):where(.dark,.dark *){background-color:var(--dark-bg);color:var(--dark-text)}@media (hover:hover){input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):hover{background-color:var(--hover-bg);color:var(--hover-text)}input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--dark-hover-bg);color:var(--dark-hover-text)}}input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){z-index:10;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:color-mix(in oklab,var(--color-500)50%,transparent)}}input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)50%,transparent)}}label.fi-btn{cursor:pointer}label.fi-btn>.fi-icon:is(:checked+label>.fi-icon){color:var(--text)}label.fi-btn>.fi-icon:is(:checked+label>.fi-icon):where(.dark,.dark *){color:var(--dark-text)}.fi-btn:not(.fi-color),label.fi-btn{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-btn:not(.fi-color),label.fi-btn{--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}:is(.fi-btn:not(.fi-color),label.fi-btn):where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-color),label.fi-btn):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-btn.fi-labeled-from-sm,.fi-btn.fi-labeled-from-md,.fi-btn.fi-labeled-from-lg,.fi-btn.fi-labeled-from-xl,.fi-btn.fi-labeled-from-2xl{display:none}@media (min-width:40rem){.fi-btn.fi-labeled-from-sm{display:inline-grid}}@media (min-width:48rem){.fi-btn.fi-labeled-from-md{display:inline-grid}}@media (min-width:64rem){.fi-btn.fi-labeled-from-lg{display:inline-grid}}@media (min-width:80rem){.fi-btn.fi-labeled-from-xl{display:inline-grid}}@media (min-width:96rem){.fi-btn.fi-labeled-from-2xl{display:inline-grid}}.fi-btn .fi-btn-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*0);z-index:1;--tw-translate-x:calc(calc(1/2*100%)*-1);--tw-translate-y:calc(calc(1/2*100%)*-1);width:max-content;translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-md);background-color:var(--color-white);display:flex;position:absolute}.fi-btn .fi-btn-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-btn .fi-btn-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.fi-btn-group{border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);grid-auto-flow:column;display:grid}.fi-btn-group:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-btn-group:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-btn-group>.fi-btn{border-radius:0;flex:1}.fi-btn-group>.fi-btn:nth-child(1 of .fi-btn){border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.fi-btn-group>.fi-btn:nth-last-child(1 of .fi-btn){border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)){--tw-shadow:-1px 0 0 0 var(--tw-shadow-color,var(--color-gray-200));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)):where(.dark,.dark *){--tw-shadow:-1px 0 0 0 var(--tw-shadow-color,#fff3);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(:nth-last-child(1 of .fi-btn)){margin-inline-end:1px}.fi-btn-group>.fi-btn.fi-processing:enabled{cursor:wait;opacity:.7}.fi-btn-group>.fi-btn:not(.fi-outlined){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(.fi-color),label:is(.fi-btn-group>.fi-btn){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-callout{gap:calc(var(--spacing)*3);border-radius:var(--radius-xl);background-color:var(--color-white);width:100%;padding:calc(var(--spacing)*4);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950);display:flex}@supports (color:color-mix(in lab, red, red)){.fi-callout{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-callout:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-callout:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-callout .fi-callout-icon{color:var(--gray-400)}.fi-callout .fi-callout-icon.fi-color{color:var(--color-400)}.fi-callout .fi-callout-main{margin-top:calc(var(--spacing)*.5);gap:calc(var(--spacing)*3);flex:1;display:grid}.fi-callout .fi-callout-text{gap:calc(var(--spacing)*1);display:grid}.fi-callout .fi-callout-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-callout .fi-callout-heading:where(.dark,.dark *){color:var(--color-white)}.fi-callout .fi-callout-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-wrap:pretty;overflow-wrap:break-word;color:var(--gray-500);overflow:hidden}.fi-callout .fi-callout-description:where(.dark,.dark *){color:var(--gray-400)}.fi-callout .fi-callout-description>p:not(:first-of-type){margin-top:calc(var(--spacing)*1)}.fi-callout .fi-callout-footer{gap:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}.fi-callout.fi-color{--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)20%,transparent)}}.fi-callout.fi-color:where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.fi-callout.fi-color{background-color:#fff}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color{background-color:color-mix(in oklab,white 90%,var(--color-400))}}.fi-callout.fi-color:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)90%,var(--color-400))}}.fi-callout.fi-color .fi-callout-description{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color .fi-callout-description{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}.fi-callout.fi-color .fi-callout-description:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color .fi-callout-description:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)75%,transparent)}}.fi-dropdown-header{gap:calc(var(--spacing)*2);width:100%;padding:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);display:flex}.fi-dropdown-header .fi-icon{color:var(--gray-400)}.fi-dropdown-header .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-dropdown-header span{text-overflow:ellipsis;white-space:nowrap;text-align:start;color:var(--gray-700);flex:1;overflow:hidden}.fi-dropdown-header span:where(.dark,.dark *){color:var(--gray-200)}.fi-dropdown-header.fi-color .fi-icon{color:var(--color-500)}.fi-dropdown-header.fi-color .fi-icon:where(.dark,.dark *){color:var(--color-400)}.fi-dropdown-header.fi-color span{color:var(--text)}.fi-dropdown-header.fi-color span:where(.dark,.dark *){color:var(--dark-text)}:scope .fi-dropdown-trigger{cursor:pointer;display:flex}:scope .fi-dropdown-panel{z-index:20;border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100vw;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;max-width:14rem!important}:scope .fi-dropdown-panel:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:scope .fi-dropdown-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:where(:scope .fi-dropdown-panel:not(.fi-dropdown-list)>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100)}:where(:scope .fi-dropdown-panel:not(.fi-dropdown-list):where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(:scope .fi-dropdown-panel:not(.fi-dropdown-list):where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:scope .fi-dropdown-panel.fi-opacity-0{opacity:0}:scope .fi-dropdown-panel.fi-width-xs{max-width:var(--container-xs)!important}:scope .fi-dropdown-panel.fi-width-sm{max-width:var(--container-sm)!important}:scope .fi-dropdown-panel.fi-width-md{max-width:var(--container-md)!important}:scope .fi-dropdown-panel.fi-width-lg{max-width:var(--container-lg)!important}:scope .fi-dropdown-panel.fi-width-xl{max-width:var(--container-xl)!important}:scope .fi-dropdown-panel.fi-width-2xl{max-width:var(--container-2xl)!important}:scope .fi-dropdown-panel.fi-width-3xl{max-width:var(--container-3xl)!important}:scope .fi-dropdown-panel.fi-width-4xl{max-width:var(--container-4xl)!important}:scope .fi-dropdown-panel.fi-width-5xl{max-width:var(--container-5xl)!important}:scope .fi-dropdown-panel.fi-width-6xl{max-width:var(--container-6xl)!important}:scope .fi-dropdown-panel.fi-width-7xl{max-width:var(--container-7xl)!important}:scope .fi-dropdown-panel.fi-scrollable{overflow-y:auto}.fi-dropdown-list{padding:calc(var(--spacing)*1);gap:1px;display:grid}.fi-dropdown-list>.fi-grid{overflow-x:hidden}.fi-dropdown-list-item{align-items:center;gap:calc(var(--spacing)*2);border-radius:var(--radius-md);width:100%;padding:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;-webkit-user-select:none;user-select:none;outline-style:none;transition-duration:75ms;display:flex;overflow:hidden}@media (hover:hover){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):hover{background-color:var(--gray-50)}}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected{background-color:var(--gray-50)}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-dropdown-list-item.fi-disabled,.fi-dropdown-list-item[disabled]{cursor:default;opacity:.7}:is(.fi-dropdown-list-item.fi-disabled,.fi-dropdown-list-item[disabled]):not([x-tooltip]){pointer-events:none}.fi-dropdown-list-item .fi-icon{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-dropdown-list-item .fi-dropdown-list-item-image{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);background-position:50%;background-size:cover;border-radius:3.40282e38px}.fi-dropdown-list-item>.fi-icon{color:var(--gray-400)}.fi-dropdown-list-item>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-dropdown-list-item>.fi-icon.fi-color{color:var(--color-500)}.fi-dropdown-list-item>.fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}@media (hover:hover){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):hover{background-color:var(--color-50)}}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):focus-visible{background-color:var(--color-50)}@media (hover:hover){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected{background-color:var(--color-50)}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label{color:var(--text)}@media (hover:hover){.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:hover{color:var(--hover-text)}}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:where(.dark,.dark *){color:var(--dark-text)}@media (hover:hover){.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:where(.dark,.dark *):hover{color:var(--dark-hover-text)}}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label.fi-selected{color:var(--hover-text)}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label.fi-selected:where(.dark,.dark *){color:var(--dark-hover-text)}.fi-dropdown-list-item .fi-badge{min-width:1.25rem;padding-inline:calc(var(--spacing)*1.5);padding-block:calc(var(--spacing)*.5);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.fi-dropdown-list-item-label{text-overflow:ellipsis;white-space:nowrap;text-align:start;color:var(--gray-700);flex:1;overflow:hidden}.fi-dropdown-list-item-label:where(.dark,.dark *){color:var(--gray-200)}.fi-empty-state{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*12)}.fi-empty-state:not(.fi-empty-state-not-contained){border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-empty-state:not(.fi-empty-state-not-contained):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-empty-state:not(.fi-empty-state-not-contained):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-empty-state .fi-empty-state-content{max-width:var(--container-lg);text-align:center;justify-items:center;margin-inline:auto;display:grid}.fi-empty-state .fi-empty-state-text-ctn{text-align:center;justify-items:center;display:grid}.fi-empty-state .fi-empty-state-icon-bg{margin-bottom:calc(var(--spacing)*4);background-color:var(--gray-100);padding:calc(var(--spacing)*3);border-radius:3.40282e38px}.fi-empty-state .fi-empty-state-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab, red, red)){.fi-empty-state .fi-empty-state-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.fi-empty-state .fi-empty-state-icon-bg.fi-color{background-color:var(--color-100)}.fi-empty-state .fi-empty-state-icon-bg.fi-color:where(.dark,.dark *){background-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){.fi-empty-state .fi-empty-state-icon-bg.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-500)20%,transparent)}}.fi-empty-state .fi-empty-state-icon-bg .fi-icon{color:var(--gray-500)}.fi-empty-state .fi-empty-state-icon-bg .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-empty-state .fi-empty-state-icon-bg .fi-icon.fi-color{color:var(--color-500)}.fi-empty-state .fi-empty-state-icon-bg .fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.fi-empty-state .fi-empty-state-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-empty-state .fi-empty-state-heading:where(.dark,.dark *){color:var(--color-white)}.fi-empty-state .fi-empty-state-description{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-empty-state .fi-empty-state-description:where(.dark,.dark *){color:var(--gray-400)}.fi-empty-state .fi-empty-state-footer{margin-top:calc(var(--spacing)*6)}.fi-empty-state.fi-compact{padding-block:calc(var(--spacing)*6)}.fi-empty-state.fi-compact .fi-empty-state-content{margin-inline:calc(var(--spacing)*0);align-items:flex-start;gap:calc(var(--spacing)*4);text-align:start;max-width:none;display:flex}.fi-empty-state.fi-compact .fi-empty-state-icon-bg{margin-bottom:calc(var(--spacing)*0);flex-shrink:0}.fi-empty-state.fi-compact .fi-empty-state-text-ctn{text-align:start;flex:1;justify-items:start}.fi-empty-state.fi-compact .fi-empty-state-description{margin-top:calc(var(--spacing)*1)}.fi-empty-state.fi-compact .fi-empty-state-footer{margin-top:calc(var(--spacing)*4)}.fi-fieldset>legend{padding-inline:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);margin-inline-start:calc(var(--spacing)*-2)}.fi-fieldset>legend:where(.dark,.dark *){color:var(--color-white)}.fi-fieldset>legend .fi-fieldset-label-required-mark{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-600)}.fi-fieldset>legend .fi-fieldset-label-required-mark:where(.dark,.dark *){color:var(--danger-400)}.fi-fieldset.fi-fieldset-label-hidden>legend{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.fi-fieldset:not(.fi-fieldset-not-contained){border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);padding:calc(var(--spacing)*6)}.fi-fieldset:not(.fi-fieldset-not-contained):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fieldset:not(.fi-fieldset-not-contained):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fieldset.fi-fieldset-not-contained{padding-top:calc(var(--spacing)*6)}.fi-grid:not(.fi-grid-direction-col){grid-template-columns:var(--cols-default);display:grid}@media (min-width:40rem){.fi-grid:not(.fi-grid-direction-col).sm\:fi-grid-cols{grid-template-columns:var(--cols-sm)}}@media (min-width:48rem){.fi-grid:not(.fi-grid-direction-col).md\:fi-grid-cols{grid-template-columns:var(--cols-md)}}@media (min-width:64rem){.fi-grid:not(.fi-grid-direction-col).lg\:fi-grid-cols{grid-template-columns:var(--cols-lg)}}@media (min-width:80rem){.fi-grid:not(.fi-grid-direction-col).xl\:fi-grid-cols{grid-template-columns:var(--cols-xl)}}@media (min-width:96rem){.fi-grid:not(.fi-grid-direction-col).\32 xl\:fi-grid-cols{grid-template-columns:var(--cols-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid:not(.fi-grid-direction-col).\@3xs\:fi-grid-cols{grid-template-columns:var(--cols-c3xs)}}@container (min-width:18rem){.fi-grid:not(.fi-grid-direction-col).\@2xs\:fi-grid-cols{grid-template-columns:var(--cols-c2xs)}}@container (min-width:20rem){.fi-grid:not(.fi-grid-direction-col).\@xs\:fi-grid-cols{grid-template-columns:var(--cols-cxs)}}@container (min-width:24rem){.fi-grid:not(.fi-grid-direction-col).\@sm\:fi-grid-cols{grid-template-columns:var(--cols-csm)}}@container (min-width:28rem){.fi-grid:not(.fi-grid-direction-col).\@md\:fi-grid-cols{grid-template-columns:var(--cols-cmd)}}@container (min-width:32rem){.fi-grid:not(.fi-grid-direction-col).\@lg\:fi-grid-cols{grid-template-columns:var(--cols-clg)}}@container (min-width:36rem){.fi-grid:not(.fi-grid-direction-col).\@xl\:fi-grid-cols{grid-template-columns:var(--cols-cxl)}}@container (min-width:42rem){.fi-grid:not(.fi-grid-direction-col).\@2xl\:fi-grid-cols{grid-template-columns:var(--cols-c2xl)}}@container (min-width:48rem){.fi-grid:not(.fi-grid-direction-col).\@3xl\:fi-grid-cols{grid-template-columns:var(--cols-c3xl)}}@container (min-width:56rem){.fi-grid:not(.fi-grid-direction-col).\@4xl\:fi-grid-cols{grid-template-columns:var(--cols-c4xl)}}@container (min-width:64rem){.fi-grid:not(.fi-grid-direction-col).\@5xl\:fi-grid-cols{grid-template-columns:var(--cols-c5xl)}}@container (min-width:72rem){.fi-grid:not(.fi-grid-direction-col).\@6xl\:fi-grid-cols{grid-template-columns:var(--cols-c6xl)}}@container (min-width:80rem){.fi-grid:not(.fi-grid-direction-col).\@7xl\:fi-grid-cols{grid-template-columns:var(--cols-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid:not(.fi-grid-direction-col).\!\@sm\:fi-grid-cols{grid-template-columns:var(--cols-ncsm)}}@media (min-width:48rem){.fi-grid:not(.fi-grid-direction-col).\!\@md\:fi-grid-cols{grid-template-columns:var(--cols-ncmd)}}@media (min-width:64rem){.fi-grid:not(.fi-grid-direction-col).\!\@lg\:fi-grid-cols{grid-template-columns:var(--cols-nclg)}}@media (min-width:80rem){.fi-grid:not(.fi-grid-direction-col).\!\@xl\:fi-grid-cols{grid-template-columns:var(--cols-ncxl)}}@media (min-width:96rem){.fi-grid:not(.fi-grid-direction-col).\!\@2xl\:fi-grid-cols{grid-template-columns:var(--cols-nc2xl)}}}.fi-grid.fi-grid-direction-col{columns:var(--cols-default)}@media (min-width:40rem){.fi-grid.fi-grid-direction-col.sm\:fi-grid-cols{columns:var(--cols-sm)}}@media (min-width:48rem){.fi-grid.fi-grid-direction-col.md\:fi-grid-cols{columns:var(--cols-md)}}@media (min-width:64rem){.fi-grid.fi-grid-direction-col.lg\:fi-grid-cols{columns:var(--cols-lg)}}@media (min-width:80rem){.fi-grid.fi-grid-direction-col.xl\:fi-grid-cols{columns:var(--cols-xl)}}@media (min-width:96rem){.fi-grid.fi-grid-direction-col.\32 xl\:fi-grid-cols{columns:var(--cols-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid.fi-grid-direction-col.\@3xs\:fi-grid-cols{columns:var(--cols-c3xs)}}@container (min-width:18rem){.fi-grid.fi-grid-direction-col.\@2xs\:fi-grid-cols{columns:var(--cols-c2xs)}}@container (min-width:20rem){.fi-grid.fi-grid-direction-col.\@xs\:fi-grid-cols{columns:var(--cols-cxs)}}@container (min-width:24rem){.fi-grid.fi-grid-direction-col.\@sm\:fi-grid-cols{columns:var(--cols-csm)}}@container (min-width:28rem){.fi-grid.fi-grid-direction-col.\@md\:fi-grid-cols{columns:var(--cols-cmd)}}@container (min-width:32rem){.fi-grid.fi-grid-direction-col.\@lg\:fi-grid-cols{columns:var(--cols-clg)}}@container (min-width:36rem){.fi-grid.fi-grid-direction-col.\@xl\:fi-grid-cols{columns:var(--cols-cxl)}}@container (min-width:42rem){.fi-grid.fi-grid-direction-col.\@2xl\:fi-grid-cols{columns:var(--cols-c2xl)}}@container (min-width:48rem){.fi-grid.fi-grid-direction-col.\@3xl\:fi-grid-cols{columns:var(--cols-c3xl)}}@container (min-width:56rem){.fi-grid.fi-grid-direction-col.\@4xl\:fi-grid-cols{columns:var(--cols-c4xl)}}@container (min-width:64rem){.fi-grid.fi-grid-direction-col.\@5xl\:fi-grid-cols{columns:var(--cols-c5xl)}}@container (min-width:72rem){.fi-grid.fi-grid-direction-col.\@6xl\:fi-grid-cols{columns:var(--cols-c6xl)}}@container (min-width:80rem){.fi-grid.fi-grid-direction-col.\@7xl\:fi-grid-cols{columns:var(--cols-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid.fi-grid-direction-col.\!\@sm\:fi-grid-cols{columns:var(--cols-ncsm)}}@media (min-width:48rem){.fi-grid.fi-grid-direction-col.\!\@md\:fi-grid-cols{columns:var(--cols-ncmd)}}@media (min-width:64rem){.fi-grid.fi-grid-direction-col.\!\@lg\:fi-grid-cols{columns:var(--cols-nclg)}}@media (min-width:80rem){.fi-grid.fi-grid-direction-col.\!\@xl\:fi-grid-cols{columns:var(--cols-ncxl)}}@media (min-width:96rem){.fi-grid.fi-grid-direction-col.\!\@2xl\:fi-grid-cols{columns:var(--cols-nc2xl)}}}@supports (container-type:inline-size){.fi-grid-ctn{container-type:inline-size}}.fi-grid-col{grid-column:var(--col-span-default)}@media (min-width:40rem){.fi-grid-col.sm\:fi-grid-col-span{grid-column:var(--col-span-sm)}}@media (min-width:48rem){.fi-grid-col.md\:fi-grid-col-span{grid-column:var(--col-span-md)}}@media (min-width:64rem){.fi-grid-col.lg\:fi-grid-col-span{grid-column:var(--col-span-lg)}}@media (min-width:80rem){.fi-grid-col.xl\:fi-grid-col-span{grid-column:var(--col-span-xl)}}@media (min-width:96rem){.fi-grid-col.\32 xl\:fi-grid-col-span{grid-column:var(--col-span-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid-col.\@3xs\:fi-grid-col-span{grid-column:var(--col-span-c3xs)}}@container (min-width:18rem){.fi-grid-col.\@2xs\:fi-grid-col-span{grid-column:var(--col-span-c2xs)}}@container (min-width:20rem){.fi-grid-col.\@xs\:fi-grid-col-span{grid-column:var(--col-span-cxs)}}@container (min-width:24rem){.fi-grid-col.\@sm\:fi-grid-col-span{grid-column:var(--col-span-csm)}}@container (min-width:28rem){.fi-grid-col.\@md\:fi-grid-col-span{grid-column:var(--col-span-cmd)}}@container (min-width:32rem){.fi-grid-col.\@lg\:fi-grid-col-span{grid-column:var(--col-span-clg)}}@container (min-width:36rem){.fi-grid-col.\@xl\:fi-grid-col-span{grid-column:var(--col-span-cxl)}}@container (min-width:42rem){.fi-grid-col.\@2xl\:fi-grid-col-span{grid-column:var(--col-span-c2xl)}}@container (min-width:48rem){.fi-grid-col.\@3xl\:fi-grid-col-span{grid-column:var(--col-span-c3xl)}}@container (min-width:56rem){.fi-grid-col.\@4xl\:fi-grid-col-span{grid-column:var(--col-span-c4xl)}}@container (min-width:64rem){.fi-grid-col.\@5xl\:fi-grid-col-span{grid-column:var(--col-span-c5xl)}}@container (min-width:72rem){.fi-grid-col.\@6xl\:fi-grid-col-span{grid-column:var(--col-span-c6xl)}}@container (min-width:80rem){.fi-grid-col.\@7xl\:fi-grid-col-span{grid-column:var(--col-span-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid-col.\!\@sm\:fi-grid-col-span{grid-column:var(--col-span-ncsm)}}@media (min-width:48rem){.fi-grid-col.\!\@md\:fi-grid-col-span{grid-column:var(--col-span-ncmd)}}@media (min-width:64rem){.fi-grid-col.\!\@lg\:fi-grid-col-span{grid-column:var(--col-span-nclg)}}@media (min-width:80rem){.fi-grid-col.\!\@xl\:fi-grid-col-span{grid-column:var(--col-span-ncxl)}}@media (min-width:96rem){.fi-grid-col.\!\@2xl\:fi-grid-col-span{grid-column:var(--col-span-nc2xl)}}}.fi-grid-col.fi-grid-col-start{grid-column-start:var(--col-start-default)}@media (min-width:40rem){.fi-grid-col.sm\:fi-grid-col-start{grid-column-start:var(--col-start-sm)}}@media (min-width:48rem){.fi-grid-col.md\:fi-grid-col-start{grid-column-start:var(--col-start-md)}}@media (min-width:64rem){.fi-grid-col.lg\:fi-grid-col-start{grid-column-start:var(--col-start-lg)}}@media (min-width:80rem){.fi-grid-col.xl\:fi-grid-col-start{grid-column-start:var(--col-start-xl)}}@media (min-width:96rem){.fi-grid-col.\32 xl\:fi-grid-col-start{grid-column-start:var(--col-start-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid-col.\@3xs\:fi-grid-col-start{grid-column-start:var(--col-start-c3xs)}}@container (min-width:18rem){.fi-grid-col.\@2xs\:fi-grid-col-start{grid-column-start:var(--col-start-c2xs)}}@container (min-width:20rem){.fi-grid-col.\@xs\:fi-grid-col-start{grid-column-start:var(--col-start-cxs)}}@container (min-width:24rem){.fi-grid-col.\@sm\:fi-grid-col-start{grid-column-start:var(--col-start-csm)}}@container (min-width:28rem){.fi-grid-col.\@md\:fi-grid-col-start{grid-column-start:var(--col-start-cmd)}}@container (min-width:32rem){.fi-grid-col.\@lg\:fi-grid-col-start{grid-column-start:var(--col-start-clg)}}@container (min-width:36rem){.fi-grid-col.\@xl\:fi-grid-col-start{grid-column-start:var(--col-start-cxl)}}@container (min-width:42rem){.fi-grid-col.\@2xl\:fi-grid-col-start{grid-column-start:var(--col-start-c2xl)}}@container (min-width:48rem){.fi-grid-col.\@3xl\:fi-grid-col-start{grid-column-start:var(--col-start-c3xl)}}@container (min-width:56rem){.fi-grid-col.\@4xl\:fi-grid-col-start{grid-column-start:var(--col-start-c4xl)}}@container (min-width:64rem){.fi-grid-col.\@5xl\:fi-grid-col-start{grid-column-start:var(--col-start-c5xl)}}@container (min-width:72rem){.fi-grid-col.\@6xl\:fi-grid-col-start{grid-column-start:var(--col-start-c6xl)}}@container (min-width:80rem){.fi-grid-col.\@7xl\:fi-grid-col-start{grid-column-start:var(--col-start-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid-col.\!\@sm\:fi-grid-col-start{grid-column-start:var(--col-start-ncsm)}}@media (min-width:48rem){.fi-grid-col.\!\@md\:fi-grid-col-start{grid-column-start:var(--col-start-ncmd)}}@media (min-width:64rem){.fi-grid-col.\!\@lg\:fi-grid-col-start{grid-column-start:var(--col-start-nclg)}}@media (min-width:80rem){.fi-grid-col.\!\@xl\:fi-grid-col-start{grid-column-start:var(--col-start-ncxl)}}@media (min-width:96rem){.fi-grid-col.\!\@2xl\:fi-grid-col-start{grid-column-start:var(--col-start-nc2xl)}}}.fi-grid-col.fi-grid-col-order{order:var(--col-order-default)}@media (min-width:40rem){.fi-grid-col.sm\:fi-grid-col-order{order:var(--col-order-sm)}}@media (min-width:48rem){.fi-grid-col.md\:fi-grid-col-order{order:var(--col-order-md)}}@media (min-width:64rem){.fi-grid-col.lg\:fi-grid-col-order{order:var(--col-order-lg)}}@media (min-width:80rem){.fi-grid-col.xl\:fi-grid-col-order{order:var(--col-order-xl)}}@media (min-width:96rem){.fi-grid-col.\32 xl\:fi-grid-col-order{order:var(--col-order-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid-col.\@3xs\:fi-grid-col-order{order:var(--col-order-c3xs)}}@container (min-width:18rem){.fi-grid-col.\@2xs\:fi-grid-col-order{order:var(--col-order-c2xs)}}@container (min-width:20rem){.fi-grid-col.\@xs\:fi-grid-col-order{order:var(--col-order-cxs)}}@container (min-width:24rem){.fi-grid-col.\@sm\:fi-grid-col-order{order:var(--col-order-csm)}}@container (min-width:28rem){.fi-grid-col.\@md\:fi-grid-col-order{order:var(--col-order-cmd)}}@container (min-width:32rem){.fi-grid-col.\@lg\:fi-grid-col-order{order:var(--col-order-clg)}}@container (min-width:36rem){.fi-grid-col.\@xl\:fi-grid-col-order{order:var(--col-order-cxl)}}@container (min-width:42rem){.fi-grid-col.\@2xl\:fi-grid-col-order{order:var(--col-order-c2xl)}}@container (min-width:48rem){.fi-grid-col.\@3xl\:fi-grid-col-order{order:var(--col-order-c3xl)}}@container (min-width:56rem){.fi-grid-col.\@4xl\:fi-grid-col-order{order:var(--col-order-c4xl)}}@container (min-width:64rem){.fi-grid-col.\@5xl\:fi-grid-col-order{order:var(--col-order-c5xl)}}@container (min-width:72rem){.fi-grid-col.\@6xl\:fi-grid-col-order{order:var(--col-order-c6xl)}}@container (min-width:80rem){.fi-grid-col.\@7xl\:fi-grid-col-order{order:var(--col-order-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid-col.\!\@sm\:fi-grid-col-order{order:var(--col-order-ncsm)}}@media (min-width:48rem){.fi-grid-col.\!\@md\:fi-grid-col-order{order:var(--col-order-ncmd)}}@media (min-width:64rem){.fi-grid-col.\!\@lg\:fi-grid-col-order{order:var(--col-order-nclg)}}@media (min-width:80rem){.fi-grid-col.\!\@xl\:fi-grid-col-order{order:var(--col-order-ncxl)}}@media (min-width:96rem){.fi-grid-col.\!\@2xl\:fi-grid-col-order{order:var(--col-order-nc2xl)}}}.fi-grid-col.fi-hidden{display:none}.fi-icon{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.fi-icon.fi-size-xs{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.fi-icon.fi-size-sm{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.fi-icon.fi-size-md{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.fi-icon.fi-size-lg{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.fi-icon.fi-size-xl{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.fi-icon.fi-size-2xl{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.fi-icon>svg{height:inherit;width:inherit}.fi-icon-btn{margin:calc(var(--spacing)*-2);width:calc(var(--spacing)*9);height:calc(var(--spacing)*9);border-radius:var(--radius-lg);color:var(--gray-500);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;justify-content:center;align-items:center;transition-duration:75ms;display:flex;position:relative}.fi-icon-btn:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):hover{color:var(--gray-600)}}:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}@media (hover:hover){:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{color:var(--gray-400)}}:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500)}.fi-icon-btn.fi-disabled:not(.fi-force-enabled),.fi-icon-btn[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-icon-btn.fi-disabled:not(.fi-force-enabled),.fi-icon-btn[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-icon-btn.fi-size-xs{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-1.5)}.fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-1)}.fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-.5)}.fi-icon-btn.fi-size-sm{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-2)}.fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-1.5)}.fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-1)}.fi-icon-btn.fi-size-md:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-2.5)}.fi-icon-btn.fi-size-md:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-1.5)}.fi-icon-btn.fi-size-lg{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-3)}.fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-2.5)}.fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-2)}.fi-icon-btn.fi-size-xl{width:calc(var(--spacing)*11);height:calc(var(--spacing)*11)}.fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-3.5)}.fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-3)}.fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-2.5)}.fi-icon-btn.fi-color{color:var(--text)}.fi-icon-btn.fi-color:where(.dark,.dark *){color:var(--dark-text)}@media (hover:hover){:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):hover{color:var(--hover-text)}}:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-600)}@media (hover:hover){:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{color:var(--dark-hover-text)}}:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-500)}.fi-icon-btn>.fi-icon-btn-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*1);z-index:1;--tw-translate-x:calc(calc(1/2*100%)*-1);--tw-translate-y:calc(calc(1/2*100%)*-1);width:max-content;translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-md);background-color:var(--color-white);display:flex;position:absolute}.fi-icon-btn>.fi-icon-btn-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-icon-btn>.fi-icon-btn-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}@media (min-width:40rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-sm){display:none}}@media (min-width:48rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-md){display:none}}@media (min-width:64rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-lg){display:none}}@media (min-width:80rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-xl){display:none}}@media (min-width:96rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-2xl){display:none}}input[type=checkbox].fi-checkbox-input{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);appearance:none;--tw-border-style:none;background-color:var(--color-white);vertical-align:middle;color:var(--primary-600);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-style:none;border-radius:.25rem}input[type=checkbox].fi-checkbox-input:checked{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input[type=checkbox].fi-checkbox-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}input[type=checkbox].fi-checkbox-input:checked:focus{--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input:disabled{pointer-events:none;background-color:var(--gray-50);color:var(--gray-50)}input[type=checkbox].fi-checkbox-input:disabled:checked{background-color:var(--gray-400);color:var(--gray-400)}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){color:var(--primary-500);--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked{background-color:var(--primary-500)}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):focus{--tw-ring-color:var(--primary-500)}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled{--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled:checked{background-color:var(--gray-600)}input[type=checkbox].fi-checkbox-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}input[type=checkbox].fi-checkbox-input:indeterminate{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input[type=checkbox].fi-checkbox-input:indeterminate:where(.dark,.dark *){background-color:var(--primary-500)}input[type=checkbox].fi-checkbox-input:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.5 6.75a1.25 1.25 0 0 0 0 2.5h7a1.25 1.25 0 0 0 0-2.5h-7z'/%3E%3C/svg%3E")}input[type=checkbox].fi-checkbox-input:indeterminate:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:indeterminate:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}input[type=checkbox].fi-checkbox-input:indeterminate:disabled{background-color:var(--gray-400)}input[type=checkbox].fi-checkbox-input:indeterminate:disabled:where(.dark,.dark *){background-color:var(--gray-600)}input[type=checkbox].fi-checkbox-input.fi-invalid{color:var(--danger-600);--tw-ring-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:checked{background-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:focus{--tw-ring-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:checked:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *){color:var(--danger-500);--tw-ring-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked{background-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):focus{--tw-ring-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate{background-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:where(.dark,.dark *){background-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}input.fi-input{appearance:none;--tw-border-style:none;width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;background-color:#0000;border-style:none;transition-duration:75ms;display:block}input.fi-input::placeholder{color:var(--gray-400)}input.fi-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}input.fi-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}input.fi-input:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}input.fi-input:where(.dark,.dark *){color:var(--color-white)}input.fi-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}input.fi-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}input.fi-input:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}@supports (-webkit-touch-callout:none){input.fi-input{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}input.fi-input.fi-input-has-inline-prefix{padding-inline-start:calc(var(--spacing)*0)}input.fi-input.fi-input-has-inline-suffix{padding-inline-end:calc(var(--spacing)*0)}input.fi-input.fi-align-center{text-align:center}input.fi-input.fi-align-end{text-align:end}input.fi-input.fi-align-left{text-align:left}input.fi-input.fi-align-right{text-align:end}input.fi-input.fi-align-justify,input.fi-input.fi-align-between{text-align:justify}input[type=date].fi-input,input[type=datetime-local].fi-input,input[type=time].fi-input{background-color:#ffffff03}@supports (color:color-mix(in lab, red, red)){input[type=date].fi-input,input[type=datetime-local].fi-input,input[type=time].fi-input{background-color:color-mix(in oklab,var(--color-white)1%,transparent)}}input[type=range].fi-input{appearance:auto;width:calc(100% - 1.5rem);margin-inline:auto}input[type=text].fi-one-time-code-input{inset-block:calc(var(--spacing)*0);right:calc(var(--spacing)*-8);left:calc(var(--spacing)*0);--tw-border-style:none;padding-inline:calc(var(--spacing)*3);font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--tw-tracking:1.72rem;letter-spacing:1.72rem;color:var(--gray-950);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;background-color:#0000;border-style:none;transition-duration:75ms;display:block;position:absolute}input[type=text].fi-one-time-code-input::placeholder{color:var(--gray-400)}input[type=text].fi-one-time-code-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}input[type=text].fi-one-time-code-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}input[type=text].fi-one-time-code-input:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}input[type=text].fi-one-time-code-input:where(.dark,.dark *){color:var(--color-white)}input[type=text].fi-one-time-code-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}input[type=text].fi-one-time-code-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}input[type=text].fi-one-time-code-input:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}input[type=text].fi-one-time-code-input.fi-valid{caret-color:#0000}.fi-one-time-code-input-ctn{height:calc(var(--spacing)*12);position:relative}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{height:100%;width:calc(var(--spacing)*8);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950);display:inline-block}@supports (color:color-mix(in lab, red, red)){.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{background-color:var(--color-white)}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field.fi-active{border-style:var(--tw-border-style);border-width:2px;border-color:var(--primary-600)}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field.fi-active:where(.dark,.dark *){border-color:var(--primary-500)}input[type=radio].fi-radio-input{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);appearance:none;--tw-border-style:none;background-color:var(--color-white);color:var(--primary-600);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-style:none;border-radius:3.40282e38px}input[type=radio].fi-radio-input:checked{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input[type=radio].fi-radio-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}input[type=radio].fi-radio-input:checked:focus{--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}input[type=radio].fi-radio-input:disabled{background-color:var(--gray-50);color:var(--gray-50)}input[type=radio].fi-radio-input:disabled:checked{background-color:var(--gray-400);color:var(--gray-400)}input[type=radio].fi-radio-input:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *){color:var(--primary-500);--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *):checked{background-color:var(--primary-500)}input[type=radio].fi-radio-input:where(.dark,.dark *):focus{--tw-ring-color:var(--primary-500)}input[type=radio].fi-radio-input:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *):disabled{--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *):disabled{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *):disabled:checked{background-color:var(--gray-600)}input[type=radio].fi-radio-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}input[type=radio].fi-radio-input.fi-invalid{color:var(--danger-600);--tw-ring-color:var(--danger-600)}input[type=radio].fi-radio-input.fi-invalid:checked{background-color:var(--danger-600)}input[type=radio].fi-radio-input.fi-invalid:focus{--tw-ring-color:var(--danger-600)}input[type=radio].fi-radio-input.fi-invalid:checked:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input.fi-invalid:checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *){color:var(--danger-500);--tw-ring-color:var(--danger-500)}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked{background-color:var(--danger-500)}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):focus{--tw-ring-color:var(--danger-500)}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}select.fi-select-input{appearance:none;--tw-border-style:none;width:100%;padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;background-color:#0000;border-style:none;padding-inline-start:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*8);transition-duration:75ms;display:block}select.fi-select-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}select.fi-select-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}select.fi-select-input:where(.dark,.dark *){color:var(--color-white)}select.fi-select-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}select.fi-select-input optgroup{background-color:var(--color-white)}select.fi-select-input optgroup:where(.dark,.dark *){background-color:var(--gray-900)}select.fi-select-input option{background-color:var(--color-white)}select.fi-select-input option:where(.dark,.dark *){background-color:var(--gray-900)}@supports (-webkit-touch-callout:none){select.fi-select-input{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}select.fi-select-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}select.fi-select-input:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.5rem}select.fi-select-input.fi-select-input-has-inline-prefix{padding-inline-start:calc(var(--spacing)*0)}.fi-select-input .fi-select-input-ctn{position:relative}.fi-select-input div[x-ref=select]{min-height:calc(var(--spacing)*9)}.fi-select-input .fi-select-input-btn{min-height:calc(var(--spacing)*9);border-radius:var(--radius-lg);width:100%;padding-block:calc(var(--spacing)*1.5);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);padding-inline-start:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*8);display:flex}.fi-select-input .fi-select-input-btn:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.fi-select-input .fi-select-input-btn:where(.dark,.dark *){color:var(--color-white)}.fi-select-input .fi-select-input-btn{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}.fi-select-input .fi-select-input-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.5rem}.fi-select-input .fi-select-input-value-ctn{text-wrap:wrap;word-break:break-word;align-items:center;width:100%;display:flex}.fi-select-input .fi-select-input-value-badges-ctn{gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.fi-select-input .fi-select-input-value-label{flex:1}.fi-select-input .fi-select-input-value-remove-btn{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y);color:var(--gray-500);inset-inline-end:calc(var(--spacing)*8);position:absolute;top:50%}@media (hover:hover){.fi-select-input .fi-select-input-value-remove-btn:hover{color:var(--gray-600)}}.fi-select-input .fi-select-input-value-remove-btn:focus-visible{color:var(--gray-600);--tw-outline-style:none;outline-style:none}@media (hover:hover){.fi-select-input .fi-select-input-value-remove-btn:where(.dark,.dark *):hover{color:var(--gray-300)}}.fi-select-input .fi-select-input-value-remove-btn:where(.dark,.dark *):focus-visible{color:var(--gray-300)}.fi-select-input .fi-select-input-ctn-clearable .fi-select-input-btn{padding-inline-end:calc(var(--spacing)*14)}.fi-select-input .fi-dropdown-panel{max-height:calc(var(--spacing)*60);max-width:100%!important}:where(.fi-select-input .fi-select-input-options-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100)}:where(.fi-select-input .fi-select-input-options-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-select-input .fi-select-input-options-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:where(.fi-select-input .fi-select-input-option-group>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100)}:where(.fi-select-input .fi-select-input-option-group:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-select-input .fi-select-input-option-group:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-select-input .fi-select-input-option-group .fi-dropdown-header{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-select-input .fi-select-input-option-group .fi-dropdown-header:where(.dark,.dark *){color:var(--gray-400)}.fi-select-input .fi-select-input-search-ctn{top:calc(var(--spacing)*0);z-index:10;background-color:var(--color-white);position:sticky}.fi-select-input .fi-select-input-search-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.fi-select-input .fi-select-input-option{text-wrap:wrap;word-break:break-word;min-width:1px}.fi-select-input .fi-select-input-placeholder{color:var(--gray-400)}.fi-select-input .fi-select-input-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-select-input .fi-disabled{cursor:not-allowed;opacity:.7}.fi-select-input .fi-disabled .fi-select-input-placeholder{color:var(--gray-400)}.fi-select-input .fi-disabled .fi-select-input-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-select-input .fi-select-input-message{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-select-input .fi-select-input-message:where(.dark,.dark *){color:var(--gray-400)}.fi-select-input .fi-select-input-ctn.fi-select-input-ctn-option-labels-not-wrapped .fi-select-input-value-ctn>span{text-overflow:ellipsis;white-space:nowrap;text-wrap:nowrap;overflow-wrap:normal;word-break:normal;overflow:hidden}.fi-select-input .fi-select-input-ctn.fi-select-input-ctn-option-labels-not-wrapped .fi-select-input-option>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-input-wrp{border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms;display:flex}.fi-input-wrp:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-input-wrp:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):where(.dark,.dark *):focus-within{--tw-ring-color:var(--primary-500)}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:focus-within{--tw-ring-color:var(--danger-600)}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:where(.dark,.dark *):focus-within{--tw-ring-color:var(--danger-500)}.fi-input-wrp.fi-disabled{background-color:var(--gray-50)}.fi-input-wrp.fi-disabled:where(.dark,.dark *){background-color:#0000}.fi-input-wrp.fi-disabled:not(.fi-invalid):where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp.fi-disabled:not(.fi-invalid):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-input-wrp.fi-invalid{--tw-ring-color:var(--danger-600)}.fi-input-wrp.fi-invalid:where(.dark,.dark *){--tw-ring-color:var(--danger-500)}.fi-input-wrp .fi-input-wrp-prefix{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline-start:calc(var(--spacing)*3);display:none}.fi-input-wrp .fi-input-wrp-prefix.fi-input-wrp-prefix-has-content{display:flex}.fi-input-wrp .fi-input-wrp-prefix.fi-inline{padding-inline-end:calc(var(--spacing)*2)}.fi-input-wrp .fi-input-wrp-prefix.fi-inline.fi-input-wrp-prefix-has-label{padding-inline-end:calc(var(--spacing)*1)}.fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--gray-200);padding-inline-start:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*3)}.fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-input-wrp .fi-input-wrp-content-ctn,.fi-input-wrp:not(:has(.fi-input-wrp-content-ctn))>*{min-width:calc(var(--spacing)*0);flex:1}:is(.fi-input-wrp .fi-input-wrp-content-ctn,.fi-input-wrp:not(:has(.fi-input-wrp-content-ctn))>*).fi-input-wrp-content-ctn-ps{padding-inline-start:calc(var(--spacing)*3)}.fi-input-wrp .fi-input-wrp-suffix{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*3);display:flex}.fi-input-wrp .fi-input-wrp-suffix.fi-inline{padding-inline-start:calc(var(--spacing)*2)}.fi-input-wrp .fi-input-wrp-suffix.fi-inline.fi-input-wrp-suffix-has-label{padding-inline-start:calc(var(--spacing)*1)}.fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:var(--gray-200);padding-inline-start:calc(var(--spacing)*3)}.fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-input-wrp .fi-input-wrp-actions{align-items:center;gap:calc(var(--spacing)*3);display:flex}.fi-input-wrp .fi-input-wrp-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:var(--gray-500)}.fi-input-wrp .fi-input-wrp-label:where(.dark,.dark *),:is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon{color:var(--gray-400)}:is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}:is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon.fi-color{color:var(--color-500)}.fi-link{justify-content:center;align-items:center;gap:calc(var(--spacing)*1.5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);--tw-outline-style:none;outline-style:none;display:inline-flex;position:relative}.fi-link:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){:is(.fi-link.fi-force-enabled,.fi-link:not(.fi-disabled):not([disabled])):hover{text-decoration-line:underline}}:is(.fi-link.fi-force-enabled,.fi-link:not(.fi-disabled):not([disabled])):focus-visible{text-decoration-line:underline}.fi-link.fi-disabled:not(.fi-force-enabled),.fi-link[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-link.fi-disabled:not(.fi-force-enabled),.fi-link[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-link.fi-size-xs{gap:calc(var(--spacing)*1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-link.fi-size-sm{gap:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-link.fi-size-md,.fi-link.fi-size-lg,.fi-link.fi-size-xl{gap:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-link.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-link.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-link.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-link.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-link.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-link.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-link.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-link.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-link.fi-color{color:var(--text)}.fi-link.fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-link:not(.fi-color)>.fi-icon{color:var(--gray-400)}.fi-link:not(.fi-color)>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-link .fi-link-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*0);z-index:1;--tw-translate-x:calc(calc(1/4*100%)*-1);--tw-translate-y:calc(calc(3/4*100%)*-1);width:max-content;translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-md);background-color:var(--color-white);--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);display:flex;position:absolute}@media (hover:hover){.fi-link .fi-link-badge-ctn:hover{text-decoration-line:none}}.fi-link .fi-link-badge-ctn:focus-visible{text-decoration-line:none}.fi-link .fi-link-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1/4*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-link .fi-link-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}p>.fi-link,span>.fi-link{vertical-align:middle;text-align:inherit;padding-bottom:2px}.fi-loading-indicator{animation:var(--animate-spin)}.fi-loading-section{animation:var(--animate-pulse)}:is(.fi-modal.fi-modal-slide-over,.fi-modal.fi-width-screen)>.fi-modal-window-ctn>.fi-modal-window{height:100dvh}:is(.fi-modal.fi-modal-slide-over,.fi-modal.fi-width-screen)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content{flex:1}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window{margin-inline-start:auto;overflow-y:auto}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}:is(.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-end,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-start{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header{column-gap:calc(var(--spacing)*3)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg{margin-block:calc(var(--spacing)*-2);padding:calc(var(--spacing)*2);margin-inline-start:calc(var(--spacing)*-2)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{inset-inline-end:calc(var(--spacing)*6);top:calc(var(--spacing)*6)}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen):not(.fi-modal-has-sticky-header):not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn{overflow-y:auto}:is(.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-header,.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window{max-height:calc(100dvh - 2rem);overflow-y:auto}.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:0}.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-end,.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-start{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:1}.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{inset-inline-end:calc(var(--spacing)*4);top:calc(var(--spacing)*4)}.fi-modal.fi-align-start:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window-has-icon .fi-modal-content,.fi-modal.fi-align-start:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window-has-icon .fi-modal-footer:not(.fi-align-center){padding-inline-start:5.25rem;padding-inline-end:calc(var(--spacing)*6)}.fi-modal:not(.fi-align-start)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content,.fi-modal:not(.fi-align-start)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.fi-modal>.fi-modal-close-overlay{inset:calc(var(--spacing)*0);z-index:40;background-color:var(--gray-950);position:fixed}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-close-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.fi-modal>.fi-modal-close-overlay{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}.fi-modal>.fi-modal-close-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-close-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}.fi-modal.fi-modal-open:has(~.fi-modal.fi-modal-open)>.fi-modal-close-overlay{opacity:0}.fi-modal.fi-modal-open~.fi-modal.fi-modal-open>.fi-modal-close-overlay,.fi-modal.fi-modal-open~.fi-modal.fi-modal-open>.fi-modal-window-ctn{z-index:50}.fi-modal>.fi-modal-window-ctn{inset:calc(var(--spacing)*0);z-index:40;grid-template-rows:1fr auto 1fr;justify-items:center;min-height:100%;display:grid;position:fixed}@media (min-width:40rem){.fi-modal>.fi-modal-window-ctn{grid-template-rows:1fr auto 3fr}}.fi-modal>.fi-modal-window-ctn.fi-clickable{cursor:pointer}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)>.fi-modal-window-ctn{padding:calc(var(--spacing)*4)}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)>.fi-modal-window-ctn .fi-modal-window{border-radius:var(--radius-xl);margin-inline:auto}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window{pointer-events:auto;cursor:default;background-color:var(--color-white);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);flex-direction:column;grid-row-start:2;display:flex;position:relative}.fi-modal>.fi-modal-window-ctn>.fi-modal-window:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-window-ctn>.fi-modal-window:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header{padding-inline:calc(var(--spacing)*6);padding-top:calc(var(--spacing)*6);display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header.fi-vertical-align-center{align-items:center}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-heading:where(.dark,.dark *){color:var(--color-white)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-description{margin-top:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-description:where(.dark,.dark *){color:var(--gray-400)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content{row-gap:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*6);flex-direction:column;display:flex}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-left) .fi-modal-header{column-gap:calc(var(--spacing)*5)}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-left) .fi-modal-icon-bg{padding:calc(var(--spacing)*2)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-header{text-align:center;flex-direction:column}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-icon-ctn{margin-bottom:calc(var(--spacing)*5);justify-content:center;align-items:center;display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-icon-bg{padding:calc(var(--spacing)*3)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-hidden{display:none}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-xs{max-width:var(--container-xs)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-sm{max-width:var(--container-sm)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-md{max-width:var(--container-md)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-lg{max-width:var(--container-lg)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-xl{max-width:var(--container-xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-2xl{max-width:var(--container-2xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-3xl{max-width:var(--container-3xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-4xl{max-width:var(--container-4xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-5xl{max-width:var(--container-5xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-6xl{max-width:var(--container-6xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-7xl{max-width:var(--container-7xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-full{max-width:100%}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-min{max-width:min-content}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-max{max-width:max-content}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-fit{max-width:fit-content}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-prose{max-width:65ch}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-sm{max-width:var(--breakpoint-sm)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-md{max-width:var(--breakpoint-md)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-lg{max-width:var(--breakpoint-lg)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-xl{max-width:var(--breakpoint-xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-2xl{max-width:var(--breakpoint-2xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen{inset:calc(var(--spacing)*0);position:fixed}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave{--tw-duration:.3s;transition-duration:.3s}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-center:not(.fi-modal-window-has-icon) .fi-modal-heading{margin-inline-start:calc(var(--spacing)*6)}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn:not(.fi-modal-window-has-icon),.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-left) .fi-modal-heading{margin-inline-end:calc(var(--spacing)*6)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{position:absolute}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{width:100%}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer .fi-modal-footer-actions{gap:calc(var(--spacing)*3)}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-left) .fi-modal-footer-actions{flex-wrap:wrap;align-items:center;display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center{padding-inline:calc(var(--spacing)*6)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{flex-direction:column-reverse;display:flex}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-end,.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-right) .fi-modal-footer-actions{flex-flow:row-reverse wrap;align-items:center;display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg{background-color:var(--gray-100);border-radius:3.40282e38px}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg>.fi-icon{color:var(--gray-500)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg>.fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color{background-color:var(--color-100)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color:where(.dark,.dark *){background-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-500)20%,transparent)}}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color>.fi-icon{color:var(--color-600)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color>.fi-icon:where(.dark,.dark *){color:var(--color-400)}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header{top:calc(var(--spacing)*0);z-index:10;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--color-white);padding-bottom:calc(var(--spacing)*6);position:sticky}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){background-color:var(--gray-900)}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content,.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{bottom:calc(var(--spacing)*0);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);background-color:var(--color-white);padding-block:calc(var(--spacing)*5);position:sticky}.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){background-color:var(--gray-900)}.fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-content) .fi-modal-footer{margin-top:calc(var(--spacing)*6)}.fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-content):not(.fi-modal-window-has-footer) .fi-modal-header,.fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-bottom:calc(var(--spacing)*6)}.fi-modal:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-icon) .fi-modal-content,.fi-modal:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-icon) .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{margin-top:auto}@supports (container-type:inline-size){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center{container-type:inline-size}@container (min-width:24rem){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{grid-template-columns:repeat(auto-fit,minmax(0,1fr));display:grid}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{grid-template-columns:repeat(auto-fit,minmax(0,1fr));display:grid}}}:scope .fi-modal-trigger{display:flex}.fi-pagination{align-items:center;column-gap:calc(var(--spacing)*3);grid-template-columns:1fr auto 1fr;display:grid}.fi-pagination:empty{display:none}.fi-pagination .fi-pagination-previous-btn{justify-self:flex-start}.fi-pagination .fi-pagination-overview{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);display:none}.fi-pagination .fi-pagination-overview:where(.dark,.dark *){color:var(--gray-200)}.fi-pagination .fi-pagination-records-per-page-select-ctn{grid-column-start:2;justify-self:center}.fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:none}.fi-pagination .fi-pagination-next-btn{grid-column-start:3;justify-self:flex-end}.fi-pagination .fi-pagination-items{border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);justify-self:flex-end;display:none}.fi-pagination .fi-pagination-items:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-items:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-pagination .fi-pagination-items:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-items:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-pagination .fi-pagination-item{border-inline-style:var(--tw-border-style);border-inline-width:.5px;border-color:var(--gray-200)}.fi-pagination .fi-pagination-item:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.fi-pagination .fi-pagination-item:last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.fi-pagination .fi-pagination-item:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-item:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn{background-color:var(--gray-50)}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-label{color:var(--primary-700)}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-label:where(.dark,.dark *){color:var(--primary-400)}.fi-pagination .fi-pagination-item:first-of-type .fi-pagination-item-btn{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.fi-pagination .fi-pagination-item:last-of-type .fi-pagination-item-btn{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.fi-pagination .fi-pagination-item.fi-disabled .fi-pagination-item-label{color:var(--gray-500)}.fi-pagination .fi-pagination-item.fi-disabled .fi-pagination-item-label:where(.dark,.dark *){color:var(--gray-400)}.fi-pagination .fi-pagination-item-btn{padding:calc(var(--spacing)*2);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;transition-duration:75ms;display:flex;position:relative;overflow:hidden}@media (hover:hover){.fi-pagination .fi-pagination-item-btn:enabled:hover{background-color:var(--gray-50)}}.fi-pagination .fi-pagination-item-btn:enabled:focus-visible{z-index:10;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}@media (hover:hover){.fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500)}.fi-pagination .fi-pagination-item-btn:hover .fi-icon{color:var(--gray-500)}.fi-pagination .fi-pagination-item-btn:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-pagination .fi-pagination-item-btn .fi-icon{color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-pagination .fi-pagination-item-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-pagination .fi-pagination-item-btn .fi-pagination-item-label{padding-inline:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-700)}.fi-pagination .fi-pagination-item-btn .fi-pagination-item-label:where(.dark,.dark *){color:var(--gray-200)}@supports (container-type:inline-size){.fi-pagination{container-type:inline-size}@container (min-width:28rem){.fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:inline}.fi-pagination .fi-pagination-records-per-page-select.fi-compact{display:none}}@container (min-width:56rem){.fi-pagination:not(.fi-simple) .fi-pagination-previous-btn,.fi-pagination:not(.fi-simple) .fi-pagination-next-btn{display:none}.fi-pagination .fi-pagination-overview{display:inline}.fi-pagination .fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:inline}.fi-pagination .fi-pagination-records-per-page-select.fi-compact{display:none}}@media (min-width:48rem){.fi-pagination:not(.fi-simple) .fi-pagination-previous-btn,.fi-pagination:not(.fi-simple) .fi-pagination-next-btn{display:none}.fi-pagination .fi-pagination-overview{display:inline}.fi-pagination .fi-pagination-items{display:flex}}}.fi-section:not(.fi-section-not-contained):not(.fi-divided)>.fi-section-content-ctn>.fi-section-content,.fi-section:not(.fi-section-not-contained).fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding:calc(var(--spacing)*6)}.fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*4)}.fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained):not(.fi-aside){border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-section:not(.fi-section-not-contained):not(.fi-aside):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained):not(.fi-aside):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-compact{border-radius:var(--radius-lg)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary{background-color:var(--gray-50)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-section:not(.fi-section-not-contained):not(.fi-aside)>.fi-section-header{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*4)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:48rem){.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn{grid-column:span 2/span 2}}.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained).fi-aside.fi-compact>.fi-section-content-ctn{border-radius:var(--radius-lg)}.fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn{background-color:var(--gray-50)}.fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-section:not(.fi-section-not-contained).fi-compact:not(.fi-aside)>.fi-section-header{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2.5)}.fi-section:not(.fi-section-not-contained).fi-compact:not(.fi-divided)>.fi-section-content-ctn>.fi-section-content,.fi-section:not(.fi-section-not-contained).fi-compact.fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding:calc(var(--spacing)*4)}.fi-section:not(.fi-section-not-contained).fi-compact>.fi-section-footer{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2.5)}@media (min-width:48rem){.fi-section.fi-section-not-contained.fi-aside>.fi-section-content-ctn{grid-column:span 2/span 2}}.fi-section.fi-section-not-contained:not(.fi-aside),.fi-section.fi-section-not-contained:not(.fi-aside)>.fi-section-content-ctn{row-gap:calc(var(--spacing)*4);display:grid}.fi-section.fi-section-not-contained:not(.fi-aside).fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding-block:calc(var(--spacing)*6)}.fi-section.fi-section-not-contained:not(.fi-aside).fi-compact,.fi-section.fi-section-not-contained:not(.fi-aside).fi-compact>.fi-section-content-ctn{row-gap:calc(var(--spacing)*2.5)}.fi-section.fi-section-not-contained:not(.fi-aside).fi-compact.fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding-block:calc(var(--spacing)*4)}.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content{gap:calc(var(--spacing)*0)}:where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section.fi-aside{align-items:flex-start;column-gap:calc(var(--spacing)*6);row-gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}@media (min-width:48rem){.fi-section.fi-aside{grid-template-columns:repeat(3,minmax(0,1fr))}}.fi-section.fi-collapsible>.fi-section-header{cursor:pointer}.fi-section.fi-collapsed>.fi-section-header>.fi-section-collapse-btn{rotate:180deg}.fi-section.fi-collapsed>.fi-section-content-ctn{visibility:hidden;height:calc(var(--spacing)*0);--tw-border-style:none;border-style:none;position:absolute;overflow:hidden}@media (min-width:48rem){.fi-section.fi-section-has-content-before>.fi-section-content-ctn{order:-9999}}.fi-section>.fi-section-header{align-items:flex-start;gap:calc(var(--spacing)*3);display:flex}.fi-section>.fi-section-header>.fi-icon{color:var(--gray-400);flex-shrink:0}.fi-section>.fi-section-header>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-section>.fi-section-header>.fi-icon.fi-color{color:var(--color-500)}.fi-section>.fi-section-header>.fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.fi-section>.fi-section-header>.fi-icon.fi-size-sm{margin-top:calc(var(--spacing)*1)}.fi-section>.fi-section-header>.fi-icon.fi-size-md{margin-top:calc(var(--spacing)*.5)}.fi-section>.fi-section-header>.fi-section-header-after-ctn{align-self:center}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-sc-text:not(.fi-section-header-after-ctn .fi-dropdown-panel *),.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-link:not(.fi-section-header-after-ctn .fi-dropdown-panel *){--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-xs{margin-block:calc(var(--spacing)*-.5)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-sm{margin-block:calc(var(--spacing)*-1)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-md{margin-block:calc(var(--spacing)*-1.5)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-lg{margin-block:calc(var(--spacing)*-2)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-xl{margin-block:calc(var(--spacing)*-2.5)}.fi-section>.fi-section-header>.fi-section-collapse-btn{margin-block:calc(var(--spacing)*-1.5);flex-shrink:0}.fi-section .fi-section-header-text-ctn{row-gap:calc(var(--spacing)*1);flex:1;display:grid}.fi-section .fi-section-header-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-section .fi-section-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-section .fi-section-header-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word;color:var(--gray-500);overflow:hidden}.fi-section .fi-section-header-description:where(.dark,.dark *){color:var(--gray-400)}.fi-tabs{column-gap:calc(var(--spacing)*1);max-width:100%;display:flex;overflow-x:auto}.fi-tabs.fi-contained{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2.5)}.fi-tabs.fi-contained:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-tabs.fi-contained:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-tabs:not(.fi-contained){border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing)*2);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);margin-inline:auto}.fi-tabs:not(.fi-contained):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-tabs:not(.fi-contained):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-tabs.fi-vertical{column-gap:calc(var(--spacing)*0);row-gap:calc(var(--spacing)*1);flex-direction:column;overflow:hidden auto}.fi-tabs.fi-vertical.fi-contained{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0}.fi-tabs.fi-vertical:not(.fi-contained){margin-inline:calc(var(--spacing)*0)}.fi-tabs.fi-vertical .fi-tabs-item{justify-content:flex-start}.fi-tabs-item{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*2);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;transition-duration:75ms;display:flex}@media (hover:hover){.fi-tabs-item:hover{background-color:var(--gray-50)}}.fi-tabs-item:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-tabs-item:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tabs-item:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-tabs-item:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tabs-item:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-tabs-item.fi-active{background-color:var(--gray-50)}.fi-tabs-item.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tabs-item.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-tabs-item.fi-active .fi-tabs-item-label,.fi-tabs-item.fi-active .fi-icon{color:var(--primary-700)}:is(.fi-tabs-item.fi-active .fi-tabs-item-label,.fi-tabs-item.fi-active .fi-icon):where(.dark,.dark *){color:var(--primary-400)}.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label,.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:is(:where(.group):focus-visible *){color:var(--gray-700)}.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:where(.dark,.dark *),.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-200)}.fi-tabs-item :not(.fi-active):focus-visible .fi-tabs-item-label{color:var(--gray-700)}.fi-tabs-item :not(.fi-active):focus-visible .fi-tabs-item-label:where(.dark,.dark *){color:var(--gray-200)}.fi-tabs-item .fi-tabs-item-label{color:var(--gray-500);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-tabs-item .fi-tabs-item-label:where(.dark,.dark *){color:var(--gray-400)}.fi-tabs-item .fi-icon{color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;transition-duration:75ms}.fi-tabs-item .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-tabs-item .fi-badge{width:max-content}.fi-toggle{height:calc(var(--spacing)*6);width:calc(var(--spacing)*11);cursor:pointer;border-style:var(--tw-border-style);background-color:var(--gray-200);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out);--tw-outline-style:none;border-width:2px;border-color:#0000;border-radius:3.40282e38px;outline-style:none;flex-shrink:0;display:inline-flex;position:relative}.fi-toggle:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.fi-toggle:disabled{pointer-events:none;opacity:.7}.fi-toggle:where(.dark,.dark *){background-color:var(--gray-700)}.fi-toggle:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500);--tw-ring-offset-color:var(--gray-900)}.fi-toggle:disabled,.fi-toggle[disabled]{pointer-events:none;opacity:.7}.fi-toggle.fi-color{background-color:var(--bg)}.fi-toggle.fi-color:where(.dark,.dark *){background-color:var(--dark-bg)}.fi-toggle.fi-color .fi-icon{color:var(--text)}.fi-toggle.fi-hidden{display:none}.fi-toggle>:first-child{pointer-events:none;width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out);border-radius:3.40282e38px;display:inline-block;position:relative}.fi-toggle>:first-child>*{inset:calc(var(--spacing)*0);width:100%;height:100%;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));justify-content:center;align-items:center;display:flex;position:absolute}.fi-toggle .fi-icon{color:var(--gray-400)}.fi-toggle .fi-icon:where(.dark,.dark *){color:var(--gray-700)}.fi-toggle.fi-toggle-on>:first-child{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-toggle.fi-toggle-on>:first-child:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-5);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-toggle.fi-toggle-on>:first-child>:first-child{opacity:0;--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.fi-toggle.fi-toggle-on>:first-child>:last-child{opacity:1;--tw-duration:.2s;--tw-ease:var(--ease-in);transition-duration:.2s;transition-timing-function:var(--ease-in)}.fi-toggle.fi-toggle-off>:first-child{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-toggle.fi-toggle-off>:first-child>:first-child{opacity:1;--tw-duration:.2s;--tw-ease:var(--ease-in);transition-duration:.2s;transition-timing-function:var(--ease-in)}.fi-toggle.fi-toggle-off>:first-child>:last-child{opacity:0;--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.fi-sortable-ghost{opacity:.3}.fi-ac{gap:calc(var(--spacing)*3)}.fi-ac:not(.fi-width-full){flex-wrap:wrap;align-items:center;display:flex}.fi-ac:not(.fi-width-full).fi-align-start,.fi-ac:not(.fi-width-full).fi-align-left{justify-content:flex-start}.fi-ac:not(.fi-width-full).fi-align-center{justify-content:center}.fi-ac:not(.fi-width-full).fi-align-end,.fi-ac:not(.fi-width-full).fi-align-right{flex-direction:row-reverse}.fi-ac:not(.fi-width-full).fi-align-between,.fi-ac:not(.fi-width-full).fi-align-justify{justify-content:space-between}.fi-ac.fi-width-full{grid-template-columns:repeat(auto-fit,minmax(0,1fr));display:grid}.CodeMirror{color:#000;direction:ltr;height:300px;font-family:monospace}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{white-space:nowrap;background-color:#f7f7f7;border-right:1px solid #ddd}.CodeMirror-linenumber{text-align:right;color:#999;white-space:nowrap;min-width:20px;padding:0 3px 0 5px}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;width:auto;border:0!important}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span::-moz-selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:#0000}@keyframes blink{50%{background-color:#0000}}.cm-tab{-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;display:inline-block}.CodeMirror-rulers{position:absolute;inset:-50px 0 0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute;top:0;bottom:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error,.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:#ff96004d}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;position:relative;overflow:hidden}.CodeMirror-scroll{z-index:0;outline:0;height:100%;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;position:relative;overflow:scroll!important}.CodeMirror-sizer{border-right:50px solid #0000;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{z-index:6;outline:0;display:none;position:absolute}.CodeMirror-vscrollbar{top:0;right:0;overflow:hidden scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow:scroll hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{z-index:3;min-height:100%;position:absolute;top:0;left:0}.CodeMirror-gutter{white-space:normal;vertical-align:top;height:100%;margin-bottom:-50px;display:inline-block}.CodeMirror-gutter-wrapper{z-index:4;position:absolute;background:0 0!important;border:none!important}.CodeMirror-gutter-background{z-index:4;position:absolute;top:0;bottom:0}.CodeMirror-gutter-elt{cursor:default;z-index:4;position:absolute}.CodeMirror-gutter-wrapper ::selection{background-color:#0000}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{font-family:inherit;font-size:inherit;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual;background:0 0;border-width:0;border-radius:0;margin:0;position:relative;overflow:visible}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{z-index:0;position:absolute;inset:0}.CodeMirror-linewidget{z-index:2;padding:.1px;position:relative}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{visibility:hidden;width:100%;height:0;position:absolute;overflow:hidden}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;z-index:3;position:relative}div.CodeMirror-dragcursors,.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection{background:#d7d4f0}.CodeMirror-line>span::selection{background:#d7d4f0}.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection{background:#d7d4f0}.CodeMirror-line>span::-moz-selection{background:#d7d4f0}.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{flex-flow:wrap;display:flex}.EasyMDEContainer .CodeMirror{box-sizing:border-box;height:auto;font:inherit;z-index:0;word-wrap:break-word;border:1px solid #ced4da;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:10px}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{z-index:8;background:#fff;height:auto;inset:50px 0 0;border-right:none!important;border-bottom-right-radius:0!important;position:fixed!important}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;flex:auto;position:relative;border-right:none!important}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{-webkit-user-select:none;user-select:none;-o-user-select:none;border-top:1px solid #ced4da;border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative}.editor-toolbar.fullscreen{box-sizing:border-box;opacity:1;z-index:9;background:#fff;border:0;width:100%;height:50px;padding-top:10px;padding-bottom:10px;position:fixed;top:0;left:0}.editor-toolbar.fullscreen:before{background:-o-linear-gradient(270deg,#fff 0,#fff0 100%);background:-ms-linear-gradient(left,#fff 0,#fff0 100%);background:linear-gradient(90deg,#fff 0,#fff0);width:20px;height:50px;margin:0;padding:0;position:fixed;top:0;left:0}.editor-toolbar.fullscreen:after{background:-o-linear-gradient(270deg,#fff0 0,#fff 100%);background:-ms-linear-gradient(left,#fff0 0,#fff 100%);background:linear-gradient(90deg,#fff0 0,#fff);width:20px;height:50px;margin:0;padding:0;position:fixed;top:0;right:0}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{text-align:center;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:3px;height:30px;margin:0;padding:0;display:inline-block;text-decoration:none!important}.editor-toolbar button{white-space:nowrap;min-width:30px;padding:0 6px;font-weight:700}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{color:#0000;text-indent:-10px;border-left:1px solid #d9d9d9;border-right:1px solid #fff;width:0;margin:0 6px;display:inline-block}.editor-toolbar button:after{vertical-align:text-bottom;font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"▲"}.editor-toolbar button.heading-smaller:after{content:"▼"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;text-align:right;padding:8px 10px;font-size:12px}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{min-width:4em;margin-left:1em;display:inline-block}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{z-index:7;box-sizing:border-box;width:100%;height:100%;display:none;position:absolute;top:0;left:0;overflow:auto}.editor-preview-side{z-index:9;box-sizing:border-box;word-wrap:break-word;border:1px solid #ddd;width:50%;display:none;position:fixed;top:50px;bottom:0;right:0;overflow:auto}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{margin-bottom:.5rem;line-height:1.2}.cm-s-easymde .cm-comment{background:#0000000d;border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%);border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%)}.easymde-dropdown-content{visibility:hidden;z-index:2;background-color:#f9f9f9;padding:8px;display:block;position:absolute;top:30px;box-shadow:0 8px 16px #0003}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{content:"";background-image:var(--bg-image);max-width:100%;height:0;max-height:100%;padding-top:var(--height);width:var(--width);background-repeat:no-repeat;background-size:contain;display:block}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:#ff000026}.cropper-container{-webkit-touch-callout:none;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr;font-size:0;line-height:0;position:relative}.cropper-container img{backface-visibility:hidden;image-orientation:0deg;width:100%;height:100%;display:block;min-width:0!important;max-width:none!important;min-height:0!important;max-height:none!important}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{position:absolute;inset:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{opacity:0;background-color:#fff}.cropper-modal{opacity:.5;background-color:#000}.cropper-view-box{outline:1px solid #3399ffbf;width:100%;height:100%;display:block;overflow:hidden}.cropper-dashed{opacity:.5;border:0 dashed #eee;display:block;position:absolute}.cropper-dashed.dashed-h{border-top-width:1px;border-bottom-width:1px;width:100%;height:33.3333%;top:33.3333%;left:0}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;width:33.3333%;height:100%;top:0;left:33.3333%}.cropper-center{opacity:.75;width:0;height:0;display:block;position:absolute;top:50%;left:50%}.cropper-center:after,.cropper-center:before{content:" ";background-color:#eee;display:block;position:absolute}.cropper-center:before{width:7px;height:1px;top:0;left:-3px}.cropper-center:after{width:1px;height:7px;top:-3px;left:0}.cropper-face,.cropper-line,.cropper-point{opacity:.1;width:100%;height:100%;display:block;position:absolute}.cropper-face{background-color:#fff;top:0;left:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;width:5px;top:0;right:-3px}.cropper-line.line-n{cursor:ns-resize;height:5px;top:-3px;left:0}.cropper-line.line-w{cursor:ew-resize;width:5px;top:0;left:-3px}.cropper-line.line-s{cursor:ns-resize;height:5px;bottom:-3px;left:0}.cropper-point{opacity:.75;background-color:#39f;width:5px;height:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;top:50%;right:-3px}.cropper-point.point-n{cursor:ns-resize;margin-left:-3px;top:-3px;left:50%}.cropper-point.point-w{cursor:ew-resize;margin-top:-3px;top:50%;left:-3px}.cropper-point.point-s{cursor:s-resize;margin-left:-3px;bottom:-3px;left:50%}.cropper-point.point-ne{cursor:nesw-resize;top:-3px;right:-3px}.cropper-point.point-nw{cursor:nwse-resize;top:-3px;left:-3px}.cropper-point.point-sw{cursor:nesw-resize;bottom:-3px;left:-3px}.cropper-point.point-se{cursor:nwse-resize;opacity:1;width:20px;height:20px;bottom:-3px;right:-3px}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{opacity:.75;width:5px;height:5px}}.cropper-point.point-se:before{content:" ";opacity:0;background-color:#39f;width:200%;height:200%;display:block;position:absolute;bottom:-50%;right:-50%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{width:0;height:0;display:block;position:absolute}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.filepond--browser.filepond--browser{opacity:0;width:calc(100% - 2em);margin:0;padding:0;font-size:0;position:absolute;top:1.75em;left:1em}.filepond--data{visibility:hidden;pointer-events:none;contain:strict;border:none;width:0;height:0;margin:0;padding:0;position:absolute}.filepond--drip{opacity:.1;pointer-events:none;background:#00000003;border-radius:.5em;position:absolute;inset:0;overflow:hidden}.filepond--drip-blob{transform-origin:50%;background:#292625;border-radius:50%;width:8em;height:8em;margin-top:-4em;margin-left:-4em}.filepond--drip-blob,.filepond--drop-label{will-change:transform,opacity;position:absolute;top:0;left:0}.filepond--drop-label{color:#4f4f4f;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;height:0;margin:0;display:flex;right:0}.filepond--drop-label.filepond--drop-label label{margin:0;padding:.5em;display:block}.filepond--drop-label label{cursor:default;text-align:center;font-size:.875em;font-weight:400;line-height:1.5}.filepond--label-action{-webkit-text-decoration-skip:ink;-webkit-text-decoration-skip-ink:auto;text-decoration-skip-ink:auto;cursor:pointer;-webkit-text-decoration:underline #a7a4a4;text-decoration:underline #a7a4a4}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{width:1.625em;height:1.625em;font-family:inherit;font-size:1em;line-height:inherit;will-change:transform,opacity;border:none;outline:none;margin:0;padding:0}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.filepond--file-action-button.filepond--file-action-button svg{width:100%;height:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";position:absolute;inset:-.75em}.filepond--file-action-button{cursor:auto;color:#fff;background-color:#00000080;background-image:none;border-radius:50%;transition:box-shadow .25s ease-in;box-shadow:0 0 #fff0}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{color:#ffffff80;background-color:#00000040}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{will-change:transform,opacity;pointer-events:none;-webkit-user-select:none;user-select:none;flex-direction:column;flex:1;align-items:flex-start;min-width:0;margin:0 .5em 0 0;display:flex;position:static}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.75em;line-height:1.2;overflow:hidden}.filepond--file-info .filepond--file-info-sub{opacity:.5;white-space:nowrap;font-size:.625em;transition:opacity .25s ease-in-out}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{text-align:right;will-change:transform,opacity;pointer-events:none;-webkit-user-select:none;user-select:none;flex-direction:column;flex-grow:0;flex-shrink:0;align-items:flex-end;min-width:2.25em;margin:0;display:flex;position:static}.filepond--file-status *{white-space:nowrap;margin:0}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{opacity:.5;font-size:.625em;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;min-width:0;height:100%;margin:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.filepond--file{color:#fff;border-radius:.5em;align-items:flex-start;height:100%;padding:.5625em;display:flex;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:.5s linear .125s both fall}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:.65s linear both shake}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:1s linear infinite spin}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{opacity:0;animation-timing-function:ease-out;transform:scale(.5)}70%{opacity:1;animation-timing-function:ease-in-out;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";z-index:100;position:absolute;inset:0}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{z-index:1;will-change:transform,opacity;touch-action:auto;margin:.25em;padding:0;position:absolute;top:0;left:0;right:0}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:-webkit-grab;cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{transition:box-shadow .125s ease-in-out;box-shadow:0 0 #0000}.filepond--item[data-drag-state=drag]{cursor:-webkit-grabbing;cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{will-change:transform;margin:0;position:absolute;top:0;left:0;right:0}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;overflow:hidden scroll;-webkit-mask:linear-gradient(#000 calc(100% - .5em),#0000);mask:linear-gradient(#000 calc(100% - .5em),#0000)}.filepond--list-scroller::-webkit-scrollbar{background:0 0}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-color:#0000004d;background-clip:content-box;border:.3125em solid #0000;border-radius:99999px}.filepond--list.filepond--list{will-change:transform;margin:0;padding:0;list-style-type:none;position:absolute;top:0}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{width:100%;max-width:none;height:100%;margin:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7;justify-content:center;align-items:center;height:auto;display:flex;bottom:0}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-top:0;margin-bottom:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*,.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status{display:none}@media not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{pointer-events:none;margin:0;position:absolute;top:0;left:0;right:0;height:100%!important}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{-webkit-transform-style:preserve-3d;transform-style:preserve-3d;background-color:#0000!important;border:none!important}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{margin:0;padding:0;position:absolute;top:0;left:0;right:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.filepond--panel-top:after{content:"";background-color:inherit;height:2px;position:absolute;bottom:-1px;left:0;right:0}.filepond--panel-bottom,.filepond--panel-center{will-change:transform;backface-visibility:hidden;transform-origin:0 0;transform:translateY(.5em)}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{content:"";background-color:inherit;height:2px;position:absolute;top:-1px;left:0;right:0}.filepond--panel-center{border-top:none!important;border-bottom:none!important;border-radius:0!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;pointer-events:none;will-change:transform,opacity;width:1.25em;height:1.25em;margin:0;position:static}.filepond--progress-indicator svg{vertical-align:top;transform-box:fill-box;width:100%;height:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;text-align:left;text-rendering:optimizeLegibility;contain:layout style size;direction:ltr;margin-bottom:1em;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;position:relative}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-top:1em;margin-bottom:1em}.filepond--root .filepond--credits{opacity:.4;color:inherit;z-index:3;font-size:11px;line-height:.85;text-decoration:none;position:absolute;bottom:-14px;right:0}.filepond--root .filepond--credits[style]{margin-top:14px;top:0;bottom:auto}.filepond--action-edit-item.filepond--action-edit-item{width:2em;height:2em;padding:.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{line-height:inherit;color:inherit;pointer-events:all;background:0 0;border:none;outline:none;margin:0 0 0 .25em;padding:0;font-family:inherit;position:absolute}.filepond--action-edit-item-alt svg{width:1.3125em;height:1.3125em}.filepond--action-edit-item-alt span{opacity:0;font-size:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{position:absolute;top:0;left:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{opacity:0;z-index:2;pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;min-height:5rem;max-height:7rem;margin:0;display:block;position:absolute;top:0;left:0}.filepond--image-preview-overlay svg{width:100%;height:auto;color:inherit;max-height:inherit}.filepond--image-preview-overlay-idle{mix-blend-mode:multiply;color:#282828d9}.filepond--image-preview-overlay-success{mix-blend-mode:normal;color:#369763}.filepond--image-preview-overlay-failure{mix-blend-mode:normal;color:#c44e47}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{-webkit-user-select:none;user-select:none;background:#00000003;border-radius:.45em;height:100%;margin:0;position:absolute;top:0;left:0;right:0;overflow:hidden}.filepond--image-preview{z-index:1;pointer-events:none;will-change:transform,opacity;background:#222;align-items:center;width:100%;height:100%;display:flex;position:absolute;top:0;left:0}.filepond--image-clip{margin:0 auto;position:relative;overflow:hidden}.filepond--image-clip[data-transparency-indicator=grid] img,.filepond--image-clip[data-transparency-indicator=grid] canvas{background-color:#fff;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0 H50 V50 H0'/%3E%3Cpath d='M50 50 H100 V100 H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{will-change:transform;position:absolute;top:0;left:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{justify-content:center;align-items:center;height:100%;display:flex}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{top:auto;bottom:0;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-top:0;margin-bottom:.1875em;margin-left:.1875em}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{width:calc(100% - 1.4em);margin:2.3em auto auto}.filepond--media-preview .playpausebtn{float:left;cursor:pointer;background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;outline:none;width:25px;height:25px;margin-top:.3em;margin-right:.3em}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{float:left;background:#ffffff4d;border-radius:15px;width:calc(100% - 2.5em);height:3px;margin-top:1em}.filepond--media-preview .playhead{background:#fff;border-radius:50%;width:13px;height:13px;margin-top:-5px}.filepond--media-preview-wrapper{pointer-events:auto;background:#00000003;border-radius:.45em;height:100%;margin:0;position:absolute;top:0;left:0;right:0;overflow:hidden}.filepond--media-preview-wrapper:before{content:" ";width:100%;height:2em;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);z-index:3;background:linear-gradient(#000,#0000);position:absolute}.filepond--media-preview{z-index:1;transform-origin:50%;will-change:transform,opacity;width:100%;height:100%;display:block;position:relative}.filepond--media-preview video,.filepond--media-preview audio{will-change:transform;width:100%}.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:#0000;-webkit-user-select:none;user-select:none;-ms-touch-action:none;touch-action:none;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{z-index:1;width:100%;height:100%;position:relative}.noUi-connects{z-index:0;overflow:hidden}.noUi-connect,.noUi-origin{will-change:transform;z-index:1;transform-origin:0 0;width:100%;height:100%;-webkit-transform-style:preserve-3d;transform-style:flat;position:absolute;top:0;right:0}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{width:0;top:-100%}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{backface-visibility:hidden;position:absolute}.noUi-touch-area{width:100%;height:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;top:-6px;right:-17px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;bottom:-17px;right:-6px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#fafafa;border:1px solid #d3d3d3;border-radius:4px;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.noUi-connects{border-radius:3px}.noUi-connect{background:#3fb8af}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{cursor:default;background:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noUi-handle:before,.noUi-handle:after{content:"";background:#e8e7e6;width:1px;height:14px;display:block;position:absolute;top:6px;left:14px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:before,.noUi-vertical .noUi-handle:after{width:14px;height:1px;top:14px;left:6px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#b8b8b8}[disabled].noUi-target,[disabled].noUi-handle,[disabled] .noUi-handle{cursor:not-allowed}.noUi-pips,.noUi-pips *{box-sizing:border-box}.noUi-pips{color:#999;position:absolute}.noUi-value{white-space:nowrap;text-align:center;position:absolute}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{background:#ccc;position:absolute}.noUi-marker-sub,.noUi-marker-large{background:#aaa}.noUi-pips-horizontal{width:100%;height:80px;padding:10px 0;top:100%;left:0}.noUi-value-horizontal{transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{width:2px;height:5px;margin-left:-1px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{height:100%;padding:0 10px;top:0;left:100%}.noUi-value-vertical{padding-left:25px;transform:translateY(-50%)}.noUi-rtl .noUi-value-vertical{transform:translateY(50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{color:#000;text-align:center;white-space:nowrap;background:#fff;border:1px solid #d9d9d9;border-radius:3px;padding:5px;display:block;position:absolute}.noUi-horizontal .noUi-tooltip{bottom:120%;left:50%;transform:translate(-50%)}.noUi-vertical .noUi-tooltip{top:50%;right:120%;transform:translateY(-50%)}.noUi-horizontal .noUi-origin>.noUi-tooltip{bottom:10px;left:auto;transform:translate(50%)}.noUi-vertical .noUi-origin>.noUi-tooltip{top:auto;right:28px;transform:translateY(-18px)}.fi-fo-builder{row-gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}.fi-fo-builder .fi-fo-builder-actions{column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-builder .fi-fo-builder-actions.fi-hidden{display:none}.fi-fo-builder .fi-fo-builder-items{grid-template-columns:repeat(1,minmax(0,1fr));display:grid}.fi-fo-builder .fi-fo-builder-items>*+*{margin-top:calc(var(--spacing)*4)}.fi-fo-builder .fi-fo-builder-item{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-item.fi-collapsed .fi-fo-builder-item-header-collapsible-actions{rotate:-180deg}.fi-fo-builder .fi-fo-builder-item.fi-collapsed .fi-fo-builder-item-header-collapse-action,.fi-fo-builder .fi-fo-builder-item:not(.fi-collapsed) .fi-fo-builder-item-header-expand-action{pointer-events:none;opacity:0}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-item{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#0000;border-radius:0}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-item>.fi-fo-builder-item-content{padding:calc(var(--spacing)*0)}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-label-between-items-ctn>.fi-fo-builder-label-between-items-divider-before{width:calc(var(--spacing)*0)}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-label-between-items-ctn>.fi-fo-builder-label-between-items{padding-inline-start:calc(var(--spacing)*0)}.fi-fo-builder .fi-fo-builder-item-header{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex;overflow:hidden}.fi-fo-builder.fi-collapsible .fi-fo-builder-item-header{cursor:pointer;-webkit-user-select:none;user-select:none}.fi-fo-builder .fi-fo-builder-item-header-start-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-builder .fi-fo-builder-item-header-icon{color:var(--gray-400)}.fi-fo-builder .fi-fo-builder-item-header-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-builder .fi-fo-builder-item-header-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-fo-builder .fi-fo-builder-item-header-label:where(.dark,.dark *){color:var(--color-white)}.fi-fo-builder .fi-fo-builder-item-header-label.fi-truncated{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-fo-builder .fi-fo-builder-item-header-end-actions{align-items:center;column-gap:calc(var(--spacing)*3);margin-inline-start:auto;display:flex}.fi-fo-builder .fi-fo-builder-item-header-collapsible-actions{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:relative}.fi-fo-builder .fi-fo-builder-item-header-collapse-action{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fi-fo-builder .fi-fo-builder-item-header-expand-action{inset:calc(var(--spacing)*0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;rotate:180deg}.fi-fo-builder .fi-fo-builder-item-content:not(.fi-fo-builder-item-content-has-preview){padding:calc(var(--spacing)*4)}.fi-fo-builder .fi-fo-builder-item-content.fi-fo-builder-item-content-has-preview{position:relative}.fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-100)}.fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-item-preview:not(.fi-interactive){pointer-events:none}.fi-fo-builder .fi-fo-builder-item-preview-edit-overlay{inset:calc(var(--spacing)*0);z-index:1;cursor:pointer;position:absolute}.fi-fo-builder .fi-fo-builder-block-picker-ctn{border-radius:var(--radius-lg);background-color:var(--color-white)}.fi-fo-builder .fi-fo-builder-block-picker-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.fi-fo-builder .fi-fo-builder-add-between-items-ctn{pointer-events:none;visibility:hidden;margin-top:calc(var(--spacing)*0);height:calc(var(--spacing)*0);opacity:0;width:100%;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));justify-content:center;display:flex;position:relative;overflow:visible}.fi-fo-builder .fi-fo-builder-item:hover+.fi-fo-builder-add-between-items-ctn,.fi-fo-builder .fi-fo-builder-add-between-items-ctn:has(+.fi-fo-builder-item:hover),.fi-fo-builder .fi-fo-builder-add-between-items-ctn:hover,.fi-fo-builder .fi-fo-builder-add-between-items-ctn:focus-within{pointer-events:auto;visibility:visible;opacity:1}.fi-fo-builder .fi-fo-builder-add-between-items{z-index:10;--tw-translate-y:calc(-50% + .5rem);translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-lg);background-color:var(--color-white);position:absolute;top:50%}.fi-fo-builder .fi-fo-builder-add-between-items:where(.dark,.dark *){background-color:var(--gray-900)}.fi-fo-builder .fi-fo-builder-label-between-items-ctn{margin-top:calc(var(--spacing)*1);margin-bottom:calc(var(--spacing)*-3);align-items:center;display:flex;position:relative}.fi-fo-builder .fi-fo-builder-label-between-items-divider-before{width:calc(var(--spacing)*3);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex-shrink:0}.fi-fo-builder .fi-fo-builder-label-between-items-divider-before:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-label-between-items-divider-before:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-label-between-items{padding-inline:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);flex-shrink:0}.fi-fo-builder .fi-fo-builder-label-between-items:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-builder .fi-fo-builder-label-between-items-divider-after{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex:1}.fi-fo-builder .fi-fo-builder-label-between-items-divider-after:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-label-between-items-divider-after:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-block-picker{justify-content:center;display:flex}.fi-fo-builder .fi-fo-builder-block-picker.fi-align-start,.fi-fo-builder .fi-fo-builder-block-picker.fi-align-left{justify-content:flex-start}.fi-fo-builder .fi-fo-builder-block-picker.fi-align-end,.fi-fo-builder .fi-fo-builder-block-picker.fi-align-right{justify-content:flex-end}.fi-fo-checkbox-list .fi-fo-checkbox-list-search-input-wrp{margin-bottom:calc(var(--spacing)*4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-actions{margin-bottom:calc(var(--spacing)*2)}.fi-fo-checkbox-list .fi-fo-checkbox-list-options{gap:calc(var(--spacing)*4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-options.fi-grid-direction-col{margin-top:calc(var(--spacing)*-4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-options.fi-grid-direction-col .fi-fo-checkbox-list-option-ctn{break-inside:avoid;padding-top:calc(var(--spacing)*4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-option{column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-checkbox-input{margin-top:calc(var(--spacing)*1);flex-shrink:0}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);display:grid}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);overflow-wrap:break-word;color:var(--gray-950);overflow:hidden}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-label:where(.dark,.dark *){color:var(--color-white)}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-description{color:var(--gray-500)}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-description:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-checkbox-list .fi-fo-checkbox-list-no-search-results-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-fo-checkbox-list .fi-fo-checkbox-list-no-search-results-message:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-code-editor{overflow:hidden}.fi-fo-code-editor .cm-editor.cm-focused{--tw-outline-style:none!important;outline-style:none!important}.fi-fo-code-editor .cm-editor .cm-gutters{min-height:calc(var(--spacing)*48)!important;border-inline-end-color:var(--gray-300)!important;background-color:var(--gray-100)!important}.fi-fo-code-editor .cm-editor .cm-gutters:where(.dark,.dark *){border-inline-end-color:var(--gray-800)!important;background-color:var(--gray-950)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement{border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md);margin-inline-start:calc(var(--spacing)*1)}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter{background-color:var(--gray-200)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter:where(.dark,.dark *){background-color:var(--gray-800)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter{background-color:var(--gray-200)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter:where(.dark,.dark *){background-color:var(--gray-800)!important}.fi-fo-code-editor .cm-editor .cm-scroller{min-height:calc(var(--spacing)*48)!important}.fi-fo-code-editor .cm-editor .cm-line{border-start-end-radius:var(--radius-md);border-end-end-radius:var(--radius-md);margin-inline-end:calc(var(--spacing)*1)}.fi-fo-code-editor.fi-disabled .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter,.fi-fo-code-editor.fi-disabled .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter,.fi-fo-code-editor.fi-disabled .cm-editor .cm-line.cm-activeLine{background-color:#0000!important}.fi-fo-color-picker .fi-input-wrp-content{display:flex}.fi-fo-color-picker .fi-fo-color-picker-preview{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);-webkit-user-select:none;user-select:none;border-radius:3.40282e38px;flex-shrink:0;margin-block:auto;margin-inline-end:calc(var(--spacing)*3)}.fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-200);--tw-ring-inset:inset}.fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-color-picker .fi-fo-color-picker-panel{z-index:10;border-radius:var(--radius-lg);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:none;position:absolute}.fi-fo-date-time-picker input::-webkit-datetime-edit{padding:0;display:block}.fi-fo-date-time-picker .fi-fo-date-time-picker-trigger{width:100%}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{--tw-border-style:none;width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);--tw-outline-style:none;background-color:#0000;border-style:none;outline-style:none}@media (forced-colors:active){.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{outline-offset:2px;outline:2px solid #0000}}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input::placeholder{color:var(--gray-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel{z-index:10;position:absolute}:where(.fi-fo-date-time-picker .fi-fo-date-time-picker-panel>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel{border-radius:var(--radius-lg);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-date-time-picker .fi-fo-date-time-picker-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel .fi-fo-date-time-picker-panel-header{justify-content:space-between;align-items:center;display:flex}.fi-fo-date-time-picker .fi-fo-date-time-picker-month-select{cursor:pointer;--tw-border-style:none;padding:calc(var(--spacing)*0);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);background-color:#0000;border-style:none;flex-grow:1}.fi-fo-date-time-picker .fi-fo-date-time-picker-month-select:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-month-select:where(.dark,.dark *){background-color:var(--gray-900);color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-year-input{width:calc(var(--spacing)*16);--tw-border-style:none;padding:calc(var(--spacing)*0);text-align:right;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-950);background-color:#0000;border-style:none}.fi-fo-date-time-picker .fi-fo-date-time-picker-year-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-year-input:where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header{gap:calc(var(--spacing)*1);grid-template-columns:repeat(7,minmax(0,1fr));display:grid}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header .fi-fo-date-time-picker-calendar-header-day{text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header .fi-fo-date-time-picker-calendar-header-day:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar{grid-template-columns:repeat(7,minmax(calc(var(--spacing)*7),1fr));gap:calc(var(--spacing)*1);display:grid}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day{text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:var(--leading-loose);line-height:var(--leading-loose);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;border-radius:3.40282e38px;transition-duration:75ms}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-disabled{pointer-events:none;opacity:.5}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-disabled){cursor:pointer}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected{background-color:var(--gray-50);color:var(--primary-600)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled){background-color:var(--gray-100)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-fo-date-time-picker-calendar-day-today:not(.fi-focused):not(.fi-selected):not(.fi-disabled){color:var(--primary-600)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-fo-date-time-picker-calendar-day-today:not(.fi-focused):not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){color:var(--primary-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-fo-date-time-picker-calendar-day-today):not(.fi-selected){color:var(--gray-950)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-fo-date-time-picker-calendar-day-today):not(.fi-selected):where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs{justify-content:center;align-items:center;display:flex}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input{width:calc(var(--spacing)*10);--tw-border-style:none;padding:calc(var(--spacing)*0);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-950);background-color:#0000;border-style:none;margin-inline-end:calc(var(--spacing)*1)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input:where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs .fi-fo-date-time-picker-time-input-separator{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs .fi-fo-date-time-picker-time-input-separator:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-field{row-gap:calc(var(--spacing)*2);display:grid}@media (min-width:40rem){.fi-fo-field.fi-fo-field-has-inline-label{align-items:flex-start;column-gap:calc(var(--spacing)*4);grid-template-columns:repeat(3,minmax(0,1fr))}.fi-fo-field.fi-fo-field-has-inline-label .fi-fo-field-content-col{grid-column:span 2/span 2}}.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label{align-items:flex-start;column-gap:calc(var(--spacing)*3);display:flex}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-checkbox-input{margin-top:calc(var(--spacing)*.5);flex-shrink:0}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-toggle{margin-block:calc(var(--spacing)*-.5)}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-sc:first-child{flex-grow:0}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label).fi-hidden{display:none}.fi-fo-field .fi-fo-field-label-content{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-fo-field .fi-fo-field-label-content:where(.dark,.dark *){color:var(--color-white)}.fi-fo-field .fi-fo-field-label-content .fi-fo-field-label-required-mark{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-600)}.fi-fo-field .fi-fo-field-label-content .fi-fo-field-label-required-mark:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-field .fi-fo-field-label-col{row-gap:calc(var(--spacing)*2);grid-auto-columns:minmax(0,1fr);height:100%;display:grid}@media (min-width:40rem){.fi-fo-field .fi-fo-field-label-col.fi-vertical-align-start{align-items:flex-start}.fi-fo-field .fi-fo-field-label-col.fi-vertical-align-center{align-items:center}.fi-fo-field .fi-fo-field-label-col.fi-vertical-align-end{align-items:flex-end}}.fi-fo-field .fi-fo-field-content-col{row-gap:calc(var(--spacing)*2);grid-auto-columns:minmax(0,1fr);display:grid}.fi-fo-field .fi-fo-field-content-ctn{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;display:flex}.fi-fo-field .fi-fo-field-content{width:100%}.fi-fo-field .fi-fo-field-wrp-error-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--danger-600)}.fi-fo-field .fi-fo-field-wrp-error-message:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-field .fi-fo-field-wrp-error-list{list-style-type:disc;list-style-position:inside}:where(.fi-fo-field .fi-fo-field-wrp-error-list>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}.fi-fo-file-upload{row-gap:calc(var(--spacing)*2);flex-direction:column;display:flex}.fi-fo-file-upload.fi-align-start,.fi-fo-file-upload.fi-align-left{align-items:flex-start}.fi-fo-file-upload.fi-align-center{align-items:center}.fi-fo-file-upload.fi-align-end,.fi-fo-file-upload.fi-align-right{align-items:flex-end}.fi-fo-file-upload .fi-fo-file-upload-input-ctn{width:100%;height:100%}.fi-fo-file-upload.fi-fo-file-upload-avatar .fi-fo-file-upload-input-ctn{height:100%;width:calc(var(--spacing)*32)}.fi-fo-file-upload .fi-fo-file-upload-error-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--danger-600)}.fi-fo-file-upload .fi-fo-file-upload-error-message:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-file-upload .filepond--root{margin-bottom:calc(var(--spacing)*0);border-radius:var(--radius-lg);background-color:var(--color-white);font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow:hidden}.fi-fo-file-upload .filepond--root:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--root:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-file-upload .filepond--root:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--root:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-file-upload .filepond--root[data-disabled=disabled]{background-color:var(--gray-50)}.fi-fo-file-upload .filepond--root[data-disabled=disabled]:where(.dark,.dark *){--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--root[data-disabled=disabled]:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-file-upload .filepond--root[data-style-panel-layout=compact\ circle]{border-radius:3.40282e38px}.fi-fo-file-upload .filepond--panel-root{background-color:#0000}.fi-fo-file-upload .filepond--drop-label label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600);padding:calc(var(--spacing)*3)!important}.fi-fo-file-upload .filepond--drop-label label:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-file-upload .filepond--label-action{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--primary-600);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;text-decoration-line:none;transition-duration:75ms}@media (hover:hover){.fi-fo-file-upload .filepond--label-action:hover{color:var(--primary-500)}}.fi-fo-file-upload .filepond--label-action:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.fi-fo-file-upload .filepond--label-action:where(.dark,.dark *):hover{color:var(--primary-500)}}.fi-fo-file-upload .filepond--drip-blob{background-color:var(--gray-400)}.fi-fo-file-upload .filepond--drip-blob:where(.dark,.dark *){background-color:var(--gray-500)}.fi-fo-file-upload .filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(50% - .5rem);display:inline}@media (min-width:64rem){.fi-fo-file-upload .filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.fi-fo-file-upload .filepond--download-icon{pointer-events:auto;width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);background-color:var(--color-white);vertical-align:bottom;margin-inline-end:calc(var(--spacing)*1);display:inline-block}@media (hover:hover){.fi-fo-file-upload .filepond--download-icon:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--download-icon:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}}.fi-fo-file-upload .filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItZG93bmxvYWQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iNyAxMCAxMiAxNSAxNyAxMCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIxNSIgeDI9IjEyIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItZG93bmxvYWQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iNyAxMCAxMiAxNSAxNyAxMCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIxNSIgeDI9IjEyIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPg==);-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.fi-fo-file-upload .filepond--open-icon{pointer-events:auto;width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);background-color:var(--color-white);vertical-align:bottom;margin-inline-end:calc(var(--spacing)*1);display:inline-block}@media (hover:hover){.fi-fo-file-upload .filepond--open-icon:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--open-icon:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}}.fi-fo-file-upload .filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogIDxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwMC0yIDJ2MTBhMiAyIDAgMDAyIDJoMTBhMiAyIDAgMDAyLTJ2LTRNMTQgNGg2bTAgMHY2bTAtNkwxMCAxNCIgLz4KPC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogIDxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwMC0yIDJ2MTBhMiAyIDAgMDAyIDJoMTBhMiAyIDAgMDAyLTJ2LTRNMTQgNGg2bTAgMHY2bTAtNkwxMCAxNCIgLz4KPC9zdmc+Cg==);-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.fi-fo-file-upload .filepond--file-action-button.filepond--action-edit-item{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--file-action-button.filepond--action-edit-item{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor{inset:calc(var(--spacing)*0);isolation:isolate;z-index:50;width:100vw;height:100dvh;padding:calc(var(--spacing)*2);position:fixed}@media (min-width:40rem){.fi-fo-file-upload .fi-fo-file-upload-editor{padding:calc(var(--spacing)*10)}}@media (min-width:48rem){.fi-fo-file-upload .fi-fo-file-upload-editor{padding:calc(var(--spacing)*20)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{inset:calc(var(--spacing)*0);cursor:pointer;background-color:var(--gray-950);width:100%;height:100%;position:fixed}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{will-change:transform}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{isolation:isolate;border-radius:var(--radius-xl);background-color:var(--color-white);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100%;height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-900);flex-direction:column;margin-inline:auto;display:flex;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{--tw-ring-color:color-mix(in oklab,var(--gray-900)10%,transparent)}}@media (min-width:64rem){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{flex-direction:row}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window:where(.dark,.dark *){background-color:var(--gray-800);--tw-ring-color:var(--gray-50)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-50)10%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-image-ctn{margin:calc(var(--spacing)*4);flex:1;max-width:100%;max-height:100%}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-image{width:auto;height:100%}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel{background-color:var(--gray-50);flex-direction:column;flex:1;width:100%;height:100%;display:flex;overflow-y:auto}@media (min-width:64rem){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel{max-width:var(--container-xs)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main{flex:1}:where(.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main{padding:calc(var(--spacing)*4);overflow:auto}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group{gap:calc(var(--spacing)*3);display:grid}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn-group{width:100%}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn.fi-active{background-color:var(--gray-50)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn.fi-active:where(.dark,.dark *){background-color:var(--gray-700)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-fo-file-upload-editor-control-panel-group-title{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-950)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-fo-file-upload-editor-control-panel-group-title:where(.dark,.dark *){color:var(--color-white)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-footer{align-items:center;gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-reset-action{margin-left:auto}.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{background-color:var(--gray-100)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{background-color:color-mix(in oklab,var(--gray-100)50%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{opacity:1}.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)80%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-circle-cropper .cropper-view-box,.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-circle-cropper .cropper-face{border-radius:50%}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-window{max-width:var(--container-3xl);flex-direction:column}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-image-ctn{min-height:calc(var(--spacing)*0);flex:1;overflow:hidden}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel{flex:none;height:auto}@media (min-width:64rem){.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel{max-width:none}}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel-footer{justify-content:flex-start}:where(.fi-fo-key-value .fi-fo-key-value-table-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-key-value .fi-fo-key-value-table{table-layout:auto;width:100%}:where(.fi-fo-key-value .fi-fo-key-value-table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-key-value .fi-fo-key-value-table>thead>tr>th{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-fo-key-value .fi-fo-key-value-table>thead>tr>th:where(.dark,.dark *){color:var(--gray-200)}.fi-fo-key-value .fi-fo-key-value-table>thead>tr>th.fi-has-action{width:calc(var(--spacing)*9);padding:calc(var(--spacing)*0)}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-divide-x-reverse:1}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td{width:50%;padding:calc(var(--spacing)*0)}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td.fi-has-action{width:auto;padding:calc(var(--spacing)*.5)}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td.fi-has-action .fi-fo-key-value-table-row-sortable-handle{display:flex}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td .fi-input{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-fo-key-value .fi-fo-key-value-add-action-ctn{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);justify-content:center;display:flex}@media (min-width:40rem){.fi-fo-key-value-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-markdown-editor{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.fi-fo-markdown-editor:not(.fi-disabled){max-width:100%;font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-950);overflow:hidden}.fi-fo-markdown-editor:not(.fi-disabled):where(.dark,.dark *){color:var(--color-white)}.fi-fo-markdown-editor.fi-disabled{border-radius:var(--radius-lg);background-color:var(--gray-50);width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);display:block}.fi-fo-markdown-editor.fi-disabled:where(.dark,.dark *){color:var(--gray-400);--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor.fi-disabled:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror{padding-inline:calc(var(--spacing)*4)!important;padding-block:calc(var(--spacing)*3)!important}.fi-fo-markdown-editor .cm-s-easymde .cm-comment{color:var(--color-cm-gray-muted);background-color:#0000}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-property,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-operator{color:var(--color-cm-gray)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-string,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-bracket,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{color:inherit;background-color:#0000}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror{--tw-border-style:none;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);color:inherit;background-color:#0000;border-style:none}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror-scroll{height:auto}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar{gap:calc(var(--spacing)*1);border-style:var(--tw-border-style);border-width:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*2);border-radius:0;flex-wrap:wrap;display:flex}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8);border-radius:var(--radius-lg);--tw-border-style:none;padding:calc(var(--spacing)*0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;border-style:none;place-content:center;transition-duration:75ms;display:grid}@media (hover:hover){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:hover{background-color:var(--gray-50)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active{background-color:var(--gray-50)}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:before{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);background-color:var(--gray-700);content:"";display:block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:before{background-color:var(--primary-600)}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .separator{width:calc(var(--spacing)*1);--tw-border-style:none;border-style:none;margin:calc(var(--spacing)*0)!important}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z' /%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z' /%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 15.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 10a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 15.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 10a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3ZM2.97 8.654a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 9.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 15.5a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM2.625 13.875a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3ZM2.97 8.654a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 9.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 15.5a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM2.625 13.875a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-statusbar{display:none}.fi-fo-markdown-editor:where(.dark,.dark *){--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert()}.fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .editor-toolbar button:before{background-color:var(--gray-300)}.fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .editor-toolbar button.active:before{background-color:var(--primary-400)}[x-sortable]:has(.fi-sortable-ghost) .fi-fo-markdown-editor{pointer-events:none}.fi-fo-modal-table-select:not(.fi-fo-modal-table-select-multiple){align-items:flex-start;column-gap:calc(var(--spacing)*3);--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5);display:flex}.fi-fo-modal-table-select.fi-fo-modal-table-select-multiple{gap:calc(var(--spacing)*2);display:grid}.fi-fo-modal-table-select.fi-fo-modal-table-select-multiple .fi-fo-modal-table-select-badges-ctn{gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.fi-fo-modal-table-select .fi-fo-modal-table-select-placeholder{color:var(--gray-400)}.fi-fo-modal-table-select .fi-fo-modal-table-select-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-radio{gap:calc(var(--spacing)*4)}.fi-fo-radio.fi-inline{flex-wrap:wrap;display:flex}.fi-fo-radio:not(.fi-inline).fi-grid-direction-col{margin-top:calc(var(--spacing)*-4)}.fi-fo-radio:not(.fi-inline).fi-grid-direction-col>.fi-fo-radio-label{break-inside:avoid;padding-top:calc(var(--spacing)*4)}.fi-fo-radio>.fi-fo-radio-label{column-gap:calc(var(--spacing)*3);align-self:flex-start;display:flex}.fi-fo-radio>.fi-fo-radio-label>.fi-radio-input{margin-top:calc(var(--spacing)*1);flex-shrink:0}.fi-fo-radio>.fi-fo-radio-label>.fi-fo-radio-label-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);display:grid}.fi-fo-radio>.fi-fo-radio-label>.fi-fo-radio-label-text:where(.dark,.dark *){color:var(--color-white)}.fi-fo-radio>.fi-fo-radio-label .fi-fo-radio-label-description{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:var(--gray-500)}.fi-fo-radio>.fi-fo-radio-label .fi-fo-radio-label-description:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-repeater{row-gap:calc(var(--spacing)*4);display:grid}.fi-fo-repeater .fi-fo-repeater-actions{column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-repeater .fi-fo-repeater-actions.fi-hidden{display:none}.fi-fo-repeater .fi-fo-repeater-items{align-items:flex-start;gap:calc(var(--spacing)*4)}.fi-fo-repeater .fi-fo-repeater-item{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-item.fi-collapsed .fi-fo-repeater-item-header-collapsible-actions{rotate:-180deg}.fi-fo-repeater .fi-fo-repeater-item.fi-collapsed .fi-fo-repeater-item-header-collapse-action,.fi-fo-repeater .fi-fo-repeater-item:not(.fi-collapsed) .fi-fo-repeater-item-header-expand-action{pointer-events:none;opacity:0}.fi-fo-repeater .fi-fo-repeater-item-header{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex;overflow:hidden}.fi-fo-repeater.fi-collapsible .fi-fo-repeater-item-header{cursor:pointer;-webkit-user-select:none;user-select:none}.fi-fo-repeater .fi-fo-repeater-item-header-start-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-repeater .fi-fo-repeater-item-header-icon{color:var(--gray-400)}.fi-fo-repeater .fi-fo-repeater-item-header-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-repeater .fi-fo-repeater-item-header-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-fo-repeater .fi-fo-repeater-item-header-label:where(.dark,.dark *){color:var(--color-white)}.fi-fo-repeater .fi-fo-repeater-item-header-label.fi-truncated{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-fo-repeater .fi-fo-repeater-item-header-end-actions{align-items:center;column-gap:calc(var(--spacing)*3);margin-inline-start:auto;display:flex}.fi-fo-repeater .fi-fo-repeater-item-header-collapsible-actions{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:relative}.fi-fo-repeater .fi-fo-repeater-item-header-collapse-action{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fi-fo-repeater .fi-fo-repeater-item-header-expand-action{inset:calc(var(--spacing)*0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;rotate:180deg}.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-100)}.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-item-content{padding:calc(var(--spacing)*4)}.fi-fo-repeater .fi-fo-repeater-add-between-items-ctn{justify-content:center;width:100%;display:flex}.fi-fo-repeater .fi-fo-repeater-add-between-items{border-radius:var(--radius-lg);background-color:var(--color-white)}.fi-fo-repeater .fi-fo-repeater-add-between-items:where(.dark,.dark *){background-color:var(--gray-900)}.fi-fo-repeater .fi-fo-repeater-label-between-items-ctn{margin-block:calc(var(--spacing)*-2);align-items:center;display:flex;position:relative}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before{width:calc(var(--spacing)*3);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex-shrink:0}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-label-between-items{padding-inline:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);flex-shrink:0}.fi-fo-repeater .fi-fo-repeater-label-between-items:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex:1}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-add{justify-content:center;width:100%;display:flex}.fi-fo-repeater .fi-fo-repeater-add.fi-align-start,.fi-fo-repeater .fi-fo-repeater-add.fi-align-left{justify-content:flex-start}.fi-fo-repeater .fi-fo-repeater-add.fi-align-end,.fi-fo-repeater .fi-fo-repeater-add.fi-align-right{justify-content:flex-end}.fi-fo-simple-repeater{row-gap:calc(var(--spacing)*4);display:grid}.fi-fo-simple-repeater .fi-fo-simple-repeater-items{gap:calc(var(--spacing)*4)}.fi-fo-simple-repeater .fi-fo-simple-repeater-item{justify-content:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-simple-repeater .fi-fo-simple-repeater-item-content{flex:1}.fi-fo-simple-repeater .fi-fo-simple-repeater-item-actions{align-items:center;column-gap:calc(var(--spacing)*1);display:flex}.fi-fo-simple-repeater .fi-fo-simple-repeater-add{justify-content:center;width:100%;display:flex}.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-start,.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-left{justify-content:flex-start}.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-end,.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-right{justify-content:flex-end}.fi-fo-table-repeater{gap:calc(var(--spacing)*3);display:grid}.fi-fo-table-repeater>table{width:100%;display:block}:where(.fi-fo-table-repeater>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-fo-table-repeater>table{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}:where(.fi-fo-table-repeater>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-table-repeater>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-table-repeater>table:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater>table:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-table-repeater>table>thead{white-space:nowrap;display:none}.fi-fo-table-repeater>table>thead>tr>th{border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-fo-table-repeater>table>thead>tr>th:first-of-type{border-top-left-radius:var(--radius-xl)}.fi-fo-table-repeater>table>thead>tr>th:last-of-type{border-top-right-radius:var(--radius-xl)}.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){color:var(--color-white)}.fi-fo-table-repeater>table>thead>tr>th:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-fo-table-repeater>table>thead>tr>th:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-fo-table-repeater>table>thead>tr>th.fi-align-start,.fi-fo-table-repeater>table>thead>tr>th.fi-align-left{text-align:start}.fi-fo-table-repeater>table>thead>tr>th.fi-align-end,.fi-fo-table-repeater>table>thead>tr>th.fi-align-right{text-align:end}.fi-fo-table-repeater>table>thead>tr>th.fi-wrapped{white-space:normal}.fi-fo-table-repeater>table>thead>tr>th:not(.fi-wrapped){white-space:nowrap}.fi-fo-table-repeater>table>thead>tr>th.fi-fo-table-repeater-empty-header-cell{width:calc(var(--spacing)*1)}.fi-fo-table-repeater>table>tbody{display:block}:where(.fi-fo-table-repeater>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-table-repeater>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-table-repeater>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater>table>tbody>tr{gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6);display:grid}.fi-fo-table-repeater>table>tbody>tr>td{display:block}.fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:none}.fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-start{vertical-align:top}.fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-center{vertical-align:middle}.fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-end{vertical-align:bottom}.fi-fo-table-repeater>table .fi-fo-table-repeater-header-required-mark{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-600)}.fi-fo-table-repeater>table .fi-fo-table-repeater-header-required-mark:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-table-repeater>table .fi-fo-table-repeater-actions{align-items:center;column-gap:calc(var(--spacing)*3);height:100%;display:flex}@supports (container-type:inline-size){.fi-fo-table-repeater{container-type:inline-size}@container (min-width:36rem){.fi-fo-table-repeater>table{display:table}.fi-fo-table-repeater>table>thead{display:table-header-group}.fi-fo-table-repeater>table>tbody{display:table-row-group}.fi-fo-table-repeater>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-fo-table-repeater>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field-label-content,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry-label{display:none}.fi-fo-table-repeater>table .fi-fo-table-repeater-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td{border-color:var(--gray-200);padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*1)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-fo-table-repeater.fi-compact .fi-input-wrp{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;background-color:#0000!important}.fi-fo-table-repeater.fi-compact .fi-fo-field-wrp-error-message{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact .fi-in-entry-content,.fi-fo-table-repeater.fi-compact .fi-fo-radio{padding-inline:calc(var(--spacing)*3)}}}@supports not (container-type:inline-size){@media (min-width:64rem){.fi-fo-table-repeater>table{display:table}.fi-fo-table-repeater>table>thead{display:table-header-group}.fi-fo-table-repeater>table>tbody{display:table-row-group}.fi-fo-table-repeater>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-fo-table-repeater>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field-label-content,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry-label{display:none}.fi-fo-table-repeater>table .fi-fo-table-repeater-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td{border-color:var(--gray-200);padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*1)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-fo-table-repeater.fi-compact .fi-input-wrp{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;background-color:#0000!important}.fi-fo-table-repeater.fi-compact .fi-fo-field-wrp-error-message{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact .fi-in-entry-content,.fi-fo-table-repeater.fi-compact .fi-fo-radio{padding-inline:calc(var(--spacing)*3)}}}.fi-fo-table-repeater .fi-fo-table-repeater-add{justify-content:center;width:100%;display:flex}.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-start,.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-left{justify-content:flex-start}.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-end,.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-right{justify-content:flex-end}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file{pointer-events:none;cursor:wait;opacity:.5}.fi-fo-rich-editor .fi-fo-rich-editor-toolbar{column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*2);flex-wrap:wrap;display:flex;position:relative}.fi-fo-rich-editor .fi-fo-rich-editor-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-floating-toolbar{visibility:hidden;z-index:20;margin-top:calc(var(--spacing)*-1);column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300);background-color:var(--color-white);max-width:100%;padding:calc(var(--spacing)*1);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);flex-wrap:wrap;display:flex;position:absolute}.fi-fo-rich-editor .fi-fo-rich-editor-floating-toolbar:where(.dark,.dark *){border-color:var(--gray-600);background-color:var(--gray-800)}.fi-fo-rich-editor .fi-fo-rich-editor-toolbar-group{column-gap:calc(var(--spacing)*1);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-tool{height:calc(var(--spacing)*8);min-width:calc(var(--spacing)*8);border-radius:var(--radius-lg);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-700);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;justify-content:center;align-items:center;transition-duration:75ms;display:flex}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-tool:hover{background-color:var(--gray-50)}}.fi-fo-rich-editor .fi-fo-rich-editor-tool:focus-visible{background-color:var(--gray-50)}.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-tool[disabled]{pointer-events:none;cursor:default;opacity:.7}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active{background-color:var(--gray-50);color:var(--primary-600)}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-fo-rich-editor-tool-with-label{align-items:center;column-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*1.5)}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message{align-items:center;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){color:var(--gray-200)}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message .fi-loading-indicator{color:var(--gray-400)}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message{align-items:center;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--danger-200);background-color:var(--danger-50);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-700);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){color:var(--danger-200)}.fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:column-reverse;display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-content{min-height:calc(var(--spacing)*12);width:100%;padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*3);flex:1;position:relative}.fi-fo-rich-editor span[data-type=mergeTag]{margin-block:calc(var(--spacing)*0);white-space:nowrap;display:inline-block}.fi-fo-rich-editor span[data-type=mergeTag]:before{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);opacity:.6;content:"{{";margin-inline-end:calc(var(--spacing)*1)}.fi-fo-rich-editor span[data-type=mergeTag]:after{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);opacity:.6;content:"}}";margin-inline-start:calc(var(--spacing)*1)}.fi-fo-rich-editor span[data-type=mention]{margin-block:calc(var(--spacing)*0);background-color:var(--primary-50);padding-inline:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--primary-600);border-radius:.25rem;display:inline-block}.fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){background-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--primary-400)10%,transparent)}}.fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-rich-editor .fi-fo-rich-editor-panels{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);width:100%}.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-panel-header{align-items:flex-start;gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-panel-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1}.fi-fo-rich-editor .fi-fo-rich-editor-panel-heading:where(.dark,.dark *){color:var(--color-white)}.fi-fo-rich-editor .fi-fo-rich-editor-panel-close-btn-ctn{flex-shrink:0}.fi-fo-rich-editor .fi-fo-rich-editor-panel{display:grid}:where(.fi-fo-rich-editor .fi-fo-rich-editor-panel>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-rich-editor .fi-fo-rich-editor-panel:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-rich-editor .fi-fo-rich-editor-panel:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tags-list{gap:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn{cursor:move;border-radius:var(--radius-lg);background-color:var(--color-white);padding:calc(var(--spacing)*1);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-blocks-list{gap:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn{cursor:move;gap:calc(var(--spacing)*1.5);border-radius:var(--radius-lg);background-color:var(--color-white);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600);display:flex}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.fi-fo-rich-editor .tiptap{height:100%}.fi-fo-rich-editor .tiptap:focus{--tw-outline-style:none;outline-style:none}div:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)[data-type=customBlock],img:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}:is(div:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)[data-type=customBlock],img:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)):where(.dark,.dark *){--tw-ring-color:var(--primary-500)}.fi-fo-rich-editor .tiptap p.is-editor-empty:first-child:before{pointer-events:none;float:inline-start;height:calc(var(--spacing)*0);color:var(--gray-400);content:attr(data-placeholder)}.fi-fo-rich-editor .tiptap p.is-editor-empty:first-child:where(.dark,.dark *):before{color:var(--gray-500)}.fi-fo-rich-editor .tiptap [data-type=details]{margin-block:calc(var(--spacing)*6);gap:calc(var(--spacing)*1);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950);display:flex}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]{border-color:color-mix(in oklab,var(--gray-950)20%,transparent)}}.fi-fo-rich-editor .tiptap [data-type=details]{padding:calc(var(--spacing)*4)}.fi-fo-rich-editor .tiptap [data-type=details]:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-rich-editor .tiptap [data-type=details]>div:first-of-type{margin-top:calc(var(--spacing)*0)!important}.fi-fo-rich-editor .tiptap [data-type=details] summary{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);list-style-type:none}.fi-fo-rich-editor .tiptap [data-type=details]>button{margin-top:1px;margin-right:calc(var(--spacing)*2);width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);border-radius:var(--radius-md);padding:calc(var(--spacing)*1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:1;background-color:#0000;justify-content:center;align-items:center;line-height:1;display:flex}@media (hover:hover){.fi-fo-rich-editor .tiptap [data-type=details]>button:hover{background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]>button:hover{background-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-fo-rich-editor .tiptap [data-type=details]>button:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]>button:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-rich-editor .tiptap [data-type=details]>button:before{content:"▶"}.fi-fo-rich-editor .tiptap [data-type=details].is-open>button:before{transform:rotate(90deg)}.fi-fo-rich-editor .tiptap [data-type=details]>div{gap:calc(var(--spacing)*4);flex-direction:column;width:100%;display:flex}.fi-fo-rich-editor .tiptap [data-type=details]>div>[data-type=detailsContent]{margin-top:calc(var(--spacing)*0)!important}.fi-fo-rich-editor .tiptap [data-type=details]>div>[data-type=detailsContent]>:last-child{margin-bottom:calc(var(--spacing)*4)}.fi-fo-rich-editor .tiptap table{margin:calc(var(--spacing)*0);table-layout:fixed;border-collapse:collapse;width:100%;overflow:hidden}.fi-fo-rich-editor .tiptap table:first-child{margin-top:calc(var(--spacing)*0)}.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th{border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300);vertical-align:top;min-width:1em;position:relative;padding:calc(var(--spacing)*2)!important}:is(.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th):where(.dark,.dark *){border-color:var(--gray-600)}:is(.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th)>*{margin-bottom:calc(var(--spacing)*0)}.fi-fo-rich-editor .tiptap table th{background-color:var(--gray-100);text-align:start;--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-fo-rich-editor .tiptap table th:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white)}.fi-fo-rich-editor .tiptap table .selectedCell:after{pointer-events:none;inset-inline-start:calc(var(--spacing)*0);inset-inline-end:calc(var(--spacing)*0);top:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);z-index:2;background-color:var(--gray-200);position:absolute}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap table .selectedCell:after{background-color:color-mix(in oklab,var(--gray-200)80%,transparent)}}.fi-fo-rich-editor .tiptap table .selectedCell:after{--tw-content:"";content:var(--tw-content)}.fi-fo-rich-editor .tiptap table .selectedCell:where(.dark,.dark *):after{background-color:var(--gray-800)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap table .selectedCell:where(.dark,.dark *):after{background-color:color-mix(in oklab,var(--gray-800)80%,transparent)}}.fi-fo-rich-editor .tiptap table .column-resize-handle{pointer-events:none;inset-inline-end:calc(var(--spacing)*0);top:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);width:calc(var(--spacing)*1);background-color:var(--primary-600);position:absolute;margin:calc(var(--spacing)*0)!important}.fi-fo-rich-editor .tiptap .tableWrapper{overflow-x:auto}.fi-fo-rich-editor .tiptap.resize-cursor{cursor:col-resize;cursor:ew-resize}.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{border-color:color-mix(in oklab,var(--gray-950)20%,transparent)}}.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{padding:calc(var(--spacing)*4)}.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-rich-editor .tiptap [data-resize-handle]{z-index:10;background:#00000080;border:1px solid #fffc;border-radius:2px;position:absolute}.fi-fo-rich-editor .tiptap [data-resize-handle]:hover{background:#000c}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle]{margin:0!important}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-left],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-right],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-left],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-right]{width:8px;height:8px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-left]{cursor:nwse-resize;top:-4px;left:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-right]{cursor:nesw-resize;top:-4px;right:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-left]{cursor:nesw-resize;bottom:-4px;left:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-right]{cursor:nwse-resize;bottom:-4px;right:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom]{height:6px;left:8px;right:8px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top]{cursor:ns-resize;top:-3px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom]{cursor:ns-resize;bottom:-3px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=left],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=right]{width:6px;top:8px;bottom:8px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=left]{cursor:ew-resize;left:-3px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=right]{cursor:ew-resize;right:-3px}.fi-fo-rich-editor .tiptap [data-resize-state=true] [data-resize-wrapper]{border-radius:.125rem;outline:1px solid #00000040;position:relative}.fi-fo-rich-editor .tiptap [data-resize-container]{display:inline-block!important}@supports (-webkit-touch-callout:none){.fi-fo-rich-editor .tiptap.ProseMirror{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.fi-fo-rich-editor img{display:inline-block}.fi-fo-rich-editor div[data-type=customBlock]{display:grid}:where(.fi-fo-rich-editor div[data-type=customBlock]>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-fo-rich-editor div[data-type=customBlock]{border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow:hidden}:where(.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header{align-items:flex-start;gap:calc(var(--spacing)*3);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-heading:where(.dark,.dark *){color:var(--color-white)}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-edit-btn-ctn,.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-delete-btn-ctn{flex-shrink:0}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-preview{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3)}@supports (container-type:inline-size){.fi-fo-rich-editor{container-type:inline-size}@container (min-width:42rem){.fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:row}.fi-fo-rich-editor .fi-fo-rich-editor-panels{max-width:var(--container-3xs);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-end-end-radius:var(--radius-lg)}}}@supports not (container-type:inline-size){@media (min-width:48rem){.fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:row}.fi-fo-rich-editor .fi-fo-rich-editor-panels{max-width:var(--container-3xs);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-end-end-radius:var(--radius-lg)}}}:scope .fi-fo-rich-editor-text-color-select-option{align-items:center;gap:calc(var(--spacing)*2);display:flex}:scope .fi-fo-rich-editor-text-color-select-option .fi-fo-rich-editor-text-color-select-option-preview{height:calc(var(--spacing)*5);width:calc(var(--spacing)*5);background-color:var(--color);border-radius:3.40282e38px;flex-shrink:0}:scope .fi-fo-rich-editor-text-color-select-option .fi-fo-rich-editor-text-color-select-option-preview:where(.dark,.dark *){background-color:var(--dark-color)}[x-sortable]:has(.fi-sortable-ghost) .fi-fo-rich-editor{pointer-events:none}.fi-fo-select .fi-hidden{display:none}@media (min-width:40rem){.fi-fo-select-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-slider{gap:calc(var(--spacing)*4);border-radius:var(--radius-lg);border-style:var(--tw-border-style);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);background-color:#0000;border-width:0}.fi-fo-slider:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-slider .noUi-connect{background-color:var(--primary-500)}.fi-fo-slider .noUi-connect:where(.dark,.dark *){background-color:var(--primary-600)}.fi-fo-slider .noUi-connects{border-radius:var(--radius-lg);background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-connects{background-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-fo-slider .noUi-connects:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-connects:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-slider .noUi-handle{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950);position:absolute}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-handle{border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.fi-fo-slider .noUi-handle{background-color:var(--color-white);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);backface-visibility:hidden}.fi-fo-slider .noUi-handle:focus{outline-style:var(--tw-outline-style);outline-width:2px;outline-color:var(--primary-600)}.fi-fo-slider .noUi-handle:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-handle:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-slider .noUi-handle:where(.dark,.dark *){background-color:var(--gray-700)}.fi-fo-slider .noUi-handle:where(.dark,.dark *):focus{outline-color:var(--primary-500)}.fi-fo-slider .noUi-handle:before,.fi-fo-slider .noUi-handle:after{border-style:var(--tw-border-style);background-color:var(--gray-400);border-width:0}.fi-fo-slider .noUi-tooltip{border-radius:var(--radius-md);border-style:var(--tw-border-style);background-color:var(--color-white);color:var(--gray-950);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-width:0}.fi-fo-slider .noUi-tooltip:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white);--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-tooltip:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-slider .noUi-pips .noUi-value{color:var(--gray-950)}.fi-fo-slider .noUi-pips .noUi-value:where(.dark,.dark *){color:var(--color-white)}.fi-fo-slider.fi-fo-slider-vertical{margin-top:calc(var(--spacing)*4);height:calc(var(--spacing)*40)}.fi-fo-slider.fi-fo-slider-vertical.fi-fo-slider-has-tooltips{margin-inline-start:calc(var(--spacing)*10)}.fi-fo-slider:not(.fi-fo-slider-vertical).fi-fo-slider-has-pips{margin-bottom:calc(var(--spacing)*8)}.fi-fo-slider:not(.fi-fo-slider-vertical).fi-fo-slider-has-tooltips{margin-top:calc(var(--spacing)*10)}.fi-fo-slider:not(.fi-fo-slider-vertical) .noUi-pips .noUi-value{margin-top:calc(var(--spacing)*1)}.fi-fo-tags-input.fi-disabled .fi-badge-delete-btn{display:none}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn{gap:calc(var(--spacing)*1.5);border-top-style:var(--tw-border-style);border-top-width:1px;border-top-color:var(--gray-200);width:100%;padding:calc(var(--spacing)*2);flex-wrap:wrap;display:flex}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn:where(.dark,.dark *){border-top-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-tags-input .fi-fo-tags-input-tags-ctn:where(.dark,.dark *){border-top-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn>template{display:none}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn>.fi-badge.fi-reorderable{cursor:move}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn>.fi-badge .fi-badge-label-ctn{text-align:start;-webkit-user-select:none;user-select:none}@media (min-width:40rem){.fi-fo-tags-input-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-text-input{overflow:hidden}.fi-fo-text-input input.fi-revealable::-ms-reveal{display:none}.fi-fo-textarea{overflow:hidden}.fi-fo-textarea textarea{--tw-border-style:none;width:100%;height:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);background-color:#0000;border-style:none;display:block}.fi-fo-textarea textarea::placeholder{color:var(--gray-400)}.fi-fo-textarea textarea:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.fi-fo-textarea textarea:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.fi-fo-textarea textarea:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}.fi-fo-textarea textarea:where(.dark,.dark *){color:var(--color-white)}.fi-fo-textarea textarea:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.fi-fo-textarea textarea:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.fi-fo-textarea textarea:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}@supports (-webkit-touch-callout:none){.fi-fo-textarea textarea{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.fi-fo-textarea.fi-autosizable textarea{resize:none}@media (min-width:40rem){.fi-fo-textarea-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-toggle-buttons.fi-btn-group{width:max-content}.fi-fo-toggle-buttons:not(.fi-btn-group){gap:calc(var(--spacing)*3)}.fi-fo-toggle-buttons:not(.fi-btn-group).fi-inline{flex-wrap:wrap;display:flex}.fi-fo-toggle-buttons:not(.fi-btn-group):not(.fi-inline).fi-grid-direction-col{margin-top:calc(var(--spacing)*-3)}.fi-fo-toggle-buttons:not(.fi-btn-group):not(.fi-inline).fi-grid-direction-col .fi-fo-toggle-buttons-btn-ctn{break-inside:avoid;padding-top:calc(var(--spacing)*3)}.fi-fo-toggle-buttons .fi-fo-toggle-buttons-input{pointer-events:none;opacity:0;position:absolute}@media (min-width:40rem){.fi-fo-toggle-buttons-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-in-code .phiki{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow-x:auto}.fi-in-code .phiki:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-in-code .phiki:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-in-code:where(.dark,.dark *) .phiki,.fi-in-code:where(.dark,.dark *) .phiki span{color:var(--phiki-dark-color)!important;background-color:var(--phiki-dark-background-color)!important;font-style:var(--phiki-dark-font-style)!important;font-weight:var(--phiki-dark-font-weight)!important;-webkit-text-decoration:var(--phiki-dark-text-decoration)!important;-webkit-text-decoration:var(--phiki-dark-text-decoration)!important;text-decoration:var(--phiki-dark-text-decoration)!important}.fi-in-code.fi-copyable{cursor:pointer}.fi-in-color{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-in-color.fi-wrapped{flex-wrap:wrap}.fi-in-color.fi-align-start,.fi-in-color.fi-align-left{justify-content:flex-start}.fi-in-color.fi-align-center{justify-content:center}.fi-in-color.fi-align-end,.fi-in-color.fi-align-right{justify-content:flex-end}.fi-in-color.fi-align-justify,.fi-in-color.fi-align-between{justify-content:space-between}.fi-in-color>.fi-in-color-item{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6);border-radius:var(--radius-md)}.fi-in-color>.fi-in-color-item.fi-copyable{cursor:pointer}.fi-in-entry{row-gap:calc(var(--spacing)*2);display:grid}@media (min-width:40rem){.fi-in-entry.fi-in-entry-has-inline-label{align-items:flex-start;column-gap:calc(var(--spacing)*4);grid-template-columns:repeat(3,minmax(0,1fr))}.fi-in-entry.fi-in-entry-has-inline-label .fi-in-entry-content-col{grid-column:span 2/span 2}}.fi-in-entry .fi-in-entry-label-ctn{align-items:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.fi-in-entry .fi-in-entry-label-ctn>.fi-sc:first-child{flex-grow:0}.fi-in-entry .fi-in-entry-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-in-entry .fi-in-entry-label:where(.dark,.dark *){color:var(--color-white)}.fi-in-entry .fi-in-entry-label.fi-hidden{display:none}.fi-in-entry .fi-in-entry-label-col,.fi-in-entry .fi-in-entry-content-col{row-gap:calc(var(--spacing)*2);grid-auto-columns:minmax(0,1fr);display:grid}.fi-in-entry .fi-in-entry-content-ctn{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;display:flex}.fi-in-entry .fi-in-entry-content{text-align:start;width:100%;display:block}.fi-in-entry .fi-in-entry-content.fi-align-center{text-align:center}.fi-in-entry .fi-in-entry-content.fi-align-end{text-align:end}.fi-in-entry .fi-in-entry-content.fi-align-left{text-align:left}.fi-in-entry .fi-in-entry-content.fi-align-right{text-align:right}.fi-in-entry .fi-in-entry-content.fi-align-justify,.fi-in-entry .fi-in-entry-content.fi-align-between{text-align:justify}.fi-in-entry .fi-in-placeholder{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-400)}.fi-in-entry .fi-in-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-in-key-value{table-layout:auto;width:100%}:where(.fi-in-key-value>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-in-key-value{border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}:where(.fi-in-key-value:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-key-value:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-key-value:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-key-value:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-key-value:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-in-key-value:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-key-value th{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-in-key-value th:where(.dark,.dark *){color:var(--gray-200)}:where(.fi-in-key-value tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-in-key-value tbody{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media (min-width:40rem){.fi-in-key-value tbody{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}}:where(.fi-in-key-value tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-key-value tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:where(.fi-in-key-value tr>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));border-color:var(--gray-200)}:where(.fi-in-key-value tr:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-divide-x-reverse:1}:where(.fi-in-key-value tr:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-key-value tr:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-key-value td{width:50%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);overflow-wrap:anywhere}.fi-in-key-value td.fi-in-placeholder{width:100%;padding-block:calc(var(--spacing)*2);text-align:center;font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-in-icon{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-in-icon.fi-wrapped{flex-wrap:wrap}.fi-in-icon.fi-in-icon-has-line-breaks{flex-direction:column}.fi-in-icon.fi-align-start,.fi-in-icon.fi-align-left{justify-content:flex-start}.fi-in-icon.fi-align-center{justify-content:center}.fi-in-icon.fi-align-end,.fi-in-icon.fi-align-right{justify-content:flex-end}.fi-in-icon.fi-align-justify,.fi-in-icon.fi-align-between{justify-content:space-between}.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon{color:var(--gray-400)}:is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon).fi-color{color:var(--text)}:is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon).fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-in-image{align-items:center;gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-in-image img{object-fit:cover;object-position:center;max-width:none}.fi-in-image.fi-circular img{border-radius:3.40282e38px}.fi-in-image.fi-in-image-ring img,.fi-in-image.fi-in-image-ring .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-white)}:is(.fi-in-image.fi-in-image-ring img,.fi-in-image.fi-in-image-ring .fi-in-image-limited-remaining-text):where(.dark,.dark *){--tw-ring-color:var(--gray-900)}.fi-in-image.fi-in-image-ring.fi-in-image-ring-1 img,.fi-in-image.fi-in-image-ring.fi-in-image-ring-1 .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-in-image.fi-in-image-ring.fi-in-image-ring-2 img,.fi-in-image.fi-in-image-ring.fi-in-image-ring-2 .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-in-image.fi-in-image-ring.fi-in-image-ring-4 img,.fi-in-image.fi-in-image-ring.fi-in-image-ring-4 .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-in-image.fi-in-image-overlap-1{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-2{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-3{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-3)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-4{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-4)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-5{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-5)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-6{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-6)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-7{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-7>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-7)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-7)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-8{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-8)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-wrapped{flex-wrap:wrap}.fi-in-image.fi-align-start,.fi-in-image.fi-align-left{justify-content:flex-start}.fi-in-image.fi-align-center{justify-content:center}.fi-in-image.fi-align-end,.fi-in-image.fi-align-right{justify-content:flex-end}.fi-in-image.fi-align-justify,.fi-in-image.fi-align-between{justify-content:space-between}.fi-in-image.fi-stacked .fi-in-image-limited-remaining-text{background-color:var(--gray-100);border-radius:3.40282e38px}.fi-in-image.fi-stacked .fi-in-image-limited-remaining-text:where(.dark,.dark *){background-color:var(--gray-800)}.fi-in-image .fi-in-image-limited-remaining-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);justify-content:center;align-items:center;display:flex}.fi-in-image .fi-in-image-limited-remaining-text:where(.dark,.dark *){color:var(--gray-400)}.fi-in-image .fi-in-image-limited-remaining-text.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-in-image .fi-in-image-limited-remaining-text.fi-size-base,.fi-in-image .fi-in-image-limited-remaining-text.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-in-image .fi-in-image-limited-remaining-text.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}ul.fi-in-repeatable{gap:calc(var(--spacing)*4)}.fi-in-repeatable .fi-in-repeatable-item{display:block}.fi-in-repeatable.fi-contained .fi-in-repeatable-item{border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-table-repeatable{gap:calc(var(--spacing)*3);display:grid}.fi-in-table-repeatable>table{width:100%;display:block}:where(.fi-in-table-repeatable>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-in-table-repeatable>table{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}:where(.fi-in-table-repeatable>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-table-repeatable>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-table-repeatable>table:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-in-table-repeatable>table:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-table-repeatable>table>thead{white-space:nowrap;display:none}.fi-in-table-repeatable>table>thead>tr>th{border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-in-table-repeatable>table>thead>tr>th:first-of-type{border-top-left-radius:var(--radius-xl)}.fi-in-table-repeatable>table>thead>tr>th:last-of-type{border-top-right-radius:var(--radius-xl)}.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){color:var(--color-white)}.fi-in-table-repeatable>table>thead>tr>th:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-in-table-repeatable>table>thead>tr>th:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-in-table-repeatable>table>thead>tr>th.fi-align-center{text-align:center}.fi-in-table-repeatable>table>thead>tr>th.fi-align-end,.fi-in-table-repeatable>table>thead>tr>th.fi-align-right{text-align:end}.fi-in-table-repeatable>table>thead>tr>th.fi-wrapped{white-space:normal}.fi-in-table-repeatable>table>thead>tr>th:not(.fi-wrapped){white-space:nowrap}.fi-in-table-repeatable>table>thead>tr>th.fi-in-table-repeatable-empty-header-cell{width:calc(var(--spacing)*1)}.fi-in-table-repeatable>table>tbody{display:block}:where(.fi-in-table-repeatable>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-in-table-repeatable>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-table-repeatable>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-table-repeatable>table>tbody>tr{gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6);display:grid}.fi-in-table-repeatable>table>tbody>tr>td{display:block}.fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:none}@supports (container-type:inline-size){.fi-in-table-repeatable{container-type:inline-size}@container (min-width:36rem){.fi-in-table-repeatable>table{display:table}.fi-in-table-repeatable>table>thead{display:table-header-group}.fi-in-table-repeatable>table>tbody{display:table-row-group}.fi-in-table-repeatable>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-in-table-repeatable>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry-label{display:none}.fi-in-table-repeatable>table .fi-in-table-repeatable-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}}}@supports not (container-type:inline-size){@media (min-width:64rem){.fi-in-table-repeatable>table{display:table}.fi-in-table-repeatable>table>thead{display:table-header-group}.fi-in-table-repeatable>table>tbody{display:table-row-group}.fi-in-table-repeatable>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-in-table-repeatable>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry-label{display:none}}}.fi-in-text{width:100%}.fi-in-text.fi-in-text-affixed{gap:calc(var(--spacing)*3);display:flex}.fi-in-text .fi-in-text-affixed-content{min-width:calc(var(--spacing)*0);flex:1}.fi-in-text .fi-in-text-affix{align-items:center;gap:calc(var(--spacing)*3);align-self:stretch;display:flex}.fi-in-text.fi-in-text-list-limited{flex-direction:column;display:flex}.fi-in-text.fi-in-text-list-limited.fi-in-text-has-badges{row-gap:calc(var(--spacing)*2)}.fi-in-text.fi-in-text-list-limited:not(.fi-in-text-has-badges){row-gap:calc(var(--spacing)*1)}ul.fi-in-text.fi-bulleted,.fi-in-text.fi-bulleted ul{list-style-type:disc;list-style-position:inside}ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul{column-gap:calc(var(--spacing)*1.5);display:flex}:is(ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul).fi-wrapped,:is(ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul).fi-in-text-has-line-breaks,:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):is(.fi-in-text-has-line-breaks ul){row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul){column-gap:calc(var(--spacing)*1.5);display:flex}:is(:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul)).fi-wrapped,:is(:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul)):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}.fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks){white-space:normal;overflow-wrap:break-word}.fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks) .fi-badge,.fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks) .fi-in-text-list-limited-message{white-space:nowrap}.fi-in-text>.fi-in-text-list-limited-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-in-text>.fi-in-text-list-limited-message:where(.dark,.dark *){color:var(--gray-400)}.fi-in-text.fi-align-center{text-align:center}ul.fi-in-text.fi-align-center,.fi-in-text.fi-align-center ul{justify-content:center}.fi-in-text.fi-align-end,.fi-in-text.fi-align-right{text-align:end}ul:is(.fi-in-text.fi-align-end,.fi-in-text.fi-align-right),:is(.fi-in-text.fi-align-end,.fi-in-text.fi-align-right) ul{justify-content:flex-end}.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between{text-align:justify}ul:is(.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between),:is(.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between) ul{justify-content:space-between}.fi-in-text-item{color:var(--gray-950)}.fi-in-text-item:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.fi-in-text-item a:hover{text-decoration-line:underline}}.fi-in-text-item a:focus-visible{text-decoration-line:underline}.fi-in-text-item:not(.fi-bulleted li.fi-in-text-item){-webkit-line-clamp:var(--line-clamp,none);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.fi-in-text-item>.fi-copyable{cursor:pointer}.fi-in-text-item.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-in-text-item.fi-size-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-in-text-item.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-in-text-item.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-in-text-item.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-in-text-item.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-in-text-item.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-in-text-item.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-in-text-item.fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-in-text-item.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-in-text-item.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-in-text-item.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-in-text-item.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-in-text-item.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-in-text-item.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.fi-in-text-item.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-in-text-item.fi-color{color:var(--text)}.fi-in-text-item.fi-color:where(.dark,.dark *){color:var(--dark-text)}li.fi-in-text-item.fi-color::marker{color:var(--gray-950)}li.fi-in-text-item.fi-color:where(.dark,.dark *)::marker{color:var(--color-white)}.fi-in-text-item.fi-color-gray{color:var(--gray-500)}.fi-in-text-item.fi-color-gray:where(.dark,.dark *){color:var(--gray-400)}li.fi-in-text-item.fi-color-gray::marker{color:var(--gray-950)}.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon{color:var(--gray-400);flex-shrink:0;display:inline-block}:is(.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon).fi-color{color:var(--color-500)}.fi-no-database{display:flex}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-heading{display:inline-block;position:relative}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-heading .fi-badge{inset-inline-start:100%;top:calc(var(--spacing)*-1);width:max-content;margin-inline-start:calc(var(--spacing)*1);position:absolute}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-header .fi-ac{margin-top:calc(var(--spacing)*2)}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content{margin-inline:calc(var(--spacing)*-6);margin-top:calc(var(--spacing)*-6);row-gap:calc(var(--spacing)*0)}:where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-no-database .fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-footer) .fi-modal-content{margin-bottom:calc(var(--spacing)*-6)}.fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200)}.fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-no-database .fi-no-notification-unread-ctn{position:relative}.fi-no-database .fi-no-notification-unread-ctn:before{content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);height:100%;width:calc(var(--spacing)*.5);content:var(--tw-content);background-color:var(--primary-600);position:absolute;inset-inline-start:calc(var(--spacing)*0)}.fi-no-database .fi-no-notification-unread-ctn:where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--primary-500)}.fi-no-notification{pointer-events:auto;visibility:hidden;gap:calc(var(--spacing)*3);width:100%;padding:calc(var(--spacing)*4);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;flex-shrink:0;transition-duration:.3s;display:flex;overflow:hidden}.fi-no-notification .fi-no-notification-icon{color:var(--gray-400)}.fi-no-notification .fi-no-notification-icon.fi-color{color:var(--color-400)}.fi-no-notification .fi-no-notification-main{margin-top:calc(var(--spacing)*.5);gap:calc(var(--spacing)*3);flex:1;display:grid}.fi-no-notification .fi-no-notification-text{gap:calc(var(--spacing)*1);display:grid}.fi-no-notification .fi-no-notification-title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-no-notification .fi-no-notification-title:where(.dark,.dark *){color:var(--color-white)}.fi-no-notification .fi-no-notification-date{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-no-notification .fi-no-notification-date:where(.dark,.dark *){color:var(--gray-400)}.fi-no-notification .fi-no-notification-body{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-wrap:pretty;overflow-wrap:break-word;color:var(--gray-500);overflow:hidden}.fi-no-notification .fi-no-notification-body:where(.dark,.dark *){color:var(--gray-400)}.fi-no-notification .fi-no-notification-body>p:not(:first-of-type){margin-top:calc(var(--spacing)*1)}.fi-no-notification:not(.fi-inline){max-width:var(--container-sm);gap:calc(var(--spacing)*3);border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex}.fi-no-notification:not(.fi-inline):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-no-notification:not(.fi-inline):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-no-notification:not(.fi-inline).fi-color{--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification:not(.fi-inline).fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)20%,transparent)}}.fi-no-notification:not(.fi-inline).fi-color:where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification:not(.fi-inline).fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.fi-no-notification:not(.fi-inline).fi-transition-leave-end{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.fi-no-notification.fi-color{background-color:#fff}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color{background-color:color-mix(in oklab,white 90%,var(--color-400))}}.fi-no-notification.fi-color:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)90%,var(--color-400))}}.fi-no-notification.fi-color .fi-no-notification-body{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color .fi-no-notification-body{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}.fi-no-notification.fi-color .fi-no-notification-body:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color .fi-no-notification-body:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)75%,transparent)}}.fi-no-notification.fi-transition-enter-start,.fi-no-notification.fi-transition-leave-end{opacity:0}:is(.fi-no.fi-align-start,.fi-no.fi-align-left) .fi-no-notification.fi-transition-enter-start{--tw-translate-x:calc(var(--spacing)*-12);translate:var(--tw-translate-x)var(--tw-translate-y)}:is(.fi-no.fi-align-end,.fi-no.fi-align-right) .fi-no-notification.fi-transition-enter-start{--tw-translate-x:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-no.fi-align-center.fi-vertical-align-start .fi-no-notification.fi-transition-enter-start{--tw-translate-y:calc(var(--spacing)*-12);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-no.fi-align-center.fi-vertical-align-end .fi-no-notification.fi-transition-enter-start{--tw-translate-y:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-no{pointer-events:none;inset:calc(var(--spacing)*4);z-index:50;gap:calc(var(--spacing)*3);margin-inline:auto;display:flex;position:fixed}.fi-no.fi-align-start,.fi-no.fi-align-left{align-items:flex-start}.fi-no.fi-align-center{align-items:center}.fi-no.fi-align-end,.fi-no.fi-align-right{align-items:flex-end}.fi-no.fi-vertical-align-start{flex-direction:column-reverse;justify-content:flex-end}.fi-no.fi-vertical-align-center{flex-direction:column;justify-content:center}.fi-no.fi-vertical-align-end{flex-direction:column;justify-content:flex-end}.fi-sc-actions{gap:calc(var(--spacing)*2);flex-direction:column;height:100%;display:flex}.fi-sc-actions .fi-sc-actions-label-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-sc-actions .fi-sc-actions-label-ctn .fi-sc-actions-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-sc-actions .fi-sc-actions-label-ctn .fi-sc-actions-label:where(.dark,.dark *){color:var(--color-white)}.fi-sc-actions.fi-sticky .fi-ac{bottom:calc(var(--spacing)*0);margin-inline:calc(var(--spacing)*-4);width:100%;transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:fixed}@media (min-width:48rem){.fi-sc-actions.fi-sticky .fi-ac{bottom:calc(var(--spacing)*4);border-radius:var(--radius-xl)}}.fi-sc-actions.fi-sticky .fi-ac:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-actions.fi-sticky .fi-ac:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-actions.fi-vertical-align-start{justify-content:flex-start}.fi-sc-actions.fi-vertical-align-center{justify-content:center}.fi-sc-actions.fi-vertical-align-end{justify-content:flex-end}.fi-sc-flex{gap:calc(var(--spacing)*6);display:flex}.fi-sc-flex.fi-align-start,.fi-sc-flex.fi-align-left{justify-content:flex-start}.fi-sc-flex.fi-align-center{justify-content:center}.fi-sc-flex.fi-align-end,.fi-sc-flex.fi-align-right{justify-content:flex-end}.fi-sc-flex.fi-align-between,.fi-sc-flex.fi-align-justify{justify-content:space-between}.fi-sc-flex.fi-dense{gap:calc(var(--spacing)*3)}.fi-sc-flex>.fi-hidden{display:none}.fi-sc-flex>.fi-growable{flex:1;width:100%}.fi-sc-flex.fi-from-default{align-items:flex-start}.fi-sc-flex.fi-from-default.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-default.fi-vertical-align-end{align-items:flex-end}.fi-sc-flex.fi-from-sm{flex-direction:column}@media (min-width:40rem){.fi-sc-flex.fi-from-sm{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-sm.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-sm.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-md{flex-direction:column}@media (min-width:48rem){.fi-sc-flex.fi-from-md{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-md.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-md.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-lg{flex-direction:column}@media (min-width:64rem){.fi-sc-flex.fi-from-lg{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-lg.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-lg.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-xl{flex-direction:column}@media (min-width:80rem){.fi-sc-flex.fi-from-xl{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-xl.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-xl.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-2xl{flex-direction:column}@media (min-width:96rem){.fi-sc-flex.fi-from-2xl{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-2xl.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-2xl.fi-vertical-align-end{align-items:flex-end}}.fi-sc-form{gap:calc(var(--spacing)*6);flex-direction:column;display:flex}.fi-sc-form.fi-dense{gap:calc(var(--spacing)*3)}.fi-sc-fused-group>.fi-sc{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}.fi-sc-fused-group>.fi-sc:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.fi-sc-fused-group>.fi-sc:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-sc-fused-group>.fi-sc:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-sc-fused-group>.fi-sc:where(.dark,.dark *):focus-within{--tw-ring-color:var(--primary-500)}:where(.fi-sc-fused-group .fi-sc>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){:where(.fi-sc-fused-group .fi-sc>:not(:last-child)){border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.fi-sc-fused-group .fi-sc{border-radius:var(--radius-lg)}:where(.fi-sc-fused-group .fi-sc:where(.dark,.dark *)>:not(:last-child)){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){:where(.fi-sc-fused-group .fi-sc:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-sc-fused-group .fi-sc .fi-sc-component,.fi-sc-fused-group .fi-sc .fi-sc-component .fi-fo-field,.fi-sc-fused-group .fi-sc .fi-sc-component .fi-input{min-height:100%}.fi-sc-fused-group .fi-sc .fi-sc-component .fi-sc-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-sc-fused-group .fi-sc>:first-child .fi-input-wrp{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc>:last-child .fi-input-wrp{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}:where(.fi-sc-fused-group .fi-sc.fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}@media (min-width:40rem){:where(.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:48rem){:where(.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:64rem){:where(.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:80rem){:where(.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:96rem){:where(.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@supports (container-type:inline-size){@container (min-width:16rem){:where(.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:18rem){:where(.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:20rem){:where(.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:24rem){:where(.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:28rem){:where(.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:32rem){:where(.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:36rem){:where(.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:42rem){:where(.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:48rem){:where(.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:56rem){:where(.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:64rem){:where(.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:72rem){:where(.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:80rem){:where(.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}}@supports not (container-type:inline-size){@media (min-width:40rem){:where(.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:48rem){:where(.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:64rem){:where(.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:80rem){:where(.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:96rem){:where(.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}}.fi-sc-fused-group .fi-input-wrp{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:0}.fi-sc-fused-group .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):focus-within,.fi-sc-fused-group .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-sc-icon{color:var(--gray-400)}.fi-sc-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sc-icon.fi-color{color:var(--color-500)}.fi-sc-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.fi-sc-image{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300)}.fi-sc-image:where(.dark,.dark *){border-color:#0000}.fi-sc-image.fi-align-center{margin-inline:auto}.fi-sc-image.fi-align-end,.fi-sc-image.fi-align-right{margin-inline-start:auto}.fi-sc-section{gap:calc(var(--spacing)*2);flex-direction:column;display:flex}.fi-sc-section .fi-sc-section-label-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-sc-section .fi-sc-section-label-ctn .fi-sc-section-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-sc-section .fi-sc-section-label-ctn .fi-sc-section-label:where(.dark,.dark *){color:var(--color-white)}.fi-sc-tabs{flex-direction:column;display:flex}.fi-sc-tabs .fi-tabs.fi-invisible{visibility:hidden}.fi-sc-tabs .fi-sc-tabs-tab{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.fi-sc-tabs .fi-sc-tabs-tab{outline-offset:2px;outline:2px solid #0000}}.fi-sc-tabs .fi-sc-tabs-tab.fi-active{margin-top:calc(var(--spacing)*6)}.fi-sc-tabs .fi-sc-tabs-tab:not(.fi-active){visibility:hidden;height:calc(var(--spacing)*0);padding:calc(var(--spacing)*0);position:absolute;overflow:hidden}.fi-sc-tabs.fi-contained{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-sc-tabs.fi-contained:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-tabs.fi-contained:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-tabs.fi-contained .fi-sc-tabs-tab.fi-active{margin-top:calc(var(--spacing)*0);padding:calc(var(--spacing)*6)}.fi-sc-tabs.fi-vertical{flex-direction:row}.fi-sc-tabs.fi-vertical .fi-sc-tabs-tab.fi-active{margin-inline-start:calc(var(--spacing)*6);margin-top:calc(var(--spacing)*0);flex:1}.fi-sc-text.fi-copyable{cursor:pointer}.fi-sc-text.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-sc-text.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.fi-sc-text.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-sc-text:not(.fi-badge){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word;color:var(--gray-600);display:inline-block}.fi-sc-text:not(.fi-badge):where(.dark,.dark *){color:var(--gray-400)}.fi-sc-text:not(.fi-badge).fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-sc-text:not(.fi-badge).fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-sc-text:not(.fi-badge).fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-sc-text:not(.fi-badge).fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-sc-text:not(.fi-badge).fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-sc-text:not(.fi-badge).fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-sc-text:not(.fi-badge).fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-sc-text:not(.fi-badge).fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-sc-text:not(.fi-badge).fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-sc-text:not(.fi-badge).fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-sc-text:not(.fi-badge).fi-color-neutral{color:var(--gray-950)}.fi-sc-text:not(.fi-badge).fi-color-neutral:where(.dark,.dark *){color:var(--color-white)}.fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral){color:var(--text)}.fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral):where(.dark,.dark *){color:var(--dark-text)}.fi-sc-text:not(.fi-badge).fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-sc-text:not(.fi-badge).fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-sc-unordered-list{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-inline-start:calc(var(--spacing)*3);list-style-type:disc}.fi-sc-unordered-list.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-sc-unordered-list.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-sc-unordered-list.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-sc-wizard{flex-direction:column;display:flex}.fi-sc-wizard .fi-sc-wizard-header{display:grid}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header{grid-auto-flow:column;overflow-x:auto}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step{display:flex;position:relative}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active){display:none}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active){display:flex}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn{align-items:center;column-gap:calc(var(--spacing)*4);height:100%;padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*4);text-align:start;display:flex}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10);border-radius:3.40282e38px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text{justify-items:start;display:grid}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text{width:max-content;max-width:calc(var(--spacing)*60)}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-description{text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-description:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator{height:100%;width:calc(var(--spacing)*5);color:var(--gray-200);display:none;position:absolute;inset-inline-end:calc(var(--spacing)*0)}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator{display:block}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(.dark,.dark *){color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{background-color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){background-color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--color-white)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--gray-950)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--color-white)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-style:var(--tw-border-style);border-width:2px}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed).fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed).fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon:where(.dark,.dark *){color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed):not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed):not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){border-color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number:where(.dark,.dark *){color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--primary-700)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--primary-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-color:var(--gray-300)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){border-color:var(--gray-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-step{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.fi-sc-wizard .fi-sc-wizard-step{outline-offset:2px;outline:2px solid #0000}}.fi-sc-wizard .fi-sc-wizard-step:not(.fi-active){visibility:hidden;height:calc(var(--spacing)*0);padding:calc(var(--spacing)*0);position:absolute;overflow:hidden}.fi-sc-wizard:not(.fi-sc-wizard-header-hidden) .fi-sc-wizard-step.fi-active{margin-top:calc(var(--spacing)*6)}.fi-sc-wizard .fi-sc-wizard-footer{justify-content:space-between;align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-sc-wizard .fi-sc-wizard-footer>.fi-hidden{display:none}.fi-sc-wizard .fi-sc-wizard-footer>.fi-disabled{pointer-events:none;opacity:.7}.fi-sc-wizard.fi-contained{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-sc-wizard.fi-contained:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard.fi-contained:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-wizard.fi-contained .fi-sc-wizard-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200)}.fi-sc-wizard.fi-contained .fi-sc-wizard-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard.fi-contained .fi-sc-wizard-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-wizard.fi-contained .fi-sc-wizard-step.fi-active{margin-top:calc(var(--spacing)*0);padding:calc(var(--spacing)*6)}.fi-sc-wizard.fi-contained .fi-sc-wizard-footer{padding-inline:calc(var(--spacing)*6);padding-bottom:calc(var(--spacing)*6)}.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-footer{margin-top:calc(var(--spacing)*6)}.fi-sc{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-sc.fi-inline{flex-wrap:wrap;flex-grow:1;align-items:center;display:flex}.fi-sc.fi-inline>.fi-sc-action:not(.fi-hidden){display:contents}.fi-sc.fi-sc-has-gap{gap:calc(var(--spacing)*6)}.fi-sc.fi-sc-has-gap.fi-sc-dense{gap:calc(var(--spacing)*3)}.fi-sc.fi-align-start,.fi-sc.fi-align-left{justify-content:flex-start}.fi-sc.fi-align-center{justify-content:center}.fi-sc.fi-align-end,.fi-sc.fi-align-right{justify-content:flex-end}.fi-sc.fi-align-between,.fi-sc.fi-align-justify{justify-content:space-between}.fi-sc>.fi-hidden{display:none}.fi-sc>.fi-grid-col.fi-width-xs{max-width:var(--container-xs)}.fi-sc>.fi-grid-col.fi-width-sm{max-width:var(--container-sm)}.fi-sc>.fi-grid-col.fi-width-md{max-width:var(--container-md)}.fi-sc>.fi-grid-col.fi-width-lg{max-width:var(--container-lg)}.fi-sc>.fi-grid-col.fi-width-xl{max-width:var(--container-xl)}.fi-sc>.fi-grid-col.fi-width-2xl{max-width:var(--container-2xl)}.fi-sc>.fi-grid-col.fi-width-3xl{max-width:var(--container-3xl)}.fi-sc>.fi-grid-col.fi-width-4xl{max-width:var(--container-4xl)}.fi-sc>.fi-grid-col.fi-width-5xl{max-width:var(--container-5xl)}.fi-sc>.fi-grid-col.fi-width-6xl{max-width:var(--container-6xl)}.fi-sc>.fi-grid-col.fi-width-7xl{max-width:var(--container-7xl)}.fi-sc>.fi-grid-col>.fi-sc-component{height:100%}.fi-ta-actions{justify-content:flex-end;align-items:center;gap:calc(var(--spacing)*3);flex-shrink:0;max-width:100%;display:flex}.fi-ta-actions>*{flex-shrink:0}.fi-ta-actions.fi-wrapped{flex-wrap:wrap}@media (min-width:40rem){.fi-ta-actions.sm\:fi-not-wrapped{flex-wrap:nowrap}}.fi-ta-actions.fi-align-center{justify-content:center}.fi-ta-actions.fi-align-start{justify-content:flex-start}.fi-ta-actions.fi-align-between{justify-content:space-between}@media (min-width:48rem){.fi-ta-actions.md\:fi-align-end{justify-content:flex-end}}.fi-ta-cell{padding:calc(var(--spacing)*0)}.fi-ta-cell:first-of-type{padding-inline-start:calc(var(--spacing)*1)}.fi-ta-cell:last-of-type{padding-inline-end:calc(var(--spacing)*1)}@media (min-width:40rem){.fi-ta-cell:first-of-type{padding-inline-start:calc(var(--spacing)*3)}.fi-ta-cell:last-of-type{padding-inline-end:calc(var(--spacing)*3)}}.fi-ta-cell.fi-vertical-align-start{vertical-align:top}.fi-ta-cell.fi-vertical-align-end{vertical-align:bottom}@media (min-width:40rem){.fi-ta-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-cell.\32 xl\:fi-hidden{display:none}}.fi-ta-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-cell.sm\:fi-visible{display:table-cell}}.fi-ta-cell.md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-cell.md\:fi-visible{display:table-cell}}.fi-ta-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-cell.lg\:fi-visible{display:table-cell}}.fi-ta-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-cell.xl\:fi-visible{display:table-cell}}.fi-ta-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-cell.\32 xl\:fi-visible{display:table-cell}}.fi-ta-cell .fi-ta-col{text-align:start;justify-content:flex-start;width:100%;display:flex}.fi-ta-cell .fi-ta-col:disabled{pointer-events:none}.fi-ta-cell:has(.fi-ta-reorder-handle){width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3)}.fi-ta-cell:has(.fi-ta-reorder-handle):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-reorder-handle):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell:has(.fi-ta-reorder-handle):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell:has(.fi-ta-reorder-handle):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell:has(.fi-ta-actions){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);white-space:nowrap}.fi-ta-cell:has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell:has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell:has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell:has(.fi-ta-record-checkbox){width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-record-checkbox):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-record-checkbox):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell:has(.fi-ta-record-checkbox):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell:has(.fi-ta-record-checkbox):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell .fi-ta-placeholder{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-400)}.fi-ta-cell .fi-ta-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-cell.fi-ta-summary-row-heading-cell{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-cell.fi-ta-summary-row-heading-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell.fi-ta-summary-row-heading-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell.fi-ta-summary-row-heading-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-cell.fi-align-start{text-align:start}.fi-ta-cell.fi-align-center{text-align:center}.fi-ta-cell.fi-align-end{text-align:end}.fi-ta-cell.fi-align-left{text-align:left}.fi-ta-cell.fi-align-right{text-align:right}.fi-ta-cell.fi-align-justify,.fi-ta-cell.fi-align-between{text-align:justify}.fi-ta-cell.fi-ta-summary-header-cell{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-cell.fi-ta-summary-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}}.fi-ta-cell.fi-ta-summary-header-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-cell.fi-ta-summary-header-cell.fi-wrapped,.fi-ta-cell.fi-ta-summary-header-cell:not(.fi-wrapped){white-space:nowrap}.fi-ta-cell.fi-ta-individual-search-cell{min-width:calc(var(--spacing)*48);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-ta-cell .fi-ta-reorder-handle{cursor:move}.fi-ta-cell.fi-ta-selection-cell{width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-cell.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell.fi-ta-group-selection-cell{width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3)}.fi-ta-cell.fi-ta-group-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell.fi-ta-group-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell.fi-ta-group-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell.fi-ta-group-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-checkbox{width:100%}.fi-ta-checkbox:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-checkbox{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-checkbox{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-checkbox.fi-align-center{text-align:center}.fi-ta-checkbox.fi-align-end,.fi-ta-checkbox.fi-align-right{text-align:end}.fi-ta-color{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-ta-color.fi-wrapped{flex-wrap:wrap}.fi-ta-color:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-color{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-color{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-color.fi-align-start,.fi-ta-color.fi-align-left{justify-content:flex-start}.fi-ta-color.fi-align-center{justify-content:center}.fi-ta-color.fi-align-end,.fi-ta-color.fi-align-right{justify-content:flex-end}.fi-ta-color.fi-align-justify,.fi-ta-color.fi-align-between{justify-content:space-between}.fi-ta-color>.fi-ta-color-item{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6);border-radius:var(--radius-md)}.fi-ta-color>.fi-ta-color-item.fi-copyable{cursor:pointer}.fi-ta-icon{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-ta-icon.fi-wrapped{flex-wrap:wrap}.fi-ta-icon.fi-ta-icon-has-line-breaks{flex-direction:column}.fi-ta-icon:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-icon{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-icon{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-icon.fi-align-start,.fi-ta-icon.fi-align-left{justify-content:flex-start}.fi-ta-icon.fi-align-center{justify-content:center}.fi-ta-icon.fi-align-end,.fi-ta-icon.fi-align-right{justify-content:flex-end}.fi-ta-icon.fi-align-justify,.fi-ta-icon.fi-align-between{justify-content:space-between}.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon{color:var(--gray-400)}:is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon).fi-color{color:var(--text)}:is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon).fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-ta-image{align-items:center;gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-ta-image img{object-fit:cover;object-position:center;max-width:none}.fi-ta-image.fi-circular img{border-radius:3.40282e38px}.fi-ta-image.fi-ta-image-ring img,.fi-ta-image.fi-ta-image-ring .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-white)}:is(.fi-ta-image.fi-ta-image-ring img,.fi-ta-image.fi-ta-image-ring .fi-ta-image-limited-remaining-text):where(.dark,.dark *){--tw-ring-color:var(--gray-900)}.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-1 img,.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-1 .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-2 img,.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-2 .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-4 img,.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-4 .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-ta-image.fi-ta-image-overlap-1{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-2{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-3{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-3)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-4{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-4)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-5{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-5)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-6{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-6)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-7{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-7>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-7)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-7)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-8{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-8)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-wrapped{flex-wrap:wrap}.fi-ta-image:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-image{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-image{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-image.fi-align-start,.fi-ta-image.fi-align-left{justify-content:flex-start}.fi-ta-image.fi-align-center{justify-content:center}.fi-ta-image.fi-align-end,.fi-ta-image.fi-align-right{justify-content:flex-end}.fi-ta-image.fi-align-justify,.fi-ta-image.fi-align-between{justify-content:space-between}.fi-ta-image.fi-stacked .fi-ta-image-limited-remaining-text{background-color:var(--gray-100);border-radius:3.40282e38px}.fi-ta-image.fi-stacked .fi-ta-image-limited-remaining-text:where(.dark,.dark *){background-color:var(--gray-800)}.fi-ta-image .fi-ta-image-limited-remaining-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);justify-content:center;align-items:center;display:flex}.fi-ta-image .fi-ta-image-limited-remaining-text:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-base,.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-ta-select{width:100%;min-width:calc(var(--spacing)*48)}.fi-ta-select:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-select{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-select{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-text{width:100%}.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited{flex-direction:column;display:flex}:is(.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited).fi-ta-text-has-badges{row-gap:calc(var(--spacing)*2)}:is(.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited):not(.fi-ta-text-has-badges){row-gap:calc(var(--spacing)*1)}.fi-ta-text:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-text{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-text{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}ul.fi-ta-text.fi-bulleted,.fi-ta-text.fi-bulleted ul{list-style-type:disc;list-style-position:inside}ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul{column-gap:calc(var(--spacing)*1.5);display:flex}:is(ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul).fi-wrapped,:is(ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul).fi-ta-text-has-line-breaks,:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):is(.fi-ta-text-has-line-breaks ul){row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul){column-gap:calc(var(--spacing)*1.5);display:flex}:is(:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul)).fi-wrapped,:is(:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul)):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}.fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks){white-space:normal}.fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks) .fi-badge,.fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks) .fi-ta-text-list-limited-message{white-space:nowrap}.fi-ta-text>.fi-ta-text-description,.fi-ta-text>.fi-ta-text-list-limited-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}:is(.fi-ta-text>.fi-ta-text-description,.fi-ta-text>.fi-ta-text-list-limited-message):where(.dark,.dark *){color:var(--gray-400)}.fi-ta-text.fi-align-center{text-align:center}ul.fi-ta-text.fi-align-center,.fi-ta-text.fi-align-center ul{justify-content:center}.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right{text-align:end}ul:is(.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right),:is(.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right) ul{justify-content:flex-end}.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between{text-align:justify}ul:is(.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between),:is(.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between) ul{justify-content:space-between}.fi-ta-text-item{color:var(--gray-950)}.fi-ta-text-item:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.fi-ta-text-item a:hover{text-decoration-line:underline}}.fi-ta-text-item a:focus-visible{text-decoration-line:underline}.fi-ta-text-item:not(.fi-bulleted li.fi-ta-text-item){-webkit-line-clamp:var(--line-clamp,none);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.fi-ta-text-item>.fi-copyable{cursor:pointer}.fi-ta-text-item.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-ta-text-item.fi-size-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.fi-ta-text-item.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-ta-text-item.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-ta-text-item.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-ta-text-item.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-ta-text-item.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-ta-text-item.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-ta-text-item.fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-ta-text-item.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-ta-text-item.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-ta-text-item.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-ta-text-item.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-ta-text-item.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-ta-text-item.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.fi-ta-text-item.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-ta-text-item.fi-color{color:var(--text)}.fi-ta-text-item.fi-color:where(.dark,.dark *){color:var(--dark-text)}li.fi-ta-text-item.fi-color::marker{color:var(--gray-950)}li.fi-ta-text-item.fi-color:where(.dark,.dark *)::marker{color:var(--color-white)}.fi-ta-text-item.fi-color-gray{color:var(--gray-500)}.fi-ta-text-item.fi-color-gray:where(.dark,.dark *){color:var(--gray-400)}li.fi-ta-text-item.fi-color-gray::marker{color:var(--gray-950)}li.fi-ta-text-item.fi-color-gray:where(.dark,.dark *)::marker{color:var(--color-white)}.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon{color:var(--gray-400);flex-shrink:0;display:inline-block}:is(.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon).fi-color{color:var(--color-500)}.fi-ta-text-item.fi-ta-text-has-badges>.fi-badge{vertical-align:middle}@media (hover:hover){.fi-ta-col-has-column-url .fi-ta-text-item:hover{text-decoration-line:underline}}.fi-ta-col-has-column-url .fi-ta-text-item:focus-visible{text-decoration-line:underline}@media (hover:hover){.fi-ta-col-has-column-url .fi-ta-text-item .fi-icon:hover{text-decoration-line:none}}.fi-ta-col-has-column-url .fi-ta-text-item .fi-icon:focus-visible{text-decoration-line:none}@media (hover:hover){.fi-ta-col-has-column-url .fi-ta-text-item>.fi-badge:hover{text-decoration-line:none}}.fi-ta-col-has-column-url .fi-ta-text-item>.fi-badge:focus-visible{text-decoration-line:none}.fi-ta-text-input{width:100%;min-width:calc(var(--spacing)*48)}.fi-ta-text-input:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-text-input{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-text-input{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-toggle{width:100%}.fi-ta-toggle:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-toggle{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-toggle{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-toggle.fi-align-center{text-align:center}.fi-ta-toggle.fi-align-end,.fi-ta-toggle.fi-align-right{text-align:end}.fi-ta-grid.fi-gap-sm{gap:calc(var(--spacing)*1)}@media (min-width:40rem){.fi-ta-grid.sm\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:48rem){.fi-ta-grid.md\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:64rem){.fi-ta-grid.lg\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:80rem){.fi-ta-grid.xl\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:96rem){.fi-ta-grid.\32 xl\:fi-gap-sm{gap:calc(var(--spacing)*1)}}.fi-ta-grid.fi-gap-lg{gap:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-grid.sm\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:48rem){.fi-ta-grid.md\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:64rem){.fi-ta-grid.lg\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:80rem){.fi-ta-grid.xl\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:96rem){.fi-ta-grid.\32 xl\:fi-gap-lg{gap:calc(var(--spacing)*3)}}.fi-ta-panel{border-radius:var(--radius-lg);background-color:var(--gray-50);padding:calc(var(--spacing)*4);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-ta-panel{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-ta-panel{--tw-ring-inset:inset}.fi-ta-panel:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-panel:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-panel:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-split{display:flex}.fi-ta-split.default\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3)}.fi-ta-split.sm\:fi-ta-split,.fi-ta-split.md\:fi-ta-split,.fi-ta-split.lg\:fi-ta-split,.fi-ta-split.xl\:fi-ta-split,.fi-ta-split.\32 xl\:fi-ta-split{gap:calc(var(--spacing)*2);flex-direction:column}@media (min-width:40rem){.fi-ta-split.sm\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:48rem){.fi-ta-split.md\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:64rem){.fi-ta-split.lg\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:80rem){.fi-ta-split.xl\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:96rem){.fi-ta-split.\32 xl\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}.fi-ta-stack{flex-direction:column;display:flex}.fi-ta-stack.fi-align-start,.fi-ta-stack.fi-align-left{align-items:flex-start}.fi-ta-stack.fi-align-center{align-items:center}.fi-ta-stack.fi-align-end,.fi-ta-stack.fi-align-right{align-items:flex-end}:where(.fi-ta-stack.fi-gap-sm>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.fi-ta-stack.fi-gap-md>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.fi-ta-stack.fi-gap-lg>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.fi-ta-icon-count-summary{row-gap:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-icon-count-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-icon-count-summary>.fi-ta-icon-count-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-icon-count-summary>.fi-ta-icon-count-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-icon-count-summary>ul{row-gap:calc(var(--spacing)*1.5);display:grid}.fi-ta-icon-count-summary>ul>li{justify-content:flex-end;align-items:center;column-gap:calc(var(--spacing)*1.5);display:flex}.fi-ta-icon-count-summary>ul>li>.fi-icon{color:var(--gray-400)}.fi-ta-icon-count-summary>ul>li>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-icon-count-summary>ul>li>.fi-icon.fi-color{color:var(--text)}.fi-ta-icon-count-summary>ul>li>.fi-icon.fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-ta-range-summary{row-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-range-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-range-summary>.fi-ta-range-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-range-summary>.fi-ta-range-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-text-summary{row-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-text-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-text-summary>.fi-ta-text-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-text-summary>.fi-ta-text-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-values-summary{row-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-values-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-values-summary>.fi-ta-values-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-values-summary>.fi-ta-values-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-values-summary>ul.fi-bulleted{list-style-type:disc;list-style-position:inside}.fi-ta-ctn{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex;position:relative}.fi-ta-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn:not(.fi-ta-ctn-with-header){overflow:hidden}.fi-ta-ctn.fi-loading{animation:var(--animate-pulse)}.fi-ta-ctn .fi-ta-header-ctn{margin-top:-1px}.fi-ta-ctn .fi-ta-header{gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding:calc(var(--spacing)*4);flex-direction:column;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position{flex-direction:row;align-items:center}.fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position .fi-ta-actions{margin-inline-start:auto}}.fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position:not(:has(.fi-ta-header-heading)):not(:has(.fi-ta-header-description)) .fi-ta-actions{margin-inline-start:auto}.fi-ta-ctn .fi-ta-header .fi-ta-header-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-ctn .fi-ta-header .fi-ta-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-ctn .fi-ta-header .fi-ta-header-description{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600)}.fi-ta-ctn .fi-ta-header .fi-ta-header-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-ctn .fi-ta-header-toolbar{justify-content:space-between;align-items:center;gap:calc(var(--spacing)*4);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header-toolbar{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-header-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-header-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-header-toolbar>*{align-items:center;column-gap:calc(var(--spacing)*4);display:flex}.fi-ta-ctn .fi-ta-header-toolbar>:first-child{flex-shrink:0}.fi-ta-ctn .fi-ta-header-toolbar>:nth-child(2){margin-inline-start:auto}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown.sm\:fi-hidden{display:none}}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields{row-gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6);display:grid}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields label{row-gap:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);display:grid}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings>.fi-ta-grouping-settings-fields{align-items:center;column-gap:calc(var(--spacing)*3);display:none}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings>.fi-ta-grouping-settings-fields{display:flex}}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-filters-dropdown .fi-ta-filters,.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-col-manager-dropdown .fi-ta-col-manager{padding:calc(var(--spacing)*6)}.fi-ta-ctn .fi-ta-filters{row-gap:calc(var(--spacing)*4);display:grid}.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);padding:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header{justify-content:space-between;align-items:center;display:flex}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-ta-filters-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-ta-filters-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-loading-indicator{color:var(--gray-400)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-actions-ctn{gap:calc(var(--spacing)*3);display:flex}.fi-ta-ctn .fi-ta-filters-above-content-ctn{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*4);display:grid}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filters-above-content-ctn{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-filters-above-content-ctn:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filters-above-content-ctn:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-filters-above-content-ctn .fi-ta-filters-trigger-action-ctn{margin-inline-start:auto}.fi-ta-ctn .fi-ta-filters-above-content-ctn.fi-open .fi-ta-filters-trigger-action-ctn{margin-top:calc(var(--spacing)*3)}.fi-ta-ctn .fi-ta-filters-above-content-ctn.fi-open:has(.fi-ta-filters-actions-ctn) .fi-ta-filters-trigger-action-ctn{margin-top:calc(var(--spacing)*-7)}.fi-ta-ctn .fi-ta-reorder-indicator{align-items:center;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-reorder-indicator{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-ctn .fi-ta-reorder-indicator .fi-loading-indicator{color:var(--gray-400)}.fi-ta-ctn .fi-ta-reorder-indicator .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-ctn .fi-ta-selection-indicator{justify-content:space-between;row-gap:calc(var(--spacing)*1);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);flex-direction:column;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-selection-indicator{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*1.5);flex-direction:row;align-items:center}}.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-ctn .fi-ta-selection-indicator .fi-loading-indicator{color:var(--gray-400)}.fi-ta-ctn .fi-ta-selection-indicator .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-ctn .fi-ta-selection-indicator .fi-ta-selection-indicator-actions-ctn,.fi-ta-ctn .fi-ta-selection-indicator>*{column-gap:calc(var(--spacing)*3);display:flex}.fi-ta-ctn .fi-ta-selection-indicator>:first-child{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-ta-ctn .fi-ta-selection-indicator>:first-child:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-ctn .fi-ta-selection-indicator>:nth-child(2){margin-inline-start:auto}.fi-ta-ctn .fi-ta-filter-indicators{justify-content:space-between;align-items:flex-start;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filter-indicators{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-ctn .fi-ta-filter-indicators>:first-child{column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filter-indicators>:first-child{flex-direction:row}}.fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--gray-700)}.fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-label:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-badges-ctn{gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.fi-ta-ctn .fi-ta-filter-indicators>:nth-child(2).fi-icon-btn{margin-top:calc(var(--spacing)*-1)}.fi-ta-ctn .fi-pagination{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-ctn .fi-pagination{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-pagination:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-pagination:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-table-loading-ctn{height:calc(var(--spacing)*32);justify-content:center;align-items:center;display:flex}.fi-ta-ctn .fi-ta-main{min-width:calc(var(--spacing)*0);flex:1}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-trigger-action-ctn.lg\:fi-hidden{display:none}}.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn{z-index:20;border-radius:var(--radius-lg);border-color:var(--gray-200);background-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100vw;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-shrink:0;display:none;position:absolute;max-width:14rem!important}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn{z-index:auto;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:static}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn) .fi-ta-filters{padding:calc(var(--spacing)*6)}@media (min-width:64rem){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn) .fi-ta-filters{padding-block:calc(var(--spacing)*4)}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-open{display:block}@media (min-width:64rem){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).lg\:fi-open{display:block}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-opacity-0{opacity:0}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-xs{max-width:var(--container-xs)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-sm{max-width:var(--container-sm)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-md{max-width:var(--container-md)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-lg{max-width:var(--container-lg)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-xl{max-width:var(--container-xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-2xl{max-width:var(--container-2xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-3xl{max-width:var(--container-3xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-4xl{max-width:var(--container-4xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-5xl{max-width:var(--container-5xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-6xl{max-width:var(--container-6xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-7xl{max-width:var(--container-7xl)!important}.fi-ta-ctn .fi-ta-filters-before-content-ctn{inset-inline-start:calc(var(--spacing)*0)}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-before-content-ctn{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-start-start-radius:var(--radius-xl);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-xl)}}.fi-ta-ctn .fi-ta-filters-after-content-ctn{inset-inline-end:calc(var(--spacing)*0)}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-after-content-ctn{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-start-start-radius:0;border-start-end-radius:var(--radius-xl);border-end-end-radius:var(--radius-xl);border-end-start-radius:0}}.fi-ta-content-ctn{position:relative}:where(.fi-ta-content-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-ta-content-ctn{overflow-x:auto}:where(.fi-ta-content-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-content-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn:where(.dark,.dark *){border-top-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn:where(.dark,.dark *){border-top-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content-header{align-items:center;gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*6);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*4);display:flex}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content-header{padding-inline:calc(var(--spacing)*6)}}.fi-ta-content-ctn .fi-ta-content-header:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content-header .fi-ta-page-checkbox{margin-block:calc(var(--spacing)*4);flex-shrink:0}.fi-ta-content-ctn .fi-ta-content-header .fi-ta-sorting-settings{column-gap:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);display:flex}.fi-ta-content-ctn:not(.fi-ta-ctn-with-footer .fi-ta-content-ctn){border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.fi-ta-content-ctn:not(.fi-ta-ctn-with-header .fi-ta-content-ctn){border-top-style:var(--tw-border-style);border-top-width:0}.fi-ta-content-ctn .fi-ta-content{display:grid}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid{gap:calc(var(--spacing)*4);padding:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid{padding-inline:calc(var(--spacing)*6)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid.fi-ta-content-grouped{padding-top:calc(var(--spacing)*0)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{margin-inline:calc(var(--spacing)*-4);border-block-style:var(--tw-border-style);border-block-width:1px;border-color:var(--gray-200)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:first-child{border-top-style:var(--tw-border-style);border-top-width:0}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{margin-inline:calc(var(--spacing)*-6)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{width:calc(100% + 2rem)}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{width:calc(100% + 3rem)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record{border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (hover:hover){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected){background-color:var(--color-white)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-actions{padding-inline-start:calc(var(--spacing)*2)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-actions{padding-inline-end:calc(var(--spacing)*2)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid){background-color:var(--gray-200);row-gap:1px}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}@media (hover:hover){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:before{content:var(--tw-content);content:var(--tw-content);inset-block:calc(var(--spacing)*0);content:var(--tw-content);content:var(--tw-content);width:calc(var(--spacing)*.5);content:var(--tw-content);background-color:var(--primary-600);position:absolute;inset-inline-start:calc(var(--spacing)*0)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--primary-500)}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record .fi-ta-record-content-ctn{flex-direction:row;align-items:center}}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-actions{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-actions{padding-inline-end:calc(var(--spacing)*6)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix{padding-inline-start:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-actions{padding-inline-start:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix{padding-inline-end:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-actions{padding-inline-end:calc(var(--spacing)*3)}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record .fi-ta-actions{padding-inline-start:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header{align-items:center;column-gap:calc(var(--spacing)*3);background-color:var(--gray-50);width:100%;padding-inline:calc(var(--spacing)*1);padding-block:calc(var(--spacing)*2);grid-column:1/-1;display:flex}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header{padding-inline:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header.fi-collapsible{cursor:pointer}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header.fi-collapsible.fi-collapsed .fi-icon-btn{rotate:-180deg}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-checkbox{margin-inline:calc(var(--spacing)*3)}.fi-ta-content-ctn .fi-ta-content .fi-ta-table{grid-column:1/-1}.fi-ta-content-ctn .fi-ta-content .fi-ta-record{background-color:var(--color-white);height:100%;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;align-items:center;transition-duration:75ms;display:flex;position:relative}.fi-ta-content-ctn .fi-ta-content .fi-ta-record:where(.dark,.dark *){background-color:var(--gray-900)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-with-content-prefix{padding-inline-start:calc(var(--spacing)*1)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-with-content-suffix{padding-inline-end:calc(var(--spacing)*1)}@media (hover:hover){.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-clickable:hover{background-color:var(--gray-50)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-collapsed{display:none}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-selected{background-color:var(--gray-50)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-reorder-handle{margin-inline:calc(var(--spacing)*1);margin-block:calc(var(--spacing)*2)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-checkbox{margin-inline:calc(var(--spacing)*3);margin-block:calc(var(--spacing)*4);flex-shrink:0}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn{row-gap:calc(var(--spacing)*3);width:100%;height:100%;padding-block:calc(var(--spacing)*4);flex-direction:column;display:flex}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn>:first-child{flex:1}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content{width:100%;display:block}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col{text-align:start;justify-content:flex-start;display:flex}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col:disabled{pointer-events:none}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-growable{width:100%}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-center{text-align:center;justify-content:center}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-end{text-align:end;justify-content:flex-end}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-left{text-align:left;justify-content:flex-start}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-right{text-align:right;justify-content:flex-end}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-justify,.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-between{text-align:justify;justify-content:space-between}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content.fi-collapsible{margin-top:calc(var(--spacing)*3)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-growable{flex:1;width:100%}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-hidden{display:none}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-collapse-btn{margin-inline:calc(var(--spacing)*1);margin-block:calc(var(--spacing)*2);flex-shrink:0}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-actions.fi-ta-actions-before-columns-position{order:-9999}.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-actions{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-actions{padding-inline-end:calc(var(--spacing)*4)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-collapsed .fi-ta-record-collapse-btn{rotate:180deg}.fi-ta-empty-state{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*12)}.fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state){border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200)}.fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-empty-state .fi-ta-empty-state-content{max-width:var(--container-lg);text-align:center;justify-items:center;margin-inline:auto;display:grid}.fi-ta-empty-state .fi-ta-empty-state-icon-bg{margin-bottom:calc(var(--spacing)*4);background-color:var(--gray-100);padding:calc(var(--spacing)*3);border-radius:3.40282e38px}.fi-ta-empty-state .fi-ta-empty-state-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab, red, red)){.fi-ta-empty-state .fi-ta-empty-state-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.fi-ta-empty-state .fi-ta-empty-state-icon-bg .fi-icon{color:var(--gray-500)}.fi-ta-empty-state .fi-ta-empty-state-icon-bg .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-empty-state .fi-ta-empty-state-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-empty-state .fi-ta-empty-state-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-empty-state .fi-ta-empty-state-description{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-ta-empty-state .fi-ta-empty-state-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-empty-state .fi-ta-actions{margin-top:calc(var(--spacing)*6)}.fi-ta-header-cell{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3.5);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-header-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-header-cell.fi-growable{width:100%}.fi-ta-header-cell.fi-grouped{border-color:var(--gray-200)}.fi-ta-header-cell.fi-grouped:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-header-cell.fi-grouped:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-header-cell.fi-grouped:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-ta-header-cell.fi-grouped:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-ta-header-cell.fi-align-center{text-align:center}.fi-ta-header-cell.fi-align-center .fi-ta-header-cell-sort-btn{justify-content:center}.fi-ta-header-cell.fi-align-end{text-align:end}.fi-ta-header-cell.fi-align-end .fi-ta-header-cell-sort-btn{justify-content:flex-end}.fi-ta-header-cell.fi-align-left{text-align:left}.fi-ta-header-cell.fi-align-left .fi-ta-header-cell-sort-btn{justify-content:flex-start}.fi-ta-header-cell.fi-align-left .fi-ta-header-cell-sort-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.fi-ta-header-cell.fi-align-right{text-align:right}.fi-ta-header-cell.fi-align-right .fi-ta-header-cell-sort-btn{justify-content:flex-end}.fi-ta-header-cell.fi-align-right .fi-ta-header-cell-sort-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.fi-ta-header-cell.fi-align-justify,.fi-ta-header-cell.fi-align-between{text-align:justify}:is(.fi-ta-header-cell.fi-align-justify,.fi-ta-header-cell.fi-align-between) .fi-ta-header-cell-sort-btn{justify-content:space-between}.fi-ta-header-cell.fi-ta-header-cell-sorted .fi-icon{color:var(--gray-950)}.fi-ta-header-cell.fi-ta-header-cell-sorted .fi-icon:where(.dark,.dark *){color:var(--color-white)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-icon{color:var(--gray-400)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-icon:where(.dark,.dark *),.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:hover .fi-icon{color:var(--gray-500)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:focus-visible .fi-icon{color:var(--gray-500)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}@media (min-width:40rem){.fi-ta-header-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-header-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-header-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-header-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-header-cell.\32 xl\:fi-hidden{display:none}}.fi-ta-header-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-header-cell.sm\:fi-visible{display:table-cell}}.fi-ta-header-cell.md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-header-cell.md\:fi-visible{display:table-cell}}.fi-ta-header-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-header-cell.lg\:fi-visible{display:table-cell}}.fi-ta-header-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-header-cell.xl\:fi-visible{display:table-cell}}.fi-ta-header-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-header-cell.\32 xl\:fi-visible{display:table-cell}}.fi-ta-header-cell.fi-wrapped{white-space:normal}.fi-ta-header-cell:not(.fi-wrapped){white-space:nowrap}.fi-ta-header-cell .fi-ta-header-cell-sort-btn{cursor:pointer;justify-content:flex-start;align-items:center;column-gap:calc(var(--spacing)*1);width:100%;display:flex}.fi-ta-header-cell .fi-icon{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;transition-duration:75ms}.fi-ta-header-group-cell{border-color:var(--gray-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-header-group-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-header-group-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-header-group-cell:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-header-group-cell:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-header-group-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-header-group-cell:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-ta-header-group-cell:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-ta-header-group-cell.fi-align-start{text-align:start}.fi-ta-header-group-cell.fi-align-center{text-align:center}.fi-ta-header-group-cell.fi-align-end{text-align:end}.fi-ta-header-group-cell.fi-align-left{text-align:left}.fi-ta-header-group-cell.fi-align-right{text-align:right}.fi-ta-header-group-cell.fi-align-justify,.fi-ta-header-group-cell.fi-align-between{text-align:justify}@media (min-width:40rem){.fi-ta-header-group-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-header-group-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-header-group-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-header-group-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-header-group-cell.\32 xl\:fi-hidden{display:none}}.fi-ta-header-group-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-header-group-cell.sm\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-header-group-cell.md\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-header-group-cell.lg\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-header-group-cell.xl\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-header-group-cell.\32 xl\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.fi-wrapped{white-space:normal}.fi-ta-header-group-cell:not(.fi-wrapped){white-space:nowrap}.fi-ta-empty-header-cell{width:calc(var(--spacing)*1)}@media (hover:hover){.fi-ta-row{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-ta-row.fi-clickable:hover{background-color:var(--gray-50)}.fi-ta-row.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-ta-row.fi-striped{background-color:var(--gray-50)}.fi-ta-row.fi-striped:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-striped:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-row.fi-collapsed{display:none}.fi-ta-row.fi-ta-group-header-row>td{background-color:var(--gray-50)}.fi-ta-row.fi-ta-group-header-row>td:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-ta-group-header-row>td:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-row .fi-ta-group-header-cell{padding-inline:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-row .fi-ta-group-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-row .fi-ta-group-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-row .fi-ta-group-header{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;padding-block:calc(var(--spacing)*2);display:flex}.fi-ta-row .fi-ta-group-header.fi-collapsible{cursor:pointer}.fi-ta-row .fi-ta-group-header.fi-collapsible.fi-collapsed .fi-icon-btn{rotate:-180deg}.fi-ta-row .fi-ta-group-header .fi-ta-group-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-row .fi-ta-group-header .fi-ta-group-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-row .fi-ta-group-header .fi-ta-group-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-ta-row .fi-ta-group-header .fi-ta-group-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-row.fi-selected:not(.fi-striped){background-color:var(--gray-50)}.fi-ta-row.fi-selected:not(.fi-striped):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-selected:not(.fi-striped):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-row.fi-selected>:first-child{position:relative}.fi-ta-row.fi-selected>:first-child:before{inset-block:calc(var(--spacing)*0);width:calc(var(--spacing)*.5);background-color:var(--primary-600);content:"";position:absolute;inset-inline-start:calc(var(--spacing)*0)}.fi-ta-row.fi-selected>:first-child:where(.dark,.dark *):before{background-color:var(--primary-500)}.fi-ta-reordering .fi-ta-row:not(.fi-ta-row-not-reorderable){cursor:move}.fi-ta-table{table-layout:auto;width:100%}:where(.fi-ta-table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-ta-table{text-align:start}:where(.fi-ta-table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table.fi-ta-table-stacked-on-mobile{display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile{table-layout:auto;display:table}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead{display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead{display:table-header-group}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead:not(:has(.fi-ta-table-stacked-header-row)){display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead:not(:has(.fi-ta-table-stacked-header-row)){display:table-header-group}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr:not(.fi-ta-table-stacked-header-row){display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr:not(.fi-ta-table-stacked-header-row){display:table-row}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-header-cell{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-header-cell{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-selection-cell{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-selection-cell{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody{white-space:normal;display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody{white-space:nowrap;display:table-row-group}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr{padding-block:calc(var(--spacing)*2);display:block;position:relative}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr{padding-block:calc(var(--spacing)*0);display:table-row;position:static}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:before{inset-block:calc(var(--spacing)*0);width:calc(var(--spacing)*.5);background-color:var(--primary-600);position:absolute;inset-inline-start:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:before{display:none}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:before{content:""}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:where(.dark,.dark *):before{background-color:var(--primary-500)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected>:first-child:before{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected>:first-child:before{display:block}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell{inset-inline-end:calc(var(--spacing)*5);top:calc(var(--spacing)*0);position:absolute}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell{width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);display:table-cell;position:static}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell){padding-inline:calc(var(--spacing)*4);display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell){padding-inline:calc(var(--spacing)*0);display:table-cell}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).\32 xl\:fi-hidden{display:none}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).sm\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).md\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).lg\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).xl\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).\32 xl\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-label{padding-top:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-500)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-label{display:none}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-label:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-content{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word;color:var(--gray-800)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-content{display:block}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-content:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions){padding-block:calc(var(--spacing)*2)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*0)}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions)>.fi-ta-actions{justify-content:flex-start;column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*2);flex-wrap:wrap;width:100%}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions)>.fi-ta-actions{justify-content:flex-end;gap:calc(var(--spacing)*3);flex-wrap:nowrap;width:auto}}:where(.fi-ta-table>thead>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-ta-table>thead:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-table>thead:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table>thead>tr{background-color:var(--gray-50)}.fi-ta-table>thead>tr:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-table>thead>tr:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table>thead>tr.fi-ta-table-head-groups-row{background-color:var(--gray-100)}.fi-ta-table>thead>tr.fi-ta-table-head-groups-row:where(.dark,.dark *){background-color:#0000}:where(.fi-ta-table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-ta-table>tbody{white-space:nowrap}:where(.fi-ta-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table>tfoot{background-color:var(--gray-50)}.fi-ta-table>tfoot:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-table>tfoot:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table-stacked-header-row{border-block-style:var(--tw-border-style);border-block-width:0;width:100%;display:block}@media (min-width:40rem){.fi-ta-table-stacked-header-row{display:none}}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell{align-items:center;gap:calc(var(--spacing)*4);background-color:var(--gray-50);width:100%;padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);display:flex}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell .fi-ta-page-checkbox{flex-shrink:0;margin-inline-start:auto}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell .fi-ta-table-stacked-sorting{column-gap:calc(var(--spacing)*3);flex:1;display:flex}.fi-ta-col-manager{row-gap:calc(var(--spacing)*4);display:grid}.fi-ta-col-manager .fi-ta-col-manager-ctn{gap:calc(var(--spacing)*4);display:grid}.fi-ta-col-manager .fi-ta-col-manager-header{justify-content:space-between;align-items:center;display:flex}.fi-ta-col-manager .fi-ta-col-manager-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-col-manager .fi-ta-col-manager-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-col-manager .fi-ta-col-manager-items{margin-top:calc(var(--spacing)*-6);column-gap:calc(var(--spacing)*6)}.fi-ta-col-manager .fi-ta-col-manager-item{break-inside:avoid;align-items:center;gap:calc(var(--spacing)*3);padding-top:calc(var(--spacing)*6);display:flex}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);flex:1;display:flex}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label .fi-checkbox-input{flex-shrink:0}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-reorder-handle{cursor:move}.fi-ta-col-manager .fi-ta-col-manager-group{break-inside:avoid}.fi-ta-col-manager .fi-ta-col-manager-group .fi-ta-col-manager-group-items{padding-inline-start:calc(var(--spacing)*8)}.fi-ta-col-manager .fi-ta-col-manager-actions-ctn{gap:calc(var(--spacing)*3);display:flex}.fi-wi-chart .fi-wi-chart-canvas-ctn{margin-inline:auto}.fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1}@supports (container-type:inline-size){.fi-wi-chart .fi-section-content{container-type:inline-size}@container (min-width:24rem){.fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1.5}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1.5}}}.fi-wi-chart .fi-wi-chart-filter.fi-input-wrp{width:max-content}@media (min-width:40rem){.fi-wi-chart .fi-wi-chart-filter.fi-input-wrp{margin-block:calc(var(--spacing)*-2)}}.fi-wi-chart .fi-wi-chart-filter.fi-dropdown .fi-wi-chart-filter-content{row-gap:calc(var(--spacing)*4);padding:calc(var(--spacing)*6);display:grid}.fi-wi-chart .fi-wi-chart-filter.fi-dropdown .fi-wi-chart-filter-content-actions-ctn{gap:calc(var(--spacing)*3);display:flex}.fi-wi-chart .fi-color .fi-wi-chart-bg-color{color:var(--color-50)}.fi-wi-chart .fi-color .fi-wi-chart-bg-color:where(.dark,.dark *){color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-wi-chart .fi-color .fi-wi-chart-bg-color:where(.dark,.dark *){color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-wi-chart .fi-color .fi-wi-chart-border-color{color:var(--color-500)}.fi-wi-chart .fi-color .fi-wi-chart-border-color:where(.dark,.dark *){color:var(--color-400)}.fi-wi-chart .fi-wi-chart-bg-color{color:var(--gray-100)}.fi-wi-chart .fi-wi-chart-bg-color:where(.dark,.dark *){color:var(--gray-800)}.fi-wi-chart .fi-wi-chart-border-color{color:var(--gray-400)}.fi-wi-chart .fi-wi-chart-grid-color{color:var(--gray-200)}.fi-wi-chart .fi-wi-chart-grid-color:where(.dark,.dark *){color:var(--gray-800)}.fi-wi-chart .fi-wi-chart-text-color{color:var(--gray-500)}.fi-wi-chart .fi-wi-chart-text-color:where(.dark,.dark *){color:var(--gray-400)}.fi-wi-stats-overview-stat{border-radius:var(--radius-xl);background-color:var(--color-white);height:100%;padding:calc(var(--spacing)*6);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:block;position:relative}.fi-wi-stats-overview-stat:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-wi-stats-overview-stat:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-wi-stats-overview-stat .fi-icon{color:var(--gray-400);flex-shrink:0}.fi-wi-stats-overview-stat .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-content{row-gap:calc(var(--spacing)*2);display:grid}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label-ctn{align-items:center;column-gap:calc(var(--spacing)*2);display:flex}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label:where(.dark,.dark *){color:var(--gray-400)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value:where(.dark,.dark *){color:var(--color-white)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description{align-items:center;column-gap:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:flex}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description:where(.dark,.dark *){color:var(--gray-400)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color{color:var(--text)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color .fi-icon{color:var(--color-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart{inset-inline:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl);position:absolute;overflow:hidden}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart>canvas{height:calc(var(--spacing)*6)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-bg-color{color:var(--gray-100)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:var(--gray-800)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-border-color{color:var(--gray-400)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color{color:var(--color-50)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-border-color{color:var(--color-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-border-color:where(.dark,.dark *){color:var(--color-400)}.fi-wi{gap:calc(var(--spacing)*6)}.fi-global-search-ctn{align-items:center;display:flex}.fi-global-search{flex:1}@media (min-width:40rem){.fi-global-search{position:relative}}.fi-global-search-results-ctn{inset-inline:calc(var(--spacing)*4);z-index:10;margin-top:calc(var(--spacing)*2);max-height:calc(var(--spacing)*96);border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;overflow:auto}@media (min-width:40rem){.fi-global-search-results-ctn{inset-inline:auto}}.fi-global-search-results-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-global-search-results-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-results-ctn{transform:translateZ(0)}.fi-global-search-results-ctn.fi-transition-enter-start,.fi-global-search-results-ctn.fi-transition-leave-end{opacity:0}@media (min-width:40rem){.fi-topbar .fi-global-search-results-ctn{width:100vw;max-width:var(--container-sm);inset-inline-end:calc(var(--spacing)*0)}}.fi-sidebar .fi-global-search-ctn{margin-inline:calc(var(--spacing)*3);margin-top:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-sidebar .fi-global-search-results-ctn{inset-inline-start:calc(var(--spacing)*0)}}.fi-global-search-no-results-message{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-global-search-no-results-message:where(.dark,.dark *){color:var(--gray-400)}:where(.fi-global-search-results>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-global-search-results:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-global-search-results:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-result-group-header{top:calc(var(--spacing)*0);z-index:10;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);text-transform:capitalize;position:sticky}.fi-global-search-result-group-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-global-search-result-group-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-result-group-header:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white)}:where(.fi-global-search-result-group-results>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-global-search-result-group-results:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-global-search-result-group-results:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-result{scroll-margin-top:calc(var(--spacing)*9);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-global-search-result:focus-within{background-color:var(--gray-50)}@media (hover:hover){.fi-global-search-result:hover{background-color:var(--gray-50)}}.fi-global-search-result:where(.dark,.dark *):focus-within{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-global-search-result:where(.dark,.dark *):focus-within{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}@media (hover:hover){.fi-global-search-result:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-global-search-result:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-global-search-result.fi-global-search-result-has-actions .fi-global-search-result-link{padding-bottom:calc(var(--spacing)*0)}.fi-global-search-result-link{padding:calc(var(--spacing)*4);--tw-outline-style:none;outline-style:none;display:block}@media (forced-colors:active){.fi-global-search-result-link{outline-offset:2px;outline:2px solid #0000}}.fi-global-search-result-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-global-search-result-heading:where(.dark,.dark *){color:var(--color-white)}.fi-global-search-result-details{margin-top:calc(var(--spacing)*1)}.fi-global-search-result-detail{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-global-search-result-detail:where(.dark,.dark *){color:var(--gray-400)}.fi-global-search-result-detail-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);display:inline}.fi-global-search-result-detail-value{display:inline}.fi-global-search-result-actions{margin-top:calc(var(--spacing)*3);column-gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*4);display:flex}.fi-header{gap:calc(var(--spacing)*4);flex-direction:column;display:flex}@media (min-width:40rem){.fi-header{flex-direction:row;justify-content:space-between;align-items:center}}.fi-header .fi-breadcrumbs{margin-bottom:calc(var(--spacing)*2);display:none}@media (min-width:40rem){.fi-header .fi-breadcrumbs{display:block}.fi-header.fi-header-has-breadcrumbs .fi-header-actions-ctn{margin-top:calc(var(--spacing)*7)}}.fi-header-heading{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950)}@media (min-width:40rem){.fi-header-heading{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}.fi-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-header-subheading{margin-top:calc(var(--spacing)*2);max-width:var(--container-2xl);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));color:var(--gray-600)}.fi-header-subheading:where(.dark,.dark *){color:var(--gray-400)}.fi-header-actions-ctn{align-items:center;gap:calc(var(--spacing)*3);flex-shrink:0;display:flex}.fi-header-actions-ctn>.fi-ac{flex:1}.fi-header-actions-ctn>.fi-ac:not(.fi-width-full).fi-align-end,.fi-header-actions-ctn>.fi-ac:not(.fi-width-full).fi-align-right{flex-direction:row;justify-content:flex-end}.fi-simple-header{flex-direction:column;align-items:center;display:flex}.fi-simple-header .fi-logo{margin-bottom:calc(var(--spacing)*4)}.fi-simple-header-heading{text-align:center;font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950)}.fi-simple-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-simple-header-subheading{margin-top:calc(var(--spacing)*2);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-simple-header-subheading:where(.dark,.dark *){color:var(--gray-400)}html.fi{min-height:100dvh}.fi-body{background-color:var(--gray-50);--tw-font-weight:var(--font-weight-normal);min-height:100dvh;font-weight:var(--font-weight-normal);color:var(--gray-950);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fi-body:where(.dark,.dark *){background-color:var(--gray-950);color:var(--color-white)}:is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-main-ctn{opacity:0;min-height:calc(100dvh - 4rem);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fi-body>.fi-layout-sidebar-toggle-btn-ctn{padding-inline-start:calc(var(--spacing)*5);padding-top:calc(var(--spacing)*5)}@media (min-width:64rem){.fi-body>.fi-layout-sidebar-toggle-btn-ctn.lg\:fi-hidden{display:none}}.fi-body.fi-body-has-navigation:not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop):not(.fi-body-has-top-navigation) .fi-main-ctn{opacity:0}:is(.fi-body.fi-body-has-top-navigation,.fi-body:not(.fi-body-has-navigation)) .fi-main-ctn{min-height:calc(100dvh - 4rem);display:flex}.fi-body:not(.fi-body-has-topbar) .fi-main-ctn{min-height:100dvh;display:flex}.fi-layout{width:100%;height:100%;display:flex;overflow-x:clip}.fi-main-ctn{flex-direction:column;flex:1;width:100vw}.fi-main{width:100%;height:100%;padding-inline:calc(var(--spacing)*4);margin-inline:auto}@media (min-width:48rem){.fi-main{padding-inline:calc(var(--spacing)*6)}}@media (min-width:64rem){.fi-main{padding-inline:calc(var(--spacing)*8)}}:is(.fi-main,.fi-simple-main).fi-width-xs{max-width:var(--container-xs)}:is(.fi-main,.fi-simple-main).fi-width-sm{max-width:var(--container-sm)}:is(.fi-main,.fi-simple-main).fi-width-md{max-width:var(--container-md)}:is(.fi-main,.fi-simple-main).fi-width-lg{max-width:var(--container-lg)}:is(.fi-main,.fi-simple-main).fi-width-xl{max-width:var(--container-xl)}:is(.fi-main,.fi-simple-main).fi-width-2xl{max-width:var(--container-2xl)}:is(.fi-main,.fi-simple-main).fi-width-3xl{max-width:var(--container-3xl)}:is(.fi-main,.fi-simple-main).fi-width-4xl{max-width:var(--container-4xl)}:is(.fi-main,.fi-simple-main).fi-width-5xl{max-width:var(--container-5xl)}:is(.fi-main,.fi-simple-main).fi-width-6xl{max-width:var(--container-6xl)}:is(.fi-main,.fi-simple-main).fi-width-7xl{max-width:var(--container-7xl)}:is(.fi-main,.fi-simple-main).fi-width-full{max-width:100%}:is(.fi-main,.fi-simple-main).fi-width-min{max-width:min-content}:is(.fi-main,.fi-simple-main).fi-width-max{max-width:max-content}:is(.fi-main,.fi-simple-main).fi-width-fit{max-width:fit-content}:is(.fi-main,.fi-simple-main).fi-width-prose{max-width:65ch}:is(.fi-main,.fi-simple-main).fi-width-screen-sm{max-width:var(--breakpoint-sm)}:is(.fi-main,.fi-simple-main).fi-width-screen-md{max-width:var(--breakpoint-md)}:is(.fi-main,.fi-simple-main).fi-width-screen-lg{max-width:var(--breakpoint-lg)}:is(.fi-main,.fi-simple-main).fi-width-screen-xl{max-width:var(--breakpoint-xl)}:is(.fi-main,.fi-simple-main).fi-width-screen-2xl{max-width:var(--breakpoint-2xl)}:is(.fi-main,.fi-simple-main).fi-width-screen{inset:calc(var(--spacing)*0);position:fixed}.fi-simple-layout{flex-direction:column;align-items:center;min-height:100dvh;display:flex}.fi-simple-layout-header{inset-inline-end:calc(var(--spacing)*0);top:calc(var(--spacing)*0);height:calc(var(--spacing)*16);align-items:center;column-gap:calc(var(--spacing)*4);padding-inline-end:calc(var(--spacing)*4);display:flex;position:absolute}@media (min-width:48rem){.fi-simple-layout-header{padding-inline-end:calc(var(--spacing)*6)}}@media (min-width:64rem){.fi-simple-layout-header{padding-inline-end:calc(var(--spacing)*8)}}.fi-simple-main-ctn{flex-grow:1;justify-content:center;align-items:center;width:100%;display:flex}.fi-simple-main{margin-block:calc(var(--spacing)*16);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*12);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:40rem){.fi-simple-main{border-radius:var(--radius-xl);padding-inline:calc(var(--spacing)*12)}}.fi-simple-main:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-simple-main:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-logo{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950);display:flex}.fi-logo:where(.dark,.dark *){color:var(--color-white)}.fi-logo.fi-logo-light:where(.dark,.dark *),.fi-logo.fi-logo-dark{display:none}.fi-logo.fi-logo-dark:where(.dark,.dark *){display:flex}@media (min-width:48rem){.fi-page-sub-navigation-dropdown{display:none}}.fi-page-sub-navigation-dropdown>.fi-dropdown-trigger>.fi-btn{justify-content:space-between;width:100%}.fi-page-sub-navigation-sidebar-ctn{width:calc(var(--spacing)*72);flex-direction:column;display:none}@media (min-width:48rem){.fi-page-sub-navigation-sidebar-ctn{display:flex}}.fi-page-sub-navigation-sidebar{row-gap:calc(var(--spacing)*7);flex-direction:column;display:flex}.fi-page-sub-navigation-tabs{display:none}@media (min-width:48rem){.fi-page-sub-navigation-tabs{display:flex}}.fi-page.fi-height-full,.fi-page.fi-height-full .fi-page-main,.fi-page.fi-height-full .fi-page-header-main-ctn,.fi-page.fi-height-full .fi-page-content{height:100%}.fi-page.fi-page-has-sub-navigation .fi-page-main{gap:calc(var(--spacing)*8);flex-direction:column;display:flex}@media (min-width:48rem){:is(.fi-page.fi-page-has-sub-navigation.fi-page-has-sub-navigation-start,.fi-page.fi-page-has-sub-navigation.fi-page-has-sub-navigation-end) .fi-page-main{flex-direction:row;align-items:flex-start}}.fi-page-header-main-ctn{row-gap:calc(var(--spacing)*8);padding-block:calc(var(--spacing)*8);flex-direction:column;display:flex}.fi-page-main-sub-navigation-mobile-menu-render-hook-ctn{display:contents}@media (min-width:48rem){.fi-page-main-sub-navigation-mobile-menu-render-hook-ctn{display:none}}.fi-page-content{row-gap:calc(var(--spacing)*8);flex:1;grid-auto-columns:minmax(0,1fr);display:grid}.fi-simple-page-content{row-gap:calc(var(--spacing)*6);grid-auto-columns:minmax(0,1fr);display:grid}.fi-sidebar-group{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}.fi-sidebar-group.fi-collapsed .fi-sidebar-group-collapse-btn{rotate:-180deg}.fi-sidebar-group.fi-collapsible>.fi-sidebar-group-btn{cursor:pointer}.fi-sidebar-group.fi-active .fi-sidebar-group-dropdown-trigger-btn .fi-icon{color:var(--primary-600)}.fi-sidebar-group.fi-active .fi-sidebar-group-dropdown-trigger-btn .fi-icon:where(.dark,.dark *){color:var(--primary-400)}.fi-sidebar-group-btn{align-items:center;column-gap:calc(var(--spacing)*3);padding:calc(var(--spacing)*2);display:flex}.fi-sidebar-group-btn .fi-icon{color:var(--gray-400)}.fi-sidebar-group-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-group-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);flex:1}.fi-sidebar-group-label:where(.dark,.dark *){color:var(--gray-400)}.fi-sidebar-group-dropdown-trigger-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);padding:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;flex:1;display:flex;position:relative}@media (forced-colors:active){.fi-sidebar-group-dropdown-trigger-btn{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar-group-dropdown-trigger-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-sidebar-group-dropdown-trigger-btn:hover{background-color:var(--gray-100)}}.fi-sidebar-group-dropdown-trigger-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-group-dropdown-trigger-btn .fi-icon{color:var(--gray-400)}.fi-sidebar-group-dropdown-trigger-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-group-items{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter{transition-delay:.1s}@media (min-width:64rem){:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter-start{opacity:0}:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter-end{opacity:1}.fi-sidebar{inset-block:calc(var(--spacing)*0);z-index:30;background-color:var(--color-white);height:100dvh;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-direction:column;align-content:flex-start;display:flex;position:fixed;inset-inline-start:calc(var(--spacing)*0)}@media (min-width:64rem){.fi-sidebar{z-index:20;background-color:#0000;transition-property:none}}.fi-sidebar:where(.dark,.dark *){background-color:var(--gray-900)}@media (min-width:64rem){.fi-sidebar:where(.dark,.dark *){background-color:#0000}}.fi-sidebar.fi-sidebar-open{width:var(--sidebar-width);--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:64rem){.fi-sidebar.fi-sidebar-open{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.fi-sidebar.fi-sidebar-open:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-sidebar.fi-sidebar-open:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sidebar.fi-sidebar-open:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sidebar:not(.fi-sidebar-open){--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-sidebar:not(.fi-sidebar-open):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}@media (min-width:64rem){.fi-body-has-topbar .fi-sidebar{height:calc(100dvh - 4rem);top:4rem}}.fi-sidebar-close-overlay{inset:calc(var(--spacing)*0);z-index:30;background-color:var(--gray-950);position:fixed}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-close-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.fi-sidebar-close-overlay{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.5s;transition-duration:.5s}@media (min-width:64rem){.fi-sidebar-close-overlay{display:none}}.fi-sidebar-close-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-close-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}@media (min-width:64rem){.fi-body.fi-body-has-top-navigation .fi-sidebar{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-body.fi-body-has-top-navigation .fi-sidebar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-body:not(.fi-body-has-top-navigation) .fi-sidebar.fi-sidebar-open,.fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open){position:sticky}.fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open),.fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open):where(:dir(rtl),[dir=rtl],[dir=rtl] *),.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar,.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}}.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:not(.fi-sidebar-open){width:var(--sidebar-width)}@media (min-width:64rem){.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:not(.fi-sidebar-open){position:sticky}}.fi-sidebar-header-ctn{overflow-x:clip}.fi-sidebar-header{height:calc(var(--spacing)*16);justify-content:center;align-items:center;display:flex}.fi-sidebar-header-logo-ctn{flex:1}.fi-body-has-topbar .fi-sidebar-header{background-color:var(--color-white);padding-inline:calc(var(--spacing)*6);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-body-has-topbar .fi-sidebar-header{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}@media (min-width:64rem){.fi-body-has-topbar .fi-sidebar-header{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:none}}.fi-body-has-topbar .fi-sidebar-header:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-body-has-topbar .fi-sidebar-header:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:not(.fi-body-has-topbar) .fi-sidebar-header{padding-inline:calc(var(--spacing)*4);--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#0000}:not(.fi-body-has-topbar) .fi-sidebar-header .fi-logo{margin-inline-start:calc(var(--spacing)*3)}.fi-sidebar-nav{row-gap:calc(var(--spacing)*7);padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*8);scrollbar-gutter:stable;flex-direction:column;flex-grow:1;display:flex;overflow:hidden auto}.fi-sidebar-nav-groups{margin-inline:calc(var(--spacing)*-2);row-gap:calc(var(--spacing)*7);flex-direction:column;display:flex}.fi-sidebar-item.fi-active,.fi-sidebar-item.fi-sidebar-item-has-active-child-items{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn{background-color:var(--gray-100)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-item.fi-active>.fi-sidebar-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-icon{color:var(--primary-700)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--primary-400)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-grouped-border>.fi-sidebar-item-grouped-border-part{background-color:var(--primary-700)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-grouped-border>.fi-sidebar-item-grouped-border-part:where(.dark,.dark *){background-color:var(--primary-400)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-label{color:var(--primary-700)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-label:where(.dark,.dark *){color:var(--primary-400)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn .fi-sidebar-item-grouped-border-part{height:calc(var(--spacing)*1.5);width:calc(var(--spacing)*1.5);border-radius:3.40282e38px;position:relative}@media (hover:hover){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:hover{background-color:var(--gray-100)}}.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-item-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);padding:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;display:flex;position:relative}@media (forced-colors:active){.fi-sidebar-item-btn{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar-item-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-sidebar-item-btn>.fi-icon{color:var(--gray-400)}.fi-sidebar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-item-grouped-border{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6);justify-content:center;align-items:center;display:flex;position:relative}.fi-sidebar-item-grouped-border-part-not-first{background-color:var(--gray-300);width:1px;position:absolute;top:-50%;bottom:50%}.fi-sidebar-item-grouped-border-part-not-first:where(.dark,.dark *){background-color:var(--gray-600)}.fi-sidebar-item-grouped-border-part-not-last{background-color:var(--gray-300);width:1px;position:absolute;top:50%;bottom:-50%}.fi-sidebar-item-grouped-border-part-not-last:where(.dark,.dark *){background-color:var(--gray-600)}.fi-sidebar-item-grouped-border-part{height:calc(var(--spacing)*1.5);width:calc(var(--spacing)*1.5);background-color:var(--gray-400);border-radius:3.40282e38px;position:relative}.fi-sidebar-item-grouped-border-part:where(.dark,.dark *){background-color:var(--gray-500)}.fi-sidebar-item-label{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);flex:1;overflow:hidden}.fi-sidebar-item-label:where(.dark,.dark *){color:var(--gray-200)}@media (min-width:64rem){:is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));transition-delay:.1s}}:is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter-start{opacity:0}:is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter-end{opacity:1}.fi-sidebar-footer{margin-inline:calc(var(--spacing)*4);margin-block:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*3);display:grid}.fi-sidebar-footer>.fi-no-database{display:block}.fi-sidebar-sub-group-items{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}.fi-sidebar-database-notifications-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);width:100%;padding:calc(var(--spacing)*2);text-align:start;--tw-outline-style:none;outline-style:none;display:flex;position:relative}@media (forced-colors:active){.fi-sidebar-database-notifications-btn{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar-database-notifications-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-sidebar-database-notifications-btn:hover{background-color:var(--gray-100)}}.fi-sidebar-database-notifications-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-sidebar-database-notifications-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-database-notifications-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-sidebar-database-notifications-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-database-notifications-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-database-notifications-btn>.fi-icon{color:var(--gray-400)}.fi-sidebar-database-notifications-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);flex:1;overflow:hidden}.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label:where(.dark,.dark *){color:var(--gray-200)}@media (min-width:64rem){:is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));transition-delay:.1s}}:is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter-start{opacity:0}:is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter-end{opacity:1}.fi-sidebar-open-sidebar-btn,.fi-sidebar-open-collapse-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}.fi-sidebar-close-collapse-sidebar-btn{display:none;margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-sidebar-close-collapse-sidebar-btn{display:flex}:is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body:not(.fi-body-has-sidebar-fully-collapsible-on-desktop)) .fi-sidebar-open-sidebar-btn{display:none}}.fi-sidebar-close-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-sidebar-close-sidebar-btn{display:none}}.fi-tenant-menu-trigger{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);width:100%;padding:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;outline-style:none;display:flex}@media (forced-colors:active){.fi-tenant-menu-trigger{outline-offset:2px;outline:2px solid #0000}}.fi-tenant-menu-trigger{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-tenant-menu-trigger:hover{background-color:var(--gray-100)}}.fi-tenant-menu-trigger:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-tenant-menu-trigger:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tenant-menu-trigger:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-tenant-menu-trigger:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tenant-menu-trigger:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-tenant-menu-trigger .fi-tenant-avatar{flex-shrink:0}.fi-tenant-menu-trigger .fi-icon{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;margin-inline-start:auto;transition-duration:75ms}@media (hover:hover){.fi-tenant-menu-trigger .fi-icon:is(:where(.group):hover *){color:var(--gray-500)}}.fi-tenant-menu-trigger .fi-icon:is(:where(.group):focus-visible *),.fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):hover *){color:var(--gray-400)}}.fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-400)}.fi-tenant-menu-trigger:hover .fi-icon{color:var(--gray-500)}.fi-tenant-menu-trigger:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-tenant-menu-trigger:focus-visible .fi-icon{color:var(--gray-500)}.fi-tenant-menu-trigger:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-tenant-menu-trigger-text{text-align:start;justify-items:start;display:grid}.fi-tenant-menu-trigger-current-tenant-label{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-500)}.fi-tenant-menu-trigger-current-tenant-label:where(.dark,.dark *){color:var(--gray-400)}.fi-tenant-menu-trigger-tenant-name{color:var(--gray-950)}.fi-tenant-menu-trigger-tenant-name:where(.dark,.dark *){color:var(--color-white)}.fi-sidebar .fi-tenant-menu{margin-inline:calc(var(--spacing)*4);margin-top:calc(var(--spacing)*3)}.fi-theme-switcher{column-gap:calc(var(--spacing)*1);grid-auto-flow:column;display:grid}.fi-theme-switcher-btn{border-radius:var(--radius-md);padding:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;justify-content:center;display:flex}@media (forced-colors:active){.fi-theme-switcher-btn{outline-offset:2px;outline:2px solid #0000}}.fi-theme-switcher-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-theme-switcher-btn:hover{background-color:var(--gray-50)}}.fi-theme-switcher-btn:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-theme-switcher-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-theme-switcher-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-theme-switcher-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-theme-switcher-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-theme-switcher-btn.fi-active{background-color:var(--gray-50);color:var(--primary-500)}.fi-theme-switcher-btn.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-theme-switcher-btn.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-theme-switcher-btn.fi-active:where(.dark,.dark *){color:var(--primary-400)}.fi-theme-switcher-btn:not(.fi-active){color:var(--gray-400)}@media (hover:hover){.fi-theme-switcher-btn:not(.fi-active):hover{color:var(--gray-500)}}.fi-theme-switcher-btn:not(.fi-active):focus-visible,.fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *):hover{color:var(--gray-400)}}.fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *):focus-visible{color:var(--gray-400)}.fi-topbar-ctn{top:calc(var(--spacing)*0);z-index:30;position:sticky;overflow-x:clip}.fi-topbar{min-height:calc(var(--spacing)*16);background-color:var(--color-white);padding-inline:calc(var(--spacing)*4);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);align-items:center;display:flex}.fi-topbar:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-topbar:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-topbar .fi-tenant-menu{display:none}@media (min-width:64rem){.fi-topbar .fi-tenant-menu{display:block}}.fi-topbar-open-sidebar-btn,.fi-topbar-close-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-topbar-close-sidebar-btn{display:none}}.fi-topbar-open-collapse-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}.fi-topbar-close-collapse-sidebar-btn{display:none;margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-topbar-close-collapse-sidebar-btn{display:flex}}.fi-topbar-start{align-items:center;margin-inline-end:calc(var(--spacing)*6);display:none}@media (min-width:64rem){.fi-topbar-start{display:flex}}.fi-topbar-start .fi-logo{margin-inline-start:calc(var(--spacing)*3)}.fi-topbar-collapse-sidebar-btn-ctn{width:calc(var(--spacing)*9);flex-shrink:0}@media (min-width:64rem){:is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body:not(.fi-body-has-sidebar-fully-collapsible-on-desktop)) .fi-topbar-open-sidebar-btn{display:none}}.fi-topbar-nav-groups{align-items:center;column-gap:calc(var(--spacing)*4);margin-inline-start:calc(var(--spacing)*4);margin-inline-end:calc(var(--spacing)*4);display:none}@media (min-width:64rem){.fi-topbar-nav-groups{margin-block:calc(var(--spacing)*2);row-gap:calc(var(--spacing)*1);flex-wrap:wrap;display:flex}}.fi-topbar-end{align-items:center;column-gap:calc(var(--spacing)*4);margin-inline-start:auto;display:flex}.fi-topbar-item-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*2);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;display:flex}@media (forced-colors:active){.fi-topbar-item-btn{outline-offset:2px;outline:2px solid #0000}}.fi-topbar-item-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-topbar-item-btn:hover{background-color:var(--gray-50)}}.fi-topbar-item-btn:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-topbar-item-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-topbar-item-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-topbar-item-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-topbar-item-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-topbar-item-btn>.fi-icon{color:var(--gray-400)}.fi-topbar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-topbar-item-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-topbar-item-label:where(.dark,.dark *){color:var(--gray-200)}.fi-topbar-item.fi-active .fi-topbar-item-btn{background-color:var(--gray-50)}.fi-topbar-item.fi-active .fi-topbar-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-topbar-item.fi-active .fi-topbar-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-topbar-item.fi-active .fi-topbar-item-btn>.fi-icon{color:var(--primary-600)}.fi-topbar-item.fi-active .fi-topbar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--primary-400)}.fi-topbar-item.fi-active .fi-topbar-item-label{color:var(--primary-600)}.fi-topbar-item.fi-active .fi-topbar-item-label:where(.dark,.dark *){color:var(--primary-400)}.fi-simple-user-menu-ctn{align-items:center;column-gap:calc(var(--spacing)*4);display:flex}.fi-topbar .fi-user-menu-trigger{flex-shrink:0}.fi-sidebar .fi-user-menu-trigger{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);width:100%;padding:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;outline-style:none;display:flex}@media (forced-colors:active){.fi-sidebar .fi-user-menu-trigger{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar .fi-user-menu-trigger{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-sidebar .fi-user-menu-trigger .fi-user-avatar{flex-shrink:0}.fi-sidebar .fi-user-menu-trigger .fi-icon{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;margin-inline-start:auto;transition-duration:75ms}@media (hover:hover){.fi-sidebar .fi-user-menu-trigger .fi-icon:is(:where(.group):hover *){color:var(--gray-500)}}.fi-sidebar .fi-user-menu-trigger .fi-icon:is(:where(.group):focus-visible *),.fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):hover *){color:var(--gray-400)}}.fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-400)}.fi-sidebar .fi-user-menu-trigger:hover .fi-icon{color:var(--gray-500)}.fi-sidebar .fi-user-menu-trigger:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-sidebar .fi-user-menu-trigger:focus-visible .fi-icon{color:var(--gray-500)}.fi-sidebar .fi-user-menu-trigger:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-sidebar .fi-user-menu-trigger .fi-tenant-menu-trigger-text{text-align:start;color:var(--gray-950);justify-items:start;display:grid}.fi-sidebar .fi-user-menu-trigger .fi-tenant-menu-trigger-text:where(.dark,.dark *){color:var(--color-white)}.fi-sidebar .fi-user-menu .fi-dropdown-panel{max-width:max(14rem,100% - 1.5rem)!important}.fi-account-widget .fi-section-content{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-account-widget-logout-form{margin-block:auto}.fi-account-widget-main{flex:1}.fi-account-widget-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1;display:grid}.fi-account-widget-heading:where(.dark,.dark *){color:var(--color-white)}.fi-account-widget-user-name{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-account-widget-user-name:where(.dark,.dark *){color:var(--gray-400)}.fi-filament-info-widget .fi-section-content{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-filament-info-widget-main{flex:1}.fi-filament-info-widget-logo{height:calc(var(--spacing)*5);color:var(--gray-950)}.fi-filament-info-widget-logo:where(.dark,.dark *){color:var(--color-white)}.fi-filament-info-widget-version{margin-top:calc(var(--spacing)*2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-500)}.fi-filament-info-widget-version:where(.dark,.dark *){color:var(--gray-400)}.fi-filament-info-widget-links{align-items:flex-end;row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}}@layer utilities{.fi-color-danger{--color-50:var(--danger-50);--color-100:var(--danger-100);--color-200:var(--danger-200);--color-300:var(--danger-300);--color-400:var(--danger-400);--color-500:var(--danger-500);--color-600:var(--danger-600);--color-700:var(--danger-700);--color-800:var(--danger-800);--color-900:var(--danger-900);--color-950:var(--danger-950)}.fi-color-gray{--color-50:var(--gray-50);--color-100:var(--gray-100);--color-200:var(--gray-200);--color-300:var(--gray-300);--color-400:var(--gray-400);--color-500:var(--gray-500);--color-600:var(--gray-600);--color-700:var(--gray-700);--color-800:var(--gray-800);--color-900:var(--gray-900);--color-950:var(--gray-950)}.fi-color-info{--color-50:var(--info-50);--color-100:var(--info-100);--color-200:var(--info-200);--color-300:var(--info-300);--color-400:var(--info-400);--color-500:var(--info-500);--color-600:var(--info-600);--color-700:var(--info-700);--color-800:var(--info-800);--color-900:var(--info-900);--color-950:var(--info-950)}.fi-color-primary{--color-50:var(--primary-50);--color-100:var(--primary-100);--color-200:var(--primary-200);--color-300:var(--primary-300);--color-400:var(--primary-400);--color-500:var(--primary-500);--color-600:var(--primary-600);--color-700:var(--primary-700);--color-800:var(--primary-800);--color-900:var(--primary-900);--color-950:var(--primary-950)}.fi-color-success{--color-50:var(--success-50);--color-100:var(--success-100);--color-200:var(--success-200);--color-300:var(--success-300);--color-400:var(--success-400);--color-500:var(--success-500);--color-600:var(--success-600);--color-700:var(--success-700);--color-800:var(--success-800);--color-900:var(--success-900);--color-950:var(--success-950)}.fi-color-warning{--color-50:var(--warning-50);--color-100:var(--warning-100);--color-200:var(--warning-200);--color-300:var(--warning-300);--color-400:var(--warning-400);--color-500:var(--warning-500);--color-600:var(--warning-600);--color-700:var(--warning-700);--color-800:var(--warning-800);--color-900:var(--warning-900);--color-950:var(--warning-950)}.fi-bg-color-50{--bg:var(--color-50)}.fi-bg-color-100{--bg:var(--color-100)}.fi-bg-color-200{--bg:var(--color-200)}.fi-bg-color-300{--bg:var(--color-300)}.fi-bg-color-400{--bg:var(--color-400)}.fi-bg-color-500{--bg:var(--color-500)}.fi-bg-color-600{--bg:var(--color-600)}.fi-bg-color-700{--bg:var(--color-700)}.fi-bg-color-800{--bg:var(--color-800)}.fi-bg-color-900{--bg:var(--color-900)}.fi-bg-color-950{--bg:var(--color-950)}.hover\:fi-bg-color-50{--hover-bg:var(--color-50)}.hover\:fi-bg-color-100{--hover-bg:var(--color-100)}.hover\:fi-bg-color-200{--hover-bg:var(--color-200)}.hover\:fi-bg-color-300{--hover-bg:var(--color-300)}.hover\:fi-bg-color-400{--hover-bg:var(--color-400)}.hover\:fi-bg-color-500{--hover-bg:var(--color-500)}.hover\:fi-bg-color-600{--hover-bg:var(--color-600)}.hover\:fi-bg-color-700{--hover-bg:var(--color-700)}.hover\:fi-bg-color-800{--hover-bg:var(--color-800)}.hover\:fi-bg-color-900{--hover-bg:var(--color-900)}.hover\:fi-bg-color-950{--hover-bg:var(--color-950)}.dark\:fi-bg-color-50{--dark-bg:var(--color-50)}.dark\:fi-bg-color-100{--dark-bg:var(--color-100)}.dark\:fi-bg-color-200{--dark-bg:var(--color-200)}.dark\:fi-bg-color-300{--dark-bg:var(--color-300)}.dark\:fi-bg-color-400{--dark-bg:var(--color-400)}.dark\:fi-bg-color-500{--dark-bg:var(--color-500)}.dark\:fi-bg-color-600{--dark-bg:var(--color-600)}.dark\:fi-bg-color-700{--dark-bg:var(--color-700)}.dark\:fi-bg-color-800{--dark-bg:var(--color-800)}.dark\:fi-bg-color-900{--dark-bg:var(--color-900)}.dark\:fi-bg-color-950{--dark-bg:var(--color-950)}.dark\:hover\:fi-bg-color-50{--dark-hover-bg:var(--color-50)}.dark\:hover\:fi-bg-color-100{--dark-hover-bg:var(--color-100)}.dark\:hover\:fi-bg-color-200{--dark-hover-bg:var(--color-200)}.dark\:hover\:fi-bg-color-300{--dark-hover-bg:var(--color-300)}.dark\:hover\:fi-bg-color-400{--dark-hover-bg:var(--color-400)}.dark\:hover\:fi-bg-color-500{--dark-hover-bg:var(--color-500)}.dark\:hover\:fi-bg-color-600{--dark-hover-bg:var(--color-600)}.dark\:hover\:fi-bg-color-700{--dark-hover-bg:var(--color-700)}.dark\:hover\:fi-bg-color-800{--dark-hover-bg:var(--color-800)}.dark\:hover\:fi-bg-color-900{--dark-hover-bg:var(--color-900)}.dark\:hover\:fi-bg-color-950{--dark-hover-bg:var(--color-950)}.fi-text-color-0{--text:oklch(100% 0 0)}.fi-text-color-50{--text:var(--color-50)}.fi-text-color-100{--text:var(--color-100)}.fi-text-color-200{--text:var(--color-200)}.fi-text-color-300{--text:var(--color-300)}.fi-text-color-400{--text:var(--color-400)}.fi-text-color-500{--text:var(--color-500)}.fi-text-color-600{--text:var(--color-600)}.fi-text-color-700{--text:var(--color-700)}.fi-text-color-800{--text:var(--color-800)}.fi-text-color-900{--text:var(--color-900)}.fi-text-color-950{--text:var(--color-950)}.hover\:fi-text-color-0{--hover-text:oklch(100% 0 0)}.hover\:fi-text-color-50{--hover-text:var(--color-50)}.hover\:fi-text-color-100{--hover-text:var(--color-100)}.hover\:fi-text-color-200{--hover-text:var(--color-200)}.hover\:fi-text-color-300{--hover-text:var(--color-300)}.hover\:fi-text-color-400{--hover-text:var(--color-400)}.hover\:fi-text-color-500{--hover-text:var(--color-500)}.hover\:fi-text-color-600{--hover-text:var(--color-600)}.hover\:fi-text-color-700{--hover-text:var(--color-700)}.hover\:fi-text-color-800{--hover-text:var(--color-800)}.hover\:fi-text-color-900{--hover-text:var(--color-900)}.hover\:fi-text-color-950{--hover-text:var(--color-950)}.dark\:fi-text-color-0{--dark-text:oklch(100% 0 0)}.dark\:fi-text-color-50{--dark-text:var(--color-50)}.dark\:fi-text-color-100{--dark-text:var(--color-100)}.dark\:fi-text-color-200{--dark-text:var(--color-200)}.dark\:fi-text-color-300{--dark-text:var(--color-300)}.dark\:fi-text-color-400{--dark-text:var(--color-400)}.dark\:fi-text-color-500{--dark-text:var(--color-500)}.dark\:fi-text-color-600{--dark-text:var(--color-600)}.dark\:fi-text-color-700{--dark-text:var(--color-700)}.dark\:fi-text-color-800{--dark-text:var(--color-800)}.dark\:fi-text-color-900{--dark-text:var(--color-900)}.dark\:fi-text-color-950{--dark-text:var(--color-950)}.dark\:hover\:fi-text-color-0{--dark-hover-text:oklch(100% 0 0)}.dark\:hover\:fi-text-color-50{--dark-hover-text:var(--color-50)}.dark\:hover\:fi-text-color-100{--dark-hover-text:var(--color-100)}.dark\:hover\:fi-text-color-200{--dark-hover-text:var(--color-200)}.dark\:hover\:fi-text-color-300{--dark-hover-text:var(--color-300)}.dark\:hover\:fi-text-color-400{--dark-hover-text:var(--color-400)}.dark\:hover\:fi-text-color-500{--dark-hover-text:var(--color-500)}.dark\:hover\:fi-text-color-600{--dark-hover-text:var(--color-600)}.dark\:hover\:fi-text-color-700{--dark-hover-text:var(--color-700)}.dark\:hover\:fi-text-color-800{--dark-hover-text:var(--color-800)}.dark\:hover\:fi-text-color-900{--dark-hover-text:var(--color-900)}.dark\:hover\:fi-text-color-950{--dark-hover-text:var(--color-950)}.fi-sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.fi-prose{--prose-color:var(--color-gray-700);--prose-heading-color:var(--color-gray-950);--prose-strong-color:var(--color-gray-950);--prose-link-color:var(--color-gray-950);--prose-code-color:var(--color-gray-950);--prose-marker-color:var(--color-gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-prose{--prose-marker-color:color-mix(in oklab,var(--color-gray-700)25%,transparent)}}.fi-prose{--prose-link-underline-color:var(--color-primary-400);--prose-th-borders:var(--color-gray-300);--prose-td-borders:var(--color-gray-200);--prose-hr-color:var(--color-gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-prose{--prose-hr-color:color-mix(in oklab,var(--color-gray-950)5%,transparent)}}.fi-prose{--prose-blockquote-border-color:var(--color-gray-300);--prose-pre-bg:var(--color-gray-100)}.fi-prose:where(.dark,.dark *){--prose-color:var(--color-gray-300);--prose-heading-color:var(--color-white);--prose-strong-color:var(--color-white);--prose-link-color:var(--color-white);--prose-code-color:var(--color-white);--prose-marker-color:var(--color-gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-prose:where(.dark,.dark *){--prose-marker-color:color-mix(in oklab,var(--color-gray-300)35%,transparent)}}.fi-prose:where(.dark,.dark *){--prose-link-underline-color:var(--color-sky-400);--prose-th-borders:var(--color-gray-600);--prose-td-borders:var(--color-gray-700);--prose-hr-color:oklab(100% 0 5.96046e-8/.1)}@supports (color:color-mix(in lab, red, red)){.fi-prose:where(.dark,.dark *){--prose-hr-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-prose:where(.dark,.dark *){--prose-blockquote-border-color:var(--color-gray-600);--prose-pre-bg:var(--color-gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-prose:where(.dark,.dark *){--prose-pre-bg:color-mix(in oklab,var(--color-gray-900)40%,transparent)}}.fi-prose{color:var(--prose-color);font-size:var(--text-sm);line-height:1.5}.fi-prose img+img{margin-top:0}.fi-prose :where(:not(.fi-not-prose,.fi-not-prose *,br))+:where(:not(.fi-not-prose,.fi-not-prose *,br)){margin-top:calc(var(--spacing)*4)}.fi-prose p br{margin:0}.fi-prose h1:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-xl);letter-spacing:-.025em;color:var(--prose-code-color);line-height:1.55556;font-weight:var(--font-weight-bold)}.fi-prose h2:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-lg);letter-spacing:-.025em;color:var(--prose-code-color);line-height:1.55556;font-weight:var(--font-weight-semibold)}.fi-prose h3:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-base);color:var(--prose-heading-color);line-height:1.55556;font-weight:var(--font-weight-semibold)}.fi-prose h4:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose h5:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose h6:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-sm);color:var(--prose-heading-color);line-height:2;font-weight:var(--font-weight-semibold)}.fi-prose :is(h2,h3,h4,h5,h6):where(:not(.fi-not-prose,.fi-not-prose *)){scroll-margin-top:calc(var(--spacing)*32)}@media (min-width:64rem){.fi-prose :is(h2,h3,h4,h5,h6):where(:not(.fi-not-prose,.fi-not-prose *)){scroll-margin-top:calc(var(--spacing)*18)}}.fi-prose ol:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*6);list-style-type:decimal}.fi-prose ul:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*6);list-style-type:disc}.fi-prose ol li:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose ul li:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*3)}.fi-prose ol li+li:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose ul li+li:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*4)}.fi-prose ol li:where(:not(.fi-not-prose,.fi-not-prose *))::marker{color:var(--prose-marker-color)}.fi-prose ul li:where(:not(.fi-not-prose,.fi-not-prose *))::marker{color:var(--prose-marker-color)}.fi-prose a:not(:where(:is(h2,h3,h4,h5,h6) *)):where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-link-color);font-weight:var(--font-weight-semibold);text-underline-offset:3px;text-decoration:underline;-webkit-text-decoration-color:var(--prose-link-underline-color);-webkit-text-decoration-color:var(--prose-link-underline-color);text-decoration-color:var(--prose-link-underline-color);text-decoration-thickness:1px}.fi-prose a:not(:where(:is(h2,h3,h4,h5,h6) *)):where(:not(.fi-not-prose,.fi-not-prose *)) code{font-weight:var(--font-weight-semibold)}.fi-prose a:hover:where(:not(.fi-not-prose,.fi-not-prose *)){text-decoration-thickness:2px}.fi-prose strong:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-strong-color);font-weight:var(--font-weight-semibold)}.fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)){font-variant-ligatures:none;font-family:var(--font-mono);font-weight:var(--font-weight-medium);color:var(--prose-code-color)}.fi-prose :where(h2,h3,h4,h5,h6) code:where(:not(.fi-not-prose,.fi-not-prose *)){font-weight:var(--font-weight-semibold)}.fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)):before,.fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)):after{content:"`";display:inline}.fi-prose pre:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*4);margin-bottom:calc(var(--spacing)*10);border-radius:var(--radius-lg);padding-top:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*3);background-color:var(--prose-pre-bg);padding-inline-start:calc(var(--spacing)*4)}.fi-prose pre code *+:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:0}.fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)):before,.fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)):after{content:none}.fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)){font-variant-ligatures:none;font-family:var(--font-mono);font-size:var(--text-sm);line-height:2}.fi-prose table:where(:not(.fi-not-prose,.fi-not-prose *)){table-layout:auto;width:100%;font-size:var(--text-sm);margin-top:2em;margin-bottom:2em;line-height:1.4}.fi-prose thead:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:1px;border-bottom-color:var(--prose-th-borders)}.fi-prose thead th:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-heading-color);vertical-align:bottom;padding-inline-end:.6em;padding-bottom:.8em;padding-inline-start:.6em;font-weight:600}.fi-prose thead th:first-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:0}.fi-prose thead th:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:0}.fi-prose tbody tr:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:1px;border-bottom-color:var(--prose-td-borders)}.fi-prose tbody tr:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:0}.fi-prose tbody td:where(:not(.fi-not-prose,.fi-not-prose *)){vertical-align:baseline}.fi-prose tfoot:where(:not(.fi-not-prose,.fi-not-prose *)){border-top-width:1px;border-top-color:var(--prose-th-borders)}.fi-prose tfoot td:where(:not(.fi-not-prose,.fi-not-prose *)){vertical-align:top}.fi-prose tbody td:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose tfoot td:where(:not(.fi-not-prose,.fi-not-prose *)){padding-top:.8em;padding-inline-end:.6em;padding-bottom:.8em;padding-inline-start:.6em}.fi-prose tbody td:first-child:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose tfoot td:first-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:0}.fi-prose tbody td:last-child:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose tfoot td:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:0}.fi-prose th:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose td:where(:not(.fi-not-prose,.fi-not-prose *)){text-align:start}.fi-prose td code:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:.8125rem}.fi-prose hr:where(:not(.fi-not-prose,.fi-not-prose *)){border-color:var(--prose-hr-color);margin-block:calc(var(--spacing)*8)}.fi-prose hr:where(:not(.fi-not-prose,.fi-not-prose *))+h2{margin-top:calc(var(--spacing)*8)}.fi-prose blockquote{border-inline-start-width:.25rem;border-inline-start-color:var(--prose-blockquote-border-color);padding-inline-start:calc(var(--spacing)*4);font-style:italic}.fi-prose blockquote p:first-of-type:before{content:open-quote}.fi-prose blockquote p:last-of-type:after{content:close-quote}.fi-prose figure:where(:not(.fi-not-prose,.fi-not-prose *)) figcaption:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*3);text-align:center;font-size:var(--text-sm);line-height:var(--text-sm--line-height);color:var(--prose-color);font-style:italic}@supports (color:color-mix(in lab, red, red)){.fi-prose figure:where(:not(.fi-not-prose,.fi-not-prose *)) figcaption:where(:not(.fi-not-prose,.fi-not-prose *)){color:color-mix(in oklab,var(--prose-color)75%,transparent)}}.fi-prose :first-child:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:0}.fi-prose :last-child:where(:not(.fi-not-prose,.fi-not-prose *)){margin-bottom:0}.fi-prose .color:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--color)}.fi-prose .color:where(:not(.fi-not-prose,.fi-not-prose *)):where(.dark,.dark *){color:var(--dark-color)}.fi-prose .lead:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-base)}.fi-prose span[data-type=mention]:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose a[data-type=mention]:where(:not(.fi-not-prose,.fi-not-prose *)){font-weight:var(--font-weight-semibold);white-space:nowrap;margin-block:0;display:inline-block}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *)){gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=default]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=default]>.grid-layout-col{grid-column:var(--col-span)}@media (min-width:40rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=sm]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=sm]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:48rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=md]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=md]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:64rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=lg]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=lg]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:80rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=xl]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=xl]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:96rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint="2xl"]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint="2xl"]>.grid-layout-col{grid-column:var(--col-span)}}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))>.grid-layout-col{min-width:0;margin-top:0}}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-ease{syntax:"*";inherits:false}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file diff --git a/public/css/filament/forms/forms.css b/public/css/filament/forms/forms.css index 5c29a134b8..c3ec78f92d 100644 --- a/public/css/filament/forms/forms.css +++ b/public/css/filament/forms/forms.css @@ -1,4 +1,4 @@ -input::-webkit-datetime-edit{display:block;padding:0}.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{inset:0;position:absolute}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;visibility:hidden;width:0}.filepond--data,.filepond--drip{pointer-events:none;position:absolute}.filepond--drip{background:rgba(0,0,0,.01);border-radius:.5em;inset:0;opacity:.1;overflow:hidden}.filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:center center;width:8em}.filepond--drip-blob,.filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;text-decoration:underline;text-decoration-color:#a7a4a4;text-decoration-skip-ink:auto}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";inset:-.75em;position:absolute}.filepond--file-action-button{background-color:#00000080;background-image:none;border-radius:50%;box-shadow:0 0 #fff0;color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{background-color:#00000040;color:#ffffff80}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";inset:0;position:absolute;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;touch-action:none;will-change:transform,opacity;z-index:1}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 0 transparent;transition:box-shadow .125s ease-in-out}.filepond--item[data-drag-state=drag]{cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);overflow-x:hidden;overflow-y:scroll}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:#0000004d;border:.3125em solid transparent;border-radius:99999px}.filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}@media not all and (-webkit-min-device-pixel-ratio:0),not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{background-color:transparent!important;border:none!important;transform-style:preserve-3d}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.filepond--panel-bottom,.filepond--panel-center{backface-visibility:hidden;transform:translate3d(0,.5em,0);transform-origin:left top;will-change:transform}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left;text-rendering:optimizeLegibility}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.175;position:absolute;right:0;text-decoration:none;z-index:3}.filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}.filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{background:transparent;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{left:0;position:absolute;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.filepond--image-preview-overlay-idle{color:#282828d9;mix-blend-mode:multiply}.filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{margin:2.3em auto auto;width:calc(100% - 1.4em)}.filepond--media-preview .playpausebtn{background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;cursor:pointer;float:left;height:25px;margin-right:.3em;margin-top:.3em;outline:none;width:25px}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{background:hsla(0,0%,100%,.3);border-radius:15px;float:left;height:3px;margin-top:1em;width:calc(100% - 2.5em)}.filepond--media-preview .playhead{background:#fff;border-radius:50%;height:13px;margin-top:-5px;width:13px}.filepond--media-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;pointer-events:auto;position:absolute;right:0;top:0}.filepond--media-preview-wrapper:before{background:linear-gradient(180deg,#000 0,transparent);content:" ";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);height:2em;position:absolute;width:100%;z-index:3}.filepond--media-preview{display:block;height:100%;position:relative;transform-origin:center center;width:100%;will-change:transform,opacity;z-index:1}.filepond--media-preview audio,.filepond--media-preview video{width:100%;will-change:transform}.filepond--root{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--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);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);margin-bottom:0}.filepond--root:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2);background-color:hsla(0,0%,100%,.05)}.filepond--root[data-disabled=disabled]{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.filepond--root[data-disabled=disabled]:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1);background-color:transparent}.filepond--panel-root{background-color:transparent}.filepond--drop-label label{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem;padding:.75rem!important}.filepond--drop-label label:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.filepond--label-action{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity));font-weight:500;text-decoration-line:none;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1)}.filepond--label-action:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.filepond--label-action:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.filepond--label-action:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.filepond--drip-blob{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}.filepond--drip-blob:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}.filepond--root[data-style-panel-layout=grid] .filepond--item{display:inline;width:calc(50% - .5rem)}@media (min-width:1024px){.filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.filepond--download-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--download-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--open-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--open-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--file-action-button.filepond--action-edit-item{background-color:rgba(0,0,0,.5)}.cropper-drag-box.cropper-crop.cropper-modal{background-color:rgba(var(--gray-100),.5);opacity:1}.cropper-drag-box.cropper-crop.cropper-modal:is(.dark *){background-color:rgba(var(--gray-900),.8)}.fi-fo-file-upload-circle-cropper .cropper-face,.fi-fo-file-upload-circle-cropper .cropper-view-box{border-radius:50%}.CodeMirror{color:#000;direction:ltr;font-family:monospace;height:300px}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{background-color:#f7f7f7;border-right:1px solid #ddd;white-space:nowrap}.CodeMirror-linenumber{color:#999;min-width:20px;padding:0 3px 0 5px;text-align:right;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;border:0!important;width:auto}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{inset:-50px 0 0;overflow:hidden;position:absolute}.CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;overflow:hidden;position:relative}.CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:0;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.CodeMirror-sizer{border-right:50px solid transparent;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{display:none;outline:0;position:absolute;z-index:6}.CodeMirror-vscrollbar{overflow-x:hidden;overflow-y:scroll;right:0;top:0}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-x:scroll;overflow-y:hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.CodeMirror-gutter-wrapper{background:0 0!important;border:none!important;position:absolute;z-index:4}.CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{word-wrap:normal;-webkit-tap-highlight-color:transparent;background:0 0;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-variant-ligatures:contextual;line-height:inherit;margin:0;overflow:visible;position:relative;white-space:pre;z-index:2}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{inset:0;position:absolute;z-index:0}.CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{display:flex;flex-direction:row;flex-wrap:wrap}.EasyMDEContainer .CodeMirror{word-wrap:break-word;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-sizing:border-box;font:inherit;height:auto;padding:10px;z-index:0}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{background:#fff;border-bottom-right-radius:0!important;border-right:none!important;height:auto;inset:50px 0 0;position:fixed!important;z-index:8}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;border-right:none!important;flex:1 1 auto;position:relative}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative;-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.editor-toolbar.fullscreen{background:#fff;border:0;box-sizing:border-box;height:50px;left:0;opacity:1;padding-bottom:10px;padding-top:10px;position:fixed;top:0;width:100%;z-index:9}.editor-toolbar.fullscreen:before{background:linear-gradient(90deg,#fff 0,hsla(0,0%,100%,0));height:50px;left:0;margin:0;padding:0;position:fixed;top:0;width:20px}.editor-toolbar.fullscreen:after{background:linear-gradient(90deg,hsla(0,0%,100%,0) 0,#fff);height:50px;margin:0;padding:0;position:fixed;right:0;top:0;width:20px}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{background:0 0;border:1px solid transparent;border-radius:3px;cursor:pointer;display:inline-block;height:30px;margin:0;padding:0;text-align:center;text-decoration:none!important}.editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;display:inline-block;margin:0 6px;text-indent:-10px;width:0}.editor-toolbar button:after{font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px;vertical-align:text-bottom}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"\25b2"}.editor-toolbar button.heading-smaller:after{content:"\25bc"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;font-size:12px;padding:8px 10px;text-align:right}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{display:inline-block;margin-left:1em;min-width:4em}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{height:100%;left:0;position:absolute;top:0;width:100%;z-index:7}.editor-preview-full,.editor-preview-side{box-sizing:border-box;display:none;overflow:auto}.editor-preview-side{word-wrap:break-word;border:1px solid #ddd;bottom:0;position:fixed;right:0;top:50px;width:50%;z-index:9}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:1 1 auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{line-height:1.2;margin-bottom:.5rem}.cm-s-easymde .cm-comment{background:rgba(0,0,0,.05);border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown,.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff,#fff 84%,#333 0,#333)}.easymde-dropdown-content{background-color:#f9f9f9;box-shadow:0 8px 16px #0003;display:block;padding:8px;position:absolute;top:30px;visibility:hidden;z-index:2}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{background-image:var(--bg-image);background-repeat:no-repeat;background-size:contain;content:"";display:block;height:0;max-height:100%;max-width:100%;padding-top:var(--height);width:var(--width)}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:rgba(255,0,0,.15)}:root{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.dark{--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.cm-s-easymde .cm-comment{background-color:transparent;color:var(--color-cm-gray-muted)}.EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.dark .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert(100%)}.EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.EasyMDEContainer .cm-s-easymde .cm-operator,.EasyMDEContainer .cm-s-easymde .cm-property{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-string,.EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-bracket{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-list,.EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:1.875rem;line-height:2.25rem}.EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:1.5rem;line-height:2rem}.EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:1.25rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:1.125rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:1rem;line-height:1.5rem}.EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:.875rem;line-height:1.25rem}.EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.EasyMDEContainer .CodeMirror,.EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{background-color:transparent;color:inherit}.EasyMDEContainer .CodeMirror{border-style:none;padding:.375rem .75rem}.EasyMDEContainer .CodeMirror-scroll{height:auto}.EasyMDEContainer .editor-toolbar{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity));border-radius:0;border-width:0 0 1px;-moz-column-gap:.25rem;column-gap:.25rem;display:flex;overflow-x:auto;padding:.5rem .625rem}.EasyMDEContainer .editor-toolbar:is(.dark *){border-color:hsla(0,0%,100%,.1)}.EasyMDEContainer .editor-toolbar button{border-radius:.5rem;border-style:none;cursor:pointer;display:grid;height:2rem;padding:0;place-content:center;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1);width:2rem}.EasyMDEContainer .editor-toolbar button:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button.active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:before{--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity));display:block;height:1rem;width:1rem}.EasyMDEContainer .editor-toolbar button:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:before{content:"";-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.EasyMDEContainer .editor-toolbar button.active:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar .separator{border-style:none;margin:0!important;width:.25rem}.EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M321.1 242.4c19-22.3 30.9-50.8 30.9-82.4 0-70.59-57.42-128-128-128l-192 .01c-17.67 0-32 14.31-32 32s14.33 32 32 32h16v320H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h224c70.58 0 128-57.41 128-128 0-46.71-25.4-87.21-62.9-109.61zM112 96.01h112c35.3 0 64 28.72 64 64s-28.7 64-64 64H112v-128zM256 416H112V288h144c35.3 0 64 28.71 64 63.1S291.3 416 256 416z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M321.1 242.4c19-22.3 30.9-50.8 30.9-82.4 0-70.59-57.42-128-128-128l-192 .01c-17.67 0-32 14.31-32 32s14.33 32 32 32h16v320H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h224c70.58 0 128-57.41 128-128 0-46.71-25.4-87.21-62.9-109.61zM112 96.01h112c35.3 0 64 28.72 64 64s-28.7 64-64 64H112v-128zM256 416H112V288h144c35.3 0 64 28.71 64 63.1S291.3 416 256 416z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M384 64.01c0 17.69-14.31 32-32 32h-58.67l-133.3 320H224c17.69 0 32 14.31 32 32s-14.31 32-32 32H32c-17.69 0-32-14.31-32-32s14.31-32 32-32h58.67l133.3-320H160c-17.69 0-32-14.31-32-32s14.31-32 32-32h192c17.7 0 32 14.32 32 32z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M384 64.01c0 17.69-14.31 32-32 32h-58.67l-133.3 320H224c17.69 0 32 14.31 32 32s-14.31 32-32 32H32c-17.69 0-32-14.31-32-32s14.31-32 32-32h58.67l133.3-320H160c-17.69 0-32-14.31-32-32s14.31-32 32-32h192c17.7 0 32 14.32 32 32z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M332.2 319.9c17.22 12.17 22.33 26.51 18.61 48.21-3.031 17.59-10.88 29.34-24.72 36.99-35.44 19.75-108.5 11.96-186-19.68-16.34-6.686-35.03 1.156-41.72 17.53s1.188 35.05 17.53 41.71c31.75 12.93 95.69 35.37 157.6 35.37 29.62 0 58.81-5.156 83.72-18.96 30.81-17.09 50.44-45.46 56.72-82.11 3.998-23.27 2.168-42.58-3.488-59.05H332.2zm155.8-80-176.5-.03c-15.85-5.614-31.83-10.34-46.7-14.62-85.47-24.62-110.9-39.05-103.7-81.33 2.5-14.53 10.16-25.96 22.72-34.03 20.47-13.15 64.06-23.84 155.4.343 17.09 4.53 34.59-5.654 39.13-22.74 4.531-17.09-5.656-34.59-22.75-39.12-91.31-24.18-160.7-21.62-206.3 7.654C121.8 73.72 103.6 101.1 98.09 133.1c-8.83 51.4 9.81 84.2 39.11 106.8H24c-13.25 0-24 10.75-24 23.1 0 13.25 10.75 23.1 24 23.1h464c13.25 0 24-10.75 24-23.1 0-12.3-10.7-23.1-24-23.1z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M332.2 319.9c17.22 12.17 22.33 26.51 18.61 48.21-3.031 17.59-10.88 29.34-24.72 36.99-35.44 19.75-108.5 11.96-186-19.68-16.34-6.686-35.03 1.156-41.72 17.53s1.188 35.05 17.53 41.71c31.75 12.93 95.69 35.37 157.6 35.37 29.62 0 58.81-5.156 83.72-18.96 30.81-17.09 50.44-45.46 56.72-82.11 3.998-23.27 2.168-42.58-3.488-59.05H332.2zm155.8-80-176.5-.03c-15.85-5.614-31.83-10.34-46.7-14.62-85.47-24.62-110.9-39.05-103.7-81.33 2.5-14.53 10.16-25.96 22.72-34.03 20.47-13.15 64.06-23.84 155.4.343 17.09 4.53 34.59-5.654 39.13-22.74 4.531-17.09-5.656-34.59-22.75-39.12-91.31-24.18-160.7-21.62-206.3 7.654C121.8 73.72 103.6 101.1 98.09 133.1c-8.83 51.4 9.81 84.2 39.11 106.8H24c-13.25 0-24 10.75-24 23.1 0 13.25 10.75 23.1 24 23.1h464c13.25 0 24-10.75 24-23.1 0-12.3-10.7-23.1-24-23.1z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M598.6 41.41C570.1 13.8 534.8 0 498.6 0s-72.36 13.8-99.96 41.41l-43.36 43.36c15.11 8.012 29.47 17.58 41.91 30.02 3.146 3.146 5.898 6.518 8.742 9.838l37.96-37.96C458.5 72.05 477.1 64 498.6 64c20.67 0 40.1 8.047 54.71 22.66 14.61 14.61 22.66 34.04 22.66 54.71s-8.049 40.1-22.66 54.71l-133.3 133.3C405.5 343.1 386 352 365.4 352s-40.1-8.048-54.71-22.66C296 314.7 287.1 295.3 287.1 274.6s8.047-40.1 22.66-54.71l4.44-3.49c-2.1-3.9-4.3-7.9-7.5-11.1-8.6-8.6-19.9-13.3-32.1-13.3-11.93 0-23.1 4.664-31.61 12.97-30.71 53.96-23.63 123.6 22.39 169.6C293 402.2 329.2 416 365.4 416c36.18 0 72.36-13.8 99.96-41.41L598.6 241.3c28.45-28.45 42.24-66.01 41.37-103.3-.87-35.9-14.57-69.84-41.37-96.59zM234 387.4l-37.9 37.9C181.5 439.1 162 448 141.4 448c-20.67 0-40.1-8.047-54.71-22.66-14.61-14.61-22.66-34.04-22.66-54.71s8.049-40.1 22.66-54.71l133.3-133.3C234.5 168 253.1 160 274.6 160s40.1 8.048 54.71 22.66c14.62 14.61 22.66 34.04 22.66 54.71s-8.047 40.1-22.66 54.71l-3.51 3.52c2.094 3.939 4.219 7.895 7.465 11.15C341.9 315.3 353.3 320 365.4 320c11.93 0 23.1-4.664 31.61-12.97 30.71-53.96 23.63-123.6-22.39-169.6C346.1 109.8 310.8 96 274.6 96c-36.2 0-72.3 13.8-99.9 41.4L41.41 270.7C13.81 298.3 0 334.48 0 370.66c0 36.18 13.8 72.36 41.41 99.97C69.01 498.2 105.2 512 141.4 512c36.18 0 72.36-13.8 99.96-41.41l43.36-43.36c-15.11-8.012-29.47-17.58-41.91-30.02-3.21-3.11-5.91-6.51-8.81-9.81z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M598.6 41.41C570.1 13.8 534.8 0 498.6 0s-72.36 13.8-99.96 41.41l-43.36 43.36c15.11 8.012 29.47 17.58 41.91 30.02 3.146 3.146 5.898 6.518 8.742 9.838l37.96-37.96C458.5 72.05 477.1 64 498.6 64c20.67 0 40.1 8.047 54.71 22.66 14.61 14.61 22.66 34.04 22.66 54.71s-8.049 40.1-22.66 54.71l-133.3 133.3C405.5 343.1 386 352 365.4 352s-40.1-8.048-54.71-22.66C296 314.7 287.1 295.3 287.1 274.6s8.047-40.1 22.66-54.71l4.44-3.49c-2.1-3.9-4.3-7.9-7.5-11.1-8.6-8.6-19.9-13.3-32.1-13.3-11.93 0-23.1 4.664-31.61 12.97-30.71 53.96-23.63 123.6 22.39 169.6C293 402.2 329.2 416 365.4 416c36.18 0 72.36-13.8 99.96-41.41L598.6 241.3c28.45-28.45 42.24-66.01 41.37-103.3-.87-35.9-14.57-69.84-41.37-96.59zM234 387.4l-37.9 37.9C181.5 439.1 162 448 141.4 448c-20.67 0-40.1-8.047-54.71-22.66-14.61-14.61-22.66-34.04-22.66-54.71s8.049-40.1 22.66-54.71l133.3-133.3C234.5 168 253.1 160 274.6 160s40.1 8.048 54.71 22.66c14.62 14.61 22.66 34.04 22.66 54.71s-8.047 40.1-22.66 54.71l-3.51 3.52c2.094 3.939 4.219 7.895 7.465 11.15C341.9 315.3 353.3 320 365.4 320c11.93 0 23.1-4.664 31.61-12.97 30.71-53.96 23.63-123.6-22.39-169.6C346.1 109.8 310.8 96 274.6 96c-36.2 0-72.3 13.8-99.9 41.4L41.41 270.7C13.81 298.3 0 334.48 0 370.66c0 36.18 13.8 72.36 41.41 99.97C69.01 498.2 105.2 512 141.4 512c36.18 0 72.36-13.8 99.96-41.41l43.36-43.36c-15.11-8.012-29.47-17.58-41.91-30.02-3.21-3.11-5.91-6.51-8.81-9.81z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M0 64c0-17.7 14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v112h224V96h-16c-17.7 0-32-14.3-32-32s14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v320h16c17.7 0 32 14.3 32 32s-14.3 32-32 32h-96c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V272H112v144h16c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V96H32C14.3 96 0 81.7 0 64z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M0 64c0-17.7 14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v112h224V96h-16c-17.7 0-32-14.3-32-32s14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v320h16c17.7 0 32 14.3 32 32s-14.3 32-32 32h-96c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V272H112v144h16c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V96H32C14.3 96 0 81.7 0 64z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M96 224c-11.28 0-21.95 2.3-32 5.9V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.3-32-32-32C57.42 96 0 153.4 0 224v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96zm256 0c-11.28 0-21.95 2.305-32 5.879V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.33-32-32-32c-70.58 0-128 57.42-128 128v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M96 224c-11.28 0-21.95 2.3-32 5.9V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.3-32-32-32C57.42 96 0 153.4 0 224v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96zm256 0c-11.28 0-21.95 2.305-32 5.879V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.33-32-32-32c-70.58 0-128 57.42-128 128v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M416 31.94C416 21.75 408.1 0 384.1 0c-13.98 0-26.87 9.072-30.89 23.18l-128 448a31.933 31.933 0 0 0-1.241 8.801C223.1 490.3 232 512 256 512c13.92 0 26.73-9.157 30.75-23.22l128-448c.85-2.97 1.25-5.93 1.25-8.84zM176 143.1c0-18.28-14.95-32-32-32-8.188 0-16.38 3.125-22.62 9.376l-112 112C3.125 239.6 0 247.8 0 255.1s3.125 17.3 9.375 23.5l112 112c6.225 6.3 14.425 8.5 22.625 8.5 17.05 0 32-13.73 32-32 0-8.188-3.125-16.38-9.375-22.63L77.25 255.1l89.38-89.38c6.27-5.42 9.37-13.52 9.37-22.62zm464 112c0-8.188-3.125-16.38-9.375-22.63l-112-112C512.4 115.1 504.2 111.1 496 111.1c-17.05 0-32 13.73-32 32 0 8.188 3.125 16.38 9.375 22.63l89.38 89.38-89.38 89.38C467.1 351.6 464 359.8 464 367.1c0 18.28 14.95 32 32 32 8.188 0 16.38-3.125 22.62-9.376l112-112C636.9 272.4 640 264.2 640 255.1z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M416 31.94C416 21.75 408.1 0 384.1 0c-13.98 0-26.87 9.072-30.89 23.18l-128 448a31.933 31.933 0 0 0-1.241 8.801C223.1 490.3 232 512 256 512c13.92 0 26.73-9.157 30.75-23.22l128-448c.85-2.97 1.25-5.93 1.25-8.84zM176 143.1c0-18.28-14.95-32-32-32-8.188 0-16.38 3.125-22.62 9.376l-112 112C3.125 239.6 0 247.8 0 255.1s3.125 17.3 9.375 23.5l112 112c6.225 6.3 14.425 8.5 22.625 8.5 17.05 0 32-13.73 32-32 0-8.188-3.125-16.38-9.375-22.63L77.25 255.1l89.38-89.38c6.27-5.42 9.37-13.52 9.37-22.62zm464 112c0-8.188-3.125-16.38-9.375-22.63l-112-112C512.4 115.1 504.2 111.1 496 111.1c-17.05 0-32 13.73-32 32 0 8.188 3.125 16.38 9.375 22.63l89.38 89.38-89.38 89.38C467.1 351.6 464 359.8 464 367.1c0 18.28 14.95 32 32 32 8.188 0 16.38-3.125 22.62-9.376l112-112C636.9 272.4 640 264.2 640 255.1z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M16 96c0-26.51 21.49-48 48-48s48 21.49 48 48c0 26.5-21.49 48-48 48s-48-21.5-48-48zm464-32c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zM16 416c0-26.5 21.49-48 48-48s48 21.5 48 48-21.49 48-48 48-48-21.5-48-48zm96-160c0 26.5-21.49 48-48 48s-48-21.5-48-48 21.49-48 48-48 48 21.5 48 48z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M16 96c0-26.51 21.49-48 48-48s48 21.49 48 48c0 26.5-21.49 48-48 48s-48-21.5-48-48zm464-32c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zM16 416c0-26.5 21.49-48 48-48s48 21.5 48 48-21.49 48-48 48-48-21.5-48-48zm96-160c0 26.5-21.49 48-48 48s-48-21.5-48-48 21.49-48 48-48 48 21.5 48 48z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M55.1 56.04c0-13.26 11.64-24 24-24h32c14.2 0 24 10.74 24 24V176h16c14.2 0 24 10.8 24 24 0 13.3-9.8 24-24 24h-80c-12.36 0-24-10.7-24-24 0-13.2 11.64-24 24-24h16V80.04h-8c-12.36 0-24-10.75-24-24zm63.6 285.16c-6.6-7.4-18.3-6.9-24.05 1.2l-11.12 15.5c-7.7 10.8-22.69 13.3-33.48 5.6-10.79-7.7-13.28-22.7-5.58-33.4l11.12-15.6c23.74-33.3 72.31-35.7 99.21-4.9 21.3 23.5 20.8 60.9-1.1 84.7L118.8 432H152c13.3 0 24 10.7 24 24s-10.7 24-24 24H64c-9.53 0-18.16-5.6-21.98-14.4-3.83-8.7-2.12-18.9 4.34-25.9l72.04-78c5.3-5.8 5.4-14.6.3-20.5zM512 64c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H256c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M55.1 56.04c0-13.26 11.64-24 24-24h32c14.2 0 24 10.74 24 24V176h16c14.2 0 24 10.8 24 24 0 13.3-9.8 24-24 24h-80c-12.36 0-24-10.7-24-24 0-13.2 11.64-24 24-24h16V80.04h-8c-12.36 0-24-10.75-24-24zm63.6 285.16c-6.6-7.4-18.3-6.9-24.05 1.2l-11.12 15.5c-7.7 10.8-22.69 13.3-33.48 5.6-10.79-7.7-13.28-22.7-5.58-33.4l11.12-15.6c23.74-33.3 72.31-35.7 99.21-4.9 21.3 23.5 20.8 60.9-1.1 84.7L118.8 432H152c13.3 0 24 10.7 24 24s-10.7 24-24 24H64c-9.53 0-18.16-5.6-21.98-14.4-3.83-8.7-2.12-18.9 4.34-25.9l72.04-78c5.3-5.8 5.4-14.6.3-20.5zM512 64c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H256c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1792 1792'%3E%3Cpath d='M576 1376v-192q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V800q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zM576 608V416q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm-512-768V416q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V416q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm128-320v1088q0 66-47 113t-113 47H224q-66 0-113-47t-47-113V288q0-66 47-113t113-47h1344q66 0 113 47t47 113z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1792 1792'%3E%3Cpath d='M576 1376v-192q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V800q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zM576 608V416q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm-512-768V416q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V416q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm128-320v1088q0 66-47 113t-113 47H224q-66 0-113-47t-47-113V288q0-66 47-113t113-47h1344q66 0 113 47t47 113z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M447.1 32h-484C28.64 32-.01 60.65-.01 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96c.01-35.35-27.79-64-63.99-64zm-336 64c26.51 0 48 21.49 48 48s-20.6 48-48 48-48-21.49-48-48 22.38-48 48-48zm335 311.6c-2.8 5.2-8.2 8.4-14.1 8.4H82.01a15.993 15.993 0 0 1-14.26-8.75 16 16 0 0 1 1.334-16.68l70-96C142.1 290.4 146.9 288 152 288s9.916 2.441 12.93 6.574l32.46 44.51 93.3-139.1C293.7 194.7 298.7 192 304 192s10.35 2.672 13.31 7.125l128 192c3.29 4.875 3.59 11.175.79 16.475z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M447.1 32h-484C28.64 32-.01 60.65-.01 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96c.01-35.35-27.79-64-63.99-64zm-336 64c26.51 0 48 21.49 48 48s-20.6 48-48 48-48-21.49-48-48 22.38-48 48-48zm335 311.6c-2.8 5.2-8.2 8.4-14.1 8.4H82.01a15.993 15.993 0 0 1-14.26-8.75 16 16 0 0 1 1.334-16.68l70-96C142.1 290.4 146.9 288 152 288s9.916 2.441 12.93 6.574l32.46 44.51 93.3-139.1C293.7 194.7 298.7 192 304 192s10.35 2.672 13.31 7.125l128 192c3.29 4.875 3.59 11.175.79 16.475z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M480 256c0 123.4-100.5 223.9-223.9 223.9-48.84 0-95.17-15.58-134.2-44.86-14.12-10.59-16.97-30.66-6.375-44.81 10.59-14.12 30.62-16.94 44.81-6.375 27.84 20.91 61 31.94 95.88 31.94C344.3 415.8 416 344.1 416 256S344.31 96.2 256.2 96.2c-37.46 0-73.09 13.49-101.3 36.64l45.12 45.14c17.01 17.02 4.955 46.1-19.1 46.1H35.17C24.58 224.1 16 215.5 16 204.9V59.04C16 35 45.07 22.96 62.07 39.97l47.6 47.63C149.9 52.71 201.5 32.11 256.1 32.11 379.5 32.11 480 132.6 480 256z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M480 256c0 123.4-100.5 223.9-223.9 223.9-48.84 0-95.17-15.58-134.2-44.86-14.12-10.59-16.97-30.66-6.375-44.81 10.59-14.12 30.62-16.94 44.81-6.375 27.84 20.91 61 31.94 95.88 31.94C344.3 415.8 416 344.1 416 256S344.31 96.2 256.2 96.2c-37.46 0-73.09 13.49-101.3 36.64l45.12 45.14c17.01 17.02 4.955 46.1-19.1 46.1H35.17C24.58 224.1 16 215.5 16 204.9V59.04C16 35 45.07 22.96 62.07 39.97l47.6 47.63C149.9 52.71 201.5 32.11 256.1 32.11 379.5 32.11 480 132.6 480 256z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M468.9 32.11c13.87 0 27.18 10.77 27.18 27.04v145.9c0 10.59-8.584 19.17-19.17 19.17h-145.7c-16.28 0-27.06-13.32-27.06-27.2 0-6.634 2.461-13.4 7.96-18.9l45.12-45.14c-28.22-23.14-63.85-36.64-101.3-36.64-88.09 0-159.8 71.69-159.8 159.8S167.8 415.9 255.9 415.9c73.14 0 89.44-38.31 115.1-38.31 18.48 0 31.97 15.04 31.97 31.96 0 35.04-81.59 70.41-147 70.41-123.4 0-223.9-100.5-223.9-223.9S132.6 32.44 256 32.44c54.6 0 106.2 20.39 146.4 55.26L450 40.07c5.5-5.5 12.3-7.96 18.9-7.96z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M468.9 32.11c13.87 0 27.18 10.77 27.18 27.04v145.9c0 10.59-8.584 19.17-19.17 19.17h-145.7c-16.28 0-27.06-13.32-27.06-27.2 0-6.634 2.461-13.4 7.96-18.9l45.12-45.14c-28.22-23.14-63.85-36.64-101.3-36.64-88.09 0-159.8 71.69-159.8 159.8S167.8 415.9 255.9 415.9c73.14 0 89.44-38.31 115.1-38.31 18.48 0 31.97 15.04 31.97 31.96 0 35.04-81.59 70.41-147 70.41-123.4 0-223.9-100.5-223.9-223.9S132.6 32.44 256 32.44c54.6 0 106.2 20.39 146.4 55.26L450 40.07c5.5-5.5 12.3-7.96 18.9-7.96z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-statusbar{display:none}.fi-fo-rich-editor trix-toolbar .trix-dialogs{position:relative}.fi-fo-rich-editor trix-toolbar .trix-dialog{--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgba(var(--gray-50),var(--tw-bg-opacity));border-radius:.5rem;bottom:auto;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);left:0;padding:.5rem;position:absolute;right:0;top:1rem}.fi-fo-rich-editor trix-toolbar .trix-dialog:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields{display:flex;flex-direction:column;gap:.5rem;width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group{display:flex;gap:.5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{--tw-bg-opacity:1;--tw-text-opacity:1;--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);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-style:none;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--gray-950),var(--tw-text-opacity));display:block;font-size:.875rem;line-height:1.25rem;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:.75rem;padding-top:.375rem;padding-inline-start:.75rem;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1);width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:hsla(0,0%,100%,.2);background-color:rgba(var(--gray-700),var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}@media (min-width:640px){.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{font-size:.875rem;line-height:1.5rem}}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button{--tw-bg-opacity:1;--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);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity));background-color:rgba(var(--gray-50),var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.75rem;line-height:1rem;padding:.125rem .5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button:is(.dark *){--tw-bg-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-600),var(--tw-ring-opacity));background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.fi-fo-rich-editor trix-editor:empty:before{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-editor:empty:is(.dark *):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-editor:empty:before{content:attr(placeholder)}.fi-fo-rich-editor trix-editor.prose :where(ol):not(:where([class~=not-prose] *)),.fi-fo-rich-editor trix-editor.prose :where(ul):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:1.625em!important}.fi-fo-rich-editor trix-editor.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:.375em!important}select:not(.choices){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E")}[dir=rtl] select{background-position:left .5rem center!important}.choices{outline:2px solid transparent;outline-offset:2px;position:relative}.choices [hidden]{display:none!important}.choices[data-type*=select-one] .has-no-choices{display:none}.choices[data-type*=select-one] .choices__input{display:block;margin:0;width:100%}.choices__inner{background-repeat:no-repeat;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:2rem;padding-top:.375rem;padding-inline-start:.75rem}@media (min-width:640px){.choices__inner{font-size:.875rem;line-height:1.5rem}}.choices__inner{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-size:1.5em 1.5em}.choices.is-disabled .choices__inner{cursor:default}[dir=rtl] .choices__inner{background-position:left .5rem center}.choices__list--single{display:inline-block}.choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity))}.choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices.is-disabled .choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices.is-disabled .choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__list--multiple{display:flex;flex-wrap:wrap;gap:.375rem}.choices__list--multiple:not(:empty){margin-bottom:.25rem;margin-left:-.25rem;margin-right:-.25rem;padding-bottom:.125rem;padding-top:.125rem}.choices__list--multiple .choices__item{--tw-bg-opacity:1;--tw-text-opacity:1;--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);--tw-ring-inset:inset;--tw-ring-color:rgba(var(--primary-600),0.1);align-items:center;background-color:rgba(var(--primary-50),var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--primary-600),var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;gap:.25rem;line-height:1rem;padding:.25rem .5rem;word-break:break-all}.choices__list--multiple .choices__item:is(.dark *){--tw-text-opacity:1;--tw-ring-color:rgba(var(--primary-400),0.3);background-color:rgba(var(--primary-400),.1);color:rgba(var(--primary-400),var(--tw-text-opacity))}.choices__list--dropdown,.choices__list[aria-expanded]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--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);--tw-ring-color:rgba(var(--gray-950),0.05);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:none;font-size:.875rem;line-height:1.25rem;margin-top:.5rem;overflow:hidden;overflow-wrap:break-word;position:absolute;top:100%;width:100%;will-change:visibility;z-index:10}.choices__list--dropdown:is(.dark *),.choices__list[aria-expanded]:is(.dark *){--tw-bg-opacity:1;--tw-ring-color:hsla(0,0%,100%,.1);background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.is-active.choices__list--dropdown,.is-active.choices__list[aria-expanded]{display:block;padding:.25rem}.choices__list--dropdown .choices__list,.choices__list[aria-expanded] .choices__list{max-height:15rem;overflow:auto;will-change:scroll-position}.choices__item--choice{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity));padding:.5rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__item--choice:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__item--choice.choices__item--selectable{--tw-text-opacity:1;border-radius:.375rem;color:rgba(var(--gray-950),var(--tw-text-opacity))}.choices__item--choice.choices__item--selectable:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices__list--dropdown .choices__item--selectable.is-highlighted,.choices__list[aria-expanded] .choices__item--selectable.is-highlighted{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *),.choices__list[aria-expanded] .choices__item--selectable.is-highlighted:is(.dark *){background-color:hsla(0,0%,100%,.05)}.choices__item{cursor:default}.choices__item--disabled{pointer-events:none}.choices__item--disabled:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__item--disabled:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices.is-disabled .choices__placeholder.choices__item,.choices__placeholder.choices__item{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity));cursor:default}.choices.is-disabled .choices__placeholder.choices__item:is(.dark *),.choices__placeholder.choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__button{background-color:transparent;background-position:50%;background-repeat:no-repeat;border-width:0;outline:2px solid transparent;outline-offset:2px;text-indent:-9999px}.choices[data-type*=select-one] .choices__button{height:1rem;inset-inline-end:0;margin-inline-end:2.25rem;opacity:.5;padding:0;position:absolute;transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.choices[data-type*=select-one] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em;top:calc(50% - .5714em)}.dark .choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button{height:1rem;opacity:.5;width:1rem}.choices[data-type*=select-multiple] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em}.dark .choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button:focus-visible,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus-visible,.choices[data-type*=select-one] .choices__button:hover{opacity:.7}.choices[data-type*=select-multiple] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-multiple] .choices__button:hover:is(.dark *),.choices[data-type*=select-one] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-one] .choices__button:hover:is(.dark *){opacity:.6}.choices.is-disabled .choices__button,.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices__input{--tw-text-opacity:1;background-color:transparent!important;border-style:none;color:rgba(var(--gray-950),var(--tw-text-opacity));font-size:1rem!important;line-height:1.5rem!important;padding:0!important;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1)}.choices__input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__input:focus-visible{--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(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}.choices__input:disabled{--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-500),1);color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices__input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:disabled:is(.dark *){--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-400),1);color:rgba(var(--gray-400),var(--tw-text-opacity))}@media (min-width:640px){.choices__input{font-size:.875rem!important;line-height:1.5rem}}.choices__list--dropdown .choices__input{padding:.5rem!important}.choices__input::-webkit-search-cancel-button,.choices__input::-webkit-search-decoration,.choices__input::-webkit-search-results-button,.choices__input::-webkit-search-results-decoration{display:none}.choices__input::-ms-clear,.choices__input::-ms-reveal{display:none;height:0;width:0}.choices__group{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity));padding:1rem .5rem .5rem}.choices__group:first-child{padding-top:.5rem}.choices__group:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.webkit-calendar-picker-indicator\:opacity-0::-webkit-calendar-picker-indicator{opacity:0}/*! Bundled license information: +input::-webkit-datetime-edit{display:block;padding:0}.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{inset:0;position:absolute}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;visibility:hidden;width:0}.filepond--data,.filepond--drip{pointer-events:none;position:absolute}.filepond--drip{background:#00000003;border-radius:.5em;inset:0;opacity:.1;overflow:hidden}.filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:center center;width:8em}.filepond--drip-blob,.filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;text-decoration:underline;text-decoration-color:#a7a4a4;text-decoration-skip-ink:auto}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";inset:-.75em;position:absolute}.filepond--file-action-button{background-color:#00000080;background-image:none;border-radius:50%;box-shadow:0 0 #fff0;color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{background-color:#00000040;color:#ffffff80}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";inset:0;position:absolute;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;touch-action:auto;will-change:transform,opacity;z-index:1}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 0 transparent;transition:box-shadow .125s ease-in-out}.filepond--item[data-drag-state=drag]{cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);overflow-x:hidden;overflow-y:scroll}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:#0000004d;border:.3125em solid transparent;border-radius:99999px}.filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}@media not all and (-webkit-min-device-pixel-ratio:0),not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{background-color:transparent!important;border:none!important;transform-style:preserve-3d}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.filepond--panel-bottom,.filepond--panel-center{backface-visibility:hidden;transform:translate3d(0,.5em,0);transform-origin:left top;will-change:transform}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left;text-rendering:optimizeLegibility}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.4;position:absolute;right:0;text-decoration:none;z-index:3}.filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}.filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{background:transparent;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{left:0;position:absolute;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.filepond--image-preview-overlay-idle{color:#282828d9;mix-blend-mode:multiply}.filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{background:#00000003;border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{margin:2.3em auto auto;width:calc(100% - 1.4em)}.filepond--media-preview .playpausebtn{background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;cursor:pointer;float:left;height:25px;margin-right:.3em;margin-top:.3em;outline:none;width:25px}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{background:#ffffff4d;border-radius:15px;float:left;height:3px;margin-top:1em;width:calc(100% - 2.5em)}.filepond--media-preview .playhead{background:#fff;border-radius:50%;height:13px;margin-top:-5px;width:13px}.filepond--media-preview-wrapper{background:#00000003;border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;pointer-events:auto;position:absolute;right:0;top:0}.filepond--media-preview-wrapper:before{background:linear-gradient(180deg,#000,#0000);content:" ";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);height:2em;position:absolute;width:100%;z-index:3}.filepond--media-preview{display:block;height:100%;position:relative;transform-origin:center center;width:100%;will-change:transform,opacity;z-index:1}.filepond--media-preview audio,.filepond--media-preview video{width:100%;will-change:transform}.filepond--root{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--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);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);margin-bottom:0}.filepond--root:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2);background-color:hsla(0,0%,100%,.05)}.filepond--root[data-disabled=disabled]{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.filepond--root[data-disabled=disabled]:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1);background-color:transparent}.filepond--panel-root{background-color:transparent}.filepond--drop-label label{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity,1));font-size:.875rem;line-height:1.25rem;padding:.75rem!important}.filepond--drop-label label:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.filepond--label-action{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity,1));font-weight:500;text-decoration-line:none;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1)}.filepond--label-action:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity,1))}.filepond--label-action:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.filepond--label-action:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity,1))}.filepond--drip-blob{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity,1))}.filepond--drip-blob:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity,1))}.filepond--root[data-style-panel-layout=grid] .filepond--item{display:inline;width:calc(50% - .5rem)}@media (min-width:1024px){.filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.filepond--download-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--download-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--open-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--open-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--file-action-button.filepond--action-edit-item{background-color:rgba(0,0,0,.5)}.cropper-drag-box.cropper-crop.cropper-modal{background-color:rgba(var(--gray-100),.5);opacity:1}.cropper-drag-box.cropper-crop.cropper-modal:is(.dark *){background-color:rgba(var(--gray-900),.8)}.fi-fo-file-upload-circle-cropper .cropper-face,.fi-fo-file-upload-circle-cropper .cropper-view-box{border-radius:50%}.CodeMirror{color:#000;direction:ltr;font-family:monospace;height:300px}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{background-color:#f7f7f7;border-right:1px solid #ddd;white-space:nowrap}.CodeMirror-linenumber{color:#999;min-width:20px;padding:0 3px 0 5px;text-align:right;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;border:0!important;width:auto}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{inset:-50px 0 0;overflow:hidden;position:absolute}.CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:#ff96004d}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;overflow:hidden;position:relative}.CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:0;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.CodeMirror-sizer{border-right:50px solid transparent;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{display:none;outline:0;position:absolute;z-index:6}.CodeMirror-vscrollbar{overflow-x:hidden;overflow-y:scroll;right:0;top:0}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-x:scroll;overflow-y:hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.CodeMirror-gutter-wrapper{background:0 0!important;border:none!important;position:absolute;z-index:4}.CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{word-wrap:normal;-webkit-tap-highlight-color:transparent;background:0 0;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-variant-ligatures:contextual;line-height:inherit;margin:0;overflow:visible;position:relative;white-space:pre;z-index:2}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{inset:0;position:absolute;z-index:0}.CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{display:flex;flex-direction:row;flex-wrap:wrap}.EasyMDEContainer .CodeMirror{word-wrap:break-word;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-sizing:border-box;font:inherit;height:auto;padding:10px;z-index:0}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{background:#fff;border-bottom-right-radius:0!important;border-right:none!important;height:auto;inset:50px 0 0;position:fixed!important;z-index:8}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;border-right:none!important;flex:1 1 auto;position:relative}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative;-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.editor-toolbar.fullscreen{background:#fff;border:0;box-sizing:border-box;height:50px;left:0;opacity:1;padding-bottom:10px;padding-top:10px;position:fixed;top:0;width:100%;z-index:9}.editor-toolbar.fullscreen:before{background:linear-gradient(90deg,#fff 0,#fff0);height:50px;left:0;margin:0;padding:0;position:fixed;top:0;width:20px}.editor-toolbar.fullscreen:after{background:linear-gradient(90deg,#fff0 0,#fff);height:50px;margin:0;padding:0;position:fixed;right:0;top:0;width:20px}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{background:0 0;border:1px solid transparent;border-radius:3px;cursor:pointer;display:inline-block;height:30px;margin:0;padding:0;text-align:center;text-decoration:none!important}.editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;display:inline-block;margin:0 6px;text-indent:-10px;width:0}.editor-toolbar button:after{font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px;vertical-align:text-bottom}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"\25b2"}.editor-toolbar button.heading-smaller:after{content:"\25bc"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;font-size:12px;padding:8px 10px;text-align:right}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{display:inline-block;margin-left:1em;min-width:4em}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{height:100%;left:0;position:absolute;top:0;width:100%;z-index:7}.editor-preview-full,.editor-preview-side{box-sizing:border-box;display:none;overflow:auto}.editor-preview-side{word-wrap:break-word;border:1px solid #ddd;bottom:0;position:fixed;right:0;top:50px;width:50%;z-index:9}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:1 1 auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{line-height:1.2;margin-bottom:.5rem}.cm-s-easymde .cm-comment{background:#0000000d;border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown,.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%)}.easymde-dropdown-content{background-color:#f9f9f9;box-shadow:0 8px 16px #0003;display:block;padding:8px;position:absolute;top:30px;visibility:hidden;z-index:2}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{background-image:var(--bg-image);background-repeat:no-repeat;background-size:contain;content:"";display:block;height:0;max-height:100%;max-width:100%;padding-top:var(--height);width:var(--width)}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:#ff000026}:root{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.dark{--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.cm-s-easymde .cm-comment{background-color:transparent;color:var(--color-cm-gray-muted)}.EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.dark .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert(100%)}.EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.EasyMDEContainer .cm-s-easymde .cm-operator,.EasyMDEContainer .cm-s-easymde .cm-property{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-string,.EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-bracket{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-list,.EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:1.875rem;line-height:2.25rem}.EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:1.5rem;line-height:2rem}.EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:1.25rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:1.125rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:1rem;line-height:1.5rem}.EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:.875rem;line-height:1.25rem}.EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.EasyMDEContainer .CodeMirror,.EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{background-color:transparent;color:inherit}.EasyMDEContainer .CodeMirror{border-style:none;padding:.375rem .75rem}.EasyMDEContainer .CodeMirror-scroll{height:auto}.EasyMDEContainer .editor-toolbar{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity,1));border-radius:0;border-width:0 0 1px;-moz-column-gap:.25rem;column-gap:.25rem;display:flex;overflow-x:auto;padding:.5rem .625rem}.EasyMDEContainer .editor-toolbar:is(.dark *){border-color:hsla(0,0%,100%,.1)}.EasyMDEContainer .editor-toolbar button{border-radius:.5rem;border-style:none;cursor:pointer;display:grid;height:2rem;padding:0;place-content:center;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1);width:2rem}.EasyMDEContainer .editor-toolbar button:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button.active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:before{--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity,1));display:block;height:1.25rem;width:1.25rem}.EasyMDEContainer .editor-toolbar button:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button:before{content:"";-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.EasyMDEContainer .editor-toolbar button.active:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar .separator{border-style:none;margin:0!important;width:.25rem}.EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06Zm-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06Zm-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3Zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3Zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-statusbar{display:none}.fi-fo-rich-editor trix-toolbar .trix-dialogs{position:relative}.fi-fo-rich-editor trix-toolbar .trix-dialog{--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1));border-radius:.5rem;bottom:auto;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);left:0;padding:.5rem;position:absolute;right:0;top:1rem}.fi-fo-rich-editor trix-toolbar .trix-dialog:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields{display:flex;flex-direction:column;gap:.5rem;width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group{display:flex;gap:.5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{--tw-bg-opacity:1;--tw-text-opacity:1;--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);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.375rem;border-style:none;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--gray-950),var(--tw-text-opacity,1));display:block;font-size:.875rem;line-height:1.25rem;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:.75rem;padding-top:.375rem;padding-inline-start:.75rem;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1);width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:hsla(0,0%,100%,.2);background-color:rgba(var(--gray-700),var(--tw-bg-opacity,1));color:rgb(255 255 255/var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity,1))}@media (min-width:640px){.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{font-size:.875rem;line-height:1.5rem}}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button{--tw-bg-opacity:1;--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);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity,1));background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.75rem;line-height:1rem;padding:.125rem .5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button:is(.dark *){--tw-bg-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-600),var(--tw-ring-opacity,1));background-color:rgba(var(--gray-700),var(--tw-bg-opacity,1))}.fi-fo-rich-editor trix-editor:empty:before{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-editor:empty:is(.dark *):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-editor:empty:before{content:attr(placeholder)}.fi-fo-rich-editor trix-editor.prose :where(ol):not(:where([class~=not-prose] *)),.fi-fo-rich-editor trix-editor.prose :where(ul):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:1.625em!important}.fi-fo-rich-editor trix-editor.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:.375em!important}select:not(.choices){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E")}[dir=rtl] select{background-position:left .5rem center!important}.choices{outline:2px solid transparent;outline-offset:2px;position:relative}.choices [hidden]{display:none!important}.choices[data-type*=select-one] .has-no-choices{display:none}.choices[data-type*=select-one] .choices__input{display:block;margin:0;width:100%}.choices__inner{background-repeat:no-repeat;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:2rem;padding-top:.375rem;padding-inline-start:.75rem}@media (min-width:640px){.choices__inner{font-size:.875rem;line-height:1.5rem}}.choices__inner{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-size:1.5em 1.5em;&:has(.choices__button){padding-inline-end:3.5rem}}.choices.is-disabled .choices__inner{cursor:default}[dir=rtl] .choices__inner{background-position:left .5rem center}.choices__list--single{display:inline-block}.choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity,1))}.choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.choices.is-disabled .choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices.is-disabled .choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__list--multiple{display:flex;flex-wrap:wrap;gap:.375rem}.choices__list--multiple:not(:empty){margin-bottom:.25rem;margin-left:-.25rem;margin-right:-.25rem;padding-bottom:.125rem;padding-top:.125rem}.choices__list--multiple .choices__item{--tw-bg-opacity:1;--tw-text-opacity:1;--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);--tw-ring-inset:inset;--tw-ring-color:rgba(var(--primary-600),0.1);align-items:center;background-color:rgba(var(--primary-50),var(--tw-bg-opacity,1));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--primary-600),var(--tw-text-opacity,1));display:inline-flex;font-size:.75rem;font-weight:500;gap:.25rem;line-height:1rem;padding:.25rem .5rem;word-break:break-all}.choices__list--multiple .choices__item:is(.dark *){--tw-text-opacity:1;--tw-ring-color:rgba(var(--primary-400),0.3);background-color:rgba(var(--primary-400),.1);color:rgba(var(--primary-400),var(--tw-text-opacity,1))}.choices__list--dropdown,.choices__list[aria-expanded]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--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);--tw-ring-color:rgba(var(--gray-950),0.05);background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:none;font-size:.875rem;line-height:1.25rem;margin-top:.5rem;overflow:hidden;overflow-wrap:break-word;position:absolute;top:100%;width:100%;will-change:visibility;z-index:10}.choices__list--dropdown:is(.dark *),.choices__list[aria-expanded]:is(.dark *){--tw-bg-opacity:1;--tw-ring-color:hsla(0,0%,100%,.1);background-color:rgba(var(--gray-900),var(--tw-bg-opacity,1))}.is-active.choices__list--dropdown,.is-active.choices__list[aria-expanded]{display:block;padding:.25rem}.choices__list--dropdown .choices__list,.choices__list[aria-expanded] .choices__list{max-height:15rem;overflow:auto;will-change:scroll-position}.choices__item--choice{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1));padding:.5rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__item--choice:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__item--choice.choices__item--selectable{--tw-text-opacity:1;border-radius:.375rem;color:rgba(var(--gray-950),var(--tw-text-opacity,1))}.choices__item--choice.choices__item--selectable:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.choices__list--dropdown .choices__item--selectable.is-highlighted,.choices__list[aria-expanded] .choices__item--selectable.is-highlighted{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *),.choices__list[aria-expanded] .choices__item--selectable.is-highlighted:is(.dark *){background-color:hsla(0,0%,100%,.05)}.choices__item{cursor:default}.choices__item--disabled{pointer-events:none}.choices__item--disabled:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__item--disabled:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices.is-disabled .choices__placeholder.choices__item,.choices__placeholder.choices__item{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1));cursor:default}.choices.is-disabled .choices__placeholder.choices__item:is(.dark *),.choices__placeholder.choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__button{background-color:transparent;background-position:50%;background-repeat:no-repeat;border-width:0;outline:2px solid transparent;outline-offset:2px;text-indent:-9999px}.choices[data-type*=select-one] .choices__button{height:1rem;inset-inline-end:0;margin-inline-end:2.25rem;opacity:.5;padding:0;position:absolute;transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.choices[data-type*=select-one] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em;top:calc(50% - .5714em)}.dark .choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button{height:1rem;opacity:.5;width:1rem}.choices[data-type*=select-multiple] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em}.dark .choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button:focus-visible,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus-visible,.choices[data-type*=select-one] .choices__button:hover{opacity:.7}.choices[data-type*=select-multiple] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-multiple] .choices__button:hover:is(.dark *),.choices[data-type*=select-one] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-one] .choices__button:hover:is(.dark *){opacity:.6}.choices.is-disabled .choices__button,.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices__input{--tw-text-opacity:1;background-color:transparent!important;border-style:none;color:rgba(var(--gray-950),var(--tw-text-opacity,1));font-size:1rem!important;line-height:1.5rem!important;padding:0!important;transition-duration:75ms;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:cubic-bezier(.4,0,.2,1)}.choices__input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__input:focus-visible{--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(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}.choices__input:disabled{--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-500),1);color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__input:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.choices__input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__input:disabled:is(.dark *){--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-400),1);color:rgba(var(--gray-400),var(--tw-text-opacity,1))}@media (min-width:640px){.choices__input{font-size:.875rem!important;line-height:1.5rem}}.choices__list--dropdown .choices__input{padding:.5rem!important}.choices__input::-webkit-search-cancel-button,.choices__input::-webkit-search-decoration,.choices__input::-webkit-search-results-button,.choices__input::-webkit-search-results-decoration{display:none}.choices__input::-ms-clear,.choices__input::-ms-reveal{display:none;height:0;width:0}.choices__group{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1));padding:1rem .5rem .5rem}.choices__group:first-child{padding-top:.5rem}.choices__group:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.webkit-calendar-picker-indicator\:opacity-0::-webkit-calendar-picker-indicator{opacity:0}/*! Bundled license information: cropperjs/dist/cropper.min.css: (*! @@ -13,7 +13,7 @@ cropperjs/dist/cropper.min.css: filepond/dist/filepond.min.css: (*! - * FilePond 4.31.4 + * FilePond 4.32.7 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) diff --git a/public/fonts/filament/filament/inter/index.css b/public/fonts/filament/filament/inter/index.css new file mode 100644 index 0000000000..425213ef45 --- /dev/null +++ b/public/fonts/filament/filament/inter/index.css @@ -0,0 +1 @@ +@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-cyrillic-ext-wght-normal-IYF56FF6.woff2") format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-cyrillic-wght-normal-JEOLYBOO.woff2") format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-greek-ext-wght-normal-EOVOK2B5.woff2") format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-greek-wght-normal-IRE366VL.woff2") format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-vietnamese-wght-normal-CE5GGD3W.woff2") format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-latin-ext-wght-normal-HA22NDSG.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-latin-wght-normal-NRMW37G5.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD} diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2 new file mode 100644 index 0000000000..0ba164bb6d Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 new file mode 100644 index 0000000000..de83a9c741 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2 new file mode 100644 index 0000000000..a61a0be57f Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2 new file mode 100644 index 0000000000..83a6f10f22 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2 new file mode 100644 index 0000000000..d750914763 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2 new file mode 100644 index 0000000000..b655a43884 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-7GGTF7EK.woff2 b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-7GGTF7EK.woff2 new file mode 100644 index 0000000000..cf56a71f10 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-7GGTF7EK.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-EOVOK2B5.woff2 b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-EOVOK2B5.woff2 new file mode 100644 index 0000000000..6e7141f886 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-EOVOK2B5.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-ZEVLMORV.woff2 b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-ZEVLMORV.woff2 new file mode 100644 index 0000000000..9117b5b040 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-ZEVLMORV.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2 b/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2 new file mode 100644 index 0000000000..eb38b38ea0 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2 b/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2 new file mode 100644 index 0000000000..024f077032 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2 b/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2 new file mode 100644 index 0000000000..907b4a4d7a Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-5SRY4DMZ.woff2 b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-5SRY4DMZ.woff2 new file mode 100644 index 0000000000..887153b816 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-5SRY4DMZ.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-GZCIV3NH.woff2 b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-GZCIV3NH.woff2 new file mode 100644 index 0000000000..3df865d7f0 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-GZCIV3NH.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-HA22NDSG.woff2 b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-HA22NDSG.woff2 new file mode 100644 index 0000000000..479d010d29 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-HA22NDSG.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2 b/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2 new file mode 100644 index 0000000000..d15208de03 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2 b/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2 new file mode 100644 index 0000000000..798d6d9f6c Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2 b/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2 new file mode 100644 index 0000000000..40255432a3 Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-CE5GGD3W.woff2 b/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-CE5GGD3W.woff2 new file mode 100644 index 0000000000..a40c4699cb Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-CE5GGD3W.woff2 differ diff --git a/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-TWG5UU7E.woff2 b/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-TWG5UU7E.woff2 new file mode 100644 index 0000000000..ce21ca172e Binary files /dev/null and b/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-TWG5UU7E.woff2 differ diff --git a/public/index.php b/public/index.php index 947d98963f..ee8f07e993 100644 --- a/public/index.php +++ b/public/index.php @@ -1,5 +1,6 @@ handleRequest(Request::capture()); +/** @var Application $app */ +$app = require_once __DIR__.'/../bootstrap/app.php'; + +$app->handleRequest(Request::capture()); diff --git a/public/js/autocomplete.js b/public/js/autocomplete.js deleted file mode 100644 index 15c43797ef..0000000000 --- a/public/js/autocomplete.js +++ /dev/null @@ -1,6 +0,0 @@ -// Hacky fix for browsers ignoring autocomplete="off" -$(document).ready(function() { - $('.form-autocomplete-stop').on('click', function () { - $(this).removeAttr('readonly').blur().focus(); - }); -}); diff --git a/public/js/filament-monaco-editor/filament-monaco-editor-scripts.js b/public/js/filament-monaco-editor/filament-monaco-editor-scripts.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/public/js/filament/actions/actions.js b/public/js/filament/actions/actions.js new file mode 100644 index 0000000000..30e2d00133 --- /dev/null +++ b/public/js/filament/actions/actions.js @@ -0,0 +1 @@ +(()=>{var n=({livewireId:e})=>({actionNestingIndex:null,init(){window.addEventListener("sync-action-modals",t=>{t.detail.id===e&&this.syncActionModals(t.detail.newActionNestingIndex,t.detail.shouldOverlayParentActions??!1)})},syncActionModals(t,i=!1){if(this.actionNestingIndex===t){this.actionNestingIndex!==null&&this.$nextTick(()=>this.openModal());return}let s=this.actionNestingIndex!==null&&t!==null&&t>this.actionNestingIndex;if(this.actionNestingIndex!==null&&!(i&&s)&&this.closeModal(),this.actionNestingIndex=t,this.actionNestingIndex!==null){if(!this.$el.querySelector(`#${this.generateModalId(t)}`)){this.$nextTick(()=>this.openModal());return}this.openModal()}},generateModalId(t){return`fi-${e}-action-`+t},openModal(){let t=this.generateModalId(this.actionNestingIndex);document.dispatchEvent(new CustomEvent("open-modal",{bubbles:!0,composed:!0,detail:{id:t}}))},closeModal(){let t=this.generateModalId(this.actionNestingIndex);document.dispatchEvent(new CustomEvent("close-modal-quietly",{bubbles:!0,composed:!0,detail:{id:t}}))}});document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentActionModals",n)});})(); diff --git a/public/js/filament/filament/app.js b/public/js/filament/filament/app.js index caff16739f..19427e927e 100644 --- a/public/js/filament/filament/app.js +++ b/public/js/filament/filament/app.js @@ -1 +1 @@ -(()=>{var Z=Object.create,L=Object.defineProperty,ee=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty,re=Object.getOwnPropertyNames,ne=Object.getOwnPropertyDescriptor,ae=s=>L(s,"__esModule",{value:!0}),ie=(s,n)=>()=>(n||(n={exports:{}},s(n.exports,n)),n.exports),oe=(s,n,p)=>{if(n&&typeof n=="object"||typeof n=="function")for(let d of re(n))!te.call(s,d)&&d!=="default"&&L(s,d,{get:()=>n[d],enumerable:!(p=ne(n,d))||p.enumerable});return s},se=s=>oe(ae(L(s!=null?Z(ee(s)):{},"default",s&&s.__esModule&&"default"in s?{get:()=>s.default,enumerable:!0}:{value:s,enumerable:!0})),s),fe=ie((s,n)=>{(function(p,d,M){if(!p)return;for(var h={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},y={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},g={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},q={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},S,w=1;w<20;++w)h[111+w]="f"+w;for(w=0;w<=9;++w)h[w+96]=w.toString();function C(e,t,a){if(e.addEventListener){e.addEventListener(t,a,!1);return}e.attachEvent("on"+t,a)}function T(e){if(e.type=="keypress"){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return h[e.which]?h[e.which]:y[e.which]?y[e.which]:String.fromCharCode(e.which).toLowerCase()}function V(e,t){return e.sort().join(",")===t.sort().join(",")}function $(e){var t=[];return e.shiftKey&&t.push("shift"),e.altKey&&t.push("alt"),e.ctrlKey&&t.push("ctrl"),e.metaKey&&t.push("meta"),t}function B(e){if(e.preventDefault){e.preventDefault();return}e.returnValue=!1}function H(e){if(e.stopPropagation){e.stopPropagation();return}e.cancelBubble=!0}function O(e){return e=="shift"||e=="ctrl"||e=="alt"||e=="meta"}function J(){if(!S){S={};for(var e in h)e>95&&e<112||h.hasOwnProperty(e)&&(S[h[e]]=e)}return S}function U(e,t,a){return a||(a=J()[e]?"keydown":"keypress"),a=="keypress"&&t.length&&(a="keydown"),a}function X(e){return e==="+"?["+"]:(e=e.replace(/\+{2}/g,"+plus"),e.split("+"))}function I(e,t){var a,c,b,P=[];for(a=X(e),b=0;b1){z(r,m,o,l);return}f=I(r,l),t._callbacks[f.key]=t._callbacks[f.key]||[],j(f.key,f.modifiers,{type:f.action},i,r,u),t._callbacks[f.key][i?"unshift":"push"]({callback:o,modifiers:f.modifiers,action:f.action,seq:i,level:u,combo:r})}t._bindMultiple=function(r,o,l){for(var i=0;i-1||D(t,a.target))return!1;if("composedPath"in e&&typeof e.composedPath=="function"){var c=e.composedPath()[0];c!==e.target&&(t=c)}return t.tagName=="INPUT"||t.tagName=="SELECT"||t.tagName=="TEXTAREA"||t.isContentEditable},v.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},v.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(h[t]=e[t]);S=null},v.init=function(){var e=v(d);for(var t in e)t.charAt(0)!=="_"&&(v[t]=function(a){return function(){return e[a].apply(e,arguments)}}(t))},v.init(),p.Mousetrap=v,typeof n<"u"&&n.exports&&(n.exports=v),typeof define=="function"&&define.amd&&define(function(){return v})})(typeof window<"u"?window:null,typeof window<"u"?document:null)}),R=se(fe());(function(s){if(s){var n={},p=s.prototype.stopCallback;s.prototype.stopCallback=function(d,M,h,y){var g=this;return g.paused?!0:n[h]||n[y]?!1:p.call(g,d,M,h)},s.prototype.bindGlobal=function(d,M,h){var y=this;if(y.bind(d,M,h),d instanceof Array){for(var g=0;g{s.directive("mousetrap",(n,{modifiers:p,expression:d},{evaluate:M})=>{let h=()=>d?M(d):n.click();p=p.map(y=>y.replace(/-/g,"+")),p.includes("global")&&(p=p.filter(y=>y!=="global"),R.default.bindGlobal(p,y=>{y.preventDefault(),h()})),R.default.bind(p,y=>{y.preventDefault(),h()})})},F=le;document.addEventListener("alpine:init",()=>{window.Alpine.plugin(F),window.Alpine.store("sidebar",{isOpen:window.Alpine.$persist(!0).as("isOpen"),collapsedGroups:window.Alpine.$persist(null).as("collapsedGroups"),groupIsCollapsed:function(n){return this.collapsedGroups.includes(n)},collapseGroup:function(n){this.collapsedGroups.includes(n)||(this.collapsedGroups=this.collapsedGroups.concat(n))},toggleCollapsedGroup:function(n){this.collapsedGroups=this.collapsedGroups.includes(n)?this.collapsedGroups.filter(p=>p!==n):this.collapsedGroups.concat(n)},close:function(){this.isOpen=!1},open:function(){this.isOpen=!0}});let s=localStorage.getItem("theme")??getComputedStyle(document.documentElement).getPropertyValue("--default-theme-mode");window.Alpine.store("theme",s==="dark"||s==="system"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),window.addEventListener("theme-changed",n=>{let p=n.detail;localStorage.setItem("theme",p),p==="system"&&(p=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),window.Alpine.store("theme",p)}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",n=>{localStorage.getItem("theme")==="system"&&window.Alpine.store("theme",n.matches?"dark":"light")}),window.Alpine.effect(()=>{window.Alpine.store("theme")==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")})});})(); +(()=>{var re=Object.create,N=Object.defineProperty,ne=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty,oe=Object.getOwnPropertyNames,ae=Object.getOwnPropertyDescriptor,se=t=>N(t,"__esModule",{value:!0}),le=(t,n)=>()=>(n||(n={exports:{}},t(n.exports,n)),n.exports),fe=(t,n,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of oe(n))!ie.call(t,a)&&a!=="default"&&N(t,a,{get:()=>n[a],enumerable:!(i=ae(n,a))||i.enumerable});return t},ue=t=>fe(se(N(t!=null?re(ne(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t),pe=le((t,n)=>{(function(i,a,w){if(!i)return;for(var u={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},v={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},y={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},U={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},A,m=1;m<20;++m)u[111+m]="f"+m;for(m=0;m<=9;++m)u[m+96]=m.toString();function C(e,r,s){if(e.addEventListener){e.addEventListener(r,s,!1);return}e.attachEvent("on"+r,s)}function G(e){if(e.type=="keypress"){var r=String.fromCharCode(e.which);return e.shiftKey||(r=r.toLowerCase()),r}return u[e.which]?u[e.which]:v[e.which]?v[e.which]:String.fromCharCode(e.which).toLowerCase()}function V(e,r){return e.sort().join(",")===r.sort().join(",")}function F(e){var r=[];return e.shiftKey&&r.push("shift"),e.altKey&&r.push("alt"),e.ctrlKey&&r.push("ctrl"),e.metaKey&&r.push("meta"),r}function H(e){if(e.preventDefault){e.preventDefault();return}e.returnValue=!1}function B(e){if(e.stopPropagation){e.stopPropagation();return}e.cancelBubble=!0}function P(e){return e=="shift"||e=="ctrl"||e=="alt"||e=="meta"}function X(){if(!A){A={};for(var e in u)e>95&&e<112||u.hasOwnProperty(e)&&(A[u[e]]=e)}return A}function Y(e,r,s){return s||(s=X()[e]?"keydown":"keypress"),s=="keypress"&&r.length&&(s="keydown"),s}function Q(e){return e==="+"?["+"]:(e=e.replace(/\+{2}/g,"+plus"),e.split("+"))}function T(e,r){var s,h,k,S=[];for(s=Q(e),k=0;k1){$(o,b,f,c);return}p=T(o,c),r._callbacks[p.key]=r._callbacks[p.key]||[],I(p.key,p.modifiers,{type:p.action},l,o,d),r._callbacks[p.key][l?"unshift":"push"]({callback:f,modifiers:p.modifiers,action:p.action,seq:l,level:d,combo:o})}r._bindMultiple=function(o,f,c){for(var l=0;l-1||R(r,s.target))return!1;if("composedPath"in e&&typeof e.composedPath=="function"){var h=e.composedPath()[0];h!==e.target&&(r=h)}return r.tagName=="INPUT"||r.tagName=="SELECT"||r.tagName=="TEXTAREA"||r.isContentEditable},_.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},_.addKeycodes=function(e){for(var r in e)e.hasOwnProperty(r)&&(u[r]=e[r]);A=null},_.init=function(){var e=_(a);for(var r in e)r.charAt(0)!=="_"&&(_[r]=(function(s){return function(){return e[s].apply(e,arguments)}})(r))},_.init(),i.Mousetrap=_,typeof n<"u"&&n.exports&&(n.exports=_),typeof define=="function"&&define.amd&&define(function(){return _})})(typeof window<"u"?window:null,typeof window<"u"?document:null)}),q=ue(pe());(function(t){if(t){var n={},i=t.prototype.stopCallback;t.prototype.stopCallback=function(a,w,u,v){var y=this;return y.paused?!0:n[u]||n[v]?!1:i.call(y,a,w,u)},t.prototype.bindGlobal=function(a,w,u){var v=this;if(v.bind(a,w,u),a instanceof Array){for(var y=0;yArray.from(document.querySelectorAll('[aria-modal="true"]')).find(t=>window.getComputedStyle(t).display!=="none"),ce=t=>{t.directive("mousetrap",(n,{modifiers:i,expression:a},{evaluate:w})=>{let u=()=>a?w(a):n.click();i=i.map(v=>v.replace(/--/g," ").replace(/-/g,"+").replace(/\bslash\b/g,"/")),i.includes("global")&&(i=i.filter(v=>v!=="global"),q.default.bindGlobal(i,v=>{let y=J();y&&!y.contains(n)||(v.preventDefault(),u())})),q.default.bind(i,v=>{let y=J();y&&!y.contains(n)||(v.preventDefault(),u())}),document.addEventListener("livewire:navigating",()=>{q.default.unbind(i)},{once:!0})})},W=ce;var j=()=>({isOpen:window.Alpine.$persist(!0).as("isOpen"),isOpenDesktop:window.Alpine.$persist(!0).as("isOpenDesktop"),collapsedGroups:window.Alpine.$persist(null).as("collapsedGroups"),init(){this.resizeObserver=null,this.setUpResizeObserver(),document.addEventListener("livewire:navigated",()=>{this.setUpResizeObserver()})},setUpResizeObserver(){this.resizeObserver&&this.resizeObserver.disconnect();let t=window.innerWidth;this.resizeObserver=new ResizeObserver(()=>{let n=window.innerWidth,i=t>=1024,a=n<1024,w=n>=1024;i&&a?(this.isOpenDesktop=this.isOpen,this.isOpen&&this.close()):!i&&w&&(this.isOpen=this.isOpenDesktop),t=n}),this.resizeObserver.observe(document.body),window.innerWidth<1024?this.isOpen&&(this.isOpenDesktop=!0,this.close()):this.isOpenDesktop=this.isOpen},groupIsCollapsed(t){return this.collapsedGroups.includes(t)},collapseGroup(t){this.collapsedGroups.includes(t)||(this.collapsedGroups=this.collapsedGroups.concat(t))},toggleCollapsedGroup(t){this.collapsedGroups=this.collapsedGroups.includes(t)?this.collapsedGroups.filter(n=>n!==t):this.collapsedGroups.concat(t)},close(){this.isOpen=!1,window.innerWidth>=1024&&(this.isOpenDesktop=!1)},open(){this.isOpen=!0,window.innerWidth>=1024&&(this.isOpenDesktop=!0)}});document.addEventListener("alpine:init",()=>{let t=localStorage.getItem("theme")??getComputedStyle(document.documentElement).getPropertyValue("--default-theme-mode");window.Alpine.store("theme",t==="dark"||t==="system"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),window.addEventListener("theme-changed",n=>{let i=n.detail;localStorage.setItem("theme",i),i==="system"&&(i=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),window.Alpine.store("theme",i)}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",n=>{localStorage.getItem("theme")==="system"&&window.Alpine.store("theme",n.matches?"dark":"light")}),window.Alpine.effect(()=>{window.Alpine.store("theme")==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")})});document.addEventListener("livewire:init",()=>{Livewire.hook("request",({payload:t,fail:n})=>{n(({status:i,preventDefault:a})=>{let w=window.filamentErrorNotifications;if(!w)return;if(JSON.parse(t).components.length===1){for(let v of JSON.parse(t).components)if(JSON.parse(v.snapshot).data.isFilamentNotificationsComponent)return}a();let u=w[i]??w[""];new FilamentNotification().title(u.title).body(u.body).danger().send()})})});var x=window.history.replaceState,de=window.history.pushState;window.history.replaceState=function(t,n,i){t?.url instanceof URL&&(t.url=t.url.toString());let a=i||t?.url||window.location.href,w=window.location.href;if(a!==w){x.call(window.history,t,n,i);return}try{let u=window.history.state;JSON.stringify(t)!==JSON.stringify(u)&&x.call(window.history,t,n,i)}catch{x.call(window.history,t,n,i)}};window.history.pushState=function(t,n,i){t?.url instanceof URL&&(t.url=t.url.toString()),de.call(window.history,t,n,i)};document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{let t=document.querySelector(".fi-main-sidebar .fi-sidebar-item.fi-active");if((!t||t.offsetParent===null)&&(t=document.querySelector(".fi-main-sidebar .fi-sidebar-group.fi-active")),!t||t.offsetParent===null)return;let n=document.querySelector(".fi-main-sidebar .fi-sidebar-nav");n&&n.scrollTo(0,t.offsetTop-window.innerHeight/2)},10)});window.setUpUnsavedDataChangesAlert=({body:t,livewireComponent:n,$wire:i})=>{window.addEventListener("beforeunload",a=>{window.jsMd5(JSON.stringify(i.data).replace(/\\/g,""))===i.savedDataHash||i?.__instance?.effects?.redirect||(a.preventDefault(),a.returnValue=!0)})};window.setUpSpaModeUnsavedDataChangesAlert=({body:t,resolveLivewireComponentUsing:n,$wire:i})=>{let a=()=>i?.__instance?.effects?.redirect?!1:window.jsMd5(JSON.stringify(i.data).replace(/\\/g,""))!==i.savedDataHash,w=()=>confirm(t);document.addEventListener("livewire:navigate",u=>{if(typeof n()<"u"){if(!a()||w())return;u.preventDefault()}}),window.addEventListener("beforeunload",u=>{a()&&(u.preventDefault(),u.returnValue=!0)})};window.setUpUnsavedActionChangesAlert=({resolveLivewireComponentUsing:t,$wire:n})=>{window.addEventListener("beforeunload",i=>{if(!(typeof t()>"u")&&(n.mountedActions?.length??0)&&!n?.__instance?.effects?.redirect){i.preventDefault(),i.returnValue=!0;return}})};document.addEventListener("alpine:init",()=>{window.Alpine.plugin(W),window.Alpine.store("sidebar",j())});})(); diff --git a/public/js/filament/filament/echo.js b/public/js/filament/filament/echo.js index f1a9a28c75..4b2d09b6ef 100644 --- a/public/js/filament/filament/echo.js +++ b/public/js/filament/filament/echo.js @@ -1,5 +1,5 @@ -(()=>{var ki=Object.create;var he=Object.defineProperty;var Si=Object.getOwnPropertyDescriptor;var Ci=Object.getOwnPropertyNames;var Ti=Object.getPrototypeOf,Pi=Object.prototype.hasOwnProperty;var xi=(l,h)=>()=>(h||l((h={exports:{}}).exports,h),h.exports);var Oi=(l,h,a,c)=>{if(h&&typeof h=="object"||typeof h=="function")for(let s of Ci(h))!Pi.call(l,s)&&s!==a&&he(l,s,{get:()=>h[s],enumerable:!(c=Si(h,s))||c.enumerable});return l};var Ai=(l,h,a)=>(a=l!=null?ki(Ti(l)):{},Oi(h||!l||!l.__esModule?he(a,"default",{value:l,enumerable:!0}):a,l));var _e=xi((yt,It)=>{(function(h,a){typeof yt=="object"&&typeof It=="object"?It.exports=a():typeof define=="function"&&define.amd?define([],a):typeof yt=="object"?yt.Pusher=a():h.Pusher=a()})(window,function(){return function(l){var h={};function a(c){if(h[c])return h[c].exports;var s=h[c]={i:c,l:!1,exports:{}};return l[c].call(s.exports,s,s.exports,a),s.l=!0,s.exports}return a.m=l,a.c=h,a.d=function(c,s,f){a.o(c,s)||Object.defineProperty(c,s,{enumerable:!0,get:f})},a.r=function(c){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},a.t=function(c,s){if(s&1&&(c=a(c)),s&8||s&4&&typeof c=="object"&&c&&c.__esModule)return c;var f=Object.create(null);if(a.r(f),Object.defineProperty(f,"default",{enumerable:!0,value:c}),s&2&&typeof c!="string")for(var d in c)a.d(f,d,function(N){return c[N]}.bind(null,d));return f},a.n=function(c){var s=c&&c.__esModule?function(){return c.default}:function(){return c};return a.d(s,"a",s),s},a.o=function(c,s){return Object.prototype.hasOwnProperty.call(c,s)},a.p="",a(a.s=2)}([function(l,h,a){"use strict";var c=this&&this.__extends||function(){var b=function(v,y){return b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(w,O){w.__proto__=O}||function(w,O){for(var I in O)O.hasOwnProperty(I)&&(w[I]=O[I])},b(v,y)};return function(v,y){b(v,y);function w(){this.constructor=v}v.prototype=y===null?Object.create(y):(w.prototype=y.prototype,new w)}}();Object.defineProperty(h,"__esModule",{value:!0});var s=256,f=function(){function b(v){v===void 0&&(v="="),this._paddingCharacter=v}return b.prototype.encodedLength=function(v){return this._paddingCharacter?(v+2)/3*4|0:(v*8+5)/6|0},b.prototype.encode=function(v){for(var y="",w=0;w>>3*6&63),y+=this._encodeByte(O>>>2*6&63),y+=this._encodeByte(O>>>1*6&63),y+=this._encodeByte(O>>>0*6&63)}var I=v.length-w;if(I>0){var O=v[w]<<16|(I===2?v[w+1]<<8:0);y+=this._encodeByte(O>>>3*6&63),y+=this._encodeByte(O>>>2*6&63),I===2?y+=this._encodeByte(O>>>1*6&63):y+=this._paddingCharacter||"",y+=this._paddingCharacter||""}return y},b.prototype.maxDecodedLength=function(v){return this._paddingCharacter?v/4*3|0:(v*6+7)/8|0},b.prototype.decodedLength=function(v){return this.maxDecodedLength(v.length-this._getPaddingLength(v))},b.prototype.decode=function(v){if(v.length===0)return new Uint8Array(0);for(var y=this._getPaddingLength(v),w=v.length-y,O=new Uint8Array(this.maxDecodedLength(w)),I=0,q=0,M=0,J=0,F=0,z=0,B=0;q>>4,O[I++]=F<<4|z>>>2,O[I++]=z<<6|B,M|=J&s,M|=F&s,M|=z&s,M|=B&s;if(q>>4,M|=J&s,M|=F&s),q>>2,M|=z&s),q>>8&0-65-26+97,y+=51-v>>>8&26-97-52+48,y+=61-v>>>8&52-48-62+43,y+=62-v>>>8&62-43-63+47,String.fromCharCode(y)},b.prototype._decodeChar=function(v){var y=s;return y+=(42-v&v-44)>>>8&-s+v-43+62,y+=(46-v&v-48)>>>8&-s+v-47+63,y+=(47-v&v-58)>>>8&-s+v-48+52,y+=(64-v&v-91)>>>8&-s+v-65+0,y+=(96-v&v-123)>>>8&-s+v-97+26,y},b.prototype._getPaddingLength=function(v){var y=0;if(this._paddingCharacter){for(var w=v.length-1;w>=0&&v[w]===this._paddingCharacter;w--)y++;if(v.length<4||y>2)throw new Error("Base64Coder: incorrect padding")}return y},b}();h.Coder=f;var d=new f;function N(b){return d.encode(b)}h.encode=N;function P(b){return d.decode(b)}h.decode=P;var T=function(b){c(v,b);function v(){return b!==null&&b.apply(this,arguments)||this}return v.prototype._encodeByte=function(y){var w=y;return w+=65,w+=25-y>>>8&0-65-26+97,w+=51-y>>>8&26-97-52+48,w+=61-y>>>8&52-48-62+45,w+=62-y>>>8&62-45-63+95,String.fromCharCode(w)},v.prototype._decodeChar=function(y){var w=s;return w+=(44-y&y-46)>>>8&-s+y-45+62,w+=(94-y&y-96)>>>8&-s+y-95+63,w+=(47-y&y-58)>>>8&-s+y-48+52,w+=(64-y&y-91)>>>8&-s+y-65+0,w+=(96-y&y-123)>>>8&-s+y-97+26,w},v}(f);h.URLSafeCoder=T;var S=new T;function C(b){return S.encode(b)}h.encodeURLSafe=C;function x(b){return S.decode(b)}h.decodeURLSafe=x,h.encodedLength=function(b){return d.encodedLength(b)},h.maxDecodedLength=function(b){return d.maxDecodedLength(b)},h.decodedLength=function(b){return d.decodedLength(b)}},function(l,h,a){"use strict";Object.defineProperty(h,"__esModule",{value:!0});var c="utf8: invalid string",s="utf8: invalid source encoding";function f(P){for(var T=new Uint8Array(d(P)),S=0,C=0;C>6,T[S++]=128|x&63):x<55296?(T[S++]=224|x>>12,T[S++]=128|x>>6&63,T[S++]=128|x&63):(C++,x=(x&1023)<<10,x|=P.charCodeAt(C)&1023,x+=65536,T[S++]=240|x>>18,T[S++]=128|x>>12&63,T[S++]=128|x>>6&63,T[S++]=128|x&63)}return T}h.encode=f;function d(P){for(var T=0,S=0;S=P.length-1)throw new Error(c);S++,T+=4}else throw new Error(c)}return T}h.encodedLength=d;function N(P){for(var T=[],S=0;S=P.length)throw new Error(s);var b=P[++S];if((b&192)!==128)throw new Error(s);C=(C&31)<<6|b&63,x=128}else if(C<240){if(S>=P.length-1)throw new Error(s);var b=P[++S],v=P[++S];if((b&192)!==128||(v&192)!==128)throw new Error(s);C=(C&15)<<12|(b&63)<<6|v&63,x=2048}else if(C<248){if(S>=P.length-2)throw new Error(s);var b=P[++S],v=P[++S],y=P[++S];if((b&192)!==128||(v&192)!==128||(y&192)!==128)throw new Error(s);C=(C&15)<<18|(b&63)<<12|(v&63)<<6|y&63,x=65536}else throw new Error(s);if(C=55296&&C<=57343)throw new Error(s);if(C>=65536){if(C>1114111)throw new Error(s);C-=65536,T.push(String.fromCharCode(55296|C>>10)),C=56320|C&1023}}T.push(String.fromCharCode(C))}return T.join("")}h.decode=N},function(l,h,a){l.exports=a(3).default},function(l,h,a){"use strict";a.r(h);var c=function(){function e(t,n){this.lastId=0,this.prefix=t,this.name=n}return e.prototype.create=function(t){this.lastId++;var n=this.lastId,r=this.prefix+n,i=this.name+"["+n+"]",o=!1,u=function(){o||(t.apply(null,arguments),o=!0)};return this[n]=u,{number:n,id:r,name:i,callback:u}},e.prototype.remove=function(t){delete this[t.number]},e}(),s=new c("_pusher_script_","Pusher.ScriptReceivers"),f={VERSION:"7.6.0",PROTOCOL:7,wsPort:80,wssPort:443,wsPath:"",httpHost:"sockjs.pusher.com",httpPort:80,httpsPort:443,httpPath:"/pusher",stats_host:"stats.pusher.com",authEndpoint:"/pusher/auth",authTransport:"ajax",activityTimeout:12e4,pongTimeout:3e4,unavailableTimeout:1e4,cluster:"mt1",userAuthentication:{endpoint:"/pusher/user-auth",transport:"ajax"},channelAuthorization:{endpoint:"/pusher/auth",transport:"ajax"},cdn_http:"http://js.pusher.com",cdn_https:"https://js.pusher.com",dependency_suffix:""},d=f,N=function(){function e(t){this.options=t,this.receivers=t.receivers||s,this.loading={}}return e.prototype.load=function(t,n,r){var i=this;if(i.loading[t]&&i.loading[t].length>0)i.loading[t].push(r);else{i.loading[t]=[r];var o=m.createScriptRequest(i.getPath(t,n)),u=i.receivers.create(function(p){if(i.receivers.remove(u),i.loading[t]){var _=i.loading[t];delete i.loading[t];for(var g=function(E){E||o.cleanup()},k=0;k<_.length;k++)_[k](p,g)}});o.send(u)}},e.prototype.getRoot=function(t){var n,r=m.getDocument().location.protocol;return t&&t.useTLS||r==="https:"?n=this.options.cdn_https:n=this.options.cdn_http,n.replace(/\/*$/,"")+"/"+this.options.version},e.prototype.getPath=function(t,n){return this.getRoot(n)+"/"+t+this.options.suffix+".js"},e}(),P=N,T=new c("_pusher_dependencies","Pusher.DependenciesReceivers"),S=new P({cdn_http:d.cdn_http,cdn_https:d.cdn_https,version:d.VERSION,suffix:d.dependency_suffix,receivers:T}),C={baseUrl:"https://pusher.com",urls:{authenticationEndpoint:{path:"/docs/channels/server_api/authenticating_users"},authorizationEndpoint:{path:"/docs/channels/server_api/authorizing-users/"},javascriptQuickStart:{path:"/docs/javascript_quick_start"},triggeringClientEvents:{path:"/docs/client_api_guide/client_events#trigger-events"},encryptedChannelSupport:{fullUrl:"https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support"}}},x=function(e){var t="See:",n=C.urls[e];if(!n)return"";var r;return n.fullUrl?r=n.fullUrl:n.path&&(r=C.baseUrl+n.path),r?t+" "+r:""},b={buildLogSuffix:x},v;(function(e){e.UserAuthentication="user-authentication",e.ChannelAuthorization="channel-authorization"})(v||(v={}));var y=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),w=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),O=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),I=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),q=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),M=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),J=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),F=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),z=function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t}(Error),B=function(e){y(t,e);function t(n,r){var i=this.constructor,o=e.call(this,r)||this;return o.status=n,Object.setPrototypeOf(o,i.prototype),o}return t}(Error),me=function(e,t,n,r,i){var o=m.createXHR();o.open("POST",n.endpoint,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");for(var u in n.headers)o.setRequestHeader(u,n.headers[u]);if(n.headersProvider!=null){var p=n.headersProvider();for(var u in p)o.setRequestHeader(u,p[u])}return o.onreadystatechange=function(){if(o.readyState===4)if(o.status===200){var _=void 0,g=!1;try{_=JSON.parse(o.responseText),g=!0}catch{i(new B(200,"JSON returned from "+r.toString()+" endpoint was invalid, yet status code was 200. Data was: "+o.responseText),null)}g&&i(null,_)}else{var k="";switch(r){case v.UserAuthentication:k=b.buildLogSuffix("authenticationEndpoint");break;case v.ChannelAuthorization:k="Clients must be authorized to join private or presence channels. "+b.buildLogSuffix("authorizationEndpoint");break}i(new B(o.status,"Unable to retrieve auth string from "+r.toString()+" endpoint - "+("received status: "+o.status+" from "+n.endpoint+". "+k)),null)}},o.send(t),o},we=me;function ke(e){return Oe(Pe(e))}for(var nt=String.fromCharCode,Z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Se={},at=0,Ce=Z.length;at>>6)+nt(128|t&63):nt(224|t>>>12&15)+nt(128|t>>>6&63)+nt(128|t&63)},Pe=function(e){return e.replace(/[^\x00-\x7F]/g,Te)},xe=function(e){var t=[0,2,1][e.length%3],n=e.charCodeAt(0)<<16|(e.length>1?e.charCodeAt(1):0)<<8|(e.length>2?e.charCodeAt(2):0),r=[Z.charAt(n>>>18),Z.charAt(n>>>12&63),t>=2?"=":Z.charAt(n>>>6&63),t>=1?"=":Z.charAt(n&63)];return r.join("")},Oe=window.btoa||function(e){return e.replace(/[\s\S]{1,3}/g,xe)},Ae=function(){function e(t,n,r,i){var o=this;this.clear=n,this.timer=t(function(){o.timer&&(o.timer=i(o.timer))},r)}return e.prototype.isRunning=function(){return this.timer!==null},e.prototype.ensureAborted=function(){this.timer&&(this.clear(this.timer),this.timer=null)},e}(),jt=Ae,Nt=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}();function Ee(e){window.clearTimeout(e)}function Le(e){window.clearInterval(e)}var Q=function(e){Nt(t,e);function t(n,r){return e.call(this,setTimeout,Ee,n,function(i){return r(),null})||this}return t}(jt),Re=function(e){Nt(t,e);function t(n,r){return e.call(this,setInterval,Le,n,function(i){return r(),i})||this}return t}(jt),Ie={now:function(){return Date.now?Date.now():new Date().valueOf()},defer:function(e){return new Q(0,e)},method:function(e){for(var t=[],n=1;n0)for(var i=0;i=1002&&e.code<=1004?"backoff":null:e.code===4e3?"tls_only":e.code<4100?"refused":e.code<4200?"backoff":e.code<4300?"retry":"refused"},getCloseError:function(e){return e.code!==1e3&&e.code!==1001?{type:"PusherError",data:{code:e.code,message:e.reason||e.message}}:null}},K=Vt,kn=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),Sn=function(e){kn(t,e);function t(n,r){var i=e.call(this)||this;return i.id=n,i.transport=r,i.activityTimeout=r.activityTimeout,i.bindListeners(),i}return t.prototype.handlesActivityChecks=function(){return this.transport.handlesActivityChecks()},t.prototype.send=function(n){return this.transport.send(n)},t.prototype.send_event=function(n,r,i){var o={event:n,data:r};return i&&(o.channel=i),A.debug("Event sent",o),this.send(K.encodeMessage(o))},t.prototype.ping=function(){this.transport.supportsPing()?this.transport.ping():this.send_event("pusher:ping",{})},t.prototype.close=function(){this.transport.close()},t.prototype.bindListeners=function(){var n=this,r={message:function(o){var u;try{u=K.decodeMessage(o)}catch(p){n.emit("error",{type:"MessageParseError",error:p,data:o.data})}if(u!==void 0){switch(A.debug("Event recd",u),u.event){case"pusher:error":n.emit("error",{type:"PusherError",data:u.data});break;case"pusher:ping":n.emit("ping");break;case"pusher:pong":n.emit("pong");break}n.emit("message",u)}},activity:function(){n.emit("activity")},error:function(o){n.emit("error",o)},closed:function(o){i(),o&&o.code&&n.handleCloseEvent(o),n.transport=null,n.emit("closed")}},i=function(){W(r,function(o,u){n.transport.unbind(u,o)})};W(r,function(o,u){n.transport.bind(u,o)})},t.prototype.handleCloseEvent=function(n){var r=K.getCloseAction(n),i=K.getCloseError(n);i&&this.emit("error",i),r&&this.emit(r,{action:r,error:i})},t}(V),Cn=Sn,Tn=function(){function e(t,n){this.transport=t,this.callback=n,this.bindListeners()}return e.prototype.close=function(){this.unbindListeners(),this.transport.close()},e.prototype.bindListeners=function(){var t=this;this.onMessage=function(n){t.unbindListeners();var r;try{r=K.processHandshake(n)}catch(i){t.finish("error",{error:i}),t.transport.close();return}r.action==="connected"?t.finish("connected",{connection:new Cn(r.id,t.transport),activityTimeout:r.activityTimeout}):(t.finish(r.action,{error:r.error}),t.transport.close())},this.onClosed=function(n){t.unbindListeners();var r=K.getCloseAction(n)||"backoff",i=K.getCloseError(n);t.finish(r,{error:i})},this.transport.bind("message",this.onMessage),this.transport.bind("closed",this.onClosed)},e.prototype.unbindListeners=function(){this.transport.unbind("message",this.onMessage),this.transport.unbind("closed",this.onClosed)},e.prototype.finish=function(t,n){this.callback(U({transport:this.transport,action:t},n))},e}(),Pn=Tn,xn=function(){function e(t,n){this.timeline=t,this.options=n||{}}return e.prototype.send=function(t,n){this.timeline.isEmpty()||this.timeline.send(m.TimelineTransport.getAgent(this,t),n)},e}(),On=xn,An=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),En=function(e){An(t,e);function t(n,r){var i=e.call(this,function(o,u){A.debug("No callbacks on "+n+" for "+o)})||this;return i.name=n,i.pusher=r,i.subscribed=!1,i.subscriptionPending=!1,i.subscriptionCancelled=!1,i}return t.prototype.authorize=function(n,r){return r(null,{auth:""})},t.prototype.trigger=function(n,r){if(n.indexOf("client-")!==0)throw new w("Event '"+n+"' does not start with 'client-'");if(!this.subscribed){var i=b.buildLogSuffix("triggeringClientEvents");A.warn("Client event triggered before channel 'subscription_succeeded' event . "+i)}return this.pusher.send_event(n,r,this.name)},t.prototype.disconnect=function(){this.subscribed=!1,this.subscriptionPending=!1},t.prototype.handleEvent=function(n){var r=n.event,i=n.data;if(r==="pusher_internal:subscription_succeeded")this.handleSubscriptionSucceededEvent(n);else if(r==="pusher_internal:subscription_count")this.handleSubscriptionCountEvent(n);else if(r.indexOf("pusher_internal:")!==0){var o={};this.emit(r,i,o)}},t.prototype.handleSubscriptionSucceededEvent=function(n){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):this.emit("pusher:subscription_succeeded",n.data)},t.prototype.handleSubscriptionCountEvent=function(n){n.data.subscription_count&&(this.subscriptionCount=n.data.subscription_count),this.emit("pusher:subscription_count",n.data)},t.prototype.subscribe=function(){var n=this;this.subscribed||(this.subscriptionPending=!0,this.subscriptionCancelled=!1,this.authorize(this.pusher.connection.socket_id,function(r,i){r?(n.subscriptionPending=!1,A.error(r.toString()),n.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:r.message},r instanceof B?{status:r.status}:{}))):n.pusher.send_event("pusher:subscribe",{auth:i.auth,channel_data:i.channel_data,channel:n.name})}))},t.prototype.unsubscribe=function(){this.subscribed=!1,this.pusher.send_event("pusher:unsubscribe",{channel:this.name})},t.prototype.cancelSubscription=function(){this.subscriptionCancelled=!0},t.prototype.reinstateSubscription=function(){this.subscriptionCancelled=!1},t}(V),mt=En,Ln=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),Rn=function(e){Ln(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.authorize=function(n,r){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:n},r)},t}(mt),wt=Rn,In=function(){function e(){this.reset()}return e.prototype.get=function(t){return Object.prototype.hasOwnProperty.call(this.members,t)?{id:t,info:this.members[t]}:null},e.prototype.each=function(t){var n=this;W(this.members,function(r,i){t(n.get(i))})},e.prototype.setMyID=function(t){this.myID=t},e.prototype.onSubscription=function(t){this.members=t.presence.hash,this.count=t.presence.count,this.me=this.get(this.myID)},e.prototype.addMember=function(t){return this.get(t.user_id)===null&&this.count++,this.members[t.user_id]=t.user_info,this.get(t.user_id)},e.prototype.removeMember=function(t){var n=this.get(t.user_id);return n&&(delete this.members[t.user_id],this.count--),n},e.prototype.reset=function(){this.members={},this.count=0,this.myID=null,this.me=null},e}(),jn=In,Nn=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),qn=function(e,t,n,r){function i(o){return o instanceof n?o:new n(function(u){u(o)})}return new(n||(n=Promise))(function(o,u){function p(k){try{g(r.next(k))}catch(E){u(E)}}function _(k){try{g(r.throw(k))}catch(E){u(E)}}function g(k){k.done?o(k.value):i(k.value).then(p,_)}g((r=r.apply(e,t||[])).next())})},Un=function(e,t){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,u;return u={next:p(0),throw:p(1),return:p(2)},typeof Symbol=="function"&&(u[Symbol.iterator]=function(){return this}),u;function p(g){return function(k){return _([g,k])}}function _(g){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,i&&(o=g[0]&2?i.return:g[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,g[1])).done)return o;switch(i=0,o&&(g=[g[0]&2,o.value]),g[0]){case 0:case 1:o=g;break;case 4:return n.label++,{value:g[1],done:!1};case 5:n.label++,i=g[1],g=[0];continue;case 7:g=n.ops.pop(),n.trys.pop();continue;default:if(o=n.trys,!(o=o.length>0&&o[o.length-1])&&(g[0]===6||g[0]===2)){n=0;continue}if(g[0]===3&&(!o||g[1]>o[0]&&g[1]0&&this.emit("connecting_in",Math.round(n/1e3)),this.retryTimer=new Q(n||0,function(){r.disconnectInternally(),r.connect()})},t.prototype.clearRetryTimer=function(){this.retryTimer&&(this.retryTimer.ensureAborted(),this.retryTimer=null)},t.prototype.setUnavailableTimer=function(){var n=this;this.unavailableTimer=new Q(this.options.unavailableTimeout,function(){n.updateState("unavailable")})},t.prototype.clearUnavailableTimer=function(){this.unavailableTimer&&this.unavailableTimer.ensureAborted()},t.prototype.sendActivityCheck=function(){var n=this;this.stopActivityCheck(),this.connection.ping(),this.activityTimer=new Q(this.options.pongTimeout,function(){n.timeline.error({pong_timed_out:n.options.pongTimeout}),n.retryIn(0)})},t.prototype.resetActivityCheck=function(){var n=this;this.stopActivityCheck(),this.connection&&!this.connection.handlesActivityChecks()&&(this.activityTimer=new Q(this.activityTimeout,function(){n.sendActivityCheck()}))},t.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},t.prototype.buildConnectionCallbacks=function(n){var r=this;return U({},n,{message:function(i){r.resetActivityCheck(),r.emit("message",i)},ping:function(){r.send_event("pusher:pong",{})},activity:function(){r.resetActivityCheck()},error:function(i){r.emit("error",i)},closed:function(){r.abandonConnection(),r.shouldRetry()&&r.retryIn(1e3)}})},t.prototype.buildHandshakeCallbacks=function(n){var r=this;return U({},n,{connected:function(i){r.activityTimeout=Math.min(r.options.activityTimeout,i.activityTimeout,i.connection.activityTimeout||1/0),r.clearUnavailableTimer(),r.setConnection(i.connection),r.socket_id=r.connection.id,r.updateState("connected",{socket_id:r.socket_id})}})},t.prototype.buildErrorCallbacks=function(){var n=this,r=function(i){return function(o){o.error&&n.emit("error",{type:"WebSocketError",error:o.error}),i(o)}};return{tls_only:r(function(){n.usingTLS=!0,n.updateStrategy(),n.retryIn(0)}),refused:r(function(){n.disconnect()}),backoff:r(function(){n.retryIn(1e3)}),retry:r(function(){n.retryIn(0)})}},t.prototype.setConnection=function(n){this.connection=n;for(var r in this.connectionCallbacks)this.connection.bind(r,this.connectionCallbacks[r]);this.resetActivityCheck()},t.prototype.abandonConnection=function(){if(this.connection){this.stopActivityCheck();for(var n in this.connectionCallbacks)this.connection.unbind(n,this.connectionCallbacks[n]);var r=this.connection;return this.connection=null,r}},t.prototype.updateState=function(n,r){var i=this.state;if(this.state=n,i!==n){var o=n;o==="connected"&&(o+=" with new socket ID "+r.socket_id),A.debug("State changed",i+" -> "+o),this.timeline.info({state:n,params:r}),this.emit("state_change",{previous:i,current:n}),this.emit(n,r)}},t.prototype.shouldRetry=function(){return this.state==="connecting"||this.state==="connected"},t}(V),Wn=Jn,Vn=function(){function e(){this.channels={}}return e.prototype.add=function(t,n){return this.channels[t]||(this.channels[t]=Qn(t,n)),this.channels[t]},e.prototype.all=function(){return Ne(this.channels)},e.prototype.find=function(t){return this.channels[t]},e.prototype.remove=function(t){var n=this.channels[t];return delete this.channels[t],n},e.prototype.disconnect=function(){W(this.channels,function(t){t.disconnect()})},e}(),Gn=Vn;function Qn(e,t){if(e.indexOf("private-encrypted-")===0){if(t.config.nacl)return G.createEncryptedChannel(e,t,t.config.nacl);var n="Tried to subscribe to a private-encrypted- channel but no nacl implementation available",r=b.buildLogSuffix("encryptedChannelSupport");throw new J(n+". "+r)}else{if(e.indexOf("private-")===0)return G.createPrivateChannel(e,t);if(e.indexOf("presence-")===0)return G.createPresenceChannel(e,t);if(e.indexOf("#")===0)throw new O('Cannot create a channel with name "'+e+'".');return G.createChannel(e,t)}}var Kn={createChannels:function(){return new Gn},createConnectionManager:function(e,t){return new Wn(e,t)},createChannel:function(e,t){return new mt(e,t)},createPrivateChannel:function(e,t){return new wt(e,t)},createPresenceChannel:function(e,t){return new Hn(e,t)},createEncryptedChannel:function(e,t,n){return new Bn(e,t,n)},createTimelineSender:function(e,t){return new On(e,t)},createHandshake:function(e,t){return new Pn(e,t)},createAssistantToTheTransportManager:function(e,t,n){return new wn(e,t,n)}},G=Kn,Yn=function(){function e(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return e.prototype.getAssistant=function(t){return G.createAssistantToTheTransportManager(this,t,{minPingDelay:this.options.minPingDelay,maxPingDelay:this.options.maxPingDelay})},e.prototype.isAlive=function(){return this.livesLeft>0},e.prototype.reportDeath=function(){this.livesLeft-=1},e}(),Gt=Yn,$n=function(){function e(t,n){this.strategies=t,this.loop=!!n.loop,this.failFast=!!n.failFast,this.timeout=n.timeout,this.timeoutLimit=n.timeoutLimit}return e.prototype.isSupported=function(){return zt(this.strategies,j.method("isSupported"))},e.prototype.connect=function(t,n){var r=this,i=this.strategies,o=0,u=this.timeout,p=null,_=function(g,k){k?n(null,k):(o=o+1,r.loop&&(o=o%i.length),o0&&(o=new Q(r.timeout,function(){u.abort(),i(!0)})),u=t.connect(n,function(p,_){p&&o&&o.isRunning()&&!r.failFast||(o&&o.ensureAborted(),i(p,_))}),{abort:function(){o&&o.ensureAborted(),u.abort()},forceMinPriority:function(p){u.forceMinPriority(p)}}},e}(),Y=$n,Zn=function(){function e(t){this.strategies=t}return e.prototype.isSupported=function(){return zt(this.strategies,j.method("isSupported"))},e.prototype.connect=function(t,n){return tr(this.strategies,t,function(r,i){return function(o,u){if(i[r].error=o,o){er(i)&&n(!0);return}rt(i,function(p){p.forceMinPriority(u.transport.priority)}),n(null,u)}})},e}(),St=Zn;function tr(e,t,n){var r=Dt(e,function(i,o,u,p){return i.connect(t,n(o,p))});return{abort:function(){rt(r,nr)},forceMinPriority:function(i){rt(r,function(o){o.forceMinPriority(i)})}}}function er(e){return De(e,function(t){return!!t.error})}function nr(e){!e.error&&!e.aborted&&(e.abort(),e.aborted=!0)}var rr=function(){function e(t,n,r){this.strategy=t,this.transports=n,this.ttl=r.ttl||1800*1e3,this.usingTLS=r.useTLS,this.timeline=r.timeline}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.usingTLS,i=or(r),o=[this.strategy];if(i&&i.timestamp+this.ttl>=j.now()){var u=this.transports[i.transport];u&&(this.timeline.info({cached:!0,transport:i.transport,latency:i.latency}),o.push(new Y([u],{timeout:i.latency*2+1e3,failFast:!0})))}var p=j.now(),_=o.pop().connect(t,function g(k,E){k?(Qt(r),o.length>0?(p=j.now(),_=o.pop().connect(t,g)):n(k)):(sr(r,E.transport.name,j.now()-p),n(null,E))});return{abort:function(){_.abort()},forceMinPriority:function(g){t=g,_&&_.forceMinPriority(g)}}},e}(),ir=rr;function Ct(e){return"pusherTransport"+(e?"TLS":"NonTLS")}function or(e){var t=m.getLocalStorage();if(t)try{var n=t[Ct(e)];if(n)return JSON.parse(n)}catch{Qt(e)}return null}function sr(e,t,n){var r=m.getLocalStorage();if(r)try{r[Ct(e)]=ct({timestamp:j.now(),transport:t,latency:n})}catch{}}function Qt(e){var t=m.getLocalStorage();if(t)try{delete t[Ct(e)]}catch{}}var ar=function(){function e(t,n){var r=n.delay;this.strategy=t,this.options={delay:r}}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.strategy,i,o=new Q(this.options.delay,function(){i=r.connect(t,n)});return{abort:function(){o.ensureAborted(),i&&i.abort()},forceMinPriority:function(u){t=u,i&&i.forceMinPriority(u)}}},e}(),ht=ar,cr=function(){function e(t,n,r){this.test=t,this.trueBranch=n,this.falseBranch=r}return e.prototype.isSupported=function(){var t=this.test()?this.trueBranch:this.falseBranch;return t.isSupported()},e.prototype.connect=function(t,n){var r=this.test()?this.trueBranch:this.falseBranch;return r.connect(t,n)},e}(),it=cr,ur=function(){function e(t){this.strategy=t}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.strategy.connect(t,function(i,o){o&&r.abort(),n(i,o)});return r},e}(),hr=ur;function ot(e){return function(){return e.isSupported()}}var lr=function(e,t,n){var r={};function i(ce,_i,bi,mi,wi){var ue=n(e,ce,_i,bi,mi,wi);return r[ce]=ue,ue}var o=Object.assign({},t,{hostNonTLS:e.wsHost+":"+e.wsPort,hostTLS:e.wsHost+":"+e.wssPort,httpPath:e.wsPath}),u=Object.assign({},o,{useTLS:!0}),p=Object.assign({},t,{hostNonTLS:e.httpHost+":"+e.httpPort,hostTLS:e.httpHost+":"+e.httpsPort,httpPath:e.httpPath}),_={loop:!0,timeout:15e3,timeoutLimit:6e4},g=new Gt({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),k=new Gt({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),E=i("ws","ws",3,o,g),X=i("wss","ws",3,u,g),pi=i("sockjs","sockjs",1,p),ne=i("xhr_streaming","xhr_streaming",1,p,k),di=i("xdr_streaming","xdr_streaming",1,p,k),re=i("xhr_polling","xhr_polling",1,p),vi=i("xdr_polling","xdr_polling",1,p),ie=new Y([E],_),yi=new Y([X],_),gi=new Y([pi],_),oe=new Y([new it(ot(ne),ne,di)],_),se=new Y([new it(ot(re),re,vi)],_),ae=new Y([new it(ot(oe),new St([oe,new ht(se,{delay:4e3})]),se)],_),Ot=new it(ot(ae),ae,gi),At;return t.useTLS?At=new St([ie,new ht(Ot,{delay:2e3})]):At=new St([ie,new ht(yi,{delay:2e3}),new ht(Ot,{delay:5e3})]),new ir(new hr(new it(ot(E),At,Ot)),r,{ttl:18e5,timeline:t.timeline,useTLS:t.useTLS})},fr=lr,pr=function(){var e=this;e.timeline.info(e.buildTimelineMessage({transport:e.name+(e.options.useTLS?"s":"")})),e.hooks.isInitialized()?e.changeState("initialized"):e.hooks.file?(e.changeState("initializing"),S.load(e.hooks.file,{useTLS:e.options.useTLS},function(t,n){e.hooks.isInitialized()?(e.changeState("initialized"),n(!0)):(t&&e.onError(t),e.onClose(),n(!1))})):e.onClose()},dr={getRequest:function(e){var t=new window.XDomainRequest;return t.ontimeout=function(){e.emit("error",new I),e.close()},t.onerror=function(n){e.emit("error",n),e.close()},t.onprogress=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText)},t.onload=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText),e.emit("finished",200),e.close()},t},abortRequest:function(e){e.ontimeout=e.onerror=e.onprogress=e.onload=null,e.abort()}},vr=dr,yr=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),gr=256*1024,_r=function(e){yr(t,e);function t(n,r,i){var o=e.call(this)||this;return o.hooks=n,o.method=r,o.url=i,o}return t.prototype.start=function(n){var r=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){r.close()},m.addUnloadListener(this.unloader),this.xhr.open(this.method,this.url,!0),this.xhr.setRequestHeader&&this.xhr.setRequestHeader("Content-Type","application/json"),this.xhr.send(n)},t.prototype.close=function(){this.unloader&&(m.removeUnloadListener(this.unloader),this.unloader=null),this.xhr&&(this.hooks.abortRequest(this.xhr),this.xhr=null)},t.prototype.onChunk=function(n,r){for(;;){var i=this.advanceBuffer(r);if(i)this.emit("chunk",{status:n,data:i});else break}this.isBufferTooLong(r)&&this.emit("buffer_too_long")},t.prototype.advanceBuffer=function(n){var r=n.slice(this.position),i=r.indexOf(` -`);return i!==-1?(this.position+=i+1,r.slice(0,i)):null},t.prototype.isBufferTooLong=function(n){return this.position===n.length&&n.length>gr},t}(V),br=_r,Tt;(function(e){e[e.CONNECTING=0]="CONNECTING",e[e.OPEN=1]="OPEN",e[e.CLOSED=3]="CLOSED"})(Tt||(Tt={}));var $=Tt,mr=1,wr=function(){function e(t,n){this.hooks=t,this.session=Yt(1e3)+"/"+Tr(8),this.location=kr(n),this.readyState=$.CONNECTING,this.openStream()}return e.prototype.send=function(t){return this.sendRaw(JSON.stringify([t]))},e.prototype.ping=function(){this.hooks.sendHeartbeat(this)},e.prototype.close=function(t,n){this.onClose(t,n,!0)},e.prototype.sendRaw=function(t){if(this.readyState===$.OPEN)try{return m.createSocketRequest("POST",Kt(Sr(this.location,this.session))).start(t),!0}catch{return!1}else return!1},e.prototype.reconnect=function(){this.closeStream(),this.openStream()},e.prototype.onClose=function(t,n,r){this.closeStream(),this.readyState=$.CLOSED,this.onclose&&this.onclose({code:t,reason:n,wasClean:r})},e.prototype.onChunk=function(t){if(t.status===200){this.readyState===$.OPEN&&this.onActivity();var n,r=t.data.slice(0,1);switch(r){case"o":n=JSON.parse(t.data.slice(1)||"{}"),this.onOpen(n);break;case"a":n=JSON.parse(t.data.slice(1)||"[]");for(var i=0;i0&&e.onChunk(n.status,n.responseText);break;case 4:n.responseText&&n.responseText.length>0&&e.onChunk(n.status,n.responseText),e.emit("finished",n.status),e.close();break}},n},abortRequest:function(e){e.onreadystatechange=null,e.abort()}},Rr=Lr,Ir={createStreamingSocket:function(e){return this.createSocket(Or,e)},createPollingSocket:function(e){return this.createSocket(Er,e)},createSocket:function(e,t){return new Pr(e,t)},createXHR:function(e,t){return this.createRequest(Rr,e,t)},createRequest:function(e,t,n){return new br(e,t,n)}},$t=Ir;$t.createXDR=function(e,t){return this.createRequest(vr,e,t)};var jr=$t,Nr={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:s,DependenciesReceivers:T,getDefaultStrategy:fr,Transports:yn,transportConnectionInitializer:pr,HTTPFactory:jr,TimelineTransport:Ye,getXHRAPI:function(){return window.XMLHttpRequest},getWebSocketAPI:function(){return window.WebSocket||window.MozWebSocket},setup:function(e){var t=this;window.Pusher=e;var n=function(){t.onDocumentBody(e.ready)};window.JSON?n():S.load("json2",{},n)},getDocument:function(){return document},getProtocol:function(){return this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:we,jsonp:Xe}},onDocumentBody:function(e){var t=this;document.body?e():setTimeout(function(){t.onDocumentBody(e)},0)},createJSONPRequest:function(e,t){return new Ge(e,t)},createScriptRequest:function(e){return new We(e)},getLocalStorage:function(){try{return window.localStorage}catch{return}},createXHR:function(){return this.getXHRAPI()?this.createXMLHttpRequest():this.createMicrosoftXHR()},createXMLHttpRequest:function(){var e=this.getXHRAPI();return new e},createMicrosoftXHR:function(){return new ActiveXObject("Microsoft.XMLHTTP")},getNetwork:function(){return bn},createWebSocket:function(e){var t=this.getWebSocketAPI();return new t(e)},createSocketRequest:function(e,t){if(this.isXHRSupported())return this.HTTPFactory.createXHR(e,t);if(this.isXDRSupported(t.indexOf("https:")===0))return this.HTTPFactory.createXDR(e,t);throw"Cross-origin HTTP requests are not supported"},isXHRSupported:function(){var e=this.getXHRAPI();return!!e&&new e().withCredentials!==void 0},isXDRSupported:function(e){var t=e?"https:":"http:",n=this.getProtocol();return!!window.XDomainRequest&&n===t},addUnloadListener:function(e){window.addEventListener!==void 0?window.addEventListener("unload",e,!1):window.attachEvent!==void 0&&window.attachEvent("onunload",e)},removeUnloadListener:function(e){window.addEventListener!==void 0?window.removeEventListener("unload",e,!1):window.detachEvent!==void 0&&window.detachEvent("onunload",e)},randomInt:function(e){var t=function(){var n=window.crypto||window.msCrypto,r=n.getRandomValues(new Uint32Array(1))[0];return r/Math.pow(2,32)};return Math.floor(t()*e)}},m=Nr,Pt;(function(e){e[e.ERROR=3]="ERROR",e[e.INFO=6]="INFO",e[e.DEBUG=7]="DEBUG"})(Pt||(Pt={}));var lt=Pt,qr=function(){function e(t,n,r){this.key=t,this.session=n,this.events=[],this.options=r||{},this.sent=0,this.uniqueID=0}return e.prototype.log=function(t,n){t<=this.options.level&&(this.events.push(U({},n,{timestamp:j.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},e.prototype.error=function(t){this.log(lt.ERROR,t)},e.prototype.info=function(t){this.log(lt.INFO,t)},e.prototype.debug=function(t){this.log(lt.DEBUG,t)},e.prototype.isEmpty=function(){return this.events.length===0},e.prototype.send=function(t,n){var r=this,i=U({session:this.session,bundle:this.sent+1,key:this.key,lib:"js",version:this.options.version,cluster:this.options.cluster,features:this.options.features,timeline:this.events},this.options.params);return this.events=[],t(i,function(o,u){o||r.sent++,n&&n(o,u)}),!0},e.prototype.generateUniqueID=function(){return this.uniqueID++,this.uniqueID},e}(),Ur=qr,Dr=function(){function e(t,n,r,i){this.name=t,this.priority=n,this.transport=r,this.options=i||{}}return e.prototype.isSupported=function(){return this.transport.isSupported({useTLS:this.options.useTLS})},e.prototype.connect=function(t,n){var r=this;if(this.isSupported()){if(this.priority"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Li(l){if(l===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return l}function Ri(l,h){if(h&&(typeof h=="object"||typeof h=="function"))return h;if(h!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Li(l)}function H(l){var h=Ei();return function(){var c=pt(l),s;if(h){var f=pt(this).constructor;s=Reflect.construct(c,arguments,f)}else s=c.apply(this,arguments);return Ri(this,s)}}var Lt=function(){function l(){L(this,l)}return R(l,[{key:"listenForWhisper",value:function(a,c){return this.listen(".client-"+a,c)}},{key:"notification",value:function(a){return this.listen(".Illuminate\\Notifications\\Events\\BroadcastNotificationCreated",a)}},{key:"stopListeningForWhisper",value:function(a,c){return this.stopListening(".client-"+a,c)}}]),l}(),de=function(){function l(h){L(this,l),this.namespace=h}return R(l,[{key:"format",value:function(a){return[".","\\"].includes(a.charAt(0))?a.substring(1):(this.namespace&&(a=this.namespace+"."+a),a.replace(/\./g,"\\"))}},{key:"setNamespace",value:function(a){this.namespace=a}}]),l}(),vt=function(l){D(a,l);var h=H(a);function a(c,s,f){var d;return L(this,a),d=h.call(this),d.name=s,d.pusher=c,d.options=f,d.eventFormatter=new de(d.options.namespace),d.subscribe(),d}return R(a,[{key:"subscribe",value:function(){this.subscription=this.pusher.subscribe(this.name)}},{key:"unsubscribe",value:function(){this.pusher.unsubscribe(this.name)}},{key:"listen",value:function(s,f){return this.on(this.eventFormatter.format(s),f),this}},{key:"listenToAll",value:function(s){var f=this;return this.subscription.bind_global(function(d,N){if(!d.startsWith("pusher:")){var P=f.options.namespace.replace(/\./g,"\\"),T=d.startsWith(P)?d.substring(P.length+1):"."+d;s(T,N)}}),this}},{key:"stopListening",value:function(s,f){return f?this.subscription.unbind(this.eventFormatter.format(s),f):this.subscription.unbind(this.eventFormatter.format(s)),this}},{key:"stopListeningToAll",value:function(s){return s?this.subscription.unbind_global(s):this.subscription.unbind_global(),this}},{key:"subscribed",value:function(s){return this.on("pusher:subscription_succeeded",function(){s()}),this}},{key:"error",value:function(s){return this.on("pusher:subscription_error",function(f){s(f)}),this}},{key:"on",value:function(s,f){return this.subscription.bind(s,f),this}}]),a}(Lt),Ii=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}}]),a}(vt),ji=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}}]),a}(vt),Ni=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this.on("pusher:subscription_succeeded",function(f){s(Object.keys(f.members).map(function(d){return f.members[d]}))}),this}},{key:"joining",value:function(s){return this.on("pusher:member_added",function(f){s(f.info)}),this}},{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}},{key:"leaving",value:function(s){return this.on("pusher:member_removed",function(f){s(f.info)}),this}}]),a}(vt),ve=function(l){D(a,l);var h=H(a);function a(c,s,f){var d;return L(this,a),d=h.call(this),d.events={},d.listeners={},d.name=s,d.socket=c,d.options=f,d.eventFormatter=new de(d.options.namespace),d.subscribe(),d}return R(a,[{key:"subscribe",value:function(){this.socket.emit("subscribe",{channel:this.name,auth:this.options.auth||{}})}},{key:"unsubscribe",value:function(){this.unbind(),this.socket.emit("unsubscribe",{channel:this.name,auth:this.options.auth||{}})}},{key:"listen",value:function(s,f){return this.on(this.eventFormatter.format(s),f),this}},{key:"stopListening",value:function(s,f){return this.unbindEvent(this.eventFormatter.format(s),f),this}},{key:"subscribed",value:function(s){return this.on("connect",function(f){s(f)}),this}},{key:"error",value:function(s){return this}},{key:"on",value:function(s,f){var d=this;return this.listeners[s]=this.listeners[s]||[],this.events[s]||(this.events[s]=function(N,P){d.name===N&&d.listeners[s]&&d.listeners[s].forEach(function(T){return T(P)})},this.socket.on(s,this.events[s])),this.listeners[s].push(f),this}},{key:"unbind",value:function(){var s=this;Object.keys(this.events).forEach(function(f){s.unbindEvent(f)})}},{key:"unbindEvent",value:function(s,f){this.listeners[s]=this.listeners[s]||[],f&&(this.listeners[s]=this.listeners[s].filter(function(d){return d!==f})),(!f||this.listeners[s].length===0)&&(this.events[s]&&(this.socket.removeListener(s,this.events[s]),delete this.events[s]),delete this.listeners[s])}}]),a}(Lt),ye=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.socket.emit("client event",{channel:this.name,event:"client-".concat(s),data:f}),this}}]),a}(ve),qi=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this.on("presence:subscribed",function(f){s(f.map(function(d){return d.user_info}))}),this}},{key:"joining",value:function(s){return this.on("presence:joining",function(f){return s(f.user_info)}),this}},{key:"whisper",value:function(s,f){return this.socket.emit("client event",{channel:this.name,event:"client-".concat(s),data:f}),this}},{key:"leaving",value:function(s){return this.on("presence:leaving",function(f){return s(f.user_info)}),this}}]),a}(ye),dt=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"subscribe",value:function(){}},{key:"unsubscribe",value:function(){}},{key:"listen",value:function(s,f){return this}},{key:"listenToAll",value:function(s){return this}},{key:"stopListening",value:function(s,f){return this}},{key:"subscribed",value:function(s){return this}},{key:"error",value:function(s){return this}},{key:"on",value:function(s,f){return this}}]),a}(Lt),fe=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this}}]),a}(dt),Ui=function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this}},{key:"joining",value:function(s){return this}},{key:"whisper",value:function(s,f){return this}},{key:"leaving",value:function(s){return this}}]),a}(dt),Rt=function(){function l(h){L(this,l),this._defaultOptions={auth:{headers:{}},authEndpoint:"/broadcasting/auth",userAuthentication:{endpoint:"/broadcasting/user-auth",headers:{}},broadcaster:"pusher",csrfToken:null,bearerToken:null,host:null,key:null,namespace:"App.Events"},this.setOptions(h),this.connect()}return R(l,[{key:"setOptions",value:function(a){this.options=st(this._defaultOptions,a);var c=this.csrfToken();return c&&(this.options.auth.headers["X-CSRF-TOKEN"]=c,this.options.userAuthentication.headers["X-CSRF-TOKEN"]=c),c=this.options.bearerToken,c&&(this.options.auth.headers.Authorization="Bearer "+c,this.options.userAuthentication.headers.Authorization="Bearer "+c),a}},{key:"csrfToken",value:function(){var a;return typeof window<"u"&&window.Laravel&&window.Laravel.csrfToken?window.Laravel.csrfToken:this.options.csrfToken?this.options.csrfToken:typeof document<"u"&&typeof document.querySelector=="function"&&(a=document.querySelector('meta[name="csrf-token"]'))?a.getAttribute("content"):null}}]),l}(),pe=function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){typeof this.options.client<"u"?this.pusher=this.options.client:this.options.Pusher?this.pusher=new this.options.Pusher(this.options.key,this.options):this.pusher=new Pusher(this.options.key,this.options)}},{key:"signin",value:function(){this.pusher.signin()}},{key:"listen",value:function(s,f,d){return this.channel(s).listen(f,d)}},{key:"channel",value:function(s){return this.channels[s]||(this.channels[s]=new vt(this.pusher,s,this.options)),this.channels[s]}},{key:"privateChannel",value:function(s){return this.channels["private-"+s]||(this.channels["private-"+s]=new Ii(this.pusher,"private-"+s,this.options)),this.channels["private-"+s]}},{key:"encryptedPrivateChannel",value:function(s){return this.channels["private-encrypted-"+s]||(this.channels["private-encrypted-"+s]=new ji(this.pusher,"private-encrypted-"+s,this.options)),this.channels["private-encrypted-"+s]}},{key:"presenceChannel",value:function(s){return this.channels["presence-"+s]||(this.channels["presence-"+s]=new Ni(this.pusher,"presence-"+s,this.options)),this.channels["presence-"+s]}},{key:"leave",value:function(s){var f=this,d=[s,"private-"+s,"private-encrypted-"+s,"presence-"+s];d.forEach(function(N,P){f.leaveChannel(N)})}},{key:"leaveChannel",value:function(s){this.channels[s]&&(this.channels[s].unsubscribe(),delete this.channels[s])}},{key:"socketId",value:function(){return this.pusher.connection.socket_id}},{key:"disconnect",value:function(){this.pusher.disconnect()}}]),a}(Rt),Di=function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){var s=this,f=this.getSocketIO();return this.socket=f(this.options.host,this.options),this.socket.on("reconnect",function(){Object.values(s.channels).forEach(function(d){d.subscribe()})}),this.socket}},{key:"getSocketIO",value:function(){if(typeof this.options.client<"u")return this.options.client;if(typeof io<"u")return io;throw new Error("Socket.io client not found. Should be globally available or passed via options.client")}},{key:"listen",value:function(s,f,d){return this.channel(s).listen(f,d)}},{key:"channel",value:function(s){return this.channels[s]||(this.channels[s]=new ve(this.socket,s,this.options)),this.channels[s]}},{key:"privateChannel",value:function(s){return this.channels["private-"+s]||(this.channels["private-"+s]=new ye(this.socket,"private-"+s,this.options)),this.channels["private-"+s]}},{key:"presenceChannel",value:function(s){return this.channels["presence-"+s]||(this.channels["presence-"+s]=new qi(this.socket,"presence-"+s,this.options)),this.channels["presence-"+s]}},{key:"leave",value:function(s){var f=this,d=[s,"private-"+s,"presence-"+s];d.forEach(function(N){f.leaveChannel(N)})}},{key:"leaveChannel",value:function(s){this.channels[s]&&(this.channels[s].unsubscribe(),delete this.channels[s])}},{key:"socketId",value:function(){return this.socket.id}},{key:"disconnect",value:function(){this.socket.disconnect()}}]),a}(Rt),Hi=function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){}},{key:"listen",value:function(s,f,d){return new dt}},{key:"channel",value:function(s){return new dt}},{key:"privateChannel",value:function(s){return new fe}},{key:"encryptedPrivateChannel",value:function(s){return new fe}},{key:"presenceChannel",value:function(s){return new Ui}},{key:"leave",value:function(s){}},{key:"leaveChannel",value:function(s){}},{key:"socketId",value:function(){return"fake-socket-id"}},{key:"disconnect",value:function(){}}]),a}(Rt),ge=function(){function l(h){L(this,l),this.options=h,this.connect(),this.options.withoutInterceptors||this.registerInterceptors()}return R(l,[{key:"channel",value:function(a){return this.connector.channel(a)}},{key:"connect",value:function(){if(this.options.broadcaster=="reverb")this.connector=new pe(st(st({},this.options),{cluster:""}));else if(this.options.broadcaster=="pusher")this.connector=new pe(this.options);else if(this.options.broadcaster=="socket.io")this.connector=new Di(this.options);else if(this.options.broadcaster=="null")this.connector=new Hi(this.options);else if(typeof this.options.broadcaster=="function")this.connector=new this.options.broadcaster(this.options);else throw new Error("Broadcaster ".concat(ft(this.options.broadcaster)," ").concat(this.options.broadcaster," is not supported."))}},{key:"disconnect",value:function(){this.connector.disconnect()}},{key:"join",value:function(a){return this.connector.presenceChannel(a)}},{key:"leave",value:function(a){this.connector.leave(a)}},{key:"leaveChannel",value:function(a){this.connector.leaveChannel(a)}},{key:"leaveAllChannels",value:function(){for(var a in this.connector.channels)this.leaveChannel(a)}},{key:"listen",value:function(a,c,s){return this.connector.listen(a,c,s)}},{key:"private",value:function(a){return this.connector.privateChannel(a)}},{key:"encryptedPrivate",value:function(a){return this.connector.encryptedPrivateChannel(a)}},{key:"socketId",value:function(){return this.connector.socketId()}},{key:"registerInterceptors",value:function(){typeof Vue=="function"&&Vue.http&&this.registerVueRequestInterceptor(),typeof axios=="function"&&this.registerAxiosRequestInterceptor(),typeof jQuery=="function"&&this.registerjQueryAjaxSetup(),(typeof Turbo>"u"?"undefined":ft(Turbo))==="object"&&this.registerTurboRequestInterceptor()}},{key:"registerVueRequestInterceptor",value:function(){var a=this;Vue.http.interceptors.push(function(c,s){a.socketId()&&c.headers.set("X-Socket-ID",a.socketId()),s()})}},{key:"registerAxiosRequestInterceptor",value:function(){var a=this;axios.interceptors.request.use(function(c){return a.socketId()&&(c.headers["X-Socket-Id"]=a.socketId()),c})}},{key:"registerjQueryAjaxSetup",value:function(){var a=this;typeof jQuery.ajax<"u"&&jQuery.ajaxPrefilter(function(c,s,f){a.socketId()&&f.setRequestHeader("X-Socket-Id",a.socketId())})}},{key:"registerTurboRequestInterceptor",value:function(){var a=this;document.addEventListener("turbo:before-fetch-request",function(c){c.detail.fetchOptions.headers["X-Socket-Id"]=a.socketId()})}}]),l}();var be=Ai(_e(),1);window.EchoFactory=ge;window.Pusher=be.default;})(); +(()=>{var Ci=Object.create;var he=Object.defineProperty;var Ti=Object.getOwnPropertyDescriptor;var Pi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,Oi=Object.prototype.hasOwnProperty;var Ai=(l,h)=>()=>(h||l((h={exports:{}}).exports,h),h.exports);var Ei=(l,h,a,c)=>{if(h&&typeof h=="object"||typeof h=="function")for(let s of Pi(h))!Oi.call(l,s)&&s!==a&&he(l,s,{get:()=>h[s],enumerable:!(c=Ti(h,s))||c.enumerable});return l};var Li=(l,h,a)=>(a=l!=null?Ci(xi(l)):{},Ei(h||!l||!l.__esModule?he(a,"default",{value:l,enumerable:!0}):a,l));var me=Ai((vt,It)=>{(function(h,a){typeof vt=="object"&&typeof It=="object"?It.exports=a():typeof define=="function"&&define.amd?define([],a):typeof vt=="object"?vt.Pusher=a():h.Pusher=a()})(window,function(){return(function(l){var h={};function a(c){if(h[c])return h[c].exports;var s=h[c]={i:c,l:!1,exports:{}};return l[c].call(s.exports,s,s.exports,a),s.l=!0,s.exports}return a.m=l,a.c=h,a.d=function(c,s,f){a.o(c,s)||Object.defineProperty(c,s,{enumerable:!0,get:f})},a.r=function(c){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},a.t=function(c,s){if(s&1&&(c=a(c)),s&8||s&4&&typeof c=="object"&&c&&c.__esModule)return c;var f=Object.create(null);if(a.r(f),Object.defineProperty(f,"default",{enumerable:!0,value:c}),s&2&&typeof c!="string")for(var d in c)a.d(f,d,function(N){return c[N]}.bind(null,d));return f},a.n=function(c){var s=c&&c.__esModule?function(){return c.default}:function(){return c};return a.d(s,"a",s),s},a.o=function(c,s){return Object.prototype.hasOwnProperty.call(c,s)},a.p="",a(a.s=2)})([(function(l,h,a){"use strict";var c=this&&this.__extends||(function(){var b=function(v,y){return b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(w,O){w.__proto__=O}||function(w,O){for(var I in O)O.hasOwnProperty(I)&&(w[I]=O[I])},b(v,y)};return function(v,y){b(v,y);function w(){this.constructor=v}v.prototype=y===null?Object.create(y):(w.prototype=y.prototype,new w)}})();Object.defineProperty(h,"__esModule",{value:!0});var s=256,f=(function(){function b(v){v===void 0&&(v="="),this._paddingCharacter=v}return b.prototype.encodedLength=function(v){return this._paddingCharacter?(v+2)/3*4|0:(v*8+5)/6|0},b.prototype.encode=function(v){for(var y="",w=0;w>>18&63),y+=this._encodeByte(O>>>12&63),y+=this._encodeByte(O>>>6&63),y+=this._encodeByte(O>>>0&63)}var I=v.length-w;if(I>0){var O=v[w]<<16|(I===2?v[w+1]<<8:0);y+=this._encodeByte(O>>>18&63),y+=this._encodeByte(O>>>12&63),I===2?y+=this._encodeByte(O>>>6&63):y+=this._paddingCharacter||"",y+=this._paddingCharacter||""}return y},b.prototype.maxDecodedLength=function(v){return this._paddingCharacter?v/4*3|0:(v*6+7)/8|0},b.prototype.decodedLength=function(v){return this.maxDecodedLength(v.length-this._getPaddingLength(v))},b.prototype.decode=function(v){if(v.length===0)return new Uint8Array(0);for(var y=this._getPaddingLength(v),w=v.length-y,O=new Uint8Array(this.maxDecodedLength(w)),I=0,q=0,M=0,J=0,F=0,z=0,B=0;q>>4,O[I++]=F<<4|z>>>2,O[I++]=z<<6|B,M|=J&s,M|=F&s,M|=z&s,M|=B&s;if(q>>4,M|=J&s,M|=F&s),q>>2,M|=z&s),q>>8&6,y+=51-v>>>8&-75,y+=61-v>>>8&-15,y+=62-v>>>8&3,String.fromCharCode(y)},b.prototype._decodeChar=function(v){var y=s;return y+=(42-v&v-44)>>>8&-s+v-43+62,y+=(46-v&v-48)>>>8&-s+v-47+63,y+=(47-v&v-58)>>>8&-s+v-48+52,y+=(64-v&v-91)>>>8&-s+v-65+0,y+=(96-v&v-123)>>>8&-s+v-97+26,y},b.prototype._getPaddingLength=function(v){var y=0;if(this._paddingCharacter){for(var w=v.length-1;w>=0&&v[w]===this._paddingCharacter;w--)y++;if(v.length<4||y>2)throw new Error("Base64Coder: incorrect padding")}return y},b})();h.Coder=f;var d=new f;function N(b){return d.encode(b)}h.encode=N;function P(b){return d.decode(b)}h.decode=P;var T=(function(b){c(v,b);function v(){return b!==null&&b.apply(this,arguments)||this}return v.prototype._encodeByte=function(y){var w=y;return w+=65,w+=25-y>>>8&6,w+=51-y>>>8&-75,w+=61-y>>>8&-13,w+=62-y>>>8&49,String.fromCharCode(w)},v.prototype._decodeChar=function(y){var w=s;return w+=(44-y&y-46)>>>8&-s+y-45+62,w+=(94-y&y-96)>>>8&-s+y-95+63,w+=(47-y&y-58)>>>8&-s+y-48+52,w+=(64-y&y-91)>>>8&-s+y-65+0,w+=(96-y&y-123)>>>8&-s+y-97+26,w},v})(f);h.URLSafeCoder=T;var S=new T;function C(b){return S.encode(b)}h.encodeURLSafe=C;function x(b){return S.decode(b)}h.decodeURLSafe=x,h.encodedLength=function(b){return d.encodedLength(b)},h.maxDecodedLength=function(b){return d.maxDecodedLength(b)},h.decodedLength=function(b){return d.decodedLength(b)}}),(function(l,h,a){"use strict";Object.defineProperty(h,"__esModule",{value:!0});var c="utf8: invalid string",s="utf8: invalid source encoding";function f(P){for(var T=new Uint8Array(d(P)),S=0,C=0;C>6,T[S++]=128|x&63):x<55296?(T[S++]=224|x>>12,T[S++]=128|x>>6&63,T[S++]=128|x&63):(C++,x=(x&1023)<<10,x|=P.charCodeAt(C)&1023,x+=65536,T[S++]=240|x>>18,T[S++]=128|x>>12&63,T[S++]=128|x>>6&63,T[S++]=128|x&63)}return T}h.encode=f;function d(P){for(var T=0,S=0;S=P.length-1)throw new Error(c);S++,T+=4}else throw new Error(c)}return T}h.encodedLength=d;function N(P){for(var T=[],S=0;S=P.length)throw new Error(s);var b=P[++S];if((b&192)!==128)throw new Error(s);C=(C&31)<<6|b&63,x=128}else if(C<240){if(S>=P.length-1)throw new Error(s);var b=P[++S],v=P[++S];if((b&192)!==128||(v&192)!==128)throw new Error(s);C=(C&15)<<12|(b&63)<<6|v&63,x=2048}else if(C<248){if(S>=P.length-2)throw new Error(s);var b=P[++S],v=P[++S],y=P[++S];if((b&192)!==128||(v&192)!==128||(y&192)!==128)throw new Error(s);C=(C&15)<<18|(b&63)<<12|(v&63)<<6|y&63,x=65536}else throw new Error(s);if(C=55296&&C<=57343)throw new Error(s);if(C>=65536){if(C>1114111)throw new Error(s);C-=65536,T.push(String.fromCharCode(55296|C>>10)),C=56320|C&1023}}T.push(String.fromCharCode(C))}return T.join("")}h.decode=N}),(function(l,h,a){l.exports=a(3).default}),(function(l,h,a){"use strict";a.r(h);var c=(function(){function e(t,n){this.lastId=0,this.prefix=t,this.name=n}return e.prototype.create=function(t){this.lastId++;var n=this.lastId,r=this.prefix+n,i=this.name+"["+n+"]",o=!1,u=function(){o||(t.apply(null,arguments),o=!0)};return this[n]=u,{number:n,id:r,name:i,callback:u}},e.prototype.remove=function(t){delete this[t.number]},e})(),s=new c("_pusher_script_","Pusher.ScriptReceivers"),f={VERSION:"7.6.0",PROTOCOL:7,wsPort:80,wssPort:443,wsPath:"",httpHost:"sockjs.pusher.com",httpPort:80,httpsPort:443,httpPath:"/pusher",stats_host:"stats.pusher.com",authEndpoint:"/pusher/auth",authTransport:"ajax",activityTimeout:12e4,pongTimeout:3e4,unavailableTimeout:1e4,cluster:"mt1",userAuthentication:{endpoint:"/pusher/user-auth",transport:"ajax"},channelAuthorization:{endpoint:"/pusher/auth",transport:"ajax"},cdn_http:"http://js.pusher.com",cdn_https:"https://js.pusher.com",dependency_suffix:""},d=f,N=(function(){function e(t){this.options=t,this.receivers=t.receivers||s,this.loading={}}return e.prototype.load=function(t,n,r){var i=this;if(i.loading[t]&&i.loading[t].length>0)i.loading[t].push(r);else{i.loading[t]=[r];var o=m.createScriptRequest(i.getPath(t,n)),u=i.receivers.create(function(p){if(i.receivers.remove(u),i.loading[t]){var _=i.loading[t];delete i.loading[t];for(var g=function(E){E||o.cleanup()},k=0;k<_.length;k++)_[k](p,g)}});o.send(u)}},e.prototype.getRoot=function(t){var n,r=m.getDocument().location.protocol;return t&&t.useTLS||r==="https:"?n=this.options.cdn_https:n=this.options.cdn_http,n.replace(/\/*$/,"")+"/"+this.options.version},e.prototype.getPath=function(t,n){return this.getRoot(n)+"/"+t+this.options.suffix+".js"},e})(),P=N,T=new c("_pusher_dependencies","Pusher.DependenciesReceivers"),S=new P({cdn_http:d.cdn_http,cdn_https:d.cdn_https,version:d.VERSION,suffix:d.dependency_suffix,receivers:T}),C={baseUrl:"https://pusher.com",urls:{authenticationEndpoint:{path:"/docs/channels/server_api/authenticating_users"},authorizationEndpoint:{path:"/docs/channels/server_api/authorizing-users/"},javascriptQuickStart:{path:"/docs/javascript_quick_start"},triggeringClientEvents:{path:"/docs/client_api_guide/client_events#trigger-events"},encryptedChannelSupport:{fullUrl:"https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support"}}},x=function(e){var t="See:",n=C.urls[e];if(!n)return"";var r;return n.fullUrl?r=n.fullUrl:n.path&&(r=C.baseUrl+n.path),r?t+" "+r:""},b={buildLogSuffix:x},v;(function(e){e.UserAuthentication="user-authentication",e.ChannelAuthorization="channel-authorization"})(v||(v={}));var y=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),w=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),O=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),I=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),q=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),M=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),J=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),F=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),z=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),B=(function(e){y(t,e);function t(n,r){var i=this.constructor,o=e.call(this,r)||this;return o.status=n,Object.setPrototypeOf(o,i.prototype),o}return t})(Error),ke=function(e,t,n,r,i){var o=m.createXHR();o.open("POST",n.endpoint,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");for(var u in n.headers)o.setRequestHeader(u,n.headers[u]);if(n.headersProvider!=null){var p=n.headersProvider();for(var u in p)o.setRequestHeader(u,p[u])}return o.onreadystatechange=function(){if(o.readyState===4)if(o.status===200){var _=void 0,g=!1;try{_=JSON.parse(o.responseText),g=!0}catch{i(new B(200,"JSON returned from "+r.toString()+" endpoint was invalid, yet status code was 200. Data was: "+o.responseText),null)}g&&i(null,_)}else{var k="";switch(r){case v.UserAuthentication:k=b.buildLogSuffix("authenticationEndpoint");break;case v.ChannelAuthorization:k="Clients must be authorized to join private or presence channels. "+b.buildLogSuffix("authorizationEndpoint");break}i(new B(o.status,"Unable to retrieve auth string from "+r.toString()+" endpoint - "+("received status: "+o.status+" from "+n.endpoint+". "+k)),null)}},o.send(t),o},Se=ke;function Ce(e){return Ee(Oe(e))}for(var nt=String.fromCharCode,Z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Te={},ct=0,Pe=Z.length;ct>>6)+nt(128|t&63):nt(224|t>>>12&15)+nt(128|t>>>6&63)+nt(128|t&63)},Oe=function(e){return e.replace(/[^\x00-\x7F]/g,xe)},Ae=function(e){var t=[0,2,1][e.length%3],n=e.charCodeAt(0)<<16|(e.length>1?e.charCodeAt(1):0)<<8|(e.length>2?e.charCodeAt(2):0),r=[Z.charAt(n>>>18),Z.charAt(n>>>12&63),t>=2?"=":Z.charAt(n>>>6&63),t>=1?"=":Z.charAt(n&63)];return r.join("")},Ee=window.btoa||function(e){return e.replace(/[\s\S]{1,3}/g,Ae)},Le=(function(){function e(t,n,r,i){var o=this;this.clear=n,this.timer=t(function(){o.timer&&(o.timer=i(o.timer))},r)}return e.prototype.isRunning=function(){return this.timer!==null},e.prototype.ensureAborted=function(){this.timer&&(this.clear(this.timer),this.timer=null)},e})(),jt=Le,Nt=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})();function Re(e){window.clearTimeout(e)}function Ie(e){window.clearInterval(e)}var Q=(function(e){Nt(t,e);function t(n,r){return e.call(this,setTimeout,Re,n,function(i){return r(),null})||this}return t})(jt),je=(function(e){Nt(t,e);function t(n,r){return e.call(this,setInterval,Ie,n,function(i){return r(),i})||this}return t})(jt),Ne={now:function(){return Date.now?Date.now():new Date().valueOf()},defer:function(e){return new Q(0,e)},method:function(e){for(var t=[],n=1;n0)for(var i=0;i=1002&&e.code<=1004?"backoff":null:e.code===4e3?"tls_only":e.code<4100?"refused":e.code<4200?"backoff":e.code<4300?"retry":"refused"},getCloseError:function(e){return e.code!==1e3&&e.code!==1001?{type:"PusherError",data:{code:e.code,message:e.reason||e.message}}:null}},K=Vt,Cn=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Tn=(function(e){Cn(t,e);function t(n,r){var i=e.call(this)||this;return i.id=n,i.transport=r,i.activityTimeout=r.activityTimeout,i.bindListeners(),i}return t.prototype.handlesActivityChecks=function(){return this.transport.handlesActivityChecks()},t.prototype.send=function(n){return this.transport.send(n)},t.prototype.send_event=function(n,r,i){var o={event:n,data:r};return i&&(o.channel=i),A.debug("Event sent",o),this.send(K.encodeMessage(o))},t.prototype.ping=function(){this.transport.supportsPing()?this.transport.ping():this.send_event("pusher:ping",{})},t.prototype.close=function(){this.transport.close()},t.prototype.bindListeners=function(){var n=this,r={message:function(o){var u;try{u=K.decodeMessage(o)}catch(p){n.emit("error",{type:"MessageParseError",error:p,data:o.data})}if(u!==void 0){switch(A.debug("Event recd",u),u.event){case"pusher:error":n.emit("error",{type:"PusherError",data:u.data});break;case"pusher:ping":n.emit("ping");break;case"pusher:pong":n.emit("pong");break}n.emit("message",u)}},activity:function(){n.emit("activity")},error:function(o){n.emit("error",o)},closed:function(o){i(),o&&o.code&&n.handleCloseEvent(o),n.transport=null,n.emit("closed")}},i=function(){W(r,function(o,u){n.transport.unbind(u,o)})};W(r,function(o,u){n.transport.bind(u,o)})},t.prototype.handleCloseEvent=function(n){var r=K.getCloseAction(n),i=K.getCloseError(n);i&&this.emit("error",i),r&&this.emit(r,{action:r,error:i})},t})(V),Pn=Tn,xn=(function(){function e(t,n){this.transport=t,this.callback=n,this.bindListeners()}return e.prototype.close=function(){this.unbindListeners(),this.transport.close()},e.prototype.bindListeners=function(){var t=this;this.onMessage=function(n){t.unbindListeners();var r;try{r=K.processHandshake(n)}catch(i){t.finish("error",{error:i}),t.transport.close();return}r.action==="connected"?t.finish("connected",{connection:new Pn(r.id,t.transport),activityTimeout:r.activityTimeout}):(t.finish(r.action,{error:r.error}),t.transport.close())},this.onClosed=function(n){t.unbindListeners();var r=K.getCloseAction(n)||"backoff",i=K.getCloseError(n);t.finish(r,{error:i})},this.transport.bind("message",this.onMessage),this.transport.bind("closed",this.onClosed)},e.prototype.unbindListeners=function(){this.transport.unbind("message",this.onMessage),this.transport.unbind("closed",this.onClosed)},e.prototype.finish=function(t,n){this.callback(U({transport:this.transport,action:t},n))},e})(),On=xn,An=(function(){function e(t,n){this.timeline=t,this.options=n||{}}return e.prototype.send=function(t,n){this.timeline.isEmpty()||this.timeline.send(m.TimelineTransport.getAgent(this,t),n)},e})(),En=An,Ln=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Rn=(function(e){Ln(t,e);function t(n,r){var i=e.call(this,function(o,u){A.debug("No callbacks on "+n+" for "+o)})||this;return i.name=n,i.pusher=r,i.subscribed=!1,i.subscriptionPending=!1,i.subscriptionCancelled=!1,i}return t.prototype.authorize=function(n,r){return r(null,{auth:""})},t.prototype.trigger=function(n,r){if(n.indexOf("client-")!==0)throw new w("Event '"+n+"' does not start with 'client-'");if(!this.subscribed){var i=b.buildLogSuffix("triggeringClientEvents");A.warn("Client event triggered before channel 'subscription_succeeded' event . "+i)}return this.pusher.send_event(n,r,this.name)},t.prototype.disconnect=function(){this.subscribed=!1,this.subscriptionPending=!1},t.prototype.handleEvent=function(n){var r=n.event,i=n.data;if(r==="pusher_internal:subscription_succeeded")this.handleSubscriptionSucceededEvent(n);else if(r==="pusher_internal:subscription_count")this.handleSubscriptionCountEvent(n);else if(r.indexOf("pusher_internal:")!==0){var o={};this.emit(r,i,o)}},t.prototype.handleSubscriptionSucceededEvent=function(n){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):this.emit("pusher:subscription_succeeded",n.data)},t.prototype.handleSubscriptionCountEvent=function(n){n.data.subscription_count&&(this.subscriptionCount=n.data.subscription_count),this.emit("pusher:subscription_count",n.data)},t.prototype.subscribe=function(){var n=this;this.subscribed||(this.subscriptionPending=!0,this.subscriptionCancelled=!1,this.authorize(this.pusher.connection.socket_id,function(r,i){r?(n.subscriptionPending=!1,A.error(r.toString()),n.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:r.message},r instanceof B?{status:r.status}:{}))):n.pusher.send_event("pusher:subscribe",{auth:i.auth,channel_data:i.channel_data,channel:n.name})}))},t.prototype.unsubscribe=function(){this.subscribed=!1,this.pusher.send_event("pusher:unsubscribe",{channel:this.name})},t.prototype.cancelSubscription=function(){this.subscriptionCancelled=!0},t.prototype.reinstateSubscription=function(){this.subscriptionCancelled=!1},t})(V),bt=Rn,In=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),jn=(function(e){In(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.authorize=function(n,r){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:n},r)},t})(bt),mt=jn,Nn=(function(){function e(){this.reset()}return e.prototype.get=function(t){return Object.prototype.hasOwnProperty.call(this.members,t)?{id:t,info:this.members[t]}:null},e.prototype.each=function(t){var n=this;W(this.members,function(r,i){t(n.get(i))})},e.prototype.setMyID=function(t){this.myID=t},e.prototype.onSubscription=function(t){this.members=t.presence.hash,this.count=t.presence.count,this.me=this.get(this.myID)},e.prototype.addMember=function(t){return this.get(t.user_id)===null&&this.count++,this.members[t.user_id]=t.user_info,this.get(t.user_id)},e.prototype.removeMember=function(t){var n=this.get(t.user_id);return n&&(delete this.members[t.user_id],this.count--),n},e.prototype.reset=function(){this.members={},this.count=0,this.myID=null,this.me=null},e})(),qn=Nn,Un=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Dn=function(e,t,n,r){function i(o){return o instanceof n?o:new n(function(u){u(o)})}return new(n||(n=Promise))(function(o,u){function p(k){try{g(r.next(k))}catch(E){u(E)}}function _(k){try{g(r.throw(k))}catch(E){u(E)}}function g(k){k.done?o(k.value):i(k.value).then(p,_)}g((r=r.apply(e,t||[])).next())})},Hn=function(e,t){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,u;return u={next:p(0),throw:p(1),return:p(2)},typeof Symbol=="function"&&(u[Symbol.iterator]=function(){return this}),u;function p(g){return function(k){return _([g,k])}}function _(g){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,i&&(o=g[0]&2?i.return:g[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,g[1])).done)return o;switch(i=0,o&&(g=[g[0]&2,o.value]),g[0]){case 0:case 1:o=g;break;case 4:return n.label++,{value:g[1],done:!1};case 5:n.label++,i=g[1],g=[0];continue;case 7:g=n.ops.pop(),n.trys.pop();continue;default:if(o=n.trys,!(o=o.length>0&&o[o.length-1])&&(g[0]===6||g[0]===2)){n=0;continue}if(g[0]===3&&(!o||g[1]>o[0]&&g[1]0&&this.emit("connecting_in",Math.round(n/1e3)),this.retryTimer=new Q(n||0,function(){r.disconnectInternally(),r.connect()})},t.prototype.clearRetryTimer=function(){this.retryTimer&&(this.retryTimer.ensureAborted(),this.retryTimer=null)},t.prototype.setUnavailableTimer=function(){var n=this;this.unavailableTimer=new Q(this.options.unavailableTimeout,function(){n.updateState("unavailable")})},t.prototype.clearUnavailableTimer=function(){this.unavailableTimer&&this.unavailableTimer.ensureAborted()},t.prototype.sendActivityCheck=function(){var n=this;this.stopActivityCheck(),this.connection.ping(),this.activityTimer=new Q(this.options.pongTimeout,function(){n.timeline.error({pong_timed_out:n.options.pongTimeout}),n.retryIn(0)})},t.prototype.resetActivityCheck=function(){var n=this;this.stopActivityCheck(),this.connection&&!this.connection.handlesActivityChecks()&&(this.activityTimer=new Q(this.activityTimeout,function(){n.sendActivityCheck()}))},t.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},t.prototype.buildConnectionCallbacks=function(n){var r=this;return U({},n,{message:function(i){r.resetActivityCheck(),r.emit("message",i)},ping:function(){r.send_event("pusher:pong",{})},activity:function(){r.resetActivityCheck()},error:function(i){r.emit("error",i)},closed:function(){r.abandonConnection(),r.shouldRetry()&&r.retryIn(1e3)}})},t.prototype.buildHandshakeCallbacks=function(n){var r=this;return U({},n,{connected:function(i){r.activityTimeout=Math.min(r.options.activityTimeout,i.activityTimeout,i.connection.activityTimeout||1/0),r.clearUnavailableTimer(),r.setConnection(i.connection),r.socket_id=r.connection.id,r.updateState("connected",{socket_id:r.socket_id})}})},t.prototype.buildErrorCallbacks=function(){var n=this,r=function(i){return function(o){o.error&&n.emit("error",{type:"WebSocketError",error:o.error}),i(o)}};return{tls_only:r(function(){n.usingTLS=!0,n.updateStrategy(),n.retryIn(0)}),refused:r(function(){n.disconnect()}),backoff:r(function(){n.retryIn(1e3)}),retry:r(function(){n.retryIn(0)})}},t.prototype.setConnection=function(n){this.connection=n;for(var r in this.connectionCallbacks)this.connection.bind(r,this.connectionCallbacks[r]);this.resetActivityCheck()},t.prototype.abandonConnection=function(){if(this.connection){this.stopActivityCheck();for(var n in this.connectionCallbacks)this.connection.unbind(n,this.connectionCallbacks[n]);var r=this.connection;return this.connection=null,r}},t.prototype.updateState=function(n,r){var i=this.state;if(this.state=n,i!==n){var o=n;o==="connected"&&(o+=" with new socket ID "+r.socket_id),A.debug("State changed",i+" -> "+o),this.timeline.info({state:n,params:r}),this.emit("state_change",{previous:i,current:n}),this.emit(n,r)}},t.prototype.shouldRetry=function(){return this.state==="connecting"||this.state==="connected"},t})(V),Gn=Vn,Qn=(function(){function e(){this.channels={}}return e.prototype.add=function(t,n){return this.channels[t]||(this.channels[t]=Yn(t,n)),this.channels[t]},e.prototype.all=function(){return Ue(this.channels)},e.prototype.find=function(t){return this.channels[t]},e.prototype.remove=function(t){var n=this.channels[t];return delete this.channels[t],n},e.prototype.disconnect=function(){W(this.channels,function(t){t.disconnect()})},e})(),Kn=Qn;function Yn(e,t){if(e.indexOf("private-encrypted-")===0){if(t.config.nacl)return G.createEncryptedChannel(e,t,t.config.nacl);var n="Tried to subscribe to a private-encrypted- channel but no nacl implementation available",r=b.buildLogSuffix("encryptedChannelSupport");throw new J(n+". "+r)}else{if(e.indexOf("private-")===0)return G.createPrivateChannel(e,t);if(e.indexOf("presence-")===0)return G.createPresenceChannel(e,t);if(e.indexOf("#")===0)throw new O('Cannot create a channel with name "'+e+'".');return G.createChannel(e,t)}}var $n={createChannels:function(){return new Kn},createConnectionManager:function(e,t){return new Gn(e,t)},createChannel:function(e,t){return new bt(e,t)},createPrivateChannel:function(e,t){return new mt(e,t)},createPresenceChannel:function(e,t){return new zn(e,t)},createEncryptedChannel:function(e,t,n){return new Jn(e,t,n)},createTimelineSender:function(e,t){return new En(e,t)},createHandshake:function(e,t){return new On(e,t)},createAssistantToTheTransportManager:function(e,t,n){return new Sn(e,t,n)}},G=$n,Zn=(function(){function e(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return e.prototype.getAssistant=function(t){return G.createAssistantToTheTransportManager(this,t,{minPingDelay:this.options.minPingDelay,maxPingDelay:this.options.maxPingDelay})},e.prototype.isAlive=function(){return this.livesLeft>0},e.prototype.reportDeath=function(){this.livesLeft-=1},e})(),Gt=Zn,tr=(function(){function e(t,n){this.strategies=t,this.loop=!!n.loop,this.failFast=!!n.failFast,this.timeout=n.timeout,this.timeoutLimit=n.timeoutLimit}return e.prototype.isSupported=function(){return zt(this.strategies,j.method("isSupported"))},e.prototype.connect=function(t,n){var r=this,i=this.strategies,o=0,u=this.timeout,p=null,_=function(g,k){k?n(null,k):(o=o+1,r.loop&&(o=o%i.length),o0&&(o=new Q(r.timeout,function(){u.abort(),i(!0)})),u=t.connect(n,function(p,_){p&&o&&o.isRunning()&&!r.failFast||(o&&o.ensureAborted(),i(p,_))}),{abort:function(){o&&o.ensureAborted(),u.abort()},forceMinPriority:function(p){u.forceMinPriority(p)}}},e})(),Y=tr,er=(function(){function e(t){this.strategies=t}return e.prototype.isSupported=function(){return zt(this.strategies,j.method("isSupported"))},e.prototype.connect=function(t,n){return nr(this.strategies,t,function(r,i){return function(o,u){if(i[r].error=o,o){rr(i)&&n(!0);return}rt(i,function(p){p.forceMinPriority(u.transport.priority)}),n(null,u)}})},e})(),kt=er;function nr(e,t,n){var r=Dt(e,function(i,o,u,p){return i.connect(t,n(o,p))});return{abort:function(){rt(r,ir)},forceMinPriority:function(i){rt(r,function(o){o.forceMinPriority(i)})}}}function rr(e){return Me(e,function(t){return!!t.error})}function ir(e){!e.error&&!e.aborted&&(e.abort(),e.aborted=!0)}var or=(function(){function e(t,n,r){this.strategy=t,this.transports=n,this.ttl=r.ttl||1800*1e3,this.usingTLS=r.useTLS,this.timeline=r.timeline}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.usingTLS,i=ar(r),o=[this.strategy];if(i&&i.timestamp+this.ttl>=j.now()){var u=this.transports[i.transport];u&&(this.timeline.info({cached:!0,transport:i.transport,latency:i.latency}),o.push(new Y([u],{timeout:i.latency*2+1e3,failFast:!0})))}var p=j.now(),_=o.pop().connect(t,function g(k,E){k?(Qt(r),o.length>0?(p=j.now(),_=o.pop().connect(t,g)):n(k)):(cr(r,E.transport.name,j.now()-p),n(null,E))});return{abort:function(){_.abort()},forceMinPriority:function(g){t=g,_&&_.forceMinPriority(g)}}},e})(),sr=or;function St(e){return"pusherTransport"+(e?"TLS":"NonTLS")}function ar(e){var t=m.getLocalStorage();if(t)try{var n=t[St(e)];if(n)return JSON.parse(n)}catch{Qt(e)}return null}function cr(e,t,n){var r=m.getLocalStorage();if(r)try{r[St(e)]=ut({timestamp:j.now(),transport:t,latency:n})}catch{}}function Qt(e){var t=m.getLocalStorage();if(t)try{delete t[St(e)]}catch{}}var ur=(function(){function e(t,n){var r=n.delay;this.strategy=t,this.options={delay:r}}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.strategy,i,o=new Q(this.options.delay,function(){i=r.connect(t,n)});return{abort:function(){o.ensureAborted(),i&&i.abort()},forceMinPriority:function(u){t=u,i&&i.forceMinPriority(u)}}},e})(),lt=ur,hr=(function(){function e(t,n,r){this.test=t,this.trueBranch=n,this.falseBranch=r}return e.prototype.isSupported=function(){var t=this.test()?this.trueBranch:this.falseBranch;return t.isSupported()},e.prototype.connect=function(t,n){var r=this.test()?this.trueBranch:this.falseBranch;return r.connect(t,n)},e})(),it=hr,lr=(function(){function e(t){this.strategy=t}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.strategy.connect(t,function(i,o){o&&r.abort(),n(i,o)});return r},e})(),fr=lr;function ot(e){return function(){return e.isSupported()}}var pr=function(e,t,n){var r={};function i(ce,mi,wi,ki,Si){var ue=n(e,ce,mi,wi,ki,Si);return r[ce]=ue,ue}var o=Object.assign({},t,{hostNonTLS:e.wsHost+":"+e.wsPort,hostTLS:e.wsHost+":"+e.wssPort,httpPath:e.wsPath}),u=Object.assign({},o,{useTLS:!0}),p=Object.assign({},t,{hostNonTLS:e.httpHost+":"+e.httpPort,hostTLS:e.httpHost+":"+e.httpsPort,httpPath:e.httpPath}),_={loop:!0,timeout:15e3,timeoutLimit:6e4},g=new Gt({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),k=new Gt({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),E=i("ws","ws",3,o,g),X=i("wss","ws",3,u,g),vi=i("sockjs","sockjs",1,p),ne=i("xhr_streaming","xhr_streaming",1,p,k),yi=i("xdr_streaming","xdr_streaming",1,p,k),re=i("xhr_polling","xhr_polling",1,p),gi=i("xdr_polling","xdr_polling",1,p),ie=new Y([E],_),_i=new Y([X],_),bi=new Y([vi],_),oe=new Y([new it(ot(ne),ne,yi)],_),se=new Y([new it(ot(re),re,gi)],_),ae=new Y([new it(ot(oe),new kt([oe,new lt(se,{delay:4e3})]),se)],_),xt=new it(ot(ae),ae,bi),Ot;return t.useTLS?Ot=new kt([ie,new lt(xt,{delay:2e3})]):Ot=new kt([ie,new lt(_i,{delay:2e3}),new lt(xt,{delay:5e3})]),new sr(new fr(new it(ot(E),Ot,xt)),r,{ttl:18e5,timeline:t.timeline,useTLS:t.useTLS})},dr=pr,vr=(function(){var e=this;e.timeline.info(e.buildTimelineMessage({transport:e.name+(e.options.useTLS?"s":"")})),e.hooks.isInitialized()?e.changeState("initialized"):e.hooks.file?(e.changeState("initializing"),S.load(e.hooks.file,{useTLS:e.options.useTLS},function(t,n){e.hooks.isInitialized()?(e.changeState("initialized"),n(!0)):(t&&e.onError(t),e.onClose(),n(!1))})):e.onClose()}),yr={getRequest:function(e){var t=new window.XDomainRequest;return t.ontimeout=function(){e.emit("error",new I),e.close()},t.onerror=function(n){e.emit("error",n),e.close()},t.onprogress=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText)},t.onload=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText),e.emit("finished",200),e.close()},t},abortRequest:function(e){e.ontimeout=e.onerror=e.onprogress=e.onload=null,e.abort()}},gr=yr,_r=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),br=256*1024,mr=(function(e){_r(t,e);function t(n,r,i){var o=e.call(this)||this;return o.hooks=n,o.method=r,o.url=i,o}return t.prototype.start=function(n){var r=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){r.close()},m.addUnloadListener(this.unloader),this.xhr.open(this.method,this.url,!0),this.xhr.setRequestHeader&&this.xhr.setRequestHeader("Content-Type","application/json"),this.xhr.send(n)},t.prototype.close=function(){this.unloader&&(m.removeUnloadListener(this.unloader),this.unloader=null),this.xhr&&(this.hooks.abortRequest(this.xhr),this.xhr=null)},t.prototype.onChunk=function(n,r){for(;;){var i=this.advanceBuffer(r);if(i)this.emit("chunk",{status:n,data:i});else break}this.isBufferTooLong(r)&&this.emit("buffer_too_long")},t.prototype.advanceBuffer=function(n){var r=n.slice(this.position),i=r.indexOf(` +`);return i!==-1?(this.position+=i+1,r.slice(0,i)):null},t.prototype.isBufferTooLong=function(n){return this.position===n.length&&n.length>br},t})(V),wr=mr,Ct;(function(e){e[e.CONNECTING=0]="CONNECTING",e[e.OPEN=1]="OPEN",e[e.CLOSED=3]="CLOSED"})(Ct||(Ct={}));var $=Ct,kr=1,Sr=(function(){function e(t,n){this.hooks=t,this.session=Yt(1e3)+"/"+xr(8),this.location=Cr(n),this.readyState=$.CONNECTING,this.openStream()}return e.prototype.send=function(t){return this.sendRaw(JSON.stringify([t]))},e.prototype.ping=function(){this.hooks.sendHeartbeat(this)},e.prototype.close=function(t,n){this.onClose(t,n,!0)},e.prototype.sendRaw=function(t){if(this.readyState===$.OPEN)try{return m.createSocketRequest("POST",Kt(Tr(this.location,this.session))).start(t),!0}catch{return!1}else return!1},e.prototype.reconnect=function(){this.closeStream(),this.openStream()},e.prototype.onClose=function(t,n,r){this.closeStream(),this.readyState=$.CLOSED,this.onclose&&this.onclose({code:t,reason:n,wasClean:r})},e.prototype.onChunk=function(t){if(t.status===200){this.readyState===$.OPEN&&this.onActivity();var n,r=t.data.slice(0,1);switch(r){case"o":n=JSON.parse(t.data.slice(1)||"{}"),this.onOpen(n);break;case"a":n=JSON.parse(t.data.slice(1)||"[]");for(var i=0;i0&&e.onChunk(n.status,n.responseText);break;case 4:n.responseText&&n.responseText.length>0&&e.onChunk(n.status,n.responseText),e.emit("finished",n.status),e.close();break}},n},abortRequest:function(e){e.onreadystatechange=null,e.abort()}},jr=Ir,Nr={createStreamingSocket:function(e){return this.createSocket(Er,e)},createPollingSocket:function(e){return this.createSocket(Rr,e)},createSocket:function(e,t){return new Or(e,t)},createXHR:function(e,t){return this.createRequest(jr,e,t)},createRequest:function(e,t,n){return new wr(e,t,n)}},$t=Nr;$t.createXDR=function(e,t){return this.createRequest(gr,e,t)};var qr=$t,Ur={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:s,DependenciesReceivers:T,getDefaultStrategy:dr,Transports:_n,transportConnectionInitializer:vr,HTTPFactory:qr,TimelineTransport:Ze,getXHRAPI:function(){return window.XMLHttpRequest},getWebSocketAPI:function(){return window.WebSocket||window.MozWebSocket},setup:function(e){var t=this;window.Pusher=e;var n=function(){t.onDocumentBody(e.ready)};window.JSON?n():S.load("json2",{},n)},getDocument:function(){return document},getProtocol:function(){return this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:Se,jsonp:We}},onDocumentBody:function(e){var t=this;document.body?e():setTimeout(function(){t.onDocumentBody(e)},0)},createJSONPRequest:function(e,t){return new Ke(e,t)},createScriptRequest:function(e){return new Ge(e)},getLocalStorage:function(){try{return window.localStorage}catch{return}},createXHR:function(){return this.getXHRAPI()?this.createXMLHttpRequest():this.createMicrosoftXHR()},createXMLHttpRequest:function(){var e=this.getXHRAPI();return new e},createMicrosoftXHR:function(){return new ActiveXObject("Microsoft.XMLHTTP")},getNetwork:function(){return wn},createWebSocket:function(e){var t=this.getWebSocketAPI();return new t(e)},createSocketRequest:function(e,t){if(this.isXHRSupported())return this.HTTPFactory.createXHR(e,t);if(this.isXDRSupported(t.indexOf("https:")===0))return this.HTTPFactory.createXDR(e,t);throw"Cross-origin HTTP requests are not supported"},isXHRSupported:function(){var e=this.getXHRAPI();return!!e&&new e().withCredentials!==void 0},isXDRSupported:function(e){var t=e?"https:":"http:",n=this.getProtocol();return!!window.XDomainRequest&&n===t},addUnloadListener:function(e){window.addEventListener!==void 0?window.addEventListener("unload",e,!1):window.attachEvent!==void 0&&window.attachEvent("onunload",e)},removeUnloadListener:function(e){window.addEventListener!==void 0?window.removeEventListener("unload",e,!1):window.detachEvent!==void 0&&window.detachEvent("onunload",e)},randomInt:function(e){var t=function(){var n=window.crypto||window.msCrypto,r=n.getRandomValues(new Uint32Array(1))[0];return r/Math.pow(2,32)};return Math.floor(t()*e)}},m=Ur,Tt;(function(e){e[e.ERROR=3]="ERROR",e[e.INFO=6]="INFO",e[e.DEBUG=7]="DEBUG"})(Tt||(Tt={}));var ft=Tt,Dr=(function(){function e(t,n,r){this.key=t,this.session=n,this.events=[],this.options=r||{},this.sent=0,this.uniqueID=0}return e.prototype.log=function(t,n){t<=this.options.level&&(this.events.push(U({},n,{timestamp:j.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},e.prototype.error=function(t){this.log(ft.ERROR,t)},e.prototype.info=function(t){this.log(ft.INFO,t)},e.prototype.debug=function(t){this.log(ft.DEBUG,t)},e.prototype.isEmpty=function(){return this.events.length===0},e.prototype.send=function(t,n){var r=this,i=U({session:this.session,bundle:this.sent+1,key:this.key,lib:"js",version:this.options.version,cluster:this.options.cluster,features:this.options.features,timeline:this.events},this.options.params);return this.events=[],t(i,function(o,u){o||r.sent++,n&&n(o,u)}),!0},e.prototype.generateUniqueID=function(){return this.uniqueID++,this.uniqueID},e})(),Hr=Dr,Mr=(function(){function e(t,n,r,i){this.name=t,this.priority=n,this.transport=r,this.options=i||{}}return e.prototype.isSupported=function(){return this.transport.isSupported({useTLS:this.options.useTLS})},e.prototype.connect=function(t,n){var r=this;if(this.isSupported()){if(this.priority"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Ii(l){if(l===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return l}function ji(l,h){if(h&&(typeof h=="object"||typeof h=="function"))return h;if(h!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Ii(l)}function H(l){var h=Ri();return function(){var c=pt(l),s;if(h){var f=pt(this).constructor;s=Reflect.construct(c,arguments,f)}else s=c.apply(this,arguments);return ji(this,s)}}var Et=(function(){function l(){L(this,l)}return R(l,[{key:"listenForWhisper",value:function(a,c){return this.listen(".client-"+a,c)}},{key:"notification",value:function(a){return this.listen(".Illuminate\\Notifications\\Events\\BroadcastNotificationCreated",a)}},{key:"stopListeningForWhisper",value:function(a,c){return this.stopListening(".client-"+a,c)}}]),l})(),de=(function(){function l(h){L(this,l),this.namespace=h}return R(l,[{key:"format",value:function(a){return[".","\\"].includes(a.charAt(0))?a.substring(1):(this.namespace&&(a=this.namespace+"."+a),a.replace(/\./g,"\\"))}},{key:"setNamespace",value:function(a){this.namespace=a}}]),l})();function Ni(l){try{new l}catch(h){if(h.message.includes("is not a constructor"))return!1}return!0}var Lt=(function(l){D(a,l);var h=H(a);function a(c,s,f){var d;return L(this,a),d=h.call(this),d.name=s,d.pusher=c,d.options=f,d.eventFormatter=new de(d.options.namespace),d.subscribe(),d}return R(a,[{key:"subscribe",value:function(){this.subscription=this.pusher.subscribe(this.name)}},{key:"unsubscribe",value:function(){this.pusher.unsubscribe(this.name)}},{key:"listen",value:function(s,f){return this.on(this.eventFormatter.format(s),f),this}},{key:"listenToAll",value:function(s){var f=this;return this.subscription.bind_global(function(d,N){if(!d.startsWith("pusher:")){var P=f.options.namespace.replace(/\./g,"\\"),T=d.startsWith(P)?d.substring(P.length+1):"."+d;s(T,N)}}),this}},{key:"stopListening",value:function(s,f){return f?this.subscription.unbind(this.eventFormatter.format(s),f):this.subscription.unbind(this.eventFormatter.format(s)),this}},{key:"stopListeningToAll",value:function(s){return s?this.subscription.unbind_global(s):this.subscription.unbind_global(),this}},{key:"subscribed",value:function(s){return this.on("pusher:subscription_succeeded",function(){s()}),this}},{key:"error",value:function(s){return this.on("pusher:subscription_error",function(f){s(f)}),this}},{key:"on",value:function(s,f){return this.subscription.bind(s,f),this}}]),a})(Et),ve=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}}]),a})(Lt),qi=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}}]),a})(Lt),Ui=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this.on("pusher:subscription_succeeded",function(f){s(Object.keys(f.members).map(function(d){return f.members[d]}))}),this}},{key:"joining",value:function(s){return this.on("pusher:member_added",function(f){s(f.info)}),this}},{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}},{key:"leaving",value:function(s){return this.on("pusher:member_removed",function(f){s(f.info)}),this}}]),a})(ve),ye=(function(l){D(a,l);var h=H(a);function a(c,s,f){var d;return L(this,a),d=h.call(this),d.events={},d.listeners={},d.name=s,d.socket=c,d.options=f,d.eventFormatter=new de(d.options.namespace),d.subscribe(),d}return R(a,[{key:"subscribe",value:function(){this.socket.emit("subscribe",{channel:this.name,auth:this.options.auth||{}})}},{key:"unsubscribe",value:function(){this.unbind(),this.socket.emit("unsubscribe",{channel:this.name,auth:this.options.auth||{}})}},{key:"listen",value:function(s,f){return this.on(this.eventFormatter.format(s),f),this}},{key:"stopListening",value:function(s,f){return this.unbindEvent(this.eventFormatter.format(s),f),this}},{key:"subscribed",value:function(s){return this.on("connect",function(f){s(f)}),this}},{key:"error",value:function(s){return this}},{key:"on",value:function(s,f){var d=this;return this.listeners[s]=this.listeners[s]||[],this.events[s]||(this.events[s]=function(N,P){d.name===N&&d.listeners[s]&&d.listeners[s].forEach(function(T){return T(P)})},this.socket.on(s,this.events[s])),this.listeners[s].push(f),this}},{key:"unbind",value:function(){var s=this;Object.keys(this.events).forEach(function(f){s.unbindEvent(f)})}},{key:"unbindEvent",value:function(s,f){this.listeners[s]=this.listeners[s]||[],f&&(this.listeners[s]=this.listeners[s].filter(function(d){return d!==f})),(!f||this.listeners[s].length===0)&&(this.events[s]&&(this.socket.removeListener(s,this.events[s]),delete this.events[s]),delete this.listeners[s])}}]),a})(Et),ge=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.socket.emit("client event",{channel:this.name,event:"client-".concat(s),data:f}),this}}]),a})(ye),Di=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this.on("presence:subscribed",function(f){s(f.map(function(d){return d.user_info}))}),this}},{key:"joining",value:function(s){return this.on("presence:joining",function(f){return s(f.user_info)}),this}},{key:"whisper",value:function(s,f){return this.socket.emit("client event",{channel:this.name,event:"client-".concat(s),data:f}),this}},{key:"leaving",value:function(s){return this.on("presence:leaving",function(f){return s(f.user_info)}),this}}]),a})(ge),dt=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"subscribe",value:function(){}},{key:"unsubscribe",value:function(){}},{key:"listen",value:function(s,f){return this}},{key:"listenToAll",value:function(s){return this}},{key:"stopListening",value:function(s,f){return this}},{key:"subscribed",value:function(s){return this}},{key:"error",value:function(s){return this}},{key:"on",value:function(s,f){return this}}]),a})(Et),_e=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this}}]),a})(dt),Hi=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this}}]),a})(dt),Mi=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this}},{key:"joining",value:function(s){return this}},{key:"whisper",value:function(s,f){return this}},{key:"leaving",value:function(s){return this}}]),a})(_e),Rt=(function(){function l(h){L(this,l),this._defaultOptions={auth:{headers:{}},authEndpoint:"/broadcasting/auth",userAuthentication:{endpoint:"/broadcasting/user-auth",headers:{}},broadcaster:"pusher",csrfToken:null,bearerToken:null,host:null,key:null,namespace:"App.Events"},this.setOptions(h),this.connect()}return R(l,[{key:"setOptions",value:function(a){this.options=at(this._defaultOptions,a);var c=this.csrfToken();return c&&(this.options.auth.headers["X-CSRF-TOKEN"]=c,this.options.userAuthentication.headers["X-CSRF-TOKEN"]=c),c=this.options.bearerToken,c&&(this.options.auth.headers.Authorization="Bearer "+c,this.options.userAuthentication.headers.Authorization="Bearer "+c),a}},{key:"csrfToken",value:function(){var a;return typeof window<"u"&&window.Laravel&&window.Laravel.csrfToken?window.Laravel.csrfToken:this.options.csrfToken?this.options.csrfToken:typeof document<"u"&&typeof document.querySelector=="function"&&(a=document.querySelector('meta[name="csrf-token"]'))?a.getAttribute("content"):null}}]),l})(),fe=(function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){typeof this.options.client<"u"?this.pusher=this.options.client:this.options.Pusher?this.pusher=new this.options.Pusher(this.options.key,this.options):this.pusher=new Pusher(this.options.key,this.options)}},{key:"signin",value:function(){this.pusher.signin()}},{key:"listen",value:function(s,f,d){return this.channel(s).listen(f,d)}},{key:"channel",value:function(s){return this.channels[s]||(this.channels[s]=new Lt(this.pusher,s,this.options)),this.channels[s]}},{key:"privateChannel",value:function(s){return this.channels["private-"+s]||(this.channels["private-"+s]=new ve(this.pusher,"private-"+s,this.options)),this.channels["private-"+s]}},{key:"encryptedPrivateChannel",value:function(s){return this.channels["private-encrypted-"+s]||(this.channels["private-encrypted-"+s]=new qi(this.pusher,"private-encrypted-"+s,this.options)),this.channels["private-encrypted-"+s]}},{key:"presenceChannel",value:function(s){return this.channels["presence-"+s]||(this.channels["presence-"+s]=new Ui(this.pusher,"presence-"+s,this.options)),this.channels["presence-"+s]}},{key:"leave",value:function(s){var f=this,d=[s,"private-"+s,"private-encrypted-"+s,"presence-"+s];d.forEach(function(N,P){f.leaveChannel(N)})}},{key:"leaveChannel",value:function(s){this.channels[s]&&(this.channels[s].unsubscribe(),delete this.channels[s])}},{key:"socketId",value:function(){return this.pusher.connection.socket_id}},{key:"disconnect",value:function(){this.pusher.disconnect()}}]),a})(Rt),pe=(function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){var s=this,f=this.getSocketIO();return this.socket=f(this.options.host,this.options),this.socket.on("reconnect",function(){Object.values(s.channels).forEach(function(d){d.subscribe()})}),this.socket}},{key:"getSocketIO",value:function(){if(typeof this.options.client<"u")return this.options.client;if(typeof io<"u")return io;throw new Error("Socket.io client not found. Should be globally available or passed via options.client")}},{key:"listen",value:function(s,f,d){return this.channel(s).listen(f,d)}},{key:"channel",value:function(s){return this.channels[s]||(this.channels[s]=new ye(this.socket,s,this.options)),this.channels[s]}},{key:"privateChannel",value:function(s){return this.channels["private-"+s]||(this.channels["private-"+s]=new ge(this.socket,"private-"+s,this.options)),this.channels["private-"+s]}},{key:"presenceChannel",value:function(s){return this.channels["presence-"+s]||(this.channels["presence-"+s]=new Di(this.socket,"presence-"+s,this.options)),this.channels["presence-"+s]}},{key:"leave",value:function(s){var f=this,d=[s,"private-"+s,"presence-"+s];d.forEach(function(N){f.leaveChannel(N)})}},{key:"leaveChannel",value:function(s){this.channels[s]&&(this.channels[s].unsubscribe(),delete this.channels[s])}},{key:"socketId",value:function(){return this.socket.id}},{key:"disconnect",value:function(){this.socket.disconnect()}}]),a})(Rt),zi=(function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){}},{key:"listen",value:function(s,f,d){return new dt}},{key:"channel",value:function(s){return new dt}},{key:"privateChannel",value:function(s){return new _e}},{key:"encryptedPrivateChannel",value:function(s){return new Hi}},{key:"presenceChannel",value:function(s){return new Mi}},{key:"leave",value:function(s){}},{key:"leaveChannel",value:function(s){}},{key:"socketId",value:function(){return"fake-socket-id"}},{key:"disconnect",value:function(){}}]),a})(Rt),be=(function(){function l(h){L(this,l),this.options=h,this.connect(),this.options.withoutInterceptors||this.registerInterceptors()}return R(l,[{key:"channel",value:function(a){return this.connector.channel(a)}},{key:"connect",value:function(){if(this.options.broadcaster=="reverb")this.connector=new fe(at(at({},this.options),{cluster:""}));else if(this.options.broadcaster=="pusher")this.connector=new fe(this.options);else if(this.options.broadcaster=="socket.io")this.connector=new pe(this.options);else if(this.options.broadcaster=="null")this.connector=new zi(this.options);else if(typeof this.options.broadcaster=="function"&&Ni(this.options.broadcaster))this.connector=new this.options.broadcaster(this.options);else throw new Error("Broadcaster ".concat(st(this.options.broadcaster)," ").concat(this.options.broadcaster," is not supported."))}},{key:"disconnect",value:function(){this.connector.disconnect()}},{key:"join",value:function(a){return this.connector.presenceChannel(a)}},{key:"leave",value:function(a){this.connector.leave(a)}},{key:"leaveChannel",value:function(a){this.connector.leaveChannel(a)}},{key:"leaveAllChannels",value:function(){for(var a in this.connector.channels)this.leaveChannel(a)}},{key:"listen",value:function(a,c,s){return this.connector.listen(a,c,s)}},{key:"private",value:function(a){return this.connector.privateChannel(a)}},{key:"encryptedPrivate",value:function(a){if(this.connector instanceof pe)throw new Error("Broadcaster ".concat(st(this.options.broadcaster)," ").concat(this.options.broadcaster," does not support encrypted private channels."));return this.connector.encryptedPrivateChannel(a)}},{key:"socketId",value:function(){return this.connector.socketId()}},{key:"registerInterceptors",value:function(){typeof Vue=="function"&&Vue.http&&this.registerVueRequestInterceptor(),typeof axios=="function"&&this.registerAxiosRequestInterceptor(),typeof jQuery=="function"&&this.registerjQueryAjaxSetup(),(typeof Turbo>"u"?"undefined":st(Turbo))==="object"&&this.registerTurboRequestInterceptor()}},{key:"registerVueRequestInterceptor",value:function(){var a=this;Vue.http.interceptors.push(function(c,s){a.socketId()&&c.headers.set("X-Socket-ID",a.socketId()),s()})}},{key:"registerAxiosRequestInterceptor",value:function(){var a=this;axios.interceptors.request.use(function(c){return a.socketId()&&(c.headers["X-Socket-Id"]=a.socketId()),c})}},{key:"registerjQueryAjaxSetup",value:function(){var a=this;typeof jQuery.ajax<"u"&&jQuery.ajaxPrefilter(function(c,s,f){a.socketId()&&f.setRequestHeader("X-Socket-Id",a.socketId())})}},{key:"registerTurboRequestInterceptor",value:function(){var a=this;document.addEventListener("turbo:before-fetch-request",function(c){c.detail.fetchOptions.headers["X-Socket-Id"]=a.socketId()})}}]),l})();var we=Li(me(),1);window.EchoFactory=be;window.Pusher=we.default;})(); /*! Bundled license information: pusher-js/dist/web/pusher.js: diff --git a/public/js/filament/forms/components/checkbox-list.js b/public/js/filament/forms/components/checkbox-list.js new file mode 100644 index 0000000000..39e7d102bb --- /dev/null +++ b/public/js/filament/forms/components/checkbox-list.js @@ -0,0 +1 @@ +function c({livewireId:s}){return{areAllCheckboxesChecked:!1,checkboxListOptions:[],search:"",unsubscribeLivewireHook:null,visibleCheckboxListOptions:[],init(){this.checkboxListOptions=Array.from(this.$root.querySelectorAll(".fi-fo-checkbox-list-option")),this.updateVisibleCheckboxListOptions(),this.$nextTick(()=>{this.checkIfAllCheckboxesAreChecked()}),this.unsubscribeLivewireHook=Livewire.hook("commit",({component:e,commit:t,succeed:i,fail:o,respond:h})=>{i(({snapshot:r,effect:l})=>{this.$nextTick(()=>{e.id===s&&(this.checkboxListOptions=Array.from(this.$root.querySelectorAll(".fi-fo-checkbox-list-option")),this.updateVisibleCheckboxListOptions(),this.checkIfAllCheckboxesAreChecked())})})}),this.$watch("search",()=>{this.updateVisibleCheckboxListOptions(),this.checkIfAllCheckboxesAreChecked()})},checkIfAllCheckboxesAreChecked(){this.areAllCheckboxesChecked=this.visibleCheckboxListOptions.length===this.visibleCheckboxListOptions.filter(e=>e.querySelector("input[type=checkbox]:checked, input[type=checkbox]:disabled")).length},toggleAllCheckboxes(){this.checkIfAllCheckboxesAreChecked();let e=!this.areAllCheckboxesChecked;this.visibleCheckboxListOptions.forEach(t=>{let i=t.querySelector("input[type=checkbox]");i.disabled||i.checked!==e&&(i.checked=e,i.dispatchEvent(new Event("change")))}),this.areAllCheckboxesChecked=e},updateVisibleCheckboxListOptions(){this.visibleCheckboxListOptions=this.checkboxListOptions.filter(e=>["",null,void 0].includes(this.search)||e.querySelector(".fi-fo-checkbox-list-option-label")?.innerText.toLowerCase().includes(this.search.toLowerCase())?!0:e.querySelector(".fi-fo-checkbox-list-option-description")?.innerText.toLowerCase().includes(this.search.toLowerCase()))},destroy(){this.unsubscribeLivewireHook?.()}}}export{c as default}; diff --git a/public/js/filament/forms/components/code-editor.js b/public/js/filament/forms/components/code-editor.js new file mode 100644 index 0000000000..9bee207f36 --- /dev/null +++ b/public/js/filament/forms/components/code-editor.js @@ -0,0 +1,38 @@ +var Ms=[],Xh=[];(()=>{let O="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(O=Xh[i])e=i+1;else return!0;if(e==t)return!1}}function gh(O){return O>=127462&&O<=127487}var Ph=8205;function Th(O,e,t=!0,i=!0){return(t?bh:Ug)(O,e,i)}function bh(O,e,t){if(e==O.length)return e;e&&yh(O.charCodeAt(e))&&xh(O.charCodeAt(e-1))&&e--;let i=Ls(O,e);for(e+=Sh(i);e=0&&gh(Ls(O,s));)n++,s-=2;if(n%2==0)break;e+=2}else break}return e}function Ug(O,e,t){for(;e>0;){let i=bh(O,e-2,t);if(i=56320&&O<57344}function xh(O){return O>=55296&&O<56320}function Sh(O){return O<65536?1:2}var E=class O{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=NO(this,e,t);let r=[];return this.decompose(0,e,r,2),i.length&&i.decompose(0,i.length,r,3),this.decompose(t,this.length,r,1),DO.from(r,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=NO(this,e,t);let i=[];return this.decompose(e,t,i,0),DO.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),r=new $O(this),n=new $O(e);for(let s=t,a=t;;){if(r.next(s),n.next(s),s=0,r.lineBreak!=n.lineBreak||r.done!=n.done||r.value!=n.value)return!1;if(a+=r.value.length,r.done||a>=i)return!0}}iter(e=1){return new $O(this,e)}iterRange(e,t=this.length){return new Dr(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let r=this.line(e).from;i=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Ir(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?O.empty:e.length<=32?new Ae(e):DO.from(Ae.split(e,[]))}},Ae=class O extends E{constructor(e,t=Wg(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,r){for(let n=0;;n++){let s=this.text[n],a=r+s.length;if((t?i:a)>=e)return new Is(r,a,i,s);r=a+1,i++}}decompose(e,t,i,r){let n=e<=0&&t>=this.length?this:new O(kh(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(r&1){let s=i.pop(),a=Mr(n.text,s.text.slice(),0,n.length);if(a.length<=32)i.push(new O(a,s.length+n.length));else{let o=a.length>>1;i.push(new O(a.slice(0,o)),new O(a.slice(o)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof O))return super.replace(e,t,i);[e,t]=NO(this,e,t);let r=Mr(this.text,Mr(i.text,kh(this.text,0,e)),t),n=this.length+i.length-(t-e);return r.length<=32?new O(r,n):DO.from(O.split(r,[]),n)}sliceString(e,t=this.length,i=` +`){[e,t]=NO(this,e,t);let r="";for(let n=0,s=0;n<=t&&se&&s&&(r+=i),en&&(r+=a.slice(Math.max(0,e-n),t-n)),n=o+1}return r}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],r=-1;for(let n of e)i.push(n),r+=n.length+1,i.length==32&&(t.push(new O(i,r)),i=[],r=-1);return r>-1&&t.push(new O(i,r)),t}},DO=class O extends E{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,r){for(let n=0;;n++){let s=this.children[n],a=r+s.length,o=i+s.lines-1;if((t?o:a)>=e)return s.lineInner(e,t,i,r);r=a+1,i=o+1}}decompose(e,t,i,r){for(let n=0,s=0;s<=t&&n=s){let l=r&((s<=e?1:0)|(o>=t?2:0));s>=e&&o<=t&&!l?i.push(a):a.decompose(e-s,t-s,i,l)}s=o+1}}replace(e,t,i){if([e,t]=NO(this,e,t),i.lines=n&&t<=a){let o=s.replace(e-n,t-n,i),l=this.lines-s.lines+o.lines;if(o.lines>4&&o.lines>l>>6){let c=this.children.slice();return c[r]=o,new O(c,this.length-(t-e)+i.length)}return super.replace(n,a,o)}n=a+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=` +`){[e,t]=NO(this,e,t);let r="";for(let n=0,s=0;ne&&n&&(r+=i),es&&(r+=a.sliceString(e-s,t-s,i)),s=o+1}return r}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof O))return 0;let i=0,[r,n,s,a]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;r+=t,n+=t){if(r==s||n==a)return i;let o=this.children[r],l=e.children[n];if(o!=l)return i+o.scanIdentical(l,t);i+=o.length+1}}static from(e,t=e.reduce((i,r)=>i+r.length+1,-1)){let i=0;for(let u of e)i+=u.lines;if(i<32){let u=[];for(let Q of e)Q.flatten(u);return new Ae(u,t)}let r=Math.max(32,i>>5),n=r<<1,s=r>>1,a=[],o=0,l=-1,c=[];function h(u){let Q;if(u.lines>n&&u instanceof O)for(let $ of u.children)h($);else u.lines>s&&(o>s||!o)?(f(),a.push(u)):u instanceof Ae&&o&&(Q=c[c.length-1])instanceof Ae&&u.lines+Q.lines<=32?(o+=u.lines,l+=u.length+1,c[c.length-1]=new Ae(Q.text.concat(u.text),Q.length+1+u.length)):(o+u.lines>r&&f(),o+=u.lines,l+=u.length+1,c.push(u))}function f(){o!=0&&(a.push(c.length==1?c[0]:O.from(c,l)),l=-1,o=c.length=0)}for(let u of e)h(u);return f(),a.length==1?a[0]:new O(a,t)}};E.empty=new Ae([""],0);function Wg(O){let e=-1;for(let t of O)e+=t.length+1;return e}function Mr(O,e,t=0,i=1e9){for(let r=0,n=0,s=!0;n=t&&(o>i&&(a=a.slice(0,i-r)),r0?1:(e instanceof Ae?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,r=this.nodes[i],n=this.offsets[i],s=n>>1,a=r instanceof Ae?r.text.length:r.children.length;if(s==(t>0?a:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((n&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=` +`,this;e--}else if(r instanceof Ae){let o=r.text[s+(t<0?-1:0)];if(this.offsets[i]+=t,o.length>Math.max(0,e))return this.value=e==0?o:t>0?o.slice(e):o.slice(0,o.length-e),this;e-=o.length}else{let o=r.children[s+(t<0?-1:0)];e>o.length?(e-=o.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(o),this.offsets.push(t>0?1:(o instanceof Ae?o.text.length:o.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},Dr=class{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new $O(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:r}=this.cursor.next(e);return this.pos+=(r.length+e)*t,this.value=r.length<=i?r:t<0?r.slice(r.length-i):r.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Ir=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:r}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=r,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(E.prototype[Symbol.iterator]=function(){return this.iter()},$O.prototype[Symbol.iterator]=Dr.prototype[Symbol.iterator]=Ir.prototype[Symbol.iterator]=function(){return this});var Is=class{constructor(e,t,i,r){this.from=e,this.to=t,this.number=i,this.text=r}get length(){return this.to-this.from}};function NO(O,e,t){return e=Math.max(0,Math.min(O.length,e)),[e,Math.max(e,Math.min(O.length,t))]}function fe(O,e,t=!0,i=!0){return Th(O,e,t,i)}function jg(O){return O>=56320&&O<57344}function Cg(O){return O>=55296&&O<56320}function Se(O,e){let t=O.charCodeAt(e);if(!Cg(t)||e+1==O.length)return t;let i=O.charCodeAt(e+1);return jg(i)?(t-55296<<10)+(i-56320)+65536:t}function Ri(O){return O<=65535?String.fromCharCode(O):(O-=65536,String.fromCharCode((O>>10)+55296,(O&1023)+56320))}function Me(O){return O<65536?1:2}var Bs=/\r\n?|\n/,pe=(function(O){return O[O.Simple=0]="Simple",O[O.TrackDel=1]="TrackDel",O[O.TrackBefore=2]="TrackBefore",O[O.TrackAfter=3]="TrackAfter",O})(pe||(pe={})),vt=class O{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return n+(e-r);n+=a}else{if(i!=pe.Simple&&l>=e&&(i==pe.TrackDel&&re||i==pe.TrackBefore&&re))return null;if(l>e||l==e&&t<0&&!a)return e==r||t<0?n:n+o;n+=o}r=l}if(e>r)throw new RangeError(`Position ${e} is out of range for changeset of length ${r}`);return n}touchesRange(e,t=e){for(let i=0,r=0;i=0&&r<=t&&a>=e)return rt?"cover":!0;r=a}return!1}toString(){let e="";for(let t=0;t=0?":"+r:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new O(e)}static create(e){return new O(e)}},Ze=class O extends vt{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Ns(this,(t,i,r,n,s)=>e=e.replace(r,r+(i-t),s),!1),e}mapDesc(e,t=!1){return Fs(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let r=0,n=0;r=0){t[r]=a,t[r+1]=s;let o=r>>1;for(;i.length0&&Mt(i,t,n.text),n.forward(c),a+=c}let l=e[s++];for(;a>1].toJSON()))}return e}static of(e,t,i){let r=[],n=[],s=0,a=null;function o(c=!1){if(!c&&!r.length)return;sf||h<0||f>t)throw new RangeError(`Invalid change range ${h} to ${f} (in doc of length ${t})`);let Q=u?typeof u=="string"?E.of(u.split(i||Bs)):u:E.empty,$=Q.length;if(h==f&&$==0)return;hs&&ye(r,h-s,-1),ye(r,f-h,$),Mt(n,r,Q),s=f}}return l(e),o(!a),a}static empty(e){return new O(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],i=[];for(let r=0;ra&&typeof s!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(n.length==1)t.push(n[0],0);else{for(;i.length=0&&t<=0&&t==O[r+1]?O[r]+=e:r>=0&&e==0&&O[r]==0?O[r+1]+=t:i?(O[r]+=e,O[r+1]+=t):O.push(e,t)}function Mt(O,e,t){if(t.length==0)return;let i=e.length-2>>1;if(i>1])),!(t||s==O.sections.length||O.sections[s+1]<0);)a=O.sections[s++],o=O.sections[s++];e(r,l,n,c,h),r=l,n=c}}}function Fs(O,e,t,i=!1){let r=[],n=i?[]:null,s=new pO(O),a=new pO(e);for(let o=-1;;){if(s.done&&a.len||a.done&&s.len)throw new Error("Mismatched change set lengths");if(s.ins==-1&&a.ins==-1){let l=Math.min(s.len,a.len);ye(r,l,-1),s.forward(l),a.forward(l)}else if(a.ins>=0&&(s.ins<0||o==s.i||s.off==0&&(a.len=0&&o=0){let l=0,c=s.len;for(;c;)if(a.ins==-1){let h=Math.min(c,a.len);l+=h,c-=h,a.forward(h)}else if(a.ins==0&&a.leno||s.ins>=0&&s.len>o)&&(a||i.length>l),n.forward2(o),s.forward(o)}}}}var pO=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?E.empty:e[t]}textBit(e){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length&&!e?E.empty:t[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},MO=class O{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,t=-1){let i,r;return this.empty?i=r=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),r=e.mapPos(this.to,-1)),i==this.from&&r==this.to?this:new O(i,r,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return S.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return S.range(this.anchor,i)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return S.range(e.anchor,e.head)}static create(e,t,i){return new O(e,t,i)}},S=class O{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:O.create(this.ranges.map(i=>i.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new O(e.ranges.map(t=>MO.fromJSON(t)),e.main)}static single(e,t=e){return new O([O.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,r=0;re?8:0)|n)}static normalized(e,t=0){let i=e[t];e.sort((r,n)=>r.from-n.from),t=e.indexOf(i);for(let r=1;rn.head?O.range(o,a):O.range(a,o))}}return new O(e,t)}};function Rh(O,e){for(let t of O.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}var sa=0,Z=class O{constructor(e,t,i,r,n){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=r,this.id=sa++,this.default=e([]),this.extensions=typeof n=="function"?n(this):n}get reader(){return this}static define(e={}){return new O(e.combine||(t=>t),e.compareInput||((t,i)=>t===i),e.compare||(e.combine?(t,i)=>t===i:aa),!!e.static,e.enables)}of(e){return new IO([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new IO(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new IO(e,this,2,t)}from(e,t){return t||(t=i=>i),this.compute([e],i=>t(i.field(e)))}};function aa(O,e){return O==e||O.length==e.length&&O.every((t,i)=>t===e[i])}var IO=class{constructor(e,t,i,r){this.dependencies=e,this.facet=t,this.type=i,this.value=r,this.id=sa++}dynamicSlot(e){var t;let i=this.value,r=this.facet.compareInput,n=this.id,s=e[n]>>1,a=this.type==2,o=!1,l=!1,c=[];for(let h of this.dependencies)h=="doc"?o=!0:h=="selection"?l=!0:(((t=e[h.id])!==null&&t!==void 0?t:1)&1)==0&&c.push(e[h.id]);return{create(h){return h.values[s]=i(h),1},update(h,f){if(o&&f.docChanged||l&&(f.docChanged||f.selection)||Hs(h,c)){let u=i(h);if(a?!wh(u,h.values[s],r):!r(u,h.values[s]))return h.values[s]=u,1}return 0},reconfigure:(h,f)=>{let u,Q=f.config.address[n];if(Q!=null){let $=Fr(f,Q);if(this.dependencies.every(p=>p instanceof Z?f.facet(p)===h.facet(p):p instanceof ce?f.field(p,!1)==h.field(p,!1):!0)||(a?wh(u=i(h),$,r):r(u=i(h),$)))return h.values[s]=$,0}else u=i(h);return h.values[s]=u,1}}}};function wh(O,e,t){if(O.length!=e.length)return!1;for(let i=0;iO[o.id]),r=t.map(o=>o.type),n=i.filter(o=>!(o&1)),s=O[e.id]>>1;function a(o){let l=[];for(let c=0;ci===r),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(Er).find(i=>i.field==this);return(t?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:i=>(i.values[t]=this.create(i),1),update:(i,r)=>{let n=i.values[t],s=this.updateF(n,r);return this.compareF(n,s)?0:(i.values[t]=s,1)},reconfigure:(i,r)=>{let n=i.facet(Er),s=r.facet(Er),a;return(a=n.find(o=>o.field==this))&&a!=s.find(o=>o.field==this)?(i.values[t]=a.create(i),1):r.config.address[this.id]!=null?(i.values[t]=r.field(this),0):(i.values[t]=this.create(i),1)}}}init(e){return[this,Er.of({field:this,create:e})]}get extension(){return this}},uO={lowest:4,low:3,default:2,high:1,highest:0};function wi(O){return e=>new Br(e,O)}var ze={highest:wi(uO.highest),high:wi(uO.high),default:wi(uO.default),low:wi(uO.low),lowest:wi(uO.lowest)},Br=class{constructor(e,t){this.inner=e,this.prec=t}},FO=class O{of(e){return new vi(this,e)}reconfigure(e){return O.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},vi=class{constructor(e,t){this.compartment=e,this.inner=t}},Nr=class O{constructor(e,t,i,r,n,s){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=r,this.staticValues=n,this.facets=s,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,i){let r=[],n=Object.create(null),s=new Map;for(let f of Eg(e,t,s))f instanceof ce?r.push(f):(n[f.facet.id]||(n[f.facet.id]=[])).push(f);let a=Object.create(null),o=[],l=[];for(let f of r)a[f.id]=l.length<<1,l.push(u=>f.slot(u));let c=i?.config.facets;for(let f in n){let u=n[f],Q=u[0].facet,$=c&&c[f]||[];if(u.every(p=>p.type==0))if(a[Q.id]=o.length<<1|1,aa($,u))o.push(i.facet(Q));else{let p=Q.combine(u.map(m=>m.value));o.push(i&&Q.compare(p,i.facet(Q))?i.facet(Q):p)}else{for(let p of u)p.type==0?(a[p.id]=o.length<<1|1,o.push(p.value)):(a[p.id]=l.length<<1,l.push(m=>p.dynamicSlot(m)));a[Q.id]=l.length<<1,l.push(p=>Gg(p,Q,u))}}let h=l.map(f=>f(a));return new O(e,s,h,a,o,n)}};function Eg(O,e,t){let i=[[],[],[],[],[]],r=new Map;function n(s,a){let o=r.get(s);if(o!=null){if(o<=a)return;let l=i[o].indexOf(s);l>-1&&i[o].splice(l,1),s instanceof vi&&t.delete(s.compartment)}if(r.set(s,a),Array.isArray(s))for(let l of s)n(l,a);else if(s instanceof vi){if(t.has(s.compartment))throw new RangeError("Duplicate use of compartment in extensions");let l=e.get(s.compartment)||s.inner;t.set(s.compartment,l),n(l,a)}else if(s instanceof Br)n(s.inner,s.prec);else if(s instanceof ce)i[a].push(s),s.provides&&n(s.provides,a);else if(s instanceof IO)i[a].push(s),s.facet.extensions&&n(s.facet.extensions,uO.default);else{let l=s.extension;if(!l)throw new Error(`Unrecognized extension value in extension set (${s}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);n(l,a)}}return n(O,uO.default),i.reduce((s,a)=>s.concat(a))}function Zi(O,e){if(e&1)return 2;let t=e>>1,i=O.status[t];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;O.status[t]=4;let r=O.computeSlot(O,O.config.dynamicSlots[t]);return O.status[t]=2|r}function Fr(O,e){return e&1?O.config.staticValues[e>>1]:O.values[e>>1]}var Vh=Z.define(),Ks=Z.define({combine:O=>O.some(e=>e),static:!0}),qh=Z.define({combine:O=>O.length?O[0]:void 0,static:!0}),zh=Z.define(),Uh=Z.define(),Wh=Z.define(),jh=Z.define({combine:O=>O.length?O[0]:!1}),qe=class{constructor(e,t){this.type=e,this.value=t}static define(){return new Js}},Js=class{of(e){return new qe(this,e)}},ea=class{constructor(e){this.map=e}of(e){return new V(this,e)}},V=class O{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new O(this.type,t)}is(e){return this.type==e}static define(e={}){return new ea(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let r of e){let n=r.map(t);n&&i.push(n)}return i}};V.reconfigure=V.define();V.appendConfig=V.define();var Qe=class O{constructor(e,t,i,r,n,s){this.startState=e,this.changes=t,this.selection=i,this.effects=r,this.annotations=n,this.scrollIntoView=s,this._doc=null,this._state=null,i&&Rh(i,t.newLength),n.some(a=>a.type==O.time)||(this.annotations=n.concat(O.time.of(Date.now())))}static create(e,t,i,r,n,s){return new O(e,t,i,r,n,s)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(O.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}};Qe.time=qe.define();Qe.userEvent=qe.define();Qe.addToHistory=qe.define();Qe.remote=qe.define();function Ag(O,e){let t=[];for(let i=0,r=0;;){let n,s;if(i=O[i]))n=O[i++],s=O[i++];else if(r=0;r--){let n=i[r](O);n instanceof Qe?O=n:Array.isArray(n)&&n.length==1&&n[0]instanceof Qe?O=n[0]:O=Gh(e,BO(n),!1)}return O}function Mg(O){let e=O.startState,t=e.facet(Wh),i=O;for(let r=t.length-1;r>=0;r--){let n=t[r](O);n&&Object.keys(n).length&&(i=Ch(i,ta(e,n,O.changes.newLength),!0))}return i==O?O:Qe.create(e,O.changes,O.selection,i.effects,i.annotations,i.scrollIntoView)}var Dg=[];function BO(O){return O==null?Dg:Array.isArray(O)?O:[O]}var ee=(function(O){return O[O.Word=0]="Word",O[O.Space=1]="Space",O[O.Other=2]="Other",O})(ee||(ee={})),Ig=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,Oa;try{Oa=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function Bg(O){if(Oa)return Oa.test(O);for(let e=0;e"\x80"&&(t.toUpperCase()!=t.toLowerCase()||Ig.test(t)))return!0}return!1}function Ng(O){return e=>{if(!/\S/.test(e))return ee.Space;if(Bg(e))return ee.Word;for(let t=0;t-1)return ee.Word;return ee.Other}}var I=class O{constructor(e,t,i,r,n,s){this.config=e,this.doc=t,this.selection=i,this.values=r,this.status=e.statusTemplate.slice(),this.computeSlot=n,s&&(s._state=this);for(let a=0;ar.set(l,o)),t=null),r.set(a.value.compartment,a.value.extension)):a.is(V.reconfigure)?(t=null,i=a.value):a.is(V.appendConfig)&&(t=null,i=BO(i).concat(a.value));let n;t?n=e.startState.values.slice():(t=Nr.resolve(i,r,this),n=new O(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(o,l)=>l.reconfigure(o,this),null).values);let s=e.startState.facet(Ks)?e.newSelection:e.newSelection.asSingle();new O(t,e.newDoc,s,n,(a,o)=>o.update(a,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:S.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),r=this.changes(i.changes),n=[i.range],s=BO(i.effects);for(let a=1;as.spec.fromJSON(a,o)))}}return O.create({doc:e.doc,selection:S.fromJSON(e.selection),extensions:t.extensions?r.concat([t.extensions]):r})}static create(e={}){let t=Nr.resolve(e.extensions||[],new Map),i=e.doc instanceof E?e.doc:E.of((e.doc||"").split(t.staticFacet(O.lineSeparator)||Bs)),r=e.selection?e.selection instanceof S?e.selection:S.single(e.selection.anchor,e.selection.head):S.single(0);return Rh(r,i.length),t.staticFacet(Ks)||(r=r.asSingle()),new O(t,i,r,t.dynamicSlots.map(()=>null),(n,s)=>s.create(n),null)}get tabSize(){return this.facet(O.tabSize)}get lineBreak(){return this.facet(O.lineSeparator)||` +`}get readOnly(){return this.facet(jh)}phrase(e,...t){for(let i of this.facet(O.phrases))if(Object.prototype.hasOwnProperty.call(i,e)){e=i[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(i,r)=>{if(r=="$")return"$";let n=+(r||1);return!n||n>t.length?i:t[n-1]})),e}languageDataAt(e,t,i=-1){let r=[];for(let n of this.facet(Vh))for(let s of n(this,t,i))Object.prototype.hasOwnProperty.call(s,e)&&r.push(s[e]);return r}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return Ng(t.length?t[0]:"")}wordAt(e){let{text:t,from:i,length:r}=this.doc.lineAt(e),n=this.charCategorizer(e),s=e-i,a=e-i;for(;s>0;){let o=fe(t,s,!1);if(n(t.slice(o,s))!=ee.Word)break;s=o}for(;aO.length?O[0]:4});I.lineSeparator=qh;I.readOnly=jh;I.phrases=Z.define({compare(O,e){let t=Object.keys(O),i=Object.keys(e);return t.length==i.length&&t.every(r=>O[r]==e[r])}});I.languageData=Vh;I.changeFilter=zh;I.transactionFilter=Uh;I.transactionExtender=Wh;FO.reconfigure=V.define();function xe(O,e,t={}){let i={};for(let r of O)for(let n of Object.keys(r)){let s=r[n],a=i[n];if(a===void 0)i[n]=s;else if(!(a===s||s===void 0))if(Object.hasOwnProperty.call(t,n))i[n]=t[n](a,s);else throw new Error("Config merge conflict for field "+n)}for(let r in e)i[r]===void 0&&(i[r]=e[r]);return i}var tt=class{eq(e){return this==e}range(e,t=e){return Yi.create(e,t,this)}};tt.prototype.startSide=tt.prototype.endSide=0;tt.prototype.point=!1;tt.prototype.mapMode=pe.TrackDel;function oa(O,e){return O==e||O.constructor==e.constructor&&O.eq(e)}var Yi=class O{constructor(e,t,i){this.from=e,this.to=t,this.value=i}static create(e,t,i){return new O(e,t,i)}};function ia(O,e){return O.from-e.from||O.value.startSide-e.value.startSide}var ra=class O{constructor(e,t,i,r){this.from=e,this.to=t,this.value=i,this.maxPoint=r}get length(){return this.to[this.to.length-1]}findIndex(e,t,i,r=0){let n=i?this.to:this.from;for(let s=r,a=n.length;;){if(s==a)return s;let o=s+a>>1,l=n[o]-e||(i?this.value[o].endSide:this.value[o].startSide)-t;if(o==s)return l>=0?s:a;l>=0?a=o:s=o+1}}between(e,t,i,r){for(let n=this.findIndex(t,-1e9,!0),s=this.findIndex(i,1e9,!1,n);nu||f==u&&l.startSide>0&&l.endSide<=0)continue;(u-f||l.endSide-l.startSide)<0||(s<0&&(s=f),l.point&&(a=Math.max(a,u-f)),i.push(l),r.push(f-s),n.push(u-s))}return{mapped:i.length?new O(r,n,i,a):null,pos:s}}},M=class O{constructor(e,t,i,r){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this.maxPoint=r}static create(e,t,i,r){return new O(e,t,i,r)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:i=!1,filterFrom:r=0,filterTo:n=this.length}=e,s=e.filter;if(t.length==0&&!s)return this;if(i&&(t=t.slice().sort(ia)),this.isEmpty)return t.length?O.of(t):this;let a=new Hr(this,null,-1).goto(0),o=0,l=[],c=new Le;for(;a.value||o=0){let h=t[o++];c.addInner(h.from,h.to,h.value)||l.push(h)}else a.rangeIndex==1&&a.chunkIndexthis.chunkEnd(a.chunkIndex)||na.to||n=n&&e<=n+s.length&&s.between(n,e-n,t-n,i)===!1)return}this.nextLayer.between(e,t,i)}}iter(e=0){return _i.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return _i.from(e).goto(t)}static compare(e,t,i,r,n=-1){let s=e.filter(h=>h.maxPoint>0||!h.isEmpty&&h.maxPoint>=n),a=t.filter(h=>h.maxPoint>0||!h.isEmpty&&h.maxPoint>=n),o=Zh(s,a,i),l=new QO(s,o,n),c=new QO(a,o,n);i.iterGaps((h,f,u)=>vh(l,h,c,f,u,r)),i.empty&&i.length==0&&vh(l,0,c,0,0,r)}static eq(e,t,i=0,r){r==null&&(r=999999999);let n=e.filter(c=>!c.isEmpty&&t.indexOf(c)<0),s=t.filter(c=>!c.isEmpty&&e.indexOf(c)<0);if(n.length!=s.length)return!1;if(!n.length)return!0;let a=Zh(n,s),o=new QO(n,a,0).goto(i),l=new QO(s,a,0).goto(i);for(;;){if(o.to!=l.to||!na(o.active,l.active)||o.point&&(!l.point||!oa(o.point,l.point)))return!1;if(o.to>r)return!0;o.next(),l.next()}}static spans(e,t,i,r,n=-1){let s=new QO(e,null,n).goto(t),a=t,o=s.openStart;for(;;){let l=Math.min(s.to,i);if(s.point){let c=s.activeForPoint(s.to),h=s.pointFroma&&(r.span(a,l,s.active,o),o=s.openEnd(l));if(s.to>i)return o+(s.point&&s.to>i?1:0);a=s.to,s.next()}}static of(e,t=!1){let i=new Le;for(let r of e instanceof Yi?[e]:t?Fg(e):e)i.add(r.from,r.to,r.value);return i.finish()}static join(e){if(!e.length)return O.empty;let t=e[e.length-1];for(let i=e.length-2;i>=0;i--)for(let r=e[i];r!=O.empty;r=r.nextLayer)t=new O(r.chunkPos,r.chunk,t,Math.max(r.maxPoint,t.maxPoint));return t}};M.empty=new M([],[],null,-1);function Fg(O){if(O.length>1)for(let e=O[0],t=1;t0)return O.slice().sort(ia);e=i}return O}M.empty.nextLayer=M.empty;var Le=class O{finishChunk(e){this.chunks.push(new ra(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new O)).add(e,t,i)}addInner(e,t,i){let r=e-this.lastTo||i.startSide-this.last.endSide;if(r<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return r<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=t,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let i=t.value.length-1;return this.last=t.value[i],this.lastFrom=t.from[i]+e,this.lastTo=t.to[i]+e,!0}finish(){return this.finishInner(M.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=M.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}};function Zh(O,e,t){let i=new Map;for(let n of O)for(let s=0;s=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&r.push(new Hr(s,t,i,n));return r.length==1?r[0]:new O(r)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let i=this.heap.length>>1;i>=0;i--)Ds(this.heap,i);return this.next(),this}forward(e,t){for(let i of this.heap)i.forward(e,t);for(let i=this.heap.length>>1;i>=0;i--)Ds(this.heap,i);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),Ds(this.heap,0)}}};function Ds(O,e){for(let t=O[e];;){let i=(e<<1)+1;if(i>=O.length)break;let r=O[i];if(i+1=0&&(r=O[i+1],i++),t.compare(r)<0)break;O[i]=t,O[e]=r,e=i}}var QO=class{constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=_i.from(e,t,i)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){Ar(this.active,e),Ar(this.activeTo,e),Ar(this.activeRank,e),this.minActive=Yh(this.active,this.activeTo)}addActive(e){let t=0,{value:i,to:r,rank:n}=this.cursor;for(;t0;)t++;Lr(this.active,t,i),Lr(this.activeTo,t,r),Lr(this.activeRank,t,n),e&&Lr(e,t,this.cursor.from),this.minActive=Yh(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let r=this.minActive;if(r>-1&&(this.activeTo[r]-this.cursor.from||this.active[r].endSide-this.cursor.startSide)<0){if(this.activeTo[r]>e){this.to=this.activeTo[r],this.endSide=this.active[r].endSide;break}this.removeActive(r),i&&Ar(i,r)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let n=this.cursor.value;if(!n.point)this.addActive(i),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&i[r]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&t.push(this.active[i]);return t.reverse()}openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)t++;return t}};function vh(O,e,t,i,r,n){O.goto(e),t.goto(i);let s=i+r,a=i,o=i-e,l=!!n.boundChange;for(let c=!1;;){let h=O.to+o-t.to,f=h||O.endSide-t.endSide,u=f<0?O.to+o:t.to,Q=Math.min(u,s);if(O.point||t.point?(O.point&&t.point&&oa(O.point,t.point)&&na(O.activeForPoint(O.to),t.activeForPoint(t.to))||n.comparePoint(a,Q,O.point,t.point),c=!1):(c&&n.boundChange(a),Q>a&&!na(O.active,t.active)&&n.compareRange(a,Q,O.active,t.active),l&&Qs)break;a=u,f<=0&&O.next(),f>=0&&t.next()}}function na(O,e){if(O.length!=e.length)return!1;for(let t=0;t=e;i--)O[i+1]=O[i];O[e]=t}function Yh(O,e){let t=-1,i=1e9;for(let r=0;r=e)return r;if(r==O.length)break;n+=O.charCodeAt(r)==9?t-n%t:1,r=fe(O,r)}return i===!0?-1:O.length}var Eh=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),la=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Ah=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Ot=class{constructor(e,t){this.rules=[];let{finish:i}=t||{};function r(s){return/^@/.test(s)?[s]:s.split(/,\s*/)}function n(s,a,o,l){let c=[],h=/^@(\w+)\b/.exec(s[0]),f=h&&h[1]=="keyframes";if(h&&a==null)return o.push(s[0]+";");for(let u in a){let Q=a[u];if(/&/.test(u))n(u.split(/,\s*/).map($=>s.map(p=>$.replace(/&/,p))).reduce(($,p)=>$.concat(p)),Q,o);else if(Q&&typeof Q=="object"){if(!h)throw new RangeError("The value of a property ("+u+") should be a primitive value.");n(r(u),Q,c,f)}else Q!=null&&c.push(u.replace(/_.*/,"").replace(/[A-Z]/g,$=>"-"+$.toLowerCase())+": "+Q+";")}(c.length||f)&&o.push((i&&!h&&!l?s.map(i):s).join(", ")+" {"+c.join(" ")+"}")}for(let s in e)n(r(s),e[s],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let e=Ah[Eh]||1;return Ah[Eh]=e+1,"\u037C"+e.toString(36)}static mount(e,t,i){let r=e[la],n=i&&i.nonce;r?n&&r.setNonce(n):r=new ca(e,n),r.mount(Array.isArray(t)?t:[t],e)}},Lh=new Map,ca=class{constructor(e,t){let i=e.ownerDocument||e,r=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&r.CSSStyleSheet){let n=Lh.get(i);if(n)return e[la]=n;this.sheet=new r.CSSStyleSheet,Lh.set(i,this)}else this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[la]=this}mount(e,t){let i=this.sheet,r=0,n=0;for(let s=0;s-1&&(this.modules.splice(o,1),n--,o=-1),o==-1){if(this.modules.splice(n++,0,a),i)for(let l=0;l",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Hg=typeof navigator<"u"&&/Mac/.test(navigator.platform),Kg=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for($e=0;$e<10;$e++)Yt[48+$e]=Yt[96+$e]=String($e);var $e;for($e=1;$e<=24;$e++)Yt[$e+111]="F"+$e;var $e;for($e=65;$e<=90;$e++)Yt[$e]=String.fromCharCode($e+32),HO[$e]=String.fromCharCode($e);var $e;for(Jr in Yt)HO.hasOwnProperty(Jr)||(HO[Jr]=Yt[Jr]);var Jr;function Mh(O){var e=Hg&&O.metaKey&&O.shiftKey&&!O.ctrlKey&&!O.altKey||Kg&&O.shiftKey&&O.key&&O.key.length==1||O.key=="Unidentified",t=!e&&O.key||(O.shiftKey?HO:Yt)[O.keyCode]||O.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}function N(){var O=arguments[0];typeof O=="string"&&(O=document.createElement(O));var e=1,t=arguments[1];if(t&&typeof t=="object"&&t.nodeType==null&&!Array.isArray(t)){for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var r=t[i];typeof r=="string"?O.setAttribute(i,r):r!=null&&(O[i]=r)}e++}for(;e2),v={mac:Nh||/Mac/.test(Ye.platform),windows:/Win/.test(Ye.platform),linux:/Linux|X11/.test(Ye.platform),ie:Rn,ie_version:_f?ga.documentMode||6:Sa?+Sa[1]:Pa?+Pa[1]:0,gecko:Ih,gecko_version:Ih?+(/Firefox\/(\d+)/.exec(Ye.userAgent)||[0,0])[1]:0,chrome:!!ha,chrome_version:ha?+ha[1]:0,ios:Nh,android:/Android\b/.test(Ye.userAgent),webkit:Bh,webkit_version:Bh?+(/\bAppleWebKit\/(\d+)/.exec(Ye.userAgent)||[0,0])[1]:0,safari:Xa,safari_version:Xa?+(/\bVersion\/(\d+(\.\d+)?)/.exec(Ye.userAgent)||[0,0])[1]:0,tabSize:ga.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function uo(O,e){for(let t in O)t=="class"&&e.class?e.class+=" "+O.class:t=="style"&&e.style?e.style+=";"+O.style:e[t]=O[t];return e}var $n=Object.create(null);function Qo(O,e,t){if(O==e)return!0;O||(O=$n),e||(e=$n);let i=Object.keys(O),r=Object.keys(e);if(i.length-(t&&i.indexOf(t)>-1?1:0)!=r.length-(t&&r.indexOf(t)>-1?1:0))return!1;for(let n of i)if(n!=t&&(r.indexOf(n)==-1||O[n]!==e[n]))return!1;return!0}function Jg(O,e){for(let t=O.attributes.length-1;t>=0;t--){let i=O.attributes[t].name;e[i]==null&&O.removeAttribute(i)}for(let t in e){let i=e[t];t=="style"?O.style.cssText=i:O.getAttribute(t)!=i&&O.setAttribute(t,i)}}function Fh(O,e,t){let i=!1;if(e)for(let r in e)t&&r in t||(i=!0,r=="style"?O.style.cssText="":O.removeAttribute(r));if(t)for(let r in t)e&&e[r]==t[r]||(i=!0,r=="style"?O.style.cssText=t[r]:O.setAttribute(r,t[r]));return i}function eP(O){let e=Object.create(null);for(let t=0;t0?3e8:-4e8:t>0?1e8:-1e8,new PO(e,t,t,i,e.widget||null,!1)}static replace(e){let t=!!e.block,i,r;if(e.isBlockGap)i=-5e8,r=4e8;else{let{start:n,end:s}=Rf(e,t);i=(n?t?-3e8:-1:5e8)-1,r=(s?t?2e8:1:-6e8)+1}return new PO(e,i,r,t,e.widget||null,!0)}static line(e){return new Ii(e)}static set(e,t=!1){return M.of(e,t)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};Y.none=M.empty;var Di=class O extends Y{constructor(e){let{start:t,end:i}=Rf(e);super(t?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?uo(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||$n}eq(e){return this==e||e instanceof O&&this.tagName==e.tagName&&Qo(this.attrs,e.attrs)}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}};Di.prototype.point=!1;var Ii=class O extends Y{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof O&&this.spec.class==e.spec.class&&Qo(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}};Ii.prototype.mapMode=pe.TrackBefore;Ii.prototype.point=!0;var PO=class O extends Y{constructor(e,t,i,r,n,s){super(t,i,n,e),this.block=r,this.isReplace=s,this.mapMode=r?t<=0?pe.TrackBefore:pe.TrackAfter:pe.TrackDel}get type(){return this.startSide!=this.endSide?Te.WidgetRange:this.startSide<=0?Te.WidgetBefore:Te.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof O&&tP(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}};PO.prototype.point=!0;function Rf(O,e=!1){let{inclusiveStart:t,inclusiveEnd:i}=O;return t==null&&(t=O.inclusive),i==null&&(i=O.inclusive),{start:t??e,end:i??e}}function tP(O,e){return O==e||!!(O&&e&&O.compare(e))}function Oi(O,e,t,i=0){let r=t.length-1;r>=0&&t[r]+i>=O?t[r]=Math.max(t[r],e):t.push(O,e)}var pn=class O extends tt{constructor(e,t){super(),this.tagName=e,this.attributes=t}eq(e){return e==this||e instanceof O&&this.tagName==e.tagName&&Qo(this.attributes,e.attributes)}static create(e){return new O(e.tagName,e.attributes||$n)}static set(e,t=!1){return M.of(e,t)}};pn.prototype.startSide=pn.prototype.endSide=-1;function Bi(O){let e;return O.nodeType==11?e=O.getSelection?O:O.ownerDocument:e=O,e.getSelection()}function Ta(O,e){return e?O==e||O.contains(e.nodeType!=1?e.parentNode:e):!1}function cn(O,e){if(!e.anchorNode)return!1;try{return Ta(O,e.anchorNode)}catch{return!1}}function hn(O){return O.nodeType==3?Ni(O,0,O.nodeValue.length).getClientRects():O.nodeType==1?O.getClientRects():[]}function Wi(O,e,t,i){return t?Hh(O,e,t,i,-1)||Hh(O,e,t,i,1):!1}function Nt(O){for(var e=0;;e++)if(O=O.previousSibling,!O)return e}function mn(O){return O.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(O.nodeName)}function Hh(O,e,t,i,r){for(;;){if(O==t&&e==i)return!0;if(e==(r<0?0:Rt(O))){if(O.nodeName=="DIV")return!1;let n=O.parentNode;if(!n||n.nodeType!=1)return!1;e=Nt(O)+(r<0?0:1),O=n}else if(O.nodeType==1){if(O=O.childNodes[e+(r<0?-1:0)],O.nodeType==1&&O.contentEditable=="false")return!1;e=r<0?Rt(O):0}else return!1}}function Rt(O){return O.nodeType==3?O.nodeValue.length:O.childNodes.length}function gn(O,e){let t=e?O.left:O.right;return{left:t,right:t,top:O.top,bottom:O.bottom}}function OP(O){let e=O.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:O.innerWidth,top:0,bottom:O.innerHeight}}function Vf(O,e){let t=e.width/O.offsetWidth,i=e.height/O.offsetHeight;return(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.width-O.offsetWidth)<1)&&(t=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-O.offsetHeight)<1)&&(i=1),{scaleX:t,scaleY:i}}function iP(O,e,t,i,r,n,s,a){let o=O.ownerDocument,l=o.defaultView||window;for(let c=O,h=!1;c&&!h;)if(c.nodeType==1){let f,u=c==o.body,Q=1,$=1;if(u)f=OP(l);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(h=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let g=c.getBoundingClientRect();({scaleX:Q,scaleY:$}=Vf(c,g)),f={left:g.left,right:g.left+c.clientWidth*Q,top:g.top,bottom:g.top+c.clientHeight*$}}let p=0,m=0;if(r=="nearest")e.top0&&e.bottom>f.bottom+m&&(m=e.bottom-f.bottom+s)):e.bottom>f.bottom&&(m=e.bottom-f.bottom+s,t<0&&e.top-m0&&e.right>f.right+p&&(p=e.right-f.right+n)):e.right>f.right&&(p=e.right-f.right+n,t<0&&e.leftf.bottom||e.leftf.right)&&(e={left:Math.max(e.left,f.left),right:Math.min(e.right,f.right),top:Math.max(e.top,f.top),bottom:Math.min(e.bottom,f.bottom)}),c=c.assignedSlot||c.parentNode}else if(c.nodeType==11)c=c.host;else break}function rP(O){let e=O.ownerDocument,t,i;for(let r=O.parentNode;r&&!(r==e.body||t&&i);)if(r.nodeType==1)!i&&r.scrollHeight>r.clientHeight&&(i=r),!t&&r.scrollWidth>r.clientWidth&&(t=r),r=r.assignedSlot||r.parentNode;else if(r.nodeType==11)r=r.host;else break;return{x:t,y:i}}var ba=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchorOffset,t?Rt(t):0),i,Math.min(e.focusOffset,i?Rt(i):0))}set(e,t,i,r){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this.focusOffset=r}},mO=null;v.safari&&v.safari_version>=26&&(mO=!1);function qf(O){if(O.setActive)return O.setActive();if(mO)return O.focus(mO);let e=[];for(let t=O;t&&(e.push(t,t.scrollTop,t.scrollLeft),t!=t.ownerDocument);t=t.parentNode);if(O.focus(mO==null?{get preventScroll(){return mO={preventScroll:!0},!0}}:void 0),!mO){mO=!1;for(let t=0;tMath.max(1,O.scrollHeight-O.clientHeight-4)}function Uf(O,e){for(let t=O,i=e;;){if(t.nodeType==3&&i>0)return{node:t,offset:i};if(t.nodeType==1&&i>0){if(t.contentEditable=="false")return null;t=t.childNodes[i-1],i=Rt(t)}else if(t.parentNode&&!mn(t))i=Nt(t),t=t.parentNode;else return null}}function Wf(O,e){for(let t=O,i=e;;){if(t.nodeType==3&&i=t){if(a.level==i)return s;(n<0||(r!=0?r<0?a.fromt:e[n].level>a.level))&&(n=s)}}if(n<0)throw new RangeError("Index out of range");return n}};function Gf(O,e){if(O.length!=e.length)return!1;for(let t=0;t=0;$-=3)if(Pt[$+1]==-u){let p=Pt[$+2],m=p&2?r:p&4?p&1?n:r:0;m&&(re[h]=re[Pt[$]]=m),a=$;break}}else{if(Pt.length==189)break;Pt[a++]=h,Pt[a++]=f,Pt[a++]=o}else if((Q=re[h])==2||Q==1){let $=Q==r;o=$?0:1;for(let p=a-3;p>=0;p-=3){let m=Pt[p+2];if(m&2)break;if($)Pt[p+2]|=2;else{if(m&4)break;Pt[p+2]|=4}}}}}function fP(O,e,t,i){for(let r=0,n=i;r<=t.length;r++){let s=r?t[r-1].to:O,a=ro;)Q==p&&(Q=t[--$].from,p=$?t[$-1].to:O),re[--Q]=u;o=c}else n=l,o++}}}function xa(O,e,t,i,r,n,s){let a=i%2?2:1;if(i%2==r%2)for(let o=e,l=0;oo&&s.push(new ct(o,$.from,u));let p=$.direction==SO!=!(u%2);ka(O,p?i+1:i,r,$.inner,$.from,$.to,s),o=$.to}Q=$.to}else{if(Q==t||(c?re[Q]!=a:re[Q]==a))break;Q++}f?xa(O,o,Q,i+1,r,f,s):oe;){let c=!0,h=!1;if(!l||o>n[l-1].to){let $=re[o-1];$!=a&&(c=!1,h=$==16)}let f=!c&&a==1?[]:null,u=c?i:i+1,Q=o;e:for(;;)if(l&&Q==n[l-1].to){if(h)break e;let $=n[--l];if(!c)for(let p=$.from,m=l;;){if(p==e)break e;if(m&&n[m-1].to==p)p=n[--m].from;else{if(re[p-1]==a)break e;break}}if(f)f.push($);else{$.tore.length;)re[re.length]=256;let i=[],r=e==SO?0:1;return ka(O,r,r,t,0,O.length,i),i}function Ef(O){return[new ct(0,O,0)]}var Af="";function uP(O,e,t,i,r){var n;let s=i.head-O.from,a=ct.find(e,s,(n=i.bidiLevel)!==null&&n!==void 0?n:-1,i.assoc),o=e[a],l=o.side(r,t);if(s==l){let f=a+=r?1:-1;if(f<0||f>=e.length)return null;o=e[a=f],s=o.side(!r,t),l=o.side(r,t)}let c=fe(O.text,s,o.forward(r,t));(co.to)&&(c=l),Af=O.text.slice(Math.min(s,c),Math.max(s,c));let h=a==(r?e.length-1:0)?null:e[a+(r?1:-1)];return h&&c==l&&h.level+(r?0:1)O.some(e=>e)}),Hf=Z.define({combine:O=>O.some(e=>e)}),Kf=Z.define(),ji=class O{constructor(e,t="nearest",i="nearest",r=5,n=5,s=!1){this.range=e,this.y=t,this.x=i,this.yMargin=r,this.xMargin=n,this.isSnapshot=s}map(e){return e.empty?this:new O(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new O(S.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},en=V.define({map:(O,e)=>O.map(e)}),Jf=V.define();function Xe(O,e,t){let i=O.facet(If);i.length?i[0](e):window.onerror&&window.onerror(String(e),t,void 0,void 0,e)||(t?console.error(t+":",e):console.error(e))}var _t=Z.define({combine:O=>O.length?O[0]:!0}),$P=0,KO=Z.define({combine(O){return O.filter((e,t)=>{for(let i=0;i{let o=[];return s&&o.push(Fi.of(l=>{let c=l.plugin(a);return c?s(c):Y.none})),n&&o.push(n(a)),o})}static fromClass(e,t){return O.define((i,r)=>new e(i,r),t)}},Ci=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(i){if(Xe(t.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){Xe(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{this.value.destroy()}catch(i){Xe(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},ed=Z.define(),go=Z.define(),Fi=Z.define(),td=Z.define(),Od=Z.define(),Ji=Z.define(),id=Z.define();function Jh(O,e){let t=O.state.facet(id);if(!t.length)return t;let i=t.map(n=>n instanceof Function?n(O):n),r=[];return M.spans(i,e.from,e.to,{point(){},span(n,s,a,o){let l=n-e.from,c=s-e.from,h=r;for(let f=a.length-1;f>=0;f--,o--){let u=a[f].spec.bidiIsolate,Q;if(u==null&&(u=QP(e.text,l,c)),o>0&&h.length&&(Q=h[h.length-1]).to==l&&Q.direction==u)Q.to=c,h=Q.inner;else{let $={from:l,to:c,direction:u,inner:[]};h.push($),h=$.inner}}}}),r}var rd=Z.define();function Po(O){let e=0,t=0,i=0,r=0;for(let n of O.state.facet(rd)){let s=n(O);s&&(s.left!=null&&(e=Math.max(e,s.left)),s.right!=null&&(t=Math.max(t,s.right)),s.top!=null&&(i=Math.max(i,s.top)),s.bottom!=null&&(r=Math.max(r,s.bottom)))}return{left:e,right:t,top:i,bottom:r}}var Vi=Z.define(),ht=class O{constructor(e,t,i,r){this.fromA=e,this.toA=t,this.fromB=i,this.toB=r}join(e){return new O(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let t=e.length,i=this;for(;t>0;t--){let r=e[t-1];if(!(r.fromA>i.toA)){if(r.toAr.push(new ht(n,s,a,o))),this.changedRanges=r}static create(e,t,i){return new O(e,t,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},pP=[],de=class{constructor(e,t,i=0){this.dom=e,this.length=t,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return pP}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let t=this.domAttrs;t&&Jg(this.dom,t)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,t=this.posAtStart){let i=t;for(let r of this.children){if(r==e)return i;i+=r.length+r.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,t){return null}domPosFor(e,t){let i=Nt(this.dom),r=this.length?e>0:t>0;return new St(this.parent.dom,i+(r?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof ni)return e;return null}static get(e){return e.cmTile}},ri=class extends de{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let t=this.dom,i=null,r,n=e?.node==t?e:null,s=0;for(let a of this.children){if(a.sync(e),s+=a.length+a.breakAfter,r=i?i.nextSibling:t.firstChild,n&&r!=a.dom&&(n.written=!0),a.dom.parentNode==t)for(;r&&r!=a.dom;)r=ef(r);else t.insertBefore(a.dom,r);i=a.dom}for(r=i?i.nextSibling:t.firstChild,n&&r&&(n.written=!0);r;)r=ef(r);this.length=s}};function ef(O){let e=O.nextSibling;return O.parentNode.removeChild(O),e}var ni=class extends ri{constructor(e,t){super(t),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let t=de.get(e);if(t&&this.owns(t))return t;e=e.parentNode}}blockTiles(e){for(let t=[],i=this,r=0,n=0;;)if(r==i.children.length){if(!t.length)return;i=i.parent,i.breakAfter&&n++,r=t.pop()}else{let s=i.children[r++];if(s instanceof It)t.push(r),i=s,r=0;else{let a=n+s.length,o=e(s,n);if(o!==void 0)return o;n=a+s.breakAfter}}}resolveBlock(e,t){let i,r=-1,n,s=-1;if(this.blockTiles((a,o)=>{let l=o+a.length;if(e>=o&&e<=l){if(a.isWidget()&&t>=-1&&t<=1){if(a.flags&32)return!0;a.flags&16&&(i=void 0)}(oe||e==o&&(t>1?a.length:a.covers(-1)))&&(!n||!a.isWidget()&&n.isWidget())&&(n=a,s=e-o)}}),!i&&!n)throw new Error("No tile at position "+e);return i&&t<0||!n?{tile:i,offset:r}:{tile:n,offset:s}}},It=class O extends ri{constructor(e,t){super(e),this.wrapper=t}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,t){let i=new O(t||document.createElement(e.tagName),e);return t||(i.flags|=4),i}},si=class O extends ri{constructor(e,t){super(e),this.attrs=t}isLine(){return!0}static start(e,t,i){let r=new O(t||document.createElement("div"),e);return(!t||!i)&&(r.flags|=4),r}get domAttrs(){return this.attrs}resolveInline(e,t,i){let r=null,n=-1,s=null,a=-1;function o(c,h){for(let f=0,u=0;f=h&&(Q.isComposite()?o(Q,h-u):(!s||s.isHidden&&(t>0||i&&gP(s,Q)))&&($>h||Q.flags&32)?(s=Q,a=h-u):(ui&&(e=i);let r=e,n=e,s=0;e==0&&t<0||e==i&&t>=0?v.chrome||v.gecko||(e?(r--,s=1):n=0)?0:a.length-1];return v.safari&&!s&&o.width==0&&(o=Array.prototype.find.call(a,l=>l.width)||o),s?gn(o,s<0):o||null}static of(e,t){let i=new O(t||document.createTextNode(e),e);return t||(i.flags|=2),i}},XO=class O extends de{constructor(e,t,i,r){super(e,t,r),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,t){return this.coordsInWidget(e,t,!1)}coordsInWidget(e,t,i){let r=this.widget.coordsAt(this.dom,e,t);if(r)return r;if(i)return gn(this.dom.getBoundingClientRect(),this.length?e==0:t<=0);{let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let a=this.flags&16?!0:this.flags&32?!1:e>0;for(let o=a?n.length-1:0;s=n[o],!(e>0?o==0:o==n.length-1||s.top0;)if(r.isComposite())if(s){if(!e)break;i&&i.break(),e--,s=!1}else if(n==r.children.length){if(!e&&!a.length)break;i&&i.leave(r),s=!!r.breakAfter,{tile:r,index:n}=a.pop(),n++}else{let o=r.children[n],l=o.breakAfter;(t>0?o.length<=e:o.length=0;a--){let o=t.marks[a],l=r.lastChild;if(l instanceof Ue&&l.mark.eq(o.mark))l.dom!=o.dom&&l.setDOM(fa(o.dom)),r=l;else{if(this.cache.reused.get(o)){let h=de.get(o.dom);h&&h.setDOM(fa(o.dom))}let c=Ue.of(o.mark,o.dom);r.append(c),r=c}this.cache.reused.set(o,2)}let n=de.get(e.text);n&&this.cache.reused.set(n,2);let s=new gO(e.text,e.text.nodeValue);s.flags|=8,r.append(s)}addInlineWidget(e,t,i){let r=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);r||this.flushBuffer();let n=this.ensureMarks(t,i);!r&&!(e.flags&16)&&n.append(this.getBuffer(1)),n.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,t,i){this.flushBuffer(),this.ensureMarks(t,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let t=this.afterWidget||this.lastBlock;t.length+=e,this.pos+=e}addLineStart(e,t){var i;e||(e=nd);let r=si.start(e,t||((i=this.cache.find(si))===null||i===void 0?void 0:i.dom),!!t);this.getBlockPos().append(this.lastBlock=this.curLine=r)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,t){var i;let r=this.curLine;for(let n=e.length-1;n>=0;n--){let s=e[n],a;if(t>0&&(a=r.lastChild)&&a instanceof Ue&&a.mark.eq(s))r=a,t--;else{let o=Ue.of(s,(i=this.cache.find(Ue,l=>l.mark.eq(s)))===null||i===void 0?void 0:i.dom);r.append(o),r=o,t=0}}return r}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!tf(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(v.ios&&tf(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(da,0,32)||new XO(da.toDOM(),0,da,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let t=new va(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-t.rank||this.wrappers[i-1].to-t.to)<0;)i--;this.wrappers.splice(i,0,t)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let i of this.wrappers){let r=t.lastChild;if(i.froms.wrapper.eq(i.wrapper)))===null||e===void 0?void 0:e.dom);t.append(n),t=n}}return t}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let t=2|(e<0?16:32),i=this.cache.find(ai,void 0,1);return i&&(i.flags=t),i||new ai(t)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},_a=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:r,lineBreak:n,done:s}=this.cursor.next(this.skipCount);if(this.skipCount=0,s)throw new Error("Ran out of text content when drawing inline views");this.text=r;let a=this.textOff=Math.min(e,r.length);return n?null:r.slice(0,a)}let t=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,t);return this.textOff=t,i}},Sn=[XO,si,gO,Ue,ai,It,ni];for(let O=0;O[]),this.index=Sn.map(()=>0),this.reused=new Map}add(e){let t=e.constructor.bucket,i=this.buckets[t];i.length<6?i.push(e):i[this.index[t]=(this.index[t]+1)%6]=e}find(e,t,i=2){let r=e.bucket,n=this.buckets[r],s=this.index[r];for(let a=n.length-1;a>=0;a--){let o=(a+s)%n.length,l=n[o];if((!t||t(l))&&!this.reused.has(l))return n.splice(o,1),o{if(this.cache.add(s),s.isComposite())return!1},enter:s=>this.cache.add(s),leave:()=>{},break:()=>{}}}run(e,t){let i=t&&this.getCompositionContext(t.text);for(let r=0,n=0,s=0;;){let a=sr){let l=o-r;this.preserve(l,!s,!a),r=o,n+=l}if(!a)break;this.forward(a.fromA,a.toA),t&&a.fromA<=t.range.fromA&&a.toA>=t.range.toA?(this.emit(n,t.range.fromB),this.builder.addComposition(t,i),this.text.skip(t.range.toB-t.range.fromB),this.emit(t.range.toB,a.toB)):this.emit(n,a.toB),n=a.toB,r=a.toA}return this.builder.curLine&&this.builder.endLine(),this.builder.root}preserve(e,t,i){let r=XP(this.old),n=this.openMarks;this.old.advance(e,i?1:-1,{skip:(s,a,o)=>{if(s.isWidget())if(this.openWidget)this.builder.continueWidget(o-a);else{let l=o>0||a{s.isLine()?this.builder.addLineStart(s.attrs,this.cache.maybeReuse(s)):(this.cache.add(s),s instanceof Ue&&r.unshift(s.mark)),this.openWidget=!1},leave:s=>{s.isLine()?r.length&&(r.length=n=0):s instanceof Ue&&(r.shift(),n=Math.min(n,r.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,t){let i=null,r=this.builder,n=0,s=M.spans(this.decorations,e,t,{point:(a,o,l,c,h,f)=>{if(l instanceof PO){if(this.disallowBlockEffectsFor[f]){if(l.block)throw new RangeError("Block decorations may not be specified via plugins");if(o>this.view.state.doc.lineAt(a).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(n=c.length,h>c.length)r.continueWidget(o-a);else{let u=l.widget||(l.block?Ft.block:Ft.inline),Q=PP(l),$=this.cache.findWidget(u,o-a,Q)||XO.of(u,this.view,o-a,Q);l.block?(l.startSide>0&&r.addLineStartIfNotCovered(i),r.addBlockWidget($)):(r.ensureLine(i),r.addInlineWidget($,c,h))}i=null}else i=SP(i,l);o>a&&this.text.skip(o-a)},span:(a,o,l,c)=>{for(let h=a;hn,this.openMarks=s}forward(e,t){t-e<=10?this.old.advance(t-e,1,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(t-e-10,-1),this.old.advance(5,1,this.reuseWalker))}getCompositionContext(e){let t=[],i=null;for(let r=e.parentNode;;r=r.parentNode){let n=de.get(r);if(r==this.view.contentDOM)break;n instanceof Ue?t.push(n):n?.isLine()?i=n:r.nodeName=="DIV"&&!i&&r!=this.view.contentDOM?i=new si(r,nd):t.push(Ue.of(new Di({tagName:r.nodeName.toLowerCase(),attributes:eP(r)}),r))}return{line:i,marks:t}}};function tf(O,e){let t=i=>{for(let r of i.children)if((e?r.isText():r.length)||t(r))return!0;return!1};return t(O)}function PP(O){let e=O.isReplace?(O.startSide<0?64:0)|(O.endSide>0?128:0):O.startSide>0?32:16;return O.block&&(e|=256),e}var nd={class:"cm-line"};function SP(O,e){let t=e.spec.attributes,i=e.spec.class;return!t&&!i||(O||(O={class:"cm-line"}),t&&uo(t,O),i&&(O.class+=" "+i)),O}function XP(O){let e=[];for(let t=O.parents.length;t>1;t--){let i=t==O.parents.length?O.tile:O.parents[t].tile;i instanceof Ue&&e.push(i.mark)}return e}function fa(O){let e=de.get(O);return e&&e.setDOM(O.cloneNode()),O}var Ft=class extends _e{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};Ft.inline=new Ft("span");Ft.block=new Ft("div");var da=new class extends _e{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},Xn=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=Y.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new ni(e,e.contentDOM),this.updateInner([new ht(0,0,0,e.state.doc.length)],null)}update(e){var t;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:c,toA:h})=>hthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let r=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((t=this.domChanged)===null||t===void 0)&&t.newSel?r=this.domChanged.newSel.head:!vP(e.changes,this.hasComposition)&&!e.selectionSet&&(r=e.state.selection.main.head));let n=r>-1?bP(this.view,e.changes,r):null;if(this.domChanged=null,this.hasComposition){let{from:c,to:h}=this.hasComposition;i=new ht(c,h,e.changes.mapPos(c,-1),e.changes.mapPos(h,1)).addToSet(i.slice())}this.hasComposition=n?{from:n.range.fromB,to:n.range.toB}:null,(v.ie||v.chrome)&&!n&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let s=this.decorations,a=this.blockWrappers;this.updateDeco();let o=kP(s,this.decorations,e.changes);o.length&&(i=ht.extendWithRanges(i,o));let l=wP(a,this.blockWrappers,e.changes);return l.length&&(i=ht.extendWithRanges(i,l)),n&&!i.some(c=>c.fromA<=n.range.fromA&&c.toA>=n.range.toA)&&(i=n.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,n),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(t||e.length){let s=this.tile,a=new Va(this.view,s,this.blockWrappers,this.decorations,this.dynamicDecorationMap);this.tile=a.run(e,t),qa(s,a.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let n=v.chrome||v.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(n),n&&(n.written||i.selectionRange.focusNode!=n.node||!this.tile.dom.contains(n.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let r=[];if(this.view.viewport.from||this.view.viewport.to-1)&&cn(i,this.view.observer.selectionRange)&&!(r&&i.contains(r));if(!(n||t||s))return;let a=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,l,c;if(o.empty?c=l=this.inlineDOMNearPos(o.anchor,o.assoc||1):(c=this.inlineDOMNearPos(o.head,o.head==o.from?1:-1),l=this.inlineDOMNearPos(o.anchor,o.anchor==o.from?1:-1)),v.gecko&&o.empty&&!this.hasComposition&&TP(l)){let f=document.createTextNode("");this.view.observer.ignore(()=>l.node.insertBefore(f,l.node.childNodes[l.offset]||null)),l=c=new St(f,0),a=!0}let h=this.view.observer.selectionRange;(a||!h.focusNode||(!Wi(l.node,l.offset,h.anchorNode,h.anchorOffset)||!Wi(c.node,c.offset,h.focusNode,h.focusOffset))&&!this.suppressWidgetCursorChange(h,o))&&(this.view.observer.ignore(()=>{v.android&&v.chrome&&i.contains(h.focusNode)&&ZP(h.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let f=Bi(this.view.root);if(f)if(o.empty){if(v.gecko){let u=yP(l.node,l.offset);if(u&&u!=3){let Q=(u==1?Uf:Wf)(l.node,l.offset);Q&&(l=new St(Q.node,Q.offset))}}f.collapse(l.node,l.offset),o.bidiLevel!=null&&f.caretBidiLevel!==void 0&&(f.caretBidiLevel=o.bidiLevel)}else if(f.extend){f.collapse(l.node,l.offset);try{f.extend(c.node,c.offset)}catch{}}else{let u=document.createRange();o.anchor>o.head&&([l,c]=[c,l]),u.setEnd(c.node,c.offset),u.setStart(l.node,l.offset),f.removeAllRanges(),f.addRange(u)}s&&this.view.root.activeElement==i&&(i.blur(),r&&r.focus())}),this.view.observer.setSelectionRange(l,c)),this.impreciseAnchor=l.precise?null:new St(h.anchorNode,h.anchorOffset),this.impreciseHead=c.precise?null:new St(h.focusNode,h.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&Wi(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,i=Bi(e.root),{anchorNode:r,anchorOffset:n}=e.observer.selectionRange;if(!i||!t.empty||!t.assoc||!i.modify)return;let s=this.lineAt(t.head,t.assoc);if(!s)return;let a=s.posAtStart;if(t.head==a||t.head==a+s.length)return;let o=this.coordsAt(t.head,-1),l=this.coordsAt(t.head,1);if(!o||!l||o.bottom>l.top)return;let c=this.domAtPos(t.head+t.assoc,t.assoc);i.collapse(c.node,c.offset),i.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let h=e.observer.selectionRange;e.docView.posFromDOM(h.anchorNode,h.anchorOffset)!=t.from&&i.collapse(r,n)}posFromDOM(e,t){let i=this.tile.nearest(e);if(!i)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let r=i.posAtStart;if(i.isComposite()){let n;if(e==i.dom)n=i.dom.childNodes[t];else{let s=Rt(e)==0?0:t==0?-1:1;for(;;){let a=e.parentNode;if(a==i.dom)break;s==0&&a.firstChild!=a.lastChild&&(e==a.firstChild?s=-1:s=1),e=a}s<0?n=e:n=e.nextSibling}if(n==i.dom.firstChild)return r;for(;n&&!de.get(n);)n=n.nextSibling;if(!n)return r+i.length;for(let s=0,a=r;;s++){let o=i.children[s];if(o.dom==n)return a;a+=o.length+o.breakAfter}}else return i.isText()?e==i.dom?r+t:r+(t?i.length:0):r}domAtPos(e,t){let{tile:i,offset:r}=this.tile.resolveBlock(e,t);return i.isWidget()?i.domPosFor(e,t):i.domIn(r,t)}inlineDOMNearPos(e,t){let i,r=-1,n=!1,s,a=-1,o=!1;return this.tile.blockTiles((l,c)=>{if(l.isWidget()){if(l.flags&32&&c>=e)return!0;l.flags&16&&(n=!0)}else{let h=c+l.length;if(c<=e&&(i=l,r=e-c,n=h=e&&!s&&(s=l,a=e-c,o=c>e),c>e&&s)return!0}}),!i&&!s?this.domAtPos(e,t):(n&&s?i=null:o&&i&&(s=null),i&&t<0||!s?i.domIn(r,t):s.domIn(a,t))}coordsAt(e,t){let{tile:i,offset:r}=this.tile.resolveBlock(e,t);return i.isWidget()?i.widget instanceof Gi?null:i.coordsInWidget(r,t,!0):i.coordsIn(r,t)}lineAt(e,t){let{tile:i}=this.tile.resolveBlock(e,t);return i.isLine()?i:null}coordsForChar(e){let{tile:t,offset:i}=this.tile.resolveBlock(e,1);if(!t.isLine())return null;function r(n,s){if(n.isComposite())for(let a of n.children){if(a.length>=s){let o=r(a,s);if(o)return o}if(s-=a.length,s<0)break}else if(n.isText()&&sMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,a=-1,o=this.view.textDirection==H.LTR,l=0,c=(h,f,u)=>{for(let Q=0;Qr);Q++){let $=h.children[Q],p=f+$.length,m=$.dom.getBoundingClientRect(),{height:g}=m;if(u&&!Q&&(l+=m.top-u.top),$ instanceof It)p>i&&c($,f,m);else if(f>=i&&(l>0&&t.push(-l),t.push(g+l),l=0,s)){let P=$.dom.lastChild,y=P?hn(P):[];if(y.length){let X=y[y.length-1],x=o?X.right-m.left:m.right-X.left;x>a&&(a=x,this.minWidth=n,this.minWidthFrom=f,this.minWidthTo=p)}}u&&Q==h.children.length-1&&(l+=u.bottom-m.bottom),f=p+$.breakAfter}};return c(this.tile,0,null),t}textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return getComputedStyle(t.dom).direction=="rtl"?H.RTL:H.LTR}measureTextSize(){let e=this.tile.blockTiles(s=>{if(s.isLine()&&s.children.length&&s.length<=20){let a=0,o;for(let l of s.children){if(!l.isText()||/[^ -~]/.test(l.text))return;let c=hn(l.dom);if(c.length!=1)return;a+=c[0].width,o=c[0].height}if(a)return{lineHeight:s.dom.getBoundingClientRect().height,charWidth:a/s.length,textHeight:o}}});if(e)return e;let t=document.createElement("div"),i,r,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(t);let s=hn(t.firstChild)[0];i=t.getBoundingClientRect().height,r=s&&s.width?s.width/27:7,n=s&&s.height?s.height:i,t.remove()}),{lineHeight:i,charWidth:r,textHeight:n}}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,r=0;;r++){let n=r==t.viewports.length?null:t.viewports[r],s=n?n.from-1:this.view.state.doc.length;if(s>i){let a=(t.lineBlockAt(s).bottom-t.lineBlockAt(i).top)/this.view.scaleY;e.push(Y.replace({widget:new Gi(a),block:!0,inclusive:!0,isBlockGap:!0}).range(i,s))}if(!n)break;i=n.to+1}return Y.set(e)}updateDeco(){let e=1,t=this.view.state.facet(Fi).map(n=>(this.dynamicDecorationMap[e++]=typeof n=="function")?n(this.view):n),i=!1,r=this.view.state.facet(Od).map((n,s)=>{let a=typeof n=="function";return a&&(i=!0),a?n(this.view):n});for(r.length&&(this.dynamicDecorationMap[e++]=i,t.push(M.join(r))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof n=="function"?n(this.view):n)}scrollIntoView(e){if(e.isSnapshot){let l=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=l.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let l of this.view.state.facet(Kf))try{if(l(this.view,e.range,e))return!0}catch(c){Xe(this.view.state,c,"scroll handler")}let{range:t}=e,i=this.coordsAt(t.head,t.empty?t.assoc:t.head>t.anchor?-1:1),r;if(!i)return;!t.empty&&(r=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(i={left:Math.min(i.left,r.left),top:Math.min(i.top,r.top),right:Math.max(i.right,r.right),bottom:Math.max(i.bottom,r.bottom)});let n=Po(this.view),s={left:i.left-n.left,top:i.top-n.top,right:i.right+n.right,bottom:i.bottom+n.bottom},{offsetWidth:a,offsetHeight:o}=this.view.scrollDOM;iP(this.view.scrollDOM,s,t.headi.isWidget()||i.children.some(t);return t(this.tile.resolveBlock(e,1).tile)}destroy(){qa(this.tile)}};function qa(O,e){let t=e?.get(O);if(t!=1){t==null&&O.destroy();for(let i of O.children)qa(i,e)}}function TP(O){return O.node.nodeType==1&&O.node.firstChild&&(O.offset==0||O.node.childNodes[O.offset-1].contentEditable=="false")&&(O.offset==O.node.childNodes.length||O.node.childNodes[O.offset].contentEditable=="false")}function sd(O,e){let t=O.observer.selectionRange;if(!t.focusNode)return null;let i=Uf(t.focusNode,t.focusOffset),r=Wf(t.focusNode,t.focusOffset),n=i||r;if(r&&i&&r.node!=i.node){let a=de.get(r.node);if(!a||a.isText()&&a.text!=r.node.nodeValue)n=r;else if(O.docView.lastCompositionAfterCursor){let o=de.get(i.node);!o||o.isText()&&o.text!=i.node.nodeValue||(n=r)}}if(O.docView.lastCompositionAfterCursor=n!=i,!n)return null;let s=e-n.offset;return{from:s,to:s+n.node.nodeValue.length,node:n.node}}function bP(O,e,t){let i=sd(O,t);if(!i)return null;let{node:r,from:n,to:s}=i,a=r.nodeValue;if(/[\n\r]/.test(a)||O.state.doc.sliceString(i.from,i.to)!=a)return null;let o=e.invertedDesc;return{range:new ht(o.mapPos(n),o.mapPos(s),n,s),text:r}}function yP(O,e){return O.nodeType!=1?0:(e&&O.childNodes[e-1].contentEditable=="false"?1:0)|(e{ie.from&&(t=!0)}),t}var Gi=class extends _e{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function YP(O,e,t=1){let i=O.charCategorizer(e),r=O.doc.lineAt(e),n=e-r.from;if(r.length==0)return S.cursor(e);n==0?t=1:n==r.length&&(t=-1);let s=n,a=n;t<0?s=fe(r.text,n,!1):a=fe(r.text,n);let o=i(r.text.slice(s,a));for(;s>0;){let l=fe(r.text,s,!1);if(i(r.text.slice(l,s))!=o)break;s=l}for(;aO.defaultLineHeight*1.5){let a=O.viewState.heightOracle.textHeight,o=Math.floor((r-t.top-(O.defaultLineHeight-a)*.5)/a);n+=o*O.viewState.heightOracle.lineLength}let s=O.state.sliceDoc(t.from,t.to);return t.from+Kr(s,n,O.state.tabSize)}function Ua(O,e,t){let i=O.lineBlockAt(e);if(Array.isArray(i.type)){let r;for(let n of i.type){if(n.from>e)break;if(!(n.toe)return n;(!r||n.type==Te.Text&&(r.type!=n.type||(t<0?n.frome)))&&(r=n)}}return r||i}return i}function RP(O,e,t,i){let r=Ua(O,e.head,e.assoc||-1),n=!i||r.type!=Te.Text||!(O.lineWrapping||r.widgetLineBreaks)?null:O.coordsAtPos(e.assoc<0&&e.head>r.from?e.head-1:e.head);if(n){let s=O.dom.getBoundingClientRect(),a=O.textDirectionAt(r.from),o=O.posAtCoords({x:t==(a==H.LTR)?s.right-1:s.left+1,y:(n.top+n.bottom)/2});if(o!=null)return S.cursor(o,t?-1:1)}return S.cursor(t?r.to:r.from,t?-1:1)}function Of(O,e,t,i){let r=O.state.doc.lineAt(e.head),n=O.bidiSpans(r),s=O.textDirectionAt(r.from);for(let a=e,o=null;;){let l=uP(r,n,s,a,t),c=Af;if(!l){if(r.number==(t?O.state.doc.lines:1))return a;c=` +`,r=O.state.doc.line(r.number+(t?1:-1)),n=O.bidiSpans(r),l=O.visualLineSide(r,!t)}if(o){if(!o(c))return a}else{if(!i)return l;o=i(c)}a=l}}function VP(O,e,t){let i=O.state.charCategorizer(e),r=i(t);return n=>{let s=i(n);return r==ee.Space&&(r=s),r==s}}function qP(O,e,t,i){let r=e.head,n=t?1:-1;if(r==(t?O.state.doc.length:0))return S.cursor(r,e.assoc);let s=e.goalColumn,a,o=O.contentDOM.getBoundingClientRect(),l=O.coordsAtPos(r,e.assoc||-1),c=O.documentTop;if(l)s==null&&(s=l.left-o.left),a=n<0?l.top:l.bottom;else{let u=O.viewState.lineBlockAt(r);s==null&&(s=Math.min(o.right-o.left,O.defaultCharacterWidth*(r-u.from))),a=(n<0?u.top:u.bottom)+c}let h=o.left+s,f=i??O.viewState.heightOracle.textHeight>>1;for(let u=0;;u+=10){let Q=a+(f+u)*n,$=Wa(O,{x:h,y:Q},!1,n);return S.cursor($.pos,$.assoc,void 0,s)}}function Ei(O,e,t){for(;;){let i=0;for(let r of O)r.between(e-1,e+1,(n,s,a)=>{if(e>n&&er(O)),t.from,e.head>t.from?-1:1);return i==t.from?t:S.cursor(i,iO.viewState.docHeight)return new rt(O.state.doc.length,-1);if(l=O.elementAtHeight(o),i==null)break;if(l.type==Te.Text){let f=O.docView.coordsAt(i<0?l.from:l.to,i);if(f&&(i<0?f.top<=o+n:f.bottom>=o+n))break}let h=O.viewState.heightOracle.textHeight/2;o=i>0?l.bottom+h:l.top-h}if(O.viewport.from>=l.to||O.viewport.to<=l.from){if(t)return null;if(l.type==Te.Text){let h=_P(O,r,l,s,a);return new rt(h,h==l.from?1:-1)}}if(l.type!=Te.Text)return o<(l.top+l.bottom)/2?new rt(l.from,1):new rt(l.to,-1);let c=O.docView.lineAt(l.from,2);return(!c||c.length!=l.length)&&(c=O.docView.lineAt(l.from,-2)),od(O,c,l.from,s,a)}function od(O,e,t,i,r){let n=-1,s=null,a=1e9,o=1e9,l=r,c=r,h=(f,u)=>{for(let Q=0;Qi?$.left-i:$.rightr?$.top-r:$.bottom=l&&(l=Math.min($.top,l),c=Math.max($.bottom,c),m=0),(n<0||(m-o||p-a)<0)&&(n>=0&&o&&a=l+2?o=0:(n=u,a=p,o=m,s=$))}};if(e.isText()){for(let u=0;u(s.left+s.right)/2==(rf(O,n+t)==H.LTR)?new rt(t+fe(e.text,n),-1):new rt(t+n,1)}else{if(!e.length)return new rt(t,1);for(let $=0;$(s.left+s.right)/2==(rf(O,n+t)==H.LTR)?new rt(u+f.length,-1):new rt(u,1)}}function rf(O,e){let t=O.state.doc.lineAt(e);return O.bidiSpans(t)[ct.find(O.bidiSpans(t),e-t.from,-1,1)].dir}var qi="\uFFFF",ja=class{constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparator=t.state.facet(I.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=qi}readRange(e,t){if(!e)return this;let i=e.parentNode;for(let r=e;;){this.findPointBefore(i,r);let n=this.text.length;this.readNode(r);let s=de.get(r),a=r.nextSibling;if(a==t){s?.breakAfter&&!a&&i!=this.view.contentDOM&&this.lineBreak();break}let o=de.get(a);(s&&o?s.breakAfter:(s?s.breakAfter:mn(r))||mn(a)&&(r.nodeName!="BR"||s?.isWidget())&&this.text.length>n)&&!UP(a,t)&&this.lineBreak(),r=a}return this.findPointBefore(i,t),this}readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,t.length));for(let i=0,r=this.lineSeparator?null:/\r\n?|\n/g;;){let n=-1,s=1,a;if(this.lineSeparator?(n=t.indexOf(this.lineSeparator,i),s=this.lineSeparator.length):(a=r.exec(t))&&(n=a.index,s=a[0].length),this.append(t.slice(i,n<0?t.length:n)),n<0)break;if(this.lineBreak(),s>1)for(let o of this.points)o.node==e&&o.pos>this.text.length&&(o.pos-=s-1);i=n+s}}readNode(e){let t=de.get(e),i=t&&t.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let r=i.iter();!r.next().done;)r.lineBreak?this.lineBreak():this.append(r.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==t&&(i.pos=this.text.length)}findPointInside(e,t){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(zP(e,i.node,i.offset)?t:0))}};function zP(O,e,t){for(;;){if(!e||t-1;let{impreciseHead:n,impreciseAnchor:s}=e.docView;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=ld(e.docView.tile,t,i,0))){let a=n||s?[]:jP(e),o=new ja(a,e);o.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=o.text,this.newSel=CP(a,this.bounds.from)}else{let a=e.observer.selectionRange,o=n&&n.node==a.focusNode&&n.offset==a.focusOffset||!Ta(e.contentDOM,a.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(a.focusNode,a.focusOffset),l=s&&s.node==a.anchorNode&&s.offset==a.anchorOffset||!Ta(e.contentDOM,a.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(a.anchorNode,a.anchorOffset),c=e.viewport;if((v.ios||v.chrome)&&e.state.selection.main.empty&&o!=l&&(c.from>0||c.to-1&&e.state.selection.ranges.length>1?this.newSel=e.state.selection.replaceRange(S.range(l,o)):this.newSel=S.single(l,o)}}};function ld(O,e,t,i){if(O.isComposite()){let r=-1,n=-1,s=-1,a=-1;for(let o=0,l=i,c=i;ot)return ld(h,e,t,l);if(f>=e&&r==-1&&(r=o,n=l),l>t&&h.dom.parentNode==O.dom){s=o,a=c;break}c=f,l=f+h.breakAfter}return{from:n,to:a<0?i+O.length:a,startDOM:(r?O.children[r-1].dom.nextSibling:null)||O.dom.firstChild,endDOM:s=0?O.children[s].dom:null}}else return O.isText()?{from:i,to:i+O.length,startDOM:O.dom,endDOM:O.dom.nextSibling}:null}function cd(O,e){let t,{newSel:i}=e,r=O.state.selection.main,n=O.inputState.lastKeyTime>Date.now()-100?O.inputState.lastKeyCode:-1;if(e.bounds){let{from:s,to:a}=e.bounds,o=r.from,l=null;(n===8||v.android&&e.text.length=r.from&&t.to<=r.to&&(t.from!=r.from||t.to!=r.to)&&r.to-r.from-(t.to-t.from)<=4?t={from:r.from,to:r.to,insert:O.state.doc.slice(r.from,t.from).append(t.insert).append(O.state.doc.slice(t.to,r.to))}:O.state.doc.lineAt(r.from).toDate.now()-50?t={from:r.from,to:r.to,insert:O.state.toText(O.inputState.insertingText)}:v.chrome&&t&&t.from==t.to&&t.from==r.head&&t.insert.toString()==` + `&&O.lineWrapping&&(i&&(i=S.single(i.main.anchor-1,i.main.head-1)),t={from:r.from,to:r.to,insert:E.of([" "])}),t)return So(O,t,i,n);if(i&&!i.main.eq(r)){let s=!1,a="select";return O.inputState.lastSelectionTime>Date.now()-50&&(O.inputState.lastSelectionOrigin=="select"&&(s=!0),a=O.inputState.lastSelectionOrigin,a=="select.pointer"&&(i=ad(O.state.facet(Ji).map(o=>o(O)),i))),O.dispatch({selection:i,scrollIntoView:s,userEvent:a}),!0}else return!1}function So(O,e,t,i=-1){if(v.ios&&O.inputState.flushIOSKey(e))return!0;let r=O.state.selection.main;if(v.android&&(e.to==r.to&&(e.from==r.from||e.from==r.from-1&&O.state.sliceDoc(e.from,r.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&ii(O.contentDOM,"Enter",13)||(e.from==r.from-1&&e.to==r.to&&e.insert.length==0||i==8&&e.insert.lengthr.head)&&ii(O.contentDOM,"Backspace",8)||e.from==r.from&&e.to==r.to+1&&e.insert.length==0&&ii(O.contentDOM,"Delete",46)))return!0;let n=e.insert.toString();O.inputState.composing>=0&&O.inputState.composing++;let s,a=()=>s||(s=WP(O,e,t));return O.state.facet(Bf).some(o=>o(O,e.from,e.to,n,a))||O.dispatch(a()),!0}function WP(O,e,t){let i,r=O.state,n=r.selection.main,s=-1;if(e.from==e.to&&e.fromn.to){let o=e.fromh(O)),l,o);e.from==c&&(s=c)}if(s>-1)i={changes:e,selection:S.cursor(e.from+e.insert.length,-1)};else if(e.from>=n.from&&e.to<=n.to&&e.to-e.from>=(n.to-n.from)/3&&(!t||t.main.empty&&t.main.from==e.from+e.insert.length)&&O.inputState.composing<0){let o=n.frome.to?r.sliceDoc(e.to,n.to):"";i=r.replaceSelection(O.state.toText(o+e.insert.sliceString(0,void 0,O.state.lineBreak)+l))}else{let o=r.changes(e),l=t&&t.main.to<=o.newLength?t.main:void 0;if(r.selection.ranges.length>1&&(O.inputState.composing>=0||O.inputState.compositionPendingChange)&&e.to<=n.to+10&&e.to>=n.to-10){let c=O.state.sliceDoc(e.from,e.to),h,f=t&&sd(O,t.main.head);if(f){let Q=e.insert.length-(e.to-e.from);h={from:f.from,to:f.to-Q}}else h=O.state.doc.lineAt(n.head);let u=n.to-e.to;i=r.changeByRange(Q=>{if(Q.from==n.from&&Q.to==n.to)return{changes:o,range:l||Q.map(o)};let $=Q.to-u,p=$-c.length;if(O.state.sliceDoc(p,$)!=c||$>=h.from&&p<=h.to)return{range:Q};let m=r.changes({from:p,to:$,insert:e.insert}),g=Q.to-n.to;return{changes:m,range:l?S.range(Math.max(0,l.anchor+g),Math.max(0,l.head+g)):Q.map(m)}})}else i={changes:o,selection:l&&r.selection.replaceRange(l)}}let a="input.type";return(O.composing||O.inputState.compositionPendingChange&&O.inputState.compositionEndedAt>Date.now()-50)&&(O.inputState.compositionPendingChange=!1,a+=".compose",O.inputState.compositionFirstChange&&(a+=".start",O.inputState.compositionFirstChange=!1)),r.update(i,{userEvent:a,scrollIntoView:!0})}function hd(O,e,t,i){let r=Math.min(O.length,e.length),n=0;for(;n0&&a>0&&O.charCodeAt(s-1)==e.charCodeAt(a-1);)s--,a--;if(i=="end"){let o=Math.max(0,n-Math.min(s,a));t-=s+o-n}if(s=s?n-t:0;n-=o,a=n+(a-s),s=n}else if(a=a?n-t:0;n-=o,s=n+(s-a),a=n}return{from:n,toA:s,toB:a}}function jP(O){let e=[];if(O.root.activeElement!=O.contentDOM)return e;let{anchorNode:t,anchorOffset:i,focusNode:r,focusOffset:n}=O.observer.selectionRange;return t&&(e.push(new Tn(t,i)),(r!=t||n!=i)&&e.push(new Tn(r,n))),e}function CP(O,e){if(O.length==0)return null;let t=O[0].pos,i=O.length==2?O[1].pos:t;return t>-1&&i>-1?S.single(t+e,i+e):null}var Ga=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,v.safari&&e.contentDOM.addEventListener("input",()=>null),v.gecko&&eS(e.contentDOM.ownerDocument)}handleEvent(e){!IP(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,t){let i=this.handlers[e];if(i){for(let r of i.observers)r(this.view,t);for(let r of i.handlers){if(t.defaultPrevented)break;if(r(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=GP(e),i=this.handlers,r=this.view.contentDOM;for(let n in t)if(n!="scroll"){let s=!t[n].handlers.length,a=i[n];a&&s!=!a.handlers.length&&(r.removeEventListener(n,this.handleEvent),a=null),a||r.addEventListener(n,this.handleEvent,{passive:s})}for(let n in i)n!="scroll"&&!t[n]&&r.removeEventListener(n,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&dd.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),v.android&&v.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let t;return v.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&((t=fd.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||EP.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(this.pendingIOSKey=t||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let t=this.pendingIOSKey;return!t||t.key=="Enter"&&e&&e.from0?!0:v.safari&&!v.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function nf(O,e){return(t,i)=>{try{return e.call(O,i,t)}catch(r){Xe(t.state,r)}}}function GP(O){let e=Object.create(null);function t(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of O){let r=i.spec,n=r&&r.plugin.domEventHandlers,s=r&&r.plugin.domEventObservers;if(n)for(let a in n){let o=n[a];o&&t(a).handlers.push(nf(i.value,o))}if(s)for(let a in s){let o=s[a];o&&t(a).observers.push(nf(i.value,o))}}for(let i in ft)t(i).handlers.push(ft[i]);for(let i in nt)t(i).observers.push(nt[i]);return e}var fd=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],EP="dthko",dd=[16,17,18,20,91,92,224,225],tn=6;function On(O){return Math.max(0,O)*.7+8}function AP(O,e){return Math.max(Math.abs(O.clientX-e.clientX),Math.abs(O.clientY-e.clientY))}var Ea=class{constructor(e,t,i,r){this.view=e,this.startEvent=t,this.style=i,this.mustSelect=r,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=rP(e.contentDOM),this.atoms=e.state.facet(Ji).map(s=>s(e));let n=e.contentDOM.ownerDocument;n.addEventListener("mousemove",this.move=this.move.bind(this)),n.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(I.allowMultipleSelections)&&LP(e,t),this.dragging=DP(e,t)&&$d(t)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&AP(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let t=0,i=0,r=0,n=0,s=this.view.win.innerWidth,a=this.view.win.innerHeight;this.scrollParents.x&&({left:r,right:s}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:n,bottom:a}=this.scrollParents.y.getBoundingClientRect());let o=Po(this.view);e.clientX-o.left<=r+tn?t=-On(r-e.clientX):e.clientX+o.right>=s-tn&&(t=On(e.clientX-s)),e.clientY-o.top<=n+tn?i=-On(n-e.clientY):e.clientY+o.bottom>=a-tn&&(i=On(e.clientY-a)),this.setScrollSpeed(t,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:t}=this,i=ad(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!i.eq(t.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(t=>t.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function LP(O,e){let t=O.state.facet(Lf);return t.length?t[0](e):v.mac?e.metaKey:e.ctrlKey}function MP(O,e){let t=O.state.facet(Mf);return t.length?t[0](e):v.mac?!e.altKey:!e.ctrlKey}function DP(O,e){let{main:t}=O.state.selection;if(t.empty)return!1;let i=Bi(O.root);if(!i||i.rangeCount==0)return!0;let r=i.getRangeAt(0).getClientRects();for(let n=0;n=e.clientX&&s.top<=e.clientY&&s.bottom>=e.clientY)return!0}return!1}function IP(O,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target,i;t!=O.contentDOM;t=t.parentNode)if(!t||t.nodeType==11||(i=de.get(t))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(e))return!1;return!0}var ft=Object.create(null),nt=Object.create(null),ud=v.ie&&v.ie_version<15||v.ios&&v.webkit_version<604;function BP(O){let e=O.dom.parentNode;if(!e)return;let t=e.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.focus(),setTimeout(()=>{O.focus(),t.remove(),Qd(O,t.value)},50)}function Vn(O,e,t){for(let i of O.facet(e))t=i(t,O);return t}function Qd(O,e){e=Vn(O.state,po,e);let{state:t}=O,i,r=1,n=t.toText(e),s=n.lines==t.selection.ranges.length;if(Aa!=null&&t.selection.ranges.every(o=>o.empty)&&Aa==n.toString()){let o=-1;i=t.changeByRange(l=>{let c=t.doc.lineAt(l.from);if(c.from==o)return{range:l};o=c.from;let h=t.toText((s?n.line(r++).text:e)+t.lineBreak);return{changes:{from:c.from,insert:h},range:S.cursor(l.from+h.length)}})}else s?i=t.changeByRange(o=>{let l=n.line(r++);return{changes:{from:o.from,to:o.to,insert:l.text},range:S.cursor(o.from+l.length)}}):i=t.replaceSelection(n);O.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}nt.scroll=O=>{O.inputState.lastScrollTop=O.scrollDOM.scrollTop,O.inputState.lastScrollLeft=O.scrollDOM.scrollLeft};ft.keydown=(O,e)=>(O.inputState.setSelectionOrigin("select"),e.keyCode==27&&O.inputState.tabFocusMode!=0&&(O.inputState.tabFocusMode=Date.now()+2e3),!1);nt.touchstart=(O,e)=>{O.inputState.lastTouchTime=Date.now(),O.inputState.setSelectionOrigin("select.pointer")};nt.touchmove=O=>{O.inputState.setSelectionOrigin("select.pointer")};ft.mousedown=(O,e)=>{if(O.observer.flush(),O.inputState.lastTouchTime>Date.now()-2e3)return!1;let t=null;for(let i of O.state.facet(Df))if(t=i(O,e),t)break;if(!t&&e.button==0&&(t=FP(O,e)),t){let i=!O.hasFocus;O.inputState.startMouseSelection(new Ea(O,e,t,i)),i&&O.observer.ignore(()=>{qf(O.contentDOM);let n=O.root.activeElement;n&&!n.contains(O.contentDOM)&&n.blur()});let r=O.inputState.mouseSelection;if(r)return r.start(e),r.dragging===!1}else O.inputState.setSelectionOrigin("select.pointer");return!1};function sf(O,e,t,i){if(i==1)return S.cursor(e,t);if(i==2)return YP(O.state,e,t);{let r=O.docView.lineAt(e,t),n=O.state.doc.lineAt(r?r.posAtEnd:e),s=r?r.posAtStart:n.from,a=r?r.posAtEnd:n.to;return aDate.now()-400&&Math.abs(e.clientX-O.clientX)<2&&Math.abs(e.clientY-O.clientY)<2?(of+1)%3:1}function FP(O,e){let t=O.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),i=$d(e),r=O.state.selection;return{update(n){n.docChanged&&(t.pos=n.changes.mapPos(t.pos),r=r.map(n.changes))},get(n,s,a){let o=O.posAndSideAtCoords({x:n.clientX,y:n.clientY},!1),l,c=sf(O,o.pos,o.assoc,i);if(t.pos!=o.pos&&!s){let h=sf(O,t.pos,t.assoc,i),f=Math.min(h.from,c.from),u=Math.max(h.to,c.to);c=f1&&(l=HP(r,o.pos))?l:a?r.addRange(c):S.create([c])}}}function HP(O,e){for(let t=0;t=e)return S.create(O.ranges.slice(0,t).concat(O.ranges.slice(t+1)),O.mainIndex==t?0:O.mainIndex-(O.mainIndex>t?1:0))}return null}ft.dragstart=(O,e)=>{let{selection:{main:t}}=O.state;if(e.target.draggable){let r=O.docView.tile.nearest(e.target);if(r&&r.isWidget()){let n=r.posAtStart,s=n+r.length;(n>=t.to||s<=t.from)&&(t=S.range(n,s))}}let{inputState:i}=O;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=t,e.dataTransfer&&(e.dataTransfer.setData("Text",Vn(O.state,mo,O.state.sliceDoc(t.from,t.to))),e.dataTransfer.effectAllowed="copyMove"),!1};ft.dragend=O=>(O.inputState.draggedContent=null,!1);function cf(O,e,t,i){if(t=Vn(O.state,po,t),!t)return;let r=O.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:n}=O.inputState,s=i&&n&&MP(O,e)?{from:n.from,to:n.to}:null,a={from:r,insert:t},o=O.state.changes(s?[s,a]:a);O.focus(),O.dispatch({changes:o,selection:{anchor:o.mapPos(r,-1),head:o.mapPos(r,1)},userEvent:s?"move.drop":"input.drop"}),O.inputState.draggedContent=null}ft.drop=(O,e)=>{if(!e.dataTransfer)return!1;if(O.state.readOnly)return!0;let t=e.dataTransfer.files;if(t&&t.length){let i=Array(t.length),r=0,n=()=>{++r==t.length&&cf(O,e,i.filter(s=>s!=null).join(O.state.lineBreak),!1)};for(let s=0;s{/[\x00-\x08\x0e-\x1f]{2}/.test(a.result)||(i[s]=a.result),n()},a.readAsText(t[s])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return cf(O,e,i,!0),!0}return!1};ft.paste=(O,e)=>{if(O.state.readOnly)return!0;O.observer.flush();let t=ud?null:e.clipboardData;return t?(Qd(O,t.getData("text/plain")||t.getData("text/uri-list")),!0):(BP(O),!1)};function KP(O,e){let t=O.dom.parentNode;if(!t)return;let i=t.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),O.focus()},50)}function JP(O){let e=[],t=[],i=!1;for(let r of O.selection.ranges)r.empty||(e.push(O.sliceDoc(r.from,r.to)),t.push(r));if(!e.length){let r=-1;for(let{from:n}of O.selection.ranges){let s=O.doc.lineAt(n);s.number>r&&(e.push(s.text),t.push({from:s.from,to:Math.min(O.doc.length,s.to+1)})),r=s.number}i=!0}return{text:Vn(O,mo,e.join(O.lineBreak)),ranges:t,linewise:i}}var Aa=null;ft.copy=ft.cut=(O,e)=>{let{text:t,ranges:i,linewise:r}=JP(O.state);if(!t&&!r)return!1;Aa=r?t:null,e.type=="cut"&&!O.state.readOnly&&O.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let n=ud?null:e.clipboardData;return n?(n.clearData(),n.setData("text/plain",t),!0):(KP(O,t),!1)};var pd=qe.define();function md(O,e){let t=[];for(let i of O.facet(Nf)){let r=i(O,e);r&&t.push(r)}return t.length?O.update({effects:t,annotations:pd.of(!0)}):null}function gd(O){setTimeout(()=>{let e=O.hasFocus;if(e!=O.inputState.notifiedFocused){let t=md(O.state,e);t?O.dispatch(t):O.update([])}},10)}nt.focus=O=>{O.inputState.lastFocusTime=Date.now(),!O.scrollDOM.scrollTop&&(O.inputState.lastScrollTop||O.inputState.lastScrollLeft)&&(O.scrollDOM.scrollTop=O.inputState.lastScrollTop,O.scrollDOM.scrollLeft=O.inputState.lastScrollLeft),gd(O)};nt.blur=O=>{O.observer.clearSelectionRange(),gd(O)};nt.compositionstart=nt.compositionupdate=O=>{O.observer.editContext||(O.inputState.compositionFirstChange==null&&(O.inputState.compositionFirstChange=!0),O.inputState.composing<0&&(O.inputState.composing=0))};nt.compositionend=O=>{O.observer.editContext||(O.inputState.composing=-1,O.inputState.compositionEndedAt=Date.now(),O.inputState.compositionPendingKey=!0,O.inputState.compositionPendingChange=O.observer.pendingRecords().length>0,O.inputState.compositionFirstChange=null,v.chrome&&v.android?O.observer.flushSoon():O.inputState.compositionPendingChange?Promise.resolve().then(()=>O.observer.flush()):setTimeout(()=>{O.inputState.composing<0&&O.docView.hasComposition&&O.update([])},50))};nt.contextmenu=O=>{O.inputState.lastContextMenu=Date.now()};ft.beforeinput=(O,e)=>{var t,i;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(O.inputState.insertingText=e.data,O.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&O.observer.editContext){let n=(t=e.dataTransfer)===null||t===void 0?void 0:t.getData("text/plain"),s=e.getTargetRanges();if(n&&s.length){let a=s[0],o=O.posAtDOM(a.startContainer,a.startOffset),l=O.posAtDOM(a.endContainer,a.endOffset);return So(O,{from:o,to:l,insert:O.state.toText(n)},null),!0}}let r;if(v.chrome&&v.android&&(r=fd.find(n=>n.inputType==e.inputType))&&(O.observer.delayAndroidKey(r.key,r.keyCode),r.key=="Backspace"||r.key=="Delete")){let n=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var s;(((s=window.visualViewport)===null||s===void 0?void 0:s.height)||0)>n+10&&O.hasFocus&&(O.contentDOM.blur(),O.focus())},100)}return v.ios&&e.inputType=="deleteContentForward"&&O.observer.flushSoon(),v.safari&&e.inputType=="insertText"&&O.inputState.composing>=0&&setTimeout(()=>nt.compositionend(O,e),20),!1};var hf=new Set;function eS(O){hf.has(O)||(hf.add(O),O.addEventListener("copy",()=>{}),O.addEventListener("cut",()=>{}))}var ff=["pre-wrap","normal","pre-line","break-spaces"],oi=!1;function df(){oi=!1}var La=class{constructor(e){this.lineWrapping=e,this.doc=E.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((t-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return ff.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let i=0;i-1,o=Math.round(t)!=Math.round(this.lineHeight)||this.lineWrapping!=a;if(this.lineWrapping=a,this.lineHeight=t,this.charWidth=i,this.textHeight=r,this.lineLength=n,o){this.heightSamples={};for(let l=0;l0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>fn&&(oi=!0),this.height=e)}replace(e,t,i){return O.of(i)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,i,r){let n=this,s=i.doc;for(let a=r.length-1;a>=0;a--){let{fromA:o,toA:l,fromB:c,toB:h}=r[a],f=n.lineAt(o,oe.ByPosNoHeight,i.setDoc(t),0,0),u=f.to>=l?f:n.lineAt(l,oe.ByPosNoHeight,i,0,0);for(h+=u.to-l,l=u.to;a>0&&f.from<=r[a-1].toA;)o=r[a-1].fromA,c=r[a-1].fromB,a--,on*2){let a=e[t-1];a.break?e.splice(--t,1,a.left,null,a.right):e.splice(--t,1,a.left,a.right),i+=1+a.break,r-=a.size}else if(n>r*2){let a=e[i];a.break?e.splice(i,1,a.left,null,a.right):e.splice(i,1,a.left,a.right),i+=2+a.break,n-=a.size}else break;else if(r=n&&s(this.lineAt(0,oe.ByPos,i,r,n))}setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,t=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(t)}updateHeight(e,t=0,i=!1,r){return r&&r.from<=t&&r.more&&this.setMeasuredHeight(r),this.outdated=!1,this}toString(){return`block(${this.length})`}},it=class O extends yn{constructor(e,t,i){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,t){return new lt(t,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,t,i){let r=i[0];return i.length==1&&(r instanceof O||r instanceof Bt&&r.flags&4)&&Math.abs(this.length-r.length)<10?(r instanceof Bt?r=new O(r.length,this.height,this.spaceAbove):r.height=this.height,this.outdated||(r.outdated=!1),r):De.of(i)}updateHeight(e,t=0,i=!1,r){return r&&r.from<=t&&r.more?this.setMeasuredHeight(r):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},Bt=class O extends De{constructor(e){super(e,0)}heightMetrics(e,t){let i=e.doc.lineAt(t).number,r=e.doc.lineAt(t+this.length).number,n=r-i+1,s,a=0;if(e.lineWrapping){let o=Math.min(this.height,e.lineHeight*n);s=o/n,this.length>n+1&&(a=(this.height-o)/(this.length-n-1))}else s=this.height/n;return{firstLine:i,lastLine:r,perLine:s,perChar:a}}blockAt(e,t,i,r){let{firstLine:n,lastLine:s,perLine:a,perChar:o}=this.heightMetrics(t,r);if(t.lineWrapping){let l=r+(e0){let n=i[i.length-1];n instanceof O?i[i.length-1]=new O(n.length+r):i.push(null,new O(r-1))}if(e>0){let n=i[0];n instanceof O?i[0]=new O(e+n.length):i.unshift(new O(e-1),null)}return De.of(i)}decomposeLeft(e,t){t.push(new O(e-1),null)}decomposeRight(e,t){t.push(null,new O(this.length-e-1))}updateHeight(e,t=0,i=!1,r){let n=t+this.length;if(r&&r.from<=t+this.length&&r.more){let s=[],a=Math.max(t,r.from),o=-1;for(r.from>t&&s.push(new O(r.from-t-1).updateHeight(e,t));a<=n&&r.more;){let c=e.doc.lineAt(a).length;s.length&&s.push(null);let h=r.heights[r.index++],f=0;h<0&&(f=-h,h=r.heights[r.index++]),o==-1?o=h:Math.abs(h-o)>=fn&&(o=-2);let u=new it(c,h,f);u.outdated=!1,s.push(u),a+=c+1}a<=n&&s.push(null,new O(n-a).updateHeight(e,a));let l=De.of(s);return(o<0||Math.abs(l.height-this.height)>=fn||Math.abs(o-this.heightMetrics(e,t).perLine)>=fn)&&(oi=!0),bn(this,l)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Da=class extends De{constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,t,i,r){let n=i+this.left.height;return ea))return l;let c=t==oe.ByPosNoHeight?oe.ByPosNoHeight:oe.ByPos;return o?l.join(this.right.lineAt(a,c,i,s,a)):this.left.lineAt(a,c,i,r,n).join(l)}forEachLine(e,t,i,r,n,s){let a=r+this.left.height,o=n+this.left.length+this.break;if(this.break)e=o&&this.right.forEachLine(e,t,i,a,o,s);else{let l=this.lineAt(o,oe.ByPos,i,r,n);e=e&&l.from<=t&&s(l),t>l.to&&this.right.forEachLine(l.to+1,t,i,a,o,s)}}replace(e,t,i){let r=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-r,t-r,i));let n=[];e>0&&this.decomposeLeft(e,n);let s=n.length;for(let a of i)n.push(a);if(e>0&&uf(n,s-1),t=i&&t.push(null)),e>i&&this.right.decomposeLeft(e-i,t)}decomposeRight(e,t){let i=this.left.length,r=i+this.break;if(e>=r)return this.right.decomposeRight(e-r,t);e2*t.size||t.size>2*e.size?De.of(this.break?[e,null,t]:[e,t]):(this.left=bn(this.left,e),this.right=bn(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,i=!1,r){let{left:n,right:s}=this,a=t+n.length+this.break,o=null;return r&&r.from<=t+n.length&&r.more?o=n=n.updateHeight(e,t,i,r):n.updateHeight(e,t,i),r&&r.from<=a+s.length&&r.more?o=s=s.updateHeight(e,a,i,r):s.updateHeight(e,a,i),o?this.balanced(n,s):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function uf(O,e){let t,i;O[e]==null&&(t=O[e-1])instanceof Bt&&(i=O[e+1])instanceof Bt&&O.splice(e-1,3,new Bt(t.length+1+i.length))}var OS=5,Ia=class O{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let i=Math.min(t,this.lineEnd),r=this.nodes[this.nodes.length-1];r instanceof it?r.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new it(i-this.pos,-1,0)),this.writtenTo=i,t>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,i){if(e=OS)&&this.addLineDeco(r,n,s)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new it(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,t){let i=new Bt(t-e);return this.oracle.doc.lineAt(e).to==t&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof it)return e;let t=new it(0,-1,0);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,i){let r=this.ensureLine();r.length+=i,r.collapsed+=i,r.widgetHeight=Math.max(r.widgetHeight,e),r.breaks+=t,this.writtenTo=this.pos=this.pos+i}finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(t instanceof it)&&!this.isCovered?this.nodes.push(new it(0,-1,0)):(this.writtenToc.clientHeight||c.scrollWidth>c.clientWidth)&&h.overflow!="visible"){let f=c.getBoundingClientRect();n=Math.max(n,f.left),s=Math.min(s,f.right),a=Math.max(a,f.top),o=Math.min(l==O.parentNode?r.innerHeight:o,f.bottom)}l=h.position=="absolute"||h.position=="fixed"?c.offsetParent:c.parentNode}else if(l.nodeType==11)l=l.host;else break;return{left:n-t.left,right:Math.max(n,s)-t.left,top:a-(t.top+e),bottom:Math.max(a,o)-(t.top+e)}}function nS(O){let e=O.getBoundingClientRect(),t=O.ownerDocument.defaultView||window;return e.left0&&e.top0}function sS(O,e){let t=O.getBoundingClientRect();return{left:0,right:t.right-t.left,top:e,bottom:t.bottom-(t.top+e)}}var Ai=class{constructor(e,t,i,r){this.from=e,this.to=t,this.size=i,this.displaySize=r}static same(e,t){if(e.length!=t.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new La(t),this.stateDeco=e.facet(Fi).filter(i=>typeof i!="function"),this.heightMap=De.empty().applyChanges(this.stateDeco,E.empty,this.heightOracle.setDoc(e.doc),[new ht(0,0,0,e.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Y.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let i=0;i<=1;i++){let r=i?t.head:t.anchor;if(!e.some(({from:n,to:s})=>r>=n&&r<=s)){let{from:n,to:s}=this.lineBlockAt(r);e.push(new JO(n,s))}}return this.viewports=e.sort((i,r)=>i.from-r.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?Qf:new Fa(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(zi(e,this.scaler))})}update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Fi).filter(c=>typeof c!="function");let r=e.changedRanges,n=ht.extendWithRanges(r,iS(i,this.stateDeco,e?e.changes:Ze.empty(this.state.doc.length))),s=this.heightMap.height,a=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);df(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),n),(this.heightMap.height!=s||oi)&&(e.flags|=2),a?(this.scrollAnchorPos=e.changes.mapPos(a.from,-1),this.scrollAnchorHeight=a.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=s);let o=n.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.heado.to)||!this.viewportIsAppropriate(o))&&(o=this.getViewport(0,t));let l=o.from!=this.viewport.from||o.to!=this.viewport.to;this.viewport=o,e.flags|=this.updateForViewport(),(l||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&e.selectionSet&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(Hf)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let t=e.contentDOM,i=window.getComputedStyle(t),r=this.heightOracle,n=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?H.RTL:H.LTR;let s=this.heightOracle.mustRefreshForWrapping(n),a=t.getBoundingClientRect(),o=s||this.mustMeasureContent||this.contentDOMHeight!=a.height;this.contentDOMHeight=a.height,this.mustMeasureContent=!1;let l=0,c=0;if(a.width&&a.height){let{scaleX:y,scaleY:X}=Vf(t,a);(y>.005&&Math.abs(this.scaleX-y)>.005||X>.005&&Math.abs(this.scaleY-X)>.005)&&(this.scaleX=y,this.scaleY=X,l|=16,s=o=!0)}let h=(parseInt(i.paddingTop)||0)*this.scaleY,f=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=h||this.paddingBottom!=f)&&(this.paddingTop=h,this.paddingBottom=f,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(r.lineWrapping&&(o=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let u=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=u&&(this.scrollAnchorHeight=-1,this.scrollTop=u),this.scrolledToBottom=zf(e.scrollDOM);let Q=(this.printing?sS:rS)(t,this.paddingTop),$=Q.top-this.pixelViewport.top,p=Q.bottom-this.pixelViewport.bottom;this.pixelViewport=Q;let m=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(m!=this.inView&&(this.inView=m,m&&(o=!0)),!this.inView&&!this.scrollTarget&&!nS(e.dom))return 0;let g=a.width;if((this.contentDOMWidth!=g||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=a.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),o){let y=e.docView.measureVisibleLineHeights(this.viewport);if(r.mustRefreshForHeights(y)&&(s=!0),s||r.lineWrapping&&Math.abs(g-this.contentDOMWidth)>r.charWidth){let{lineHeight:X,charWidth:x,textHeight:k}=e.docView.measureTextSize();s=X>0&&r.refresh(n,X,x,k,Math.max(5,g/x),y),s&&(e.docView.minWidth=0,l|=16)}$>0&&p>0?c=Math.max($,p):$<0&&p<0&&(c=Math.min($,p)),df();for(let X of this.viewports){let x=X.from==this.viewport.from?y:e.docView.measureVisibleLineHeights(X);this.heightMap=(s?De.empty().applyChanges(this.stateDeco,E.empty,this.heightOracle,[new ht(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(r,0,s,new Ma(X.from,x))}oi&&(l|=2)}let P=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return P&&(l&2&&(l|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),l|=this.updateForViewport()),(l&2||P)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(s?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),r=this.heightMap,n=this.heightOracle,{visibleTop:s,visibleBottom:a}=this,o=new JO(r.lineAt(s-i*1e3,oe.ByHeight,n,0,0).from,r.lineAt(a+(1-i)*1e3,oe.ByHeight,n,0,0).to);if(t){let{head:l}=t.range;if(lo.to){let c=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),h=r.lineAt(l,oe.ByPos,n,0,0),f;t.y=="center"?f=(h.top+h.bottom)/2-c/2:t.y=="start"||t.y=="nearest"&&l=a+Math.max(10,Math.min(i,250)))&&r>s-2*1e3&&n>1,s=r<<1;if(this.defaultTextDirection!=H.LTR&&!i)return[];let a=[],o=(c,h,f,u)=>{if(h-cc&&mm.from>=f.from&&m.to<=f.to&&Math.abs(m.from-c)m.fromg));if(!p){if(hP.from<=h&&P.to>=h)){let P=t.moveToLineBoundary(S.cursor(h),!1,!0).head;P>c&&(h=P)}let m=this.gapSize(f,c,h,u),g=i||m<2e6?m:2e6;p=new Ai(c,h,m,g)}a.push(p)},l=c=>{if(c.length2e6)for(let x of e)x.from>=c.from&&x.fromc.from&&o(c.from,u,c,h),Qt.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let i=[];M.spans(t,this.viewport.from,this.viewport.to,{span(n,s){i.push({from:n,to:s})},point(){}},20);let r=0;if(i.length!=this.visibleRanges.length)r=12;else for(let n=0;n=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||zi(this.heightMap.lineAt(e,oe.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||zi(this.heightMap.lineAt(this.scaler.fromDOM(e),oe.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return zi(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},JO=class{constructor(e,t){this.from=e,this.to=t}};function aS(O,e,t){let i=[],r=O,n=0;return M.spans(t,O,e,{span(){},point(s,a){s>r&&(i.push({from:r,to:s}),n+=s-r),r=a}},20),r=1)return e[e.length-1].to;let i=Math.floor(O*t);for(let r=0;;r++){let{from:n,to:s}=e[r],a=s-n;if(i<=a)return n+i;i-=a}}function nn(O,e){let t=0;for(let{from:i,to:r}of O.ranges){if(e<=r){t+=e-i;break}t+=r-i}return t/O.total}function oS(O,e){for(let t of O)if(e(t))return t}var Qf={toDOM(O){return O},fromDOM(O){return O},scale:1,eq(O){return O==this}},Fa=class O{constructor(e,t,i){let r=0,n=0,s=0;this.viewports=i.map(({from:a,to:o})=>{let l=t.lineAt(a,oe.ByPos,e,0,0).top,c=t.lineAt(o,oe.ByPos,e,0,0).bottom;return r+=c-l,{from:a,to:o,top:l,bottom:c,domTop:0,domBottom:0}}),this.scale=(7e6-r)/(t.height-r);for(let a of this.viewports)a.domTop=s+(a.top-n)*this.scale,s=a.domBottom=a.domTop+(a.bottom-a.top),n=a.bottom}toDOM(e){for(let t=0,i=0,r=0;;t++){let n=tt.from==e.viewports[i].from&&t.to==e.viewports[i].to):!1}};function zi(O,e){if(e.scale==1)return O;let t=e.toDOM(O.top),i=e.toDOM(O.bottom);return new lt(O.from,O.length,t,i-t,Array.isArray(O._content)?O._content.map(r=>zi(r,e)):O._content)}var sn=Z.define({combine:O=>O.join(" ")}),Ha=Z.define({combine:O=>O.indexOf(!0)>-1}),Ka=Ot.newName(),Pd=Ot.newName(),Sd=Ot.newName(),Xd={"&light":"."+Pd,"&dark":"."+Sd};function Ja(O,e,t){return new Ot(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,r=>{if(r=="&")return O;if(!t||!t[r])throw new RangeError(`Unsupported selector: ${r}`);return t[r]}):O+" "+i}})}var lS=Ja("."+Ka,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Xd),cS={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Qa=v.ie&&v.ie_version<=11,eo=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new ba,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let i of t)this.queue.push(i);(v.ie&&v.ie_version<=11||v.ios&&e.composing)&&t.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&v.android&&e.constructor.EDIT_CONTEXT!==!1&&!(v.chrome&&v.chrome_version<126)&&(this.editContext=new to(e),e.state.facet(_t)&&(e.contentDOM.editContext=this.editContext.editContext)),Qa&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var t;((t=this.view.docView)===null||t===void 0?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,i)=>t!=e[i]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,r=this.selectionRange;if(i.state.facet(_t)?i.root.activeElement!=this.dom:!cn(this.dom,r))return;let n=r.anchorNode&&i.docView.tile.nearest(r.anchorNode);if(n&&n.isWidget()&&n.widget.ignoreEvent(e)){t||(this.selectionChanged=!1);return}(v.ie&&v.ie_version<=11||v.android&&v.chrome)&&!i.state.selection.main.empty&&r.focusNode&&Wi(r.focusNode,r.focusOffset,r.anchorNode,r.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=Bi(e.root);if(!t)return!1;let i=v.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&hS(this.view,t)||t;if(!i||this.selectionRange.eq(i))return!1;let r=cn(this.dom,i);return r&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let n=this.delayedAndroidKey;n&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=n.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&n.force&&ii(this.dom,n.key,n.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(r)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,i=-1,r=!1;for(let n of e){let s=this.readMutation(n);s&&(s.typeOver&&(r=!0),t==-1?{from:t,to:i}=s:(t=Math.min(s.from,t),i=Math.max(s.to,i)))}return{from:t,to:i,typeOver:r}}readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),r=this.selectionChanged&&cn(this.dom,this.selectionRange);if(e<0&&!r)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let n=new Ca(this.view,e,t,i);return this.view.docView.domChanged={newSel:n.newSel?n.newSel.main:null},n}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.readChange();if(!t)return this.view.requestMeasure(),!1;let i=this.view.state,r=cd(this.view,t);return this.view.state==i&&(t.domChanged||t.newSel&&!t.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),r}readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t.isWidget())return null;if(t.markDirty(e.type=="attributes"),e.type=="childList"){let i=$f(t,e.previousSibling||e.target.previousSibling,-1),r=$f(t,e.nextSibling||e.target.nextSibling,1);return{from:i?t.posAfter(i):t.posAtStart,to:r?t.posBefore(r):t.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(_t)!=e.state.facet(_t)&&(e.view.contentDOM.editContext=e.state.facet(_t)?this.editContext.editContext:null))}destroy(){var e,t,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(t=this.gapIntersection)===null||t===void 0||t.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let r of this.scrollTargets)r.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function $f(O,e,t){for(;e;){let i=de.get(e);if(i&&i.parent==O)return i;let r=e.parentNode;e=r!=O.dom?r:t>0?e.nextSibling:e.previousSibling}return null}function pf(O,e){let t=e.startContainer,i=e.startOffset,r=e.endContainer,n=e.endOffset,s=O.docView.domAtPos(O.state.selection.main.anchor,1);return Wi(s.node,s.offset,r,n)&&([t,i,r,n]=[r,n,t,i]),{anchorNode:t,anchorOffset:i,focusNode:r,focusOffset:n}}function hS(O,e){if(e.getComposedRanges){let r=e.getComposedRanges(O.root)[0];if(r)return pf(O,r)}let t=null;function i(r){r.preventDefault(),r.stopImmediatePropagation(),t=r.getTargetRanges()[0]}return O.contentDOM.addEventListener("beforeinput",i,!0),O.dom.ownerDocument.execCommand("indent"),O.contentDOM.removeEventListener("beforeinput",i,!0),t?pf(O,t):null}var to=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let r=e.state.selection.main,{anchor:n,head:s}=r,a=this.toEditorPos(i.updateRangeStart),o=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:a,drifted:!1});let l=o-a>i.text.length;a==this.from&&nthis.to&&(o=n);let c=hd(e.state.sliceDoc(a,o),i.text,(l?r.from:r.to)-a,l?"end":null);if(!c){let f=S.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(r)||e.dispatch({selection:f,userEvent:"select"});return}let h={from:c.from+a,to:c.toA+a,insert:E.of(i.text.slice(c.from,c.toB).split(` +`))};if((v.mac||v.android)&&h.from==s-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:a,to:o,insert:E.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!e.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);So(e,h,S.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),h.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(t.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(t.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let r=[],n=null;for(let s=this.toEditorPos(i.rangeStart),a=this.toEditorPos(i.rangeEnd);s{let r=[];for(let n of i.getTextFormats()){let s=n.underlineStyle,a=n.underlineThickness;if(!/none/i.test(s)&&!/none/i.test(a)){let o=this.toEditorPos(n.rangeStart),l=this.toEditorPos(n.rangeEnd);if(o{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)t.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let r=Bi(i.root);r&&r.rangeCount&&this.editContext.updateSelectionBounds(r.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,i=!1,r=this.pendingContextChange;return e.changes.iterChanges((n,s,a,o,l)=>{if(i)return;let c=l.length-(s-n);if(r&&s>=r.to)if(r.from==n&&r.to==s&&r.insert.eq(l)){r=this.pendingContextChange=null,t+=c,this.to+=c;return}else r=null,this.revertPending(e.state);if(n+=t,s+=t,s<=this.from)this.from+=c,this.to+=c;else if(nthis.to||this.to-this.from+l.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(n),this.toContextPos(s),l.toString()),this.to+=c}t+=c}),r&&!i&&this.revertPending(e.state),!i}update(e){let t=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(r=>!r.isUserEvent("input.type")&&r.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),r=this.toContextPos(t.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=r)&&this.editContext.updateSelection(i,r)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to1e4*3)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},T=class O{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:i}=e;this.dispatchTransactions=e.dispatchTransactions||i&&(r=>r.forEach(n=>i(n,this)))||(r=>this.update(r)),this.dispatch=this.dispatch.bind(this),this._root=e.root||nP(e.parent)||document,this.viewState=new xn(e.state||I.create(e)),e.scrollTo&&e.scrollTo.is(en)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(KO).map(r=>new Ci(r));for(let r of this.plugins)r.update(this);this.observer=new eo(this),this.inputState=new Ga(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Xn(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...e){let t=e.length==1&&e[0]instanceof Qe?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,i=!1,r,n=this.state;for(let f of e){if(f.startState!=n)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");n=f.state}if(this.destroyed){this.viewState.state=n;return}let s=this.hasFocus,a=0,o=null;e.some(f=>f.annotation(pd))?(this.inputState.notifiedFocused=s,a=1):s!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=s,o=md(n,s),o||(a=1));let l=this.observer.delayedAndroidKey,c=null;if(l?(this.observer.clearDelayedAndroidKey(),c=this.observer.readChange(),(c&&!this.state.doc.eq(n.doc)||!this.state.selection.eq(n.selection))&&(c=null)):this.observer.clear(),n.facet(I.phrases)!=this.state.facet(I.phrases))return this.setState(n);r=Pn.create(this,n,e),r.flags|=a;let h=this.viewState.scrollTarget;try{this.updateState=2;for(let f of e){if(h&&(h=h.map(f.changes)),f.scrollIntoView){let{main:u}=f.state.selection;h=new ji(u.empty?u:S.cursor(u.head,u.head>u.anchor?-1:1))}for(let u of f.effects)u.is(en)&&(h=u.value.clip(this.state))}this.viewState.update(r,h),this.bidiCache=kn.update(this.bidiCache,r.changes),r.empty||(this.updatePlugins(r),this.inputState.update(r)),t=this.docView.update(r),this.state.facet(Vi)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(t,e.some(f=>f.isUserEvent("select.pointer")))}finally{this.updateState=0}if(r.startState.facet(sn)!=r.state.facet(sn)&&(this.viewState.mustMeasureContent=!0),(t||i||h||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!r.empty)for(let f of this.state.facet(wa))try{f(r)}catch(u){Xe(this.state,u,"update listener")}(o||c)&&Promise.resolve().then(()=>{o&&this.state==o.startState&&this.dispatch(o),c&&!cd(this,c)&&l.force&&ii(this.contentDOM,l.key,l.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let t=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new xn(e),this.plugins=e.facet(KO).map(i=>new Ci(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Xn(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(KO),i=e.state.facet(KO);if(t!=i){let r=[];for(let n of i){let s=t.indexOf(n);if(s<0)r.push(new Ci(n));else{let a=this.plugins[s];a.mustUpdate=e,r.push(a)}}for(let n of this.plugins)n.mustUpdate!=e&&n.destroy(this);this.plugins=r,this.pluginMap.clear()}else for(let r of this.plugins)r.mustUpdate=e;for(let r=0;r-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,i=this.scrollDOM,r=i.scrollTop*this.scaleY,{scrollAnchorPos:n,scrollAnchorHeight:s}=this.viewState;Math.abs(r-this.viewState.scrollTop)>1&&(s=-1),this.viewState.scrollAnchorHeight=-1;try{for(let a=0;;a++){if(s<0)if(zf(i))n=-1,s=this.viewState.heightMap.height;else{let u=this.viewState.scrollAnchorAt(r);n=u.from,s=u.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(a>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];o&4||([this.measureRequests,l]=[l,this.measureRequests]);let c=l.map(u=>{try{return u.read(this)}catch(Q){return Xe(this.state,Q),mf}}),h=Pn.create(this,this.state,[]),f=!1;h.flags|=o,t?t.flags|=o:t=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),f=this.docView.update(h),f&&this.docViewUpdate());for(let u=0;u1||Q<-1){r=r+Q,i.scrollTop=r/this.scaleY,s=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let a of this.state.facet(wa))a(t)}get themeClasses(){return Ka+" "+(this.state.facet(Ha)?Sd:Pd)+" "+this.state.facet(sn)}updateAttrs(){let e=gf(this,ed,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(_t)?"true":"false",class:"cm-content",style:`${v.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),gf(this,go,t);let i=this.observer.ignore(()=>{let r=Fh(this.contentDOM,this.contentAttrs,t),n=Fh(this.dom,this.editorAttrs,e);return r||n});return this.editorAttrs=e,this.contentAttrs=t,i}showAnnouncements(e){let t=!0;for(let i of e)for(let r of i.effects)if(r.is(O.announce)){t&&(this.announceDOM.textContent=""),t=!1;let n=this.announceDOM.appendChild(document.createElement("div"));n.textContent=r.value}}mountStyles(){this.styleModules=this.state.facet(Vi);let e=this.state.facet(O.cspNonce);Ot.mount(this.root,this.styleModules.concat(lS).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let t=0;ti.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,i){return ua(this,e,Of(this,e,t,i))}moveByGroup(e,t){return ua(this,e,Of(this,e,t,i=>VP(this,e.head,i)))}visualLineSide(e,t){let i=this.bidiSpans(e),r=this.textDirectionAt(e.from),n=i[t?i.length-1:0];return S.cursor(n.side(t,r)+e.from,n.forward(!t,r)?1:-1)}moveToLineBoundary(e,t,i=!0){return RP(this,e,t,i)}moveVertically(e,t,i){return ua(this,e,qP(this,e,t,i))}domAtPos(e,t=1){return this.docView.domAtPos(e,t)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){this.readMeasured();let i=Wa(this,e,t);return i&&i.pos}posAndSideAtCoords(e,t=!0){return this.readMeasured(),Wa(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let i=this.docView.coordsAt(e,t);if(!i||i.left==i.right)return i;let r=this.state.doc.lineAt(e),n=this.bidiSpans(r),s=n[ct.find(n,e-r.from,-1,t)];return gn(i,s.dir==H.LTR==t>0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Ff)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>fS)return Ef(e.length);let t=this.textDirectionAt(e.from),i;for(let n of this.bidiCache)if(n.from==e.from&&n.dir==t&&(n.fresh||Gf(n.isolates,i=Jh(this,e))))return n.order;i||(i=Jh(this,e));let r=dP(e.text,t,i);return this.bidiCache.push(new kn(e.from,e.to,t,i,!0,r)),r}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||v.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{qf(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){return en.of(new ji(typeof e=="number"?S.cursor(e):e,t.y,t.x,t.yMargin,t.xMargin))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,i=this.viewState.scrollAnchorAt(e);return en.of(new ji(S.cursor(i.from),"start","start",i.top-e,t,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return he.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return he.define(()=>({}),{eventObservers:e})}static theme(e,t){let i=Ot.newName(),r=[sn.of(i),Vi.of(Ja(`.${i}`,e))];return t&&t.dark&&r.push(Ha.of(!0)),r}static baseTheme(e){return ze.lowest(Vi.of(Ja("."+Ka,e,Xd)))}static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),r=i&&de.get(i)||de.get(e);return((t=r?.root)===null||t===void 0?void 0:t.view)||null}};T.styleModule=Vi;T.inputHandler=Bf;T.clipboardInputFilter=po;T.clipboardOutputFilter=mo;T.scrollHandler=Kf;T.focusChangeEffect=Nf;T.perLineTextDirection=Ff;T.exceptionSink=If;T.updateListener=wa;T.editable=_t;T.mouseSelectionStyle=Df;T.dragMovesSelection=Mf;T.clickAddsSelectionRange=Lf;T.decorations=Fi;T.blockWrappers=td;T.outerDecorations=Od;T.atomicRanges=Ji;T.bidiIsolatedRanges=id;T.scrollMargins=rd;T.darkTheme=Ha;T.cspNonce=Z.define({combine:O=>O.length?O[0]:""});T.contentAttributes=go;T.editorAttributes=ed;T.lineWrapping=T.contentAttributes.of({class:"cm-lineWrapping"});T.announce=V.define();var fS=4096,mf={},kn=class O{constructor(e,t,i,r,n,s){this.from=e,this.to=t,this.dir=i,this.isolates=r,this.fresh=n,this.order=s}static update(e,t){if(t.empty&&!e.some(n=>n.fresh))return e;let i=[],r=e.length?e[e.length-1].dir:H.LTR;for(let n=Math.max(0,e.length-10);n=0;r--){let n=i[r],s=typeof n=="function"?n(O):n;s&&uo(s,t)}return t}var dS=v.mac?"mac":v.windows?"win":v.linux?"linux":"key";function uS(O,e){let t=O.split(/-(?!$)/),i=t[t.length-1];i=="Space"&&(i=" ");let r,n,s,a;for(let o=0;oi.concat(r),[]))),t}function bd(O,e,t){return yd(Td(O.state),e,O,t)}var Dt=null,$S=4e3;function pS(O,e=dS){let t=Object.create(null),i=Object.create(null),r=(s,a)=>{let o=i[s];if(o==null)i[s]=a;else if(o!=a)throw new Error("Key binding "+s+" is used both as a regular binding and as a multi-stroke prefix")},n=(s,a,o,l,c)=>{var h,f;let u=t[s]||(t[s]=Object.create(null)),Q=a.split(/ (?!$)/).map(m=>uS(m,e));for(let m=1;m{let y=Dt={view:P,prefix:g,scope:s};return setTimeout(()=>{Dt==y&&(Dt=null)},$S),!0}]})}let $=Q.join(" ");r($,!1);let p=u[$]||(u[$]={preventDefault:!1,stopPropagation:!1,run:((f=(h=u._any)===null||h===void 0?void 0:h.run)===null||f===void 0?void 0:f.slice())||[]});o&&p.run.push(o),l&&(p.preventDefault=!0),c&&(p.stopPropagation=!0)};for(let s of O){let a=s.scope?s.scope.split(" "):["editor"];if(s.any)for(let l of a){let c=t[l]||(t[l]=Object.create(null));c._any||(c._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:h}=s;for(let f in c)c[f].run.push(u=>h(u,Oo))}let o=s[e]||s.key;if(o)for(let l of a)n(l,o,s.run,s.preventDefault,s.stopPropagation),s.shift&&n(l,"Shift-"+o,s.shift,s.preventDefault,s.stopPropagation)}return t}var Oo=null;function yd(O,e,t,i){Oo=e;let r=Mh(e),n=Se(r,0),s=Me(n)==r.length&&r!=" ",a="",o=!1,l=!1,c=!1;Dt&&Dt.view==t&&Dt.scope==i&&(a=Dt.prefix+" ",dd.indexOf(e.keyCode)<0&&(l=!0,Dt=null));let h=new Set,f=p=>{if(p){for(let m of p.run)if(!h.has(m)&&(h.add(m),m(t)))return p.stopPropagation&&(c=!0),!0;p.preventDefault&&(p.stopPropagation&&(c=!0),l=!0)}return!1},u=O[i],Q,$;return u&&(f(u[a+an(r,e,!s)])?o=!0:s&&(e.altKey||e.metaKey||e.ctrlKey)&&!(v.windows&&e.ctrlKey&&e.altKey)&&!(v.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(Q=Yt[e.keyCode])&&Q!=r?(f(u[a+an(Q,e,!0)])||e.shiftKey&&($=HO[e.keyCode])!=r&&$!=Q&&f(u[a+an($,e,!1)]))&&(o=!0):s&&e.shiftKey&&f(u[a+an(r,e,!0)])&&(o=!0),!o&&f(u._any)&&(o=!0)),l&&(o=!0),o&&c&&e.stopPropagation(),Oo=null,o}var Hi=class O{constructor(e,t,i,r,n){this.className=e,this.left=t,this.top=i,this.width=r,this.height=n}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,i){if(i.empty){let r=e.coordsAtPos(i.head,i.assoc||1);if(!r)return[];let n=xd(e);return[new O(t,r.left-n.left,r.top-n.top,null,r.bottom-r.top)]}else return mS(e,t,i)}};function xd(O){let e=O.scrollDOM.getBoundingClientRect();return{left:(O.textDirection==H.LTR?e.left:e.right-O.scrollDOM.clientWidth*O.scaleX)-O.scrollDOM.scrollLeft*O.scaleX,top:e.top-O.scrollDOM.scrollTop*O.scaleY}}function Sf(O,e,t,i){let r=O.coordsAtPos(e,t*2);if(!r)return i;let n=O.dom.getBoundingClientRect(),s=(r.top+r.bottom)/2,a=O.posAtCoords({x:n.left+1,y:s}),o=O.posAtCoords({x:n.right-1,y:s});return a==null||o==null?i:{from:Math.max(i.from,Math.min(a,o)),to:Math.min(i.to,Math.max(a,o))}}function mS(O,e,t){if(t.to<=O.viewport.from||t.from>=O.viewport.to)return[];let i=Math.max(t.from,O.viewport.from),r=Math.min(t.to,O.viewport.to),n=O.textDirection==H.LTR,s=O.contentDOM,a=s.getBoundingClientRect(),o=xd(O),l=s.querySelector(".cm-line"),c=l&&window.getComputedStyle(l),h=a.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),f=a.right-(c?parseInt(c.paddingRight):0),u=Ua(O,i,1),Q=Ua(O,r,-1),$=u.type==Te.Text?u:null,p=Q.type==Te.Text?Q:null;if($&&(O.lineWrapping||u.widgetLineBreaks)&&($=Sf(O,i,1,$)),p&&(O.lineWrapping||Q.widgetLineBreaks)&&(p=Sf(O,r,-1,p)),$&&p&&$.from==p.from&&$.to==p.to)return g(P(t.from,t.to,$));{let X=$?P(t.from,null,$):y(u,!1),x=p?P(null,t.to,p):y(Q,!0),k=[];return($||u).to<(p||Q).from-($&&p?1:0)||u.widgetLineBreaks>1&&X.bottom+O.defaultLineHeight/2q&&B.from=we)break;Je>ae&&G(Math.max(Pe,ae),X==null&&Pe<=q,Math.min(Je,we),x==null&&Je>=K,mt.dir)}if(ae=Ee.to+1,ae>=we)break}return ie.length==0&&G(q,X==null,K,x==null,O.textDirection),{top:j,bottom:A,horizontal:ie}}function y(X,x){let k=a.top+(x?X.top:X.bottom);return{top:k,bottom:k,horizontal:[]}}}function gS(O,e){return O.constructor==e.constructor&&O.eq(e)}var io=class{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(dn)!=e.state.facet(dn)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let t=0,i=e.facet(dn);for(;t!gS(t,this.drawn[i]))){let t=this.dom.firstChild,i=0;for(let r of e)r.update&&t&&r.constructor&&this.drawn[i].constructor&&r.update(t,this.drawn[i])?(t=t.nextSibling,i++):this.dom.insertBefore(r.draw(),t);for(;t;){let r=t.nextSibling;t.remove(),t=r}this.drawn=e,v.safari&&v.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},dn=Z.define();function kd(O){return[he.define(e=>new io(e,O)),dn.of(O)]}var Ki=Z.define({combine(O){return xe(O,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(e,t)=>Math.min(e,t),drawRangeCursor:(e,t)=>e||t})}});function wd(O={}){return[Ki.of(O),PS,SS,XS,Hf.of(!0)]}function Zd(O){return O.startState.facet(Ki)!=O.state.facet(Ki)}var PS=kd({above:!0,markers(O){let{state:e}=O,t=e.facet(Ki),i=[];for(let r of e.selection.ranges){let n=r==e.selection.main;if(r.empty||t.drawRangeCursor){let s=n?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",a=r.empty?r:S.cursor(r.head,r.head>r.anchor?-1:1);for(let o of Hi.forRange(O,s,a))i.push(o)}}return i},update(O,e){O.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let t=Zd(O);return t&&Xf(O.state,e),O.docChanged||O.selectionSet||t},mount(O,e){Xf(e.state,O)},class:"cm-cursorLayer"});function Xf(O,e){e.style.animationDuration=O.facet(Ki).cursorBlinkRate+"ms"}var SS=kd({above:!1,markers(O){return O.state.selection.ranges.map(e=>e.empty?[]:Hi.forRange(O,"cm-selectionBackground",e)).reduce((e,t)=>e.concat(t))},update(O,e){return O.docChanged||O.selectionSet||O.viewportChanged||Zd(O)},class:"cm-selectionLayer"}),XS=ze.highest(T.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),vd=V.define({map(O,e){return O==null?null:e.mapPos(O)}}),Ui=ce.define({create(){return null},update(O,e){return O!=null&&(O=e.changes.mapPos(O)),e.effects.reduce((t,i)=>i.is(vd)?i.value:t,O)}}),TS=he.fromClass(class{constructor(O){this.view=O,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(O){var e;let t=O.state.field(Ui);t==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(O.startState.field(Ui)!=t||O.docChanged||O.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:O}=this,e=O.state.field(Ui),t=e!=null&&O.coordsAtPos(e);if(!t)return null;let i=O.scrollDOM.getBoundingClientRect();return{left:t.left-i.left+O.scrollDOM.scrollLeft*O.scaleX,top:t.top-i.top+O.scrollDOM.scrollTop*O.scaleY,height:t.bottom-t.top}}drawCursor(O){if(this.cursor){let{scaleX:e,scaleY:t}=this.view;O?(this.cursor.style.left=O.left/e+"px",this.cursor.style.top=O.top/t+"px",this.cursor.style.height=O.height/t+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(O){this.view.state.field(Ui)!=O&&this.view.dispatch({effects:vd.of(O)})}},{eventObservers:{dragover(O){this.setDropPos(this.view.posAtCoords({x:O.clientX,y:O.clientY}))},dragleave(O){(O.target==this.view.contentDOM||!this.view.contentDOM.contains(O.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Yd(){return[Ui,TS]}function Tf(O,e,t,i,r){e.lastIndex=0;for(let n=O.iterRange(t,i),s=t,a;!n.next().done;s+=n.value.length)if(!n.lineBreak)for(;a=e.exec(n.value);)r(s+a.index,a)}function bS(O,e){let t=O.visibleRanges;if(t.length==1&&t[0].from==O.viewport.from&&t[0].to==O.viewport.to)return t;let i=[];for(let{from:r,to:n}of t)r=Math.max(O.state.doc.lineAt(r).from,r-e),n=Math.min(O.state.doc.lineAt(n).to,n+e),i.length&&i[i.length-1].to>=r?i[i.length-1].to=n:i.push({from:r,to:n});return i}var ro=class{constructor(e){let{regexp:t,decoration:i,decorate:r,boundary:n,maxLength:s=1e3}=e;if(!t.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=t,r)this.addMatch=(a,o,l,c)=>r(c,l,l+a[0].length,a,o);else if(typeof i=="function")this.addMatch=(a,o,l,c)=>{let h=i(a,o,l);h&&c(l,l+a[0].length,h)};else if(i)this.addMatch=(a,o,l,c)=>c(l,l+a[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=n,this.maxLength=s}createDeco(e){let t=new Le,i=t.add.bind(t);for(let{from:r,to:n}of bS(e,this.maxLength))Tf(e.state.doc,this.regexp,r,n,(s,a)=>this.addMatch(a,e,s,i));return t.finish()}updateDeco(e,t){let i=1e9,r=-1;return e.docChanged&&e.changes.iterChanges((n,s,a,o)=>{o>=e.view.viewport.from&&a<=e.view.viewport.to&&(i=Math.min(a,i),r=Math.max(o,r))}),e.viewportMoved||r-i>1e3?this.createDeco(e.view):r>-1?this.updateRange(e.view,t.map(e.changes),i,r):t}updateRange(e,t,i,r){for(let n of e.visibleRanges){let s=Math.max(n.from,i),a=Math.min(n.to,r);if(a>=s){let o=e.state.doc.lineAt(s),l=o.too.from;s--)if(this.boundary.test(o.text[s-1-o.from])){c=s;break}for(;af.push(m.range($,p));if(o==l)for(this.regexp.lastIndex=c-o.from;(u=this.regexp.exec(o.text))&&u.indexthis.addMatch(p,e,$,Q));t=t.update({filterFrom:c,filterTo:h,filter:($,p)=>$h,add:f})}}return t}},no=/x/.unicode!=null?"gu":"g",yS=new RegExp(`[\0-\b +-\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,no),xS={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},$a=null;function kS(){var O;if($a==null&&typeof document<"u"&&document.body){let e=document.body.style;$a=((O=e.tabSize)!==null&&O!==void 0?O:e.MozTabSize)!=null}return $a||!1}var un=Z.define({combine(O){let e=xe(O,{render:null,specialChars:yS,addSpecialChars:null});return(e.replaceTabs=!kS())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,no)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,no)),e}});function _d(O={}){return[un.of(O),wS()]}var bf=null;function wS(){return bf||(bf=he.fromClass(class{constructor(O){this.view=O,this.decorations=Y.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(O.state.facet(un)),this.decorations=this.decorator.createDeco(O)}makeDecorator(O){return new ro({regexp:O.specialChars,decoration:(e,t,i)=>{let{doc:r}=t.state,n=Se(e[0],0);if(n==9){let s=r.lineAt(i),a=t.state.tabSize,o=ve(s.text,a,i-s.from);return Y.replace({widget:new ao((a-o%a)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[n]||(this.decorationCache[n]=Y.replace({widget:new so(O,n)}))},boundary:O.replaceTabs?void 0:/[^]/})}update(O){let e=O.state.facet(un);O.startState.facet(un)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(O.view)):this.decorations=this.decorator.updateDeco(O,this.decorations)}},{decorations:O=>O.decorations}))}var ZS="\u2022";function vS(O){return O>=32?ZS:O==10?"\u2424":String.fromCharCode(9216+O)}var so=class extends _e{constructor(e,t){super(),this.options=e,this.code=t}eq(e){return e.code==this.code}toDOM(e){let t=vS(this.code),i=e.state.phrase("Control character")+" "+(xS[this.code]||"0x"+this.code.toString(16)),r=this.options.render&&this.options.render(this.code,i,t);if(r)return r;let n=document.createElement("span");return n.textContent=t,n.title=i,n.setAttribute("aria-label",i),n.className="cm-specialChar",n}ignoreEvent(){return!1}},ao=class extends _e{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function Rd(){return _S}var YS=Y.line({class:"cm-activeLine"}),_S=he.fromClass(class{constructor(O){this.decorations=this.getDeco(O)}update(O){(O.docChanged||O.selectionSet)&&(this.decorations=this.getDeco(O.view))}getDeco(O){let e=-1,t=[];for(let i of O.state.selection.ranges){let r=O.lineBlockAt(i.head);r.from>e&&(t.push(YS.range(r.from)),e=r.from)}return Y.set(t)}},{decorations:O=>O.decorations});var oo=2e3;function RS(O,e,t){let i=Math.min(e.line,t.line),r=Math.max(e.line,t.line),n=[];if(e.off>oo||t.off>oo||e.col<0||t.col<0){let s=Math.min(e.off,t.off),a=Math.max(e.off,t.off);for(let o=i;o<=r;o++){let l=O.doc.line(o);l.length<=a&&n.push(S.range(l.from+s,l.to+a))}}else{let s=Math.min(e.col,t.col),a=Math.max(e.col,t.col);for(let o=i;o<=r;o++){let l=O.doc.line(o),c=Kr(l.text,s,O.tabSize,!0);if(c<0)n.push(S.cursor(l.to));else{let h=Kr(l.text,a,O.tabSize);n.push(S.range(l.from+c,l.from+h))}}}return n}function VS(O,e){let t=O.coordsAtPos(O.viewport.from);return t?Math.round(Math.abs((t.left-e)/O.defaultCharacterWidth)):-1}function yf(O,e){let t=O.posAtCoords({x:e.clientX,y:e.clientY},!1),i=O.state.doc.lineAt(t),r=t-i.from,n=r>oo?-1:r==i.length?VS(O,e.clientX):ve(i.text,O.state.tabSize,t-i.from);return{line:i.number,col:n,off:r}}function qS(O,e){let t=yf(O,e),i=O.state.selection;return t?{update(r){if(r.docChanged){let n=r.changes.mapPos(r.startState.doc.line(t.line).from),s=r.state.doc.lineAt(n);t={line:s.number,col:t.col,off:Math.min(t.off,s.length)},i=i.map(r.changes)}},get(r,n,s){let a=yf(O,r);if(!a)return i;let o=RS(O.state,t,a);return o.length?s?S.create(o.concat(i.ranges)):S.create(o):i}}:null}function Vd(O){let e=O?.eventFilter||(t=>t.altKey&&t.button==0);return T.mouseSelectionStyle.of((t,i)=>e(i)?qS(t,i):null)}var zS={Alt:[18,O=>!!O.altKey],Control:[17,O=>!!O.ctrlKey],Shift:[16,O=>!!O.shiftKey],Meta:[91,O=>!!O.metaKey]},US={style:"cursor: crosshair"};function qd(O={}){let[e,t]=zS[O.key||"Alt"],i=he.fromClass(class{constructor(r){this.view=r,this.isDown=!1}set(r){this.isDown!=r&&(this.isDown=r,this.view.update([]))}},{eventObservers:{keydown(r){this.set(r.keyCode==e||t(r))},keyup(r){(r.keyCode==e||!t(r))&&this.set(!1)},mousemove(r){this.set(t(r))}}});return[i,T.contentAttributes.of(r=>{var n;return!((n=r.plugin(i))===null||n===void 0)&&n.isDown?US:null})]}var on="-10000px",wn=class{constructor(e,t,i,r){this.facet=t,this.createTooltipView=i,this.removeTooltipView=r,this.input=e.state.facet(t),this.tooltips=this.input.filter(s=>s);let n=null;this.tooltipViews=this.tooltips.map(s=>n=i(s,n))}update(e,t){var i;let r=e.state.facet(this.facet),n=r.filter(o=>o);if(r===this.input){for(let o of this.tooltipViews)o.update&&o.update(e);return!1}let s=[],a=t?[]:null;for(let o=0;ot[l]=o),t.length=a.length),this.input=r,this.tooltips=n,this.tooltipViews=s,!0}};function WS(O){let e=O.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var pa=Z.define({combine:O=>{var e,t,i;return{position:v.ios?"absolute":((e=O.find(r=>r.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((t=O.find(r=>r.parent))===null||t===void 0?void 0:t.parent)||null,tooltipSpace:((i=O.find(r=>r.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||WS}}}),xf=new WeakMap,Xo=he.fromClass(class{constructor(O){this.view=O,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=O.state.facet(pa);this.position=e.position,this.parent=e.parent,this.classes=O.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new wn(O,er,(t,i)=>this.createTooltip(t,i),t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()}),this.above=this.manager.tooltips.map(t=>!!t.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),O.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let O of this.manager.tooltipViews)this.intersectionObserver.observe(O.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(O){O.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(O,this.above);e&&this.observeIntersection();let t=e||O.geometryChanged,i=O.state.facet(pa);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let r of this.manager.tooltipViews)r.dom.style.position=this.position;t=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let r of this.manager.tooltipViews)this.container.appendChild(r.dom);t=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);t&&this.maybeMeasure()}createTooltip(O,e){let t=O.create(this.view),i=e?e.dom:null;if(t.dom.classList.add("cm-tooltip"),O.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let r=document.createElement("div");r.className="cm-tooltip-arrow",t.dom.appendChild(r)}return t.dom.style.position=this.position,t.dom.style.top=on,t.dom.style.left="0px",this.container.insertBefore(t.dom,i),t.mount&&t.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(t.dom),t}destroy(){var O,e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(O=i.destroy)===null||O===void 0||O.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(t=this.intersectionObserver)===null||t===void 0||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let O=1,e=1,t=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:n}=this.manager.tooltipViews[0];if(v.safari){let s=n.getBoundingClientRect();t=Math.abs(s.top+1e4)>1||Math.abs(s.left)>1}else t=!!n.offsetParent&&n.offsetParent!=this.container.ownerDocument.body}if(t||this.position=="absolute")if(this.parent){let n=this.parent.getBoundingClientRect();n.width&&n.height&&(O=n.width/this.parent.offsetWidth,e=n.height/this.parent.offsetHeight)}else({scaleX:O,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),r=Po(this.view);return{visible:{left:i.left+r.left,top:i.top+r.top,right:i.right-r.right,bottom:i.bottom-r.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((n,s)=>{let a=this.manager.tooltipViews[s];return a.getCoords?a.getCoords(n.pos):this.view.coordsAtPos(n.pos)}),size:this.manager.tooltipViews.map(({dom:n})=>n.getBoundingClientRect()),space:this.view.state.facet(pa).tooltipSpace(this.view),scaleX:O,scaleY:e,makeAbsolute:t}}writeMeasure(O){var e;if(O.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let a of this.manager.tooltipViews)a.dom.style.position="absolute"}let{visible:t,space:i,scaleX:r,scaleY:n}=O,s=[];for(let a=0;a=Math.min(t.bottom,i.bottom)||h.rightMath.min(t.right,i.right)+.1)){c.style.top=on;continue}let u=o.arrow?l.dom.querySelector(".cm-tooltip-arrow"):null,Q=u?7:0,$=f.right-f.left,p=(e=xf.get(l))!==null&&e!==void 0?e:f.bottom-f.top,m=l.offset||CS,g=this.view.textDirection==H.LTR,P=f.width>i.right-i.left?g?i.left:i.right-f.width:g?Math.max(i.left,Math.min(h.left-(u?14:0)+m.x,i.right-$)):Math.min(Math.max(i.left,h.left-$+(u?14:0)-m.x),i.right-$),y=this.above[a];!o.strictSide&&(y?h.top-p-Q-m.yi.bottom)&&y==i.bottom-h.bottom>h.top-i.top&&(y=this.above[a]=!y);let X=(y?h.top-i.top:i.bottom-h.bottom)-Q;if(XP&&j.topx&&(x=y?j.top-p-2-Q:j.bottom+Q+2);if(this.position=="absolute"?(c.style.top=(x-O.parent.top)/n+"px",kf(c,(P-O.parent.left)/r)):(c.style.top=x/n+"px",kf(c,P/r)),u){let j=h.left+(g?m.x:-m.x)-(P+14-7);u.style.left=j/r+"px"}l.overlap!==!0&&s.push({left:P,top:x,right:k,bottom:x+p}),c.classList.toggle("cm-tooltip-above",y),c.classList.toggle("cm-tooltip-below",!y),l.positioned&&l.positioned(O.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let O of this.manager.tooltipViews)O.dom.style.top=on}},{eventObservers:{scroll(){this.maybeMeasure()}}});function kf(O,e){let t=parseInt(O.style.left,10);(isNaN(t)||Math.abs(e-t)>1)&&(O.style.left=e+"px")}var jS=T.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),CS={x:0,y:0},er=Z.define({enables:[Xo,jS]}),Zn=Z.define({combine:O=>O.reduce((e,t)=>e.concat(t),[])}),vn=class O{static create(e){return new O(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new wn(e,Zn,(t,i)=>this.createHostedView(t,i),t=>t.dom.remove())}createHostedView(e,t){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,t?t.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let t of this.manager.tooltipViews)t.mount&&t.mount(e);this.mounted=!0}positioned(e){for(let t of this.manager.tooltipViews)t.positioned&&t.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let t of this.manager.tooltipViews)(e=t.destroy)===null||e===void 0||e.call(t)}passProp(e){let t;for(let i of this.manager.tooltipViews){let r=i[e];if(r!==void 0){if(t===void 0)t=r;else if(t!==r)return}}return t}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},GS=er.compute([Zn],O=>{let e=O.facet(Zn);return e.length===0?null:{pos:Math.min(...e.map(t=>t.pos)),end:Math.max(...e.map(t=>{var i;return(i=t.end)!==null&&i!==void 0?i:t.pos})),create:vn.create,above:e[0].above,arrow:e.some(t=>t.arrow)}}),lo=class{constructor(e,t,i,r,n){this.view=e,this.source=t,this.field=i,this.setHover=r,this.hoverTime=n,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;ea.bottom||t.xa.right+e.defaultCharacterWidth)return;let o=e.bidiSpans(e.state.doc.lineAt(r)).find(c=>c.from<=r&&c.to>=r),l=o&&o.dir==H.RTL?-1:1;n=t.x{this.pending==a&&(this.pending=null,o&&!(Array.isArray(o)&&!o.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(o)?o:[o])}))},o=>Xe(e.state,o,"hover tooltip"))}else s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])})}get tooltip(){let e=this.view.plugin(Xo),t=e?e.manager.tooltips.findIndex(i=>i.create==vn.create):-1;return t>-1?e.manager.tooltipViews[t]:null}mousemove(e){var t,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:r,tooltip:n}=this;if(r.length&&n&&!ES(n.dom,e)||this.pending){let{pos:s}=r[0]||this.pending,a=(i=(t=r[0])===null||t===void 0?void 0:t.end)!==null&&i!==void 0?i:s;(s==a?this.view.posAtCoords(this.lastMove)!=s:!AS(this.view,s,a,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:t}=this;if(t.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let t=i=>{e.removeEventListener("mouseleave",t),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",t)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},ln=4;function ES(O,e){let{left:t,right:i,top:r,bottom:n}=O.getBoundingClientRect(),s;if(s=O.querySelector(".cm-tooltip-arrow")){let a=s.getBoundingClientRect();r=Math.min(a.top,r),n=Math.max(a.bottom,n)}return e.clientX>=t-ln&&e.clientX<=i+ln&&e.clientY>=r-ln&&e.clientY<=n+ln}function AS(O,e,t,i,r,n){let s=O.scrollDOM.getBoundingClientRect(),a=O.documentTop+O.documentPadding.top+O.contentHeight;if(s.left>i||s.rightr||Math.min(s.bottom,a)=e&&o<=t}function zd(O,e={}){let t=V.define(),i=ce.define({create(){return[]},update(r,n){if(r.length&&(e.hideOnChange&&(n.docChanged||n.selection)?r=[]:e.hideOn&&(r=r.filter(s=>!e.hideOn(n,s))),n.docChanged)){let s=[];for(let a of r){let o=n.changes.mapPos(a.pos,-1,pe.TrackDel);if(o!=null){let l=Object.assign(Object.create(null),a);l.pos=o,l.end!=null&&(l.end=n.changes.mapPos(l.end)),s.push(l)}}r=s}for(let s of n.effects)s.is(t)&&(r=s.value),s.is(LS)&&(r=[]);return r},provide:r=>Zn.from(r)});return{active:i,extension:[i,he.define(r=>new lo(r,O,i,t,e.hoverTime||300)),GS]}}function To(O,e){let t=O.plugin(Xo);if(!t)return null;let i=t.manager.tooltips.indexOf(e);return i<0?null:t.manager.tooltipViews[i]}var LS=V.define();var wf=Z.define({combine(O){let e,t;for(let i of O)e=e||i.topContainer,t=t||i.bottomContainer;return{topContainer:e,bottomContainer:t}}});function bO(O,e){let t=O.plugin(Ud),i=t?t.specs.indexOf(e):-1;return i>-1?t.panels[i]:null}var Ud=he.fromClass(class{constructor(O){this.input=O.state.facet(TO),this.specs=this.input.filter(t=>t),this.panels=this.specs.map(t=>t(O));let e=O.state.facet(wf);this.top=new ei(O,!0,e.topContainer),this.bottom=new ei(O,!1,e.bottomContainer),this.top.sync(this.panels.filter(t=>t.top)),this.bottom.sync(this.panels.filter(t=>!t.top));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(O){let e=O.state.facet(wf);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new ei(O.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new ei(O.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let t=O.state.facet(TO);if(t!=this.input){let i=t.filter(o=>o),r=[],n=[],s=[],a=[];for(let o of i){let l=this.specs.indexOf(o),c;l<0?(c=o(O.view),a.push(c)):(c=this.panels[l],c.update&&c.update(O)),r.push(c),(c.top?n:s).push(c)}this.specs=i,this.panels=r,this.top.sync(n),this.bottom.sync(s);for(let o of a)o.dom.classList.add("cm-panel"),o.mount&&o.mount()}else for(let i of this.panels)i.update&&i.update(O)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:O=>T.scrollMargins.of(e=>{let t=e.plugin(O);return t&&{top:t.top.scrollMargin(),bottom:t.bottom.scrollMargin()}})}),ei=class{constructor(e,t,i){this.view=e,this.top=t,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let t of this.panels)t.destroy&&e.indexOf(t)<0&&t.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let e=this.dom.firstChild;for(let t of this.panels)if(t.dom.parentNode==this.dom){for(;e!=t.dom;)e=Zf(e);e=e.nextSibling}else this.dom.insertBefore(t.dom,e);for(;e;)e=Zf(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function Zf(O){let e=O.nextSibling;return O.remove(),e}var TO=Z.define({enables:Ud});var Ie=class extends tt{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};Ie.prototype.elementClass="";Ie.prototype.toDOM=void 0;Ie.prototype.mapMode=pe.TrackBefore;Ie.prototype.startSide=Ie.prototype.endSide=-1;Ie.prototype.point=!0;var Qn=Z.define(),MS=Z.define(),DS={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>M.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},Li=Z.define();function bo(O){return[Wd(),Li.of({...DS,...O})]}var co=Z.define({combine:O=>O.some(e=>e)});function Wd(O){let e=[IS];return O&&O.fixed===!1&&e.push(co.of(!0)),e}var IS=he.fromClass(class{constructor(O){this.view=O,this.domAfter=null,this.prevViewport=O.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=O.state.facet(Li).map(e=>new Yn(O,e)),this.fixed=!O.state.facet(co);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),O.scrollDOM.insertBefore(this.dom,O.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(O){if(this.updateGutters(O)){let e=this.prevViewport,t=O.view.viewport,i=Math.min(e.to,t.to)-Math.max(e.from,t.from);this.syncGutters(i<(t.to-t.from)*.8)}if(O.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(co)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=O.view.viewport}syncGutters(O){let e=this.dom.nextSibling;O&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let t=M.iter(this.view.state.facet(Qn),this.view.viewport.from),i=[],r=this.gutters.map(n=>new fo(n,this.view.viewport,-this.view.documentPadding.top));for(let n of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(n.type)){let s=!0;for(let a of n.type)if(a.type==Te.Text&&s){ho(t,i,a.from);for(let o of r)o.line(this.view,a,i);s=!1}else if(a.widget)for(let o of r)o.widget(this.view,a)}else if(n.type==Te.Text){ho(t,i,n.from);for(let s of r)s.line(this.view,n,i)}else if(n.widget)for(let s of r)s.widget(this.view,n);for(let n of r)n.finish();O&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(O){let e=O.startState.facet(Li),t=O.state.facet(Li),i=O.docChanged||O.heightChanged||O.viewportChanged||!M.eq(O.startState.facet(Qn),O.state.facet(Qn),O.view.viewport.from,O.view.viewport.to);if(e==t)for(let r of this.gutters)r.update(O)&&(i=!0);else{i=!0;let r=[];for(let n of t){let s=e.indexOf(n);s<0?r.push(new Yn(this.view,n)):(this.gutters[s].update(O),r.push(this.gutters[s]))}for(let n of this.gutters)n.dom.remove(),r.indexOf(n)<0&&n.destroy();for(let n of r)n.config.side=="after"?this.getDOMAfter().appendChild(n.dom):this.dom.appendChild(n.dom);this.gutters=r}return i}destroy(){for(let O of this.gutters)O.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:O=>T.scrollMargins.of(e=>{let t=e.plugin(O);if(!t||t.gutters.length==0||!t.fixed)return null;let i=t.dom.offsetWidth*e.scaleX,r=t.domAfter?t.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==H.LTR?{left:i,right:r}:{right:i,left:r}})});function vf(O){return Array.isArray(O)?O:[O]}function ho(O,e,t){for(;O.value&&O.from<=t;)O.from==t&&e.push(O.value),O.next()}var fo=class{constructor(e,t,i){this.gutter=e,this.height=i,this.i=0,this.cursor=M.iter(e.markers,t.from)}addElement(e,t,i){let{gutter:r}=this,n=(t.top-this.height)/e.scaleY,s=t.height/e.scaleY;if(this.i==r.elements.length){let a=new _n(e,s,n,i);r.elements.push(a),r.dom.appendChild(a.dom)}else r.elements[this.i].update(e,s,n,i);this.height=t.bottom,this.i++}line(e,t,i){let r=[];ho(this.cursor,r,t.from),i.length&&(r=r.concat(i));let n=this.gutter.config.lineMarker(e,t,r);n&&r.unshift(n);let s=this.gutter;r.length==0&&!s.config.renderEmptyElements||this.addElement(e,t,r)}widget(e,t){let i=this.gutter.config.widgetMarker(e,t.widget,t),r=i?[i]:null;for(let n of e.state.facet(MS)){let s=n(e,t.widget,t);s&&(r||(r=[])).push(s)}r&&this.addElement(e,t,r)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}},Yn=class{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in t.domEventHandlers)this.dom.addEventListener(i,r=>{let n=r.target,s;if(n!=this.dom&&this.dom.contains(n)){for(;n.parentNode!=this.dom;)n=n.parentNode;let o=n.getBoundingClientRect();s=(o.top+o.bottom)/2}else s=r.clientY;let a=e.lineBlockAtHeight(s-e.documentTop);t.domEventHandlers[i](e,a,r)&&r.preventDefault()});this.markers=vf(t.markers(e)),t.initialSpacer&&(this.spacer=new _n(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=vf(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let r=this.config.updateSpacer(this.spacer.markers[0],e);r!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[r])}let i=e.view.viewport;return!M.eq(this.markers,t,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},_n=class{constructor(e,t,i,r){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,i,r)}update(e,t,i,r){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),BS(this.markers,r)||this.setMarkers(e,r)}setMarkers(e,t){let i="cm-gutterElement",r=this.dom.firstChild;for(let n=0,s=0;;){let a=s,o=nn(a,o,l)||s(a,o,l):s}return i}})}}),Mi=class extends Ie{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function ma(O,e){return O.state.facet(ti).formatNumber(e,O.state)}var HS=Li.compute([ti],O=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(NS)},lineMarker(e,t,i){return i.some(r=>r.toDOM)?null:new Mi(ma(e,e.state.doc.lineAt(t.from).number))},widgetMarker:(e,t,i)=>{for(let r of e.state.facet(FS)){let n=r(e,t,i);if(n)return n}return null},lineMarkerChange:e=>e.startState.facet(ti)!=e.state.facet(ti),initialSpacer(e){return new Mi(ma(e,Yf(e.state.doc.lines)))},updateSpacer(e,t){let i=ma(t.view,Yf(t.view.state.doc.lines));return i==e.number?e:new Mi(i)},domEventHandlers:O.facet(ti).domEventHandlers,side:"before"}));function jd(O={}){return[ti.of(O),Wd(),HS]}function Yf(O){let e=9;for(;e{let e=[],t=-1;for(let i of O.selection.ranges){let r=O.doc.lineAt(i.head).from;r>t&&(t=r,e.push(KS.range(r)))}return M.of(e)});function Cd(){return JS}var eX=0,We=class{constructor(e,t){this.from=e,this.to=t}},R=class{constructor(e={}){this.id=eX++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=ue.match(e)),t=>{let i=e(t);return i===void 0?null:[this,i]}}};R.closedBy=new R({deserialize:O=>O.split(" ")});R.openedBy=new R({deserialize:O=>O.split(" ")});R.group=new R({deserialize:O=>O.split(" ")});R.isolate=new R({deserialize:O=>{if(O&&O!="rtl"&&O!="ltr"&&O!="auto")throw new RangeError("Invalid value for isolate: "+O);return O||"auto"}});R.contextHash=new R({perNode:!0});R.lookAhead=new R({perNode:!0});R.mounted=new R({perNode:!0});var Ht=class{constructor(e,t,i,r=!1){this.tree=e,this.overlay=t,this.parser=i,this.bracketed=r}static get(e){return e&&e.props&&e.props[R.mounted.id]}},tX=Object.create(null),ue=class O{constructor(e,t,i,r=0){this.name=e,this.props=t,this.id=i,this.flags=r}static define(e){let t=e.props&&e.props.length?Object.create(null):tX,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),r=new O(e.name||"",t,e.id,i);if(e.props){for(let n of e.props)if(Array.isArray(n)||(n=n(r)),n){if(n[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[n[0].id]=n[1]}}return r}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(R.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let i in e)for(let r of i.split(" "))t[r]=e[i];return i=>{for(let r=i.prop(R.group),n=-1;n<(r?r.length:0);n++){let s=t[n<0?i.name:r[n]];if(s)return s}}}};ue.none=new ue("",Object.create(null),0,8);var Kt=class O{constructor(e){this.types=e;for(let t=0;t0;for(let o=this.cursor(s|C.IncludeAnonymous);;){let l=!1;if(o.from<=n&&o.to>=r&&(!a&&o.type.isAnonymous||t(o)!==!1)){if(o.firstChild())continue;l=!0}for(;l&&i&&(a||!o.type.isAnonymous)&&i(o),!o.nextSibling();){if(!o.parent())return;l=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:qo(ue.none,this.children,this.positions,0,this.children.length,0,this.length,(t,i,r)=>new O(this.type,t,i,r,this.propValues),e.makeTree||((t,i,r)=>new O(ue.none,t,i,r)))}static build(e){return iX(e)}};D.empty=new D(ue.none,[],[],0);var yo=class O{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new O(this.buffer,this.index)}},Jt=class O{constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}get type(){return ue.none}toString(){let e=[];for(let t=0;t0));o=s[o+3]);return a}slice(e,t,i){let r=this.buffer,n=new Uint16Array(t-e),s=0;for(let a=e,o=0;a=e&&te;case 1:return t<=e&&i>e;case 2:return i>e;case 4:return!0}}function tr(O,e,t,i){for(var r;O.from==O.to||(t<1?O.from>=e:O.from>e)||(t>-1?O.to<=e:O.to0?o.length:-1;e!=c;e+=t){let h=o[e],f=l[e]+a.from;if(!(!(n&C.EnterBracketed&&h instanceof D&&((s=Ht.get(h))===null||s===void 0?void 0:s.overlay)===null&&(f>=i||f+h.length<=i))&&!Bd(r,i,f,f+h.length))){if(h instanceof Jt){if(n&C.ExcludeBuffers)continue;let u=h.findChild(0,h.buffer.length,t,i-f,r);if(u>-1)return new yO(new ko(a,h,e,f),null,u)}else if(n&C.IncludeAnonymous||!h.type.isAnonymous||Vo(h)){let u;if(!(n&C.IgnoreMounts)&&(u=Ht.get(h))&&!u.overlay)return new O(u.tree,f,e,a);let Q=new O(h,f,e,a);return n&C.IncludeAnonymous||!Q.type.isAnonymous?Q:Q.nextChild(t<0?h.children.length-1:0,t,i,r,n)}}}if(n&C.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+t:e=t<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,i=0){let r;if(!(i&C.IgnoreOverlays)&&(r=Ht.get(this._tree))&&r.overlay){let n=e-this.from,s=i&C.EnterBracketed&&r.bracketed;for(let{from:a,to:o}of r.overlay)if((t>0||s?a<=n:a=n:o>n))return new O(r.tree,r.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Ed(O,e,t,i){let r=O.cursor(),n=[];if(!r.firstChild())return n;if(t!=null){for(let s=!1;!s;)if(s=r.type.is(t),!r.nextSibling())return n}for(;;){if(i!=null&&r.type.is(i))return n;if(r.type.is(e)&&n.push(r.node),!r.nextSibling())return i==null?n:[]}}function xo(O,e,t=e.length-1){for(let i=O;t>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[t]&&e[t]!=i.name)return!1;t--}}return!0}var ko=class{constructor(e,t,i,r){this.parent=e,this.buffer=t,this.index=i,this.start=r}},yO=class O extends Un{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,t,i){let{buffer:r}=this.context,n=r.findChild(this.index+4,r.buffer[this.index+3],e,t-this.context.start,i);return n<0?null:new O(this.context,this,n)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,i=0){if(i&C.ExcludeBuffers)return null;let{buffer:r}=this.context,n=r.findChild(this.index+4,r.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return n<0?null:new O(this.context,this,n)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new O(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new O(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:i}=this.context,r=this.index+4,n=i.buffer[this.index+3];if(n>r){let s=i.buffer[this.index+1];e.push(i.slice(r,n,s)),t.push(0)}return new D(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Nd(O){if(!O.length)return null;let e=0,t=O[0];for(let n=1;nt.from||s.to=e){let a=new je(s.tree,s.overlay[0].from+n.from,-1,n);(r||(r=[i])).push(tr(a,e,t,!1))}}return r?Nd(r):i}var li=class{get name(){return this.type.name}constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=t&~C.EnterBracketed,e instanceof je)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:i,buffer:r}=this.buffer;return this.type=t||r.set.types[r.buffer[e]],this.from=i+r.buffer[e+1],this.to=i+r.buffer[e+2],!0}yield(e){return e?e instanceof je?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,i,this.mode));let{buffer:r}=this.buffer,n=r.findChild(this.index+4,r.buffer[this.index+3],e,t-this.buffer.start,i);return n<0?!1:(this.stack.push(this.index),this.yieldBuf(n))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,i=this.mode){return this.buffer?i&C.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&C.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&C.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,i=this.stack.length-1;if(e<0){let r=i<0?0:this.stack[i]+4;if(this.index!=r)return this.yieldBuf(t.findChild(r,this.index,-1,0,4))}else{let r=t.buffer[this.index+3];if(r<(i<0?t.buffer.length:t.buffer[this.stack[i]+3]))return this.yieldBuf(r)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,i,{buffer:r}=this;if(r){if(e>0){if(this.index-1)for(let n=t+e,s=e<0?-1:i._tree.children.length;n!=s;n+=e){let a=i._tree.children[n];if(this.mode&C.IncludeAnonymous||a instanceof Jt||!a.type.isAnonymous||Vo(a))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let s=e;s;s=s._parent)if(s.index==r){if(r==this.index)return s;t=s,i=n+1;break e}r=this.stack[--n]}for(let r=i;r=0;n--){if(n<0)return xo(this._tree,e,r);let s=i[t.buffer[this.stack[n]]];if(!s.isAnonymous){if(e[r]&&e[r]!=s.name)return!1;r--}}return!0}};function Vo(O){return O.children.some(e=>e instanceof Jt||!e.type.isAnonymous||Vo(e))}function iX(O){var e;let{buffer:t,nodeSet:i,maxBufferLength:r=1024,reused:n=[],minRepeatType:s=i.types.length}=O,a=Array.isArray(t)?new yo(t,t.length):t,o=i.types,l=0,c=0;function h(X,x,k,j,A,ie){let{id:G,start:q,end:K,size:B}=a,ae=c,we=l;if(B<0)if(a.next(),B==-1){let Zt=n[G];k.push(Zt),j.push(q-X);return}else if(B==-3){l=G;return}else if(B==-4){c=G;return}else throw new RangeError(`Unrecognized record size: ${B}`);let Ee=o[G],mt,Pe,Je=q-X;if(K-q<=r&&(Pe=p(a.pos-x,A))){let Zt=new Uint16Array(Pe.size-Pe.skip),et=a.pos-Pe.size,gt=Zt.length;for(;a.pos>et;)gt=m(Pe.start,Zt,gt);mt=new Jt(Zt,K-Pe.start,i),Je=Pe.start-X}else{let Zt=a.pos-B;a.next();let et=[],gt=[],dO=G>=s?G:-1,LO=0,Gr=K;for(;a.pos>Zt;)dO>=0&&a.id==dO&&a.size>=0?(a.end<=Gr-r&&(Q(et,gt,q,LO,a.end,Gr,dO,ae,we),LO=et.length,Gr=a.end),a.next()):ie>2500?f(q,Zt,et,gt):h(q,Zt,et,gt,dO,ie+1);if(dO>=0&&LO>0&&LO-1&&LO>0){let mh=u(Ee,we);mt=qo(Ee,et,gt,0,et.length,0,K-q,mh,mh)}else mt=$(Ee,et,gt,K-q,ae-K,we)}k.push(mt),j.push(Je)}function f(X,x,k,j){let A=[],ie=0,G=-1;for(;a.pos>x;){let{id:q,start:K,end:B,size:ae}=a;if(ae>4)a.next();else{if(G>-1&&K=0;B-=3)q[ae++]=A[B],q[ae++]=A[B+1]-K,q[ae++]=A[B+2]-K,q[ae++]=ae;k.push(new Jt(q,A[2]-K,i)),j.push(K-X)}}function u(X,x){return(k,j,A)=>{let ie=0,G=k.length-1,q,K;if(G>=0&&(q=k[G])instanceof D){if(!G&&q.type==X&&q.length==A)return q;(K=q.prop(R.lookAhead))&&(ie=j[G]+q.length+K)}return $(X,k,j,A,ie,x)}}function Q(X,x,k,j,A,ie,G,q,K){let B=[],ae=[];for(;X.length>j;)B.push(X.pop()),ae.push(x.pop()+k-A);X.push($(i.types[G],B,ae,ie-A,q-ie,K)),x.push(A-k)}function $(X,x,k,j,A,ie,G){if(ie){let q=[R.contextHash,ie];G=G?[q].concat(G):[q]}if(A>25){let q=[R.lookAhead,A];G=G?[q].concat(G):[q]}return new D(X,x,k,j,G)}function p(X,x){let k=a.fork(),j=0,A=0,ie=0,G=k.end-r,q={size:0,start:0,skip:0};e:for(let K=k.pos-X;k.pos>K;){let B=k.size;if(k.id==x&&B>=0){q.size=j,q.start=A,q.skip=ie,ie+=4,j+=4,k.next();continue}let ae=k.pos-B;if(B<0||ae=s?4:0,Ee=k.start;for(k.next();k.pos>ae;){if(k.size<0)if(k.size==-3||k.size==-4)we+=4;else break e;else k.id>=s&&(we+=4);k.next()}A=Ee,j+=B,ie+=we}return(x<0||j==X)&&(q.size=j,q.start=A,q.skip=ie),q.size>4?q:void 0}function m(X,x,k){let{id:j,start:A,end:ie,size:G}=a;if(a.next(),G>=0&&j4){let K=a.pos-(G-4);for(;a.pos>K;)k=m(X,x,k)}x[--k]=q,x[--k]=ie-X,x[--k]=A-X,x[--k]=j}else G==-3?l=j:G==-4&&(c=j);return k}let g=[],P=[];for(;a.pos>0;)h(O.start||0,O.bufferStart||0,g,P,-1,0);let y=(e=O.length)!==null&&e!==void 0?e:g.length?P[0]+g[0].length:0;return new D(o[O.topID],g.reverse(),P.reverse(),y)}var Ad=new WeakMap;function zn(O,e){if(!O.isAnonymous||e instanceof Jt||e.type!=O)return 1;let t=Ad.get(e);if(t==null){t=1;for(let i of e.children){if(i.type!=O||!(i instanceof D)){t=1;break}t+=zn(O,i)}Ad.set(e,t)}return t}function qo(O,e,t,i,r,n,s,a,o){let l=0;for(let Q=i;Q=c)break;x+=k}if(P==y+1){if(x>c){let k=Q[y];u(k.children,k.positions,0,k.children.length,$[y]+g);continue}h.push(Q[y])}else{let k=$[P-1]+Q[P-1].length-X;h.push(qo(O,Q,$,y,P,X,k,null,o))}f.push(X+g-n)}}return u(e,t,i,r,0),(a||o)(h,f,s)}var Tt=class{constructor(){this.map=new WeakMap}setBuffer(e,t,i){let r=this.map.get(e);r||this.map.set(e,r=new Map),r.set(t,i)}getBuffer(e,t){let i=this.map.get(e);return i&&i.get(t)}set(e,t){e instanceof yO?this.setBuffer(e.context.buffer,e.index,t):e instanceof je&&this.map.set(e.tree,t)}get(e){return e instanceof yO?this.getBuffer(e.context.buffer,e.index):e instanceof je?this.map.get(e.tree):void 0}cursorSet(e,t){e.buffer?this.setBuffer(e.buffer.buffer,e.index,t):this.map.set(e.tree,t)}cursorGet(e){return e.buffer?this.getBuffer(e.buffer.buffer,e.index):this.map.get(e.tree)}},Vt=class O{constructor(e,t,i,r,n=!1,s=!1){this.from=e,this.to=t,this.tree=i,this.offset=r,this.open=(n?1:0)|(s?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],i=!1){let r=[new O(0,e.length,e,0,!1,i)];for(let n of t)n.to>e.length&&r.push(n);return r}static applyChanges(e,t,i=128){if(!t.length)return e;let r=[],n=1,s=e.length?e[0]:null;for(let a=0,o=0,l=0;;a++){let c=a=i)for(;s&&s.from=f.from||h<=f.to||l){let u=Math.max(f.from,o)-l,Q=Math.min(f.to,h)-l;f=u>=Q?null:new O(u,Q,f.tree,f.offset+l,a>0,!!c)}if(f&&r.push(f),s.to>h)break;s=nnew We(r.from,r.to)):[new We(0,0)]:[new We(0,e.length)],this.createParse(e,t||[],i)}parse(e,t,i){let r=this.startParse(e,t,i);for(;;){let n=r.advance();if(n)return n}}},Zo=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}};function xO(O){return(e,t,i,r)=>new _o(e,O,t,i,r)}var Wn=class{constructor(e,t,i,r,n,s){this.parser=e,this.parse=t,this.overlay=i,this.bracketed=r,this.target=n,this.from=s}};function Ld(O){if(!O.length||O.some(e=>e.from>=e.to))throw new RangeError("Invalid inner parse ranges given: "+JSON.stringify(O))}var vo=class{constructor(e,t,i,r,n,s,a,o){this.parser=e,this.predicate=t,this.mounts=i,this.index=r,this.start=n,this.bracketed=s,this.target=a,this.prev=o,this.depth=0,this.ranges=[]}},Yo=new R({perNode:!0}),_o=class{constructor(e,t,i,r,n){this.nest=t,this.input=i,this.fragments=r,this.ranges=n,this.inner=[],this.innerDone=0,this.baseTree=null,this.stoppedAt=null,this.baseParse=e}advance(){if(this.baseParse){let i=this.baseParse.advance();if(!i)return null;if(this.baseParse=null,this.baseTree=i,this.startInner(),this.stoppedAt!=null)for(let r of this.inner)r.parse.stopAt(this.stoppedAt)}if(this.innerDone==this.inner.length){let i=this.baseTree;return this.stoppedAt!=null&&(i=new D(i.type,i.children,i.positions,i.length,i.propValues.concat([[Yo,this.stoppedAt]]))),i}let e=this.inner[this.innerDone],t=e.parse.advance();if(t){this.innerDone++;let i=Object.assign(Object.create(null),e.target.props);i[R.mounted.id]=new Ht(t,e.overlay,e.parser,e.bracketed),e.target.props=i}return null}get parsedPos(){if(this.baseParse)return 0;let e=this.input.length;for(let t=this.innerDone;t=this.stoppedAt)a=!1;else if(e.hasNode(r)){if(t){let l=t.mounts.find(c=>c.frag.from<=r.from&&c.frag.to>=r.to&&c.mount.overlay);if(l)for(let c of l.mount.overlay){let h=c.from+l.pos,f=c.to+l.pos;h>=r.from&&f<=r.to&&!t.ranges.some(u=>u.fromh)&&t.ranges.push({from:h,to:f})}}a=!1}else if(i&&(s=rX(i.ranges,r.from,r.to)))a=s!=2;else if(!r.type.isAnonymous&&(n=this.nest(r,this.input))&&(r.fromnew We(h.from-r.from,h.to-r.from)):null,!!n.bracketed,r.tree,c.length?c[0].from:r.from)),n.overlay?c.length&&(i={ranges:c,depth:0,prev:i}):a=!1}}else if(t&&(o=t.predicate(r))&&(o===!0&&(o=new We(r.from,r.to)),o.from=0&&t.ranges[l].to==o.from?t.ranges[l]={from:t.ranges[l].from,to:o.to}:t.ranges.push(o)}if(a&&r.firstChild())t&&t.depth++,i&&i.depth++;else for(;!r.nextSibling();){if(!r.parent())break e;if(t&&!--t.depth){let l=Dd(this.ranges,t.ranges);l.length&&(Ld(l),this.inner.splice(t.index,0,new Wn(t.parser,t.parser.startParse(this.input,Id(t.mounts,l),l),t.ranges.map(c=>new We(c.from-t.start,c.to-t.start)),t.bracketed,t.target,l[0].from))),t=t.prev}i&&!--i.depth&&(i=i.prev)}}}};function rX(O,e,t){for(let i of O){if(i.from>=t)break;if(i.to>e)return i.from<=e&&i.to>=t?2:1}return 0}function Md(O,e,t,i,r,n){if(e=e&&t.enter(i,1,C.IgnoreOverlays|C.ExcludeBuffers)||t.next(!1)||(this.done=!0)}hasNode(e){if(this.moveTo(e.from),!this.done&&this.cursor.from+this.offset==e.from&&this.cursor.tree)for(let t=this.cursor.tree;;){if(t==e.tree)return!0;if(t.children.length&&t.positions[0]==0&&t.children[0]instanceof D)t=t.children[0];else break}return!1}},Ro=class{constructor(e){var t;if(this.fragments=e,this.curTo=0,this.fragI=0,e.length){let i=this.curFrag=e[0];this.curTo=(t=i.tree.prop(Yo))!==null&&t!==void 0?t:i.to,this.inner=new jn(i.tree,-i.offset)}else this.curFrag=this.inner=null}hasNode(e){for(;this.curFrag&&e.from>=this.curTo;)this.nextFrag();return this.curFrag&&this.curFrag.from<=e.from&&this.curTo>=e.to&&this.inner.hasNode(e)}nextFrag(){var e;if(this.fragI++,this.fragI==this.fragments.length)this.curFrag=this.inner=null;else{let t=this.curFrag=this.fragments[this.fragI];this.curTo=(e=t.tree.prop(Yo))!==null&&e!==void 0?e:t.to,this.inner=new jn(t.tree,-t.offset)}}findMounts(e,t){var i;let r=[];if(this.inner){this.inner.cursor.moveTo(e,1);for(let n=this.inner.cursor.node;n;n=n.parent){let s=(i=n.tree)===null||i===void 0?void 0:i.prop(R.mounted);if(s&&s.parser==t)for(let a=this.fragI;a=n.to)break;o.tree==this.curFrag.tree&&r.push({frag:o,pos:n.from-o.offset,mount:s})}}}return r}};function Dd(O,e){let t=null,i=e;for(let r=1,n=0;r=a)break;o.to<=s||(t||(i=t=e.slice()),o.froma&&t.splice(n+1,0,new We(a,o.to))):o.to>a?t[n--]=new We(a,o.to):t.splice(n--,1))}}return i}function sX(O,e,t,i){let r=0,n=0,s=!1,a=!1,o=-1e9,l=[];for(;;){let c=r==O.length?1e9:s?O[r].to:O[r].from,h=n==e.length?1e9:a?e[n].to:e[n].from;if(s!=a){let f=Math.max(o,t),u=Math.min(c,h,i);fnew We(f.from+i,f.to+i)),h=sX(e,c,o,l);for(let f=0,u=o;;f++){let Q=f==h.length,$=Q?l:h[f].from;if($>u&&t.push(new Vt(u,$,r.tree,-s,n.from>=u||n.openStart,n.to<=$||n.openEnd)),Q)break;u=h[f].to}}else t.push(new Vt(o,l,r.tree,-s,n.from>=s||n.openStart,n.to<=a||n.openEnd))}return t}var aX=0,Be=class O{constructor(e,t,i,r){this.name=e,this.set=t,this.base=i,this.modified=r,this.id=aX++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let i=typeof e=="string"?e:"?";if(e instanceof O&&(t=e),t?.base)throw new Error("Can not derive from a modified tag");let r=new O(i,[],null,[]);if(r.set.push(r),t)for(let n of t.set)r.set.push(n);return r}static defineModifier(e){let t=new An(e);return i=>i.modified.indexOf(t)>-1?i:An.get(i.base||i,i.modified.concat(t).sort((r,n)=>r.id-n.id))}},oX=0,An=class O{constructor(e){this.name=e,this.instances=[],this.id=oX++}static get(e,t){if(!t.length)return e;let i=t[0].instances.find(a=>a.base==e&&lX(t,a.modified));if(i)return i;let r=[],n=new Be(e.name,r,e,t);for(let a of t)a.instances.push(n);let s=cX(t);for(let a of e.set)if(!a.modified.length)for(let o of s)r.push(O.get(a,o));return n}};function lX(O,e){return O.length==e.length&&O.every((t,i)=>t==e[i])}function cX(O){let e=[[]];for(let t=0;ti.length-t.length)}function F(O){let e=Object.create(null);for(let t in O){let i=O[t];Array.isArray(i)||(i=[i]);for(let r of t.split(" "))if(r){let n=[],s=2,a=r;for(let h=0;;){if(a=="..."&&h>0&&h+3==r.length){s=1;break}let f=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(a);if(!f)throw new RangeError("Invalid path: "+r);if(n.push(f[0]=="*"?"":f[0][0]=='"'?JSON.parse(f[0]):f[0]),h+=f[0].length,h==r.length)break;let u=r[h++];if(h==r.length&&u=="!"){s=0;break}if(u!="/")throw new RangeError("Invalid path: "+r);a=r.slice(h)}let o=n.length-1,l=n[o];if(!l)throw new RangeError("Invalid path: "+r);let c=new wO(i,s,o>0?n.slice(0,o):null);e[l]=c.sort(e[l])}}return Kd.add(e)}var Kd=new R({combine(O,e){let t,i,r;for(;O||e;){if(!O||e&&O.depth>=e.depth?(r=e,e=e.next):(r=O,O=O.next),t&&t.mode==r.mode&&!r.context&&!t.context)continue;let n=new wO(r.tags,r.mode,r.context);t?t.next=n:i=n,t=n}return i}}),wO=class{constructor(e,t,i,r){this.tags=e,this.mode=t,this.context=i,this.next=r}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let s=r;for(let a of n)for(let o of a.set){let l=t[o.id];if(l){s=s?s+" "+l:l;break}}return s},scope:i}}function hX(O,e){let t=null;for(let i of O){let r=i.style(e);r&&(t=t?t+" "+r:r)}return t}function Jd(O,e,t,i=0,r=O.length){let n=new Uo(i,Array.isArray(e)?e:[e],t);n.highlightRange(O.cursor(),i,r,"",n.highlighters),n.flush(r)}var Uo=class{constructor(e,t,i){this.at=e,this.highlighters=t,this.span=i,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,i,r,n){let{type:s,from:a,to:o}=e;if(a>=i||o<=t)return;s.isTop&&(n=this.highlighters.filter(u=>!u.scope||u.scope(s)));let l=r,c=fX(e)||wO.empty,h=hX(n,c.tags);if(h&&(l&&(l+=" "),l+=h,c.mode==1&&(r+=(r?" ":"")+h)),this.startSpan(Math.max(t,a),l),c.opaque)return;let f=e.tree&&e.tree.prop(R.mounted);if(f&&f.overlay){let u=e.node.enter(f.overlay[0].from+a,1),Q=this.highlighters.filter(p=>!p.scope||p.scope(f.tree.type)),$=e.firstChild();for(let p=0,m=a;;p++){let g=p=P||!e.nextSibling())););if(!g||P>i)break;m=g.to+a,m>t&&(this.highlightRange(u.cursor(),Math.max(t,g.from+a),Math.min(i,m),"",Q),this.startSpan(Math.min(i,m),l))}$&&e.parent()}else if(e.firstChild()){f&&(r="");do if(!(e.to<=t)){if(e.from>=i)break;this.highlightRange(e,t,i,r,n),this.startSpan(Math.min(i,e.to),l)}while(e.nextSibling());e.parent()}}};function fX(O){let e=O.type.prop(Kd);for(;e&&e.context&&!O.matchContext(e.context);)e=e.next;return e||null}var w=Be.define,Cn=w(),tO=w(),Fd=w(tO),Hd=w(tO),OO=w(),Gn=w(OO),zo=w(OO),xt=w(),kO=w(xt),bt=w(),yt=w(),Wo=w(),Or=w(Wo),En=w(),d={comment:Cn,lineComment:w(Cn),blockComment:w(Cn),docComment:w(Cn),name:tO,variableName:w(tO),typeName:Fd,tagName:w(Fd),propertyName:Hd,attributeName:w(Hd),className:w(tO),labelName:w(tO),namespace:w(tO),macroName:w(tO),literal:OO,string:Gn,docString:w(Gn),character:w(Gn),attributeValue:w(Gn),number:zo,integer:w(zo),float:w(zo),bool:w(OO),regexp:w(OO),escape:w(OO),color:w(OO),url:w(OO),keyword:bt,self:w(bt),null:w(bt),atom:w(bt),unit:w(bt),modifier:w(bt),operatorKeyword:w(bt),controlKeyword:w(bt),definitionKeyword:w(bt),moduleKeyword:w(bt),operator:yt,derefOperator:w(yt),arithmeticOperator:w(yt),logicOperator:w(yt),bitwiseOperator:w(yt),compareOperator:w(yt),updateOperator:w(yt),definitionOperator:w(yt),typeOperator:w(yt),controlOperator:w(yt),punctuation:Wo,separator:w(Wo),bracket:Or,angleBracket:w(Or),squareBracket:w(Or),paren:w(Or),brace:w(Or),content:xt,heading:kO,heading1:w(kO),heading2:w(kO),heading3:w(kO),heading4:w(kO),heading5:w(kO),heading6:w(kO),contentSeparator:w(xt),list:w(xt),quote:w(xt),emphasis:w(xt),strong:w(xt),link:w(xt),monospace:w(xt),strikethrough:w(xt),inserted:w(),deleted:w(),changed:w(),invalid:w(),meta:En,documentMeta:w(En),annotation:w(En),processingInstruction:w(En),definition:Be.defineModifier("definition"),constant:Be.defineModifier("constant"),function:Be.defineModifier("function"),standard:Be.defineModifier("standard"),local:Be.defineModifier("local"),special:Be.defineModifier("special")};for(let O in d){let e=d[O];e instanceof Be&&(e.name=O)}var a_=jo([{tag:d.link,class:"tok-link"},{tag:d.heading,class:"tok-heading"},{tag:d.emphasis,class:"tok-emphasis"},{tag:d.strong,class:"tok-strong"},{tag:d.keyword,class:"tok-keyword"},{tag:d.atom,class:"tok-atom"},{tag:d.bool,class:"tok-bool"},{tag:d.url,class:"tok-url"},{tag:d.labelName,class:"tok-labelName"},{tag:d.inserted,class:"tok-inserted"},{tag:d.deleted,class:"tok-deleted"},{tag:d.literal,class:"tok-literal"},{tag:d.string,class:"tok-string"},{tag:d.number,class:"tok-number"},{tag:[d.regexp,d.escape,d.special(d.string)],class:"tok-string2"},{tag:d.variableName,class:"tok-variableName"},{tag:d.local(d.variableName),class:"tok-variableName tok-local"},{tag:d.definition(d.variableName),class:"tok-variableName tok-definition"},{tag:d.special(d.variableName),class:"tok-variableName2"},{tag:d.definition(d.propertyName),class:"tok-propertyName tok-definition"},{tag:d.typeName,class:"tok-typeName"},{tag:d.namespace,class:"tok-namespace"},{tag:d.className,class:"tok-className"},{tag:d.macroName,class:"tok-macroName"},{tag:d.propertyName,class:"tok-propertyName"},{tag:d.operator,class:"tok-operator"},{tag:d.comment,class:"tok-comment"},{tag:d.meta,class:"tok-meta"},{tag:d.invalid,class:"tok-invalid"},{tag:d.punctuation,class:"tok-punctuation"}]);var Co,iO=new R;function or(O){return Z.define({combine:O?e=>e.concat(O):void 0})}var Dn=new R,Re=class{constructor(e,t,i=[],r=""){this.data=e,this.name=r,I.prototype.hasOwnProperty("tree")||Object.defineProperty(I.prototype,"tree",{get(){return U(this)}}),this.parser=t,this.extension=[rO.of(this),I.languageData.of((n,s,a)=>{let o=eu(n,s,a),l=o.type.prop(iO);if(!l)return[];let c=n.facet(l),h=o.type.prop(Dn);if(h){let f=o.resolve(s-o.from,a);for(let u of h)if(u.test(f,n)){let Q=n.facet(u.facet);return u.type=="replace"?Q:Q.concat(c)}}return c})].concat(i)}isActiveAt(e,t,i=-1){return eu(e,t,i).type.prop(iO)==this.data}findRegions(e){let t=e.facet(rO);if(t?.data==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let i=[],r=(n,s)=>{if(n.prop(iO)==this.data){i.push({from:s,to:s+n.length});return}let a=n.prop(R.mounted);if(a){if(a.tree.prop(iO)==this.data){if(a.overlay)for(let o of a.overlay)i.push({from:o.from+s,to:o.to+s});else i.push({from:s,to:s+n.length});return}else if(a.overlay){let o=i.length;if(r(a.tree,a.overlay[0].from+s),i.length>o)return}}for(let o=0;oi.isTop?t:void 0)]}),e.name)}configure(e,t){return new O(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function U(O){let e=O.field(Re.state,!1);return e?e.tree:D.empty}var Lo=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-i,t-i)}},ir=null,nr=class O{constructor(e,t,i=[],r,n,s,a,o){this.parser=e,this.state=t,this.fragments=i,this.tree=r,this.treeLen=n,this.viewport=s,this.skipped=a,this.scheduleOn=o,this.parse=null,this.tempSkipped=[]}static create(e,t,i){return new O(e,t,[],D.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Lo(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=D.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let r=Date.now()+e;e=()=>Date.now()>r}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(Vt.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=ir;ir=this;try{return e()}finally{ir=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=tu(e,t.from,t.to);return e}changes(e,t){let{fragments:i,tree:r,treeLen:n,viewport:s,skipped:a}=this;if(this.takeTree(),!e.empty){let o=[];if(e.iterChangedRanges((l,c,h,f)=>o.push({fromA:l,toA:c,fromB:h,toB:f})),i=Vt.applyChanges(i,o),r=D.empty,n=0,s={from:e.mapPos(s.from,-1),to:e.mapPos(s.to,1)},this.skipped.length){a=[];for(let l of this.skipped){let c=e.mapPos(l.from,1),h=e.mapPos(l.to,-1);ce.from&&(this.fragments=tu(this.fragments,r,n),this.skipped.splice(i--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends eO{createParse(t,i,r){let n=r[0].from,s=r[r.length-1].to;return{parsedPos:n,advance(){let o=ir;if(o){for(let l of r)o.tempSkipped.push(l);e&&(o.scheduleOn=o.scheduleOn?Promise.all([o.scheduleOn,e]):e)}return this.parsedPos=s,new D(ue.none,[],[],s-n)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return ir}};function tu(O,e,t){return Vt.applyChanges(O,[{fromA:e,toA:t,fromB:e,toB:t}])}var sr=class O{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,i)||t.takeTree(),new O(t)}static init(e){let t=Math.min(3e3,e.doc.length),i=nr.create(e.facet(rO).parser,e,{from:0,to:t});return i.work(20,t)||i.takeTree(),new O(i)}};Re.state=ce.define({create:sr.init,update(O,e){for(let t of e.effects)if(t.is(Re.setState))return t.value;return e.startState.facet(rO)!=e.state.facet(rO)?sr.init(e.state):O.apply(e)}});var au=O=>{let e=setTimeout(()=>O(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(au=O=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(O,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});var Go=typeof navigator<"u"&&(!((Co=navigator.scheduling)===null||Co===void 0)&&Co.isInputPending)?()=>navigator.scheduling.isInputPending():null,dX=he.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Re.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Re.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=au(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEndr+1e3,o=n.context.work(()=>Go&&Go()||Date.now()>s,r+(a?0:1e5));this.chunkBudget-=Date.now()-t,(o||this.chunkBudget<=0)&&(n.context.takeTree(),this.view.dispatch({effects:Re.setState.of(new sr(n.context))})),this.chunkBudget>0&&!(o&&!a)&&this.scheduleWork(),this.checkAsyncSchedule(n.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>Xe(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),rO=Z.define({combine(O){return O.length?O[0]:null},enables:O=>[Re.state,dX,T.contentAttributes.compute([O],e=>{let t=e.facet(O);return t&&t.name?{"data-language":t.name}:{}})]}),J=class{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}},ar=class O{constructor(e,t,i,r,n,s=void 0){this.name=e,this.alias=t,this.extensions=i,this.filename=r,this.loadFunc=n,this.support=s,this.loading=null}load(){return this.loading||(this.loading=this.loadFunc().then(e=>this.support=e,e=>{throw this.loading=null,e}))}static of(e){let{load:t,support:i}=e;if(!t){if(!i)throw new RangeError("Must pass either 'load' or 'support' to LanguageDescription.of");t=()=>Promise.resolve(i)}return new O(e.name,(e.alias||[]).concat(e.name).map(r=>r.toLowerCase()),e.extensions||[],e.filename,t,i)}static matchFilename(e,t){for(let r of e)if(r.filename&&r.filename.test(t))return r;let i=/\.([^.]+)$/.exec(t);if(i){for(let r of e)if(r.extensions.indexOf(i[1])>-1)return r}return null}static matchLanguageName(e,t,i=!0){t=t.toLowerCase();for(let r of e)if(r.alias.some(n=>n==t))return r;if(i)for(let r of e)for(let n of r.alias){let s=t.indexOf(n);if(s>-1&&(n.length>2||!/\w/.test(t[s-1])&&!/\w/.test(t[s+n.length])))return r}return null}},uX=Z.define(),nO=Z.define({combine:O=>{if(!O.length)return" ";let e=O[0];if(!e||/\S/.test(e)||Array.from(e).some(t=>t!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(O[0]));return e}});function lr(O){let e=O.facet(nO);return e.charCodeAt(0)==9?O.tabSize*e.length:e.length}function hi(O,e){let t="",i=O.tabSize,r=O.facet(nO)[0];if(r==" "){for(;e>=i;)t+=" ",e-=i;r=" "}for(let n=0;n=e?QX(O,t,e):null}var ZO=class{constructor(e,t={}){this.state=e,this.options=t,this.unit=lr(e)}lineAt(e,t=1){let i=this.state.doc.lineAt(e),{simulateBreak:r,simulateDoubleBreak:n}=this.options;return r!=null&&r>=i.from&&r<=i.to?n&&r==e?{text:"",from:e}:(t<0?r-1&&(n+=s-this.countColumn(i,i.search(/\S|$/))),n}countColumn(e,t=e.length){return ve(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:i,from:r}=this.lineAt(e,t),n=this.options.overrideIndentation;if(n){let s=n(r);if(s>-1)return s}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},se=new R;function QX(O,e,t){let i=e.resolveStack(t),r=e.resolveInner(t,-1).resolve(t,0).enterUnfinishedNodesBefore(t);if(r!=i.node){let n=[];for(let s=r;s&&!(s.fromi.node.to||s.from==i.node.from&&s.type==i.node.type);s=s.parent)n.push(s);for(let s=n.length-1;s>=0;s--)i={node:n[s],next:i}}return ou(i,O,t)}function ou(O,e,t){for(let i=O;i;i=i.next){let r=pX(i.node);if(r)return r(Mo.create(e,t,i))}return 0}function $X(O){return O.pos==O.options.simulateBreak&&O.options.simulateDoubleBreak}function pX(O){let e=O.type.prop(se);if(e)return e;let t=O.firstChild,i;if(t&&(i=t.type.prop(R.closedBy))){let r=O.lastChild,n=r&&i.indexOf(r.name)>-1;return s=>lu(s,!0,1,void 0,n&&!$X(s)?r.from:void 0)}return O.parent==null?mX:null}function mX(){return 0}var Mo=class O extends ZO{constructor(e,t,i){super(e.state,e.options),this.base=e,this.pos=t,this.context=i}get node(){return this.context.node}static create(e,t,i){return new O(e,t,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(t.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(gX(i,e))break;t=this.state.doc.lineAt(i.from)}return this.lineIndent(t.from)}continue(){return ou(this.context.next,this.base,this.pos)}};function gX(O,e){for(let t=e;t;t=t.parent)if(O==t)return!0;return!1}function PX(O){let e=O.node,t=e.childAfter(e.from),i=e.lastChild;if(!t)return null;let r=O.options.simulateBreak,n=O.state.doc.lineAt(t.from),s=r==null||r<=n.from?n.to:Math.min(n.to,r);for(let a=t.to;;){let o=e.childAfter(a);if(!o||o==i)return null;if(!o.type.isSkipped){if(o.from>=s)return null;let l=/^ */.exec(n.text.slice(t.to-n.from))[0].length;return{from:t.from,to:t.to+l}}a=o.to}}function be({closing:O,align:e=!0,units:t=1}){return i=>lu(i,e,t,O)}function lu(O,e,t,i,r){let n=O.textAfter,s=n.match(/^\s*/)[0].length,a=i&&n.slice(s,s+i.length)==i||r==O.pos+s,o=e?PX(O):null;return o?a?O.column(o.from):O.column(o.to):O.baseIndent+(a?0:O.unit*t)}var sO=O=>O.baseIndent;function le({except:O,units:e=1}={}){return t=>{let i=O&&O.test(t.textAfter);return t.baseIndent+(i?0:e*t.unit)}}var SX=200;function cu(){return I.transactionFilter.of(O=>{if(!O.docChanged||!O.isUserEvent("input.type")&&!O.isUserEvent("input.complete"))return O;let e=O.startState.languageDataAt("indentOnInput",O.startState.selection.main.head);if(!e.length)return O;let t=O.newDoc,{head:i}=O.newSelection.main,r=t.lineAt(i);if(i>r.from+SX)return O;let n=t.sliceString(r.from,i);if(!e.some(l=>l.test(n)))return O;let{state:s}=O,a=-1,o=[];for(let{head:l}of s.selection.ranges){let c=s.doc.lineAt(l);if(c.from==a)continue;a=c.from;let h=In(s,c.from);if(h==null)continue;let f=/^\s*/.exec(c.text)[0],u=hi(s,h);f!=u&&o.push({from:c.from,to:c.from+f.length,insert:u})}return o.length?[O,{changes:o,sequential:!0}]:O})}var Ho=Z.define(),te=new R;function me(O){let e=O.firstChild,t=O.lastChild;return e&&e.tot)continue;if(n&&a.from=e&&l.to>t&&(n=l)}}return n}function TX(O){let e=O.lastChild;return e&&e.to==O.to&&e.type.isError}function Ln(O,e,t){for(let i of O.facet(Ho)){let r=i(O,e,t);if(r)return r}return XX(O,e,t)}function hu(O,e){let t=e.mapPos(O.from,1),i=e.mapPos(O.to,-1);return t>=i?void 0:{from:t,to:i}}var Bn=V.define({map:hu}),cr=V.define({map:hu});function fu(O){let e=[];for(let{head:t}of O.state.selection.ranges)e.some(i=>i.from<=t&&i.to>=t)||e.push(O.lineBlockAt(t));return e}var vO=ce.define({create(){return Y.none},update(O,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((t,i)=>O=Ou(O,t,i)),O=O.map(e.changes);for(let t of e.effects)if(t.is(Bn)&&!bX(O,t.value.from,t.value.to)){let{preparePlaceholder:i}=e.state.facet(Ko),r=i?Y.replace({widget:new Do(i(e.state,t.value))}):iu;O=O.update({add:[r.range(t.value.from,t.value.to)]})}else t.is(cr)&&(O=O.update({filter:(i,r)=>t.value.from!=i||t.value.to!=r,filterFrom:t.value.from,filterTo:t.value.to}));return e.selection&&(O=Ou(O,e.selection.main.head)),O},provide:O=>T.decorations.from(O),toJSON(O,e){let t=[];return O.between(0,e.doc.length,(i,r)=>{t.push(i,r)}),t},fromJSON(O){if(!Array.isArray(O)||O.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let t=0;t{re&&(i=!0)}),i?O.update({filterFrom:e,filterTo:t,filter:(r,n)=>r>=t||n<=e}):O}function Mn(O,e,t){var i;let r=null;return(i=O.field(vO,!1))===null||i===void 0||i.between(e,t,(n,s)=>{(!r||r.from>n)&&(r={from:n,to:s})}),r}function bX(O,e,t){let i=!1;return O.between(e,e,(r,n)=>{r==e&&n==t&&(i=!0)}),i}function du(O,e){return O.field(vO,!1)?e:e.concat(V.appendConfig.of($u()))}var yX=O=>{for(let e of fu(O)){let t=Ln(O.state,e.from,e.to);if(t)return O.dispatch({effects:du(O.state,[Bn.of(t),uu(O,t)])}),!0}return!1},xX=O=>{if(!O.state.field(vO,!1))return!1;let e=[];for(let t of fu(O)){let i=Mn(O.state,t.from,t.to);i&&e.push(cr.of(i),uu(O,i,!1))}return e.length&&O.dispatch({effects:e}),e.length>0};function uu(O,e,t=!0){let i=O.state.doc.lineAt(e.from).number,r=O.state.doc.lineAt(e.to).number;return T.announce.of(`${O.state.phrase(t?"Folded lines":"Unfolded lines")} ${i} ${O.state.phrase("to")} ${r}.`)}var kX=O=>{let{state:e}=O,t=[];for(let i=0;i{let e=O.state.field(vO,!1);if(!e||!e.size)return!1;let t=[];return e.between(0,O.state.doc.length,(i,r)=>{t.push(cr.of({from:i,to:r}))}),O.dispatch({effects:t}),!0};var Qu=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:yX},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:xX},{key:"Ctrl-Alt-[",run:kX},{key:"Ctrl-Alt-]",run:wX}],ZX={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},Ko=Z.define({combine(O){return xe(O,ZX)}});function $u(O){let e=[vO,YX];return O&&e.push(Ko.of(O)),e}function pu(O,e){let{state:t}=O,i=t.facet(Ko),r=s=>{let a=O.lineBlockAt(O.posAtDOM(s.target)),o=Mn(O.state,a.from,a.to);o&&O.dispatch({effects:cr.of(o)}),s.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(O,r,e);let n=document.createElement("span");return n.textContent=i.placeholderText,n.setAttribute("aria-label",t.phrase("folded code")),n.title=t.phrase("unfold"),n.className="cm-foldPlaceholder",n.onclick=r,n}var iu=Y.replace({widget:new class extends _e{toDOM(O){return pu(O,null)}}}),Do=class extends _e{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return pu(e,this.value)}},vX={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},rr=class extends Ie{constructor(e,t){super(),this.config=e,this.open=t}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let t=document.createElement("span");return t.textContent=this.open?this.config.openText:this.config.closedText,t.title=e.state.phrase(this.open?"Fold line":"Unfold line"),t}};function mu(O={}){let e={...vX,...O},t=new rr(e,!0),i=new rr(e,!1),r=he.fromClass(class{constructor(s){this.from=s.viewport.from,this.markers=this.buildMarkers(s)}update(s){(s.docChanged||s.viewportChanged||s.startState.facet(rO)!=s.state.facet(rO)||s.startState.field(vO,!1)!=s.state.field(vO,!1)||U(s.startState)!=U(s.state)||e.foldingChanged(s))&&(this.markers=this.buildMarkers(s.view))}buildMarkers(s){let a=new Le;for(let o of s.viewportLineBlocks){let l=Mn(s.state,o.from,o.to)?i:Ln(s.state,o.from,o.to)?t:null;l&&a.add(o.from,o.from,l)}return a.finish()}}),{domEventHandlers:n}=e;return[r,bo({class:"cm-foldGutter",markers(s){var a;return((a=s.plugin(r))===null||a===void 0?void 0:a.markers)||M.empty},initialSpacer(){return new rr(e,!1)},domEventHandlers:{...n,click:(s,a,o)=>{if(n.click&&n.click(s,a,o))return!0;let l=Mn(s.state,a.from,a.to);if(l)return s.dispatch({effects:cr.of(l)}),!0;let c=Ln(s.state,a.from,a.to);return c?(s.dispatch({effects:Bn.of(c)}),!0):!1}}}),$u()]}var YX=T.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),ci=class O{constructor(e,t){this.specs=e;let i;function r(a){let o=Ot.newName();return(i||(i=Object.create(null)))["."+o]=a,o}let n=typeof t.all=="string"?t.all:t.all?r(t.all):void 0,s=t.scope;this.scope=s instanceof Re?a=>a.prop(iO)==s.data:s?a=>a==s:void 0,this.style=jo(e.map(a=>({tag:a.tag,class:a.class||r(Object.assign({},a,{tag:null}))})),{all:n}).style,this.module=i?new Ot(i):null,this.themeType=t.themeType}static define(e,t){return new O(e,t||{})}},Io=Z.define(),gu=Z.define({combine(O){return O.length?[O[0]]:null}});function Eo(O){let e=O.facet(Io);return e.length?e:O.facet(gu)}function Nn(O,e){let t=[_X],i;return O instanceof ci&&(O.module&&t.push(T.styleModule.of(O.module)),i=O.themeType),e?.fallback?t.push(gu.of(O)):i?t.push(Io.computeN([T.darkTheme],r=>r.facet(T.darkTheme)==(i=="dark")?[O]:[])):t.push(Io.of(O)),t}var Bo=class{constructor(e){this.markCache=Object.create(null),this.tree=U(e.state),this.decorations=this.buildDeco(e,Eo(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=U(e.state),i=Eo(e.state),r=i!=Eo(e.startState),{viewport:n}=e.view,s=e.changes.mapPos(this.decoratedTo,1);t.length=n.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=s):(t!=this.tree||e.viewportChanged||r)&&(this.tree=t,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=n.to)}buildDeco(e,t){if(!t||!this.tree.length)return Y.none;let i=new Le;for(let{from:r,to:n}of e.visibleRanges)Jd(this.tree,t,(s,a,o)=>{i.add(s,a,this.markCache[o]||(this.markCache[o]=Y.mark({class:o})))},r,n);return i.finish()}},_X=ze.high(he.fromClass(Bo,{decorations:O=>O.decorations})),Pu=ci.define([{tag:d.meta,color:"#404740"},{tag:d.link,textDecoration:"underline"},{tag:d.heading,textDecoration:"underline",fontWeight:"bold"},{tag:d.emphasis,fontStyle:"italic"},{tag:d.strong,fontWeight:"bold"},{tag:d.strikethrough,textDecoration:"line-through"},{tag:d.keyword,color:"#708"},{tag:[d.atom,d.bool,d.url,d.contentSeparator,d.labelName],color:"#219"},{tag:[d.literal,d.inserted],color:"#164"},{tag:[d.string,d.deleted],color:"#a11"},{tag:[d.regexp,d.escape,d.special(d.string)],color:"#e40"},{tag:d.definition(d.variableName),color:"#00f"},{tag:d.local(d.variableName),color:"#30a"},{tag:[d.typeName,d.namespace],color:"#085"},{tag:d.className,color:"#167"},{tag:[d.special(d.variableName),d.macroName],color:"#256"},{tag:d.definition(d.propertyName),color:"#00c"},{tag:d.comment,color:"#940"},{tag:d.invalid,color:"#f00"}]),RX=T.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Su=1e4,Xu="()[]{}",Tu=Z.define({combine(O){return xe(O,{afterCursor:!0,brackets:Xu,maxScanDistance:Su,renderMatch:zX})}}),VX=Y.mark({class:"cm-matchingBracket"}),qX=Y.mark({class:"cm-nonmatchingBracket"});function zX(O){let e=[],t=O.matched?VX:qX;return e.push(t.range(O.start.from,O.start.to)),O.end&&e.push(t.range(O.end.from,O.end.to)),e}var UX=ce.define({create(){return Y.none},update(O,e){if(!e.docChanged&&!e.selection)return O;let t=[],i=e.state.facet(Tu);for(let r of e.state.selection.ranges){if(!r.empty)continue;let n=dt(e.state,r.head,-1,i)||r.head>0&&dt(e.state,r.head-1,1,i)||i.afterCursor&&(dt(e.state,r.head,1,i)||r.headT.decorations.from(O)}),WX=[UX,RX];function bu(O={}){return[Tu.of(O),WX]}var hr=new R;function No(O,e,t){let i=O.prop(e<0?R.openedBy:R.closedBy);if(i)return i;if(O.name.length==1){let r=t.indexOf(O.name);if(r>-1&&r%2==(e<0?1:0))return[t[r+e]]}return null}function Fo(O){let e=O.type.prop(hr);return e?e(O.node):O}function dt(O,e,t,i={}){let r=i.maxScanDistance||Su,n=i.brackets||Xu,s=U(O),a=s.resolveInner(e,t);for(let o=a;o;o=o.parent){let l=No(o.type,t,n);if(l&&o.from0?e>=c.from&&ec.from&&e<=c.to))return jX(O,e,t,o,c,l,n)}}return CX(O,e,t,s,a.type,r,n)}function jX(O,e,t,i,r,n,s){let a=i.parent,o={from:r.from,to:r.to},l=0,c=a?.cursor();if(c&&(t<0?c.childBefore(i.from):c.childAfter(i.to)))do if(t<0?c.to<=i.from:c.from>=i.to){if(l==0&&n.indexOf(c.type.name)>-1&&c.from0)return null;let l={from:t<0?e-1:e,to:t>0?e+1:e},c=O.doc.iterRange(e,t>0?O.doc.length:0),h=0;for(let f=0;!c.next().done&&f<=n;){let u=c.value;t<0&&(f+=u.length);let Q=e+f*t;for(let $=t>0?0:u.length-1,p=t>0?u.length:-1;$!=p;$+=t){let m=s.indexOf(u[$]);if(!(m<0||i.resolveInner(Q+$,1).type!=r))if(m%2==0==t>0)h++;else{if(h==1)return{start:l,end:{from:Q+$,to:Q+$+1},matched:m>>1==o>>1};h--}}t>0&&(f+=u.length)}return c.done?{start:l,matched:!1}:null}var GX=Object.create(null),ru=[ue.none];var nu=[],su=Object.create(null),EX=Object.create(null);for(let[O,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])EX[O]=AX(GX,e);function Ao(O,e){nu.indexOf(O)>-1||(nu.push(O),console.warn(e))}function AX(O,e){let t=[];for(let a of e.split(" ")){let o=[];for(let l of a.split(".")){let c=O[l]||d[l];c?typeof c=="function"?o.length?o=o.map(c):Ao(l,`Modifier ${l} used at start of tag`):o.length?Ao(l,`Tag ${l} used as modifier`):o=Array.isArray(c)?c:[c]:Ao(l,`Unknown highlighting tag ${l}`)}for(let l of o)t.push(l)}if(!t.length)return 0;let i=e.replace(/ /g,"_"),r=i+" "+t.map(a=>a.id),n=su[r];if(n)return n.id;let s=su[r]=ue.define({id:ru.length,name:i,props:[F({[i]:t})]});return ru.push(s),s.id}var Q_={rtl:Y.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:H.RTL}),ltr:Y.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:H.LTR}),auto:Y.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var LX=O=>{let{state:e}=O,t=e.doc.lineAt(e.selection.main.from),i=nl(O.state,t.from);return i.line?MX(O):i.block?IX(O):!1};function rl(O,e){return({state:t,dispatch:i})=>{if(t.readOnly)return!1;let r=O(e,t);return r?(i(t.update(r)),!0):!1}}var MX=rl(FX,0);var DX=rl(Ru,0);var IX=rl((O,e)=>Ru(O,e,NX(e)),0);function nl(O,e){let t=O.languageDataAt("commentTokens",e,1);return t.length?t[0]:{}}var fr=50;function BX(O,{open:e,close:t},i,r){let n=O.sliceDoc(i-fr,i),s=O.sliceDoc(r,r+fr),a=/\s*$/.exec(n)[0].length,o=/^\s*/.exec(s)[0].length,l=n.length-a;if(n.slice(l-e.length,l)==e&&s.slice(o,o+t.length)==t)return{open:{pos:i-a,margin:a&&1},close:{pos:r+o,margin:o&&1}};let c,h;r-i<=2*fr?c=h=O.sliceDoc(i,r):(c=O.sliceDoc(i,i+fr),h=O.sliceDoc(r-fr,r));let f=/^\s*/.exec(c)[0].length,u=/\s*$/.exec(h)[0].length,Q=h.length-u-t.length;return c.slice(f,f+e.length)==e&&h.slice(Q,Q+t.length)==t?{open:{pos:i+f+e.length,margin:/\s/.test(c.charAt(f+e.length))?1:0},close:{pos:r-u-t.length,margin:/\s/.test(h.charAt(Q-1))?1:0}}:null}function NX(O){let e=[];for(let t of O.selection.ranges){let i=O.doc.lineAt(t.from),r=t.to<=i.to?i:O.doc.lineAt(t.to);r.from>i.from&&r.from==t.to&&(r=t.to==i.to+1?i:O.doc.lineAt(t.to-1));let n=e.length-1;n>=0&&e[n].to>i.from?e[n].to=r.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:r.to})}return e}function Ru(O,e,t=e.selection.ranges){let i=t.map(n=>nl(e,n.from).block);if(!i.every(n=>n))return null;let r=t.map((n,s)=>BX(e,i[s],n.from,n.to));if(O!=2&&!r.every(n=>n))return{changes:e.changes(t.map((n,s)=>r[s]?[]:[{from:n.from,insert:i[s].open+" "},{from:n.to,insert:" "+i[s].close}]))};if(O!=1&&r.some(n=>n)){let n=[];for(let s=0,a;sr&&(n==s||s>h.from)){r=h.from;let f=/^\s*/.exec(h.text)[0].length,u=f==h.length,Q=h.text.slice(f,f+l.length)==l?f:-1;fn.comment<0&&(!n.empty||n.single))){let n=[];for(let{line:a,token:o,indent:l,empty:c,single:h}of i)(h||!c)&&n.push({from:a.from+l,insert:o+" "});let s=e.changes(n);return{changes:s,selection:e.selection.map(s,1)}}else if(O!=1&&i.some(n=>n.comment>=0)){let n=[];for(let{line:s,comment:a,token:o}of i)if(a>=0){let l=s.from+a,c=l+o.length;s.text[c-s.from]==" "&&c++,n.push({from:l,to:c})}return{changes:n}}return null}var el=qe.define(),HX=qe.define(),KX=Z.define(),Vu=Z.define({combine(O){return xe(O,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(i,r)=>e(i,r)||t(i,r)})}}),qu=ce.define({create(){return YO.empty},update(O,e){let t=e.state.facet(Vu),i=e.annotation(el);if(i){let o=ut.fromTransaction(e,i.selection),l=i.side,c=l==0?O.undone:O.done;return o?c=Hn(c,c.length,t.minDepth,o):c=ju(c,e.startState.selection),new YO(l==0?i.rest:c,l==0?c:i.rest)}let r=e.annotation(HX);if((r=="full"||r=="before")&&(O=O.isolate()),e.annotation(Qe.addToHistory)===!1)return e.changes.empty?O:O.addMapping(e.changes.desc);let n=ut.fromTransaction(e),s=e.annotation(Qe.time),a=e.annotation(Qe.userEvent);return n?O=O.addChanges(n,s,a,t,e):e.selection&&(O=O.addSelection(e.startState.selection,s,a,t.newGroupDelay)),(r=="full"||r=="after")&&(O=O.isolate()),O},toJSON(O){return{done:O.done.map(e=>e.toJSON()),undone:O.undone.map(e=>e.toJSON())}},fromJSON(O){return new YO(O.done.map(ut.fromJSON),O.undone.map(ut.fromJSON))}});function zu(O={}){return[qu,Vu.of(O),T.domEventHandlers({beforeinput(e,t){let i=e.inputType=="historyUndo"?Uu:e.inputType=="historyRedo"?tl:null;return i?(e.preventDefault(),i(t)):!1}})]}function Kn(O,e){return function({state:t,dispatch:i}){if(!e&&t.readOnly)return!1;let r=t.field(qu,!1);if(!r)return!1;let n=r.pop(O,t,e);return n?(i(n),!0):!1}}var Uu=Kn(0,!1),tl=Kn(1,!1),JX=Kn(0,!0),eT=Kn(1,!0);var ut=class O{constructor(e,t,i,r,n){this.changes=e,this.effects=t,this.mapped=i,this.startSelection=r,this.selectionsAfter=n}setSelAfter(e){return new O(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,t,i;return{changes:(e=this.changes)===null||e===void 0?void 0:e.toJSON(),mapped:(t=this.mapped)===null||t===void 0?void 0:t.toJSON(),startSelection:(i=this.startSelection)===null||i===void 0?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map(r=>r.toJSON())}}static fromJSON(e){return new O(e.changes&&Ze.fromJSON(e.changes),[],e.mapped&&vt.fromJSON(e.mapped),e.startSelection&&S.fromJSON(e.startSelection),e.selectionsAfter.map(S.fromJSON))}static fromTransaction(e,t){let i=st;for(let r of e.startState.facet(KX)){let n=r(e);n.length&&(i=i.concat(n))}return!i.length&&e.changes.empty?null:new O(e.changes.invert(e.startState.doc),i,void 0,t||e.startState.selection,st)}static selection(e){return new O(void 0,st,void 0,void 0,e)}};function Hn(O,e,t,i){let r=e+1>t+20?e-t-1:0,n=O.slice(r,e);return n.push(i),n}function tT(O,e){let t=[],i=!1;return O.iterChangedRanges((r,n)=>t.push(r,n)),e.iterChangedRanges((r,n,s,a)=>{for(let o=0;o=l&&s<=c&&(i=!0)}}),i}function OT(O,e){return O.ranges.length==e.ranges.length&&O.ranges.filter((t,i)=>t.empty!=e.ranges[i].empty).length===0}function Wu(O,e){return O.length?e.length?O.concat(e):O:e}var st=[],iT=200;function ju(O,e){if(O.length){let t=O[O.length-1],i=t.selectionsAfter.slice(Math.max(0,t.selectionsAfter.length-iT));return i.length&&i[i.length-1].eq(e)?O:(i.push(e),Hn(O,O.length-1,1e9,t.setSelAfter(i)))}else return[ut.selection([e])]}function rT(O){let e=O[O.length-1],t=O.slice();return t[O.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),t}function Jo(O,e){if(!O.length)return O;let t=O.length,i=st;for(;t;){let r=nT(O[t-1],e,i);if(r.changes&&!r.changes.empty||r.effects.length){let n=O.slice(0,t);return n[t-1]=r,n}else e=r.mapped,t--,i=r.selectionsAfter}return i.length?[ut.selection(i)]:st}function nT(O,e,t){let i=Wu(O.selectionsAfter.length?O.selectionsAfter.map(a=>a.map(e)):st,t);if(!O.changes)return ut.selection(i);let r=O.changes.map(e),n=e.mapDesc(O.changes,!0),s=O.mapped?O.mapped.composeDesc(n):n;return new ut(r,V.mapEffects(O.effects,e),s,O.startSelection.map(n),i)}var sT=/^(input\.type|delete)($|\.)/,YO=class O{constructor(e,t,i=0,r=void 0){this.done=e,this.undone=t,this.prevTime=i,this.prevUserEvent=r}isolate(){return this.prevTime?new O(this.done,this.undone):this}addChanges(e,t,i,r,n){let s=this.done,a=s[s.length-1];return a&&a.changes&&!a.changes.empty&&e.changes&&(!i||sT.test(i))&&(!a.selectionsAfter.length&&t-this.prevTime0&&t-this.prevTimet.empty?O.moveByChar(t,e):Jn(t,e))}function ke(O){return O.textDirectionAt(O.state.selection.main.head)==H.LTR}var Eu=O=>Gu(O,!ke(O)),Au=O=>Gu(O,ke(O));function Lu(O,e){return $t(O,t=>t.empty?O.moveByGroup(t,e):Jn(t,e))}var aT=O=>Lu(O,!ke(O)),oT=O=>Lu(O,ke(O));var b_=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function lT(O,e,t){if(e.type.prop(t))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(O.sliceDoc(e.from,e.to)))||e.firstChild}function es(O,e,t){let i=U(O).resolveInner(e.head),r=t?R.closedBy:R.openedBy;for(let o=e.head;;){let l=t?i.childAfter(o):i.childBefore(o);if(!l)break;lT(O,l,r)?i=l:o=t?l.to:l.from}let n=i.type.prop(r),s,a;return n&&(s=t?dt(O,i.from,1):dt(O,i.to,-1))&&s.matched?a=t?s.end.to:s.end.from:a=t?i.to:i.from,S.cursor(a,t?-1:1)}var cT=O=>$t(O,e=>es(O.state,e,!ke(O))),hT=O=>$t(O,e=>es(O.state,e,ke(O)));function Mu(O,e){return $t(O,t=>{if(!t.empty)return Jn(t,e);let i=O.moveVertically(t,e);return i.head!=t.head?i:O.moveToLineBoundary(t,e)})}var Du=O=>Mu(O,!1),Iu=O=>Mu(O,!0);function Bu(O){let e=O.scrollDOM.clientHeights.empty?O.moveVertically(s,e,t.height):Jn(s,e));if(r.eq(i.selection))return!1;let n;if(t.selfScroll){let s=O.coordsAtPos(i.selection.main.head),a=O.scrollDOM.getBoundingClientRect(),o=a.top+t.marginTop,l=a.bottom-t.marginBottom;s&&s.top>o&&s.bottomNu(O,!1),Ol=O=>Nu(O,!0);function aO(O,e,t){let i=O.lineBlockAt(e.head),r=O.moveToLineBoundary(e,t);if(r.head==e.head&&r.head!=(t?i.to:i.from)&&(r=O.moveToLineBoundary(e,t,!1)),!t&&r.head==i.from&&i.length){let n=/^\s*/.exec(O.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;n&&e.head!=i.from+n&&(r=S.cursor(i.from+n))}return r}var fT=O=>$t(O,e=>aO(O,e,!0)),dT=O=>$t(O,e=>aO(O,e,!1)),uT=O=>$t(O,e=>aO(O,e,!ke(O))),QT=O=>$t(O,e=>aO(O,e,ke(O))),$T=O=>$t(O,e=>S.cursor(O.lineBlockAt(e.head).from,1)),pT=O=>$t(O,e=>S.cursor(O.lineBlockAt(e.head).to,-1));function mT(O,e,t){let i=!1,r=fi(O.selection,n=>{let s=dt(O,n.head,-1)||dt(O,n.head,1)||n.head>0&&dt(O,n.head-1,1)||n.headmT(O,e,!1);function at(O,e){let t=fi(O.state.selection,i=>{let r=e(i);return S.range(i.anchor,r.head,r.goalColumn,r.bidiLevel||void 0)});return t.eq(O.state.selection)?!1:(O.dispatch(Qt(O.state,t)),!0)}function Fu(O,e){return at(O,t=>O.moveByChar(t,e))}var Hu=O=>Fu(O,!ke(O)),Ku=O=>Fu(O,ke(O));function Ju(O,e){return at(O,t=>O.moveByGroup(t,e))}var PT=O=>Ju(O,!ke(O)),ST=O=>Ju(O,ke(O));var XT=O=>at(O,e=>es(O.state,e,!ke(O))),TT=O=>at(O,e=>es(O.state,e,ke(O)));function eQ(O,e){return at(O,t=>O.moveVertically(t,e))}var tQ=O=>eQ(O,!1),OQ=O=>eQ(O,!0);function iQ(O,e){return at(O,t=>O.moveVertically(t,e,Bu(O).height))}var xu=O=>iQ(O,!1),ku=O=>iQ(O,!0),bT=O=>at(O,e=>aO(O,e,!0)),yT=O=>at(O,e=>aO(O,e,!1)),xT=O=>at(O,e=>aO(O,e,!ke(O))),kT=O=>at(O,e=>aO(O,e,ke(O))),wT=O=>at(O,e=>S.cursor(O.lineBlockAt(e.head).from)),ZT=O=>at(O,e=>S.cursor(O.lineBlockAt(e.head).to)),wu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:0})),!0),Zu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:O.doc.length})),!0),vu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:O.selection.main.anchor,head:0})),!0),Yu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:O.selection.main.anchor,head:O.doc.length})),!0),vT=({state:O,dispatch:e})=>(e(O.update({selection:{anchor:0,head:O.doc.length},userEvent:"select"})),!0),YT=({state:O,dispatch:e})=>{let t=ts(O).map(({from:i,to:r})=>S.range(i,Math.min(r+1,O.doc.length)));return e(O.update({selection:S.create(t),userEvent:"select"})),!0},_T=({state:O,dispatch:e})=>{let t=fi(O.selection,i=>{let r=U(O),n=r.resolveStack(i.from,1);if(i.empty){let s=r.resolveStack(i.from,-1);s.node.from>=n.node.from&&s.node.to<=n.node.to&&(n=s)}for(let s=n;s;s=s.next){let{node:a}=s;if((a.from=i.to||a.to>i.to&&a.from<=i.from)&&s.next)return S.range(a.to,a.from)}return i});return t.eq(O.selection)?!1:(e(Qt(O,t)),!0)};function rQ(O,e){let{state:t}=O,i=t.selection,r=t.selection.ranges.slice();for(let n of t.selection.ranges){let s=t.doc.lineAt(n.head);if(e?s.to0)for(let a=n;;){let o=O.moveVertically(a,e);if(o.heads.to){r.some(l=>l.head==o.head)||r.push(o);break}else{if(o.head==a.head)break;a=o}}}return r.length==i.ranges.length?!1:(O.dispatch(Qt(t,S.create(r,r.length-1))),!0)}var RT=O=>rQ(O,!1),VT=O=>rQ(O,!0),qT=({state:O,dispatch:e})=>{let t=O.selection,i=null;return t.ranges.length>1?i=S.create([t.main]):t.main.empty||(i=S.create([S.cursor(t.main.head)])),i?(e(Qt(O,i)),!0):!1};function dr(O,e){if(O.state.readOnly)return!1;let t="delete.selection",{state:i}=O,r=i.changeByRange(n=>{let{from:s,to:a}=n;if(s==a){let o=e(n);os&&(t="delete.forward",o=Fn(O,o,!0)),s=Math.min(s,o),a=Math.max(a,o)}else s=Fn(O,s,!1),a=Fn(O,a,!0);return s==a?{range:n}:{changes:{from:s,to:a},range:S.cursor(s,sr(O)))i.between(e,e,(r,n)=>{re&&(e=t?n:r)});return e}var nQ=(O,e,t)=>dr(O,i=>{let r=i.from,{state:n}=O,s=n.doc.lineAt(r),a,o;if(t&&!e&&r>s.from&&rnQ(O,!1,!0);var sQ=O=>nQ(O,!0,!1),aQ=(O,e)=>dr(O,t=>{let i=t.head,{state:r}=O,n=r.doc.lineAt(i),s=r.charCategorizer(i);for(let a=null;;){if(i==(e?n.to:n.from)){i==t.head&&n.number!=(e?r.doc.lines:1)&&(i+=e?1:-1);break}let o=fe(n.text,i-n.from,e)+n.from,l=n.text.slice(Math.min(i,o)-n.from,Math.max(i,o)-n.from),c=s(l);if(a!=null&&c!=a)break;(l!=" "||i!=t.head)&&(a=c),i=o}return i}),oQ=O=>aQ(O,!1),zT=O=>aQ(O,!0);var UT=O=>dr(O,e=>{let t=O.lineBlockAt(e.head).to;return e.headdr(O,e=>{let t=O.moveToLineBoundary(e,!1).head;return e.head>t?t:Math.max(0,e.head-1)}),jT=O=>dr(O,e=>{let t=O.moveToLineBoundary(e,!0).head;return e.head{if(O.readOnly)return!1;let t=O.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:E.of(["",""])},range:S.cursor(i.from)}));return e(O.update(t,{scrollIntoView:!0,userEvent:"input"})),!0},GT=({state:O,dispatch:e})=>{if(O.readOnly)return!1;let t=O.changeByRange(i=>{if(!i.empty||i.from==0||i.from==O.doc.length)return{range:i};let r=i.from,n=O.doc.lineAt(r),s=r==n.from?r-1:fe(n.text,r-n.from,!1)+n.from,a=r==n.to?r+1:fe(n.text,r-n.from,!0)+n.from;return{changes:{from:s,to:a,insert:O.doc.slice(r,a).append(O.doc.slice(s,r))},range:S.cursor(a)}});return t.changes.empty?!1:(e(O.update(t,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function ts(O){let e=[],t=-1;for(let i of O.selection.ranges){let r=O.doc.lineAt(i.from),n=O.doc.lineAt(i.to);if(!i.empty&&i.to==n.from&&(n=O.doc.lineAt(i.to-1)),t>=r.number){let s=e[e.length-1];s.to=n.to,s.ranges.push(i)}else e.push({from:r.from,to:n.to,ranges:[i]});t=n.number+1}return e}function lQ(O,e,t){if(O.readOnly)return!1;let i=[],r=[];for(let n of ts(O)){if(t?n.to==O.doc.length:n.from==0)continue;let s=O.doc.lineAt(t?n.to+1:n.from-1),a=s.length+1;if(t){i.push({from:n.to,to:s.to},{from:n.from,insert:s.text+O.lineBreak});for(let o of n.ranges)r.push(S.range(Math.min(O.doc.length,o.anchor+a),Math.min(O.doc.length,o.head+a)))}else{i.push({from:s.from,to:n.from},{from:n.to,insert:O.lineBreak+s.text});for(let o of n.ranges)r.push(S.range(o.anchor-a,o.head-a))}}return i.length?(e(O.update({changes:i,scrollIntoView:!0,selection:S.create(r,O.selection.mainIndex),userEvent:"move.line"})),!0):!1}var ET=({state:O,dispatch:e})=>lQ(O,e,!1),AT=({state:O,dispatch:e})=>lQ(O,e,!0);function cQ(O,e,t){if(O.readOnly)return!1;let i=[];for(let n of ts(O))t?i.push({from:n.from,insert:O.doc.slice(n.from,n.to)+O.lineBreak}):i.push({from:n.to,insert:O.lineBreak+O.doc.slice(n.from,n.to)});let r=O.changes(i);return e(O.update({changes:r,selection:O.selection.map(r,t?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var LT=({state:O,dispatch:e})=>cQ(O,e,!1),MT=({state:O,dispatch:e})=>cQ(O,e,!0),DT=O=>{if(O.state.readOnly)return!1;let{state:e}=O,t=e.changes(ts(e).map(({from:r,to:n})=>(r>0?r--:n{let n;if(O.lineWrapping){let s=O.lineBlockAt(r.head),a=O.coordsAtPos(r.head,r.assoc||1);a&&(n=s.bottom+O.documentTop-a.bottom+O.defaultLineHeight/2)}return O.moveVertically(r,!0,n)}).map(t);return O.dispatch({changes:t,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function IT(O,e){if(/\(\)|\[\]|\{\}/.test(O.sliceDoc(e-1,e+1)))return{from:e,to:e};let t=U(O).resolveInner(e),i=t.childBefore(e),r=t.childAfter(e),n;return i&&r&&i.to<=e&&r.from>=e&&(n=i.type.prop(R.closedBy))&&n.indexOf(r.name)>-1&&O.doc.lineAt(i.to).from==O.doc.lineAt(r.from).from&&!/\S/.test(O.sliceDoc(i.to,r.from))?{from:i.to,to:r.from}:null}var _u=hQ(!1),BT=hQ(!0);function hQ(O){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=e.changeByRange(r=>{let{from:n,to:s}=r,a=e.doc.lineAt(n),o=!O&&n==s&&IT(e,n);O&&(n=s=(s<=a.to?a:e.doc.lineAt(s)).to);let l=new ZO(e,{simulateBreak:n,simulateDoubleBreak:!!o}),c=In(l,n);for(c==null&&(c=ve(/^\s*/.exec(e.doc.lineAt(n).text)[0],e.tabSize));sa.from&&n{let r=[];for(let s=i.from;s<=i.to;){let a=O.doc.lineAt(s);a.number>t&&(i.empty||i.to>a.from)&&(e(a,r,i),t=a.number),s=a.to+1}let n=O.changes(r);return{changes:r,range:S.range(n.mapPos(i.anchor,1),n.mapPos(i.head,1))}})}var NT=({state:O,dispatch:e})=>{if(O.readOnly)return!1;let t=Object.create(null),i=new ZO(O,{overrideIndentation:n=>{let s=t[n];return s??-1}}),r=sl(O,(n,s,a)=>{let o=In(i,n.from);if(o==null)return;/\S/.test(n.text)||(o=0);let l=/^\s*/.exec(n.text)[0],c=hi(O,o);(l!=c||a.fromO.readOnly?!1:(e(O.update(sl(O,(t,i)=>{i.push({from:t.from,insert:O.facet(nO)})}),{userEvent:"input.indent"})),!0),dQ=({state:O,dispatch:e})=>O.readOnly?!1:(e(O.update(sl(O,(t,i)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let n=ve(r,O.tabSize),s=0,a=hi(O,Math.max(0,n-lr(O)));for(;s(O.setTabFocusMode(),!0);var HT=[{key:"Ctrl-b",run:Eu,shift:Hu,preventDefault:!0},{key:"Ctrl-f",run:Au,shift:Ku},{key:"Ctrl-p",run:Du,shift:tQ},{key:"Ctrl-n",run:Iu,shift:OQ},{key:"Ctrl-a",run:$T,shift:wT},{key:"Ctrl-e",run:pT,shift:ZT},{key:"Ctrl-d",run:sQ},{key:"Ctrl-h",run:il},{key:"Ctrl-k",run:UT},{key:"Ctrl-Alt-h",run:oQ},{key:"Ctrl-o",run:CT},{key:"Ctrl-t",run:GT},{key:"Ctrl-v",run:Ol}],KT=[{key:"ArrowLeft",run:Eu,shift:Hu,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:aT,shift:PT,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:uT,shift:xT,preventDefault:!0},{key:"ArrowRight",run:Au,shift:Ku,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:oT,shift:ST,preventDefault:!0},{mac:"Cmd-ArrowRight",run:QT,shift:kT,preventDefault:!0},{key:"ArrowUp",run:Du,shift:tQ,preventDefault:!0},{mac:"Cmd-ArrowUp",run:wu,shift:vu},{mac:"Ctrl-ArrowUp",run:yu,shift:xu},{key:"ArrowDown",run:Iu,shift:OQ,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Zu,shift:Yu},{mac:"Ctrl-ArrowDown",run:Ol,shift:ku},{key:"PageUp",run:yu,shift:xu},{key:"PageDown",run:Ol,shift:ku},{key:"Home",run:dT,shift:yT,preventDefault:!0},{key:"Mod-Home",run:wu,shift:vu},{key:"End",run:fT,shift:bT,preventDefault:!0},{key:"Mod-End",run:Zu,shift:Yu},{key:"Enter",run:_u,shift:_u},{key:"Mod-a",run:vT},{key:"Backspace",run:il,shift:il,preventDefault:!0},{key:"Delete",run:sQ,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:oQ,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:zT,preventDefault:!0},{mac:"Mod-Backspace",run:WT,preventDefault:!0},{mac:"Mod-Delete",run:jT,preventDefault:!0}].concat(HT.map(O=>({mac:O.key,run:O.run,shift:O.shift}))),uQ=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:cT,shift:XT},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:hT,shift:TT},{key:"Alt-ArrowUp",run:ET},{key:"Shift-Alt-ArrowUp",run:LT},{key:"Alt-ArrowDown",run:AT},{key:"Shift-Alt-ArrowDown",run:MT},{key:"Mod-Alt-ArrowUp",run:RT},{key:"Mod-Alt-ArrowDown",run:VT},{key:"Escape",run:qT},{key:"Mod-Enter",run:BT},{key:"Alt-l",mac:"Ctrl-l",run:YT},{key:"Mod-i",run:_T,preventDefault:!0},{key:"Mod-[",run:dQ},{key:"Mod-]",run:fQ},{key:"Mod-Alt-\\",run:NT},{key:"Shift-Mod-k",run:DT},{key:"Shift-Mod-\\",run:gT},{key:"Mod-/",run:LX},{key:"Alt-A",run:DX},{key:"Ctrl-m",mac:"Shift-Alt-m",run:FT}].concat(KT),QQ={key:"Tab",run:fQ,shift:dQ};var $Q=typeof String.prototype.normalize=="function"?O=>O.normalize("NFKD"):O=>O,lO=class{constructor(e,t,i=0,r=e.length,n,s){this.test=s,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,r),this.bufferStart=i,this.normalize=n?a=>n($Q(a)):$Q,this.query=this.normalize(t)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Se(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let t=Ri(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=Me(e);let r=this.normalize(t);if(r.length)for(let n=0,s=i;;n++){let a=r.charCodeAt(n),o=this.match(a,s,this.bufferPos+this.bufferStart);if(n==r.length-1){if(o)return this.value=o,this;break}s==i&&nthis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let t=this.matchPos<=this.to&&this.re.exec(this.curLine);if(t){let i=this.curLineStart+t.index,r=i+t[0].length;if(this.matchPos=as(this.text,r+(i==r?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,r,t)))return this.value={from:i,to:r,match:t},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||r.to<=t){let a=new O(t,e.sliceString(t,i));return al.set(e,a),a}if(r.from==t&&r.to==i)return r;let{text:n,from:s}=r;return s>t&&(n=e.sliceString(t,s)+n,s=t),r.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=this.re.exec(this.flat.text);if(t&&!t[0]&&t.index==e&&(this.re.lastIndex=e+1,t=this.re.exec(this.flat.text)),t){let i=this.flat.from+t.index,r=i+t[0].length;if((this.flat.to>=this.to||t.index+t[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,r,t)))return this.value={from:i,to:r,match:t},this.matchPos=as(this.text,r+(i==r?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=ns.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(rs.prototype[Symbol.iterator]=ss.prototype[Symbol.iterator]=function(){return this});function JT(O){try{return new RegExp(O,dl),!0}catch{return!1}}function as(O,e){if(e>=O.length)return e;let t=O.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}function ol(O){let e=String(O.state.doc.lineAt(O.state.selection.main.head).number),t=N("input",{class:"cm-textfield",name:"line",value:e}),i=N("form",{class:"cm-gotoLine",onkeydown:n=>{n.keyCode==27?(n.preventDefault(),O.dispatch({effects:ur.of(!1)}),O.focus()):n.keyCode==13&&(n.preventDefault(),r())},onsubmit:n=>{n.preventDefault(),r()}},N("label",O.state.phrase("Go to line"),": ",t)," ",N("button",{class:"cm-button",type:"submit"},O.state.phrase("go")),N("button",{name:"close",onclick:()=>{O.dispatch({effects:ur.of(!1)}),O.focus()},"aria-label":O.state.phrase("close"),type:"button"},["\xD7"]));function r(){let n=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(t.value);if(!n)return;let{state:s}=O,a=s.doc.lineAt(s.selection.main.head),[,o,l,c,h]=n,f=c?+c.slice(1):0,u=l?+l:a.number;if(l&&h){let p=u/100;o&&(p=p*(o=="-"?-1:1)+a.number/s.doc.lines),u=Math.round(s.doc.lines*p)}else l&&o&&(u=u*(o=="-"?-1:1)+a.number);let Q=s.doc.line(Math.max(1,Math.min(s.doc.lines,u))),$=S.cursor(Q.from+Math.max(0,Math.min(f,Q.length)));O.dispatch({effects:[ur.of(!1),T.scrollIntoView($.from,{y:"center"})],selection:$}),O.focus()}return{dom:i}}var ur=V.define(),pQ=ce.define({create(){return!0},update(O,e){for(let t of e.effects)t.is(ur)&&(O=t.value);return O},provide:O=>TO.from(O,e=>e?ol:null)}),e1=O=>{let e=bO(O,ol);if(!e){let t=[ur.of(!0)];O.state.field(pQ,!1)==null&&t.push(V.appendConfig.of([pQ,t1])),O.dispatch({effects:t}),e=bO(O,ol)}return e&&e.dom.querySelector("input").select(),!0},t1=T.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px",position:"relative","& label":{fontSize:"80%"},"& [name=close]":{position:"absolute",top:"0",bottom:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:"0"}}}),O1={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},SQ=Z.define({combine(O){return xe(O,O1,{highlightWordAroundCursor:(e,t)=>e||t,minSelectionLength:Math.min,maxMatches:Math.min})}});function XQ(O){let e=[a1,s1];return O&&e.push(SQ.of(O)),e}var i1=Y.mark({class:"cm-selectionMatch"}),r1=Y.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function mQ(O,e,t,i){return(t==0||O(e.sliceDoc(t-1,t))!=ee.Word)&&(i==e.doc.length||O(e.sliceDoc(i,i+1))!=ee.Word)}function n1(O,e,t,i){return O(e.sliceDoc(t,t+1))==ee.Word&&O(e.sliceDoc(i-1,i))==ee.Word}var s1=he.fromClass(class{constructor(O){this.decorations=this.getDeco(O)}update(O){(O.selectionSet||O.docChanged||O.viewportChanged)&&(this.decorations=this.getDeco(O.view))}getDeco(O){let e=O.state.facet(SQ),{state:t}=O,i=t.selection;if(i.ranges.length>1)return Y.none;let r=i.main,n,s=null;if(r.empty){if(!e.highlightWordAroundCursor)return Y.none;let o=t.wordAt(r.head);if(!o)return Y.none;s=t.charCategorizer(r.head),n=t.sliceDoc(o.from,o.to)}else{let o=r.to-r.from;if(o200)return Y.none;if(e.wholeWords){if(n=t.sliceDoc(r.from,r.to),s=t.charCategorizer(r.head),!(mQ(s,t,r.from,r.to)&&n1(s,t,r.from,r.to)))return Y.none}else if(n=t.sliceDoc(r.from,r.to),!n)return Y.none}let a=[];for(let o of O.visibleRanges){let l=new lO(t.doc,n,o.from,o.to);for(;!l.next().done;){let{from:c,to:h}=l.value;if((!s||mQ(s,t,c,h))&&(r.empty&&c<=r.from&&h>=r.to?a.push(r1.range(c,h)):(c>=r.to||h<=r.from)&&a.push(i1.range(c,h)),a.length>e.maxMatches))return Y.none}}return Y.set(a)}},{decorations:O=>O.decorations}),a1=T.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),o1=({state:O,dispatch:e})=>{let{selection:t}=O,i=S.create(t.ranges.map(r=>O.wordAt(r.head)||S.cursor(r.head)),t.mainIndex);return i.eq(t)?!1:(e(O.update({selection:i})),!0)};function l1(O,e){let{main:t,ranges:i}=O.selection,r=O.wordAt(t.head),n=r&&r.from==t.from&&r.to==t.to;for(let s=!1,a=new lO(O.doc,e,i[i.length-1].to);;)if(a.next(),a.done){if(s)return null;a=new lO(O.doc,e,0,Math.max(0,i[i.length-1].from-1)),s=!0}else{if(s&&i.some(o=>o.from==a.value.from))continue;if(n){let o=O.wordAt(a.value.from);if(!o||o.from!=a.value.from||o.to!=a.value.to)continue}return a.value}}var c1=({state:O,dispatch:e})=>{let{ranges:t}=O.selection;if(t.some(n=>n.from===n.to))return o1({state:O,dispatch:e});let i=O.sliceDoc(t[0].from,t[0].to);if(O.selection.ranges.some(n=>O.sliceDoc(n.from,n.to)!=i))return!1;let r=l1(O,i);return r?(e(O.update({selection:O.selection.addRange(S.range(r.from,r.to),!1),effects:T.scrollIntoView(r.to)})),!0):!1},Qi=Z.define({combine(O){return xe(O,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new fl(e),scrollToMatch:e=>T.scrollIntoView(e)})}});var os=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||JT(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(t,i)=>i=="n"?` +`:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new cl(this):new ll(this)}getCursor(e,t=0,i){let r=e.doc?e:I.create({doc:e});return i==null&&(i=r.doc.length),this.regexp?ui(this,r,t,i):di(this,r,t,i)}},ls=class{constructor(e){this.spec=e}};function di(O,e,t,i){return new lO(e.doc,O.unquoted,t,i,O.caseSensitive?void 0:r=>r.toLowerCase(),O.wholeWord?h1(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}function h1(O,e){return(t,i,r,n)=>((n>t||n+r.length=t)return null;r.push(i.value)}return r}highlight(e,t,i,r){let n=di(this.spec,e,Math.max(0,t-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!n.next().done;)r(n.value.from,n.value.to)}};function ui(O,e,t,i){return new rs(e.doc,O.search,{ignoreCase:!O.caseSensitive,test:O.wholeWord?f1(e.charCategorizer(e.selection.main.head)):void 0},t,i)}function cs(O,e){return O.slice(fe(O,e,!1),e)}function hs(O,e){return O.slice(e,fe(O,e))}function f1(O){return(e,t,i)=>!i[0].length||(O(cs(i.input,i.index))!=ee.Word||O(hs(i.input,i.index))!=ee.Word)&&(O(hs(i.input,i.index+i[0].length))!=ee.Word||O(cs(i.input,i.index+i[0].length))!=ee.Word)}var cl=class extends ls{nextMatch(e,t,i){let r=ui(this.spec,e,i,e.doc.length).next();return r.done&&(r=ui(this.spec,e,0,t).next()),r.done?null:r.value}prevMatchInRange(e,t,i){for(let r=1;;r++){let n=Math.max(t,i-r*1e4),s=ui(this.spec,e,n,i),a=null;for(;!s.next().done;)a=s.value;if(a&&(n==t||a.from>n+10))return a;if(n==t)return null}}prevMatch(e,t,i){return this.prevMatchInRange(e,0,t)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(t,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let r=i.length;r>0;r--){let n=+i.slice(0,r);if(n>0&&n=t)return null;r.push(i.value)}return r}highlight(e,t,i,r){let n=ui(this.spec,e,Math.max(0,t-250),Math.min(i+250,e.doc.length));for(;!n.next().done;)r(n.value.from,n.value.to)}},$r=V.define(),ul=V.define(),oO=ce.define({create(O){return new Qr(hl(O).create(),null)},update(O,e){for(let t of e.effects)t.is($r)?O=new Qr(t.value.create(),O.panel):t.is(ul)&&(O=new Qr(O.query,t.value?Ql:null));return O},provide:O=>TO.from(O,e=>e.panel)});var Qr=class{constructor(e,t){this.query=e,this.panel=t}},d1=Y.mark({class:"cm-searchMatch"}),u1=Y.mark({class:"cm-searchMatch cm-searchMatch-selected"}),Q1=he.fromClass(class{constructor(O){this.view=O,this.decorations=this.highlight(O.state.field(oO))}update(O){let e=O.state.field(oO);(e!=O.startState.field(oO)||O.docChanged||O.selectionSet||O.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:O,panel:e}){if(!e||!O.spec.valid)return Y.none;let{view:t}=this,i=new Le;for(let r=0,n=t.visibleRanges,s=n.length;rn[r+1].from-500;)o=n[++r].to;O.highlight(t.state,a,o,(l,c)=>{let h=t.state.selection.ranges.some(f=>f.from==l&&f.to==c);i.add(l,c,h?u1:d1)})}return i.finish()}},{decorations:O=>O.decorations});function pr(O){return e=>{let t=e.state.field(oO,!1);return t&&t.query.spec.valid?O(e,t):yQ(e)}}var fs=pr((O,{query:e})=>{let{to:t}=O.state.selection.main,i=e.nextMatch(O.state,t,t);if(!i)return!1;let r=S.single(i.from,i.to),n=O.state.facet(Qi);return O.dispatch({selection:r,effects:[$l(O,i),n.scrollToMatch(r.main,O)],userEvent:"select.search"}),bQ(O),!0}),ds=pr((O,{query:e})=>{let{state:t}=O,{from:i}=t.selection.main,r=e.prevMatch(t,i,i);if(!r)return!1;let n=S.single(r.from,r.to),s=O.state.facet(Qi);return O.dispatch({selection:n,effects:[$l(O,r),s.scrollToMatch(n.main,O)],userEvent:"select.search"}),bQ(O),!0}),$1=pr((O,{query:e})=>{let t=e.matchAll(O.state,1e3);return!t||!t.length?!1:(O.dispatch({selection:S.create(t.map(i=>S.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),p1=({state:O,dispatch:e})=>{let t=O.selection;if(t.ranges.length>1||t.main.empty)return!1;let{from:i,to:r}=t.main,n=[],s=0;for(let a=new lO(O.doc,O.sliceDoc(i,r));!a.next().done;){if(n.length>1e3)return!1;a.value.from==i&&(s=n.length),n.push(S.range(a.value.from,a.value.to))}return e(O.update({selection:S.create(n,s),userEvent:"select.search.matches"})),!0},gQ=pr((O,{query:e})=>{let{state:t}=O,{from:i,to:r}=t.selection.main;if(t.readOnly)return!1;let n=e.nextMatch(t,i,i);if(!n)return!1;let s=n,a=[],o,l,c=[];s.from==i&&s.to==r&&(l=t.toText(e.getReplacement(s)),a.push({from:s.from,to:s.to,insert:l}),s=e.nextMatch(t,s.from,s.to),c.push(T.announce.of(t.phrase("replaced match on line $",t.doc.lineAt(i).number)+".")));let h=O.state.changes(a);return s&&(o=S.single(s.from,s.to).map(h),c.push($l(O,s)),c.push(t.facet(Qi).scrollToMatch(o.main,O))),O.dispatch({changes:h,selection:o,effects:c,userEvent:"input.replace"}),!0}),m1=pr((O,{query:e})=>{if(O.state.readOnly)return!1;let t=e.matchAll(O.state,1e9).map(r=>{let{from:n,to:s}=r;return{from:n,to:s,insert:e.getReplacement(r)}});if(!t.length)return!1;let i=O.state.phrase("replaced $ matches",t.length)+".";return O.dispatch({changes:t,effects:T.announce.of(i),userEvent:"input.replace.all"}),!0});function Ql(O){return O.state.facet(Qi).createPanel(O)}function hl(O,e){var t,i,r,n,s;let a=O.selection.main,o=a.empty||a.to>a.from+100?"":O.sliceDoc(a.from,a.to);if(e&&!o)return e;let l=O.facet(Qi);return new os({search:((t=e?.literal)!==null&&t!==void 0?t:l.literal)?o:o.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:l.caseSensitive,literal:(r=e?.literal)!==null&&r!==void 0?r:l.literal,regexp:(n=e?.regexp)!==null&&n!==void 0?n:l.regexp,wholeWord:(s=e?.wholeWord)!==null&&s!==void 0?s:l.wholeWord})}function TQ(O){let e=bO(O,Ql);return e&&e.dom.querySelector("[main-field]")}function bQ(O){let e=TQ(O);e&&e==O.root.activeElement&&e.select()}var yQ=O=>{let e=O.state.field(oO,!1);if(e&&e.panel){let t=TQ(O);if(t&&t!=O.root.activeElement){let i=hl(O.state,e.query.spec);i.valid&&O.dispatch({effects:$r.of(i)}),t.focus(),t.select()}}else O.dispatch({effects:[ul.of(!0),e?$r.of(hl(O.state,e.query.spec)):V.appendConfig.of(P1)]});return!0},xQ=O=>{let e=O.state.field(oO,!1);if(!e||!e.panel)return!1;let t=bO(O,Ql);return t&&t.dom.contains(O.root.activeElement)&&O.focus(),O.dispatch({effects:ul.of(!1)}),!0},kQ=[{key:"Mod-f",run:yQ,scope:"editor search-panel"},{key:"F3",run:fs,shift:ds,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:fs,shift:ds,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:xQ,scope:"editor search-panel"},{key:"Mod-Shift-l",run:p1},{key:"Mod-Alt-g",run:e1},{key:"Mod-d",run:c1,preventDefault:!0}],fl=class{constructor(e){this.view=e;let t=this.query=e.state.field(oO).query.spec;this.commit=this.commit.bind(this),this.searchField=N("input",{value:t.search,placeholder:Ne(e,"Find"),"aria-label":Ne(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=N("input",{value:t.replace,placeholder:Ne(e,"Replace"),"aria-label":Ne(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=N("input",{type:"checkbox",name:"case",form:"",checked:t.caseSensitive,onchange:this.commit}),this.reField=N("input",{type:"checkbox",name:"re",form:"",checked:t.regexp,onchange:this.commit}),this.wordField=N("input",{type:"checkbox",name:"word",form:"",checked:t.wholeWord,onchange:this.commit});function i(r,n,s){return N("button",{class:"cm-button",name:r,onclick:n,type:"button"},s)}this.dom=N("div",{onkeydown:r=>this.keydown(r),class:"cm-search"},[this.searchField,i("next",()=>fs(e),[Ne(e,"next")]),i("prev",()=>ds(e),[Ne(e,"previous")]),i("select",()=>$1(e),[Ne(e,"all")]),N("label",null,[this.caseField,Ne(e,"match case")]),N("label",null,[this.reField,Ne(e,"regexp")]),N("label",null,[this.wordField,Ne(e,"by word")]),...e.state.readOnly?[]:[N("br"),this.replaceField,i("replace",()=>gQ(e),[Ne(e,"replace")]),i("replaceAll",()=>m1(e),[Ne(e,"replace all")])],N("button",{name:"close",onclick:()=>xQ(e),"aria-label":Ne(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new os({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:$r.of(e)}))}keydown(e){bd(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?ds:fs)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),gQ(this.view))}update(e){for(let t of e.transactions)for(let i of t.effects)i.is($r)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(Qi).top}};function Ne(O,e){return O.state.phrase(e)}var Os=30,is=/[\s\.,:;?!]/;function $l(O,{from:e,to:t}){let i=O.state.doc.lineAt(e),r=O.state.doc.lineAt(t).to,n=Math.max(i.from,e-Os),s=Math.min(r,t+Os),a=O.state.sliceDoc(n,s);if(n!=i.from){for(let o=0;oa.length-Os;o--)if(!is.test(a[o-1])&&is.test(a[o])){a=a.slice(0,o);break}}return T.announce.of(`${O.state.phrase("current match")}. ${a} ${O.state.phrase("on line")} ${i.number}.`)}var g1=T.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),P1=[oO,ze.low(Q1),g1];var $i=class{constructor(e,t,i,r){this.state=e,this.pos=t,this.explicit=i,this.view=r,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let t=U(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),i=Math.max(t.from,this.pos-250),r=t.text.slice(i-t.from,this.pos-t.from),n=r.search(zQ(e,!1));return n<0?null:{from:i+n,to:this.pos,text:r.slice(n)}}get aborted(){return this.abortListeners==null}addEventListener(e,t,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(t),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function wQ(O){let e=Object.keys(O).join(""),t=/\w/.test(e);return t&&(e=e.replace(/\w/g,"")),`[${t?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function S1(O){let e=Object.create(null),t=Object.create(null);for(let{label:r}of O){e[r[0]]=!0;for(let n=1;ntypeof r=="string"?{label:r}:r),[t,i]=e.every(r=>/^\w+$/.test(r.label))?[/\w*$/,/\w+$/]:S1(e);return r=>{let n=r.matchBefore(i);return n||r.explicit?{from:n?n.from:r.pos,options:e,validFor:t}:null}}function cO(O,e){return t=>{for(let i=U(t.state).resolveInner(t.pos,-1);i;i=i.parent){if(O.indexOf(i.name)>-1)return null;if(i.type.isTop)break}return e(t)}}var Qs=class{constructor(e,t,i,r){this.completion=e,this.source=t,this.match=i,this.score=r}};function RO(O){return O.selection.main.from}function zQ(O,e){var t;let{source:i}=O,r=e&&i[0]!="^",n=i[i.length-1]!="$";return!r&&!n?O:new RegExp(`${r?"^":""}(?:${i})${n?"$":""}`,(t=O.flags)!==null&&t!==void 0?t:O.ignoreCase?"i":"")}var Zl=qe.define();function X1(O,e,t,i){let{main:r}=O.selection,n=t-r.from,s=i-r.from;return{...O.changeByRange(a=>{if(a!=r&&t!=i&&O.sliceDoc(a.from+n,a.from+s)!=O.sliceDoc(t,i))return{range:a};let o=O.toText(e);return{changes:{from:a.from+n,to:i==r.from?a.to:a.from+s,insert:o},range:S.cursor(a.from+n+o.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}var ZQ=new WeakMap;function T1(O){if(!Array.isArray(O))return O;let e=ZQ.get(O);return e||ZQ.set(O,e=zt(O)),e}var $s=V.define(),mr=V.define(),Pl=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&X<=57||X>=97&&X<=122?2:X>=65&&X<=90?1:0:(x=Ri(X))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!g||k==1&&p||y==0&&k!=0)&&(t[h]==X||i[h]==X&&(f=!0)?s[h++]=g:s.length&&(m=!1)),y=k,g+=Me(X)}return h==o&&s[0]==0&&m?this.result(-100+(f?-200:0),s,e):u==o&&Q==0?this.ret(-200-e.length+($==e.length?0:-100),[0,$]):a>-1?this.ret(-700-e.length,[a,a+this.pattern.length]):u==o?this.ret(-900-e.length,[Q,$]):h==o?this.result(-100+(f?-200:0)+-700+(m?0:-1100),s,e):t.length==2?null:this.result((r[0]?-700:0)+-200+-1100,r,e)}result(e,t,i){let r=[],n=0;for(let s of t){let a=s+(this.astral?Me(Se(i,s)):1);n&&r[n-1]==s?r[n-1]=a:(r[n++]=s,r[n++]=a)}return this.ret(e-i.length,r)}},Sl=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:b1,filterStrict:!1,compareCompletions:(e,t)=>(e.sortText||e.label).localeCompare(t.sortText||t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>i=>vQ(e(i),t(i)),optionClass:(e,t)=>i=>vQ(e(i),t(i)),addToOptions:(e,t)=>e.concat(t),filterStrict:(e,t)=>e||t})}});function vQ(O,e){return O?e?O+" "+e:O:e}function b1(O,e,t,i,r,n){let s=O.textDirection==H.RTL,a=s,o=!1,l="top",c,h,f=e.left-r.left,u=r.right-e.right,Q=i.right-i.left,$=i.bottom-i.top;if(a&&f=$||g>e.top?c=t.bottom-e.top:(l="bottom",c=e.bottom-t.top)}let p=(e.bottom-e.top)/n.offsetHeight,m=(e.right-e.left)/n.offsetWidth;return{style:`${l}: ${c/p}px; max-width: ${h/m}px`,class:"cm-completionInfo-"+(o?s?"left-narrow":"right-narrow":a?"left":"right")}}function y1(O){let e=O.addToOptions.slice();return O.icons&&e.push({render(t){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),t.type&&i.classList.add(...t.type.split(/\s+/g).map(r=>"cm-completionIcon-"+r)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(t,i,r,n){let s=document.createElement("span");s.className="cm-completionLabel";let a=t.displayLabel||t.label,o=0;for(let l=0;lo&&s.appendChild(document.createTextNode(a.slice(o,c)));let f=s.appendChild(document.createElement("span"));f.appendChild(document.createTextNode(a.slice(c,h))),f.className="cm-completionMatchedText",o=h}return ot.position-i.position).map(t=>t.render)}function pl(O,e,t){if(O<=t)return{from:0,to:O};if(e<0&&(e=0),e<=O>>1){let r=Math.floor(e/t);return{from:r*t,to:(r+1)*t}}let i=Math.floor((O-e)/t);return{from:O-(i+1)*t,to:O-i*t}}var Xl=class{constructor(e,t,i){this.view=e,this.stateField=t,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:o=>this.placeInfo(o),key:this},this.space=null,this.currentClass="";let r=e.state.field(t),{options:n,selected:s}=r.open,a=e.state.facet(ge);this.optionContent=y1(a),this.optionClass=a.optionClass,this.tooltipClass=a.tooltipClass,this.range=pl(n.length,s,a.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",o=>{let{options:l}=e.state.field(t).open;for(let c=o.target,h;c&&c!=this.dom;c=c.parentNode)if(c.nodeName=="LI"&&(h=/-(\d+)$/.exec(c.id))&&+h[1]{let l=e.state.field(this.stateField,!1);l&&l.tooltip&&e.state.facet(ge).closeOnBlur&&o.relatedTarget!=e.contentDOM&&e.dispatch({effects:mr.of(null)})}),this.showOptions(n,r.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var t;let i=e.state.field(this.stateField),r=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=r){let{options:n,selected:s,disabled:a}=i.open;(!r.open||r.open.options!=n)&&(this.range=pl(n.length,s,e.state.facet(ge).maxRenderedOptions),this.showOptions(n,i.id)),this.updateSel(),a!=((t=r.open)===null||t===void 0?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!a)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of t.split(" "))i&&this.dom.classList.add(i);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;(t.selected>-1&&t.selected=this.range.to)&&(this.range=pl(t.options.length,t.selected,this.view.state.facet(ge).maxRenderedOptions),this.showOptions(t.options,e.id));let i=this.updateSelectedOption(t.selected);if(i){this.destroyInfo();let{completion:r}=t.options[t.selected],{info:n}=r;if(!n)return;let s=typeof n=="string"?document.createTextNode(n):n(r);if(!s)return;"then"in s?s.then(a=>{a&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(a,r)}).catch(a=>Xe(this.view.state,a,"completion info")):(this.addInfoPane(s,r),i.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,t){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",i.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:r,destroy:n}=e;i.appendChild(r),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let i=this.list.firstChild,r=this.range.from;i;i=i.nextSibling,r++)i.nodeName!="LI"||!i.id?r--:r==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),t=i):i.hasAttribute("aria-selected")&&(i.removeAttribute("aria-selected"),i.removeAttribute("aria-describedby"));return t&&k1(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),r=e.getBoundingClientRect(),n=this.space;if(!n){let s=this.dom.ownerDocument.documentElement;n={left:0,top:0,right:s.clientWidth,bottom:s.clientHeight}}return r.top>Math.min(n.bottom,t.bottom)-10||r.bottom{s.target==r&&s.preventDefault()});let n=null;for(let s=i.from;si.from||i.from==0))if(n=f,typeof l!="string"&&l.header)r.appendChild(l.header(l));else{let u=r.appendChild(document.createElement("completion-section"));u.textContent=f}}let c=r.appendChild(document.createElement("li"));c.id=t+"-"+s,c.setAttribute("role","option");let h=this.optionClass(a);h&&(c.className=h);for(let f of this.optionContent){let u=f(a,this.view.state,this.view,o);u&&c.appendChild(u)}}return i.from&&r.classList.add("cm-completionListIncompleteTop"),i.tonew Xl(t,O,e)}function k1(O,e){let t=O.getBoundingClientRect(),i=e.getBoundingClientRect(),r=t.height/O.offsetHeight;i.topt.bottom&&(O.scrollTop+=(i.bottom-t.bottom)/r)}function YQ(O){return(O.boost||0)*100+(O.apply?10:0)+(O.info?5:0)+(O.type?1:0)}function w1(O,e){let t=[],i=null,r=null,n=c=>{t.push(c);let{section:h}=c.completion;if(h){i||(i=[]);let f=typeof h=="string"?h:h.name;i.some(u=>u.name==f)||i.push(typeof h=="string"?{name:f}:h)}},s=e.facet(ge);for(let c of O)if(c.hasResult()){let h=c.result.getMatch;if(c.result.filter===!1)for(let f of c.result.options)n(new Qs(f,c.source,h?h(f):[],1e9-t.length));else{let f=e.sliceDoc(c.from,c.to),u,Q=s.filterStrict?new Sl(f):new Pl(f);for(let $ of c.result.options)if(u=Q.match($.label)){let p=$.displayLabel?h?h($,u.matched):[]:u.matched,m=u.score+($.boost||0);if(n(new Qs($,c.source,p,m)),typeof $.section=="object"&&$.section.rank==="dynamic"){let{name:g}=$.section;r||(r=Object.create(null)),r[g]=Math.max(m,r[g]||-1e9)}}}}if(i){let c=Object.create(null),h=0,f=(u,Q)=>(u.rank==="dynamic"&&Q.rank==="dynamic"?r[Q.name]-r[u.name]:0)||(typeof u.rank=="number"?u.rank:1e9)-(typeof Q.rank=="number"?Q.rank:1e9)||(u.namef.score-h.score||l(h.completion,f.completion))){let h=c.completion;!o||o.label!=h.label||o.detail!=h.detail||o.type!=null&&h.type!=null&&o.type!=h.type||o.apply!=h.apply||o.boost!=h.boost?a.push(c):YQ(c.completion)>YQ(o)&&(a[a.length-1]=c),o=c.completion}return a}var Tl=class O{constructor(e,t,i,r,n,s){this.options=e,this.attrs=t,this.tooltip=i,this.timestamp=r,this.selected=n,this.disabled=s}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new O(this.options,_Q(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,i,r,n,s){if(r&&!s&&e.some(l=>l.isPending))return r.setDisabled();let a=w1(e,t);if(!a.length)return r&&e.some(l=>l.isPending)?r.setDisabled():null;let o=t.facet(ge).selectOnOpen?0:-1;if(r&&r.selected!=o&&r.selected!=-1){let l=r.options[r.selected].completion;for(let c=0;cc.hasResult()?Math.min(l,c.from):l,1e8),create:V1,above:n.aboveCursor},r?r.timestamp:Date.now(),o,!1)}map(e){return new O(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new O(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},bl=class O{constructor(e,t,i){this.active=e,this.id=t,this.open=i}static start(){return new O(_1,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:t}=e,i=t.facet(ge),n=(i.override||t.languageDataAt("autocomplete",RO(t)).map(T1)).map(o=>(this.active.find(c=>c.source==o)||new qt(o,this.active.some(c=>c.state!=0)?1:0)).update(e,i));n.length==this.active.length&&n.every((o,l)=>o==this.active[l])&&(n=this.active);let s=this.open,a=e.effects.some(o=>o.is(vl));s&&e.docChanged&&(s=s.map(e.changes)),e.selection||n.some(o=>o.hasResult()&&e.changes.touchesRange(o.from,o.to))||!Z1(n,this.active)||a?s=Tl.build(n,t,this.id,s,i,a):s&&s.disabled&&!n.some(o=>o.isPending)&&(s=null),!s&&n.every(o=>!o.isPending)&&n.some(o=>o.hasResult())&&(n=n.map(o=>o.hasResult()?new qt(o.source,0):o));for(let o of e.effects)o.is(WQ)&&(s=s&&s.setSelected(o.value,this.id));return n==this.active&&s==this.open?this:new O(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?v1:Y1}};function Z1(O,e){if(O==e)return!0;for(let t=0,i=0;;){for(;t-1&&(t["aria-activedescendant"]=O+"-"+e),t}var _1=[];function UQ(O,e){if(O.isUserEvent("input.complete")){let i=O.annotation(Zl);if(i&&e.activateOnCompletion(i))return 12}let t=O.isUserEvent("input.type");return t&&e.activateOnTyping?5:t?1:O.isUserEvent("delete.backward")?2:O.selection?8:O.docChanged?16:0}var qt=class O{constructor(e,t,i=!1){this.source=e,this.state=t,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,t){let i=UQ(e,t),r=this;(i&8||i&16&&this.touches(e))&&(r=new O(r.source,0)),i&4&&r.state==0&&(r=new O(this.source,1)),r=r.updateFor(e,i);for(let n of e.effects)if(n.is($s))r=new O(r.source,1,n.value);else if(n.is(mr))r=new O(r.source,0);else if(n.is(vl))for(let s of n.value)s.source==r.source&&(r=s);return r}updateFor(e,t){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(RO(e.state))}},ps=class O extends qt{constructor(e,t,i,r,n,s){super(e,3,t),this.limit=i,this.result=r,this.from=n,this.to=s}hasResult(){return!0}updateFor(e,t){var i;if(!(t&3))return this.map(e.changes);let r=this.result;r.map&&!e.changes.empty&&(r=r.map(r,e.changes));let n=e.changes.mapPos(this.from),s=e.changes.mapPos(this.to,1),a=RO(e.state);if(a>s||!r||t&2&&(RO(e.startState)==this.from||at.map(e))}}),WQ=V.define(),Ce=ce.define({create(){return bl.start()},update(O,e){return O.update(e)},provide:O=>[er.from(O,e=>e.tooltip),T.contentAttributes.from(O,e=>e.attrs)]});function Yl(O,e){let t=e.completion.apply||e.completion.label,i=O.state.field(Ce).active.find(r=>r.source==e.source);return i instanceof ps?(typeof t=="string"?O.dispatch({...X1(O.state,t,i.from,i.to),annotations:Zl.of(e.completion)}):t(O,e.completion,i.from,i.to),!0):!1}var V1=x1(Ce,Yl);function us(O,e="option"){return t=>{let i=t.state.field(Ce,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+r*(O?1:-1):O?0:s-1;return a<0?a=e=="page"?0:s-1:a>=s&&(a=e=="page"?s-1:0),t.dispatch({effects:WQ.of(a)}),!0}}var q1=O=>{let e=O.state.field(Ce,!1);return O.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampO.state.field(Ce,!1)?(O.dispatch({effects:$s.of(!0)}),!0):!1,z1=O=>{let e=O.state.field(Ce,!1);return!e||!e.active.some(t=>t.state!=0)?!1:(O.dispatch({effects:mr.of(null)}),!0)},yl=class{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}},U1=50,W1=1e3,j1=he.fromClass(class{constructor(O){this.view=O,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of O.state.field(Ce).active)e.isPending&&this.startQuery(e)}update(O){let e=O.state.field(Ce),t=O.state.facet(ge);if(!O.selectionSet&&!O.docChanged&&O.startState.field(Ce)==e)return;let i=O.transactions.some(n=>{let s=UQ(n,t);return s&8||(n.selection||n.docChanged)&&!(s&3)});for(let n=0;nU1&&Date.now()-s.time>W1){for(let a of s.context.abortListeners)try{a()}catch(o){Xe(this.view.state,o)}s.context.abortListeners=null,this.running.splice(n--,1)}else s.updates.push(...O.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),O.transactions.some(n=>n.effects.some(s=>s.is($s)))&&(this.pendingStart=!0);let r=this.pendingStart?50:t.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(n=>n.isPending&&!this.running.some(s=>s.active.source==n.source))?setTimeout(()=>this.startUpdate(),r):-1,this.composing!=0)for(let n of O.transactions)n.isUserEvent("input.type")?this.composing=2:this.composing==2&&n.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:O}=this.view,e=O.field(Ce);for(let t of e.active)t.isPending&&!this.running.some(i=>i.active.source==t.source)&&this.startQuery(t);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(ge).updateSyncTime))}startQuery(O){let{state:e}=this.view,t=RO(e),i=new $i(e,t,O.explicit,this.view),r=new yl(O,i);this.running.push(r),Promise.resolve(O.source(i)).then(n=>{r.context.aborted||(r.done=n||null,this.scheduleAccept())},n=>{this.view.dispatch({effects:mr.of(null)}),Xe(this.view.state,n)})}scheduleAccept(){this.running.every(O=>O.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(ge).updateSyncTime))}accept(){var O;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],t=this.view.state.facet(ge),i=this.view.state.field(Ce);for(let r=0;ra.source==n.active.source);if(s&&s.isPending)if(n.done==null){let a=new qt(n.active.source,0);for(let o of n.updates)a=a.update(o,t);a.isPending||e.push(a)}else this.startQuery(s)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:vl.of(e)})}},{eventHandlers:{blur(O){let e=this.view.state.field(Ce,!1);if(e&&e.tooltip&&this.view.state.facet(ge).closeOnBlur){let t=e.open&&To(this.view,e.open.tooltip);(!t||!t.dom.contains(O.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:mr.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:$s.of(!1)}),20),this.composing=0}}}),C1=typeof navigator=="object"&&/Win/.test(navigator.platform),G1=ze.highest(T.domEventHandlers({keydown(O,e){let t=e.state.field(Ce,!1);if(!t||!t.open||t.open.disabled||t.open.selected<0||O.key.length>1||O.ctrlKey&&!(C1&&O.altKey)||O.metaKey)return!1;let i=t.open.options[t.open.selected],r=t.active.find(s=>s.source==i.source),n=i.completion.commitCharacters||r.result.commitCharacters;return n&&n.indexOf(O.key)>-1&&Yl(e,i),!1}})),jQ=T.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}}),xl=class{constructor(e,t,i,r){this.field=e,this.line=t,this.from=i,this.to=r}},kl=class O{constructor(e,t,i){this.field=e,this.from=t,this.to=i}map(e){let t=e.mapPos(this.from,-1,pe.TrackDel),i=e.mapPos(this.to,1,pe.TrackDel);return t==null||i==null?null:new O(this.field,t,i)}},wl=class O{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let i=[],r=[t],n=e.doc.lineAt(t),s=/^\s*/.exec(n.text)[0];for(let o of this.lines){if(i.length){let l=s,c=/^\t*/.exec(o)[0].length;for(let h=0;hnew kl(o.field,r[o.line]+o.from,r[o.line]+o.to));return{text:i,ranges:a}}static parse(e){let t=[],i=[],r=[],n;for(let s of e.split(/\r\n?|\n/)){for(;n=/[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(s);){let a=n[1]?+n[1]:null,o=n[2]||n[3]||"",l=-1,c=o.replace(/\\[{}]/g,h=>h[1]);for(let h=0;h=l&&f.field++}for(let h of r)if(h.line==i.length&&h.from>n.index){let f=n[2]?3+(n[1]||"").length:2;h.from-=f,h.to-=f}r.push(new xl(l,i.length,n.index,n.index+c.length)),s=s.slice(0,n.index)+o+s.slice(n.index+n[0].length)}s=s.replace(/\\([{}])/g,(a,o,l)=>{for(let c of r)c.line==i.length&&c.from>l&&(c.from--,c.to--);return o}),i.push(s)}return new O(i,r)}},E1=Y.widget({widget:new class extends _e{toDOM(){let O=document.createElement("span");return O.className="cm-snippetFieldPosition",O}ignoreEvent(){return!1}}}),A1=Y.mark({class:"cm-snippetField"}),pi=class O{constructor(e,t){this.ranges=e,this.active=t,this.deco=Y.set(e.map(i=>(i.from==i.to?E1:A1).range(i.from,i.to)),!0)}map(e){let t=[];for(let i of this.ranges){let r=i.map(e);if(!r)return null;t.push(r)}return new O(t,this.active)}selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(i=>i.field==this.active&&i.from<=t.from&&i.to>=t.to))}},Sr=V.define({map(O,e){return O&&O.map(e)}}),L1=V.define(),gr=ce.define({create(){return null},update(O,e){for(let t of e.effects){if(t.is(Sr))return t.value;if(t.is(L1)&&O)return new pi(O.ranges,t.value)}return O&&e.docChanged&&(O=O.map(e.changes)),O&&e.selection&&!O.selectionInsideField(e.selection)&&(O=null),O},provide:O=>T.decorations.from(O,e=>e?e.deco:Y.none)});function _l(O,e){return S.create(O.filter(t=>t.field==e).map(t=>S.range(t.from,t.to)))}function M1(O){let e=wl.parse(O);return(t,i,r,n)=>{let{text:s,ranges:a}=e.instantiate(t.state,r),{main:o}=t.state.selection,l={changes:{from:r,to:n==o.from?o.to:n,insert:E.of(s)},scrollIntoView:!0,annotations:i?[Zl.of(i),Qe.userEvent.of("input.complete")]:void 0};if(a.length&&(l.selection=_l(a,0)),a.some(c=>c.field>0)){let c=new pi(a,0),h=l.effects=[Sr.of(c)];t.state.field(gr,!1)===void 0&&h.push(V.appendConfig.of([gr,F1,H1,jQ]))}t.dispatch(t.state.update(l))}}function CQ(O){return({state:e,dispatch:t})=>{let i=e.field(gr,!1);if(!i||O<0&&i.active==0)return!1;let r=i.active+O,n=O>0&&!i.ranges.some(s=>s.field==r+O);return t(e.update({selection:_l(i.ranges,r),effects:Sr.of(n?null:new pi(i.ranges,r)),scrollIntoView:!0})),!0}}var D1=({state:O,dispatch:e})=>O.field(gr,!1)?(e(O.update({effects:Sr.of(null)})),!0):!1,I1=CQ(1),B1=CQ(-1);var N1=[{key:"Tab",run:I1,shift:B1},{key:"Escape",run:D1}],RQ=Z.define({combine(O){return O.length?O[0]:N1}}),F1=ze.highest(Xt.compute([RQ],O=>O.facet(RQ)));function W(O,e){return{...e,apply:M1(O)}}var H1=T.domEventHandlers({mousedown(O,e){let t=e.state.field(gr,!1),i;if(!t||(i=e.posAtCoords({x:O.clientX,y:O.clientY}))==null)return!1;let r=t.ranges.find(n=>n.from<=i&&n.to>=i);return!r||r.field==t.active?!1:(e.dispatch({selection:_l(t.ranges,r.field),effects:Sr.of(t.ranges.some(n=>n.field>r.field)?new pi(t.ranges,r.field):null),scrollIntoView:!0}),!0)}});var Pr={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},_O=V.define({map(O,e){let t=e.mapPos(O,-1,pe.TrackAfter);return t??void 0}}),Rl=new class extends tt{};Rl.startSide=1;Rl.endSide=-1;var GQ=ce.define({create(){return M.empty},update(O,e){if(O=O.map(e.changes),e.selection){let t=e.state.doc.lineAt(e.selection.main.head);O=O.update({filter:i=>i>=t.from&&i<=t.to})}for(let t of e.effects)t.is(_O)&&(O=O.update({add:[Rl.range(t.value,t.value+1)]}));return O}});function EQ(){return[J1,GQ]}var gl="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function AQ(O){for(let e=0;e{if((K1?O.composing:O.compositionStarted)||O.state.readOnly)return!1;let r=O.state.selection.main;if(i.length>2||i.length==2&&Me(Se(i,0))==1||e!=r.from||t!=r.to)return!1;let n=t0(O.state,i);return n?(O.dispatch(n),!0):!1}),e0=({state:O,dispatch:e})=>{if(O.readOnly)return!1;let i=LQ(O,O.selection.main.head).brackets||Pr.brackets,r=null,n=O.changeByRange(s=>{if(s.empty){let a=O0(O.doc,s.head);for(let o of i)if(o==a&&ms(O.doc,s.head)==AQ(Se(o,0)))return{changes:{from:s.head-o.length,to:s.head+o.length},range:S.cursor(s.head-o.length)}}return{range:r=s}});return r||e(O.update(n,{scrollIntoView:!0,userEvent:"delete.backward"})),!r},MQ=[{key:"Backspace",run:e0}];function t0(O,e){let t=LQ(O,O.selection.main.head),i=t.brackets||Pr.brackets;for(let r of i){let n=AQ(Se(r,0));if(e==r)return n==r?n0(O,r,i.indexOf(r+r+r)>-1,t):i0(O,r,n,t.before||Pr.before);if(e==n&&DQ(O,O.selection.main.from))return r0(O,r,n)}return null}function DQ(O,e){let t=!1;return O.field(GQ).between(0,O.doc.length,i=>{i==e&&(t=!0)}),t}function ms(O,e){let t=O.sliceString(e,e+2);return t.slice(0,Me(Se(t,0)))}function O0(O,e){let t=O.sliceString(e-2,e);return Me(Se(t,0))==t.length?t:t.slice(1)}function i0(O,e,t,i){let r=null,n=O.changeByRange(s=>{if(!s.empty)return{changes:[{insert:e,from:s.from},{insert:t,from:s.to}],effects:_O.of(s.to+e.length),range:S.range(s.anchor+e.length,s.head+e.length)};let a=ms(O.doc,s.head);return!a||/\s/.test(a)||i.indexOf(a)>-1?{changes:{insert:e+t,from:s.head},effects:_O.of(s.head+e.length),range:S.cursor(s.head+e.length)}:{range:r=s}});return r?null:O.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function r0(O,e,t){let i=null,r=O.changeByRange(n=>n.empty&&ms(O.doc,n.head)==t?{changes:{from:n.head,to:n.head+t.length,insert:t},range:S.cursor(n.head+t.length)}:i={range:n});return i?null:O.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function n0(O,e,t,i){let r=i.stringPrefixes||Pr.stringPrefixes,n=null,s=O.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:e,from:a.to}],effects:_O.of(a.to+e.length),range:S.range(a.anchor+e.length,a.head+e.length)};let o=a.head,l=ms(O.doc,o),c;if(l==e){if(VQ(O,o))return{changes:{insert:e+e,from:o},effects:_O.of(o+e.length),range:S.cursor(o+e.length)};if(DQ(O,o)){let f=t&&O.sliceDoc(o,o+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:o,to:o+f.length,insert:f},range:S.cursor(o+f.length)}}}else{if(t&&O.sliceDoc(o-2*e.length,o)==e+e&&(c=qQ(O,o-2*e.length,r))>-1&&VQ(O,c))return{changes:{insert:e+e+e+e,from:o},effects:_O.of(o+e.length),range:S.cursor(o+e.length)};if(O.charCategorizer(o)(l)!=ee.Word&&qQ(O,o,r)>-1&&!s0(O,o,e,r))return{changes:{insert:e+e,from:o},effects:_O.of(o+e.length),range:S.cursor(o+e.length)}}return{range:n=a}});return n?null:O.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function VQ(O,e){let t=U(O).resolveInner(e+1);return t.parent&&t.from==e}function s0(O,e,t,i){let r=U(O).resolveInner(e,-1),n=i.reduce((s,a)=>Math.max(s,a.length),0);for(let s=0;s<5;s++){let a=O.sliceDoc(r.from,Math.min(r.to,r.from+t.length+n)),o=a.indexOf(t);if(!o||o>-1&&i.indexOf(a.slice(0,o))>-1){let c=r.firstChild;for(;c&&c.from==r.from&&c.to-c.from>t.length+o;){if(O.sliceDoc(c.to-t.length,c.to)==t)return!1;c=c.firstChild}return!0}let l=r.to==e&&r.parent;if(!l)break;r=l}return!1}function qQ(O,e,t){let i=O.charCategorizer(e);if(i(O.sliceDoc(e-1,e))!=ee.Word)return e;for(let r of t){let n=e-r.length;if(O.sliceDoc(n,e)==r&&i(O.sliceDoc(n-1,n))!=ee.Word)return n}return-1}function IQ(O={}){return[G1,Ce,ge.of(O),j1,a0,jQ]}var Vl=[{key:"Ctrl-Space",run:ml},{mac:"Alt-`",run:ml},{mac:"Alt-i",run:ml},{key:"Escape",run:z1},{key:"ArrowDown",run:us(!0)},{key:"ArrowUp",run:us(!1)},{key:"PageDown",run:us(!0,"page")},{key:"PageUp",run:us(!1,"page")},{key:"Enter",run:q1}],a0=ze.highest(Xt.computeN([ge],O=>O.facet(ge).defaultKeymap?[Vl]:[]));var Ps=class{constructor(e,t,i){this.from=e,this.to=t,this.diagnostic=i}},VO=class O{constructor(e,t,i){this.diagnostics=e,this.panel=t,this.selected=i}static init(e,t,i){let r=i.facet(Xr).markerFilter;r&&(e=r(e,i));let n=e.slice().sort((u,Q)=>u.from-Q.from||u.to-Q.to),s=new Le,a=[],o=0,l=i.doc.iter(),c=0,h=i.doc.length;for(let u=0;;){let Q=u==n.length?null:n[u];if(!Q&&!a.length)break;let $,p;if(a.length)$=o,p=a.reduce((P,y)=>Math.min(P,y.to),Q&&Q.from>$?Q.from:1e8);else{if($=Q.from,$>h)break;p=Q.to,a.push(Q),u++}for(;uP.from||P.to==$))a.push(P),u++,p=Math.min(P.to,p);else{p=Math.min(P.from,p);break}}p=Math.min(p,h);let m=!1;if(a.some(P=>P.from==$&&(P.to==p||p==h))&&(m=$==p,!m&&p-$<10)){let P=$-(c+l.value.length);P>0&&(l.next(P),c=$);for(let y=$;;){if(y>=p){m=!0;break}if(!l.lineBreak&&c+l.value.length>y)break;y=c+l.value.length,c+=l.value.length,l.next()}}let g=m0(a);if(m)s.add($,$,Y.widget({widget:new ql(g),diagnostics:a.slice()}));else{let P=a.reduce((y,X)=>X.markClass?y+" "+X.markClass:y,"");s.add($,p,Y.mark({class:"cm-lintRange cm-lintRange-"+g+P,diagnostics:a.slice(),inclusiveEnd:a.some(y=>y.to>p)}))}if(o=p,o==h)break;for(let P=0;P{if(!(e&&s.diagnostics.indexOf(e)<0))if(!i)i=new Ps(r,n,e||s.diagnostics[0]);else{if(s.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new Ps(i.from,n,i.diagnostic)}}),i}function o0(O,e){let t=e.pos,i=e.end||t,r=O.state.facet(Xr).hideOn(O,t,i);if(r!=null)return r;let n=O.startState.doc.lineAt(e.pos);return!!(O.effects.some(s=>s.is(FQ))||O.changes.touchesRange(n.from,Math.max(n.to,i)))}function l0(O,e){return O.field(Fe,!1)?e:e.concat(V.appendConfig.of(g0))}var FQ=V.define(),zl=V.define(),HQ=V.define(),Fe=ce.define({create(){return new VO(Y.none,null,null)},update(O,e){if(e.docChanged&&O.diagnostics.size){let t=O.diagnostics.map(e.changes),i=null,r=O.panel;if(O.selected){let n=e.changes.mapPos(O.selected.from,1);i=mi(t,O.selected.diagnostic,n)||mi(t,null,n)}!t.size&&r&&e.state.facet(Xr).autoPanel&&(r=null),O=new VO(t,r,i)}for(let t of e.effects)if(t.is(FQ)){let i=e.state.facet(Xr).autoPanel?t.value.length?Tr.open:null:O.panel;O=VO.init(t.value,i,e.state)}else t.is(zl)?O=new VO(O.diagnostics,t.value?Tr.open:null,O.selected):t.is(HQ)&&(O=new VO(O.diagnostics,O.panel,t.value));return O},provide:O=>[TO.from(O,e=>e.panel),T.decorations.from(O,e=>e.diagnostics)]});var c0=Y.mark({class:"cm-lintRange cm-lintRange-active"});function h0(O,e,t){let{diagnostics:i}=O.state.field(Fe),r,n=-1,s=-1;i.between(e-(t<0?1:0),e+(t>0?1:0),(o,l,{spec:c})=>{if(e>=o&&e<=l&&(o==l||(e>o||t>0)&&(ee$(O,t,!1)))}var d0=O=>{let e=O.state.field(Fe,!1);(!e||!e.panel)&&O.dispatch({effects:l0(O.state,[zl.of(!0)])});let t=bO(O,Tr.open);return t&&t.dom.querySelector(".cm-panel-lint ul").focus(),!0},BQ=O=>{let e=O.state.field(Fe,!1);return!e||!e.panel?!1:(O.dispatch({effects:zl.of(!1)}),!0)},u0=O=>{let e=O.state.field(Fe,!1);if(!e)return!1;let t=O.state.selection.main,i=e.diagnostics.iter(t.to+1);return!i.value&&(i=e.diagnostics.iter(0),!i.value||i.from==t.from&&i.to==t.to)?!1:(O.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var KQ=[{key:"Mod-Shift-m",run:d0,preventDefault:!0},{key:"F8",run:u0}];var Xr=Z.define({combine(O){return{sources:O.map(e=>e.source).filter(e=>e!=null),...xe(O.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:NQ,tooltipFilter:NQ,needsRefresh:(e,t)=>e?t?i=>e(i)||t(i):e:t,hideOn:(e,t)=>e?t?(i,r,n)=>e(i,r,n)||t(i,r,n):e:t,autoPanel:(e,t)=>e||t})}}});function NQ(O,e){return O?e?(t,i)=>e(O(t,i),i):O:e}function JQ(O){let e=[];if(O)e:for(let{name:t}of O){for(let i=0;in.toLowerCase()==r.toLowerCase())){e.push(r);continue e}}e.push("")}return e}function e$(O,e,t){var i;let r=t?JQ(e.actions):[];return N("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},N("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(O):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((n,s)=>{let a=!1,o=u=>{if(u.preventDefault(),a)return;a=!0;let Q=mi(O.state.field(Fe).diagnostics,e);Q&&n.apply(O,Q.from,Q.to)},{name:l}=n,c=r[s]?l.indexOf(r[s]):-1,h=c<0?l:[l.slice(0,c),N("u",l.slice(c,c+1)),l.slice(c+1)],f=n.markClass?" "+n.markClass:"";return N("button",{type:"button",class:"cm-diagnosticAction"+f,onclick:o,onmousedown:o,"aria-label":` Action: ${l}${c<0?"":` (access key "${r[s]})"`}.`},h)}),e.source&&N("div",{class:"cm-diagnosticSource"},e.source))}var ql=class extends _e{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return N("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},Ss=class{constructor(e,t){this.diagnostic=t,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=e$(e,t,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},Tr=class O{constructor(e){this.view=e,this.items=[];let t=r=>{if(r.keyCode==27)BQ(this.view),this.view.focus();else if(r.keyCode==38||r.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(r.keyCode==40||r.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(r.keyCode==36)this.moveSelection(0);else if(r.keyCode==35)this.moveSelection(this.items.length-1);else if(r.keyCode==13)this.view.focus();else if(r.keyCode>=65&&r.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:n}=this.items[this.selectedIndex],s=JQ(n.actions);for(let a=0;a{for(let n=0;nBQ(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(Fe).selected;if(!e)return-1;for(let t=0;t{for(let c of l.diagnostics){if(s.has(c))continue;s.add(c);let h=-1,f;for(let u=i;ui&&(this.items.splice(i,h-i),r=!0)),t&&f.diagnostic==t.diagnostic?f.dom.hasAttribute("aria-selected")||(f.dom.setAttribute("aria-selected","true"),n=f):f.dom.hasAttribute("aria-selected")&&f.dom.removeAttribute("aria-selected"),i++}});i({sel:n.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:a,panel:o})=>{let l=o.height/this.list.offsetHeight;a.topo.bottom&&(this.list.scrollTop+=(a.bottom-o.bottom)/l)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),r&&this.sync()}sync(){let e=this.list.firstChild;function t(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)t();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)t()}moveSelection(e){if(this.selectedIndex<0)return;let t=this.view.state.field(Fe),i=mi(t.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:HQ.of(i)})}static open(e){return new O(e)}};function Q0(O,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(O)}')`}function gs(O){return Q0(``,'width="6" height="3"')}var $0=T.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:gs("#d11")},".cm-lintRange-warning":{backgroundImage:gs("orange")},".cm-lintRange-info":{backgroundImage:gs("#999")},".cm-lintRange-hint":{backgroundImage:gs("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}});function p0(O){return O=="error"?4:O=="warning"?3:O=="info"?2:1}function m0(O){let e="hint",t=1;for(let i of O){let r=p0(i.severity);r>t&&(t=r,e=i.severity)}return e}var g0=[Fe,T.decorations.compute([Fe],O=>{let{selected:e,panel:t}=O.field(Fe);return!e||!t||e.from==e.to?Y.none:Y.set([c0.range(e.from,e.to)])}),zd(h0,{hideOn:o0}),$0];var t$=[jd(),Cd(),_d(),zu(),mu(),wd(),Yd(),I.allowMultipleSelections.of(!0),cu(),Nn(Pu,{fallback:!0}),bu(),EQ(),IQ(),Vd(),qd(),Rd(),XQ(),Xt.of([...MQ,...uQ,...kQ,...Cu,...Qu,...Vl,...KQ])];var P0="#e5c07b",O$="#e06c75",S0="#56b6c2",X0="#ffffff",Xs="#abb2bf",Wl="#7d8799",T0="#61afef",b0="#98c379",i$="#d19a66",y0="#c678dd",x0="#21252b",r$="#2c313a",n$="#282c34",Ul="#353a42",k0="#3E4451",s$="#528bff";var w0=T.theme({"&":{color:Xs,backgroundColor:n$},".cm-content":{caretColor:s$},".cm-cursor, .cm-dropCursor":{borderLeftColor:s$},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:k0},".cm-panels":{backgroundColor:x0,color:Xs},".cm-panels.cm-panels-top":{borderBottom:"2px solid black"},".cm-panels.cm-panels-bottom":{borderTop:"2px solid black"},".cm-searchMatch":{backgroundColor:"#72a1ff59",outline:"1px solid #457dff"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"#6199ff2f"},".cm-activeLine":{backgroundColor:"#6699ff0b"},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847"},".cm-gutters":{backgroundColor:n$,color:Wl,border:"none"},".cm-activeLineGutter":{backgroundColor:r$},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:Ul},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:Ul,borderBottomColor:Ul},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:r$,color:Xs}}},{dark:!0}),Z0=ci.define([{tag:d.keyword,color:y0},{tag:[d.name,d.deleted,d.character,d.propertyName,d.macroName],color:O$},{tag:[d.function(d.variableName),d.labelName],color:T0},{tag:[d.color,d.constant(d.name),d.standard(d.name)],color:i$},{tag:[d.definition(d.name),d.separator],color:Xs},{tag:[d.typeName,d.className,d.number,d.changed,d.annotation,d.modifier,d.self,d.namespace],color:P0},{tag:[d.operator,d.operatorKeyword,d.url,d.escape,d.regexp,d.link,d.special(d.string)],color:S0},{tag:[d.meta,d.comment],color:Wl},{tag:d.strong,fontWeight:"bold"},{tag:d.emphasis,fontStyle:"italic"},{tag:d.strikethrough,textDecoration:"line-through"},{tag:d.link,color:Wl,textDecoration:"underline"},{tag:d.heading,fontWeight:"bold",color:O$},{tag:[d.atom,d.bool,d.special(d.variableName)],color:i$},{tag:[d.processingInstruction,d.string,d.inserted],color:b0},{tag:d.invalid,color:X0}]),a$=[w0,Nn(Z0)];var Gl=class O{constructor(e,t,i,r,n,s,a,o,l,c=0,h){this.p=e,this.stack=t,this.state=i,this.reducePos=r,this.pos=n,this.score=s,this.buffer=a,this.bufferBase=o,this.curContext=l,this.lookAhead=c,this.parent=h}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,i=0){let r=e.parser.context;return new O(e,[],t,i,i,0,[],0,r?new Ts(r,r.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let i=e>>19,r=e&65535,{parser:n}=this.p,s=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[r])===null||t===void 0)&&t.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=c):this.p.lastBigReductionSizeo;)this.stack.pop();this.reduceContext(r,l)}storeNode(e,t,i,r=4,n=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&s.buffer[a-4]==0&&s.buffer[a-1]>-1){if(t==i)return;if(s.buffer[a-2]>=t){s.buffer[a-2]=i;return}}}if(!n||this.pos==i)this.buffer.push(e,t,i,r);else{let s=this.buffer.length;if(s>0&&(this.buffer[s-4]!=0||this.buffer[s-1]<0)){let a=!1;for(let o=s;o>0&&this.buffer[o-2]>i;o-=4)if(this.buffer[o-1]>=0){a=!0;break}if(a)for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,r>4&&(r-=4)}this.buffer[s]=e,this.buffer[s+1]=t,this.buffer[s+2]=i,this.buffer[s+3]=r}}shift(e,t,i,r){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let n=e,{parser:s}=this.p;(r>this.pos||t<=s.maxNode)&&(this.pos=r,s.stateFlag(n,1)||(this.reducePos=r)),this.pushState(n,i),this.shiftContext(t,i),t<=s.maxNode&&this.buffer.push(t,i,r,4)}else this.pos=r,this.shiftContext(t,i),t<=this.p.parser.maxNode&&this.buffer.push(t,i,r,4)}apply(e,t,i,r){e&65536?this.reduce(e):this.shift(e,t,i,r)}useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let r=this.pos;this.reducePos=this.pos=r+e.length,this.pushState(t,r),this.buffer.push(i,r,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let i=e.buffer.slice(t),r=e.bufferBase+t;for(;e&&r==e.bufferBase;)e=e.parent;return new O(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,r,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,i?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new El(this);;){let i=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(i==0)return!1;if((i&65536)==0)return!0;t.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let r=[];for(let n=0,s;no&1&&a==s)||r.push(t[n],s)}t=r}let i=[];for(let r=0;r>19,r=t&65535,n=this.stack.length-i*3;if(n<0||e.getGoto(this.stack[n],r,!1)<0){let s=this.findForcedReduction();if(s==null)return!1;t=s}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],i=(r,n)=>{if(!t.includes(r))return t.push(r),e.allActions(r,s=>{if(!(s&393216))if(s&65536){let a=(s>>19)-n;if(a>1){let o=s&65535,l=this.stack.length-a*3;if(l>=0&&e.getGoto(this.stack[l],o,!1)>=0)return a<<19|65536|o}}else{let a=i(s,n+1);if(a!=null)return a}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;t0&&this.emitLookAhead()}},Ts=class{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}},El=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let r=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=r}},Al=class O{constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new O(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new O(this.stack,this.pos,this.index)}};function br(O,e=Uint16Array){if(typeof O!="string")return O;let t=null;for(let i=0,r=0;i=92&&s--,s>=34&&s--;let o=s-32;if(o>=46&&(o-=46,a=!0),n+=o,a)break;n*=46}t?t[r++]=n:t=new e(n)}return t}var gi=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},o$=new gi,Ll=class{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=o$,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let i=this.range,r=this.rangeIndex,n=this.pos+e;for(;ni.to:n>=i.to;){if(r==this.ranges.length-1)return null;let s=this.ranges[++r];n+=s.from-i.to,i=s}return n}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,i,r;if(t>=0&&t=this.chunk2Pos&&ia.to&&(this.chunk2=this.chunk2.slice(0,a.to-i)),r=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),r}acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=o$,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let i="";for(let r of this.ranges){if(r.from>=t)break;r.to>e&&(i+=this.input.read(Math.max(r.from,e),Math.min(r.to,t)))}return i}},hO=class{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:i}=t.p;d$(this.data,e,t,this.id,i.data,i.tokenPrecTable)}};hO.prototype.contextual=hO.prototype.fallback=hO.prototype.extend=!1;var kt=class{constructor(e,t,i){this.precTable=t,this.elseToken=i,this.data=typeof e=="string"?br(e):e}token(e,t){let i=e.pos,r=0;for(;;){let n=e.next<0,s=e.resolveOffset(1,1);if(d$(this.data,e,t,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(n||r++,s==null)break;e.reset(s,e.token)}r&&(e.reset(i,e.token),e.acceptToken(this.elseToken,r))}};kt.prototype.contextual=hO.prototype.fallback=hO.prototype.extend=!1;var z=class{constructor(e,t={}){this.token=e,this.contextual=!!t.contextual,this.fallback=!!t.fallback,this.extend=!!t.extend}};function d$(O,e,t,i,r,n){let s=0,a=1<0){let Q=O[u];if(o.allows(Q)&&(e.token.value==-1||e.token.value==Q||Y0(Q,e.token.value,r,n))){e.acceptToken(Q);break}}let c=e.next,h=0,f=O[s+2];if(e.next<0&&f>h&&O[l+f*3-3]==65535){s=O[l+f*3-1];continue e}for(;h>1,Q=l+u+(u<<1),$=O[Q],p=O[Q+1]||65536;if(c<$)f=u;else if(c>=p)h=u+1;else{s=O[Q+2],e.advance();continue e}}break}}function l$(O,e,t){for(let i=e,r;(r=O[i])!=65535;i++)if(r==t)return i-e;return-1}function Y0(O,e,t,i){let r=l$(t,i,e);return r<0||l$(t,i,O)e)&&!i.type.isError)return t<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(O.length,Math.max(i.from+1,e+25));if(t<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return t<0?0:O.length}}var Ml=class{constructor(e,t){this.fragments=e,this.nodeSet=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?c$(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?c$(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=s,null;if(n instanceof D){if(s==e){if(s=Math.max(this.safeFrom,e)&&(this.trees.push(n),this.start.push(s),this.index.push(0))}else this.index[t]++,this.nextStart=s+n.length}}},Dl=class{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new gi)}getActions(e){let t=0,i=null,{parser:r}=e.p,{tokenizers:n}=r,s=r.stateSlot(e.state,3),a=e.curContext?e.curContext.hash:0,o=0;for(let l=0;lh.end+25&&(o=Math.max(h.lookAhead,o)),h.value!=0)){let f=t;if(h.extended>-1&&(t=this.addActions(e,h.extended,h.end,t)),t=this.addActions(e,h.value,h.end,t),!c.extend&&(i=h,t>f))break}}for(;this.actions.length>t;)this.actions.pop();return o&&e.setLookAhead(o),!i&&e.pos==this.stream.end&&(i=new gi,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,t=this.addActions(e,i.value,i.end,t)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new gi,{pos:i,p:r}=e;return t.start=i,t.end=Math.min(i+1,r.stream.end),t.value=i==r.stream.end?r.parser.eofTerm:0,t}updateCachedToken(e,t,i){let r=this.stream.clipPos(i.pos);if(t.token(this.stream.reset(r,e),i),e.value>-1){let{parser:n}=i.p;for(let s=0;s=0&&i.p.parser.dialect.allows(a>>1)){(a&1)==0?e.value=a>>1:e.extended=a>>1;break}}}else e.value=0,e.end=this.stream.clipPos(r+1)}putAction(e,t,i,r){for(let n=0;ne.bufferLength*4?new Ml(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,i=this.stacks=[],r,n;if(this.bigReductionCount>300&&e.length==1){let[s]=e;for(;s.forceReduce()&&s.stack.length&&s.stack[s.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let s=0;st)i.push(a);else{if(this.advanceStack(a,i,e))continue;{r||(r=[],n=[]),r.push(a);let o=this.tokens.getMainToken(a);n.push(o.value,o.end)}}break}}if(!i.length){let s=r&&_0(r);if(s)return He&&console.log("Finish with "+this.stackID(s)),this.stackToTree(s);if(this.parser.strict)throw He&&r&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&r){let s=this.stoppedAt!=null&&r[0].pos>this.stoppedAt?r[0]:this.runRecovery(r,n,i);if(s)return He&&console.log("Force-finish "+this.stackID(s)),this.stackToTree(s.forceAll())}if(this.recovering){let s=this.recovering==1?1:this.recovering*3;if(i.length>s)for(i.sort((a,o)=>o.score-a.score);i.length>s;)i.pop();i.some(a=>a.reducePos>t)&&this.recovering--}else if(i.length>1){e:for(let s=0;s500&&l.buffer.length>500)if((a.score-l.score||a.buffer.length-l.buffer.length)>0)i.splice(o--,1);else{i.splice(s--,1);continue e}}}i.length>12&&(i.sort((s,a)=>a.score-s.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let s=1;s ":"";if(this.stoppedAt!=null&&r>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,c=l?e.curContext.hash:0;for(let h=this.fragments.nodeAt(r);h;){let f=this.parser.nodeSet.types[h.type.id]==h.type?n.getGoto(e.state,h.type.id):-1;if(f>-1&&h.length&&(!l||(h.prop(R.contextHash)||0)==c))return e.useNode(h,f),He&&console.log(s+this.stackID(e)+` (via reuse of ${n.getName(h.type.id)})`),!0;if(!(h instanceof D)||h.children.length==0||h.positions[0]>0)break;let u=h.children[0];if(u instanceof D&&h.positions[0]==0)h=u;else break}}let a=n.stateSlot(e.state,4);if(a>0)return e.reduce(a),He&&console.log(s+this.stackID(e)+` (via always-reduce ${n.getName(a&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let o=this.tokens.getActions(e);for(let l=0;lr?t.push(Q):i.push(Q)}return!1}advanceFully(e,t){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return h$(e,t),!0}}runRecovery(e,t,i){let r=null,n=!1;for(let s=0;s ":"";if(a.deadEnd&&(n||(n=!0,a.restart(),He&&console.log(c+this.stackID(a)+" (restarted)"),this.advanceFully(a,i))))continue;let h=a.split(),f=c;for(let u=0;u<10&&h.forceReduce()&&(He&&console.log(f+this.stackID(h)+" (via force-reduce)"),!this.advanceFully(h,i));u++)He&&(f=this.stackID(h)+" -> ");for(let u of a.recoverByInsert(o))He&&console.log(c+this.stackID(u)+" (via recover-insert)"),this.advanceFully(u,i);this.stream.end>a.pos?(l==a.pos&&(l++,o=0),a.recoverByDelete(o,l),He&&console.log(c+this.stackID(a)+` (via recover-delete ${this.parser.getName(o)})`),h$(a,i)):(!r||r.scoreO,Ge=class{constructor(e){this.start=e.start,this.shift=e.shift||Cl,this.reduce=e.reduce||Cl,this.reuse=e.reuse||Cl,this.hash=e.hash||(()=>0),this.strict=e.strict!==!1}},Oe=class O extends eO{constructor(e){if(super(),this.wrappers=[],e.version!=14)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let t=e.nodeNames.split(" ");this.minRepeatTerm=t.length;for(let a=0;ae.topRules[a][1]),r=[];for(let a=0;a=0)n(c,o,a[l++]);else{let h=a[l+-c];for(let f=-c;f>0;f--)n(a[l++],o,h);l++}}}this.nodeSet=new Kt(t.map((a,o)=>ue.define({name:o>=this.minRepeatTerm?void 0:a,id:o,props:r[o],top:i.indexOf(o)>-1,error:o==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(o)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let s=br(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let a=0;atypeof a=="number"?new hO(s,a):a),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,i){let r=new Il(this,e,t,i);for(let n of this.wrappers)r=n(r,e,t,i);return r}getGoto(e,t,i=!1){let r=this.goto;if(t>=r[0])return-1;for(let n=r[t+1];;){let s=r[n++],a=s&1,o=r[n++];if(a&&i)return o;for(let l=n+(s>>1);n0}validAction(e,t){return!!this.allActions(e,i=>i==t?!0:null)}allActions(e,t){let i=this.stateSlot(e,4),r=i?t(i):void 0;for(let n=this.stateSlot(e,1);r==null;n+=3){if(this.data[n]==65535)if(this.data[n+1]==1)n=Ut(this.data,n+2);else break;r=t(Ut(this.data,n+1))}return r}nextStates(e){let t=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=Ut(this.data,i+2);else break;if((this.data[i+2]&1)==0){let r=this.data[i+1];t.some((n,s)=>s&1&&n==r)||t.push(this.data[i],r)}}return t}configure(e){let t=Object.assign(Object.create(O.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=i}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(i=>{let r=e.tokenizers.find(n=>n.from==i);return r?r.to:i})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((i,r)=>{let n=e.specializers.find(a=>a.from==i.external);if(!n)return i;let s=Object.assign(Object.assign({},i),{external:n.to});return t.specializers[r]=f$(s),s})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),i=t.map(()=>!1);if(e)for(let n of e.split(" ")){let s=t.indexOf(n);s>=0&&(i[s]=!0)}let r=null;for(let n=0;ni)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scoreO.external(t,i)<<1|e}return O.get}var u$=1,R0=2,V0=3,q0=82,z0=76,U0=117,W0=85,j0=97,C0=122,G0=65,E0=90,A0=95,Nl=48,Q$=34,L0=40,$$=41,M0=32,p$=62,D0=new z(O=>{if(O.next==z0||O.next==W0?O.advance():O.next==U0&&(O.advance(),O.next==Nl+8&&O.advance()),O.next!=q0||(O.advance(),O.next!=Q$))return;O.advance();let e="";for(;O.next!=L0;){if(O.next==M0||O.next<=13||O.next==$$)return;e+=String.fromCharCode(O.next),O.advance()}for(O.advance();;){if(O.next<0)return O.acceptToken(u$);if(O.next==$$){let t=!0;for(let i=0;t&&i{if(O.next==p$)O.peek(1)==p$&&O.acceptToken(R0,1);else{let e=!1,t=0;for(;;t++){if(O.next>=G0&&O.next<=E0)e=!0;else{if(O.next>=j0&&O.next<=C0)return;if(O.next!=A0&&!(O.next>=Nl&&O.next<=Nl+9))break}O.advance()}e&&t>1&&O.acceptToken(V0)}},{extend:!0}),B0=F({"typedef struct union enum class typename decltype auto template operator friend noexcept namespace using requires concept import export module __attribute__ __declspec __based":d.definitionKeyword,"extern MsCallModifier MsPointerModifier extern static register thread_local inline const volatile restrict _Atomic mutable constexpr constinit consteval virtual explicit VirtualSpecifier Access":d.modifier,"if else switch for while do case default return break continue goto throw try catch":d.controlKeyword,"co_return co_yield co_await":d.controlKeyword,"new sizeof delete static_assert":d.operatorKeyword,"NULL nullptr":d.null,this:d.self,"True False":d.bool,"TypeSize PrimitiveType":d.standard(d.typeName),TypeIdentifier:d.typeName,FieldIdentifier:d.propertyName,"CallExpression/FieldExpression/FieldIdentifier":d.function(d.propertyName),"ModuleName/Identifier":d.namespace,PartitionName:d.labelName,StatementIdentifier:d.labelName,"Identifier DestructorName":d.variableName,"CallExpression/Identifier":d.function(d.variableName),"CallExpression/ScopedIdentifier/Identifier":d.function(d.variableName),"FunctionDeclarator/Identifier FunctionDeclarator/DestructorName":d.function(d.definition(d.variableName)),NamespaceIdentifier:d.namespace,OperatorName:d.operator,ArithOp:d.arithmeticOperator,LogicOp:d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,AssignOp:d.definitionOperator,UpdateOp:d.updateOperator,LineComment:d.lineComment,BlockComment:d.blockComment,Number:d.number,String:d.string,"RawString SystemLibString":d.special(d.string),CharLiteral:d.character,EscapeSequence:d.escape,"UserDefinedLiteral/Identifier":d.literal,PreProcArg:d.meta,"PreprocDirectiveName #include #ifdef #ifndef #if #define #else #endif #elif":d.processingInstruction,MacroName:d.special(d.name),"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,"< >":d.angleBracket,". ->":d.derefOperator,", ;":d.separator}),N0={__proto__:null,bool:36,char:36,int:36,float:36,double:36,void:36,size_t:36,ssize_t:36,intptr_t:36,uintptr_t:36,charptr_t:36,int8_t:36,int16_t:36,int32_t:36,int64_t:36,uint8_t:36,uint16_t:36,uint32_t:36,uint64_t:36,char8_t:36,char16_t:36,char32_t:36,char64_t:36,const:70,volatile:72,restrict:74,_Atomic:76,mutable:78,constexpr:80,constinit:82,consteval:84,struct:88,__declspec:92,final:148,override:148,public:152,private:152,protected:152,virtual:154,extern:160,static:162,register:164,inline:166,thread_local:168,__attribute__:172,__based:178,__restrict:180,__uptr:180,__sptr:180,_unaligned:180,__unaligned:180,noexcept:194,requires:198,TRUE:786,true:786,FALSE:788,false:788,typename:218,class:220,template:234,throw:248,__cdecl:256,__clrcall:256,__stdcall:256,__fastcall:256,__thiscall:256,__vectorcall:256,try:260,catch:264,export:282,import:286,case:296,default:298,if:308,else:314,switch:318,do:322,while:324,for:330,return:334,break:338,continue:342,goto:346,co_return:350,co_yield:354,using:362,typedef:366,namespace:380,new:398,delete:400,co_await:402,concept:406,enum:410,static_assert:414,friend:422,union:424,explicit:430,operator:444,module:456,signed:518,unsigned:518,long:518,short:518,decltype:528,auto:530,sizeof:566,NULL:572,nullptr:586,this:588},F0={__proto__:null,"<":755},H0={__proto__:null,">":135},K0={__proto__:null,operator:388,new:576,delete:582},m$=Oe.deserialize({version:14,states:"$;SQ!QQVOOP'gOUOOO(XOWO'#CdO,RQUO'#CgO,]QUO'#FjO-sQbO'#CxO.UQUO'#CxO0TQUO'#KZO0[QUO'#CwO0gOpO'#DvO0oQ!dO'#D]OOQR'#JO'#JOO5XQVO'#GUO5fQUO'#JVOOQQ'#JV'#JVO8zQUO'#KnO{QVO'#E^O?]QUO'#E^OOQQ'#Ed'#EdOOQQ'#Ee'#EeO?bQVO'#EfO@XQVO'#EiOBUQUO'#FPOBvQUO'#FhOOQR'#Fj'#FjOB{QUO'#FjOOQR'#LR'#LROOQR'#LQ'#LQOETQVO'#KQOFxQUO'#LWOGVQUO'#KrOGkQUO'#LWOH]QUO'#LYOOQR'#HU'#HUOOQR'#HV'#HVOOQR'#HW'#HWOOQR'#K}'#K}OOQR'#J_'#J_Q!QQVOOOHkQVO'#FOOIWQUO'#EhOI_QUOOOKZQVO'#HgOKkQUO'#HgONVQUO'#KrONaQUO'#KrOOQQ'#Kr'#KrO!!_QUO'#KrOOQQ'#Jq'#JqO!!lQUO'#HxOOQQ'#KZ'#KZO!&^QUO'#KZO!&zQUO'#KQO!(zQVO'#I]O!(zQVO'#I`OCQQUO'#KQOOQQ'#Ip'#IpOOQQ'#KQ'#KQO!,}QUO'#KZOOQR'#KY'#KYO!-UQUO'#DZO!/mQUO'#KoOOQQ'#Ko'#KoO!/tQUO'#KoO!/{QUO'#ETO!0QQUO'#EWO!0VQUO'#FRO8zQUO'#FPO!QQVO'#F^O!0[Q#vO'#F`O!0gQUO'#FkO!0oQUO'#FpO!0tQVO'#FrO!0oQUO'#FuO!3sQUO'#FvO!3xQVO'#FxO!4SQUO'#FzO!4XQUO'#F|O!4^QUO'#GOO!4cQVO'#GQO!(zQVO'#GSO!4jQUO'#GpO!4xQUO'#GYO!(zQVO'#FeO!6VQUO'#FeO!6[QVO'#G`O!6cQUO'#GaO!6nQUO'#GnO!6sQUO'#GrO!6xQUO'#GzO!7jQ&lO'#HiO!:mQUO'#GuO!:}QUO'#HXO!;YQUO'#HZO!;bQUO'#DXO!;bQUO'#HuO!;bQUO'#HvO!;yQUO'#HwO!<[QUO'#H|O!=PQUO'#H}O!>uQVO'#IbO!(zQVO'#IdO!?PQUO'#IgO!?WQVO'#IjP!@}{,UO'#CbP!6n{,UO'#CbP!AY{7[O'#CbP!6n{,UO'#CbP!A_{,UO'#CbP!AjOSO'#IzPOOO)CEn)CEnOOOO'#I|'#I|O!AtOWO,59OOOQR,59O,59OO!(zQVO,59VOOQQ,59X,59XOOQR'#Do'#DoO!(zQVO,5;ROOQR,5qOOQR'#IX'#IXOOQR'#IY'#IYOOQR'#IZ'#IZOOQR'#I['#I[O!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!DOQVO,5>zOOQQ,5?W,5?WO!EqQVO'#CjO!IjQUO'#CzOOQQ,59d,59dOOQQ,59c,59cOOQQ,5<},5<}O!IwQ&lO,5=mO!?PQUO,5?RO!LkQVO,5?UO!LrQbO,59dO!L}QVO'#FYOOQQ,5?P,5?PO!M_QVO,59WO!MfO`O,5:bO!MkQbO'#D^O!M|QbO'#K_O!N[QbO,59wO!NdQbO'#CxO!NuQUO'#CxO!NzQUO'#KZO# UQUO'#CwOOQR-E<|-E<|O# aQUO,5ApO# hQVO'#EfO@XQVO'#EiOBUQUO,5;kOOQR,5l,5>lO#3gQUO'#CgO#4]QUO,5>pO#6OQUO'#IeOOQR'#I}'#I}O#6WQUO,5:xO#6tQUO,5:xO#7eQUO,5:xO#8YQUO'#CuO!0QQUO'#CmOOQQ'#JW'#JWO#6tQUO,5:xO#8bQUO,5;QO!4xQUO'#DOO#9kQUO,5;QO#9pQUO,5>QO#:|QUO'#DOO#;dQUO,5>{O#;iQUO'#KxO#}QUO'#L]O#?UQUO,5>UO#?ZQbO'#CxO#?fQUO'#GcO#?kQUO'#E^O#@[QUO,5;kO#@sQUO'#LOO#@{QUO,5;rOKkQUO'#HfOBUQUO'#HgO#AQQUO'#KrO!6nQUO'#HjO#AxQUO'#CuO!0tQVO,5PO$(WQUO'#E[O$(eQUO,5>ROOQQ,5>S,5>SO$,RQVO'#C|OOQQ-E=o-E=oOOQQ,5>d,5>dOOQQ,59a,59aO$,]QUO,5>wO$.]QUO,5>zO!6nQUO,59uO$.pQUO,5;qO$.}QUO,5<{O!0QQUO,5:oOOQQ,5:r,5:rO$/YQUO,5;mO$/_QUO'#KnOBUQUO,5;kOOQR,5;x,5;xO$0OQUO'#FbO$0^QUO'#FbO$0cQUO,5;zO$3|QVO'#FmO!0tQVO,5eQUO,5pQUO,5=[O$>uQUO,5=[O!4xQUO,5}QUO,5uQUO,5<{O$DQQUO,5<{O$D]QUO,5=YO!(zQVO,5=^O!(zQVO,5=fO#NeQUO,5=mOOQQ,5>T,5>TO$FbQUO,5>TO$FlQUO,5>TO$FqQUO,5>TO$FvQUO,5>TO!6nQUO,5>TO$HtQUO'#KZO$H{QUO,5=oO$IWQUO,5=aOKkQUO,5=oO$JQQUO,5=sOOQR,5=s,5=sO$JYQUO,5=sO$LeQVO'#H[OOQQ,5=u,5=uO!;]QUO,5=uO%#`QUO'#KkO%#gQUO'#K[O%#{QUO'#KkO%$VQUO'#DyO%$hQUO'#D|O%'eQUO'#K[OOQQ'#K['#K[O%)WQUO'#K[O%#gQUO'#K[O%)]QUO'#K[OOQQ,59s,59sOOQQ,5>a,5>aOOQQ,5>b,5>bO%)eQUO'#HzO%)mQUO,5>cOOQQ,5>c,5>cO%-XQUO,5>cO%-dQUO,5>hO%1OQVO,5>iO%1VQUO,5>|O# hQVO'#EfO%4]QUO,5>|OOQQ,5>|,5>|O%4|QUO,5?OO%7QQUO,5?RO!<[QUO,5?RO%8|QUO,5?UO%sQUO1G0mOOQQ1G0m1G0mO%@PQUO'#CpO%B`QbO'#CxO%BkQUO'#CsO%BpQUO'#CsO%BuQUO1G.uO#AxQUO'#CrOOQQ1G.u1G.uO%DxQUO1G4]O%FOQUO1G4^O%GqQUO1G4^O%IdQUO1G4^O%KVQUO1G4^O%LxQUO1G4^O%NkQUO1G4^O&!^QUO1G4^O&$PQUO1G4^O&%rQUO1G4^O&'eQUO1G4^O&)WQUO1G4^O&*yQUO'#KPO&,SQUO'#KPO&,[QUO,59UOOQQ,5=P,5=PO&.dQUO,5=PO&.nQUO,5=PO&.sQUO,5=PO&.xQUO,5=PO!6nQUO,5=PO#NeQUO1G3XO&/SQUO1G4mO!<[QUO1G4mO&1OQUO1G4pO&2qQVO1G4pOOQQ1G/O1G/OOOQQ1G.}1G.}OOQQ1G2i1G2iO!IwQ&lO1G3XO&2xQUO'#LPO@XQVO'#EiO&4RQUO'#F]OOQQ'#Ja'#JaO&4WQUO'#FZO&4cQUO'#LPO&4kQUO,5;tO&4pQUO1G.rOOQQ1G.r1G.rOOQR1G/|1G/|O&6cQ!dO'#JPO&6hQbO,59xO&8yQ!eO'#D`O&9QQ!dO'#JRO&9VQbO,5@yO&9VQbO,5@yOOQR1G/c1G/cO&9bQbO1G/cO&9gQ&lO'#GeO&:eQbO,59dOOQR1G7[1G7[O#@[QUO1G1VO&:pQUO1G1^OBUQUO1G1VO&=RQUO'#CzO#*wQbO,59dO&@tQUO1G6tOOQR-E<{-E<{O&BWQUO1G0dO#6WQUO1G0dOOQQ-E=U-E=UO#6tQUO1G0dOOQQ1G0l1G0lO&B{QUO,59jOOQQ1G3l1G3lO&CcQUO,59jO&CyQUO,59jO!M_QVO1G4gO!(zQVO'#JYO&DeQUO,5AdOOQQ1G0o1G0oO!(zQVO1G0oO!6nQUO'#JnO&DmQUO,5AwOOQQ1G3p1G3pOOQR1G1V1G1VO&HjQVO'#FOO!M_QVO,5;sOOQQ,5;s,5;sOBUQUO'#JcO&JfQUO,5AjO&JnQVO'#E[OOQR1G1^1G1^O&M]QUO'#L]OOQR1G1n1G1nOOQR-E=f-E=fOOQR1G7^1G7^O#DhQUO1G7^OGVQUO1G7^O#DhQUO1G7`OOQR1G7`1G7`O&MeQUO'#G}O&MmQUO'#LXOOQQ,5=h,5=hO&M{QUO,5=jO&NQQUO,5=kOOQR1G7a1G7aO#EfQVO1G7aO&NVQUO1G7aO' ]QVO,5=kOOQR1G1U1G1UO$.vQUO'#E]O'!RQUO'#E]OOQQ'#Kz'#KzO'!lQUO'#KyO'!wQUO,5;UO'#PQUO'#ElO'#dQUO'#ElO'#wQUO'#EtOOQQ'#J['#J[O'#|QUO,5;cO'$sQUO,5;cO'%nQUO,5;dO'&tQVO,5;dOOQQ,5;d,5;dO''OQVO,5;dO'&tQVO,5;dO''VQUO,5;bO'(SQUO,5;eO'(_QUO'#KqO'(gQUO,5:vO'(lQUO,5;fOOQQ1G0n1G0nOOQQ'#J]'#J]O''VQUO,5;bO!4xQUO'#E}OOQQ,5;b,5;bO')gQUO'#E`O'+aQUO'#E{OHrQUO1G0nO'+fQUO'#EbOOQQ'#JX'#JXO'-OQUO'#KsOOQQ'#Ks'#KsO'-xQUO1G0eO'.pQUO1G3kO'/vQVO1G3kOOQQ1G3k1G3kO'0QQVO1G3kO'0XQUO'#L`O'1eQUO'#KXO'1sQUO'#KWO'2OQUO,59hO'2WQUO1G/aO'2]QUO'#FPOOQR1G1]1G1]OOQR1G2g1G2gO$>uQUO1G2gO'2gQUO1G2gO'2rQUO1G0ZOOQR'#J`'#J`O'2wQVO1G1XO'8pQUO'#FTO'8uQUO1G1VO!6nQUO'#JdO'9TQUO,5;|O$0^QUO,5;|OOQQ'#Fc'#FcOOQQ,5;|,5;|O'9cQUO1G1fOOQR1G1f1G1fO'9kQUO,5}QUO1G2`OOQQ'#Cv'#CvO'CzQUO'#G[O'DuQUO'#G[O'DzQUO'#LSO'EYQUO'#G_OOQQ'#LT'#LTO'EhQUO1G2`O'EmQVO1G1kO'HOQVO'#GUOBUQUO'#FWOOQR'#Je'#JeO'EmQVO1G1kO'HYQUO'#FvOOQR1G2f1G2fO'H_QUO1G2gO'HdQUO'#JgO'2gQUO1G2gO!(zQVO1G2tO'HlQUO1G2xO'IuQUO1G3QO'J{QUO1G3XOOQQ1G3o1G3oO'KaQUO1G3oOOQR1G3Z1G3ZO'KfQUO'#KZO'2]QUO'#LUOGkQUO'#LWOOQR'#Gy'#GyO#DhQUO'#LYOOQR'#HQ'#HQO'KpQUO'#GvO'#wQUO'#GuOOQR1G2{1G2{O'LmQUO1G2{O'MdQUO1G3ZO'MoQUO1G3_O'MtQUO1G3_OOQR1G3_1G3_O'M|QUO'#H]OOQR'#H]'#H]O( VQUO'#H]O!(zQVO'#H`O!(zQVO'#H_OOQR'#L['#L[O( [QUO'#L[OOQR'#Jk'#JkO( aQVO,5=vOOQQ,5=v,5=vO( hQUO'#H^O( pQUO'#HZOOQQ1G3a1G3aO( zQUO,5@vOOQQ,5@v,5@vO%)WQUO,5@vO%)]QUO,5@vO%$VQUO,5:eO(%iQUO'#KlO(%wQUO'#KlOOQQ,5:e,5:eOOQQ'#JS'#JSO(&SQUO'#D}O(&^QUO'#KrOGkQUO'#LWO('YQUO'#D}OOQQ'#Hp'#HpOOQQ'#Hr'#HrOOQQ'#Hs'#HsOOQQ'#Km'#KmOOQQ'#JU'#JUO('dQUO,5:hOOQQ,5:h,5:hO((aQUO'#LWO((nQUO'#HtO()UQUO,5@vO()]QUO'#H{O()hQUO'#L_O()pQUO,5>fO()uQUO'#L^OOQQ1G3}1G3}O(-lQUO1G3}O(-sQUO1G3}O(-zQUO1G4TO(/QQUO1G4TO(/VQUO,5A}O!6nQUO1G4hO!(zQVO'#IiOOQQ1G4m1G4mO(/[QUO1G4mO(1_QVO1G4pPOOO1G.h1G.hP!A_{,UO1G.hP(3_QUO'#LfP(3j{,UO1G.hP(3o{7[O1G.hPO{O-E=s-E=sPOOO,5BO,5BOP(3w{,UO,5BOPOOO1G5Q1G5QO!(zQVO7+$]O(3|QUO'#CzOOQQ,59_,59_O(4XQbO,59dO(4dQbO,59_OOQQ,59^,59^OOQQ7+)w7+)wO!M_QVO'#JtO(4oQUO,5@kOOQQ1G.p1G.pOOQQ1G2k1G2kO(4wQUO1G2kO(4|QUO7+(sOOQQ7+*X7+*XO(7bQUO7+*XO(7iQUO7+*XO(1_QVO7+*[O#NeQUO7+(sO(7vQVO'#JbO(8ZQUO,5AkO(8cQUO,5;vOOQQ'#Cp'#CpOOQQ,5;w,5;wO!(zQVO'#F[OOQQ-E=_-E=_O!M_QVO,5;uOOQQ1G1`1G1`OOQQ,5?k,5?kOOQQ-E<}-E<}OOQR'#Dg'#DgOOQR'#Di'#DiOOQR'#Dl'#DlO(9lQ!eO'#K`O(9sQMkO'#K`O(9zQ!eO'#K`OOQR'#K`'#K`OOQR'#JQ'#JQO(:RQ!eO,59zOOQQ,59z,59zO(:YQbO,5?mOOQQ-E=P-E=PO(:hQbO1G6eOOQR7+$}7+$}OOQR7+&q7+&qOOQR7+&x7+&xO'8uQUO7+&qO(:sQUO7+&OO#6WQUO7+&OO(;hQUO1G/UO(]QUO,5?tOOQQ-E=W-E=WO(?fQUO7+&ZOOQQ,5@Y,5@YOOQQ-E=l-E=lO(?kQUO'#LPO@XQVO'#EiO(@wQUO1G1_OOQQ1G1_1G1_O(BQQUO,5?}OOQQ,5?},5?}OOQQ-E=a-E=aO(BfQUO'#KqOOQR7+,x7+,xO#DhQUO7+,xOOQR7+,z7+,zO(BsQUO,5=iO#DsQUO'#JjO(CUQUO,5AsOOQR1G3U1G3UOOQR1G3V1G3VO(CdQUO7+,{OOQR7+,{7+,{O(E[QUO,5:wO(FyQUO'#EwO!(zQVO,5;VO(GlQUO,5:wO(GvQUO'#EpO(HXQUO'#EzOOQQ,5;Z,5;ZO#K]QVO'#ExO(HoQUO,5:wO(HvQUO'#EyO#GgQUO'#JZO(J`QUO,5AeOOQQ1G0p1G0pO(JkQUO,5;WO!<[QUO,5;^O(KUQUO,5;_O(KdQUO,5;WO(MvQUO,5;`OOQQ-E=Y-E=YO(NOQUO1G0}OOQQ1G1O1G1OO(NyQUO1G1OO)!PQVO1G1OO)!WQVO1G1OO)!bQUO1G0|OOQQ1G0|1G0|OOQQ1G1P1G1PO)#_QUO'#JoO)#iQUO,5A]OOQQ1G0b1G0bOOQQ-E=Z-E=ZO)#qQUO,5;iO!<[QUO,5;iO)$nQVO,5:zO)$uQUO,5;gO$ mQUO7+&YOOQQ7+&Y7+&YO!(zQVO'#EfO)$|QUO,5:|OOQQ'#Kt'#KtOOQQ-E=V-E=VOOQQ,5A_,5A_OOQQ'#Jl'#JlO)(qQUO7+&PPOQQ7+&P7+&POOQQ7+)V7+)VO))iQUO7+)VO)*oQVO7+)VOOQQ,5>m,5>mO$)YQVO'#JsO)*vQUO,5@rOOQQ1G/S1G/SOOQQ7+${7+${O)+RQUO7+(RO)+WQUO7+(ROOQR7+(R7+(RO$>uQUO7+(ROOQQ7+%u7+%uOOQR-E=^-E=^O!0VQUO,5;oOOQQ,5@O,5@OOOQQ-E=b-E=bO$0^QUO1G1hOOQQ1G1h1G1hOOQR7+'Q7+'QOOQR1G1s1G1sOBUQUO,5;rO)+tQUO,5hQUO,5}QUO7+(dO)?SQVO7+(dOOQQ7+(l7+(lOOQQ7+)Z7+)ZO)?[QUO'#KkO)?fQUO'#KkOOQR,5=b,5=bO)?sQUO,5=bO!;bQUO,5=bO!;bQUO,5=bO!;bQUO,5=bOOQR7+(g7+(gOOQR7+(u7+(uOOQR7+(y7+(yOOQR,5=w,5=wO)?xQUO,5=zO)AOQUO,5=yOOQR,5Av,5AvOOQR-E=i-E=iOOQQ1G3b1G3bO)BUQUO,5=xO)BZQVO'#EfOOQQ1G6b1G6bO%)WQUO1G6bO%)]QUO1G6bOOQQ1G0P1G0POOQQ-E=Q-E=QO)DrQUO,5AWO(%iQUO'#JTO)D}QUO,5AWO)D}QUO,5AWO)EVQUO,5:iO8zQUO,5:iOOQQ,5>],5>]O)EaQUO,5ArO)EhQUO'#EVO)FrQUO'#EVO)G]QUO,5:iO)GgQUO'#HlO)GgQUO'#HmOOQQ'#Kp'#KpO)HUQUO'#KpO!(zQVO'#HnOOQQ,5:i,5:iO)HvQUO,5:iO!M_QVO,5:iOOQQ-E=S-E=SOOQQ1G0S1G0SOOQQ,5>`,5>`O)H{QUO1G6bO!(zQVO,5>gO)LjQUO'#JrO)LuQUO,5AyOOQQ1G4Q1G4QO)L}QUO,5AxOOQQ,5Ax,5AxOOQQ7+)i7+)iO*!lQUO7+)iOOQQ7+)o7+)oO*'kQVO1G7iO*)mQUO7+*SO*)rQUO,5?TO**xQUO7+*[POOO7+$S7+$SP*,kQUO'#LgP*,sQUO,5BQP*,x{,UO7+$SPOOO1G7j1G7jO*,}QUO<XQUO7+&jO*?_QVO7+&jOOQQ7+&h7+&hOOQQ,5@Z,5@ZOOQQ-E=m-E=mO*@ZQUO1G1TO*@eQUO1G1TO*AOQUO1G0fOOQQ1G0f1G0fO*BUQUO'#K|O*B^QUO1G1ROOQQ<uQUO<VO)GgQUO'#JpO*NQQUO1G0TO*NcQVO1G0TOOQQ1G3u1G3uO*NjQUO,5>WO*NuQUO,5>XO+ dQUO,5>YO+!jQUO1G0TO%)]QUO7++|O+#pQUO1G4ROOQQ,5@^,5@^OOQQ-E=p-E=pOOQQ<n,5>nO+/iQUOANAXOOQRANAXANAXO+/nQUO7+'`OOQRAN@cAN@cO+0zQVOAN@nO+1RQUOAN@nO!0tQVOAN@nO+2[QUOAN@nO+2aQUOAN@}O+2lQUOAN@}O+3rQUOAN@}OOQRAN@nAN@nO!M_QVOAN@}OOQRANAOANAOO+3wQUO7+'|O)7VQUO7+'|OOQQ7+(O7+(OO+4YQUO7+(OO+5`QVO7+(OO+5gQVO7+'hO+5nQUOANAjOOQR7+(h7+(hOOQR7+)P7+)PO+5sQUO7+)PO+5xQUO7+)POOQQ<= h<= hO+6QQUO7+,^O+6YQUO1G5ZOOQQ1G5Z1G5ZO+6eQUO7+%oOOQQ7+%o7+%oO+6vQUO7+%oO*NcQVO7+%oOOQQ7+)a7+)aO+6{QUO7+%oO+8RQUO7+%oO!M_QVO7+%oO+8]QUO1G0]O*LkQUO1G0]O)EhQUO1G0]OOQQ1G0a1G0aO+8zQUO1G3qO+:QQVO1G3qOOQQ1G3q1G3qO+:[QVO1G3qO+:cQUO,5@[OOQQ-E=n-E=nOOQQ1G3r1G3rO%)WQUO<= hOOQQ7+*Z7+*ZPOQQ,5@b,5@bPOQQ-E=t-E=tOOQQ1G/}1G/}OOQQ,5?x,5?xOOQQ-E=[-E=[OOQRG26sG26sO+:zQUOG26YO!0tQVOG26YO+QQUO<uAN>uO+BpQUOAN>uO+CvQUOAN>uO!M_QVOAN>uO+C{QUO<nQUO'#KZO,?OQUO'#CzO,?^QbO,59dO,6VQUO7+&OO,PP>j>|?bFYMY!&^!,tP!3n!4c!5WP!5rPPPPPPPP!6]P!7uP!9W!:pP!:vPPPPPP!:yP!:yPP!:yPP!;VPPPPPP!=X!@oP!@rPP!A`!BTPPPPP!BXP>m!CjPP>m!Eq!Gr!HQ!Ig!KWP!KcP!Kr!Kr# S#$c#%y#)V#,a!Gr#,kPP!Gr#,r#,x#,k#,k#,{P#-P#-n#-n#-n#-n!KWP#.X#.j#1PP#1eP#3QP#3U#3^#4R#4^#6l#6t#6t#3UP#3UP#6{#7RP#7]PP#7x#8g#9X#7xP#9y#:VP#7xP#7xPP#7x#7xP#7xP#7xP#7xP#7xP#7xP#7xP#:Y#7]#:vP#;]P#;r#;r#;r#;r#m>m>m$%Y!BT!BT!BT!BT!BT!BT!6]!6]!6]$%mP$'Y$'h!6]$'nPP!6]$)|$*P#Bo$*S:u7k$-Y$/T$0t$2d7kPP7k$4W7kP7k7kP7kP$7^7kP7kPP7k$7jPPPPPPPPP*]P$:r$:x$=a$?g$?m$@T$@_$@j$@y$AP$B_$C^$Ce$Cl$Cr$Cz$DU$D[$Dg$Dm$Dv$EO$EZ$Ea$Ek$Eq$E{$FS$Fc$Fi$FoP$Fu$F}$GU$Gd$IQ$IW$I^$Ie$InPPPPPPPP$It$IxPPPPP%!z$)|%!}%&V%(_PP%(l%(oPPPPPPPPPP%({%*O%*U%*Y%,P%-^%.P%.W%0g%0mPPP%0w%1S%1V%1]%2d%2g%2q%2{%3P%4T%4v%4|#BxP%5g%5w%5z%6[%6h%6l%6r%6x$)|$*P$*P%6{%7OP%7Y%7]R#cP'`mO[aefwx{!W!X!g!k!n!r!s!v!x#X#Y#[#g#j#m#r#s#t#u#v#w#x#y#z#{#|$O$V$X$Z$f$g$l%^%n&R&T&X&c&g&y&z&}'P'Q'c'j'k'z(a(c(j)m)s*i*j*m*r*s*w+X+Z+i+k+l,Q,S,o,r,x-^-_-b-h.Q.R.V/O/R/]/d/m/o/t/v0i0|1R1b1c1m1q1{1}2d2g2j2v2{3O3j4P4S4X4b5Z5f5r6`6d6g6i6k6u6w6|7c7k7n8f8h8n8t8u9S9W9^9`9m9p9q9|:P:V:X:^:c:gU%pm%q7RQ&n!`Q(k#]d0Q*O/}0O0P0S5O5P5Q5T8RR7R3Ub}Oaewx{!g&T*r&v$j[!W!X!k!n!r!s!v!x#X#Y#[#g#j#m#r#s#t#u#v#w#x#y#z#{#|$O$V$X$Z$f$g$l%^%n&R&X&c&g&y&z&}'P'Q'c'j'k'z(a(c(j)m)s*i*j*m*s*w+X+Z+i+k+l,Q,S,o,r,x-^-_-b-h.Q.R.V/O/R/]/d/m/o/t/v0|1b1c1m1q1{1}2d2g2j2v2{3O3j4P4S4X4b5Z5f5r6`6d6g6i6k6u6w6|7c7k7n8f8h8n8t8u9S9W9^9`9m9p9q9|:P:V:X:^:c:gS%af0i#d%kgnp|#O$h$}%O%T%e%i%j%x&t'u'v(R*Z*a*c*u+^,m,w-`-q-x.g.n.p0^0z0{1P1T2`2k5b6h;X;Y;Z;a;b;c;p;q;r;s;w;x;y;z MacroName LineComment BlockComment PreprocDirective #include String EscapeSequence SystemLibString Identifier ) ( ArgumentList ConditionalExpression AssignmentExpression CallExpression PrimitiveType FieldExpression FieldIdentifier DestructorName TemplateMethod ScopedFieldIdentifier NamespaceIdentifier TemplateType TypeIdentifier ScopedTypeIdentifier ScopedNamespaceIdentifier :: NamespaceIdentifier TypeIdentifier TemplateArgumentList < TypeDescriptor const volatile restrict _Atomic mutable constexpr constinit consteval StructSpecifier struct MsDeclspecModifier __declspec Attribute AttributeName Identifier AttributeArgs { } [ ] UpdateOp ArithOp ArithOp ArithOp LogicOp BitOp BitOp BitOp CompareOp CompareOp CompareOp > CompareOp BitOp UpdateOp , Number CharLiteral AttributeArgs VirtualSpecifier BaseClassClause Access virtual FieldDeclarationList FieldDeclaration extern static register inline thread_local AttributeSpecifier __attribute__ PointerDeclarator MsBasedModifier __based MsPointerModifier FunctionDeclarator ParameterList ParameterDeclaration PointerDeclarator FunctionDeclarator Noexcept noexcept RequiresClause requires True False ParenthesizedExpression CommaExpression LambdaExpression LambdaCaptureSpecifier TemplateParameterList OptionalParameterDeclaration TypeParameterDeclaration typename class VariadicParameterDeclaration VariadicDeclarator ReferenceDeclarator OptionalTypeParameterDeclaration VariadicTypeParameterDeclaration TemplateTemplateParameterDeclaration template AbstractFunctionDeclarator AbstractPointerDeclarator AbstractArrayDeclarator AbstractParenthesizedDeclarator AbstractReferenceDeclarator ThrowSpecifier throw TrailingReturnType CompoundStatement FunctionDefinition MsCallModifier TryStatement try CatchClause catch LinkageSpecification Declaration InitDeclarator InitializerList InitializerPair SubscriptDesignator FieldDesignator ExportDeclaration export ImportDeclaration import ModuleName PartitionName HeaderName CaseStatement case default LabeledStatement StatementIdentifier ExpressionStatement IfStatement if ConditionClause Declaration else SwitchStatement switch DoStatement do while WhileStatement ForStatement for ReturnStatement return BreakStatement break ContinueStatement continue GotoStatement goto CoReturnStatement co_return CoYieldStatement co_yield AttributeStatement ForRangeLoop AliasDeclaration using TypeDefinition typedef PointerDeclarator FunctionDeclarator ArrayDeclarator ParenthesizedDeclarator ThrowStatement NamespaceDefinition namespace ScopedIdentifier Identifier OperatorName operator ArithOp BitOp CompareOp LogicOp new delete co_await ConceptDefinition concept UsingDeclaration enum StaticAssertDeclaration static_assert ConcatenatedString TemplateDeclaration FriendDeclaration friend union FunctionDefinition ExplicitFunctionSpecifier explicit FieldInitializerList FieldInitializer DefaultMethodClause DeleteMethodClause FunctionDefinition OperatorCast operator TemplateInstantiation FunctionDefinition FunctionDefinition Declaration ModuleDeclaration module RequiresExpression RequirementList SimpleRequirement TypeRequirement CompoundRequirement ReturnTypeRequirement ConstraintConjuction LogicOp ConstraintDisjunction LogicOp ArrayDeclarator ParenthesizedDeclarator ReferenceDeclarator TemplateFunction OperatorName StructuredBindingDeclarator ArrayDeclarator ParenthesizedDeclarator ReferenceDeclarator BitfieldClause FunctionDefinition FunctionDefinition Declaration FunctionDefinition Declaration AccessSpecifier UnionSpecifier ClassSpecifier EnumSpecifier SizedTypeSpecifier TypeSize EnumeratorList Enumerator DependentType Decltype decltype auto PlaceholderTypeSpecifier ParameterPackExpansion ParameterPackExpansion FieldIdentifier PointerExpression SubscriptExpression BinaryExpression ArithOp LogicOp LogicOp BitOp UnaryExpression LogicOp BitOp UpdateExpression CastExpression SizeofExpression sizeof CoAwaitExpression CompoundLiteralExpression NULL NewExpression new NewDeclarator DeleteExpression delete ParameterPackExpansion nullptr this UserDefinedLiteral ParamPack #define PreprocArg #if #ifdef #ifndef #else #endif #elif PreprocDirectiveName Macro Program",maxTerm:426,nodeProps:[["group",-35,1,8,11,15,16,17,19,71,72,100,101,102,104,191,208,229,242,243,270,271,272,277,280,281,282,284,285,286,287,290,292,293,294,295,296,"Expression",-13,18,25,26,27,43,255,256,257,258,262,263,265,266,"Type",-19,126,129,147,150,152,153,158,160,163,164,166,168,170,172,174,176,178,179,188,"Statement"],["isolate",-4,4,5,8,10,""],["openedBy",12,"(",52,"{",54,"["],["closedBy",13,")",51,"}",53,"]"]],propSources:[B0],skippedNodes:[0,3,4,5,6,7,10,297,298,299,300,301,302,303,304,305,306,347,348],repeatNodeCount:41,tokenData:"&*r7ZR!UOX$eXY({YZ.gZ]$e]^+P^p$epq({qr.}rs0}st2ktu$euv!7dvw!9bwx!;exy!O{|!?R|}!AV}!O!BQ!O!P!DX!P!Q#+y!Q!R#Az!R![$(x![!]$Ag!]!^$Cc!^!_$D^!_!`%1W!`!a%2X!a!b%5_!b!c$e!c!n%6Y!n!o%7q!o!w%6Y!w!x%7q!x!}%6Y!}#O%:n#O#P%u#Y#]4Y#]#^NZ#^#o4Y#o;'S$e;'S;=`(u<%lO$e4e4eb)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#o4Y#o;'S$e;'S;=`(u<%lO$e4e5xd)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#X4Y#X#Y7W#Y#o4Y#o;'S$e;'S;=`(u<%lO$e4e7cd)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#Y4Y#Y#Z8q#Z#o4Y#o;'S$e;'S;=`(u<%lO$e4e8|d)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#]4Y#]#^:[#^#o4Y#o;'S$e;'S;=`(u<%lO$e4e:gd)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#b4Y#b#c;u#c#o4Y#o;'S$e;'S;=`(u<%lO$e4e][)T,g)^W(qQ%Z!b'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!?`^)^W(qQ%Z!b!Y,g'f&jOY$eZr$ers%^sw$ewx(Ox{$e{|!@[|!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!@gY)^W!X-y(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!AbY!h,k)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!B__)^W(qQ%Z!b!Y,g'f&jOY$eZr$ers%^sw$ewx(Ox}$e}!O!@[!O!_$e!_!`!8g!`!a!C^!a#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!CiY(x-y)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!Dd^)^W(qQ'f&j(w,gOY$eZr$ers%^sw$ewx(Ox!O$e!O!P!E`!P!Q$e!Q![!GY![#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!Ei[)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!O$e!O!P!F_!P#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!FjY)Z,k)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2]!Gen)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx!Icx!Q$e!Q![!GY![!g$e!g!h#$w!h!i#*Y!i!n$e!n!o#*Y!o!r$e!r!s#$w!s!w$e!w!x#*Y!x#O$e#O#P&f#P#X$e#X#Y#$w#Y#Z#*Y#Z#`$e#`#a#*Y#a#d$e#d#e#$w#e#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e2T!IjY(qQ'f&jOY(OZr(Ors%}s!Q(O!Q![!JY![#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O2T!Jcn(qQ!i,g'f&jOY(OZr(Ors%}sw(Owx!Icx!Q(O!Q![!JY![!g(O!g!h!La!h!i##`!i!n(O!n!o##`!o!r(O!r!s!La!s!w(O!w!x##`!x#O(O#O#P&f#P#X(O#X#Y!La#Y#Z##`#Z#`(O#`#a##`#a#d(O#d#e!La#e#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2T!Ljl(qQ!i,g'f&jOY(OZr(Ors%}s{(O{|!Nb|}(O}!O!Nb!O!Q(O!Q![# e![!c(O!c!h# e!h!i# e!i!n(O!n!o##`!o!w(O!w!x##`!x#O(O#O#P&f#P#T(O#T#Y# e#Y#Z# e#Z#`(O#`#a##`#a#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2T!Ni^(qQ'f&jOY(OZr(Ors%}s!Q(O!Q![# e![!c(O!c!i# e!i#O(O#O#P&f#P#T(O#T#Z# e#Z;'S(O;'S;=`(o<%lO(O2T# nj(qQ!i,g'f&jOY(OZr(Ors%}sw(Owx!Nbx!Q(O!Q![# e![!c(O!c!h# e!h!i# e!i!n(O!n!o##`!o!w(O!w!x##`!x#O(O#O#P&f#P#T(O#T#Y# e#Y#Z# e#Z#`(O#`#a##`#a#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2T##id(qQ!i,g'f&jOY(OZr(Ors%}s!h(O!h!i##`!i!n(O!n!o##`!o!w(O!w!x##`!x#O(O#O#P&f#P#Y(O#Y#Z##`#Z#`(O#`#a##`#a#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2]#%Sn)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx(Ox{$e{|#'Q|}$e}!O#'Q!O!Q$e!Q![#(]![!c$e!c!h#(]!h!i#(]!i!n$e!n!o#*Y!o!w$e!w!x#*Y!x#O$e#O#P&f#P#T$e#T#Y#(]#Y#Z#(]#Z#`$e#`#a#*Y#a#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e2]#'Z`)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![#(]![!c$e!c!i#(]!i#O$e#O#P&f#P#T$e#T#Z#(]#Z;'S$e;'S;=`(u<%lO$e2]#(hj)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx!Nbx!Q$e!Q![#(]![!c$e!c!h#(]!h!i#(]!i!n$e!n!o#*Y!o!w$e!w!x#*Y!x#O$e#O#P&f#P#T$e#T#Y#(]#Y#Z#(]#Z#`$e#`#a#*Y#a#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e2]#*ef)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx(Ox!h$e!h!i#*Y!i!n$e!n!o#*Y!o!w$e!w!x#*Y!x#O$e#O#P&f#P#Y$e#Y#Z#*Y#Z#`$e#`#a#*Y#a#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e7Z#,W`)^W(qQ%Z!b![,g'f&jOY$eZr$ers%^sw$ewx(Oxz$ez{#-Y{!P$e!P!Q#:s!Q!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z#-c])^W(qQ'f&jOY#-YYZ#.[Zr#-Yrs#/csw#-Ywx#5wxz#-Yz{#8j{#O#-Y#O#P#2`#P;'S#-Y;'S;=`#:m<%lO#-Y1e#._TOz#.[z{#.n{;'S#.[;'S;=`#/]<%lO#.[1e#.qVOz#.[z{#.n{!P#.[!P!Q#/W!Q;'S#.[;'S;=`#/]<%lO#.[1e#/]OT1e1e#/`P;=`<%l#.[7X#/jZ)^W'f&jOY#/cYZ#.[Zw#/cwx#0]xz#/cz{#4O{#O#/c#O#P#2`#P;'S#/c;'S;=`#5q<%lO#/c7P#0bX'f&jOY#0]YZ#.[Zz#0]z{#0}{#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#1SZ'f&jOY#0]YZ#.[Zz#0]z{#0}{!P#0]!P!Q#1u!Q#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#1|UT1e'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}7P#2eZ'f&jOY#0]YZ#0]Z]#0]]^#3W^z#0]z{#0}{#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#3]X'f&jOY#0]YZ#0]Zz#0]z{#0}{#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#3{P;=`<%l#0]7X#4V])^W'f&jOY#/cYZ#.[Zw#/cwx#0]xz#/cz{#4O{!P#/c!P!Q#5O!Q#O#/c#O#P#2`#P;'S#/c;'S;=`#5q<%lO#/c7X#5XW)^WT1e'f&jOY%^Zw%^wx%}x#O%^#O#P&f#P;'S%^;'S;=`'x<%lO%^7X#5tP;=`<%l#/c7R#6OZ(qQ'f&jOY#5wYZ#.[Zr#5wrs#0]sz#5wz{#6q{#O#5w#O#P#2`#P;'S#5w;'S;=`#8d<%lO#5w7R#6x](qQ'f&jOY#5wYZ#.[Zr#5wrs#0]sz#5wz{#6q{!P#5w!P!Q#7q!Q#O#5w#O#P#2`#P;'S#5w;'S;=`#8d<%lO#5w7R#7zW(qQT1e'f&jOY(OZr(Ors%}s#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O7R#8gP;=`<%l#5w7Z#8s_)^W(qQ'f&jOY#-YYZ#.[Zr#-Yrs#/csw#-Ywx#5wxz#-Yz{#8j{!P#-Y!P!Q#9r!Q#O#-Y#O#P#2`#P;'S#-Y;'S;=`#:m<%lO#-Y7Z#9}Y)^W(qQT1e'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z#:pP;=`<%l#-Y7Z#;OY)^W(qQS1e'f&jOY#:sZr#:srs#;nsw#:swx#@{x#O#:s#O#P#[<%lO#b#P;'S#[<%lO#[<%lO#_P;=`<%l#i]S1e'f&jOY#b#P#b#[<%lO#[<%lO#b#P#b#[<%lO#t!R![$2V![!c$e!c!i$2V!i#O$e#O#P&f#P#T$e#T#Z$2V#Z;'S$e;'S;=`(u<%lO$e2]$?Pv)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx$4lx!O$e!O!P$ m!P!Q$e!Q![$2V![!c$e!c!g$2V!g!h$:p!h!i$2V!i!n$e!n!o#*Y!o!r$e!r!s#$w!s!w$e!w!x#*Y!x#O$e#O#P&f#P#T$e#T#U$2V#U#V$2V#V#X$2V#X#Y$:p#Y#Z$2V#Z#`$e#`#a#*Y#a#d$e#d#e#$w#e#i$e#i#j#*Y#j#l$e#l#m$0z#m;'S$e;'S;=`(u<%lO$e4e$Ar[(v-X)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox![$e![!]$Bh!]#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3s$BsYm-})^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2]$CnY)Y,g)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7V$Dk_q,g%]!b)^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!^$Ej!^!_%+w!_!`%.U!`!a%0]!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej*[$Es])^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!`$Ej!`!a%*t!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ejp$FoTO!`$Fl!`!a$GO!a;'S$Fl;'S;=`$GT<%lO$Flp$GTO$Wpp$GWP;=`<%l$Fl*Y$GbZ)^W'f&jOY$GZYZ$FlZw$GZwx$HTx!`$GZ!`!a%(U!a#O$GZ#O#P$Ib#P;'S$GZ;'S;=`%(y<%lO$GZ*Q$HYX'f&jOY$HTYZ$FlZ!`$HT!`!a$Hu!a#O$HT#O#P$Ib#P;'S$HT;'S;=`$Mx<%lO$HT*Q$IOU$WpY#t'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}*Q$Ig['f&jOY$HTYZ$HTZ]$HT]^$J]^!`$HT!`!a$NO!a#O$HT#O#P%&n#P;'S$HT;'S;=`%'f;=`<%l%$z<%lO$HT*Q$JbX'f&jOY$HTYZ$J}Z!`$HT!`!a$Hu!a#O$HT#O#P$Ib#P;'S$HT;'S;=`$Mx<%lO$HT'[$KSX'f&jOY$J}YZ$FlZ!`$J}!`!a$Ko!a#O$J}#O#P$LY#P;'S$J};'S;=`$Mr<%lO$J}'[$KvU$Wp'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}'[$L_Z'f&jOY$J}YZ$J}Z]$J}]^$MQ^!`$J}!`!a$Ko!a#O$J}#O#P$LY#P;'S$J};'S;=`$Mr<%lO$J}'[$MVX'f&jOY$J}YZ$J}Z!`$J}!`!a$Ko!a#O$J}#O#P$LY#P;'S$J};'S;=`$Mr<%lO$J}'[$MuP;=`<%l$J}*Q$M{P;=`<%l$HT*Q$NVW$Wp'f&jOY$NoZ!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`$NtW'f&jOY$NoZ!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`% eUY#t'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%})`% |Y'f&jOY$NoYZ$NoZ]$No]^%!l^#O$No#O#P%#d#P;'S$No;'S;=`%$[;=`<%l%$z<%lO$No)`%!qX'f&jOY$NoYZ%}Z!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`%#aP;=`<%l$No)`%#iZ'f&jOY$NoYZ%}Z]$No]^%!l^!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`%$_XOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h;=`<%l$No<%lO%$z#t%$}WOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h<%lO%$z#t%%lOY#t#t%%oRO;'S%$z;'S;=`%%x;=`O%$z#t%%{XOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h;=`<%l%$z<%lO%$z#t%&kP;=`<%l%$z*Q%&sZ'f&jOY$HTYZ$J}Z]$HT]^$J]^!`$HT!`!a$Hu!a#O$HT#O#P$Ib#P;'S$HT;'S;=`$Mx<%lO$HT*Q%'iXOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h;=`<%l$HT<%lO%$z*Y%(aW$WpY#t)^W'f&jOY%^Zw%^wx%}x#O%^#O#P&f#P;'S%^;'S;=`'x<%lO%^*Y%(|P;=`<%l$GZ*S%)WZ(qQ'f&jOY%)PYZ$FlZr%)Prs$HTs!`%)P!`!a%)y!a#O%)P#O#P$Ib#P;'S%)P;'S;=`%*n<%lO%)P*S%*UW$WpY#t(qQ'f&jOY(OZr(Ors%}s#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O*S%*qP;=`<%l%)P*[%+RY$WpY#t)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e*[%+tP;=`<%l$Ej7V%,U^)^W(qQ%[!b!f,g'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!_$Ej!_!`%-Q!`!a%*t!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej7V%-]]!g-y)^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!`$Ej!`!a%*t!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej7V%.c]%]!b!b,g)^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!`$Ej!`!a%/[!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej7V%/mY%]!b!b,g$WpY#t)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e)j%0hYY#t)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%1c[)k!c)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`0Q!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%2f]%]!b)^W(qQ!d,g'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`%3_!`!a%4[!a#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%3lY%]!b!b,g)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%4i[)^W(qQ%[!b!f,g'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e&u%5jY(uP)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z%6ib)^W(yS(qQ!R,f(r%y'f&jOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![%6Y![!c$e!c!}%6Y!}#O$e#O#P&f#P#R$e#R#S%6Y#S#T$e#T#o%6Y#o;'S$e;'S;=`(u<%lO$e7Z%8Qb)^W(yS(qQ!R,f(r%y'f&jOY$eZr$ers%9Ysw$ewx%9{x!Q$e!Q![%6Y![!c$e!c!}%6Y!}#O$e#O#P&f#P#R$e#R#S%6Y#S#T$e#T#o%6Y#o;'S$e;'S;=`(u<%lO$e5P%9cW)^W(p/]'f&jOY%^Zw%^wx%}x#O%^#O#P&f#P;'S%^;'S;=`'x<%lO%^2T%:UW(qQ)],g'f&jOY(OZr(Ors%}s#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O3o%:yZ!V-y)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!}$e!}#O%;l#O#P&f#P;'S$e;'S;=`(u<%lO$e&u%;wY)QP)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e4e%[Z]%=q]^%?Z^!Q%=q!Q![%?w![!w%=q!w!x%AX!x#O%=q#O#P%H_#P#i%=q#i#j%Ds#j#l%=q#l#m%IR#m;'S%=q;'S;=`%Kt<%lO%=q&t%=xUXY'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}4e%>e[XY(n.o'f&jOX%}XY-OYZ*[Z]%}]^-O^p%}pq-Oq#O%}#O#P,^#P;'S%};'S;=`'r<%lO%}4e%?bVXY'f&jOY%}YZ-OZ#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%@OWXY'f&jOY%}Z!Q%}!Q![%@h![#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%@oWXY'f&jOY%}Z!Q%}!Q![%=q![#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%A^['f&jOY%}Z!Q%}!Q![%BS![!c%}!c!i%BS!i#O%}#O#P&f#P#T%}#T#Z%BS#Z;'S%};'S;=`'r<%lO%}&t%BX['f&jOY%}Z!Q%}!Q![%B}![!c%}!c!i%B}!i#O%}#O#P&f#P#T%}#T#Z%B}#Z;'S%};'S;=`'r<%lO%}&t%CS['f&jOY%}Z!Q%}!Q![%Cx![!c%}!c!i%Cx!i#O%}#O#P&f#P#T%}#T#Z%Cx#Z;'S%};'S;=`'r<%lO%}&t%C}['f&jOY%}Z!Q%}!Q![%Ds![!c%}!c!i%Ds!i#O%}#O#P&f#P#T%}#T#Z%Ds#Z;'S%};'S;=`'r<%lO%}&t%Dx['f&jOY%}Z!Q%}!Q![%En![!c%}!c!i%En!i#O%}#O#P&f#P#T%}#T#Z%En#Z;'S%};'S;=`'r<%lO%}&t%Es['f&jOY%}Z!Q%}!Q![%Fi![!c%}!c!i%Fi!i#O%}#O#P&f#P#T%}#T#Z%Fi#Z;'S%};'S;=`'r<%lO%}&t%Fn['f&jOY%}Z!Q%}!Q![%Gd![!c%}!c!i%Gd!i#O%}#O#P&f#P#T%}#T#Z%Gd#Z;'S%};'S;=`'r<%lO%}&t%Gi['f&jOY%}Z!Q%}!Q![%=q![!c%}!c!i%=q!i#O%}#O#P&f#P#T%}#T#Z%=q#Z;'S%};'S;=`'r<%lO%}&t%HfXXY'f&jOY%}YZ%}Z]%}]^'W^#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%IW['f&jOY%}Z!Q%}!Q![%I|![!c%}!c!i%I|!i#O%}#O#P&f#P#T%}#T#Z%I|#Z;'S%};'S;=`'r<%lO%}&t%JR['f&jOY%}Z!Q%}!Q![%Jw![!c%}!c!i%Jw!i#O%}#O#P&f#P#T%}#T#Z%Jw#Z;'S%};'S;=`'r<%lO%}&t%KO[XY'f&jOY%}Z!Q%}!Q![%Jw![!c%}!c!i%Jw!i#O%}#O#P&f#P#T%}#T#Z%Jw#Z;'S%};'S;=`'r<%lO%}&t%KwP;=`<%l%=q2a%LVZ!W,V)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P#Q%Lx#Q;'S$e;'S;=`(u<%lO$e'Y%MTY)Pd)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%NQ[)^W(qQ%[!b'f&j!_,gOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z& Vd)^W(yS(qQ!R,f(r%y'f&jOY$eZr$ers%9Ysw$ewx%9{x!Q$e!Q!Y%6Y!Y!Z%7q!Z![%6Y![!c$e!c!}%6Y!}#O$e#O#P&f#P#R$e#R#S%6Y#S#T$e#T#o%6Y#o;'S$e;'S;=`(u<%lO$e2]&!pY!T,g)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o&#m^)^W(qQ%[!b'f&j!^,gOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P#p$e#p#q&$i#q;'S$e;'S;=`(u<%lO$e3o&$vY)U,g%^!b)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e'V&%qY!Ua)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e(]&&nc)^W(qQ%[!b'RP'f&jOX$eXY&'yZp$epq&'yqr$ers%^sw$ewx(Ox!c$e!c!}&)_!}#O$e#O#P&f#P#R$e#R#S&)_#S#T$e#T#o&)_#o;'S$e;'S;=`(u<%lO$e&y&(Sc)^W(qQ'f&jOX$eXY&'yZp$epq&'yqr$ers%^sw$ewx(Ox!c$e!c!}&)_!}#O$e#O#P&f#P#R$e#R#S&)_#S#T$e#T#o&)_#o;'S$e;'S;=`(u<%lO$e&y&)jb)^W(qQeT'f&jOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![&)_![!c$e!c!}&)_!}#O$e#O#P&f#P#R$e#R#S&)_#S#T$e#T#o&)_#o;'S$e;'S;=`(u<%lO$e",tokenizers:[D0,I0,0,1,2,3,4,5,6,7,8,9],topRules:{Program:[0,307]},dynamicPrecedences:{65:1,87:1,94:1,119:1,184:1,187:-10,240:-10,241:1,244:-1,246:-10,247:1,262:-1,267:2,268:2,306:-10,365:3,418:1,419:3,420:1,421:1},specialized:[{term:356,get:O=>N0[O]||-1},{term:33,get:O=>F0[O]||-1},{term:66,get:O=>H0[O]||-1},{term:363,get:O=>K0[O]||-1}],tokenPrec:24891});var J0=ne.define({name:"cpp",parser:m$.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),TryStatement:le({except:/^\s*({|catch)\b/}),LabeledStatement:sO,CaseStatement:O=>O.baseIndent+O.unit,BlockComment:()=>null,CompoundStatement:be({closing:"}"}),Statement:le({except:/^{/})}),te.add({"DeclarationList CompoundStatement EnumeratorList FieldDeclarationList InitializerList":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/,closeBrackets:{stringPrefixes:["L","u","U","u8","LR","UR","uR","u8R","R"]}}});function g$(){return new J(J0)}var eb=122,P$=1,tb=123,Ob=124,X$=2,ib=125,rb=3,nb=4,T$=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],sb=58,ab=40,b$=95,ob=91,bs=45,lb=46,cb=35,hb=37,fb=38,db=92,ub=10,Qb=42;function yr(O){return O>=65&&O<=90||O>=97&&O<=122||O>=161}function Fl(O){return O>=48&&O<=57}function S$(O){return Fl(O)||O>=97&&O<=102||O>=65&&O<=70}var y$=(O,e,t)=>(i,r)=>{for(let n=!1,s=0,a=0;;a++){let{next:o}=i;if(yr(o)||o==bs||o==b$||n&&Fl(o))!n&&(o!=bs||a>0)&&(n=!0),s===a&&o==bs&&s++,i.advance();else if(o==db&&i.peek(1)!=ub){if(i.advance(),S$(i.next)){do i.advance();while(S$(i.next));i.next==32&&i.advance()}else i.next>-1&&i.advance();n=!0}else{n&&i.acceptToken(s==2&&r.canShift(X$)?e:o==ab?t:O);break}}},$b=new z(y$(tb,X$,Ob)),pb=new z(y$(ib,rb,nb)),mb=new z(O=>{if(T$.includes(O.peek(-1))){let{next:e}=O;(yr(e)||e==b$||e==cb||e==lb||e==Qb||e==ob||e==sb&&yr(O.peek(1))||e==bs||e==fb)&&O.acceptToken(eb)}}),gb=new z(O=>{if(!T$.includes(O.peek(-1))){let{next:e}=O;if(e==hb&&(O.advance(),O.acceptToken(P$)),yr(e)){do O.advance();while(yr(O.next)||Fl(O.next));O.acceptToken(P$)}}}),Pb=F({"AtKeyword import charset namespace keyframes media supports":d.definitionKeyword,"from to selector":d.keyword,NamespaceName:d.namespace,KeyframeName:d.labelName,KeyframeRangeName:d.operatorKeyword,TagName:d.tagName,ClassName:d.className,PseudoClassName:d.constant(d.className),IdName:d.labelName,"FeatureName PropertyName":d.propertyName,AttributeName:d.attributeName,NumberLiteral:d.number,KeywordQuery:d.keyword,UnaryQueryOp:d.operatorKeyword,"CallTag ValueName":d.atom,VariableName:d.variableName,Callee:d.operatorKeyword,Unit:d.unit,"UniversalSelector NestingSelector":d.definitionOperator,"MatchOp CompareOp":d.compareOperator,"ChildOp SiblingOp, LogicOp":d.logicOperator,BinOp:d.arithmeticOperator,Important:d.modifier,Comment:d.blockComment,ColorLiteral:d.color,"ParenthesizedContent StringLiteral":d.string,":":d.punctuation,"PseudoOp #":d.derefOperator,"; ,":d.separator,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace}),Sb={__proto__:null,lang:38,"nth-child":38,"nth-last-child":38,"nth-of-type":38,"nth-last-of-type":38,dir:38,"host-context":38,if:84,url:124,"url-prefix":124,domain:124,regexp:124},Xb={__proto__:null,or:98,and:98,not:106,only:106,layer:170},Tb={__proto__:null,selector:112,layer:166},bb={__proto__:null,"@import":162,"@media":174,"@charset":178,"@namespace":182,"@keyframes":188,"@supports":200,"@scope":204},yb={__proto__:null,to:207},x$=Oe.deserialize({version:14,states:"EbQYQdOOO#qQdOOP#xO`OOOOQP'#Cf'#CfOOQP'#Ce'#CeO#}QdO'#ChO$nQaO'#CcO$xQdO'#CkO%TQdO'#DpO%YQdO'#DrO%_QdO'#DuO%_QdO'#DxOOQP'#FV'#FVO&eQhO'#EhOOQS'#FU'#FUOOQS'#Ek'#EkQYQdOOO&lQdO'#EOO&PQhO'#EUO&lQdO'#EWO'aQdO'#EYO'lQdO'#E]O'tQhO'#EcO(VQdO'#EeO(bQaO'#CfO)VQ`O'#D{O)[Q`O'#F`O)gQdO'#F`QOQ`OOP)qO&jO'#CaPOOO)C@t)C@tOOQP'#Cj'#CjOOQP,59S,59SO#}QdO,59SO)|QdO,59VO%TQdO,5:[O%YQdO,5:^O%_QdO,5:aO%_QdO,5:cO%_QdO,5:dO%_QdO'#ErO*XQ`O,58}O*aQdO'#DzOOQS,58},58}OOQP'#Cn'#CnOOQO'#Dn'#DnOOQP,59V,59VO*hQ`O,59VO*mQ`O,59VOOQP'#Dq'#DqOOQP,5:[,5:[OOQO'#Ds'#DsO*rQpO,5:^O+]QaO,5:aO+sQaO,5:dOOQW'#DZ'#DZO,ZQhO'#DdO,xQhO'#FaO'tQhO'#DbO-WQ`O'#DhOOQW'#F['#F[O-]Q`O,5;SO-eQ`O'#DeOOQS-E8i-E8iOOQ['#Cs'#CsO-jQdO'#CtO.QQdO'#CzO.hQdO'#C}O/OQ!pO'#DPO1RQ!jO,5:jOOQO'#DU'#DUO*mQ`O'#DTO1cQ!nO'#FXO3`Q`O'#DVO3eQ`O'#DkOOQ['#FX'#FXO-`Q`O,5:pO3jQ!bO,5:rOOQS'#E['#E[O3rQ`O,5:tO3wQdO,5:tOOQO'#E_'#E_O4PQ`O,5:wO4UQhO,5:}O%_QdO'#DgOOQS,5;P,5;PO-eQ`O,5;PO4^QdO,5;PO4fQdO,5:gO4vQdO'#EtO5TQ`O,5;zO5TQ`O,5;zPOOO'#Ej'#EjP5`O&jO,58{POOO,58{,58{OOQP1G.n1G.nOOQP1G.q1G.qO*hQ`O1G.qO*mQ`O1G.qOOQP1G/v1G/vO5kQpO1G/xO5sQaO1G/{O6ZQaO1G/}O6qQaO1G0OO7XQaO,5;^OOQO-E8p-E8pOOQS1G.i1G.iO7cQ`O,5:fO7hQdO'#DoO7oQdO'#CrOOQP1G/x1G/xO&lQdO1G/xO7vQ!jO'#DZO8UQ!bO,59vO8^QhO,5:OOOQO'#F]'#F]O8XQ!bO,59zO'tQhO,59xO8fQhO'#EvO8sQ`O,5;{O9OQhO,59|O9uQhO'#DiOOQW,5:S,5:SOOQS1G0n1G0nOOQW,5:P,5:PO9|Q!fO'#FYOOQS'#FY'#FYOOQS'#Em'#EmO;^QdO,59`OOQ[,59`,59`O;tQdO,59fOOQ[,59f,59fO<[QdO,59iOOQ[,59i,59iOOQ[,59k,59kO&lQdO,59mOPQ!fO1G0ROOQO1G0R1G0ROOQO,5;`,5;`O>gQdO,5;`OOQO-E8r-E8rO>tQ`O1G1fPOOO-E8h-E8hPOOO1G.g1G.gOOQP7+$]7+$]OOQP7+%d7+%dO&lQdO7+%dOOQS1G0Q1G0QO?PQaO'#F_O?ZQ`O,5:ZO?`Q!fO'#ElO@^QdO'#FWO@hQ`O,59^O@mQ!bO7+%dO&lQdO1G/bO@uQhO1G/fOOQW1G/j1G/jOOQW1G/d1G/dOAWQhO,5;bOOQO-E8t-E8tOAfQhO'#DZOAtQhO'#F^OBPQ`O'#F^OBUQ`O,5:TOOQS-E8k-E8kOOQ[1G.z1G.zOOQ[1G/Q1G/QOOQ[1G/T1G/TOOQ[1G/X1G/XOBZQdO,5:lOOQS7+%p7+%pOB`Q`O7+%pOBeQhO'#DYOBmQ`O,59sO'tQhO,59sOOQ[1G/q1G/qOBuQ`O1G/qOOQS7+%z7+%zOBzQbO'#DPOOQO'#Eb'#EbOCYQ`O'#EaOOQO'#Ea'#EaOCeQ`O'#EwOCmQdO,5:zOOQS,5:z,5:zOOQ[1G/m1G/mOOQS7+&V7+&VO-`Q`O7+&VOCxQ!fO'#EsO&lQdO'#EsOEPQdO7+%mOOQO7+%m7+%mOOQO1G0z1G0zOEdQ!bO<jAN>jOIUQaO,5;]OOQO-E8o-E8oOI`QdO,5;[OOQO-E8n-E8nOOQW<WO&lQdO1G0uOK]Q`O7+'OOOQO,5;a,5;aOOQO-E8s-E8sOOQW<t}!O?V!O!P?t!P!Q@]!Q![AU![!]BP!]!^B{!^!_C^!_!`DY!`!aDm!a!b$q!b!cEn!c!}$q!}#OG{#O#P$q#P#QH^#Q#R6W#R#o$q#o#pHo#p#q6W#q#rIQ#r#sIc#s#y$q#y#z%i#z$f$q$f$g%i$g#BY$q#BY#BZ%i#BZ$IS$q$IS$I_%i$I_$I|$q$I|$JO%i$JO$JT$q$JT$JU%i$JU$KV$q$KV$KW%i$KW&FU$q&FU&FV%i&FV;'S$q;'S;=`Iz<%lO$q`$tSOy%Qz;'S%Q;'S;=`%c<%lO%Q`%VS!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Q`%fP;=`<%l%Q~%nh#s~OX%QX^'Y^p%Qpq'Yqy%Qz#y%Q#y#z'Y#z$f%Q$f$g'Y$g#BY%Q#BY#BZ'Y#BZ$IS%Q$IS$I_'Y$I_$I|%Q$I|$JO'Y$JO$JT%Q$JT$JU'Y$JU$KV%Q$KV$KW'Y$KW&FU%Q&FU&FV'Y&FV;'S%Q;'S;=`%c<%lO%Q~'ah#s~!a`OX%QX^'Y^p%Qpq'Yqy%Qz#y%Q#y#z'Y#z$f%Q$f$g'Y$g#BY%Q#BY#BZ'Y#BZ$IS%Q$IS$I_'Y$I_$I|%Q$I|$JO'Y$JO$JT%Q$JT$JU'Y$JU$KV%Q$KV$KW'Y$KW&FU%Q&FU&FV'Y&FV;'S%Q;'S;=`%c<%lO%Qj)OUOy%Qz#]%Q#]#^)b#^;'S%Q;'S;=`%c<%lO%Qj)gU!a`Oy%Qz#a%Q#a#b)y#b;'S%Q;'S;=`%c<%lO%Qj*OU!a`Oy%Qz#d%Q#d#e*b#e;'S%Q;'S;=`%c<%lO%Qj*gU!a`Oy%Qz#c%Q#c#d*y#d;'S%Q;'S;=`%c<%lO%Qj+OU!a`Oy%Qz#f%Q#f#g+b#g;'S%Q;'S;=`%c<%lO%Qj+gU!a`Oy%Qz#h%Q#h#i+y#i;'S%Q;'S;=`%c<%lO%Qj,OU!a`Oy%Qz#T%Q#T#U,b#U;'S%Q;'S;=`%c<%lO%Qj,gU!a`Oy%Qz#b%Q#b#c,y#c;'S%Q;'S;=`%c<%lO%Qj-OU!a`Oy%Qz#h%Q#h#i-b#i;'S%Q;'S;=`%c<%lO%Qj-iS!qY!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Q~-xWOY-uZr-urs.bs#O-u#O#P.g#P;'S-u;'S;=`/c<%lO-u~.gOt~~.jRO;'S-u;'S;=`.s;=`O-u~.vXOY-uZr-urs.bs#O-u#O#P.g#P;'S-u;'S;=`/c;=`<%l-u<%lO-u~/fP;=`<%l-uj/nYjYOy%Qz!Q%Q!Q![0^![!c%Q!c!i0^!i#T%Q#T#Z0^#Z;'S%Q;'S;=`%c<%lO%Qj0cY!a`Oy%Qz!Q%Q!Q![1R![!c%Q!c!i1R!i#T%Q#T#Z1R#Z;'S%Q;'S;=`%c<%lO%Qj1WY!a`Oy%Qz!Q%Q!Q![1v![!c%Q!c!i1v!i#T%Q#T#Z1v#Z;'S%Q;'S;=`%c<%lO%Qj1}YrY!a`Oy%Qz!Q%Q!Q![2m![!c%Q!c!i2m!i#T%Q#T#Z2m#Z;'S%Q;'S;=`%c<%lO%Qj2tYrY!a`Oy%Qz!Q%Q!Q![3d![!c%Q!c!i3d!i#T%Q#T#Z3d#Z;'S%Q;'S;=`%c<%lO%Qj3iY!a`Oy%Qz!Q%Q!Q![4X![!c%Q!c!i4X!i#T%Q#T#Z4X#Z;'S%Q;'S;=`%c<%lO%Qj4`YrY!a`Oy%Qz!Q%Q!Q![5O![!c%Q!c!i5O!i#T%Q#T#Z5O#Z;'S%Q;'S;=`%c<%lO%Qj5TY!a`Oy%Qz!Q%Q!Q![5s![!c%Q!c!i5s!i#T%Q#T#Z5s#Z;'S%Q;'S;=`%c<%lO%Qj5zSrY!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Qd6ZUOy%Qz!_%Q!_!`6m!`;'S%Q;'S;=`%c<%lO%Qd6tS!hS!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Qb7VSZQOy%Qz;'S%Q;'S;=`%c<%lO%Q~7fWOY7cZw7cwx.bx#O7c#O#P8O#P;'S7c;'S;=`8z<%lO7c~8RRO;'S7c;'S;=`8[;=`O7c~8_XOY7cZw7cwx.bx#O7c#O#P8O#P;'S7c;'S;=`8z;=`<%l7c<%lO7c~8}P;=`<%l7cj9VSeYOy%Qz;'S%Q;'S;=`%c<%lO%Q~9hOd~n9oUWQvWOy%Qz!_%Q!_!`6m!`;'S%Q;'S;=`%c<%lO%Qj:YWvW!mQOy%Qz!O%Q!O!P:r!P!Q%Q!Q![=w![;'S%Q;'S;=`%c<%lO%Qj:wU!a`Oy%Qz!Q%Q!Q![;Z![;'S%Q;'S;=`%c<%lO%Qj;bY!a`#}YOy%Qz!Q%Q!Q![;Z![!g%Q!g!hO[!a`#}YOy%Qz!O%Q!O!P;Z!P!Q%Q!Q![=w![!g%Q!g!hyS!^YOy%Qz;'S%Q;'S;=`%c<%lO%Qj?[WvWOy%Qz!O%Q!O!P:r!P!Q%Q!Q![=w![;'S%Q;'S;=`%c<%lO%Qj?yU]YOy%Qz!Q%Q!Q![;Z![;'S%Q;'S;=`%c<%lO%Q~@bTvWOy%Qz{@q{;'S%Q;'S;=`%c<%lO%Q~@xS!a`#t~Oy%Qz;'S%Q;'S;=`%c<%lO%QjAZ[#}YOy%Qz!O%Q!O!P;Z!P!Q%Q!Q![=w![!g%Q!g!hSb[O]||-1},{term:125,get:O=>Xb[O]||-1},{term:4,get:O=>Tb[O]||-1},{term:25,get:O=>bb[O]||-1},{term:123,get:O=>yb[O]||-1}],tokenPrec:1963});var Hl=null;function Kl(){if(!Hl&&typeof document=="object"&&document.body){let{style:O}=document.body,e=[],t=new Set;for(let i in O)i!="cssText"&&i!="cssFloat"&&typeof O[i]=="string"&&(/[A-Z]/.test(i)&&(i=i.replace(/[A-Z]/g,r=>"-"+r.toLowerCase())),t.has(i)||(e.push(i),t.add(i)));Hl=e.sort().map(i=>({type:"property",label:i,apply:i+": "}))}return Hl||[]}var k$=["active","after","any-link","autofill","backdrop","before","checked","cue","default","defined","disabled","empty","enabled","file-selector-button","first","first-child","first-letter","first-line","first-of-type","focus","focus-visible","focus-within","fullscreen","has","host","host-context","hover","in-range","indeterminate","invalid","is","lang","last-child","last-of-type","left","link","marker","modal","not","nth-child","nth-last-child","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","part","placeholder","placeholder-shown","read-only","read-write","required","right","root","scope","selection","slotted","target","target-text","valid","visited","where"].map(O=>({type:"class",label:O})),w$=["above","absolute","activeborder","additive","activecaption","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","antialiased","appworkspace","asterisks","attr","auto","auto-flow","avoid","avoid-column","avoid-page","avoid-region","axis-pan","background","backwards","baseline","below","bidi-override","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","clear","clip","close-quote","col-resize","collapse","color","color-burn","color-dodge","column","column-reverse","compact","condensed","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","darken","dashed","decimal","decimal-leading-zero","default","default-button","dense","destination-atop","destination-in","destination-out","destination-over","difference","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic-abegede-gez","ethiopic-halehame-aa-er","ethiopic-halehame-gez","ew-resize","exclusion","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fill-box","fixed","flat","flex","flex-end","flex-start","footnotes","forwards","from","geometricPrecision","graytext","grid","groove","hand","hard-light","help","hidden","hide","higher","highlight","highlighttext","horizontal","hsl","hsla","hue","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-grid","inline-table","inset","inside","intrinsic","invert","italic","justify","keep-all","landscape","large","larger","left","level","lighter","lighten","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-hexadecimal","lower-latin","lower-norwegian","lowercase","ltr","luminosity","manipulation","match","matrix","matrix3d","medium","menu","menutext","message-box","middle","min-intrinsic","mix","monospace","move","multiple","multiple_mask_images","multiply","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","opacity","open-quote","optimizeLegibility","optimizeSpeed","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","perspective","pinch-zoom","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row","row-resize","row-reverse","rtl","run-in","running","s-resize","sans-serif","saturation","scale","scale3d","scaleX","scaleY","scaleZ","screen","scroll","scrollbar","scroll-position","se-resize","self-start","self-end","semi-condensed","semi-expanded","separate","serif","show","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","soft-light","solid","source-atop","source-in","source-out","source-over","space","space-around","space-between","space-evenly","spell-out","square","start","static","status-bar","stretch","stroke","stroke-box","sub","subpixel-antialiased","svg_masks","super","sw-resize","symbolic","symbols","system-ui","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","text","text-bottom","text-top","textarea","textfield","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","to","top","transform","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","unidirectional-pan","unset","up","upper-latin","uppercase","url","var","vertical","vertical-text","view-box","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","wrap","wrap-reverse","x-large","x-small","xor","xx-large","xx-small"].map(O=>({type:"keyword",label:O})).concat(["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"].map(O=>({type:"constant",label:O}))),xb=["a","abbr","address","article","aside","b","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","dd","del","details","dfn","dialog","div","dl","dt","em","figcaption","figure","footer","form","header","hgroup","h1","h2","h3","h4","h5","h6","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","main","meter","nav","ol","output","p","pre","ruby","section","select","small","source","span","strong","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","tr","u","ul"].map(O=>({type:"type",label:O})),kb=["@charset","@color-profile","@container","@counter-style","@font-face","@font-feature-values","@font-palette-values","@import","@keyframes","@layer","@media","@namespace","@page","@position-try","@property","@scope","@starting-style","@supports","@view-transition"].map(O=>({type:"keyword",label:O})),Wt=/^(\w[\w-]*|-\w[\w-]*|)$/,wb=/^-(-[\w-]*)?$/;function Zb(O,e){var t;if((O.name=="("||O.type.isError)&&(O=O.parent||O),O.name!="ArgList")return!1;let i=(t=O.parent)===null||t===void 0?void 0:t.firstChild;return i?.name!="Callee"?!1:e.sliceString(i.from,i.to)=="var"}var Z$=new Tt,vb=["Declaration"];function Yb(O){for(let e=O;;){if(e.type.isTop)return e;if(!(e=e.parent))return O}}function v$(O,e,t){if(e.to-e.from>4096){let i=Z$.get(e);if(i)return i;let r=[],n=new Set,s=e.cursor(C.IncludeAnonymous);if(s.firstChild())do for(let a of v$(O,s.node,t))n.has(a.label)||(n.add(a.label),r.push(a));while(s.nextSibling());return Z$.set(e,r),r}else{let i=[],r=new Set;return e.cursor().iterate(n=>{var s;if(t(n)&&n.matchContext(vb)&&((s=n.node.nextSibling)===null||s===void 0?void 0:s.name)==":"){let a=O.sliceString(n.from,n.to);r.has(a)||(r.add(a),i.push({label:a,type:"variable"}))}}),i}}var _b=O=>e=>{let{state:t,pos:i}=e,r=U(t).resolveInner(i,-1),n=r.type.isError&&r.from==r.to-1&&t.doc.sliceString(r.from,r.to)=="-";if(r.name=="PropertyName"||(n||r.name=="TagName")&&/^(Block|Styles)$/.test(r.resolve(r.to).name))return{from:r.from,options:Kl(),validFor:Wt};if(r.name=="ValueName")return{from:r.from,options:w$,validFor:Wt};if(r.name=="PseudoClassName")return{from:r.from,options:k$,validFor:Wt};if(O(r)||(e.explicit||n)&&Zb(r,t.doc))return{from:O(r)||n?r.from:i,options:v$(t.doc,Yb(r),O),validFor:wb};if(r.name=="TagName"){for(let{parent:o}=r;o;o=o.parent)if(o.name=="Block")return{from:r.from,options:Kl(),validFor:Wt};return{from:r.from,options:xb,validFor:Wt}}if(r.name=="AtKeyword")return{from:r.from,options:kb,validFor:Wt};if(!e.explicit)return null;let s=r.resolve(i),a=s.childBefore(i);return a&&a.name==":"&&s.name=="PseudoClassSelector"?{from:i,options:k$,validFor:Wt}:a&&a.name==":"&&s.name=="Declaration"||s.name=="ArgList"?{from:i,options:w$,validFor:Wt}:s.name=="Block"||s.name=="Styles"?{from:i,options:Kl(),validFor:Wt}:null},Rb=_b(O=>O.name=="VariableName"),xr=ne.define({name:"css",parser:x$.configure({props:[se.add({Declaration:le()}),te.add({"Block KeyframeList":me})]}),languageData:{commentTokens:{block:{open:"/*",close:"*/"}},indentOnInput:/^\s*\}$/,wordChars:"-"}});function ys(){return new J(xr,xr.data.of({autocomplete:Rb}))}var Vb=177,qb=179,zb=184,Ub=12,Wb=13,jb=17,Cb=20,Gb=25,Eb=53,Ab=95,Lb=142,Mb=144,Db=145,Ib=148,Bb=10,Nb=13,Fb=32,Hb=9,Y$=47,Kb=41,Jb=125,ey=new z((O,e)=>{for(let t=0,i=O.next;(e.context&&(i<0||i==Bb||i==Nb||i==Y$&&O.peek(t+1)==Y$)||i==Kb||i==Jb)&&O.acceptToken(Vb),!(i!=Fb&&i!=Hb);)i=O.peek(++t)},{contextual:!0}),ty=new Set([Ab,zb,Cb,Ub,jb,Mb,Db,Lb,Ib,Wb,Eb,Gb]),Oy=new Ge({start:!1,shift:(O,e)=>e==qb?O:ty.has(e)}),iy=F({"func interface struct chan map const type var":d.definitionKeyword,"import package":d.moduleKeyword,"switch for go select return break continue goto fallthrough case if else defer":d.controlKeyword,range:d.keyword,Bool:d.bool,String:d.string,Rune:d.character,Number:d.number,Nil:d.null,VariableName:d.variableName,DefName:d.definition(d.variableName),TypeName:d.typeName,LabelName:d.labelName,FieldName:d.propertyName,"FunctionDecl/DefName":d.function(d.definition(d.variableName)),"TypeSpec/DefName":d.definition(d.typeName),"CallExpr/VariableName":d.function(d.variableName),LineComment:d.lineComment,BlockComment:d.blockComment,LogicOp:d.logicOperator,ArithOp:d.arithmeticOperator,BitOp:d.bitwiseOperator,"DerefOp .":d.derefOperator,"UpdateOp IncDecOp":d.updateOperator,CompareOp:d.compareOperator,"= :=":d.definitionOperator,"<-":d.operator,'~ "*"':d.modifier,"; ,":d.separator,"... :":d.punctuation,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace}),ry={__proto__:null,package:10,import:18,true:380,false:380,nil:383,struct:48,func:68,interface:78,chan:94,map:118,make:157,new:159,const:204,type:212,var:224,if:236,else:238,switch:242,case:248,default:250,for:260,range:266,go:270,select:274,return:284,break:288,continue:290,goto:292,fallthrough:296,defer:300},_$=Oe.deserialize({version:14,states:"!=xO#{QQOOP$SOQOOO&UQTO'#CbO&]QRO'#FlO]QQOOOOQP'#Cn'#CnOOQP'#Co'#CoO&eQQO'#C|O(kQQO'#C{O)]QRO'#GiO+tQQO'#D_OOQP'#Ge'#GeO+{QQO'#GeO.aQTO'#GaO.hQQO'#D`OOQP'#Gm'#GmO.mQRO'#GdO/hQQO'#DgOOQP'#Gd'#GdO/uQQO'#DrO2bQQO'#DsO4QQTO'#GqO,^QTO'#GaO4XQQO'#DxO4^QQO'#D{OOQO'#EQ'#EQOOQO'#ER'#EROOQO'#ES'#ESOOQO'#ET'#ETO4cQQO'#EPO5}QQO'#EPOOQP'#Ga'#GaO6UQQO'#E`O6^QQO'#EcOOQP'#G`'#G`O6cQQO'#EsOOQP'#G_'#G_O&]QRO'#FnOOQO'#Fn'#FnO9QQQO'#G^QOQQOOO&]QROOO9XQQO'#C`O9^QSO'#CdO9lQQO'#C}O9tQQO'#DSO9yQQO'#D[O:kQQO'#CsO:pQQO'#DhO:uQQO'#EeO:}QQO'#EiO;VQQO'#EoO;_QQO'#EuOPQSO7+%hOOQP7+%h7+%hO4cQQO7+%hOOQP1G0Q1G0QO!>^QQO1G0QOOQP1G0U1G0UO!>fQQO1G0UOF|QQO1G0UOOQO,5nAN>nO4cQQOAN>nO!IsQSOAN>nOOQP<nQQO'#FrOOQO,5vAN>vO!LtQQOAN>vP.hQQO'#F|OOQPG25XG25XO!LyQQOG25bO!MOQQO'#FPOOQPG25bG25bO!MZQQOG25bOOQPLD)tLD)tOOQPG24bG24bO!JqQQOLD*|O!9OQQO'#GQO!McQQO,5;kOOQP,5;k,5;kO?tQQO'#FQO!MnQQO'#FQO!MsQQOLD*|OOQP!$'Nh!$'NhOOQO,5VO^!hOh!POr-TOw}O!P-_O!Q-`O!W-^O!]-eO%O!eO%Y!fO~OZ!sO~O^#uO~O!P$xO~On!lO#W%]aV%]a^%]ah%]ar%]aw%]a!P%]a!Q%]a!W%]a!]%]a#T%]a$w%]a%O%]a%Y%]au%]a~O]${O^#QO~OZ#RO^#VO!W#SO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]O~O]$|O!|,WO~PBROj!qOn%QO!QnOi%cP~P*aO!V%WO!|#`O~PBRO!V%YO~OV!}O[oO^YOaoOdoOh!POjcOr!pOw}O!P!OO!QnO!WaO!]!QO!phO!qhO#Y!RO#^!SO#d!TO#j!UO#m!VO#v!WO#{!XO#}!YO$S!ZO$U![O$V![O$W!]O$Y!^O$[!_O%OQO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~Oi%dX#p%dX#q%dX~PDQOi%]O~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!Q-QO!WaO!]!QO!phO!qhO%O+{O%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O^%aO%O%_O~O!QnO!a%cO~P*aO!QnOn$mX#T$mX#U$mXV$mX$w$mX!a$mX~P*aOn#TO#T%ea#U%eaV%ea$w%ea!a%ea~O]%fO~PF|OV#ga$w#ga~PDTO[%sO~OZ#rO[#qO]%vO%O#oO~O^!hOh!POn%zOr-TOu%xOw}O!P-_O!Q-`O!W-^O!]-eO%O,dO%Y!fO]%[P~O^&OOh!POr!jOw}O!P!OO!Q!kO!WaO!]!QO%Y!fO^%ZXj%ZX~O%O%}O~PKfOjcO^qa]qanqa!Vqa~O^#uO!W&SO~O^!hOh!POr-TOw}O{&WO!P-_O!Q-`O!W-^O!]-eO%O,xO%Y!fO~Oi&^O~PL{O^!hOh!POr!jOw}O!Q!kO!WaO!]!QO%O!eO%Y!fO~O!P#hO~PMwOi&eO%O,yO%Y!fO~O#T&gOV#ZX$w#ZX~P?tO]&kO%O#oO~O^!hOh!POr-TOw}O!P-_O!Q-`O!]-eO%O!eO%Y!fO~O!W&lO#T&mO~P! _O]&qO%O#oO~O#T&sOV#eX$w#eX~P?tO]&vO%O#oO~OjeX~P$XOjcO!|,XO~P2gOn!lO#W&yO#W%]X~O^#VOn#TO!Q#cO!W#SO!|,XO#R#dO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]OV`X#T%eX#U%eX~OZ&zOj$`O$w`X~P!#cOi'OO#p'PO#q'QO~OZ#ROjcO~P!#cO#T'TO#U#iO~O#W'UO~OV'WO!QnO~P*aOV'XO~OjcO~O!|#`OV#za$w#za~PBROi'[O#p']O#q'^O~On#TO!|#`OV%eX$w%eX!a%eX~PBRO!|#`OV$Za$w$Za~PBRO${$rO$|$rO$}'`O~O]${O~O%O!eO]%ZXn%ZX!V%ZX~PKfO!|#`Oi!_Xn!_X!a!`X~PBROi!_Xn!_X!a!`X~O!a'aO~On'bOi%cX~Oi'dO~On'eO!V%bX!a%bX~O!V'gO~O]'jOn'kO!|,YO~PBROn'nO!V'mO!a'oO!|#`O~PBRO!QnO!V'qO!a'rO~P*aO!|#`On$ma#T$ma#U$maV$ma$w$ma!a$ma~PBRO]'sOu'tO~O%Y#XO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOV!xiZ!xi^!xin!xi!Q!xi!W!xi!|!xi#R!xi#T!xi#U!xi$w!xi%`!xi%f!xi%g!xi%i!xi%p!xi%q!xi~O!V!xii!xi!a!xi~P!+YO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOV!xiZ!xi^!xin!xi!Q!xi!W!xi#R!xi#T!xi#U!xi$w!xi%p!xi%q!xi!V!xii!xi!a!xi~O!|!xi~P!-TO!|#`O~P!-TO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[OV!xiZ!xi^!xin!xi!Q!xi!W!xi#R!xi#T!xi#U!xi$w!xi%q!xi~O!|#`O!V!xii!xi!a!xi~P!/VO!|#`OV#Pi$w#Pi!a#Pi~PBRO]'uOn'wOu'vO~OZ#rO[#qO]'zO%O#oO~Ou'|O~P?tOn'}O]%[X~O](PO~OZeX^mX^!TXj!TX!W!TX~OjcOV$]i$w$]i~O%`(ZOV%^X$w%^Xn%^X!V%^X~Oi(`O~PL{O[(aO!W!tOVlX$wlX~On(bO~P?tO[(aOVlX$wlX~Oi(hO%O,yO%Y!fO~O!V(iO~O#T(kO~O](nO%O#oO~O[oO^YOaoOdoOh!POr!pOu-bOw}O!P!OO!QnO!V-UO!WaO!]!QO!phO!qhO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O%O+zO~P!4vO](sO%O#oO~O#T(tOV#ea$w#ea~O](xO%O#oO~O#k(yOV#ii$w#ii~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!Q-PO!WaO!]!QO!phO!qhO%O+xO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O^(|O%O%_O~O#p%dP#q%dP~P/uOi)PO#p'PO#q'QO~O!a)RO~O!QnO#y)VO~P*aOV)WO!|#`O~PBROj#wa~P;_OV)WO!QnO~P*aOi)]O#p']O#q'^O~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!QnO!WaO!]!QO!phO!qhO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O%O,eO~P!:lO!a)bO~Oj!qO!QnO~P*aOj!qO!QnOi%ca~P*aOn)iOi%ca~O!V%ba!a%ba~P?tOn)lO!V%ba!a%ba~O])nO~O])oO~O!V)pO~O!QnO!V)rO!a)sO~P*aO!V)rO!a)sO!|#`O~PBRO])uOn)vO~O])wOn)xO~O^!hOh!POr-TOu%xOw}O!P-_O!Q-`O!W-^O!]-eO%O,dO%Y!fO~O]%[a~P!>nOn)|O]%[a~O]${O]tXntX~OjcOV$^q$w$^q~On*PO{&WO~P?tOn*SO!V%rX~O!V*UO~OjcOV$]q$w$]q~O%`(ZOV|a$w|an|a!V|a~O[*]OVla$wla~O[*]O!W!tOVla$wla~On*PO{&WO!W*`O^%WXj%WX~P! _OjcO#j!UO~OjcO!|,XO~PBROZ*dO^#VO!W#SO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]O~O!|#`O~P!BoO#^*eO~P?tO!a*fO~Oj$`O!|,XO~P!BoO#W*hO~Oj#wi~P;_OV*kO!|#`O~PBROn#TO!Q#cO!|#`O!a$QX#T%eX~PBRO#T*lO~O#W*lO~O!a*mO~O!|#`Oi!_in!_i~PBRO!|#`Oi!bXn!bX!a!cX~PBROi!bXn!bX!a!cX~O!a*nO~Oj!qO!QnOi%ci~P*aO!V%bi!a%bi~P?tO!V*qO!a*rO!|#`O~PBRO!V*qO!|#`O~PBRO]*tO~O]*uO~O]*uOu*vO~O]%[i~P!>nO%O!eO!V%ra~On*|O!V%ra~O[+OOVli$wli~O%O+yO~P!4vO#k+QOV#iy$w#iy~O^+RO%O%_O~O]+SO~O!|,XOj#xq~PBROj#wq~P;_O!V+ZO!|#`O~PBRO]+[On+]O~O%O!eO!V%ri~O^#QOn'eO!V%bX~O#^+`O~P?tOj+aO~O^#VO!W#SO!|#`O%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]O~OZ+cO~P!JvO!|#`O!a$Qi~PBRO!|#`Oi!bin!bi~PBRO!V+dO!|#`O~PBRO]+eO~O]+fO~Oi+iO#p+jO#q+kO~O^+lO%O%_O~Oi+pO#p+jO#q+kO~O!a+rO~O#^+sO~P?tO!a+tO~O]+uO~OZeX^eX^!TXj!TX!WeX!W!TX!|eX%YeX%`eX%feX%geX%ieX%jeX%keX%leX%meX%neX%oeX%peX%qeXVeXneX!QeX#ReX#TeX#UeX$weX~O]eX]!TX!VeXieX!aeX~P!NUOjeX~P!NUOZeX^eX^!TXj!TX!WeX!W!TX!|eX%YeX%`eX%feX%geX%ieX%jeX%keX%leX%meX%neX%oeX%peX%qeXn!TX!VeX~O]eX!V!TX~P#!gOh!TXr!TXw!TX{!TX!P!TX!Q!TX!]!TX%O!TX%Y!TX~P#!gOZeX^eX^!TXj!TXneX!WeX!W!TX!|eX%YeX%`eX%feX%geX%ieX%jeX%keX%leX%meX%neX%oeX%peX%qeX~O]eXueX~P#$xO]$mXn$mXu$mX~PF|Oj$mXn$mX~P!7`On+|O]%eau%ea~On+}Oj%ea~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!Q-OO!WaO!]!QO!phO!qhO%O+yO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~OZeX]!TX^UXhUXnUXn!TXrUXuUXwUX!PUX!QUX!WUX!W!TX!]UX%OUX%YUX~OnUX!QeX!aeX#TeX#WUX~P#$xOn+|O!|,YO]%eXu%eX~PBROn+}O!|,XOj%eX~PBRO^&OOV%ZXj%ZX$w%ZX]%ZXn%ZX!V%ZXu%ZX%`%ZX#T%ZX[%ZX!a%ZX~P?wO!|,YO]$man$mau$ma~PBRO!|,XOj$man$ma~PBRO%Y#XO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOZ!xi]!xi^!xi!W!xi!|!xi%`!xi%f!xi%g!xi%i!xi%p!xi%q!xi~Oj!xi~P!+YOn!xiu!xi~P#,hO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOZ!xi]!xi^!xi!W!xi!|!xi%p!xi%q!xi~O%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOV!xiZ!xi^!xij!xin!xi!Q!xi!W!xi#R!xi#T!xi#U!xi$w!xi%p!xi%q!xi~O!|!xi~P#/_On!xiu!xi~P#.TO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOZ!xi]!xi^!xi!W!xi%p!xi%q!xi~O!|,WO~P#1^O!|,XO~P#/_O!|,YOn!xiu!xi~P#1^O%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[OZ!xi]!xi^!xi!W!xi%q!xi~O!|,WO~P#3QO!|,XOj!xi~P!/VO!|,YOn!xiu!xi~P#3QO!|,XOj#Pi~PBROV!TXZeX^mX!W!TX$w!TX~O%`!TX~P#5RO[!TXhmXnmXrmXwmX!PmX!QmX!WmX!]mX%OmX%YmX~P#5ROn#TO!Q,aO!|,XO#R#dOj`X#T%eX#U%eX~PBRO[oO^YOaoOdoOh!POr!pOw}O!P#hO!WaO!]!QO!phO!qhO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O!Q-OO%O+yO~P#6{O!Q-PO%O+xO~P#6{O!Q-QO%O+{O~P#6{O#T,bO#U,bO~O#W,cO~O^!hOh!POr-TOw}O!P-_O!Q-WO!W-^O!]-eO%O!eO%Y!fO~O^!hOh!POr-TOw}O!Q-`O!W-^O!]-eO%O!eO%Y!fO~O!P-VO~P#9zO%O+wO~P!4vO!P-XO~O!V-YO!|#`O~PBRO!V-ZO~O!V-[O~O!W-dO~OP%ka%Oa~",goto:"!FW%sPP%tP%wP%zP'SP'XPPPP'`'cP'u'uP)w'u-_PPP0j0m0qP1V4b1VP7s8WP1VP8a8d8hP8p8w1VPP1V8{<`?vPPCY-_-_-_PCdCuCxPC{DQ'u'uDV'uES'u'u'u'uGUIW'uPPJR'uJUMjMjMj'u! r! r!#SP!$`!%d!&d'cP'cPP'cP!&yP!'V!'^!&yP!'a!'h!'n!'w!&yP!'z!(R!&y!(U!(fPP!&yP!(x!)UPP!&y!)Y!)c!&yP!)g!)gP!&yP!&yP!)j!)m!&v!&yP!&yPPP!&yP!&yP!)q!)q!)w!)}!*U!*[!*d!*j!*p!*w!*}!+T!+Z!.q!.x!/O!/X!/m!/s!/z!0Q!0W!0^!0d!0jPPPPPPPPP!0p!1f!1k!1{!2kPP!7P!:^P!>u!?Z!?_!@Z!@fP!@p!D_!Df!Di!DuPPPPPPPPPPPP!FSR!aPRyO!WXOScw!R!T!U!W#O#k#n#u$R$X&O&j&u&|'W'Y']'})W)|*k*w+gQ#pzU#r{#s%uQ#x|U$T!S$U&pQ$^!VQ$y!lR)U'RVROS#nQ#t{T%t#s%uR#t{qrOScw!U!V!W#O#k#n&|'W'Y)W*k+g%PoOSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^%O]OSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^#u!iW^!O!h!t!z#e#h#u#v#y#|#}$P$Q$T$W$v$x%W%Y%a%x%y&O&S&W&]&`&b&d&m'e'|'}(S([(c(i(o(|)l)|*P*Q*S*p*w*|+R+^+j+l,h-U-V-W-X-Y-Z-[-]-_-d'cbOSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dR$O!PT&c#}&dW%`#R&z*d+cQ&Q#vS&V#y&]S&`#}&dR*Y(b'cZOSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-d%fWOSWYacmnw!O!U!V!W!X!Z!_!q!z#O#Q#S#T#V#^#_#`#a#b#c#h#i#j#k#n#v#|$f$v$x%W%Y%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(i(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^S&b#}&d!{-]!h!t#e#u#y$P$Q$T$W%a%x%y&O&W&]&`&m'e'|'}(S([(c(o(|)l)|*Q*p*w+R+j+l,h-U-V-W-X-Y-Z-[-]-_-dQ#v|S$v!j!pU&P#v$v,hZ,h#x&Q&U&V-TS%{#u&OV){'})|*wR#z}T&[#y&]]&X#y&](S([(o*QZ&Z#y&](S(o*QT([&Y(]'s_OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|#}$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&S&W&]&`&b&d&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*P*Q*S*`*h*k*l*n*o*p*r*w*|+R+^+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-d'r_OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|#}$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&S&W&]&`&b&d&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*P*Q*S*`*h*k*l*n*o*p*r*w*|+R+^+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dR!w^'bbOSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dS&a#}&dR(d&bS!u]fX!x`&_(e(oQ!r[Q%O!qQ)d'aU)f'b)i*oR+X*nR%R!qR%P!qV)h'b)i*oV)g'b)i*odtOScw#O#k#n&|'Y+gQ$h!WQ&R#wQ&w$[S'S$c$iQ(V&TQ*O(RQ*V(WQ*b(yQ*c(zR+_+Q%PfOSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^%PgOSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^!q#Weg!o!y$[$_$c$j$m$q$}%^%b%d%m'V'p(z({)S)Y)^)c)e)q)t*i*s+T+V+W+Y,f,g,i,j,w,z-aR#fh#^mOSacmnw!X!Z!_!q#O#S#T#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&y&|'P'T'U'X'Y']'a'b'o'r(k(t)i)s*`*h*l*n*o*r+g-^!W#_e!y$j$m$q$}%b%d%j%k%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aW,T!o,n,q,tj,U$[$_$c(z)S*i,g,j,o,r,u,w,z[,V%^,f,i,p,s,v`,{Y,Q,T,W,Z,^,{-Ox,|!U!V!W&x'R'W)V)W*k+},R,U,X,[,_,a,b,c,|-Pg,}#Q#V'w+|,S,V,Y,],`,}-Q#^mOSacmnw!X!Z!_!q#O#S#T#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&y&|'P'T'U'X'Y']'a'b'o'r(k(t)i)s*`*h*l*n*o*r+g-^`,{Y,Q,T,W,Z,^,{-Ox,|!U!V!W&x'R'W)V)W*k+},R,U,X,[,_,a,b,c,|-Pg,}#Q#V'w+|,S,V,Y,],`,}-Q!Y#^e!y$j$m$q$}%b%d%i%j%k%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aY,Q!o,k,n,q,tl,R$[$_$c(z)S*i,g,j,l,o,r,u,w,z_,S%^,f,i,m,p,s,v!W#_e!y$j$m$q$}%b%d%j%k%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aW,T!o,n,q,tj,U$[$_$c(z)S*i,g,j,o,r,u,w,z],V%^,f,i,p,s,v!S#ae!y$j$m$q$}%b%d%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aS,Z!o,tf,[$[$_$c(z)S*i,g,j,u,w,zX,]%^,f,i,v!Q#be!y$j$m$q$}%b%d%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aQ,^!od,_$[$_$c(z)S*i,g,j,w,zV,`%^,f,iprOScw!U!V!W#O#k#n&|'W'Y)W*k+gR)a']etOScw#O#k#n&|'Y+gQ$S!RT&i$R&jR$S!RQ$V!ST&o$U&pQ&U#xR&m$TS(T&S&lV*{*S*|+^R$V!SQ$Y!TT&t$X&uR$Y!TdsOScw#O#k#n&|'Y+gT$p![!]dtOScw#O#k#n&|'Y+gQ*b(yR+_+QQ$a!VQ&{$_Q)T'RR*g)ST&|$`&}Q+b+SQ+m+fR+v+uT+g+a+hR$i!WR$l!YT'Y$k'ZXuOSw#nQ$s!`R'_$sSSO#nR!dSQ%u#sR'y%uUwOS#nR#mwQ&d#}R(g&dQ(c&`R*Z(cS!mX$^R$z!mQ(O%{R)}(OQ&]#yR(_&]Q(]&YR*X(]'r^OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|#}$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&S&W&]&`&b&d&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*P*Q*S*`*h*k*l*n*o*p*r*w*|+R+^+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dR!v^S'f%T+PR)m'fQ'c%RR)j'cW#Oc&|'Y+gR%[#O^#Ue$[$_$c$m)^,zU%e#U,O,PQ,O,fR,P,gQ&j$RR(m&jS*Q(S(oR*y*QQ*T(TR*}*TQ&p$UR(r&pQ&u$XR(w&uQ&}$`R)O&}Q+h+aR+o+hQ'Z$kR)['ZQ!cRQ#luQ#nyQ%Z!|Q&x$]Q'R$bQ'x%tQ(^&[Q(f&cQ(l&iQ(q&oR(v&tVxOS#nWuOSw#nY!|c#O&|'Y+gR%r#kdtOScw#O#k#n&|'Y+gQ$]!UQ$b!VQ$g!WQ)X'WQ*j)WR+U*kdeOScw#O#k#n&|'Y+gQ!oYQ!ya`#gmn,{,|,}-O-P-QQ$[!UQ$_!VQ$c!WQ$j!Xd$m!Z#i#j&g&s'P'T'U(k(tQ$q!_Q$}!qQ%^#QQ%b#SQ%d#TW%h#^,Q,R,SQ%i#_Q%j#`Q%k#aQ%l#bQ%m#cQ'V$fQ'p%cQ(z&xQ({&yQ)S'RQ)Y'XQ)^']Q)c'aU)e'b)i*oQ)q'oQ)t'rQ*i)VQ*s)sQ+T*hQ+V*lQ+W*nQ+Y*rS,f#V'wS,g,b,cQ,i+|Q,j+}Q,k,TQ,l,UQ,m,VQ,n,WQ,o,XQ,p,YQ,q,ZQ,r,[Q,s,]Q,t,^Q,u,_Q,v,`Q,w,aU,z'W)W*kV-a&l*`-^#bZW!O!h!t!z#e#h#u#v#y#|$P$Q$T$W$v$x%W%Y%a%x%y&O&W&]&`&m'e'|'}(S([(c(i(o(|)l)|*Q*p*w+R+j+l,h-U-V-W-X-Y-Z-[-]-_-d%P[OSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^$zdOSacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^S!gW-]Q!nYS#{!O-_Q$u!hS%T!t+jS%X!z-UQ%n#e[%o#h#|$x-V-W-XW%w#u'})|*wU&P#v$v,h[&X#y&](S([(o*QQ&f$PQ&h$QQ&n$TQ&r$WS'h%W-YS'i%Y-ZW'l%a(|+R+lS'{%x%yQ(Q&OQ(Y&WQ(d&`Q(p&mU)k'e)l*pQ)z'|Q*[(cS*^(i-[Q+P*`R-c-dS#w|!pS$w!j-TQ&T#xQ(R&QQ(W&UR(X&VT%|#u&OhqOScw!U!V#O#k#n&|'Y+gU$Q!R$R&jU$W!T$X&uQ$e!WY%y#u&O'})|*wQ)`']V-S'W)W*kS&[#y&]S*R(S(oR*z*QY&Y#y&](S(o*QR*W(['``OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dS&_#}&dW(S&S*S*|+^Q(e&bQ(o&lR*x*PS%U!t*`R+q+jR%S!qQ#PcQ(}&|Q)Z'YR+n+ghpOScw!U!V#O#k#n&|'Y+gQ$d!WQ$n!ZQ%g#VU%p#i'T,bU%q#j'U,cQ(j&gQ(u&sQ)Q'PQ)_']Q)y'wQ*_(kQ*a(tV-R'W)W*kT(U&S&l",nodeNames:"\u26A0 LineComment BlockComment SourceFile PackageClause package DefName ; ImportDecl import ImportSpec . String ) ( SpecList ExprStatement Number Bool Nil Rune VariableName TypedLiteral StructType struct } { StructBody FieldDecl FieldName , PointerType * FunctionType func Parameters Parameter ... InterfaceType interface InterfaceBody MethodElem UnderlyingType ~ TypeElem LogicOp ChannelType chan <- ParenthesizedType QualifiedType TypeName ParameterizedType ] [ TypeArgs ArrayType SliceType MapType map LiteralValue Element Key : Element Key ParenthesizedExpr FunctionLiteral Block Conversion SelectorExpr IndexExpr SliceExpr TypeAssertion CallExpr ParameterizedExpr Arguments CallExpr make new Arguments UnaryExp ArithOp LogicOp BitOp DerefOp BinaryExp ArithOp BitOp BitOp CompareOp LogicOp LogicOp SendStatement IncDecStatement IncDecOp Assignment = UpdateOp VarDecl := ConstDecl const ConstSpec SpecList TypeDecl type TypeSpec TypeParams TypeParam SpecList VarDecl var VarSpec SpecList LabeledStatement LabelName IfStatement if else SwitchStatement switch SwitchBlock Case case default TypeSwitchStatement SwitchBlock Case ForStatement for ForClause RangeClause range GoStatement go SelectStatement select SelectBlock Case ReceiveStatement ReturnStatement return GotoStatement break continue goto FallthroughStatement fallthrough DeferStatement defer FunctionDecl MethodDecl",maxTerm:218,context:Oy,nodeProps:[["isolate",-3,2,12,20,""],["group",-18,12,17,18,19,20,21,22,66,67,69,70,71,72,73,74,77,81,86,"Expr",-20,16,68,93,94,96,99,101,105,111,115,117,120,126,129,134,136,141,143,147,149,"Statement",-12,23,31,33,38,46,49,50,51,52,56,57,58,"Type"],["openedBy",13,"(",25,"{",53,"["],["closedBy",14,")",26,"}",54,"]"]],propSources:[iy],skippedNodes:[0,1,2,153],repeatNodeCount:23,tokenData:":b~RvXY#iYZ#i]^#ipq#iqr#zrs$Xuv&Pvw&^wx&yxy(qyz(vz{({{|)T|})e}!O)j!O!P)u!P!Q+}!Q!R,y!R![-t![!]2^!]!^2k!^!_2p!_!`3]!`!a3e!c!}3x!}#O4j#P#Q4o#Q#R4t#R#S4|#S#T9X#T#o3x#o#p9q#p#q9v#q#r:W#r#s:]$g;'S3x;'S;=`4d<%lO3x~#nS$y~XY#iYZ#i]^#ipq#iU$PP%hQ!_!`$SS$XO!|S~$^W[~OY$XZr$Xrs$vs#O$X#O#P${#P;'S$X;'S;=`%y<%lO$X~${O[~~%ORO;'S$X;'S;=`%X;=`O$X~%^X[~OY$XZr$Xrs$vs#O$X#O#P${#P;'S$X;'S;=`%y;=`<%l$X<%lO$X~%|P;=`<%l$X~&UP%l~!_!`&X~&^O#U~~&cR%j~vw&l!_!`&X#Q#R&q~&qO%p~~&vP%o~!_!`&X~'OWd~OY&yZw&ywx'hx#O&y#O#P'm#P;'S&y;'S;=`(k<%lO&y~'mOd~~'pRO;'S&y;'S;=`'y;=`O&y~(OXd~OY&yZw&ywx'hx#O&y#O#P'm#P;'S&y;'S;=`(k;=`<%l&y<%lO&y~(nP;=`<%l&y~(vO^~~({O]~~)QP%Y~!_!`&X~)YQ%f~{|)`!_!`&X~)eO#R~~)jOn~~)oQ%g~}!O)`!_!`&X~)zRZS!O!P*T!Q![*`#R#S+w~*WP!O!P*Z~*`Ou~Q*eTaQ!Q![*`!g!h*t#R#S+w#X#Y*t#]#^+rQ*wS{|+T}!O+T!Q![+^#R#S+lQ+WQ!Q![+^#R#S+lQ+cRaQ!Q![+^#R#S+l#]#^+rQ+oP!Q![+^Q+wOaQQ+zP!Q![*`~,SR%k~z{,]!P!Q,b!_!`&X~,bO$z~~,gSP~OY,bZ;'S,b;'S;=`,s<%lO,b~,vP;=`<%l,bQ-O[aQ!O!P*`!Q![-t!d!e.c!g!h*t!q!r/Z!z!{/x#R#S.]#U#V.c#X#Y*t#]#^+r#c#d/Z#l#m/xQ-yUaQ!O!P*`!Q![-t!g!h*t#R#S.]#X#Y*t#]#^+rQ.`P!Q![-tQ.fR!Q!R.o!R!S.o#R#S/QQ.tSaQ!Q!R.o!R!S.o#R#S/Q#]#^+rQ/TQ!Q!R.o!R!S.oQ/^Q!Q!Y/d#R#S/rQ/iRaQ!Q!Y/d#R#S/r#]#^+rQ/uP!Q!Y/dQ/{T!O!P0[!Q![1c!c!i1c#R#S2Q#T#Z1cQ0_S!Q![0k!c!i0k#R#S1V#T#Z0kQ0pVaQ!Q![0k!c!i0k!r!s*t#R#S1V#T#Z0k#]#^+r#d#e*tQ1YR!Q![0k!c!i0k#T#Z0kQ1hWaQ!O!P0k!Q![1c!c!i1c!r!s*t#R#S2Q#T#Z1c#]#^+r#d#e*tQ2TR!Q![1c!c!i1c#T#Z1c~2cP!a~!_!`2f~2kO#W~~2pOV~~2uR!|S}!O3O!^!_3T!_!`$S~3TO!Q~~3YP%m~!_!`&X~3bP#T~!_!`$S~3jQ!|S!_!`$S!`!a3p~3uP%n~!_!`&X~3}V%O~!Q![3x!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~4gP;=`<%l3x~4oO!W~~4tO!V~~4yP%i~!_!`&X~5RV%O~!Q![5h!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~5o^aQ%O~!O!P*`!Q![5h!c!g3x!g!h6k!h!}3x#R#S4|#T#X3x#X#Y6k#Y#]3x#]#^8k#^#o3x$g;'S3x;'S;=`4d<%lO3x~6pX%O~{|+T}!O+T!Q![7]!c!}3x#R#S8P#T#o3x$g;'S3x;'S;=`4d<%lO3x~7dXaQ%O~!Q![7]!c!}3x#R#S8P#T#]3x#]#^8k#^#o3x$g;'S3x;'S;=`4d<%lO3x~8UV%O~!Q![7]!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~8rVaQ%O~!Q![3x!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~9[TO#S9X#S#T$v#T;'S9X;'S;=`9k<%lO9X~9nP;=`<%l9X~9vOj~~9{Q%`~!_!`&X#p#q:R~:WO%q~~:]Oi~~:bO{~",tokenizers:[ey,1,2,new kt("j~RQYZXz{^~^O$|~~aP!P!Qd~iO$}~~",25,181)],topRules:{SourceFile:[0,3]},dynamicPrecedences:{19:1,51:-1,55:2,69:-1,108:-1},specialized:[{term:184,get:O=>ry[O]||-1}],tokenPrec:5451});var ny=[W("func ${name}(${params}) ${type} {\n ${}\n}",{label:"func",detail:"declaration",type:"keyword"}),W("func (${receiver}) ${name}(${params}) ${type} {\n ${}\n}",{label:"func",detail:"method declaration",type:"keyword"}),W("var ${name} = ${value}",{label:"var",detail:"declaration",type:"keyword"}),W("type ${name} ${type}",{label:"type",detail:"declaration",type:"keyword"}),W("const ${name} = ${value}",{label:"const",detail:"declaration",type:"keyword"}),W("type ${name} = ${type}",{label:"type",detail:"alias declaration",type:"keyword"}),W("for ${init}; ${test}; ${update} {\n ${}\n}",{label:"for",detail:"loop",type:"keyword"}),W("for ${i} := range ${value} {\n ${}\n}",{label:"for",detail:"range",type:"keyword"}),W(`select { + \${} +}`,{label:"select",detail:"statement",type:"keyword"}),W("case ${}:\n${}",{label:"case",type:"keyword"}),W("switch ${} {\n ${}\n}",{label:"switch",detail:"statement",type:"keyword"}),W("switch ${}.(${type}) {\n ${}\n}",{label:"switch",detail:"type statement",type:"keyword"}),W("if ${} {\n ${}\n}",{label:"if",detail:"block",type:"keyword"}),W(`if \${} { + \${} +} else { + \${} +}`,{label:"if",detail:"/ else block",type:"keyword"}),W('import ${name} "${module}"\n${}',{label:"import",detail:"declaration",type:"keyword"})],R$=new Tt,q$=new Set(["SourceFile","Block","FunctionDecl","MethodDecl","FunctionLiteral","ForStatement","SwitchStatement","TypeSwitchStatement","IfStatement"]);function Pi(O,e){return(t,i)=>{e:for(let r=t.node.firstChild,n=0,s=null;;){for(;!r;){if(!n)break e;n--,r=s.nextSibling,s=s.parent}e&&r.name==e||r.name=="SpecList"?(n++,s=r,r=r.firstChild):(r.name=="DefName"&&i(r,O),r=r.nextSibling)}return!0}}var sy={FunctionDecl:Pi("function"),VarDecl:Pi("var","VarSpec"),ConstDecl:Pi("constant","ConstSpec"),TypeDecl:Pi("type","TypeSpec"),ImportDecl:Pi("constant","ImportSpec"),Parameter:Pi("var"),__proto__:null};function z$(O,e){let t=R$.get(e);if(t)return t;let i=[],r=!0;function n(s,a){let o=O.sliceString(s.from,s.to);i.push({label:o,type:a})}return e.cursor(C.IncludeAnonymous).iterate(s=>{if(r)r=!1;else if(s.name){let a=sy[s.name];if(a&&a(s,n)||q$.has(s.name))return!1}else if(s.to-s.from>8192){for(let a of z$(O,s.node))i.push(a);return!1}}),R$.set(e,i),i}var V$=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,U$=["String","LineComment","BlockComment","DefName","LabelName","FieldName",".","?."],ay=O=>{let e=U(O.state).resolveInner(O.pos,-1);if(U$.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&V$.test(O.state.sliceDoc(e.from,e.to));if(!t&&!O.explicit)return null;let i=[];for(let r=e;r;r=r.parent)q$.has(r.name)&&(i=i.concat(z$(O.state.doc,r)));return{options:i,from:t?e.from:O.pos,validFor:V$}},Jl=ne.define({name:"go",parser:_$.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),LabeledStatement:sO,"SwitchBlock SelectBlock":O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t||i?0:O.unit)},Block:be({closing:"}"}),BlockComment:()=>null,Statement:le({except:/^{/})}),te.add({"Block SwitchBlock SelectBlock LiteralValue InterfaceType StructType SpecList":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case\b|default\b|\})$/}}),oy=O=>({label:O,type:"keyword"}),ly="interface struct chan map package go return break continue goto fallthrough else defer range true false nil".split(" ").map(oy);function W$(){let O=ny.concat(ly);return new J(Jl,[Jl.data.of({autocomplete:cO(U$,zt(O))}),Jl.data.of({autocomplete:ay})])}var cy=55,hy=1,fy=56,dy=2,uy=57,Qy=3,j$=4,$y=5,rc=6,I$=7,B$=8,N$=9,F$=10,py=11,my=12,gy=13,ec=58,Py=14,Sy=15,C$=59,H$=21,Xy=23,K$=24,Ty=25,Oc=27,J$=28,by=29,yy=32,xy=35,ky=37,wy=38,Zy=0,vy=1,Yy={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},_y={dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},G$={dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}};function Ry(O){return O==45||O==46||O==58||O>=65&&O<=90||O==95||O>=97&&O<=122||O>=161}var E$=null,A$=null,L$=0;function ic(O,e){let t=O.pos+e;if(L$==t&&A$==O)return E$;let i=O.peek(e),r="";for(;Ry(i);)r+=String.fromCharCode(i),i=O.peek(++e);return A$=O,L$=t,E$=r?r.toLowerCase():i==Vy||i==qy?void 0:null}var ep=60,xs=62,nc=47,Vy=63,qy=33,zy=45;function M$(O,e){this.name=O,this.parent=e}var Uy=[rc,F$,I$,B$,N$],Wy=new Ge({start:null,shift(O,e,t,i){return Uy.indexOf(e)>-1?new M$(ic(i,1)||"",O):O},reduce(O,e){return e==H$&&O?O.parent:O},reuse(O,e,t,i){let r=e.type.id;return r==rc||r==ky?new M$(ic(i,1)||"",O):O},strict:!1}),jy=new z((O,e)=>{if(O.next!=ep){O.next<0&&e.context&&O.acceptToken(ec);return}O.advance();let t=O.next==nc;t&&O.advance();let i=ic(O,0);if(i===void 0)return;if(!i)return O.acceptToken(t?Sy:Py);let r=e.context?e.context.name:null;if(t){if(i==r)return O.acceptToken(py);if(r&&_y[r])return O.acceptToken(ec,-2);if(e.dialectEnabled(Zy))return O.acceptToken(my);for(let n=e.context;n;n=n.parent)if(n.name==i)return;O.acceptToken(gy)}else{if(i=="script")return O.acceptToken(I$);if(i=="style")return O.acceptToken(B$);if(i=="textarea")return O.acceptToken(N$);if(Yy.hasOwnProperty(i))return O.acceptToken(F$);r&&G$[r]&&G$[r][i]?O.acceptToken(ec,-1):O.acceptToken(rc)}},{contextual:!0}),Cy=new z(O=>{for(let e=0,t=0;;t++){if(O.next<0){t&&O.acceptToken(C$);break}if(O.next==zy)e++;else if(O.next==xs&&e>=2){t>=3&&O.acceptToken(C$,-2);break}else e=0;O.advance()}});function Gy(O){for(;O;O=O.parent)if(O.name=="svg"||O.name=="math")return!0;return!1}var Ey=new z((O,e)=>{if(O.next==nc&&O.peek(1)==xs){let t=e.dialectEnabled(vy)||Gy(e.context);O.acceptToken(t?$y:j$,2)}else O.next==xs&&O.acceptToken(j$,1)});function sc(O,e,t){let i=2+O.length;return new z(r=>{for(let n=0,s=0,a=0;;a++){if(r.next<0){a&&r.acceptToken(e);break}if(n==0&&r.next==ep||n==1&&r.next==nc||n>=2&&ns?r.acceptToken(e,-s):r.acceptToken(t,-(s-2));break}else if((r.next==10||r.next==13)&&a){r.acceptToken(e,1);break}else n=s=0;r.advance()}})}var Ay=sc("script",cy,hy),Ly=sc("style",fy,dy),My=sc("textarea",uy,Qy),Dy=F({"Text RawText IncompleteTag IncompleteCloseTag":d.content,"StartTag StartCloseTag SelfClosingEndTag EndTag":d.angleBracket,TagName:d.tagName,"MismatchedCloseTag/TagName":[d.tagName,d.invalid],AttributeName:d.attributeName,"AttributeValue UnquotedAttributeValue":d.attributeValue,Is:d.definitionOperator,"EntityReference CharacterReference":d.character,Comment:d.blockComment,ProcessingInst:d.processingInstruction,DoctypeDecl:d.documentMeta}),tp=Oe.deserialize({version:14,states:",xOVO!rOOO!ZQ#tO'#CrO!`Q#tO'#C{O!eQ#tO'#DOO!jQ#tO'#DRO!oQ#tO'#DTO!tOaO'#CqO#PObO'#CqO#[OdO'#CqO$kO!rO'#CqOOO`'#Cq'#CqO$rO$fO'#DUO$zQ#tO'#DWO%PQ#tO'#DXOOO`'#Dl'#DlOOO`'#DZ'#DZQVO!rOOO%UQ&rO,59^O%aQ&rO,59gO%lQ&rO,59jO%wQ&rO,59mO&SQ&rO,59oOOOa'#D_'#D_O&_OaO'#CyO&jOaO,59]OOOb'#D`'#D`O&rObO'#C|O&}ObO,59]OOOd'#Da'#DaO'VOdO'#DPO'bOdO,59]OOO`'#Db'#DbO'jO!rO,59]O'qQ#tO'#DSOOO`,59],59]OOOp'#Dc'#DcO'vO$fO,59pOOO`,59p,59pO(OQ#|O,59rO(TQ#|O,59sOOO`-E7X-E7XO(YQ&rO'#CtOOQW'#D['#D[O(hQ&rO1G.xOOOa1G.x1G.xOOO`1G/Z1G/ZO(sQ&rO1G/ROOOb1G/R1G/RO)OQ&rO1G/UOOOd1G/U1G/UO)ZQ&rO1G/XOOO`1G/X1G/XO)fQ&rO1G/ZOOOa-E7]-E7]O)qQ#tO'#CzOOO`1G.w1G.wOOOb-E7^-E7^O)vQ#tO'#C}OOOd-E7_-E7_O){Q#tO'#DQOOO`-E7`-E7`O*QQ#|O,59nOOOp-E7a-E7aOOO`1G/[1G/[OOO`1G/^1G/^OOO`1G/_1G/_O*VQ,UO,59`OOQW-E7Y-E7YOOOa7+$d7+$dOOO`7+$u7+$uOOOb7+$m7+$mOOOd7+$p7+$pOOO`7+$s7+$sO*bQ#|O,59fO*gQ#|O,59iO*lQ#|O,59lOOO`1G/Y1G/YO*qO7[O'#CwO+SOMhO'#CwOOQW1G.z1G.zOOO`1G/Q1G/QOOO`1G/T1G/TOOO`1G/W1G/WOOOO'#D]'#D]O+eO7[O,59cOOQW,59c,59cOOOO'#D^'#D^O+vOMhO,59cOOOO-E7Z-E7ZOOQW1G.}1G.}OOOO-E7[-E7[",stateData:",c~O!_OS~OUSOVPOWQOXROYTO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O|_O!eZO~OgaO~OgbO~OgcO~OgdO~OgeO~O!XfOPmP![mP~O!YiOQpP![pP~O!ZlORsP![sP~OUSOVPOWQOXROYTOZqO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O!eZO~O![rO~P#gO!]sO!fuO~OgvO~OgwO~OS|OT}OiyO~OS!POT}OiyO~OS!ROT}OiyO~OS!TOT}OiyO~OS}OT}OiyO~O!XfOPmX![mX~OP!WO![!XO~O!YiOQpX![pX~OQ!ZO![!XO~O!ZlORsX![sX~OR!]O![!XO~O![!XO~P#gOg!_O~O!]sO!f!aO~OS!bO~OS!cO~Oj!dOShXThXihX~OS!fOT!gOiyO~OS!hOT!gOiyO~OS!iOT!gOiyO~OS!jOT!gOiyO~OS!gOT!gOiyO~Og!kO~Og!lO~Og!mO~OS!nO~Ol!qO!a!oO!c!pO~OS!rO~OS!sO~OS!tO~Ob!uOc!uOd!uO!a!wO!b!uO~Ob!xOc!xOd!xO!c!wO!d!xO~Ob!uOc!uOd!uO!a!{O!b!uO~Ob!xOc!xOd!xO!c!{O!d!xO~OT~cbd!ey|!e~",goto:"%q!aPPPPPPPPPPPPPPPPPPPPP!b!hP!nPP!zP!}#Q#T#Z#^#a#g#j#m#s#y!bP!b!bP$P$V$m$s$y%P%V%]%cPPPPPPPP%iX^OX`pXUOX`pezabcde{!O!Q!S!UR!q!dRhUR!XhXVOX`pRkVR!XkXWOX`pRnWR!XnXXOX`pQrXR!XpXYOX`pQ`ORx`Q{aQ!ObQ!QcQ!SdQ!UeZ!e{!O!Q!S!UQ!v!oR!z!vQ!y!pR!|!yQgUR!VgQjVR!YjQmWR![mQpXR!^pQtZR!`tS_O`ToXp",nodeNames:"\u26A0 StartCloseTag StartCloseTag StartCloseTag EndTag SelfClosingEndTag StartTag StartTag StartTag StartTag StartTag StartCloseTag StartCloseTag StartCloseTag IncompleteTag IncompleteCloseTag Document Text EntityReference CharacterReference InvalidEntity Element OpenTag TagName Attribute AttributeName Is AttributeValue UnquotedAttributeValue ScriptText CloseTag OpenTag StyleText CloseTag OpenTag TextareaText CloseTag OpenTag CloseTag SelfClosingTag Comment ProcessingInst MismatchedCloseTag CloseTag DoctypeDecl",maxTerm:68,context:Wy,nodeProps:[["closedBy",-10,1,2,3,7,8,9,10,11,12,13,"EndTag",6,"EndTag SelfClosingEndTag",-4,22,31,34,37,"CloseTag"],["openedBy",4,"StartTag StartCloseTag",5,"StartTag",-4,30,33,36,38,"OpenTag"],["group",-10,14,15,18,19,20,21,40,41,42,43,"Entity",17,"Entity TextContent",-3,29,32,35,"TextContent Entity"],["isolate",-11,22,30,31,33,34,36,37,38,39,42,43,"ltr",-3,27,28,40,""]],propSources:[Dy],skippedNodes:[0],repeatNodeCount:9,tokenData:"!]tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^/^!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!Z5zblWOX5uXZ7SZ[5u[^7S^p5uqr5urs7Sst+Ptw5uwx7Sx!]5u!]!^7w!^!a7S!a#S5u#S#T7S#T;'S5u;'S;=`8n<%lO5u!R7VVOp7Sqs7St!]7S!]!^7l!^;'S7S;'S;=`7q<%lO7S!R7qOb!R!R7tP;=`<%l7S!Z8OYlWb!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!Z8qP;=`<%l5u!_8{iiSlWOX5uXZ7SZ[5u[^7S^p5uqr8trs7Sst/^tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^:j!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!_:sbiSlWb!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!VP<%l?Ah;{?Ah?BY7S?BY?Mn;{?MnO7S!V=dXiSb!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!V>SP;=`<%l;{!_>YP;=`<%l8t!_>dhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^/^!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!Z@TalWOX@OXZAYZ[@O[^AY^p@Oqr@OrsAYsw@OwxAYx!]@O!]!^Az!^!aAY!a#S@O#S#TAY#T;'S@O;'S;=`Bq<%lO@O!RA]UOpAYq!]AY!]!^Ao!^;'SAY;'S;=`At<%lOAY!RAtOc!R!RAwP;=`<%lAY!ZBRYlWc!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!ZBtP;=`<%l@O!_COhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^Dj!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!_DsbiSlWc!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!VFQbiSOpAYqrE{rsAYswE{wxAYx!PE{!P!QAY!Q!]E{!]!^GY!^!aAY!a#sE{#s$fAY$f;'SE{;'S;=`G|<%l?AhE{?Ah?BYAY?BY?MnE{?MnOAY!VGaXiSc!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!VHPP;=`<%lE{!_HVP;=`<%lBw!ZHcW!cxaP!b`Or(trs'ksv(tw!^(t!^!_)e!_;'S(t;'S;=`*P<%lO(t!aIYliSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OKQ!O!P-_!P!Q$q!Q!^-_!^!_*V!_!a&X!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!aK_kiSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx!P-_!P!Q$q!Q!^-_!^!_*V!_!`&X!`!aMS!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!TM_XaP!b`!dp!fQOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X!aNZ!ZiSgQaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OMz!O!PMz!P!Q$q!Q![Mz![!]Mz!]!^-_!^!_*V!_!a&X!a!c-_!c!}Mz!}#R-_#R#SMz#S#T1k#T#oMz#o#s-_#s$f$q$f$}-_$}%OMz%O%W-_%W%oMz%o%p-_%p&aMz&a&b-_&b1pMz1p4UMz4U4dMz4d4e-_4e$ISMz$IS$I`-_$I`$IbMz$Ib$Je-_$Je$JgMz$Jg$Kh-_$Kh%#tMz%#t&/x-_&/x&EtMz&Et&FV-_&FV;'SMz;'S;:j!#|;:j;=`3X<%l?&r-_?&r?AhMz?Ah?BY$q?BY?MnMz?MnO$q!a!$PP;=`<%lMz!R!$ZY!b`!dpOq*Vqr!$yrs(Vsv*Vwx)ex!a*V!a!b!4t!b;'S*V;'S;=`*s<%lO*V!R!%Q]!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!%y!O!f*V!f!g!']!g#W*V#W#X!0`#X;'S*V;'S;=`*s<%lO*V!R!&QX!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!&m!O;'S*V;'S;=`*s<%lO*V!R!&vV!b`!dp!ePOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!'dX!b`!dpOr*Vrs(Vsv*Vwx)ex!q*V!q!r!(P!r;'S*V;'S;=`*s<%lO*V!R!(WX!b`!dpOr*Vrs(Vsv*Vwx)ex!e*V!e!f!(s!f;'S*V;'S;=`*s<%lO*V!R!(zX!b`!dpOr*Vrs(Vsv*Vwx)ex!v*V!v!w!)g!w;'S*V;'S;=`*s<%lO*V!R!)nX!b`!dpOr*Vrs(Vsv*Vwx)ex!{*V!{!|!*Z!|;'S*V;'S;=`*s<%lO*V!R!*bX!b`!dpOr*Vrs(Vsv*Vwx)ex!r*V!r!s!*}!s;'S*V;'S;=`*s<%lO*V!R!+UX!b`!dpOr*Vrs(Vsv*Vwx)ex!g*V!g!h!+q!h;'S*V;'S;=`*s<%lO*V!R!+xY!b`!dpOr!+qrs!,hsv!+qvw!-Swx!.[x!`!+q!`!a!/j!a;'S!+q;'S;=`!0Y<%lO!+qq!,mV!dpOv!,hvx!-Sx!`!,h!`!a!-q!a;'S!,h;'S;=`!.U<%lO!,hP!-VTO!`!-S!`!a!-f!a;'S!-S;'S;=`!-k<%lO!-SP!-kO|PP!-nP;=`<%l!-Sq!-xS!dp|POv(Vx;'S(V;'S;=`(h<%lO(Vq!.XP;=`<%l!,ha!.aX!b`Or!.[rs!-Ssv!.[vw!-Sw!`!.[!`!a!.|!a;'S!.[;'S;=`!/d<%lO!.[a!/TT!b`|POr)esv)ew;'S)e;'S;=`)y<%lO)ea!/gP;=`<%l!.[!R!/sV!b`!dp|POr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!0]P;=`<%l!+q!R!0gX!b`!dpOr*Vrs(Vsv*Vwx)ex#c*V#c#d!1S#d;'S*V;'S;=`*s<%lO*V!R!1ZX!b`!dpOr*Vrs(Vsv*Vwx)ex#V*V#V#W!1v#W;'S*V;'S;=`*s<%lO*V!R!1}X!b`!dpOr*Vrs(Vsv*Vwx)ex#h*V#h#i!2j#i;'S*V;'S;=`*s<%lO*V!R!2qX!b`!dpOr*Vrs(Vsv*Vwx)ex#m*V#m#n!3^#n;'S*V;'S;=`*s<%lO*V!R!3eX!b`!dpOr*Vrs(Vsv*Vwx)ex#d*V#d#e!4Q#e;'S*V;'S;=`*s<%lO*V!R!4XX!b`!dpOr*Vrs(Vsv*Vwx)ex#X*V#X#Y!+q#Y;'S*V;'S;=`*s<%lO*V!R!4{Y!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!a!4t!a!b!:]!b;'S!4t;'S;=`!;r<%lO!4tq!5pV!dpOv!5kvx!6Vx!a!5k!a!b!7W!b;'S!5k;'S;=`!8V<%lO!5kP!6YTO!a!6V!a!b!6i!b;'S!6V;'S;=`!7Q<%lO!6VP!6lTO!`!6V!`!a!6{!a;'S!6V;'S;=`!7Q<%lO!6VP!7QOyPP!7TP;=`<%l!6Vq!7]V!dpOv!5kvx!6Vx!`!5k!`!a!7r!a;'S!5k;'S;=`!8V<%lO!5kq!7yS!dpyPOv(Vx;'S(V;'S;=`(h<%lO(Vq!8YP;=`<%l!5ka!8bX!b`Or!8]rs!6Vsv!8]vw!6Vw!a!8]!a!b!8}!b;'S!8];'S;=`!:V<%lO!8]a!9SX!b`Or!8]rs!6Vsv!8]vw!6Vw!`!8]!`!a!9o!a;'S!8];'S;=`!:V<%lO!8]a!9vT!b`yPOr)esv)ew;'S)e;'S;=`)y<%lO)ea!:YP;=`<%l!8]!R!:dY!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!`!4t!`!a!;S!a;'S!4t;'S;=`!;r<%lO!4t!R!;]V!b`!dpyPOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!;uP;=`<%l!4t!V!{let l=a.type.id;if(l==by)return tc(a,o,t);if(l==yy)return tc(a,o,i);if(l==xy)return tc(a,o,r);if(l==H$&&n.length){let c=a.node,h=c.firstChild,f=h&&D$(h,o),u;if(f){for(let Q of n)if(Q.tag==f&&(!Q.attrs||Q.attrs(u||(u=Op(h,o))))){let $=c.lastChild,p=$.type.id==wy?$.from:c.to;if(p>h.to)return{parser:Q.parser,overlay:[{from:h.to,to:p}]}}}}if(s&&l==K$){let c=a.node,h;if(h=c.firstChild){let f=s[o.read(h.from,h.to)];if(f)for(let u of f){if(u.tagName&&u.tagName!=D$(c.parent,o))continue;let Q=c.lastChild;if(Q.type.id==Oc){let $=Q.from+1,p=Q.lastChild,m=Q.to-(p&&p.isError?0:1);if(m>$)return{parser:u.parser,overlay:[{from:$,to:m}],bracketed:!0}}else if(Q.type.id==J$)return{parser:u.parser,overlay:[{from:Q.from,to:Q.to}]}}}}return null})}var Iy=316,By=317,ip=1,Ny=2,Fy=3,Hy=4,Ky=318,Jy=320,ex=321,tx=5,Ox=6,ix=0,lc=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],rp=125,rx=59,cc=47,nx=42,sx=43,ax=45,ox=60,lx=44,cx=63,hx=46,fx=91,dx=new Ge({start:!1,shift(O,e){return e==tx||e==Ox||e==Jy?O:e==ex},strict:!1}),ux=new z((O,e)=>{let{next:t}=O;(t==rp||t==-1||e.context)&&O.acceptToken(Ky)},{contextual:!0,fallback:!0}),Qx=new z((O,e)=>{let{next:t}=O,i;lc.indexOf(t)>-1||t==cc&&((i=O.peek(1))==cc||i==nx)||t!=rp&&t!=rx&&t!=-1&&!e.context&&O.acceptToken(Iy)},{contextual:!0}),$x=new z((O,e)=>{O.next==fx&&!e.context&&O.acceptToken(By)},{contextual:!0}),px=new z((O,e)=>{let{next:t}=O;if(t==sx||t==ax){if(O.advance(),t==O.next){O.advance();let i=!e.context&&e.canShift(ip);O.acceptToken(i?ip:Ny)}}else t==cx&&O.peek(1)==hx&&(O.advance(),O.advance(),(O.next<48||O.next>57)&&O.acceptToken(Fy))},{contextual:!0});function oc(O,e){return O>=65&&O<=90||O>=97&&O<=122||O==95||O>=192||!e&&O>=48&&O<=57}var mx=new z((O,e)=>{if(O.next!=ox||!e.dialectEnabled(ix)||(O.advance(),O.next==cc))return;let t=0;for(;lc.indexOf(O.next)>-1;)O.advance(),t++;if(oc(O.next,!0)){for(O.advance(),t++;oc(O.next,!1);)O.advance(),t++;for(;lc.indexOf(O.next)>-1;)O.advance(),t++;if(O.next==lx)return;for(let i=0;;i++){if(i==7){if(!oc(O.next,!0))return;break}if(O.next!="extends".charCodeAt(i))break;O.advance(),t++}}O.acceptToken(Hy,-t)}),gx=F({"get set async static":d.modifier,"for while do if else switch try catch finally return throw break continue default case defer":d.controlKeyword,"in of await yield void typeof delete instanceof as satisfies":d.operatorKeyword,"let var const using function class extends":d.definitionKeyword,"import export from":d.moduleKeyword,"with debugger new":d.keyword,TemplateString:d.special(d.string),super:d.atom,BooleanLiteral:d.bool,this:d.self,null:d.null,Star:d.modifier,VariableName:d.variableName,"CallExpression/VariableName TaggedTemplateExpression/VariableName":d.function(d.variableName),VariableDefinition:d.definition(d.variableName),Label:d.labelName,PropertyName:d.propertyName,PrivatePropertyName:d.special(d.propertyName),"CallExpression/MemberExpression/PropertyName":d.function(d.propertyName),"FunctionDeclaration/VariableDefinition":d.function(d.definition(d.variableName)),"ClassDeclaration/VariableDefinition":d.definition(d.className),"NewExpression/VariableName":d.className,PropertyDefinition:d.definition(d.propertyName),PrivatePropertyDefinition:d.definition(d.special(d.propertyName)),UpdateOp:d.updateOperator,"LineComment Hashbang":d.lineComment,BlockComment:d.blockComment,Number:d.number,String:d.string,Escape:d.escape,ArithOp:d.arithmeticOperator,LogicOp:d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,RegExp:d.regexp,Equals:d.definitionOperator,Arrow:d.function(d.punctuation),": Spread":d.punctuation,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,"InterpolationStart InterpolationEnd":d.special(d.brace),".":d.derefOperator,", ;":d.separator,"@":d.meta,TypeName:d.typeName,TypeDefinition:d.definition(d.typeName),"type enum interface implements namespace module declare":d.definitionKeyword,"abstract global Privacy readonly override":d.modifier,"is keyof unique infer asserts":d.operatorKeyword,JSXAttributeValue:d.attributeValue,JSXText:d.content,"JSXStartTag JSXStartCloseTag JSXSelfCloseEndTag JSXEndTag":d.angleBracket,"JSXIdentifier JSXNameSpacedName":d.tagName,"JSXAttribute/JSXIdentifier JSXAttribute/JSXNameSpacedName":d.attributeName,"JSXBuiltin/JSXIdentifier":d.standard(d.tagName)}),Px={__proto__:null,export:20,as:25,from:33,default:36,async:41,function:42,in:52,out:55,const:56,extends:60,this:64,true:72,false:72,null:84,void:88,typeof:92,super:108,new:142,delete:154,yield:163,await:167,class:172,public:235,private:235,protected:235,readonly:237,instanceof:256,satisfies:259,import:292,keyof:349,unique:353,infer:359,asserts:395,is:397,abstract:417,implements:419,type:421,let:424,var:426,using:429,interface:435,enum:439,namespace:445,module:447,declare:451,global:455,defer:471,for:476,of:485,while:488,with:492,do:496,if:500,else:502,switch:506,case:512,try:518,catch:522,finally:526,return:530,throw:534,break:538,continue:542,debugger:546},Sx={__proto__:null,async:129,get:131,set:133,declare:195,public:197,private:197,protected:197,static:199,abstract:201,override:203,readonly:209,accessor:211,new:401},Xx={__proto__:null,"<":193},np=Oe.deserialize({version:14,states:"$F|Q%TQlOOO%[QlOOO'_QpOOP(lO`OOO*zQ!0MxO'#CiO+RO#tO'#CjO+aO&jO'#CjO+oO#@ItO'#DaO.QQlO'#DgO.bQlO'#DrO%[QlO'#DzO0fQlO'#ESOOQ!0Lf'#E['#E[O1PQ`O'#EXOOQO'#Ep'#EpOOQO'#Il'#IlO1XQ`O'#GsO1dQ`O'#EoO1iQ`O'#EoO3hQ!0MxO'#JrO6[Q!0MxO'#JsO6uQ`O'#F]O6zQ,UO'#FtOOQ!0Lf'#Ff'#FfO7VO7dO'#FfO9XQMhO'#F|O9`Q`O'#F{OOQ!0Lf'#Js'#JsOOQ!0Lb'#Jr'#JrO9eQ`O'#GwOOQ['#K_'#K_O9pQ`O'#IYO9uQ!0LrO'#IZOOQ['#J`'#J`OOQ['#I_'#I_Q`QlOOQ`QlOOO9}Q!L^O'#DvO:UQlO'#EOO:]QlO'#EQO9kQ`O'#GsO:dQMhO'#CoO:rQ`O'#EnO:}Q`O'#EyO;hQMhO'#FeO;xQ`O'#GsOOQO'#K`'#K`O;}Q`O'#K`O<]Q`O'#G{O<]Q`O'#G|O<]Q`O'#HOO9kQ`O'#HRO=SQ`O'#HUO>kQ`O'#CeO>{Q`O'#HcO?TQ`O'#HiO?TQ`O'#HkO`QlO'#HmO?TQ`O'#HoO?TQ`O'#HrO?YQ`O'#HxO?_Q!0LsO'#IOO%[QlO'#IQO?jQ!0LsO'#ISO?uQ!0LsO'#IUO9uQ!0LrO'#IWO@QQ!0MxO'#CiOASQpO'#DlQOQ`OOO%[QlO'#EQOAjQ`O'#ETO:dQMhO'#EnOAuQ`O'#EnOBQQ!bO'#FeOOQ['#Cg'#CgOOQ!0Lb'#Dq'#DqOOQ!0Lb'#Jv'#JvO%[QlO'#JvOOQO'#Jy'#JyOOQO'#Ih'#IhOCQQpO'#EgOOQ!0Lb'#Ef'#EfOOQ!0Lb'#J}'#J}OC|Q!0MSO'#EgODWQpO'#EWOOQO'#Jx'#JxODlQpO'#JyOEyQpO'#EWODWQpO'#EgPFWO&2DjO'#CbPOOO)CD})CD}OOOO'#I`'#I`OFcO#tO,59UOOQ!0Lh,59U,59UOOOO'#Ia'#IaOFqO&jO,59UOGPQ!L^O'#DcOOOO'#Ic'#IcOGWO#@ItO,59{OOQ!0Lf,59{,59{OGfQlO'#IdOGyQ`O'#JtOIxQ!fO'#JtO+}QlO'#JtOJPQ`O,5:ROJgQ`O'#EpOJtQ`O'#KTOKPQ`O'#KSOKPQ`O'#KSOKXQ`O,5;^OK^Q`O'#KROOQ!0Ln,5:^,5:^OKeQlO,5:^OMcQ!0MxO,5:fONSQ`O,5:nONmQ!0LrO'#KQONtQ`O'#KPO9eQ`O'#KPO! YQ`O'#KPO! bQ`O,5;]O! gQ`O'#KPO!#lQ!fO'#JsOOQ!0Lh'#Ci'#CiO%[QlO'#ESO!$[Q!fO,5:sOOQS'#Jz'#JzOOQO-EtOOQ['#Jh'#JhOOQ[,5>u,5>uOOQ[-E<]-E<]O!TO`QlO,5>VO!LOQ`O,5>XO`QlO,5>ZO!LTQ`O,5>^O!LYQlO,5>dOOQ[,5>j,5>jO%[QlO,5>jO9uQ!0LrO,5>lOOQ[,5>n,5>nO#!dQ`O,5>nOOQ[,5>p,5>pO#!dQ`O,5>pOOQ[,5>r,5>rO##QQpO'#D_O%[QlO'#JvO##sQpO'#JvO##}QpO'#DmO#$`QpO'#DmO#&qQlO'#DmO#&xQ`O'#JuO#'QQ`O,5:WO#'VQ`O'#EtO#'eQ`O'#KUO#'mQ`O,5;_O#'rQpO'#DmO#(PQpO'#EVOOQ!0Lf,5:o,5:oO%[QlO,5:oO#(WQ`O,5:oO?YQ`O,5;YO!CUQpO,5;YO!C^QMhO,5;YO:dQMhO,5;YO#(`Q`O,5@bO#(eQ07dO,5:sOOQO-EPO$6^Q`O,5>POOQ[1G3i1G3iO`QlO1G3iOOQ[1G3o1G3oOOQ[1G3q1G3qO?TQ`O1G3sO$6cQlO1G3uO$:gQlO'#HtOOQ[1G3x1G3xO$:tQ`O'#HzO?YQ`O'#H|OOQ[1G4O1G4OO$:|QlO1G4OO9uQ!0LrO1G4UOOQ[1G4W1G4WOOQ!0Lb'#G_'#G_O9uQ!0LrO1G4YO9uQ!0LrO1G4[O$?TQ`O,5@bO!)[QlO,5;`O9eQ`O,5;`O?YQ`O,5:XO!)[QlO,5:XO!CUQpO,5:XO$?YQ?MtO,5:XOOQO,5;`,5;`O$?dQpO'#IeO$?zQ`O,5@aOOQ!0Lf1G/r1G/rO$@SQpO'#IkO$@^Q`O,5@pOOQ!0Lb1G0y1G0yO#$`QpO,5:XOOQO'#Ig'#IgO$@fQpO,5:qOOQ!0Ln,5:q,5:qO#(ZQ`O1G0ZOOQ!0Lf1G0Z1G0ZO%[QlO1G0ZOOQ!0Lf1G0t1G0tO?YQ`O1G0tO!CUQpO1G0tO!C^QMhO1G0tOOQ!0Lb1G5|1G5|O!ByQ!0LrO1G0^OOQO1G0m1G0mO%[QlO1G0mO$@mQ!0LrO1G0mO$@xQ!0LrO1G0mO!CUQpO1G0^ODWQpO1G0^O$AWQ!0LrO1G0mOOQO1G0^1G0^O$AlQ!0MxO1G0mPOOO-E<[-E<[POOO1G.h1G.hOOOO1G/i1G/iO$AvQ!bO,5QQpO,5@}OOQ!0Lb1G3c1G3cOOQ[7+$V7+$VO@zQ`O7+$VO9uQ!0LrO7+$VO%>]Q`O7+$VO%[QlO1G6lO%[QlO1G6mO%>bQ!0LrO1G6lO%>lQlO1G3kO%>sQ`O1G3kO%>xQlO1G3kOOQ[7+)T7+)TO9uQ!0LrO7+)_O`QlO7+)aOOQ['#Kh'#KhOOQ['#JS'#JSO%?PQlO,5>`OOQ[,5>`,5>`O%[QlO'#HuO%?^Q`O'#HwOOQ[,5>f,5>fO9eQ`O,5>fOOQ[,5>h,5>hOOQ[7+)j7+)jOOQ[7+)p7+)pOOQ[7+)t7+)tOOQ[7+)v7+)vO%?cQpO1G5|O%?}Q?MtO1G0zO%@XQ`O1G0zOOQO1G/s1G/sO%@dQ?MtO1G/sO?YQ`O1G/sO!)[QlO'#DmOOQO,5?P,5?POOQO-ERQ`O7+,WO&>WQ`O7+,XO%[QlO7+,WO%[QlO7+,XOOQ[7+)V7+)VO&>]Q`O7+)VO&>bQlO7+)VO&>iQ`O7+)VOOQ[<nQ`O,5>aOOQ[,5>c,5>cO&>sQ`O1G4QO9eQ`O7+&fO!)[QlO7+&fOOQO7+%_7+%_O&>xQ?MtO1G6ZO?YQ`O7+%_OOQ!0Lf<yQ?MvO,5?aO'@|Q?MvO,5?cO'CPQ?MvO7+'|O'DuQMjOG27TOOQO<VO!l$xO#jROe!iOpkOrPO(T)]O(VTO(YUO(aVO(o[O~O!]$_Oa$qa'z$qa'w$qa!k$qa!Y$qa!_$qa%i$qa!g$qa~Ol)dO~P!&zOh%VOp%WOr%XOs$tOt$tOz%YO|%ZO!O%]O!S${O!_$|O!i%bO!l$xO#j%cO$W%`O$t%^O$v%_O$y%aO(T(vO(VTO(YUO(a$uO(y$}O(z%PO~Og(pP~P!,TO!Q)iO!g)hO!_$^X$Z$^X$]$^X$_$^X$f$^X~O!g)hO!_({X$Z({X$]({X$_({X$f({X~O!Q)iO~P!.^O!Q)iO!_({X$Z({X$]({X$_({X$f({X~O!_)kO$Z)oO$])jO$_)jO$f)pO~O![)sO~P!)[O$]$hO$_$gO$f)wO~On$zX!Q$zX#S$zX'y$zX(y$zX(z$zX~OgmXg$zXnmX!]mX#`mX~P!0SOx)yO(b)zO(c)|O~On*VO!Q*OO'y*PO(y$}O(z%PO~Og)}O~P!1WOg*WO~Oh%VOr%XOs$tOt$tOz%YO|%ZO!OVO!l$xO#jVO!l$xO#jROe!iOpkOrPO(VTO(YUO(aVO(o[O~O(T=QO~P#$qO!]-]O!^(iX~O!^-_O~O!g-VO#`-UO!]#hX!^#hX~O!]-`O!^(xX~O!^-bO~O!c-cO!d-cO(U!lO~P#$`O!^-fO~P'_On-iO!_'`O~O!Y-nO~Os!{a!b!{a!c!{a!d!{a#T!{a#U!{a#V!{a#W!{a#X!{a#[!{a#]!{a(U!{a(V!{a(Y!{a(e!{a(o!{a~P!#vO!p-sO#`-qO~PChO!c-uO!d-uO(U!lO~PDWOa%nO#`-qO'z%nO~Oa%nO!g#vO#`-qO'z%nO~Oa%nO!g#vO!p-sO#`-qO'z%nO(r'pO~O(P'xO(Q'xO(R-zO~Ov-{O~O!Y'Wa!]'Wa~P!:tO![.PO!Y'WX!]'WX~P%[O!](VO!Y(ha~O!Y(ha~PHRO!](^O!Y(va~O!S%hO![.TO!_%iO(T%gO!Y'^X!]'^X~O#`.VO!](ta!k(taa(ta'z(ta~O!g#vO~P#,wO!](jO!k(sa~O!S%hO!_%iO#j.ZO(T%gO~Op.`O!S%hO![.]O!_%iO!|]O#i._O#j.]O(T%gO!]'aX!k'aX~OR.dO!l#xO~Oh%VOn.gO!_'`O%i.fO~Oa#ci!]#ci'z#ci'w#ci!Y#ci!k#civ#ci!_#ci%i#ci!g#ci~P!:tOn>]O!Q*OO'y*PO(y$}O(z%PO~O#k#_aa#_a#`#_a'z#_a!]#_a!k#_a!_#_a!Y#_a~P#/sO#k(`XP(`XR(`X[(`Xa(`Xj(`Xr(`X!S(`X!l(`X!p(`X#R(`X#n(`X#o(`X#p(`X#q(`X#r(`X#s(`X#t(`X#u(`X#v(`X#x(`X#z(`X#{(`X'z(`X(a(`X(r(`X!k(`X!Y(`X'w(`Xv(`X!_(`X%i(`X!g(`X~P!6kO!].tO!k(kX~P!:tO!k.wO~O!Y.yO~OP$[OR#zO!Q#yO!S#{O!l#xO!p$[O(aVO[#mia#mij#mir#mi!]#mi#R#mi#o#mi#p#mi#q#mi#r#mi#s#mi#t#mi#u#mi#v#mi#x#mi#z#mi#{#mi'z#mi(r#mi(y#mi(z#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#n#mi~P#3cO#n$OO~P#3cOP$[OR#zOr$aO!Q#yO!S#{O!l#xO!p$[O#n$OO#o$PO#p$PO#q$PO(aVO[#mia#mij#mi!]#mi#R#mi#s#mi#t#mi#u#mi#v#mi#x#mi#z#mi#{#mi'z#mi(r#mi(y#mi(z#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#r#mi~P#6QO#r$QO~P#6QOP$[OR#zO[$cOj$ROr$aO!Q#yO!S#{O!l#xO!p$[O#R$RO#n$OO#o$PO#p$PO#q$PO#r$QO#s$RO#t$RO#u$bO(aVOa#mi!]#mi#x#mi#z#mi#{#mi'z#mi(r#mi(y#mi(z#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#v#mi~P#8oOP$[OR#zO[$cOj$ROr$aO!Q#yO!S#{O!l#xO!p$[O#R$RO#n$OO#o$PO#p$PO#q$PO#r$QO#s$RO#t$RO#u$bO#v$SO(aVO(z#}Oa#mi!]#mi#z#mi#{#mi'z#mi(r#mi(y#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#x$UO~P#;VO#x#mi~P#;VO#v$SO~P#8oOP$[OR#zO[$cOj$ROr$aO!Q#yO!S#{O!l#xO!p$[O#R$RO#n$OO#o$PO#p$PO#q$PO#r$QO#s$RO#t$RO#u$bO#v$SO#x$UO(aVO(y#|O(z#}Oa#mi!]#mi#{#mi'z#mi(r#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#z#mi~P#={O#z$WO~P#={OP]XR]X[]Xj]Xr]X!Q]X!S]X!l]X!p]X#R]X#S]X#`]X#kfX#n]X#o]X#p]X#q]X#r]X#s]X#t]X#u]X#v]X#x]X#z]X#{]X$Q]X(a]X(r]X(y]X(z]X!]]X!^]X~O$O]X~P#@jOP$[OR#zO[]O!Q*OO'y*PO(y$}O(z%POP#miR#mi!S#mi!l#mi!p#mi#n#mi#o#mi#p#mi#q#mi(a#mi~P#EyO!]/POg(pX~P!1WOg/RO~Oa$Pi!]$Pi'z$Pi'w$Pi!Y$Pi!k$Piv$Pi!_$Pi%i$Pi!g$Pi~P!:tO$]/SO$_/SO~O$]/TO$_/TO~O!g)hO#`/UO!_$cX$Z$cX$]$cX$_$cX$f$cX~O![/VO~O!_)kO$Z/XO$])jO$_)jO$f/YO~O!]VO!l$xO#j^O!Q*OO'y*PO(y$}O(z%POP#miR#mi!S#mi!l#mi!p#mi#n#mi#o#mi#p#mi#q#mi(a#mi~P&,QO#S$dOP(`XR(`X[(`Xj(`Xn(`Xr(`X!Q(`X!S(`X!l(`X!p(`X#R(`X#n(`X#o(`X#p(`X#q(`X#r(`X#s(`X#t(`X#u(`X#v(`X#x(`X#z(`X#{(`X$O(`X'y(`X(a(`X(r(`X(y(`X(z(`X!](`X!^(`X~O$O$Pi!]$Pi!^$Pi~P#BwO$O!ri!^!ri~P$+oOg']a!]']a~P!1WO!^7nO~O!]'da!^'da~P#BwO!Y7oO~P#/sO!g#vO(r'pO!]'ea!k'ea~O!]/pO!k)Oi~O!]/pO!g#vO!k)Oi~Og$|q!]$|q#`$|q$O$|q~P!1WO!Y'ga!]'ga~P#/sO!g7vO~O!]/yO!Y)Pi~P#/sO!]/yO!Y)Pi~O!Y7yO~Oh%VOr8OO!l%eO(r'pO~Oj8QO!g#vO~Or8TO!g#vO(r'pO~O!Q*OO'y*PO(z%POn'ja(y'ja!]'ja#`'ja~Og'ja$O'ja~P&5RO!Q*OO'y*POn'la(y'la(z'la!]'la#`'la~Og'la$O'la~P&5tOg(_q!](_q~P!1WO#`8VOg(_q!](_q~P!1WO!Y8WO~Og%Oq!]%Oq#`%Oq$O%Oq~P!1WOa$oy!]$oy'z$oy'w$oy!Y$oy!k$oyv$oy!_$oy%i$oy!g$oy~P!:tO!g6rO~O!]5[O!_)Qa~O!_'`OP$TaR$Ta[$Taj$Tar$Ta!Q$Ta!S$Ta!]$Ta!l$Ta!p$Ta#R$Ta#n$Ta#o$Ta#p$Ta#q$Ta#r$Ta#s$Ta#t$Ta#u$Ta#v$Ta#x$Ta#z$Ta#{$Ta(a$Ta(r$Ta(y$Ta(z$Ta~O%i7WO~P&8fO%^8[Oa%[i!_%[i'z%[i!]%[i~Oa#cy!]#cy'z#cy'w#cy!Y#cy!k#cyv#cy!_#cy%i#cy!g#cy~P!:tO[8^O~Ob8`O(T+qO(VTO(YUO~O!]1TO!^)Xi~O`8dO~O(e(|O!]'pX!^'pX~O!]5uO!^)Ua~O!^8nO~P%;eO(o!sO~P$&YO#[8oO~O!_1oO~O!_1oO%i8qO~On8tO!_1oO%i8qO~O[8yO!]'sa!^'sa~O!]1zO!^)Vi~O!k8}O~O!k9OO~O!k9RO~O!k9RO~P%[Oa9TO~O!g9UO~O!k9VO~O!](wi!^(wi~P#BwOa%nO#`9_O'z%nO~O!](ty!k(tya(ty'z(ty~P!:tO!](jO!k(sy~O%i9bO~P&8fO!_'`O%i9bO~O#k$|qP$|qR$|q[$|qa$|qj$|qr$|q!S$|q!]$|q!l$|q!p$|q#R$|q#n$|q#o$|q#p$|q#q$|q#r$|q#s$|q#t$|q#u$|q#v$|q#x$|q#z$|q#{$|q'z$|q(a$|q(r$|q!k$|q!Y$|q'w$|q#`$|qv$|q!_$|q%i$|q!g$|q~P#/sO#k'jaP'jaR'ja['jaa'jaj'jar'ja!S'ja!l'ja!p'ja#R'ja#n'ja#o'ja#p'ja#q'ja#r'ja#s'ja#t'ja#u'ja#v'ja#x'ja#z'ja#{'ja'z'ja(a'ja(r'ja!k'ja!Y'ja'w'jav'ja!_'ja%i'ja!g'ja~P&5RO#k'laP'laR'la['laa'laj'lar'la!S'la!l'la!p'la#R'la#n'la#o'la#p'la#q'la#r'la#s'la#t'la#u'la#v'la#x'la#z'la#{'la'z'la(a'la(r'la!k'la!Y'la'w'lav'la!_'la%i'la!g'la~P&5tO#k%OqP%OqR%Oq[%Oqa%Oqj%Oqr%Oq!S%Oq!]%Oq!l%Oq!p%Oq#R%Oq#n%Oq#o%Oq#p%Oq#q%Oq#r%Oq#s%Oq#t%Oq#u%Oq#v%Oq#x%Oq#z%Oq#{%Oq'z%Oq(a%Oq(r%Oq!k%Oq!Y%Oq'w%Oq#`%Oqv%Oq!_%Oq%i%Oq!g%Oq~P#/sO!]'Yi!k'Yi~P!:tO$O#cq!]#cq!^#cq~P#BwO(y$}OP%aaR%aa[%aaj%aar%aa!S%aa!l%aa!p%aa#R%aa#n%aa#o%aa#p%aa#q%aa#r%aa#s%aa#t%aa#u%aa#v%aa#x%aa#z%aa#{%aa$O%aa(a%aa(r%aa!]%aa!^%aa~On%aa!Q%aa'y%aa(z%aa~P&IyO(z%POP%caR%ca[%caj%car%ca!S%ca!l%ca!p%ca#R%ca#n%ca#o%ca#p%ca#q%ca#r%ca#s%ca#t%ca#u%ca#v%ca#x%ca#z%ca#{%ca$O%ca(a%ca(r%ca!]%ca!^%ca~On%ca!Q%ca'y%ca(y%ca~P&LQOn>^O!Q*OO'y*PO(z%PO~P&IyOn>^O!Q*OO'y*PO(y$}O~P&LQOR0kO!Q0kO!S0lO#S$dOP}a[}aj}an}ar}a!l}a!p}a#R}a#n}a#o}a#p}a#q}a#r}a#s}a#t}a#u}a#v}a#x}a#z}a#{}a$O}a'y}a(a}a(r}a(y}a(z}a!]}a!^}a~O!Q*OO'y*POP$saR$sa[$saj$san$sar$sa!S$sa!l$sa!p$sa#R$sa#n$sa#o$sa#p$sa#q$sa#r$sa#s$sa#t$sa#u$sa#v$sa#x$sa#z$sa#{$sa$O$sa(a$sa(r$sa(y$sa(z$sa!]$sa!^$sa~O!Q*OO'y*POP$uaR$ua[$uaj$uan$uar$ua!S$ua!l$ua!p$ua#R$ua#n$ua#o$ua#p$ua#q$ua#r$ua#s$ua#t$ua#u$ua#v$ua#x$ua#z$ua#{$ua$O$ua(a$ua(r$ua(y$ua(z$ua!]$ua!^$ua~On>^O!Q*OO'y*PO(y$}O(z%PO~OP%TaR%Ta[%Taj%Tar%Ta!S%Ta!l%Ta!p%Ta#R%Ta#n%Ta#o%Ta#p%Ta#q%Ta#r%Ta#s%Ta#t%Ta#u%Ta#v%Ta#x%Ta#z%Ta#{%Ta$O%Ta(a%Ta(r%Ta!]%Ta!^%Ta~P''VO$O$mq!]$mq!^$mq~P#BwO$O$oq!]$oq!^$oq~P#BwO!^9oO~O$O9pO~P!1WO!g#vO!]'ei!k'ei~O!g#vO(r'pO!]'ei!k'ei~O!]/pO!k)Oq~O!Y'gi!]'gi~P#/sO!]/yO!Y)Pq~Or9wO!g#vO(r'pO~O[9yO!Y9xO~P#/sO!Y9xO~Oj:PO!g#vO~Og(_y!](_y~P!1WO!]'na!_'na~P#/sOa%[q!_%[q'z%[q!]%[q~P#/sO[:UO~O!]1TO!^)Xq~O`:YO~O#`:ZO!]'pa!^'pa~O!]5uO!^)Ui~P#BwO!S:]O~O!_1oO%i:`O~O(VTO(YUO(e:eO~O!]1zO!^)Vq~O!k:hO~O!k:iO~O!k:jO~O!k:jO~P%[O#`:mO!]#hy!^#hy~O!]#hy!^#hy~P#BwO%i:rO~P&8fO!_'`O%i:rO~O$O#|y!]#|y!^#|y~P#BwOP$|iR$|i[$|ij$|ir$|i!S$|i!l$|i!p$|i#R$|i#n$|i#o$|i#p$|i#q$|i#r$|i#s$|i#t$|i#u$|i#v$|i#x$|i#z$|i#{$|i$O$|i(a$|i(r$|i!]$|i!^$|i~P''VO!Q*OO'y*PO(z%POP'iaR'ia['iaj'ian'iar'ia!S'ia!l'ia!p'ia#R'ia#n'ia#o'ia#p'ia#q'ia#r'ia#s'ia#t'ia#u'ia#v'ia#x'ia#z'ia#{'ia$O'ia(a'ia(r'ia(y'ia!]'ia!^'ia~O!Q*OO'y*POP'kaR'ka['kaj'kan'kar'ka!S'ka!l'ka!p'ka#R'ka#n'ka#o'ka#p'ka#q'ka#r'ka#s'ka#t'ka#u'ka#v'ka#x'ka#z'ka#{'ka$O'ka(a'ka(r'ka(y'ka(z'ka!]'ka!^'ka~O(y$}OP%aiR%ai[%aij%ain%air%ai!Q%ai!S%ai!l%ai!p%ai#R%ai#n%ai#o%ai#p%ai#q%ai#r%ai#s%ai#t%ai#u%ai#v%ai#x%ai#z%ai#{%ai$O%ai'y%ai(a%ai(r%ai(z%ai!]%ai!^%ai~O(z%POP%ciR%ci[%cij%cin%cir%ci!Q%ci!S%ci!l%ci!p%ci#R%ci#n%ci#o%ci#p%ci#q%ci#r%ci#s%ci#t%ci#u%ci#v%ci#x%ci#z%ci#{%ci$O%ci'y%ci(a%ci(r%ci(y%ci!]%ci!^%ci~O$O$oy!]$oy!^$oy~P#BwO$O#cy!]#cy!^#cy~P#BwO!g#vO!]'eq!k'eq~O!]/pO!k)Oy~O!Y'gq!]'gq~P#/sOr:|O!g#vO(r'pO~O[;QO!Y;PO~P#/sO!Y;PO~Og(_!R!](_!R~P!1WOa%[y!_%[y'z%[y!]%[y~P#/sO!]1TO!^)Xy~O!]5uO!^)Uq~O(T;XO~O!_1oO%i;[O~O!k;_O~O%i;dO~P&8fOP$|qR$|q[$|qj$|qr$|q!S$|q!l$|q!p$|q#R$|q#n$|q#o$|q#p$|q#q$|q#r$|q#s$|q#t$|q#u$|q#v$|q#x$|q#z$|q#{$|q$O$|q(a$|q(r$|q!]$|q!^$|q~P''VO!Q*OO'y*PO(z%POP'jaR'ja['jaj'jan'jar'ja!S'ja!l'ja!p'ja#R'ja#n'ja#o'ja#p'ja#q'ja#r'ja#s'ja#t'ja#u'ja#v'ja#x'ja#z'ja#{'ja$O'ja(a'ja(r'ja(y'ja!]'ja!^'ja~O!Q*OO'y*POP'laR'la['laj'lan'lar'la!S'la!l'la!p'la#R'la#n'la#o'la#p'la#q'la#r'la#s'la#t'la#u'la#v'la#x'la#z'la#{'la$O'la(a'la(r'la(y'la(z'la!]'la!^'la~OP%OqR%Oq[%Oqj%Oqr%Oq!S%Oq!l%Oq!p%Oq#R%Oq#n%Oq#o%Oq#p%Oq#q%Oq#r%Oq#s%Oq#t%Oq#u%Oq#v%Oq#x%Oq#z%Oq#{%Oq$O%Oq(a%Oq(r%Oq!]%Oq!^%Oq~P''VOg%e!Z!]%e!Z#`%e!Z$O%e!Z~P!1WO!Y;hO~P#/sOr;iO!g#vO(r'pO~O[;kO!Y;hO~P#/sO!]'pq!^'pq~P#BwO!]#h!Z!^#h!Z~P#BwO#k%e!ZP%e!ZR%e!Z[%e!Za%e!Zj%e!Zr%e!Z!S%e!Z!]%e!Z!l%e!Z!p%e!Z#R%e!Z#n%e!Z#o%e!Z#p%e!Z#q%e!Z#r%e!Z#s%e!Z#t%e!Z#u%e!Z#v%e!Z#x%e!Z#z%e!Z#{%e!Z'z%e!Z(a%e!Z(r%e!Z!k%e!Z!Y%e!Z'w%e!Z#`%e!Zv%e!Z!_%e!Z%i%e!Z!g%e!Z~P#/sOr;tO!g#vO(r'pO~O!Y;uO~P#/sOr;|O!g#vO(r'pO~O!Y;}O~P#/sOP%e!ZR%e!Z[%e!Zj%e!Zr%e!Z!S%e!Z!l%e!Z!p%e!Z#R%e!Z#n%e!Z#o%e!Z#p%e!Z#q%e!Z#r%e!Z#s%e!Z#t%e!Z#u%e!Z#v%e!Z#x%e!Z#z%e!Z#{%e!Z$O%e!Z(a%e!Z(r%e!Z!]%e!Z!^%e!Z~P''VOrROe!iOpkOrPO(T)]O(VTO(YUO(aVO(o[O~O!]WO!l$xO#jgPPP!>oI[PPPPPPPPP!BOP!C]PPI[!DnPI[PI[I[I[I[I[PI[!FQP!I[P!LbP!Lf!Lp!Lt!LtP!IXP!Lx!LxP#!OP#!SI[PI[#!Y#%_CjA^PA^PA^A^P#&lA^A^#)OA^#+vA^#.SA^A^#.r#1W#1W#1]#1f#1W#1qPP#1WPA^#2ZA^#6YA^A^6mPPP#:_PPP#:x#:xP#:xP#;`#:xPP#;fP#;]P#;]#;y#;]#P#>V#>]#>k#>q#>{#?R#?]#?c#?s#?y#@k#@}#AT#AZ#Ai#BO#Cs#DR#DY#Et#FS#Gt#HS#HY#H`#Hf#Hp#Hv#H|#IW#Ij#IpPPPPPPPPPPP#IvPPPPPPP#Jk#Mx$ b$ i$ qPPP$']P$'f$*_$0x$0{$1O$1}$2Q$2X$2aP$2g$2jP$3W$3[$4S$5b$5g$5}PP$6S$6Y$6^$6a$6e$6i$7e$7|$8e$8i$8l$8o$8y$8|$9Q$9UR!|RoqOXst!Z#d%m&r&t&u&w,s,x2[2_Y!vQ'`-e1o5{Q%tvQ%|yQ&T|Q&j!VS'W!e-]Q'f!iS'l!r!yU*k$|*Z*oQ+o%}S+|&V&WQ,d&dQ-c'_Q-m'gQ-u'mQ0[*qQ1b,OQ1y,eR<{SU+P%]S!S!nQ!r!v!y!z$|'W'_'`'l'm'n*k*o*q*r-]-c-e-u0[0_1o5{5}%[$ti#v$b$c$d$x${%O%Q%^%_%c)y*R*T*V*Y*a*g*w*x+f+i,S,V.f/P/d/m/x/y/{0`0b0i0j0o1f1i1q3c4^4_4j4o5Q5[5_6S7W7v8Q8V8[8q9b9p9y:P:`:r;Q;[;d;kP>X>Y>]>^Q&X|Q'U!eS'[%i-`Q+t&PQ,P&WQ,f&gQ0n+SQ1Y+uQ1_+{Q2Q,jQ2R,kQ5f1TQ5o1aQ6[1zQ6_1|Q6`2PQ8`5gQ8c5lQ8|6bQ:X8dQ:f8yQ;V:YR<}*ZrnOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_R,h&k&z^OPXYstuvwz!Z!`!g!j!o#S#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n%m%t&R&k&n&o&r&t&u&w&{'T'b'r(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mR>S[#]WZ#W#Z'X(T!b%jm#h#i#l$x%e%h(^(h(i(j*Y*^*b+Z+[+^,o-V.T.Z.[.]._/m/p2d3[3]4a6r7TQ%wxQ%{yW&Q|&V&W,OQ&_!TQ'c!hQ'e!iQ(q#sS+n%|%}Q+r&PQ,_&bQ,c&dS-l'f'gQ.i(rQ1R+oQ1X+uQ1Z+vQ1^+zQ1t,`S1x,d,eQ2|-mQ5e1TQ5i1WQ5n1`Q6Z1yQ8_5gQ8b5kQ8f5pQ:T8^R;T:U!U$zi$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y!^%yy!i!u%{%|%}'V'e'f'g'k'u*j+n+o-Y-l-m-t0R0U1R2u2|3T4r4s4v7}9{Q+h%wQ,T&[Q,W&]Q,b&dQ.h(qQ1s,_U1w,c,d,eQ3e.iQ6U1tS6Y1x1yQ8x6Z#f>T#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^o>UPS&[!Q&iQ&]!RQ&^!SU*}%[%d=sR,R&Y%]%Si#v$b$c$d$x${%O%Q%^%_%c)y*R*T*V*Y*a*g*w*x+f+i,S,V.f/P/d/m/x/y/{0`0b0i0j0o1f1i1q3c4^4_4j4o5Q5[5_6S7W7v8Q8V8[8q9b9p9y:P:`:r;Q;[;d;kP>X>Y>]>^T)z$u){V+P%]S$i$^c#Y#e%q%s%u(S(Y(t(y)R)S)T)U)V)W)X)Y)Z)[)^)`)b)g)q+d+x-Z-x-}.S.U.s.v.z.|.}/O/b0p2k2n3O3V3k3p3q3r3s3t3u3v3w3x3y3z3{3|4P4Q4X5X5c6u6{7Q7a7b7k7l8k9X9]9g9m9n:o;W;`SQ'Y!eR2q-]!W!nQ!e!r!v!y!z$|'W'_'`'l'm'n*Z*k*o*q*r-]-c-e-u0[0_1o5{5}R1l,ZnqOXst!Z#d%m&r&t&u&w,s,x2[2_Q&y!^Q'v!xS(s#u<^Q+l%zQ,]&_Q,^&aQ-j'dQ-w'oS.r(x=PS0q+X=ZQ1P+mQ1n,[Q2c,zQ2e,{Q2m-WQ2z-kQ2}-oS5Y0r=eQ5a1QS5d1S=fQ6t2oQ6x2{Q6}3SQ8]5bQ9Y6vQ9Z6yQ9^7OR:l9V$d$]c#Y#e%s%u(S(Y(t(y)R)S)T)U)V)W)X)Y)Z)[)^)`)b)g)q+d+x-Z-x-}.S.U.s.v.z.}/O/b0p2k2n3O3V3k3p3q3r3s3t3u3v3w3x3y3z3{3|4P4Q4X5X5c6u6{7Q7a7b7k7l8k9X9]9g9m9n:o;W;`SS#q]SU$fd)_,mS(p#p'iU*v%R(w4OU0m+O.n7gQ5^0xQ7V3`Q9d7YR:s9em!tQ!r!v!y!z'`'l'm'n-e-u1o5{5}Q't!uS(f#g2US-s'k'wQ/s*]Q0R*jQ3U-vQ4f/tQ4r0TQ4s0UQ4x0^Q7r4`S7}4t4vS8R4y4{Q9r7sQ9v7yQ9{8OQ:Q8TS:{9w9xS;g:|;PS;s;h;iS;{;t;uSSR=o>R%^bOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&o&r&t&u&w&{'T'b'r(T(V(](d(x(z)O)}*i+X+]+g,p,s,x-i-q.P.V.g.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3d3l4z6T6e6f6i6|7[8t9T9_Q%fj!^%xy!i!u%{%|%}'V'e'f'g'k'u*j+n+o-Y-l-m-t0R0U1R2u2|3T4r4s4v7}9{S&Oz!jQ+k%yQ,a&dW1v,b,c,d,eU6X1w1x1yS8w6Y6ZQ:d8x!r=j$Z$n'X)s-U-X/V2p4T5w6s:Z:mSQ=t>QR=u>R%QeOPXYstuvw!Z!`!g!o#S#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&r&t&u&w&{'T'b'r(V(](d(x(z)O)}*i+X+]+g,p,s,x-i-q.P.V.g.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3d3l4z6T6e6f6i6|7[8t9T9_Y#bWZ#W#Z(T!b%jm#h#i#l$x%e%h(^(h(i(j*Y*^*b+Z+[+^,o-V.T.Z.[.]._/m/p2d3[3]4a6r7TQ,n&o!p=k$Z$n)s-U-X/V2p4T5w6s:Z:mSR=n'XU']!e%i*ZR2s-`%SdOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&r&t&u&w&{'T'b'r(T(V(](d(x(z)O)}*i+X+],p,s,x-i-q.P.V.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3l4z6T6e6f6i6|8t9T9_!r)_$Z$n'X)s-U-X/V2p4T5w6s:Z:mSQ,m&oQ0x+gQ3`.gQ7Y3dR9e7[!b$Tc#Y%q(S(Y(t(y)Z)[)`)g+x-x-}.S.U.s.v/b0p3O3V3k3{5X5c6{7Q7a9]:oS)^)q-Z.|2k2n3p4P4X6u7b7k7l8k9X9g9m9n;W;`=vQ>X>ZR>Y>['QkOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n%m%t&R&k&n&o&r&t&u&w&{'T'X'b'r(T(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mSS$oh$pR4U/U'XgOPWXYZhstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n$p%m%t&R&k&n&o&r&t&u&w&{'T'X'b'r(T(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/U/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mST$kf$qQ$ifS)j$l)nR)v$qT$jf$qT)l$l)n'XhOPWXYZhstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n$p%m%t&R&k&n&o&r&t&u&w&{'T'X'b'r(T(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/U/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mST$oh$pQ$rhR)u$p%^jOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&o&r&t&u&w&{'T'b'r(T(V(](d(x(z)O)}*i+X+]+g,p,s,x-i-q.P.V.g.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3d3l4z6T6e6f6i6|7[8t9T9_!s>Q$Z$n'X)s-U-X/V2p4T5w6s:Z:mS#glOPXZst!Z!`!o#S#d#o#{$n%m&k&n&o&r&t&u&w&{'T'b)O)s*i+]+g,p,s,x-i.g/V/n0]0l1r2S2T2V2X2[2_2a3d4T4z6T6e6f6i7[8t9T!U%Ri$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y#f(w#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^Q+T%aQ/c*Oo4OP>X>YQ*c$zU*l$|*Z*oQ+U%bQ0W*m#f=q#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^n=rTQ=x>UQ=y>VR=z>W!U%Ri$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y#f(w#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^o4OP>X>Y>]>^Q,U&]Q1h,WQ5s1gR8h5tV*n$|*Z*oU*n$|*Z*oT5z1o5{S0P*i/nQ4w0]T8S4z:]Q+j%xQ0V*lQ1O+kQ1u,aQ6W1vQ8v6XQ:c8wR;^:d!U%Oi$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Yx*R$v)e*S*u+V/v0d0e4R4g5R5S5W7p8U:R:x=p=}>OS0`*t0a#f]>^nZ>[`=T3}7c7f7j9h:t:w;yS=_.l3iT=`7e9k!U%Qi$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y|*T$v)e*U*t+V/g/v0d0e4R4g4|5R5S5W7p8U:R:x=p=}>OS0b*u0c#f]>^nZ>[d=V3}7d7e7j9h9i:t:u:w;yS=a.m3jT=b7f9lrnOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_Q&f!UR,p&ornOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_R&f!UQ,Y&^R1d,RsnOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_Q1p,_S6R1s1tU8p6P6Q6US:_8r8sS;Y:^:aQ;m;ZR;w;nQ&m!VR,i&iR6_1|R:f8yW&Q|&V&W,OR1Z+vQ&r!WR,s&sR,y&xT2],x2_R,}&yQ,|&yR2f,}Q'y!{R-y'ySsOtQ#dXT%ps#dQ#OTR'{#OQ#RUR'}#RQ){$uR/`){Q#UVR(Q#UQ#XWU(W#X(X.QQ(X#YR.Q(YQ-^'YR2r-^Q.u(yS3m.u3nR3n.vQ-e'`R2v-eY!rQ'`-e1o5{R'j!rQ/Q)eR4S/QU#_W%h*YU(_#_(`.RQ(`#`R.R(ZQ-a']R2t-at`OXst!V!Z#d%m&i&k&r&t&u&w,s,x2[2_S#hZ%eU#r`#h.[R.[(jQ(k#jQ.X(gW.a(k.X3X7RQ3X.YR7R3YQ)n$lR/W)nQ$phR)t$pQ$`cU)a$`-|O>Z>[Q/z*eU4k/z4m7xQ4m/|R7x4lS*o$|*ZR0Y*ox*S$v)e*t*u+V/v0d0e4R4g5R5S5W7p8U:R:x=p=}>O!d.j(u)c*[*e.l.m.q/_/k/|0v1e3h4[4h4l5r7]7`7w7z8X8Z9t9|:S:};R;e;j;v>Z>[U/h*S.j7ca7c3}7e7f7j9h:t:w;yQ0a*tQ3i.lU4}0a3i9kR9k7e|*U$v)e*t*u+V/g/v0d0e4R4g4|5R5S5W7p8U:R:x=p=}>O!h.k(u)c*[*e.l.m.q/_/k/|0v1e3f3h4[4h4l5r7]7^7`7w7z8X8Z9t9|:S:};R;e;j;v>Z>[U/j*U.k7de7d3}7e7f7j9h9i:t:u:w;yQ0c*uQ3j.mU5P0c3j9lR9l7fQ*z%UR0g*zQ5]0vR8Y5]Q+_%kR0u+_Q5v1jS8j5v:[R:[8kQ,[&_R1m,[Q5{1oR8m5{Q1{,fS6]1{8zR8z6_Q1U+rW5h1U5j8a:VQ5j1XQ8a5iR:V8bQ+w&QR1[+wQ2_,xR6m2_YrOXst#dQ&v!ZQ+a%mQ,r&rQ,t&tQ,u&uQ,w&wQ2Y,sS2],x2_R6l2[Q%opQ&z!_Q&}!aQ'P!bQ'R!cQ'q!uQ+`%lQ+l%zQ,Q&XQ,h&mQ-P&|W-p'k's't'wQ-w'oQ0X*nQ1P+mQ1c,PS2O,i,lQ2g-OQ2h-RQ2i-SQ2}-oW3P-r-s-v-xQ5a1QQ5m1_Q5q1eQ6V1uQ6a2QQ6k2ZU6z3O3R3UQ6}3SQ8]5bQ8e5oQ8g5rQ8l5zQ8u6WQ8{6`S9[6{7PQ9^7OQ:W8cQ:b8vQ:g8|Q:n9]Q;U:XQ;]:cQ;a:oQ;l;VR;o;^Q%zyQ'd!iQ'o!uU+m%{%|%}Q-W'VU-k'e'f'gS-o'k'uQ0Q*jS1Q+n+oQ2o-YS2{-l-mQ3S-tS4p0R0UQ5b1RQ6v2uQ6y2|Q7O3TU7{4r4s4vQ9z7}R;O9{S$wi>PR*{%VU%Ui%V>PR0f*yQ$viS(u#v+iS)c$b$cQ)e$dQ*[$xS*e${*YQ*t%OQ*u%QQ+Q%^Q+R%_Q+V%cQ.lPQ=}>XQ>O>YQ>Z>]R>[>^Q+O%]Q.nSR#[WR'Z!el!tQ!r!v!y!z'`'l'm'n-e-u1o5{5}S'V!e-]U*j$|*Z*oS-Y'W'_S0U*k*qQ0^*rQ2u-cQ4v0[R4{0_R({#xQ!fQT-d'`-e]!qQ!r'`-e1o5{Q#p]R'i < TypeParamList in out const TypeDefinition extends ThisType this LiteralType ArithOp Number BooleanLiteral TemplateType InterpolationEnd Interpolation InterpolationStart NullType null VoidType void TypeofType typeof MemberExpression . PropertyName [ TemplateString Escape Interpolation super RegExp ] ArrayExpression Spread , } { ObjectExpression Property async get set PropertyDefinition Block : NewTarget new NewExpression ) ( ArgList UnaryExpression delete LogicOp BitOp YieldExpression yield AwaitExpression await ParenthesizedExpression ClassExpression class ClassBody MethodDeclaration Decorator @ MemberExpression PrivatePropertyName CallExpression TypeArgList CompareOp < declare Privacy static abstract override PrivatePropertyDefinition PropertyDeclaration readonly accessor Optional TypeAnnotation Equals StaticBlock FunctionExpression ArrowFunction ParamList ParamList ArrayPattern ObjectPattern PatternProperty Privacy readonly Arrow MemberExpression BinaryExpression ArithOp ArithOp ArithOp ArithOp BitOp CompareOp instanceof satisfies CompareOp BitOp BitOp BitOp LogicOp LogicOp ConditionalExpression LogicOp LogicOp AssignmentExpression UpdateOp PostfixExpression CallExpression InstantiationExpression TaggedTemplateExpression DynamicImport import ImportMeta JSXElement JSXSelfCloseEndTag JSXSelfClosingTag JSXIdentifier JSXBuiltin JSXIdentifier JSXNamespacedName JSXMemberExpression JSXSpreadAttribute JSXAttribute JSXAttributeValue JSXEscape JSXEndTag JSXOpenTag JSXFragmentTag JSXText JSXEscape JSXStartCloseTag JSXCloseTag PrefixCast < ArrowFunction TypeParamList SequenceExpression InstantiationExpression KeyofType keyof UniqueType unique ImportType InferredType infer TypeName ParenthesizedType FunctionSignature ParamList NewSignature IndexedType TupleType Label ArrayType ReadonlyType ObjectType MethodType PropertyType IndexSignature PropertyDefinition CallSignature TypePredicate asserts is NewSignature new UnionType LogicOp IntersectionType LogicOp ConditionalType ParameterizedType ClassDeclaration abstract implements type VariableDeclaration let var using TypeAliasDeclaration InterfaceDeclaration interface EnumDeclaration enum EnumBody NamespaceDeclaration namespace module AmbientDeclaration declare GlobalDeclaration global ClassDeclaration ClassBody AmbientFunctionDeclaration ExportGroup VariableName VariableName ImportDeclaration defer ImportGroup ForStatement for ForSpec ForInSpec ForOfSpec of WhileStatement while WithStatement with DoStatement do IfStatement if else SwitchStatement switch SwitchBody CaseLabel case DefaultLabel TryStatement try CatchClause catch FinallyClause finally ReturnStatement return ThrowStatement throw BreakStatement break ContinueStatement continue DebuggerStatement debugger LabeledStatement ExpressionStatement SingleExpression SingleClassItem",maxTerm:380,context:dx,nodeProps:[["isolate",-8,5,6,14,37,39,51,53,55,""],["group",-26,9,17,19,68,207,211,215,216,218,221,224,234,237,243,245,247,249,252,258,264,266,268,270,272,274,275,"Statement",-34,13,14,32,35,36,42,51,54,55,57,62,70,72,76,80,82,84,85,110,111,120,121,136,139,141,142,143,144,145,147,148,167,169,171,"Expression",-23,31,33,37,41,43,45,173,175,177,178,180,181,182,184,185,186,188,189,190,201,203,205,206,"Type",-3,88,103,109,"ClassItem"],["openedBy",23,"<",38,"InterpolationStart",56,"[",60,"{",73,"(",160,"JSXStartCloseTag"],["closedBy",-2,24,168,">",40,"InterpolationEnd",50,"]",61,"}",74,")",165,"JSXEndTag"]],propSources:[gx],skippedNodes:[0,5,6,278],repeatNodeCount:37,tokenData:"$Fq07[R!bOX%ZXY+gYZ-yZ[+g[]%Z]^.c^p%Zpq+gqr/mrs3cst:_tuEruvJSvwLkwx! Yxy!'iyz!(sz{!)}{|!,q|}!.O}!O!,q!O!P!/Y!P!Q!9j!Q!R#:O!R![#<_![!]#I_!]!^#Jk!^!_#Ku!_!`$![!`!a$$v!a!b$*T!b!c$,r!c!}Er!}#O$-|#O#P$/W#P#Q$4o#Q#R$5y#R#SEr#S#T$7W#T#o$8b#o#p$x#r#s$@U#s$f%Z$f$g+g$g#BYEr#BY#BZ$A`#BZ$ISEr$IS$I_$A`$I_$I|Er$I|$I}$Dk$I}$JO$Dk$JO$JTEr$JT$JU$A`$JU$KVEr$KV$KW$A`$KW&FUEr&FU&FV$A`&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$A`?HUOEr(n%d_$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&j&hT$i&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c&j&zP;=`<%l&c'|'U]$i&j(Z!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!b(SU(Z!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!b(iP;=`<%l'}'|(oP;=`<%l&}'[(y]$i&j(WpOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(rp)wU(WpOY)rZr)rs#O)r#P;'S)r;'S;=`*Z<%lO)rp*^P;=`<%l)r'[*dP;=`<%l(r#S*nX(Wp(Z!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g#S+^P;=`<%l*g(n+dP;=`<%l%Z07[+rq$i&j(Wp(Z!b'|0/lOX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p$f%Z$f$g+g$g#BY%Z#BY#BZ+g#BZ$IS%Z$IS$I_+g$I_$JT%Z$JT$JU+g$JU$KV%Z$KV$KW+g$KW&FU%Z&FU&FV+g&FV;'S%Z;'S;=`+a<%l?HT%Z?HT?HU+g?HUO%Z07[.ST(X#S$i&j'}0/lO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c07[.n_$i&j(Wp(Z!b'}0/lOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z)3p/x`$i&j!p),Q(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`0z!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(KW1V`#v(Ch$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`2X!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(KW2d_#v(Ch$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'At3l_(V':f$i&j(Z!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k(^4r_$i&j(Z!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k&z5vX$i&jOr5qrs6cs!^5q!^!_6y!_#o5q#o#p6y#p;'S5q;'S;=`7h<%lO5q&z6jT$d`$i&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c`6|TOr6yrs7]s;'S6y;'S;=`7b<%lO6y`7bO$d``7eP;=`<%l6y&z7kP;=`<%l5q(^7w]$d`$i&j(Z!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!r8uZ(Z!bOY8pYZ6yZr8prs9hsw8pwx6yx#O8p#O#P6y#P;'S8p;'S;=`:R<%lO8p!r9oU$d`(Z!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!r:UP;=`<%l8p(^:[P;=`<%l4k%9[:hh$i&j(Wp(Z!bOY%ZYZ&cZq%Zqr`#P#o`x!^=^!^!_?q!_#O=^#O#P>`#P#o=^#o#p?q#p;'S=^;'S;=`@h<%lO=^&n>gXWS$i&jOY>`YZ&cZ!^>`!^!_?S!_#o>`#o#p?S#p;'S>`;'S;=`?k<%lO>`S?XSWSOY?SZ;'S?S;'S;=`?e<%lO?SS?hP;=`<%l?S&n?nP;=`<%l>`!f?xWWS(Z!bOY?qZw?qwx?Sx#O?q#O#P?S#P;'S?q;'S;=`@b<%lO?q!f@eP;=`<%l?q(Q@kP;=`<%l=^'`@w]WS$i&j(WpOY@nYZ&cZr@nrs>`s!^@n!^!_Ap!_#O@n#O#P>`#P#o@n#o#pAp#p;'S@n;'S;=`Bg<%lO@ntAwWWS(WpOYApZrAprs?Ss#OAp#O#P?S#P;'SAp;'S;=`Ba<%lOAptBdP;=`<%lAp'`BjP;=`<%l@n#WBvYWS(Wp(Z!bOYBmZrBmrs?qswBmwxApx#OBm#O#P?S#P;'SBm;'S;=`Cf<%lOBm#WCiP;=`<%lBm(rCoP;=`<%l^!Q^$i&j!X7`OY!=yYZ&cZ!P!=y!P!Q!>|!Q!^!=y!^!_!@c!_!}!=y!}#O!CW#O#P!Dy#P#o!=y#o#p!@c#p;'S!=y;'S;=`!Ek<%lO!=y|#X#Z&c#Z#[!>|#[#]&c#]#^!>|#^#a&c#a#b!>|#b#g&c#g#h!>|#h#i&c#i#j!>|#j#k!>|#k#m&c#m#n!>|#n#o&c#p;'S&c;'S;=`&w<%lO&c7`!@hX!X7`OY!@cZ!P!@c!P!Q!AT!Q!}!@c!}#O!Ar#O#P!Bq#P;'S!@c;'S;=`!CQ<%lO!@c7`!AYW!X7`#W#X!AT#Z#[!AT#]#^!AT#a#b!AT#g#h!AT#i#j!AT#j#k!AT#m#n!AT7`!AuVOY!ArZ#O!Ar#O#P!B[#P#Q!@c#Q;'S!Ar;'S;=`!Bk<%lO!Ar7`!B_SOY!ArZ;'S!Ar;'S;=`!Bk<%lO!Ar7`!BnP;=`<%l!Ar7`!BtSOY!@cZ;'S!@c;'S;=`!CQ<%lO!@c7`!CTP;=`<%l!@c^!Ezl$i&j(Z!b!X7`OY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#W&}#W#X!Eq#X#Z&}#Z#[!Eq#[#]&}#]#^!Eq#^#a&}#a#b!Eq#b#g&}#g#h!Eq#h#i&}#i#j!Eq#j#k!Eq#k#m&}#m#n!Eq#n#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}8r!GyZ(Z!b!X7`OY!GrZw!Grwx!@cx!P!Gr!P!Q!Hl!Q!}!Gr!}#O!JU#O#P!Bq#P;'S!Gr;'S;=`!J|<%lO!Gr8r!Hse(Z!b!X7`OY'}Zw'}x#O'}#P#W'}#W#X!Hl#X#Z'}#Z#[!Hl#[#]'}#]#^!Hl#^#a'}#a#b!Hl#b#g'}#g#h!Hl#h#i'}#i#j!Hl#j#k!Hl#k#m'}#m#n!Hl#n;'S'};'S;=`(f<%lO'}8r!JZX(Z!bOY!JUZw!JUwx!Arx#O!JU#O#P!B[#P#Q!Gr#Q;'S!JU;'S;=`!Jv<%lO!JU8r!JyP;=`<%l!JU8r!KPP;=`<%l!Gr>^!KZ^$i&j(Z!bOY!KSYZ&cZw!KSwx!CWx!^!KS!^!_!JU!_#O!KS#O#P!DR#P#Q!^!LYP;=`<%l!KS>^!L`P;=`<%l!_#c#d#Bq#d#l%Z#l#m#Es#m#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#>j_$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#?rd$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#AQ!R!S#AQ!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#AQ#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#A]f$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#AQ!R!S#AQ!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#AQ#S#b%Z#b#c#>_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#Bzc$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#DV!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#DV#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#Dbe$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#DV!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#DV#S#b%Z#b#c#>_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#E|g$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#Ge![!^%Z!^!_*g!_!c%Z!c!i#Ge!i#O%Z#O#P&c#P#R%Z#R#S#Ge#S#T%Z#T#Z#Ge#Z#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#Gpi$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#Ge![!^%Z!^!_*g!_!c%Z!c!i#Ge!i#O%Z#O#P&c#P#R%Z#R#S#Ge#S#T%Z#T#Z#Ge#Z#b%Z#b#c#>_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z*)x#Il_!g$b$i&j$O)Lv(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z)[#Jv_al$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z04f#LS^h#)`#R-v$?V_!^(CdvBr$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z?O$@a_!q7`$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z07[$Aq|$i&j(Wp(Z!b'|0/l$]#t(T,2j(e$I[OX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$f%Z$f$g+g$g#BYEr#BY#BZ$A`#BZ$ISEr$IS$I_$A`$I_$JTEr$JT$JU$A`$JU$KVEr$KV$KW$A`$KW&FUEr&FU&FV$A`&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$A`?HUOEr07[$D|k$i&j(Wp(Z!b'}0/l$]#t(T,2j(e$I[OY%ZYZ&cZr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$g%Z$g;'SEr;'S;=`I|<%lOEr",tokenizers:[Qx,$x,px,mx,2,3,4,5,6,7,8,9,10,11,12,13,14,ux,new kt("$S~RRtu[#O#Pg#S#T#|~_P#o#pb~gOx~~jVO#i!P#i#j!U#j#l!P#l#m!q#m;'S!P;'S;=`#v<%lO!P~!UO!U~~!XS!Q![!e!c!i!e#T#Z!e#o#p#Z~!hR!Q![!q!c!i!q#T#Z!q~!tR!Q![!}!c!i!}#T#Z!}~#QR!Q![!P!c!i!P#T#Z!P~#^R!Q![#g!c!i#g#T#Z#g~#jS!Q![#g!c!i#g#T#Z#g#q#r!P~#yP;=`<%l!P~$RO(c~~",141,340),new kt("j~RQYZXz{^~^O(Q~~aP!P!Qd~iO(R~~",25,323)],topRules:{Script:[0,7],SingleExpression:[1,276],SingleClassItem:[2,277]},dialects:{jsx:0,ts:15175},dynamicPrecedences:{80:1,82:1,94:1,169:1,199:1},specialized:[{term:327,get:O=>Px[O]||-1},{term:343,get:O=>Sx[O]||-1},{term:95,get:O=>Xx[O]||-1}],tokenPrec:15201});var lp=[W("function ${name}(${params}) {\n ${}\n}",{label:"function",detail:"definition",type:"keyword"}),W("for (let ${index} = 0; ${index} < ${bound}; ${index}++) {\n ${}\n}",{label:"for",detail:"loop",type:"keyword"}),W("for (let ${name} of ${collection}) {\n ${}\n}",{label:"for",detail:"of loop",type:"keyword"}),W("do {\n ${}\n} while (${})",{label:"do",detail:"loop",type:"keyword"}),W("while (${}) {\n ${}\n}",{label:"while",detail:"loop",type:"keyword"}),W(`try { + \${} +} catch (\${error}) { + \${} +}`,{label:"try",detail:"/ catch block",type:"keyword"}),W("if (${}) {\n ${}\n}",{label:"if",detail:"block",type:"keyword"}),W(`if (\${}) { + \${} +} else { + \${} +}`,{label:"if",detail:"/ else block",type:"keyword"}),W(`class \${name} { + constructor(\${params}) { + \${} + } +}`,{label:"class",detail:"definition",type:"keyword"}),W('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),W('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],Tx=lp.concat([W("interface ${name} {\n ${}\n}",{label:"interface",detail:"definition",type:"keyword"}),W("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),W("enum ${name} {\n ${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),sp=new Tt,cp=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function kr(O){return(e,t)=>{let i=e.node.getChild("VariableDefinition");return i&&t(i,O),!0}}var bx=["FunctionDeclaration"],yx={FunctionDeclaration:kr("function"),ClassDeclaration:kr("class"),ClassExpression:()=>!0,EnumDeclaration:kr("constant"),TypeAliasDeclaration:kr("type"),NamespaceDeclaration:kr("namespace"),VariableDefinition(O,e){O.matchContext(bx)||e(O,"variable")},TypeDefinition(O,e){e(O,"type")},__proto__:null};function hp(O,e){let t=sp.get(e);if(t)return t;let i=[],r=!0;function n(s,a){let o=O.sliceString(s.from,s.to);i.push({label:o,type:a})}return e.cursor(C.IncludeAnonymous).iterate(s=>{if(r)r=!1;else if(s.name){let a=yx[s.name];if(a&&a(s,n)||cp.has(s.name))return!1}else if(s.to-s.from>8192){for(let a of hp(O,s.node))i.push(a);return!1}}),sp.set(e,i),i}var ap=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,fp=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName","JSXText","JSXAttributeValue","JSXOpenTag","JSXCloseTag","JSXSelfClosingTag",".","?."];function xx(O){let e=U(O.state).resolveInner(O.pos,-1);if(fp.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&ap.test(O.state.sliceDoc(e.from,e.to));if(!t&&!O.explicit)return null;let i=[];for(let r=e;r;r=r.parent)cp.has(r.name)&&(i=i.concat(hp(O.state.doc,r)));return{options:i,from:t?e.from:O.pos,validFor:ap}}var pt=ne.define({name:"javascript",parser:np.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),TryStatement:le({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:sO,SwitchBody:O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t?0:i?1:2)*O.unit},Block:be({closing:"}"}),ArrowFunction:O=>O.baseIndent+O.unit,"TemplateString BlockComment":()=>null,"Statement Property":le({except:/^\s*{/}),JSXElement(O){let e=/^\s*<\//.test(O.textAfter);return O.lineIndent(O.node.from)+(e?0:O.unit)},JSXEscape(O){let e=/\s*\}/.test(O.textAfter);return O.lineIndent(O.node.from)+(e?0:O.unit)},"JSXOpenTag JSXSelfClosingTag"(O){return O.column(O.node.from)+O.unit}}),te.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),dp={test:O=>/^JSX/.test(O.name),facet:or({commentTokens:{block:{open:"{/*",close:"*/}"}}})},hc=pt.configure({dialect:"ts"},"typescript"),fc=pt.configure({dialect:"jsx",props:[Dn.add(O=>O.isTop?[dp]:void 0)]}),dc=pt.configure({dialect:"jsx ts",props:[Dn.add(O=>O.isTop?[dp]:void 0)]},"typescript"),up=O=>({label:O,type:"keyword"}),Qp="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(up),kx=Qp.concat(["declare","implements","private","protected","public"].map(up));function ks(O={}){let e=O.jsx?O.typescript?dc:fc:O.typescript?hc:pt,t=O.typescript?Tx.concat(kx):lp.concat(Qp);return new J(e,[pt.data.of({autocomplete:cO(fp,zt(t))}),pt.data.of({autocomplete:xx}),O.jsx?vx:[]])}function wx(O){for(;;){if(O.name=="JSXOpenTag"||O.name=="JSXSelfClosingTag"||O.name=="JSXFragmentTag")return O;if(O.name=="JSXEscape"||!O.parent)return null;O=O.parent}}function op(O,e,t=O.length){for(let i=e?.firstChild;i;i=i.nextSibling)if(i.name=="JSXIdentifier"||i.name=="JSXBuiltin"||i.name=="JSXNamespacedName"||i.name=="JSXMemberExpression")return O.sliceString(i.from,Math.min(i.to,t));return""}var Zx=typeof navigator=="object"&&/Android\b/.test(navigator.userAgent),vx=T.inputHandler.of((O,e,t,i,r)=>{if((Zx?O.composing:O.compositionStarted)||O.state.readOnly||e!=t||i!=">"&&i!="/"||!pt.isActiveAt(O.state,e,-1))return!1;let n=r(),{state:s}=n,a=s.changeByRange(o=>{var l;let{head:c}=o,h=U(s).resolveInner(c-1,-1),f;if(h.name=="JSXStartTag"&&(h=h.parent),!(s.doc.sliceString(c-1,c)!=i||h.name=="JSXAttributeValue"&&h.to>c)){if(i==">"&&h.name=="JSXFragmentTag")return{range:o,changes:{from:c,insert:""}};if(i=="/"&&h.name=="JSXStartCloseTag"){let u=h.parent,Q=u.parent;if(Q&&u.from==c-2&&((f=op(s.doc,Q.firstChild,c))||((l=Q.firstChild)===null||l===void 0?void 0:l.name)=="JSXFragmentTag")){let $=`${f}>`;return{range:S.cursor(c+$.length,-1),changes:{from:c,insert:$}}}}else if(i==">"){let u=wx(h);if(u&&u.name=="JSXOpenTag"&&!/^\/?>|^<\//.test(s.doc.sliceString(c,c+2))&&(f=op(s.doc,u,c)))return{range:o,changes:{from:c,insert:``}}}}return{range:o}});return a.changes.empty?!1:(O.dispatch([n,s.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)});var wr=["_blank","_self","_top","_parent"],uc=["ascii","utf-8","utf-16","latin1","latin1"],Qc=["get","post","put","delete"],$c=["application/x-www-form-urlencoded","multipart/form-data","text/plain"],Ke=["true","false"],_={},Yx={a:{attrs:{href:null,ping:null,type:null,media:null,target:wr,hreflang:null}},abbr:_,address:_,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:null,hreflang:null,type:null,shape:["default","rect","circle","poly"]}},article:_,aside:_,audio:{attrs:{src:null,mediagroup:null,crossorigin:["anonymous","use-credentials"],preload:["none","metadata","auto"],autoplay:["autoplay"],loop:["loop"],controls:["controls"]}},b:_,base:{attrs:{href:null,target:wr}},bdi:_,bdo:_,blockquote:{attrs:{cite:null}},body:_,br:_,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:["autofocus"],disabled:["autofocus"],formenctype:$c,formmethod:Qc,formnovalidate:["novalidate"],formtarget:wr,type:["submit","reset","button"]}},canvas:{attrs:{width:null,height:null}},caption:_,center:_,cite:_,code:_,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:["command","checkbox","radio"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:["disabled"],checked:["checked"]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:["disabled"],multiple:["multiple"]}},datalist:{attrs:{data:null}},dd:_,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:["open"]}},dfn:_,div:_,dl:_,dt:_,em:_,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:["disabled"],form:null,name:null}},figcaption:_,figure:_,footer:_,form:{attrs:{action:null,name:null,"accept-charset":uc,autocomplete:["on","off"],enctype:$c,method:Qc,novalidate:["novalidate"],target:wr}},h1:_,h2:_,h3:_,h4:_,h5:_,h6:_,head:{children:["title","base","link","style","meta","script","noscript","command"]},header:_,hgroup:_,hr:_,html:{attrs:{manifest:null}},i:_,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:["allow-top-navigation","allow-same-origin","allow-forms","allow-scripts"],seamless:["seamless"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:["anonymous","use-credentials"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:["audio/*","video/*","image/*"],autocomplete:["on","off"],autofocus:["autofocus"],checked:["checked"],disabled:["disabled"],formenctype:$c,formmethod:Qc,formnovalidate:["novalidate"],formtarget:wr,multiple:["multiple"],readonly:["readonly"],required:["required"],type:["hidden","text","search","tel","url","email","password","datetime","date","month","week","time","datetime-local","number","range","color","checkbox","radio","file","submit","image","reset","button"]}},ins:{attrs:{cite:null,datetime:null}},kbd:_,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:["autofocus"],disabled:["disabled"],keytype:["RSA"]}},label:{attrs:{for:null,form:null}},legend:_,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:null,media:null,sizes:["all","16x16","16x16 32x32","16x16 32x32 64x64"]}},map:{attrs:{name:null}},mark:_,menu:{attrs:{label:null,type:["list","context","toolbar"]}},meta:{attrs:{content:null,charset:uc,name:["viewport","application-name","author","description","generator","keywords"],"http-equiv":["content-language","content-type","default-style","refresh"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:_,noscript:_,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:["typemustmatch"]}},ol:{attrs:{reversed:["reversed"],start:null,type:["1","a","A","i","I"]},children:["li","script","template","ul","ol"]},optgroup:{attrs:{disabled:["disabled"],label:null}},option:{attrs:{disabled:["disabled"],label:null,selected:["selected"],value:null}},output:{attrs:{for:null,form:null,name:null}},p:_,param:{attrs:{name:null,value:null}},pre:_,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:_,rt:_,ruby:_,samp:_,script:{attrs:{type:["text/javascript"],src:null,async:["async"],defer:["defer"],charset:uc}},section:_,select:{attrs:{form:null,name:null,size:null,autofocus:["autofocus"],disabled:["disabled"],multiple:["multiple"]}},slot:{attrs:{name:null}},small:_,source:{attrs:{src:null,type:null,media:null}},span:_,strong:_,style:{attrs:{type:["text/css"],media:null,scoped:null}},sub:_,summary:_,sup:_,table:_,tbody:_,td:{attrs:{colspan:null,rowspan:null,headers:null}},template:_,textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:["autofocus"],disabled:["disabled"],readonly:["readonly"],required:["required"],wrap:["soft","hard"]}},tfoot:_,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:["row","col","rowgroup","colgroup"]}},thead:_,time:{attrs:{datetime:null}},title:_,tr:_,track:{attrs:{src:null,label:null,default:null,kind:["subtitles","captions","descriptions","chapters","metadata"],srclang:null}},ul:{children:["li","script","template","ul","ol"]},var:_,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:["anonymous","use-credentials"],preload:["auto","metadata","none"],autoplay:["autoplay"],mediagroup:["movie"],muted:["muted"],controls:["controls"]}},wbr:_},gp={accesskey:null,class:null,contenteditable:Ke,contextmenu:null,dir:["ltr","rtl","auto"],draggable:["true","false","auto"],dropzone:["copy","move","link","string:","file:"],hidden:["hidden"],id:null,inert:["inert"],itemid:null,itemprop:null,itemref:null,itemscope:["itemscope"],itemtype:null,lang:["ar","bn","de","en-GB","en-US","es","fr","hi","id","ja","pa","pt","ru","tr","zh"],spellcheck:Ke,autocorrect:Ke,autocapitalize:Ke,style:null,tabindex:null,title:null,translate:["yes","no"],rel:["stylesheet","alternate","author","bookmark","help","license","next","nofollow","noreferrer","prefetch","prev","search","tag"],role:"alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer".split(" "),"aria-activedescendant":null,"aria-atomic":Ke,"aria-autocomplete":["inline","list","both","none"],"aria-busy":Ke,"aria-checked":["true","false","mixed","undefined"],"aria-controls":null,"aria-describedby":null,"aria-disabled":Ke,"aria-dropeffect":null,"aria-expanded":["true","false","undefined"],"aria-flowto":null,"aria-grabbed":["true","false","undefined"],"aria-haspopup":Ke,"aria-hidden":Ke,"aria-invalid":["true","false","grammar","spelling"],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":["off","polite","assertive"],"aria-multiline":Ke,"aria-multiselectable":Ke,"aria-owns":null,"aria-posinset":null,"aria-pressed":["true","false","mixed","undefined"],"aria-readonly":Ke,"aria-relevant":null,"aria-required":Ke,"aria-selected":["true","false","undefined"],"aria-setsize":null,"aria-sort":["ascending","descending","none","other"],"aria-valuemax":null,"aria-valuemin":null,"aria-valuenow":null,"aria-valuetext":null},Pp="beforeunload copy cut dragstart dragover dragleave dragenter dragend drag paste focus blur change click load mousedown mouseenter mouseleave mouseup keydown keyup resize scroll unload".split(" ").map(O=>"on"+O);for(let O of Pp)gp[O]=null;var qO=class{constructor(e,t){this.tags={...Yx,...e},this.globalAttrs={...gp,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};qO.default=new qO;function Si(O,e,t=O.length){if(!e)return"";let i=e.firstChild,r=i&&i.getChild("TagName");return r?O.sliceString(r.from,Math.min(r.to,t)):""}function Xi(O,e=!1){for(;O;O=O.parent)if(O.name=="Element")if(e)e=!1;else return O;return null}function Sp(O,e,t){let i=t.tags[Si(O,Xi(e))];return i?.children||t.allTags}function pc(O,e){let t=[];for(let i=Xi(e);i&&!i.type.isTop;i=Xi(i.parent)){let r=Si(O,i);if(r&&i.lastChild.name=="CloseTag")break;r&&t.indexOf(r)<0&&(e.name=="EndTag"||e.from>=i.firstChild.to)&&t.push(r)}return t}var Xp=/^[:\-\.\w\u00b7-\uffff]*$/;function $p(O,e,t,i,r){let n=/\s*>/.test(O.sliceDoc(r,r+5))?"":">",s=Xi(t,t.name=="StartTag"||t.name=="TagName");return{from:i,to:r,options:Sp(O.doc,s,e).map(a=>({label:a,type:"type"})).concat(pc(O.doc,t).map((a,o)=>({label:"/"+a,apply:"/"+a+n,type:"type",boost:99-o}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function pp(O,e,t,i){let r=/\s*>/.test(O.sliceDoc(i,i+5))?"":">";return{from:t,to:i,options:pc(O.doc,e).map((n,s)=>({label:n,apply:n+r,type:"type",boost:99-s})),validFor:Xp}}function _x(O,e,t,i){let r=[],n=0;for(let s of Sp(O.doc,t,e))r.push({label:"<"+s,type:"type"});for(let s of pc(O.doc,t))r.push({label:"",type:"type",boost:99-n++});return{from:i,to:i,options:r,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Rx(O,e,t,i,r){let n=Xi(t),s=n?e.tags[Si(O.doc,n)]:null,a=s&&s.attrs?Object.keys(s.attrs):[],o=s&&s.globalAttrs===!1?a:a.length?a.concat(e.globalAttrNames):e.globalAttrNames;return{from:i,to:r,options:o.map(l=>({label:l,type:"property"})),validFor:Xp}}function Vx(O,e,t,i,r){var n;let s=(n=t.parent)===null||n===void 0?void 0:n.getChild("AttributeName"),a=[],o;if(s){let l=O.sliceDoc(s.from,s.to),c=e.globalAttrs[l];if(!c){let h=Xi(t),f=h?e.tags[Si(O.doc,h)]:null;c=f?.attrs&&f.attrs[l]}if(c){let h=O.sliceDoc(i,r).toLowerCase(),f='"',u='"';/^['"]/.test(h)?(o=h[0]=='"'?/^[^"]*$/:/^[^']*$/,f="",u=O.sliceDoc(r,r+1)==h[0]?"":h[0],h=h.slice(1),i++):o=/^[^\s<>='"]*$/;for(let Q of c)a.push({label:Q,apply:f+Q+u,type:"constant"})}}return{from:i,to:r,options:a,validFor:o}}function Tp(O,e){let{state:t,pos:i}=e,r=U(t).resolveInner(i,-1),n=r.resolve(i);for(let s=i,a;n==r&&(a=r.childBefore(s));){let o=a.lastChild;if(!o||!o.type.isError||o.fromTp(i,r)}var zx=pt.parser.configure({top:"SingleExpression"}),yp=[{tag:"script",attrs:O=>O.type=="text/typescript"||O.lang=="ts",parser:hc.parser},{tag:"script",attrs:O=>O.type=="text/babel"||O.type=="text/jsx",parser:fc.parser},{tag:"script",attrs:O=>O.type=="text/typescript-jsx",parser:dc.parser},{tag:"script",attrs(O){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(O.type)},parser:zx},{tag:"script",attrs(O){return!O.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(O.type)},parser:pt.parser},{tag:"style",attrs(O){return(!O.lang||O.lang=="css")&&(!O.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(O.type))},parser:xr.parser}],xp=[{name:"style",parser:xr.parser.configure({top:"Styles"})}].concat(Pp.map(O=>({name:O,parser:pt.parser}))),kp=ne.define({name:"html",parser:tp.configure({props:[se.add({Element(O){let e=/^(\s*)(<\/)?/.exec(O.textAfter);return O.node.to<=O.pos+e[0].length?O.continue():O.lineIndent(O.node.from)+(e[2]?0:O.unit)},"OpenTag CloseTag SelfClosingTag"(O){return O.column(O.node.from)+O.unit},Document(O){if(O.pos+/\s*/.exec(O.textAfter)[0].lengthO.getChild("TagName")})]}),languageData:{commentTokens:{block:{open:""}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:"-_"}}),ws=kp.configure({wrap:ac(yp,xp)});function Ti(O={}){let e="",t;O.matchClosingTags===!1&&(e="noMatch"),O.selfClosingTags===!0&&(e=(e?e+" ":"")+"selfClosing"),(O.nestedLanguages&&O.nestedLanguages.length||O.nestedAttributes&&O.nestedAttributes.length)&&(t=ac((O.nestedLanguages||[]).concat(yp),(O.nestedAttributes||[]).concat(xp)));let i=t?kp.configure({wrap:t,dialect:e}):e?ws.configure({dialect:e}):ws;return new J(i,[ws.data.of({autocomplete:qx(O)}),O.autoCloseTags!==!1?Ux:[],ks().support,ys().support])}var mp=new Set("area base br col command embed frame hr img input keygen link meta param source track wbr menuitem".split(" ")),Ux=T.inputHandler.of((O,e,t,i,r)=>{if(O.composing||O.state.readOnly||e!=t||i!=">"&&i!="/"||!ws.isActiveAt(O.state,e,-1))return!1;let n=r(),{state:s}=n,a=s.changeByRange(o=>{var l,c,h;let f=s.doc.sliceString(o.from-1,o.to)==i,{head:u}=o,Q=U(s).resolveInner(u,-1),$;if(f&&i==">"&&Q.name=="EndTag"){let p=Q.parent;if(((c=(l=p.parent)===null||l===void 0?void 0:l.lastChild)===null||c===void 0?void 0:c.name)!="CloseTag"&&($=Si(s.doc,p.parent,u))&&!mp.has($)){let m=u+(s.doc.sliceString(u,u+1)===">"?1:0),g=``;return{range:o,changes:{from:u,to:m,insert:g}}}}else if(f&&i=="/"&&Q.name=="IncompleteCloseTag"){let p=Q.parent;if(Q.from==u-2&&((h=p.lastChild)===null||h===void 0?void 0:h.name)!="CloseTag"&&($=Si(s.doc,p,u))&&!mp.has($)){let m=u+(s.doc.sliceString(u,u+1)===">"?1:0),g=`${$}>`;return{range:S.cursor(u+g.length,-1),changes:{from:u,to:m,insert:g}}}}return{range:o}});return a.changes.empty?!1:(O.dispatch([n,s.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)});var Wx=F({null:d.null,instanceof:d.operatorKeyword,this:d.self,"new super assert open to with void":d.keyword,"class interface extends implements enum var":d.definitionKeyword,"module package import":d.moduleKeyword,"switch while for if else case default do break continue return try catch finally throw":d.controlKeyword,"requires exports opens uses provides public private protected static transitive abstract final strictfp synchronized native transient volatile throws":d.modifier,IntegerLiteral:d.integer,FloatingPointLiteral:d.float,"StringLiteral TextBlock":d.string,CharacterLiteral:d.character,LineComment:d.lineComment,BlockComment:d.blockComment,BooleanLiteral:d.bool,PrimitiveType:d.standard(d.typeName),TypeName:d.typeName,Identifier:d.variableName,"MethodName/Identifier":d.function(d.variableName),Definition:d.definition(d.variableName),ArithOp:d.arithmeticOperator,LogicOp:d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,AssignOp:d.definitionOperator,UpdateOp:d.updateOperator,Asterisk:d.punctuation,Label:d.labelName,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,".":d.derefOperator,", ;":d.separator}),jx={__proto__:null,true:34,false:34,null:42,void:46,byte:48,short:48,int:48,long:48,char:48,float:48,double:48,boolean:48,extends:62,super:64,class:76,this:78,new:84,public:100,protected:102,private:104,abstract:106,static:108,final:110,strictfp:112,default:114,synchronized:116,native:118,transient:120,volatile:122,throws:150,implements:160,interface:166,enum:176,instanceof:238,open:267,module:269,requires:274,transitive:276,exports:278,to:280,opens:282,uses:284,provides:286,with:288,package:292,import:296,if:308,else:310,while:314,for:318,var:325,assert:332,switch:336,case:342,do:346,break:350,continue:354,return:358,throw:364,try:368,catch:372,finally:380},wp=Oe.deserialize({version:14,states:"##jQ]QPOOQ$wQPOOO(bQQO'#H^O*iQQO'#CbOOQO'#Cb'#CbO*pQPO'#CaO*xOSO'#CpOOQO'#Hc'#HcOOQO'#Cu'#CuO,eQPO'#D_O-OQQO'#HmOOQO'#Hm'#HmO/gQQO'#HhO/nQQO'#HhOOQO'#Hh'#HhOOQO'#Hg'#HgO1rQPO'#DUO2PQPO'#GnO4wQPO'#D_O5OQPO'#DzO*pQPO'#E[O5qQPO'#E[OOQO'#DV'#DVO7SQQO'#HaO9^QQO'#EeO9eQPO'#EdO9jQPO'#EfOOQO'#Hb'#HbO7jQQO'#HbO:pQQO'#FhO:wQPO'#ExO:|QPO'#E}O:|QPO'#FPOOQO'#Ha'#HaOOQO'#HY'#HYOOQO'#Gh'#GhOOQO'#HX'#HXO<^QPO'#FiOOQO'#HW'#HWOOQO'#Gg'#GgQ]QPOOOOQO'#Hs'#HsOQQPO'#GSO>]QPO'#GUO=kQPO'#GWO:|QPO'#GXO>dQPO'#GZO?QQQO'#HiO?mQQO'#CuO?tQPO'#HxO@SQPO'#D_O@rQPO'#DpO?wQPO'#DqO@|QPO'#HxOA_QPO'#DpOAgQPO'#IROAlQPO'#E`OOQO'#Hr'#HrOOQO'#Gm'#GmQ$wQPOOOAtQPO'#HsOOQO'#H^'#H^OCsQQO,58{OOQO'#H['#H[OOOO'#Gi'#GiOEfOSO,59[OOQO,59[,59[OOQO'#Hi'#HiOFVQPO,59eOGXQPO,59yOOQO-E:f-E:fO*pQPO,58zOG{QPO,58zO*pQPO,5;}OHQQPO'#DQOHVQPO'#DQOOQO'#Gk'#GkOIVQQO,59jOOQO'#Dm'#DmOJqQPO'#HuOJ{QPO'#DlOKZQPO'#HtOKcQPO,5<_OKhQPO,59^OLRQPO'#CxOOQO,59c,59cOLYQPO,59bOLeQQO'#H^ONgQQO'#CbO!!iQPO'#D_O!#nQQO'#HmO!$OQQO,59pO!$VQPO'#DvO!$eQPO'#H|O!$mQPO,5:`O!$rQPO,5:`O!%YQPO,5;nO!%eQPO'#ITO!%pQPO,5;eO!%uQPO,5=YOOQO-E:l-E:lOOQO,5:f,5:fO!']QPO,5:fO!'dQPO,5:vO?tQPO,5<_O*pQPO,5:vO_,5>_O!*sQPO,5:gO!+RQPO,5:qO!+ZQPO,5:lO!+fQPO,5>[O!$VQPO,5>[O!'iQPO,59UO!+qQQO,58zO!+yQQO,5;}O!,RQQO,5gQPO,5gQPO,5<}O!2mQPO,59jO!2zQPO'#HuO!3RQPO,59xO!3WQPO,5>dO?tQPO,59xO!3cQPO,5:[OAlQPO,5:zO!3kQPO'#DrO?wQPO'#DrO!3vQPO'#HyO!4OQPO,5:]O?tQPO,5>dO!(hQPO,5>dOAgQPO,5>mOOQO,5:[,5:[O!$rQPO'#DtOOQO,5>m,5>mO!4TQPO'#EaOOQO,5:z,5:zO!7UQPO,5:zO!(hQPO'#DxOOQO-E:k-E:kOOQO,5:y,5:yO*pQPO,58}O!7ZQPO'#ChOOQO1G.k1G.kOOOO-E:g-E:gOOQO1G.v1G.vO!+qQQO1G.fO*pQPO1G.fO!7eQQO1G1iOOQO,59l,59lO!7mQPO,59lOOQO-E:i-E:iO!7rQPO,5>aO!8ZQPO,5:WO`OOQO1G1y1G1yOOQO1G.x1G.xO!8{QPO'#CyO!9kQPO'#HmO!9uQPO'#CzO!:TQPO'#HlO!:]QPO,59dOOQO1G.|1G.|OLYQPO1G.|O!:sQPO,59eO!;QQQO'#H^O!;cQQO'#CbOOQO,5:b,5:bOhOOQO1G/z1G/zO!oOOQO1G1P1G1POOQO1G0Q1G0QO!=oQPO'#E]OOQO1G0b1G0bO!>`QPO1G1yO!'dQPO1G0bO!*sQPO1G0RO!+RQPO1G0]O!+ZQPO1G0WOOQO1G/]1G/]O!>eQQO1G.pO9eQPO1G0jO*pQPO1G0jOgQPO'#GaOOQO1G2a1G2aO#2zQPO1G2iO#6xQPO,5>gOOQO1G/d1G/dOOQO1G4O1G4OO#7ZQPO1G/dOOQO1G/v1G/vOOQO1G0f1G0fO!7UQPO1G0fOOQO,5:^,5:^O!(hQPO'#DsO#7`QPO,5:^O?wQPO'#GrO#7kQPO,5>eOOQO1G/w1G/wOAgQPO'#H{O#7sQPO1G4OO?tQPO1G4OOOQO1G4X1G4XO!#YQPO'#DvO!!iQPO'#D_OOQO,5:{,5:{O#8OQPO,5:{O#8OQPO,5:{O#8VQQO'#HaO#9hQQO'#HbO#9rQQO'#EbO#9}QPO'#EbO#:VQPO'#IOOOQO,5:d,5:dOOQO1G.i1G.iO#:bQQO'#EeO#:rQQO'#H`O#;SQPO'#FTOOQO'#H`'#H`O#;^QPO'#H`O#;{QPO'#IWO#WOOQO1G/O1G/OOOQO7+$h7+$hOOQO1G/{1G/{O#=cQQO1G/{OOQO1G/}1G/}O#=hQPO1G/{OOQO1G/|1G/|OdQPO,5:wOOQO,5:w,5:wOOQO7+'e7+'eOOQO7+%|7+%|OOQO7+%m7+%mO!KqQPO7+%mO!KvQPO7+%mO!LOQPO7+%mOOQO7+%w7+%wO!LnQPO7+%wOOQO7+%r7+%rO!MmQPO7+%rO!MrQPO7+%rOOQO7+&U7+&UOOQO'#Ee'#EeO9eQPO7+&UO9eQPO,5>[O#?TQPO7+$[OOQO7+&T7+&TOOQO7+&W7+&WO:|QPO'#GlO#?cQPO,5>]OOQO1G/_1G/_O:|QPO7+&lO#?nQQO,59eO#@tQPO,59vOOQO,59v,59vOOQO,5:h,5:hOOQO'#EP'#EPOOQO,5:i,5:iO#@{QPO'#EYOgQPO,5jO#M{QPO,59TO#NSQPO'#IVO#N[QPO,5;oO*pQPO'#G{O#NaQPO,5>rOOQO1G.n1G.nOOQO<Z,5>ZOOQO,5=U,5=UOOQO-E:h-E:hO#NvQPO7+%gOOQO7+%g7+%gOOQO7+%i7+%iOOQO<kO$%tQPO'#EZOOQO1G0_1G0_O$%{QPO1G0_O?tQPO,5:pOOQO-E:s-E:sOOQO1G0Z1G0ZOOQO1G0n1G0nO$&QQQO1G0nOOQO<qOOQO1G1Z1G1ZO$+dQPO'#FUOOQO,5=g,5=gOOQO-E:y-E:yO$+iQPO'#GoO$+vQPO,5>cOOQO1G/u1G/uOOQO<sAN>sO!KqQPOAN>sOOQOAN>xAN>xOOQOAN?[AN?[O9eQPOAN?[OOQO1G0`1G0`O$,_QPO1G0`OOQO,5=b,5=bOOQO-E:t-E:tO$,mQPO,5:uOOQO7+%y7+%yOOQO7+&Y7+&YOOQO1G1`1G1`O$,tQQO1G1`OOQO-E:{-E:{O$,|QQO'#IYO$,wQPO1G1`O$&gQPO1G1`O*pQPO1G1`OOQOAN@]AN@]O$-XQQO<tO$.qQPO7+&zO$.vQQO'#IZOOQOAN@nAN@nO$/RQQOAN@nOOQOAN@jAN@jO$/YQPOAN@jO$/_QQO<uOOQOG26YG26YOOQOG26UG26UOOQO<lOWiXuiX%}iX&PiX&RiX&_iX~OZ!aX~P?XOu#OO%}TO&P#SO&R#SO~O%}TO~P3gOg^Oh^Ov#pO!u#rO!z#qO&_!hO&t#oO~O&P!cO&R!dO~P@ZOg^Oh^O%}TO&P!cO&R!dO~O}cO!P%aO~OZ%bO~O}%dO!m%gO~O}cOg&gXh&gXv&gX!S&gX!T&gX!U&gX!V&gX!W&gX!X&gX!Y&gX!Z&gX!]&gX!^&gX!_&gX!u&gX!z&gX%}&gX&P&gX&R&gX&_&gX&t&gX~OW%jOZ%kOgTahTa%}Ta&PTa&RTa~OvTa!STa!TTa!UTa!VTa!WTa!XTa!YTa!ZTa!]Ta!^Ta!_Ta!uTa!zTa#yTa#zTa$WTa$hTa&tTa&_TauTaYTaqTa|Ta!PTa~PC[O&W%nO&Y!tO~Ou#OO%}TOqma&^maYma&nma!Pma~O&vma}ma!rma~PEnO!SyO!TyO!UyO!VyO!WyO!XyO!YyO!ZzO!]yO!^yO!_yO~Og!Rah!Rav!Ra!u!Ra!z!Ra$h!Ra&P!Ra&R!Ra&t!Ra&_!Ra~PFdO#z%pO~Os%rO~Ou%sO%}TO~Ou#OO%}ra&Pra&Rra&vraYrawra&nra&qra!Pra&^raqra~OWra#_ra#ara#bra#dra#era#fra#gra#hra#ira#kra#ora#rra&_ra#prasra|ra~PH_Ou#OO%}TOq&iX!P&iX!b&iX~OY&iX#p&iX~PJ`O!b%vOq!`X!P!`XY!`X~Oq%wO!P&hX~O!P%yO~Ov%zO~Og^Oh^O%}0oO&P!wO&RWO&b%}O~O&^&`P~PKmO%}TO&P!wO&RWO~OW&QXYiXY!aXY&QXZ&QXq!aXu&QXwiX!b&QX#]&QX#_&QX#a&QX#b&QX#d&QX#e&QX#f&QX#g&QX#h&QX#i&QX#k&QX#o&QX#r&QX&^&QX&_&QX&niX&n&QX&qiX&viX&v&QX&x!aX~P?XOWUXYUXY!aXY&]XZUXq!aXuUXw&]X!bUX#]UX#_UX#aUX#bUX#dUX#eUX#fUX#gUX#hUX#iUX#kUX#oUX#rUX&^UX&_UX&nUX&n&]X&q&]X&vUX&v&]X&x!aX~P>lOg^Oh^O%}TO&P!wO&RWOg!RXh!RX&P!RX&R!RX~PFdOu#OOw&XO%}TO&P&UO&R&TO&q&WO~OW#XOY&aX&n&aX&v&aX~P!#YOY&ZO~P9oOg^Oh^O&P!wO&RWO~Oq&]OY&pX~OY&_O~Og^Oh^O%}TO&P!wO&RWOY&pP~PFdOY&dO&n&bO&v#vO~Oq&eO&x$ZOY&wX~OY&gO~O%}TOg%bah%bav%ba!S%ba!T%ba!U%ba!V%ba!W%ba!X%ba!Y%ba!Z%ba!]%ba!^%ba!_%ba!u%ba!z%ba$h%ba&P%ba&R%ba&t%ba&_%ba~O|&hO~P]O}&iO~Op&uOw&vO&PSO&R!qO&_#YO~Oz&tO~P!'iOz&xO&PSO&R!qO&_#YO~OY&eP~P:|Og^Oh^O%}TO&P!wO&RWO~O}cO~P:|OW#XOu#OO%}TO&v&aX~O#r$WO!P#sa#_#sa#a#sa#b#sa#d#sa#e#sa#f#sa#g#sa#h#sa#i#sa#k#sa#o#sa&^#sa&_#sa&n#saY#sa#p#sas#saq#sa|#sa~Oo'_O}'^O!r'`O&_!hO~O}'eO!r'`O~Oo'iO}'hO&_!hO~OZ#xOu'mO%}TO~OW%jO}'sO~OW%jO!P'uO~OW'vO!P'wO~O$h!WO&P0qO&R0pO!P&eP~P/uO!P(SO#p(TO~P9oO}(UO~O$c(WO~O!P(XO~O!P(YO~O!P(ZO~P9oO!P(]O~P9oOZ$lO_VO`VOaVObVOcVOeVOg^Oh^Op!POwkOz!OO%}TO&P(_O&R(^O&XUO~PFdO%Q(hO%U(iOZ$}a_$}a`$}aa$}ab$}ac$}ae$}ag$}ah$}ap$}av$}aw$}az$}a}$}a!P$}a!S$}a!T$}a!U$}a!V$}a!W$}a!X$}a!Y$}a!Z$}a![$}a!]$}a!^$}a!_$}a!u$}a!z$}a#f$}a#r$}a#t$}a#u$}a#y$}a#z$}a$W$}a$Y$}a$`$}a$c$}a$e$}a$h$}a$l$}a$n$}a$s$}a$u$}a$w$}a$y$}a$|$}a%O$}a%w$}a%}$}a&P$}a&R$}a&X$}a&t$}a|$}a$a$}a$q$}a~O}ra!rra'Ora~PH_OZ%bO~PJ`O!P(mO~O!m%gO}&la!P&la~O}cO!P(pO~Oo(tOq!fX&^!fX~Oq(vO&^&mX~O&^(xO~OZ`O_VO`VOaVObVOcVOeVOg^Oh^Op)UOv{Ow)TOz!OO|)PO}cO!PvO![!`O!u}O!z|O#fpO#roO#tpO#upO#y!RO#z!QO$W!SO$Y!TO$`!UO$c!VO$e!XO$h!WO$l!YO$n!ZO$s![O$u!]O$w!^O$y!_O$|!aO%O!bO%}TO&PRO&RQO&XUO&_#YO&tdO~PFdO}%dO~O})]OY&zP~P:|OW%jO!P)dO~Os)eO~Ou#OO%}TOq&ia!P&ia!b&iaY&ia#p&ia~O})fO~P:|Oq%wO!P&ha~Og^Oh^O%}0oO&P!wO&RWO~O&b)mO~P!8jOu#OO%}TOq&aX&^&aXY&aX&n&aX!P&aX~O}&aX!r&aX~P!9SOo)oOp)oOqnX&^nX~Oq)pO&^&`X~O&^)rO~Ou#OOw)tO%}TO&PSO&R!qO~OYma&nma&vma~P!:bOW&QXY!aXq!aXu!aX%}!aX~OWUXY!aXq!aXu!aX%}!aX~OW)wO~Ou#OO%}TO&P#SO&R#SO&q)yO~Og^Oh^O%}TO&P!wO&RWO~PFdOq&]OY&pa~Ou#OO%}TO&P#SO&R#SO&q&WO~OY)|O~OY*PO&n&bO~Oq&eOY&wa~Og^Oh^Ov{O|*XO!u}O%}TO&P!wO&RWO&tdO~PFdO!P*YO~OW^iZ#XXu^i!P^i!b^i#]^i#_^i#a^i#b^i#d^i#e^i#f^i#g^i#h^i#i^i#k^i#o^i#r^i&^^i&_^i&n^i&v^iY^i#p^is^iq^i|^i~OW*iO~Os*jO~P9oOz*kO&PSO&R!qO~O!P]iY]i#p]is]iq]i|]i~P9oOq*lOY&eX!P&eX~P9oOY*nO~O#f$SO#g$TO#k$YO#r$WO!P#^i#_#^i#a#^i#b#^i#d#^i#e#^i#o#^i&^#^i&_#^i&n#^iY#^i#p#^is#^iq#^i|#^i~O#h$UO#i$UO~P!AmO#_#|O#d$QO#e$RO#f$SO#g$TO#h$UO#i$UO#k$YO#r$WO&^#zO&_#zO&n#{O!P#^i#b#^i#o#^iY#^i#p#^is#^iq#^i|#^i~O#a#^i~P!CUO#a#}O~P!CUO#_#|O#f$SO#g$TO#h$UO#i$UO#k$YO#r$WO&^#zO&_#zO!P#^i#a#^i#b#^i#d#^i#e#^i#o#^iY#^i#p#^is#^iq#^i|#^i~O&n#^i~P!DtO&n#{O~P!DtO#f$SO#g$TO#k$YO#r$WO!P#^i#a#^i#b#^i#e#^i#o#^iY#^i#p#^is#^iq#^i|#^i~O#_#|O#d$QO#h$UO#i$UO&^#zO&_#zO&n#{O~P!FdO#k$YO#r$WO!P#^i#_#^i#a#^i#b#^i#d#^i#e#^i#f#^i#h#^i#i#^i#o#^i&^#^i&_#^i&n#^iY#^i#p#^is#^iq#^i|#^i~O#g$TO~P!G{O#g#^i~P!G{O#h#^i#i#^i~P!AmO#p*oO~P9oO#_&aX#a&aX#b&aX#d&aX#e&aX#f&aX#g&aX#h&aX#i&aX#k&aX#o&aX#r&aX&_&aX#p&aXs&aX|&aX~P!9SO!P#liY#li#p#lis#liq#li|#li~P9oO|*rO~P$wO}'^O~O}'^O!r'`O~Oo'_O}'^O!r'`O~O%}TO&P#SO&R#SO|&sP!P&sP~PFdO}'eO~Og^Oh^Ov{O|+PO!P*}O!u}O!z|O%}TO&P!wO&RWO&_!hO&tdO~PFdO}'hO~Oo'iO}'hO~Os+RO~P:|Ou+TO%}TO~Ou'mO})fO%}TOW#Zi!P#Zi#_#Zi#a#Zi#b#Zi#d#Zi#e#Zi#f#Zi#g#Zi#h#Zi#i#Zi#k#Zi#o#Zi#r#Zi&^#Zi&_#Zi&n#Zi&v#ZiY#Zi#p#Zis#Ziq#Zi|#Zi~O}'^OW&diu&di!P&di#_&di#a&di#b&di#d&di#e&di#f&di#g&di#h&di#i&di#k&di#o&di#r&di&^&di&_&di&n&di&v&diY&di#p&dis&diq&di|&di~O#}+]O$P+^O$R+^O$S+_O$T+`O~O|+[O~P##nO$Z+aO&PSO&R!qO~OW+bO!P+cO~O$a+dOZ$_i_$_i`$_ia$_ib$_ic$_ie$_ig$_ih$_ip$_iv$_iw$_iz$_i}$_i!P$_i!S$_i!T$_i!U$_i!V$_i!W$_i!X$_i!Y$_i!Z$_i![$_i!]$_i!^$_i!_$_i!u$_i!z$_i#f$_i#r$_i#t$_i#u$_i#y$_i#z$_i$W$_i$Y$_i$`$_i$c$_i$e$_i$h$_i$l$_i$n$_i$s$_i$u$_i$w$_i$y$_i$|$_i%O$_i%w$_i%}$_i&P$_i&R$_i&X$_i&t$_i|$_i$q$_i~Og^Oh^O$h#sO&P!wO&RWO~O!P+hO~P:|O!P+iO~OZ`O_VO`VOaVObVOcVOeVOg^Oh^Op!POv{OwkOz!OO}cO!PvO!SyO!TyO!UyO!VyO!WyO!XyO!YyO!Z+nO![!`O!]yO!^yO!_yO!u}O!z|O#fpO#roO#tpO#upO#y!RO#z!QO$W!SO$Y!TO$`!UO$c!VO$e!XO$h!WO$l!YO$n!ZO$q+oO$s![O$u!]O$w!^O$y!_O$|!aO%O!bO%}TO&PRO&RQO&XUO&tdO~O|+mO~P#)QOW&QXY&QXZ&QXu&QX!P&QX&viX&v&QX~P?XOWUXYUXZUXuUX!PUX&vUX&v&]X~P>lOW#tOu#uO&v#vO~OW&UXY%XXu&UX!P%XX&v&UX~OZ#XX~P#.VOY+uO!P+sO~O%Q(hO%U(iOZ$}i_$}i`$}ia$}ib$}ic$}ie$}ig$}ih$}ip$}iv$}iw$}iz$}i}$}i!P$}i!S$}i!T$}i!U$}i!V$}i!W$}i!X$}i!Y$}i!Z$}i![$}i!]$}i!^$}i!_$}i!u$}i!z$}i#f$}i#r$}i#t$}i#u$}i#y$}i#z$}i$W$}i$Y$}i$`$}i$c$}i$e$}i$h$}i$l$}i$n$}i$s$}i$u$}i$w$}i$y$}i$|$}i%O$}i%w$}i%}$}i&P$}i&R$}i&X$}i&t$}i|$}i$a$}i$q$}i~OZ+xO~O%Q(hO%U(iOZ%Vi_%Vi`%Via%Vib%Vic%Vie%Vig%Vih%Vip%Viv%Viw%Viz%Vi}%Vi!P%Vi!S%Vi!T%Vi!U%Vi!V%Vi!W%Vi!X%Vi!Y%Vi!Z%Vi![%Vi!]%Vi!^%Vi!_%Vi!u%Vi!z%Vi#f%Vi#r%Vi#t%Vi#u%Vi#y%Vi#z%Vi$W%Vi$Y%Vi$`%Vi$c%Vi$e%Vi$h%Vi$l%Vi$n%Vi$s%Vi$u%Vi$w%Vi$y%Vi$|%Vi%O%Vi%w%Vi%}%Vi&P%Vi&R%Vi&X%Vi&t%Vi|%Vi$a%Vi$q%Vi~Ou#OO%}TO}&oa!P&oa!m&oa~O!P,OO~Oo(tOq!fa&^!fa~Oq(vO&^&ma~O!m%gO}&li!P&li~O|,XO~P]OW,ZO~P5xOW&UXu&UX#_&UX#a&UX#b&UX#d&UX#e&UX#f&UX#g&UX#h&UX#i&UX#k&UX#o&UX#r&UX&^&UX&_&UX&n&UX&v&UX~OZ#xO!P&UX~P#8^OW$gOZ#xO&v#vO~Op,]Ow,]O~Oq,^O}&rX!P&rX~O!b,`O#]#wOY&UXZ#XX~P#8^OY&SXq&SX|&SX!P&SX~P9oO})]O|&yP~P:|OY&SXg%[Xh%[X%}%[X&P%[X&R%[Xq&SX|&SX!P&SX~Oq,cOY&zX~OY,eO~O})fO|&kP~P:|Oq&jX!P&jX|&jXY&jX~P9oO&bTa~PC[Oo)oOp)oOqna&^na~Oq)pO&^&`a~OW,mO~Ow,nO~Ou#OO%}TO&P,rO&R,qO~Og^Oh^Ov#pO!u#rO&P!wO&RWO&t#oO~Og^Oh^Ov{O|,wO!u}O%}TO&P!wO&RWO&tdO~PFdOw-SO&PSO&R!qO&_#YO~Oq*lOY&ea!P&ea~O#_ma#ama#bma#dma#ema#fma#gma#hma#ima#kma#oma#rma&_ma#pmasma|ma~PEnO|-WO~P$wOZ#xO}'^Oq!|X|!|X!P!|X~Oq-[O|&sX!P&sX~O|-_O!P-^O~O&_!hO~P5VOg^Oh^Ov{O|-cO!P*}O!u}O!z|O%}TO&P!wO&RWO&_!hO&tdO~PFdOs-dO~P9oOs-dO~P:|O}'^OW&dqu&dq!P&dq#_&dq#a&dq#b&dq#d&dq#e&dq#f&dq#g&dq#h&dq#i&dq#k&dq#o&dq#r&dq&^&dq&_&dq&n&dq&v&dqY&dq#p&dqs&dqq&dq|&dq~O|-hO~P##nO!W-lO$O-lO&PSO&R!qO~O!P-oO~O$Z-pO&PSO&R!qO~O!b%vO#p-rOq!`X!P!`X~O!P-tO~P9oO!P-tO~P:|O!P-wO~P9oO|-yO~P#)QO![$aO#p-zO~O!P-|O~O!b-}O~OY.QOZ$lO_VO`VOaVObVOcVOeVOg^Oh^Op!POwkOz!OO%}TO&P(_O&R(^O&XUO~PFdOY.QO!P.RO~O%Q(hO%U(iOZ%Vq_%Vq`%Vqa%Vqb%Vqc%Vqe%Vqg%Vqh%Vqp%Vqv%Vqw%Vqz%Vq}%Vq!P%Vq!S%Vq!T%Vq!U%Vq!V%Vq!W%Vq!X%Vq!Y%Vq!Z%Vq![%Vq!]%Vq!^%Vq!_%Vq!u%Vq!z%Vq#f%Vq#r%Vq#t%Vq#u%Vq#y%Vq#z%Vq$W%Vq$Y%Vq$`%Vq$c%Vq$e%Vq$h%Vq$l%Vq$n%Vq$s%Vq$u%Vq$w%Vq$y%Vq$|%Vq%O%Vq%w%Vq%}%Vq&P%Vq&R%Vq&X%Vq&t%Vq|%Vq$a%Vq$q%Vq~Ou#OO%}TO}&oi!P&oi!m&oi~O&n&bOq!ga&^!ga~O!m%gO}&lq!P&lq~O|.^O~P]Op.`Ow&vOz&tO&PSO&R!qO&_#YO~O!P.aO~Oq,^O}&ra!P&ra~O})]O~P:|Oq.gO|&yX~O|.iO~Oq,cOY&za~Oq.mO|&kX~O|.oO~Ow.pO~Oq!aXu!aX!P!aX!b!aX%}!aX~OZ&QX~P#N{OZUX~P#N{O!P.qO~OZ.rO~OW^yZ#XXu^y!P^y!b^y#]^y#_^y#a^y#b^y#d^y#e^y#f^y#g^y#h^y#i^y#k^y#o^y#r^y&^^y&_^y&n^y&v^yY^y#p^ys^yq^y|^y~OY%`aq%`a!P%`a~P9oO!P#nyY#ny#p#nys#nyq#ny|#ny~P9oO}'^Oq!|a|!|a!P!|a~OZ#xO}'^Oq!|a|!|a!P!|a~O%}TO&P#SO&R#SOq%jX|%jX!P%jX~PFdOq-[O|&sa!P&sa~O|!}X~P$wO|/PO~Os/QO~P9oOW%jO!P/RO~OW%jO$Q/WO&PSO&R!qO!P&|P~OW%jO$U/XO~O!P/YO~O!b%vO#p/[Oq!`X!P!`X~OY/^O~O!P/_O~P9oO#p/`O~P9oO!b/bO~OY/cOZ$lO_VO`VOaVObVOcVOeVOg^Oh^Op!POwkOz!OO%}TO&P(_O&R(^O&XUO~PFdOW#[Ou&[X%}&[X&P&[X&R&[X'O&[X~O&_#YO~P$)QOu#OO%}TO'O/eO&P%SX&R%SX~O&n&bOq!gi&^!gi~Op/iO&PSO&R!qO~OW*iOZ#xO~O!P/kO~OY&SXq&SX~P9oO})]Oq%nX|%nX~P:|Oq.gO|&ya~O!b/nO~O})fOq%cX|%cX~P:|Oq.mO|&ka~OY/qO~O!P/rO~OZ/sO~O}'^Oq!|i|!|i!P!|i~O|!}a~P$wOW%jO!P/wO~OW%jOq/xO!P&|X~OY/|O~P9oOY0OO~OY%Xq!P%Xq~P9oO'O/eO&P%Sa&R%Sa~OY0TO~O!P0WO~Ou#OO!P0YO!Z0ZO%}TO~OY0[O~Oq/xO!P&|a~O!P0_O~OW%jOq/xO!P&}X~OY0aO~P9oOY0bO~OY%Xy!P%Xy~P9oOu#OO%}TO&P%ua&R%ua'O%ua~OY0cO~O!P0dO~Ou#OO!P0eO!Z0fO%}TO~OW%jOq%ra!P%ra~Oq/xO!P&}a~O!P0jO~Ou#OO!P0jO!Z0kO%}TO~O!P0lO~O!P0nO~O#p&QXY&QXs&QXq&QX|&QX~P&bO#pUXYUXsUXqUX|UX~P(iO`Q_P#g%y&P&Xc&X~",goto:"#+S'OPPPP'P'd*x.OP'dPP.d.h0PPPPPP1nP3ZPP4v7l:[WP!?[P!Ap!BW!E]3ZPPP!F|!Jm!MaPP#!P#!SP#$`#$f#&V#&f#&n#'p#(Y#)T#)^#)a#)oP#)r#*OP#*V#*^P#*aP#*lP#*o#*r#*u#*y#+PstOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y'urOPXY`acopx!Y![!_!a!e!f!h!i!o!x#P#T#Y#[#_#`#e#i#l#n#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$]$_$e$l$m$n$o$p$q%O%S%V%Z%^%_%b%d%g%k%u%v%{%|&R&S&[&]&`&b&d&i'X'^'_'`'e'h'i'm'n'p'{'|(O(T(U(`(l(t(v({(})O)Q)R)])f)o)p*P*T*W*l*o*p*q*z*{+O+T+d+f+h+i+l+o+r+s+x+},W,Y,^,`,u-[-^-a-r-t-}.R.V.g.m/O/[/_/b/d/n/q0R0X0Z0[0f0h0k0r#xhO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kt!sT!Q!S!T!{!}$k%p+]+^+_+`-k-m/W/X/x0oQ#mdS&Y#`(}Q&l#oU&q#t$g,ZQ&x#vW(b%O+s.R/dU)Y%j'v+bQ)Z%kS)u&S,WU*f&s-R._Q*k&yQ,t*TQ-P*iQ.j,cR.t,uu!sT!Q!S!T!{!}$k%p+]+^+_+`-k-m/W/X/x0oT%l!r)l#{qO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0k#zlO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kX(c%O+s.R/d$TVO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0k$TkO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0k&O[OPX`ceopx!O!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s,Y,^,`-^-r-t-}.R.g.m/O/[/_/b/d/n0Z0f0k0rQ&Q#[Q)s&RV.T+x.X/e&O[OPX`ceopx!O!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s,Y,^,`-^-r-t-}.R.g.m/O/[/_/b/d/n0Z0f0k0rV.T+x.X/e&O]OPX`ceopx!O!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s,Y,^,`-^-r-t-}.R.g.m/O/[/_/b/d/n0Z0f0k0rV.U+x.X/eS#Z[.TS$f!O&tS&s#t$gQ&y#vQ)V%dQ-R*iR._,Z$kZO`copx!Y![!_!a#Y#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$_$l$m$n$o$p$q%O%d%g%k%v&b&d'_'`'i'm(O(T(U(t)Q)R)])f)o)p*P*l*o+T+d+h+i+l+o+s,Y,^,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kQ&O#YR,k)p&P_OPX`ceopx!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s+x,Y,^,`-^-r-t-}.R.X.g.m/O/[/_/b/d/e/n0Z0f0k0r!o#QY!e!x#R#T#`#n$]%R%S%V%^%u%|&S&[&`'X'|(`(l({(}*T*p*z+f+r+},W,u-a.V/q0R0X0[0h$SkO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kQ$m!UQ$n!VQ$s!ZQ$|!`R+p(WQ#yiS'q$e*hQ*e&rQ+X'rS,[)T)UQ-O*gQ-Y*vQ.b,]Q.x-QQ.{-ZQ/j.`Q/u.yR0V/iQ'a$bW*[&m'b'c'dQ+W'qU,x*]*^*_Q-X*vQ-f+XS.u,y,zS.z-Y-ZQ/t.vR/v.{]!mP!o'^*q-^/OreOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!gP!o'^*q-^/OW#b`#e%b&]Q'}$oW(d%O+s.R/dS*U&i*WS*w'e-[S*|'h+OR.X+xh#VY!W!e#n#s%V'|*T*z+f,u-aQ)j%wQ)v&WR,o)y#xnOcopx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0k^!kP!g!o'^*q-^/Ov#TY!W#`#n#s%w&W&[&`'|(`(})y*T+f+r,u.W/hQ#g`Q$b{Q$c|Q$d}W%S!e%V*z-aS%Y!h(vQ%`!iQ&m#pQ&n#qQ&o#rQ(u%ZS(y%^({Q*R&eS*v'e-[R-Z*wU)h%v)f.mR+V'p[!mP!o'^*q-^/OT*}'h+O^!iP!g!o'^*q-^/OQ'd$bQ'l$dQ*_&mQ*d&oV*{'h*|+OQ%[!hR,S(vQ(s%YR,R(u#znO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kQ%c!kS(l%S(yR(|%`T#e`%bU#c`#e%bR)z&]Q%f!lQ(n%UQ(r%XQ,U(zR.],VrvOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!mP!o'^*q-^/OQ%P!bQ%a!jQ%i!pQ'[$ZQ([$|Q(k%QQ(p%WQ+z(iR.Y+yrtOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!mP!o'^*q-^/OS*V&i*WT*}'h+OQ'c$bS*^&m'dR,z*_Q'b$bQ'g$cU*]&m'c'dQ*a&nS,y*^*_R.v,zQ*u'`R+Q'iQ'k$dS*c&o'lR,}*dQ'j$dU*b&o'k'lS,|*c*dR.w,}rtOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!mP!o'^*q-^/OT*}'h+OQ'f$cS*`&n'gR,{*aQ*x'eR.|-[R-`*yQ&j#mR*Z&lT*V&i*WQ%e!lS(q%X%fR,P(rR)R%dWk%O+s.R/d#{lO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0k$SiO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kU&r#t$g,ZS*g&s._Q-Q*iR.y-RT'o$e'p!_#|m#a$r$z$}&w&z&{'O'P'Q'R'S'W'Z)[)g+S+g+j-T-V-e-v-{.e/Z/a/}0Q!]$Pm#a$r$z$}&w&z&{'O'P'R'S'W'Z)[)g+S+g+j-T-V-e-v-{.e/Z/a/}0Q#{nO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0ka)^%k)],`.g/n0Z0f0kQ)`%kR.k,cQ't$hQ)b%oR,f)cT+Y's+ZsvOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YruOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YQ$w!]R$y!^R$p!XrvOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YR(O$oR$q!XR(V$sT+k(U+lX(f%P(g(k+{R+y(hQ.W+xR/h.XQ(j%PQ+w(gQ+|(kR.Z+{R%Q!bQ(e%OV.P+s.R/dQxOQ#lcW$`x#l)Q,YQ)Q%dR,Y)RrXOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Yn!fP!o#e&]&i'^'e'h*W*q+O+x-[-^/Ol!zX!f#P#_#i$[%Z%_%{&R'n'{)O0r!j#PY!e!x#T#`#n$]%S%V%^%u%|&S&[&`'X'|(`(l({(}*T*p*z+f+r+},W,u-a.V/q0R0X0[0hQ#_`Q#ia#d$[op!Y!_!a#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$l%g%k%v&b&d'_'`'i'm(O(T(t)])f)o*P*l*o+T+h+i+o,^,`-r-t-}.g.m/[/_/b/n0Z0f0kS%Z!h(vS%_!i*{S%{#Y)pQ&R#[S'n$e'pY'{$o%O+s.R/dQ)O%bR0r$YQ!uUR%m!uQ)q&OR,l)q^#RY#`$]'X'|(`*px%R!e!x#n%V%^%|&S&[&`({(}*T*z+f+r,W,u-a.V0R[%t#R%R%u+}0X0hS%u#T%SQ+}(lQ0X/qR0h0[Q*m&{R-U*mQ!oPU%h!o*q/OQ*q'^R/O-^!pbOP`cx![!o#e#l$_$m$n$o$p$q%O%b%d&]&i'^'e'h(U)Q)R*W*q+O+d+l+s+x,Y-[-^.R/O/dY!yX!f#_'{)OT#jb!yQ.n,gR/p.nQ%x#VR)k%xQ&c#fS*O&c.[R.[,QQ(w%[R,T(wQ&^#cR){&^Q,_)WR.d,_Q+O'hR-b+OQ-]*xR.}-]Q*W&iR,v*WQ'p$eR+U'pQ&f#gR*S&fQ.h,aR/m.hQ,d)`R.l,dQ+Z'sR-g+ZQ-k+]R/T-kQ/y/US0^/y0`R0`/{Q+l(UR-x+lQ(g%PS+v(g+{R+{(kQ/f.VR0S/fQ+t(eR.S+t`wOcx#l%d)Q)R,YQ$t![Q']$_Q'y$mQ'z$nQ(Q$pQ(R$qS+k(U+lR-q+d'dsOPXY`acopx!Y![!_!a!e!f!h!i!o!x#P#T#Y#[#_#`#e#i#l#n#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$]$_$e$l$m$n$o$p$q%O%S%V%Z%^%_%b%d%g%u%v%{%|&R&S&[&]&`&b&d&i'X'^'_'`'e'h'i'm'n'p'{'|(O(T(U(`(l(t(v({(})O)Q)R)f)o)p*P*T*W*l*o*p*q*z*{+O+T+d+f+h+i+l+o+r+s+x+},W,Y,^,u-[-^-a-r-t-}.R.V.m/O/[/_/b/d/q0R0X0[0h0ra)_%k)],`.g/n0Z0f0kQ!rTQ$h!QQ$i!SQ$j!TQ%o!{Q%q!}Q'x$kQ)c%pQ)l0oS-i+]+_Q-m+^Q-n+`Q/S-kS/U-m/WQ/{/XR0]/x%uSOT`cdopx!Q!S!T!Y![!_!a!{!}#`#l#o#t#u#v#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$g$k$l$m$n$o$p$q%O%d%j%k%p%v&S&d&s&y'm'v(O(T(U(})Q)R)])f*P*T*i*l*o+T+]+^+_+`+b+d+h+i+l+o+s,W,Y,Z,`,c,u-R-k-m-r-t-}.R._.g.m/W/X/[/_/b/d/n/x0Z0f0k0oQ)a%kQ,a)]S.f,`/nQ/l.gQ0g0ZQ0i0fR0m0krmOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YS#a`$lQ$WoQ$^pQ$r!YQ$z!_Q$}!aQ&w#uQ&z#wY&{#x$o+h-t/_Q&}#|Q'O#}Q'P$OQ'Q$PQ'R$QQ'S$RQ'T$SQ'U$TQ'V$UQ'W$VQ'Z$Z^)[%k)].g/n0Z0f0kU)g%v)f.mQ*Q&dQ+S'mQ+g(OQ+j(TQ,p*PQ-T*lQ-V*oQ-e+TQ-v+iQ-{+oQ.e,`Q/Z-rQ/a-}Q/}/[R0Q/b#xgO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kW(a%O+s.R/dR)S%drYOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!eP!o'^*q-^/OW!xX$[%{'{Q#``Q#ne#S$]op!Y!_!a#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$l%k%v&d'm(O(T)])f*P*l*o+T+h+i+o,`-r-t-}.g.m/[/_/b/n0Z0f0kQ%V!gS%^!i*{d%|#Y%g&b'_'`'i(t)o)p,^Q&S#_Q&[#bS&`#e&]Q'X$YQ'|$oW(`%O+s.R/dQ({%_Q(}%bS*T&i*WQ*p0rS*z'h+OQ+f'}Q+r(dQ,W)OQ,u*UQ-a*|S.V+x.XR0R/e&O_OPX`ceopx!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s+x,Y,^,`-^-r-t-}.R.X.g.m/O/[/_/b/d/e/n0Z0f0k0rQ$e!OQ'r$fR*h&t&ZWOPX`ceopx!O!Y![!_!a!g!i!o#Y#[#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&R&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s+x,Y,^,`-^-r-t-}.R.X.g.m/O/[/_/b/d/e/n0Z0f0k0rR&P#Y$QjOcopx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kQ#f`Q&O#YQ'Y$YU)W%g'`'iQ)}&bQ*s'_Q,Q(tQ,j)oQ,k)pR.c,^Q)n%}R,i)m$SfO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kT&p#t,ZQ&|#xQ(P$oQ-u+hQ/]-tR0P/_]!nP!o'^*q-^/O#PaOPX`bcx![!f!o!y#_#e#l$_$m$n$o$p$q%O%b%d&]&i'^'e'h'{(U)O)Q)R*W*q+O+d+l+s+x,Y-[-^.R/O/dU#WY!W'|Q%T!eU&k#n#s+fQ(o%VS,s*T*zT.s,u-aj#UY!W!e#n#s%V%w&W)y*T*z,u-aU&V#`&`(}Q)x&[Q+e'|Q+q(`Q-s+fQ.O+rQ/g.WR0U/hQ)i%vQ,g)fR/o.mR,h)f`!jP!o'^'h*q+O-^/OT%W!g*|R%]!hW%U!e%V*z-aQ(z%^R,V({S#d`%bR&a#eQ)X%gT*t'`'iR*y'e[!lP!o'^*q-^/OR%X!gR#h`R,b)]R)a%kT-j+]-kQ/V-mR/z/WR/z/X",nodeNames:"\u26A0 LineComment BlockComment Program ModuleDeclaration MarkerAnnotation Identifier ScopedIdentifier . Annotation ) ( AnnotationArgumentList AssignmentExpression FieldAccess IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral TextBlock null ClassLiteral void PrimitiveType TypeName ScopedTypeName GenericType TypeArguments AnnotatedType Wildcard extends super , ArrayType ] Dimension [ class this ParenthesizedExpression ObjectCreationExpression new ArgumentList } { ClassBody ; FieldDeclaration Modifiers public protected private abstract static final strictfp default synchronized native transient volatile VariableDeclarator Definition AssignOp ArrayInitializer MethodDeclaration TypeParameters TypeParameter TypeBound FormalParameters ReceiverParameter FormalParameter SpreadParameter Throws throws Block ClassDeclaration Superclass SuperInterfaces implements InterfaceTypeList InterfaceDeclaration interface ExtendsInterfaces InterfaceBody ConstantDeclaration EnumDeclaration enum EnumBody EnumConstant EnumBodyDeclarations AnnotationTypeDeclaration AnnotationTypeBody AnnotationTypeElementDeclaration StaticInitializer ConstructorDeclaration ConstructorBody ExplicitConstructorInvocation ArrayAccess MethodInvocation MethodName MethodReference ArrayCreationExpression Dimension AssignOp BinaryExpression CompareOp CompareOp LogicOp LogicOp BitOp BitOp BitOp ArithOp ArithOp ArithOp BitOp InstanceofExpression instanceof LambdaExpression InferredParameters TernaryExpression LogicOp : UpdateExpression UpdateOp UnaryExpression LogicOp BitOp CastExpression ElementValueArrayInitializer ElementValuePair open module ModuleBody ModuleDirective requires transitive exports to opens uses provides with PackageDeclaration package ImportDeclaration import Asterisk ExpressionStatement LabeledStatement Label IfStatement if else WhileStatement while ForStatement for ForSpec LocalVariableDeclaration var EnhancedForStatement ForSpec AssertStatement assert SwitchStatement switch SwitchBlock SwitchLabel case DoStatement do BreakStatement break ContinueStatement continue ReturnStatement return SynchronizedStatement ThrowStatement throw TryStatement try CatchClause catch CatchFormalParameter CatchType FinallyClause finally TryWithResourcesStatement ResourceSpecification Resource ClassContent",maxTerm:276,nodeProps:[["isolate",-4,1,2,18,19,""],["group",-26,4,47,76,77,82,87,92,145,147,150,151,153,156,158,161,163,165,167,172,174,176,178,180,181,183,191,"Statement",-25,6,13,14,15,16,17,18,19,20,21,22,39,40,41,99,100,102,103,106,118,120,122,125,127,130,"Expression",-7,23,24,25,26,27,29,34,"Type"],["openedBy",10,"(",44,"{"],["closedBy",11,")",45,"}"]],propSources:[Wx],skippedNodes:[0,1,2],repeatNodeCount:28,tokenData:"#'f_R!_OX%QXY'fYZ)bZ^'f^p%Qpq'fqr*|rs,^st%Qtu4euv5zvw7[wx8rxyAZyzAwz{Be{|CZ|}Dq}!OE_!O!PFx!P!Q! r!Q!R!,h!R![!0`![!]!>p!]!^!@Q!^!_!@n!_!`!BX!`!a!B{!a!b!Di!b!c!EX!c!}!LT!}#O!Mj#O#P%Q#P#Q!NW#Q#R!Nt#R#S4e#S#T%Q#T#o4e#o#p# h#p#q#!U#q#r##n#r#s#$[#s#y%Q#y#z'f#z$f%Q$f$g'f$g#BY4e#BY#BZ#$x#BZ$IS4e$IS$I_#$x$I_$I|4e$I|$JO#$x$JO$JT4e$JT$JU#$x$JU$KV4e$KV$KW#$x$KW&FU4e&FU&FV#$x&FV;'S4e;'S;=`5t<%lO4eS%VV&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QS%qO&YSS%tVOY&ZYZ%lZr&Zrs&ys;'S&Z;'S;=`'`<%lO&ZS&^VOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QS&vP;=`<%l%QS&|UOY&ZYZ%lZr&Zs;'S&Z;'S;=`'`<%lO&ZS'cP;=`<%l&Z_'mk&YS%yZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qs#y%Q#y#z'f#z$f%Q$f$g'f$g#BY%Q#BY#BZ'f#BZ$IS%Q$IS$I_'f$I_$I|%Q$I|$JO'f$JO$JT%Q$JT$JU'f$JU$KV%Q$KV$KW'f$KW&FU%Q&FU&FV'f&FV;'S%Q;'S;=`&s<%lO%Q_)iY&YS%yZX^*Xpq*X#y#z*X$f$g*X#BY#BZ*X$IS$I_*X$I|$JO*X$JT$JU*X$KV$KW*X&FU&FV*XZ*^Y%yZX^*Xpq*X#y#z*X$f$g*X#BY#BZ*X$IS$I_*X$I|$JO*X$JT$JU*X$KV$KW*X&FU&FV*XV+TX#tP&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QU+wV#_Q&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT,aXOY,|YZ%lZr,|rs3Ys#O,|#O#P2d#P;'S,|;'S;=`3S<%lO,|T-PXOY-lYZ%lZr-lrs.^s#O-l#O#P.x#P;'S-l;'S;=`2|<%lO-lT-qX&YSOY-lYZ%lZr-lrs.^s#O-l#O#P.x#P;'S-l;'S;=`2|<%lO-lT.cVcPOY&ZYZ%lZr&Zrs&ys;'S&Z;'S;=`'`<%lO&ZT.}V&YSOY-lYZ/dZr-lrs1]s;'S-l;'S;=`2|<%lO-lT/iW&YSOY0RZr0Rrs0ns#O0R#O#P0s#P;'S0R;'S;=`1V<%lO0RP0UWOY0RZr0Rrs0ns#O0R#O#P0s#P;'S0R;'S;=`1V<%lO0RP0sOcPP0vTOY0RYZ0RZ;'S0R;'S;=`1V<%lO0RP1YP;=`<%l0RT1`XOY,|YZ%lZr,|rs1{s#O,|#O#P2d#P;'S,|;'S;=`3S<%lO,|T2QUcPOY&ZYZ%lZr&Zs;'S&Z;'S;=`'`<%lO&ZT2gVOY-lYZ/dZr-lrs1]s;'S-l;'S;=`2|<%lO-lT3PP;=`<%l-lT3VP;=`<%l,|T3_VcPOY&ZYZ%lZr&Zrs3ts;'S&Z;'S;=`'`<%lO&ZT3yR&WSXY4SYZ4`pq4SP4VRXY4SYZ4`pq4SP4eO&XP_4lb&YS&PZOY%QYZ%lZr%Qrs%qst%Qtu4eu!Q%Q!Q![4e![!c%Q!c!}4e!}#R%Q#R#S4e#S#T%Q#T#o4e#o$g%Q$g;'S4e;'S;=`5t<%lO4e_5wP;=`<%l4eU6RX#hQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QU6uV#]Q&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV7cZ&nR&YSOY%QYZ%lZr%Qrs%qsv%Qvw8Uw!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QU8]V#aQ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT8wZ&YSOY9jYZ%lZr9jrs:xsw9jwx%Qx#O9j#O#PhYZ%lZr>hrs?dsw>hwx;hx#O>h#O#P&Z#P;'S>h;'S;=`@}<%lO>hT>kZOYhYZ%lZr>hrs@Ysw>hwx;hx#O>h#O#P&Z#P;'S>h;'S;=`@}<%lO>hP@]VOY@YZw@Ywx@rx#O@Y#P;'S@Y;'S;=`@w<%lO@YP@wObPP@zP;=`<%l@YTAQP;=`<%l>hTAWP;=`<%l9j_AbVZZ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVBOVYR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVBnX$ZP&YS#gQOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QVCbZ#fR&YSOY%QYZ%lZr%Qrs%qs{%Q{|DT|!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QVD[V#rR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVDxVqR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVEf[#fR&YSOY%QYZ%lZr%Qrs%qs}%Q}!ODT!O!_%Q!_!`6n!`!aF[!a;'S%Q;'S;=`&s<%lO%QVFcV&xR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_GPZWY&YSOY%QYZ%lZr%Qrs%qs!O%Q!O!PGr!P!Q%Q!Q![IQ![;'S%Q;'S;=`&s<%lO%QVGwX&YSOY%QYZ%lZr%Qrs%qs!O%Q!O!PHd!P;'S%Q;'S;=`&s<%lO%QVHkV&qR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTIXc&YS`POY%QYZ%lZr%Qrs%qs!Q%Q!Q![IQ![!f%Q!f!gJd!g!hKQ!h!iJd!i#R%Q#R#SNz#S#W%Q#W#XJd#X#YKQ#Y#ZJd#Z;'S%Q;'S;=`&s<%lO%QTJkV&YS`POY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTKV]&YSOY%QYZ%lZr%Qrs%qs{%Q{|LO|}%Q}!OLO!O!Q%Q!Q![Lp![;'S%Q;'S;=`&s<%lO%QTLTX&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Lp![;'S%Q;'S;=`&s<%lO%QTLwc&YS`POY%QYZ%lZr%Qrs%qs!Q%Q!Q![Lp![!f%Q!f!gJd!g!h%Q!h!iJd!i#R%Q#R#SNS#S#W%Q#W#XJd#X#Y%Q#Y#ZJd#Z;'S%Q;'S;=`&s<%lO%QTNXZ&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Lp![#R%Q#R#SNS#S;'S%Q;'S;=`&s<%lO%QT! PZ&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![IQ![#R%Q#R#SNz#S;'S%Q;'S;=`&s<%lO%Q_! y]&YS#gQOY%QYZ%lZr%Qrs%qsz%Qz{!!r{!P%Q!P!Q!)e!Q!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%Q_!!wX&YSOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{;'S!!r;'S;=`!'s<%lO!!r_!#iT&YSOz!#xz{!$[{;'S!#x;'S;=`!$y<%lO!#xZ!#{TOz!#xz{!$[{;'S!#x;'S;=`!$y<%lO!#xZ!$_VOz!#xz{!$[{!P!#x!P!Q!$t!Q;'S!#x;'S;=`!$y<%lO!#xZ!$yOQZZ!$|P;=`<%l!#x_!%SXOY!%oYZ!#dZr!%ors!'ysz!%oz{!(i{;'S!%o;'S;=`!)_<%lO!%o_!%rXOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{;'S!!r;'S;=`!'s<%lO!!r_!&dZ&YSOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{!P!!r!P!Q!'V!Q;'S!!r;'S;=`!'s<%lO!!r_!'^V&YSQZOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!'vP;=`<%l!!r_!'|XOY!%oYZ!#dZr!%ors!#xsz!%oz{!(i{;'S!%o;'S;=`!)_<%lO!%o_!(lZOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{!P!!r!P!Q!'V!Q;'S!!r;'S;=`!'s<%lO!!r_!)bP;=`<%l!%o_!)lV&YSPZOY!)eYZ%lZr!)ers!*Rs;'S!)e;'S;=`!+X<%lO!)e_!*WVPZOY!*mYZ%lZr!*mrs!+_s;'S!*m;'S;=`!,b<%lO!*m_!*rVPZOY!)eYZ%lZr!)ers!*Rs;'S!)e;'S;=`!+X<%lO!)e_!+[P;=`<%l!)e_!+dVPZOY!*mYZ%lZr!*mrs!+ys;'S!*m;'S;=`!,b<%lO!*mZ!,OSPZOY!+yZ;'S!+y;'S;=`!,[<%lO!+yZ!,_P;=`<%l!+y_!,eP;=`<%l!*mT!,ou&YS_POY%QYZ%lZr%Qrs%qs!O%Q!O!P!/S!P!Q%Q!Q![!0`![!d%Q!d!e!3j!e!f%Q!f!gJd!g!hKQ!h!iJd!i!n%Q!n!o!2U!o!q%Q!q!r!5h!r!z%Q!z!{!7`!{#R%Q#R#S!2r#S#U%Q#U#V!3j#V#W%Q#W#XJd#X#YKQ#Y#ZJd#Z#`%Q#`#a!2U#a#c%Q#c#d!5h#d#l%Q#l#m!7`#m;'S%Q;'S;=`&s<%lO%QT!/Za&YS`POY%QYZ%lZr%Qrs%qs!Q%Q!Q![IQ![!f%Q!f!gJd!g!hKQ!h!iJd!i#W%Q#W#XJd#X#YKQ#Y#ZJd#Z;'S%Q;'S;=`&s<%lO%QT!0gi&YS_POY%QYZ%lZr%Qrs%qs!O%Q!O!P!/S!P!Q%Q!Q![!0`![!f%Q!f!gJd!g!hKQ!h!iJd!i!n%Q!n!o!2U!o#R%Q#R#S!2r#S#W%Q#W#XJd#X#YKQ#Y#ZJd#Z#`%Q#`#a!2U#a;'S%Q;'S;=`&s<%lO%QT!2]V&YS_POY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT!2wZ&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!0`![#R%Q#R#S!2r#S;'S%Q;'S;=`&s<%lO%QT!3oY&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!4_!R!S!4_!S;'S%Q;'S;=`&s<%lO%QT!4f`&YS_POY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!4_!R!S!4_!S!n%Q!n!o!2U!o#R%Q#R#S!3j#S#`%Q#`#a!2U#a;'S%Q;'S;=`&s<%lO%QT!5mX&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q!Y!6Y!Y;'S%Q;'S;=`&s<%lO%QT!6a_&YS_POY%QYZ%lZr%Qrs%qs!Q%Q!Q!Y!6Y!Y!n%Q!n!o!2U!o#R%Q#R#S!5h#S#`%Q#`#a!2U#a;'S%Q;'S;=`&s<%lO%QT!7e_&YSOY%QYZ%lZr%Qrs%qs!O%Q!O!P!8d!P!Q%Q!Q![!:r![!c%Q!c!i!:r!i#T%Q#T#Z!:r#Z;'S%Q;'S;=`&s<%lO%QT!8i]&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!9b![!c%Q!c!i!9b!i#T%Q#T#Z!9b#Z;'S%Q;'S;=`&s<%lO%QT!9gc&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!9b![!c%Q!c!i!9b!i!r%Q!r!sKQ!s#R%Q#R#S!8d#S#T%Q#T#Z!9b#Z#d%Q#d#eKQ#e;'S%Q;'S;=`&s<%lO%QT!:yi&YS_POY%QYZ%lZr%Qrs%qs!O%Q!O!P!wX#pR&YSOY%QYZ%lZr%Qrs%qs![%Q![!]!?d!];'S%Q;'S;=`&s<%lO%QV!?kV&vR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!@XV!PR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!@uY&_Z&YSOY%QYZ%lZr%Qrs%qs!^%Q!^!_!Ae!_!`+p!`;'S%Q;'S;=`&s<%lO%QU!AlX#iQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QV!B`X!bR&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QV!CSY&^R&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`!a!Cr!a;'S%Q;'S;=`&s<%lO%QU!CyY#iQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`!a!Ae!a;'S%Q;'S;=`&s<%lO%Q_!DrV&bX#oQ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!E`X%}Z&YSOY%QYZ%lZr%Qrs%qs#]%Q#]#^!E{#^;'S%Q;'S;=`&s<%lO%QV!FQX&YSOY%QYZ%lZr%Qrs%qs#b%Q#b#c!Fm#c;'S%Q;'S;=`&s<%lO%QV!FrX&YSOY%QYZ%lZr%Qrs%qs#h%Q#h#i!G_#i;'S%Q;'S;=`&s<%lO%QV!GdX&YSOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!HP#Y;'S%Q;'S;=`&s<%lO%QV!HUX&YSOY%QYZ%lZr%Qrs%qs#f%Q#f#g!Hq#g;'S%Q;'S;=`&s<%lO%QV!HvX&YSOY%QYZ%lZr%Qrs%qs#Y%Q#Y#Z!Ic#Z;'S%Q;'S;=`&s<%lO%QV!IhX&YSOY%QYZ%lZr%Qrs%qs#T%Q#T#U!JT#U;'S%Q;'S;=`&s<%lO%QV!JYX&YSOY%QYZ%lZr%Qrs%qs#V%Q#V#W!Ju#W;'S%Q;'S;=`&s<%lO%QV!JzX&YSOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!Kg#Y;'S%Q;'S;=`&s<%lO%QV!KnV&tR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!L[b&RZ&YSOY%QYZ%lZr%Qrs%qst%Qtu!LTu!Q%Q!Q![!LT![!c%Q!c!}!LT!}#R%Q#R#S!LT#S#T%Q#T#o!LT#o$g%Q$g;'S!LT;'S;=`!Md<%lO!LT_!MgP;=`<%l!LT_!MqVuZ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!N_VsR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QU!N{X#eQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QV# oV}R&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#!_Z'OX#dQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`#p%Q#p#q##Q#q;'S%Q;'S;=`&s<%lO%QU##XV#bQ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV##uV|R&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT#$cV#uP&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#%Ru&YS%yZ&PZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qst%Qtu4eu!Q%Q!Q![4e![!c%Q!c!}4e!}#R%Q#R#S4e#S#T%Q#T#o4e#o#y%Q#y#z'f#z$f%Q$f$g'f$g#BY4e#BY#BZ#$x#BZ$IS4e$IS$I_#$x$I_$I|4e$I|$JO#$x$JO$JT4e$JT$JU#$x$JU$KV4e$KV$KW#$x$KW&FU4e&FU&FV#$x&FV;'S4e;'S;=`5t<%lO4e",tokenizers:[0,1,2,3],topRules:{Program:[0,3],ClassContent:[1,194]},dynamicPrecedences:{27:1,232:-1,243:-1},specialized:[{term:231,get:O=>jx[O]||-1}],tokenPrec:7144});var Cx=ne.define({name:"java",parser:wp.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),TryStatement:le({except:/^\s*({|catch|finally)\b/}),LabeledStatement:sO,SwitchBlock:O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t?0:i?1:2)*O.unit},Block:be({closing:"}"}),BlockComment:()=>null,Statement:le({except:/^{/})}),te.add({"Block SwitchBlock ClassBody ElementValueArrayInitializer ModuleBody EnumBody ConstructorBody InterfaceBody ArrayInitializer":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/}});function Zp(){return new J(Cx)}var Gx=F({String:d.string,Number:d.number,"True False":d.bool,PropertyName:d.propertyName,Null:d.null,", :":d.separator,"[ ]":d.squareBracket,"{ }":d.brace}),vp=Oe.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[Gx],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var Ex=ne.define({name:"json",parser:vp.configure({props:[se.add({Object:le({except:/^\s*\}/}),Array:le({except:/^\s*\]/})}),te.add({"Object Array":me})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function Yp(){return new J(Ex)}var Ys=class O{static create(e,t,i,r,n){let s=r+(r<<8)+e+(t<<4)|0;return new O(e,t,i,s,n,[],[])}constructor(e,t,i,r,n,s,a){this.type=e,this.value=t,this.from=i,this.hash=r,this.end=n,this.children=s,this.positions=a,this.hashProp=[[R.contextHash,r]]}addChild(e,t){e.prop(R.contextHash)!=this.hash&&(e=new D(e.type,e.children,e.positions,e.length,this.hashProp)),this.children.push(e),this.positions.push(t)}toTree(e,t=this.end){let i=this.children.length-1;return i>=0&&(t=Math.max(t,this.positions[i]+this.children[i].length+this.from)),new D(e.types[this.type],this.children,this.positions,t-this.from).balance({makeTree:(r,n,s)=>new D(ue.none,r,n,s,this.hashProp)})}},b;(function(O){O[O.Document=1]="Document",O[O.CodeBlock=2]="CodeBlock",O[O.FencedCode=3]="FencedCode",O[O.Blockquote=4]="Blockquote",O[O.HorizontalRule=5]="HorizontalRule",O[O.BulletList=6]="BulletList",O[O.OrderedList=7]="OrderedList",O[O.ListItem=8]="ListItem",O[O.ATXHeading1=9]="ATXHeading1",O[O.ATXHeading2=10]="ATXHeading2",O[O.ATXHeading3=11]="ATXHeading3",O[O.ATXHeading4=12]="ATXHeading4",O[O.ATXHeading5=13]="ATXHeading5",O[O.ATXHeading6=14]="ATXHeading6",O[O.SetextHeading1=15]="SetextHeading1",O[O.SetextHeading2=16]="SetextHeading2",O[O.HTMLBlock=17]="HTMLBlock",O[O.LinkReference=18]="LinkReference",O[O.Paragraph=19]="Paragraph",O[O.CommentBlock=20]="CommentBlock",O[O.ProcessingInstructionBlock=21]="ProcessingInstructionBlock",O[O.Escape=22]="Escape",O[O.Entity=23]="Entity",O[O.HardBreak=24]="HardBreak",O[O.Emphasis=25]="Emphasis",O[O.StrongEmphasis=26]="StrongEmphasis",O[O.Link=27]="Link",O[O.Image=28]="Image",O[O.InlineCode=29]="InlineCode",O[O.HTMLTag=30]="HTMLTag",O[O.Comment=31]="Comment",O[O.ProcessingInstruction=32]="ProcessingInstruction",O[O.Autolink=33]="Autolink",O[O.HeaderMark=34]="HeaderMark",O[O.QuoteMark=35]="QuoteMark",O[O.ListMark=36]="ListMark",O[O.LinkMark=37]="LinkMark",O[O.EmphasisMark=38]="EmphasisMark",O[O.CodeMark=39]="CodeMark",O[O.CodeText=40]="CodeText",O[O.CodeInfo=41]="CodeInfo",O[O.LinkTitle=42]="LinkTitle",O[O.LinkLabel=43]="LinkLabel",O[O.URL=44]="URL"})(b||(b={}));var Pc=class{constructor(e,t){this.start=e,this.content=t,this.marks=[],this.parsers=[]}},Sc=class{constructor(){this.text="",this.baseIndent=0,this.basePos=0,this.depth=0,this.markers=[],this.pos=0,this.indent=0,this.next=-1}forward(){this.basePos>this.pos&&this.forwardInner()}forwardInner(){let e=this.skipSpace(this.basePos);this.indent=this.countIndent(e,this.pos,this.indent),this.pos=e,this.next=e==this.text.length?-1:this.text.charCodeAt(e)}skipSpace(e){return vr(this.text,e)}reset(e){for(this.text=e,this.baseIndent=this.basePos=this.pos=this.indent=0,this.forwardInner(),this.depth=1;this.markers.length;)this.markers.pop()}moveBase(e){this.basePos=e,this.baseIndent=this.countIndent(e,this.pos,this.indent)}moveBaseColumn(e){this.baseIndent=e,this.basePos=this.findColumn(e)}addMarker(e){this.markers.push(e)}countIndent(e,t=0,i=0){for(let r=t;r=e.stack[t.depth+1].value+t.baseIndent)return!0;if(t.indent>=t.baseIndent+4)return!1;let i=(O.type==b.OrderedList?Rc:_c)(t,e,!1);return i>0&&(O.type!=b.BulletList||Yc(t,e,!1)<0)&&t.text.charCodeAt(t.pos+i-1)==O.value}var Ap={[b.Blockquote](O,e,t){return t.next!=62?!1:(t.markers.push(L(b.QuoteMark,e.lineStart+t.pos,e.lineStart+t.pos+1)),t.moveBase(t.pos+(ot(t.text.charCodeAt(t.pos+1))?2:1)),O.end=e.lineStart+t.text.length,!0)},[b.ListItem](O,e,t){return t.indent-1?!1:(t.moveBaseColumn(t.baseIndent+O.value),!0)},[b.OrderedList]:_p,[b.BulletList]:_p,[b.Document](){return!0}};function ot(O){return O==32||O==9||O==10||O==13}function vr(O,e=0){for(;et&&ot(O.charCodeAt(e-1));)e--;return e}function Lp(O){if(O.next!=96&&O.next!=126)return-1;let e=O.pos+1;for(;e-1&&O.depth==e.stack.length&&e.parser.leafBlockParsers.indexOf(Kp.SetextHeading)>-1||i<3?-1:1}function Dp(O,e){for(let t=O.stack.length-1;t>=0;t--)if(O.stack[t].type==e)return!0;return!1}function _c(O,e,t){return(O.next==45||O.next==43||O.next==42)&&(O.pos==O.text.length-1||ot(O.text.charCodeAt(O.pos+1)))&&(!t||Dp(e,b.BulletList)||O.skipSpace(O.pos+2)=48&&r<=57;){i++;if(i==O.text.length)return-1;r=O.text.charCodeAt(i)}return i==O.pos||i>O.pos+9||r!=46&&r!=41||iO.pos+1||O.next!=49)?-1:i+1-O.pos}function Ip(O){if(O.next!=35)return-1;let e=O.pos+1;for(;e6?-1:t}function Bp(O){if(O.next!=45&&O.next!=61||O.indent>=O.baseIndent+4)return-1;let e=O.pos+1;for(;e/,Fp=/\?>/,Tc=[[/^<(?:script|pre|style)(?:\s|>|$)/i,/<\/(?:script|pre|style)>/i],[/^\s*/i.exec(i);if(n)return O.append(L(b.Comment,t,t+1+n[0].length));let s=/^\?[^]*?\?>/.exec(i);if(s)return O.append(L(b.ProcessingInstruction,t,t+1+s[0].length));let a=/^(?:![A-Z][^]*?>|!\[CDATA\[[^]*?\]\]>|\/\s*[a-zA-Z][\w-]*\s*>|\s*[a-zA-Z][\w-]*(\s+[a-zA-Z:_][\w-.:]*(?:\s*=\s*(?:[^\s"'=<>`]+|'[^']*'|"[^"]*"))?)*\s*(\/\s*)?>)/.exec(i);return a?O.append(L(b.HTMLTag,t,t+1+a[0].length)):-1},Emphasis(O,e,t){if(e!=95&&e!=42)return-1;let i=t+1;for(;O.char(i)==e;)i++;let r=O.slice(t-1,t),n=O.slice(i,i+1),s=Rr.test(r),a=Rr.test(n),o=/\s|^$/.test(r),l=/\s|^$/.test(n),c=!l&&(!a||o||s),h=!o&&(!s||l||a),f=c&&(e==42||!h||s),u=h&&(e==42||!c||a);return O.append(new Ve(e==95?tm:Om,t,i,(f?1:0)|(u?2:0)))},HardBreak(O,e,t){if(e==92&&O.char(t+1)==10)return O.append(L(b.HardBreak,t,t+2));if(e==32){let i=t+1;for(;O.char(i)==32;)i++;if(O.char(i)==10&&i>=t+2)return O.append(L(b.HardBreak,t,i+1))}return-1},Link(O,e,t){return e==91?O.append(new Ve(zO,t,t+1,1)):-1},Image(O,e,t){return e==33&&O.char(t+1)==91?O.append(new Ve(Vs,t,t+2,1)):-1},LinkEnd(O,e,t){if(e!=93)return-1;for(let i=O.parts.length-1;i>=0;i--){let r=O.parts[i];if(r instanceof Ve&&(r.type==zO||r.type==Vs)){if(!r.side||O.skipSpace(r.to)==t&&!/[(\[]/.test(O.slice(t+1,t+2)))return O.parts[i]=null,-1;let n=O.takeContent(i),s=O.parts[i]=Mx(O,n,r.type==zO?b.Link:b.Image,r.from,t+1);if(r.type==zO)for(let a=0;ae?L(b.URL,e+t,n+t):n==O.length?null:!1}}function rm(O,e,t){let i=O.charCodeAt(e);if(i!=39&&i!=34&&i!=40)return!1;let r=i==40?41:i;for(let n=e+1,s=!1;n=this.end?-1:this.text.charCodeAt(e-this.offset)}get end(){return this.offset+this.text.length}slice(e,t){return this.text.slice(e-this.offset,t-this.offset)}append(e){return this.parts.push(e),e.to}addDelimiter(e,t,i,r,n){return this.append(new Ve(e,t,i,(r?1:0)|(n?2:0)))}get hasOpenLink(){for(let e=this.parts.length-1;e>=0;e--){let t=this.parts[e];if(t instanceof Ve&&(t.type==zO||t.type==Vs))return!0}return!1}addElement(e){return this.append(e)}resolveMarkers(e){for(let i=e;i=e;o--){let $=this.parts[o];if($ instanceof Ve&&$.side&1&&$.type==r.type&&!(n&&(r.side&1||$.side&2)&&($.to-$.from+s)%3==0&&(($.to-$.from)%3||s%3))){a=$;break}}if(!a)continue;let l=r.type.resolve,c=[],h=a.from,f=r.to;if(n){let $=Math.min(2,a.to-a.from,s);h=a.to-$,f=r.from+$,l=$==1?"Emphasis":"StrongEmphasis"}a.type.mark&&c.push(this.elt(a.type.mark,h,a.to));for(let $=o+1;$=0;t--){let i=this.parts[t];if(i instanceof Ve&&i.type==e&&i.side&1)return t}return null}takeContent(e){let t=this.resolveMarkers(e);return this.parts.length=e,t}getDelimiterAt(e){let t=this.parts[e];return t instanceof Ve?t:null}skipSpace(e){return vr(this.text,e-this.offset)+this.offset}elt(e,t,i,r){return typeof e=="string"?L(this.parser.getNodeType(e),t,i,r):new Rs(e,t)}};Vr.linkStart=zO;Vr.imageStart=Vs;function wc(O,e){if(!e.length)return O;if(!O.length)return e;let t=O.slice(),i=0;for(let r of e){for(;i(e?e-1:0))return!1;if(this.fragmentEnd<0){let n=this.fragment.to;for(;n>0&&this.input.read(n-1,n)!=` +`;)n--;this.fragmentEnd=n?n-1:0}let i=this.cursor;i||(i=this.cursor=this.fragment.tree.cursor(),i.firstChild());let r=e+this.fragment.offset;for(;i.to<=r;)if(!i.parent())return!1;for(;;){if(i.from>=r)return this.fragment.from<=t;if(!i.childAfter(r))return!1}}matches(e){let t=this.cursor.tree;return t&&t.prop(R.contextHash)==e}takeNodes(e){let t=this.cursor,i=this.fragment.offset,r=this.fragmentEnd-(this.fragment.openEnd?1:0),n=e.absoluteLineStart,s=n,a=e.block.children.length,o=s,l=a;for(;;){if(t.to-i>r){if(t.type.isAnonymous&&t.firstChild())continue;break}let c=sm(t.from-i,e.ranges);if(t.to-i<=e.ranges[e.rangeI].to)e.addNode(t.tree,c);else{let h=new D(e.parser.nodeSet.types[b.Paragraph],[],[],0,e.block.hashProp);e.reusePlaceholders.set(h,t.tree),e.addNode(h,c)}if(t.type.is("Block")&&(Dx.indexOf(t.type.id)<0?(s=t.to-i,a=e.block.children.length):(s=o,a=l,o=t.to-i,l=e.block.children.length)),!t.nextSibling())break}for(;e.block.children.length>a;)e.block.children.pop(),e.block.positions.pop();return s-n}};function sm(O,e){let t=O;for(let i=1;iZs[O]),Object.keys(Zs).map(O=>Kp[O]),Object.keys(Zs),Ax,Ap,Object.keys(gc).map(O=>gc[O]),Object.keys(gc),[]);function Bx(O,e,t){let i=[];for(let r=O.firstChild,n=e;;r=r.nextSibling){let s=r?r.from:t;if(s>n&&i.push({from:n,to:s}),!r)break;n=r.to}return i}function om(O){let{codeParser:e,htmlParser:t}=O;return{wrap:xO((r,n)=>{let s=r.type.id;if(e&&(s==b.CodeBlock||s==b.FencedCode)){let a="";if(s==b.FencedCode){let l=r.node.getChild(b.CodeInfo);l&&(a=n.read(l.from,l.to))}let o=e(a);if(o)return{parser:o,overlay:l=>l.type.id==b.CodeText,bracketed:s==b.FencedCode}}else if(t&&(s==b.HTMLBlock||s==b.HTMLTag||s==b.CommentBlock))return{parser:t,overlay:Bx(r.node,r.from,r.to)};return null})}}var Nx={resolve:"Strikethrough",mark:"StrikethroughMark"},Fx={defineNodes:[{name:"Strikethrough",style:{"Strikethrough/...":d.strikethrough}},{name:"StrikethroughMark",style:d.processingInstruction}],parseInline:[{name:"Strikethrough",parse(O,e,t){if(e!=126||O.char(t+1)!=126||O.char(t+2)==126)return-1;let i=O.slice(t-1,t),r=O.slice(t+2,t+3),n=/\s|^$/.test(i),s=/\s|^$/.test(r),a=Rr.test(i),o=Rr.test(r);return O.addDelimiter(Nx,t,t+2,!s&&(!o||n||a),!n&&(!a||s||o))},after:"Emphasis"}]};function Yr(O,e,t=0,i,r=0){let n=0,s=!0,a=-1,o=-1,l=!1,c=()=>{i.push(O.elt("TableCell",r+a,r+o,O.parser.parseInline(e.slice(a,o),r+a)))};for(let h=t;h-1)&&n++,s=!1,i&&(a>-1&&c(),i.push(O.elt("TableDelimiter",h+r,h+r+1))),a=o=-1):(l||f!=32&&f!=9)&&(a<0&&(a=h),o=h+1),l=!l&&f==92}return a>-1&&(n++,i&&c()),n}function zp(O,e){for(let t=e;tr instanceof qs)||!zp(e.text,e.basePos))return!1;let i=O.peekLine();return lm.test(i)&&Yr(O,e.text,e.basePos)==Yr(O,i,e.basePos)},before:"SetextHeading"}]},vc=class{nextLine(){return!1}finish(e,t){return e.addLeafElement(t,e.elt("Task",t.start,t.start+t.content.length,[e.elt("TaskMarker",t.start,t.start+3),...e.parser.parseInline(t.content.slice(3),t.start+3)])),!0}},Kx={defineNodes:[{name:"Task",block:!0,style:d.list},{name:"TaskMarker",style:d.atom}],parseBlock:[{name:"TaskList",leaf(O,e){return/^\[[ xX]\][ \t]/.test(e.content)&&O.parentType().name=="ListItem"?new vc:null},after:"SetextHeading"}]},Up=/(www\.)|(https?:\/\/)|([\w.+-]{1,100}@)|(mailto:|xmpp:)/gy,Wp=/[\w-]+(\.[\w-]+)+(\/[^\s<]*)?/gy,Jx=/[\w-]+\.[\w-]+($|\/)/,jp=/[\w.+-]+@[\w-]+(\.[\w.-]+)+/gy,Cp=/\/[a-zA-Z\d@.]+/gy;function Gp(O,e,t,i){let r=0;for(let n=e;n-1)return-1;let i=e+t[0].length;for(;;){let r=O[i-1],n;if(/[?!.,:*_~]/.test(r)||r==")"&&Gp(O,e,i,")")>Gp(O,e,i,"("))i--;else if(r==";"&&(n=/&(?:#\d+|#x[a-f\d]+|\w+);$/.exec(O.slice(e,i))))i=e+n.index;else break}return i}function Ep(O,e){jp.lastIndex=e;let t=jp.exec(O);if(!t)return-1;let i=t[0][t[0].length-1];return i=="_"||i=="-"?-1:e+t[0].length-(i=="."?1:0)}var tk={parseInline:[{name:"Autolink",parse(O,e,t){let i=t-O.offset;if(i&&/\w/.test(O.text[i-1]))return-1;Up.lastIndex=i;let r=Up.exec(O.text),n=-1;if(!r)return-1;if(r[1]||r[2]){if(n=ek(O.text,i+r[0].length),n>-1&&O.hasOpenLink){let s=/([^\[\]]|\[[^\]]*\])*/.exec(O.text.slice(i,n));n=i+s[0].length}}else r[3]?n=Ep(O.text,i):(n=Ep(O.text,i+r[0].length),n>-1&&r[0]=="xmpp:"&&(Cp.lastIndex=n,r=Cp.exec(O.text),r&&(n=r.index+r[0].length)));return n<0?-1:(O.addElement(O.elt("URL",t,n+O.offset)),n+O.offset)}}]},cm=[Hx,Kx,Fx,tk];function hm(O,e,t){return(i,r,n)=>{if(r!=O||i.char(n+1)==O)return-1;let s=[i.elt(t,n,n+1)];for(let a=n+1;a"}}}),mm=new R,gm=am.configure({props:[te.add(O=>!O.is("Block")||O.is("Document")||zc(O)!=null||Ok(O)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),mm.add(zc),se.add({Document:()=>null}),iO.add({Document:pm})]});function zc(O){let e=/^(?:ATX|Setext)Heading(\d)$/.exec(O.name);return e?+e[1]:void 0}function Ok(O){return O.name=="OrderedList"||O.name=="BulletList"}function ik(O,e){let t=O;for(;;){let i=t.nextSibling,r;if(!i||(r=zc(i.type))!=null&&r<=e)break;t=i}return t.to}var rk=Ho.of((O,e,t)=>{for(let i=U(O).resolveInner(t,-1);i&&!(i.fromt)return{from:t,to:n}}return null});function Uc(O){return new Re(pm,O,[],"markdown")}var nk=Uc(gm),sk=gm.configure([cm,dm,fm,um,{props:[te.add({Table:(O,e)=>({from:e.doc.lineAt(O.from).to,to:O.to})})]}]),zs=Uc(sk);function ak(O,e){return t=>{if(t&&O){let i=null;if(t=/\S*/.exec(t)[0],typeof O=="function"?i=O(t):i=ar.matchLanguageName(O,t,!0),i instanceof ar)return i.support?i.support.language.parser:nr.getSkippingParser(i.load());if(i)return i.parser}return e?e.parser:null}}var qr=class{constructor(e,t,i,r,n,s,a){this.node=e,this.from=t,this.to=i,this.spaceBefore=r,this.spaceAfter=n,this.type=s,this.item=a}blank(e,t=!0){let i=this.spaceBefore+(this.node.name=="Blockquote"?">":"");if(e!=null){for(;i.length0;r--)i+=" ";return i+(t?this.spaceAfter:"")}}marker(e,t){let i=this.node.name=="OrderedList"?String(+Sm(this.item,e)[2]+t):"";return this.spaceBefore+i+this.type+this.spaceAfter}};function Pm(O,e){let t=[],i=[];for(let r=O;r;r=r.parent){if(r.name=="FencedCode")return i;(r.name=="ListItem"||r.name=="Blockquote")&&t.push(r)}for(let r=t.length-1;r>=0;r--){let n=t[r],s,a=e.lineAt(n.from),o=n.from-a.from;if(n.name=="Blockquote"&&(s=/^ *>( ?)/.exec(a.text.slice(o))))i.push(new qr(n,o,o+s[0].length,"",s[1],">",null));else if(n.name=="ListItem"&&n.parent.name=="OrderedList"&&(s=/^( *)\d+([.)])( *)/.exec(a.text.slice(o)))){let l=s[3],c=s[0].length;l.length>=4&&(l=l.slice(0,l.length-4),c-=4),i.push(new qr(n.parent,o,o+c,s[1],l,s[2],n))}else if(n.name=="ListItem"&&n.parent.name=="BulletList"&&(s=/^( *)([-+*])( {1,4}\[[ xX]\])?( +)/.exec(a.text.slice(o)))){let l=s[4],c=s[0].length;l.length>4&&(l=l.slice(0,l.length-4),c-=4);let h=s[2];s[3]&&(h+=s[3].replace(/[xX]/," ")),i.push(new qr(n.parent,o,o+c,s[1],l,h,n))}}return i}function Sm(O,e){return/^(\s*)(\d+)(?=[.)])/.exec(e.sliceString(O.from,O.from+10))}function Vc(O,e,t,i=0){for(let r=-1,n=O;;){if(n.name=="ListItem"){let a=Sm(n,e),o=+a[2];if(r>=0){if(o!=r+1)return;t.push({from:n.from+a[1].length,to:n.from+a[0].length,insert:String(r+2+i)})}r=o}let s=n.nextSibling;if(!s)break;n=s}}function Wc(O,e){let t=/^[ \t]*/.exec(O)[0].length;if(!t||e.facet(nO)!=" ")return O;let i=ve(O,4,t),r="";for(let n=i;n>0;)n>=4?(r+=" ",n-=4):(r+=" ",n--);return r+O.slice(t)}var ok=(O={})=>({state:e,dispatch:t})=>{let i=U(e),{doc:r}=e,n=null,s=e.changeByRange(a=>{if(!a.empty||!zs.isActiveAt(e,a.from,-1)&&!zs.isActiveAt(e,a.from,1))return n={range:a};let o=a.from,l=r.lineAt(o),c=Pm(i.resolveInner(o,-1),r);for(;c.length&&c[c.length-1].from>o-l.from;)c.pop();if(!c.length)return n={range:a};let h=c[c.length-1];if(h.to-h.spaceAfter.length>o-l.from)return n={range:a};let f=o>=h.to-h.spaceAfter.length&&!/\S/.test(l.text.slice(h.to));if(h.item&&f){let m=h.node.firstChild,g=h.node.getChild("ListItem","ListItem");if(m.to>=o||g&&g.to0&&!/[^\s>]/.test(r.lineAt(l.from-1).text)||O.nonTightLists===!1){let P=c.length>1?c[c.length-2]:null,y,X="";P&&P.item?(y=l.from+P.from,X=P.marker(r,1)):y=l.from+(P?P.to:0);let x=[{from:y,to:o,insert:X}];return h.node.name=="OrderedList"&&Vc(h.item,r,x,-2),P&&P.node.name=="OrderedList"&&Vc(P.item,r,x),{range:S.cursor(y+X.length),changes:x}}else{let P=$m(c,e,l);return{range:S.cursor(o+P.length+1),changes:{from:l.from,insert:P+e.lineBreak}}}}if(h.node.name=="Blockquote"&&f&&l.from){let m=r.lineAt(l.from-1),g=/>\s*$/.exec(m.text);if(g&&g.index==h.from){let P=e.changes([{from:m.from+g.index,to:m.to},{from:l.from+h.from,to:l.to}]);return{range:a.map(P),changes:P}}}let u=[];h.node.name=="OrderedList"&&Vc(h.item,r,u);let Q=h.item&&h.item.from]*/.exec(l.text)[0].length>=h.to)for(let m=0,g=c.length-1;m<=g;m++)$+=m==g&&!Q?c[m].marker(r,1):c[m].blank(ml.from&&/\s/.test(l.text.charAt(p-l.from-1));)p--;return $=Wc($,e),ck(h.node,e.doc)&&($=$m(c,e,l)+e.lineBreak+$),u.push({from:p,to:o,insert:e.lineBreak+$}),{range:S.cursor(p+$.length+1),changes:u}});return n?!1:(t(e.update(s,{scrollIntoView:!0,userEvent:"input"})),!0)},lk=ok();function Qm(O){return O.name=="QuoteMark"||O.name=="ListMark"}function ck(O,e){if(O.name!="OrderedList"&&O.name!="BulletList")return!1;let t=O.firstChild,i=O.getChild("ListItem","ListItem");if(!i)return!1;let r=e.lineAt(t.to),n=e.lineAt(i.from),s=/^[\s>]*$/.test(r.text);return r.number+(s?0:1){let t=U(O),i=null,r=O.changeByRange(n=>{let s=n.from,{doc:a}=O;if(n.empty&&zs.isActiveAt(O,n.from)){let o=a.lineAt(s),l=Pm(hk(t,s),a);if(l.length){let c=l[l.length-1],h=c.to-c.spaceAfter.length+(c.spaceAfter?1:0);if(s-o.from>h&&!/\S/.test(o.text.slice(h,s-o.from)))return{range:S.cursor(o.from+h),changes:{from:o.from+h,to:s}};if(s-o.from==h&&(!c.item||o.from<=c.item.from||!/\S/.test(o.text.slice(0,c.to)))){let f=o.from+c.from;if(c.item&&c.node.from{var t;let{main:i}=e.state.selection;if(i.empty)return!1;let r=(t=O.clipboardData)===null||t===void 0?void 0:t.getData("text/plain");if(!r||!/^(https?:\/\/|mailto:|xmpp:|www\.)/.test(r)||(/^www\./.test(r)&&(r="https://"+r),!zs.isActiveAt(e.state,i.from,1)))return!1;let n=U(e.state),s=!1;return n.iterate({from:i.from,to:i.to,enter:a=>{(a.from>i.from||$k.test(a.name))&&(s=!0)},leave:a=>{a.to=97&&O<=122||O>=65&&O<=90}function zr(O){return O==95||O>=128||wm(O)}function Cc(O){return O>=48&&O<=55||O>=97&&O<=102||O>=65&&O<=70}var _w={int:!0,integer:!0,bool:!0,boolean:!0,float:!0,double:!0,real:!0,string:!0,array:!0,object:!0,unset:!0,__proto__:null},Rw=new z(O=>{if(O.next==40){O.advance();let e=0;for(;km(O.peek(e));)e++;let t="",i;for(;wm(i=O.peek(e));)t+=String.fromCharCode(i),e++;for(;km(O.peek(e));)e++;O.peek(e)==41&&_w[t.toLowerCase()]&&O.acceptToken(mk)}else if(O.next==60&&O.peek(1)==60&&O.peek(2)==60){for(let i=0;i<3;i++)O.advance();for(;O.next==32||O.next==9;)O.advance();let e=O.next==39;if(e&&O.advance(),!zr(O.next))return;let t=String.fromCharCode(O.next);for(;O.advance(),!(!zr(O.next)&&!(O.next>=48&&O.next<=55));)t+=String.fromCharCode(O.next);if(e){if(O.next!=39)return;O.advance()}if(O.next!=10&&O.next!=13)return;for(;;){let i=O.next==10||O.next==13;if(O.advance(),O.next<0)return;if(i){for(;O.next==32||O.next==9;)O.advance();let r=!0;for(let n=0;n{O.next<0&&O.acceptToken(Tk)}),qw=new z((O,e)=>{O.next==63&&e.canShift(bm)&&O.peek(1)==62&&O.acceptToken(bm)});function zw(O){let e=O.peek(1);if(e==110||e==114||e==116||e==118||e==101||e==102||e==92||e==36||e==34||e==123)return 2;if(e>=48&&e<=55){let t=2,i;for(;t<5&&(i=O.peek(t))>=48&&i<=55;)t++;return t}if(e==120&&Cc(O.peek(2)))return Cc(O.peek(3))?4:3;if(e==117&&O.peek(2)==123)for(let t=3;;t++){let i=O.peek(t);if(i==125)return t==2?0:t+1;if(!Cc(i))break}return 0}var Uw=new z((O,e)=>{let t=!1;for(;!(O.next==34||O.next<0||O.next==36&&(zr(O.peek(1))||O.peek(1)==123)||O.next==123&&O.peek(1)==36);t=!0){if(O.next==92){let i=zw(O);if(i){if(t)break;return O.acceptToken(Sk,i)}}else if(!t&&(O.next==91||O.next==45&&O.peek(1)==62&&zr(O.peek(2))||O.next==63&&O.peek(1)==45&&O.peek(2)==62&&zr(O.peek(3)))&&e.canShift(Xk))break;O.advance()}t&&O.acceptToken(Pk)}),Ww=F({"Visibility abstract final static":d.modifier,"for foreach while do if else elseif switch try catch finally return throw break continue default case":d.controlKeyword,"endif endfor endforeach endswitch endwhile declare enddeclare goto match":d.controlKeyword,"and or xor yield unset clone instanceof insteadof":d.operatorKeyword,"function fn class trait implements extends const enum global interface use var":d.definitionKeyword,"include include_once require require_once namespace":d.moduleKeyword,"new from echo print array list as":d.keyword,null:d.null,Boolean:d.bool,VariableName:d.variableName,"NamespaceName/...":d.namespace,"NamedType/...":d.typeName,Name:d.name,"CallExpression/Name":d.function(d.variableName),"LabelStatement/Name":d.labelName,"MemberExpression/Name":d.propertyName,"MemberExpression/VariableName":d.special(d.propertyName),"ScopedExpression/ClassMemberName/Name":d.propertyName,"ScopedExpression/ClassMemberName/VariableName":d.special(d.propertyName),"CallExpression/MemberExpression/Name":d.function(d.propertyName),"CallExpression/ScopedExpression/ClassMemberName/Name":d.function(d.propertyName),"MethodDeclaration/Name":d.function(d.definition(d.variableName)),"FunctionDefinition/Name":d.function(d.definition(d.variableName)),"ClassDeclaration/Name":d.definition(d.className),UpdateOp:d.updateOperator,ArithOp:d.arithmeticOperator,"LogicOp IntersectionType/&":d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,ControlOp:d.controlOperator,AssignOp:d.definitionOperator,"$ ConcatOp":d.operator,LineComment:d.lineComment,BlockComment:d.blockComment,Integer:d.integer,Float:d.float,String:d.string,ShellExpression:d.special(d.string),"=> ->":d.punctuation,"( )":d.paren,"#[ [ ]":d.squareBracket,"${ { }":d.brace,"-> ?->":d.derefOperator,", ; :: : \\":d.separator,"PhpOpen PhpClose":d.processingInstruction}),jw={__proto__:null,static:325,STATIC:325,class:351,CLASS:351},Zm=Oe.deserialize({version:14,states:"%#[Q`OWOOQhQaOOP%oO`OOOOO#t'#Hh'#HhO%tO#|O'#DuOOO#u'#Dx'#DxQ&SOWO'#DxO&XO$VOOOOQ#u'#Dy'#DyO&lQaO'#D}O'[QdO'#EQO+QQdO'#IqO+_QdO'#ERO-RQaO'#EXO/bQ`O'#EUO/gQ`O'#E_O2UQaO'#E_O2]Q`O'#EgO2bQ`O'#EqO-RQaO'#EqO2mQpO'#FOO2rQ`O'#FOOOQS'#Iq'#IqO2wQ`O'#ExOOQS'#Ih'#IhO5SQdO'#IeO9UQeO'#F]O-RQaO'#FlO-RQaO'#FmO-RQaO'#FnO-RQaO'#FoO-RQaO'#FoO-RQaO'#FrOOQO'#Ir'#IrO9cQ`O'#FxOOQO'#Ht'#HtO9kQ`O'#HXO:VQ`O'#FsO:bQ`O'#HfO:mQ`O'#GPO:uQaO'#GQO-RQaO'#G`O-RQaO'#GcO;bOrO'#GfOOQS'#JP'#JPOOQS'#JO'#JOOOQS'#Ie'#IeO/bQ`O'#GmO/bQ`O'#GoO/bQ`O'#GtOhQaO'#GvO;iQ`O'#GwO;nQ`O'#GzO:]Q`O'#G}O;sQeO'#HOO;sQeO'#HPO;sQeO'#HQO;}Q`O'#HROhQ`O'#HVO:]Q`O'#HWO>mQ`O'#HWO;}Q`O'#HXO:]Q`O'#HZO:]Q`O'#H[O:]Q`O'#H]O>rQ`O'#H`O>}Q`O'#HaOQO!$dQ`O,5POOQ#u-E;h-E;hO!1QQ`O,5=tOOO#u,5:_,5:_O!1]O#|O,5:_OOO#u-E;g-E;gOOOO,5>|,5>|OOQ#y1G0T1G0TO!1eQ`O1G0YO-RQaO1G0YO!2wQ`O1G0qOOQS1G0q1G0qOOQS'#Eo'#EoOOQS'#Il'#IlO-RQaO'#IlOOQS1G0r1G0rO!4ZQ`O'#IoO!5pQ`O'#IqO!5}QaO'#EwOOQO'#Io'#IoO!6XQ`O'#InO!6aQ`O,5;aO-RQaO'#FXOOQS'#FW'#FWOOQS1G1[1G1[O!6fQdO1G1dO!8kQdO1G1dO!:WQdO1G1dO!;sQdO1G1dO!=`QdO1G1dO!>{QdO1G1dO!@hQdO1G1dO!BTQdO1G1dO!CpQdO1G1dO!E]QdO1G1dO!FxQdO1G1dO!HeQdO1G1dO!JQQdO1G1dO!KmQdO1G1dO!MYQdO1G1dO!NuQdO1G1dOOQT1G0_1G0_O!#[Q`O,5<_O#!bQaO'#EYOOQS1G0[1G0[O#!iQ`O,5:zOEdQaO,5:zO#!nQaO,5;OO#!uQdO,5:|O#$tQdO,5?UO#&sQaO'#HmO#'TQ`O,5?TOOQS1G0e1G0eO#']Q`O1G0eO#'bQ`O'#IkO#(zQ`O'#IkO#)SQ`O,5;SOG|QaO,5;SOOQS1G0w1G0wOOQO,5>^,5>^OOQO-E;p-E;pOOQS1G1U1G1UO#)pQdO'#FQO#+uQ`O'#HsOJ}QpO1G1UO2wQ`O'#HpO#+zQtO,5;eO2wQ`O'#HqO#,iQtO,5;gO#-WQaO1G1OOOQS,5;h,5;hO#/gQtO'#FQO#/tQdO1G0dO-RQaO1G0dO#1aQdO1G1aO#2|QdO1G1cOOQO,5X,5>XOOQO-E;k-E;kOOQS7+&P7+&PO!+iQaO,5;TO$$^QaO'#HnO$$hQ`O,5?VOOQS1G0n1G0nO$$pQ`O1G0nPOQO'#FQ'#FQOOQO,5>_,5>_OOQO-E;q-E;qOOQS7+&p7+&pOOQS,5>[,5>[OOQS-E;n-E;nO$$uQtO,5>]OOQS-E;o-E;oO$%dQdO7+&jO$'iQtO'#FQO$'vQdO7+&OOOQS1G0j1G0jOOQO,5>a,5>aOOQO-E;s-E;sOOQ#u7+(x7+(xO!$[QdO7+(xOOQ#u7+(}7+(}O#JfQ`O7+(}O#JkQ`O7+(}OOQ#u7+(z7+(zO!.]Q`O7+(zO!1TQ`O7+(zO!1QQ`O7+(zO$)cQ`O,5i,5>iOOQS-E;{-E;{O$.lQdO7+'qO$.|QpO7+'qO$/XQdO'#IxOOQO,5pOOQ#u,5>p,5>pOOQ#u-EoOOQS-EVQdO1G2^OOQS,5>h,5>hOOQS-E;z-E;zOOQ#u7+({7+({O$?oQ`O'#GXO:]Q`O'#H_OOQO'#IV'#IVO$@fQ`O,5=xOOQ#u,5=x,5=xO$AcQ!bO'#EQO$AzQ!bO7+(}O$BYQpO7+)RO#KRQpO7+)RO$BbQ`O'#HbO!$[QdO7+)RO$BpQdO,5>rOOQS-EVOOQS-E;i-E;iO$D{QdO<Z,5>ZOOQO-E;m-E;mOOQS1G1_1G1_O$8rQaO,5:uO$G}QaO'#HlO$H[Q`O,5?QOOQS1G0`1G0`OOQS7+&Q7+&QO$HdQ`O7+&UO$IyQ`O1G0oO$K`Q`O,5>YOOQO,5>Y,5>YOOQO-E;l-E;lOOQS7+&Y7+&YOOQS7+&U7+&UOOQ#u<c,5>cOOQO-E;u-E;uOOQS<lOOQ#u-EmOOQO-EW,5>WOOQO-E;j-E;jO!+iQaO,5;UOOQ#uANBTANBTO#JfQ`OANBTOOQ#uANBQANBQO!.]Q`OANBQO!+iQaO7+'hOOQO7+'l7+'lO%-bQ`O7+'hO%.wQ`O7+'hO%/SQ`O7+'lO!+iQaO7+'mOOQO7+'m7+'mO%/XQdO'#F}OOQO'#Hv'#HvO%/jQ`O,5e,5>eOOQS-E;w-E;wOOQO1G2_1G2_O$1YQdO1G2_O$/jQpO1G2_O#JkQ`O1G2]O!.mQdO1G2aO%$dQ!bO1G2]O!$[QdO1G2]OOQO1G2a1G2aOOQO1G2]1G2]O%2uQaO'#G]OOQO1G2b1G2bOOQSAN@xAN@xO!.]Q`OAN@xOOOQ<]O%6rQ!bO'#FQO!$[QdOANBXOOQ#uANBXANBXO:]Q`O,5=}O%7WQ`O,5=}O%7cQ`O'#IXO%7wQ`O,5?rOOQS1G3h1G3hOOQS7+)x7+)xP%+OQpOANBXO%8PQ`O1G0pOOQ#uG27oG27oOOQ#uG27lG27lO%9fQ`O<d,5>dO%dOOQO-E;v-E;vO%hQ`O'#IqO%>rQ`O'#IhO!$[QdO'#IOO%@lQaO,5s,5>sOOQO-Ej,5>jOOQP-E;|-E;|OOQO1G2c1G2cOOQ#uLD,kLD,kOOQTG27[G27[O!$[QdOLD-RO!$[QdO<OO%EpQ`O,5>OPOQ#uLD-_LD-_OOQO7+'o7+'oO+_QdO7+'oOOQS!$( ]!$( ]OOQOAN@}AN@}OOQS1G2d1G2dOOQS1G2e1G2eO%E{QdO1G2eOOQ#u!$(!m!$(!mOOQOANBVANBVOOQO1G3j1G3jO:]Q`O1G3jOOQO<tQaO,5:xO'/vQaO,5;uO'/vQaO,5;wO'@sQdO,5YQdO,5<^O)@XQdO,5QQ`O,5=eO*>YQaO'#HkO*>dQ`O,5?ROlQdO7+%tO*@kQ`O1G0jO!+iQaO1G0jO*BQQdO7+&OOoO*GeQ`O,5>VO*HzQdO<[QdO,5{QdO'#IjO.BbQ`O'#IeO.BoQ`O'#GPO.BwQaO,5:nO.COQ`O,5uOs#fOx7xOy7xO}aO!O^O!Q8OO!R}O!T7}O!V7yO!W7yO!Z8QO!d:QO!z]O#T#mO#V#lO#X`O#dhO#fbO#gcO#sdO$[7|O$d7{O$e7|O$hqO%T8PO%U!OO%W}O%X}O%`|O'WYO'u{O#Y']P~O#O#qO~P/lO!z#rO~O#d#tO#fbO#gcO~O'a#vO~O#s#zO~OU$OO!R$OO!w#}O#s3hO'W#{O~OT'XXz'XX!S'XX!c'XX!n'XX!w'XX!z'XX#T'XX#X'XX#a'XX#b'XX#y'XX$R'XX$S'XX$T'XX$U'XX$V'XX$X'XX$Y'XX$Z'XX$['XX$]'XX$^'XX$_'XX%T'XX'P'XX!y'XX!o'XX~O#|$QO$O$RO~P3YOP7wOQ|OU_OW}O[7zOo>uOs#fOx7xOy7xO}aO!O^O!Q8OO!R}O!T7}O!V7yO!W7yO!Z8QO!d:QO!z]O#X`O#dhO#fbO#gcO#sdO$[7|O$d7{O$e7|O$hqO%T8PO%U!OO%W}O%X}O%`|O'WYO'u{OT$PXz$PX!S$PX!c$PX!n$PX!w$PX#a$PX#b$PX#y$PX$R$PX$S$PX$T$PX$U$PX$V$PX$X$PX$Y$PX$Z$PX$]$PX$^$PX$_$PX'P$PX!y$PX!o$PX~Or$TO#T8eO#V8dO~P5^O#sdO'WYO~OS$fO]$aOk$dOm$fOs$`O!a$bO$krO$u$eO~O!z$hO#T$jO'W$gO~Oo$mOs$lO#d$nO~O!z$hO#T$rO~O!U$uO$u$tO~P-ROR${O!p$zO#d$yO#g$zO&}${O~O't$}O~P;PO!z%SO~O!z%UO~O!n#bO'P#bO~P-RO!pXO~O!z%`O~OP7wOQ|OU_OW}O[7zOo>uOs#fOx7xOy7xO}aO!O^O!Q8OO!R}O!T7}O!V7yO!W7yO!Z8QO!d:QO!z]O#X`O#dhO#fbO#gcO#sdO$[7|O$d7{O$e7|O$hqO%T8PO%U!OO%W}O%X}O%`|O'WYO'u{O~O!z%dO~O]$aO~O!pXO#sdO'WYO~O]%rOs%rO#s%nO'WYO~O!j%wO'Q%wO'TRO~O'Q%zO~PhO!o%{O~PhO!r%}O~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'cX#O'cX~P!%aO!r)yO!y'eX#O'eX~P)dO!y#kX#O#kX~P!+iO#O){O!y'bX~O!y)}O~O%T#cOT$Qiz$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi$_$Qi'P$Qi!y$Qi#O$Qi#P$Qi#Y$Qi!o$Qi!r$QiV$Qi#|$Qi$O$Qi!p$Qi~P!%aOz#QO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO!w!yO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi'P$Qi!y$Qi!o$Qi~P!%aOT#SOz#QO!c#UO!w!yO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cO!S$Qi!n$Qi'P$Qi!y$Qi!o$Qi~P!%aOT#SOz#QO!w!yO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cO!S$Qi!c$Qi!n$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi$T$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi$T$Qi$U$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$[#_O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$Z#^O$[#_O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi'P$Qi!y$Qi!o$Qi~P!%aO_*PO~PxO$hqO$krO~P2wO#X+|O#a+{O#b+{O~O#d,OO%W,OO%^+}O'W$gO~O!o,PO~PCVOc%bXd%bXh%bXj%bXf%bXg%bXe%bX~PhOc,TOd,ROP%aiQ%aiS%aiU%aiW%aiX%ai[%ai]%ai^%ai`%aia%aib%aik%aim%aio%aip%aiq%ais%ait%aiu%aiv%aix%aiy%ai|%ai}%ai!O%ai!P%ai!Q%ai!R%ai!T%ai!V%ai!W%ai!X%ai!Y%ai!Z%ai![%ai!]%ai!^%ai!_%ai!a%ai!b%ai!d%ai!n%ai!p%ai!z%ai#X%ai#d%ai#f%ai#g%ai#s%ai$[%ai$d%ai$e%ai$h%ai$k%ai$u%ai%T%ai%U%ai%W%ai%X%ai%`%ai&|%ai'W%ai'u%ai'Q%ai!o%aih%aij%aif%aig%aiY%ai_%aii%aie%ai~Oc,XOd,UOh,WO~OY,YO_,ZO!o,^O~OY,YO_,ZOi%gX~Oi,`O~Oj,aO~O!n,cO~PxO$hqO$krO~P2wO!p)`O~OU$OO!R$OO!w3nO#s3iO'W,zO~O#s,|O~O!p-OO'a'UO~O#sdO'WYO!n&zX#O&zX'P&zX~O#O)gO!n'ya'P'ya~O#s-UO~O!n&_X#O&_X'P&_X#P&_X~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#ka#O#ka~P!%aO!y&cX#O&cX~P@aO#O){O!y'ba~O!o-_O~PCVO#P-`O~O#O-aO!o'YX~O!o-cO~O!y-dO~OT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O#Wi#Y#Wi~P!%aO!y&bX#O&bX~PxO#n'XO~OS+kO].cOm+kOs$`O!U+kO!`+kO!a+kO#d>xO$hqO$krO~P2wOS+kO].cOm+kOs$`O!U+kO!`+kO!a+kO#d>xO$hqO~P2wO!n#bO!p-yO'P#bO~OS+kO]+nOm+kOs$`O!U+kO!_+qO!`+kO!a+kO!o.mO#d>xO$hqO$krO~P2wO#d.rO%W.rO%^+}O'W$gO~O%W.sO~O#Y.tO~Oc%bad%bah%baj%baf%bag%bae%ba~PhOc.wOd,ROP%aqQ%aqS%aqU%aqW%aqX%aq[%aq]%aq^%aq`%aqa%aqb%aqk%aqm%aqo%aqp%aqq%aqs%aqt%aqu%aqv%aqx%aqy%aq|%aq}%aq!O%aq!P%aq!Q%aq!R%aq!T%aq!V%aq!W%aq!X%aq!Y%aq!Z%aq![%aq!]%aq!^%aq!_%aq!a%aq!b%aq!d%aq!n%aq!p%aq!z%aq#X%aq#d%aq#f%aq#g%aq#s%aq$[%aq$d%aq$e%aq$h%aq$k%aq$u%aq%T%aq%U%aq%W%aq%X%aq%`%aq&|%aq'W%aq'u%aq'Q%aq!o%aqh%aqj%aqf%aqg%aqY%aq_%aqi%aqe%aq~Oc.|Od,UOh.{O~O!r(hO~OP7wOQ|OU_OW}O[xO$hqO$krO~P2wOS+kOY,vO]+nOm+kOs$`O!U+kO!_+qO!`+kO!a+kO!o/fO#d>xO$hqO$krO~P2wOw!tX!p!tX#T!tX#n!tX#s#vX#|!tX'W!tX~Ow(ZO!p)`O#T3tO#n3sO~O!p-OO'a&fa~O]/nOs/nO#sdO'WYO~OV/rO!n&za#O&za'P&za~O#O)gO!n'yi'P'yi~O#s/tO~OT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!n&_a#O&_a'P&_a#P&_a~P!%aOz#QO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT!vy!S!vy!c!vy!n!vy!w!vy'P!vy!y!vy!o!vy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#ji#O#ji~P!%aO_*PO!o&`X#O&`X~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#]i#O#]i~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#P/yO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!y&ba#O&ba~P!%aO#|0OO!y$ji#O$ji~O#d0PO~O#V0SO#d0RO~P2wOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ji#O$ji~P!%aO!p-yO#|0TO!y$oi#O$oi~O!o0YO'W$gO~O#O0[O!y'kX~O#d0^O~O!y0_O~O!pXO!r0bO~O#T'ZO#n'XO!p'qy!n'qy'P'qy~O!n$sy'P$sy!y$sy!o$sy~PCVO#P0eO#T'ZO#n'XO~O#sdO'WYOw&mX!p&mX#O&mX!n&mX'P&mX~O#O.^Ow'la!p'la!n'la'P'la~OS+kO]0mOm+kOs$`O!U+kO!`+kO!a+kO#d>xO$hqO~P2wO#T3tO#n3sO'W$gO~O#|)XO#T'eX#n'eX'W'eX~O!n#bO!p0sO'P#bO~O#Y0wO~Oh0|O~OTvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$jq#O$jq~P!%aO#|1kO!y$jq#O$jq~O#d1lO~O!n#bO!pXO!z$hO#P1oO'P#bO~O!o1rO'W$gO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$oq#O$oq~P!%aO#T1tO#d1sO!y&lX#O&lX~O#O0[O!y'ka~O#T'ZO#n'XO!p'q!R!n'q!R'P'q!R~O!pXO!r1yO~O!n$s!R'P$s!R!y$s!R!o$s!R~PCVO#P1{O#T'ZO#n'XO~OP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#^i#O#^i~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$jy#O$jy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$oy#O$oy~P!%aO!pXO#P2rO~O#d2sO~O#O0[O!y'ki~O!n$s!Z'P$s!Z!y$s!Z!o$s!Z~PCVOTvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$j!R#O$j!R~P!%aO!n$s!c'P$s!c!y$s!c!o$s!c~PCVO!a3`O'W$gO~OV3dO!o&Wa#O&Wa~O'W$gO!n%Ri'P%Ri~O'a'_O~O'a/jO~O'a*iO~O'a1]O~OT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$ta#|$ta$O$ta'P$ta!y$ta!o$ta#O$ta~P!%aO#T3uO~P-RO#s3lO~O#s3mO~O!U$uO$u$tO~P#-WOT8TOz8RO!S8UO!c8VO!w:_O#P3pO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!n'^X'P'^X!y'^X!o'^X~P!%aOT6QOz6OO!S6RO!c6SO!w7oO#P5aO#T#PO$R6PO$S6TO$T6UO$U6VO$V6WO$X6YO$Y6ZO$Z6[O$[6]O$]6^O$^6_O$_6_O%T#cO#O'^X#Y'^X#|'^X$O'^X!n'^X'P'^X!r'^X!y'^X!o'^XV'^X!p'^X~P!%aO#T5OO~P#-WOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$`a#|$`a$O$`a'P$`a!y$`a!o$`a#O$`a~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$aa#|$aa$O$aa'P$aa!y$aa!o$aa#O$aa~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$ba#|$ba$O$ba'P$ba!y$ba!o$ba#O$ba~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$ca#|$ca$O$ca'P$ca!y$ca!o$ca#O$ca~P!%aOz3{O#|$ca$O$ca#O$ca~PMVOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$fa#|$fa$O$fa'P$fa!y$fa!o$fa#O$fa~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n%Va#|%Va$O%Va'P%Va!y%Va!o%Va#O%Va~P!%aOz3{O#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOT3}Oz3{O!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!S$Qi!n$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOT3}Oz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!S$Qi!c$Qi!n$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$[4YO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$Z4XO$[4YO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n#Ua#|#Ua$O#Ua'P#Ua!y#Ua!o#Ua#O#Ua~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n'^a#|'^a$O'^a'P'^a!y'^a!o'^a#O'^a~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT#Qi!S#Qi!c#Qi!n#Qi#|#Qi$O#Qi'P#Qi!y#Qi!o#Qi#O#Qi~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT#}i!S#}i!c#}i!n#}i#|#}i$O#}i'P#}i!y#}i!o#}i#O#}i~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$Pi#|$Pi$O$Pi'P$Pi!y$Pi!o$Pi#O$Pi~P!%aOz3{O#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT!vq!S!vq!c!vq!n!vq!w!vq#|!vq$O!vq'P!vq!y!vq!o!vq#O!vq~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT#Qq!S#Qq!c#Qq!n#Qq#|#Qq$O#Qq'P#Qq!y#Qq!o#Qq#O#Qq~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$sq#|$sq$O$sq'P$sq!y$sq!o$sq#O$sq~P!%aOz3{O#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT!vy!S!vy!c!vy!n!vy!w!vy#|!vy$O!vy'P!vy!y!vy!o!vy#O!vy~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$sy#|$sy$O$sy'P$sy!y$sy!o$sy#O$sy~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$s!R#|$s!R$O$s!R'P$s!R!y$s!R!o$s!R#O$s!R~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$s!Z#|$s!Z$O$s!Z'P$s!Z!y$s!Z!o$s!Z#O$s!Z~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$s!c#|$s!c$O$s!c'P$s!c!y$s!c!o$s!c#O$s!c~P!%aOP7wOU_O[5kOo9xOs#fOx5gOy5gO}aO!O^O!Q5{O!T5qO!V5iO!W5iO!Z5}O!d5eO!z]O#T5bO#X`O#dhO#fbO#gcO#sdO$[5oO$d5mO$e5oO$hqO%T5|O%U!OO'WYO~P$vO#O9_O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'xX~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#O9aO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'ZX~P!%aOz8RO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOT8TOz8RO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!S$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOT8TOz8RO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!S$Qi!c$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi$T$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$[8`O$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$Z8_O$[8`O$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aO#T9fO~P!+iO!n#Ua'P#Ua!y#Ua!o#Ua~PCVO!n'^a'P'^a!y'^a!o'^a~PCVO#T=PO#V=OO!y&aX#O&aX~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#Wi#O#Wi~P!%aOz8RO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT#Qq!S#Qq!c#Qq#O#Qq#P#Qq#Y#Qq!n#Qq'P#Qq!r#Qq!y#Qq!o#QqV#Qq!p#Qq~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$sq#P$sq#Y$sq!n$sq'P$sq!r$sq!y$sq!o$sqV$sq!p$sq~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y&wa#O&wa~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y&_a#O&_a~P!%aOz8RO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT!vy!S!vy!c!vy!w!vy#O!vy#P!vy#Y!vy!n!vy'P!vy!r!vy!y!vy!o!vyV!vy!p!vy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#Wq#O#Wq~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$sy#P$sy#Y$sy!n$sy'P$sy!r$sy!y$sy!o$syV$sy!p$sy~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$s!R#P$s!R#Y$s!R!n$s!R'P$s!R!r$s!R!y$s!R!o$s!RV$s!R!p$s!R~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$s!Z#P$s!Z#Y$s!Z!n$s!Z'P$s!Z!r$s!Z!y$s!Z!o$s!ZV$s!Z!p$s!Z~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$s!c#P$s!c#Y$s!c!n$s!c'P$s!c!r$s!c!y$s!c!o$s!cV$s!c!p$s!c~P!%aO#T9vO~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$`a#O$`a~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$aa#O$aa~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ba#O$ba~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ca#O$ca~P!%aOz:`O%T#cOT$ca!S$ca!c$ca!w$ca!y$ca#O$ca#T$ca$R$ca$S$ca$T$ca$U$ca$V$ca$X$ca$Y$ca$Z$ca$[$ca$]$ca$^$ca$_$ca~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$fa#O$fa~P!%aO!r?SO#P9^O~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ta#O$ta~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y%Va#O%Va~P!%aOT8TOz8RO!S8UO!c8VO!r9cO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aOz:`O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!y$Qi#O$Qi~P!%aOT:bOz:`O!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!S$Qi!y$Qi#O$Qi~P!%aOT:bOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!S$Qi!c$Qi!y$Qi#O$Qi~P!%aOz:`O#T#PO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi~P!%aOz:`O#T#PO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi$T$Qi~P!%aOz:`O#T#PO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi$T$Qi$U$Qi~P!%aOz:`O#T#PO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi~P!%aOz:`O$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi~P!%aOz:`O$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi~P!%aOz:`O$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi~P!%aOz:`O$[:mO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi~P!%aOz:`O$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi~P!%aOz:`O$Z:lO$[:mO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi~P!%aOz:`O$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT#Qi!S#Qi!c#Qi!y#Qi#O#Qi~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT#}i!S#}i!c#}i!y#}i#O#}i~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$Pi#O$Pi~P!%aO!r?TO#P9hO~Oz:`O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT!vq!S!vq!c!vq!w!vq!y!vq#O!vq~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT#Qq!S#Qq!c#Qq!y#Qq#O#Qq~P!%aO!r?YO#P9oO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$sq#O$sq~P!%aO#P9oO#T'ZO#n'XO~Oz:`O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT!vy!S!vy!c!vy!w!vy!y!vy#O!vy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$sy#O$sy~P!%aO#P9pO#T'ZO#n'XO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$s!R#O$s!R~P!%aO#P9sO#T'ZO#n'XO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$s!Z#O$s!Z~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$s!c#O$s!c~P!%aO#T;}O~P!+iOT8TOz8RO!S8UO!c8VO!w:_O#P;|O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!y'^X#O'^X~P!%aO!U$uO$u$tO~P$8rOP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QVO~P$8rOP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QWO#X`O#dhO#fbO#gcO#sdO$[vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#Ua#O#Ua~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'^a#O'^a~P!%aOz<]O!w?^O#T#PO$R<_O$SpO~P$8rOP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QqO#X`O#dhO#fbO#gcO#sdO$[oO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#P>nO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!n'^X!r'^X!o'^X#O'^X!p'^X'P'^X~P!%aOT'XXz'XX!S'XX!c'XX!w'XX!z'XX#O'XX#T'XX#X'XX#a'XX#b'XX#y'XX$R'XX$S'XX$T'XX$U'XX$V'XX$X'XX$Y'XX$Z'XX$['XX$]'XX$^'XX$_'XX%T'XX~O#|:uO$O:vO!y'XX~P.@qO!z$hO#T>zO~O!r;SO~PxO!n&qX!p&qX#O&qX'P&qX~O#O?QO!n'pa!p'pa'P'pa~O!r?rO#P;uO~OT[O~O!r?zO#P:rO~OT8TOz8RO!S8UO!c8VO!r>]O!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aOT8TOz8RO!S8UO!c8VO!r>^O!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aO!r?{O#P>cO~O!r?|O#P>hO~O#P>hO#T'ZO#n'XO~O#P:rO#T'ZO#n'XO~O#P>iO#T'ZO#n'XO~O#P>lO#T'ZO#n'XO~O!z$hO#T?nO~Oo>wOs$lO~O!z$hO#T?oO~O#O?QO!n'pX!p'pX'P'pX~O!z$hO#T?vO~O!z$hO#T?wO~O!z$hO#T?xO~Oo?lOs$lO~Oo?uOs$lO~Oo?tOs$lO~O%X$]%W$k!e$^#d%`#g'u'W#f~",goto:"%1O'{PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP'|P(TPP(Z(^PPP(vP(^*o(^6cP6cPP>cFxF{PP6cGR! RP! UP! UPPGR! e! h! lGRGRPP! oP! rPPGR!)u!0q!0qGR!0uP!0u!0u!0u!2PP!;g!S#>Y#>h#>n#>x#?O#?U#?[#?b#?l#?v#?|#@S#@^PPPPPPPP#@d#@hP#A^$(h$(k$(u$1R$1_$1t$1zP$1}$2Q$2W$5[$?Y$Gr$Gu$G{$HO$Kb$Ke$Kn$Kv$LQ$Li$MP$Mz%'}PP%0O%0S%0`%0u%0{Q!nQT!qV!rQUOR%x!mRVO}!hPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]|!hPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]Q%_!ZQ%h!aQ%m!eQ'k$cQ'x$iQ)d%lQ+W'{Q,k)QU.O+T+V+]Q.j+pQ/`,jS0a.T.UQ0q.dQ1n0VS1w0`0dQ2Q0nQ2q1pQ2t1xR3[2u|ZPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]2lf]`cgjklmnoprxyz!W!X!Y!]!e!f!g!y!z#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r#}$Q$R$T$h$z%S%U%d%r%}&S&W&[&q&t&u&x'P'X'Z']'a'e'p't'y(R(V(W(Y(Z([(t)T)X)`)c)g)n)u)y*V*Z*[*r*w*|+Q+X+[+^+_+j+m+q+t,Y,c,e,g,i,u,x-O-`-a-t-v-z.S.V.[.].^.b/X/n/y0O0T0b0e1R1S1b1k1o1y1{2k2r3n3p3s3t3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7i7j7k7o7w7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v9|9}:O:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?S?T?Y?^?_?p?q?r?y?z?{?|S$ku$`Q%W!V^%e!_$a'j)Y.f0o2OQ%i!bQ%j!cQ%k!dQ%v!kS&V!|){Q&]#OQ'l$dQ'm$eS'|$j'hQ)S%`Q*v'nQ+z(bQ,O(dQ-S)iU.g+n.c0mQ.q+{Q.r+|Q/d,vS0V-y0XQ1X/cQ1e/rS2T0s2WQ2h1`Q3U2iQ3^2zQ3_2{Q3c3VQ3f3`R3g3d0{!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_0z!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_Q#h^Q%O!PQ%P!QQ%Q!RQ,b(sQ.u,RR.y,UR&r#hQ*Q&qR/w-a0{hPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_R#j_k#n`j#i#q&t&x5d5e9W:Q:R:S:TR#saT&}#r'PR-h*[R&R!{0zhPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_R#tb-x!}[#e#k#u$U$V$W$X$Y$Z$v$w%X%Z%]%a%s%|&O&U&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&v&w&|'`'b'c(e(x)v)x)z*O*U*h*j+a+d,n,q-W-Y-[-e-f-g-w.Y/O/[/v0Q0Z0f1g1j1m1z2S2`2o2p2v3Z4]4^4d4e4f4g4h4i4j4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}5P5Q5T5U5W5X5Y5]5^5`5t6e6f6g6h6i6j6k6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}7O7Q7R7U7V7X7Y7Z7^7_7a7m7q8i8j8k8l8m8n8p8q8r8t8u8v8w8x8y8z8{8|8}9O9P9Q9R9S9U9V9Y9[9]9d9e9g9i9j9k9l9m9n9q9r9t9w:p:x:y:z:{:|:};Q;R;T;U;V;W;X;Y;Z;[;];^;_;`;a;b;c;d;f;g;l;m;p;r;s;w;y;{O>P>Q>R>S>T>U>X>Y>Z>_>`>a>b>d>e>f>g>j>k>m>r>s>{>|>}?V?b?cQ'd$[Y(X$s8o;P=^=_S(]3o7lQ(`$tR+y(aT&X!|){#a$Pg#}$h'X'Z'p't'y(W([)`)c*r*w+Q+X+[+_+j+m+n+t,i,u,x-v.S.V.].b.c0b0m1y3n3s3t7i7j7k7w9|9}:O?S?T?Y?p?q?r?y?z?{?|3yfPVX]`cgjklmnoprxyz!S!W!X!Y!]!e!f!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r#}$Q$R$T$h$z%O%Q%S%T%U%V%d%r%}&S&W&[&q&t&u&x'P'X'Z']'a'e'p't'y(R(V(W(Y(Z([(h(t)T)X)`)c)g)n)u)y){*V*Z*[*r*w*|+Q+X+[+^+_+j+m+n+q+t,Q,T,Y,c,e,g,i,u,x-O-`-a-t-v-z.S.V.[.].^.b.c.u.w/P/X/n/y0O0T0b0e0m0s0}1O1R1S1W1b1k1o1y1{2W2]2k2r3n3p3s3t3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7i7j7k7o7w7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v9|9}:O:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?S?T?Y?^?_?p?q?r?y?z?{?|[#wd#x3h3i3j3kh'V#z'W)f,}-U/k/u1f3l3m3q3rQ)e%nR-T)kY#yd%n)k3h3iV'T#x3j3k1dePVX]`cjklmnoprxyz!S!W!X!Y!]!e!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a'e(R(V(Y(Z(h(t)T)X)g)n)u)y){*V*Z*[*|+^+q,Q,T,Y,c,e,g-O-`-a-t-z.[.^.u.w/P/X/n/y0O0T0e0s0}1O1R1S1W1b1k1o1{2W2]2k2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_Q%o!fQ)l%r#O3vg#}$h'X'Z'p't'y(W([)`*w+Q+X+[+_+j+m+t,i,u,x-v.S.V.].b0b1y7i7j7k7w9|9}:O?S?T?Y?p?q?r?y?z?{?|a3w)c*r+n.c0m3n3s3tY'T#z)f-U3l3mZ*c'W,}/u3q3r0vhPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0}1O1R1S1W1k1o1{2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_T2U0s2WR&^#OR&]#O!r#Z[#e#u$U$V$W$X$Z$s$w%X%Z%]&`&a&b&c&d&e&f&g'`'b'c(e)v)x*O*j+d-Y.Y0f1z2`2p2v3Z9U9V!Y4U3o4d4e4f4g4i4j4l4m4n4o4p4q4r4s4{4|4}5P5Q5T5U5W5X5Y5]5^5`!^6X4^6e6f6g6h6j6k6m6n6o6p6q6r6s6t6|6}7O7Q7R7U7V7X7Y7Z7^7_7a7l7m#b8[#k%a%s%|&O&v&w&|(x*U+a,n,q-W-e-g/[4]5t7q8i8j8k8l8n8o8p8t8u8v8w8x8y8z8{9Y9[9]9d9g9i9l9n9q9r9t9w:p;Rr>s>{?b?c!|:i&U)z-[-f-w0Q0Z1g1j1m2o8q8r9e9j9k9m:x:y:z:{:};P;Q;T;U;V;W;X;Y;Z;[;d;f;g;l;m;p;r;s;w;y;{>R>S!`T>X>Z>_>a>d>e>g>j>k>m>|>}?VoU>Y>`>b>fS$iu#fQ$qwU'{$j$l&pQ'}$kS(P$m$rQ+Z'|Q+](OQ+`(QQ1p0VQ5s7dS5v7f7gQ5w7hQ7p9xS7r9y9zQ7s9{Q;O>uS;h>w>zQ;o?PQ>y?jS?O?l?nQ?U?oQ?`?sS?a?t?wS?d?u?vR?e?xT'u$h+Q!csPVXt!S!j!r!s!w$h%O%Q%T%V'p([(h)`+Q+j+t,Q,T,u,x.u.w/P0}1O1W2]Q$]rR*l'eQ-{+PQ.i+oQ0U-xQ0j.`Q1|0kR2w1}T0W-y0XQ+V'zQ.U+YR0d.XQ(_$tQ)^%iQ)s%vQ*u'mS+x(`(aQ-q*vR.p+yQ(^$tQ)b%kQ)r%vQ*q'lS*t'm)sU+w(_(`(aS-p*u*vS.o+x+yQ/i,{Q/{-nQ/}-qR0v.pQ(]$tQ)]%iQ)_%jQ)q%vU*s'm)r)sW+v(^(_(`(aQ,t)^U-o*t*u*vU.n+w+x+yS/|-p-qS0u.o.pQ1i/}R2Y0vX+r([)`+t,xb%f!_$a'j+n.c.f0m0o2OR,r)YQ$ovS+b(S?Qg?m([)`+i+j+m+t,u,x.a.b0lR0t.kT2V0s2W0}|PVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g,m-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_T$y{$|Q,O(dR.r+|T${{$|Q(j%OQ(r%QQ(w%TQ(z%VQ.},XQ0z.yQ0{.|R2c1WR(m%PX,[(k(l,],_R(n%PX(p%Q%T%V1WR%T!T_%b!]%S(t,c,e/X1RR%V!UR/],gR,j)PQ)a%kS*p'l)bS-m*q,{S/z-n/iR1h/{T,w)`,xQ-P)fU/l,|,}-UU1^/k/t/uR2n1fR/o-OR2l1bSSO!mR!oSQ!rVR%y!rQ!jPS!sV!rQ!wX[%u!j!s!w,Q1O2]Q,Q(hQ1O/PR2]0}Q)o%sS-X)o9bR9b8rQ-b*QR/x-bQ&y#oS*X&y9XR9X:tS*]&|&}R-i*]Q)|&YR-^)|!j'Y#|'o*f*z+O+T+e+i.T.W.Z.a/_0`0c0g0l1x2u5x5y5z7e7t7u7v;q;t;x?W?X?Z?f?g?h?iS*e'Y/g]/g,{-n.f0o1[2O!h'[#|'o*z+O+T+e+i.T.W.Z.a/_0`0c0g0l1x2u5x5y5z7e7t7u7v;q;t;x?W?X?Z?f?g?h?iS*g'[/hZ/h,{-n.f0o2OU#xd%n)kU'S#x3j3kQ3j3hR3k3iQ'W#z^*b'W,}/k/u1f3q3rQ,})fQ/u-UQ3q3lR3r3m|tPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]W$_t'p+j,uS'p$h+QS+j([+tT,u)`,xQ'f$]R*m'fQ0X-yR1q0XQ+R'vR-}+RQ0].PS1u0]1vR1v0^Q._+fR0i._Q+t([R.l+tW+m([)`+t,xS.b+j,uT.e+m.bQ)Z%fR,s)ZQ(T$oS+c(T?RR?R?mQ2W0sR2}2WQ$|{R(f$|Q,S(iR.v,SQ,V(jR.z,VQ,](kQ,_(lT/Q,],_Q)U%aS,o)U9`R9`8qQ)R%_R,l)RQ,x)`R/e,xQ)h%pS-R)h/sR/s-SQ1c/oR2m1cT!uV!rj!iPVX!j!r!s!w(h,Q/P0}1O2]Q%R!SQ(i%OW(p%Q%T%V1WQ.x,TQ0x.uR0y.w|[PVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]Q#e]U#k`#q&xQ#ucQ$UkQ$VlQ$WmQ$XnQ$YoQ$ZpQ$sx^$vy3y5|8P:]n>oQ+a(RQ+d(VQ,n)TQ,q)XQ-W)nQ-Y)uQ-[)yQ-e*VQ-f*ZQ-g*[^-k3u5b7c9v;}>p>qQ-w*|Q.Y+^Q/O,YQ/[,gQ/v-`Q0Q-tQ0Z-zQ0f.[Q1g/yQ1j0OQ1m0TQ1z0eU2S0s2W:rQ2`1SQ2o1kQ2p1oQ2v1{Q3Z2rQ3o3xQ4]jQ4^5eQ4d5fQ4e5hQ4f5jQ4g5lQ4h5nQ4i5pQ4j3zQ4l3|Q4m3}Q4n4OQ4o4PQ4p4QQ4q4RQ4r4SQ4s4TQ4t4UQ4u4VQ4v4WQ4w4XQ4x4YQ4y4ZQ4z4[Q4{4_Q4|4`Q4}4aQ5P4bQ5Q4cQ5T4kQ5U5OQ5W5RQ5X5SQ5Y5VQ5]5ZQ5^5[Q5`5_Q5t5rQ6e5gQ6f5iQ6g5kQ6h5mQ6i5oQ6j5qQ6k5}Q6m6PQ6n6QQ6o6RQ6p6SQ6q6TQ6r6UQ6s6VQ6t6WQ6u6XQ6v6YQ6w6ZQ6x6[Q6y6]Q6z6^Q6{6_Q6|6`Q6}6aQ7O6bQ7Q6cQ7R6dQ7U6lQ7V7PQ7X7SQ7Y7TQ7Z7WQ7^7[Q7_7]Q7a7`Q7l5{Q7m5dQ7q7oQ8i7xQ8j7yQ8k7zQ8l7{Q8m7|Q8n7}Q8o8OQ8p8QU8q,c/X1RQ8r%dQ8t8SQ8u8TQ8v8UQ8w8VQ8x8WQ8y8XQ8z8YQ8{8ZQ8|8[Q8}8]Q9O8^Q9P8_Q9Q8`Q9R8aQ9S8bQ9U8dQ9V8eQ9Y8fQ9[8gQ9]8hQ9d8sQ9e9TQ9g9ZQ9i9^Q9j9_Q9k9aQ9l9cQ9m9fQ9n9hQ9q9oQ9r9pQ9t9sQ9w:QU:p#i&t9WQ:x:UQ:y:VQ:z:WQ:{:XQ:|:YQ:}:ZQ;P:[Q;Q:^Q;R:_Q;T:aQ;U:bQ;V:cQ;W:dQ;X:eQ;Y:fQ;Z:gQ;[:hQ;]:iQ;^:jQ;_:kQ;`:lQ;a:mQ;b:nQ;c:oQ;d:uQ;f:vQ;g:wQ;l;SQ;m;eQ;p;jQ;r;kQ;s;nQ;w;uQ;y;vQ;{;zQOP<{Q>Q<|Q>R=OQ>S=PQ>T=QQ>U=RQ>X=SQ>Y=TQ>Z=UQ>_=aQ>`=bQ>a>VQ>b>WQ>d>[Q>e>]Q>f>^Q>g>cQ>j>hQ>k>iQ>m>lQ>r:SQ>s:RQ>{>vQ>|:qQ>}:sQ?V;iQ?b?^R?c?_R*R&qQ%t!gQ)W%dT*P&q-a$WiPVX]cklmnopxyz!S!W!X!Y!j!r!s!w#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a$Q$R$T$z%O%Q%T%V%}&S&['a(V(h)u+^,Q,T.[.u.w/P0e0}1O1S1W1o1{2]2r3p3u8d8e!t5c']3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5f5h5j5l5n5p7b7c!x7n5a5b5d5e5g5i5k5m5o5q5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`$`:P`j!]!g!y!z#i#l#m#q#r%S%U&q&t&u&x'P(R(t)T)X)n*V*[,e,g-a5r7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8f8g8h8s9W9Z9^9c9h9o9p9s9u9v:Q:R:S:T:_>v?^?_#l>t!|%d&W)y){*Z*|,c-t-z/X/y0O0T1R1k9T9_9a9f:U:V:W:X:Y:Z:[:]:^:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:u:v:w;S;e;j;k;n;u;v;z;|;}=O=P!x?[,Y-`:q:s;iV>[>]>c>h>i>l>n>p!]?]0s2W:rW>^>o>qQ#p`Q&s#iQ&{#qR*T&tS#o`#q^$Sj5d5e:Q:R:S:TS*W&x9WT:t#i&tQ'O#rR*_'PR&T!{R&Z!|Q&Y!|R-]){Q#|gS'^#}3nS'o$h+QS*d'X3sU*f'Z*w-vQ*z'pQ+O'tQ+T'yQ+e(WW+i([)`+t,xQ,{)cQ-n*rQ.T+XQ.W+[Q.Z+_U.a+j+m,uQ.f+nQ/_,iQ0`.SQ0c.VQ0g.]Q0l.bQ0o.cQ1[3tQ1x0bQ2O0mQ2u1yQ5x7iQ5y7jQ5z7kQ7e7wQ7t9|Q7u9}Q7v:OQ;q?SQ;t?TQ;x?YQ?W?pQ?X?qQ?Z?rQ?f?yQ?g?zQ?h?{R?i?|0z!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_#`$Og#}$h'X'Z'p't'y(W([)`)c*r*w+Q+X+[+_+j+m+n+t,i,u,x-v.S.V.].b.c0b0m1y3n3s3t7i7j7k7w9|9}:O?S?T?Y?p?q?r?y?z?{?|S$[r'eQ%l!eS%p!f%rU+f(Y(Z+qQ-Q)gQ/m-OQ0h.^Q1a/nQ2j1bR3W2k|vPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]#Y#g]cklmnopxyz!W!X!Y#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a$Q$R$T$z%}&S&['a(V)u+^.[0e1S1o1{2r3p3u8d8e`+k([)`+j+m+t,u,x.b!t8c']3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5f5h5j5l5n5p7b7c!x<}5a5b5d5e5g5i5k5m5o5q5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`$`?k`j!]!g!y!z#i#l#m#q#r%S%U&q&t&u&x'P(R(t)T)X)n*V*[,e,g-a5r7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8f8g8h8s9W9Z9^9c9h9o9p9s9u9v:Q:R:S:T:_>v?^?_#l?}!|%d&W)y){*Z*|,c-t-z/X/y0O0T1R1k9T9_9a9f:U:V:W:X:Y:Z:[:]:^:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:u:v:w;S;e;j;k;n;u;v;z;|;}=O=P!x@O,Y-`:q:s;iV>[>]>c>h>i>l>n>p!]@P0s2W:rW>^>o>qR'w$hQ'v$hR-|+QR$^rQ#d[Q%Y!WQ%[!XQ%^!YQ(U$pQ({%WQ(|%XQ(}%ZQ)O%]Q)V%cQ)[%gQ)d%lQ)j%qQ)p%tQ*n'iQ-V)mQ-l*oQ.i+oQ.j+pQ.x,WQ/S,`Q/T,aQ/U,bQ/Z,fQ/^,hQ/b,pQ/q-PQ0j.`Q0q.dQ0r.hQ0t.kQ0y.{Q1Y/dQ1_/lQ1n0VQ1|0kQ2Q0nQ2R0pQ2[0|Q2d1XQ2g1^Q2w1}Q2y2PQ2|2VQ3P2ZQ3T2fQ3X2nQ3Y2pQ3]2xQ3a3RQ3b3SR3e3ZR.R+UQ+g(YQ+h(ZR.k+qS+s([+tT,w)`,xa+l([)`+j+m+t,u,x.bQ%g!_Q'i$aQ*o'jQ.h+nS0p.c.fS2P0m0oR2x2OQ$pvW+o([)`+t,xW.`+i+j+m,uS0k.a.bR1}0l|!aPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]Q$ctW+p([)`+t,xU.d+j+m,uR0n.b0z!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_R/a,m0}}PVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g,m-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_T$x{$|Q(q%QQ(v%TQ(y%VR2b1WQ%c!]Q(u%SQ,d(tQ/W,cQ/Y,eQ1Q/XR2_1RQ%q!fR)m%rR/p-O",nodeNames:"\u26A0 ( HeredocString EscapeSequence abstract LogicOp array as Boolean break case catch clone const continue default declare do echo else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final finally fn for foreach from function global goto if implements include include_once LogicOp insteadof interface list match namespace new null LogicOp print readonly require require_once return switch throw trait try unset use var Visibility while LogicOp yield LineComment BlockComment TextInterpolation PhpClose Text PhpOpen Template TextInterpolation EmptyStatement ; } { Block : LabelStatement Name ExpressionStatement ConditionalExpression LogicOp MatchExpression ) ( ParenthesizedExpression MatchBlock MatchArm , => AssignmentExpression ArrayExpression ValueList & VariadicUnpacking ... Pair [ ] ListExpression ValueList Pair Pair SubscriptExpression MemberExpression -> ?-> Name VariableName DynamicVariable $ ${ CallExpression ArgList NamedArgument SpreadArgument CastExpression UnionType LogicOp IntersectionType OptionalType NamedType QualifiedName \\ NamespaceName Name NamespaceName Name ScopedExpression :: ClassMemberName DynamicMemberName AssignOp UpdateExpression UpdateOp YieldExpression BinaryExpression LogicOp LogicOp LogicOp BitOp BitOp BitOp CompareOp CompareOp BitOp ArithOp ConcatOp ArithOp ArithOp IncludeExpression RequireExpression CloneExpression UnaryExpression ControlOp LogicOp PrintIntrinsic FunctionExpression static ParamList Parameter #[ Attributes Attribute VariadicParameter PropertyParameter PropertyHooks PropertyHook UseList ArrowFunction NewExpression class BaseClause ClassInterfaceClause DeclarationList ConstDeclaration VariableDeclarator PropertyDeclaration VariableDeclarator MethodDeclaration UseDeclaration UseList UseInsteadOfClause UseAsClause UpdateExpression ArithOp ShellExpression ThrowExpression Integer Float String MemberExpression SubscriptExpression UnaryExpression ArithOp Interpolation String IfStatement ColonBlock SwitchStatement Block CaseStatement DefaultStatement ColonBlock WhileStatement EmptyStatement DoStatement ForStatement ForSpec SequenceExpression ForeachStatement ForSpec Pair GotoStatement ContinueStatement BreakStatement ReturnStatement TryStatement CatchDeclarator DeclareStatement EchoStatement UnsetStatement ConstDeclaration FunctionDefinition ClassDeclaration InterfaceDeclaration TraitDeclaration EnumDeclaration EnumBody EnumCase NamespaceDefinition NamespaceUseDeclaration UseGroup UseClause UseClause GlobalDeclaration FunctionStaticDeclaration Program",maxTerm:318,nodeProps:[["group",-36,2,8,49,82,84,86,89,94,95,103,107,108,112,113,116,120,126,132,137,139,140,154,155,156,157,160,161,173,174,188,190,191,192,193,194,200,"Expression",-28,75,79,81,83,201,203,208,210,211,214,217,218,219,220,221,223,224,225,226,227,228,229,230,231,234,235,239,240,"Statement",-4,121,123,124,125,"Type"],["isolate",-4,67,68,71,200,""],["openedBy",70,"phpOpen",77,"{",87,"(",102,"#["],["closedBy",72,"phpClose",78,"}",88,")",165,"]"]],propSources:[Ww],skippedNodes:[0],repeatNodeCount:32,tokenData:"!GQ_R!]OX$zXY&^YZ'sZ]$z]^&^^p$zpq&^qr)Rrs+Pst+otu2buv5evw6rwx8Vxy>]yz>yz{?g{|@}|}Bb}!OCO!O!PDh!P!QKT!Q!R!!o!R![!$q![!]!,P!]!^!-a!^!_!-}!_!`!1S!`!a!2d!a!b!3t!b!c!7^!c!d!7z!d!e!9Y!e!}!7z!}#O!;b#O#P!V<%lO8VR9WV'TP%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X<%lO9mQ9rV%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X<%lO9mQ:^O%`QQ:aRO;'S9m;'S;=`:j;=`O9mQ:oW%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X;=`<%l9m<%lO9mQ;[P;=`<%l9mR;fV'TP%`QOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRV<%l~8V~O8V~~%fR=OW'TPOY8VYZ9PZ!^8V!^!_;{!_;'S8V;'S;=`=h;=`<%l9m<%lO8VR=mW%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X;=`<%l8V<%lO9mR>YP;=`<%l8VR>dV!zQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zV?QV!yU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR?nY'TP$^QOY$zYZ%fZz$zz{@^{!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zR@eW$_Q'TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zRAUY$[Q'TPOY$zYZ%fZ{$z{|At|!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zRA{V%TQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRBiV#OQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_CXZ$[Q%^W'TPOY$zYZ%fZ}$z}!OAt!O!^$z!^!_%k!_!`6U!`!aCz!a;'S$z;'S;=`&W<%lO$zVDRV#aU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zVDo['TP$]QOY$zYZ%fZ!O$z!O!PEe!P!Q$z!Q![Fs![!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zVEjX'TPOY$zYZ%fZ!O$z!O!PFV!P!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zVF^V#VU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRFz_'TP%XQOY$zYZ%fZ!Q$z!Q![Fs![!^$z!^!_%k!_!g$z!g!hGy!h#R$z#R#SJc#S#X$z#X#YGy#Y;'S$z;'S;=`&W<%lO$zRHO]'TPOY$zYZ%fZ{$z{|Hw|}$z}!OHw!O!Q$z!Q![Ii![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRH|X'TPOY$zYZ%fZ!Q$z!Q![Ii![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRIpZ'TP%XQOY$zYZ%fZ!Q$z!Q![Ii![!^$z!^!_%k!_#R$z#R#SHw#S;'S$z;'S;=`&W<%lO$zRJhX'TPOY$zYZ%fZ!Q$z!Q![Fs![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_K[['TP$^QOY$zYZ%fZz$zz{LQ{!P$z!P!Q,o!Q!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$z_LVX'TPOYLQYZLrZzLQz{N_{!^LQ!^!_! s!_;'SLQ;'S;=`!!i<%lOLQ_LwT'TPOzMWz{Mj{;'SMW;'S;=`NX<%lOMW^MZTOzMWz{Mj{;'SMW;'S;=`NX<%lOMW^MmVOzMWz{Mj{!PMW!P!QNS!Q;'SMW;'S;=`NX<%lOMW^NXO!f^^N[P;=`<%lMW_NdZ'TPOYLQYZLrZzLQz{N_{!PLQ!P!Q! V!Q!^LQ!^!_! s!_;'SLQ;'S;=`!!i<%lOLQ_! ^V!f^'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_! vZOYLQYZLrZzLQz{N_{!aLQ!a!bMW!b;'SLQ;'S;=`!!i<%l~LQ~OLQ~~%f_!!lP;=`<%lLQZ!!vm'TP%WYOY$zYZ%fZ!O$z!O!PFs!P!Q$z!Q![!$q![!^$z!^!_%k!_!d$z!d!e!&o!e!g$z!g!hGy!h!q$z!q!r!(a!r!z$z!z!{!){!{#R$z#R#S!%}#S#U$z#U#V!&o#V#X$z#X#YGy#Y#c$z#c#d!(a#d#l$z#l#m!){#m;'S$z;'S;=`&W<%lO$zZ!$xa'TP%WYOY$zYZ%fZ!O$z!O!PFs!P!Q$z!Q![!$q![!^$z!^!_%k!_!g$z!g!hGy!h#R$z#R#S!%}#S#X$z#X#YGy#Y;'S$z;'S;=`&W<%lO$zZ!&SX'TPOY$zYZ%fZ!Q$z!Q![!$q![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zZ!&tY'TPOY$zYZ%fZ!Q$z!Q!R!'d!R!S!'d!S!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zZ!'k['TP%WYOY$zYZ%fZ!Q$z!Q!R!'d!R!S!'d!S!^$z!^!_%k!_#R$z#R#S!&o#S;'S$z;'S;=`&W<%lO$zZ!(fX'TPOY$zYZ%fZ!Q$z!Q!Y!)R!Y!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zZ!)YZ'TP%WYOY$zYZ%fZ!Q$z!Q!Y!)R!Y!^$z!^!_%k!_#R$z#R#S!(a#S;'S$z;'S;=`&W<%lO$zZ!*Q]'TPOY$zYZ%fZ!Q$z!Q![!*y![!^$z!^!_%k!_!c$z!c!i!*y!i#T$z#T#Z!*y#Z;'S$z;'S;=`&W<%lO$zZ!+Q_'TP%WYOY$zYZ%fZ!Q$z!Q![!*y![!^$z!^!_%k!_!c$z!c!i!*y!i#R$z#R#S!){#S#T$z#T#Z!*y#Z;'S$z;'S;=`&W<%lO$zR!,WX!rQ'TPOY$zYZ%fZ![$z![!]!,s!]!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!,zV#yQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zV!-hV!nU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!.S[$YQOY$zYZ%fZ!^$z!^!_!.x!_!`!/i!`!a*c!a!b!0]!b;'S$z;'S;=`&W<%l~$z~O$z~~%fR!/PW$ZQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zR!/pX$YQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`$z!`!a*c!a;'S$z;'S;=`&W<%lO$zP!0bR!jP!_!`!0k!r!s!0p#d#e!0pP!0pO!jPP!0sQ!j!k!0y#[#]!0yP!0|Q!r!s!0k#d#e!0k_!1ZX#|Y'TPOY$zYZ%fZ!^$z!^!_%k!_!`)r!`!a!1v!a;'S$z;'S;=`&W<%lO$zV!1}V#PU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!2kX$YQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`!3W!`!a!.x!a;'S$z;'S;=`&W<%lO$zR!3_V$YQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!3{[!wQ'TPOY$zYZ%fZ}$z}!O!4q!O!^$z!^!_%k!_!`$z!`!a!6P!a!b!6m!b;'S$z;'S;=`&W<%lO$zV!4vX'TPOY$zYZ%fZ!^$z!^!_%k!_!`$z!`!a!5c!a;'S$z;'S;=`&W<%lO$zV!5jV#bU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!6WV!h^'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!6tW$RQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zR!7eV$dQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!8Ta'aS'TP'WYOY$zYZ%fZ!Q$z!Q![!7z![!^$z!^!_%k!_!c$z!c!}!7z!}#R$z#R#S!7z#S#T$z#T#o!7z#o$g$z$g&j!7z&j;'S$z;'S;=`&W<%lO$z_!9ce'aS'TP'WYOY$zYZ%fZr$zrs!:tsw$zwx8Vx!Q$z!Q![!7z![!^$z!^!_%k!_!c$z!c!}!7z!}#R$z#R#S!7z#S#T$z#T#o!7z#o$g$z$g&j!7z&j;'S$z;'S;=`&W<%lO$zR!:{V'TP'uQOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zV!;iV#XU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!OZ'TPOY!=yYZ!>qZ!^!=y!^!_!@y!_#O!=y#O#P!Au#P#S!=y#S#T!CP#T;'S!=y;'S;=`!Cm<%lO!=yR!>vV'TPO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s<%lO!?]Q!?`VO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s<%lO!?]Q!?xRO;'S!?];'S;=`!@R;=`O!?]Q!@UWO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s;=`<%l!?]<%lO!?]Q!@sO%UQQ!@vP;=`<%l!?]R!@|]OY!=yYZ!>qZ!a!=y!a!b!?]!b#O!=y#O#P!Au#P#S!=y#S#T!CP#T;'S!=y;'S;=`!Cm<%l~!=y~O!=y~~%fR!AzW'TPOY!=yYZ!>qZ!^!=y!^!_!@y!_;'S!=y;'S;=`!Bd;=`<%l!?]<%lO!=yR!BgWO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s;=`<%l!=y<%lO!?]R!CWV%UQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!CpP;=`<%l!=y_!CzV!p^'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!DjY$UQ#n['TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`#p$z#p#q!EY#q;'S$z;'S;=`&W<%lO$zR!EaV$SQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!E}V!oQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!FkV$eQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z",tokenizers:[Rw,Uw,qw,0,1,2,3,Vw],topRules:{Template:[0,73],Program:[1,241]},dynamicPrecedences:{298:1},specialized:[{term:284,get:(O,e)=>xm(O)<<1,external:xm},{term:284,get:O=>jw[O]||-1}],tokenPrec:29889});var Cw=ne.define({name:"php",parser:Zm.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b|elseif\b|endif\b)/}),TryStatement:le({except:/^\s*({|catch\b|finally\b)/}),SwitchBody:O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t?0:i?1:2)*O.unit},ColonBlock:O=>O.baseIndent+O.unit,"Block EnumBody DeclarationList":be({closing:"}"}),ArrowFunction:O=>O.baseIndent+O.unit,"String BlockComment":()=>null,Statement:le({except:/^({|end(for|foreach|switch|while)\b)/})}),te.add({"Block EnumBody DeclarationList SwitchBody ArrayExpression ValueList":me,ColonBlock(O){return{from:O.from+1,to:O.to}},BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{commentTokens:{block:{open:"/*",close:"*/"},line:"//"},indentOnInput:/^\s*(?:case |default:|end(?:if|for(?:each)?|switch|while)|else(?:if)?|\{|\})$/,wordChars:"$",closeBrackets:{stringPrefixes:["b","B"]}}});function vm(O={}){let e=[],t;if(O.baseLanguage!==null)if(O.baseLanguage)t=O.baseLanguage;else{let i=Ti({matchClosingTags:!1});e.push(i.support),t=i.language}return new J(Cw.configure({wrap:t&&xO(i=>i.type.isTop?{parser:t.parser,overlay:r=>r.name=="Text"}:null),top:O.plain?"Program":"Template"}),e)}var Gw=1,zm=194,Um=195,Ew=196,Ym=197,Aw=198,Lw=199,Mw=200,Dw=2,Wm=3,_m=201,Iw=24,Bw=25,Nw=49,Fw=50,Hw=55,Kw=56,Jw=57,eZ=59,tZ=60,OZ=61,iZ=62,rZ=63,nZ=65,sZ=238,aZ=71,oZ=241,lZ=242,cZ=243,hZ=244,fZ=245,dZ=246,uZ=247,QZ=248,jm=72,$Z=249,pZ=250,mZ=251,gZ=252,PZ=253,SZ=254,XZ=255,TZ=256,bZ=73,yZ=77,xZ=263,kZ=112,wZ=130,ZZ=151,vZ=152,YZ=155,WO=10,Ur=13,Lc=32,js=9,Mc=35,_Z=40,RZ=46,Ac=123,Rm=125,Cm=39,Gm=34,Vm=92,VZ=111,qZ=120,zZ=78,UZ=117,WZ=85,jZ=new Set([Bw,Nw,Fw,xZ,nZ,wZ,Kw,Jw,sZ,iZ,rZ,jm,bZ,yZ,tZ,OZ,ZZ,vZ,YZ,kZ]);function Gc(O){return O==WO||O==Ur}function Ec(O){return O>=48&&O<=57||O>=65&&O<=70||O>=97&&O<=102}var CZ=new z((O,e)=>{let t;if(O.next<0)O.acceptToken(Lw);else if(e.context.flags&Us)Gc(O.next)&&O.acceptToken(Aw,1);else if(((t=O.peek(-1))<0||Gc(t))&&e.canShift(Ym)){let i=0;for(;O.next==Lc||O.next==js;)O.advance(),i++;(O.next==WO||O.next==Ur||O.next==Mc)&&O.acceptToken(Ym,-i)}else Gc(O.next)&&O.acceptToken(Ew,1)},{contextual:!0}),GZ=new z((O,e)=>{let t=e.context;if(t.flags)return;let i=O.peek(-1);if(i==WO||i==Ur){let r=0,n=0;for(;;){if(O.next==Lc)r++;else if(O.next==js)r+=8-r%8;else break;O.advance(),n++}r!=t.indent&&O.next!=WO&&O.next!=Ur&&O.next!=Mc&&(r[O,e|Em])),LZ=new Ge({start:EZ,reduce(O,e,t,i){return O.flags&Us&&jZ.has(e)||(e==aZ||e==jm)&&O.flags&Em?O.parent:O},shift(O,e,t,i){return e==zm?new Ws(O,AZ(i.read(i.pos,t.pos)),0):e==Um?O.parent:e==Iw||e==Hw||e==eZ||e==Wm?new Ws(O,0,Us):qm.has(e)?new Ws(O,0,qm.get(e)|O.flags&Us):O},hash(O){return O.hash}}),MZ=new z(O=>{for(let e=0;e<5;e++){if(O.next!="print".charCodeAt(e))return;O.advance()}if(!/\w/.test(String.fromCharCode(O.next)))for(let e=0;;e++){let t=O.peek(e);if(!(t==Lc||t==js)){t!=_Z&&t!=RZ&&t!=WO&&t!=Ur&&t!=Mc&&O.acceptToken(Gw);return}}}),DZ=new z((O,e)=>{let{flags:t}=e.context,i=t&jt?Gm:Cm,r=(t&Ct)>0,n=!(t&Gt),s=(t&Et)>0,a=O.pos;for(;!(O.next<0);)if(s&&O.next==Ac)if(O.peek(1)==Ac)O.advance(2);else{if(O.pos==a){O.acceptToken(Wm,1);return}break}else if(n&&O.next==Vm){if(O.pos==a){O.advance();let o=O.next;o>=0&&(O.advance(),IZ(O,o)),O.acceptToken(Dw);return}break}else if(O.next==Vm&&!n&&O.peek(1)>-1)O.advance(2);else if(O.next==i&&(!r||O.peek(1)==i&&O.peek(2)==i)){if(O.pos==a){O.acceptToken(_m,r?3:1);return}break}else if(O.next==WO){if(r)O.advance();else if(O.pos==a){O.acceptToken(_m);return}break}else O.advance();O.pos>a&&O.acceptToken(Mw)});function IZ(O,e){if(e==VZ)for(let t=0;t<2&&O.next>=48&&O.next<=55;t++)O.advance();else if(e==qZ)for(let t=0;t<2&&Ec(O.next);t++)O.advance();else if(e==UZ)for(let t=0;t<4&&Ec(O.next);t++)O.advance();else if(e==WZ)for(let t=0;t<8&&Ec(O.next);t++)O.advance();else if(e==zZ&&O.next==Ac){for(O.advance();O.next>=0&&O.next!=Rm&&O.next!=Cm&&O.next!=Gm&&O.next!=WO;)O.advance();O.next==Rm&&O.advance()}}var BZ=F({'async "*" "**" FormatConversion FormatSpec':d.modifier,"for while if elif else try except finally return raise break continue with pass assert await yield match case":d.controlKeyword,"in not and or is del":d.operatorKeyword,"from def class global nonlocal lambda":d.definitionKeyword,import:d.moduleKeyword,"with as print":d.keyword,Boolean:d.bool,None:d.null,VariableName:d.variableName,"CallExpression/VariableName":d.function(d.variableName),"FunctionDefinition/VariableName":d.function(d.definition(d.variableName)),"ClassDefinition/VariableName":d.definition(d.className),PropertyName:d.propertyName,"CallExpression/MemberExpression/PropertyName":d.function(d.propertyName),Comment:d.lineComment,Number:d.number,String:d.string,FormatString:d.special(d.string),Escape:d.escape,UpdateOp:d.updateOperator,"ArithOp!":d.arithmeticOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,AssignOp:d.definitionOperator,Ellipsis:d.punctuation,At:d.meta,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,".":d.derefOperator,", ;":d.separator}),NZ={__proto__:null,await:44,or:54,and:56,in:60,not:62,is:64,if:70,else:72,lambda:76,yield:94,from:96,async:102,for:104,None:162,True:164,False:164,del:178,pass:182,break:186,continue:190,return:194,raise:202,import:206,as:208,global:212,nonlocal:214,assert:218,type:223,elif:236,while:240,try:246,except:248,finally:250,with:254,def:258,class:268,match:279,case:285},Am=Oe.deserialize({version:14,states:"##jO`QeOOP$}OSOOO&WQtO'#HUOOQS'#Co'#CoOOQS'#Cp'#CpO'vQdO'#CnO*UQtO'#HTOOQS'#HU'#HUOOQS'#DU'#DUOOQS'#HT'#HTO*rQdO'#D_O+VQdO'#DfO+gQdO'#DjO+zOWO'#DuO,VOWO'#DvO.[QtO'#GuOOQS'#Gu'#GuO'vQdO'#GtO0ZQtO'#GtOOQS'#Eb'#EbO0rQdO'#EcOOQS'#Gs'#GsO0|QdO'#GrOOQV'#Gr'#GrO1XQdO'#FYOOQS'#G^'#G^O1^QdO'#FXOOQV'#IS'#ISOOQV'#Gq'#GqOOQV'#Fq'#FqQ`QeOOO'vQdO'#CqO1lQdO'#C}O1sQdO'#DRO2RQdO'#HYO2cQtO'#EVO'vQdO'#EWOOQS'#EY'#EYOOQS'#E['#E[OOQS'#E^'#E^O2wQdO'#E`O3_QdO'#EdO3rQdO'#EfO3zQtO'#EfO1XQdO'#EiO0rQdO'#ElO1XQdO'#EnO0rQdO'#EtO0rQdO'#EwO4VQdO'#EyO4^QdO'#FOO4iQdO'#EzO0rQdO'#FOO1XQdO'#FQO1XQdO'#FVO4nQdO'#F[P4uOdO'#GpPOOO)CBd)CBdOOQS'#Ce'#CeOOQS'#Cf'#CfOOQS'#Cg'#CgOOQS'#Ch'#ChOOQS'#Ci'#CiOOQS'#Cj'#CjOOQS'#Cl'#ClO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO5TQdO'#DoOOQS,5:Y,5:YO5hQdO'#HdOOQS,5:],5:]O5uQ!fO,5:]O5zQtO,59YO1lQdO,59bO1lQdO,59bO1lQdO,59bO8jQdO,59bO8oQdO,59bO8vQdO,59jO8}QdO'#HTO:TQdO'#HSOOQS'#HS'#HSOOQS'#D['#D[O:lQdO,59aO'vQdO,59aO:zQdO,59aOOQS,59y,59yO;PQdO,5:RO'vQdO,5:ROOQS,5:Q,5:QO;_QdO,5:QO;dQdO,5:XO'vQdO,5:XO'vQdO,5:VOOQS,5:U,5:UO;uQdO,5:UO;zQdO,5:WOOOW'#Fy'#FyOOOOQS'#Ds'#DsOOQS1G/w1G/wOOQS1G.|1G.|O!/[QtO1G.|O!/cQtO1G.|O1lQdO1G.|O!0OQdO1G/UOOQS'#DZ'#DZO0rQdO,59tOOQS1G.{1G.{O!0VQdO1G/eO!0gQdO1G/eO!0oQdO1G/fO'vQdO'#H[O!0tQdO'#H[O!0yQtO1G.{O!1ZQdO,59iO!2aQdO,5=zO!2qQdO,5=zO!2yQdO1G/mO!3OQtO1G/mOOQS1G/l1G/lO!3`QdO,5=uO!4VQdO,5=uO0rQdO1G/qO!4tQdO1G/sO!4yQtO1G/sO!5ZQtO1G/qOOQS1G/p1G/pOOQS1G/r1G/rOOOW-E9w-E9wOOQS1G/{1G/{O!5kQdO'#HxO0rQdO'#HxO!5|QdO,5>cOOOW-E9x-E9xOOQS1G/|1G/|OOQS-E9{-E9{O!6[Q#xO1G2zO!6{QtO1G2zO'vQdO,5kOOQS1G1`1G1`O!8RQdO1G1`OOQS'#DV'#DVO0rQdO,5=qOOQS,5=q,5=qO!8WQdO'#FrO!8cQdO,59oO!8kQdO1G/XO!8uQtO,5=uOOQS1G3`1G3`OOQS,5:m,5:mO!9fQdO'#GtOOQS,5jO!;ZQdO,5>jO1XQdO,5>jO!;lQdO,5>iOOQS-E:R-E:RO!;qQdO1G0lO!;|QdO1G0lO!lO!lO!hO!=VQdO,5>hO!=hQdO'#EpO0rQdO1G0tO!=sQdO1G0tO!=xQgO1G0zO!AvQgO1G0}O!EqQdO,5>oO!E{QdO,5>oO!FTQtO,5>oO0rQdO1G1PO!F_QdO1G1PO4iQdO1G1UO!!vQdO1G1WOOQV,5;a,5;aO!FdQfO,5;aO!FiQgO1G1QO!JjQdO'#GZO4iQdO1G1QO4iQdO1G1QO!JzQdO,5>pO!KXQdO,5>pO1XQdO,5>pOOQV1G1U1G1UO!KaQdO'#FSO!KrQ!fO1G1WO!KzQdO1G1WOOQV1G1]1G1]O4iQdO1G1]O!LPQdO1G1]O!LXQdO'#F^OOQV1G1b1G1bO!#ZQtO1G1bPOOO1G2v1G2vP!L^OSO1G2vOOQS,5=},5=}OOQS'#Dp'#DpO0rQdO,5=}O!LfQdO,5=|O!LyQdO,5=|OOQS1G/u1G/uO!MRQdO,5>PO!McQdO,5>PO!MkQdO,5>PO!NOQdO,5>PO!N`QdO,5>POOQS1G3j1G3jOOQS7+$h7+$hO!8kQdO7+$pO#!RQdO1G.|O#!YQdO1G.|OOQS1G/`1G/`OOQS,5<`,5<`O'vQdO,5<`OOQS7+%P7+%PO#!aQdO7+%POOQS-E9r-E9rOOQS7+%Q7+%QO#!qQdO,5=vO'vQdO,5=vOOQS7+$g7+$gO#!vQdO7+%PO##OQdO7+%QO##TQdO1G3fOOQS7+%X7+%XO##eQdO1G3fO##mQdO7+%XOOQS,5<_,5<_O'vQdO,5<_O##rQdO1G3aOOQS-E9q-E9qO#$iQdO7+%]OOQS7+%_7+%_O#$wQdO1G3aO#%fQdO7+%_O#%kQdO1G3gO#%{QdO1G3gO#&TQdO7+%]O#&YQdO,5>dO#&sQdO,5>dO#&sQdO,5>dOOQS'#Dx'#DxO#'UO&jO'#DzO#'aO`O'#HyOOOW1G3}1G3}O#'fQdO1G3}O#'nQdO1G3}O#'yQ#xO7+(fO#(jQtO1G2UP#)TQdO'#GOOOQS,5nQdO,5sQdO1G4OOOQS-E9y-E9yO#?^QdO1G4OO<[QdO'#H{OOOO'#D{'#D{OOOO'#F|'#F|O#?oO&jO,5:fOOOW,5>e,5>eOOOW7+)i7+)iO#?zQdO7+)iO#@SQdO1G2zO#@mQdO1G2zP'vQdO'#FuO0rQdO<mO#BQQdO,5>mOOQS1G0v1G0vOOQS<rO#KgQdO,5>rO#KrQdO,5>rO#K}QdO,5>qO#L`QdO,5>qOOQS1G1Y1G1YOOQS,5;p,5;pOOQV<VAN>VO$ oQdO<cAN>cO0rQdO1G1|O$!PQtO1G1|P$!ZQdO'#FvOOQS1G2R1G2RP$!hQdO'#F{O$!uQdO7+)jO$#`QdO,5>gOOOO-E9z-E9zOOOW<tO$4{QdO,5>tO1XQdO,5vO$)nQdO,5>vOOQS1G1p1G1pOOQS,5<[,5<[OOQU7+'P7+'PO$+zQdO1G/iO$)nQdO,5wO$8zQdO,5>wOOQS1G1s1G1sOOQS7+'S7+'SP$)nQdO'#GdO$9SQdO1G4bO$9^QdO1G4bO$9fQdO1G4bOOQS7+%T7+%TO$9tQdO1G1tO$:SQtO'#FaO$:ZQdO,5<}OOQS,5<},5<}O$:iQdO1G4cOOQS-E:a-E:aO$)nQdO,5<|O$:pQdO,5<|O$:uQdO7+)|OOQS-E:`-E:`O$;PQdO7+)|O$)nQdO,5S~O%cOS%^OSSOS%]PQ~OPdOVaOfoOhYOopOs!POvqO!PrO!Q{O!T!SO!U!RO!XZO!][O!h`O!r`O!s`O!t`O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO#l!QO#o!TO#s!UO#u!VO#z!WO#}hO$P!XO%oRO%pRO%tSO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O~O%]!YO~OV!aO_!aOa!bOh!iO!X!kO!f!mO%j![O%k!]O%l!^O%m!_O%n!_O%o!`O%p!`O%q!aO%r!aO%s!aO~Ok%xXl%xXm%xXn%xXo%xXp%xXs%xXz%xX{%xX!x%xX#g%xX%[%xX%_%xX%z%xXg%xX!T%xX!U%xX%{%xX!W%xX![%xX!Q%xX#[%xXt%xX!m%xX~P%SOfoOhYO!XZO!][O!h`O!r`O!s`O!t`O%oRO%pRO%tSO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O~Oz%wX{%wX#g%wX%[%wX%_%wX%z%wX~Ok!pOl!qOm!oOn!oOo!rOp!sOs!tO!x%wX~P)pOV!zOg!|Oo0cOv0qO!PrO~P'vOV#OOo0cOv0qO!W#PO~P'vOV#SOa#TOo0cOv0qO![#UO~P'vOQ#XO%`#XO%a#ZO~OQ#^OR#[O%`#^O%a#`O~OV%iX_%iXa%iXh%iXk%iXl%iXm%iXn%iXo%iXp%iXs%iXz%iX!X%iX!f%iX%j%iX%k%iX%l%iX%m%iX%n%iX%o%iX%p%iX%q%iX%r%iX%s%iXg%iX!T%iX!U%iX~O&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O{%iX!x%iX#g%iX%[%iX%_%iX%z%iX%{%iX!W%iX![%iX!Q%iX#[%iXt%iX!m%iX~P,eOz#dO{%hX!x%hX#g%hX%[%hX%_%hX%z%hX~Oo0cOv0qO~P'vO#g#gO%[#iO%_#iO~O%uWO~O!T#nO#u!VO#z!WO#}hO~OopO~P'vOV#sOa#tO%uWO{wP~OV#xOo0cOv0qO!Q#yO~P'vO{#{O!x$QO%z#|O#g!yX%[!yX%_!yX~OV#xOo0cOv0qO#g#SX%[#SX%_#SX~P'vOo0cOv0qO#g#WX%[#WX%_#WX~P'vOh$WO%uWO~O!f$YO!r$YO%uWO~OV$eO~P'vO!U$gO#s$hO#u$iO~O{$jO~OV$qO~P'vOS$sO%[$rO%_$rO%c$tO~OV$}Oa$}Og%POo0cOv0qO~P'vOo0cOv0qO{%SO~P'vO&Y%UO~Oa!bOh!iO!X!kO!f!mOVba_bakbalbambanbaobapbasbazba{ba!xba#gba%[ba%_ba%jba%kba%lba%mba%nba%oba%pba%qba%rba%sba%zbagba!Tba!Uba%{ba!Wba![ba!Qba#[batba!mba~On%ZO~Oo%ZO~P'vOo0cO~P'vOk0eOl0fOm0dOn0dOo0mOp0nOs0rOg%wX!T%wX!U%wX%{%wX!W%wX![%wX!Q%wX#[%wX!m%wX~P)pO%{%]Og%vXz%vX!T%vX!U%vX!W%vX{%vX~Og%_Oz%`O!T%dO!U%cO~Og%_O~Oz%gO!T%dO!U%cO!W&SX~O!W%kO~Oz%lO{%nO!T%dO!U%cO![%}X~O![%rO~O![%sO~OQ#XO%`#XO%a%uO~OV%wOo0cOv0qO!PrO~P'vOQ#^OR#[O%`#^O%a%zO~OV!qa_!qaa!qah!qak!qal!qam!qan!qao!qap!qas!qaz!qa{!qa!X!qa!f!qa!x!qa#g!qa%[!qa%_!qa%j!qa%k!qa%l!qa%m!qa%n!qa%o!qa%p!qa%q!qa%r!qa%s!qa%z!qag!qa!T!qa!U!qa%{!qa!W!qa![!qa!Q!qa#[!qat!qa!m!qa~P#yOz%|O{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~P%SOV&OOopOvqO{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~P'vOz%|O{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~OPdOVaOopOvqO!PrO!Q{O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO#g$zX%[$zX%_$zX~P'vO#g#gO%[&TO%_&TO~O!f&UOh&sX%[&sXz&sX#[&sX#g&sX%_&sX#Z&sXg&sX~Oh!iO%[&WO~Okealeameaneaoeapeaseazea{ea!xea#gea%[ea%_ea%zeagea!Tea!Uea%{ea!Wea![ea!Qea#[eatea!mea~P%SOsqazqa{qa#gqa%[qa%_qa%zqa~Ok!pOl!qOm!oOn!oOo!rOp!sO!xqa~PEcO%z&YOz%yX{%yX~O%uWOz%yX{%yX~Oz&]O{wX~O{&_O~Oz%lO#g%}X%[%}X%_%}Xg%}X{%}X![%}X!m%}X%z%}X~OV0lOo0cOv0qO!PrO~P'vO%z#|O#gUa%[Ua%_Ua~Oz&hO#g&PX%[&PX%_&PXn&PX~P%SOz&kO!Q&jO#g#Wa%[#Wa%_#Wa~Oz&lO#[&nO#g&rX%[&rX%_&rXg&rX~O!f$YO!r$YO#Z&qO%uWO~O#Z&qO~Oz&sO#g&tX%[&tX%_&tX~Oz&uO#g&pX%[&pX%_&pX{&pX~O!X&wO%z&xO~Oz&|On&wX~P%SOn'PO~OPdOVaOopOvqO!PrO!Q{O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO%['UO~P'vOt'YO#p'WO#q'XOP#naV#naf#nah#nao#nas#nav#na!P#na!Q#na!T#na!U#na!X#na!]#na!h#na!r#na!s#na!t#na!{#na!}#na#P#na#R#na#T#na#X#na#Z#na#^#na#_#na#a#na#c#na#l#na#o#na#s#na#u#na#z#na#}#na$P#na%X#na%o#na%p#na%t#na%u#na&Z#na&[#na&]#na&^#na&_#na&`#na&a#na&b#na&c#na&d#na&e#na&f#na&g#na&h#na&i#na&j#na%Z#na%_#na~Oz'ZO#[']O{&xX~Oh'_O!X&wO~Oh!iO{$jO!X&wO~O{'eO~P%SO%['hO%_'hO~OS'iO%['hO%_'hO~OV!aO_!aOa!bOh!iO!X!kO!f!mO%l!^O%m!_O%n!_O%o!`O%p!`O%q!aO%r!aO%s!aOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~O%k!]O~P!#uO%kWi~P!#uOV!aO_!aOa!bOh!iO!X!kO!f!mO%o!`O%p!`O%q!aO%r!aO%s!aOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%kWi%lWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~O%m!_O%n!_O~P!&pO%mWi%nWi~P!&pOa!bOh!iO!X!kO!f!mOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%kWi%lWi%mWi%nWi%oWi%pWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~OV!aO_!aO%q!aO%r!aO%s!aO~P!)nOVWi_Wi%qWi%rWi%sWi~P!)nO!T%dO!U%cOg&VXz&VX~O%z'kO%{'kO~P,eOz'mOg&UX~Og'oO~Oz'pO{'rO!W&XX~Oo0cOv0qOz'pO{'sO!W&XX~P'vO!W'uO~Om!oOn!oOo!rOp!sOkjisjizji{ji!xji#gji%[ji%_ji%zji~Ol!qO~P!.aOlji~P!.aOk0eOl0fOm0dOn0dOo0mOp0nO~Ot'wO~P!/jOV'|Og'}Oo0cOv0qO~P'vOg'}Oz(OO~Og(QO~O!U(SO~Og(TOz(OO!T%dO!U%cO~P%SOk0eOl0fOm0dOn0dOo0mOp0nOgqa!Tqa!Uqa%{qa!Wqa![qa!Qqa#[qatqa!mqa~PEcOV'|Oo0cOv0qO!W&Sa~P'vOz(WO!W&Sa~O!W(XO~Oz(WO!T%dO!U%cO!W&Sa~P%SOV(]Oo0cOv0qO![%}a#g%}a%[%}a%_%}ag%}a{%}a!m%}a%z%}a~P'vOz(^O![%}a#g%}a%[%}a%_%}ag%}a{%}a!m%}a%z%}a~O![(aO~Oz(^O!T%dO!U%cO![%}a~P%SOz(dO!T%dO!U%cO![&Ta~P%SOz(gO{&lX![&lX!m&lX%z&lX~O{(kO![(mO!m(nO%z(jO~OV&OOopOvqO{%hi!x%hi#g%hi%[%hi%_%hi%z%hi~P'vOz(pO{%hi!x%hi#g%hi%[%hi%_%hi%z%hi~O!f&UOh&sa%[&saz&sa#[&sa#g&sa%_&sa#Z&sag&sa~O%[(uO~OV#sOa#tO%uWO~Oz&]O{wa~OopOvqO~P'vOz(^O#g%}a%[%}a%_%}ag%}a{%}a![%}a!m%}a%z%}a~P%SOz(zO#g%hX%[%hX%_%hX%z%hX~O%z#|O#gUi%[Ui%_Ui~O#g&Pa%[&Pa%_&Pan&Pa~P'vOz(}O#g&Pa%[&Pa%_&Pan&Pa~O%uWO#g&ra%[&ra%_&rag&ra~Oz)SO#g&ra%[&ra%_&rag&ra~Og)VO~OV)WOh$WO%uWO~O#Z)XO~O%uWO#g&ta%[&ta%_&ta~Oz)ZO#g&ta%[&ta%_&ta~Oo0cOv0qO#g&pa%[&pa%_&pa{&pa~P'vOz)^O#g&pa%[&pa%_&pa{&pa~OV)`Oa)`O%uWO~O%z)eO~Ot)hO#j)gOP#hiV#hif#hih#hio#his#hiv#hi!P#hi!Q#hi!T#hi!U#hi!X#hi!]#hi!h#hi!r#hi!s#hi!t#hi!{#hi!}#hi#P#hi#R#hi#T#hi#X#hi#Z#hi#^#hi#_#hi#a#hi#c#hi#l#hi#o#hi#s#hi#u#hi#z#hi#}#hi$P#hi%X#hi%o#hi%p#hi%t#hi%u#hi&Z#hi&[#hi&]#hi&^#hi&_#hi&`#hi&a#hi&b#hi&c#hi&d#hi&e#hi&f#hi&g#hi&h#hi&i#hi&j#hi%Z#hi%_#hi~Ot)iOP#kiV#kif#kih#kio#kis#kiv#ki!P#ki!Q#ki!T#ki!U#ki!X#ki!]#ki!h#ki!r#ki!s#ki!t#ki!{#ki!}#ki#P#ki#R#ki#T#ki#X#ki#Z#ki#^#ki#_#ki#a#ki#c#ki#l#ki#o#ki#s#ki#u#ki#z#ki#}#ki$P#ki%X#ki%o#ki%p#ki%t#ki%u#ki&Z#ki&[#ki&]#ki&^#ki&_#ki&`#ki&a#ki&b#ki&c#ki&d#ki&e#ki&f#ki&g#ki&h#ki&i#ki&j#ki%Z#ki%_#ki~OV)kOn&wa~P'vOz)lOn&wa~Oz)lOn&wa~P%SOn)pO~O%Y)tO~Ot)wO#p'WO#q)vOP#niV#nif#nih#nio#nis#niv#ni!P#ni!Q#ni!T#ni!U#ni!X#ni!]#ni!h#ni!r#ni!s#ni!t#ni!{#ni!}#ni#P#ni#R#ni#T#ni#X#ni#Z#ni#^#ni#_#ni#a#ni#c#ni#l#ni#o#ni#s#ni#u#ni#z#ni#}#ni$P#ni%X#ni%o#ni%p#ni%t#ni%u#ni&Z#ni&[#ni&]#ni&^#ni&_#ni&`#ni&a#ni&b#ni&c#ni&d#ni&e#ni&f#ni&g#ni&h#ni&i#ni&j#ni%Z#ni%_#ni~OV)zOo0cOv0qO{$jO~P'vOo0cOv0qO{&xa~P'vOz*OO{&xa~OV*SOa*TOg*WO%q*UO%uWO~O{$jO&{*YO~Oh'_O~Oh!iO{$jO~O%[*_O~O%[*aO%_*aO~OV$}Oa$}Oo0cOv0qOg&Ua~P'vOz*dOg&Ua~Oo0cOv0qO{*gO!W&Xa~P'vOz*hO!W&Xa~Oo0cOv0qOz*hO{*kO!W&Xa~P'vOo0cOv0qOz*hO!W&Xa~P'vOz*hO{*kO!W&Xa~Om0dOn0dOo0mOp0nOgjikjisjizji!Tji!Uji%{ji!Wji{ji![ji#gji%[ji%_ji!Qji#[jitji!mji%zji~Ol0fO~P!NkOlji~P!NkOV'|Og*pOo0cOv0qO~P'vOn*rO~Og*pOz*tO~Og*uO~OV'|Oo0cOv0qO!W&Si~P'vOz*vO!W&Si~O!W*wO~OV(]Oo0cOv0qO![%}i#g%}i%[%}i%_%}ig%}i{%}i!m%}i%z%}i~P'vOz*zO!T%dO!U%cO![&Ti~Oz*}O![%}i#g%}i%[%}i%_%}ig%}i{%}i!m%}i%z%}i~O![+OO~Oa+QOo0cOv0qO![&Ti~P'vOz*zO![&Ti~O![+SO~OV+UOo0cOv0qO{&la![&la!m&la%z&la~P'vOz+VO{&la![&la!m&la%z&la~O!]+YO&n+[O![!nX~O![+^O~O{(kO![+_O~O{(kO![+_O!m+`O~OV&OOopOvqO{%hq!x%hq#g%hq%[%hq%_%hq%z%hq~P'vOz$ri{$ri!x$ri#g$ri%[$ri%_$ri%z$ri~P%SOV&OOopOvqO~P'vOV&OOo0cOv0qO#g%ha%[%ha%_%ha%z%ha~P'vOz+aO#g%ha%[%ha%_%ha%z%ha~Oz$ia#g$ia%[$ia%_$ian$ia~P%SO#g&Pi%[&Pi%_&Pin&Pi~P'vOz+dO#g#Wq%[#Wq%_#Wq~O#[+eOz$va#g$va%[$va%_$vag$va~O%uWO#g&ri%[&ri%_&rig&ri~Oz+gO#g&ri%[&ri%_&rig&ri~OV+iOh$WO%uWO~O%uWO#g&ti%[&ti%_&ti~Oo0cOv0qO#g&pi%[&pi%_&pi{&pi~P'vO{#{Oz#eX!W#eX~Oz+mO!W&uX~O!W+oO~Ot+rO#j)gOP#hqV#hqf#hqh#hqo#hqs#hqv#hq!P#hq!Q#hq!T#hq!U#hq!X#hq!]#hq!h#hq!r#hq!s#hq!t#hq!{#hq!}#hq#P#hq#R#hq#T#hq#X#hq#Z#hq#^#hq#_#hq#a#hq#c#hq#l#hq#o#hq#s#hq#u#hq#z#hq#}#hq$P#hq%X#hq%o#hq%p#hq%t#hq%u#hq&Z#hq&[#hq&]#hq&^#hq&_#hq&`#hq&a#hq&b#hq&c#hq&d#hq&e#hq&f#hq&g#hq&h#hq&i#hq&j#hq%Z#hq%_#hq~On$|az$|a~P%SOV)kOn&wi~P'vOz+yOn&wi~Oz,TO{$jO#[,TO~O#q,VOP#nqV#nqf#nqh#nqo#nqs#nqv#nq!P#nq!Q#nq!T#nq!U#nq!X#nq!]#nq!h#nq!r#nq!s#nq!t#nq!{#nq!}#nq#P#nq#R#nq#T#nq#X#nq#Z#nq#^#nq#_#nq#a#nq#c#nq#l#nq#o#nq#s#nq#u#nq#z#nq#}#nq$P#nq%X#nq%o#nq%p#nq%t#nq%u#nq&Z#nq&[#nq&]#nq&^#nq&_#nq&`#nq&a#nq&b#nq&c#nq&d#nq&e#nq&f#nq&g#nq&h#nq&i#nq&j#nq%Z#nq%_#nq~O#[,WOz%Oa{%Oa~Oo0cOv0qO{&xi~P'vOz,YO{&xi~O{#{O%z,[Og&zXz&zX~O%uWOg&zXz&zX~Oz,`Og&yX~Og,bO~O%Y,eO~O!T%dO!U%cOg&Viz&Vi~OV$}Oa$}Oo0cOv0qOg&Ui~P'vO{,hOz$la!W$la~Oo0cOv0qO{,iOz$la!W$la~P'vOo0cOv0qO{*gO!W&Xi~P'vOz,lO!W&Xi~Oo0cOv0qOz,lO!W&Xi~P'vOz,lO{,oO!W&Xi~Og$hiz$hi!W$hi~P%SOV'|Oo0cOv0qO~P'vOn,qO~OV'|Og,rOo0cOv0qO~P'vOV'|Oo0cOv0qO!W&Sq~P'vOz$gi![$gi#g$gi%[$gi%_$gig$gi{$gi!m$gi%z$gi~P%SOV(]Oo0cOv0qO~P'vOa+QOo0cOv0qO![&Tq~P'vOz,sO![&Tq~O![,tO~OV(]Oo0cOv0qO![%}q#g%}q%[%}q%_%}qg%}q{%}q!m%}q%z%}q~P'vO{,uO~OV+UOo0cOv0qO{&li![&li!m&li%z&li~P'vOz,zO{&li![&li!m&li%z&li~O!]+YO&n+[O![!na~O{(kO![,}O~OV&OOo0cOv0qO#g%hi%[%hi%_%hi%z%hi~P'vOz-OO#g%hi%[%hi%_%hi%z%hi~O%uWO#g&rq%[&rq%_&rqg&rq~Oz-RO#g&rq%[&rq%_&rqg&rq~OV)`Oa)`O%uWO!W&ua~Oz-TO!W&ua~On$|iz$|i~P%SOV)kO~P'vOV)kOn&wq~P'vOt-XOP#myV#myf#myh#myo#mys#myv#my!P#my!Q#my!T#my!U#my!X#my!]#my!h#my!r#my!s#my!t#my!{#my!}#my#P#my#R#my#T#my#X#my#Z#my#^#my#_#my#a#my#c#my#l#my#o#my#s#my#u#my#z#my#}#my$P#my%X#my%o#my%p#my%t#my%u#my&Z#my&[#my&]#my&^#my&_#my&`#my&a#my&b#my&c#my&d#my&e#my&f#my&g#my&h#my&i#my&j#my%Z#my%_#my~O%Z-]O%_-]O~P`O#q-^OP#nyV#nyf#nyh#nyo#nys#nyv#ny!P#ny!Q#ny!T#ny!U#ny!X#ny!]#ny!h#ny!r#ny!s#ny!t#ny!{#ny!}#ny#P#ny#R#ny#T#ny#X#ny#Z#ny#^#ny#_#ny#a#ny#c#ny#l#ny#o#ny#s#ny#u#ny#z#ny#}#ny$P#ny%X#ny%o#ny%p#ny%t#ny%u#ny&Z#ny&[#ny&]#ny&^#ny&_#ny&`#ny&a#ny&b#ny&c#ny&d#ny&e#ny&f#ny&g#ny&h#ny&i#ny&j#ny%Z#ny%_#ny~Oz-aO{$jO#[-aO~Oo0cOv0qO{&xq~P'vOz-dO{&xq~O%z,[Og&zaz&za~O{#{Og&zaz&za~OV*SOa*TO%q*UO%uWOg&ya~Oz-hOg&ya~O$S-lO~OV$}Oa$}Oo0cOv0qO~P'vOo0cOv0qO{-mOz$li!W$li~P'vOo0cOv0qOz$li!W$li~P'vO{-mOz$li!W$li~Oo0cOv0qO{*gO~P'vOo0cOv0qO{*gO!W&Xq~P'vOz-pO!W&Xq~Oo0cOv0qOz-pO!W&Xq~P'vOs-sO!T%dO!U%cOg&Oq!W&Oq![&Oqz&Oq~P!/jOa+QOo0cOv0qO![&Ty~P'vOz$ji![$ji~P%SOa+QOo0cOv0qO~P'vOV+UOo0cOv0qO~P'vOV+UOo0cOv0qO{&lq![&lq!m&lq%z&lq~P'vO{(kO![-xO!m-yO%z-wO~OV&OOo0cOv0qO#g%hq%[%hq%_%hq%z%hq~P'vO%uWO#g&ry%[&ry%_&ryg&ry~OV)`Oa)`O%uWO!W&ui~Ot-}OP#m!RV#m!Rf#m!Rh#m!Ro#m!Rs#m!Rv#m!R!P#m!R!Q#m!R!T#m!R!U#m!R!X#m!R!]#m!R!h#m!R!r#m!R!s#m!R!t#m!R!{#m!R!}#m!R#P#m!R#R#m!R#T#m!R#X#m!R#Z#m!R#^#m!R#_#m!R#a#m!R#c#m!R#l#m!R#o#m!R#s#m!R#u#m!R#z#m!R#}#m!R$P#m!R%X#m!R%o#m!R%p#m!R%t#m!R%u#m!R&Z#m!R&[#m!R&]#m!R&^#m!R&_#m!R&`#m!R&a#m!R&b#m!R&c#m!R&d#m!R&e#m!R&f#m!R&g#m!R&h#m!R&i#m!R&j#m!R%Z#m!R%_#m!R~Oo0cOv0qO{&xy~P'vOV*SOa*TO%q*UO%uWOg&yi~O$S-lO%Z.VO%_.VO~OV.aOh._O!X.^O!].`O!h.YO!s.[O!t.[O%p.XO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O~Oo0cOv0qOz$lq!W$lq~P'vO{.fOz$lq!W$lq~Oo0cOv0qO{*gO!W&Xy~P'vOz.gO!W&Xy~Oo0cOv.kO~P'vOs-sO!T%dO!U%cOg&Oy!W&Oy![&Oyz&Oy~P!/jO{(kO![.nO~O{(kO![.nO!m.oO~OV*SOa*TO%q*UO%uWO~Oh.tO!f.rOz$TX#[$TX%j$TXg$TX~Os$TX{$TX!W$TX![$TX~P$-bO%o.vO%p.vOs$UXz$UX{$UX#[$UX%j$UX!W$UXg$UX![$UX~O!h.xO~Oz.|O#[/OO%j.yOs&|X{&|X!W&|Xg&|X~Oa/RO~P$)zOh.tOs&}Xz&}X{&}X#[&}X%j&}X!W&}Xg&}X![&}X~Os/VO{$jO~Oo0cOv0qOz$ly!W$ly~P'vOo0cOv0qO{*gO!W&X!R~P'vOz/ZO!W&X!R~Og&RXs&RX!T&RX!U&RX!W&RX![&RXz&RX~P!/jOs-sO!T%dO!U%cOg&Qa!W&Qa![&Qaz&Qa~O{(kO![/^O~O!f.rOh$[as$[az$[a{$[a#[$[a%j$[a!W$[ag$[a![$[a~O!h/eO~O%o.vO%p.vOs$Uaz$Ua{$Ua#[$Ua%j$Ua!W$Uag$Ua![$Ua~O%j.yOs$Yaz$Ya{$Ya#[$Ya!W$Yag$Ya![$Ya~Os&|a{&|a!W&|ag&|a~P$)nOz/jOs&|a{&|a!W&|ag&|a~O!W/mO~Og/mO~O{/oO~O![/pO~Oo0cOv0qO{*gO!W&X!Z~P'vO{/sO~O%z/tO~P$-bOz/uO#[/OO%j.yOg'PX~Oz/uOg'PX~Og/wO~O!h/xO~O#[/OOs%Saz%Sa{%Sa%j%Sa!W%Sag%Sa![%Sa~O#[/OO%j.yOs%Waz%Wa{%Wa!W%Wag%Wa~Os&|i{&|i!W&|ig&|i~P$)nOz/zO#[/OO%j.yO!['Oa~Og'Pa~P$)nOz0SOg'Pa~Oa0UO!['Oi~P$)zOz0WO!['Oi~Oz0WO#[/OO%j.yO!['Oi~O#[/OO%j.yOg$biz$bi~O%z0ZO~P$-bO#[/OO%j.yOg%Vaz%Va~Og'Pi~P$)nO{0^O~Oa0UO!['Oq~P$)zOz0`O!['Oq~O#[/OO%j.yOz%Ui![%Ui~Oa0UO~P$)zOa0UO!['Oy~P$)zO#[/OO%j.yOg$ciz$ci~O#[/OO%j.yOz%Uq![%Uq~Oz+aO#g%ha%[%ha%_%ha%z%ha~P%SOV&OOo0cOv0qO~P'vOn0hO~Oo0hO~P'vO{0iO~Ot0jO~P!/jO&]&Z&j&h&i&g&f&d&e&c&b&`&a&_&^&[%u~",goto:"!=j'QPPPPPP'RP'Z*s+[+t,_,y-fP.SP'Z.r.r'ZPPP'Z2[PPPPPP2[5PPP5PP7b7k=sPP=v>h>kPP'Z'ZPP>zPP'Z'ZPP'Z'Z'Z'Z'Z?O?w'ZP?zP@QDXGuGyPG|HWH['ZPPPH_Hk'RP'R'RP'RP'RP'RP'RP'R'R'RP'RPP'RPP'RP'RPHqH}IVPI^IdPI^PI^I^PPPI^PKrPK{LVL]KrPI^LfPI^PLmLsPLwM]MzNeLwLwNkNxLwLwLwLw! ^! d! g! l! o! y!!P!!]!!o!!u!#P!#V!#s!#y!$P!$Z!$a!$g!$y!%T!%Z!%a!%k!%q!%w!%}!&T!&Z!&e!&k!&u!&{!'U!'[!'k!'s!'}!(UPPPPPPPPPPP!([!(_!(e!(n!(x!)TPPPPPPPPPPPP!-u!/Z!3^!6oPP!6w!7W!7a!8Y!8P!8c!8i!8l!8o!8r!8z!9jPPPPPPPPPPPPPPPPP!9m!9q!9wP!:]!:a!:m!:v!;S!;j!;m!;p!;v!;|!_![!]Do!]!^Es!^!_FZ!_!`Gk!`!aHX!a!b%T!b!cIf!c!dJU!d!eK^!e!hJU!h!i!#f!i!tJU!t!u!,|!u!wJU!w!x!.t!x!}JU!}#O!0S#O#P&o#P#Q!0j#Q#R!1Q#R#SJU#S#T%T#T#UJU#U#VK^#V#YJU#Y#Z!#f#Z#fJU#f#g!,|#g#iJU#i#j!.t#j#oJU#o#p!1n#p#q!1s#q#r!2a#r#s!2f#s$g%T$g;'SJU;'S;=`KW<%lOJU`%YT&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T`%lP;=`<%l%To%v]&n`%c_OX%TXY%oY[%T[]%o]p%Tpq%oq#O%T#O#P&o#P#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To&tX&n`OY%TYZ%oZ]%T]^%o^#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc'f[&n`O!_%T!_!`([!`#T%T#T#U(r#U#f%T#f#g(r#g#h(r#h#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc(cTmR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc(yT!mR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk)aV&n`&[ZOr%Trs)vs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk){V&n`Or%Trs*bs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk*iT&n`&^ZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To+PZS_&n`OY*xYZ%TZ]*x]^%T^#o*x#o#p+r#p#q*x#q#r+r#r;'S*x;'S;=`,^<%lO*x_+wTS_OY+rZ]+r^;'S+r;'S;=`,W<%lO+r_,ZP;=`<%l+ro,aP;=`<%l*xj,kV%rQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj-XT!xY&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj-oV%lQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk.]V&n`&ZZOw%Twx.rx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk.wV&n`Ow%Twx/^x#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk/eT&n`&]ZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk/{ThZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc0cTgR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk0yXVZ&n`Oz%Tz{1f{!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk1mVaR&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk2ZV%oZ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc2wTzR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To3_W%pZ&n`O!_%T!_!`-Q!`!a3w!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Td4OT&{S&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk4fX!fQ&n`O!O%T!O!P5R!P!Q%T!Q![6T![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk5WV&n`O!O%T!O!P5m!P#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk5tT!rZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti6[a!hX&n`O!Q%T!Q![6T![!g%T!g!h7a!h!l%T!l!m9s!m#R%T#R#S6T#S#X%T#X#Y7a#Y#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti7fZ&n`O{%T{|8X|}%T}!O8X!O!Q%T!Q![8s![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti8^V&n`O!Q%T!Q![8s![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti8z]!hX&n`O!Q%T!Q![8s![!l%T!l!m9s!m#R%T#R#S8s#S#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti9zT!hX&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk:bX%qR&n`O!P%T!P!Q:}!Q!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj;UV%sQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti;ro!hX&n`O!O%T!O!P=s!P!Q%T!Q![>_![!d%T!d!e?q!e!g%T!g!h7a!h!l%T!l!m9s!m!q%T!q!rA]!r!z%T!z!{Bq!{#R%T#R#S>_#S#U%T#U#V?q#V#X%T#X#Y7a#Y#^%T#^#_9s#_#c%T#c#dA]#d#l%T#l#mBq#m#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti=xV&n`O!Q%T!Q![6T![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti>fc!hX&n`O!O%T!O!P=s!P!Q%T!Q![>_![!g%T!g!h7a!h!l%T!l!m9s!m#R%T#R#S>_#S#X%T#X#Y7a#Y#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti?vY&n`O!Q%T!Q!R@f!R!S@f!S#R%T#R#S@f#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti@mY!hX&n`O!Q%T!Q!R@f!R!S@f!S#R%T#R#S@f#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiAbX&n`O!Q%T!Q!YA}!Y#R%T#R#SA}#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiBUX!hX&n`O!Q%T!Q!YA}!Y#R%T#R#SA}#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiBv]&n`O!Q%T!Q![Co![!c%T!c!iCo!i#R%T#R#SCo#S#T%T#T#ZCo#Z#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiCv]!hX&n`O!Q%T!Q![Co![!c%T!c!iCo!i#R%T#R#SCo#S#T%T#T#ZCo#Z#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%ToDvV{_&n`O!_%T!_!`E]!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TcEdT%{R&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkEzT#gZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkFbXmR&n`O!^%T!^!_F}!_!`([!`!a([!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TjGUV%mQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkGrV%zZ&n`O!_%T!_!`([!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkH`WmR&n`O!_%T!_!`([!`!aHx!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TjIPV%nQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkIoV_Q#}P&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%ToJ_]&n`&YS%uZO!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUoKZP;=`<%lJUoKge&n`&YS%uZOr%Trs)Ysw%Twx.Ux!Q%T!Q![JU![!c%T!c!tJU!t!uLx!u!}JU!}#R%T#R#SJU#S#T%T#T#fJU#f#gLx#g#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUoMRa&n`&YS%uZOr%TrsNWsw%Twx! vx!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUkN_V&n`&`ZOr%TrsNts#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkNyV&n`Or%Trs! `s#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk! gT&n`&bZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk! }V&n`&_ZOw%Twx!!dx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!!iV&n`Ow%Twx!#Ox#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!#VT&n`&aZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!#oe&n`&YS%uZOr%Trs!%Qsw%Twx!&px!Q%T!Q![JU![!c%T!c!tJU!t!u!(`!u!}JU!}#R%T#R#SJU#S#T%T#T#fJU#f#g!(`#g#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!%XV&n`&dZOr%Trs!%ns#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!%sV&n`Or%Trs!&Ys#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!&aT&n`&fZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!&wV&n`&cZOw%Twx!'^x#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!'cV&n`Ow%Twx!'xx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!(PT&n`&eZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!(ia&n`&YS%uZOr%Trs!)nsw%Twx!+^x!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!)uV&n`&hZOr%Trs!*[s#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!*aV&n`Or%Trs!*vs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!*}T&n`&jZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!+eV&n`&gZOw%Twx!+zx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!,PV&n`Ow%Twx!,fx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!,mT&n`&iZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!-Vi&n`&YS%uZOr%TrsNWsw%Twx! vx!Q%T!Q![JU![!c%T!c!dJU!d!eLx!e!hJU!h!i!(`!i!}JU!}#R%T#R#SJU#S#T%T#T#UJU#U#VLx#V#YJU#Y#Z!(`#Z#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUo!.}a&n`&YS%uZOr%Trs)Ysw%Twx.Ux!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!0ZT!XZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc!0qT!WR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj!1XV%kQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T~!1sO!]~k!1zV%jR&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T~!2fO![~i!2mT%tX&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T",tokenizers:[MZ,GZ,CZ,DZ,0,1,2,3,4],topRules:{Script:[0,5]},specialized:[{term:221,get:O=>NZ[O]||-1}],tokenPrec:7668});var Lm=new Tt,Dm=new Set(["Script","Body","FunctionDefinition","ClassDefinition","LambdaExpression","ForStatement","MatchClause"]);function Cs(O){return(e,t,i)=>{if(i)return!1;let r=e.node.getChild("VariableName");return r&&t(r,O),!0}}var FZ={FunctionDefinition:Cs("function"),ClassDefinition:Cs("class"),ForStatement(O,e,t){if(t){for(let i=O.node.firstChild;i;i=i.nextSibling)if(i.name=="VariableName")e(i,"variable");else if(i.name=="in")break}},ImportStatement(O,e){var t,i;let{node:r}=O,n=((t=r.firstChild)===null||t===void 0?void 0:t.name)=="from";for(let s=r.getChild("import");s;s=s.nextSibling)s.name=="VariableName"&&((i=s.nextSibling)===null||i===void 0?void 0:i.name)!="as"&&e(s,n?"variable":"namespace")},AssignStatement(O,e){for(let t=O.node.firstChild;t;t=t.nextSibling)if(t.name=="VariableName")e(t,"variable");else if(t.name==":"||t.name=="AssignOp")break},ParamList(O,e){for(let t=null,i=O.node.firstChild;i;i=i.nextSibling)i.name=="VariableName"&&(!t||!/\*|AssignOp/.test(t.name))&&e(i,"variable"),t=i},CapturePattern:Cs("variable"),AsPattern:Cs("variable"),__proto__:null};function Im(O,e){let t=Lm.get(e);if(t)return t;let i=[],r=!0;function n(s,a){let o=O.sliceString(s.from,s.to);i.push({label:o,type:a})}return e.cursor(C.IncludeAnonymous).iterate(s=>{if(s.name){let a=FZ[s.name];if(a&&a(s,n,r)||!r&&Dm.has(s.name))return!1;r=!1}else if(s.to-s.from>8192){for(let a of Im(O,s.node))i.push(a);return!1}}),Lm.set(e,i),i}var Mm=/^[\w\xa1-\uffff][\w\d\xa1-\uffff]*$/,Bm=["String","FormatString","Comment","PropertyName"];function HZ(O){let e=U(O.state).resolveInner(O.pos,-1);if(Bm.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&Mm.test(O.state.sliceDoc(e.from,e.to));if(!t&&!O.explicit)return null;let i=[];for(let r=e;r;r=r.parent)Dm.has(r.name)&&(i=i.concat(Im(O.state.doc,r)));return{options:i,from:t?e.from:O.pos,validFor:Mm}}var KZ=["__annotations__","__builtins__","__debug__","__doc__","__import__","__name__","__loader__","__package__","__spec__","False","None","True"].map(O=>({label:O,type:"constant"})).concat(["ArithmeticError","AssertionError","AttributeError","BaseException","BlockingIOError","BrokenPipeError","BufferError","BytesWarning","ChildProcessError","ConnectionAbortedError","ConnectionError","ConnectionRefusedError","ConnectionResetError","DeprecationWarning","EOFError","Ellipsis","EncodingWarning","EnvironmentError","Exception","FileExistsError","FileNotFoundError","FloatingPointError","FutureWarning","GeneratorExit","IOError","ImportError","ImportWarning","IndentationError","IndexError","InterruptedError","IsADirectoryError","KeyError","KeyboardInterrupt","LookupError","MemoryError","ModuleNotFoundError","NameError","NotADirectoryError","NotImplemented","NotImplementedError","OSError","OverflowError","PendingDeprecationWarning","PermissionError","ProcessLookupError","RecursionError","ReferenceError","ResourceWarning","RuntimeError","RuntimeWarning","StopAsyncIteration","StopIteration","SyntaxError","SyntaxWarning","SystemError","SystemExit","TabError","TimeoutError","TypeError","UnboundLocalError","UnicodeDecodeError","UnicodeEncodeError","UnicodeError","UnicodeTranslateError","UnicodeWarning","UserWarning","ValueError","Warning","ZeroDivisionError"].map(O=>({label:O,type:"type"}))).concat(["bool","bytearray","bytes","classmethod","complex","float","frozenset","int","list","map","memoryview","object","range","set","staticmethod","str","super","tuple","type"].map(O=>({label:O,type:"class"}))).concat(["abs","aiter","all","anext","any","ascii","bin","breakpoint","callable","chr","compile","delattr","dict","dir","divmod","enumerate","eval","exec","exit","filter","format","getattr","globals","hasattr","hash","help","hex","id","input","isinstance","issubclass","iter","len","license","locals","max","min","next","oct","open","ord","pow","print","property","quit","repr","reversed","round","setattr","slice","sorted","sum","vars","zip"].map(O=>({label:O,type:"function"}))),JZ=[W("def ${name}(${params}):\n ${}",{label:"def",detail:"function",type:"keyword"}),W("for ${name} in ${collection}:\n ${}",{label:"for",detail:"loop",type:"keyword"}),W("while ${}:\n ${}",{label:"while",detail:"loop",type:"keyword"}),W("try:\n ${}\nexcept ${error}:\n ${}",{label:"try",detail:"/ except block",type:"keyword"}),W(`if \${}: + +`,{label:"if",detail:"block",type:"keyword"}),W("if ${}:\n ${}\nelse:\n ${}",{label:"if",detail:"/ else block",type:"keyword"}),W("class ${name}:\n def __init__(self, ${params}):\n ${}",{label:"class",detail:"definition",type:"keyword"}),W("import ${module}",{label:"import",detail:"statement",type:"keyword"}),W("from ${module} import ${names}",{label:"from",detail:"import",type:"keyword"})],ev=cO(Bm,zt(KZ.concat(JZ)));function Dc(O){let{node:e,pos:t}=O,i=O.lineIndent(t,-1),r=null;for(;;){let n=e.childBefore(t);if(n)if(n.name=="Comment")t=n.from;else if(n.name=="Body"||n.name=="MatchBody")O.baseIndentFor(n)+O.unit<=i&&(r=n),e=n;else if(n.name=="MatchClause")e=n;else if(n.type.is("Statement"))e=n;else break;else break}return r}function Ic(O,e){let t=O.baseIndentFor(e),i=O.lineAt(O.pos,-1),r=i.from+i.text.length;return/^\s*($|#)/.test(i.text)&&O.node.tot?null:t+O.unit}var Bc=ne.define({name:"python",parser:Am.configure({props:[se.add({Body:O=>{var e;let t=/^\s*(#|$)/.test(O.textAfter)&&Dc(O)||O.node;return(e=Ic(O,t))!==null&&e!==void 0?e:O.continue()},MatchBody:O=>{var e;let t=Dc(O);return(e=Ic(O,t||O.node))!==null&&e!==void 0?e:O.continue()},IfStatement:O=>/^\s*(else:|elif )/.test(O.textAfter)?O.baseIndent:O.continue(),"ForStatement WhileStatement":O=>/^\s*else:/.test(O.textAfter)?O.baseIndent:O.continue(),TryStatement:O=>/^\s*(except[ :]|finally:|else:)/.test(O.textAfter)?O.baseIndent:O.continue(),MatchStatement:O=>/^\s*case /.test(O.textAfter)?O.baseIndent+O.unit:O.continue(),"TupleExpression ComprehensionExpression ParamList ArgList ParenthesizedExpression":be({closing:")"}),"DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression":be({closing:"}"}),"ArrayExpression ArrayComprehensionExpression":be({closing:"]"}),MemberExpression:O=>O.baseIndent+O.unit,"String FormatString":()=>null,Script:O=>{var e;let t=Dc(O);return(e=t&&Ic(O,t))!==null&&e!==void 0?e:O.continue()}}),te.add({"ArrayExpression DictionaryExpression SetExpression TupleExpression":me,Body:(O,e)=>({from:O.from+1,to:O.to-(O.to==e.doc.length?0:1)}),"String FormatString":(O,e)=>({from:e.doc.lineAt(O.from).to,to:O.to})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["f","fr","rf","r","u","b","br","rb","F","FR","RF","R","U","B","BR","RB"]},commentTokens:{line:"#"},indentOnInput:/^\s*([\}\]\)]|else:|elif |except |finally:|case\s+[^:]*:?)$/}});function Nm(){return new J(Bc,[Bc.data.of({autocomplete:HZ}),Bc.data.of({autocomplete:ev})])}var tv=36,Fm=1,Ov=2,yi=3,Nc=4,iv=5,rv=6,nv=7,sv=8,av=9,ov=10,lv=11,cv=12,hv=13,fv=14,dv=15,uv=16,Qv=17,Hm=18,$v=19,ng=20,sg=21,Km=22,pv=23,mv=24;function Hc(O){return O>=65&&O<=90||O>=97&&O<=122||O>=48&&O<=57}function gv(O){return O>=48&&O<=57||O>=97&&O<=102||O>=65&&O<=70}function CO(O,e,t){for(let i=!1;;){if(O.next<0)return;if(O.next==e&&!i){O.advance();return}i=t&&!i&&O.next==92,O.advance()}}function Pv(O,e){e:for(;;){if(O.next<0)return;if(O.next==36){O.advance();for(let t=0;t)".charCodeAt(t);for(;;){if(O.next<0)return;if(O.next==i&&O.peek(1)==39){O.advance(2);return}O.advance()}}function Kc(O,e){for(;!(O.next!=95&&!Hc(O.next));)e!=null&&(e+=String.fromCharCode(O.next)),O.advance();return e}function Xv(O){if(O.next==39||O.next==34||O.next==96){let e=O.next;O.advance(),CO(O,e,!1)}else Kc(O)}function Jm(O,e){for(;O.next==48||O.next==49;)O.advance();e&&O.next==e&&O.advance()}function eg(O,e){for(;;){if(O.next==46){if(e)break;e=!0}else if(O.next<48||O.next>57)break;O.advance()}if(O.next==69||O.next==101)for(O.advance(),(O.next==43||O.next==45)&&O.advance();O.next>=48&&O.next<=57;)O.advance()}function tg(O){for(;!(O.next<0||O.next==10);)O.advance()}function jO(O,e){for(let t=0;t!=&|~^/",specialVar:"?",identifierQuotes:'"',caseInsensitiveIdentifiers:!1,words:ag(EO,GO)};function Tv(O,e,t,i){let r={};for(let n in Jc)r[n]=(O.hasOwnProperty(n)?O:Jc)[n];return e&&(r.words=ag(e,t||"",i)),r}function og(O){return new z(e=>{var t;let{next:i}=e;if(e.advance(),jO(i,Fc)){for(;jO(e.next,Fc);)e.advance();e.acceptToken(tv)}else if(i==36&&O.doubleDollarQuotedStrings){let r=Kc(e,"");e.next==36&&(e.advance(),Pv(e,r),e.acceptToken(yi))}else if(i==39||i==34&&O.doubleQuotedStrings)CO(e,i,O.backslashEscapes),e.acceptToken(yi);else if(i==35&&O.hashComments||i==47&&e.next==47&&O.slashComments)tg(e),e.acceptToken(Fm);else if(i==45&&e.next==45&&(!O.spaceAfterDashes||e.peek(1)==32))tg(e),e.acceptToken(Fm);else if(i==47&&e.next==42){e.advance();for(let r=1;;){let n=e.next;if(e.next<0)break;if(e.advance(),n==42&&e.next==47){if(r--,e.advance(),!r)break}else n==47&&e.next==42&&(r++,e.advance())}e.acceptToken(Ov)}else if((i==101||i==69)&&e.next==39)e.advance(),CO(e,39,!0),e.acceptToken(yi);else if((i==110||i==78)&&e.next==39&&O.charSetCasts)e.advance(),CO(e,39,O.backslashEscapes),e.acceptToken(yi);else if(i==95&&O.charSetCasts)for(let r=0;;r++){if(e.next==39&&r>1){e.advance(),CO(e,39,O.backslashEscapes),e.acceptToken(yi);break}if(!Hc(e.next))break;e.advance()}else if(O.plsqlQuotingMechanism&&(i==113||i==81)&&e.next==39&&e.peek(1)>0&&!jO(e.peek(1),Fc)){let r=e.peek(1);e.advance(2),Sv(e,r),e.acceptToken(yi)}else if(jO(i,O.identifierQuotes)){let r=i==91?93:i;CO(e,r,!1),e.acceptToken($v)}else if(i==40)e.acceptToken(nv);else if(i==41)e.acceptToken(sv);else if(i==123)e.acceptToken(av);else if(i==125)e.acceptToken(ov);else if(i==91)e.acceptToken(lv);else if(i==93)e.acceptToken(cv);else if(i==59)e.acceptToken(hv);else if(O.unquotedBitLiterals&&i==48&&e.next==98)e.advance(),Jm(e),e.acceptToken(Km);else if((i==98||i==66)&&(e.next==39||e.next==34)){let r=e.next;e.advance(),O.treatBitsAsBytes?(CO(e,r,O.backslashEscapes),e.acceptToken(pv)):(Jm(e,r),e.acceptToken(Km))}else if(i==48&&(e.next==120||e.next==88)||(i==120||i==88)&&e.next==39){let r=e.next==39;for(e.advance();gv(e.next);)e.advance();r&&e.next==39&&e.advance(),e.acceptToken(Nc)}else if(i==46&&e.next>=48&&e.next<=57)eg(e,!0),e.acceptToken(Nc);else if(i==46)e.acceptToken(fv);else if(i>=48&&i<=57)eg(e,!1),e.acceptToken(Nc);else if(jO(i,O.operatorChars)){for(;jO(e.next,O.operatorChars);)e.advance();e.acceptToken(dv)}else if(jO(i,O.specialVar))e.next==i&&e.advance(),Xv(e),e.acceptToken(Qv);else if(i==58||i==44)e.acceptToken(uv);else if(Hc(i)){let r=Kc(e,String.fromCharCode(i));e.acceptToken(e.next==46||e.peek(-r.length-1)==46?Hm:(t=O.words[r.toLowerCase()])!==null&&t!==void 0?t:Hm)}})}var lg=og(Jc),bv=Oe.deserialize({version:14,states:"%vQ]QQOOO#wQRO'#DSO$OQQO'#CwO%eQQO'#CxO%lQQO'#CyO%sQQO'#CzOOQQ'#DS'#DSOOQQ'#C}'#C}O'UQRO'#C{OOQQ'#Cv'#CvOOQQ'#C|'#C|Q]QQOOQOQQOOO'`QQO'#DOO(xQRO,59cO)PQQO,59cO)UQQO'#DSOOQQ,59d,59dO)cQQO,59dOOQQ,59e,59eO)jQQO,59eOOQQ,59f,59fO)qQQO,59fOOQQ-E6{-E6{OOQQ,59b,59bOOQQ-E6z-E6zOOQQ,59j,59jOOQQ-E6|-E6|O+VQRO1G.}O+^QQO,59cOOQQ1G/O1G/OOOQQ1G/P1G/POOQQ1G/Q1G/QP+kQQO'#C}O+rQQO1G.}O)PQQO,59cO,PQQO'#Cw",stateData:",[~OtOSPOSQOS~ORUOSUOTUOUUOVROXSOZTO]XO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O^]ORvXSvXTvXUvXVvXXvXZvX]vX_vX`vXavXbvXcvXdvXevXfvXgvXhvX~OsvX~P!jOa_Ob_Oc_O~ORUOSUOTUOUUOVROXSOZTO^tO_UO`UOa`Ob`Oc`OdUOeUOfUOgUOhUO~OWaO~P$ZOYcO~P$ZO[eO~P$ZORUOSUOTUOUUOVROXSOZTO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O]hOsoX~P%zOajObjOcjO~O^]ORkaSkaTkaUkaVkaXkaZka]ka_ka`kaakabkackadkaekafkagkahka~Oska~P'kO^]O~OWvXYvX[vX~P!jOWnO~P$ZOYoO~P$ZO[pO~P$ZO^]ORkiSkiTkiUkiVkiXkiZki]ki_ki`kiakibkickidkiekifkigkihki~Oski~P)xOWkaYka[ka~P'kO]hO~P$ZOWkiYki[ki~P)xOasObsOcsO~O",goto:"#hwPPPPPPPPPPPPPPPPPPPPPPPPPPx||||!Y!^!d!xPPP#[TYOZeUORSTWZbdfqT[OZQZORiZSWOZQbRQdSQfTZgWbdfqQ^PWk^lmrQl_Qm`RrseVORSTWZbdfq",nodeNames:"\u26A0 LineComment BlockComment String Number Bool Null ( ) { } [ ] ; . Operator Punctuation SpecialVar Identifier QuotedIdentifier Keyword Type Bits Bytes Builtin Script Statement CompositeIdentifier Parens Braces Brackets Statement",maxTerm:38,nodeProps:[["isolate",-4,1,2,3,19,""]],skippedNodes:[0,1,2],repeatNodeCount:3,tokenData:"RORO",tokenizers:[0,lg],topRules:{Script:[0,25]},tokenPrec:0});function eh(O){let e=O.cursor().moveTo(O.from,-1);for(;/Comment/.test(e.name);)e.moveTo(e.from,-1);return e.node}function Wr(O,e){let t=O.sliceString(e.from,e.to),i=/^([`'"\[])(.*)([`'"\]])$/.exec(t);return i?i[2]:t}function Gs(O){return O&&(O.name=="Identifier"||O.name=="QuotedIdentifier")}function yv(O,e){if(e.name=="CompositeIdentifier"){let t=[];for(let i=e.firstChild;i;i=i.nextSibling)Gs(i)&&t.push(Wr(O,i));return t}return[Wr(O,e)]}function Og(O,e){for(let t=[];;){if(!e||e.name!=".")return t;let i=eh(e);if(!Gs(i))return t;t.unshift(Wr(O,i)),e=eh(i)}}function xv(O,e){let t=U(O).resolveInner(e,-1),i=wv(O.doc,t);return t.name=="Identifier"||t.name=="QuotedIdentifier"||t.name=="Keyword"?{from:t.from,quoted:t.name=="QuotedIdentifier"?O.doc.sliceString(t.from,t.from+1):null,parents:Og(O.doc,eh(t)),aliases:i}:t.name=="."?{from:e,quoted:null,parents:Og(O.doc,t),aliases:i}:{from:e,quoted:null,parents:[],empty:!0,aliases:i}}var kv=new Set("where group having order union intersect except all distinct limit offset fetch for".split(" "));function wv(O,e){let t;for(let r=e;!t;r=r.parent){if(!r)return null;r.name=="Statement"&&(t=r)}let i=null;for(let r=t.firstChild,n=!1,s=null;r;r=r.nextSibling){let a=r.name=="Keyword"?O.sliceString(r.from,r.to).toLowerCase():null,o=null;if(!n)n=a=="from";else if(a=="as"&&s&&Gs(r.nextSibling))o=Wr(O,r.nextSibling);else{if(a&&kv.has(a))break;s&&Gs(r)&&(o=Wr(O,r))}o&&(i||(i=Object.create(null)),i[o]=yv(O,s)),s=/Identifier$/.test(r.name)?r:null}return i}function Zv(O,e,t){return t.map(i=>({...i,label:i.label[0]==O?i.label:O+i.label+e,apply:void 0}))}var vv=/^\w*$/,Yv=/^[`'"\[]?\w*[`'"\]]?$/;function ig(O){return O.self&&typeof O.self.label=="string"}var th=class O{constructor(e,t){this.idQuote=e,this.idCaseInsensitive=t,this.list=[],this.children=void 0}child(e){let t=this.children||(this.children=Object.create(null)),i=t[e];return i||(e&&!this.list.some(r=>r.label==e)&&this.list.push(rg(e,"type",this.idQuote,this.idCaseInsensitive)),t[e]=new O(this.idQuote,this.idCaseInsensitive))}maybeChild(e){return this.children?this.children[e]:null}addCompletion(e){let t=this.list.findIndex(i=>i.label==e.label);t>-1?this.list[t]=e:this.list.push(e)}addCompletions(e){for(let t of e)this.addCompletion(typeof t=="string"?rg(t,"property",this.idQuote,this.idCaseInsensitive):t)}addNamespace(e){Array.isArray(e)?this.addCompletions(e):ig(e)?this.addNamespace(e.children):this.addNamespaceObject(e)}addNamespaceObject(e){for(let t of Object.keys(e)){let i=e[t],r=null,n=t.replace(/\\?\./g,a=>a=="."?"\0":a).split("\0"),s=this;ig(i)&&(r=i.self,i=i.children);for(let a=0;a{let{parents:h,from:f,quoted:u,empty:Q,aliases:$}=xv(c.state,c.pos);if(Q&&!c.explicit)return null;$&&h.length==1&&(h=$[h[0]]||h);let p=o;for(let g of h){for(;!p.children||!p.children[g];)if(p==o&&l)p=l;else if(p==l&&i)p=p.child(i);else return null;let P=p.maybeChild(g);if(!P)return null;p=P}let m=p.list;if(p==o&&$&&(m=m.concat(Object.keys($).map(g=>({label:g,type:"constant"})))),u){let g=u[0],P=cg(g),y=c.state.sliceDoc(c.pos,c.pos+1)==P;return{from:f,to:y?c.pos+1:void 0,options:Zv(g,P,m),validFor:Yv}}else return{from:f,options:m,validFor:vv}}}function Rv(O){return O==sg?"type":O==ng?"keyword":"variable"}function Vv(O,e,t){let i=Object.keys(O).map(r=>t(e?r.toUpperCase():r,Rv(O[r])));return cO(["QuotedIdentifier","String","LineComment","BlockComment","."],zt(i))}var qv=bv.configure({props:[se.add({Statement:le()}),te.add({Statement(O,e){return{from:Math.min(O.from+100,e.doc.lineAt(O.from).to),to:O.to}},BlockComment(O){return{from:O.from+2,to:O.to-2}}}),F({Keyword:d.keyword,Type:d.typeName,Builtin:d.standard(d.name),Bits:d.number,Bytes:d.string,Bool:d.bool,Null:d.null,Number:d.number,String:d.string,Identifier:d.name,QuotedIdentifier:d.special(d.string),SpecialVar:d.special(d.name),LineComment:d.lineComment,BlockComment:d.blockComment,Operator:d.operator,"Semi Punctuation":d.punctuation,"( )":d.paren,"{ }":d.brace,"[ ]":d.squareBracket})]}),wt=class O{constructor(e,t,i){this.dialect=e,this.language=t,this.spec=i}get extension(){return this.language.extension}configureLanguage(e,t){return new O(this.dialect,this.language.configure(e,t),this.spec)}static define(e){let t=Tv(e,e.keywords,e.types,e.builtin),i=ne.define({name:"sql",parser:qv.configure({tokenizers:[{from:lg,to:og(t)}]}),languageData:{commentTokens:{line:"--",block:{open:"/*",close:"*/"}},closeBrackets:{brackets:["(","[","{","'",'"',"`"]}}});return new O(t,i,e)}};function zv(O,e){return{label:O,type:e,boost:-1}}function Uv(O,e=!1,t){return Vv(O.dialect.words,e,t||zv)}function Wv(O){return O.schema?_v(O.schema,O.tables,O.schemas,O.defaultTable,O.defaultSchema,O.dialect||Oh):()=>null}function jv(O){return O.schema?(O.dialect||Oh).language.data.of({autocomplete:Wv(O)}):[]}function hg(O={}){let e=O.dialect||Oh;return new J(e.language,[jv(O),e.language.data.of({autocomplete:Uv(e,O.upperCaseKeywords,O.keywordCompletion)})])}var Oh=wt.define({}),q5=wt.define({charSetCasts:!0,doubleDollarQuotedStrings:!0,operatorChars:"+-*/<>=~!@#%^&|`?",specialVar:"",keywords:EO+"abort abs absent access according ada admin aggregate alias also always analyse analyze array_agg array_max_cardinality asensitive assert assignment asymmetric atomic attach attribute attributes avg backward base64 begin_frame begin_partition bernoulli bit_length blocked bom cache called cardinality catalog_name ceil ceiling chain char_length character_length character_set_catalog character_set_name character_set_schema characteristics characters checkpoint class class_origin cluster coalesce cobol collation_catalog collation_name collation_schema collect column_name columns command_function command_function_code comment comments committed concurrently condition_number configuration conflict connection_name constant constraint_catalog constraint_name constraint_schema contains content control conversion convert copy corr cost covar_pop covar_samp csv cume_dist current_catalog current_row current_schema cursor_name database datalink datatype datetime_interval_code datetime_interval_precision db debug defaults defined definer degree delimiter delimiters dense_rank depends derived detach detail dictionary disable discard dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue document dump dynamic_function dynamic_function_code element elsif empty enable encoding encrypted end_frame end_partition endexec enforced enum errcode error event every exclude excluding exclusive exp explain expression extension extract family file filter final first_value flag floor following force foreach fortran forward frame_row freeze fs functions fusion generated granted greatest groups handler header hex hierarchy hint id ignore ilike immediately immutable implementation implicit import include including increment indent index indexes info inherit inherits inline insensitive instance instantiable instead integrity intersection invoker isnull key_member key_type label lag last_value lead leakproof least length library like_regex link listen ln load location lock locked log logged lower mapping matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text min minvalue mod mode more move multiset mumps name namespace nfc nfd nfkc nfkd nil normalize normalized nothing notice notify notnull nowait nth_value ntile nullable nullif nulls number occurrences_regex octet_length octets off offset oids operator options ordering others over overlay overriding owned owner parallel parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partition pascal passing passthrough password percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding prepared print_strict_params procedural procedures program publication query quote raise range rank reassign recheck recovery refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex rename repeatable replace replica requiring reset respect restart restore result_oid returned_cardinality returned_length returned_octet_length returned_sqlstate returning reverse routine_catalog routine_name routine_schema routines row_count row_number rowtype rule scale schema_name schemas scope scope_catalog scope_name scope_schema security selective self sensitive sequence sequences serializable server server_name setof share show simple skip slice snapshot source specific_name sqlcode sqlerror sqrt stable stacked standalone statement statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time table_name tables tablesample tablespace temp template ties token top_level_count transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex trigger_catalog trigger_name trigger_schema trim trim_array truncate trusted type types uescape unbounded uncommitted unencrypted unlink unlisten unlogged unnamed untyped upper uri use_column use_variable user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema vacuum valid validate validator value_of var_pop var_samp varbinary variable_conflict variadic verbose version versioning views volatile warning whitespace width_bucket window within wrapper xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate yes",types:GO+"bigint int8 bigserial serial8 varbit bool box bytea cidr circle precision float8 inet int4 json jsonb line lseg macaddr macaddr8 money numeric pg_lsn point polygon float4 int2 smallserial serial2 serial serial4 text timetz timestamptz tsquery tsvector txid_snapshot uuid xml"}),fg="accessible algorithm analyze asensitive authors auto_increment autocommit avg avg_row_length binlog btree cache catalog_name chain change changed checkpoint checksum class_origin client_statistics coalesce code collations columns comment committed completion concurrent consistent contains contributors convert database databases day_hour day_microsecond day_minute day_second delay_key_write delayed delimiter des_key_file dev_pop dev_samp deviance directory disable discard distinctrow div dual dumpfile enable enclosed ends engine engines enum errors escaped even event events every explain extended fast field fields flush force found_rows fulltext grants handler hash high_priority hosts hour_microsecond hour_minute hour_second ignore ignore_server_ids import index index_statistics infile innodb insensitive insert_method install invoker iterate keys kill linear lines list load lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modify mutex mysql_errno no_write_to_binlog offline offset one online optimize optionally outfile pack_keys parser partition partitions password phase plugin plugins prev processlist profile profiles purge query quick range read_write rebuild recover regexp relaylog remove rename reorganize repair repeatable replace require resume rlike row_format rtree schedule schema_name schemas second_microsecond security sensitive separator serializable server share show slave slow snapshot soname spatial sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result ssl starting starts std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace terminated triggers truncate uncommitted uninstall unlock upgrade use use_frm user_resources user_statistics utc_date utc_time utc_timestamp variables views warnings xa xor year_month zerofill",dg=GO+"bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int1 int2 int3 int4 int8 float4 float8 varbinary varcharacter precision datetime unsigned signed",ug="charset clear edit ego help nopager notee nowarning pager print prompt quit rehash source status system tee",z5=wt.define({operatorChars:"*+-%<>!=&|^",charSetCasts:!0,doubleQuotedStrings:!0,unquotedBitLiterals:!0,hashComments:!0,spaceAfterDashes:!0,specialVar:"@?",identifierQuotes:"`",keywords:EO+"group_concat "+fg,types:dg,builtin:ug}),U5=wt.define({operatorChars:"*+-%<>!=&|^",charSetCasts:!0,doubleQuotedStrings:!0,unquotedBitLiterals:!0,hashComments:!0,spaceAfterDashes:!0,specialVar:"@?",identifierQuotes:"`",keywords:EO+"always generated groupby_concat hard persistent shutdown soft virtual "+fg,types:dg,builtin:ug}),Cv="approx_count_distinct approx_percentile_cont approx_percentile_disc avg checksum_agg count count_big grouping grouping_id max min product stdev stdevp sum var varp ai_generate_embeddings ai_generate_chunks cume_dist first_value lag last_value lead percentile_cont percentile_disc percent_rank left_shift right_shift bit_count get_bit set_bit collationproperty tertiary_weights @@datefirst @@dbts @@langid @@language @@lock_timeout @@max_connections @@max_precision @@nestlevel @@options @@remserver @@servername @@servicename @@spid @@textsize @@version cast convert parse try_cast try_convert try_parse asymkey_id asymkeyproperty certproperty cert_id crypt_gen_random decryptbyasymkey decryptbycert decryptbykey decryptbykeyautoasymkey decryptbykeyautocert decryptbypassphrase encryptbyasymkey encryptbycert encryptbykey encryptbypassphrase hashbytes is_objectsigned key_guid key_id key_name signbyasymkey signbycert symkeyproperty verifysignedbycert verifysignedbyasymkey @@cursor_rows @@fetch_status cursor_status datalength ident_current ident_incr ident_seed identity sql_variant_property @@datefirst current_timestamp current_timezone current_timezone_id date_bucket dateadd datediff datediff_big datefromparts datename datepart datetime2fromparts datetimefromparts datetimeoffsetfromparts datetrunc day eomonth getdate getutcdate isdate month smalldatetimefromparts switchoffset sysdatetime sysdatetimeoffset sysutcdatetime timefromparts todatetimeoffset year edit_distance edit_distance_similarity jaro_winkler_distance jaro_winkler_similarity edge_id_from_parts graph_id_from_edge_id graph_id_from_node_id node_id_from_parts object_id_from_edge_id object_id_from_node_id json isjson json_array json_contains json_modify json_object json_path_exists json_query json_value regexp_like regexp_replace regexp_substr regexp_instr regexp_count regexp_matches regexp_split_to_table abs acos asin atan atn2 ceiling cos cot degrees exp floor log log10 pi power radians rand round sign sin sqrt square tan choose greatest iif least @@procid app_name applock_mode applock_test assemblyproperty col_length col_name columnproperty databasepropertyex db_id db_name file_id file_idex file_name filegroup_id filegroup_name filegroupproperty fileproperty filepropertyex fulltextcatalogproperty fulltextserviceproperty index_col indexkey_property indexproperty next value for object_definition object_id object_name object_schema_name objectproperty objectpropertyex original_db_name parsename schema_id schema_name scope_identity serverproperty stats_date type_id type_name typeproperty dense_rank ntile rank row_number publishingservername certenclosed certprivatekey current_user database_principal_id has_dbaccess has_perms_by_name is_member is_rolemember is_srvrolemember loginproperty original_login permissions pwdencrypt pwdcompare session_user sessionproperty suser_id suser_name suser_sid suser_sname system_user user user_id user_name ascii char charindex concat concat_ws difference format left len lower ltrim nchar patindex quotename replace replicate reverse right rtrim soundex space str string_agg string_escape stuff substring translate trim unicode upper $partition @@error @@identity @@pack_received @@rowcount @@trancount binary_checksum checksum compress connectionproperty context_info current_request_id current_transaction_id decompress error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big session_context xact_state @@connections @@cpu_busy @@idle @@io_busy @@pack_sent @@packet_errors @@timeticks @@total_errors @@total_read @@total_write textptr textvalid columns_updated eventdata trigger_nestlevel vector_distance vectorproperty vector_search generate_series opendatasource openjson openquery openrowset openxml predict string_split coalesce nullif apply catch filter force include keep keepfixed modify optimize parameterization parameters partition recompile sequence set",W5=wt.define({keywords:EO+"add external procedure all fetch public alter file raiserror and fillfactor read any for readtext as foreign reconfigure asc freetext references authorization freetexttable replication backup from restore begin full restrict between function return break goto revert browse grant revoke bulk group right by having rollback cascade holdlock rowcount case identity rowguidcol check identity_insert rule checkpoint identitycol save close if schema clustered in securityaudit coalesce index select collate inner semantickeyphrasetable column insert semanticsimilaritydetailstable commit intersect semanticsimilaritytable compute into session_user constraint is set contains join setuser containstable key shutdown continue kill some convert left statistics create like system_user cross lineno table current load tablesample current_date merge textsize current_time national then current_timestamp nocheck to current_user nonclustered top cursor not tran database null transaction dbcc nullif trigger deallocate of truncate declare off try_convert default offsets tsequal delete on union deny open unique desc opendatasource unpivot disk openquery update distinct openrowset updatetext distributed openxml use double option user drop or values dump order varying else outer view end over waitfor errlvl percent when escape pivot where except plan while exec precision with execute primary within group exists print writetext exit proc noexpand index forceseek forcescan holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot spatial_window_max_cells tablock tablockx updlock xlock keepidentity keepdefaults ignore_constraints ignore_triggers",types:GO+"smalldatetime datetimeoffset datetime2 datetime bigint smallint smallmoney tinyint money real text nvarchar ntext varbinary image hierarchyid uniqueidentifier sql_variant xml",builtin:Cv,operatorChars:"*+-%<>!=^&|/",specialVar:"@",identifierQuotes:'"['}),j5=wt.define({keywords:EO+"abort analyze attach autoincrement conflict database detach exclusive fail glob ignore index indexed instead isnull notnull offset plan pragma query raise regexp reindex rename replace temp vacuum virtual",types:GO+"bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int2 int8 unsigned signed real",builtin:"auth backup bail changes clone databases dbinfo dump echo eqp explain fullschema headers help import imposter indexes iotrace lint load log mode nullvalue once print prompt quit restore save scanstats separator shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width",operatorChars:"*+-%<>!=&|/~",identifierQuotes:'`"',specialVar:"@:?$"}),C5=wt.define({keywords:"add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime infinity NaN",types:GO+"ascii bigint blob counter frozen inet list map static text timeuuid tuple uuid varint",slashComments:!0}),G5=wt.define({keywords:EO+"abort accept access add all alter and any arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body by case cast char_base check close cluster clusters colauth column comment commit compress connected constant constraint crash create current currval cursor data_base database dba deallocate debugoff debugon declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry exception exception_init exchange exclusive exists external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base of off offline on online only option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw rebuild record ref references refresh rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work",builtin:"appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define echo editfile embedded feedback flagger flush heading headsep instance linesize lno loboffset logsource longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar repfooter repheader serveroutput shiftinout show showmode spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout timing trimout trimspool ttitle underline verify version wrap",types:GO+"ascii bfile bfilename bigserial bit blob dec long number nvarchar nvarchar2 serial smallint string text uid varchar2 xml",operatorChars:"*/+-%<>!=~",doubleQuotedStrings:!0,charSetCasts:!0,plsqlQuotingMechanism:!0});var ih=1,Gv=2,Ev=3,Av=4,Lv=5,Mv=36,Dv=37,Iv=38,Bv=11,Nv=13;function Fv(O){return O==45||O==46||O==58||O>=65&&O<=90||O==95||O>=97&&O<=122||O>=161}function Hv(O){return O==9||O==10||O==13||O==32}var Qg=null,$g=null,pg=0;function rh(O,e){let t=O.pos+e;if($g==O&&pg==t)return Qg;for(;Hv(O.peek(e));)e++;let i="";for(;;){let r=O.peek(e);if(!Fv(r))break;i+=String.fromCharCode(r),e++}return $g=O,pg=t,Qg=i||null}function mg(O,e){this.name=O,this.parent=e}var Kv=new Ge({start:null,shift(O,e,t,i){return e==ih?new mg(rh(i,1)||"",O):O},reduce(O,e){return e==Bv&&O?O.parent:O},reuse(O,e,t,i){let r=e.type.id;return r==ih||r==Nv?new mg(rh(i,1)||"",O):O},strict:!1}),Jv=new z((O,e)=>{if(O.next==60){if(O.advance(),O.next==47){O.advance();let t=rh(O,0);if(!t)return O.acceptToken(Lv);if(e.context&&t==e.context.name)return O.acceptToken(Gv);for(let i=e.context;i;i=i.parent)if(i.name==t)return O.acceptToken(Ev,-2);O.acceptToken(Av)}else if(O.next!=33&&O.next!=63)return O.acceptToken(ih)}},{contextual:!0});function nh(O,e){return new z(t=>{let i=0,r=e.charCodeAt(0);e:for(;!(t.next<0);t.advance(),i++)if(t.next==r){for(let n=1;n"),tY=nh(Dv,"?>"),OY=nh(Iv,"]]>"),iY=F({Text:d.content,"StartTag StartCloseTag EndTag SelfCloseEndTag":d.angleBracket,TagName:d.tagName,"MismatchedCloseTag/TagName":[d.tagName,d.invalid],AttributeName:d.attributeName,AttributeValue:d.attributeValue,Is:d.definitionOperator,"EntityReference CharacterReference":d.character,Comment:d.blockComment,ProcessingInst:d.processingInstruction,DoctypeDecl:d.documentMeta,Cdata:d.special(d.string)}),gg=Oe.deserialize({version:14,states:",lOQOaOOOrOxO'#CfOzOpO'#CiO!tOaO'#CgOOOP'#Cg'#CgO!{OrO'#CrO#TOtO'#CsO#]OpO'#CtOOOP'#DT'#DTOOOP'#Cv'#CvQQOaOOOOOW'#Cw'#CwO#eOxO,59QOOOP,59Q,59QOOOO'#Cx'#CxO#mOpO,59TO#uO!bO,59TOOOP'#C|'#C|O$TOaO,59RO$[OpO'#CoOOOP,59R,59ROOOQ'#C}'#C}O$dOrO,59^OOOP,59^,59^OOOS'#DO'#DOO$lOtO,59_OOOP,59_,59_O$tOpO,59`O$|OpO,59`OOOP-E6t-E6tOOOW-E6u-E6uOOOP1G.l1G.lOOOO-E6v-E6vO%UO!bO1G.oO%UO!bO1G.oO%dOpO'#CkO%lO!bO'#CyO%zO!bO1G.oOOOP1G.o1G.oOOOP1G.w1G.wOOOP-E6z-E6zOOOP1G.m1G.mO&VOpO,59ZO&_OpO,59ZOOOQ-E6{-E6{OOOP1G.x1G.xOOOS-E6|-E6|OOOP1G.y1G.yO&gOpO1G.zO&gOpO1G.zOOOP1G.z1G.zO&oO!bO7+$ZO&}O!bO7+$ZOOOP7+$Z7+$ZOOOP7+$c7+$cO'YOpO,59VO'bOpO,59VO'mO!bO,59eOOOO-E6w-E6wO'{OpO1G.uO'{OpO1G.uOOOP1G.u1G.uO(TOpO7+$fOOOP7+$f7+$fO(]O!bO<c!|;'S(o;'S;=`)]<%lO(oi>jX|W!O`Or(ors&osv(owx'}x!r(o!r!s?V!s;'S(o;'S;=`)]<%lO(oi?^X|W!O`Or(ors&osv(owx'}x!g(o!g!h?y!h;'S(o;'S;=`)]<%lO(oi@QY|W!O`Or?yrs@psv?yvwA[wxBdx!`?y!`!aCr!a;'S?y;'S;=`Db<%lO?ya@uV!O`Ov@pvxA[x!`@p!`!aAy!a;'S@p;'S;=`B^<%lO@pPA_TO!`A[!`!aAn!a;'SA[;'S;=`As<%lOA[PAsOiPPAvP;=`<%lA[aBQSiP!O`Ov&ox;'S&o;'S;=`'Q<%lO&oaBaP;=`<%l@pXBiX|WOrBdrsA[svBdvwA[w!`Bd!`!aCU!a;'SBd;'S;=`Cl<%lOBdXC]TiP|WOr'}sv'}w;'S'};'S;=`(c<%lO'}XCoP;=`<%lBdiC{ViP|W!O`Or(ors&osv(owx'}x;'S(o;'S;=`)]<%lO(oiDeP;=`<%l?yiDoZ|W!O`Or(ors&osv(owx'}x!e(o!e!fEb!f#V(o#V#WIr#W;'S(o;'S;=`)]<%lO(oiEiX|W!O`Or(ors&osv(owx'}x!f(o!f!gFU!g;'S(o;'S;=`)]<%lO(oiF]X|W!O`Or(ors&osv(owx'}x!c(o!c!dFx!d;'S(o;'S;=`)]<%lO(oiGPX|W!O`Or(ors&osv(owx'}x!v(o!v!wGl!w;'S(o;'S;=`)]<%lO(oiGsX|W!O`Or(ors&osv(owx'}x!c(o!c!dH`!d;'S(o;'S;=`)]<%lO(oiHgX|W!O`Or(ors&osv(owx'}x!}(o!}#OIS#O;'S(o;'S;=`)]<%lO(oiI]V|W!O`yPOr(ors&osv(owx'}x;'S(o;'S;=`)]<%lO(oiIyX|W!O`Or(ors&osv(owx'}x#W(o#W#XJf#X;'S(o;'S;=`)]<%lO(oiJmX|W!O`Or(ors&osv(owx'}x#T(o#T#UKY#U;'S(o;'S;=`)]<%lO(oiKaX|W!O`Or(ors&osv(owx'}x#h(o#h#iK|#i;'S(o;'S;=`)]<%lO(oiLTX|W!O`Or(ors&osv(owx'}x#T(o#T#UH`#U;'S(o;'S;=`)]<%lO(oiLwX|W!O`Or(ors&osv(owx'}x#c(o#c#dMd#d;'S(o;'S;=`)]<%lO(oiMkX|W!O`Or(ors&osv(owx'}x#V(o#V#WNW#W;'S(o;'S;=`)]<%lO(oiN_X|W!O`Or(ors&osv(owx'}x#h(o#h#iNz#i;'S(o;'S;=`)]<%lO(oi! RX|W!O`Or(ors&osv(owx'}x#m(o#m#n! n#n;'S(o;'S;=`)]<%lO(oi! uX|W!O`Or(ors&osv(owx'}x#d(o#d#e!!b#e;'S(o;'S;=`)]<%lO(oi!!iX|W!O`Or(ors&osv(owx'}x#X(o#X#Y?y#Y;'S(o;'S;=`)]<%lO(oi!#_V!SP|W!O`Or(ors&osv(owx'}x;'S(o;'S;=`)]<%lO(ok!$PXaQVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$qo!$wX[UVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$qk!%mZVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_!`$q!`!a!&`!a;'S$q;'S;=`)c<%lO$qk!&kX!RQVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$qk!'aZVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_#P$q#P#Q!(S#Q;'S$q;'S;=`)c<%lO$qk!(]ZVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_!`$q!`!a!)O!a;'S$q;'S;=`)c<%lO$qk!)ZXxQVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$q",tokenizers:[Jv,eY,tY,OY,0,1,2,3,4],topRules:{Document:[0,6]},tokenPrec:0});function Es(O,e){let t=e&&e.getChild("TagName");return t?O.sliceString(t.from,t.to):""}function sh(O,e){let t=e&&e.firstChild;return!t||t.name!="OpenTag"?"":Es(O,t)}function rY(O,e,t){let i=e&&e.getChildren("Attribute").find(n=>n.from<=t&&n.to>=t),r=i&&i.getChild("AttributeName");return r?O.sliceString(r.from,r.to):""}function ah(O){for(let e=O&&O.parent;e;e=e.parent)if(e.name=="Element")return e;return null}function nY(O,e){var t;let i=U(O).resolveInner(e,-1),r=null;for(let n=i;!r&&n.parent;n=n.parent)(n.name=="OpenTag"||n.name=="CloseTag"||n.name=="SelfClosingTag"||n.name=="MismatchedCloseTag")&&(r=n);if(r&&(r.to>e||r.lastChild.type.isError)){let n=r.parent;if(i.name=="TagName")return r.name=="CloseTag"||r.name=="MismatchedCloseTag"?{type:"closeTag",from:i.from,context:n}:{type:"openTag",from:i.from,context:ah(n)};if(i.name=="AttributeName")return{type:"attrName",from:i.from,context:r};if(i.name=="AttributeValue")return{type:"attrValue",from:i.from,context:r};let s=i==r||i.name=="Attribute"?i.childBefore(e):i;return s?.name=="StartTag"?{type:"openTag",from:e,context:ah(n)}:s?.name=="StartCloseTag"&&s.to<=e?{type:"closeTag",from:e,context:n}:s?.name=="Is"?{type:"attrValue",from:e,context:r}:s?{type:"attrName",from:e,context:r}:null}else if(i.name=="StartCloseTag")return{type:"closeTag",from:e,context:i.parent};for(;i.parent&&i.to==e&&!(!((t=i.lastChild)===null||t===void 0)&&t.type.isError);)i=i.parent;return i.name=="Element"||i.name=="Text"||i.name=="Document"?{type:"tag",from:e,context:i.name=="Element"?i:ah(i)}:null}var lh=class{constructor(e,t,i){this.attrs=t,this.attrValues=i,this.children=[],this.name=e.name,this.completion=Object.assign(Object.assign({type:"type"},e.completion||{}),{label:this.name}),this.openCompletion=Object.assign(Object.assign({},this.completion),{label:"<"+this.name}),this.closeCompletion=Object.assign(Object.assign({},this.completion),{label:"",boost:2}),this.closeNameCompletion=Object.assign(Object.assign({},this.completion),{label:this.name+">"}),this.text=e.textContent?e.textContent.map(r=>({label:r,type:"text"})):[]}},oh=/^[:\-\.\w\u00b7-\uffff]*$/;function Pg(O){return Object.assign(Object.assign({type:"property"},O.completion||{}),{label:O.name})}function Sg(O){return typeof O=="string"?{label:`"${O}"`,type:"constant"}:/^"/.test(O.label)?O:Object.assign(Object.assign({},O),{label:`"${O.label}"`})}function sY(O,e){let t=[],i=[],r=Object.create(null);for(let o of e){let l=Pg(o);t.push(l),o.global&&i.push(l),o.values&&(r[o.name]=o.values.map(Sg))}let n=[],s=[],a=Object.create(null);for(let o of O){let l=i,c=r;o.attributes&&(l=l.concat(o.attributes.map(f=>typeof f=="string"?t.find(u=>u.label==f)||{label:f,type:"property"}:(f.values&&(c==r&&(c=Object.create(c)),c[f.name]=f.values.map(Sg)),Pg(f)))));let h=new lh(o,l,c);a[h.name]=h,n.push(h),o.top&&s.push(h)}s.length||(s=n);for(let o=0;o{var l;let{doc:c}=o.state,h=nY(o.state,o.pos);if(!h||h.type=="tag"&&!o.explicit)return null;let{type:f,from:u,context:Q}=h;if(f=="openTag"){let $=s,p=sh(c,Q);if(p){let m=a[p];$=m?.children||n}return{from:u,options:$.map(m=>m.completion),validFor:oh}}else if(f=="closeTag"){let $=sh(c,Q);return $?{from:u,to:o.pos+(c.sliceString(o.pos,o.pos+1)==">"?1:0),options:[((l=a[$])===null||l===void 0?void 0:l.closeNameCompletion)||{label:$+">",type:"type"}],validFor:oh}:null}else if(f=="attrName"){let $=a[Es(c,Q)];return{from:u,options:$?.attrs||i,validFor:oh}}else if(f=="attrValue"){let $=rY(c,Q,u);if(!$)return null;let p=a[Es(c,Q)],m=(p?.attrValues||r)[$];return!m||!m.length?null:{from:u,to:o.pos+(c.sliceString(o.pos,o.pos+1)=='"'?1:0),options:m,validFor:/^"[^"]*"?$/}}else if(f=="tag"){let $=sh(c,Q),p=a[$],m=[],g=Q&&Q.lastChild;$&&(!g||g.name!="CloseTag"||Es(c,g)!=$)&&m.push(p?p.closeCompletion:{label:"",type:"type",boost:2});let P=m.concat((p?.children||(Q?n:s)).map(y=>y.openCompletion));if(Q&&p?.text.length){let y=Q.firstChild;y.to>o.pos-20&&!/\S/.test(o.state.sliceDoc(y.to,o.pos))&&(P=P.concat(p.text))}return{from:u,options:P,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}else return null}}var ch=ne.define({name:"xml",parser:gg.configure({props:[se.add({Element(O){let e=/^\s*<\//.test(O.textAfter);return O.lineIndent(O.node.from)+(e?0:O.unit)},"OpenTag CloseTag SelfClosingTag"(O){return O.column(O.node.from)+O.unit}}),te.add({Element(O){let e=O.firstChild,t=O.lastChild;return!e||e.name!="OpenTag"?null:{from:e.to,to:t.name=="CloseTag"?t.from:O.to}}}),hr.add({"OpenTag CloseTag":O=>O.getChild("TagName")})]}),languageData:{commentTokens:{block:{open:""}},indentOnInput:/^\s*<\/$/}});function Tg(O={}){let e=[ch.data.of({autocomplete:sY(O.elements||[],O.attributes||[])})];return O.autoCloseTags!==!1&&e.push(aY),new J(ch,e)}function Xg(O,e,t=O.length){if(!e)return"";let i=e.firstChild,r=i&&i.getChild("TagName");return r?O.sliceString(r.from,Math.min(r.to,t)):""}var aY=T.inputHandler.of((O,e,t,i,r)=>{if(O.composing||O.state.readOnly||e!=t||i!=">"&&i!="/"||!ch.isActiveAt(O.state,e,-1))return!1;let n=r(),{state:s}=n,a=s.changeByRange(o=>{var l,c,h;let{head:f}=o,u=s.doc.sliceString(f-1,f)==i,Q=U(s).resolveInner(f,-1),$;if(u&&i==">"&&Q.name=="EndTag"){let p=Q.parent;if(((c=(l=p.parent)===null||l===void 0?void 0:l.lastChild)===null||c===void 0?void 0:c.name)!="CloseTag"&&($=Xg(s.doc,p.parent,f))){let m=f+(s.doc.sliceString(f,f+1)===">"?1:0),g=``;return{range:o,changes:{from:f,to:m,insert:g}}}}else if(u&&i=="/"&&Q.name=="StartCloseTag"){let p=Q.parent;if(Q.from==f-2&&((h=p.lastChild)===null||h===void 0?void 0:h.name)!="CloseTag"&&($=Xg(s.doc,p,f))){let m=f+(s.doc.sliceString(f,f+1)===">"?1:0),g=`${$}>`;return{range:S.cursor(f+g.length,-1),changes:{from:f,to:m,insert:g}}}}return{range:o}});return a.changes.empty?!1:(O.dispatch([n,s.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)});var xi=63,bg=64,oY=1,lY=2,kg=3,cY=4,wg=5,hY=6,fY=7,Zg=65,dY=66,uY=8,QY=9,$Y=10,pY=11,mY=12,vg=13,gY=19,PY=20,SY=29,XY=33,TY=34,bY=47,yY=0,$h=1,fh=2,Cr=3,dh=4,At=class{constructor(e,t,i){this.parent=e,this.depth=t,this.type=i,this.hash=(e?e.hash+e.hash<<8:0)+t+(t<<4)+i}};At.top=new At(null,-1,yY);function jr(O,e){for(let t=0,i=e-O.pos-1;;i--,t++){let r=O.peek(i);if(Lt(r)||r==-1)return t}}function uh(O){return O==32||O==9}function Lt(O){return O==10||O==13}function Yg(O){return uh(O)||Lt(O)}function AO(O){return O<0||Yg(O)}var xY=new Ge({start:At.top,reduce(O,e){return O.type==Cr&&(e==PY||e==TY)?O.parent:O},shift(O,e,t,i){if(e==kg)return new At(O,jr(i,i.pos),$h);if(e==Zg||e==wg)return new At(O,jr(i,i.pos),fh);if(e==xi)return O.parent;if(e==gY||e==XY)return new At(O,0,Cr);if(e==vg&&O.type==dh)return O.parent;if(e==bY){let r=/[1-9]/.exec(i.read(i.pos,t.pos));if(r)return new At(O,O.depth+ +r[0],dh)}return O},hash(O){return O.hash}});function ki(O,e,t=0){return O.peek(t)==e&&O.peek(t+1)==e&&O.peek(t+2)==e&&AO(O.peek(t+3))}var kY=new z((O,e)=>{if(O.next==-1&&e.canShift(bg))return O.acceptToken(bg);let t=O.peek(-1);if((Lt(t)||t<0)&&e.context.type!=Cr){if(ki(O,45))if(e.canShift(xi))O.acceptToken(xi);else return O.acceptToken(oY,3);if(ki(O,46))if(e.canShift(xi))O.acceptToken(xi);else return O.acceptToken(lY,3);let i=0;for(;O.next==32;)i++,O.advance();(i{if(e.context.type==Cr){O.next==63&&(O.advance(),AO(O.next)&&O.acceptToken(fY));return}if(O.next==45)O.advance(),AO(O.next)&&O.acceptToken(e.context.type==$h&&e.context.depth==jr(O,O.pos-1)?cY:kg);else if(O.next==63)O.advance(),AO(O.next)&&O.acceptToken(e.context.type==fh&&e.context.depth==jr(O,O.pos-1)?hY:wg);else{let t=O.pos;for(;;)if(uh(O.next)){if(O.pos==t)return;O.advance()}else if(O.next==33)_g(O);else if(O.next==38)Qh(O);else if(O.next==42){Qh(O);break}else if(O.next==39||O.next==34){if(ph(O,!0))break;return}else if(O.next==91||O.next==123){if(!vY(O))return;break}else{Rg(O,!0,!1,0);break}for(;uh(O.next);)O.advance();if(O.next==58){if(O.pos==t&&e.canShift(SY))return;let i=O.peek(1);AO(i)&&O.acceptTokenTo(e.context.type==fh&&e.context.depth==jr(O,t)?dY:Zg,t)}}},{contextual:!0});function ZY(O){return O>32&&O<127&&O!=34&&O!=37&&O!=44&&O!=60&&O!=62&&O!=92&&O!=94&&O!=96&&O!=123&&O!=124&&O!=125}function yg(O){return O>=48&&O<=57||O>=97&&O<=102||O>=65&&O<=70}function xg(O,e){return O.next==37?(O.advance(),yg(O.next)&&O.advance(),yg(O.next)&&O.advance(),!0):ZY(O.next)||e&&O.next==44?(O.advance(),!0):!1}function _g(O){if(O.advance(),O.next==60){for(O.advance();;)if(!xg(O,!0)){O.next==62&&O.advance();break}}else for(;xg(O,!1););}function Qh(O){for(O.advance();!AO(O.next)&&As(O.tag)!="f";)O.advance()}function ph(O,e){let t=O.next,i=!1,r=O.pos;for(O.advance();;){let n=O.next;if(n<0)break;if(O.advance(),n==t)if(n==39)if(O.next==39)O.advance();else break;else break;else if(n==92&&t==34)O.next>=0&&O.advance();else if(Lt(n)){if(e)return!1;i=!0}else if(e&&O.pos>=r+1024)return!1}return!i}function vY(O){for(let e=[],t=O.pos+1024;;)if(O.next==91||O.next==123)e.push(O.next),O.advance();else if(O.next==39||O.next==34){if(!ph(O,!0))return!1}else if(O.next==93||O.next==125){if(e[e.length-1]!=O.next-2)return!1;if(e.pop(),O.advance(),!e.length)return!0}else{if(O.next<0||O.pos>t||Lt(O.next))return!1;O.advance()}}var YY="iiisiiissisfissssssssssssisssiiissssssssssssssssssssssssssfsfssissssssssssssssssssssssssssfif";function As(O){return O<33?"u":O>125?"s":YY[O-33]}function hh(O,e){let t=As(O);return t!="u"&&!(e&&t=="f")}function Rg(O,e,t,i){if(As(O.next)=="s"||(O.next==63||O.next==58||O.next==45)&&hh(O.peek(1),t))O.advance();else return!1;let r=O.pos;for(;;){let n=O.next,s=0,a=i+1;for(;Yg(n);){if(Lt(n)){if(e)return!1;a=0}else a++;n=O.peek(++s)}if(!(n>=0&&(n==58?hh(O.peek(s+1),t):n==35?O.peek(s-1)!=32:hh(n,t)))||!t&&a<=i||a==0&&!t&&(ki(O,45,s)||ki(O,46,s)))break;if(e&&As(n)=="f")return!1;for(let l=s;l>=0;l--)O.advance();if(e&&O.pos>r+1024)return!1}return!0}var _Y=new z((O,e)=>{if(O.next==33)_g(O),O.acceptToken(mY);else if(O.next==38||O.next==42){let t=O.next==38?$Y:pY;Qh(O),O.acceptToken(t)}else O.next==39||O.next==34?(ph(O,!1),O.acceptToken(QY)):Rg(O,!1,e.context.type==Cr,e.context.depth)&&O.acceptToken(uY)}),RY=new z((O,e)=>{let t=e.context.type==dh?e.context.depth:-1,i=O.pos;e:for(;;){let r=0,n=O.next;for(;n==32;)n=O.peek(++r);if(!r&&(ki(O,45,r)||ki(O,46,r))||!Lt(n)&&(t<0&&(t=Math.max(e.context.depth+1,r)),rYAN>Y",stateData:";S~O!fOS!gOS^OS~OP_OQbORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!V[O!cTO~O`cO~P]OVkOWROXROYeOZfO[dOcPOmhOqQO~OboO~P!bOVtOWROXROYeOZfO[dOcPOmrOqQO~OpwO~P#WORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!cTO~OSvP!avP!bvP~P#|OWROXROYeOZfO[dOcPOqQO~OmzO~P%OOm!OOUzP!azP!bzP!dzP~P#|O^!SO!b!QO!f!TO!g!RO~ORSOTUOWROXROcPOqQO!PVO!cTO~OY!UOP!QXQ!QX!V!QX!`!QXS!QX!a!QX!b!QXU!QXm!QX!d!QX~P&aO[!WOP!SXQ!SX!V!SX!`!SXS!SX!a!SX!b!SXU!SXm!SX!d!SX~P&aO^!ZO!W![O!b!YO!f!]O!g!YO~OP!_O!V[OQaX!`aX~OPaXQaX!VaX!`aX~P#|OP!bOQ!cO!V[O~OP_O!V[O~P#|OWROXROY!fOcPOqQObfXmfXofXpfX~OWROXRO[!hOcPOqQObhXmhXohXphX~ObeXmlXoeX~ObkXokX~P%OOm!kO~Om!lObnPonP~P%OOb!pOo!oO~Ob!pO~P!bOm!sOosXpsX~OosXpsX~P%OOm!uOotPptP~P%OOo!xOp!yO~Op!yO~P#WOS!|O!a#OO!b#OO~OUyX!ayX!byX!dyX~P#|Om#QO~OU#SO!a#UO!b#UO!d#RO~Om#WOUzX!azX!bzX!dzX~O]#XO~O!b#XO!g#YO~O^#ZO!b#XO!g#YO~OP!RXQ!RX!V!RX!`!RXS!RX!a!RX!b!RXU!RXm!RX!d!RX~P&aOP!TXQ!TX!V!TX!`!TXS!TX!a!TX!b!TXU!TXm!TX!d!TX~P&aO!b#^O!g#^O~O^#_O!b#^O!f#`O!g#^O~O^#_O!W#aO!b#^O!g#^O~OPaaQaa!Vaa!`aa~P#|OP#cO!V[OQ!XX!`!XX~OP!XXQ!XX!V!XX!`!XX~P#|OP_O!V[OQ!_X!`!_X~P#|OWROXROcPOqQObgXmgXogXpgX~OWROXROcPOqQObiXmiXoiXpiX~Obkaoka~P%OObnXonX~P%OOm#kO~Ob#lOo!oO~Oosapsa~P%OOotXptX~P%OOm#pO~Oo!xOp#qO~OSwP!awP!bwP~P#|OS!|O!a#vO!b#vO~OUya!aya!bya!dya~P#|Om#xO~P%OOm#{OU}P!a}P!b}P!d}P~P#|OU#SO!a$OO!b$OO!d#RO~O]$QO~O!b$QO!g$RO~O!b$SO!g$SO~O^$TO!b$SO!g$SO~O^$TO!b$SO!f$UO!g$SO~OP!XaQ!Xa!V!Xa!`!Xa~P#|Obnaona~P%OOotapta~P%OOo!xO~OU|X!a|X!b|X!d|X~P#|Om$ZO~Om$]OU}X!a}X!b}X!d}X~O]$^O~O!b$_O!g$_O~O^$`O!b$_O!g$_O~OU|a!a|a!b|a!d|a~P#|O!b$cO!g$cO~O",goto:",]!mPPPPPPPPPPPPPPPPP!nPP!v#v#|$`#|$c$f$j$nP%VPPP!v%Y%^%a%{&O%a&R&U&X&_&b%aP&e&{&e'O'RPP']'a'g'm's'y(XPPPPPPPP(_)e*X+c,VUaObcR#e!c!{ROPQSTUXY_bcdehknrtvz!O!U!W!_!b!c!f!h!k!l!s!u!|#Q#R#S#W#c#k#p#x#{$Z$]QmPR!qnqfPQThknrtv!k!l!s!u#R#k#pR!gdR!ieTlPnTjPnSiPnSqQvQ{TQ!mkQ!trQ!vtR#y#RR!nkTsQvR!wt!RWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]RySR#t!|R|TR|UQ!PUR#|#SR#z#RR#z#SyZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]R!VXR!XYa]O^abc!a!c!eT!da!eQnPR!rnQvQR!{vQ!}yR#u!}Q#T|R#}#TW^Obc!cS!^^!aT!aa!eQ!eaR#f!eW`Obc!cQxSS}U#SQ!`_Q#PzQ#V!OQ#b!_Q#d!bQ#s!|Q#w#QQ$P#WQ$V#cQ$Y#xQ$[#{Q$a$ZR$b$]xZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]Q!VXQ!XYQ#[!UR#]!W!QWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]pfPQThknrtv!k!l!s!u#R#k#pQ!gdQ!ieQ#g!fR#h!hSgPn^pQTkrtv#RQ!jhQ#i!kQ#j!lQ#n!sQ#o!uQ$W#kR$X#pQuQR!zv",nodeNames:"\u26A0 DirectiveEnd DocEnd - - ? ? ? Literal QuotedLiteral Anchor Alias Tag BlockLiteralContent Comment Stream BOM Document ] [ FlowSequence Item Tagged Anchored Anchored Tagged FlowMapping Pair Key : Pair , } { FlowMapping Pair Pair BlockSequence Item Item BlockMapping Pair Pair Key Pair Pair BlockLiteral BlockLiteralHeader Tagged Anchored Anchored Tagged Directive DirectiveName DirectiveContent Document",maxTerm:74,context:xY,nodeProps:[["isolate",-3,8,9,14,""],["openedBy",18,"[",32,"{"],["closedBy",19,"]",33,"}"]],propSources:[VY],skippedNodes:[0],repeatNodeCount:6,tokenData:"-Y~RnOX#PXY$QYZ$]Z]#P]^$]^p#Ppq$Qqs#Pst$btu#Puv$yv|#P|}&e}![#P![!]'O!]!`#P!`!a'i!a!}#P!}#O*g#O#P#P#P#Q+Q#Q#o#P#o#p+k#p#q'i#q#r,U#r;'S#P;'S;=`#z<%l?HT#P?HT?HU,o?HUO#PQ#UU!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PQ#kTOY#PZs#Pt;'S#P;'S;=`#z<%lO#PQ#}P;=`<%l#P~$VQ!f~XY$Qpq$Q~$bO!g~~$gS^~OY$bZ;'S$b;'S;=`$s<%lO$b~$vP;=`<%l$bR%OX!WQOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR%rX!WQ!VPOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR&bP;=`<%l%kR&lUoP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'VUmP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'p[!PP!WQOY#PZp#Ppq#hq{#P{|(f|}#P}!O(f!O!R#P!R![)p![;'S#P;'S;=`#z<%lO#PR(mW!PP!WQOY#PZp#Ppq#hq!R#P!R![)V![;'S#P;'S;=`#z<%lO#PR)^U!PP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR)wY!PP!WQOY#PZp#Ppq#hq{#P{|)V|}#P}!O)V!O;'S#P;'S;=`#z<%lO#PR*nUcP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+XUbP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+rUqP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,]UpP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,vU`P!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#P",tokenizers:[kY,wY,_Y,RY,0,1],topRules:{Stream:[0,15]},tokenPrec:0});var qY=Oe.deserialize({version:14,states:"!vOQOPOOO]OPO'#C_OhOPO'#C^OOOO'#Cc'#CcOpOPO'#CaQOOOOOO{OPOOOOOO'#Cb'#CbO!WOPO'#C`O!`OPO,58xOOOO-E6a-E6aOOOO-E6`-E6`OOOO'#C_'#C_OOOO1G.d1G.d",stateData:"!h~OXPOYROWTP~OWVXXRXYRX~OYVOXSP~OXROYROWTX~OXROYROWTP~OYVOXSX~OX[O~OXY~",goto:"vWPPX[beioRUOQQOR]XRXQTTOUQWQRZWSSOURYS",nodeNames:"\u26A0 Document Frontmatter DashLine FrontmatterContent Body",maxTerm:10,skippedNodes:[0],repeatNodeCount:2,tokenData:"$z~RXOYnYZ!^Z]n]^!^^}n}!O!i!O;'Sn;'S;=`!c<%lOn~qXOYnYZ!^Z]n]^!^^;'Sn;'S;=`!c<%l~n~On~~!^~!cOY~~!fP;=`<%ln~!lZOYnYZ!^Z]n]^!^^}n}!O#_!O;'Sn;'S;=`!c<%l~n~On~~!^~#bZOYnYZ!^Z]n]^!^^}n}!O$T!O;'Sn;'S;=`!c<%l~n~On~~!^~$WXOYnYZ$sZ]n]^$s^;'Sn;'S;=`!c<%l~n~On~~$s~$zOX~Y~",tokenizers:[0],topRules:{Document:[0,1]},tokenPrec:67}),zY=ne.define({name:"yaml",parser:Vg.configure({props:[se.add({Stream:O=>{for(let e=O.node.resolve(O.pos,-1);e&&e.to>=O.pos;e=e.parent){if(e.name=="BlockLiteralContent"&&e.fromO.pos)return null}}return null},FlowMapping:be({closing:"}"}),FlowSequence:be({closing:"]"})}),te.add({"FlowMapping FlowSequence":me,"Item Pair BlockLiteral":(O,e)=>({from:e.doc.lineAt(O.from).to,to:O.to})})]}),languageData:{commentTokens:{line:"#"},indentOnInput:/^\s*[\]\}]$/}});function qg(){return new J(zY)}var nV=ne.define({name:"yaml-frontmatter",parser:qY.configure({props:[F({DashLine:d.meta})]})});function UY({canWrap:O,isDisabled:e,isLive:t,isLiveDebounced:i,isLiveOnBlur:r,liveDebounce:n,language:s,state:a}){return{editor:null,themeCompartment:new FO,isDocChanged:!1,state:a,init(){let o=this.getLanguageExtension(),l=Alpine.debounce(()=>this.$wire.commit(),n??300);this.editor=new T({parent:this.$refs.editor,state:I.create({doc:this.state,extensions:[t$,Xt.of([QQ]),...O?[T.lineWrapping]:[],I.readOnly.of(e),T.editable.of(!e),T.updateListener.of(c=>{c.docChanged&&(this.isDocChanged=!0,this.state=c.state.doc.toString(),!r&&(t||i)&&l())}),T.domEventHandlers({blur:(c,h)=>{r&&this.isDocChanged&&this.$wire.$commit()}}),...o?[o]:[],this.themeCompartment.of(this.getThemeExtensions())]})}),this.$watch("state",()=>{this.state!==void 0&&this.editor.state.doc.toString()!==this.state&&this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length,insert:this.state}})}),this.themeObserver=new MutationObserver(()=>{this.editor.dispatch({effects:this.themeCompartment.reconfigure(this.getThemeExtensions())})}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]})},isDarkMode(){return document.documentElement.classList.contains("dark")},getThemeExtensions(){return this.isDarkMode()?[a$]:[]},getLanguageExtension(){return s&&{cpp:g$,css:ys,go:W$,html:Ti,java:Zp,javascript:ks,json:Yp,markdown:Tm,php:vm,python:Nm,sql:hg,xml:Tg,yaml:qg}[s]?.()||null},destroy(){this.themeObserver&&(this.themeObserver.disconnect(),this.themeObserver=null),this.editor&&(this.editor.destroy(),this.editor=null)}}}export{UY as default}; diff --git a/public/js/filament/forms/components/color-picker.js b/public/js/filament/forms/components/color-picker.js index 67e4f5d6ff..3b52c370bc 100644 --- a/public/js/filament/forms/components/color-picker.js +++ b/public/js/filament/forms/components/color-picker.js @@ -1 +1 @@ -var c=(e,t=0,r=1)=>e>r?r:eMath.round(r*e)/r;var nt={grad:360/400,turn:360,rad:360/(Math.PI*2)},F=e=>G(b(e)),b=e=>(e[0]==="#"&&(e=e.substr(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:1}:{r:parseInt(e.substr(0,2),16),g:parseInt(e.substr(2,2),16),b:parseInt(e.substr(4,2),16),a:1}),it=(e,t="deg")=>Number(e)*(nt[t]||1),lt=e=>{let r=/hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?ct({h:it(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:r[5]===void 0?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},J=lt,ct=({h:e,s:t,l:r,a:o})=>(t*=(r<50?r:100-r)/100,{h:e,s:t>0?2*t/(r+t)*100:0,v:r+t,a:o}),X=e=>pt(A(e)),Y=({h:e,s:t,v:r,a:o})=>{let s=(200-t)*r/100;return{h:n(e),s:n(s>0&&s<200?t*r/100/(s<=100?s:200-s)*100:0),l:n(s/2),a:n(o,2)}};var d=e=>{let{h:t,s:r,l:o}=Y(e);return`hsl(${t}, ${r}%, ${o}%)`},v=e=>{let{h:t,s:r,l:o,a:s}=Y(e);return`hsla(${t}, ${r}%, ${o}%, ${s})`},A=({h:e,s:t,v:r,a:o})=>{e=e/360*6,t=t/100,r=r/100;let s=Math.floor(e),a=r*(1-t),i=r*(1-(e-s)*t),l=r*(1-(1-e+s)*t),N=s%6;return{r:n([r,i,a,a,l,r][N]*255),g:n([l,r,r,i,a,a][N]*255),b:n([a,a,l,r,r,i][N]*255),a:n(o,2)}},B=e=>{let{r:t,g:r,b:o}=A(e);return`rgb(${t}, ${r}, ${o})`},D=e=>{let{r:t,g:r,b:o,a:s}=A(e);return`rgba(${t}, ${r}, ${o}, ${s})`};var L=e=>{let r=/rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?G({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:r[7]===void 0?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},U=L,q=e=>{let t=e.toString(16);return t.length<2?"0"+t:t},pt=({r:e,g:t,b:r})=>"#"+q(e)+q(t)+q(r),G=({r:e,g:t,b:r,a:o})=>{let s=Math.max(e,t,r),a=s-Math.min(e,t,r),i=a?s===e?(t-r)/a:s===t?2+(r-e)/a:4+(e-t)/a:0;return{h:n(60*(i<0?i+6:i)),s:n(s?a/s*100:0),v:n(s/255*100),a:o}};var O=(e,t)=>{if(e===t)return!0;for(let r in e)if(e[r]!==t[r])return!1;return!0},h=(e,t)=>e.replace(/\s/g,"")===t.replace(/\s/g,""),K=(e,t)=>e.toLowerCase()===t.toLowerCase()?!0:O(b(e),b(t));var Q={},$=e=>{let t=Q[e];return t||(t=document.createElement("template"),t.innerHTML=e,Q[e]=t),t},f=(e,t,r)=>{e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:r}))};var m=!1,I=e=>"touches"in e,ut=e=>m&&!I(e)?!1:(m||(m=I(e)),!0),W=(e,t)=>{let r=I(t)?t.touches[0]:t,o=e.el.getBoundingClientRect();f(e.el,"move",e.getMove({x:c((r.pageX-(o.left+window.pageXOffset))/o.width),y:c((r.pageY-(o.top+window.pageYOffset))/o.height)}))},dt=(e,t)=>{let r=t.keyCode;r>40||e.xy&&r<37||r<33||(t.preventDefault(),f(e.el,"move",e.getMove({x:r===39?.01:r===37?-.01:r===34?.05:r===33?-.05:r===35?1:r===36?-1:0,y:r===40?.01:r===38?-.01:0},!0)))},u=class{constructor(t,r,o,s){let a=$(`
`);t.appendChild(a.content.cloneNode(!0));let i=t.querySelector(`[part=${r}]`);i.addEventListener("mousedown",this),i.addEventListener("touchstart",this),i.addEventListener("keydown",this),this.el=i,this.xy=s,this.nodes=[i.firstChild,i]}set dragging(t){let r=t?document.addEventListener:document.removeEventListener;r(m?"touchmove":"mousemove",this),r(m?"touchend":"mouseup",this)}handleEvent(t){switch(t.type){case"mousedown":case"touchstart":if(t.preventDefault(),!ut(t)||!m&&t.button!=0)return;this.el.focus(),W(this,t),this.dragging=!0;break;case"mousemove":case"touchmove":t.preventDefault(),W(this,t);break;case"mouseup":case"touchend":this.dragging=!1;break;case"keydown":dt(this,t);break}}style(t){t.forEach((r,o)=>{for(let s in r)this.nodes[o].style.setProperty(s,r[s])})}};var S=class extends u{constructor(t){super(t,"hue",'aria-label="Hue" aria-valuemin="0" aria-valuemax="360"',!1)}update({h:t}){this.h=t,this.style([{left:`${t/360*100}%`,color:d({h:t,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuenow",`${n(t)}`)}getMove(t,r){return{h:r?c(this.h+t.x*360,0,360):360*t.x}}};var H=class extends u{constructor(t){super(t,"saturation",'aria-label="Color"',!0)}update(t){this.hsva=t,this.style([{top:`${100-t.v}%`,left:`${t.s}%`,color:d(t)},{"background-color":d({h:t.h,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuetext",`Saturation ${n(t.s)}%, Brightness ${n(t.v)}%`)}getMove(t,r){return{s:r?c(this.hsva.s+t.x*100,0,100):t.x*100,v:r?c(this.hsva.v-t.y*100,0,100):Math.round(100-t.y*100)}}};var Z=":host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{display:block;content:'';position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}";var tt="[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}";var rt="[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}";var T=Symbol("same"),et=Symbol("color"),ot=Symbol("hsva"),R=Symbol("change"),_=Symbol("update"),st=Symbol("parts"),g=Symbol("css"),x=Symbol("sliders"),p=class extends HTMLElement{static get observedAttributes(){return["color"]}get[g](){return[Z,tt,rt]}get[x](){return[H,S]}get color(){return this[et]}set color(t){if(!this[T](t)){let r=this.colorModel.toHsva(t);this[_](r),this[R](t)}}constructor(){super();let t=$(``),r=this.attachShadow({mode:"open"});r.appendChild(t.content.cloneNode(!0)),r.addEventListener("move",this),this[st]=this[x].map(o=>new o(r))}connectedCallback(){if(this.hasOwnProperty("color")){let t=this.color;delete this.color,this.color=t}else this.color||(this.color=this.colorModel.defaultColor)}attributeChangedCallback(t,r,o){let s=this.colorModel.fromAttr(o);this[T](s)||(this.color=s)}handleEvent(t){let r=this[ot],o={...r,...t.detail};this[_](o);let s;!O(o,r)&&!this[T](s=this.colorModel.fromHsva(o))&&this[R](s)}[T](t){return this.color&&this.colorModel.equal(t,this.color)}[_](t){this[ot]=t,this[st].forEach(r=>r.update(t))}[R](t){this[et]=t,f(this,"color-changed",{value:t})}};var ht={defaultColor:"#000",toHsva:F,fromHsva:X,equal:K,fromAttr:e=>e},y=class extends p{get colorModel(){return ht}};var P=class extends y{};customElements.define("hex-color-picker",P);var mt={defaultColor:"hsl(0, 0%, 0%)",toHsva:J,fromHsva:d,equal:h,fromAttr:e=>e},w=class extends p{get colorModel(){return mt}};var z=class extends w{};customElements.define("hsl-string-color-picker",z);var ft={defaultColor:"rgb(0, 0, 0)",toHsva:U,fromHsva:B,equal:h,fromAttr:e=>e},M=class extends p{get colorModel(){return ft}};var V=class extends M{};customElements.define("rgb-string-color-picker",V);var k=class extends u{constructor(t){super(t,"alpha",'aria-label="Alpha" aria-valuemin="0" aria-valuemax="1"',!1)}update(t){this.hsva=t;let r=v({...t,a:0}),o=v({...t,a:1}),s=t.a*100;this.style([{left:`${s}%`,color:v(t)},{"--gradient":`linear-gradient(90deg, ${r}, ${o}`}]);let a=n(s);this.el.setAttribute("aria-valuenow",`${a}`),this.el.setAttribute("aria-valuetext",`${a}%`)}getMove(t,r){return{a:r?c(this.hsva.a+t.x):t.x}}};var at=`[part=alpha]{flex:0 0 24px}[part=alpha]::after{display:block;content:'';position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit;background-image:var(--gradient);box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part^=alpha]{background-color:#fff;background-image:url('data:image/svg+xml,')}[part=alpha-pointer]{top:50%}`;var C=class extends p{get[g](){return[...super[g],at]}get[x](){return[...super[x],k]}};var gt={defaultColor:"rgba(0, 0, 0, 1)",toHsva:L,fromHsva:D,equal:h,fromAttr:e=>e},E=class extends C{get colorModel(){return gt}};var j=class extends E{};customElements.define("rgba-string-color-picker",j);function xt({isAutofocused:e,isDisabled:t,isLive:r,isLiveDebounced:o,isLiveOnBlur:s,liveDebounce:a,state:i}){return{state:i,init:function(){this.state===null||this.state===""||this.setState(this.state),e&&this.togglePanelVisibility(this.$refs.input),this.$refs.input.addEventListener("change",l=>{this.setState(l.target.value)}),this.$refs.panel.addEventListener("color-changed",l=>{this.setState(l.detail.value),!(s||!(r||o))&&setTimeout(()=>{this.state===l.detail.value&&this.commitState()},o?a:250)}),(r||o||s)&&new MutationObserver(()=>this.isOpen()?null:this.commitState()).observe(this.$refs.panel,{attributes:!0,childList:!0})},togglePanelVisibility:function(){t||this.$refs.panel.toggle(this.$refs.input)},setState:function(l){this.state=l,this.$refs.input.value=l,this.$refs.panel.color=l},isOpen:function(){return this.$refs.panel.style.display==="block"},commitState:function(){JSON.stringify(this.$wire.__instance.canonical)!==JSON.stringify(this.$wire.__instance.ephemeral)&&this.$wire.$commit()}}}export{xt as default}; +var c=(e,t=0,r=1)=>e>r?r:eMath.round(r*e)/r;var at={grad:360/400,turn:360,rad:360/(Math.PI*2)},F=e=>G(v(e)),v=e=>(e[0]==="#"&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?a(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:e.length===8?a(parseInt(e.substring(6,8),16)/255,2):1}),nt=(e,t="deg")=>Number(e)*(at[t]||1),it=e=>{let r=/hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?lt({h:nt(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:r[5]===void 0?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},J=it,lt=({h:e,s:t,l:r,a:o})=>(t*=(r<50?r:100-r)/100,{h:e,s:t>0?2*t/(r+t)*100:0,v:r+t,a:o}),X=e=>ct(A(e)),Y=({h:e,s:t,v:r,a:o})=>{let s=(200-t)*r/100;return{h:a(e),s:a(s>0&&s<200?t*r/100/(s<=100?s:200-s)*100:0),l:a(s/2),a:a(o,2)}};var d=e=>{let{h:t,s:r,l:o}=Y(e);return`hsl(${t}, ${r}%, ${o}%)`},$=e=>{let{h:t,s:r,l:o,a:s}=Y(e);return`hsla(${t}, ${r}%, ${o}%, ${s})`},A=({h:e,s:t,v:r,a:o})=>{e=e/360*6,t=t/100,r=r/100;let s=Math.floor(e),n=r*(1-t),i=r*(1-(e-s)*t),l=r*(1-(1-e+s)*t),q=s%6;return{r:a([r,i,n,n,l,r][q]*255),g:a([l,r,r,i,n,n][q]*255),b:a([n,n,l,r,r,i][q]*255),a:a(o,2)}},B=e=>{let{r:t,g:r,b:o}=A(e);return`rgb(${t}, ${r}, ${o})`},D=e=>{let{r:t,g:r,b:o,a:s}=A(e);return`rgba(${t}, ${r}, ${o}, ${s})`};var I=e=>{let r=/rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?G({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:r[7]===void 0?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},U=I,b=e=>{let t=e.toString(16);return t.length<2?"0"+t:t},ct=({r:e,g:t,b:r,a:o})=>{let s=o<1?b(a(o*255)):"";return"#"+b(e)+b(t)+b(r)+s},G=({r:e,g:t,b:r,a:o})=>{let s=Math.max(e,t,r),n=s-Math.min(e,t,r),i=n?s===e?(t-r)/n:s===t?2+(r-e)/n:4+(e-t)/n:0;return{h:a(60*(i<0?i+6:i)),s:a(s?n/s*100:0),v:a(s/255*100),a:o}};var L=(e,t)=>{if(e===t)return!0;for(let r in e)if(e[r]!==t[r])return!1;return!0},h=(e,t)=>e.replace(/\s/g,"")===t.replace(/\s/g,""),K=(e,t)=>e.toLowerCase()===t.toLowerCase()?!0:L(v(e),v(t));var Q={},H=e=>{let t=Q[e];return t||(t=document.createElement("template"),t.innerHTML=e,Q[e]=t),t},f=(e,t,r)=>{e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:r}))};var m=!1,O=e=>"touches"in e,pt=e=>m&&!O(e)?!1:(m||(m=O(e)),!0),W=(e,t)=>{let r=O(t)?t.touches[0]:t,o=e.el.getBoundingClientRect();f(e.el,"move",e.getMove({x:c((r.pageX-(o.left+window.pageXOffset))/o.width),y:c((r.pageY-(o.top+window.pageYOffset))/o.height)}))},ut=(e,t)=>{let r=t.keyCode;r>40||e.xy&&r<37||r<33||(t.preventDefault(),f(e.el,"move",e.getMove({x:r===39?.01:r===37?-.01:r===34?.05:r===33?-.05:r===35?1:r===36?-1:0,y:r===40?.01:r===38?-.01:0},!0)))},u=class{constructor(t,r,o,s){let n=H(`
`);t.appendChild(n.content.cloneNode(!0));let i=t.querySelector(`[part=${r}]`);i.addEventListener("mousedown",this),i.addEventListener("touchstart",this),i.addEventListener("keydown",this),this.el=i,this.xy=s,this.nodes=[i.firstChild,i]}set dragging(t){let r=t?document.addEventListener:document.removeEventListener;r(m?"touchmove":"mousemove",this),r(m?"touchend":"mouseup",this)}handleEvent(t){switch(t.type){case"mousedown":case"touchstart":if(t.preventDefault(),!pt(t)||!m&&t.button!=0)return;this.el.focus(),W(this,t),this.dragging=!0;break;case"mousemove":case"touchmove":t.preventDefault(),W(this,t);break;case"mouseup":case"touchend":this.dragging=!1;break;case"keydown":ut(this,t);break}}style(t){t.forEach((r,o)=>{for(let s in r)this.nodes[o].style.setProperty(s,r[s])})}};var S=class extends u{constructor(t){super(t,"hue",'aria-label="Hue" aria-valuemin="0" aria-valuemax="360"',!1)}update({h:t}){this.h=t,this.style([{left:`${t/360*100}%`,color:d({h:t,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuenow",`${a(t)}`)}getMove(t,r){return{h:r?c(this.h+t.x*360,0,360):360*t.x}}};var T=class extends u{constructor(t){super(t,"saturation",'aria-label="Color"',!0)}update(t){this.hsva=t,this.style([{top:`${100-t.v}%`,left:`${t.s}%`,color:d(t)},{"background-color":d({h:t.h,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuetext",`Saturation ${a(t.s)}%, Brightness ${a(t.v)}%`)}getMove(t,r){return{s:r?c(this.hsva.s+t.x*100,0,100):t.x*100,v:r?c(this.hsva.v-t.y*100,0,100):Math.round(100-t.y*100)}}};var Z=':host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:"";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}';var tt="[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}";var rt="[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}";var w=Symbol("same"),R=Symbol("color"),et=Symbol("hsva"),_=Symbol("update"),ot=Symbol("parts"),g=Symbol("css"),x=Symbol("sliders"),p=class extends HTMLElement{static get observedAttributes(){return["color"]}get[g](){return[Z,tt,rt]}get[x](){return[T,S]}get color(){return this[R]}set color(t){if(!this[w](t)){let r=this.colorModel.toHsva(t);this[_](r),this[R]=t}}constructor(){super();let t=H(``),r=this.attachShadow({mode:"open"});r.appendChild(t.content.cloneNode(!0)),r.addEventListener("move",this),this[ot]=this[x].map(o=>new o(r))}connectedCallback(){if(this.hasOwnProperty("color")){let t=this.color;delete this.color,this.color=t}else this.color||(this.color=this.colorModel.defaultColor)}attributeChangedCallback(t,r,o){let s=this.colorModel.fromAttr(o);this[w](s)||(this.color=s)}handleEvent(t){let r=this[et],o={...r,...t.detail};this[_](o);let s;!L(o,r)&&!this[w](s=this.colorModel.fromHsva(o))&&(this[R]=s,f(this,"color-changed",{value:s}))}[w](t){return this.color&&this.colorModel.equal(t,this.color)}[_](t){this[et]=t,this[ot].forEach(r=>r.update(t))}};var dt={defaultColor:"#000",toHsva:F,fromHsva:({h:e,s:t,v:r})=>X({h:e,s:t,v:r,a:1}),equal:K,fromAttr:e=>e},y=class extends p{get colorModel(){return dt}};var P=class extends y{};customElements.define("hex-color-picker",P);var ht={defaultColor:"hsl(0, 0%, 0%)",toHsva:J,fromHsva:d,equal:h,fromAttr:e=>e},M=class extends p{get colorModel(){return ht}};var z=class extends M{};customElements.define("hsl-string-color-picker",z);var mt={defaultColor:"rgb(0, 0, 0)",toHsva:U,fromHsva:B,equal:h,fromAttr:e=>e},C=class extends p{get colorModel(){return mt}};var V=class extends C{};customElements.define("rgb-string-color-picker",V);var k=class extends u{constructor(t){super(t,"alpha",'aria-label="Alpha" aria-valuemin="0" aria-valuemax="1"',!1)}update(t){this.hsva=t;let r=$({...t,a:0}),o=$({...t,a:1}),s=t.a*100;this.style([{left:`${s}%`,color:$(t)},{"--gradient":`linear-gradient(90deg, ${r}, ${o}`}]);let n=a(s);this.el.setAttribute("aria-valuenow",`${n}`),this.el.setAttribute("aria-valuetext",`${n}%`)}getMove(t,r){return{a:r?c(this.hsva.a+t.x):t.x}}};var st=`[part=alpha]{flex:0 0 24px}[part=alpha]::after{display:block;content:"";position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit;background-image:var(--gradient);box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part^=alpha]{background-color:#fff;background-image:url('data:image/svg+xml,')}[part=alpha-pointer]{top:50%}`;var E=class extends p{get[g](){return[...super[g],st]}get[x](){return[...super[x],k]}};var ft={defaultColor:"rgba(0, 0, 0, 1)",toHsva:I,fromHsva:D,equal:h,fromAttr:e=>e},N=class extends E{get colorModel(){return ft}};var j=class extends N{};customElements.define("rgba-string-color-picker",j);function gt({isAutofocused:e,isDisabled:t,isLive:r,isLiveDebounced:o,isLiveOnBlur:s,liveDebounce:n,state:i}){return{state:i,init(){this.state===null||this.state===""||this.setState(this.state),e&&this.togglePanelVisibility(this.$refs.input),this.$refs.input.addEventListener("change",l=>{this.setState(l.target.value)}),this.$refs.panel.addEventListener("color-changed",l=>{this.setState(l.detail.value),!(s||!(r||o))&&setTimeout(()=>{this.state===l.detail.value&&this.commitState()},o?n:250)}),(r||o||s)&&new MutationObserver(()=>this.isOpen()?null:this.commitState()).observe(this.$refs.panel,{attributes:!0,childList:!0})},togglePanelVisibility(){t||this.$refs.panel.toggle(this.$refs.input)},setState(l){this.state=l,this.$refs.input.value=l,this.$refs.panel.color=l},isOpen(){return this.$refs.panel.style.display==="block"},commitState(){JSON.stringify(this.$wire.__instance.canonical)!==JSON.stringify(this.$wire.__instance.ephemeral)&&this.$wire.$commit()}}}export{gt as default}; diff --git a/public/js/filament/forms/components/date-time-picker.js b/public/js/filament/forms/components/date-time-picker.js index b4e38cd22c..31495b78a3 100644 --- a/public/js/filament/forms/components/date-time-picker.js +++ b/public/js/filament/forms/components/date-time-picker.js @@ -1 +1 @@ -var vi=Object.create;var fn=Object.defineProperty;var gi=Object.getOwnPropertyDescriptor;var Si=Object.getOwnPropertyNames;var bi=Object.getPrototypeOf,ki=Object.prototype.hasOwnProperty;var k=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports);var Hi=(n,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of Si(t))!ki.call(n,e)&&e!==s&&fn(n,e,{get:()=>t[e],enumerable:!(i=gi(t,e))||i.enumerable});return n};var de=(n,t,s)=>(s=n!=null?vi(bi(n)):{},Hi(t||!n||!n.__esModule?fn(s,"default",{value:n,enumerable:!0}):s,n));var bn=k((He,je)=>{(function(n,t){typeof He=="object"&&typeof je<"u"?je.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_advancedFormat=t()})(He,function(){"use strict";return function(n,t){var s=t.prototype,i=s.format;s.format=function(e){var r=this,a=this.$locale();if(!this.isValid())return i.bind(this)(e);var u=this.$utils(),o=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(d){switch(d){case"Q":return Math.ceil((r.$M+1)/3);case"Do":return a.ordinal(r.$D);case"gggg":return r.weekYear();case"GGGG":return r.isoWeekYear();case"wo":return a.ordinal(r.week(),"W");case"w":case"ww":return u.s(r.week(),d==="w"?1:2,"0");case"W":case"WW":return u.s(r.isoWeek(),d==="W"?1:2,"0");case"k":case"kk":return u.s(String(r.$H===0?24:r.$H),d==="k"?1:2,"0");case"X":return Math.floor(r.$d.getTime()/1e3);case"x":return r.$d.getTime();case"z":return"["+r.offsetName()+"]";case"zzz":return"["+r.offsetName("long")+"]";default:return d}});return i.bind(this)(o)}}})});var kn=k((Te,we)=>{(function(n,t){typeof Te=="object"&&typeof we<"u"?we.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_customParseFormat=t()})(Te,function(){"use strict";var n={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},t=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,s=/\d/,i=/\d\d/,e=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,a={},u=function(m){return(m=+m)+(m>68?1900:2e3)},o=function(m){return function(Y){this[m]=+Y}},d=[/[+-]\d\d:?(\d\d)?|Z/,function(m){(this.zone||(this.zone={})).offset=function(Y){if(!Y||Y==="Z")return 0;var L=Y.match(/([+-]|\d\d)/g),D=60*L[1]+(+L[2]||0);return D===0?0:L[0]==="+"?-D:D}(m)}],_=function(m){var Y=a[m];return Y&&(Y.indexOf?Y:Y.s.concat(Y.f))},y=function(m,Y){var L,D=a.meridiem;if(D){for(var w=1;w<=24;w+=1)if(m.indexOf(D(w,0,Y))>-1){L=w>12;break}}else L=m===(Y?"pm":"PM");return L},l={A:[r,function(m){this.afternoon=y(m,!1)}],a:[r,function(m){this.afternoon=y(m,!0)}],Q:[s,function(m){this.month=3*(m-1)+1}],S:[s,function(m){this.milliseconds=100*+m}],SS:[i,function(m){this.milliseconds=10*+m}],SSS:[/\d{3}/,function(m){this.milliseconds=+m}],s:[e,o("seconds")],ss:[e,o("seconds")],m:[e,o("minutes")],mm:[e,o("minutes")],H:[e,o("hours")],h:[e,o("hours")],HH:[e,o("hours")],hh:[e,o("hours")],D:[e,o("day")],DD:[i,o("day")],Do:[r,function(m){var Y=a.ordinal,L=m.match(/\d+/);if(this.day=L[0],Y)for(var D=1;D<=31;D+=1)Y(D).replace(/\[|\]/g,"")===m&&(this.day=D)}],w:[e,o("week")],ww:[i,o("week")],M:[e,o("month")],MM:[i,o("month")],MMM:[r,function(m){var Y=_("months"),L=(_("monthsShort")||Y.map(function(D){return D.slice(0,3)})).indexOf(m)+1;if(L<1)throw new Error;this.month=L%12||L}],MMMM:[r,function(m){var Y=_("months").indexOf(m)+1;if(Y<1)throw new Error;this.month=Y%12||Y}],Y:[/[+-]?\d+/,o("year")],YY:[i,function(m){this.year=u(m)}],YYYY:[/\d{4}/,o("year")],Z:d,ZZ:d};function f(m){var Y,L;Y=m,L=a&&a.formats;for(var D=(m=Y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function($,H,W){var U=W&&W.toUpperCase();return H||L[W]||n[W]||L[U].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(v,h,c){return h||c.slice(1)})})).match(t),w=D.length,g=0;g-1)return new Date((M==="X"?1e3:1)*p);var T=f(M)(p),I=T.year,N=T.month,E=T.day,P=T.hours,B=T.minutes,Q=T.seconds,re=T.milliseconds,Z=T.zone,J=T.week,G=new Date,X=E||(I||N?1:G.getDate()),ee=I||G.getFullYear(),le=0;I&&!N||(le=N>0?N-1:G.getMonth());var me,pe=P||0,De=B||0,Le=Q||0,ve=re||0;return Z?new Date(Date.UTC(ee,le,X,pe,De,Le,ve+60*Z.offset*1e3)):S?new Date(Date.UTC(ee,le,X,pe,De,Le,ve)):(me=new Date(ee,le,X,pe,De,Le,ve),J&&(me=b(me).week(J).toDate()),me)}catch{return new Date("")}}(C,x,A,L),this.init(),U&&U!==!0&&(this.$L=this.locale(U).$L),W&&C!=this.format(x)&&(this.$d=new Date("")),a={}}else if(x instanceof Array)for(var v=x.length,h=1;h<=v;h+=1){q[1]=x[h-1];var c=L.apply(this,q);if(c.isValid()){this.$d=c.$d,this.$L=c.$L,this.init();break}h===v&&(this.$d=new Date(""))}else w.call(this,g)}}})});var Hn=k(($e,Ce)=>{(function(n,t){typeof $e=="object"&&typeof Ce<"u"?Ce.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_localeData=t()})($e,function(){"use strict";return function(n,t,s){var i=t.prototype,e=function(d){return d&&(d.indexOf?d:d.s)},r=function(d,_,y,l,f){var m=d.name?d:d.$locale(),Y=e(m[_]),L=e(m[y]),D=Y||L.map(function(g){return g.slice(0,l)});if(!f)return D;var w=m.weekStart;return D.map(function(g,C){return D[(C+(w||0))%7]})},a=function(){return s.Ls[s.locale()]},u=function(d,_){return d.formats[_]||function(y){return y.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(l,f,m){return f||m.slice(1)})}(d.formats[_.toUpperCase()])},o=function(){var d=this;return{months:function(_){return _?_.format("MMMM"):r(d,"months")},monthsShort:function(_){return _?_.format("MMM"):r(d,"monthsShort","months",3)},firstDayOfWeek:function(){return d.$locale().weekStart||0},weekdays:function(_){return _?_.format("dddd"):r(d,"weekdays")},weekdaysMin:function(_){return _?_.format("dd"):r(d,"weekdaysMin","weekdays",2)},weekdaysShort:function(_){return _?_.format("ddd"):r(d,"weekdaysShort","weekdays",3)},longDateFormat:function(_){return u(d.$locale(),_)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}};i.localeData=function(){return o.bind(this)()},s.localeData=function(){var d=a();return{firstDayOfWeek:function(){return d.weekStart||0},weekdays:function(){return s.weekdays()},weekdaysShort:function(){return s.weekdaysShort()},weekdaysMin:function(){return s.weekdaysMin()},months:function(){return s.months()},monthsShort:function(){return s.monthsShort()},longDateFormat:function(_){return u(d,_)},meridiem:d.meridiem,ordinal:d.ordinal}},s.months=function(){return r(a(),"months")},s.monthsShort=function(){return r(a(),"monthsShort","months",3)},s.weekdays=function(d){return r(a(),"weekdays",null,null,d)},s.weekdaysShort=function(d){return r(a(),"weekdaysShort","weekdays",3,d)},s.weekdaysMin=function(d){return r(a(),"weekdaysMin","weekdays",2,d)}}})});var jn=k((Oe,ze)=>{(function(n,t){typeof Oe=="object"&&typeof ze<"u"?ze.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_timezone=t()})(Oe,function(){"use strict";var n={year:0,month:1,day:2,hour:3,minute:4,second:5},t={};return function(s,i,e){var r,a=function(_,y,l){l===void 0&&(l={});var f=new Date(_),m=function(Y,L){L===void 0&&(L={});var D=L.timeZoneName||"short",w=Y+"|"+D,g=t[w];return g||(g=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:Y,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:D}),t[w]=g),g}(y,l);return m.formatToParts(f)},u=function(_,y){for(var l=a(_,y),f=[],m=0;m=0&&(f[w]=parseInt(D,10))}var g=f[3],C=g===24?0:g,A=f[0]+"-"+f[1]+"-"+f[2]+" "+C+":"+f[4]+":"+f[5]+":000",q=+_;return(e.utc(A).valueOf()-(q-=q%1e3))/6e4},o=i.prototype;o.tz=function(_,y){_===void 0&&(_=r);var l,f=this.utcOffset(),m=this.toDate(),Y=m.toLocaleString("en-US",{timeZone:_}),L=Math.round((m-new Date(Y))/1e3/60),D=15*-Math.round(m.getTimezoneOffset()/15)-L;if(!Number(D))l=this.utcOffset(0,y);else if(l=e(Y,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(D,!0),y){var w=l.utcOffset();l=l.add(f-w,"minute")}return l.$x.$timezone=_,l},o.offsetName=function(_){var y=this.$x.$timezone||e.tz.guess(),l=a(this.valueOf(),y,{timeZoneName:_}).find(function(f){return f.type.toLowerCase()==="timezonename"});return l&&l.value};var d=o.startOf;o.startOf=function(_,y){if(!this.$x||!this.$x.$timezone)return d.call(this,_,y);var l=e(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return d.call(l,_,y).tz(this.$x.$timezone,!0)},e.tz=function(_,y,l){var f=l&&y,m=l||y||r,Y=u(+e(),m);if(typeof _!="string")return e(_).tz(m);var L=function(C,A,q){var x=C-60*A*1e3,$=u(x,q);if(A===$)return[x,A];var H=u(x-=60*($-A)*1e3,q);return $===H?[x,$]:[C-60*Math.min($,H)*1e3,Math.max($,H)]}(e.utc(_,f).valueOf(),Y,m),D=L[0],w=L[1],g=e(D).utcOffset(w);return g.$x.$timezone=m,g},e.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},e.tz.setDefault=function(_){r=_}}})});var Tn=k((Ae,Ie)=>{(function(n,t){typeof Ae=="object"&&typeof Ie<"u"?Ie.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_utc=t()})(Ae,function(){"use strict";var n="minute",t=/[+-]\d\d(?::?\d\d)?/g,s=/([+-]|\d\d)/g;return function(i,e,r){var a=e.prototype;r.utc=function(f){var m={date:f,utc:!0,args:arguments};return new e(m)},a.utc=function(f){var m=r(this.toDate(),{locale:this.$L,utc:!0});return f?m.add(this.utcOffset(),n):m},a.local=function(){return r(this.toDate(),{locale:this.$L,utc:!1})};var u=a.parse;a.parse=function(f){f.utc&&(this.$u=!0),this.$utils().u(f.$offset)||(this.$offset=f.$offset),u.call(this,f)};var o=a.init;a.init=function(){if(this.$u){var f=this.$d;this.$y=f.getUTCFullYear(),this.$M=f.getUTCMonth(),this.$D=f.getUTCDate(),this.$W=f.getUTCDay(),this.$H=f.getUTCHours(),this.$m=f.getUTCMinutes(),this.$s=f.getUTCSeconds(),this.$ms=f.getUTCMilliseconds()}else o.call(this)};var d=a.utcOffset;a.utcOffset=function(f,m){var Y=this.$utils().u;if(Y(f))return this.$u?0:Y(this.$offset)?d.call(this):this.$offset;if(typeof f=="string"&&(f=function(g){g===void 0&&(g="");var C=g.match(t);if(!C)return null;var A=(""+C[0]).match(s)||["-",0,0],q=A[0],x=60*+A[1]+ +A[2];return x===0?0:q==="+"?x:-x}(f),f===null))return this;var L=Math.abs(f)<=16?60*f:f,D=this;if(m)return D.$offset=L,D.$u=f===0,D;if(f!==0){var w=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(D=this.local().add(L+w,n)).$offset=L,D.$x.$localOffset=w}else D=this.utc();return D};var _=a.format;a.format=function(f){var m=f||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return _.call(this,m)},a.valueOf=function(){var f=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*f},a.isUTC=function(){return!!this.$u},a.toISOString=function(){return this.toDate().toISOString()},a.toString=function(){return this.toDate().toUTCString()};var y=a.toDate;a.toDate=function(f){return f==="s"&&this.$offset?r(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():y.call(this)};var l=a.diff;a.diff=function(f,m,Y){if(f&&this.$u===f.$u)return l.call(this,f,m,Y);var L=this.local(),D=r(f).local();return l.call(L,D,m,Y)}}})});var j=k((qe,xe)=>{(function(n,t){typeof qe=="object"&&typeof xe<"u"?xe.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs=t()})(qe,function(){"use strict";var n=1e3,t=6e4,s=36e5,i="millisecond",e="second",r="minute",a="hour",u="day",o="week",d="month",_="quarter",y="year",l="date",f="Invalid Date",m=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,Y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,L={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(v){var h=["th","st","nd","rd"],c=v%100;return"["+v+(h[(c-20)%10]||h[c]||h[0])+"]"}},D=function(v,h,c){var p=String(v);return!p||p.length>=h?v:""+Array(h+1-p.length).join(c)+v},w={s:D,z:function(v){var h=-v.utcOffset(),c=Math.abs(h),p=Math.floor(c/60),M=c%60;return(h<=0?"+":"-")+D(p,2,"0")+":"+D(M,2,"0")},m:function v(h,c){if(h.date()1)return v(b[0])}else{var T=h.name;C[T]=h,M=T}return!p&&M&&(g=M),M||!p&&g},$=function(v,h){if(q(v))return v.clone();var c=typeof h=="object"?h:{};return c.date=v,c.args=arguments,new W(c)},H=w;H.l=x,H.i=q,H.w=function(v,h){return $(v,{locale:h.$L,utc:h.$u,x:h.$x,$offset:h.$offset})};var W=function(){function v(c){this.$L=x(c.locale,null,!0),this.parse(c),this.$x=this.$x||c.x||{},this[A]=!0}var h=v.prototype;return h.parse=function(c){this.$d=function(p){var M=p.date,S=p.utc;if(M===null)return new Date(NaN);if(H.u(M))return new Date;if(M instanceof Date)return new Date(M);if(typeof M=="string"&&!/Z$/i.test(M)){var b=M.match(m);if(b){var T=b[2]-1||0,I=(b[7]||"0").substring(0,3);return S?new Date(Date.UTC(b[1],T,b[3]||1,b[4]||0,b[5]||0,b[6]||0,I)):new Date(b[1],T,b[3]||1,b[4]||0,b[5]||0,b[6]||0,I)}}return new Date(M)}(c),this.init()},h.init=function(){var c=this.$d;this.$y=c.getFullYear(),this.$M=c.getMonth(),this.$D=c.getDate(),this.$W=c.getDay(),this.$H=c.getHours(),this.$m=c.getMinutes(),this.$s=c.getSeconds(),this.$ms=c.getMilliseconds()},h.$utils=function(){return H},h.isValid=function(){return this.$d.toString()!==f},h.isSame=function(c,p){var M=$(c);return this.startOf(p)<=M&&M<=this.endOf(p)},h.isAfter=function(c,p){return $(c){(function(n,t){typeof Ne=="object"&&typeof Ee<"u"?Ee.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ar=t(n.dayjs)})(Ne,function(n){"use strict";function t(u){return u&&typeof u=="object"&&"default"in u?u:{default:u}}var s=t(n),i="\u064A\u0646\u0627\u064A\u0631_\u0641\u0628\u0631\u0627\u064A\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064A\u0644_\u0645\u0627\u064A\u0648_\u064A\u0648\u0646\u064A\u0648_\u064A\u0648\u0644\u064A\u0648_\u0623\u063A\u0633\u0637\u0633_\u0633\u0628\u062A\u0645\u0628\u0631_\u0623\u0643\u062A\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062F\u064A\u0633\u0645\u0628\u0631".split("_"),e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},r={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},a={name:"ar",weekdays:"\u0627\u0644\u0623\u062D\u062F_\u0627\u0644\u0625\u062B\u0646\u064A\u0646_\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062E\u0645\u064A\u0633_\u0627\u0644\u062C\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062A".split("_"),weekdaysShort:"\u0623\u062D\u062F_\u0625\u062B\u0646\u064A\u0646_\u062B\u0644\u0627\u062B\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062E\u0645\u064A\u0633_\u062C\u0645\u0639\u0629_\u0633\u0628\u062A".split("_"),weekdaysMin:"\u062D_\u0646_\u062B_\u0631_\u062E_\u062C_\u0633".split("_"),months:i,monthsShort:i,weekStart:6,meridiem:function(u){return u>12?"\u0645":"\u0635"},relativeTime:{future:"\u0628\u0639\u062F %s",past:"\u0645\u0646\u0630 %s",s:"\u062B\u0627\u0646\u064A\u0629 \u0648\u0627\u062D\u062F\u0629",m:"\u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629",mm:"%d \u062F\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629 \u0648\u0627\u062D\u062F\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062A",d:"\u064A\u0648\u0645 \u0648\u0627\u062D\u062F",dd:"%d \u0623\u064A\u0627\u0645",M:"\u0634\u0647\u0631 \u0648\u0627\u062D\u062F",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0639\u0627\u0645 \u0648\u0627\u062D\u062F",yy:"%d \u0623\u0639\u0648\u0627\u0645"},preparse:function(u){return u.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(o){return r[o]}).replace(/،/g,",")},postformat:function(u){return u.replace(/\d/g,function(o){return e[o]}).replace(/,/g,"\u060C")},ordinal:function(u){return u},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200FM/\u200FYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"}};return s.default.locale(a,null,!0),a})});var $n=k((Fe,Je)=>{(function(n,t){typeof Fe=="object"&&typeof Je<"u"?Je.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_bs=t(n.dayjs)})(Fe,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"bs",weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010Detvrtak_petak_subota".split("_"),months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),weekStart:1,weekdaysShort:"ned._pon._uto._sri._\u010Det._pet._sub.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010De_pe_su".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return s.default.locale(i,null,!0),i})});var Cn=k((We,Ue)=>{(function(n,t){typeof We=="object"&&typeof Ue<"u"?Ue.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ca=t(n.dayjs)})(We,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"ca",weekdays:"Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),weekdaysShort:"Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),months:"Gener_Febrer_Mar\xE7_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),monthsShort:"Gen._Febr._Mar\xE7_Abr._Maig_Juny_Jul._Ag._Set._Oct._Nov._Des.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",ll:"D MMM YYYY",lll:"D MMM YYYY, H:mm",llll:"ddd D MMM YYYY, H:mm"},relativeTime:{future:"d'aqu\xED %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:function(e){return""+e+(e===1||e===3?"r":e===2?"n":e===4?"t":"\xE8")}};return s.default.locale(i,null,!0),i})});var Pe=k((Ye,On)=>{(function(n,t){typeof Ye=="object"&&typeof On<"u"?t(Ye,j()):typeof define=="function"&&define.amd?define(["exports","dayjs"],t):t((n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ku={},n.dayjs)})(Ye,function(n,t){"use strict";function s(o){return o&&typeof o=="object"&&"default"in o?o:{default:o}}var i=s(t),e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},r={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},a=["\u06A9\u0627\u0646\u0648\u0648\u0646\u06CC \u062F\u0648\u0648\u06D5\u0645","\u0634\u0648\u0628\u0627\u062A","\u0626\u0627\u062F\u0627\u0631","\u0646\u06CC\u0633\u0627\u0646","\u0626\u0627\u06CC\u0627\u0631","\u062D\u0648\u0632\u06D5\u06CC\u0631\u0627\u0646","\u062A\u06D5\u0645\u0645\u0648\u0648\u0632","\u0626\u0627\u0628","\u0626\u06D5\u06CC\u0644\u0648\u0648\u0644","\u062A\u0634\u0631\u06CC\u0646\u06CC \u06CC\u06D5\u06A9\u06D5\u0645","\u062A\u0634\u0631\u06CC\u0646\u06CC \u062F\u0648\u0648\u06D5\u0645","\u06A9\u0627\u0646\u0648\u0648\u0646\u06CC \u06CC\u06D5\u06A9\u06D5\u0645"],u={name:"ku",months:a,monthsShort:a,weekdays:"\u06CC\u06D5\u06A9\u0634\u06D5\u0645\u0645\u06D5_\u062F\u0648\u0648\u0634\u06D5\u0645\u0645\u06D5_\u0633\u06CE\u0634\u06D5\u0645\u0645\u06D5_\u0686\u0648\u0627\u0631\u0634\u06D5\u0645\u0645\u06D5_\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645\u0645\u06D5_\u0647\u06D5\u06CC\u0646\u06CC_\u0634\u06D5\u0645\u0645\u06D5".split("_"),weekdaysShort:"\u06CC\u06D5\u06A9\u0634\u06D5\u0645_\u062F\u0648\u0648\u0634\u06D5\u0645_\u0633\u06CE\u0634\u06D5\u0645_\u0686\u0648\u0627\u0631\u0634\u06D5\u0645_\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645_\u0647\u06D5\u06CC\u0646\u06CC_\u0634\u06D5\u0645\u0645\u06D5".split("_"),weekStart:6,weekdaysMin:"\u06CC_\u062F_\u0633_\u0686_\u067E_\u0647\u0640_\u0634".split("_"),preparse:function(o){return o.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(d){return r[d]}).replace(/،/g,",")},postformat:function(o){return o.replace(/\d/g,function(d){return e[d]}).replace(/,/g,"\u060C")},ordinal:function(o){return o},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiem:function(o){return o<12?"\u067E.\u0646":"\u062F.\u0646"},relativeTime:{future:"\u0644\u06D5 %s",past:"\u0644\u06D5\u0645\u06D5\u0648\u067E\u06CE\u0634 %s",s:"\u0686\u06D5\u0646\u062F \u0686\u0631\u06A9\u06D5\u06CC\u06D5\u06A9",m:"\u06CC\u06D5\u06A9 \u062E\u0648\u0644\u06D5\u06A9",mm:"%d \u062E\u0648\u0644\u06D5\u06A9",h:"\u06CC\u06D5\u06A9 \u06A9\u0627\u062A\u0698\u0645\u06CE\u0631",hh:"%d \u06A9\u0627\u062A\u0698\u0645\u06CE\u0631",d:"\u06CC\u06D5\u06A9 \u0695\u06C6\u0698",dd:"%d \u0695\u06C6\u0698",M:"\u06CC\u06D5\u06A9 \u0645\u0627\u0646\u06AF",MM:"%d \u0645\u0627\u0646\u06AF",y:"\u06CC\u06D5\u06A9 \u0633\u0627\u06B5",yy:"%d \u0633\u0627\u06B5"}};i.default.locale(u,null,!0),n.default=u,n.englishToArabicNumbersMap=e,Object.defineProperty(n,"__esModule",{value:!0})})});var zn=k((Re,Ge)=>{(function(n,t){typeof Re=="object"&&typeof Ge<"u"?Ge.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_cs=t(n.dayjs)})(Re,function(n){"use strict";function t(a){return a&&typeof a=="object"&&"default"in a?a:{default:a}}var s=t(n);function i(a){return a>1&&a<5&&~~(a/10)!=1}function e(a,u,o,d){var _=a+" ";switch(o){case"s":return u||d?"p\xE1r sekund":"p\xE1r sekundami";case"m":return u?"minuta":d?"minutu":"minutou";case"mm":return u||d?_+(i(a)?"minuty":"minut"):_+"minutami";case"h":return u?"hodina":d?"hodinu":"hodinou";case"hh":return u||d?_+(i(a)?"hodiny":"hodin"):_+"hodinami";case"d":return u||d?"den":"dnem";case"dd":return u||d?_+(i(a)?"dny":"dn\xED"):_+"dny";case"M":return u||d?"m\u011Bs\xEDc":"m\u011Bs\xEDcem";case"MM":return u||d?_+(i(a)?"m\u011Bs\xEDce":"m\u011Bs\xEDc\u016F"):_+"m\u011Bs\xEDci";case"y":return u||d?"rok":"rokem";case"yy":return u||d?_+(i(a)?"roky":"let"):_+"lety"}}var r={name:"cs",weekdays:"ned\u011Ble_pond\u011Bl\xED_\xFAter\xFD_st\u0159eda_\u010Dtvrtek_p\xE1tek_sobota".split("_"),weekdaysShort:"ne_po_\xFAt_st_\u010Dt_p\xE1_so".split("_"),weekdaysMin:"ne_po_\xFAt_st_\u010Dt_p\xE1_so".split("_"),months:"leden_\xFAnor_b\u0159ezen_duben_kv\u011Bten_\u010Derven_\u010Dervenec_srpen_z\xE1\u0159\xED_\u0159\xEDjen_listopad_prosinec".split("_"),monthsShort:"led_\xFAno_b\u0159e_dub_kv\u011B_\u010Dvn_\u010Dvc_srp_z\xE1\u0159_\u0159\xEDj_lis_pro".split("_"),weekStart:1,yearStart:4,ordinal:function(a){return a+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e}};return s.default.locale(r,null,!0),r})});var An=k((Ze,Ve)=>{(function(n,t){typeof Ze=="object"&&typeof Ve<"u"?Ve.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_cy=t(n.dayjs)})(Ze,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"cy",weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),weekStart:1,weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"mewn %s",past:"%s yn \xF4l",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"}};return s.default.locale(i,null,!0),i})});var In=k((Ke,Qe)=>{(function(n,t){typeof Ke=="object"&&typeof Qe<"u"?Qe.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_da=t(n.dayjs)})(Ke,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"da",weekdays:"s\xF8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xF8rdag".split("_"),weekdaysShort:"s\xF8n._man._tirs._ons._tors._fre._l\xF8r.".split("_"),weekdaysMin:"s\xF8._ma._ti._on._to._fr._l\xF8.".split("_"),months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj_juni_juli_aug._sept._okt._nov._dec.".split("_"),weekStart:1,yearStart:4,ordinal:function(e){return e+"."},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xE5 sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xE5ned",MM:"%d m\xE5neder",y:"et \xE5r",yy:"%d \xE5r"}};return s.default.locale(i,null,!0),i})});var qn=k((Xe,Be)=>{(function(n,t){typeof Xe=="object"&&typeof Be<"u"?Be.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_de=t(n.dayjs)})(Xe,function(n){"use strict";function t(a){return a&&typeof a=="object"&&"default"in a?a:{default:a}}var s=t(n),i={s:"ein paar Sekunden",m:["eine Minute","einer Minute"],mm:"%d Minuten",h:["eine Stunde","einer Stunde"],hh:"%d Stunden",d:["ein Tag","einem Tag"],dd:["%d Tage","%d Tagen"],M:["ein Monat","einem Monat"],MM:["%d Monate","%d Monaten"],y:["ein Jahr","einem Jahr"],yy:["%d Jahre","%d Jahren"]};function e(a,u,o){var d=i[o];return Array.isArray(d)&&(d=d[u?0:1]),d.replace("%d",a)}var r={name:"de",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Januar_Februar_M\xE4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xE4rz_Apr._Mai_Juni_Juli_Aug._Sept._Okt._Nov._Dez.".split("_"),ordinal:function(a){return a+"."},weekStart:1,yearStart:4,formats:{LTS:"HH:mm:ss",LT:"HH:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e}};return s.default.locale(r,null,!0),r})});var xn=k((et,tt)=>{(function(n,t){typeof et=="object"&&typeof tt<"u"?tt.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_en=t()})(et,function(){"use strict";return{name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(n){var t=["th","st","nd","rd"],s=n%100;return"["+n+(t[(s-20)%10]||t[s]||t[0])+"]"}}})});var Nn=k((nt,it)=>{(function(n,t){typeof nt=="object"&&typeof it<"u"?it.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_es=t(n.dayjs)})(nt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"es",monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),weekdays:"domingo_lunes_martes_mi\xE9rcoles_jueves_viernes_s\xE1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xE9._jue._vie._s\xE1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xE1".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xEDa",dd:"%d d\xEDas",M:"un mes",MM:"%d meses",y:"un a\xF1o",yy:"%d a\xF1os"},ordinal:function(e){return e+"\xBA"}};return s.default.locale(i,null,!0),i})});var En=k((st,rt)=>{(function(n,t){typeof st=="object"&&typeof rt<"u"?rt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_et=t(n.dayjs)})(st,function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var s=t(n);function i(r,a,u,o){var d={s:["m\xF5ne sekundi","m\xF5ni sekund","paar sekundit"],m:["\xFChe minuti","\xFCks minut"],mm:["%d minuti","%d minutit"],h:["\xFChe tunni","tund aega","\xFCks tund"],hh:["%d tunni","%d tundi"],d:["\xFChe p\xE4eva","\xFCks p\xE4ev"],M:["kuu aja","kuu aega","\xFCks kuu"],MM:["%d kuu","%d kuud"],y:["\xFChe aasta","aasta","\xFCks aasta"],yy:["%d aasta","%d aastat"]};return a?(d[u][2]?d[u][2]:d[u][1]).replace("%d",r):(o?d[u][0]:d[u][1]).replace("%d",r)}var e={name:"et",weekdays:"p\xFChap\xE4ev_esmasp\xE4ev_teisip\xE4ev_kolmap\xE4ev_neljap\xE4ev_reede_laup\xE4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),months:"jaanuar_veebruar_m\xE4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xE4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),ordinal:function(r){return r+"."},weekStart:1,relativeTime:{future:"%s p\xE4rast",past:"%s tagasi",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:"%d p\xE4eva",M:i,MM:i,y:i,yy:i},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return s.default.locale(e,null,!0),e})});var Fn=k((at,ut)=>{(function(n,t){typeof at=="object"&&typeof ut<"u"?ut.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fa=t(n.dayjs)})(at,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"fa",weekdays:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06CC_\u062F_\u0633_\u0686_\u067E_\u062C_\u0634".split("_"),weekStart:6,months:"\u0698\u0627\u0646\u0648\u06CC\u0647_\u0641\u0648\u0631\u06CC\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06CC\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06CC\u0647_\u0627\u0648\u062A_\u0633\u067E\u062A\u0627\u0645\u0628\u0631_\u0627\u06A9\u062A\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062F\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06CC\u0647_\u0641\u0648\u0631\u06CC\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06CC\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06CC\u0647_\u0627\u0648\u062A_\u0633\u067E\u062A\u0627\u0645\u0628\u0631_\u0627\u06A9\u062A\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062F\u0633\u0627\u0645\u0628\u0631".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"\u062F\u0631 %s",past:"%s \u067E\u06CC\u0634",s:"\u0686\u0646\u062F \u062B\u0627\u0646\u06CC\u0647",m:"\u06CC\u06A9 \u062F\u0642\u06CC\u0642\u0647",mm:"%d \u062F\u0642\u06CC\u0642\u0647",h:"\u06CC\u06A9 \u0633\u0627\u0639\u062A",hh:"%d \u0633\u0627\u0639\u062A",d:"\u06CC\u06A9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06CC\u06A9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06CC\u06A9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"}};return s.default.locale(i,null,!0),i})});var Jn=k((ot,dt)=>{(function(n,t){typeof ot=="object"&&typeof dt<"u"?dt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fi=t(n.dayjs)})(ot,function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var s=t(n);function i(r,a,u,o){var d={s:"muutama sekunti",m:"minuutti",mm:"%d minuuttia",h:"tunti",hh:"%d tuntia",d:"p\xE4iv\xE4",dd:"%d p\xE4iv\xE4\xE4",M:"kuukausi",MM:"%d kuukautta",y:"vuosi",yy:"%d vuotta",numbers:"nolla_yksi_kaksi_kolme_nelj\xE4_viisi_kuusi_seitsem\xE4n_kahdeksan_yhdeks\xE4n".split("_")},_={s:"muutaman sekunnin",m:"minuutin",mm:"%d minuutin",h:"tunnin",hh:"%d tunnin",d:"p\xE4iv\xE4n",dd:"%d p\xE4iv\xE4n",M:"kuukauden",MM:"%d kuukauden",y:"vuoden",yy:"%d vuoden",numbers:"nollan_yhden_kahden_kolmen_nelj\xE4n_viiden_kuuden_seitsem\xE4n_kahdeksan_yhdeks\xE4n".split("_")},y=o&&!a?_:d,l=y[u];return r<10?l.replace("%d",y.numbers[r]):l.replace("%d",r)}var e={name:"fi",weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xE4kuu_hein\xE4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xE4_hein\xE4_elo_syys_loka_marras_joulu".split("_"),ordinal:function(r){return r+"."},weekStart:1,yearStart:4,relativeTime:{future:"%s p\xE4\xE4st\xE4",past:"%s sitten",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM[ta] YYYY",LLL:"D. MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, D. MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"D. MMM YYYY",lll:"D. MMM YYYY, [klo] HH.mm",llll:"ddd, D. MMM YYYY, [klo] HH.mm"}};return s.default.locale(e,null,!0),e})});var Wn=k((_t,ft)=>{(function(n,t){typeof _t=="object"&&typeof ft<"u"?ft.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fr=t(n.dayjs)})(_t,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"fr",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),months:"janvier_f\xE9vrier_mars_avril_mai_juin_juillet_ao\xFBt_septembre_octobre_novembre_d\xE9cembre".split("_"),monthsShort:"janv._f\xE9vr._mars_avr._mai_juin_juil._ao\xFBt_sept._oct._nov._d\xE9c.".split("_"),weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return""+e+(e===1?"er":"")}};return s.default.locale(i,null,!0),i})});var Un=k((lt,mt)=>{(function(n,t){typeof lt=="object"&&typeof mt<"u"?mt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hi=t(n.dayjs)})(lt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"hi",weekdays:"\u0930\u0935\u093F\u0935\u093E\u0930_\u0938\u094B\u092E\u0935\u093E\u0930_\u092E\u0902\u0917\u0932\u0935\u093E\u0930_\u092C\u0941\u0927\u0935\u093E\u0930_\u0917\u0941\u0930\u0942\u0935\u093E\u0930_\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930_\u0936\u0928\u093F\u0935\u093E\u0930".split("_"),months:"\u091C\u0928\u0935\u0930\u0940_\u092B\u093C\u0930\u0935\u0930\u0940_\u092E\u093E\u0930\u094D\u091A_\u0905\u092A\u094D\u0930\u0948\u0932_\u092E\u0908_\u091C\u0942\u0928_\u091C\u0941\u0932\u093E\u0908_\u0905\u0917\u0938\u094D\u0924_\u0938\u093F\u0924\u092E\u094D\u092C\u0930_\u0905\u0915\u094D\u091F\u0942\u092C\u0930_\u0928\u0935\u092E\u094D\u092C\u0930_\u0926\u093F\u0938\u092E\u094D\u092C\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093F_\u0938\u094B\u092E_\u092E\u0902\u0917\u0932_\u092C\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094D\u0930_\u0936\u0928\u093F".split("_"),monthsShort:"\u091C\u0928._\u092B\u093C\u0930._\u092E\u093E\u0930\u094D\u091A_\u0905\u092A\u094D\u0930\u0948._\u092E\u0908_\u091C\u0942\u0928_\u091C\u0941\u0932._\u0905\u0917._\u0938\u093F\u0924._\u0905\u0915\u094D\u091F\u0942._\u0928\u0935._\u0926\u093F\u0938.".split("_"),weekdaysMin:"\u0930_\u0938\u094B_\u092E\u0902_\u092C\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),ordinal:function(e){return e},formats:{LT:"A h:mm \u092C\u091C\u0947",LTS:"A h:mm:ss \u092C\u091C\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092C\u091C\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092C\u091C\u0947"},relativeTime:{future:"%s \u092E\u0947\u0902",past:"%s \u092A\u0939\u0932\u0947",s:"\u0915\u0941\u091B \u0939\u0940 \u0915\u094D\u0937\u0923",m:"\u090F\u0915 \u092E\u093F\u0928\u091F",mm:"%d \u092E\u093F\u0928\u091F",h:"\u090F\u0915 \u0918\u0902\u091F\u093E",hh:"%d \u0918\u0902\u091F\u0947",d:"\u090F\u0915 \u0926\u093F\u0928",dd:"%d \u0926\u093F\u0928",M:"\u090F\u0915 \u092E\u0939\u0940\u0928\u0947",MM:"%d \u092E\u0939\u0940\u0928\u0947",y:"\u090F\u0915 \u0935\u0930\u094D\u0937",yy:"%d \u0935\u0930\u094D\u0937"}};return s.default.locale(i,null,!0),i})});var Pn=k((ct,ht)=>{(function(n,t){typeof ct=="object"&&typeof ht<"u"?ht.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hu=t(n.dayjs)})(ct,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"hu",weekdays:"vas\xE1rnap_h\xE9tf\u0151_kedd_szerda_cs\xFCt\xF6rt\xF6k_p\xE9ntek_szombat".split("_"),weekdaysShort:"vas_h\xE9t_kedd_sze_cs\xFCt_p\xE9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),months:"janu\xE1r_febru\xE1r_m\xE1rcius_\xE1prilis_m\xE1jus_j\xFAnius_j\xFAlius_augusztus_szeptember_okt\xF3ber_november_december".split("_"),monthsShort:"jan_feb_m\xE1rc_\xE1pr_m\xE1j_j\xFAn_j\xFAl_aug_szept_okt_nov_dec".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"%s m\xFAlva",past:"%s",s:function(e,r,a,u){return"n\xE9h\xE1ny m\xE1sodperc"+(u||r?"":"e")},m:function(e,r,a,u){return"egy perc"+(u||r?"":"e")},mm:function(e,r,a,u){return e+" perc"+(u||r?"":"e")},h:function(e,r,a,u){return"egy "+(u||r?"\xF3ra":"\xF3r\xE1ja")},hh:function(e,r,a,u){return e+" "+(u||r?"\xF3ra":"\xF3r\xE1ja")},d:function(e,r,a,u){return"egy "+(u||r?"nap":"napja")},dd:function(e,r,a,u){return e+" "+(u||r?"nap":"napja")},M:function(e,r,a,u){return"egy "+(u||r?"h\xF3nap":"h\xF3napja")},MM:function(e,r,a,u){return e+" "+(u||r?"h\xF3nap":"h\xF3napja")},y:function(e,r,a,u){return"egy "+(u||r?"\xE9v":"\xE9ve")},yy:function(e,r,a,u){return e+" "+(u||r?"\xE9v":"\xE9ve")}},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"}};return s.default.locale(i,null,!0),i})});var Rn=k((Mt,yt)=>{(function(n,t){typeof Mt=="object"&&typeof yt<"u"?yt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hy_am=t(n.dayjs)})(Mt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"hy-am",weekdays:"\u056F\u056B\u0580\u0561\u056F\u056B_\u0565\u0580\u056F\u0578\u0582\u0577\u0561\u0562\u0569\u056B_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B_\u0570\u056B\u0576\u0563\u0577\u0561\u0562\u0569\u056B_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),months:"\u0570\u0578\u0582\u0576\u057E\u0561\u0580\u056B_\u0583\u0565\u057F\u0580\u057E\u0561\u0580\u056B_\u0574\u0561\u0580\u057F\u056B_\u0561\u057A\u0580\u056B\u056C\u056B_\u0574\u0561\u0575\u056B\u057D\u056B_\u0570\u0578\u0582\u0576\u056B\u057D\u056B_\u0570\u0578\u0582\u056C\u056B\u057D\u056B_\u0585\u0563\u0578\u057D\u057F\u0578\u057D\u056B_\u057D\u0565\u057A\u057F\u0565\u0574\u0562\u0565\u0580\u056B_\u0570\u0578\u056F\u057F\u0565\u0574\u0562\u0565\u0580\u056B_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056B_\u0564\u0565\u056F\u057F\u0565\u0574\u0562\u0565\u0580\u056B".split("_"),weekStart:1,weekdaysShort:"\u056F\u0580\u056F_\u0565\u0580\u056F_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),monthsShort:"\u0570\u0576\u057E_\u0583\u057F\u0580_\u0574\u0580\u057F_\u0561\u057A\u0580_\u0574\u0575\u057D_\u0570\u0576\u057D_\u0570\u056C\u057D_\u0585\u0563\u057D_\u057D\u057A\u057F_\u0570\u056F\u057F_\u0576\u0574\u0562_\u0564\u056F\u057F".split("_"),weekdaysMin:"\u056F\u0580\u056F_\u0565\u0580\u056F_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},relativeTime:{future:"%s \u0570\u0565\u057F\u0578",past:"%s \u0561\u057C\u0561\u057B",s:"\u0574\u056B \u0584\u0561\u0576\u056B \u057E\u0561\u0575\u0580\u056F\u0575\u0561\u0576",m:"\u0580\u0578\u057A\u0565",mm:"%d \u0580\u0578\u057A\u0565",h:"\u056A\u0561\u0574",hh:"%d \u056A\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056B\u057D",MM:"%d \u0561\u0574\u056B\u057D",y:"\u057F\u0561\u0580\u056B",yy:"%d \u057F\u0561\u0580\u056B"}};return s.default.locale(i,null,!0),i})});var Gn=k((Yt,pt)=>{(function(n,t){typeof Yt=="object"&&typeof pt<"u"?pt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_id=t(n.dayjs)})(Yt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"id",weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return s.default.locale(i,null,!0),i})});var Zn=k((Dt,Lt)=>{(function(n,t){typeof Dt=="object"&&typeof Lt<"u"?Lt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_it=t(n.dayjs)})(Dt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"it",weekdays:"domenica_luned\xEC_marted\xEC_mercoled\xEC_gioved\xEC_venerd\xEC_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),weekStart:1,monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"tra %s",past:"%s fa",s:"qualche secondo",m:"un minuto",mm:"%d minuti",h:"un' ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:function(e){return e+"\xBA"}};return s.default.locale(i,null,!0),i})});var Vn=k((vt,gt)=>{(function(n,t){typeof vt=="object"&&typeof gt<"u"?gt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ja=t(n.dayjs)})(vt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"ja",weekdays:"\u65E5\u66DC\u65E5_\u6708\u66DC\u65E5_\u706B\u66DC\u65E5_\u6C34\u66DC\u65E5_\u6728\u66DC\u65E5_\u91D1\u66DC\u65E5_\u571F\u66DC\u65E5".split("_"),weekdaysShort:"\u65E5_\u6708_\u706B_\u6C34_\u6728_\u91D1_\u571F".split("_"),weekdaysMin:"\u65E5_\u6708_\u706B_\u6C34_\u6728_\u91D1_\u571F".split("_"),months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e){return e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5(ddd) HH:mm"},meridiem:function(e){return e<12?"\u5348\u524D":"\u5348\u5F8C"},relativeTime:{future:"%s\u5F8C",past:"%s\u524D",s:"\u6570\u79D2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65E5",dd:"%d\u65E5",M:"1\u30F6\u6708",MM:"%d\u30F6\u6708",y:"1\u5E74",yy:"%d\u5E74"}};return s.default.locale(i,null,!0),i})});var Kn=k((St,bt)=>{(function(n,t){typeof St=="object"&&typeof bt<"u"?bt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ka=t(n.dayjs)})(St,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"ka",weekdays:"\u10D9\u10D5\u10D8\u10E0\u10D0_\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8_\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8".split("_"),weekdaysShort:"\u10D9\u10D5\u10D8_\u10DD\u10E0\u10E8_\u10E1\u10D0\u10DB_\u10DD\u10D7\u10EE_\u10EE\u10E3\u10D7_\u10DE\u10D0\u10E0_\u10E8\u10D0\u10D1".split("_"),weekdaysMin:"\u10D9\u10D5_\u10DD\u10E0_\u10E1\u10D0_\u10DD\u10D7_\u10EE\u10E3_\u10DE\u10D0_\u10E8\u10D0".split("_"),months:"\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8_\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8_\u10DB\u10D0\u10E0\u10E2\u10D8_\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8_\u10DB\u10D0\u10D8\u10E1\u10D8_\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8_\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8_\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD_\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8_\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8_\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8_\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8".split("_"),monthsShort:"\u10D8\u10D0\u10DC_\u10D7\u10D4\u10D1_\u10DB\u10D0\u10E0_\u10D0\u10DE\u10E0_\u10DB\u10D0\u10D8_\u10D8\u10D5\u10DC_\u10D8\u10D5\u10DA_\u10D0\u10D2\u10D5_\u10E1\u10D4\u10E5_\u10DD\u10E5\u10E2_\u10DC\u10DD\u10D4_\u10D3\u10D4\u10D9".split("_"),weekStart:1,formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"%s \u10E8\u10D4\u10DB\u10D3\u10D4\u10D2",past:"%s \u10EC\u10D8\u10DC",s:"\u10EC\u10D0\u10DB\u10D8",m:"\u10EC\u10E3\u10D7\u10D8",mm:"%d \u10EC\u10E3\u10D7\u10D8",h:"\u10E1\u10D0\u10D0\u10D7\u10D8",hh:"%d \u10E1\u10D0\u10D0\u10D7\u10D8\u10E1",d:"\u10D3\u10E6\u10D4\u10E1",dd:"%d \u10D3\u10E6\u10D8\u10E1 \u10D2\u10D0\u10DC\u10DB\u10D0\u10D5\u10DA\u10DD\u10D1\u10D0\u10E8\u10D8",M:"\u10D7\u10D5\u10D8\u10E1",MM:"%d \u10D7\u10D5\u10D8\u10E1",y:"\u10EC\u10D4\u10DA\u10D8",yy:"%d \u10EC\u10DA\u10D8\u10E1"},ordinal:function(e){return e}};return s.default.locale(i,null,!0),i})});var Qn=k((kt,Ht)=>{(function(n,t){typeof kt=="object"&&typeof Ht<"u"?Ht.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_km=t(n.dayjs)})(kt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"km",weekdays:"\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799_\u1785\u17D0\u1793\u17D2\u1791_\u17A2\u1784\u17D2\u1782\u17B6\u179A_\u1796\u17BB\u1792_\u1796\u17D2\u179A\u17A0\u179F\u17D2\u1794\u178F\u17B7\u17CD_\u179F\u17BB\u1780\u17D2\u179A_\u179F\u17C5\u179A\u17CD".split("_"),months:"\u1798\u1780\u179A\u17B6_\u1780\u17BB\u1798\u17D2\u1797\u17C8_\u1798\u17B8\u1793\u17B6_\u1798\u17C1\u179F\u17B6_\u17A7\u179F\u1797\u17B6_\u1798\u17B7\u1790\u17BB\u1793\u17B6_\u1780\u1780\u17D2\u1780\u178A\u17B6_\u179F\u17B8\u17A0\u17B6_\u1780\u1789\u17D2\u1789\u17B6_\u178F\u17BB\u179B\u17B6_\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6_\u1792\u17D2\u1793\u17BC".split("_"),weekStart:1,weekdaysShort:"\u17A2\u17B6_\u1785_\u17A2_\u1796_\u1796\u17D2\u179A_\u179F\u17BB_\u179F".split("_"),monthsShort:"\u1798\u1780\u179A\u17B6_\u1780\u17BB\u1798\u17D2\u1797\u17C8_\u1798\u17B8\u1793\u17B6_\u1798\u17C1\u179F\u17B6_\u17A7\u179F\u1797\u17B6_\u1798\u17B7\u1790\u17BB\u1793\u17B6_\u1780\u1780\u17D2\u1780\u178A\u17B6_\u179F\u17B8\u17A0\u17B6_\u1780\u1789\u17D2\u1789\u17B6_\u178F\u17BB\u179B\u17B6_\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6_\u1792\u17D2\u1793\u17BC".split("_"),weekdaysMin:"\u17A2\u17B6_\u1785_\u17A2_\u1796_\u1796\u17D2\u179A_\u179F\u17BB_\u179F".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s\u1791\u17C0\u178F",past:"%s\u1798\u17BB\u1793",s:"\u1794\u17C9\u17BB\u1793\u17D2\u1798\u17B6\u1793\u179C\u17B7\u1793\u17B6\u1791\u17B8",m:"\u1798\u17BD\u1799\u1793\u17B6\u1791\u17B8",mm:"%d \u1793\u17B6\u1791\u17B8",h:"\u1798\u17BD\u1799\u1798\u17C9\u17C4\u1784",hh:"%d \u1798\u17C9\u17C4\u1784",d:"\u1798\u17BD\u1799\u1790\u17D2\u1784\u17C3",dd:"%d \u1790\u17D2\u1784\u17C3",M:"\u1798\u17BD\u1799\u1781\u17C2",MM:"%d \u1781\u17C2",y:"\u1798\u17BD\u1799\u1786\u17D2\u1793\u17B6\u17C6",yy:"%d \u1786\u17D2\u1793\u17B6\u17C6"}};return s.default.locale(i,null,!0),i})});var Xn=k((jt,Tt)=>{(function(n,t){typeof jt=="object"&&typeof Tt<"u"?Tt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_lt=t(n.dayjs)})(jt,function(n){"use strict";function t(o){return o&&typeof o=="object"&&"default"in o?o:{default:o}}var s=t(n),i="sausio_vasario_kovo_baland\u017Eio_gegu\u017E\u0117s_bir\u017Eelio_liepos_rugpj\u016B\u010Dio_rugs\u0117jo_spalio_lapkri\u010Dio_gruod\u017Eio".split("_"),e="sausis_vasaris_kovas_balandis_gegu\u017E\u0117_bir\u017Eelis_liepa_rugpj\u016Btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),r=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,a=function(o,d){return r.test(d)?i[o.month()]:e[o.month()]};a.s=e,a.f=i;var u={name:"lt",weekdays:"sekmadienis_pirmadienis_antradienis_tre\u010Diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),weekdaysShort:"sek_pir_ant_tre_ket_pen_\u0161e\u0161".split("_"),weekdaysMin:"s_p_a_t_k_pn_\u0161".split("_"),months:a,monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),ordinal:function(o){return o+"."},weekStart:1,relativeTime:{future:"u\u017E %s",past:"prie\u0161 %s",s:"kelias sekundes",m:"minut\u0119",mm:"%d minutes",h:"valand\u0105",hh:"%d valandas",d:"dien\u0105",dd:"%d dienas",M:"m\u0117nes\u012F",MM:"%d m\u0117nesius",y:"metus",yy:"%d metus"},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"}};return s.default.locale(u,null,!0),u})});var Bn=k((wt,$t)=>{(function(n,t){typeof wt=="object"&&typeof $t<"u"?$t.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_lv=t(n.dayjs)})(wt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"lv",weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),months:"janv\u0101ris_febru\u0101ris_marts_apr\u012Blis_maijs_j\u016Bnijs_j\u016Blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),weekStart:1,weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016Bn_j\u016Bl_aug_sep_okt_nov_dec".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:"da\u017E\u0101m sekund\u0113m",m:"min\u016Btes",mm:"%d min\u016Bt\u0113m",h:"stundas",hh:"%d stund\u0101m",d:"dienas",dd:"%d dien\u0101m",M:"m\u0113ne\u0161a",MM:"%d m\u0113ne\u0161iem",y:"gada",yy:"%d gadiem"}};return s.default.locale(i,null,!0),i})});var ei=k((Ct,Ot)=>{(function(n,t){typeof Ct=="object"&&typeof Ot<"u"?Ot.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ms=t(n.dayjs)})(Ct,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"ms",weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH.mm",LLLL:"dddd, D MMMM YYYY HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return s.default.locale(i,null,!0),i})});var ti=k((zt,At)=>{(function(n,t){typeof zt=="object"&&typeof At<"u"?At.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_my=t(n.dayjs)})(zt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"my",weekdays:"\u1010\u1014\u1004\u103A\u1039\u1002\u1014\u103D\u1031_\u1010\u1014\u1004\u103A\u1039\u101C\u102C_\u1021\u1004\u103A\u1039\u1002\u102B_\u1017\u102F\u1012\u1039\u1013\u101F\u1030\u1038_\u1000\u103C\u102C\u101E\u1015\u1010\u1031\u1038_\u101E\u1031\u102C\u1000\u103C\u102C_\u1005\u1014\u1031".split("_"),months:"\u1007\u1014\u103A\u1014\u101D\u102B\u101B\u102E_\u1016\u1031\u1016\u1031\u102C\u103A\u101D\u102B\u101B\u102E_\u1019\u1010\u103A_\u1027\u1015\u103C\u102E_\u1019\u1031_\u1007\u103D\u1014\u103A_\u1007\u1030\u101C\u102D\u102F\u1004\u103A_\u101E\u103C\u1002\u102F\u1010\u103A_\u1005\u1000\u103A\u1010\u1004\u103A\u1018\u102C_\u1021\u1031\u102C\u1000\u103A\u1010\u102D\u102F\u1018\u102C_\u1014\u102D\u102F\u101D\u1004\u103A\u1018\u102C_\u1012\u102E\u1007\u1004\u103A\u1018\u102C".split("_"),weekStart:1,weekdaysShort:"\u1014\u103D\u1031_\u101C\u102C_\u1002\u102B_\u101F\u1030\u1038_\u1000\u103C\u102C_\u101E\u1031\u102C_\u1014\u1031".split("_"),monthsShort:"\u1007\u1014\u103A_\u1016\u1031_\u1019\u1010\u103A_\u1015\u103C\u102E_\u1019\u1031_\u1007\u103D\u1014\u103A_\u101C\u102D\u102F\u1004\u103A_\u101E\u103C_\u1005\u1000\u103A_\u1021\u1031\u102C\u1000\u103A_\u1014\u102D\u102F_\u1012\u102E".split("_"),weekdaysMin:"\u1014\u103D\u1031_\u101C\u102C_\u1002\u102B_\u101F\u1030\u1038_\u1000\u103C\u102C_\u101E\u1031\u102C_\u1014\u1031".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"\u101C\u102C\u1019\u100A\u103A\u1037 %s \u1019\u103E\u102C",past:"\u101C\u103D\u1014\u103A\u1001\u1032\u1037\u101E\u1031\u102C %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103A.\u1021\u1014\u100A\u103A\u1038\u1004\u101A\u103A",m:"\u1010\u1005\u103A\u1019\u102D\u1014\u1005\u103A",mm:"%d \u1019\u102D\u1014\u1005\u103A",h:"\u1010\u1005\u103A\u1014\u102C\u101B\u102E",hh:"%d \u1014\u102C\u101B\u102E",d:"\u1010\u1005\u103A\u101B\u1000\u103A",dd:"%d \u101B\u1000\u103A",M:"\u1010\u1005\u103A\u101C",MM:"%d \u101C",y:"\u1010\u1005\u103A\u1014\u103E\u1005\u103A",yy:"%d \u1014\u103E\u1005\u103A"}};return s.default.locale(i,null,!0),i})});var ni=k((It,qt)=>{(function(n,t){typeof It=="object"&&typeof qt<"u"?qt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_nl=t(n.dayjs)})(It,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"nl",weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),ordinal:function(e){return"["+e+(e===1||e===8||e>=20?"ste":"de")+"]"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"een minuut",mm:"%d minuten",h:"een uur",hh:"%d uur",d:"een dag",dd:"%d dagen",M:"een maand",MM:"%d maanden",y:"een jaar",yy:"%d jaar"}};return s.default.locale(i,null,!0),i})});var ii=k((xt,Nt)=>{(function(n,t){typeof xt=="object"&&typeof Nt<"u"?Nt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_nb=t(n.dayjs)})(xt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"nb",weekdays:"s\xF8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xF8rdag".split("_"),weekdaysShort:"s\xF8._ma._ti._on._to._fr._l\xF8.".split("_"),weekdaysMin:"s\xF8_ma_ti_on_to_fr_l\xF8".split("_"),months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),ordinal:function(e){return e+"."},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xE5ned",MM:"%d m\xE5neder",y:"ett \xE5r",yy:"%d \xE5r"}};return s.default.locale(i,null,!0),i})});var si=k((Et,Ft)=>{(function(n,t){typeof Et=="object"&&typeof Ft<"u"?Ft.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pl=t(n.dayjs)})(Et,function(n){"use strict";function t(_){return _&&typeof _=="object"&&"default"in _?_:{default:_}}var s=t(n);function i(_){return _%10<5&&_%10>1&&~~(_/10)%10!=1}function e(_,y,l){var f=_+" ";switch(l){case"m":return y?"minuta":"minut\u0119";case"mm":return f+(i(_)?"minuty":"minut");case"h":return y?"godzina":"godzin\u0119";case"hh":return f+(i(_)?"godziny":"godzin");case"MM":return f+(i(_)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return f+(i(_)?"lata":"lat")}}var r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015Bnia_pa\u017Adziernika_listopada_grudnia".split("_"),a="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017Adziernik_listopad_grudzie\u0144".split("_"),u=/D MMMM/,o=function(_,y){return u.test(y)?r[_.month()]:a[_.month()]};o.s=a,o.f=r;var d={name:"pl",weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015Broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015Br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015Ar_Cz_Pt_So".split("_"),months:o,monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017A_lis_gru".split("_"),ordinal:function(_){return _+"."},weekStart:1,yearStart:4,relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:e,mm:e,h:e,hh:e,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:e,y:"rok",yy:e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return s.default.locale(d,null,!0),d})});var ri=k((Jt,Wt)=>{(function(n,t){typeof Jt=="object"&&typeof Wt<"u"?Wt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pt_br=t(n.dayjs)})(Jt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"pt-br",weekdays:"domingo_segunda-feira_ter\xE7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xE1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xE1b".split("_"),weekdaysMin:"Do_2\xAA_3\xAA_4\xAA_5\xAA_6\xAA_S\xE1".split("_"),months:"janeiro_fevereiro_mar\xE7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"\xBA"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xE0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xE0s] HH:mm"},relativeTime:{future:"em %s",past:"h\xE1 %s",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xEAs",MM:"%d meses",y:"um ano",yy:"%d anos"}};return s.default.locale(i,null,!0),i})});var ai=k((Ut,Pt)=>{(function(n,t){typeof Ut=="object"&&typeof Pt<"u"?Pt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pt=t(n.dayjs)})(Ut,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"pt",weekdays:"domingo_segunda-feira_ter\xE7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xE1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sab".split("_"),weekdaysMin:"Do_2\xAA_3\xAA_4\xAA_5\xAA_6\xAA_Sa".split("_"),months:"janeiro_fevereiro_mar\xE7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"\xBA"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xE0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xE0s] HH:mm"},relativeTime:{future:"em %s",past:"h\xE1 %s",s:"alguns segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xEAs",MM:"%d meses",y:"um ano",yy:"%d anos"}};return s.default.locale(i,null,!0),i})});var ui=k((Rt,Gt)=>{(function(n,t){typeof Rt=="object"&&typeof Gt<"u"?Gt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ro=t(n.dayjs)})(Rt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"ro",weekdays:"Duminic\u0103_Luni_Mar\u021Bi_Miercuri_Joi_Vineri_S\xE2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xE2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xE2".split("_"),months:"Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),monthsShort:"Ian._Febr._Mart._Apr._Mai_Iun._Iul._Aug._Sept._Oct._Nov._Dec.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},relativeTime:{future:"peste %s",past:"acum %s",s:"c\xE2teva secunde",m:"un minut",mm:"%d minute",h:"o or\u0103",hh:"%d ore",d:"o zi",dd:"%d zile",M:"o lun\u0103",MM:"%d luni",y:"un an",yy:"%d ani"},ordinal:function(e){return e}};return s.default.locale(i,null,!0),i})});var oi=k((Zt,Vt)=>{(function(n,t){typeof Zt=="object"&&typeof Vt<"u"?Vt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ru=t(n.dayjs)})(Zt,function(n){"use strict";function t(l){return l&&typeof l=="object"&&"default"in l?l:{default:l}}var s=t(n),i="\u044F\u043D\u0432\u0430\u0440\u044F_\u0444\u0435\u0432\u0440\u0430\u043B\u044F_\u043C\u0430\u0440\u0442\u0430_\u0430\u043F\u0440\u0435\u043B\u044F_\u043C\u0430\u044F_\u0438\u044E\u043D\u044F_\u0438\u044E\u043B\u044F_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F_\u043E\u043A\u0442\u044F\u0431\u0440\u044F_\u043D\u043E\u044F\u0431\u0440\u044F_\u0434\u0435\u043A\u0430\u0431\u0440\u044F".split("_"),e="\u044F\u043D\u0432\u0430\u0440\u044C_\u0444\u0435\u0432\u0440\u0430\u043B\u044C_\u043C\u0430\u0440\u0442_\u0430\u043F\u0440\u0435\u043B\u044C_\u043C\u0430\u0439_\u0438\u044E\u043D\u044C_\u0438\u044E\u043B\u044C_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C_\u043E\u043A\u0442\u044F\u0431\u0440\u044C_\u043D\u043E\u044F\u0431\u0440\u044C_\u0434\u0435\u043A\u0430\u0431\u0440\u044C".split("_"),r="\u044F\u043D\u0432._\u0444\u0435\u0432\u0440._\u043C\u0430\u0440._\u0430\u043F\u0440._\u043C\u0430\u044F_\u0438\u044E\u043D\u044F_\u0438\u044E\u043B\u044F_\u0430\u0432\u0433._\u0441\u0435\u043D\u0442._\u043E\u043A\u0442._\u043D\u043E\u044F\u0431._\u0434\u0435\u043A.".split("_"),a="\u044F\u043D\u0432._\u0444\u0435\u0432\u0440._\u043C\u0430\u0440\u0442_\u0430\u043F\u0440._\u043C\u0430\u0439_\u0438\u044E\u043D\u044C_\u0438\u044E\u043B\u044C_\u0430\u0432\u0433._\u0441\u0435\u043D\u0442._\u043E\u043A\u0442._\u043D\u043E\u044F\u0431._\u0434\u0435\u043A.".split("_"),u=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function o(l,f,m){var Y,L;return m==="m"?f?"\u043C\u0438\u043D\u0443\u0442\u0430":"\u043C\u0438\u043D\u0443\u0442\u0443":l+" "+(Y=+l,L={mm:f?"\u043C\u0438\u043D\u0443\u0442\u0430_\u043C\u0438\u043D\u0443\u0442\u044B_\u043C\u0438\u043D\u0443\u0442":"\u043C\u0438\u043D\u0443\u0442\u0443_\u043C\u0438\u043D\u0443\u0442\u044B_\u043C\u0438\u043D\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043E\u0432",dd:"\u0434\u0435\u043D\u044C_\u0434\u043D\u044F_\u0434\u043D\u0435\u0439",MM:"\u043C\u0435\u0441\u044F\u0446_\u043C\u0435\u0441\u044F\u0446\u0430_\u043C\u0435\u0441\u044F\u0446\u0435\u0432",yy:"\u0433\u043E\u0434_\u0433\u043E\u0434\u0430_\u043B\u0435\u0442"}[m].split("_"),Y%10==1&&Y%100!=11?L[0]:Y%10>=2&&Y%10<=4&&(Y%100<10||Y%100>=20)?L[1]:L[2])}var d=function(l,f){return u.test(f)?i[l.month()]:e[l.month()]};d.s=e,d.f=i;var _=function(l,f){return u.test(f)?r[l.month()]:a[l.month()]};_.s=a,_.f=r;var y={name:"ru",weekdays:"\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435_\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A_\u0432\u0442\u043E\u0440\u043D\u0438\u043A_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043F\u044F\u0442\u043D\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u0432\u0441\u043A_\u043F\u043D\u0434_\u0432\u0442\u0440_\u0441\u0440\u0434_\u0447\u0442\u0432_\u043F\u0442\u043D_\u0441\u0431\u0442".split("_"),weekdaysMin:"\u0432\u0441_\u043F\u043D_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043F\u0442_\u0441\u0431".split("_"),months:d,monthsShort:_,weekStart:1,yearStart:4,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043D\u0430\u0437\u0430\u0434",s:"\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u043A\u0443\u043D\u0434",m:o,mm:o,h:"\u0447\u0430\u0441",hh:o,d:"\u0434\u0435\u043D\u044C",dd:o,M:"\u043C\u0435\u0441\u044F\u0446",MM:o,y:"\u0433\u043E\u0434",yy:o},ordinal:function(l){return l},meridiem:function(l){return l<4?"\u043D\u043E\u0447\u0438":l<12?"\u0443\u0442\u0440\u0430":l<17?"\u0434\u043D\u044F":"\u0432\u0435\u0447\u0435\u0440\u0430"}};return s.default.locale(y,null,!0),y})});var di=k((Kt,Qt)=>{(function(n,t){typeof Kt=="object"&&typeof Qt<"u"?Qt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sv=t(n.dayjs)})(Kt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"sv",weekdays:"s\xF6ndag_m\xE5ndag_tisdag_onsdag_torsdag_fredag_l\xF6rdag".split("_"),weekdaysShort:"s\xF6n_m\xE5n_tis_ons_tor_fre_l\xF6r".split("_"),weekdaysMin:"s\xF6_m\xE5_ti_on_to_fr_l\xF6".split("_"),months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekStart:1,yearStart:4,ordinal:function(e){var r=e%10;return"["+e+(r===1||r===2?"a":"e")+"]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},relativeTime:{future:"om %s",past:"f\xF6r %s sedan",s:"n\xE5gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xE5nad",MM:"%d m\xE5nader",y:"ett \xE5r",yy:"%d \xE5r"}};return s.default.locale(i,null,!0),i})});var _i=k((Xt,Bt)=>{(function(n,t){typeof Xt=="object"&&typeof Bt<"u"?Bt.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_th=t(n.dayjs)})(Xt,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"th",weekdays:"\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C_\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C_\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23_\u0E1E\u0E38\u0E18_\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35_\u0E28\u0E38\u0E01\u0E23\u0E4C_\u0E40\u0E2A\u0E32\u0E23\u0E4C".split("_"),weekdaysShort:"\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C_\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C_\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23_\u0E1E\u0E38\u0E18_\u0E1E\u0E24\u0E2B\u0E31\u0E2A_\u0E28\u0E38\u0E01\u0E23\u0E4C_\u0E40\u0E2A\u0E32\u0E23\u0E4C".split("_"),weekdaysMin:"\u0E2D\u0E32._\u0E08._\u0E2D._\u0E1E._\u0E1E\u0E24._\u0E28._\u0E2A.".split("_"),months:"\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21_\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C_\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21_\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19_\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21_\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19_\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21_\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21_\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19_\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21_\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19_\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21".split("_"),monthsShort:"\u0E21.\u0E04._\u0E01.\u0E1E._\u0E21\u0E35.\u0E04._\u0E40\u0E21.\u0E22._\u0E1E.\u0E04._\u0E21\u0E34.\u0E22._\u0E01.\u0E04._\u0E2A.\u0E04._\u0E01.\u0E22._\u0E15.\u0E04._\u0E1E.\u0E22._\u0E18.\u0E04.".split("_"),formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0E40\u0E27\u0E25\u0E32 H:mm",LLLL:"\u0E27\u0E31\u0E19dddd\u0E17\u0E35\u0E48 D MMMM YYYY \u0E40\u0E27\u0E25\u0E32 H:mm"},relativeTime:{future:"\u0E2D\u0E35\u0E01 %s",past:"%s\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27",s:"\u0E44\u0E21\u0E48\u0E01\u0E35\u0E48\u0E27\u0E34\u0E19\u0E32\u0E17\u0E35",m:"1 \u0E19\u0E32\u0E17\u0E35",mm:"%d \u0E19\u0E32\u0E17\u0E35",h:"1 \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07",hh:"%d \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07",d:"1 \u0E27\u0E31\u0E19",dd:"%d \u0E27\u0E31\u0E19",M:"1 \u0E40\u0E14\u0E37\u0E2D\u0E19",MM:"%d \u0E40\u0E14\u0E37\u0E2D\u0E19",y:"1 \u0E1B\u0E35",yy:"%d \u0E1B\u0E35"},ordinal:function(e){return e+"."}};return s.default.locale(i,null,!0),i})});var fi=k((en,tn)=>{(function(n,t){typeof en=="object"&&typeof tn<"u"?tn.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_tr=t(n.dayjs)})(en,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"tr",weekdays:"Pazar_Pazartesi_Sal\u0131_\xC7ar\u015Famba_Per\u015Fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xC7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xC7a_Pe_Cu_Ct".split("_"),months:"Ocak_\u015Eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011Fustos_Eyl\xFCl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015Eub_Mar_Nis_May_Haz_Tem_A\u011Fu_Eyl_Eki_Kas_Ara".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s sonra",past:"%s \xF6nce",s:"birka\xE7 saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xFCn",dd:"%d g\xFCn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e){return e+"."}};return s.default.locale(i,null,!0),i})});var li=k((nn,sn)=>{(function(n,t){typeof nn=="object"&&typeof sn<"u"?sn.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_uk=t(n.dayjs)})(nn,function(n){"use strict";function t(d){return d&&typeof d=="object"&&"default"in d?d:{default:d}}var s=t(n),i="\u0441\u0456\u0447\u043D\u044F_\u043B\u044E\u0442\u043E\u0433\u043E_\u0431\u0435\u0440\u0435\u0437\u043D\u044F_\u043A\u0432\u0456\u0442\u043D\u044F_\u0442\u0440\u0430\u0432\u043D\u044F_\u0447\u0435\u0440\u0432\u043D\u044F_\u043B\u0438\u043F\u043D\u044F_\u0441\u0435\u0440\u043F\u043D\u044F_\u0432\u0435\u0440\u0435\u0441\u043D\u044F_\u0436\u043E\u0432\u0442\u043D\u044F_\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043D\u044F".split("_"),e="\u0441\u0456\u0447\u0435\u043D\u044C_\u043B\u044E\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043D\u044C_\u043A\u0432\u0456\u0442\u0435\u043D\u044C_\u0442\u0440\u0430\u0432\u0435\u043D\u044C_\u0447\u0435\u0440\u0432\u0435\u043D\u044C_\u043B\u0438\u043F\u0435\u043D\u044C_\u0441\u0435\u0440\u043F\u0435\u043D\u044C_\u0432\u0435\u0440\u0435\u0441\u0435\u043D\u044C_\u0436\u043E\u0432\u0442\u0435\u043D\u044C_\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043D\u044C".split("_"),r=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function a(d,_,y){var l,f;return y==="m"?_?"\u0445\u0432\u0438\u043B\u0438\u043D\u0430":"\u0445\u0432\u0438\u043B\u0438\u043D\u0443":y==="h"?_?"\u0433\u043E\u0434\u0438\u043D\u0430":"\u0433\u043E\u0434\u0438\u043D\u0443":d+" "+(l=+d,f={ss:_?"\u0441\u0435\u043A\u0443\u043D\u0434\u0430_\u0441\u0435\u043A\u0443\u043D\u0434\u0438_\u0441\u0435\u043A\u0443\u043D\u0434":"\u0441\u0435\u043A\u0443\u043D\u0434\u0443_\u0441\u0435\u043A\u0443\u043D\u0434\u0438_\u0441\u0435\u043A\u0443\u043D\u0434",mm:_?"\u0445\u0432\u0438\u043B\u0438\u043D\u0430_\u0445\u0432\u0438\u043B\u0438\u043D\u0438_\u0445\u0432\u0438\u043B\u0438\u043D":"\u0445\u0432\u0438\u043B\u0438\u043D\u0443_\u0445\u0432\u0438\u043B\u0438\u043D\u0438_\u0445\u0432\u0438\u043B\u0438\u043D",hh:_?"\u0433\u043E\u0434\u0438\u043D\u0430_\u0433\u043E\u0434\u0438\u043D\u0438_\u0433\u043E\u0434\u0438\u043D":"\u0433\u043E\u0434\u0438\u043D\u0443_\u0433\u043E\u0434\u0438\u043D\u0438_\u0433\u043E\u0434\u0438\u043D",dd:"\u0434\u0435\u043D\u044C_\u0434\u043D\u0456_\u0434\u043D\u0456\u0432",MM:"\u043C\u0456\u0441\u044F\u0446\u044C_\u043C\u0456\u0441\u044F\u0446\u0456_\u043C\u0456\u0441\u044F\u0446\u0456\u0432",yy:"\u0440\u0456\u043A_\u0440\u043E\u043A\u0438_\u0440\u043E\u043A\u0456\u0432"}[y].split("_"),l%10==1&&l%100!=11?f[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?f[1]:f[2])}var u=function(d,_){return r.test(_)?i[d.month()]:e[d.month()]};u.s=e,u.f=i;var o={name:"uk",weekdays:"\u043D\u0435\u0434\u0456\u043B\u044F_\u043F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A_\u0432\u0456\u0432\u0442\u043E\u0440\u043E\u043A_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043F\u2019\u044F\u0442\u043D\u0438\u0446\u044F_\u0441\u0443\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u043D\u0434\u043B_\u043F\u043D\u0434_\u0432\u0442\u0440_\u0441\u0440\u0434_\u0447\u0442\u0432_\u043F\u0442\u043D_\u0441\u0431\u0442".split("_"),weekdaysMin:"\u043D\u0434_\u043F\u043D_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043F\u0442_\u0441\u0431".split("_"),months:u,monthsShort:"\u0441\u0456\u0447_\u043B\u044E\u0442_\u0431\u0435\u0440_\u043A\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043B\u0438\u043F_\u0441\u0435\u0440\u043F_\u0432\u0435\u0440_\u0436\u043E\u0432\u0442_\u043B\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekStart:1,relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043E\u043C\u0443",s:"\u0434\u0435\u043A\u0456\u043B\u044C\u043A\u0430 \u0441\u0435\u043A\u0443\u043D\u0434",m:a,mm:a,h:a,hh:a,d:"\u0434\u0435\u043D\u044C",dd:a,M:"\u043C\u0456\u0441\u044F\u0446\u044C",MM:a,y:"\u0440\u0456\u043A",yy:a},ordinal:function(d){return d},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"}};return s.default.locale(o,null,!0),o})});var mi=k((rn,an)=>{(function(n,t){typeof rn=="object"&&typeof an<"u"?an.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_vi=t(n.dayjs)})(rn,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"vi",weekdays:"ch\u1EE7 nh\u1EADt_th\u1EE9 hai_th\u1EE9 ba_th\u1EE9 t\u01B0_th\u1EE9 n\u0103m_th\u1EE9 s\xE1u_th\u1EE9 b\u1EA3y".split("_"),months:"th\xE1ng 1_th\xE1ng 2_th\xE1ng 3_th\xE1ng 4_th\xE1ng 5_th\xE1ng 6_th\xE1ng 7_th\xE1ng 8_th\xE1ng 9_th\xE1ng 10_th\xE1ng 11_th\xE1ng 12".split("_"),weekStart:1,weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},relativeTime:{future:"%s t\u1EDBi",past:"%s tr\u01B0\u1EDBc",s:"v\xE0i gi\xE2y",m:"m\u1ED9t ph\xFAt",mm:"%d ph\xFAt",h:"m\u1ED9t gi\u1EDD",hh:"%d gi\u1EDD",d:"m\u1ED9t ng\xE0y",dd:"%d ng\xE0y",M:"m\u1ED9t th\xE1ng",MM:"%d th\xE1ng",y:"m\u1ED9t n\u0103m",yy:"%d n\u0103m"}};return s.default.locale(i,null,!0),i})});var ci=k((un,on)=>{(function(n,t){typeof un=="object"&&typeof on<"u"?on.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_cn=t(n.dayjs)})(un,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"zh-cn",weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e,r){return r==="W"?e+"\u5468":e+"\u65E5"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5Ah\u70B9mm\u5206",LLLL:"YYYY\u5E74M\u6708D\u65E5ddddAh\u70B9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5185",past:"%s\u524D",s:"\u51E0\u79D2",m:"1 \u5206\u949F",mm:"%d \u5206\u949F",h:"1 \u5C0F\u65F6",hh:"%d \u5C0F\u65F6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4E2A\u6708",MM:"%d \u4E2A\u6708",y:"1 \u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var a=100*e+r;return a<600?"\u51CC\u6668":a<900?"\u65E9\u4E0A":a<1100?"\u4E0A\u5348":a<1300?"\u4E2D\u5348":a<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return s.default.locale(i,null,!0),i})});var hi=k((dn,_n)=>{(function(n,t){typeof dn=="object"&&typeof _n<"u"?_n.exports=t(j()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_tw=t(n.dayjs)})(dn,function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var s=t(n),i={name:"zh-tw",weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u9031\u65E5_\u9031\u4E00_\u9031\u4E8C_\u9031\u4E09_\u9031\u56DB_\u9031\u4E94_\u9031\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e,r){return r==="W"?e+"\u9031":e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5167",past:"%s\u524D",s:"\u5E7E\u79D2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500B\u6708",MM:"%d \u500B\u6708",y:"1 \u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var a=100*e+r;return a<600?"\u51CC\u6668":a<900?"\u65E9\u4E0A":a<1100?"\u4E0A\u5348":a<1300?"\u4E2D\u5348":a<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return s.default.locale(i,null,!0),i})});var ln=60,mn=ln*60,cn=mn*24,ji=cn*7,ae=1e3,ce=ln*ae,ge=mn*ae,hn=cn*ae,Mn=ji*ae,_e="millisecond",te="second",ne="minute",ie="hour",V="day",oe="week",R="month",he="quarter",K="year",se="date",yn="YYYY-MM-DDTHH:mm:ssZ",Se="Invalid Date",Yn=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,pn=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;var Ln={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var s=["th","st","nd","rd"],i=t%100;return"["+t+(s[(i-20)%10]||s[i]||s[0])+"]"}};var be=function(t,s,i){var e=String(t);return!e||e.length>=s?t:""+Array(s+1-e.length).join(i)+t},Ti=function(t){var s=-t.utcOffset(),i=Math.abs(s),e=Math.floor(i/60),r=i%60;return(s<=0?"+":"-")+be(e,2,"0")+":"+be(r,2,"0")},wi=function n(t,s){if(t.date()1)return n(a[0])}else{var u=t.name;ue[u]=t,e=u}return!i&&e&&(fe=e),e||!i&&fe},F=function(t,s){if(ke(t))return t.clone();var i=typeof s=="object"?s:{};return i.date=t,i.args=arguments,new ye(i)},zi=function(t,s){return F(t,{locale:s.$L,utc:s.$u,x:s.$x,$offset:s.$offset})},z=vn;z.l=Me;z.i=ke;z.w=zi;var Ai=function(t){var s=t.date,i=t.utc;if(s===null)return new Date(NaN);if(z.u(s))return new Date;if(s instanceof Date)return new Date(s);if(typeof s=="string"&&!/Z$/i.test(s)){var e=s.match(Yn);if(e){var r=e[2]-1||0,a=(e[7]||"0").substring(0,3);return i?new Date(Date.UTC(e[1],r,e[3]||1,e[4]||0,e[5]||0,e[6]||0,a)):new Date(e[1],r,e[3]||1,e[4]||0,e[5]||0,e[6]||0,a)}}return new Date(s)},ye=function(){function n(s){this.$L=Me(s.locale,null,!0),this.parse(s),this.$x=this.$x||s.x||{},this[gn]=!0}var t=n.prototype;return t.parse=function(i){this.$d=Ai(i),this.init()},t.init=function(){var i=this.$d;this.$y=i.getFullYear(),this.$M=i.getMonth(),this.$D=i.getDate(),this.$W=i.getDay(),this.$H=i.getHours(),this.$m=i.getMinutes(),this.$s=i.getSeconds(),this.$ms=i.getMilliseconds()},t.$utils=function(){return z},t.isValid=function(){return this.$d.toString()!==Se},t.isSame=function(i,e){var r=F(i);return this.startOf(e)<=r&&r<=this.endOf(e)},t.isAfter=function(i,e){return F(i)this.togglePanelVisibility(this.$refs.button)),this.$watch("focusedMonth",()=>{this.focusedMonth=+this.focusedMonth,this.focusedDate.month()!==this.focusedMonth&&(this.focusedDate=this.focusedDate.month(this.focusedMonth))}),this.$watch("focusedYear",()=>{if(this.focusedYear?.length>4&&(this.focusedYear=this.focusedYear.substring(0,4)),!this.focusedYear||this.focusedYear?.length!==4)return;let o=+this.focusedYear;Number.isInteger(o)||(o=O().tz(a).year(),this.focusedYear=o),this.focusedDate.year()!==o&&(this.focusedDate=this.focusedDate.year(o))}),this.$watch("focusedDate",()=>{let o=this.focusedDate.month(),d=this.focusedDate.year();this.focusedMonth!==o&&(this.focusedMonth=o),this.focusedYear!==d&&(this.focusedYear=d),this.setupDaysGrid()}),this.$watch("hour",()=>{let o=+this.hour;if(Number.isInteger(o)?o>23?this.hour=0:o<0?this.hour=23:this.hour=o:this.hour=0,this.isClearingState)return;let d=this.getSelectedDate()??this.focusedDate;this.setState(d.hour(this.hour??0))}),this.$watch("minute",()=>{let o=+this.minute;if(Number.isInteger(o)?o>59?this.minute=0:o<0?this.minute=59:this.minute=o:this.minute=0,this.isClearingState)return;let d=this.getSelectedDate()??this.focusedDate;this.setState(d.minute(this.minute??0))}),this.$watch("second",()=>{let o=+this.second;if(Number.isInteger(o)?o>59?this.second=0:o<0?this.second=59:this.second=o:this.second=0,this.isClearingState)return;let d=this.getSelectedDate()??this.focusedDate;this.setState(d.second(this.second??0))}),this.$watch("state",()=>{if(this.state===void 0)return;let o=this.getSelectedDate();if(o===null){this.clearState();return}this.getMaxDate()!==null&&o?.isAfter(this.getMaxDate())&&(o=null),this.getMinDate()!==null&&o?.isBefore(this.getMinDate())&&(o=null);let d=o?.hour()??0;this.hour!==d&&(this.hour=d);let _=o?.minute()??0;this.minute!==_&&(this.minute=_);let y=o?.second()??0;this.second!==y&&(this.second=y),this.setDisplayText()})},clearState:function(){this.isClearingState=!0,this.setState(null),this.hour=0,this.minute=0,this.second=0,this.$nextTick(()=>this.isClearingState=!1)},dateIsDisabled:function(u){return!!(this.$refs?.disabledDates&&JSON.parse(this.$refs.disabledDates.value??[]).some(o=>(o=O(o),o.isValid()?o.isSame(u,"day"):!1))||this.getMaxDate()&&u.isAfter(this.getMaxDate(),"day")||this.getMinDate()&&u.isBefore(this.getMinDate(),"day"))},dayIsDisabled:function(u){return this.focusedDate??(this.focusedDate=O().tz(a)),this.dateIsDisabled(this.focusedDate.date(u))},dayIsSelected:function(u){let o=this.getSelectedDate();return o===null?!1:(this.focusedDate??(this.focusedDate=O().tz(a)),o.date()===u&&o.month()===this.focusedDate.month()&&o.year()===this.focusedDate.year())},dayIsToday:function(u){let o=O().tz(a);return this.focusedDate??(this.focusedDate=o),o.date()===u&&o.month()===this.focusedDate.month()&&o.year()===this.focusedDate.year()},focusPreviousDay:function(){this.focusedDate??(this.focusedDate=O().tz(a)),this.focusedDate=this.focusedDate.subtract(1,"day")},focusPreviousWeek:function(){this.focusedDate??(this.focusedDate=O().tz(a)),this.focusedDate=this.focusedDate.subtract(1,"week")},focusNextDay:function(){this.focusedDate??(this.focusedDate=O().tz(a)),this.focusedDate=this.focusedDate.add(1,"day")},focusNextWeek:function(){this.focusedDate??(this.focusedDate=O().tz(a)),this.focusedDate=this.focusedDate.add(1,"week")},getDayLabels:function(){let u=O.weekdaysShort();return t===0?u:[...u.slice(t),...u.slice(0,t)]},getMaxDate:function(){let u=O(this.$refs.maxDate?.value);return u.isValid()?u:null},getMinDate:function(){let u=O(this.$refs.minDate?.value);return u.isValid()?u:null},getSelectedDate:function(){if(this.state===void 0||this.state===null)return null;let u=O(this.state);return u.isValid()?u:null},togglePanelVisibility:function(){this.isOpen()||(this.focusedDate=this.getSelectedDate()??this.getMinDate()??O().tz(a),this.setupDaysGrid()),this.$refs.panel.toggle(this.$refs.button)},selectDate:function(u=null){u&&this.setFocusedDay(u),this.focusedDate??(this.focusedDate=O().tz(a)),this.setState(this.focusedDate),e&&this.togglePanelVisibility()},setDisplayText:function(){this.displayText=this.getSelectedDate()?this.getSelectedDate().format(n):""},setMonths:function(){this.months=O.months()},setDayLabels:function(){this.dayLabels=this.getDayLabels()},setupDaysGrid:function(){this.focusedDate??(this.focusedDate=O().tz(a)),this.emptyDaysInFocusedMonth=Array.from({length:this.focusedDate.date(8-t).day()},(u,o)=>o+1),this.daysInFocusedMonth=Array.from({length:this.focusedDate.daysInMonth()},(u,o)=>o+1)},setFocusedDay:function(u){this.focusedDate=(this.focusedDate??O().tz(a)).date(u)},setState:function(u){if(u===null){this.state=null,this.setDisplayText();return}this.dateIsDisabled(u)||(this.state=u.hour(this.hour??0).minute(this.minute??0).second(this.second??0).format("YYYY-MM-DD HH:mm:ss"),this.setDisplayText())},isOpen:function(){return this.$refs.panel?.style.display==="block"}}}var Mi={ar:wn(),bs:$n(),ca:Cn(),ckb:Pe(),cs:zn(),cy:An(),da:In(),de:qn(),en:xn(),es:Nn(),et:En(),fa:Fn(),fi:Jn(),fr:Wn(),hi:Un(),hu:Pn(),hy:Rn(),id:Gn(),it:Zn(),ja:Vn(),ka:Kn(),km:Qn(),ku:Pe(),lt:Xn(),lv:Bn(),ms:ei(),my:ti(),nl:ni(),no:ii(),pl:si(),pt_BR:ri(),pt_PT:ai(),ro:ui(),ru:oi(),sv:di(),th:_i(),tr:fi(),uk:li(),vi:mi(),zh_CN:ci(),zh_TW:hi()};export{Ii as default}; +var Gi=Object.create;var Hn=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var Zi=Object.getOwnPropertyNames;var Vi=Object.getPrototypeOf,Ki=Object.prototype.hasOwnProperty;var v=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports);var Qi=(n,t,a,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of Zi(t))!Ki.call(n,e)&&e!==a&&Hn(n,e,{get:()=>t[e],enumerable:!(i=Ri(t,e))||i.enumerable});return n};var oe=(n,t,a)=>(a=n!=null?Gi(Vi(n)):{},Qi(t||!n||!n.__esModule?Hn(a,"default",{value:n,enumerable:!0}):a,n));var En=v((He,je)=>{(function(n,t){typeof He=="object"&&typeof je<"u"?je.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_advancedFormat=t()})(He,(function(){"use strict";return function(n,t){var a=t.prototype,i=a.format;a.format=function(e){var r=this,s=this.$locale();if(!this.isValid())return i.bind(this)(e);var _=this.$utils(),d=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(u){switch(u){case"Q":return Math.ceil((r.$M+1)/3);case"Do":return s.ordinal(r.$D);case"gggg":return r.weekYear();case"GGGG":return r.isoWeekYear();case"wo":return s.ordinal(r.week(),"W");case"w":case"ww":return _.s(r.week(),u==="w"?1:2,"0");case"W":case"WW":return _.s(r.isoWeek(),u==="W"?1:2,"0");case"k":case"kk":return _.s(String(r.$H===0?24:r.$H),u==="k"?1:2,"0");case"X":return Math.floor(r.$d.getTime()/1e3);case"x":return r.$d.getTime();case"z":return"["+r.offsetName()+"]";case"zzz":return"["+r.offsetName("long")+"]";default:return u}}));return i.bind(this)(d)}}}))});var Jn=v((Te,we)=>{(function(n,t){typeof Te=="object"&&typeof we<"u"?we.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_customParseFormat=t()})(Te,(function(){"use strict";var n={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},t=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,a=/\d/,i=/\d\d/,e=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,s={},_=function(c){return(c=+c)+(c>68?1900:2e3)},d=function(c){return function(y){this[c]=+y}},u=[/[+-]\d\d:?(\d\d)?|Z/,function(c){(this.zone||(this.zone={})).offset=(function(y){if(!y||y==="Z")return 0;var D=y.match(/([+-]|\d\d)/g),L=60*D[1]+(+D[2]||0);return L===0?0:D[0]==="+"?-L:L})(c)}],o=function(c){var y=s[c];return y&&(y.indexOf?y:y.s.concat(y.f))},f=function(c,y){var D,L=s.meridiem;if(L){for(var w=1;w<=24;w+=1)if(c.indexOf(L(w,0,y))>-1){D=w>12;break}}else D=c===(y?"pm":"PM");return D},l={A:[r,function(c){this.afternoon=f(c,!1)}],a:[r,function(c){this.afternoon=f(c,!0)}],Q:[a,function(c){this.month=3*(c-1)+1}],S:[a,function(c){this.milliseconds=100*+c}],SS:[i,function(c){this.milliseconds=10*+c}],SSS:[/\d{3}/,function(c){this.milliseconds=+c}],s:[e,d("seconds")],ss:[e,d("seconds")],m:[e,d("minutes")],mm:[e,d("minutes")],H:[e,d("hours")],h:[e,d("hours")],HH:[e,d("hours")],hh:[e,d("hours")],D:[e,d("day")],DD:[i,d("day")],Do:[r,function(c){var y=s.ordinal,D=c.match(/\d+/);if(this.day=D[0],y)for(var L=1;L<=31;L+=1)y(L).replace(/\[|\]/g,"")===c&&(this.day=L)}],w:[e,d("week")],ww:[i,d("week")],M:[e,d("month")],MM:[i,d("month")],MMM:[r,function(c){var y=o("months"),D=(o("monthsShort")||y.map((function(L){return L.slice(0,3)}))).indexOf(c)+1;if(D<1)throw new Error;this.month=D%12||D}],MMMM:[r,function(c){var y=o("months").indexOf(c)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,d("year")],YY:[i,function(c){this.year=_(c)}],YYYY:[/\d{4}/,d("year")],Z:u,ZZ:u};function m(c){var y,D;y=c,D=s&&s.formats;for(var L=(c=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function($,j,U){var W=U&&U.toUpperCase();return j||D[U]||n[U]||D[W].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(g,M,h){return M||h.slice(1)}))}))).match(t),w=L.length,b=0;b-1)return new Date((Y==="X"?1e3:1)*p);var T=m(Y)(p),q=T.year,N=T.month,F=T.day,P=T.hours,B=T.minutes,Q=T.seconds,ae=T.milliseconds,Z=T.zone,J=T.week,R=new Date,X=F||(q||N?1:R.getDate()),ee=q||R.getFullYear(),fe=0;q&&!N||(fe=N>0?N-1:R.getMonth());var me,pe=P||0,Le=B||0,De=Q||0,ve=ae||0;return Z?new Date(Date.UTC(ee,fe,X,pe,Le,De,ve+60*Z.offset*1e3)):S?new Date(Date.UTC(ee,fe,X,pe,Le,De,ve)):(me=new Date(ee,fe,X,pe,Le,De,ve),J&&(me=H(me).week(J).toDate()),me)}catch{return new Date("")}})(C,x,A,D),this.init(),W&&W!==!0&&(this.$L=this.locale(W).$L),U&&C!=this.format(x)&&(this.$d=new Date("")),s={}}else if(x instanceof Array)for(var g=x.length,M=1;M<=g;M+=1){I[1]=x[M-1];var h=D.apply(this,I);if(h.isValid()){this.$d=h.$d,this.$L=h.$L,this.init();break}M===g&&(this.$d=new Date(""))}else w.call(this,b)}}}))});var Un=v(($e,Ce)=>{(function(n,t){typeof $e=="object"&&typeof Ce<"u"?Ce.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_localeData=t()})($e,(function(){"use strict";return function(n,t,a){var i=t.prototype,e=function(u){return u&&(u.indexOf?u:u.s)},r=function(u,o,f,l,m){var c=u.name?u:u.$locale(),y=e(c[o]),D=e(c[f]),L=y||D.map((function(b){return b.slice(0,l)}));if(!m)return L;var w=c.weekStart;return L.map((function(b,C){return L[(C+(w||0))%7]}))},s=function(){return a.Ls[a.locale()]},_=function(u,o){return u.formats[o]||(function(f){return f.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(l,m,c){return m||c.slice(1)}))})(u.formats[o.toUpperCase()])},d=function(){var u=this;return{months:function(o){return o?o.format("MMMM"):r(u,"months")},monthsShort:function(o){return o?o.format("MMM"):r(u,"monthsShort","months",3)},firstDayOfWeek:function(){return u.$locale().weekStart||0},weekdays:function(o){return o?o.format("dddd"):r(u,"weekdays")},weekdaysMin:function(o){return o?o.format("dd"):r(u,"weekdaysMin","weekdays",2)},weekdaysShort:function(o){return o?o.format("ddd"):r(u,"weekdaysShort","weekdays",3)},longDateFormat:function(o){return _(u.$locale(),o)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}};i.localeData=function(){return d.bind(this)()},a.localeData=function(){var u=s();return{firstDayOfWeek:function(){return u.weekStart||0},weekdays:function(){return a.weekdays()},weekdaysShort:function(){return a.weekdaysShort()},weekdaysMin:function(){return a.weekdaysMin()},months:function(){return a.months()},monthsShort:function(){return a.monthsShort()},longDateFormat:function(o){return _(u,o)},meridiem:u.meridiem,ordinal:u.ordinal}},a.months=function(){return r(s(),"months")},a.monthsShort=function(){return r(s(),"monthsShort","months",3)},a.weekdays=function(u){return r(s(),"weekdays",null,null,u)},a.weekdaysShort=function(u){return r(s(),"weekdaysShort","weekdays",3,u)},a.weekdaysMin=function(u){return r(s(),"weekdaysMin","weekdays",2,u)}}}))});var Wn=v((Oe,ze)=>{(function(n,t){typeof Oe=="object"&&typeof ze<"u"?ze.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_timezone=t()})(Oe,(function(){"use strict";var n={year:0,month:1,day:2,hour:3,minute:4,second:5},t={};return function(a,i,e){var r,s=function(o,f,l){l===void 0&&(l={});var m=new Date(o),c=(function(y,D){D===void 0&&(D={});var L=D.timeZoneName||"short",w=y+"|"+L,b=t[w];return b||(b=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:y,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:L}),t[w]=b),b})(f,l);return c.formatToParts(m)},_=function(o,f){for(var l=s(o,f),m=[],c=0;c=0&&(m[w]=parseInt(L,10))}var b=m[3],C=b===24?0:b,A=m[0]+"-"+m[1]+"-"+m[2]+" "+C+":"+m[4]+":"+m[5]+":000",I=+o;return(e.utc(A).valueOf()-(I-=I%1e3))/6e4},d=i.prototype;d.tz=function(o,f){o===void 0&&(o=r);var l,m=this.utcOffset(),c=this.toDate(),y=c.toLocaleString("en-US",{timeZone:o}),D=Math.round((c-new Date(y))/1e3/60),L=15*-Math.round(c.getTimezoneOffset()/15)-D;if(!Number(L))l=this.utcOffset(0,f);else if(l=e(y,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(L,!0),f){var w=l.utcOffset();l=l.add(m-w,"minute")}return l.$x.$timezone=o,l},d.offsetName=function(o){var f=this.$x.$timezone||e.tz.guess(),l=s(this.valueOf(),f,{timeZoneName:o}).find((function(m){return m.type.toLowerCase()==="timezonename"}));return l&&l.value};var u=d.startOf;d.startOf=function(o,f){if(!this.$x||!this.$x.$timezone)return u.call(this,o,f);var l=e(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return u.call(l,o,f).tz(this.$x.$timezone,!0)},e.tz=function(o,f,l){var m=l&&f,c=l||f||r,y=_(+e(),c);if(typeof o!="string")return e(o).tz(c);var D=(function(C,A,I){var x=C-60*A*1e3,$=_(x,I);if(A===$)return[x,A];var j=_(x-=60*($-A)*1e3,I);return $===j?[x,$]:[C-60*Math.min($,j)*1e3,Math.max($,j)]})(e.utc(o,m).valueOf(),y,c),L=D[0],w=D[1],b=e(L).utcOffset(w);return b.$x.$timezone=c,b},e.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},e.tz.setDefault=function(o){r=o}}}))});var Pn=v((Ae,qe)=>{(function(n,t){typeof Ae=="object"&&typeof qe<"u"?qe.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_utc=t()})(Ae,(function(){"use strict";var n="minute",t=/[+-]\d\d(?::?\d\d)?/g,a=/([+-]|\d\d)/g;return function(i,e,r){var s=e.prototype;r.utc=function(m){var c={date:m,utc:!0,args:arguments};return new e(c)},s.utc=function(m){var c=r(this.toDate(),{locale:this.$L,utc:!0});return m?c.add(this.utcOffset(),n):c},s.local=function(){return r(this.toDate(),{locale:this.$L,utc:!1})};var _=s.parse;s.parse=function(m){m.utc&&(this.$u=!0),this.$utils().u(m.$offset)||(this.$offset=m.$offset),_.call(this,m)};var d=s.init;s.init=function(){if(this.$u){var m=this.$d;this.$y=m.getUTCFullYear(),this.$M=m.getUTCMonth(),this.$D=m.getUTCDate(),this.$W=m.getUTCDay(),this.$H=m.getUTCHours(),this.$m=m.getUTCMinutes(),this.$s=m.getUTCSeconds(),this.$ms=m.getUTCMilliseconds()}else d.call(this)};var u=s.utcOffset;s.utcOffset=function(m,c){var y=this.$utils().u;if(y(m))return this.$u?0:y(this.$offset)?u.call(this):this.$offset;if(typeof m=="string"&&(m=(function(b){b===void 0&&(b="");var C=b.match(t);if(!C)return null;var A=(""+C[0]).match(a)||["-",0,0],I=A[0],x=60*+A[1]+ +A[2];return x===0?0:I==="+"?x:-x})(m),m===null))return this;var D=Math.abs(m)<=16?60*m:m;if(D===0)return this.utc(c);var L=this.clone();if(c)return L.$offset=D,L.$u=!1,L;var w=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(L=this.local().add(D+w,n)).$offset=D,L.$x.$localOffset=w,L};var o=s.format;s.format=function(m){var c=m||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return o.call(this,c)},s.valueOf=function(){var m=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*m},s.isUTC=function(){return!!this.$u},s.toISOString=function(){return this.toDate().toISOString()},s.toString=function(){return this.toDate().toUTCString()};var f=s.toDate;s.toDate=function(m){return m==="s"&&this.$offset?r(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():f.call(this)};var l=s.diff;s.diff=function(m,c,y){if(m&&this.$u===m.$u)return l.call(this,m,c,y);var D=this.local(),L=r(m).local();return l.call(D,L,c,y)}}}))});var k=v((Ie,xe)=>{(function(n,t){typeof Ie=="object"&&typeof xe<"u"?xe.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs=t()})(Ie,(function(){"use strict";var n=1e3,t=6e4,a=36e5,i="millisecond",e="second",r="minute",s="hour",_="day",d="week",u="month",o="quarter",f="year",l="date",m="Invalid Date",c=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,D={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(g){var M=["th","st","nd","rd"],h=g%100;return"["+g+(M[(h-20)%10]||M[h]||M[0])+"]"}},L=function(g,M,h){var p=String(g);return!p||p.length>=M?g:""+Array(M+1-p.length).join(h)+g},w={s:L,z:function(g){var M=-g.utcOffset(),h=Math.abs(M),p=Math.floor(h/60),Y=h%60;return(M<=0?"+":"-")+L(p,2,"0")+":"+L(Y,2,"0")},m:function g(M,h){if(M.date()1)return g(H[0])}else{var T=M.name;C[T]=M,Y=T}return!p&&Y&&(b=Y),Y||!p&&b},$=function(g,M){if(I(g))return g.clone();var h=typeof M=="object"?M:{};return h.date=g,h.args=arguments,new U(h)},j=w;j.l=x,j.i=I,j.w=function(g,M){return $(g,{locale:M.$L,utc:M.$u,x:M.$x,$offset:M.$offset})};var U=(function(){function g(h){this.$L=x(h.locale,null,!0),this.parse(h),this.$x=this.$x||h.x||{},this[A]=!0}var M=g.prototype;return M.parse=function(h){this.$d=(function(p){var Y=p.date,S=p.utc;if(Y===null)return new Date(NaN);if(j.u(Y))return new Date;if(Y instanceof Date)return new Date(Y);if(typeof Y=="string"&&!/Z$/i.test(Y)){var H=Y.match(c);if(H){var T=H[2]-1||0,q=(H[7]||"0").substring(0,3);return S?new Date(Date.UTC(H[1],T,H[3]||1,H[4]||0,H[5]||0,H[6]||0,q)):new Date(H[1],T,H[3]||1,H[4]||0,H[5]||0,H[6]||0,q)}}return new Date(Y)})(h),this.init()},M.init=function(){var h=this.$d;this.$y=h.getFullYear(),this.$M=h.getMonth(),this.$D=h.getDate(),this.$W=h.getDay(),this.$H=h.getHours(),this.$m=h.getMinutes(),this.$s=h.getSeconds(),this.$ms=h.getMilliseconds()},M.$utils=function(){return j},M.isValid=function(){return this.$d.toString()!==m},M.isSame=function(h,p){var Y=$(h);return this.startOf(p)<=Y&&Y<=this.endOf(p)},M.isAfter=function(h,p){return $(h){(function(n,t){typeof Ne=="object"&&typeof Fe<"u"?Fe.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_am=t(n.dayjs)})(Ne,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"am",weekdays:"\u12A5\u1211\u12F5_\u1230\u129E_\u121B\u12AD\u1230\u129E_\u1228\u1261\u12D5_\u1210\u1219\u1235_\u12A0\u122D\u1265_\u1245\u12F3\u121C".split("_"),weekdaysShort:"\u12A5\u1211\u12F5_\u1230\u129E_\u121B\u12AD\u1230_\u1228\u1261\u12D5_\u1210\u1219\u1235_\u12A0\u122D\u1265_\u1245\u12F3\u121C".split("_"),weekdaysMin:"\u12A5\u1211_\u1230\u129E_\u121B\u12AD_\u1228\u1261_\u1210\u1219_\u12A0\u122D_\u1245\u12F3".split("_"),months:"\u1303\u1295\u12CB\u122A_\u134C\u1265\u122F\u122A_\u121B\u122D\u127D_\u12A4\u1355\u122A\u120D_\u121C\u12ED_\u1301\u1295_\u1301\u120B\u12ED_\u12A6\u1308\u1235\u1275_\u1234\u1355\u1274\u121D\u1260\u122D_\u12A6\u12AD\u1276\u1260\u122D_\u1296\u126C\u121D\u1260\u122D_\u12F2\u1234\u121D\u1260\u122D".split("_"),monthsShort:"\u1303\u1295\u12CB_\u134C\u1265\u122F_\u121B\u122D\u127D_\u12A4\u1355\u122A_\u121C\u12ED_\u1301\u1295_\u1301\u120B\u12ED_\u12A6\u1308\u1235_\u1234\u1355\u1274_\u12A6\u12AD\u1276_\u1296\u126C\u121D_\u12F2\u1234\u121D".split("_"),weekStart:1,yearStart:4,relativeTime:{future:"\u1260%s",past:"%s \u1260\u134A\u1275",s:"\u1325\u1242\u1275 \u1230\u12A8\u1295\u12F6\u127D",m:"\u12A0\u1295\u12F5 \u12F0\u1242\u1243",mm:"%d \u12F0\u1242\u1243\u12CE\u127D",h:"\u12A0\u1295\u12F5 \u1230\u12D3\u1275",hh:"%d \u1230\u12D3\u1273\u1275",d:"\u12A0\u1295\u12F5 \u1240\u1295",dd:"%d \u1240\u1293\u1275",M:"\u12A0\u1295\u12F5 \u12C8\u122D",MM:"%d \u12C8\u122B\u1275",y:"\u12A0\u1295\u12F5 \u12D3\u1218\u1275",yy:"%d \u12D3\u1218\u1273\u1275"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM D \u1363 YYYY",LLL:"MMMM D \u1363 YYYY HH:mm",LLLL:"dddd \u1363 MMMM D \u1363 YYYY HH:mm"},ordinal:function(e){return e+"\u129B"}};return a.default.locale(i,null,!0),i}))});var Rn=v((Ee,Je)=>{(function(n,t){typeof Ee=="object"&&typeof Je<"u"?Je.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ar=t(n.dayjs)})(Ee,(function(n){"use strict";function t(f){return f&&typeof f=="object"&&"default"in f?f:{default:f}}var a=t(n),i="\u064A\u0646\u0627\u064A\u0631_\u0641\u0628\u0631\u0627\u064A\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064A\u0644_\u0645\u0627\u064A\u0648_\u064A\u0648\u0646\u064A\u0648_\u064A\u0648\u0644\u064A\u0648_\u0623\u063A\u0633\u0637\u0633_\u0633\u0628\u062A\u0645\u0628\u0631_\u0623\u0643\u062A\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062F\u064A\u0633\u0645\u0628\u0631".split("_"),e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},r={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},s=/[١٢٣٤٥٦٧٨٩٠]/g,_=/،/g,d=/\d/g,u=/,/g,o={name:"ar",weekdays:"\u0627\u0644\u0623\u062D\u062F_\u0627\u0644\u0625\u062B\u0646\u064A\u0646_\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062E\u0645\u064A\u0633_\u0627\u0644\u062C\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062A".split("_"),weekdaysShort:"\u0623\u062D\u062F_\u0625\u062B\u0646\u064A\u0646_\u062B\u0644\u0627\u062B\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062E\u0645\u064A\u0633_\u062C\u0645\u0639\u0629_\u0633\u0628\u062A".split("_"),weekdaysMin:"\u062D_\u0646_\u062B_\u0631_\u062E_\u062C_\u0633".split("_"),months:i,monthsShort:i,weekStart:6,meridiem:function(f){return f>12?"\u0645":"\u0635"},relativeTime:{future:"\u0628\u0639\u062F %s",past:"\u0645\u0646\u0630 %s",s:"\u062B\u0627\u0646\u064A\u0629 \u0648\u0627\u062D\u062F\u0629",m:"\u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629",mm:"%d \u062F\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629 \u0648\u0627\u062D\u062F\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062A",d:"\u064A\u0648\u0645 \u0648\u0627\u062D\u062F",dd:"%d \u0623\u064A\u0627\u0645",M:"\u0634\u0647\u0631 \u0648\u0627\u062D\u062F",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0639\u0627\u0645 \u0648\u0627\u062D\u062F",yy:"%d \u0623\u0639\u0648\u0627\u0645"},preparse:function(f){return f.replace(s,(function(l){return r[l]})).replace(_,",")},postformat:function(f){return f.replace(d,(function(l){return e[l]})).replace(u,"\u060C")},ordinal:function(f){return f},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200FM/\u200FYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"}};return a.default.locale(o,null,!0),o}))});var Zn=v((Ue,We)=>{(function(n,t){typeof Ue=="object"&&typeof We<"u"?We.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_bs=t(n.dayjs)})(Ue,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"bs",weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010Detvrtak_petak_subota".split("_"),months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),weekStart:1,weekdaysShort:"ned._pon._uto._sri._\u010Det._pet._sub.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010De_pe_su".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return a.default.locale(i,null,!0),i}))});var Vn=v((Pe,Ge)=>{(function(n,t){typeof Pe=="object"&&typeof Ge<"u"?Ge.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ca=t(n.dayjs)})(Pe,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ca",weekdays:"Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),weekdaysShort:"Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),months:"Gener_Febrer_Mar\xE7_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),monthsShort:"Gen._Febr._Mar\xE7_Abr._Maig_Juny_Jul._Ag._Set._Oct._Nov._Des.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",ll:"D MMM YYYY",lll:"D MMM YYYY, H:mm",llll:"ddd D MMM YYYY, H:mm"},relativeTime:{future:"d'aqu\xED %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:function(e){return""+e+(e===1||e===3?"r":e===2?"n":e===4?"t":"\xE8")}};return a.default.locale(i,null,!0),i}))});var Re=v((ye,Kn)=>{(function(n,t){typeof ye=="object"&&typeof Kn<"u"?t(ye,k()):typeof define=="function"&&define.amd?define(["exports","dayjs"],t):t((n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ku={},n.dayjs)})(ye,(function(n,t){"use strict";function a(d){return d&&typeof d=="object"&&"default"in d?d:{default:d}}var i=a(t),e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},r={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},s=["\u06A9\u0627\u0646\u0648\u0648\u0646\u06CC \u062F\u0648\u0648\u06D5\u0645","\u0634\u0648\u0628\u0627\u062A","\u0626\u0627\u062F\u0627\u0631","\u0646\u06CC\u0633\u0627\u0646","\u0626\u0627\u06CC\u0627\u0631","\u062D\u0648\u0632\u06D5\u06CC\u0631\u0627\u0646","\u062A\u06D5\u0645\u0645\u0648\u0648\u0632","\u0626\u0627\u0628","\u0626\u06D5\u06CC\u0644\u0648\u0648\u0644","\u062A\u0634\u0631\u06CC\u0646\u06CC \u06CC\u06D5\u06A9\u06D5\u0645","\u062A\u0634\u0631\u06CC\u0646\u06CC \u062F\u0648\u0648\u06D5\u0645","\u06A9\u0627\u0646\u0648\u0648\u0646\u06CC \u06CC\u06D5\u06A9\u06D5\u0645"],_={name:"ku",months:s,monthsShort:s,weekdays:"\u06CC\u06D5\u06A9\u0634\u06D5\u0645\u0645\u06D5_\u062F\u0648\u0648\u0634\u06D5\u0645\u0645\u06D5_\u0633\u06CE\u0634\u06D5\u0645\u0645\u06D5_\u0686\u0648\u0627\u0631\u0634\u06D5\u0645\u0645\u06D5_\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645\u0645\u06D5_\u0647\u06D5\u06CC\u0646\u06CC_\u0634\u06D5\u0645\u0645\u06D5".split("_"),weekdaysShort:"\u06CC\u06D5\u06A9\u0634\u06D5\u0645_\u062F\u0648\u0648\u0634\u06D5\u0645_\u0633\u06CE\u0634\u06D5\u0645_\u0686\u0648\u0627\u0631\u0634\u06D5\u0645_\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645_\u0647\u06D5\u06CC\u0646\u06CC_\u0634\u06D5\u0645\u0645\u06D5".split("_"),weekStart:6,weekdaysMin:"\u06CC_\u062F_\u0633_\u0686_\u067E_\u0647\u0640_\u0634".split("_"),preparse:function(d){return d.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(u){return r[u]})).replace(/،/g,",")},postformat:function(d){return d.replace(/\d/g,(function(u){return e[u]})).replace(/,/g,"\u060C")},ordinal:function(d){return d},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiem:function(d){return d<12?"\u067E.\u0646":"\u062F.\u0646"},relativeTime:{future:"\u0644\u06D5 %s",past:"\u0644\u06D5\u0645\u06D5\u0648\u067E\u06CE\u0634 %s",s:"\u0686\u06D5\u0646\u062F \u0686\u0631\u06A9\u06D5\u06CC\u06D5\u06A9",m:"\u06CC\u06D5\u06A9 \u062E\u0648\u0644\u06D5\u06A9",mm:"%d \u062E\u0648\u0644\u06D5\u06A9",h:"\u06CC\u06D5\u06A9 \u06A9\u0627\u062A\u0698\u0645\u06CE\u0631",hh:"%d \u06A9\u0627\u062A\u0698\u0645\u06CE\u0631",d:"\u06CC\u06D5\u06A9 \u0695\u06C6\u0698",dd:"%d \u0695\u06C6\u0698",M:"\u06CC\u06D5\u06A9 \u0645\u0627\u0646\u06AF",MM:"%d \u0645\u0627\u0646\u06AF",y:"\u06CC\u06D5\u06A9 \u0633\u0627\u06B5",yy:"%d \u0633\u0627\u06B5"}};i.default.locale(_,null,!0),n.default=_,n.englishToArabicNumbersMap=e,Object.defineProperty(n,"__esModule",{value:!0})}))});var Qn=v((Ze,Ve)=>{(function(n,t){typeof Ze=="object"&&typeof Ve<"u"?Ve.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_cs=t(n.dayjs)})(Ze,(function(n){"use strict";function t(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var a=t(n);function i(s){return s>1&&s<5&&~~(s/10)!=1}function e(s,_,d,u){var o=s+" ";switch(d){case"s":return _||u?"p\xE1r sekund":"p\xE1r sekundami";case"m":return _?"minuta":u?"minutu":"minutou";case"mm":return _||u?o+(i(s)?"minuty":"minut"):o+"minutami";case"h":return _?"hodina":u?"hodinu":"hodinou";case"hh":return _||u?o+(i(s)?"hodiny":"hodin"):o+"hodinami";case"d":return _||u?"den":"dnem";case"dd":return _||u?o+(i(s)?"dny":"dn\xED"):o+"dny";case"M":return _||u?"m\u011Bs\xEDc":"m\u011Bs\xEDcem";case"MM":return _||u?o+(i(s)?"m\u011Bs\xEDce":"m\u011Bs\xEDc\u016F"):o+"m\u011Bs\xEDci";case"y":return _||u?"rok":"rokem";case"yy":return _||u?o+(i(s)?"roky":"let"):o+"lety"}}var r={name:"cs",weekdays:"ned\u011Ble_pond\u011Bl\xED_\xFAter\xFD_st\u0159eda_\u010Dtvrtek_p\xE1tek_sobota".split("_"),weekdaysShort:"ne_po_\xFAt_st_\u010Dt_p\xE1_so".split("_"),weekdaysMin:"ne_po_\xFAt_st_\u010Dt_p\xE1_so".split("_"),months:"leden_\xFAnor_b\u0159ezen_duben_kv\u011Bten_\u010Derven_\u010Dervenec_srpen_z\xE1\u0159\xED_\u0159\xEDjen_listopad_prosinec".split("_"),monthsShort:"led_\xFAno_b\u0159e_dub_kv\u011B_\u010Dvn_\u010Dvc_srp_z\xE1\u0159_\u0159\xEDj_lis_pro".split("_"),weekStart:1,yearStart:4,ordinal:function(s){return s+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e}};return a.default.locale(r,null,!0),r}))});var Xn=v((Ke,Qe)=>{(function(n,t){typeof Ke=="object"&&typeof Qe<"u"?Qe.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_cy=t(n.dayjs)})(Ke,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"cy",weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),weekStart:1,weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"mewn %s",past:"%s yn \xF4l",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"}};return a.default.locale(i,null,!0),i}))});var Bn=v((Xe,Be)=>{(function(n,t){typeof Xe=="object"&&typeof Be<"u"?Be.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_da=t(n.dayjs)})(Xe,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"da",weekdays:"s\xF8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xF8rdag".split("_"),weekdaysShort:"s\xF8n._man._tirs._ons._tors._fre._l\xF8r.".split("_"),weekdaysMin:"s\xF8._ma._ti._on._to._fr._l\xF8.".split("_"),months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj_juni_juli_aug._sept._okt._nov._dec.".split("_"),weekStart:1,yearStart:4,ordinal:function(e){return e+"."},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xE5 sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xE5ned",MM:"%d m\xE5neder",y:"et \xE5r",yy:"%d \xE5r"}};return a.default.locale(i,null,!0),i}))});var ei=v((et,tt)=>{(function(n,t){typeof et=="object"&&typeof tt<"u"?tt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_de=t(n.dayjs)})(et,(function(n){"use strict";function t(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var a=t(n),i={s:"ein paar Sekunden",m:["eine Minute","einer Minute"],mm:"%d Minuten",h:["eine Stunde","einer Stunde"],hh:"%d Stunden",d:["ein Tag","einem Tag"],dd:["%d Tage","%d Tagen"],M:["ein Monat","einem Monat"],MM:["%d Monate","%d Monaten"],y:["ein Jahr","einem Jahr"],yy:["%d Jahre","%d Jahren"]};function e(s,_,d){var u=i[d];return Array.isArray(u)&&(u=u[_?0:1]),u.replace("%d",s)}var r={name:"de",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Januar_Februar_M\xE4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xE4rz_Apr._Mai_Juni_Juli_Aug._Sept._Okt._Nov._Dez.".split("_"),ordinal:function(s){return s+"."},weekStart:1,yearStart:4,formats:{LTS:"HH:mm:ss",LT:"HH:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e}};return a.default.locale(r,null,!0),r}))});var ti=v((nt,it)=>{(function(n,t){typeof nt=="object"&&typeof it<"u"?it.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_el=t(n.dayjs)})(nt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"el",weekdays:"\u039A\u03C5\u03C1\u03B9\u03B1\u03BA\u03AE_\u0394\u03B5\u03C5\u03C4\u03AD\u03C1\u03B1_\u03A4\u03C1\u03AF\u03C4\u03B7_\u03A4\u03B5\u03C4\u03AC\u03C1\u03C4\u03B7_\u03A0\u03AD\u03BC\u03C0\u03C4\u03B7_\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE_\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF".split("_"),weekdaysShort:"\u039A\u03C5\u03C1_\u0394\u03B5\u03C5_\u03A4\u03C1\u03B9_\u03A4\u03B5\u03C4_\u03A0\u03B5\u03BC_\u03A0\u03B1\u03C1_\u03A3\u03B1\u03B2".split("_"),weekdaysMin:"\u039A\u03C5_\u0394\u03B5_\u03A4\u03C1_\u03A4\u03B5_\u03A0\u03B5_\u03A0\u03B1_\u03A3\u03B1".split("_"),months:"\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2_\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2_\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2_\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2_\u039C\u03AC\u03B9\u03BF\u03C2_\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2_\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2_\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2_\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2_\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2_\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2_\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2".split("_"),monthsShort:"\u0399\u03B1\u03BD_\u03A6\u03B5\u03B2_\u039C\u03B1\u03C1_\u0391\u03C0\u03C1_\u039C\u03B1\u03B9_\u0399\u03BF\u03C5\u03BD_\u0399\u03BF\u03C5\u03BB_\u0391\u03C5\u03B3_\u03A3\u03B5\u03C0\u03C4_\u039F\u03BA\u03C4_\u039D\u03BF\u03B5_\u0394\u03B5\u03BA".split("_"),ordinal:function(e){return e},weekStart:1,relativeTime:{future:"\u03C3\u03B5 %s",past:"\u03C0\u03C1\u03B9\u03BD %s",s:"\u03BC\u03B5\u03C1\u03B9\u03BA\u03AC \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1",m:"\u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC",mm:"%d \u03BB\u03B5\u03C0\u03C4\u03AC",h:"\u03BC\u03AF\u03B1 \u03CE\u03C1\u03B1",hh:"%d \u03CE\u03C1\u03B5\u03C2",d:"\u03BC\u03AF\u03B1 \u03BC\u03AD\u03C1\u03B1",dd:"%d \u03BC\u03AD\u03C1\u03B5\u03C2",M:"\u03AD\u03BD\u03B1 \u03BC\u03AE\u03BD\u03B1",MM:"%d \u03BC\u03AE\u03BD\u03B5\u03C2",y:"\u03AD\u03BD\u03B1 \u03C7\u03C1\u03CC\u03BD\u03BF",yy:"%d \u03C7\u03C1\u03CC\u03BD\u03B9\u03B1"},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"}};return a.default.locale(i,null,!0),i}))});var ni=v((rt,at)=>{(function(n,t){typeof rt=="object"&&typeof at<"u"?at.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_en=t()})(rt,(function(){"use strict";return{name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(n){var t=["th","st","nd","rd"],a=n%100;return"["+n+(t[(a-20)%10]||t[a]||t[0])+"]"}}}))});var ii=v((st,ut)=>{(function(n,t){typeof st=="object"&&typeof ut<"u"?ut.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_es=t(n.dayjs)})(st,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"es",monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),weekdays:"domingo_lunes_martes_mi\xE9rcoles_jueves_viernes_s\xE1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xE9._jue._vie._s\xE1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xE1".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xEDa",dd:"%d d\xEDas",M:"un mes",MM:"%d meses",y:"un a\xF1o",yy:"%d a\xF1os"},ordinal:function(e){return e+"\xBA"}};return a.default.locale(i,null,!0),i}))});var ri=v((dt,ot)=>{(function(n,t){typeof dt=="object"&&typeof ot<"u"?ot.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_et=t(n.dayjs)})(dt,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n);function i(r,s,_,d){var u={s:["m\xF5ne sekundi","m\xF5ni sekund","paar sekundit"],m:["\xFChe minuti","\xFCks minut"],mm:["%d minuti","%d minutit"],h:["\xFChe tunni","tund aega","\xFCks tund"],hh:["%d tunni","%d tundi"],d:["\xFChe p\xE4eva","\xFCks p\xE4ev"],M:["kuu aja","kuu aega","\xFCks kuu"],MM:["%d kuu","%d kuud"],y:["\xFChe aasta","aasta","\xFCks aasta"],yy:["%d aasta","%d aastat"]};return s?(u[_][2]?u[_][2]:u[_][1]).replace("%d",r):(d?u[_][0]:u[_][1]).replace("%d",r)}var e={name:"et",weekdays:"p\xFChap\xE4ev_esmasp\xE4ev_teisip\xE4ev_kolmap\xE4ev_neljap\xE4ev_reede_laup\xE4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),months:"jaanuar_veebruar_m\xE4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xE4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),ordinal:function(r){return r+"."},weekStart:1,relativeTime:{future:"%s p\xE4rast",past:"%s tagasi",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:"%d p\xE4eva",M:i,MM:i,y:i,yy:i},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return a.default.locale(e,null,!0),e}))});var ai=v((_t,lt)=>{(function(n,t){typeof _t=="object"&&typeof lt<"u"?lt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fa=t(n.dayjs)})(_t,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"fa",weekdays:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06CC_\u062F_\u0633_\u0686_\u067E_\u062C_\u0634".split("_"),weekStart:6,months:"\u0698\u0627\u0646\u0648\u06CC\u0647_\u0641\u0648\u0631\u06CC\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06CC\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06CC\u0647_\u0627\u0648\u062A_\u0633\u067E\u062A\u0627\u0645\u0628\u0631_\u0627\u06A9\u062A\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062F\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06CC\u0647_\u0641\u0648\u0631\u06CC\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06CC\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06CC\u0647_\u0627\u0648\u062A_\u0633\u067E\u062A\u0627\u0645\u0628\u0631_\u0627\u06A9\u062A\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062F\u0633\u0627\u0645\u0628\u0631".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"\u062F\u0631 %s",past:"%s \u067E\u06CC\u0634",s:"\u0686\u0646\u062F \u062B\u0627\u0646\u06CC\u0647",m:"\u06CC\u06A9 \u062F\u0642\u06CC\u0642\u0647",mm:"%d \u062F\u0642\u06CC\u0642\u0647",h:"\u06CC\u06A9 \u0633\u0627\u0639\u062A",hh:"%d \u0633\u0627\u0639\u062A",d:"\u06CC\u06A9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06CC\u06A9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06CC\u06A9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"}};return a.default.locale(i,null,!0),i}))});var si=v((ft,mt)=>{(function(n,t){typeof ft=="object"&&typeof mt<"u"?mt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fi=t(n.dayjs)})(ft,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n);function i(r,s,_,d){var u={s:"muutama sekunti",m:"minuutti",mm:"%d minuuttia",h:"tunti",hh:"%d tuntia",d:"p\xE4iv\xE4",dd:"%d p\xE4iv\xE4\xE4",M:"kuukausi",MM:"%d kuukautta",y:"vuosi",yy:"%d vuotta",numbers:"nolla_yksi_kaksi_kolme_nelj\xE4_viisi_kuusi_seitsem\xE4n_kahdeksan_yhdeks\xE4n".split("_")},o={s:"muutaman sekunnin",m:"minuutin",mm:"%d minuutin",h:"tunnin",hh:"%d tunnin",d:"p\xE4iv\xE4n",dd:"%d p\xE4iv\xE4n",M:"kuukauden",MM:"%d kuukauden",y:"vuoden",yy:"%d vuoden",numbers:"nollan_yhden_kahden_kolmen_nelj\xE4n_viiden_kuuden_seitsem\xE4n_kahdeksan_yhdeks\xE4n".split("_")},f=d&&!s?o:u,l=f[_];return r<10?l.replace("%d",f.numbers[r]):l.replace("%d",r)}var e={name:"fi",weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xE4kuu_hein\xE4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xE4_hein\xE4_elo_syys_loka_marras_joulu".split("_"),ordinal:function(r){return r+"."},weekStart:1,yearStart:4,relativeTime:{future:"%s p\xE4\xE4st\xE4",past:"%s sitten",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM[ta] YYYY",LLL:"D. MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, D. MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"D. MMM YYYY",lll:"D. MMM YYYY, [klo] HH.mm",llll:"ddd, D. MMM YYYY, [klo] HH.mm"}};return a.default.locale(e,null,!0),e}))});var ui=v((ct,ht)=>{(function(n,t){typeof ct=="object"&&typeof ht<"u"?ht.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fr=t(n.dayjs)})(ct,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"fr",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),months:"janvier_f\xE9vrier_mars_avril_mai_juin_juillet_ao\xFBt_septembre_octobre_novembre_d\xE9cembre".split("_"),monthsShort:"janv._f\xE9vr._mars_avr._mai_juin_juil._ao\xFBt_sept._oct._nov._d\xE9c.".split("_"),weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return""+e+(e===1?"er":"")}};return a.default.locale(i,null,!0),i}))});var di=v((Mt,Yt)=>{(function(n,t){typeof Mt=="object"&&typeof Yt<"u"?Yt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_he=t(n.dayjs)})(Mt,(function(n){"use strict";function t(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var a=t(n),i={s:"\u05DE\u05E1\u05E4\u05E8 \u05E9\u05E0\u05D9\u05D5\u05EA",ss:"%d \u05E9\u05E0\u05D9\u05D5\u05EA",m:"\u05D3\u05E7\u05D4",mm:"%d \u05D3\u05E7\u05D5\u05EA",h:"\u05E9\u05E2\u05D4",hh:"%d \u05E9\u05E2\u05D5\u05EA",hh2:"\u05E9\u05E2\u05EA\u05D9\u05D9\u05DD",d:"\u05D9\u05D5\u05DD",dd:"%d \u05D9\u05DE\u05D9\u05DD",dd2:"\u05D9\u05D5\u05DE\u05D9\u05D9\u05DD",M:"\u05D7\u05D5\u05D3\u05E9",MM:"%d \u05D7\u05D5\u05D3\u05E9\u05D9\u05DD",MM2:"\u05D7\u05D5\u05D3\u05E9\u05D9\u05D9\u05DD",y:"\u05E9\u05E0\u05D4",yy:"%d \u05E9\u05E0\u05D9\u05DD",yy2:"\u05E9\u05E0\u05EA\u05D9\u05D9\u05DD"};function e(s,_,d){return(i[d+(s===2?"2":"")]||i[d]).replace("%d",s)}var r={name:"he",weekdays:"\u05E8\u05D0\u05E9\u05D5\u05DF_\u05E9\u05E0\u05D9_\u05E9\u05DC\u05D9\u05E9\u05D9_\u05E8\u05D1\u05D9\u05E2\u05D9_\u05D7\u05DE\u05D9\u05E9\u05D9_\u05E9\u05D9\u05E9\u05D9_\u05E9\u05D1\u05EA".split("_"),weekdaysShort:"\u05D0\u05F3_\u05D1\u05F3_\u05D2\u05F3_\u05D3\u05F3_\u05D4\u05F3_\u05D5\u05F3_\u05E9\u05F3".split("_"),weekdaysMin:"\u05D0\u05F3_\u05D1\u05F3_\u05D2\u05F3_\u05D3\u05F3_\u05D4\u05F3_\u05D5_\u05E9\u05F3".split("_"),months:"\u05D9\u05E0\u05D5\u05D0\u05E8_\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8_\u05DE\u05E8\u05E5_\u05D0\u05E4\u05E8\u05D9\u05DC_\u05DE\u05D0\u05D9_\u05D9\u05D5\u05E0\u05D9_\u05D9\u05D5\u05DC\u05D9_\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8_\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8_\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8_\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8_\u05D3\u05E6\u05DE\u05D1\u05E8".split("_"),monthsShort:"\u05D9\u05E0\u05D5_\u05E4\u05D1\u05E8_\u05DE\u05E8\u05E5_\u05D0\u05E4\u05E8_\u05DE\u05D0\u05D9_\u05D9\u05D5\u05E0_\u05D9\u05D5\u05DC_\u05D0\u05D5\u05D2_\u05E1\u05E4\u05D8_\u05D0\u05D5\u05E7_\u05E0\u05D5\u05D1_\u05D3\u05E6\u05DE".split("_"),relativeTime:{future:"\u05D1\u05E2\u05D5\u05D3 %s",past:"\u05DC\u05E4\u05E0\u05D9 %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:function(s){return s},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05D1]MMMM YYYY",LLL:"D [\u05D1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05D1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05D1]MMMM YYYY",LLL:"D [\u05D1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05D1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"}};return a.default.locale(r,null,!0),r}))});var oi=v((yt,pt)=>{(function(n,t){typeof yt=="object"&&typeof pt<"u"?pt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hi=t(n.dayjs)})(yt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"hi",weekdays:"\u0930\u0935\u093F\u0935\u093E\u0930_\u0938\u094B\u092E\u0935\u093E\u0930_\u092E\u0902\u0917\u0932\u0935\u093E\u0930_\u092C\u0941\u0927\u0935\u093E\u0930_\u0917\u0941\u0930\u0942\u0935\u093E\u0930_\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930_\u0936\u0928\u093F\u0935\u093E\u0930".split("_"),months:"\u091C\u0928\u0935\u0930\u0940_\u092B\u093C\u0930\u0935\u0930\u0940_\u092E\u093E\u0930\u094D\u091A_\u0905\u092A\u094D\u0930\u0948\u0932_\u092E\u0908_\u091C\u0942\u0928_\u091C\u0941\u0932\u093E\u0908_\u0905\u0917\u0938\u094D\u0924_\u0938\u093F\u0924\u092E\u094D\u092C\u0930_\u0905\u0915\u094D\u091F\u0942\u092C\u0930_\u0928\u0935\u092E\u094D\u092C\u0930_\u0926\u093F\u0938\u092E\u094D\u092C\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093F_\u0938\u094B\u092E_\u092E\u0902\u0917\u0932_\u092C\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094D\u0930_\u0936\u0928\u093F".split("_"),monthsShort:"\u091C\u0928._\u092B\u093C\u0930._\u092E\u093E\u0930\u094D\u091A_\u0905\u092A\u094D\u0930\u0948._\u092E\u0908_\u091C\u0942\u0928_\u091C\u0941\u0932._\u0905\u0917._\u0938\u093F\u0924._\u0905\u0915\u094D\u091F\u0942._\u0928\u0935._\u0926\u093F\u0938.".split("_"),weekdaysMin:"\u0930_\u0938\u094B_\u092E\u0902_\u092C\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),ordinal:function(e){return e},formats:{LT:"A h:mm \u092C\u091C\u0947",LTS:"A h:mm:ss \u092C\u091C\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092C\u091C\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092C\u091C\u0947"},relativeTime:{future:"%s \u092E\u0947\u0902",past:"%s \u092A\u0939\u0932\u0947",s:"\u0915\u0941\u091B \u0939\u0940 \u0915\u094D\u0937\u0923",m:"\u090F\u0915 \u092E\u093F\u0928\u091F",mm:"%d \u092E\u093F\u0928\u091F",h:"\u090F\u0915 \u0918\u0902\u091F\u093E",hh:"%d \u0918\u0902\u091F\u0947",d:"\u090F\u0915 \u0926\u093F\u0928",dd:"%d \u0926\u093F\u0928",M:"\u090F\u0915 \u092E\u0939\u0940\u0928\u0947",MM:"%d \u092E\u0939\u0940\u0928\u0947",y:"\u090F\u0915 \u0935\u0930\u094D\u0937",yy:"%d \u0935\u0930\u094D\u0937"}};return a.default.locale(i,null,!0),i}))});var _i=v((Lt,Dt)=>{(function(n,t){typeof Lt=="object"&&typeof Dt<"u"?Dt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hu=t(n.dayjs)})(Lt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"hu",weekdays:"vas\xE1rnap_h\xE9tf\u0151_kedd_szerda_cs\xFCt\xF6rt\xF6k_p\xE9ntek_szombat".split("_"),weekdaysShort:"vas_h\xE9t_kedd_sze_cs\xFCt_p\xE9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),months:"janu\xE1r_febru\xE1r_m\xE1rcius_\xE1prilis_m\xE1jus_j\xFAnius_j\xFAlius_augusztus_szeptember_okt\xF3ber_november_december".split("_"),monthsShort:"jan_feb_m\xE1rc_\xE1pr_m\xE1j_j\xFAn_j\xFAl_aug_szept_okt_nov_dec".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"%s m\xFAlva",past:"%s",s:function(e,r,s,_){return"n\xE9h\xE1ny m\xE1sodperc"+(_||r?"":"e")},m:function(e,r,s,_){return"egy perc"+(_||r?"":"e")},mm:function(e,r,s,_){return e+" perc"+(_||r?"":"e")},h:function(e,r,s,_){return"egy "+(_||r?"\xF3ra":"\xF3r\xE1ja")},hh:function(e,r,s,_){return e+" "+(_||r?"\xF3ra":"\xF3r\xE1ja")},d:function(e,r,s,_){return"egy "+(_||r?"nap":"napja")},dd:function(e,r,s,_){return e+" "+(_||r?"nap":"napja")},M:function(e,r,s,_){return"egy "+(_||r?"h\xF3nap":"h\xF3napja")},MM:function(e,r,s,_){return e+" "+(_||r?"h\xF3nap":"h\xF3napja")},y:function(e,r,s,_){return"egy "+(_||r?"\xE9v":"\xE9ve")},yy:function(e,r,s,_){return e+" "+(_||r?"\xE9v":"\xE9ve")}},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"}};return a.default.locale(i,null,!0),i}))});var li=v((vt,gt)=>{(function(n,t){typeof vt=="object"&&typeof gt<"u"?gt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hy_am=t(n.dayjs)})(vt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"hy-am",weekdays:"\u056F\u056B\u0580\u0561\u056F\u056B_\u0565\u0580\u056F\u0578\u0582\u0577\u0561\u0562\u0569\u056B_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B_\u0570\u056B\u0576\u0563\u0577\u0561\u0562\u0569\u056B_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),months:"\u0570\u0578\u0582\u0576\u057E\u0561\u0580\u056B_\u0583\u0565\u057F\u0580\u057E\u0561\u0580\u056B_\u0574\u0561\u0580\u057F\u056B_\u0561\u057A\u0580\u056B\u056C\u056B_\u0574\u0561\u0575\u056B\u057D\u056B_\u0570\u0578\u0582\u0576\u056B\u057D\u056B_\u0570\u0578\u0582\u056C\u056B\u057D\u056B_\u0585\u0563\u0578\u057D\u057F\u0578\u057D\u056B_\u057D\u0565\u057A\u057F\u0565\u0574\u0562\u0565\u0580\u056B_\u0570\u0578\u056F\u057F\u0565\u0574\u0562\u0565\u0580\u056B_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056B_\u0564\u0565\u056F\u057F\u0565\u0574\u0562\u0565\u0580\u056B".split("_"),weekStart:1,weekdaysShort:"\u056F\u0580\u056F_\u0565\u0580\u056F_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),monthsShort:"\u0570\u0576\u057E_\u0583\u057F\u0580_\u0574\u0580\u057F_\u0561\u057A\u0580_\u0574\u0575\u057D_\u0570\u0576\u057D_\u0570\u056C\u057D_\u0585\u0563\u057D_\u057D\u057A\u057F_\u0570\u056F\u057F_\u0576\u0574\u0562_\u0564\u056F\u057F".split("_"),weekdaysMin:"\u056F\u0580\u056F_\u0565\u0580\u056F_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},relativeTime:{future:"%s \u0570\u0565\u057F\u0578",past:"%s \u0561\u057C\u0561\u057B",s:"\u0574\u056B \u0584\u0561\u0576\u056B \u057E\u0561\u0575\u0580\u056F\u0575\u0561\u0576",m:"\u0580\u0578\u057A\u0565",mm:"%d \u0580\u0578\u057A\u0565",h:"\u056A\u0561\u0574",hh:"%d \u056A\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056B\u057D",MM:"%d \u0561\u0574\u056B\u057D",y:"\u057F\u0561\u0580\u056B",yy:"%d \u057F\u0561\u0580\u056B"}};return a.default.locale(i,null,!0),i}))});var fi=v((bt,St)=>{(function(n,t){typeof bt=="object"&&typeof St<"u"?St.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_id=t(n.dayjs)})(bt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"id",weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var mi=v((kt,Ht)=>{(function(n,t){typeof kt=="object"&&typeof Ht<"u"?Ht.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_it=t(n.dayjs)})(kt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"it",weekdays:"domenica_luned\xEC_marted\xEC_mercoled\xEC_gioved\xEC_venerd\xEC_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),weekStart:1,monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"tra %s",past:"%s fa",s:"qualche secondo",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:function(e){return e+"\xBA"}};return a.default.locale(i,null,!0),i}))});var ci=v((jt,Tt)=>{(function(n,t){typeof jt=="object"&&typeof Tt<"u"?Tt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ja=t(n.dayjs)})(jt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ja",weekdays:"\u65E5\u66DC\u65E5_\u6708\u66DC\u65E5_\u706B\u66DC\u65E5_\u6C34\u66DC\u65E5_\u6728\u66DC\u65E5_\u91D1\u66DC\u65E5_\u571F\u66DC\u65E5".split("_"),weekdaysShort:"\u65E5_\u6708_\u706B_\u6C34_\u6728_\u91D1_\u571F".split("_"),weekdaysMin:"\u65E5_\u6708_\u706B_\u6C34_\u6728_\u91D1_\u571F".split("_"),months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e){return e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5(ddd) HH:mm"},meridiem:function(e){return e<12?"\u5348\u524D":"\u5348\u5F8C"},relativeTime:{future:"%s\u5F8C",past:"%s\u524D",s:"\u6570\u79D2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65E5",dd:"%d\u65E5",M:"1\u30F6\u6708",MM:"%d\u30F6\u6708",y:"1\u5E74",yy:"%d\u5E74"}};return a.default.locale(i,null,!0),i}))});var hi=v((wt,$t)=>{(function(n,t){typeof wt=="object"&&typeof $t<"u"?$t.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ka=t(n.dayjs)})(wt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ka",weekdays:"\u10D9\u10D5\u10D8\u10E0\u10D0_\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8_\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8".split("_"),weekdaysShort:"\u10D9\u10D5\u10D8_\u10DD\u10E0\u10E8_\u10E1\u10D0\u10DB_\u10DD\u10D7\u10EE_\u10EE\u10E3\u10D7_\u10DE\u10D0\u10E0_\u10E8\u10D0\u10D1".split("_"),weekdaysMin:"\u10D9\u10D5_\u10DD\u10E0_\u10E1\u10D0_\u10DD\u10D7_\u10EE\u10E3_\u10DE\u10D0_\u10E8\u10D0".split("_"),months:"\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8_\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8_\u10DB\u10D0\u10E0\u10E2\u10D8_\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8_\u10DB\u10D0\u10D8\u10E1\u10D8_\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8_\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8_\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD_\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8_\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8_\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8_\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8".split("_"),monthsShort:"\u10D8\u10D0\u10DC_\u10D7\u10D4\u10D1_\u10DB\u10D0\u10E0_\u10D0\u10DE\u10E0_\u10DB\u10D0\u10D8_\u10D8\u10D5\u10DC_\u10D8\u10D5\u10DA_\u10D0\u10D2\u10D5_\u10E1\u10D4\u10E5_\u10DD\u10E5\u10E2_\u10DC\u10DD\u10D4_\u10D3\u10D4\u10D9".split("_"),weekStart:1,formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"%s \u10E8\u10D4\u10DB\u10D3\u10D4\u10D2",past:"%s \u10EC\u10D8\u10DC",s:"\u10EC\u10D0\u10DB\u10D8",m:"\u10EC\u10E3\u10D7\u10D8",mm:"%d \u10EC\u10E3\u10D7\u10D8",h:"\u10E1\u10D0\u10D0\u10D7\u10D8",hh:"%d \u10E1\u10D0\u10D0\u10D7\u10D8\u10E1",d:"\u10D3\u10E6\u10D4\u10E1",dd:"%d \u10D3\u10E6\u10D8\u10E1 \u10D2\u10D0\u10DC\u10DB\u10D0\u10D5\u10DA\u10DD\u10D1\u10D0\u10E8\u10D8",M:"\u10D7\u10D5\u10D8\u10E1",MM:"%d \u10D7\u10D5\u10D8\u10E1",y:"\u10EC\u10D4\u10DA\u10D8",yy:"%d \u10EC\u10DA\u10D8\u10E1"},ordinal:function(e){return e}};return a.default.locale(i,null,!0),i}))});var Mi=v((Ct,Ot)=>{(function(n,t){typeof Ct=="object"&&typeof Ot<"u"?Ot.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_km=t(n.dayjs)})(Ct,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"km",weekdays:"\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799_\u1785\u17D0\u1793\u17D2\u1791_\u17A2\u1784\u17D2\u1782\u17B6\u179A_\u1796\u17BB\u1792_\u1796\u17D2\u179A\u17A0\u179F\u17D2\u1794\u178F\u17B7\u17CD_\u179F\u17BB\u1780\u17D2\u179A_\u179F\u17C5\u179A\u17CD".split("_"),months:"\u1798\u1780\u179A\u17B6_\u1780\u17BB\u1798\u17D2\u1797\u17C8_\u1798\u17B8\u1793\u17B6_\u1798\u17C1\u179F\u17B6_\u17A7\u179F\u1797\u17B6_\u1798\u17B7\u1790\u17BB\u1793\u17B6_\u1780\u1780\u17D2\u1780\u178A\u17B6_\u179F\u17B8\u17A0\u17B6_\u1780\u1789\u17D2\u1789\u17B6_\u178F\u17BB\u179B\u17B6_\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6_\u1792\u17D2\u1793\u17BC".split("_"),weekStart:1,weekdaysShort:"\u17A2\u17B6_\u1785_\u17A2_\u1796_\u1796\u17D2\u179A_\u179F\u17BB_\u179F".split("_"),monthsShort:"\u1798\u1780\u179A\u17B6_\u1780\u17BB\u1798\u17D2\u1797\u17C8_\u1798\u17B8\u1793\u17B6_\u1798\u17C1\u179F\u17B6_\u17A7\u179F\u1797\u17B6_\u1798\u17B7\u1790\u17BB\u1793\u17B6_\u1780\u1780\u17D2\u1780\u178A\u17B6_\u179F\u17B8\u17A0\u17B6_\u1780\u1789\u17D2\u1789\u17B6_\u178F\u17BB\u179B\u17B6_\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6_\u1792\u17D2\u1793\u17BC".split("_"),weekdaysMin:"\u17A2\u17B6_\u1785_\u17A2_\u1796_\u1796\u17D2\u179A_\u179F\u17BB_\u179F".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s\u1791\u17C0\u178F",past:"%s\u1798\u17BB\u1793",s:"\u1794\u17C9\u17BB\u1793\u17D2\u1798\u17B6\u1793\u179C\u17B7\u1793\u17B6\u1791\u17B8",m:"\u1798\u17BD\u1799\u1793\u17B6\u1791\u17B8",mm:"%d \u1793\u17B6\u1791\u17B8",h:"\u1798\u17BD\u1799\u1798\u17C9\u17C4\u1784",hh:"%d \u1798\u17C9\u17C4\u1784",d:"\u1798\u17BD\u1799\u1790\u17D2\u1784\u17C3",dd:"%d \u1790\u17D2\u1784\u17C3",M:"\u1798\u17BD\u1799\u1781\u17C2",MM:"%d \u1781\u17C2",y:"\u1798\u17BD\u1799\u1786\u17D2\u1793\u17B6\u17C6",yy:"%d \u1786\u17D2\u1793\u17B6\u17C6"}};return a.default.locale(i,null,!0),i}))});var Yi=v((zt,At)=>{(function(n,t){typeof zt=="object"&&typeof At<"u"?At.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_lt=t(n.dayjs)})(zt,(function(n){"use strict";function t(d){return d&&typeof d=="object"&&"default"in d?d:{default:d}}var a=t(n),i="sausio_vasario_kovo_baland\u017Eio_gegu\u017E\u0117s_bir\u017Eelio_liepos_rugpj\u016B\u010Dio_rugs\u0117jo_spalio_lapkri\u010Dio_gruod\u017Eio".split("_"),e="sausis_vasaris_kovas_balandis_gegu\u017E\u0117_bir\u017Eelis_liepa_rugpj\u016Btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),r=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,s=function(d,u){return r.test(u)?i[d.month()]:e[d.month()]};s.s=e,s.f=i;var _={name:"lt",weekdays:"sekmadienis_pirmadienis_antradienis_tre\u010Diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),weekdaysShort:"sek_pir_ant_tre_ket_pen_\u0161e\u0161".split("_"),weekdaysMin:"s_p_a_t_k_pn_\u0161".split("_"),months:s,monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),ordinal:function(d){return d+"."},weekStart:1,relativeTime:{future:"u\u017E %s",past:"prie\u0161 %s",s:"kelias sekundes",m:"minut\u0119",mm:"%d minutes",h:"valand\u0105",hh:"%d valandas",d:"dien\u0105",dd:"%d dienas",M:"m\u0117nes\u012F",MM:"%d m\u0117nesius",y:"metus",yy:"%d metus"},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"}};return a.default.locale(_,null,!0),_}))});var yi=v((qt,It)=>{(function(n,t){typeof qt=="object"&&typeof It<"u"?It.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_lv=t(n.dayjs)})(qt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"lv",weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),months:"janv\u0101ris_febru\u0101ris_marts_apr\u012Blis_maijs_j\u016Bnijs_j\u016Blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),weekStart:1,weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016Bn_j\u016Bl_aug_sep_okt_nov_dec".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:"da\u017E\u0101m sekund\u0113m",m:"min\u016Btes",mm:"%d min\u016Bt\u0113m",h:"stundas",hh:"%d stund\u0101m",d:"dienas",dd:"%d dien\u0101m",M:"m\u0113ne\u0161a",MM:"%d m\u0113ne\u0161iem",y:"gada",yy:"%d gadiem"}};return a.default.locale(i,null,!0),i}))});var pi=v((xt,Nt)=>{(function(n,t){typeof xt=="object"&&typeof Nt<"u"?Nt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ms=t(n.dayjs)})(xt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ms",weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH.mm",LLLL:"dddd, D MMMM YYYY HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var Li=v((Ft,Et)=>{(function(n,t){typeof Ft=="object"&&typeof Et<"u"?Et.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_my=t(n.dayjs)})(Ft,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"my",weekdays:"\u1010\u1014\u1004\u103A\u1039\u1002\u1014\u103D\u1031_\u1010\u1014\u1004\u103A\u1039\u101C\u102C_\u1021\u1004\u103A\u1039\u1002\u102B_\u1017\u102F\u1012\u1039\u1013\u101F\u1030\u1038_\u1000\u103C\u102C\u101E\u1015\u1010\u1031\u1038_\u101E\u1031\u102C\u1000\u103C\u102C_\u1005\u1014\u1031".split("_"),months:"\u1007\u1014\u103A\u1014\u101D\u102B\u101B\u102E_\u1016\u1031\u1016\u1031\u102C\u103A\u101D\u102B\u101B\u102E_\u1019\u1010\u103A_\u1027\u1015\u103C\u102E_\u1019\u1031_\u1007\u103D\u1014\u103A_\u1007\u1030\u101C\u102D\u102F\u1004\u103A_\u101E\u103C\u1002\u102F\u1010\u103A_\u1005\u1000\u103A\u1010\u1004\u103A\u1018\u102C_\u1021\u1031\u102C\u1000\u103A\u1010\u102D\u102F\u1018\u102C_\u1014\u102D\u102F\u101D\u1004\u103A\u1018\u102C_\u1012\u102E\u1007\u1004\u103A\u1018\u102C".split("_"),weekStart:1,weekdaysShort:"\u1014\u103D\u1031_\u101C\u102C_\u1002\u102B_\u101F\u1030\u1038_\u1000\u103C\u102C_\u101E\u1031\u102C_\u1014\u1031".split("_"),monthsShort:"\u1007\u1014\u103A_\u1016\u1031_\u1019\u1010\u103A_\u1015\u103C\u102E_\u1019\u1031_\u1007\u103D\u1014\u103A_\u101C\u102D\u102F\u1004\u103A_\u101E\u103C_\u1005\u1000\u103A_\u1021\u1031\u102C\u1000\u103A_\u1014\u102D\u102F_\u1012\u102E".split("_"),weekdaysMin:"\u1014\u103D\u1031_\u101C\u102C_\u1002\u102B_\u101F\u1030\u1038_\u1000\u103C\u102C_\u101E\u1031\u102C_\u1014\u1031".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"\u101C\u102C\u1019\u100A\u103A\u1037 %s \u1019\u103E\u102C",past:"\u101C\u103D\u1014\u103A\u1001\u1032\u1037\u101E\u1031\u102C %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103A.\u1021\u1014\u100A\u103A\u1038\u1004\u101A\u103A",m:"\u1010\u1005\u103A\u1019\u102D\u1014\u1005\u103A",mm:"%d \u1019\u102D\u1014\u1005\u103A",h:"\u1010\u1005\u103A\u1014\u102C\u101B\u102E",hh:"%d \u1014\u102C\u101B\u102E",d:"\u1010\u1005\u103A\u101B\u1000\u103A",dd:"%d \u101B\u1000\u103A",M:"\u1010\u1005\u103A\u101C",MM:"%d \u101C",y:"\u1010\u1005\u103A\u1014\u103E\u1005\u103A",yy:"%d \u1014\u103E\u1005\u103A"}};return a.default.locale(i,null,!0),i}))});var Di=v((Jt,Ut)=>{(function(n,t){typeof Jt=="object"&&typeof Ut<"u"?Ut.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_nb=t(n.dayjs)})(Jt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"nb",weekdays:"s\xF8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xF8rdag".split("_"),weekdaysShort:"s\xF8._ma._ti._on._to._fr._l\xF8.".split("_"),weekdaysMin:"s\xF8_ma_ti_on_to_fr_l\xF8".split("_"),months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),ordinal:function(e){return e+"."},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xE5ned",MM:"%d m\xE5neder",y:"ett \xE5r",yy:"%d \xE5r"}};return a.default.locale(i,null,!0),i}))});var vi=v((Wt,Pt)=>{(function(n,t){typeof Wt=="object"&&typeof Pt<"u"?Pt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_nl=t(n.dayjs)})(Wt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"nl",weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),ordinal:function(e){return"["+e+(e===1||e===8||e>=20?"ste":"de")+"]"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"een minuut",mm:"%d minuten",h:"een uur",hh:"%d uur",d:"een dag",dd:"%d dagen",M:"een maand",MM:"%d maanden",y:"een jaar",yy:"%d jaar"}};return a.default.locale(i,null,!0),i}))});var gi=v((Gt,Rt)=>{(function(n,t){typeof Gt=="object"&&typeof Rt<"u"?Rt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pl=t(n.dayjs)})(Gt,(function(n){"use strict";function t(o){return o&&typeof o=="object"&&"default"in o?o:{default:o}}var a=t(n);function i(o){return o%10<5&&o%10>1&&~~(o/10)%10!=1}function e(o,f,l){var m=o+" ";switch(l){case"m":return f?"minuta":"minut\u0119";case"mm":return m+(i(o)?"minuty":"minut");case"h":return f?"godzina":"godzin\u0119";case"hh":return m+(i(o)?"godziny":"godzin");case"MM":return m+(i(o)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return m+(i(o)?"lata":"lat")}}var r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015Bnia_pa\u017Adziernika_listopada_grudnia".split("_"),s="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017Adziernik_listopad_grudzie\u0144".split("_"),_=/D MMMM/,d=function(o,f){return _.test(f)?r[o.month()]:s[o.month()]};d.s=s,d.f=r;var u={name:"pl",weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015Broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015Br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015Ar_Cz_Pt_So".split("_"),months:d,monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017A_lis_gru".split("_"),ordinal:function(o){return o+"."},weekStart:1,yearStart:4,relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:e,mm:e,h:e,hh:e,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:e,y:"rok",yy:e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return a.default.locale(u,null,!0),u}))});var bi=v((Zt,Vt)=>{(function(n,t){typeof Zt=="object"&&typeof Vt<"u"?Vt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pt=t(n.dayjs)})(Zt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"pt",weekdays:"domingo_segunda-feira_ter\xE7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xE1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sab".split("_"),weekdaysMin:"Do_2\xAA_3\xAA_4\xAA_5\xAA_6\xAA_Sa".split("_"),months:"janeiro_fevereiro_mar\xE7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"\xBA"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xE0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xE0s] HH:mm"},relativeTime:{future:"em %s",past:"h\xE1 %s",s:"alguns segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xEAs",MM:"%d meses",y:"um ano",yy:"%d anos"}};return a.default.locale(i,null,!0),i}))});var Si=v((Kt,Qt)=>{(function(n,t){typeof Kt=="object"&&typeof Qt<"u"?Qt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pt_br=t(n.dayjs)})(Kt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"pt-br",weekdays:"domingo_segunda-feira_ter\xE7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xE1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xE1b".split("_"),weekdaysMin:"Do_2\xAA_3\xAA_4\xAA_5\xAA_6\xAA_S\xE1".split("_"),months:"janeiro_fevereiro_mar\xE7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"\xBA"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xE0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xE0s] HH:mm"},relativeTime:{future:"em %s",past:"h\xE1 %s",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xEAs",MM:"%d meses",y:"um ano",yy:"%d anos"}};return a.default.locale(i,null,!0),i}))});var ki=v((Xt,Bt)=>{(function(n,t){typeof Xt=="object"&&typeof Bt<"u"?Bt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ro=t(n.dayjs)})(Xt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ro",weekdays:"Duminic\u0103_Luni_Mar\u021Bi_Miercuri_Joi_Vineri_S\xE2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xE2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xE2".split("_"),months:"Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),monthsShort:"Ian._Febr._Mart._Apr._Mai_Iun._Iul._Aug._Sept._Oct._Nov._Dec.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},relativeTime:{future:"peste %s",past:"acum %s",s:"c\xE2teva secunde",m:"un minut",mm:"%d minute",h:"o or\u0103",hh:"%d ore",d:"o zi",dd:"%d zile",M:"o lun\u0103",MM:"%d luni",y:"un an",yy:"%d ani"},ordinal:function(e){return e}};return a.default.locale(i,null,!0),i}))});var Hi=v((en,tn)=>{(function(n,t){typeof en=="object"&&typeof tn<"u"?tn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ru=t(n.dayjs)})(en,(function(n){"use strict";function t(l){return l&&typeof l=="object"&&"default"in l?l:{default:l}}var a=t(n),i="\u044F\u043D\u0432\u0430\u0440\u044F_\u0444\u0435\u0432\u0440\u0430\u043B\u044F_\u043C\u0430\u0440\u0442\u0430_\u0430\u043F\u0440\u0435\u043B\u044F_\u043C\u0430\u044F_\u0438\u044E\u043D\u044F_\u0438\u044E\u043B\u044F_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F_\u043E\u043A\u0442\u044F\u0431\u0440\u044F_\u043D\u043E\u044F\u0431\u0440\u044F_\u0434\u0435\u043A\u0430\u0431\u0440\u044F".split("_"),e="\u044F\u043D\u0432\u0430\u0440\u044C_\u0444\u0435\u0432\u0440\u0430\u043B\u044C_\u043C\u0430\u0440\u0442_\u0430\u043F\u0440\u0435\u043B\u044C_\u043C\u0430\u0439_\u0438\u044E\u043D\u044C_\u0438\u044E\u043B\u044C_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C_\u043E\u043A\u0442\u044F\u0431\u0440\u044C_\u043D\u043E\u044F\u0431\u0440\u044C_\u0434\u0435\u043A\u0430\u0431\u0440\u044C".split("_"),r="\u044F\u043D\u0432._\u0444\u0435\u0432\u0440._\u043C\u0430\u0440._\u0430\u043F\u0440._\u043C\u0430\u044F_\u0438\u044E\u043D\u044F_\u0438\u044E\u043B\u044F_\u0430\u0432\u0433._\u0441\u0435\u043D\u0442._\u043E\u043A\u0442._\u043D\u043E\u044F\u0431._\u0434\u0435\u043A.".split("_"),s="\u044F\u043D\u0432._\u0444\u0435\u0432\u0440._\u043C\u0430\u0440\u0442_\u0430\u043F\u0440._\u043C\u0430\u0439_\u0438\u044E\u043D\u044C_\u0438\u044E\u043B\u044C_\u0430\u0432\u0433._\u0441\u0435\u043D\u0442._\u043E\u043A\u0442._\u043D\u043E\u044F\u0431._\u0434\u0435\u043A.".split("_"),_=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function d(l,m,c){var y,D;return c==="m"?m?"\u043C\u0438\u043D\u0443\u0442\u0430":"\u043C\u0438\u043D\u0443\u0442\u0443":l+" "+(y=+l,D={mm:m?"\u043C\u0438\u043D\u0443\u0442\u0430_\u043C\u0438\u043D\u0443\u0442\u044B_\u043C\u0438\u043D\u0443\u0442":"\u043C\u0438\u043D\u0443\u0442\u0443_\u043C\u0438\u043D\u0443\u0442\u044B_\u043C\u0438\u043D\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043E\u0432",dd:"\u0434\u0435\u043D\u044C_\u0434\u043D\u044F_\u0434\u043D\u0435\u0439",MM:"\u043C\u0435\u0441\u044F\u0446_\u043C\u0435\u0441\u044F\u0446\u0430_\u043C\u0435\u0441\u044F\u0446\u0435\u0432",yy:"\u0433\u043E\u0434_\u0433\u043E\u0434\u0430_\u043B\u0435\u0442"}[c].split("_"),y%10==1&&y%100!=11?D[0]:y%10>=2&&y%10<=4&&(y%100<10||y%100>=20)?D[1]:D[2])}var u=function(l,m){return _.test(m)?i[l.month()]:e[l.month()]};u.s=e,u.f=i;var o=function(l,m){return _.test(m)?r[l.month()]:s[l.month()]};o.s=s,o.f=r;var f={name:"ru",weekdays:"\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435_\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A_\u0432\u0442\u043E\u0440\u043D\u0438\u043A_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043F\u044F\u0442\u043D\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u0432\u0441\u043A_\u043F\u043D\u0434_\u0432\u0442\u0440_\u0441\u0440\u0434_\u0447\u0442\u0432_\u043F\u0442\u043D_\u0441\u0431\u0442".split("_"),weekdaysMin:"\u0432\u0441_\u043F\u043D_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043F\u0442_\u0441\u0431".split("_"),months:u,monthsShort:o,weekStart:1,yearStart:4,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043D\u0430\u0437\u0430\u0434",s:"\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u043A\u0443\u043D\u0434",m:d,mm:d,h:"\u0447\u0430\u0441",hh:d,d:"\u0434\u0435\u043D\u044C",dd:d,M:"\u043C\u0435\u0441\u044F\u0446",MM:d,y:"\u0433\u043E\u0434",yy:d},ordinal:function(l){return l},meridiem:function(l){return l<4?"\u043D\u043E\u0447\u0438":l<12?"\u0443\u0442\u0440\u0430":l<17?"\u0434\u043D\u044F":"\u0432\u0435\u0447\u0435\u0440\u0430"}};return a.default.locale(f,null,!0),f}))});var ji=v((nn,rn)=>{(function(n,t){typeof nn=="object"&&typeof rn<"u"?rn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sl=t(n.dayjs)})(nn,(function(n){"use strict";function t(_){return _&&typeof _=="object"&&"default"in _?_:{default:_}}var a=t(n);function i(_){return _%100==2}function e(_){return _%100==3||_%100==4}function r(_,d,u,o){var f=_+" ";switch(u){case"s":return d||o?"nekaj sekund":"nekaj sekundami";case"m":return d?"ena minuta":"eno minuto";case"mm":return i(_)?f+(d||o?"minuti":"minutama"):e(_)?f+(d||o?"minute":"minutami"):f+(d||o?"minut":"minutami");case"h":return d?"ena ura":"eno uro";case"hh":return i(_)?f+(d||o?"uri":"urama"):e(_)?f+(d||o?"ure":"urami"):f+(d||o?"ur":"urami");case"d":return d||o?"en dan":"enim dnem";case"dd":return i(_)?f+(d||o?"dneva":"dnevoma"):f+(d||o?"dni":"dnevi");case"M":return d||o?"en mesec":"enim mesecem";case"MM":return i(_)?f+(d||o?"meseca":"mesecema"):e(_)?f+(d||o?"mesece":"meseci"):f+(d||o?"mesecev":"meseci");case"y":return d||o?"eno leto":"enim letom";case"yy":return i(_)?f+(d||o?"leti":"letoma"):e(_)?f+(d||o?"leta":"leti"):f+(d||o?"let":"leti")}}var s={name:"sl",weekdays:"nedelja_ponedeljek_torek_sreda_\u010Detrtek_petek_sobota".split("_"),months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),weekStart:1,weekdaysShort:"ned._pon._tor._sre._\u010Det._pet._sob.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_to_sr_\u010De_pe_so".split("_"),ordinal:function(_){return _+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"\u010Dez %s",past:"pred %s",s:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r}};return a.default.locale(s,null,!0),s}))});var Ti=v((an,sn)=>{(function(n,t){typeof an=="object"&&typeof sn<"u"?sn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sr_cyrl=t(n.dayjs)})(an,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n),i={words:{m:["\u0458\u0435\u0434\u0430\u043D \u043C\u0438\u043D\u0443\u0442","\u0458\u0435\u0434\u043D\u043E\u0433 \u043C\u0438\u043D\u0443\u0442\u0430"],mm:["%d \u043C\u0438\u043D\u0443\u0442","%d \u043C\u0438\u043D\u0443\u0442\u0430","%d \u043C\u0438\u043D\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043D \u0441\u0430\u0442","\u0458\u0435\u0434\u043D\u043E\u0433 \u0441\u0430\u0442\u0430"],hh:["%d \u0441\u0430\u0442","%d \u0441\u0430\u0442\u0430","%d \u0441\u0430\u0442\u0438"],d:["\u0458\u0435\u0434\u0430\u043D \u0434\u0430\u043D","\u0458\u0435\u0434\u043D\u043E\u0433 \u0434\u0430\u043D\u0430"],dd:["%d \u0434\u0430\u043D","%d \u0434\u0430\u043D\u0430","%d \u0434\u0430\u043D\u0430"],M:["\u0458\u0435\u0434\u0430\u043D \u043C\u0435\u0441\u0435\u0446","\u0458\u0435\u0434\u043D\u043E\u0433 \u043C\u0435\u0441\u0435\u0446\u0430"],MM:["%d \u043C\u0435\u0441\u0435\u0446","%d \u043C\u0435\u0441\u0435\u0446\u0430","%d \u043C\u0435\u0441\u0435\u0446\u0438"],y:["\u0458\u0435\u0434\u043D\u0443 \u0433\u043E\u0434\u0438\u043D\u0443","\u0458\u0435\u0434\u043D\u0435 \u0433\u043E\u0434\u0438\u043D\u0435"],yy:["%d \u0433\u043E\u0434\u0438\u043D\u0443","%d \u0433\u043E\u0434\u0438\u043D\u0435","%d \u0433\u043E\u0434\u0438\u043D\u0430"]},correctGrammarCase:function(r,s){return r%10>=1&&r%10<=4&&(r%100<10||r%100>=20)?r%10==1?s[0]:s[1]:s[2]},relativeTimeFormatter:function(r,s,_,d){var u=i.words[_];if(_.length===1)return _==="y"&&s?"\u0458\u0435\u0434\u043D\u0430 \u0433\u043E\u0434\u0438\u043D\u0430":d||s?u[0]:u[1];var o=i.correctGrammarCase(r,u);return _==="yy"&&s&&o==="%d \u0433\u043E\u0434\u0438\u043D\u0443"?r+" \u0433\u043E\u0434\u0438\u043D\u0430":o.replace("%d",r)}},e={name:"sr-cyrl",weekdays:"\u041D\u0435\u0434\u0435\u0459\u0430_\u041F\u043E\u043D\u0435\u0434\u0435\u0459\u0430\u043A_\u0423\u0442\u043E\u0440\u0430\u043A_\u0421\u0440\u0435\u0434\u0430_\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043A_\u041F\u0435\u0442\u0430\u043A_\u0421\u0443\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u041D\u0435\u0434._\u041F\u043E\u043D._\u0423\u0442\u043E._\u0421\u0440\u0435._\u0427\u0435\u0442._\u041F\u0435\u0442._\u0421\u0443\u0431.".split("_"),weekdaysMin:"\u043D\u0435_\u043F\u043E_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043F\u0435_\u0441\u0443".split("_"),months:"\u0408\u0430\u043D\u0443\u0430\u0440_\u0424\u0435\u0431\u0440\u0443\u0430\u0440_\u041C\u0430\u0440\u0442_\u0410\u043F\u0440\u0438\u043B_\u041C\u0430\u0458_\u0408\u0443\u043D_\u0408\u0443\u043B_\u0410\u0432\u0433\u0443\u0441\u0442_\u0421\u0435\u043F\u0442\u0435\u043C\u0431\u0430\u0440_\u041E\u043A\u0442\u043E\u0431\u0430\u0440_\u041D\u043E\u0432\u0435\u043C\u0431\u0430\u0440_\u0414\u0435\u0446\u0435\u043C\u0431\u0430\u0440".split("_"),monthsShort:"\u0408\u0430\u043D._\u0424\u0435\u0431._\u041C\u0430\u0440._\u0410\u043F\u0440._\u041C\u0430\u0458_\u0408\u0443\u043D_\u0408\u0443\u043B_\u0410\u0432\u0433._\u0421\u0435\u043F._\u041E\u043A\u0442._\u041D\u043E\u0432._\u0414\u0435\u0446.".split("_"),weekStart:1,relativeTime:{future:"\u0437\u0430 %s",past:"\u043F\u0440\u0435 %s",s:"\u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0441\u0435\u043A\u0443\u043D\u0434\u0438",m:i.relativeTimeFormatter,mm:i.relativeTimeFormatter,h:i.relativeTimeFormatter,hh:i.relativeTimeFormatter,d:i.relativeTimeFormatter,dd:i.relativeTimeFormatter,M:i.relativeTimeFormatter,MM:i.relativeTimeFormatter,y:i.relativeTimeFormatter,yy:i.relativeTimeFormatter},ordinal:function(r){return r+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"}};return a.default.locale(e,null,!0),e}))});var wi=v((un,dn)=>{(function(n,t){typeof un=="object"&&typeof dn<"u"?dn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sr=t(n.dayjs)})(un,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n),i={words:{m:["jedan minut","jednog minuta"],mm:["%d minut","%d minuta","%d minuta"],h:["jedan sat","jednog sata"],hh:["%d sat","%d sata","%d sati"],d:["jedan dan","jednog dana"],dd:["%d dan","%d dana","%d dana"],M:["jedan mesec","jednog meseca"],MM:["%d mesec","%d meseca","%d meseci"],y:["jednu godinu","jedne godine"],yy:["%d godinu","%d godine","%d godina"]},correctGrammarCase:function(r,s){return r%10>=1&&r%10<=4&&(r%100<10||r%100>=20)?r%10==1?s[0]:s[1]:s[2]},relativeTimeFormatter:function(r,s,_,d){var u=i.words[_];if(_.length===1)return _==="y"&&s?"jedna godina":d||s?u[0]:u[1];var o=i.correctGrammarCase(r,u);return _==="yy"&&s&&o==="%d godinu"?r+" godina":o.replace("%d",r)}},e={name:"sr",weekdays:"Nedelja_Ponedeljak_Utorak_Sreda_\u010Cetvrtak_Petak_Subota".split("_"),weekdaysShort:"Ned._Pon._Uto._Sre._\u010Cet._Pet._Sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010De_pe_su".split("_"),months:"Januar_Februar_Mart_April_Maj_Jun_Jul_Avgust_Septembar_Oktobar_Novembar_Decembar".split("_"),monthsShort:"Jan._Feb._Mar._Apr._Maj_Jun_Jul_Avg._Sep._Okt._Nov._Dec.".split("_"),weekStart:1,relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:i.relativeTimeFormatter,mm:i.relativeTimeFormatter,h:i.relativeTimeFormatter,hh:i.relativeTimeFormatter,d:i.relativeTimeFormatter,dd:i.relativeTimeFormatter,M:i.relativeTimeFormatter,MM:i.relativeTimeFormatter,y:i.relativeTimeFormatter,yy:i.relativeTimeFormatter},ordinal:function(r){return r+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"}};return a.default.locale(e,null,!0),e}))});var $i=v((on,_n)=>{(function(n,t){typeof on=="object"&&typeof _n<"u"?_n.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sv=t(n.dayjs)})(on,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"sv",weekdays:"s\xF6ndag_m\xE5ndag_tisdag_onsdag_torsdag_fredag_l\xF6rdag".split("_"),weekdaysShort:"s\xF6n_m\xE5n_tis_ons_tor_fre_l\xF6r".split("_"),weekdaysMin:"s\xF6_m\xE5_ti_on_to_fr_l\xF6".split("_"),months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekStart:1,yearStart:4,ordinal:function(e){var r=e%10;return"["+e+(r===1||r===2?"a":"e")+"]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},relativeTime:{future:"om %s",past:"f\xF6r %s sedan",s:"n\xE5gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xE5nad",MM:"%d m\xE5nader",y:"ett \xE5r",yy:"%d \xE5r"}};return a.default.locale(i,null,!0),i}))});var Ci=v((ln,fn)=>{(function(n,t){typeof ln=="object"&&typeof fn<"u"?fn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_th=t(n.dayjs)})(ln,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"th",weekdays:"\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C_\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C_\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23_\u0E1E\u0E38\u0E18_\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35_\u0E28\u0E38\u0E01\u0E23\u0E4C_\u0E40\u0E2A\u0E32\u0E23\u0E4C".split("_"),weekdaysShort:"\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C_\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C_\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23_\u0E1E\u0E38\u0E18_\u0E1E\u0E24\u0E2B\u0E31\u0E2A_\u0E28\u0E38\u0E01\u0E23\u0E4C_\u0E40\u0E2A\u0E32\u0E23\u0E4C".split("_"),weekdaysMin:"\u0E2D\u0E32._\u0E08._\u0E2D._\u0E1E._\u0E1E\u0E24._\u0E28._\u0E2A.".split("_"),months:"\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21_\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C_\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21_\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19_\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21_\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19_\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21_\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21_\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19_\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21_\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19_\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21".split("_"),monthsShort:"\u0E21.\u0E04._\u0E01.\u0E1E._\u0E21\u0E35.\u0E04._\u0E40\u0E21.\u0E22._\u0E1E.\u0E04._\u0E21\u0E34.\u0E22._\u0E01.\u0E04._\u0E2A.\u0E04._\u0E01.\u0E22._\u0E15.\u0E04._\u0E1E.\u0E22._\u0E18.\u0E04.".split("_"),formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0E40\u0E27\u0E25\u0E32 H:mm",LLLL:"\u0E27\u0E31\u0E19dddd\u0E17\u0E35\u0E48 D MMMM YYYY \u0E40\u0E27\u0E25\u0E32 H:mm"},relativeTime:{future:"\u0E2D\u0E35\u0E01 %s",past:"%s\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27",s:"\u0E44\u0E21\u0E48\u0E01\u0E35\u0E48\u0E27\u0E34\u0E19\u0E32\u0E17\u0E35",m:"1 \u0E19\u0E32\u0E17\u0E35",mm:"%d \u0E19\u0E32\u0E17\u0E35",h:"1 \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07",hh:"%d \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07",d:"1 \u0E27\u0E31\u0E19",dd:"%d \u0E27\u0E31\u0E19",M:"1 \u0E40\u0E14\u0E37\u0E2D\u0E19",MM:"%d \u0E40\u0E14\u0E37\u0E2D\u0E19",y:"1 \u0E1B\u0E35",yy:"%d \u0E1B\u0E35"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var Oi=v((mn,cn)=>{(function(n,t){typeof mn=="object"&&typeof cn<"u"?cn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_tr=t(n.dayjs)})(mn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"tr",weekdays:"Pazar_Pazartesi_Sal\u0131_\xC7ar\u015Famba_Per\u015Fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xC7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xC7a_Pe_Cu_Ct".split("_"),months:"Ocak_\u015Eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011Fustos_Eyl\xFCl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015Eub_Mar_Nis_May_Haz_Tem_A\u011Fu_Eyl_Eki_Kas_Ara".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s sonra",past:"%s \xF6nce",s:"birka\xE7 saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xFCn",dd:"%d g\xFCn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var zi=v((hn,Mn)=>{(function(n,t){typeof hn=="object"&&typeof Mn<"u"?Mn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_uk=t(n.dayjs)})(hn,(function(n){"use strict";function t(u){return u&&typeof u=="object"&&"default"in u?u:{default:u}}var a=t(n),i="\u0441\u0456\u0447\u043D\u044F_\u043B\u044E\u0442\u043E\u0433\u043E_\u0431\u0435\u0440\u0435\u0437\u043D\u044F_\u043A\u0432\u0456\u0442\u043D\u044F_\u0442\u0440\u0430\u0432\u043D\u044F_\u0447\u0435\u0440\u0432\u043D\u044F_\u043B\u0438\u043F\u043D\u044F_\u0441\u0435\u0440\u043F\u043D\u044F_\u0432\u0435\u0440\u0435\u0441\u043D\u044F_\u0436\u043E\u0432\u0442\u043D\u044F_\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043D\u044F".split("_"),e="\u0441\u0456\u0447\u0435\u043D\u044C_\u043B\u044E\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043D\u044C_\u043A\u0432\u0456\u0442\u0435\u043D\u044C_\u0442\u0440\u0430\u0432\u0435\u043D\u044C_\u0447\u0435\u0440\u0432\u0435\u043D\u044C_\u043B\u0438\u043F\u0435\u043D\u044C_\u0441\u0435\u0440\u043F\u0435\u043D\u044C_\u0432\u0435\u0440\u0435\u0441\u0435\u043D\u044C_\u0436\u043E\u0432\u0442\u0435\u043D\u044C_\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043D\u044C".split("_"),r=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function s(u,o,f){var l,m;return f==="m"?o?"\u0445\u0432\u0438\u043B\u0438\u043D\u0430":"\u0445\u0432\u0438\u043B\u0438\u043D\u0443":f==="h"?o?"\u0433\u043E\u0434\u0438\u043D\u0430":"\u0433\u043E\u0434\u0438\u043D\u0443":u+" "+(l=+u,m={ss:o?"\u0441\u0435\u043A\u0443\u043D\u0434\u0430_\u0441\u0435\u043A\u0443\u043D\u0434\u0438_\u0441\u0435\u043A\u0443\u043D\u0434":"\u0441\u0435\u043A\u0443\u043D\u0434\u0443_\u0441\u0435\u043A\u0443\u043D\u0434\u0438_\u0441\u0435\u043A\u0443\u043D\u0434",mm:o?"\u0445\u0432\u0438\u043B\u0438\u043D\u0430_\u0445\u0432\u0438\u043B\u0438\u043D\u0438_\u0445\u0432\u0438\u043B\u0438\u043D":"\u0445\u0432\u0438\u043B\u0438\u043D\u0443_\u0445\u0432\u0438\u043B\u0438\u043D\u0438_\u0445\u0432\u0438\u043B\u0438\u043D",hh:o?"\u0433\u043E\u0434\u0438\u043D\u0430_\u0433\u043E\u0434\u0438\u043D\u0438_\u0433\u043E\u0434\u0438\u043D":"\u0433\u043E\u0434\u0438\u043D\u0443_\u0433\u043E\u0434\u0438\u043D\u0438_\u0433\u043E\u0434\u0438\u043D",dd:"\u0434\u0435\u043D\u044C_\u0434\u043D\u0456_\u0434\u043D\u0456\u0432",MM:"\u043C\u0456\u0441\u044F\u0446\u044C_\u043C\u0456\u0441\u044F\u0446\u0456_\u043C\u0456\u0441\u044F\u0446\u0456\u0432",yy:"\u0440\u0456\u043A_\u0440\u043E\u043A\u0438_\u0440\u043E\u043A\u0456\u0432"}[f].split("_"),l%10==1&&l%100!=11?m[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?m[1]:m[2])}var _=function(u,o){return r.test(o)?i[u.month()]:e[u.month()]};_.s=e,_.f=i;var d={name:"uk",weekdays:"\u043D\u0435\u0434\u0456\u043B\u044F_\u043F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A_\u0432\u0456\u0432\u0442\u043E\u0440\u043E\u043A_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043F\u2019\u044F\u0442\u043D\u0438\u0446\u044F_\u0441\u0443\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u043D\u0434\u043B_\u043F\u043D\u0434_\u0432\u0442\u0440_\u0441\u0440\u0434_\u0447\u0442\u0432_\u043F\u0442\u043D_\u0441\u0431\u0442".split("_"),weekdaysMin:"\u043D\u0434_\u043F\u043D_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043F\u0442_\u0441\u0431".split("_"),months:_,monthsShort:"\u0441\u0456\u0447_\u043B\u044E\u0442_\u0431\u0435\u0440_\u043A\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043B\u0438\u043F_\u0441\u0435\u0440\u043F_\u0432\u0435\u0440_\u0436\u043E\u0432\u0442_\u043B\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekStart:1,relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043E\u043C\u0443",s:"\u0434\u0435\u043A\u0456\u043B\u044C\u043A\u0430 \u0441\u0435\u043A\u0443\u043D\u0434",m:s,mm:s,h:s,hh:s,d:"\u0434\u0435\u043D\u044C",dd:s,M:"\u043C\u0456\u0441\u044F\u0446\u044C",MM:s,y:"\u0440\u0456\u043A",yy:s},ordinal:function(u){return u},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"}};return a.default.locale(d,null,!0),d}))});var Ai=v((Yn,yn)=>{(function(n,t){typeof Yn=="object"&&typeof yn<"u"?yn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ur=t(n.dayjs)})(Yn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ur",weekdays:"\u0627\u062A\u0648\u0627\u0631_\u067E\u06CC\u0631_\u0645\u0646\u06AF\u0644_\u0628\u062F\u06BE_\u062C\u0645\u0639\u0631\u0627\u062A_\u062C\u0645\u0639\u06C1_\u06C1\u0641\u062A\u06C1".split("_"),months:"\u062C\u0646\u0648\u0631\u06CC_\u0641\u0631\u0648\u0631\u06CC_\u0645\u0627\u0631\u0686_\u0627\u067E\u0631\u06CC\u0644_\u0645\u0626\u06CC_\u062C\u0648\u0646_\u062C\u0648\u0644\u0627\u0626\u06CC_\u0627\u06AF\u0633\u062A_\u0633\u062A\u0645\u0628\u0631_\u0627\u06A9\u062A\u0648\u0628\u0631_\u0646\u0648\u0645\u0628\u0631_\u062F\u0633\u0645\u0628\u0631".split("_"),weekStart:1,weekdaysShort:"\u0627\u062A\u0648\u0627\u0631_\u067E\u06CC\u0631_\u0645\u0646\u06AF\u0644_\u0628\u062F\u06BE_\u062C\u0645\u0639\u0631\u0627\u062A_\u062C\u0645\u0639\u06C1_\u06C1\u0641\u062A\u06C1".split("_"),monthsShort:"\u062C\u0646\u0648\u0631\u06CC_\u0641\u0631\u0648\u0631\u06CC_\u0645\u0627\u0631\u0686_\u0627\u067E\u0631\u06CC\u0644_\u0645\u0626\u06CC_\u062C\u0648\u0646_\u062C\u0648\u0644\u0627\u0626\u06CC_\u0627\u06AF\u0633\u062A_\u0633\u062A\u0645\u0628\u0631_\u0627\u06A9\u062A\u0648\u0628\u0631_\u0646\u0648\u0645\u0628\u0631_\u062F\u0633\u0645\u0628\u0631".split("_"),weekdaysMin:"\u0627\u062A\u0648\u0627\u0631_\u067E\u06CC\u0631_\u0645\u0646\u06AF\u0644_\u0628\u062F\u06BE_\u062C\u0645\u0639\u0631\u0627\u062A_\u062C\u0645\u0639\u06C1_\u06C1\u0641\u062A\u06C1".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060C D MMMM YYYY HH:mm"},relativeTime:{future:"%s \u0628\u0639\u062F",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062F \u0633\u06CC\u06A9\u0646\u0688",m:"\u0627\u06CC\u06A9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06CC\u06A9 \u06AF\u06BE\u0646\u0679\u06C1",hh:"%d \u06AF\u06BE\u0646\u0679\u06D2",d:"\u0627\u06CC\u06A9 \u062F\u0646",dd:"%d \u062F\u0646",M:"\u0627\u06CC\u06A9 \u0645\u0627\u06C1",MM:"%d \u0645\u0627\u06C1",y:"\u0627\u06CC\u06A9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"}};return a.default.locale(i,null,!0),i}))});var qi=v((pn,Ln)=>{(function(n,t){typeof pn=="object"&&typeof Ln<"u"?Ln.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_vi=t(n.dayjs)})(pn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"vi",weekdays:"ch\u1EE7 nh\u1EADt_th\u1EE9 hai_th\u1EE9 ba_th\u1EE9 t\u01B0_th\u1EE9 n\u0103m_th\u1EE9 s\xE1u_th\u1EE9 b\u1EA3y".split("_"),months:"th\xE1ng 1_th\xE1ng 2_th\xE1ng 3_th\xE1ng 4_th\xE1ng 5_th\xE1ng 6_th\xE1ng 7_th\xE1ng 8_th\xE1ng 9_th\xE1ng 10_th\xE1ng 11_th\xE1ng 12".split("_"),weekStart:1,weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},relativeTime:{future:"%s t\u1EDBi",past:"%s tr\u01B0\u1EDBc",s:"v\xE0i gi\xE2y",m:"m\u1ED9t ph\xFAt",mm:"%d ph\xFAt",h:"m\u1ED9t gi\u1EDD",hh:"%d gi\u1EDD",d:"m\u1ED9t ng\xE0y",dd:"%d ng\xE0y",M:"m\u1ED9t th\xE1ng",MM:"%d th\xE1ng",y:"m\u1ED9t n\u0103m",yy:"%d n\u0103m"}};return a.default.locale(i,null,!0),i}))});var Ii=v((Dn,vn)=>{(function(n,t){typeof Dn=="object"&&typeof vn<"u"?vn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_cn=t(n.dayjs)})(Dn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"zh-cn",weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e,r){return r==="W"?e+"\u5468":e+"\u65E5"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5Ah\u70B9mm\u5206",LLLL:"YYYY\u5E74M\u6708D\u65E5ddddAh\u70B9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5185",past:"%s\u524D",s:"\u51E0\u79D2",m:"1 \u5206\u949F",mm:"%d \u5206\u949F",h:"1 \u5C0F\u65F6",hh:"%d \u5C0F\u65F6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4E2A\u6708",MM:"%d \u4E2A\u6708",y:"1 \u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var s=100*e+r;return s<600?"\u51CC\u6668":s<900?"\u65E9\u4E0A":s<1100?"\u4E0A\u5348":s<1300?"\u4E2D\u5348":s<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return a.default.locale(i,null,!0),i}))});var xi=v((gn,bn)=>{(function(n,t){typeof gn=="object"&&typeof bn<"u"?bn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_hk=t(n.dayjs)})(gn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"zh-hk",months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u9031\u65E5_\u9031\u4E00_\u9031\u4E8C_\u9031\u4E09_\u9031\u56DB_\u9031\u4E94_\u9031\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),ordinal:function(e,r){return r==="W"?e+"\u9031":e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5167",past:"%s\u524D",s:"\u5E7E\u79D2",m:"\u4E00\u5206\u9418",mm:"%d \u5206\u9418",h:"\u4E00\u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"\u4E00\u5929",dd:"%d \u5929",M:"\u4E00\u500B\u6708",MM:"%d \u500B\u6708",y:"\u4E00\u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var s=100*e+r;return s<600?"\u51CC\u6668":s<900?"\u65E9\u4E0A":s<1100?"\u4E0A\u5348":s<1300?"\u4E2D\u5348":s<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return a.default.locale(i,null,!0),i}))});var Ni=v((Sn,kn)=>{(function(n,t){typeof Sn=="object"&&typeof kn<"u"?kn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_tw=t(n.dayjs)})(Sn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"zh-tw",weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u9031\u65E5_\u9031\u4E00_\u9031\u4E8C_\u9031\u4E09_\u9031\u56DB_\u9031\u4E94_\u9031\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e,r){return r==="W"?e+"\u9031":e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5167",past:"%s\u524D",s:"\u5E7E\u79D2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500B\u6708",MM:"%d \u500B\u6708",y:"1 \u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var s=100*e+r;return s<600?"\u51CC\u6668":s<900?"\u65E9\u4E0A":s<1100?"\u4E0A\u5348":s<1300?"\u4E2D\u5348":s<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return a.default.locale(i,null,!0),i}))});var jn=60,Tn=jn*60,wn=Tn*24,Xi=wn*7,se=1e3,ce=jn*se,ge=Tn*se,$n=wn*se,Cn=Xi*se,_e="millisecond",te="second",ne="minute",ie="hour",V="day",de="week",G="month",he="quarter",K="year",re="date",On="YYYY-MM-DDTHH:mm:ssZ",be="Invalid Date",zn=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,An=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;var In={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var a=["th","st","nd","rd"],i=t%100;return"["+t+(a[(i-20)%10]||a[i]||a[0])+"]"}};var Se=function(t,a,i){var e=String(t);return!e||e.length>=a?t:""+Array(a+1-e.length).join(i)+t},Bi=function(t){var a=-t.utcOffset(),i=Math.abs(a),e=Math.floor(i/60),r=i%60;return(a<=0?"+":"-")+Se(e,2,"0")+":"+Se(r,2,"0")},er=function n(t,a){if(t.date()1)return n(s[0])}else{var _=t.name;ue[_]=t,e=_}return!i&&e&&(le=e),e||!i&&le},E=function(t,a){if(ke(t))return t.clone();var i=typeof a=="object"?a:{};return i.date=t,i.args=arguments,new Ye(i)},rr=function(t,a){return E(t,{locale:a.$L,utc:a.$u,x:a.$x,$offset:a.$offset})},z=xn;z.l=Me;z.i=ke;z.w=rr;var ar=function(t){var a=t.date,i=t.utc;if(a===null)return new Date(NaN);if(z.u(a))return new Date;if(a instanceof Date)return new Date(a);if(typeof a=="string"&&!/Z$/i.test(a)){var e=a.match(zn);if(e){var r=e[2]-1||0,s=(e[7]||"0").substring(0,3);return i?new Date(Date.UTC(e[1],r,e[3]||1,e[4]||0,e[5]||0,e[6]||0,s)):new Date(e[1],r,e[3]||1,e[4]||0,e[5]||0,e[6]||0,s)}}return new Date(a)},Ye=(function(){function n(a){this.$L=Me(a.locale,null,!0),this.parse(a),this.$x=this.$x||a.x||{},this[Nn]=!0}var t=n.prototype;return t.parse=function(i){this.$d=ar(i),this.init()},t.init=function(){var i=this.$d;this.$y=i.getFullYear(),this.$M=i.getMonth(),this.$D=i.getDate(),this.$W=i.getDay(),this.$H=i.getHours(),this.$m=i.getMinutes(),this.$s=i.getSeconds(),this.$ms=i.getMilliseconds()},t.$utils=function(){return z},t.isValid=function(){return this.$d.toString()!==be},t.isSame=function(i,e){var r=E(i);return this.startOf(e)<=r&&r<=this.endOf(e)},t.isAfter=function(i,e){return E(i){this.focusedDate??(this.focusedDate=(this.getDefaultFocusedDate()??O()).tz(_)),this.focusedMonth??(this.focusedMonth=this.focusedDate.month()),this.focusedYear??(this.focusedYear=this.focusedDate.year())});let d=this.getSelectedDate()??this.getDefaultFocusedDate()??O().tz(_).hour(0).minute(0).second(0);(this.getMaxDate()!==null&&d.isAfter(this.getMaxDate())||this.getMinDate()!==null&&d.isBefore(this.getMinDate()))&&(d=null),this.hour=d?.hour()??0,this.minute=d?.minute()??0,this.second=d?.second()??0,this.setDisplayText(),this.setMonths(),this.setDayLabels(),i&&this.$nextTick(()=>this.togglePanelVisibility(this.$refs.button)),this.$watch("focusedMonth",()=>{this.focusedMonth=+this.focusedMonth,this.focusedDate.month()!==this.focusedMonth&&(this.focusedDate=this.focusedDate.month(this.focusedMonth))}),this.$watch("focusedYear",()=>{if(this.focusedYear?.length>4&&(this.focusedYear=this.focusedYear.substring(0,4)),!this.focusedYear||this.focusedYear?.length!==4)return;let u=+this.focusedYear;Number.isInteger(u)||(u=O().tz(_).year(),this.focusedYear=u),this.focusedDate.year()!==u&&(this.focusedDate=this.focusedDate.year(u))}),this.$watch("focusedDate",()=>{let u=this.focusedDate.month(),o=this.focusedDate.year();this.focusedMonth!==u&&(this.focusedMonth=u),this.focusedYear!==o&&(this.focusedYear=o),this.setupDaysGrid()}),this.$watch("hour",()=>{let u=+this.hour;if(Number.isInteger(u)?u>23?this.hour=0:u<0?this.hour=23:this.hour=u:this.hour=0,this.isClearingState)return;let o=this.getSelectedDate()??this.focusedDate;this.setState(o.hour(this.hour??0))}),this.$watch("minute",()=>{let u=+this.minute;if(Number.isInteger(u)?u>59?this.minute=0:u<0?this.minute=59:this.minute=u:this.minute=0,this.isClearingState)return;let o=this.getSelectedDate()??this.focusedDate;this.setState(o.minute(this.minute??0))}),this.$watch("second",()=>{let u=+this.second;if(Number.isInteger(u)?u>59?this.second=0:u<0?this.second=59:this.second=u:this.second=0,this.isClearingState)return;let o=this.getSelectedDate()??this.focusedDate;this.setState(o.second(this.second??0))}),this.$watch("state",()=>{if(this.state===void 0)return;let u=this.getSelectedDate();if(u===null){this.clearState();return}this.getMaxDate()!==null&&u?.isAfter(this.getMaxDate())&&(u=null),this.getMinDate()!==null&&u?.isBefore(this.getMinDate())&&(u=null);let o=u?.hour()??0;this.hour!==o&&(this.hour=o);let f=u?.minute()??0;this.minute!==f&&(this.minute=f);let l=u?.second()??0;this.second!==l&&(this.second=l),this.setDisplayText()})},clearState(){this.isClearingState=!0,this.setState(null),this.hour=0,this.minute=0,this.second=0,this.$nextTick(()=>this.isClearingState=!1)},dateIsDisabled(d){return!!(this.$refs?.disabledDates&&JSON.parse(this.$refs.disabledDates.value??[]).some(u=>(u=O(u),u.isValid()?u.isSame(d,"day"):!1))||this.getMaxDate()&&d.isAfter(this.getMaxDate(),"day")||this.getMinDate()&&d.isBefore(this.getMinDate(),"day"))},dayIsDisabled(d){return this.focusedDate??(this.focusedDate=O().tz(_)),this.dateIsDisabled(this.focusedDate.date(d))},dayIsSelected(d){let u=this.getSelectedDate();return u===null?!1:(this.focusedDate??(this.focusedDate=O().tz(_)),u.date()===d&&u.month()===this.focusedDate.month()&&u.year()===this.focusedDate.year())},dayIsToday(d){let u=O().tz(_);return this.focusedDate??(this.focusedDate=u),u.date()===d&&u.month()===this.focusedDate.month()&&u.year()===this.focusedDate.year()},focusPreviousDay(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.subtract(1,"day")},focusPreviousWeek(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.subtract(1,"week")},focusNextDay(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.add(1,"day")},focusNextWeek(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.add(1,"week")},getDayLabels(){let d=O.weekdaysShort();return a===0?d:[...d.slice(a),...d.slice(0,a)]},getMaxDate(){let d=O(this.$refs.maxDate?.value);return d.isValid()?d:null},getMinDate(){let d=O(this.$refs.minDate?.value);return d.isValid()?d:null},getSelectedDate(){if(this.state===void 0||this.state===null)return null;let d=O(this.state);return d.isValid()?d:null},getDefaultFocusedDate(){if(this.defaultFocusedDate===null)return null;let d=O(this.defaultFocusedDate);return d.isValid()?d:null},togglePanelVisibility(){this.isOpen()||(this.focusedDate=this.getSelectedDate()??this.focusedDate??this.getMinDate()??O().tz(_),this.setupDaysGrid()),this.$refs.panel.toggle(this.$refs.button)},selectDate(d=null){d&&this.setFocusedDay(d),this.focusedDate??(this.focusedDate=O().tz(_)),this.setState(this.focusedDate),r&&this.togglePanelVisibility()},setDisplayText(){this.displayText=this.getSelectedDate()?this.getSelectedDate().format(t):""},setMonths(){this.months=O.months()},setDayLabels(){this.dayLabels=this.getDayLabels()},setupDaysGrid(){this.focusedDate??(this.focusedDate=O().tz(_)),this.emptyDaysInFocusedMonth=Array.from({length:this.focusedDate.date(8-a).day()},(d,u)=>u+1),this.daysInFocusedMonth=Array.from({length:this.focusedDate.daysInMonth()},(d,u)=>u+1)},setFocusedDay(d){this.focusedDate=(this.focusedDate??O().tz(_)).date(d)},setState(d){if(d===null){this.state=null,this.setDisplayText();return}this.dateIsDisabled(d)||(this.state=d.hour(this.hour??0).minute(this.minute??0).second(this.second??0).format("YYYY-MM-DD HH:mm:ss"),this.setDisplayText())},isOpen(){return this.$refs.panel?.style.display==="block"}}}var Fi={am:Gn(),ar:Rn(),bs:Zn(),ca:Vn(),ckb:Re(),cs:Qn(),cy:Xn(),da:Bn(),de:ei(),el:ti(),en:ni(),es:ii(),et:ri(),fa:ai(),fi:si(),fr:ui(),he:di(),hi:oi(),hu:_i(),hy:li(),id:fi(),it:mi(),ja:ci(),ka:hi(),km:Mi(),ku:Re(),lt:Yi(),lv:yi(),ms:pi(),my:Li(),nb:Di(),nl:vi(),pl:gi(),pt:bi(),pt_BR:Si(),ro:ki(),ru:Hi(),sl:ji(),sr_Cyrl:Ti(),sr_Latn:wi(),sv:$i(),th:Ci(),tr:Oi(),uk:zi(),ur:Ai(),vi:qi(),zh_CN:Ii(),zh_HK:xi(),zh_TW:Ni()};export{sr as default}; diff --git a/public/js/filament/forms/components/file-upload.js b/public/js/filament/forms/components/file-upload.js index b820ee692b..53285f367e 100644 --- a/public/js/filament/forms/components/file-upload.js +++ b/public/js/filament/forms/components/file-upload.js @@ -1,6 +1,6 @@ -var Jl=Object.defineProperty;var er=(e,t)=>{for(var i in t)Jl(e,i,{get:t[i],enumerable:!0})};var na={};er(na,{FileOrigin:()=>zt,FileStatus:()=>Et,OptionTypes:()=>Gi,Status:()=>no,create:()=>ut,destroy:()=>ft,find:()=>Wi,getOptions:()=>Hi,parse:()=>Ui,registerPlugin:()=>Ie,setOptions:()=>Dt,supported:()=>Vi});var tr=e=>e instanceof HTMLElement,ir=(e,t=[],i=[])=>{let a={...e},n=[],o=[],l=()=>({...a}),r=()=>{let f=[...n];return n.length=0,f},s=()=>{let f=[...o];o.length=0,f.forEach(({type:h,data:g})=>{p(h,g)})},p=(f,h,g)=>{if(g&&!document.hidden){o.push({type:f,data:h});return}u[f]&&u[f](h),n.push({type:f,data:h})},c=(f,...h)=>m[f]?m[f](...h):null,d={getState:l,processActionQueue:r,processDispatchQueue:s,dispatch:p,query:c},m={};t.forEach(f=>{m={...f(a),...m}});let u={};return i.forEach(f=>{u={...f(p,c,a),...u}}),d},ar=(e,t,i)=>{if(typeof i=="function"){e[t]=i;return}Object.defineProperty(e,t,{...i})},te=(e,t)=>{for(let i in e)e.hasOwnProperty(i)&&t(i,e[i])},We=e=>{let t={};return te(e,i=>{ar(t,i,e[i])}),t},se=(e,t,i=null)=>{if(i===null)return e.getAttribute(t)||e.hasAttribute(t);e.setAttribute(t,i)},nr="http://www.w3.org/2000/svg",or=["svg","path"],Oa=e=>or.includes(e),ni=(e,t,i={})=>{typeof t=="object"&&(i=t,t=null);let a=Oa(e)?document.createElementNS(nr,e):document.createElement(e);return t&&(Oa(e)?se(a,"class",t):a.className=t),te(i,(n,o)=>{se(a,n,o)}),a},lr=e=>(t,i)=>{typeof i<"u"&&e.children[i]?e.insertBefore(t,e.children[i]):e.appendChild(t)},rr=(e,t)=>(i,a)=>(typeof a<"u"?t.splice(a,0,i):t.push(i),i),sr=(e,t)=>i=>(t.splice(t.indexOf(i),1),i.element.parentNode&&e.removeChild(i.element),i),cr=(()=>typeof window<"u"&&typeof window.document<"u")(),En=()=>cr,dr=En()?ni("svg"):{},pr="children"in dr?e=>e.children.length:e=>e.childNodes.length,bn=(e,t,i,a)=>{let n=i[0]||e.left,o=i[1]||e.top,l=n+e.width,r=o+e.height*(a[1]||1),s={element:{...e},inner:{left:e.left,top:e.top,right:e.right,bottom:e.bottom},outer:{left:n,top:o,right:l,bottom:r}};return t.filter(p=>!p.isRectIgnored()).map(p=>p.rect).forEach(p=>{Pa(s.inner,{...p.inner}),Pa(s.outer,{...p.outer})}),Da(s.inner),s.outer.bottom+=s.element.marginBottom,s.outer.right+=s.element.marginRight,Da(s.outer),s},Pa=(e,t)=>{t.top+=e.top,t.right+=e.left,t.bottom+=e.top,t.left+=e.left,t.bottom>e.bottom&&(e.bottom=t.bottom),t.right>e.right&&(e.right=t.right)},Da=e=>{e.width=e.right-e.left,e.height=e.bottom-e.top},$e=e=>typeof e=="number",mr=(e,t,i,a=.001)=>Math.abs(e-t){let a=null,n=null,o=0,l=!1,p=We({interpolate:(c,d)=>{if(l)return;if(!($e(a)&&$e(n))){l=!0,o=0;return}let m=-(n-a)*e;o+=m/i,n+=o,o*=t,mr(n,a,o)||d?(n=a,o=0,l=!0,p.onupdate(n),p.oncomplete(n)):p.onupdate(n)},target:{set:c=>{if($e(c)&&!$e(n)&&(n=c),a===null&&(a=c,n=c),a=c,n===a||typeof a>"u"){l=!0,o=0,p.onupdate(n),p.oncomplete(n);return}l=!1},get:()=>a},resting:{get:()=>l},onupdate:c=>{},oncomplete:c=>{}});return p};var fr=e=>e<.5?2*e*e:-1+(4-2*e)*e,hr=({duration:e=500,easing:t=fr,delay:i=0}={})=>{let a=null,n,o,l=!0,r=!1,s=null,c=We({interpolate:(d,m)=>{l||s===null||(a===null&&(a=d),!(d-a=e||m?(n=1,o=r?0:1,c.onupdate(o*s),c.oncomplete(o*s),l=!0):(o=n/e,c.onupdate((n>=0?t(r?1-o:o):0)*s))))},target:{get:()=>r?0:s,set:d=>{if(s===null){s=d,c.onupdate(d),c.oncomplete(d);return}dl},onupdate:d=>{},oncomplete:d=>{}});return c},Fa={spring:ur,tween:hr},gr=(e,t,i)=>{let a=e[t]&&typeof e[t][i]=="object"?e[t][i]:e[t]||e,n=typeof a=="string"?a:a.type,o=typeof a=="object"?{...a}:{};return Fa[n]?Fa[n](o):null},ji=(e,t,i,a=!1)=>{t=Array.isArray(t)?t:[t],t.forEach(n=>{e.forEach(o=>{let l=o,r=()=>i[o],s=p=>i[o]=p;typeof o=="object"&&(l=o.key,r=o.getter||r,s=o.setter||s),!(n[l]&&!a)&&(n[l]={get:r,set:s})})})},Er=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a})=>{let n={...t},o=[];return te(e,(l,r)=>{let s=gr(r);if(!s)return;s.onupdate=c=>{t[l]=c},s.target=n[l],ji([{key:l,setter:c=>{s.target!==c&&(s.target=c)},getter:()=>t[l]}],[i,a],t,!0),o.push(s)}),{write:l=>{let r=document.hidden,s=!0;return o.forEach(p=>{p.resting||(s=!1),p.interpolate(l,r)}),s},destroy:()=>{}}},br=e=>(t,i)=>{e.addEventListener(t,i)},Tr=e=>(t,i)=>{e.removeEventListener(t,i)},vr=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a,viewState:n,view:o})=>{let l=[],r=br(o.element),s=Tr(o.element);return a.on=(p,c)=>{l.push({type:p,fn:c}),r(p,c)},a.off=(p,c)=>{l.splice(l.findIndex(d=>d.type===p&&d.fn===c),1),s(p,c)},{write:()=>!0,destroy:()=>{l.forEach(p=>{s(p.type,p.fn)})}}},Ir=({mixinConfig:e,viewProps:t,viewExternalAPI:i})=>{ji(e,i,t)},ue=e=>e!=null,xr={opacity:1,scaleX:1,scaleY:1,translateX:0,translateY:0,rotateX:0,rotateY:0,rotateZ:0,originX:0,originY:0},yr=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a,view:n})=>{let o={...t},l={};ji(e,[i,a],t);let r=()=>[t.translateX||0,t.translateY||0],s=()=>[t.scaleX||0,t.scaleY||0],p=()=>n.rect?bn(n.rect,n.childViews,r(),s()):null;return i.rect={get:p},a.rect={get:p},e.forEach(c=>{t[c]=typeof o[c]>"u"?xr[c]:o[c]}),{write:()=>{if(_r(l,t))return Rr(n.element,t),Object.assign(l,{...t}),!0},destroy:()=>{}}},_r=(e,t)=>{if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let i in t)if(t[i]!==e[i])return!0;return!1},Rr=(e,{opacity:t,perspective:i,translateX:a,translateY:n,scaleX:o,scaleY:l,rotateX:r,rotateY:s,rotateZ:p,originX:c,originY:d,width:m,height:u})=>{let f="",h="";(ue(c)||ue(d))&&(h+=`transform-origin: ${c||0}px ${d||0}px;`),ue(i)&&(f+=`perspective(${i}px) `),(ue(a)||ue(n))&&(f+=`translate3d(${a||0}px, ${n||0}px, 0) `),(ue(o)||ue(l))&&(f+=`scale3d(${ue(o)?o:1}, ${ue(l)?l:1}, 1) `),ue(p)&&(f+=`rotateZ(${p}rad) `),ue(r)&&(f+=`rotateX(${r}rad) `),ue(s)&&(f+=`rotateY(${s}rad) `),f.length&&(h+=`transform:${f};`),ue(t)&&(h+=`opacity:${t};`,t===0&&(h+="visibility:hidden;"),t<1&&(h+="pointer-events:none;")),ue(u)&&(h+=`height:${u}px;`),ue(m)&&(h+=`width:${m}px;`);let g=e.elementCurrentStyle||"";(h.length!==g.length||h!==g)&&(e.style.cssText=h,e.elementCurrentStyle=h)},wr={styles:yr,listeners:vr,animations:Er,apis:Ir},za=(e={},t={},i={})=>(t.layoutCalculated||(e.paddingTop=parseInt(i.paddingTop,10)||0,e.marginTop=parseInt(i.marginTop,10)||0,e.marginRight=parseInt(i.marginRight,10)||0,e.marginBottom=parseInt(i.marginBottom,10)||0,e.marginLeft=parseInt(i.marginLeft,10)||0,t.layoutCalculated=!0),e.left=t.offsetLeft||0,e.top=t.offsetTop||0,e.width=t.offsetWidth||0,e.height=t.offsetHeight||0,e.right=e.left+e.width,e.bottom=e.top+e.height,e.scrollTop=t.scrollTop,e.hidden=t.offsetParent===null,e),ne=({tag:e="div",name:t=null,attributes:i={},read:a=()=>{},write:n=()=>{},create:o=()=>{},destroy:l=()=>{},filterFrameActionsForChild:r=(u,f)=>f,didCreateView:s=()=>{},didWriteView:p=()=>{},ignoreRect:c=!1,ignoreRectUpdate:d=!1,mixins:m=[]}={})=>(u,f={})=>{let h=ni(e,`filepond--${t}`,i),g=window.getComputedStyle(h,null),v=za(),E=null,T=!1,I=[],y=[],b={},w={},x=[n],_=[a],P=[l],O=()=>h,M=()=>I.concat(),C=()=>b,S=G=>(H,Y)=>H(G,Y),F=()=>E||(E=bn(v,I,[0,0],[1,1]),E),R=()=>g,L=()=>{E=null,I.forEach(Y=>Y._read()),!(d&&v.width&&v.height)&&za(v,h,g);let H={root:Q,props:f,rect:v};_.forEach(Y=>Y(H))},z=(G,H,Y)=>{let le=H.length===0;return x.forEach(ee=>{ee({props:f,root:Q,actions:H,timestamp:G,shouldOptimize:Y})===!1&&(le=!1)}),y.forEach(ee=>{ee.write(G)===!1&&(le=!1)}),I.filter(ee=>!!ee.element.parentNode).forEach(ee=>{ee._write(G,r(ee,H),Y)||(le=!1)}),I.forEach((ee,V)=>{ee.element.parentNode||(Q.appendChild(ee.element,V),ee._read(),ee._write(G,r(ee,H),Y),le=!1)}),T=le,p({props:f,root:Q,actions:H,timestamp:G}),le},D=()=>{y.forEach(G=>G.destroy()),P.forEach(G=>{G({root:Q,props:f})}),I.forEach(G=>G._destroy())},k={element:{get:O},style:{get:R},childViews:{get:M}},B={...k,rect:{get:F},ref:{get:C},is:G=>t===G,appendChild:lr(h),createChildView:S(u),linkView:G=>(I.push(G),G),unlinkView:G=>{I.splice(I.indexOf(G),1)},appendChildView:rr(h,I),removeChildView:sr(h,I),registerWriter:G=>x.push(G),registerReader:G=>_.push(G),registerDestroyer:G=>P.push(G),invalidateLayout:()=>h.layoutCalculated=!1,dispatch:u.dispatch,query:u.query},X={element:{get:O},childViews:{get:M},rect:{get:F},resting:{get:()=>T},isRectIgnored:()=>c,_read:L,_write:z,_destroy:D},q={...k,rect:{get:()=>v}};Object.keys(m).sort((G,H)=>G==="styles"?1:H==="styles"?-1:0).forEach(G=>{let H=wr[G]({mixinConfig:m[G],viewProps:f,viewState:w,viewInternalAPI:B,viewExternalAPI:X,view:We(q)});H&&y.push(H)});let Q=We(B);o({root:Q,props:f});let pe=pr(h);return I.forEach((G,H)=>{Q.appendChild(G.element,pe+H)}),s(Q),We(X)},Sr=(e,t,i=60)=>{let a="__framePainter";if(window[a]){window[a].readers.push(e),window[a].writers.push(t);return}window[a]={readers:[e],writers:[t]};let n=window[a],o=1e3/i,l=null,r=null,s=null,p=null,c=()=>{document.hidden?(s=()=>window.setTimeout(()=>d(performance.now()),o),p=()=>window.clearTimeout(r)):(s=()=>window.requestAnimationFrame(d),p=()=>window.cancelAnimationFrame(r))};document.addEventListener("visibilitychange",()=>{p&&p(),c(),d(performance.now())});let d=m=>{r=s(d),l||(l=m);let u=m-l;u<=o||(l=m-u%o,n.readers.forEach(f=>f()),n.writers.forEach(f=>f(m)))};return c(),d(performance.now()),{pause:()=>{p(r)}}},he=(e,t)=>({root:i,props:a,actions:n=[],timestamp:o,shouldOptimize:l})=>{n.filter(r=>e[r.type]).forEach(r=>e[r.type]({root:i,props:a,action:r.data,timestamp:o,shouldOptimize:l})),t&&t({root:i,props:a,actions:n,timestamp:o,shouldOptimize:l})},Ca=(e,t)=>t.parentNode.insertBefore(e,t),Na=(e,t)=>t.parentNode.insertBefore(e,t.nextSibling),si=e=>Array.isArray(e),Be=e=>e==null,Lr=e=>e.trim(),ci=e=>""+e,Ar=(e,t=",")=>Be(e)?[]:si(e)?e:ci(e).split(t).map(Lr).filter(i=>i.length),Tn=e=>typeof e=="boolean",vn=e=>Tn(e)?e:e==="true",fe=e=>typeof e=="string",In=e=>$e(e)?e:fe(e)?ci(e).replace(/[a-z]+/gi,""):0,ai=e=>parseInt(In(e),10),Ba=e=>parseFloat(In(e)),gt=e=>$e(e)&&isFinite(e)&&Math.floor(e)===e,ka=(e,t=1e3)=>{if(gt(e))return e;let i=ci(e).trim();return/MB$/i.test(i)?(i=i.replace(/MB$i/,"").trim(),ai(i)*t*t):/KB/i.test(i)?(i=i.replace(/KB$i/,"").trim(),ai(i)*t):ai(i)},Xe=e=>typeof e=="function",Mr=e=>{let t=self,i=e.split("."),a=null;for(;a=i.shift();)if(t=t[a],!t)return null;return t},Va={process:"POST",patch:"PATCH",revert:"DELETE",fetch:"GET",restore:"GET",load:"GET"},Or=e=>{let t={};return t.url=fe(e)?e:e.url||"",t.timeout=e.timeout?parseInt(e.timeout,10):0,t.headers=e.headers?e.headers:{},te(Va,i=>{t[i]=Pr(i,e[i],Va[i],t.timeout,t.headers)}),t.process=e.process||fe(e)||e.url?t.process:null,t.remove=e.remove||null,delete t.headers,t},Pr=(e,t,i,a,n)=>{if(t===null)return null;if(typeof t=="function")return t;let o={url:i==="GET"||i==="PATCH"?`?${e}=`:"",method:i,headers:n,withCredentials:!1,timeout:a,onload:null,ondata:null,onerror:null};if(fe(t))return o.url=t,o;if(Object.assign(o,t),fe(o.headers)){let l=o.headers.split(/:(.+)/);o.headers={header:l[0],value:l[1]}}return o.withCredentials=vn(o.withCredentials),o},Dr=e=>Or(e),Fr=e=>e===null,ce=e=>typeof e=="object"&&e!==null,zr=e=>ce(e)&&fe(e.url)&&ce(e.process)&&ce(e.revert)&&ce(e.restore)&&ce(e.fetch),Pi=e=>si(e)?"array":Fr(e)?"null":gt(e)?"int":/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(e)?"bytes":zr(e)?"api":typeof e,Cr=e=>e.replace(/{\s*'/g,'{"').replace(/'\s*}/g,'"}').replace(/'\s*:/g,'":').replace(/:\s*'/g,':"').replace(/,\s*'/g,',"').replace(/'\s*,/g,'",'),Nr={array:Ar,boolean:vn,int:e=>Pi(e)==="bytes"?ka(e):ai(e),number:Ba,float:Ba,bytes:ka,string:e=>Xe(e)?e:ci(e),function:e=>Mr(e),serverapi:Dr,object:e=>{try{return JSON.parse(Cr(e))}catch{return null}}},Br=(e,t)=>Nr[t](e),xn=(e,t,i)=>{if(e===t)return e;let a=Pi(e);if(a!==i){let n=Br(e,i);if(a=Pi(n),n===null)throw`Trying to assign value with incorrect type to "${option}", allowed type: "${i}"`;e=n}return e},kr=(e,t)=>{let i=e;return{enumerable:!0,get:()=>i,set:a=>{i=xn(a,e,t)}}},Vr=e=>{let t={};return te(e,i=>{let a=e[i];t[i]=kr(a[0],a[1])}),We(t)},Gr=e=>({items:[],listUpdateTimeout:null,itemUpdateTimeout:null,processingQueue:[],options:Vr(e)}),di=(e,t="-")=>e.split(/(?=[A-Z])/).map(i=>i.toLowerCase()).join(t),Ur=(e,t)=>{let i={};return te(t,a=>{i[a]={get:()=>e.getState().options[a],set:n=>{e.dispatch(`SET_${di(a,"_").toUpperCase()}`,{value:n})}}}),i},Wr=e=>(t,i,a)=>{let n={};return te(e,o=>{let l=di(o,"_").toUpperCase();n[`SET_${l}`]=r=>{try{a.options[o]=r.value}catch{}t(`DID_SET_${l}`,{value:a.options[o]})}}),n},Hr=e=>t=>{let i={};return te(e,a=>{i[`GET_${di(a,"_").toUpperCase()}`]=n=>t.options[a]}),i},_e={API:1,DROP:2,BROWSE:3,PASTE:4,NONE:5},Yi=()=>Math.random().toString(36).substring(2,11),qi=(e,t)=>e.splice(t,1),jr=(e,t)=>{t?e():document.hidden?Promise.resolve(1).then(e):setTimeout(e,0)},pi=()=>{let e=[],t=(a,n)=>{qi(e,e.findIndex(o=>o.event===a&&(o.cb===n||!n)))},i=(a,n,o)=>{e.filter(l=>l.event===a).map(l=>l.cb).forEach(l=>jr(()=>l(...n),o))};return{fireSync:(a,...n)=>{i(a,n,!0)},fire:(a,...n)=>{i(a,n,!1)},on:(a,n)=>{e.push({event:a,cb:n})},onOnce:(a,n)=>{e.push({event:a,cb:(...o)=>{t(a,n),n(...o)}})},off:t}},yn=(e,t,i)=>{Object.getOwnPropertyNames(e).filter(a=>!i.includes(a)).forEach(a=>Object.defineProperty(t,a,Object.getOwnPropertyDescriptor(e,a)))},Yr=["fire","process","revert","load","on","off","onOnce","retryLoad","extend","archive","archived","release","released","requestProcessing","freeze"],ge=e=>{let t={};return yn(e,t,Yr),t},qr=e=>{e.forEach((t,i)=>{t.released&&qi(e,i)})},W={INIT:1,IDLE:2,PROCESSING_QUEUED:9,PROCESSING:3,PROCESSING_COMPLETE:5,PROCESSING_ERROR:6,PROCESSING_REVERT_ERROR:10,LOADING:7,LOAD_ERROR:8},re={INPUT:1,LIMBO:2,LOCAL:3},_n=e=>/[^0-9]+/.exec(e),Rn=()=>_n(1.1.toLocaleString())[0],$r=()=>{let e=Rn(),t=1e3.toLocaleString(),i=1e3.toString();return t!==i?_n(t)[0]:e==="."?",":"."},A={BOOLEAN:"boolean",INT:"int",NUMBER:"number",STRING:"string",ARRAY:"array",OBJECT:"object",FUNCTION:"function",ACTION:"action",SERVER_API:"serverapi",REGEX:"regex"},$i=[],Ae=(e,t,i)=>new Promise((a,n)=>{let o=$i.filter(r=>r.key===e).map(r=>r.cb);if(o.length===0){a(t);return}let l=o.shift();o.reduce((r,s)=>r.then(p=>s(p,i)),l(t,i)).then(r=>a(r)).catch(r=>n(r))}),tt=(e,t,i)=>$i.filter(a=>a.key===e).map(a=>a.cb(t,i)),Xr=(e,t)=>$i.push({key:e,cb:t}),Qr=e=>Object.assign(dt,e),oi=()=>({...dt}),Zr=e=>{te(e,(t,i)=>{dt[t]&&(dt[t][0]=xn(i,dt[t][0],dt[t][1]))})},dt={id:[null,A.STRING],name:["filepond",A.STRING],disabled:[!1,A.BOOLEAN],className:[null,A.STRING],required:[!1,A.BOOLEAN],captureMethod:[null,A.STRING],allowSyncAcceptAttribute:[!0,A.BOOLEAN],allowDrop:[!0,A.BOOLEAN],allowBrowse:[!0,A.BOOLEAN],allowPaste:[!0,A.BOOLEAN],allowMultiple:[!1,A.BOOLEAN],allowReplace:[!0,A.BOOLEAN],allowRevert:[!0,A.BOOLEAN],allowRemove:[!0,A.BOOLEAN],allowProcess:[!0,A.BOOLEAN],allowReorder:[!1,A.BOOLEAN],allowDirectoriesOnly:[!1,A.BOOLEAN],storeAsFile:[!1,A.BOOLEAN],forceRevert:[!1,A.BOOLEAN],maxFiles:[null,A.INT],checkValidity:[!1,A.BOOLEAN],itemInsertLocationFreedom:[!0,A.BOOLEAN],itemInsertLocation:["before",A.STRING],itemInsertInterval:[75,A.INT],dropOnPage:[!1,A.BOOLEAN],dropOnElement:[!0,A.BOOLEAN],dropValidation:[!1,A.BOOLEAN],ignoredFiles:[[".ds_store","thumbs.db","desktop.ini"],A.ARRAY],instantUpload:[!0,A.BOOLEAN],maxParallelUploads:[2,A.INT],allowMinimumUploadDuration:[!0,A.BOOLEAN],chunkUploads:[!1,A.BOOLEAN],chunkForce:[!1,A.BOOLEAN],chunkSize:[5e6,A.INT],chunkRetryDelays:[[500,1e3,3e3],A.ARRAY],server:[null,A.SERVER_API],fileSizeBase:[1e3,A.INT],labelFileSizeBytes:["bytes",A.STRING],labelFileSizeKilobytes:["KB",A.STRING],labelFileSizeMegabytes:["MB",A.STRING],labelFileSizeGigabytes:["GB",A.STRING],labelDecimalSeparator:[Rn(),A.STRING],labelThousandsSeparator:[$r(),A.STRING],labelIdle:['Drag & Drop your files or Browse',A.STRING],labelInvalidField:["Field contains invalid files",A.STRING],labelFileWaitingForSize:["Waiting for size",A.STRING],labelFileSizeNotAvailable:["Size not available",A.STRING],labelFileCountSingular:["file in list",A.STRING],labelFileCountPlural:["files in list",A.STRING],labelFileLoading:["Loading",A.STRING],labelFileAdded:["Added",A.STRING],labelFileLoadError:["Error during load",A.STRING],labelFileRemoved:["Removed",A.STRING],labelFileRemoveError:["Error during remove",A.STRING],labelFileProcessing:["Uploading",A.STRING],labelFileProcessingComplete:["Upload complete",A.STRING],labelFileProcessingAborted:["Upload cancelled",A.STRING],labelFileProcessingError:["Error during upload",A.STRING],labelFileProcessingRevertError:["Error during revert",A.STRING],labelTapToCancel:["tap to cancel",A.STRING],labelTapToRetry:["tap to retry",A.STRING],labelTapToUndo:["tap to undo",A.STRING],labelButtonRemoveItem:["Remove",A.STRING],labelButtonAbortItemLoad:["Abort",A.STRING],labelButtonRetryItemLoad:["Retry",A.STRING],labelButtonAbortItemProcessing:["Cancel",A.STRING],labelButtonUndoItemProcessing:["Undo",A.STRING],labelButtonRetryItemProcessing:["Retry",A.STRING],labelButtonProcessItem:["Upload",A.STRING],iconRemove:['',A.STRING],iconProcess:['',A.STRING],iconRetry:['',A.STRING],iconUndo:['',A.STRING],iconDone:['',A.STRING],oninit:[null,A.FUNCTION],onwarning:[null,A.FUNCTION],onerror:[null,A.FUNCTION],onactivatefile:[null,A.FUNCTION],oninitfile:[null,A.FUNCTION],onaddfilestart:[null,A.FUNCTION],onaddfileprogress:[null,A.FUNCTION],onaddfile:[null,A.FUNCTION],onprocessfilestart:[null,A.FUNCTION],onprocessfileprogress:[null,A.FUNCTION],onprocessfileabort:[null,A.FUNCTION],onprocessfilerevert:[null,A.FUNCTION],onprocessfile:[null,A.FUNCTION],onprocessfiles:[null,A.FUNCTION],onremovefile:[null,A.FUNCTION],onpreparefile:[null,A.FUNCTION],onupdatefiles:[null,A.FUNCTION],onreorderfiles:[null,A.FUNCTION],beforeDropFile:[null,A.FUNCTION],beforeAddFile:[null,A.FUNCTION],beforeRemoveFile:[null,A.FUNCTION],beforePrepareFile:[null,A.FUNCTION],stylePanelLayout:[null,A.STRING],stylePanelAspectRatio:[null,A.STRING],styleItemPanelAspectRatio:[null,A.STRING],styleButtonRemoveItemPosition:["left",A.STRING],styleButtonProcessItemPosition:["right",A.STRING],styleLoadIndicatorPosition:["right",A.STRING],styleProgressIndicatorPosition:["right",A.STRING],styleButtonRemoveItemAlign:[!1,A.BOOLEAN],files:[[],A.ARRAY],credits:[["https://pqina.nl/","Powered by PQINA"],A.ARRAY]},Qe=(e,t)=>Be(t)?e[0]||null:gt(t)?e[t]||null:(typeof t=="object"&&(t=t.id),e.find(i=>i.id===t)||null),wn=e=>{if(Be(e))return e;if(/:/.test(e)){let t=e.split(":");return t[1]/t[0]}return parseFloat(e)},Me=e=>e.filter(t=>!t.archived),Sn={EMPTY:0,IDLE:1,ERROR:2,BUSY:3,READY:4},Zt=null,Kr=()=>{if(Zt===null)try{let e=new DataTransfer;e.items.add(new File(["hello world"],"This_Works.txt"));let t=document.createElement("input");t.setAttribute("type","file"),t.files=e.files,Zt=t.files.length===1}catch{Zt=!1}return Zt},Jr=[W.LOAD_ERROR,W.PROCESSING_ERROR,W.PROCESSING_REVERT_ERROR],es=[W.LOADING,W.PROCESSING,W.PROCESSING_QUEUED,W.INIT],ts=[W.PROCESSING_COMPLETE],is=e=>Jr.includes(e.status),as=e=>es.includes(e.status),ns=e=>ts.includes(e.status),Ga=e=>ce(e.options.server)&&(ce(e.options.server.process)||Xe(e.options.server.process)),os=e=>({GET_STATUS:()=>{let t=Me(e.items),{EMPTY:i,ERROR:a,BUSY:n,IDLE:o,READY:l}=Sn;return t.length===0?i:t.some(is)?a:t.some(as)?n:t.some(ns)?l:o},GET_ITEM:t=>Qe(e.items,t),GET_ACTIVE_ITEM:t=>Qe(Me(e.items),t),GET_ACTIVE_ITEMS:()=>Me(e.items),GET_ITEMS:()=>e.items,GET_ITEM_NAME:t=>{let i=Qe(e.items,t);return i?i.filename:null},GET_ITEM_SIZE:t=>{let i=Qe(e.items,t);return i?i.fileSize:null},GET_STYLES:()=>Object.keys(e.options).filter(t=>/^style/.test(t)).map(t=>({name:t,value:e.options[t]})),GET_PANEL_ASPECT_RATIO:()=>/circle/.test(e.options.stylePanelLayout)?1:wn(e.options.stylePanelAspectRatio),GET_ITEM_PANEL_ASPECT_RATIO:()=>e.options.styleItemPanelAspectRatio,GET_ITEMS_BY_STATUS:t=>Me(e.items).filter(i=>i.status===t),GET_TOTAL_ITEMS:()=>Me(e.items).length,SHOULD_UPDATE_FILE_INPUT:()=>e.options.storeAsFile&&Kr()&&!Ga(e),IS_ASYNC:()=>Ga(e),GET_FILE_SIZE_LABELS:t=>({labelBytes:t("GET_LABEL_FILE_SIZE_BYTES")||void 0,labelKilobytes:t("GET_LABEL_FILE_SIZE_KILOBYTES")||void 0,labelMegabytes:t("GET_LABEL_FILE_SIZE_MEGABYTES")||void 0,labelGigabytes:t("GET_LABEL_FILE_SIZE_GIGABYTES")||void 0})}),ls=e=>{let t=Me(e.items).length;if(!e.options.allowMultiple)return t===0;let i=e.options.maxFiles;return i===null||tMath.max(Math.min(i,e),t),rs=(e,t,i)=>e.splice(t,0,i),ss=(e,t,i)=>Be(t)?null:typeof i>"u"?(e.push(t),t):(i=Ln(i,0,e.length),rs(e,i,t),t),Di=e=>/^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*)\s*$/i.test(e),Ft=e=>`${e}`.split("/").pop().split("?").shift(),mi=e=>e.split(".").pop(),cs=e=>{if(typeof e!="string")return"";let t=e.split("/").pop();return/svg/.test(t)?"svg":/zip|compressed/.test(t)?"zip":/plain/.test(t)?"txt":/msword/.test(t)?"doc":/[a-z]+/.test(t)?t==="jpeg"?"jpg":t:""},At=(e,t="")=>(t+e).slice(-t.length),An=(e=new Date)=>`${e.getFullYear()}-${At(e.getMonth()+1,"00")}-${At(e.getDate(),"00")}_${At(e.getHours(),"00")}-${At(e.getMinutes(),"00")}-${At(e.getSeconds(),"00")}`,ht=(e,t,i=null,a=null)=>{let n=typeof i=="string"?e.slice(0,e.size,i):e.slice(0,e.size,e.type);return n.lastModifiedDate=new Date,e._relativePath&&(n._relativePath=e._relativePath),fe(t)||(t=An()),t&&a===null&&mi(t)?n.name=t:(a=a||cs(n.type),n.name=t+(a?"."+a:"")),n},ds=()=>window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,Mn=(e,t)=>{let i=ds();if(i){let a=new i;return a.append(e),a.getBlob(t)}return new Blob([e],{type:t})},ps=(e,t)=>{let i=new ArrayBuffer(e.length),a=new Uint8Array(i);for(let n=0;n(/^data:(.+);/.exec(e)||[])[1]||null,ms=e=>e.split(",")[1].replace(/\s/g,""),us=e=>atob(ms(e)),fs=e=>{let t=On(e),i=us(e);return ps(i,t)},hs=(e,t,i)=>ht(fs(e),t,null,i),gs=e=>{if(!/^content-disposition:/i.test(e))return null;let t=e.split(/filename=|filename\*=.+''/).splice(1).map(i=>i.trim().replace(/^["']|[;"']{0,2}$/g,"")).filter(i=>i.length);return t.length?decodeURI(t[t.length-1]):null},Es=e=>{if(/content-length:/i.test(e)){let t=e.match(/[0-9]+/)[0];return t?parseInt(t,10):null}return null},bs=e=>/x-content-transfer-id:/i.test(e)&&(e.split(":")[1]||"").trim()||null,Xi=e=>{let t={source:null,name:null,size:null},i=e.split(` -`);for(let a of i){let n=gs(a);if(n){t.name=n;continue}let o=Es(a);if(o){t.size=o;continue}let l=bs(a);if(l){t.source=l;continue}}return t},Ts=e=>{let t={source:null,complete:!1,progress:0,size:null,timestamp:null,duration:0,request:null},i=()=>t.progress,a=()=>{t.request&&t.request.abort&&t.request.abort()},n=()=>{let r=t.source;l.fire("init",r),r instanceof File?l.fire("load",r):r instanceof Blob?l.fire("load",ht(r,r.name)):Di(r)?l.fire("load",hs(r)):o(r)},o=r=>{if(!e){l.fire("error",{type:"error",body:"Can't load URL",code:400});return}t.timestamp=Date.now(),t.request=e(r,s=>{t.duration=Date.now()-t.timestamp,t.complete=!0,s instanceof Blob&&(s=ht(s,s.name||Ft(r))),l.fire("load",s instanceof Blob?s:s?s.body:null)},s=>{l.fire("error",typeof s=="string"?{type:"error",code:0,body:s}:s)},(s,p,c)=>{if(c&&(t.size=c),t.duration=Date.now()-t.timestamp,!s){t.progress=null;return}t.progress=p/c,l.fire("progress",t.progress)},()=>{l.fire("abort")},s=>{let p=Xi(typeof s=="string"?s:s.headers);l.fire("meta",{size:t.size||p.size,filename:p.name,source:p.source})})},l={...pi(),setSource:r=>t.source=r,getProgress:i,abort:a,load:n};return l},Ua=e=>/GET|HEAD/.test(e),Ze=(e,t,i)=>{let a={onheaders:()=>{},onprogress:()=>{},onload:()=>{},ontimeout:()=>{},onerror:()=>{},onabort:()=>{},abort:()=>{n=!0,l.abort()}},n=!1,o=!1;i={method:"POST",headers:{},withCredentials:!1,...i},t=encodeURI(t),Ua(i.method)&&e&&(t=`${t}${encodeURIComponent(typeof e=="string"?e:JSON.stringify(e))}`);let l=new XMLHttpRequest,r=Ua(i.method)?l:l.upload;return r.onprogress=s=>{n||a.onprogress(s.lengthComputable,s.loaded,s.total)},l.onreadystatechange=()=>{l.readyState<2||l.readyState===4&&l.status===0||o||(o=!0,a.onheaders(l))},l.onload=()=>{l.status>=200&&l.status<300?a.onload(l):a.onerror(l)},l.onerror=()=>a.onerror(l),l.onabort=()=>{n=!0,a.onabort()},l.ontimeout=()=>a.ontimeout(l),l.open(i.method,t,!0),gt(i.timeout)&&(l.timeout=i.timeout),Object.keys(i.headers).forEach(s=>{let p=unescape(encodeURIComponent(i.headers[s]));l.setRequestHeader(s,p)}),i.responseType&&(l.responseType=i.responseType),i.withCredentials&&(l.withCredentials=!0),l.send(e),a},ie=(e,t,i,a)=>({type:e,code:t,body:i,headers:a}),Ke=e=>t=>{e(ie("error",0,"Timeout",t.getAllResponseHeaders()))},Wa=e=>/\?/.test(e),Pt=(...e)=>{let t="";return e.forEach(i=>{t+=Wa(t)&&Wa(i)?i.replace(/\?/,"&"):i}),t},wi=(e="",t)=>{if(typeof t=="function")return t;if(!t||!fe(t.url))return null;let i=t.onload||(n=>n),a=t.onerror||(n=>null);return(n,o,l,r,s,p)=>{let c=Ze(n,Pt(e,t.url),{...t,responseType:"blob"});return c.onload=d=>{let m=d.getAllResponseHeaders(),u=Xi(m).name||Ft(n);o(ie("load",d.status,t.method==="HEAD"?null:ht(i(d.response),u),m))},c.onerror=d=>{l(ie("error",d.status,a(d.response)||d.statusText,d.getAllResponseHeaders()))},c.onheaders=d=>{p(ie("headers",d.status,null,d.getAllResponseHeaders()))},c.ontimeout=Ke(l),c.onprogress=r,c.onabort=s,c}},xe={QUEUED:0,COMPLETE:1,PROCESSING:2,ERROR:3,WAITING:4},vs=(e,t,i,a,n,o,l,r,s,p,c)=>{let d=[],{chunkTransferId:m,chunkServer:u,chunkSize:f,chunkRetryDelays:h}=c,g={serverId:m,aborted:!1},v=t.ondata||(S=>S),E=t.onload||((S,F)=>F==="HEAD"?S.getResponseHeader("Upload-Offset"):S.response),T=t.onerror||(S=>null),I=S=>{let F=new FormData;ce(n)&&F.append(i,JSON.stringify(n));let R=typeof t.headers=="function"?t.headers(a,n):{...t.headers,"Upload-Length":a.size},L={...t,headers:R},z=Ze(v(F),Pt(e,t.url),L);z.onload=D=>S(E(D,L.method)),z.onerror=D=>l(ie("error",D.status,T(D.response)||D.statusText,D.getAllResponseHeaders())),z.ontimeout=Ke(l)},y=S=>{let F=Pt(e,u.url,g.serverId),L={headers:typeof t.headers=="function"?t.headers(g.serverId):{...t.headers},method:"HEAD"},z=Ze(null,F,L);z.onload=D=>S(E(D,L.method)),z.onerror=D=>l(ie("error",D.status,T(D.response)||D.statusText,D.getAllResponseHeaders())),z.ontimeout=Ke(l)},b=Math.floor(a.size/f);for(let S=0;S<=b;S++){let F=S*f,R=a.slice(F,F+f,"application/offset+octet-stream");d[S]={index:S,size:R.size,offset:F,data:R,file:a,progress:0,retries:[...h],status:xe.QUEUED,error:null,request:null,timeout:null}}let w=()=>o(g.serverId),x=S=>S.status===xe.QUEUED||S.status===xe.ERROR,_=S=>{if(g.aborted)return;if(S=S||d.find(x),!S){d.every(k=>k.status===xe.COMPLETE)&&w();return}S.status=xe.PROCESSING,S.progress=null;let F=u.ondata||(k=>k),R=u.onerror||(k=>null),L=Pt(e,u.url,g.serverId),z=typeof u.headers=="function"?u.headers(S):{...u.headers,"Content-Type":"application/offset+octet-stream","Upload-Offset":S.offset,"Upload-Length":a.size,"Upload-Name":a.name},D=S.request=Ze(F(S.data),L,{...u,headers:z});D.onload=()=>{S.status=xe.COMPLETE,S.request=null,M()},D.onprogress=(k,B,X)=>{S.progress=k?B:null,O()},D.onerror=k=>{S.status=xe.ERROR,S.request=null,S.error=R(k.response)||k.statusText,P(S)||l(ie("error",k.status,R(k.response)||k.statusText,k.getAllResponseHeaders()))},D.ontimeout=k=>{S.status=xe.ERROR,S.request=null,P(S)||Ke(l)(k)},D.onabort=()=>{S.status=xe.QUEUED,S.request=null,s()}},P=S=>S.retries.length===0?!1:(S.status=xe.WAITING,clearTimeout(S.timeout),S.timeout=setTimeout(()=>{_(S)},S.retries.shift()),!0),O=()=>{let S=d.reduce((R,L)=>R===null||L.progress===null?null:R+L.progress,0);if(S===null)return r(!1,0,0);let F=d.reduce((R,L)=>R+L.size,0);r(!0,S,F)},M=()=>{d.filter(F=>F.status===xe.PROCESSING).length>=1||_()},C=()=>{d.forEach(S=>{clearTimeout(S.timeout),S.request&&S.request.abort()})};return g.serverId?y(S=>{g.aborted||(d.filter(F=>F.offset{F.status=xe.COMPLETE,F.progress=F.size}),M())}):I(S=>{g.aborted||(p(S),g.serverId=S,M())}),{abort:()=>{g.aborted=!0,C()}}},Is=(e,t,i,a)=>(n,o,l,r,s,p,c)=>{if(!n)return;let d=a.chunkUploads,m=d&&n.size>a.chunkSize,u=d&&(m||a.chunkForce);if(n instanceof Blob&&u)return vs(e,t,i,n,o,l,r,s,p,c,a);let f=t.ondata||(y=>y),h=t.onload||(y=>y),g=t.onerror||(y=>null),v=typeof t.headers=="function"?t.headers(n,o)||{}:{...t.headers},E={...t,headers:v};var T=new FormData;ce(o)&&T.append(i,JSON.stringify(o)),(n instanceof Blob?[{name:null,file:n}]:n).forEach(y=>{T.append(i,y.file,y.name===null?y.file.name:`${y.name}${y.file.name}`)});let I=Ze(f(T),Pt(e,t.url),E);return I.onload=y=>{l(ie("load",y.status,h(y.response),y.getAllResponseHeaders()))},I.onerror=y=>{r(ie("error",y.status,g(y.response)||y.statusText,y.getAllResponseHeaders()))},I.ontimeout=Ke(r),I.onprogress=s,I.onabort=p,I},xs=(e="",t,i,a)=>typeof t=="function"?(...n)=>t(i,...n,a):!t||!fe(t.url)?null:Is(e,t,i,a),Mt=(e="",t)=>{if(typeof t=="function")return t;if(!t||!fe(t.url))return(n,o)=>o();let i=t.onload||(n=>n),a=t.onerror||(n=>null);return(n,o,l)=>{let r=Ze(n,e+t.url,t);return r.onload=s=>{o(ie("load",s.status,i(s.response),s.getAllResponseHeaders()))},r.onerror=s=>{l(ie("error",s.status,a(s.response)||s.statusText,s.getAllResponseHeaders()))},r.ontimeout=Ke(l),r}},Pn=(e=0,t=1)=>e+Math.random()*(t-e),ys=(e,t=1e3,i=0,a=25,n=250)=>{let o=null,l=Date.now(),r=()=>{let s=Date.now()-l,p=Pn(a,n);s+p>t&&(p=s+p-t);let c=s/t;if(c>=1||document.hidden){e(1);return}e(c),o=setTimeout(r,p)};return t>0&&r(),{clear:()=>{clearTimeout(o)}}},_s=(e,t)=>{let i={complete:!1,perceivedProgress:0,perceivedPerformanceUpdater:null,progress:null,timestamp:null,perceivedDuration:0,duration:0,request:null,response:null},{allowMinimumUploadDuration:a}=t,n=(c,d)=>{let m=()=>{i.duration===0||i.progress===null||p.fire("progress",p.getProgress())},u=()=>{i.complete=!0,p.fire("load-perceived",i.response.body)};p.fire("start"),i.timestamp=Date.now(),i.perceivedPerformanceUpdater=ys(f=>{i.perceivedProgress=f,i.perceivedDuration=Date.now()-i.timestamp,m(),i.response&&i.perceivedProgress===1&&!i.complete&&u()},a?Pn(750,1500):0),i.request=e(c,d,f=>{i.response=ce(f)?f:{type:"load",code:200,body:`${f}`,headers:{}},i.duration=Date.now()-i.timestamp,i.progress=1,p.fire("load",i.response.body),(!a||a&&i.perceivedProgress===1)&&u()},f=>{i.perceivedPerformanceUpdater.clear(),p.fire("error",ce(f)?f:{type:"error",code:0,body:`${f}`})},(f,h,g)=>{i.duration=Date.now()-i.timestamp,i.progress=f?h/g:null,m()},()=>{i.perceivedPerformanceUpdater.clear(),p.fire("abort",i.response?i.response.body:null)},f=>{p.fire("transfer",f)})},o=()=>{i.request&&(i.perceivedPerformanceUpdater.clear(),i.request.abort&&i.request.abort(),i.complete=!0)},l=()=>{o(),i.complete=!1,i.perceivedProgress=0,i.progress=0,i.timestamp=null,i.perceivedDuration=0,i.duration=0,i.request=null,i.response=null},r=a?()=>i.progress?Math.min(i.progress,i.perceivedProgress):null:()=>i.progress||null,s=a?()=>Math.min(i.duration,i.perceivedDuration):()=>i.duration,p={...pi(),process:n,abort:o,getProgress:r,getDuration:s,reset:l};return p},Dn=e=>e.substring(0,e.lastIndexOf("."))||e,Rs=e=>{let t=[e.name,e.size,e.type];return e instanceof Blob||Di(e)?t[0]=e.name||An():Di(e)?(t[1]=e.length,t[2]=On(e)):fe(e)&&(t[0]=Ft(e),t[1]=0,t[2]="application/octet-stream"),{name:t[0],size:t[1],type:t[2]}},Je=e=>!!(e instanceof File||e instanceof Blob&&e.name),Fn=e=>{if(!ce(e))return e;let t=si(e)?[]:{};for(let i in e){if(!e.hasOwnProperty(i))continue;let a=e[i];t[i]=a&&ce(a)?Fn(a):a}return t},ws=(e=null,t=null,i=null)=>{let a=Yi(),n={archived:!1,frozen:!1,released:!1,source:null,file:i,serverFileReference:t,transferId:null,processingAborted:!1,status:t?W.PROCESSING_COMPLETE:W.INIT,activeLoader:null,activeProcessor:null},o=null,l={},r=x=>n.status=x,s=(x,..._)=>{n.released||n.frozen||b.fire(x,..._)},p=()=>mi(n.file.name),c=()=>n.file.type,d=()=>n.file.size,m=()=>n.file,u=(x,_,P)=>{if(n.source=x,b.fireSync("init"),n.file){b.fireSync("load-skip");return}n.file=Rs(x),_.on("init",()=>{s("load-init")}),_.on("meta",O=>{n.file.size=O.size,n.file.filename=O.filename,O.source&&(e=re.LIMBO,n.serverFileReference=O.source,n.status=W.PROCESSING_COMPLETE),s("load-meta")}),_.on("progress",O=>{r(W.LOADING),s("load-progress",O)}),_.on("error",O=>{r(W.LOAD_ERROR),s("load-request-error",O)}),_.on("abort",()=>{r(W.INIT),s("load-abort")}),_.on("load",O=>{n.activeLoader=null;let M=S=>{n.file=Je(S)?S:n.file,e===re.LIMBO&&n.serverFileReference?r(W.PROCESSING_COMPLETE):r(W.IDLE),s("load")},C=S=>{n.file=O,s("load-meta"),r(W.LOAD_ERROR),s("load-file-error",S)};if(n.serverFileReference){M(O);return}P(O,M,C)}),_.setSource(x),n.activeLoader=_,_.load()},f=()=>{n.activeLoader&&n.activeLoader.load()},h=()=>{if(n.activeLoader){n.activeLoader.abort();return}r(W.INIT),s("load-abort")},g=(x,_)=>{if(n.processingAborted){n.processingAborted=!1;return}if(r(W.PROCESSING),o=null,!(n.file instanceof Blob)){b.on("load",()=>{g(x,_)});return}x.on("load",M=>{n.transferId=null,n.serverFileReference=M}),x.on("transfer",M=>{n.transferId=M}),x.on("load-perceived",M=>{n.activeProcessor=null,n.transferId=null,n.serverFileReference=M,r(W.PROCESSING_COMPLETE),s("process-complete",M)}),x.on("start",()=>{s("process-start")}),x.on("error",M=>{n.activeProcessor=null,r(W.PROCESSING_ERROR),s("process-error",M)}),x.on("abort",M=>{n.activeProcessor=null,n.serverFileReference=M,r(W.IDLE),s("process-abort"),o&&o()}),x.on("progress",M=>{s("process-progress",M)});let P=M=>{n.archived||x.process(M,{...l})},O=console.error;_(n.file,P,O),n.activeProcessor=x},v=()=>{n.processingAborted=!1,r(W.PROCESSING_QUEUED)},E=()=>new Promise(x=>{if(!n.activeProcessor){n.processingAborted=!0,r(W.IDLE),s("process-abort"),x();return}o=()=>{x()},n.activeProcessor.abort()}),T=(x,_)=>new Promise((P,O)=>{let M=n.serverFileReference!==null?n.serverFileReference:n.transferId;if(M===null){P();return}x(M,()=>{n.serverFileReference=null,n.transferId=null,P()},C=>{if(!_){P();return}r(W.PROCESSING_REVERT_ERROR),s("process-revert-error"),O(C)}),r(W.IDLE),s("process-revert")}),I=(x,_,P)=>{let O=x.split("."),M=O[0],C=O.pop(),S=l;O.forEach(F=>S=S[F]),JSON.stringify(S[C])!==JSON.stringify(_)&&(S[C]=_,s("metadata-update",{key:M,value:l[M],silent:P}))},b={id:{get:()=>a},origin:{get:()=>e,set:x=>e=x},serverId:{get:()=>n.serverFileReference},transferId:{get:()=>n.transferId},status:{get:()=>n.status},filename:{get:()=>n.file.name},filenameWithoutExtension:{get:()=>Dn(n.file.name)},fileExtension:{get:p},fileType:{get:c},fileSize:{get:d},file:{get:m},relativePath:{get:()=>n.file._relativePath},source:{get:()=>n.source},getMetadata:x=>Fn(x?l[x]:l),setMetadata:(x,_,P)=>{if(ce(x)){let O=x;return Object.keys(O).forEach(M=>{I(M,O[M],_)}),x}return I(x,_,P),_},extend:(x,_)=>w[x]=_,abortLoad:h,retryLoad:f,requestProcessing:v,abortProcessing:E,load:u,process:g,revert:T,...pi(),freeze:()=>n.frozen=!0,release:()=>n.released=!0,released:{get:()=>n.released},archive:()=>n.archived=!0,archived:{get:()=>n.archived},setFile:x=>n.file=x},w=We(b);return w},Ss=(e,t)=>Be(t)?0:fe(t)?e.findIndex(i=>i.id===t):-1,Ha=(e,t)=>{let i=Ss(e,t);if(!(i<0))return e[i]||null},ja=(e,t,i,a,n,o)=>{let l=Ze(null,e,{method:"GET",responseType:"blob"});return l.onload=r=>{let s=r.getAllResponseHeaders(),p=Xi(s).name||Ft(e);t(ie("load",r.status,ht(r.response,p),s))},l.onerror=r=>{i(ie("error",r.status,r.statusText,r.getAllResponseHeaders()))},l.onheaders=r=>{o(ie("headers",r.status,null,r.getAllResponseHeaders()))},l.ontimeout=Ke(i),l.onprogress=a,l.onabort=n,l},Ya=e=>(e.indexOf("//")===0&&(e=location.protocol+e),e.toLowerCase().replace("blob:","").replace(/([a-z])?:\/\//,"$1").split("/")[0]),Ls=e=>(e.indexOf(":")>-1||e.indexOf("//")>-1)&&Ya(location.href)!==Ya(e),Kt=e=>(...t)=>Xe(e)?e(...t):e,As=e=>!Je(e.file),Si=(e,t)=>{clearTimeout(t.listUpdateTimeout),t.listUpdateTimeout=setTimeout(()=>{e("DID_UPDATE_ITEMS",{items:Me(t.items)})},0)},qa=(e,...t)=>new Promise(i=>{if(!e)return i(!0);let a=e(...t);if(a==null)return i(!0);if(typeof a=="boolean")return i(a);typeof a.then=="function"&&a.then(i)}),Li=(e,t)=>{e.items.sort((i,a)=>t(ge(i),ge(a)))},ye=(e,t)=>({query:i,success:a=()=>{},failure:n=()=>{},...o}={})=>{let l=Qe(e.items,i);if(!l){n({error:ie("error",0,"Item not found"),file:null});return}t(l,a,n,o||{})},Ms=(e,t,i)=>({ABORT_ALL:()=>{Me(i.items).forEach(a=>{a.freeze(),a.abortLoad(),a.abortProcessing()})},DID_SET_FILES:({value:a=[]})=>{let n=a.map(l=>({source:l.source?l.source:l,options:l.options})),o=Me(i.items);o.forEach(l=>{n.find(r=>r.source===l.source||r.source===l.file)||e("REMOVE_ITEM",{query:l,remove:!1})}),o=Me(i.items),n.forEach((l,r)=>{o.find(s=>s.source===l.source||s.file===l.source)||e("ADD_ITEM",{...l,interactionMethod:_e.NONE,index:r})})},DID_UPDATE_ITEM_METADATA:({id:a,action:n,change:o})=>{o.silent||(clearTimeout(i.itemUpdateTimeout),i.itemUpdateTimeout=setTimeout(()=>{let l=Ha(i.items,a);if(!t("IS_ASYNC")){Ae("SHOULD_PREPARE_OUTPUT",!1,{item:l,query:t,action:n,change:o}).then(c=>{let d=t("GET_BEFORE_PREPARE_FILE");d&&(c=d(l,c)),c&&e("REQUEST_PREPARE_OUTPUT",{query:a,item:l,success:m=>{e("DID_PREPARE_OUTPUT",{id:a,file:m})}},!0)});return}l.origin===re.LOCAL&&e("DID_LOAD_ITEM",{id:l.id,error:null,serverFileReference:l.source});let r=()=>{setTimeout(()=>{e("REQUEST_ITEM_PROCESSING",{query:a})},32)},s=c=>{l.revert(Mt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(c?r:()=>{}).catch(()=>{})},p=c=>{l.abortProcessing().then(c?r:()=>{})};if(l.status===W.PROCESSING_COMPLETE)return s(i.options.instantUpload);if(l.status===W.PROCESSING)return p(i.options.instantUpload);i.options.instantUpload&&r()},0))},MOVE_ITEM:({query:a,index:n})=>{let o=Qe(i.items,a);if(!o)return;let l=i.items.indexOf(o);n=Ln(n,0,i.items.length-1),l!==n&&i.items.splice(n,0,i.items.splice(l,1)[0])},SORT:({compare:a})=>{Li(i,a),e("DID_SORT_ITEMS",{items:t("GET_ACTIVE_ITEMS")})},ADD_ITEMS:({items:a,index:n,interactionMethod:o,success:l=()=>{},failure:r=()=>{}})=>{let s=n;if(n===-1||typeof n>"u"){let u=t("GET_ITEM_INSERT_LOCATION"),f=t("GET_TOTAL_ITEMS");s=u==="before"?0:f}let p=t("GET_IGNORED_FILES"),c=u=>Je(u)?!p.includes(u.name.toLowerCase()):!Be(u),m=a.filter(c).map(u=>new Promise((f,h)=>{e("ADD_ITEM",{interactionMethod:o,source:u.source||u,success:f,failure:h,index:s++,options:u.options||{}})}));Promise.all(m).then(l).catch(r)},ADD_ITEM:({source:a,index:n=-1,interactionMethod:o,success:l=()=>{},failure:r=()=>{},options:s={}})=>{if(Be(a)){r({error:ie("error",0,"No source"),file:null});return}if(Je(a)&&i.options.ignoredFiles.includes(a.name.toLowerCase()))return;if(!ls(i)){if(i.options.allowMultiple||!i.options.allowMultiple&&!i.options.allowReplace){let E=ie("warning",0,"Max files");e("DID_THROW_MAX_FILES",{source:a,error:E}),r({error:E,file:null});return}let v=Me(i.items)[0];if(v.status===W.PROCESSING_COMPLETE||v.status===W.PROCESSING_REVERT_ERROR){let E=t("GET_FORCE_REVERT");if(v.revert(Mt(i.options.server.url,i.options.server.revert),E).then(()=>{E&&e("ADD_ITEM",{source:a,index:n,interactionMethod:o,success:l,failure:r,options:s})}).catch(()=>{}),E)return}e("REMOVE_ITEM",{query:v.id})}let p=s.type==="local"?re.LOCAL:s.type==="limbo"?re.LIMBO:re.INPUT,c=ws(p,p===re.INPUT?null:a,s.file);Object.keys(s.metadata||{}).forEach(v=>{c.setMetadata(v,s.metadata[v])}),tt("DID_CREATE_ITEM",c,{query:t,dispatch:e});let d=t("GET_ITEM_INSERT_LOCATION");i.options.itemInsertLocationFreedom||(n=d==="before"?-1:i.items.length),ss(i.items,c,n),Xe(d)&&a&&Li(i,d);let m=c.id;c.on("init",()=>{e("DID_INIT_ITEM",{id:m})}),c.on("load-init",()=>{e("DID_START_ITEM_LOAD",{id:m})}),c.on("load-meta",()=>{e("DID_UPDATE_ITEM_META",{id:m})}),c.on("load-progress",v=>{e("DID_UPDATE_ITEM_LOAD_PROGRESS",{id:m,progress:v})}),c.on("load-request-error",v=>{let E=Kt(i.options.labelFileLoadError)(v);if(v.code>=400&&v.code<500){e("DID_THROW_ITEM_INVALID",{id:m,error:v,status:{main:E,sub:`${v.code} (${v.body})`}}),r({error:v,file:ge(c)});return}e("DID_THROW_ITEM_LOAD_ERROR",{id:m,error:v,status:{main:E,sub:i.options.labelTapToRetry}})}),c.on("load-file-error",v=>{e("DID_THROW_ITEM_INVALID",{id:m,error:v.status,status:v.status}),r({error:v.status,file:ge(c)})}),c.on("load-abort",()=>{e("REMOVE_ITEM",{query:m})}),c.on("load-skip",()=>{c.on("metadata-update",v=>{Je(c.file)&&e("DID_UPDATE_ITEM_METADATA",{id:m,change:v})}),e("COMPLETE_LOAD_ITEM",{query:m,item:c,data:{source:a,success:l}})}),c.on("load",()=>{let v=E=>{if(!E){e("REMOVE_ITEM",{query:m});return}c.on("metadata-update",T=>{e("DID_UPDATE_ITEM_METADATA",{id:m,change:T})}),Ae("SHOULD_PREPARE_OUTPUT",!1,{item:c,query:t}).then(T=>{let I=t("GET_BEFORE_PREPARE_FILE");I&&(T=I(c,T));let y=()=>{e("COMPLETE_LOAD_ITEM",{query:m,item:c,data:{source:a,success:l}}),Si(e,i)};if(T){e("REQUEST_PREPARE_OUTPUT",{query:m,item:c,success:b=>{e("DID_PREPARE_OUTPUT",{id:m,file:b}),y()}},!0);return}y()})};Ae("DID_LOAD_ITEM",c,{query:t,dispatch:e}).then(()=>{qa(t("GET_BEFORE_ADD_FILE"),ge(c)).then(v)}).catch(E=>{if(!E||!E.error||!E.status)return v(!1);e("DID_THROW_ITEM_INVALID",{id:m,error:E.error,status:E.status})})}),c.on("process-start",()=>{e("DID_START_ITEM_PROCESSING",{id:m})}),c.on("process-progress",v=>{e("DID_UPDATE_ITEM_PROCESS_PROGRESS",{id:m,progress:v})}),c.on("process-error",v=>{e("DID_THROW_ITEM_PROCESSING_ERROR",{id:m,error:v,status:{main:Kt(i.options.labelFileProcessingError)(v),sub:i.options.labelTapToRetry}})}),c.on("process-revert-error",v=>{e("DID_THROW_ITEM_PROCESSING_REVERT_ERROR",{id:m,error:v,status:{main:Kt(i.options.labelFileProcessingRevertError)(v),sub:i.options.labelTapToRetry}})}),c.on("process-complete",v=>{e("DID_COMPLETE_ITEM_PROCESSING",{id:m,error:null,serverFileReference:v}),e("DID_DEFINE_VALUE",{id:m,value:v})}),c.on("process-abort",()=>{e("DID_ABORT_ITEM_PROCESSING",{id:m})}),c.on("process-revert",()=>{e("DID_REVERT_ITEM_PROCESSING",{id:m}),e("DID_DEFINE_VALUE",{id:m,value:null})}),e("DID_ADD_ITEM",{id:m,index:n,interactionMethod:o}),Si(e,i);let{url:u,load:f,restore:h,fetch:g}=i.options.server||{};c.load(a,Ts(p===re.INPUT?fe(a)&&Ls(a)&&g?wi(u,g):ja:p===re.LIMBO?wi(u,h):wi(u,f)),(v,E,T)=>{Ae("LOAD_FILE",v,{query:t}).then(E).catch(T)})},REQUEST_PREPARE_OUTPUT:({item:a,success:n,failure:o=()=>{}})=>{let l={error:ie("error",0,"Item not found"),file:null};if(a.archived)return o(l);Ae("PREPARE_OUTPUT",a.file,{query:t,item:a}).then(r=>{Ae("COMPLETE_PREPARE_OUTPUT",r,{query:t,item:a}).then(s=>{if(a.archived)return o(l);n(s)})})},COMPLETE_LOAD_ITEM:({item:a,data:n})=>{let{success:o,source:l}=n,r=t("GET_ITEM_INSERT_LOCATION");if(Xe(r)&&l&&Li(i,r),e("DID_LOAD_ITEM",{id:a.id,error:null,serverFileReference:a.origin===re.INPUT?null:l}),o(ge(a)),a.origin===re.LOCAL){e("DID_LOAD_LOCAL_ITEM",{id:a.id});return}if(a.origin===re.LIMBO){e("DID_COMPLETE_ITEM_PROCESSING",{id:a.id,error:null,serverFileReference:l}),e("DID_DEFINE_VALUE",{id:a.id,value:a.serverId||l});return}t("IS_ASYNC")&&i.options.instantUpload&&e("REQUEST_ITEM_PROCESSING",{query:a.id})},RETRY_ITEM_LOAD:ye(i,a=>{a.retryLoad()}),REQUEST_ITEM_PREPARE:ye(i,(a,n,o)=>{e("REQUEST_PREPARE_OUTPUT",{query:a.id,item:a,success:l=>{e("DID_PREPARE_OUTPUT",{id:a.id,file:l}),n({file:a,output:l})},failure:o},!0)}),REQUEST_ITEM_PROCESSING:ye(i,(a,n,o)=>{if(!(a.status===W.IDLE||a.status===W.PROCESSING_ERROR)){let r=()=>e("REQUEST_ITEM_PROCESSING",{query:a,success:n,failure:o}),s=()=>document.hidden?r():setTimeout(r,32);a.status===W.PROCESSING_COMPLETE||a.status===W.PROCESSING_REVERT_ERROR?a.revert(Mt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(s).catch(()=>{}):a.status===W.PROCESSING&&a.abortProcessing().then(s);return}a.status!==W.PROCESSING_QUEUED&&(a.requestProcessing(),e("DID_REQUEST_ITEM_PROCESSING",{id:a.id}),e("PROCESS_ITEM",{query:a,success:n,failure:o},!0))}),PROCESS_ITEM:ye(i,(a,n,o)=>{let l=t("GET_MAX_PARALLEL_UPLOADS");if(t("GET_ITEMS_BY_STATUS",W.PROCESSING).length===l){i.processingQueue.push({id:a.id,success:n,failure:o});return}if(a.status===W.PROCESSING)return;let s=()=>{let c=i.processingQueue.shift();if(!c)return;let{id:d,success:m,failure:u}=c,f=Qe(i.items,d);if(!f||f.archived){s();return}e("PROCESS_ITEM",{query:d,success:m,failure:u},!0)};a.onOnce("process-complete",()=>{n(ge(a)),s();let c=i.options.server;if(i.options.instantUpload&&a.origin===re.LOCAL&&Xe(c.remove)){let u=()=>{};a.origin=re.LIMBO,i.options.server.remove(a.source,u,u)}t("GET_ITEMS_BY_STATUS",W.PROCESSING_COMPLETE).length===i.items.length&&e("DID_COMPLETE_ITEM_PROCESSING_ALL")}),a.onOnce("process-error",c=>{o({error:c,file:ge(a)}),s()});let p=i.options;a.process(_s(xs(p.server.url,p.server.process,p.name,{chunkTransferId:a.transferId,chunkServer:p.server.patch,chunkUploads:p.chunkUploads,chunkForce:p.chunkForce,chunkSize:p.chunkSize,chunkRetryDelays:p.chunkRetryDelays}),{allowMinimumUploadDuration:t("GET_ALLOW_MINIMUM_UPLOAD_DURATION")}),(c,d,m)=>{Ae("PREPARE_OUTPUT",c,{query:t,item:a}).then(u=>{e("DID_PREPARE_OUTPUT",{id:a.id,file:u}),d(u)}).catch(m)})}),RETRY_ITEM_PROCESSING:ye(i,a=>{e("REQUEST_ITEM_PROCESSING",{query:a})}),REQUEST_REMOVE_ITEM:ye(i,a=>{qa(t("GET_BEFORE_REMOVE_FILE"),ge(a)).then(n=>{n&&e("REMOVE_ITEM",{query:a})})}),RELEASE_ITEM:ye(i,a=>{a.release()}),REMOVE_ITEM:ye(i,(a,n,o,l)=>{let r=()=>{let p=a.id;Ha(i.items,p).archive(),e("DID_REMOVE_ITEM",{error:null,id:p,item:a}),Si(e,i),n(ge(a))},s=i.options.server;a.origin===re.LOCAL&&s&&Xe(s.remove)&&l.remove!==!1?(e("DID_START_ITEM_REMOVE",{id:a.id}),s.remove(a.source,()=>r(),p=>{e("DID_THROW_ITEM_REMOVE_ERROR",{id:a.id,error:ie("error",0,p,null),status:{main:Kt(i.options.labelFileRemoveError)(p),sub:i.options.labelTapToRetry}})})):((l.revert&&a.origin!==re.LOCAL&&a.serverId!==null||i.options.chunkUploads&&a.file.size>i.options.chunkSize||i.options.chunkUploads&&i.options.chunkForce)&&a.revert(Mt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")),r())}),ABORT_ITEM_LOAD:ye(i,a=>{a.abortLoad()}),ABORT_ITEM_PROCESSING:ye(i,a=>{if(a.serverId){e("REVERT_ITEM_PROCESSING",{id:a.id});return}a.abortProcessing().then(()=>{i.options.instantUpload&&e("REMOVE_ITEM",{query:a.id})})}),REQUEST_REVERT_ITEM_PROCESSING:ye(i,a=>{if(!i.options.instantUpload){e("REVERT_ITEM_PROCESSING",{query:a});return}let n=r=>{r&&e("REVERT_ITEM_PROCESSING",{query:a})},o=t("GET_BEFORE_REMOVE_FILE");if(!o)return n(!0);let l=o(ge(a));if(l==null)return n(!0);if(typeof l=="boolean")return n(l);typeof l.then=="function"&&l.then(n)}),REVERT_ITEM_PROCESSING:ye(i,a=>{a.revert(Mt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(()=>{(i.options.instantUpload||As(a))&&e("REMOVE_ITEM",{query:a.id})}).catch(()=>{})}),SET_OPTIONS:({options:a})=>{let n=Object.keys(a),o=Os.filter(r=>n.includes(r));[...o,...Object.keys(a).filter(r=>!o.includes(r))].forEach(r=>{e(`SET_${di(r,"_").toUpperCase()}`,{value:a[r]})})}}),Os=["server"],Qi=e=>e,ke=e=>document.createElement(e),ae=(e,t)=>{let i=e.childNodes[0];i?t!==i.nodeValue&&(i.nodeValue=t):(i=document.createTextNode(t),e.appendChild(i))},$a=(e,t,i,a)=>{let n=(a%360-90)*Math.PI/180;return{x:e+i*Math.cos(n),y:t+i*Math.sin(n)}},Ps=(e,t,i,a,n,o)=>{let l=$a(e,t,i,n),r=$a(e,t,i,a);return["M",l.x,l.y,"A",i,i,0,o,0,r.x,r.y].join(" ")},Ds=(e,t,i,a,n)=>{let o=1;return n>a&&n-a<=.5&&(o=0),a>n&&a-n>=.5&&(o=0),Ps(e,t,i,Math.min(.9999,a)*360,Math.min(.9999,n)*360,o)},Fs=({root:e,props:t})=>{t.spin=!1,t.progress=0,t.opacity=0;let i=ni("svg");e.ref.path=ni("path",{"stroke-width":2,"stroke-linecap":"round"}),i.appendChild(e.ref.path),e.ref.svg=i,e.appendChild(i)},zs=({root:e,props:t})=>{if(t.opacity===0)return;t.align&&(e.element.dataset.align=t.align);let i=parseInt(se(e.ref.path,"stroke-width"),10),a=e.rect.element.width*.5,n=0,o=0;t.spin?(n=0,o=.5):(n=0,o=t.progress);let l=Ds(a,a,a-i,n,o);se(e.ref.path,"d",l),se(e.ref.path,"stroke-opacity",t.spin||t.progress>0?1:0)},Xa=ne({tag:"div",name:"progress-indicator",ignoreRectUpdate:!0,ignoreRect:!0,create:Fs,write:zs,mixins:{apis:["progress","spin","align"],styles:["opacity"],animations:{opacity:{type:"tween",duration:500},progress:{type:"spring",stiffness:.95,damping:.65,mass:10}}}}),Cs=({root:e,props:t})=>{e.element.innerHTML=(t.icon||"")+`${t.label}`,t.isDisabled=!1},Ns=({root:e,props:t})=>{let{isDisabled:i}=t,a=e.query("GET_DISABLED")||t.opacity===0;a&&!i?(t.isDisabled=!0,se(e.element,"disabled","disabled")):!a&&i&&(t.isDisabled=!1,e.element.removeAttribute("disabled"))},zn=ne({tag:"button",attributes:{type:"button"},ignoreRect:!0,ignoreRectUpdate:!0,name:"file-action-button",mixins:{apis:["label"],styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}},listeners:!0},create:Cs,write:Ns}),Cn=(e,t=".",i=1e3,a={})=>{let{labelBytes:n="bytes",labelKilobytes:o="KB",labelMegabytes:l="MB",labelGigabytes:r="GB"}=a;e=Math.round(Math.abs(e));let s=i,p=i*i,c=i*i*i;return ee.toFixed(t).split(".").filter(a=>a!=="0").join(i),Bs=({root:e,props:t})=>{let i=ke("span");i.className="filepond--file-info-main",se(i,"aria-hidden","true"),e.appendChild(i),e.ref.fileName=i;let a=ke("span");a.className="filepond--file-info-sub",e.appendChild(a),e.ref.fileSize=a,ae(a,e.query("GET_LABEL_FILE_WAITING_FOR_SIZE")),ae(i,Qi(e.query("GET_ITEM_NAME",t.id)))},Fi=({root:e,props:t})=>{ae(e.ref.fileSize,Cn(e.query("GET_ITEM_SIZE",t.id),".",e.query("GET_FILE_SIZE_BASE"),e.query("GET_FILE_SIZE_LABELS",e.query))),ae(e.ref.fileName,Qi(e.query("GET_ITEM_NAME",t.id)))},Za=({root:e,props:t})=>{if(gt(e.query("GET_ITEM_SIZE",t.id))){Fi({root:e,props:t});return}ae(e.ref.fileSize,e.query("GET_LABEL_FILE_SIZE_NOT_AVAILABLE"))},ks=ne({name:"file-info",ignoreRect:!0,ignoreRectUpdate:!0,write:he({DID_LOAD_ITEM:Fi,DID_UPDATE_ITEM_META:Fi,DID_THROW_ITEM_LOAD_ERROR:Za,DID_THROW_ITEM_INVALID:Za}),didCreateView:e=>{tt("CREATE_VIEW",{...e,view:e})},create:Bs,mixins:{styles:["translateX","translateY"],animations:{translateX:"spring",translateY:"spring"}}}),Nn=e=>Math.round(e*100),Vs=({root:e})=>{let t=ke("span");t.className="filepond--file-status-main",e.appendChild(t),e.ref.main=t;let i=ke("span");i.className="filepond--file-status-sub",e.appendChild(i),e.ref.sub=i,Bn({root:e,action:{progress:null}})},Bn=({root:e,action:t})=>{let i=t.progress===null?e.query("GET_LABEL_FILE_LOADING"):`${e.query("GET_LABEL_FILE_LOADING")} ${Nn(t.progress)}%`;ae(e.ref.main,i),ae(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},Gs=({root:e,action:t})=>{let i=t.progress===null?e.query("GET_LABEL_FILE_PROCESSING"):`${e.query("GET_LABEL_FILE_PROCESSING")} ${Nn(t.progress)}%`;ae(e.ref.main,i),ae(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},Us=({root:e})=>{ae(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING")),ae(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},Ws=({root:e})=>{ae(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING_ABORTED")),ae(e.ref.sub,e.query("GET_LABEL_TAP_TO_RETRY"))},Hs=({root:e})=>{ae(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING_COMPLETE")),ae(e.ref.sub,e.query("GET_LABEL_TAP_TO_UNDO"))},Ka=({root:e})=>{ae(e.ref.main,""),ae(e.ref.sub,"")},Ot=({root:e,action:t})=>{ae(e.ref.main,t.status.main),ae(e.ref.sub,t.status.sub)},js=ne({name:"file-status",ignoreRect:!0,ignoreRectUpdate:!0,write:he({DID_LOAD_ITEM:Ka,DID_REVERT_ITEM_PROCESSING:Ka,DID_REQUEST_ITEM_PROCESSING:Us,DID_ABORT_ITEM_PROCESSING:Ws,DID_COMPLETE_ITEM_PROCESSING:Hs,DID_UPDATE_ITEM_PROCESS_PROGRESS:Gs,DID_UPDATE_ITEM_LOAD_PROGRESS:Bn,DID_THROW_ITEM_LOAD_ERROR:Ot,DID_THROW_ITEM_INVALID:Ot,DID_THROW_ITEM_PROCESSING_ERROR:Ot,DID_THROW_ITEM_PROCESSING_REVERT_ERROR:Ot,DID_THROW_ITEM_REMOVE_ERROR:Ot}),didCreateView:e=>{tt("CREATE_VIEW",{...e,view:e})},create:Vs,mixins:{styles:["translateX","translateY","opacity"],animations:{opacity:{type:"tween",duration:250},translateX:"spring",translateY:"spring"}}}),zi={AbortItemLoad:{label:"GET_LABEL_BUTTON_ABORT_ITEM_LOAD",action:"ABORT_ITEM_LOAD",className:"filepond--action-abort-item-load",align:"LOAD_INDICATOR_POSITION"},RetryItemLoad:{label:"GET_LABEL_BUTTON_RETRY_ITEM_LOAD",action:"RETRY_ITEM_LOAD",icon:"GET_ICON_RETRY",className:"filepond--action-retry-item-load",align:"BUTTON_PROCESS_ITEM_POSITION"},RemoveItem:{label:"GET_LABEL_BUTTON_REMOVE_ITEM",action:"REQUEST_REMOVE_ITEM",icon:"GET_ICON_REMOVE",className:"filepond--action-remove-item",align:"BUTTON_REMOVE_ITEM_POSITION"},ProcessItem:{label:"GET_LABEL_BUTTON_PROCESS_ITEM",action:"REQUEST_ITEM_PROCESSING",icon:"GET_ICON_PROCESS",className:"filepond--action-process-item",align:"BUTTON_PROCESS_ITEM_POSITION"},AbortItemProcessing:{label:"GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING",action:"ABORT_ITEM_PROCESSING",className:"filepond--action-abort-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"},RetryItemProcessing:{label:"GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING",action:"RETRY_ITEM_PROCESSING",icon:"GET_ICON_RETRY",className:"filepond--action-retry-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"},RevertItemProcessing:{label:"GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING",action:"REQUEST_REVERT_ITEM_PROCESSING",icon:"GET_ICON_UNDO",className:"filepond--action-revert-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"}},Ci=[];te(zi,e=>{Ci.push(e)});var ve=e=>{if(Ni(e)==="right")return 0;let t=e.ref.buttonRemoveItem.rect.element;return t.hidden?null:t.width+t.left},Ys=e=>e.ref.buttonAbortItemLoad.rect.element.width,Jt=e=>Math.floor(e.ref.buttonRemoveItem.rect.element.height/4),qs=e=>Math.floor(e.ref.buttonRemoveItem.rect.element.left/2),$s=e=>e.query("GET_STYLE_LOAD_INDICATOR_POSITION"),Xs=e=>e.query("GET_STYLE_PROGRESS_INDICATOR_POSITION"),Ni=e=>e.query("GET_STYLE_BUTTON_REMOVE_ITEM_POSITION"),Qs={buttonAbortItemLoad:{opacity:0},buttonRetryItemLoad:{opacity:0},buttonRemoveItem:{opacity:0},buttonProcessItem:{opacity:0},buttonAbortItemProcessing:{opacity:0},buttonRetryItemProcessing:{opacity:0},buttonRevertItemProcessing:{opacity:0},loadProgressIndicator:{opacity:0,align:$s},processProgressIndicator:{opacity:0,align:Xs},processingCompleteIndicator:{opacity:0,scaleX:.75,scaleY:.75},info:{translateX:0,translateY:0,opacity:0},status:{translateX:0,translateY:0,opacity:0}},Ja={buttonRemoveItem:{opacity:1},buttonProcessItem:{opacity:1},info:{translateX:ve},status:{translateX:ve}},Ai={buttonAbortItemProcessing:{opacity:1},processProgressIndicator:{opacity:1},status:{opacity:1}},pt={DID_THROW_ITEM_INVALID:{buttonRemoveItem:{opacity:1},info:{translateX:ve},status:{translateX:ve,opacity:1}},DID_START_ITEM_LOAD:{buttonAbortItemLoad:{opacity:1},loadProgressIndicator:{opacity:1},status:{opacity:1}},DID_THROW_ITEM_LOAD_ERROR:{buttonRetryItemLoad:{opacity:1},buttonRemoveItem:{opacity:1},info:{translateX:ve},status:{opacity:1}},DID_START_ITEM_REMOVE:{processProgressIndicator:{opacity:1,align:Ni},info:{translateX:ve},status:{opacity:0}},DID_THROW_ITEM_REMOVE_ERROR:{processProgressIndicator:{opacity:0,align:Ni},buttonRemoveItem:{opacity:1},info:{translateX:ve},status:{opacity:1,translateX:ve}},DID_LOAD_ITEM:Ja,DID_LOAD_LOCAL_ITEM:{buttonRemoveItem:{opacity:1},info:{translateX:ve},status:{translateX:ve}},DID_START_ITEM_PROCESSING:Ai,DID_REQUEST_ITEM_PROCESSING:Ai,DID_UPDATE_ITEM_PROCESS_PROGRESS:Ai,DID_COMPLETE_ITEM_PROCESSING:{buttonRevertItemProcessing:{opacity:1},info:{opacity:1},status:{opacity:1}},DID_THROW_ITEM_PROCESSING_ERROR:{buttonRemoveItem:{opacity:1},buttonRetryItemProcessing:{opacity:1},status:{opacity:1},info:{translateX:ve}},DID_THROW_ITEM_PROCESSING_REVERT_ERROR:{buttonRevertItemProcessing:{opacity:1},status:{opacity:1},info:{opacity:1}},DID_ABORT_ITEM_PROCESSING:{buttonRemoveItem:{opacity:1},buttonProcessItem:{opacity:1},info:{translateX:ve},status:{opacity:1}},DID_REVERT_ITEM_PROCESSING:Ja},Zs=ne({create:({root:e})=>{e.element.innerHTML=e.query("GET_ICON_DONE")},name:"processing-complete-indicator",ignoreRect:!0,mixins:{styles:["scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",opacity:{type:"tween",duration:250}}}}),Ks=({root:e,props:t})=>{let i=Object.keys(zi).reduce((f,h)=>(f[h]={...zi[h]},f),{}),{id:a}=t,n=e.query("GET_ALLOW_REVERT"),o=e.query("GET_ALLOW_REMOVE"),l=e.query("GET_ALLOW_PROCESS"),r=e.query("GET_INSTANT_UPLOAD"),s=e.query("IS_ASYNC"),p=e.query("GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN"),c;s?l&&!n?c=f=>!/RevertItemProcessing/.test(f):!l&&n?c=f=>!/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(f):!l&&!n&&(c=f=>!/Process/.test(f)):c=f=>!/Process/.test(f);let d=c?Ci.filter(c):Ci.concat();if(r&&n&&(i.RevertItemProcessing.label="GET_LABEL_BUTTON_REMOVE_ITEM",i.RevertItemProcessing.icon="GET_ICON_REMOVE"),s&&!n){let f=pt.DID_COMPLETE_ITEM_PROCESSING;f.info.translateX=qs,f.info.translateY=Jt,f.status.translateY=Jt,f.processingCompleteIndicator={opacity:1,scaleX:1,scaleY:1}}if(s&&!l&&(["DID_START_ITEM_PROCESSING","DID_REQUEST_ITEM_PROCESSING","DID_UPDATE_ITEM_PROCESS_PROGRESS","DID_THROW_ITEM_PROCESSING_ERROR"].forEach(f=>{pt[f].status.translateY=Jt}),pt.DID_THROW_ITEM_PROCESSING_ERROR.status.translateX=Ys),p&&n){i.RevertItemProcessing.align="BUTTON_REMOVE_ITEM_POSITION";let f=pt.DID_COMPLETE_ITEM_PROCESSING;f.info.translateX=ve,f.status.translateY=Jt,f.processingCompleteIndicator={opacity:1,scaleX:1,scaleY:1}}o||(i.RemoveItem.disabled=!0),te(i,(f,h)=>{let g=e.createChildView(zn,{label:e.query(h.label),icon:e.query(h.icon),opacity:0});d.includes(f)&&e.appendChildView(g),h.disabled&&(g.element.setAttribute("disabled","disabled"),g.element.setAttribute("hidden","hidden")),g.element.dataset.align=e.query(`GET_STYLE_${h.align}`),g.element.classList.add(h.className),g.on("click",v=>{v.stopPropagation(),!h.disabled&&e.dispatch(h.action,{query:a})}),e.ref[`button${f}`]=g}),e.ref.processingCompleteIndicator=e.appendChildView(e.createChildView(Zs)),e.ref.processingCompleteIndicator.element.dataset.align=e.query("GET_STYLE_BUTTON_PROCESS_ITEM_POSITION"),e.ref.info=e.appendChildView(e.createChildView(ks,{id:a})),e.ref.status=e.appendChildView(e.createChildView(js,{id:a}));let m=e.appendChildView(e.createChildView(Xa,{opacity:0,align:e.query("GET_STYLE_LOAD_INDICATOR_POSITION")}));m.element.classList.add("filepond--load-indicator"),e.ref.loadProgressIndicator=m;let u=e.appendChildView(e.createChildView(Xa,{opacity:0,align:e.query("GET_STYLE_PROGRESS_INDICATOR_POSITION")}));u.element.classList.add("filepond--process-indicator"),e.ref.processProgressIndicator=u,e.ref.activeStyles=[]},Js=({root:e,actions:t,props:i})=>{ec({root:e,actions:t,props:i});let a=t.concat().filter(n=>/^DID_/.test(n.type)).reverse().find(n=>pt[n.type]);if(a){e.ref.activeStyles=[];let n=pt[a.type];te(Qs,(o,l)=>{let r=e.ref[o];te(l,(s,p)=>{let c=n[o]&&typeof n[o][s]<"u"?n[o][s]:p;e.ref.activeStyles.push({control:r,key:s,value:c})})})}e.ref.activeStyles.forEach(({control:n,key:o,value:l})=>{n[o]=typeof l=="function"?l(e):l})},ec=he({DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING:({root:e,action:t})=>{e.ref.buttonAbortItemProcessing.label=t.value},DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD:({root:e,action:t})=>{e.ref.buttonAbortItemLoad.label=t.value},DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL:({root:e,action:t})=>{e.ref.buttonAbortItemRemoval.label=t.value},DID_REQUEST_ITEM_PROCESSING:({root:e})=>{e.ref.processProgressIndicator.spin=!0,e.ref.processProgressIndicator.progress=0},DID_START_ITEM_LOAD:({root:e})=>{e.ref.loadProgressIndicator.spin=!0,e.ref.loadProgressIndicator.progress=0},DID_START_ITEM_REMOVE:({root:e})=>{e.ref.processProgressIndicator.spin=!0,e.ref.processProgressIndicator.progress=0},DID_UPDATE_ITEM_LOAD_PROGRESS:({root:e,action:t})=>{e.ref.loadProgressIndicator.spin=!1,e.ref.loadProgressIndicator.progress=t.progress},DID_UPDATE_ITEM_PROCESS_PROGRESS:({root:e,action:t})=>{e.ref.processProgressIndicator.spin=!1,e.ref.processProgressIndicator.progress=t.progress}}),tc=ne({create:Ks,write:Js,didCreateView:e=>{tt("CREATE_VIEW",{...e,view:e})},name:"file"}),ic=({root:e,props:t})=>{e.ref.fileName=ke("legend"),e.appendChild(e.ref.fileName),e.ref.file=e.appendChildView(e.createChildView(tc,{id:t.id})),e.ref.data=!1},ac=({root:e,props:t})=>{ae(e.ref.fileName,Qi(e.query("GET_ITEM_NAME",t.id)))},nc=ne({create:ic,ignoreRect:!0,write:he({DID_LOAD_ITEM:ac}),didCreateView:e=>{tt("CREATE_VIEW",{...e,view:e})},tag:"fieldset",name:"file-wrapper"}),en={type:"spring",damping:.6,mass:7},oc=({root:e,props:t})=>{[{name:"top"},{name:"center",props:{translateY:null,scaleY:null},mixins:{animations:{scaleY:en},styles:["translateY","scaleY"]}},{name:"bottom",props:{translateY:null},mixins:{animations:{translateY:en},styles:["translateY"]}}].forEach(i=>{lc(e,i,t.name)}),e.element.classList.add(`filepond--${t.name}`),e.ref.scalable=null},lc=(e,t,i)=>{let a=ne({name:`panel-${t.name} filepond--${i}`,mixins:t.mixins,ignoreRectUpdate:!0}),n=e.createChildView(a,t.props);e.ref[t.name]=e.appendChildView(n)},rc=({root:e,props:t})=>{if((e.ref.scalable===null||t.scalable!==e.ref.scalable)&&(e.ref.scalable=Tn(t.scalable)?t.scalable:!0,e.element.dataset.scalable=e.ref.scalable),!t.height)return;let i=e.ref.top.rect.element,a=e.ref.bottom.rect.element,n=Math.max(i.height+a.height,t.height);e.ref.center.translateY=i.height,e.ref.center.scaleY=(n-i.height-a.height)/100,e.ref.bottom.translateY=n-a.height},kn=ne({name:"panel",read:({root:e,props:t})=>t.heightCurrent=e.ref.bottom.translateY,write:rc,create:oc,ignoreRect:!0,mixins:{apis:["height","heightCurrent","scalable"]}}),sc=e=>{let t=e.map(a=>a.id),i;return{setIndex:a=>{i=a},getIndex:()=>i,getItemIndex:a=>t.indexOf(a.id)}},tn={type:"spring",stiffness:.75,damping:.45,mass:10},an="spring",nn={DID_START_ITEM_LOAD:"busy",DID_UPDATE_ITEM_LOAD_PROGRESS:"loading",DID_THROW_ITEM_INVALID:"load-invalid",DID_THROW_ITEM_LOAD_ERROR:"load-error",DID_LOAD_ITEM:"idle",DID_THROW_ITEM_REMOVE_ERROR:"remove-error",DID_START_ITEM_REMOVE:"busy",DID_START_ITEM_PROCESSING:"busy processing",DID_REQUEST_ITEM_PROCESSING:"busy processing",DID_UPDATE_ITEM_PROCESS_PROGRESS:"processing",DID_COMPLETE_ITEM_PROCESSING:"processing-complete",DID_THROW_ITEM_PROCESSING_ERROR:"processing-error",DID_THROW_ITEM_PROCESSING_REVERT_ERROR:"processing-revert-error",DID_ABORT_ITEM_PROCESSING:"cancelled",DID_REVERT_ITEM_PROCESSING:"idle"},cc=({root:e,props:t})=>{if(e.ref.handleClick=a=>e.dispatch("DID_ACTIVATE_ITEM",{id:t.id}),e.element.id=`filepond--item-${t.id}`,e.element.addEventListener("click",e.ref.handleClick),e.ref.container=e.appendChildView(e.createChildView(nc,{id:t.id})),e.ref.panel=e.appendChildView(e.createChildView(kn,{name:"item-panel"})),e.ref.panel.height=null,t.markedForRemoval=!1,!e.query("GET_ALLOW_REORDER"))return;e.element.dataset.dragState="idle";let i=a=>{if(!a.isPrimary)return;let n=!1,o={x:a.pageX,y:a.pageY};t.dragOrigin={x:e.translateX,y:e.translateY},t.dragCenter={x:a.offsetX,y:a.offsetY};let l=sc(e.query("GET_ACTIVE_ITEMS"));e.dispatch("DID_GRAB_ITEM",{id:t.id,dragState:l});let r=d=>{if(!d.isPrimary)return;d.stopPropagation(),d.preventDefault(),t.dragOffset={x:d.pageX-o.x,y:d.pageY-o.y},t.dragOffset.x*t.dragOffset.x+t.dragOffset.y*t.dragOffset.y>16&&!n&&(n=!0,e.element.removeEventListener("click",e.ref.handleClick)),e.dispatch("DID_DRAG_ITEM",{id:t.id,dragState:l})},s=d=>{d.isPrimary&&(t.dragOffset={x:d.pageX-o.x,y:d.pageY-o.y},c())},p=()=>{c()},c=()=>{document.removeEventListener("pointercancel",p),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",s),e.dispatch("DID_DROP_ITEM",{id:t.id,dragState:l}),n&&setTimeout(()=>e.element.addEventListener("click",e.ref.handleClick),0)};document.addEventListener("pointercancel",p),document.addEventListener("pointermove",r),document.addEventListener("pointerup",s)};e.element.addEventListener("pointerdown",i)},dc=he({DID_UPDATE_PANEL_HEIGHT:({root:e,action:t})=>{e.height=t.height}}),pc=he({DID_GRAB_ITEM:({root:e,props:t})=>{t.dragOrigin={x:e.translateX,y:e.translateY}},DID_DRAG_ITEM:({root:e})=>{e.element.dataset.dragState="drag"},DID_DROP_ITEM:({root:e,props:t})=>{t.dragOffset=null,t.dragOrigin=null,e.element.dataset.dragState="drop"}},({root:e,actions:t,props:i,shouldOptimize:a})=>{e.element.dataset.dragState==="drop"&&e.scaleX<=1&&(e.element.dataset.dragState="idle");let n=t.concat().filter(l=>/^DID_/.test(l.type)).reverse().find(l=>nn[l.type]);n&&n.type!==i.currentState&&(i.currentState=n.type,e.element.dataset.filepondItemState=nn[i.currentState]||"");let o=e.query("GET_ITEM_PANEL_ASPECT_RATIO")||e.query("GET_PANEL_ASPECT_RATIO");o?a||(e.height=e.rect.element.width*o):(dc({root:e,actions:t,props:i}),!e.height&&e.ref.container.rect.element.height>0&&(e.height=e.ref.container.rect.element.height)),a&&(e.ref.panel.height=null),e.ref.panel.height=e.height}),mc=ne({create:cc,write:pc,destroy:({root:e,props:t})=>{e.element.removeEventListener("click",e.ref.handleClick),e.dispatch("RELEASE_ITEM",{query:t.id})},tag:"li",name:"item",mixins:{apis:["id","interactionMethod","markedForRemoval","spawnDate","dragCenter","dragOrigin","dragOffset"],styles:["translateX","translateY","scaleX","scaleY","opacity","height"],animations:{scaleX:an,scaleY:an,translateX:tn,translateY:tn,opacity:{type:"tween",duration:150}}}}),Zi=(e,t)=>Math.max(1,Math.floor((e+1)/t)),Ki=(e,t,i)=>{if(!i)return;let a=e.rect.element.width,n=t.length,o=null;if(n===0||i.topE){if(i.left{se(e.element,"role","list"),e.ref.lastItemSpanwDate=Date.now()},fc=({root:e,action:t})=>{let{id:i,index:a,interactionMethod:n}=t;e.ref.addIndex=a;let o=Date.now(),l=o,r=1;if(n!==_e.NONE){r=0;let s=e.query("GET_ITEM_INSERT_INTERVAL"),p=o-e.ref.lastItemSpanwDate;l=p{e.dragOffset?(e.translateX=null,e.translateY=null,e.translateX=e.dragOrigin.x+e.dragOffset.x,e.translateY=e.dragOrigin.y+e.dragOffset.y,e.scaleX=1.025,e.scaleY=1.025):(e.translateX=t,e.translateY=i,Date.now()>e.spawnDate&&(e.opacity===0&&hc(e,t,i,a,n),e.scaleX=1,e.scaleY=1,e.opacity=1))},hc=(e,t,i,a,n)=>{e.interactionMethod===_e.NONE?(e.translateX=null,e.translateX=t,e.translateY=null,e.translateY=i):e.interactionMethod===_e.DROP?(e.translateX=null,e.translateX=t-a*20,e.translateY=null,e.translateY=i-n*10,e.scaleX=.8,e.scaleY=.8):e.interactionMethod===_e.BROWSE?(e.translateY=null,e.translateY=i-30):e.interactionMethod===_e.API&&(e.translateX=null,e.translateX=t-30,e.translateY=null)},gc=({root:e,action:t})=>{let{id:i}=t,a=e.childViews.find(n=>n.id===i);a&&(a.scaleX=.9,a.scaleY=.9,a.opacity=0,a.markedForRemoval=!0)},Mi=e=>e.rect.element.height+e.rect.element.marginBottom*.5+e.rect.element.marginTop*.5,Ec=e=>e.rect.element.width+e.rect.element.marginLeft*.5+e.rect.element.marginRight*.5,bc=({root:e,action:t})=>{let{id:i,dragState:a}=t,n=e.query("GET_ITEM",{id:i}),o=e.childViews.find(g=>g.id===i),l=e.childViews.length,r=a.getItemIndex(n);if(!o)return;let s={x:o.dragOrigin.x+o.dragOffset.x+o.dragCenter.x,y:o.dragOrigin.y+o.dragOffset.y+o.dragCenter.y},p=Mi(o),c=Ec(o),d=Math.floor(e.rect.outer.width/c);d>l&&(d=l);let m=Math.floor(l/d+1);ei.setHeight=p*m,ei.setWidth=c*d;var u={y:Math.floor(s.y/p),x:Math.floor(s.x/c),getGridIndex:function(){return s.y>ei.getHeight||s.y<0||s.x>ei.getWidth||s.x<0?r:this.y*d+this.x},getColIndex:function(){let v=e.query("GET_ACTIVE_ITEMS"),E=e.childViews.filter(O=>O.rect.element.height),T=v.map(O=>E.find(M=>M.id===O.id)),I=T.findIndex(O=>O===o),y=Mi(o),b=T.length,w=b,x=0,_=0,P=0;for(let O=0;OO){if(s.y1?u.getGridIndex():u.getColIndex();e.dispatch("MOVE_ITEM",{query:o,index:f});let h=a.getIndex();if(h===void 0||h!==f){if(a.setIndex(f),h===void 0)return;e.dispatch("DID_REORDER_ITEMS",{items:e.query("GET_ACTIVE_ITEMS"),origin:r,target:f})}},Tc=he({DID_ADD_ITEM:fc,DID_REMOVE_ITEM:gc,DID_DRAG_ITEM:bc}),vc=({root:e,props:t,actions:i,shouldOptimize:a})=>{Tc({root:e,props:t,actions:i});let{dragCoordinates:n}=t,o=e.rect.element.width,l=e.childViews.filter(T=>T.rect.element.height),r=e.query("GET_ACTIVE_ITEMS").map(T=>l.find(I=>I.id===T.id)).filter(T=>T),s=n?Ki(e,r,n):null,p=e.ref.addIndex||null;e.ref.addIndex=null;let c=0,d=0,m=0;if(r.length===0)return;let u=r[0].rect.element,f=u.marginTop+u.marginBottom,h=u.marginLeft+u.marginRight,g=u.width+h,v=u.height+f,E=Zi(o,g);if(E===1){let T=0,I=0;r.forEach((y,b)=>{if(s){let _=b-s;_===-2?I=-f*.25:_===-1?I=-f*.75:_===0?I=f*.75:_===1?I=f*.25:I=0}a&&(y.translateX=null,y.translateY=null),y.markedForRemoval||on(y,0,T+I);let x=(y.rect.element.height+f)*(y.markedForRemoval?y.opacity:1);T+=x})}else{let T=0,I=0;r.forEach((y,b)=>{b===s&&(c=1),b===p&&(m+=1),y.markedForRemoval&&y.opacity<.5&&(d-=1);let w=b+m+c+d,x=w%E,_=Math.floor(w/E),P=x*g,O=_*v,M=Math.sign(P-T),C=Math.sign(O-I);T=P,I=O,!y.markedForRemoval&&(a&&(y.translateX=null,y.translateY=null),on(y,P,O,M,C))})}},Ic=(e,t)=>t.filter(i=>i.data&&i.data.id?e.id===i.data.id:!0),xc=ne({create:uc,write:vc,tag:"ul",name:"list",didWriteView:({root:e})=>{e.childViews.filter(t=>t.markedForRemoval&&t.opacity===0&&t.resting).forEach(t=>{t._destroy(),e.removeChildView(t)})},filterFrameActionsForChild:Ic,mixins:{apis:["dragCoordinates"]}}),yc=({root:e,props:t})=>{e.ref.list=e.appendChildView(e.createChildView(xc)),t.dragCoordinates=null,t.overflowing=!1},_c=({root:e,props:t,action:i})=>{e.query("GET_ITEM_INSERT_LOCATION_FREEDOM")&&(t.dragCoordinates={left:i.position.scopeLeft-e.ref.list.rect.element.left,top:i.position.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},Rc=({props:e})=>{e.dragCoordinates=null},wc=he({DID_DRAG:_c,DID_END_DRAG:Rc}),Sc=({root:e,props:t,actions:i})=>{if(wc({root:e,props:t,actions:i}),e.ref.list.dragCoordinates=t.dragCoordinates,t.overflowing&&!t.overflow&&(t.overflowing=!1,e.element.dataset.state="",e.height=null),t.overflow){let a=Math.round(t.overflow);a!==e.height&&(t.overflowing=!0,e.element.dataset.state="overflow",e.height=a)}},Lc=ne({create:yc,write:Sc,name:"list-scroller",mixins:{apis:["overflow","dragCoordinates"],styles:["height","translateY"],animations:{translateY:"spring"}}}),Oe=(e,t,i,a="")=>{i?se(e,t,a):e.removeAttribute(t)},Ac=e=>{if(!(!e||e.value==="")){try{e.value=""}catch{}if(e.value){let t=ke("form"),i=e.parentNode,a=e.nextSibling;t.appendChild(e),t.reset(),a?i.insertBefore(e,a):i.appendChild(e)}}},Mc=({root:e,props:t})=>{e.element.id=`filepond--browser-${t.id}`,se(e.element,"name",e.query("GET_NAME")),se(e.element,"aria-controls",`filepond--assistant-${t.id}`),se(e.element,"aria-labelledby",`filepond--drop-label-${t.id}`),Vn({root:e,action:{value:e.query("GET_ACCEPTED_FILE_TYPES")}}),Gn({root:e,action:{value:e.query("GET_ALLOW_MULTIPLE")}}),Un({root:e,action:{value:e.query("GET_ALLOW_DIRECTORIES_ONLY")}}),Bi({root:e}),Wn({root:e,action:{value:e.query("GET_REQUIRED")}}),Hn({root:e,action:{value:e.query("GET_CAPTURE_METHOD")}}),e.ref.handleChange=i=>{if(!e.element.value)return;let a=Array.from(e.element.files).map(n=>(n._relativePath=n.webkitRelativePath,n));setTimeout(()=>{t.onload(a),Ac(e.element)},250)},e.element.addEventListener("change",e.ref.handleChange)},Vn=({root:e,action:t})=>{e.query("GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE")&&Oe(e.element,"accept",!!t.value,t.value?t.value.join(","):"")},Gn=({root:e,action:t})=>{Oe(e.element,"multiple",t.value)},Un=({root:e,action:t})=>{Oe(e.element,"webkitdirectory",t.value)},Bi=({root:e})=>{let t=e.query("GET_DISABLED"),i=e.query("GET_ALLOW_BROWSE"),a=t||!i;Oe(e.element,"disabled",a)},Wn=({root:e,action:t})=>{t.value?e.query("GET_TOTAL_ITEMS")===0&&Oe(e.element,"required",!0):Oe(e.element,"required",!1)},Hn=({root:e,action:t})=>{Oe(e.element,"capture",!!t.value,t.value===!0?"":t.value)},ln=({root:e})=>{let{element:t}=e;e.query("GET_TOTAL_ITEMS")>0?(Oe(t,"required",!1),Oe(t,"name",!1)):(Oe(t,"name",!0,e.query("GET_NAME")),e.query("GET_CHECK_VALIDITY")&&t.setCustomValidity(""),e.query("GET_REQUIRED")&&Oe(t,"required",!0))},Oc=({root:e})=>{e.query("GET_CHECK_VALIDITY")&&e.element.setCustomValidity(e.query("GET_LABEL_INVALID_FIELD"))},Pc=ne({tag:"input",name:"browser",ignoreRect:!0,ignoreRectUpdate:!0,attributes:{type:"file"},create:Mc,destroy:({root:e})=>{e.element.removeEventListener("change",e.ref.handleChange)},write:he({DID_LOAD_ITEM:ln,DID_REMOVE_ITEM:ln,DID_THROW_ITEM_INVALID:Oc,DID_SET_DISABLED:Bi,DID_SET_ALLOW_BROWSE:Bi,DID_SET_ALLOW_DIRECTORIES_ONLY:Un,DID_SET_ALLOW_MULTIPLE:Gn,DID_SET_ACCEPTED_FILE_TYPES:Vn,DID_SET_CAPTURE_METHOD:Hn,DID_SET_REQUIRED:Wn})}),rn={ENTER:13,SPACE:32},Dc=({root:e,props:t})=>{let i=ke("label");se(i,"for",`filepond--browser-${t.id}`),se(i,"id",`filepond--drop-label-${t.id}`),e.ref.handleKeyDown=a=>{(a.keyCode===rn.ENTER||a.keyCode===rn.SPACE)&&(a.preventDefault(),e.ref.label.click())},e.ref.handleClick=a=>{a.target===i||i.contains(a.target)||e.ref.label.click()},i.addEventListener("keydown",e.ref.handleKeyDown),e.element.addEventListener("click",e.ref.handleClick),jn(i,t.caption),e.appendChild(i),e.ref.label=i},jn=(e,t)=>{e.innerHTML=t;let i=e.querySelector(".filepond--label-action");return i&&se(i,"tabindex","0"),t},Fc=ne({name:"drop-label",ignoreRect:!0,create:Dc,destroy:({root:e})=>{e.ref.label.addEventListener("keydown",e.ref.handleKeyDown),e.element.removeEventListener("click",e.ref.handleClick)},write:he({DID_SET_LABEL_IDLE:({root:e,action:t})=>{jn(e.ref.label,t.value)}}),mixins:{styles:["opacity","translateX","translateY"],animations:{opacity:{type:"tween",duration:150},translateX:"spring",translateY:"spring"}}}),zc=ne({name:"drip-blob",ignoreRect:!0,mixins:{styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}}}}),Cc=({root:e})=>{let t=e.rect.element.width*.5,i=e.rect.element.height*.5;e.ref.blob=e.appendChildView(e.createChildView(zc,{opacity:0,scaleX:2.5,scaleY:2.5,translateX:t,translateY:i}))},Nc=({root:e,action:t})=>{if(!e.ref.blob){Cc({root:e});return}e.ref.blob.translateX=t.position.scopeLeft,e.ref.blob.translateY=t.position.scopeTop,e.ref.blob.scaleX=1,e.ref.blob.scaleY=1,e.ref.blob.opacity=1},Bc=({root:e})=>{e.ref.blob&&(e.ref.blob.opacity=0)},kc=({root:e})=>{e.ref.blob&&(e.ref.blob.scaleX=2.5,e.ref.blob.scaleY=2.5,e.ref.blob.opacity=0)},Vc=({root:e,props:t,actions:i})=>{Gc({root:e,props:t,actions:i});let{blob:a}=e.ref;i.length===0&&a&&a.opacity===0&&(e.removeChildView(a),e.ref.blob=null)},Gc=he({DID_DRAG:Nc,DID_DROP:kc,DID_END_DRAG:Bc}),Uc=ne({ignoreRect:!0,ignoreRectUpdate:!0,name:"drip",write:Vc}),Yn=(e,t)=>{try{let i=new DataTransfer;t.forEach(a=>{a instanceof File?i.items.add(a):i.items.add(new File([a],a.name,{type:a.type}))}),e.files=i.files}catch{return!1}return!0},Wc=({root:e})=>e.ref.fields={},ui=(e,t)=>e.ref.fields[t],Ji=e=>{e.query("GET_ACTIVE_ITEMS").forEach(t=>{e.ref.fields[t.id]&&e.element.appendChild(e.ref.fields[t.id])})},sn=({root:e})=>Ji(e),Hc=({root:e,action:t})=>{let n=!(e.query("GET_ITEM",t.id).origin===re.LOCAL)&&e.query("SHOULD_UPDATE_FILE_INPUT"),o=ke("input");o.type=n?"file":"hidden",o.name=e.query("GET_NAME"),e.ref.fields[t.id]=o,Ji(e)},jc=({root:e,action:t})=>{let i=ui(e,t.id);if(!i||(t.serverFileReference!==null&&(i.value=t.serverFileReference),!e.query("SHOULD_UPDATE_FILE_INPUT")))return;let a=e.query("GET_ITEM",t.id);Yn(i,[a.file])},Yc=({root:e,action:t})=>{e.query("SHOULD_UPDATE_FILE_INPUT")&&setTimeout(()=>{let i=ui(e,t.id);i&&Yn(i,[t.file])},0)},qc=({root:e})=>{e.element.disabled=e.query("GET_DISABLED")},$c=({root:e,action:t})=>{let i=ui(e,t.id);i&&(i.parentNode&&i.parentNode.removeChild(i),delete e.ref.fields[t.id])},Xc=({root:e,action:t})=>{let i=ui(e,t.id);i&&(t.value===null?i.removeAttribute("value"):i.type!="file"&&(i.value=t.value),Ji(e))},Qc=he({DID_SET_DISABLED:qc,DID_ADD_ITEM:Hc,DID_LOAD_ITEM:jc,DID_REMOVE_ITEM:$c,DID_DEFINE_VALUE:Xc,DID_PREPARE_OUTPUT:Yc,DID_REORDER_ITEMS:sn,DID_SORT_ITEMS:sn}),Zc=ne({tag:"fieldset",name:"data",create:Wc,write:Qc,ignoreRect:!0}),Kc=e=>"getRootNode"in e?e.getRootNode():document,Jc=["jpg","jpeg","png","gif","bmp","webp","svg","tiff"],ed=["css","csv","html","txt"],td={zip:"zip|compressed",epub:"application/epub+zip"},qn=(e="")=>(e=e.toLowerCase(),Jc.includes(e)?"image/"+(e==="jpg"?"jpeg":e==="svg"?"svg+xml":e):ed.includes(e)?"text/"+e:td[e]||""),ea=e=>new Promise((t,i)=>{let a=cd(e);if(a.length&&!id(e))return t(a);ad(e).then(t)}),id=e=>e.files?e.files.length>0:!1,ad=e=>new Promise((t,i)=>{let a=(e.items?Array.from(e.items):[]).filter(n=>nd(n)).map(n=>od(n));if(!a.length){t(e.files?Array.from(e.files):[]);return}Promise.all(a).then(n=>{let o=[];n.forEach(l=>{o.push.apply(o,l)}),t(o.filter(l=>l).map(l=>(l._relativePath||(l._relativePath=l.webkitRelativePath),l)))}).catch(console.error)}),nd=e=>{if($n(e)){let t=ta(e);if(t)return t.isFile||t.isDirectory}return e.kind==="file"},od=e=>new Promise((t,i)=>{if(sd(e)){ld(ta(e)).then(t).catch(i);return}t([e.getAsFile()])}),ld=e=>new Promise((t,i)=>{let a=[],n=0,o=0,l=()=>{o===0&&n===0&&t(a)},r=s=>{n++;let p=s.createReader(),c=()=>{p.readEntries(d=>{if(d.length===0){n--,l();return}d.forEach(m=>{m.isDirectory?r(m):(o++,m.file(u=>{let f=rd(u);m.fullPath&&(f._relativePath=m.fullPath),a.push(f),o--,l()}))}),c()},i)};c()};r(e)}),rd=e=>{if(e.type.length)return e;let t=e.lastModifiedDate,i=e.name,a=qn(mi(e.name));return a.length&&(e=e.slice(0,e.size,a),e.name=i,e.lastModifiedDate=t),e},sd=e=>$n(e)&&(ta(e)||{}).isDirectory,$n=e=>"webkitGetAsEntry"in e,ta=e=>e.webkitGetAsEntry(),cd=e=>{let t=[];try{if(t=pd(e),t.length)return t;t=dd(e)}catch{}return t},dd=e=>{let t=e.getData("url");return typeof t=="string"&&t.length?[t]:[]},pd=e=>{let t=e.getData("text/html");if(typeof t=="string"&&t.length){let i=t.match(/src\s*=\s*"(.+?)"/);if(i)return[i[1]]}return[]},li=[],et=e=>({pageLeft:e.pageX,pageTop:e.pageY,scopeLeft:e.offsetX||e.layerX,scopeTop:e.offsetY||e.layerY}),md=(e,t,i)=>{let a=ud(t),n={element:e,filterElement:i,state:null,ondrop:()=>{},onenter:()=>{},ondrag:()=>{},onexit:()=>{},onload:()=>{},allowdrop:()=>{}};return n.destroy=a.addListener(n),n},ud=e=>{let t=li.find(a=>a.element===e);if(t)return t;let i=fd(e);return li.push(i),i},fd=e=>{let t=[],i={dragenter:gd,dragover:Ed,dragleave:Td,drop:bd},a={};te(i,(o,l)=>{a[o]=l(e,t),e.addEventListener(o,a[o],!1)});let n={element:e,addListener:o=>(t.push(o),()=>{t.splice(t.indexOf(o),1),t.length===0&&(li.splice(li.indexOf(n),1),te(i,l=>{e.removeEventListener(l,a[l],!1)}))})};return n},hd=(e,t)=>("elementFromPoint"in e||(e=document),e.elementFromPoint(t.x,t.y)),ia=(e,t)=>{let i=Kc(t),a=hd(i,{x:e.pageX-window.pageXOffset,y:e.pageY-window.pageYOffset});return a===t||t.contains(a)},Xn=null,ti=(e,t)=>{try{e.dropEffect=t}catch{}},gd=(e,t)=>i=>{i.preventDefault(),Xn=i.target,t.forEach(a=>{let{element:n,onenter:o}=a;ia(i,n)&&(a.state="enter",o(et(i)))})},Ed=(e,t)=>i=>{i.preventDefault();let a=i.dataTransfer;ea(a).then(n=>{let o=!1;t.some(l=>{let{filterElement:r,element:s,onenter:p,onexit:c,ondrag:d,allowdrop:m}=l;ti(a,"copy");let u=m(n);if(!u){ti(a,"none");return}if(ia(i,s)){if(o=!0,l.state===null){l.state="enter",p(et(i));return}if(l.state="over",r&&!u){ti(a,"none");return}d(et(i))}else r&&!o&&ti(a,"none"),l.state&&(l.state=null,c(et(i)))})})},bd=(e,t)=>i=>{i.preventDefault();let a=i.dataTransfer;ea(a).then(n=>{t.forEach(o=>{let{filterElement:l,element:r,ondrop:s,onexit:p,allowdrop:c}=o;if(o.state=null,!(l&&!ia(i,r))){if(!c(n))return p(et(i));s(et(i),n)}})})},Td=(e,t)=>i=>{Xn===i.target&&t.forEach(a=>{let{onexit:n}=a;a.state=null,n(et(i))})},vd=(e,t,i)=>{e.classList.add("filepond--hopper");let{catchesDropsOnPage:a,requiresDropOnElement:n,filterItems:o=c=>c}=i,l=md(e,a?document.documentElement:e,n),r="",s="";l.allowdrop=c=>t(o(c)),l.ondrop=(c,d)=>{let m=o(d);if(!t(m)){p.ondragend(c);return}s="drag-drop",p.onload(m,c)},l.ondrag=c=>{p.ondrag(c)},l.onenter=c=>{s="drag-over",p.ondragstart(c)},l.onexit=c=>{s="drag-exit",p.ondragend(c)};let p={updateHopperState:()=>{r!==s&&(e.dataset.hopperState=s,r=s)},onload:()=>{},ondragstart:()=>{},ondrag:()=>{},ondragend:()=>{},destroy:()=>{l.destroy()}};return p},ki=!1,mt=[],Qn=e=>{let t=document.activeElement;if(t&&(/textarea|input/i.test(t.nodeName)||t.getAttribute("contenteditable")==="true")){let a=!1,n=t;for(;n!==document.body;){if(n.classList.contains("filepond--root")){a=!0;break}n=n.parentNode}if(!a)return}ea(e.clipboardData).then(a=>{a.length&&mt.forEach(n=>n(a))})},Id=e=>{mt.includes(e)||(mt.push(e),!ki&&(ki=!0,document.addEventListener("paste",Qn)))},xd=e=>{qi(mt,mt.indexOf(e)),mt.length===0&&(document.removeEventListener("paste",Qn),ki=!1)},yd=()=>{let e=i=>{t.onload(i)},t={destroy:()=>{xd(e)},onload:()=>{}};return Id(e),t},_d=({root:e,props:t})=>{e.element.id=`filepond--assistant-${t.id}`,se(e.element,"role","status"),se(e.element,"aria-live","polite"),se(e.element,"aria-relevant","additions")},cn=null,dn=null,Oi=[],fi=(e,t)=>{e.element.textContent=t},Rd=e=>{e.element.textContent=""},Zn=(e,t,i)=>{let a=e.query("GET_TOTAL_ITEMS");fi(e,`${i} ${t}, ${a} ${a===1?e.query("GET_LABEL_FILE_COUNT_SINGULAR"):e.query("GET_LABEL_FILE_COUNT_PLURAL")}`),clearTimeout(dn),dn=setTimeout(()=>{Rd(e)},1500)},Kn=e=>e.element.parentNode.contains(document.activeElement),wd=({root:e,action:t})=>{if(!Kn(e))return;e.element.textContent="";let i=e.query("GET_ITEM",t.id);Oi.push(i.filename),clearTimeout(cn),cn=setTimeout(()=>{Zn(e,Oi.join(", "),e.query("GET_LABEL_FILE_ADDED")),Oi.length=0},750)},Sd=({root:e,action:t})=>{if(!Kn(e))return;let i=t.item;Zn(e,i.filename,e.query("GET_LABEL_FILE_REMOVED"))},Ld=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename,n=e.query("GET_LABEL_FILE_PROCESSING_COMPLETE");fi(e,`${a} ${n}`)},pn=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename,n=e.query("GET_LABEL_FILE_PROCESSING_ABORTED");fi(e,`${a} ${n}`)},ii=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename;fi(e,`${t.status.main} ${a} ${t.status.sub}`)},Ad=ne({create:_d,ignoreRect:!0,ignoreRectUpdate:!0,write:he({DID_LOAD_ITEM:wd,DID_REMOVE_ITEM:Sd,DID_COMPLETE_ITEM_PROCESSING:Ld,DID_ABORT_ITEM_PROCESSING:pn,DID_REVERT_ITEM_PROCESSING:pn,DID_THROW_ITEM_REMOVE_ERROR:ii,DID_THROW_ITEM_LOAD_ERROR:ii,DID_THROW_ITEM_INVALID:ii,DID_THROW_ITEM_PROCESSING_ERROR:ii}),tag:"span",name:"assistant"}),Jn=(e,t="-")=>e.replace(new RegExp(`${t}.`,"g"),i=>i.charAt(1).toUpperCase()),eo=(e,t=16,i=!0)=>{let a=Date.now(),n=null;return(...o)=>{clearTimeout(n);let l=Date.now()-a,r=()=>{a=Date.now(),e(...o)};le.preventDefault(),Od=({root:e,props:t})=>{let i=e.query("GET_ID");i&&(e.element.id=i);let a=e.query("GET_CLASS_NAME");a&&a.split(" ").filter(s=>s.length).forEach(s=>{e.element.classList.add(s)}),e.ref.label=e.appendChildView(e.createChildView(Fc,{...t,translateY:null,caption:e.query("GET_LABEL_IDLE")})),e.ref.list=e.appendChildView(e.createChildView(Lc,{translateY:null})),e.ref.panel=e.appendChildView(e.createChildView(kn,{name:"panel-root"})),e.ref.assistant=e.appendChildView(e.createChildView(Ad,{...t})),e.ref.data=e.appendChildView(e.createChildView(Zc,{...t})),e.ref.measure=ke("div"),e.ref.measure.style.height="100%",e.element.appendChild(e.ref.measure),e.ref.bounds=null,e.query("GET_STYLES").filter(s=>!Be(s.value)).map(({name:s,value:p})=>{e.element.dataset[s]=p}),e.ref.widthPrevious=null,e.ref.widthUpdated=eo(()=>{e.ref.updateHistory=[],e.dispatch("DID_RESIZE_ROOT")},250),e.ref.previousAspectRatio=null,e.ref.updateHistory=[];let n=window.matchMedia("(pointer: fine) and (hover: hover)").matches,o="PointerEvent"in window;e.query("GET_ALLOW_REORDER")&&o&&!n&&(e.element.addEventListener("touchmove",ri,{passive:!1}),e.element.addEventListener("gesturestart",ri));let l=e.query("GET_CREDITS");if(l.length===2){let s=document.createElement("a");s.className="filepond--credits",s.href=l[0],s.tabIndex=-1,s.target="_blank",s.rel="noopener noreferrer",s.textContent=l[1],e.element.appendChild(s),e.ref.credits=s}},Pd=({root:e,props:t,actions:i})=>{if(Nd({root:e,props:t,actions:i}),i.filter(b=>/^DID_SET_STYLE_/.test(b.type)).filter(b=>!Be(b.data.value)).map(({type:b,data:w})=>{let x=Jn(b.substring(8).toLowerCase(),"_");e.element.dataset[x]=w.value,e.invalidateLayout()}),e.rect.element.hidden)return;e.rect.element.width!==e.ref.widthPrevious&&(e.ref.widthPrevious=e.rect.element.width,e.ref.widthUpdated());let a=e.ref.bounds;a||(a=e.ref.bounds=zd(e),e.element.removeChild(e.ref.measure),e.ref.measure=null);let{hopper:n,label:o,list:l,panel:r}=e.ref;n&&n.updateHopperState();let s=e.query("GET_PANEL_ASPECT_RATIO"),p=e.query("GET_ALLOW_MULTIPLE"),c=e.query("GET_TOTAL_ITEMS"),d=p?e.query("GET_MAX_FILES")||Md:1,m=c===d,u=i.find(b=>b.type==="DID_ADD_ITEM");if(m&&u){let b=u.data.interactionMethod;o.opacity=0,p?o.translateY=-40:b===_e.API?o.translateX=40:b===_e.BROWSE?o.translateY=40:o.translateY=30}else m||(o.opacity=1,o.translateX=0,o.translateY=0);let f=Dd(e),h=Fd(e),g=o.rect.element.height,v=!p||m?0:g,E=m?l.rect.element.marginTop:0,T=c===0?0:l.rect.element.marginBottom,I=v+E+h.visual+T,y=v+E+h.bounds+T;if(l.translateY=Math.max(0,v-l.rect.element.marginTop)-f.top,s){let b=e.rect.element.width,w=b*s;s!==e.ref.previousAspectRatio&&(e.ref.previousAspectRatio=s,e.ref.updateHistory=[]);let x=e.ref.updateHistory;x.push(b);let _=2;if(x.length>_*2){let O=x.length,M=O-10,C=0;for(let S=O;S>=M;S--)if(x[S]===x[S-2]&&C++,C>=_)return}r.scalable=!1,r.height=w;let P=w-v-(T-f.bottom)-(m?E:0);h.visual>P?l.overflow=P:l.overflow=null,e.height=w}else if(a.fixedHeight){r.scalable=!1;let b=a.fixedHeight-v-(T-f.bottom)-(m?E:0);h.visual>b?l.overflow=b:l.overflow=null}else if(a.cappedHeight){let b=I>=a.cappedHeight,w=Math.min(a.cappedHeight,I);r.scalable=!0,r.height=b?w:w-f.top-f.bottom;let x=w-v-(T-f.bottom)-(m?E:0);I>a.cappedHeight&&h.visual>x?l.overflow=x:l.overflow=null,e.height=Math.min(a.cappedHeight,y-f.top-f.bottom)}else{let b=c>0?f.top+f.bottom:0;r.scalable=!0,r.height=Math.max(g,I-b),e.height=Math.max(g,y-b)}e.ref.credits&&r.heightCurrent&&(e.ref.credits.style.transform=`translateY(${r.heightCurrent}px)`)},Dd=e=>{let t=e.ref.list.childViews[0].childViews[0];return t?{top:t.rect.element.marginTop,bottom:t.rect.element.marginBottom}:{top:0,bottom:0}},Fd=e=>{let t=0,i=0,a=e.ref.list,n=a.childViews[0],o=n.childViews.filter(E=>E.rect.element.height),l=e.query("GET_ACTIVE_ITEMS").map(E=>o.find(T=>T.id===E.id)).filter(E=>E);if(l.length===0)return{visual:t,bounds:i};let r=n.rect.element.width,s=Ki(n,l,a.dragCoordinates),p=l[0].rect.element,c=p.marginTop+p.marginBottom,d=p.marginLeft+p.marginRight,m=p.width+d,u=p.height+c,f=typeof s<"u"&&s>=0?1:0,h=l.find(E=>E.markedForRemoval&&E.opacity<.45)?-1:0,g=l.length+f+h,v=Zi(r,m);return v===1?l.forEach(E=>{let T=E.rect.element.height+c;i+=T,t+=T*E.opacity}):(i=Math.ceil(g/v)*u,t=i),{visual:t,bounds:i}},zd=e=>{let t=e.ref.measureHeight||null;return{cappedHeight:parseInt(e.style.maxHeight,10)||null,fixedHeight:t===0?null:t}},aa=(e,t)=>{let i=e.query("GET_ALLOW_REPLACE"),a=e.query("GET_ALLOW_MULTIPLE"),n=e.query("GET_TOTAL_ITEMS"),o=e.query("GET_MAX_FILES"),l=t.length;return!a&&l>1?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ie("warning",0,"Max files")}),!0):(o=a?o:1,!a&&i?!1:gt(o)&&n+l>o?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ie("warning",0,"Max files")}),!0):!1)},Cd=(e,t,i)=>{let a=e.childViews[0];return Ki(a,t,{left:i.scopeLeft-a.rect.element.left,top:i.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},mn=e=>{let t=e.query("GET_ALLOW_DROP"),i=e.query("GET_DISABLED"),a=t&&!i;if(a&&!e.ref.hopper){let n=vd(e.element,o=>{let l=e.query("GET_BEFORE_DROP_FILE")||(()=>!0);return e.query("GET_DROP_VALIDATION")?o.every(s=>tt("ALLOW_HOPPER_ITEM",s,{query:e.query}).every(p=>p===!0)&&l(s)):!0},{filterItems:o=>{let l=e.query("GET_IGNORED_FILES");return o.filter(r=>Je(r)?!l.includes(r.name.toLowerCase()):!0)},catchesDropsOnPage:e.query("GET_DROP_ON_PAGE"),requiresDropOnElement:e.query("GET_DROP_ON_ELEMENT")});n.onload=(o,l)=>{let s=e.ref.list.childViews[0].childViews.filter(c=>c.rect.element.height),p=e.query("GET_ACTIVE_ITEMS").map(c=>s.find(d=>d.id===c.id)).filter(c=>c);Ae("ADD_ITEMS",o,{dispatch:e.dispatch}).then(c=>{if(aa(e,c))return!1;e.dispatch("ADD_ITEMS",{items:c,index:Cd(e.ref.list,p,l),interactionMethod:_e.DROP})}),e.dispatch("DID_DROP",{position:l}),e.dispatch("DID_END_DRAG",{position:l})},n.ondragstart=o=>{e.dispatch("DID_START_DRAG",{position:o})},n.ondrag=eo(o=>{e.dispatch("DID_DRAG",{position:o})}),n.ondragend=o=>{e.dispatch("DID_END_DRAG",{position:o})},e.ref.hopper=n,e.ref.drip=e.appendChildView(e.createChildView(Uc))}else!a&&e.ref.hopper&&(e.ref.hopper.destroy(),e.ref.hopper=null,e.removeChildView(e.ref.drip))},un=(e,t)=>{let i=e.query("GET_ALLOW_BROWSE"),a=e.query("GET_DISABLED"),n=i&&!a;n&&!e.ref.browser?e.ref.browser=e.appendChildView(e.createChildView(Pc,{...t,onload:o=>{Ae("ADD_ITEMS",o,{dispatch:e.dispatch}).then(l=>{if(aa(e,l))return!1;e.dispatch("ADD_ITEMS",{items:l,index:-1,interactionMethod:_e.BROWSE})})}}),0):!n&&e.ref.browser&&(e.removeChildView(e.ref.browser),e.ref.browser=null)},fn=e=>{let t=e.query("GET_ALLOW_PASTE"),i=e.query("GET_DISABLED"),a=t&&!i;a&&!e.ref.paster?(e.ref.paster=yd(),e.ref.paster.onload=n=>{Ae("ADD_ITEMS",n,{dispatch:e.dispatch}).then(o=>{if(aa(e,o))return!1;e.dispatch("ADD_ITEMS",{items:o,index:-1,interactionMethod:_e.PASTE})})}):!a&&e.ref.paster&&(e.ref.paster.destroy(),e.ref.paster=null)},Nd=he({DID_SET_ALLOW_BROWSE:({root:e,props:t})=>{un(e,t)},DID_SET_ALLOW_DROP:({root:e})=>{mn(e)},DID_SET_ALLOW_PASTE:({root:e})=>{fn(e)},DID_SET_DISABLED:({root:e,props:t})=>{mn(e),fn(e),un(e,t),e.query("GET_DISABLED")?e.element.dataset.disabled="disabled":e.element.removeAttribute("data-disabled")}}),Bd=ne({name:"root",read:({root:e})=>{e.ref.measure&&(e.ref.measureHeight=e.ref.measure.offsetHeight)},create:Od,write:Pd,destroy:({root:e})=>{e.ref.paster&&e.ref.paster.destroy(),e.ref.hopper&&e.ref.hopper.destroy(),e.element.removeEventListener("touchmove",ri),e.element.removeEventListener("gesturestart",ri)},mixins:{styles:["height"]}}),kd=(e={})=>{let t=null,i=oi(),a=ir(Gr(i),[os,Hr(i)],[Ms,Wr(i)]);a.dispatch("SET_OPTIONS",{options:e});let n=()=>{document.hidden||a.dispatch("KICK")};document.addEventListener("visibilitychange",n);let o=null,l=!1,r=!1,s=null,p=null,c=()=>{l||(l=!0),clearTimeout(o),o=setTimeout(()=>{l=!1,s=null,p=null,r&&(r=!1,a.dispatch("DID_STOP_RESIZE"))},500)};window.addEventListener("resize",c);let d=Bd(a,{id:Yi()}),m=!1,u=!1,f={_read:()=>{l&&(p=window.innerWidth,s||(s=p),!r&&p!==s&&(a.dispatch("DID_START_RESIZE"),r=!0)),u&&m&&(m=d.element.offsetParent===null),!m&&(d._read(),u=d.rect.element.hidden)},_write:R=>{let L=a.processActionQueue().filter(z=>!/^SET_/.test(z.type));m&&!L.length||(E(L),m=d._write(R,L,r),qr(a.query("GET_ITEMS")),m&&a.processDispatchQueue())}},h=R=>L=>{let z={type:R};if(!L)return z;if(L.hasOwnProperty("error")&&(z.error=L.error?{...L.error}:null),L.status&&(z.status={...L.status}),L.file&&(z.output=L.file),L.source)z.file=L.source;else if(L.item||L.id){let D=L.item?L.item:a.query("GET_ITEM",L.id);z.file=D?ge(D):null}return L.items&&(z.items=L.items.map(ge)),/progress/.test(R)&&(z.progress=L.progress),L.hasOwnProperty("origin")&&L.hasOwnProperty("target")&&(z.origin=L.origin,z.target=L.target),z},g={DID_DESTROY:h("destroy"),DID_INIT:h("init"),DID_THROW_MAX_FILES:h("warning"),DID_INIT_ITEM:h("initfile"),DID_START_ITEM_LOAD:h("addfilestart"),DID_UPDATE_ITEM_LOAD_PROGRESS:h("addfileprogress"),DID_LOAD_ITEM:h("addfile"),DID_THROW_ITEM_INVALID:[h("error"),h("addfile")],DID_THROW_ITEM_LOAD_ERROR:[h("error"),h("addfile")],DID_THROW_ITEM_REMOVE_ERROR:[h("error"),h("removefile")],DID_PREPARE_OUTPUT:h("preparefile"),DID_START_ITEM_PROCESSING:h("processfilestart"),DID_UPDATE_ITEM_PROCESS_PROGRESS:h("processfileprogress"),DID_ABORT_ITEM_PROCESSING:h("processfileabort"),DID_COMPLETE_ITEM_PROCESSING:h("processfile"),DID_COMPLETE_ITEM_PROCESSING_ALL:h("processfiles"),DID_REVERT_ITEM_PROCESSING:h("processfilerevert"),DID_THROW_ITEM_PROCESSING_ERROR:[h("error"),h("processfile")],DID_REMOVE_ITEM:h("removefile"),DID_UPDATE_ITEMS:h("updatefiles"),DID_ACTIVATE_ITEM:h("activatefile"),DID_REORDER_ITEMS:h("reorderfiles")},v=R=>{let L={pond:F,...R};delete L.type,d.element.dispatchEvent(new CustomEvent(`FilePond:${R.type}`,{detail:L,bubbles:!0,cancelable:!0,composed:!0}));let z=[];R.hasOwnProperty("error")&&z.push(R.error),R.hasOwnProperty("file")&&z.push(R.file);let D=["type","error","file"];Object.keys(R).filter(B=>!D.includes(B)).forEach(B=>z.push(R[B])),F.fire(R.type,...z);let k=a.query(`GET_ON${R.type.toUpperCase()}`);k&&k(...z)},E=R=>{R.length&&R.filter(L=>g[L.type]).forEach(L=>{let z=g[L.type];(Array.isArray(z)?z:[z]).forEach(D=>{L.type==="DID_INIT_ITEM"?v(D(L.data)):setTimeout(()=>{v(D(L.data))},0)})})},T=R=>a.dispatch("SET_OPTIONS",{options:R}),I=R=>a.query("GET_ACTIVE_ITEM",R),y=R=>new Promise((L,z)=>{a.dispatch("REQUEST_ITEM_PREPARE",{query:R,success:D=>{L(D)},failure:D=>{z(D)}})}),b=(R,L={})=>new Promise((z,D)=>{_([{source:R,options:L}],{index:L.index}).then(k=>z(k&&k[0])).catch(D)}),w=R=>R.file&&R.id,x=(R,L)=>(typeof R=="object"&&!w(R)&&!L&&(L=R,R=void 0),a.dispatch("REMOVE_ITEM",{...L,query:R}),a.query("GET_ACTIVE_ITEM",R)===null),_=(...R)=>new Promise((L,z)=>{let D=[],k={};if(si(R[0]))D.push.apply(D,R[0]),Object.assign(k,R[1]||{});else{let B=R[R.length-1];typeof B=="object"&&!(B instanceof Blob)&&Object.assign(k,R.pop()),D.push(...R)}a.dispatch("ADD_ITEMS",{items:D,index:k.index,interactionMethod:_e.API,success:L,failure:z})}),P=()=>a.query("GET_ACTIVE_ITEMS"),O=R=>new Promise((L,z)=>{a.dispatch("REQUEST_ITEM_PROCESSING",{query:R,success:D=>{L(D)},failure:D=>{z(D)}})}),M=(...R)=>{let L=Array.isArray(R[0])?R[0]:R,z=L.length?L:P();return Promise.all(z.map(y))},C=(...R)=>{let L=Array.isArray(R[0])?R[0]:R;if(!L.length){let z=P().filter(D=>!(D.status===W.IDLE&&D.origin===re.LOCAL)&&D.status!==W.PROCESSING&&D.status!==W.PROCESSING_COMPLETE&&D.status!==W.PROCESSING_REVERT_ERROR);return Promise.all(z.map(O))}return Promise.all(L.map(O))},S=(...R)=>{let L=Array.isArray(R[0])?R[0]:R,z;typeof L[L.length-1]=="object"?z=L.pop():Array.isArray(R[0])&&(z=R[1]);let D=P();return L.length?L.map(B=>$e(B)?D[B]?D[B].id:null:B).filter(B=>B).map(B=>x(B,z)):Promise.all(D.map(B=>x(B,z)))},F={...pi(),...f,...Ur(a,i),setOptions:T,addFile:b,addFiles:_,getFile:I,processFile:O,prepareFile:y,removeFile:x,moveFile:(R,L)=>a.dispatch("MOVE_ITEM",{query:R,index:L}),getFiles:P,processFiles:C,removeFiles:S,prepareFiles:M,sort:R=>a.dispatch("SORT",{compare:R}),browse:()=>{var R=d.element.querySelector("input[type=file]");R&&R.click()},destroy:()=>{F.fire("destroy",d.element),a.dispatch("ABORT_ALL"),d._destroy(),window.removeEventListener("resize",c),document.removeEventListener("visibilitychange",n),a.dispatch("DID_DESTROY")},insertBefore:R=>Ca(d.element,R),insertAfter:R=>Na(d.element,R),appendTo:R=>R.appendChild(d.element),replaceElement:R=>{Ca(d.element,R),R.parentNode.removeChild(R),t=R},restoreElement:()=>{t&&(Na(t,d.element),d.element.parentNode.removeChild(d.element),t=null)},isAttachedTo:R=>d.element===R||t===R,element:{get:()=>d.element},status:{get:()=>a.query("GET_STATUS")}};return a.dispatch("DID_INIT"),We(F)},to=(e={})=>{let t={};return te(oi(),(a,n)=>{t[a]=n[0]}),kd({...t,...e})},Vd=e=>e.charAt(0).toLowerCase()+e.slice(1),Gd=e=>Jn(e.replace(/^data-/,"")),io=(e,t)=>{te(t,(i,a)=>{te(e,(n,o)=>{let l=new RegExp(i);if(!l.test(n)||(delete e[n],a===!1))return;if(fe(a)){e[a]=o;return}let s=a.group;ce(a)&&!e[s]&&(e[s]={}),e[s][Vd(n.replace(l,""))]=o}),a.mapping&&io(e[a.group],a.mapping)})},Ud=(e,t={})=>{let i=[];te(e.attributes,n=>{i.push(e.attributes[n])});let a=i.filter(n=>n.name).reduce((n,o)=>{let l=se(e,o.name);return n[Gd(o.name)]=l===o.name?!0:l,n},{});return io(a,t),a},Wd=(e,t={})=>{let i={"^class$":"className","^multiple$":"allowMultiple","^capture$":"captureMethod","^webkitdirectory$":"allowDirectoriesOnly","^server":{group:"server",mapping:{"^process":{group:"process"},"^revert":{group:"revert"},"^fetch":{group:"fetch"},"^restore":{group:"restore"},"^load":{group:"load"}}},"^type$":!1,"^files$":!1};tt("SET_ATTRIBUTE_TO_OPTION_MAP",i);let a={...t},n=Ud(e.nodeName==="FIELDSET"?e.querySelector("input[type=file]"):e,i);Object.keys(n).forEach(l=>{ce(n[l])?(ce(a[l])||(a[l]={}),Object.assign(a[l],n[l])):a[l]=n[l]}),a.files=(t.files||[]).concat(Array.from(e.querySelectorAll("input:not([type=file])")).map(l=>({source:l.value,options:{type:l.dataset.type}})));let o=to(a);return e.files&&Array.from(e.files).forEach(l=>{o.addFile(l)}),o.replaceElement(e),o},Hd=(...e)=>tr(e[0])?Wd(...e):to(...e),jd=["fire","_read","_write"],hn=e=>{let t={};return yn(e,t,jd),t},Yd=(e,t)=>e.replace(/(?:{([a-zA-Z]+)})/g,(i,a)=>t[a]),qd=e=>{let t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),i=URL.createObjectURL(t),a=new Worker(i);return{transfer:(n,o)=>{},post:(n,o,l)=>{let r=Yi();a.onmessage=s=>{s.data.id===r&&o(s.data.message)},a.postMessage({id:r,message:n},l)},terminate:()=>{a.terminate(),URL.revokeObjectURL(i)}}},$d=e=>new Promise((t,i)=>{let a=new Image;a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),ao=(e,t)=>{let i=e.slice(0,e.size,e.type);return i.lastModifiedDate=e.lastModifiedDate,i.name=t,i},Xd=e=>ao(e,e.name),gn=[],Qd=e=>{if(gn.includes(e))return;gn.push(e);let t=e({addFilter:Xr,utils:{Type:A,forin:te,isString:fe,isFile:Je,toNaturalFileSize:Cn,replaceInString:Yd,getExtensionFromFilename:mi,getFilenameWithoutExtension:Dn,guesstimateMimeType:qn,getFileFromBlob:ht,getFilenameFromURL:Ft,createRoute:he,createWorker:qd,createView:ne,createItemAPI:ge,loadImage:$d,copyFile:Xd,renameFile:ao,createBlob:Mn,applyFilterChain:Ae,text:ae,getNumericAspectRatioFromString:wn},views:{fileActionButton:zn}});Qr(t.options)},Zd=()=>Object.prototype.toString.call(window.operamini)==="[object OperaMini]",Kd=()=>"Promise"in window,Jd=()=>"slice"in Blob.prototype,ep=()=>"URL"in window&&"createObjectURL"in window.URL,tp=()=>"visibilityState"in document,ip=()=>"performance"in window,ap=()=>"supports"in(window.CSS||{}),np=()=>/MSIE|Trident/.test(window.navigator.userAgent),Vi=(()=>{let e=En()&&!Zd()&&tp()&&Kd()&&Jd()&&ep()&&ip()&&(ap()||np());return()=>e})(),Ue={apps:[]},op="filepond",it=()=>{},no={},Et={},zt={},Gi={},ut=it,ft=it,Ui=it,Wi=it,Ie=it,Hi=it,Dt=it;if(Vi()){Sr(()=>{Ue.apps.forEach(i=>i._read())},i=>{Ue.apps.forEach(a=>a._write(i))});let e=()=>{document.dispatchEvent(new CustomEvent("FilePond:loaded",{detail:{supported:Vi,create:ut,destroy:ft,parse:Ui,find:Wi,registerPlugin:Ie,setOptions:Dt}})),document.removeEventListener("DOMContentLoaded",e)};document.readyState!=="loading"?setTimeout(()=>e(),0):document.addEventListener("DOMContentLoaded",e);let t=()=>te(oi(),(i,a)=>{Gi[i]=a[1]});no={...Sn},zt={...re},Et={...W},Gi={},t(),ut=(...i)=>{let a=Hd(...i);return a.on("destroy",ft),Ue.apps.push(a),hn(a)},ft=i=>{let a=Ue.apps.findIndex(n=>n.isAttachedTo(i));return a>=0?(Ue.apps.splice(a,1)[0].restoreElement(),!0):!1},Ui=i=>Array.from(i.querySelectorAll(`.${op}`)).filter(o=>!Ue.apps.find(l=>l.isAttachedTo(o))).map(o=>ut(o)),Wi=i=>{let a=Ue.apps.find(n=>n.isAttachedTo(i));return a?hn(a):null},Ie=(...i)=>{i.forEach(Qd),t()},Hi=()=>{let i={};return te(oi(),(a,n)=>{i[a]=n[0]}),i},Dt=i=>(ce(i)&&(Ue.apps.forEach(a=>{a.setOptions(i)}),Zr(i)),Hi())}function oo(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),i.push.apply(i,a)}return i}function xo(e){for(var t=1;te.length)&&(t=e.length);for(var i=0,a=new Array(t);i
',yp=Number.isNaN||Fe.isNaN;function j(e){return typeof e=="number"&&!yp(e)}var To=function(t){return t>0&&t<1/0};function oa(e){return typeof e>"u"}function ot(e){return ra(e)==="object"&&e!==null}var _p=Object.prototype.hasOwnProperty;function Tt(e){if(!ot(e))return!1;try{var t=e.constructor,i=t.prototype;return t&&i&&_p.call(i,"isPrototypeOf")}catch{return!1}}function Ee(e){return typeof e=="function"}var Rp=Array.prototype.slice;function Po(e){return Array.from?Array.from(e):Rp.call(e)}function oe(e,t){return e&&Ee(t)&&(Array.isArray(e)||j(e.length)?Po(e).forEach(function(i,a){t.call(e,i,a,e)}):ot(e)&&Object.keys(e).forEach(function(i){t.call(e,e[i],i,e)})),e}var J=Object.assign||function(t){for(var i=arguments.length,a=new Array(i>1?i-1:0),n=1;n0&&a.forEach(function(o){ot(o)&&Object.keys(o).forEach(function(l){t[l]=o[l]})}),t},wp=/\.\d*(?:0|9){12}\d*$/;function It(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1e11;return wp.test(e)?Math.round(e*t)/t:e}var Sp=/^width|height|left|top|marginLeft|marginTop$/;function je(e,t){var i=e.style;oe(t,function(a,n){Sp.test(n)&&j(a)&&(a="".concat(a,"px")),i[n]=a})}function Lp(e,t){return e.classList?e.classList.contains(t):e.className.indexOf(t)>-1}function de(e,t){if(t){if(j(e.length)){oe(e,function(a){de(a,t)});return}if(e.classList){e.classList.add(t);return}var i=e.className.trim();i?i.indexOf(t)<0&&(e.className="".concat(i," ").concat(t)):e.className=t}}function De(e,t){if(t){if(j(e.length)){oe(e,function(i){De(i,t)});return}if(e.classList){e.classList.remove(t);return}e.className.indexOf(t)>=0&&(e.className=e.className.replace(t,""))}}function vt(e,t,i){if(t){if(j(e.length)){oe(e,function(a){vt(a,t,i)});return}i?de(e,t):De(e,t)}}var Ap=/([a-z\d])([A-Z])/g;function Ia(e){return e.replace(Ap,"$1-$2").toLowerCase()}function ga(e,t){return ot(e[t])?e[t]:e.dataset?e.dataset[t]:e.getAttribute("data-".concat(Ia(t)))}function Ut(e,t,i){ot(i)?e[t]=i:e.dataset?e.dataset[t]=i:e.setAttribute("data-".concat(Ia(t)),i)}function Mp(e,t){if(ot(e[t]))try{delete e[t]}catch{e[t]=void 0}else if(e.dataset)try{delete e.dataset[t]}catch{e.dataset[t]=void 0}else e.removeAttribute("data-".concat(Ia(t)))}var Do=/\s\s*/,Fo=function(){var e=!1;if(bi){var t=!1,i=function(){},a=Object.defineProperty({},"once",{get:function(){return e=!0,t},set:function(o){t=o}});Fe.addEventListener("test",i,a),Fe.removeEventListener("test",i,a)}return e}();function Pe(e,t,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},n=i;t.trim().split(Do).forEach(function(o){if(!Fo){var l=e.listeners;l&&l[o]&&l[o][i]&&(n=l[o][i],delete l[o][i],Object.keys(l[o]).length===0&&delete l[o],Object.keys(l).length===0&&delete e.listeners)}e.removeEventListener(o,n,a)})}function Re(e,t,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},n=i;t.trim().split(Do).forEach(function(o){if(a.once&&!Fo){var l=e.listeners,r=l===void 0?{}:l;n=function(){delete r[o][i],e.removeEventListener(o,n,a);for(var p=arguments.length,c=new Array(p),d=0;dMath.abs(i)&&(i=m)})}),i}function gi(e,t){var i=e.pageX,a=e.pageY,n={endX:i,endY:a};return t?n:xo({startX:i,startY:a},n)}function Dp(e){var t=0,i=0,a=0;return oe(e,function(n){var o=n.startX,l=n.startY;t+=o,i+=l,a+=1}),t/=a,i/=a,{pageX:t,pageY:i}}function Ye(e){var t=e.aspectRatio,i=e.height,a=e.width,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"contain",o=To(a),l=To(i);if(o&&l){var r=i*t;n==="contain"&&r>a||n==="cover"&&r90?{width:s,height:r}:{width:r,height:s}}function zp(e,t,i,a){var n=t.aspectRatio,o=t.naturalWidth,l=t.naturalHeight,r=t.rotate,s=r===void 0?0:r,p=t.scaleX,c=p===void 0?1:p,d=t.scaleY,m=d===void 0?1:d,u=i.aspectRatio,f=i.naturalWidth,h=i.naturalHeight,g=a.fillColor,v=g===void 0?"transparent":g,E=a.imageSmoothingEnabled,T=E===void 0?!0:E,I=a.imageSmoothingQuality,y=I===void 0?"low":I,b=a.maxWidth,w=b===void 0?1/0:b,x=a.maxHeight,_=x===void 0?1/0:x,P=a.minWidth,O=P===void 0?0:P,M=a.minHeight,C=M===void 0?0:M,S=document.createElement("canvas"),F=S.getContext("2d"),R=Ye({aspectRatio:u,width:w,height:_}),L=Ye({aspectRatio:u,width:O,height:C},"cover"),z=Math.min(R.width,Math.max(L.width,f)),D=Math.min(R.height,Math.max(L.height,h)),k=Ye({aspectRatio:n,width:w,height:_}),B=Ye({aspectRatio:n,width:O,height:C},"cover"),X=Math.min(k.width,Math.max(B.width,o)),q=Math.min(k.height,Math.max(B.height,l)),Q=[-X/2,-q/2,X,q];return S.width=It(z),S.height=It(D),F.fillStyle=v,F.fillRect(0,0,z,D),F.save(),F.translate(z/2,D/2),F.rotate(s*Math.PI/180),F.scale(c,m),F.imageSmoothingEnabled=T,F.imageSmoothingQuality=y,F.drawImage.apply(F,[e].concat(_o(Q.map(function(pe){return Math.floor(It(pe))})))),F.restore(),S}var Co=String.fromCharCode;function Cp(e,t,i){var a="";i+=t;for(var n=t;n0;)i.push(Co.apply(null,Po(n.subarray(0,a)))),n=n.subarray(a);return"data:".concat(t,";base64,").concat(btoa(i.join("")))}function Vp(e){var t=new DataView(e),i;try{var a,n,o;if(t.getUint8(0)===255&&t.getUint8(1)===216)for(var l=t.byteLength,r=2;r+1=8&&(o=p+d)}}}if(o){var m=t.getUint16(o,a),u,f;for(f=0;f=0?o:Mo),height:Math.max(a.offsetHeight,l>=0?l:Oo)};this.containerData=r,je(n,{width:r.width,height:r.height}),de(t,be),De(n,be)},initCanvas:function(){var t=this.containerData,i=this.imageData,a=this.options.viewMode,n=Math.abs(i.rotate)%180===90,o=n?i.naturalHeight:i.naturalWidth,l=n?i.naturalWidth:i.naturalHeight,r=o/l,s=t.width,p=t.height;t.height*r>t.width?a===3?s=t.height*r:p=t.width/r:a===3?p=t.width/r:s=t.height*r;var c={aspectRatio:r,naturalWidth:o,naturalHeight:l,width:s,height:p};this.canvasData=c,this.limited=a===1||a===2,this.limitCanvas(!0,!0),c.width=Math.min(Math.max(c.width,c.minWidth),c.maxWidth),c.height=Math.min(Math.max(c.height,c.minHeight),c.maxHeight),c.left=(t.width-c.width)/2,c.top=(t.height-c.height)/2,c.oldLeft=c.left,c.oldTop=c.top,this.initialCanvasData=J({},c)},limitCanvas:function(t,i){var a=this.options,n=this.containerData,o=this.canvasData,l=this.cropBoxData,r=a.viewMode,s=o.aspectRatio,p=this.cropped&&l;if(t){var c=Number(a.minCanvasWidth)||0,d=Number(a.minCanvasHeight)||0;r>1?(c=Math.max(c,n.width),d=Math.max(d,n.height),r===3&&(d*s>c?c=d*s:d=c/s)):r>0&&(c?c=Math.max(c,p?l.width:0):d?d=Math.max(d,p?l.height:0):p&&(c=l.width,d=l.height,d*s>c?c=d*s:d=c/s));var m=Ye({aspectRatio:s,width:c,height:d});c=m.width,d=m.height,o.minWidth=c,o.minHeight=d,o.maxWidth=1/0,o.maxHeight=1/0}if(i)if(r>(p?0:1)){var u=n.width-o.width,f=n.height-o.height;o.minLeft=Math.min(0,u),o.minTop=Math.min(0,f),o.maxLeft=Math.max(0,u),o.maxTop=Math.max(0,f),p&&this.limited&&(o.minLeft=Math.min(l.left,l.left+(l.width-o.width)),o.minTop=Math.min(l.top,l.top+(l.height-o.height)),o.maxLeft=l.left,o.maxTop=l.top,r===2&&(o.width>=n.width&&(o.minLeft=Math.min(0,u),o.maxLeft=Math.max(0,u)),o.height>=n.height&&(o.minTop=Math.min(0,f),o.maxTop=Math.max(0,f))))}else o.minLeft=-o.width,o.minTop=-o.height,o.maxLeft=n.width,o.maxTop=n.height},renderCanvas:function(t,i){var a=this.canvasData,n=this.imageData;if(i){var o=Fp({width:n.naturalWidth*Math.abs(n.scaleX||1),height:n.naturalHeight*Math.abs(n.scaleY||1),degree:n.rotate||0}),l=o.width,r=o.height,s=a.width*(l/a.naturalWidth),p=a.height*(r/a.naturalHeight);a.left-=(s-a.width)/2,a.top-=(p-a.height)/2,a.width=s,a.height=p,a.aspectRatio=l/r,a.naturalWidth=l,a.naturalHeight=r,this.limitCanvas(!0,!1)}(a.width>a.maxWidth||a.widtha.maxHeight||a.heighti.width?o.height=o.width/a:o.width=o.height*a),this.cropBoxData=o,this.limitCropBox(!0,!0),o.width=Math.min(Math.max(o.width,o.minWidth),o.maxWidth),o.height=Math.min(Math.max(o.height,o.minHeight),o.maxHeight),o.width=Math.max(o.minWidth,o.width*n),o.height=Math.max(o.minHeight,o.height*n),o.left=i.left+(i.width-o.width)/2,o.top=i.top+(i.height-o.height)/2,o.oldLeft=o.left,o.oldTop=o.top,this.initialCropBoxData=J({},o)},limitCropBox:function(t,i){var a=this.options,n=this.containerData,o=this.canvasData,l=this.cropBoxData,r=this.limited,s=a.aspectRatio;if(t){var p=Number(a.minCropBoxWidth)||0,c=Number(a.minCropBoxHeight)||0,d=r?Math.min(n.width,o.width,o.width+o.left,n.width-o.left):n.width,m=r?Math.min(n.height,o.height,o.height+o.top,n.height-o.top):n.height;p=Math.min(p,n.width),c=Math.min(c,n.height),s&&(p&&c?c*s>p?c=p/s:p=c*s:p?c=p/s:c&&(p=c*s),m*s>d?m=d/s:d=m*s),l.minWidth=Math.min(p,d),l.minHeight=Math.min(c,m),l.maxWidth=d,l.maxHeight=m}i&&(r?(l.minLeft=Math.max(0,o.left),l.minTop=Math.max(0,o.top),l.maxLeft=Math.min(n.width,o.left+o.width)-l.width,l.maxTop=Math.min(n.height,o.top+o.height)-l.height):(l.minLeft=0,l.minTop=0,l.maxLeft=n.width-l.width,l.maxTop=n.height-l.height))},renderCropBox:function(){var t=this.options,i=this.containerData,a=this.cropBoxData;(a.width>a.maxWidth||a.widtha.maxHeight||a.height=i.width&&a.height>=i.height?wo:Ta),je(this.cropBox,J({width:a.width,height:a.height},Vt({translateX:a.left,translateY:a.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),xt(this.element,pa,this.getData())}},Wp={initPreview:function(){var t=this.element,i=this.crossOrigin,a=this.options.preview,n=i?this.crossOriginUrl:this.url,o=t.alt||"The image to preview",l=document.createElement("img");if(i&&(l.crossOrigin=i),l.src=n,l.alt=o,this.viewBox.appendChild(l),this.viewBoxImage=l,!!a){var r=a;typeof a=="string"?r=t.ownerDocument.querySelectorAll(a):a.querySelector&&(r=[a]),this.previews=r,oe(r,function(s){var p=document.createElement("img");Ut(s,hi,{width:s.offsetWidth,height:s.offsetHeight,html:s.innerHTML}),i&&(p.crossOrigin=i),p.src=n,p.alt=o,p.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',s.innerHTML="",s.appendChild(p)})}},resetPreview:function(){oe(this.previews,function(t){var i=ga(t,hi);je(t,{width:i.width,height:i.height}),t.innerHTML=i.html,Mp(t,hi)})},preview:function(){var t=this.imageData,i=this.canvasData,a=this.cropBoxData,n=a.width,o=a.height,l=t.width,r=t.height,s=a.left-i.left-t.left,p=a.top-i.top-t.top;!this.cropped||this.disabled||(je(this.viewBoxImage,J({width:l,height:r},Vt(J({translateX:-s,translateY:-p},t)))),oe(this.previews,function(c){var d=ga(c,hi),m=d.width,u=d.height,f=m,h=u,g=1;n&&(g=m/n,h=o*g),o&&h>u&&(g=u/o,f=n*g,h=u),je(c,{width:f,height:h}),je(c.getElementsByTagName("img")[0],J({width:l*g,height:r*g},Vt(J({translateX:-s*g,translateY:-p*g},t))))}))}},Hp={bind:function(){var t=this.element,i=this.options,a=this.cropper;Ee(i.cropstart)&&Re(t,fa,i.cropstart),Ee(i.cropmove)&&Re(t,ua,i.cropmove),Ee(i.cropend)&&Re(t,ma,i.cropend),Ee(i.crop)&&Re(t,pa,i.crop),Ee(i.zoom)&&Re(t,ha,i.zoom),Re(a,po,this.onCropStart=this.cropStart.bind(this)),i.zoomable&&i.zoomOnWheel&&Re(a,go,this.onWheel=this.wheel.bind(this),{passive:!1,capture:!0}),i.toggleDragModeOnDblclick&&Re(a,co,this.onDblclick=this.dblclick.bind(this)),Re(t.ownerDocument,mo,this.onCropMove=this.cropMove.bind(this)),Re(t.ownerDocument,uo,this.onCropEnd=this.cropEnd.bind(this)),i.responsive&&Re(window,ho,this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,i=this.options,a=this.cropper;Ee(i.cropstart)&&Pe(t,fa,i.cropstart),Ee(i.cropmove)&&Pe(t,ua,i.cropmove),Ee(i.cropend)&&Pe(t,ma,i.cropend),Ee(i.crop)&&Pe(t,pa,i.crop),Ee(i.zoom)&&Pe(t,ha,i.zoom),Pe(a,po,this.onCropStart),i.zoomable&&i.zoomOnWheel&&Pe(a,go,this.onWheel,{passive:!1,capture:!0}),i.toggleDragModeOnDblclick&&Pe(a,co,this.onDblclick),Pe(t.ownerDocument,mo,this.onCropMove),Pe(t.ownerDocument,uo,this.onCropEnd),i.responsive&&Pe(window,ho,this.onResize)}},jp={resize:function(){if(!this.disabled){var t=this.options,i=this.container,a=this.containerData,n=i.offsetWidth/a.width,o=i.offsetHeight/a.height,l=Math.abs(n-1)>Math.abs(o-1)?n:o;if(l!==1){var r,s;t.restore&&(r=this.getCanvasData(),s=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(oe(r,function(p,c){r[c]=p*l})),this.setCropBoxData(oe(s,function(p,c){s[c]=p*l})))}}},dblclick:function(){this.disabled||this.options.dragMode===Ao||this.setDragMode(Lp(this.dragBox,ca)?Lo:va)},wheel:function(t){var i=this,a=Number(this.options.wheelZoomRatio)||.1,n=1;this.disabled||(t.preventDefault(),!this.wheeling&&(this.wheeling=!0,setTimeout(function(){i.wheeling=!1},50),t.deltaY?n=t.deltaY>0?1:-1:t.wheelDelta?n=-t.wheelDelta/120:t.detail&&(n=t.detail>0?1:-1),this.zoom(-n*a,t)))},cropStart:function(t){var i=t.buttons,a=t.button;if(!(this.disabled||(t.type==="mousedown"||t.type==="pointerdown"&&t.pointerType==="mouse")&&(j(i)&&i!==1||j(a)&&a!==0||t.ctrlKey))){var n=this.options,o=this.pointers,l;t.changedTouches?oe(t.changedTouches,function(r){o[r.identifier]=gi(r)}):o[t.pointerId||0]=gi(t),Object.keys(o).length>1&&n.zoomable&&n.zoomOnTouch?l=So:l=ga(t.target,Gt),bp.test(l)&&xt(this.element,fa,{originalEvent:t,action:l})!==!1&&(t.preventDefault(),this.action=l,this.cropping=!1,l===Ro&&(this.cropping=!0,de(this.dragBox,Ei)))}},cropMove:function(t){var i=this.action;if(!(this.disabled||!i)){var a=this.pointers;t.preventDefault(),xt(this.element,ua,{originalEvent:t,action:i})!==!1&&(t.changedTouches?oe(t.changedTouches,function(n){J(a[n.identifier]||{},gi(n,!0))}):J(a[t.pointerId||0]||{},gi(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var i=this.action,a=this.pointers;t.changedTouches?oe(t.changedTouches,function(n){delete a[n.identifier]}):delete a[t.pointerId||0],i&&(t.preventDefault(),Object.keys(a).length||(this.action=""),this.cropping&&(this.cropping=!1,vt(this.dragBox,Ei,this.cropped&&this.options.modal)),xt(this.element,ma,{originalEvent:t,action:i}))}}},Yp={change:function(t){var i=this.options,a=this.canvasData,n=this.containerData,o=this.cropBoxData,l=this.pointers,r=this.action,s=i.aspectRatio,p=o.left,c=o.top,d=o.width,m=o.height,u=p+d,f=c+m,h=0,g=0,v=n.width,E=n.height,T=!0,I;!s&&t.shiftKey&&(s=d&&m?d/m:1),this.limited&&(h=o.minLeft,g=o.minTop,v=h+Math.min(n.width,a.width,a.left+a.width),E=g+Math.min(n.height,a.height,a.top+a.height));var y=l[Object.keys(l)[0]],b={x:y.endX-y.startX,y:y.endY-y.startY},w=function(_){switch(_){case at:u+b.x>v&&(b.x=v-u);break;case nt:p+b.xE&&(b.y=E-f);break}};switch(r){case Ta:p+=b.x,c+=b.y;break;case at:if(b.x>=0&&(u>=v||s&&(c<=g||f>=E))){T=!1;break}w(at),d+=b.x,d<0&&(r=nt,d=-d,p-=d),s&&(m=d/s,c+=(o.height-m)/2);break;case He:if(b.y<=0&&(c<=g||s&&(p<=h||u>=v))){T=!1;break}w(He),m-=b.y,c+=b.y,m<0&&(r=bt,m=-m,c-=m),s&&(d=m*s,p+=(o.width-d)/2);break;case nt:if(b.x<=0&&(p<=h||s&&(c<=g||f>=E))){T=!1;break}w(nt),d-=b.x,p+=b.x,d<0&&(r=at,d=-d,p-=d),s&&(m=d/s,c+=(o.height-m)/2);break;case bt:if(b.y>=0&&(f>=E||s&&(p<=h||u>=v))){T=!1;break}w(bt),m+=b.y,m<0&&(r=He,m=-m,c-=m),s&&(d=m*s,p+=(o.width-d)/2);break;case Ct:if(s){if(b.y<=0&&(c<=g||u>=v)){T=!1;break}w(He),m-=b.y,c+=b.y,d=m*s}else w(He),w(at),b.x>=0?ug&&(m-=b.y,c+=b.y):(m-=b.y,c+=b.y);d<0&&m<0?(r=kt,m=-m,d=-d,c-=m,p-=d):d<0?(r=Nt,d=-d,p-=d):m<0&&(r=Bt,m=-m,c-=m);break;case Nt:if(s){if(b.y<=0&&(c<=g||p<=h)){T=!1;break}w(He),m-=b.y,c+=b.y,d=m*s,p+=o.width-d}else w(He),w(nt),b.x<=0?p>h?(d-=b.x,p+=b.x):b.y<=0&&c<=g&&(T=!1):(d-=b.x,p+=b.x),b.y<=0?c>g&&(m-=b.y,c+=b.y):(m-=b.y,c+=b.y);d<0&&m<0?(r=Bt,m=-m,d=-d,c-=m,p-=d):d<0?(r=Ct,d=-d,p-=d):m<0&&(r=kt,m=-m,c-=m);break;case kt:if(s){if(b.x<=0&&(p<=h||f>=E)){T=!1;break}w(nt),d-=b.x,p+=b.x,m=d/s}else w(bt),w(nt),b.x<=0?p>h?(d-=b.x,p+=b.x):b.y>=0&&f>=E&&(T=!1):(d-=b.x,p+=b.x),b.y>=0?f=0&&(u>=v||f>=E)){T=!1;break}w(at),d+=b.x,m=d/s}else w(bt),w(at),b.x>=0?u=0&&f>=E&&(T=!1):d+=b.x,b.y>=0?f0?r=b.y>0?Bt:Ct:b.x<0&&(p-=d,r=b.y>0?kt:Nt),b.y<0&&(c-=m),this.cropped||(De(this.cropBox,be),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0));break}T&&(o.width=d,o.height=m,o.left=p,o.top=c,this.action=r,this.renderCropBox()),oe(l,function(x){x.startX=x.endX,x.startY=x.endY})}},qp={crop:function(){return this.ready&&!this.cropped&&!this.disabled&&(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&de(this.dragBox,Ei),De(this.cropBox,be),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=J({},this.initialImageData),this.canvasData=J({},this.initialCanvasData),this.cropBoxData=J({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(J(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),De(this.dragBox,Ei),de(this.cropBox,be)),this},replace:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return!this.disabled&&t&&(this.isImg&&(this.element.src=t),i?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,oe(this.previews,function(a){a.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,De(this.cropper,ro)),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,de(this.cropper,ro)),this},destroy:function(){var t=this.element;return t[K]?(t[K]=void 0,this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),this):this},move:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.canvasData,n=a.left,o=a.top;return this.moveTo(oa(t)?t:n+Number(t),oa(i)?i:o+Number(i))},moveTo:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.canvasData,n=!1;return t=Number(t),i=Number(i),this.ready&&!this.disabled&&this.options.movable&&(j(t)&&(a.left=t,n=!0),j(i)&&(a.top=i,n=!0),n&&this.renderCanvas(!0)),this},zoom:function(t,i){var a=this.canvasData;return t=Number(t),t<0?t=1/(1-t):t=1+t,this.zoomTo(a.width*t/a.naturalWidth,null,i)},zoomTo:function(t,i,a){var n=this.options,o=this.canvasData,l=o.width,r=o.height,s=o.naturalWidth,p=o.naturalHeight;if(t=Number(t),t>=0&&this.ready&&!this.disabled&&n.zoomable){var c=s*t,d=p*t;if(xt(this.element,ha,{ratio:t,oldRatio:l/s,originalEvent:a})===!1)return this;if(a){var m=this.pointers,u=zo(this.cropper),f=m&&Object.keys(m).length?Dp(m):{pageX:a.pageX,pageY:a.pageY};o.left-=(c-l)*((f.pageX-u.left-o.left)/l),o.top-=(d-r)*((f.pageY-u.top-o.top)/r)}else Tt(i)&&j(i.x)&&j(i.y)?(o.left-=(c-l)*((i.x-o.left)/l),o.top-=(d-r)*((i.y-o.top)/r)):(o.left-=(c-l)/2,o.top-=(d-r)/2);o.width=c,o.height=d,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return t=Number(t),j(t)&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var i=this.imageData.scaleY;return this.scale(t,j(i)?i:1)},scaleY:function(t){var i=this.imageData.scaleX;return this.scale(j(i)?i:1,t)},scale:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.imageData,n=!1;return t=Number(t),i=Number(i),this.ready&&!this.disabled&&this.options.scalable&&(j(t)&&(a.scaleX=t,n=!0),j(i)&&(a.scaleY=i,n=!0),n&&this.renderCanvas(!0,!0)),this},getData:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,i=this.options,a=this.imageData,n=this.canvasData,o=this.cropBoxData,l;if(this.ready&&this.cropped){l={x:o.left-n.left,y:o.top-n.top,width:o.width,height:o.height};var r=a.width/a.naturalWidth;if(oe(l,function(c,d){l[d]=c/r}),t){var s=Math.round(l.y+l.height),p=Math.round(l.x+l.width);l.x=Math.round(l.x),l.y=Math.round(l.y),l.width=p-l.x,l.height=s-l.y}}else l={x:0,y:0,width:0,height:0};return i.rotatable&&(l.rotate=a.rotate||0),i.scalable&&(l.scaleX=a.scaleX||1,l.scaleY=a.scaleY||1),l},setData:function(t){var i=this.options,a=this.imageData,n=this.canvasData,o={};if(this.ready&&!this.disabled&&Tt(t)){var l=!1;i.rotatable&&j(t.rotate)&&t.rotate!==a.rotate&&(a.rotate=t.rotate,l=!0),i.scalable&&(j(t.scaleX)&&t.scaleX!==a.scaleX&&(a.scaleX=t.scaleX,l=!0),j(t.scaleY)&&t.scaleY!==a.scaleY&&(a.scaleY=t.scaleY,l=!0)),l&&this.renderCanvas(!0,!0);var r=a.width/a.naturalWidth;j(t.x)&&(o.left=t.x*r+n.left),j(t.y)&&(o.top=t.y*r+n.top),j(t.width)&&(o.width=t.width*r),j(t.height)&&(o.height=t.height*r),this.setCropBoxData(o)}return this},getContainerData:function(){return this.ready?J({},this.containerData):{}},getImageData:function(){return this.sized?J({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,i={};return this.ready&&oe(["left","top","width","height","naturalWidth","naturalHeight"],function(a){i[a]=t[a]}),i},setCanvasData:function(t){var i=this.canvasData,a=i.aspectRatio;return this.ready&&!this.disabled&&Tt(t)&&(j(t.left)&&(i.left=t.left),j(t.top)&&(i.top=t.top),j(t.width)?(i.width=t.width,i.height=t.width/a):j(t.height)&&(i.height=t.height,i.width=t.height*a),this.renderCanvas(!0)),this},getCropBoxData:function(){var t=this.cropBoxData,i;return this.ready&&this.cropped&&(i={left:t.left,top:t.top,width:t.width,height:t.height}),i||{}},setCropBoxData:function(t){var i=this.cropBoxData,a=this.options.aspectRatio,n,o;return this.ready&&this.cropped&&!this.disabled&&Tt(t)&&(j(t.left)&&(i.left=t.left),j(t.top)&&(i.top=t.top),j(t.width)&&t.width!==i.width&&(n=!0,i.width=t.width),j(t.height)&&t.height!==i.height&&(o=!0,i.height=t.height),a&&(n?i.height=i.width/a:o&&(i.width=i.height*a)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var i=this.canvasData,a=zp(this.image,this.imageData,i,t);if(!this.cropped)return a;var n=this.getData(t.rounded),o=n.x,l=n.y,r=n.width,s=n.height,p=a.width/Math.floor(i.naturalWidth);p!==1&&(o*=p,l*=p,r*=p,s*=p);var c=r/s,d=Ye({aspectRatio:c,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),m=Ye({aspectRatio:c,width:t.minWidth||0,height:t.minHeight||0},"cover"),u=Ye({aspectRatio:c,width:t.width||(p!==1?a.width:r),height:t.height||(p!==1?a.height:s)}),f=u.width,h=u.height;f=Math.min(d.width,Math.max(m.width,f)),h=Math.min(d.height,Math.max(m.height,h));var g=document.createElement("canvas"),v=g.getContext("2d");g.width=It(f),g.height=It(h),v.fillStyle=t.fillColor||"transparent",v.fillRect(0,0,f,h);var E=t.imageSmoothingEnabled,T=E===void 0?!0:E,I=t.imageSmoothingQuality;v.imageSmoothingEnabled=T,I&&(v.imageSmoothingQuality=I);var y=a.width,b=a.height,w=o,x=l,_,P,O,M,C,S;w<=-r||w>y?(w=0,_=0,O=0,C=0):w<=0?(O=-w,w=0,_=Math.min(y,r+w),C=_):w<=y&&(O=0,_=Math.min(r,y-w),C=_),_<=0||x<=-s||x>b?(x=0,P=0,M=0,S=0):x<=0?(M=-x,x=0,P=Math.min(b,s+x),S=P):x<=b&&(M=0,P=Math.min(s,b-x),S=P);var F=[w,x,_,P];if(C>0&&S>0){var R=f/r;F.push(O*R,M*R,C*R,S*R)}return v.drawImage.apply(v,[a].concat(_o(F.map(function(L){return Math.floor(It(L))})))),g},setAspectRatio:function(t){var i=this.options;return!this.disabled&&!oa(t)&&(i.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var i=this.options,a=this.dragBox,n=this.face;if(this.ready&&!this.disabled){var o=t===va,l=i.movable&&t===Lo;t=o||l?t:Ao,i.dragMode=t,Ut(a,Gt,t),vt(a,ca,o),vt(a,da,l),i.cropBoxMovable||(Ut(n,Gt,t),vt(n,ca,o),vt(n,da,l))}return this}},$p=Fe.Cropper,xa=function(){function e(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(rp(this,e),!t||!Ip.test(t.tagName))throw new Error("The first argument is required and must be an or element.");this.element=t,this.options=J({},bo,Tt(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return sp(e,[{key:"init",value:function(){var i=this.element,a=i.tagName.toLowerCase(),n;if(!i[K]){if(i[K]=this,a==="img"){if(this.isImg=!0,n=i.getAttribute("src")||"",this.originalUrl=n,!n)return;n=i.src}else a==="canvas"&&window.HTMLCanvasElement&&(n=i.toDataURL());this.load(n)}}},{key:"load",value:function(i){var a=this;if(i){this.url=i,this.imageData={};var n=this.element,o=this.options;if(!o.rotatable&&!o.scalable&&(o.checkOrientation=!1),!o.checkOrientation||!window.ArrayBuffer){this.clone();return}if(Tp.test(i)){vp.test(i)?this.read(Bp(i)):this.clone();return}var l=new XMLHttpRequest,r=this.clone.bind(this);this.reloading=!0,this.xhr=l,l.onabort=r,l.onerror=r,l.ontimeout=r,l.onprogress=function(){l.getResponseHeader("content-type")!==Eo&&l.abort()},l.onload=function(){a.read(l.response)},l.onloadend=function(){a.reloading=!1,a.xhr=null},o.checkCrossOrigin&&vo(i)&&n.crossOrigin&&(i=Io(i)),l.open("GET",i,!0),l.responseType="arraybuffer",l.withCredentials=n.crossOrigin==="use-credentials",l.send()}}},{key:"read",value:function(i){var a=this.options,n=this.imageData,o=Vp(i),l=0,r=1,s=1;if(o>1){this.url=kp(i,Eo);var p=Gp(o);l=p.rotate,r=p.scaleX,s=p.scaleY}a.rotatable&&(n.rotate=l),a.scalable&&(n.scaleX=r,n.scaleY=s),this.clone()}},{key:"clone",value:function(){var i=this.element,a=this.url,n=i.crossOrigin,o=a;this.options.checkCrossOrigin&&vo(a)&&(n||(n="anonymous"),o=Io(a)),this.crossOrigin=n,this.crossOriginUrl=o;var l=document.createElement("img");n&&(l.crossOrigin=n),l.src=o||a,l.alt=i.alt||"The image to crop",this.image=l,l.onload=this.start.bind(this),l.onerror=this.stop.bind(this),de(l,so),i.parentNode.insertBefore(l,i.nextSibling)}},{key:"start",value:function(){var i=this,a=this.image;a.onload=null,a.onerror=null,this.sizing=!0;var n=Fe.navigator&&/(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(Fe.navigator.userAgent),o=function(p,c){J(i.imageData,{naturalWidth:p,naturalHeight:c,aspectRatio:p/c}),i.initialImageData=J({},i.imageData),i.sizing=!1,i.sized=!0,i.build()};if(a.naturalWidth&&!n){o(a.naturalWidth,a.naturalHeight);return}var l=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=l,l.onload=function(){o(l.width,l.height),n||r.removeChild(l)},l.src=a.src,n||(l.style.cssText="left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;",r.appendChild(l))}},{key:"stop",value:function(){var i=this.image;i.onload=null,i.onerror=null,i.parentNode.removeChild(i),this.image=null}},{key:"build",value:function(){if(!(!this.sized||this.ready)){var i=this.element,a=this.options,n=this.image,o=i.parentNode,l=document.createElement("div");l.innerHTML=xp;var r=l.querySelector(".".concat(K,"-container")),s=r.querySelector(".".concat(K,"-canvas")),p=r.querySelector(".".concat(K,"-drag-box")),c=r.querySelector(".".concat(K,"-crop-box")),d=c.querySelector(".".concat(K,"-face"));this.container=o,this.cropper=r,this.canvas=s,this.dragBox=p,this.cropBox=c,this.viewBox=r.querySelector(".".concat(K,"-view-box")),this.face=d,s.appendChild(n),de(i,be),o.insertBefore(r,i.nextSibling),De(n,so),this.initPreview(),this.bind(),a.initialAspectRatio=Math.max(0,a.initialAspectRatio)||NaN,a.aspectRatio=Math.max(0,a.aspectRatio)||NaN,a.viewMode=Math.max(0,Math.min(3,Math.round(a.viewMode)))||0,de(c,be),a.guides||de(c.getElementsByClassName("".concat(K,"-dashed")),be),a.center||de(c.getElementsByClassName("".concat(K,"-center")),be),a.background&&de(r,"".concat(K,"-bg")),a.highlight||de(d,fp),a.cropBoxMovable&&(de(d,da),Ut(d,Gt,Ta)),a.cropBoxResizable||(de(c.getElementsByClassName("".concat(K,"-line")),be),de(c.getElementsByClassName("".concat(K,"-point")),be)),this.render(),this.ready=!0,this.setDragMode(a.dragMode),a.autoCrop&&this.crop(),this.setData(a.data),Ee(a.ready)&&Re(i,fo,a.ready,{once:!0}),xt(i,fo)}}},{key:"unbuild",value:function(){if(this.ready){this.ready=!1,this.unbind(),this.resetPreview();var i=this.cropper.parentNode;i&&i.removeChild(this.cropper),De(this.element,be)}}},{key:"uncreate",value:function(){this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?(this.xhr.onabort=null,this.xhr.abort()):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=$p,e}},{key:"setDefaults",value:function(i){J(bo,Tt(i)&&i)}}])}();J(xa.prototype,Up,Wp,Hp,jp,Yp,qp);var No={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(No);var Bo=No;var ko={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(ko);var Vo=ko;var we=function(e,t,i,a){if(i==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof t=="function"?e!==t||!a:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?a:i==="a"?a.call(e):a?a.value:t.get(e)},yt,Wt,lt,ya=class{constructor(...t){yt.set(this,new Map),Wt.set(this,new Map),lt.set(this,new Map);for(let i of t)this.define(i)}define(t,i=!1){for(let[a,n]of Object.entries(t)){a=a.toLowerCase(),n=n.map(r=>r.toLowerCase()),we(this,lt,"f").has(a)||we(this,lt,"f").set(a,new Set);let o=we(this,lt,"f").get(a),l=!0;for(let r of n){let s=r.startsWith("*");if(r=s?r.slice(1):r,o?.add(r),l&&we(this,Wt,"f").set(a,r),l=!1,s)continue;let p=we(this,yt,"f").get(r);if(p&&p!=a&&!i)throw new Error(`"${a} -> ${r}" conflicts with "${p} -> ${r}". Pass \`force=true\` to override this definition.`);we(this,yt,"f").set(r,a)}}return this}getType(t){if(typeof t!="string")return null;let i=t.replace(/^.*[/\\]/,"").toLowerCase(),a=i.replace(/^.*\./,"").toLowerCase(),n=i.length{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let t of we(this,lt,"f").values())Object.freeze(t);return this}_getTestState(){return{types:we(this,yt,"f"),extensions:we(this,Wt,"f")}}};yt=new WeakMap,Wt=new WeakMap,lt=new WeakMap;var _a=ya;var Go=new _a(Vo,Bo)._freeze();var Uo=({addFilter:e,utils:t})=>{let{Type:i,replaceInString:a,toNaturalFileSize:n}=t;return e("ALLOW_HOPPER_ITEM",(o,{query:l})=>{if(!l("GET_ALLOW_FILE_SIZE_VALIDATION"))return!0;let r=l("GET_MAX_FILE_SIZE");if(r!==null&&o.size>r)return!1;let s=l("GET_MIN_FILE_SIZE");return!(s!==null&&o.sizenew Promise((r,s)=>{if(!l("GET_ALLOW_FILE_SIZE_VALIDATION"))return r(o);let p=l("GET_FILE_VALIDATE_SIZE_FILTER");if(p&&!p(o))return r(o);let c=l("GET_MAX_FILE_SIZE");if(c!==null&&o.size>c){s({status:{main:l("GET_LABEL_MAX_FILE_SIZE_EXCEEDED"),sub:a(l("GET_LABEL_MAX_FILE_SIZE"),{filesize:n(c,".",l("GET_FILE_SIZE_BASE"),l("GET_FILE_SIZE_LABELS",l))})}});return}let d=l("GET_MIN_FILE_SIZE");if(d!==null&&o.sizef+h.fileSize,0)>m){s({status:{main:l("GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED"),sub:a(l("GET_LABEL_MAX_TOTAL_FILE_SIZE"),{filesize:n(m,".",l("GET_FILE_SIZE_BASE"),l("GET_FILE_SIZE_LABELS",l))})}});return}r(o)})),{options:{allowFileSizeValidation:[!0,i.BOOLEAN],maxFileSize:[null,i.INT],minFileSize:[null,i.INT],maxTotalFileSize:[null,i.INT],fileValidateSizeFilter:[null,i.FUNCTION],labelMinFileSizeExceeded:["File is too small",i.STRING],labelMinFileSize:["Minimum file size is {filesize}",i.STRING],labelMaxFileSizeExceeded:["File is too large",i.STRING],labelMaxFileSize:["Maximum file size is {filesize}",i.STRING],labelMaxTotalFileSizeExceeded:["Maximum total size exceeded",i.STRING],labelMaxTotalFileSize:["Maximum total file size is {filesize}",i.STRING]}}},Xp=typeof window<"u"&&typeof window.document<"u";Xp&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Uo}));var Wo=Uo;var Ho=({addFilter:e,utils:t})=>{let{Type:i,isString:a,replaceInString:n,guesstimateMimeType:o,getExtensionFromFilename:l,getFilenameFromURL:r}=t,s=(u,f)=>{let h=(/^[^/]+/.exec(u)||[]).pop(),g=f.slice(0,-2);return h===g},p=(u,f)=>u.some(h=>/\*$/.test(h)?s(f,h):h===f),c=u=>{let f="";if(a(u)){let h=r(u),g=l(h);g&&(f=o(g))}else f=u.type;return f},d=(u,f,h)=>{if(f.length===0)return!0;let g=c(u);return h?new Promise((v,E)=>{h(u,g).then(T=>{p(f,T)?v():E()}).catch(E)}):p(f,g)},m=u=>f=>u[f]===null?!1:u[f]||f;return e("SET_ATTRIBUTE_TO_OPTION_MAP",u=>Object.assign(u,{accept:"acceptedFileTypes"})),e("ALLOW_HOPPER_ITEM",(u,{query:f})=>f("GET_ALLOW_FILE_TYPE_VALIDATION")?d(u,f("GET_ACCEPTED_FILE_TYPES")):!0),e("LOAD_FILE",(u,{query:f})=>new Promise((h,g)=>{if(!f("GET_ALLOW_FILE_TYPE_VALIDATION")){h(u);return}let v=f("GET_ACCEPTED_FILE_TYPES"),E=f("GET_FILE_VALIDATE_TYPE_DETECT_TYPE"),T=d(u,v,E),I=()=>{let y=v.map(m(f("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP"))).filter(w=>w!==!1),b=y.filter((w,x)=>y.indexOf(w)===x);g({status:{main:f("GET_LABEL_FILE_TYPE_NOT_ALLOWED"),sub:n(f("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES"),{allTypes:b.join(", "),allButLastType:b.slice(0,-1).join(", "),lastType:b[b.length-1]})}})};if(typeof T=="boolean")return T?h(u):I();T.then(()=>{h(u)}).catch(I)})),{options:{allowFileTypeValidation:[!0,i.BOOLEAN],acceptedFileTypes:[[],i.ARRAY],labelFileTypeNotAllowed:["File is of invalid type",i.STRING],fileValidateTypeLabelExpectedTypes:["Expects {allButLastType} or {lastType}",i.STRING],fileValidateTypeLabelExpectedTypesMap:[{},i.OBJECT],fileValidateTypeDetectType:[null,i.FUNCTION]}}},Qp=typeof window<"u"&&typeof window.document<"u";Qp&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Ho}));var jo=Ho;var Yo=e=>/^image/.test(e.type),qo=({addFilter:e,utils:t})=>{let{Type:i,isFile:a,getNumericAspectRatioFromString:n}=t,o=(p,c)=>!(!Yo(p.file)||!c("GET_ALLOW_IMAGE_CROP")),l=p=>typeof p=="object",r=p=>typeof p=="number",s=(p,c)=>p.setMetadata("crop",Object.assign({},p.getMetadata("crop"),c));return e("DID_CREATE_ITEM",(p,{query:c})=>{p.extend("setImageCrop",d=>{if(!(!o(p,c)||!l(center)))return p.setMetadata("crop",d),d}),p.extend("setImageCropCenter",d=>{if(!(!o(p,c)||!l(d)))return s(p,{center:d})}),p.extend("setImageCropZoom",d=>{if(!(!o(p,c)||!r(d)))return s(p,{zoom:Math.max(1,d)})}),p.extend("setImageCropRotation",d=>{if(!(!o(p,c)||!r(d)))return s(p,{rotation:d})}),p.extend("setImageCropFlip",d=>{if(!(!o(p,c)||!l(d)))return s(p,{flip:d})}),p.extend("setImageCropAspectRatio",d=>{if(!o(p,c)||typeof d>"u")return;let m=p.getMetadata("crop"),u=n(d),f={center:{x:.5,y:.5},flip:m?Object.assign({},m.flip):{horizontal:!1,vertical:!1},rotation:0,zoom:1,aspectRatio:u};return p.setMetadata("crop",f),f})}),e("DID_LOAD_ITEM",(p,{query:c})=>new Promise((d,m)=>{let u=p.file;if(!a(u)||!Yo(u)||!c("GET_ALLOW_IMAGE_CROP")||p.getMetadata("crop"))return d(p);let h=c("GET_IMAGE_CROP_ASPECT_RATIO");p.setMetadata("crop",{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},rotation:0,zoom:1,aspectRatio:h?n(h):null}),d(p)})),{options:{allowImageCrop:[!0,i.BOOLEAN],imageCropAspectRatio:[null,i.STRING]}}},Zp=typeof window<"u"&&typeof window.document<"u";Zp&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:qo}));var $o=qo;var Ra=e=>/^image/.test(e.type),Xo=e=>{let{addFilter:t,utils:i,views:a}=e,{Type:n,createRoute:o,createItemAPI:l=c=>c}=i,{fileActionButton:r}=a;t("SHOULD_REMOVE_ON_REVERT",(c,{item:d,query:m})=>new Promise(u=>{let{file:f}=d,h=m("GET_ALLOW_IMAGE_EDIT")&&m("GET_IMAGE_EDIT_ALLOW_EDIT")&&Ra(f);u(!h)})),t("DID_LOAD_ITEM",(c,{query:d,dispatch:m})=>new Promise((u,f)=>{if(c.origin>1){u(c);return}let{file:h}=c;if(!d("GET_ALLOW_IMAGE_EDIT")||!d("GET_IMAGE_EDIT_INSTANT_EDIT")){u(c);return}if(!Ra(h)){u(c);return}let g=(E,T,I)=>y=>{s.shift(),y?T(E):I(E),m("KICK"),v()},v=()=>{if(!s.length)return;let{item:E,resolve:T,reject:I}=s[0];m("EDIT_ITEM",{id:E.id,handleEditorResponse:g(E,T,I)})};p({item:c,resolve:u,reject:f}),s.length===1&&v()})),t("DID_CREATE_ITEM",(c,{query:d,dispatch:m})=>{c.extend("edit",()=>{m("EDIT_ITEM",{id:c.id})})});let s=[],p=c=>(s.push(c),c);return t("CREATE_VIEW",c=>{let{is:d,view:m,query:u}=c;if(!u("GET_ALLOW_IMAGE_EDIT"))return;let f=u("GET_ALLOW_IMAGE_PREVIEW");if(!(d("file-info")&&!f||d("file")&&f))return;let g=u("GET_IMAGE_EDIT_EDITOR");if(!g)return;g.filepondCallbackBridge||(g.outputData=!0,g.outputFile=!1,g.filepondCallbackBridge={onconfirm:g.onconfirm||(()=>{}),oncancel:g.oncancel||(()=>{})});let v=({root:I,props:y,action:b})=>{let{id:w}=y,{handleEditorResponse:x}=b;g.cropAspectRatio=I.query("GET_IMAGE_CROP_ASPECT_RATIO")||g.cropAspectRatio,g.outputCanvasBackgroundColor=I.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||g.outputCanvasBackgroundColor;let _=I.query("GET_ITEM",w);if(!_)return;let P=_.file,O=_.getMetadata("crop"),M={center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},C=_.getMetadata("resize"),S=_.getMetadata("filter")||null,F=_.getMetadata("filters")||null,R=_.getMetadata("colors")||null,L=_.getMetadata("markup")||null,z={crop:O||M,size:C?{upscale:C.upscale,mode:C.mode,width:C.size.width,height:C.size.height}:null,filter:F?F.id||F.matrix:I.query("GET_ALLOW_IMAGE_FILTER")&&I.query("GET_IMAGE_FILTER_COLOR_MATRIX")&&!R?S:null,color:R,markup:L};g.onconfirm=({data:D})=>{let{crop:k,size:B,filter:X,color:q,colorMatrix:Q,markup:pe}=D,G={};if(k&&(G.crop=k),B){let H=(_.getMetadata("resize")||{}).size,Y={width:B.width,height:B.height};!(Y.width&&Y.height)&&H&&(Y.width=H.width,Y.height=H.height),(Y.width||Y.height)&&(G.resize={upscale:B.upscale,mode:B.mode,size:Y})}pe&&(G.markup=pe),G.colors=q,G.filters=X,G.filter=Q,_.setMetadata(G),g.filepondCallbackBridge.onconfirm(D,l(_)),x&&(g.onclose=()=>{x(!0),g.onclose=null})},g.oncancel=()=>{g.filepondCallbackBridge.oncancel(l(_)),x&&(g.onclose=()=>{x(!1),g.onclose=null})},g.open(P,z)},E=({root:I,props:y})=>{if(!u("GET_IMAGE_EDIT_ALLOW_EDIT"))return;let{id:b}=y,w=u("GET_ITEM",b);if(!w)return;let x=w.file;if(Ra(x))if(I.ref.handleEdit=_=>{_.stopPropagation(),I.dispatch("EDIT_ITEM",{id:b})},f){let _=m.createChildView(r,{label:"edit",icon:u("GET_IMAGE_EDIT_ICON_EDIT"),opacity:0});_.element.classList.add("filepond--action-edit-item"),_.element.dataset.align=u("GET_STYLE_IMAGE_EDIT_BUTTON_EDIT_ITEM_POSITION"),_.on("click",I.ref.handleEdit),I.ref.buttonEditItem=m.appendChildView(_)}else{let _=m.element.querySelector(".filepond--file-info-main"),P=document.createElement("button");P.className="filepond--action-edit-item-alt",P.innerHTML=u("GET_IMAGE_EDIT_ICON_EDIT")+"edit",P.addEventListener("click",I.ref.handleEdit),_.appendChild(P),I.ref.editButton=P}};m.registerDestroyer(({root:I})=>{I.ref.buttonEditItem&&I.ref.buttonEditItem.off("click",I.ref.handleEdit),I.ref.editButton&&I.ref.editButton.removeEventListener("click",I.ref.handleEdit)});let T={EDIT_ITEM:v,DID_LOAD_ITEM:E};if(f){let I=({root:y})=>{y.ref.buttonEditItem&&(y.ref.buttonEditItem.opacity=1)};T.DID_IMAGE_PREVIEW_SHOW=I}m.registerWriter(o(T))}),{options:{allowImageEdit:[!0,n.BOOLEAN],styleImageEditButtonEditItemPosition:["bottom center",n.STRING],imageEditInstantEdit:[!1,n.BOOLEAN],imageEditAllowEdit:[!0,n.BOOLEAN],imageEditIconEdit:['',n.STRING],imageEditEditor:[null,n.OBJECT]}}},Kp=typeof window<"u"&&typeof window.document<"u";Kp&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Xo}));var Qo=Xo;var Jp=e=>/^image\/jpeg/.test(e.type),rt={JPEG:65496,APP1:65505,EXIF:1165519206,TIFF:18761,Orientation:274,Unknown:65280},st=(e,t,i=!1)=>e.getUint16(t,i),Zo=(e,t,i=!1)=>e.getUint32(t,i),em=e=>new Promise((t,i)=>{let a=new FileReader;a.onload=function(n){let o=new DataView(n.target.result);if(st(o,0)!==rt.JPEG){t(-1);return}let l=o.byteLength,r=2;for(;rtypeof window<"u"&&typeof window.document<"u")(),im=()=>tm,am="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QA6RXhpZgAATU0AKgAAAAgAAwESAAMAAAABAAYAAAEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////wAALCAABAAIBASIA/8QAJgABAAAAAAAAAAAAAAAAAAAAAxABAAAAAAAAAAAAAAAAAAAAAP/aAAgBAQAAPwBH/9k=",Ko,Ti=im()?new Image:{};Ti.onload=()=>Ko=Ti.naturalWidth>Ti.naturalHeight;Ti.src=am;var nm=()=>Ko,Jo=({addFilter:e,utils:t})=>{let{Type:i,isFile:a}=t;return e("DID_LOAD_ITEM",(n,{query:o})=>new Promise((l,r)=>{let s=n.file;if(!a(s)||!Jp(s)||!o("GET_ALLOW_IMAGE_EXIF_ORIENTATION")||!nm())return l(n);em(s).then(p=>{n.setMetadata("exif",{orientation:p}),l(n)})})),{options:{allowImageExifOrientation:[!0,i.BOOLEAN]}}},om=typeof window<"u"&&typeof window.document<"u";om&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Jo}));var el=Jo;var lm=e=>/^image/.test(e.type),tl=(e,t)=>jt(e.x*t,e.y*t),il=(e,t)=>jt(e.x+t.x,e.y+t.y),rm=e=>{let t=Math.sqrt(e.x*e.x+e.y*e.y);return t===0?{x:0,y:0}:jt(e.x/t,e.y/t)},vi=(e,t,i)=>{let a=Math.cos(t),n=Math.sin(t),o=jt(e.x-i.x,e.y-i.y);return jt(i.x+a*o.x-n*o.y,i.y+n*o.x+a*o.y)},jt=(e=0,t=0)=>({x:e,y:t}),Te=(e,t,i=1,a)=>{if(typeof e=="string")return parseFloat(e)*i;if(typeof e=="number")return e*(a?t[a]:Math.min(t.width,t.height))},sm=(e,t,i)=>{let a=e.borderStyle||e.lineStyle||"solid",n=e.backgroundColor||e.fontColor||"transparent",o=e.borderColor||e.lineColor||"transparent",l=Te(e.borderWidth||e.lineWidth,t,i),r=e.lineCap||"round",s=e.lineJoin||"round",p=typeof a=="string"?"":a.map(d=>Te(d,t,i)).join(","),c=e.opacity||1;return{"stroke-linecap":r,"stroke-linejoin":s,"stroke-width":l||0,"stroke-dasharray":p,stroke:o,fill:n,opacity:c}},Se=e=>e!=null,cm=(e,t,i=1)=>{let a=Te(e.x,t,i,"width")||Te(e.left,t,i,"width"),n=Te(e.y,t,i,"height")||Te(e.top,t,i,"height"),o=Te(e.width,t,i,"width"),l=Te(e.height,t,i,"height"),r=Te(e.right,t,i,"width"),s=Te(e.bottom,t,i,"height");return Se(n)||(Se(l)&&Se(s)?n=t.height-l-s:n=s),Se(a)||(Se(o)&&Se(r)?a=t.width-o-r:a=r),Se(o)||(Se(a)&&Se(r)?o=t.width-a-r:o=0),Se(l)||(Se(n)&&Se(s)?l=t.height-n-s:l=0),{x:a||0,y:n||0,width:o||0,height:l||0}},dm=e=>e.map((t,i)=>`${i===0?"M":"L"} ${t.x} ${t.y}`).join(" "),Ce=(e,t)=>Object.keys(t).forEach(i=>e.setAttribute(i,t[i])),pm="http://www.w3.org/2000/svg",_t=(e,t)=>{let i=document.createElementNS(pm,e);return t&&Ce(i,t),i},mm=e=>Ce(e,{...e.rect,...e.styles}),um=e=>{let t=e.rect.x+e.rect.width*.5,i=e.rect.y+e.rect.height*.5,a=e.rect.width*.5,n=e.rect.height*.5;return Ce(e,{cx:t,cy:i,rx:a,ry:n,...e.styles})},fm={contain:"xMidYMid meet",cover:"xMidYMid slice"},hm=(e,t)=>{Ce(e,{...e.rect,...e.styles,preserveAspectRatio:fm[t.fit]||"none"})},gm={left:"start",center:"middle",right:"end"},Em=(e,t,i,a)=>{let n=Te(t.fontSize,i,a),o=t.fontFamily||"sans-serif",l=t.fontWeight||"normal",r=gm[t.textAlign]||"start";Ce(e,{...e.rect,...e.styles,"stroke-width":0,"font-weight":l,"font-size":n,"font-family":o,"text-anchor":r}),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},bm=(e,t,i,a)=>{Ce(e,{...e.rect,...e.styles,fill:"none"});let n=e.childNodes[0],o=e.childNodes[1],l=e.childNodes[2],r=e.rect,s={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(Ce(n,{x1:r.x,y1:r.y,x2:s.x,y2:s.y}),!t.lineDecoration)return;o.style.display="none",l.style.display="none";let p=rm({x:s.x-r.x,y:s.y-r.y}),c=Te(.05,i,a);if(t.lineDecoration.indexOf("arrow-begin")!==-1){let d=tl(p,c),m=il(r,d),u=vi(r,2,m),f=vi(r,-2,m);Ce(o,{style:"display:block;",d:`M${u.x},${u.y} L${r.x},${r.y} L${f.x},${f.y}`})}if(t.lineDecoration.indexOf("arrow-end")!==-1){let d=tl(p,-c),m=il(s,d),u=vi(s,2,m),f=vi(s,-2,m);Ce(l,{style:"display:block;",d:`M${u.x},${u.y} L${s.x},${s.y} L${f.x},${f.y}`})}},Tm=(e,t,i,a)=>{Ce(e,{...e.styles,fill:"none",d:dm(t.points.map(n=>({x:Te(n.x,i,a,"width"),y:Te(n.y,i,a,"height")})))})},Ii=e=>t=>_t(e,{id:t.id}),vm=e=>{let t=_t("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=()=>{t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},Im=e=>{let t=_t("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=_t("line");t.appendChild(i);let a=_t("path");t.appendChild(a);let n=_t("path");return t.appendChild(n),t},xm={image:vm,rect:Ii("rect"),ellipse:Ii("ellipse"),text:Ii("text"),path:Ii("path"),line:Im},ym={rect:mm,ellipse:um,image:hm,text:Em,path:Tm,line:bm},_m=(e,t)=>xm[e](t),Rm=(e,t,i,a,n)=>{t!=="path"&&(e.rect=cm(i,a,n)),e.styles=sm(i,a,n),ym[t](e,i,a,n)},wm=["x","y","left","top","right","bottom","width","height"],Sm=e=>typeof e=="string"&&/%/.test(e)?parseFloat(e)/100:e,Lm=e=>{let[t,i]=e,a=i.points?{}:wm.reduce((n,o)=>(n[o]=Sm(i[o]),n),{});return[t,{zIndex:0,...i,...a}]},Am=(e,t)=>e[1].zIndex>t[1].zIndex?1:e[1].zIndexe.utils.createView({name:"image-preview-markup",tag:"svg",ignoreRect:!0,mixins:{apis:["width","height","crop","markup","resize","dirty"]},write:({root:t,props:i})=>{if(!i.dirty)return;let{crop:a,resize:n,markup:o}=i,l=i.width,r=i.height,s=a.width,p=a.height;if(n){let{size:u}=n,f=u&&u.width,h=u&&u.height,g=n.mode,v=n.upscale;f&&!h&&(h=f),h&&!f&&(f=h);let E=s{let[f,h]=u,g=_m(f,h);Rm(g,f,h,c,d),t.element.appendChild(g)})}}),Ht=(e,t)=>({x:e,y:t}),Om=(e,t)=>e.x*t.x+e.y*t.y,al=(e,t)=>Ht(e.x-t.x,e.y-t.y),Pm=(e,t)=>Om(al(e,t),al(e,t)),nl=(e,t)=>Math.sqrt(Pm(e,t)),ol=(e,t)=>{let i=e,a=1.5707963267948966,n=t,o=1.5707963267948966-t,l=Math.sin(a),r=Math.sin(n),s=Math.sin(o),p=Math.cos(o),c=i/l,d=c*r,m=c*s;return Ht(p*d,p*m)},Dm=(e,t)=>{let i=e.width,a=e.height,n=ol(i,t),o=ol(a,t),l=Ht(e.x+Math.abs(n.x),e.y-Math.abs(n.y)),r=Ht(e.x+e.width+Math.abs(o.y),e.y+Math.abs(o.x)),s=Ht(e.x-Math.abs(o.y),e.y+e.height-Math.abs(o.x));return{width:nl(l,r),height:nl(l,s)}},Fm=(e,t,i=1)=>{let a=e.height/e.width,n=1,o=t,l=1,r=a;r>o&&(r=o,l=r/a);let s=Math.max(n/l,o/r),p=e.width/(i*s*l),c=p*t;return{width:p,height:c}},rl=(e,t,i,a)=>{let n=a.x>.5?1-a.x:a.x,o=a.y>.5?1-a.y:a.y,l=n*2*e.width,r=o*2*e.height,s=Dm(t,i);return Math.max(s.width/l,s.height/r)},sl=(e,t)=>{let i=e.width,a=i*t;a>e.height&&(a=e.height,i=a/t);let n=(e.width-i)*.5,o=(e.height-a)*.5;return{x:n,y:o,width:i,height:a}},zm=(e,t={})=>{let{zoom:i,rotation:a,center:n,aspectRatio:o}=t;o||(o=e.height/e.width);let l=Fm(e,o,i),r={x:l.width*.5,y:l.height*.5},s={x:0,y:0,width:l.width,height:l.height,center:r},p=typeof t.scaleToFit>"u"||t.scaleToFit,c=rl(e,sl(s,o),a,p?n:{x:.5,y:.5}),d=i*c;return{widthFloat:l.width/d,heightFloat:l.height/d,width:Math.round(l.width/d),height:Math.round(l.height/d)}},ze={type:"spring",stiffness:.5,damping:.45,mass:10},Cm=e=>e.utils.createView({name:"image-bitmap",ignoreRect:!0,mixins:{styles:["scaleX","scaleY"]},create:({root:t,props:i})=>{t.appendChild(i.image)}}),Nm=e=>e.utils.createView({name:"image-canvas-wrapper",tag:"div",ignoreRect:!0,mixins:{apis:["crop","width","height"],styles:["originX","originY","translateX","translateY","scaleX","scaleY","rotateZ"],animations:{originX:ze,originY:ze,scaleX:ze,scaleY:ze,translateX:ze,translateY:ze,rotateZ:ze}},create:({root:t,props:i})=>{i.width=i.image.width,i.height=i.image.height,t.ref.bitmap=t.appendChildView(t.createChildView(Cm(e),{image:i.image}))},write:({root:t,props:i})=>{let{flip:a}=i.crop,{bitmap:n}=t.ref;n.scaleX=a.horizontal?-1:1,n.scaleY=a.vertical?-1:1}}),Bm=e=>e.utils.createView({name:"image-clip",tag:"div",ignoreRect:!0,mixins:{apis:["crop","markup","resize","width","height","dirty","background"],styles:["width","height","opacity"],animations:{opacity:{type:"tween",duration:250}}},didWriteView:function({root:t,props:i}){i.background&&(t.element.style.backgroundColor=i.background)},create:({root:t,props:i})=>{t.ref.image=t.appendChildView(t.createChildView(Nm(e),Object.assign({},i))),t.ref.createMarkup=()=>{t.ref.markup||(t.ref.markup=t.appendChildView(t.createChildView(Mm(e),Object.assign({},i))))},t.ref.destroyMarkup=()=>{t.ref.markup&&(t.removeChildView(t.ref.markup),t.ref.markup=null)};let a=t.query("GET_IMAGE_PREVIEW_TRANSPARENCY_INDICATOR");a!==null&&(a==="grid"?t.element.dataset.transparencyIndicator=a:t.element.dataset.transparencyIndicator="color")},write:({root:t,props:i,shouldOptimize:a})=>{let{crop:n,markup:o,resize:l,dirty:r,width:s,height:p}=i;t.ref.image.crop=n;let c={x:0,y:0,width:s,height:p,center:{x:s*.5,y:p*.5}},d={width:t.ref.image.width,height:t.ref.image.height},m={x:n.center.x*d.width,y:n.center.y*d.height},u={x:c.center.x-d.width*n.center.x,y:c.center.y-d.height*n.center.y},f=Math.PI*2+n.rotation%(Math.PI*2),h=n.aspectRatio||d.height/d.width,g=typeof n.scaleToFit>"u"||n.scaleToFit,v=rl(d,sl(c,h),f,g?n.center:{x:.5,y:.5}),E=n.zoom*v;o&&o.length?(t.ref.createMarkup(),t.ref.markup.width=s,t.ref.markup.height=p,t.ref.markup.resize=l,t.ref.markup.dirty=r,t.ref.markup.markup=o,t.ref.markup.crop=zm(d,n)):t.ref.markup&&t.ref.destroyMarkup();let T=t.ref.image;if(a){T.originX=null,T.originY=null,T.translateX=null,T.translateY=null,T.rotateZ=null,T.scaleX=null,T.scaleY=null;return}T.originX=m.x,T.originY=m.y,T.translateX=u.x,T.translateY=u.y,T.rotateZ=f,T.scaleX=E,T.scaleY=E}}),km=e=>e.utils.createView({name:"image-preview",tag:"div",ignoreRect:!0,mixins:{apis:["image","crop","markup","resize","dirty","background"],styles:["translateY","scaleX","scaleY","opacity"],animations:{scaleX:ze,scaleY:ze,translateY:ze,opacity:{type:"tween",duration:400}}},create:({root:t,props:i})=>{t.ref.clip=t.appendChildView(t.createChildView(Bm(e),{id:i.id,image:i.image,crop:i.crop,markup:i.markup,resize:i.resize,dirty:i.dirty,background:i.background}))},write:({root:t,props:i,shouldOptimize:a})=>{let{clip:n}=t.ref,{image:o,crop:l,markup:r,resize:s,dirty:p}=i;if(n.crop=l,n.markup=r,n.resize=s,n.dirty=p,n.opacity=a?0:1,a||t.rect.element.hidden)return;let c=o.height/o.width,d=l.aspectRatio||c,m=t.rect.inner.width,u=t.rect.inner.height,f=t.query("GET_IMAGE_PREVIEW_HEIGHT"),h=t.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),g=t.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),v=t.query("GET_PANEL_ASPECT_RATIO"),E=t.query("GET_ALLOW_MULTIPLE");v&&!E&&(f=m*v,d=v);let T=f!==null?f:Math.max(h,Math.min(m*d,g)),I=T/d;I>m&&(I=m,T=I*d),T>u&&(T=u,I=u/d),n.width=I,n.height=T}}),Vm=` +var vr=Object.defineProperty;var xr=(e,t)=>{for(var i in t)vr(e,i,{get:t[i],enumerable:!0})};var na={};xr(na,{FileOrigin:()=>Bt,FileStatus:()=>Tt,OptionTypes:()=>Gi,Status:()=>ll,create:()=>ft,destroy:()=>ht,find:()=>Hi,getOptions:()=>Wi,parse:()=>Ui,registerPlugin:()=>ve,setOptions:()=>Dt,supported:()=>Vi});var yr=e=>e instanceof HTMLElement,Rr=(e,t=[],i=[])=>{let a={...e},n=[],l=[],o=()=>({...a}),r=()=>{let g=[...n];return n.length=0,g},s=()=>{let g=[...l];l.length=0,g.forEach(({type:f,data:h})=>{p(f,h)})},p=(g,f,h)=>{if(h&&!document.hidden){l.push({type:g,data:f});return}u[g]&&u[g](f),n.push({type:g,data:f})},c=(g,...f)=>m[g]?m[g](...f):null,d={getState:o,processActionQueue:r,processDispatchQueue:s,dispatch:p,query:c},m={};t.forEach(g=>{m={...g(a),...m}});let u={};return i.forEach(g=>{u={...g(p,c,a),...u}}),d},Sr=(e,t,i)=>{if(typeof i=="function"){e[t]=i;return}Object.defineProperty(e,t,{...i})},te=(e,t)=>{for(let i in e)e.hasOwnProperty(i)&&t(i,e[i])},He=e=>{let t={};return te(e,i=>{Sr(t,i,e[i])}),t},se=(e,t,i=null)=>{if(i===null)return e.getAttribute(t)||e.hasAttribute(t);e.setAttribute(t,i)},_r="http://www.w3.org/2000/svg",wr=["svg","path"],Pa=e=>wr.includes(e),li=(e,t,i={})=>{typeof t=="object"&&(i=t,t=null);let a=Pa(e)?document.createElementNS(_r,e):document.createElement(e);return t&&(Pa(e)?se(a,"class",t):a.className=t),te(i,(n,l)=>{se(a,n,l)}),a},Lr=e=>(t,i)=>{typeof i<"u"&&e.children[i]?e.insertBefore(t,e.children[i]):e.appendChild(t)},Mr=(e,t)=>(i,a)=>(typeof a<"u"?t.splice(a,0,i):t.push(i),i),Ar=(e,t)=>i=>(t.splice(t.indexOf(i),1),i.element.parentNode&&e.removeChild(i.element),i),zr=typeof window<"u"&&typeof window.document<"u",En=()=>zr,Pr=En()?li("svg"):{},Fr="children"in Pr?e=>e.children.length:e=>e.childNodes.length,Tn=(e,t,i,a)=>{let n=i[0]||e.left,l=i[1]||e.top,o=n+e.width,r=l+e.height*(a[1]||1),s={element:{...e},inner:{left:e.left,top:e.top,right:e.right,bottom:e.bottom},outer:{left:n,top:l,right:o,bottom:r}};return t.filter(p=>!p.isRectIgnored()).map(p=>p.rect).forEach(p=>{Fa(s.inner,{...p.inner}),Fa(s.outer,{...p.outer})}),Oa(s.inner),s.outer.bottom+=s.element.marginBottom,s.outer.right+=s.element.marginRight,Oa(s.outer),s},Fa=(e,t)=>{t.top+=e.top,t.right+=e.left,t.bottom+=e.top,t.left+=e.left,t.bottom>e.bottom&&(e.bottom=t.bottom),t.right>e.right&&(e.right=t.right)},Oa=e=>{e.width=e.right-e.left,e.height=e.bottom-e.top},Xe=e=>typeof e=="number",Or=(e,t,i,a=.001)=>Math.abs(e-t){let a=null,n=null,l=0,o=!1,p=He({interpolate:(c,d)=>{if(o)return;if(!(Xe(a)&&Xe(n))){o=!0,l=0;return}let m=-(n-a)*e;l+=m/i,n+=l,l*=t,Or(n,a,l)||d?(n=a,l=0,o=!0,p.onupdate(n),p.oncomplete(n)):p.onupdate(n)},target:{set:c=>{if(Xe(c)&&!Xe(n)&&(n=c),a===null&&(a=c,n=c),a=c,n===a||typeof a>"u"){o=!0,l=0,p.onupdate(n),p.oncomplete(n);return}o=!1},get:()=>a},resting:{get:()=>o},onupdate:c=>{},oncomplete:c=>{}});return p};var Cr=e=>e<.5?2*e*e:-1+(4-2*e)*e,Br=({duration:e=500,easing:t=Cr,delay:i=0}={})=>{let a=null,n,l,o=!0,r=!1,s=null,c=He({interpolate:(d,m)=>{o||s===null||(a===null&&(a=d),!(d-a=e||m?(n=1,l=r?0:1,c.onupdate(l*s),c.oncomplete(l*s),o=!0):(l=n/e,c.onupdate((n>=0?t(r?1-l:l):0)*s))))},target:{get:()=>r?0:s,set:d=>{if(s===null){s=d,c.onupdate(d),c.oncomplete(d);return}do},onupdate:d=>{},oncomplete:d=>{}});return c},Da={spring:Dr,tween:Br},kr=(e,t,i)=>{let a=e[t]&&typeof e[t][i]=="object"?e[t][i]:e[t]||e,n=typeof a=="string"?a:a.type,l=typeof a=="object"?{...a}:{};return Da[n]?Da[n](l):null},ji=(e,t,i,a=!1)=>{t=Array.isArray(t)?t:[t],t.forEach(n=>{e.forEach(l=>{let o=l,r=()=>i[l],s=p=>i[l]=p;typeof l=="object"&&(o=l.key,r=l.getter||r,s=l.setter||s),!(n[o]&&!a)&&(n[o]={get:r,set:s})})})},Nr=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a})=>{let n={...t},l=[];return te(e,(o,r)=>{let s=kr(r);if(!s)return;s.onupdate=c=>{t[o]=c},s.target=n[o],ji([{key:o,setter:c=>{s.target!==c&&(s.target=c)},getter:()=>t[o]}],[i,a],t,!0),l.push(s)}),{write:o=>{let r=document.hidden,s=!0;return l.forEach(p=>{p.resting||(s=!1),p.interpolate(o,r)}),s},destroy:()=>{}}},Vr=e=>(t,i)=>{e.addEventListener(t,i)},Gr=e=>(t,i)=>{e.removeEventListener(t,i)},Ur=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a,viewState:n,view:l})=>{let o=[],r=Vr(l.element),s=Gr(l.element);return a.on=(p,c)=>{o.push({type:p,fn:c}),r(p,c)},a.off=(p,c)=>{o.splice(o.findIndex(d=>d.type===p&&d.fn===c),1),s(p,c)},{write:()=>!0,destroy:()=>{o.forEach(p=>{s(p.type,p.fn)})}}},Hr=({mixinConfig:e,viewProps:t,viewExternalAPI:i})=>{ji(e,i,t)},ue=e=>e!=null,Wr={opacity:1,scaleX:1,scaleY:1,translateX:0,translateY:0,rotateX:0,rotateY:0,rotateZ:0,originX:0,originY:0},jr=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a,view:n})=>{let l={...t},o={};ji(e,[i,a],t);let r=()=>[t.translateX||0,t.translateY||0],s=()=>[t.scaleX||0,t.scaleY||0],p=()=>n.rect?Tn(n.rect,n.childViews,r(),s()):null;return i.rect={get:p},a.rect={get:p},e.forEach(c=>{t[c]=typeof l[c]>"u"?Wr[c]:l[c]}),{write:()=>{if(Yr(o,t))return qr(n.element,t),Object.assign(o,{...t}),!0},destroy:()=>{}}},Yr=(e,t)=>{if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let i in t)if(t[i]!==e[i])return!0;return!1},qr=(e,{opacity:t,perspective:i,translateX:a,translateY:n,scaleX:l,scaleY:o,rotateX:r,rotateY:s,rotateZ:p,originX:c,originY:d,width:m,height:u})=>{let g="",f="";(ue(c)||ue(d))&&(f+=`transform-origin: ${c||0}px ${d||0}px;`),ue(i)&&(g+=`perspective(${i}px) `),(ue(a)||ue(n))&&(g+=`translate3d(${a||0}px, ${n||0}px, 0) `),(ue(l)||ue(o))&&(g+=`scale3d(${ue(l)?l:1}, ${ue(o)?o:1}, 1) `),ue(p)&&(g+=`rotateZ(${p}rad) `),ue(r)&&(g+=`rotateX(${r}rad) `),ue(s)&&(g+=`rotateY(${s}rad) `),g.length&&(f+=`transform:${g};`),ue(t)&&(f+=`opacity:${t};`,t===0&&(f+="visibility:hidden;"),t<1&&(f+="pointer-events:none;")),ue(u)&&(f+=`height:${u}px;`),ue(m)&&(f+=`width:${m}px;`);let h=e.elementCurrentStyle||"";(f.length!==h.length||f!==h)&&(e.style.cssText=f,e.elementCurrentStyle=f)},$r={styles:jr,listeners:Ur,animations:Nr,apis:Hr},Ca=(e={},t={},i={})=>(t.layoutCalculated||(e.paddingTop=parseInt(i.paddingTop,10)||0,e.marginTop=parseInt(i.marginTop,10)||0,e.marginRight=parseInt(i.marginRight,10)||0,e.marginBottom=parseInt(i.marginBottom,10)||0,e.marginLeft=parseInt(i.marginLeft,10)||0,t.layoutCalculated=!0),e.left=t.offsetLeft||0,e.top=t.offsetTop||0,e.width=t.offsetWidth||0,e.height=t.offsetHeight||0,e.right=e.left+e.width,e.bottom=e.top+e.height,e.scrollTop=t.scrollTop,e.hidden=t.offsetParent===null,e),le=({tag:e="div",name:t=null,attributes:i={},read:a=()=>{},write:n=()=>{},create:l=()=>{},destroy:o=()=>{},filterFrameActionsForChild:r=(u,g)=>g,didCreateView:s=()=>{},didWriteView:p=()=>{},ignoreRect:c=!1,ignoreRectUpdate:d=!1,mixins:m=[]}={})=>(u,g={})=>{let f=li(e,`filepond--${t}`,i),h=window.getComputedStyle(f,null),I=Ca(),b=null,E=!1,v=[],y=[],T={},_={},x=[n],R=[a],P=[o],z=()=>f,A=()=>v.concat(),B=()=>T,w=V=>(W,$)=>W(V,$),F=()=>b||(b=Tn(I,v,[0,0],[1,1]),b),S=()=>h,L=()=>{b=null,v.forEach($=>$._read()),!(d&&I.width&&I.height)&&Ca(I,f,h);let W={root:Z,props:g,rect:I};R.forEach($=>$(W))},D=(V,W,$)=>{let ie=W.length===0;return x.forEach(ee=>{ee({props:g,root:Z,actions:W,timestamp:V,shouldOptimize:$})===!1&&(ie=!1)}),y.forEach(ee=>{ee.write(V)===!1&&(ie=!1)}),v.filter(ee=>!!ee.element.parentNode).forEach(ee=>{ee._write(V,r(ee,W),$)||(ie=!1)}),v.forEach((ee,pt)=>{ee.element.parentNode||(Z.appendChild(ee.element,pt),ee._read(),ee._write(V,r(ee,W),$),ie=!1)}),E=ie,p({props:g,root:Z,actions:W,timestamp:V}),ie},O=()=>{y.forEach(V=>V.destroy()),P.forEach(V=>{V({root:Z,props:g})}),v.forEach(V=>V._destroy())},U={element:{get:z},style:{get:S},childViews:{get:A}},C={...U,rect:{get:F},ref:{get:B},is:V=>t===V,appendChild:Lr(f),createChildView:w(u),linkView:V=>(v.push(V),V),unlinkView:V=>{v.splice(v.indexOf(V),1)},appendChildView:Mr(f,v),removeChildView:Ar(f,v),registerWriter:V=>x.push(V),registerReader:V=>R.push(V),registerDestroyer:V=>P.push(V),invalidateLayout:()=>f.layoutCalculated=!1,dispatch:u.dispatch,query:u.query},X={element:{get:z},childViews:{get:A},rect:{get:F},resting:{get:()=>E},isRectIgnored:()=>c,_read:L,_write:D,_destroy:O},K={...U,rect:{get:()=>I}};Object.keys(m).sort((V,W)=>V==="styles"?1:W==="styles"?-1:0).forEach(V=>{let W=$r[V]({mixinConfig:m[V],viewProps:g,viewState:_,viewInternalAPI:C,viewExternalAPI:X,view:He(K)});W&&y.push(W)});let Z=He(C);l({root:Z,props:g});let ce=Fr(f);return v.forEach((V,W)=>{Z.appendChild(V.element,ce+W)}),s(Z),He(X)},Xr=(e,t,i=60)=>{let a="__framePainter";if(window[a]){window[a].readers.push(e),window[a].writers.push(t);return}window[a]={readers:[e],writers:[t]};let n=window[a],l=1e3/i,o=null,r=null,s=null,p=null,c=()=>{document.hidden?(s=()=>window.setTimeout(()=>d(performance.now()),l),p=()=>window.clearTimeout(r)):(s=()=>window.requestAnimationFrame(d),p=()=>window.cancelAnimationFrame(r))};document.addEventListener("visibilitychange",()=>{p&&p(),c(),d(performance.now())});let d=m=>{r=s(d),o||(o=m);let u=m-o;u<=l||(o=m-u%l,n.readers.forEach(g=>g()),n.writers.forEach(g=>g(m)))};return c(),d(performance.now()),{pause:()=>{p(r)}}},fe=(e,t)=>({root:i,props:a,actions:n=[],timestamp:l,shouldOptimize:o})=>{n.filter(r=>e[r.type]).forEach(r=>e[r.type]({root:i,props:a,action:r.data,timestamp:l,shouldOptimize:o})),t&&t({root:i,props:a,actions:n,timestamp:l,shouldOptimize:o})},Ba=(e,t)=>t.parentNode.insertBefore(e,t),ka=(e,t)=>t.parentNode.insertBefore(e,t.nextSibling),ci=e=>Array.isArray(e),Ve=e=>e==null,Kr=e=>e.trim(),di=e=>""+e,Zr=(e,t=",")=>Ve(e)?[]:ci(e)?e:di(e).split(t).map(Kr).filter(i=>i.length),In=e=>typeof e=="boolean",vn=e=>In(e)?e:e==="true",ge=e=>typeof e=="string",xn=e=>Xe(e)?e:ge(e)?di(e).replace(/[a-z]+/gi,""):0,ni=e=>parseInt(xn(e),10),Na=e=>parseFloat(xn(e)),Et=e=>Xe(e)&&isFinite(e)&&Math.floor(e)===e,Va=(e,t=1e3)=>{if(Et(e))return e;let i=di(e).trim();return/MB$/i.test(i)?(i=i.replace(/MB$i/,"").trim(),ni(i)*t*t):/KB/i.test(i)?(i=i.replace(/KB$i/,"").trim(),ni(i)*t):ni(i)},Ke=e=>typeof e=="function",Qr=e=>{let t=self,i=e.split("."),a=null;for(;a=i.shift();)if(t=t[a],!t)return null;return t},Ga={process:"POST",patch:"PATCH",revert:"DELETE",fetch:"GET",restore:"GET",load:"GET"},Jr=e=>{let t={};return t.url=ge(e)?e:e.url||"",t.timeout=e.timeout?parseInt(e.timeout,10):0,t.headers=e.headers?e.headers:{},te(Ga,i=>{t[i]=es(i,e[i],Ga[i],t.timeout,t.headers)}),t.process=e.process||ge(e)||e.url?t.process:null,t.remove=e.remove||null,delete t.headers,t},es=(e,t,i,a,n)=>{if(t===null)return null;if(typeof t=="function")return t;let l={url:i==="GET"||i==="PATCH"?`?${e}=`:"",method:i,headers:n,withCredentials:!1,timeout:a,onload:null,ondata:null,onerror:null};if(ge(t))return l.url=t,l;if(Object.assign(l,t),ge(l.headers)){let o=l.headers.split(/:(.+)/);l.headers={header:o[0],value:o[1]}}return l.withCredentials=vn(l.withCredentials),l},ts=e=>Jr(e),is=e=>e===null,de=e=>typeof e=="object"&&e!==null,as=e=>de(e)&&ge(e.url)&&de(e.process)&&de(e.revert)&&de(e.restore)&&de(e.fetch),Pi=e=>ci(e)?"array":is(e)?"null":Et(e)?"int":/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(e)?"bytes":as(e)?"api":typeof e,ns=e=>e.replace(/{\s*'/g,'{"').replace(/'\s*}/g,'"}').replace(/'\s*:/g,'":').replace(/:\s*'/g,':"').replace(/,\s*'/g,',"').replace(/'\s*,/g,'",'),ls={array:Zr,boolean:vn,int:e=>Pi(e)==="bytes"?Va(e):ni(e),number:Na,float:Na,bytes:Va,string:e=>Ke(e)?e:di(e),function:e=>Qr(e),serverapi:ts,object:e=>{try{return JSON.parse(ns(e))}catch{return null}}},os=(e,t)=>ls[t](e),yn=(e,t,i)=>{if(e===t)return e;let a=Pi(e);if(a!==i){let n=os(e,i);if(a=Pi(n),n===null)throw`Trying to assign value with incorrect type to "${option}", allowed type: "${i}"`;e=n}return e},rs=(e,t)=>{let i=e;return{enumerable:!0,get:()=>i,set:a=>{i=yn(a,e,t)}}},ss=e=>{let t={};return te(e,i=>{let a=e[i];t[i]=rs(a[0],a[1])}),He(t)},cs=e=>({items:[],listUpdateTimeout:null,itemUpdateTimeout:null,processingQueue:[],options:ss(e)}),pi=(e,t="-")=>e.split(/(?=[A-Z])/).map(i=>i.toLowerCase()).join(t),ds=(e,t)=>{let i={};return te(t,a=>{i[a]={get:()=>e.getState().options[a],set:n=>{e.dispatch(`SET_${pi(a,"_").toUpperCase()}`,{value:n})}}}),i},ps=e=>(t,i,a)=>{let n={};return te(e,l=>{let o=pi(l,"_").toUpperCase();n[`SET_${o}`]=r=>{try{a.options[l]=r.value}catch{}t(`DID_SET_${o}`,{value:a.options[l]})}}),n},ms=e=>t=>{let i={};return te(e,a=>{i[`GET_${pi(a,"_").toUpperCase()}`]=n=>t.options[a]}),i},Re={API:1,DROP:2,BROWSE:3,PASTE:4,NONE:5},Yi=()=>Math.random().toString(36).substring(2,11),qi=(e,t)=>e.splice(t,1),us=(e,t)=>{t?e():document.hidden?Promise.resolve(1).then(e):setTimeout(e,0)},mi=()=>{let e=[],t=(a,n)=>{qi(e,e.findIndex(l=>l.event===a&&(l.cb===n||!n)))},i=(a,n,l)=>{e.filter(o=>o.event===a).map(o=>o.cb).forEach(o=>us(()=>o(...n),l))};return{fireSync:(a,...n)=>{i(a,n,!0)},fire:(a,...n)=>{i(a,n,!1)},on:(a,n)=>{e.push({event:a,cb:n})},onOnce:(a,n)=>{e.push({event:a,cb:(...l)=>{t(a,n),n(...l)}})},off:t}},Rn=(e,t,i)=>{Object.getOwnPropertyNames(e).filter(a=>!i.includes(a)).forEach(a=>Object.defineProperty(t,a,Object.getOwnPropertyDescriptor(e,a)))},gs=["fire","process","revert","load","on","off","onOnce","retryLoad","extend","archive","archived","release","released","requestProcessing","freeze"],he=e=>{let t={};return Rn(e,t,gs),t},fs=e=>{e.forEach((t,i)=>{t.released&&qi(e,i)})},H={INIT:1,IDLE:2,PROCESSING_QUEUED:9,PROCESSING:3,PROCESSING_COMPLETE:5,PROCESSING_ERROR:6,PROCESSING_REVERT_ERROR:10,LOADING:7,LOAD_ERROR:8},re={INPUT:1,LIMBO:2,LOCAL:3},Sn=e=>/[^0-9]+/.exec(e),_n=()=>Sn(1.1.toLocaleString())[0],hs=()=>{let e=_n(),t=1e3.toLocaleString();return t!=="1000"?Sn(t)[0]:e==="."?",":"."},M={BOOLEAN:"boolean",INT:"int",NUMBER:"number",STRING:"string",ARRAY:"array",OBJECT:"object",FUNCTION:"function",ACTION:"action",SERVER_API:"serverapi",REGEX:"regex"},$i=[],Ae=(e,t,i)=>new Promise((a,n)=>{let l=$i.filter(r=>r.key===e).map(r=>r.cb);if(l.length===0){a(t);return}let o=l.shift();l.reduce((r,s)=>r.then(p=>s(p,i)),o(t,i)).then(r=>a(r)).catch(r=>n(r))}),it=(e,t,i)=>$i.filter(a=>a.key===e).map(a=>a.cb(t,i)),bs=(e,t)=>$i.push({key:e,cb:t}),Es=e=>Object.assign(mt,e),oi=()=>({...mt}),Ts=e=>{te(e,(t,i)=>{mt[t]&&(mt[t][0]=yn(i,mt[t][0],mt[t][1]))})},mt={id:[null,M.STRING],name:["filepond",M.STRING],disabled:[!1,M.BOOLEAN],className:[null,M.STRING],required:[!1,M.BOOLEAN],captureMethod:[null,M.STRING],allowSyncAcceptAttribute:[!0,M.BOOLEAN],allowDrop:[!0,M.BOOLEAN],allowBrowse:[!0,M.BOOLEAN],allowPaste:[!0,M.BOOLEAN],allowMultiple:[!1,M.BOOLEAN],allowReplace:[!0,M.BOOLEAN],allowRevert:[!0,M.BOOLEAN],allowRemove:[!0,M.BOOLEAN],allowProcess:[!0,M.BOOLEAN],allowReorder:[!1,M.BOOLEAN],allowDirectoriesOnly:[!1,M.BOOLEAN],storeAsFile:[!1,M.BOOLEAN],forceRevert:[!1,M.BOOLEAN],maxFiles:[null,M.INT],checkValidity:[!1,M.BOOLEAN],itemInsertLocationFreedom:[!0,M.BOOLEAN],itemInsertLocation:["before",M.STRING],itemInsertInterval:[75,M.INT],dropOnPage:[!1,M.BOOLEAN],dropOnElement:[!0,M.BOOLEAN],dropValidation:[!1,M.BOOLEAN],ignoredFiles:[[".ds_store","thumbs.db","desktop.ini"],M.ARRAY],instantUpload:[!0,M.BOOLEAN],maxParallelUploads:[2,M.INT],allowMinimumUploadDuration:[!0,M.BOOLEAN],chunkUploads:[!1,M.BOOLEAN],chunkForce:[!1,M.BOOLEAN],chunkSize:[5e6,M.INT],chunkRetryDelays:[[500,1e3,3e3],M.ARRAY],server:[null,M.SERVER_API],fileSizeBase:[1e3,M.INT],labelFileSizeBytes:["bytes",M.STRING],labelFileSizeKilobytes:["KB",M.STRING],labelFileSizeMegabytes:["MB",M.STRING],labelFileSizeGigabytes:["GB",M.STRING],labelDecimalSeparator:[_n(),M.STRING],labelThousandsSeparator:[hs(),M.STRING],labelIdle:['Drag & Drop your files or Browse',M.STRING],labelInvalidField:["Field contains invalid files",M.STRING],labelFileWaitingForSize:["Waiting for size",M.STRING],labelFileSizeNotAvailable:["Size not available",M.STRING],labelFileCountSingular:["file in list",M.STRING],labelFileCountPlural:["files in list",M.STRING],labelFileLoading:["Loading",M.STRING],labelFileAdded:["Added",M.STRING],labelFileLoadError:["Error during load",M.STRING],labelFileRemoved:["Removed",M.STRING],labelFileRemoveError:["Error during remove",M.STRING],labelFileProcessing:["Uploading",M.STRING],labelFileProcessingComplete:["Upload complete",M.STRING],labelFileProcessingAborted:["Upload cancelled",M.STRING],labelFileProcessingError:["Error during upload",M.STRING],labelFileProcessingRevertError:["Error during revert",M.STRING],labelTapToCancel:["tap to cancel",M.STRING],labelTapToRetry:["tap to retry",M.STRING],labelTapToUndo:["tap to undo",M.STRING],labelButtonRemoveItem:["Remove",M.STRING],labelButtonAbortItemLoad:["Abort",M.STRING],labelButtonRetryItemLoad:["Retry",M.STRING],labelButtonAbortItemProcessing:["Cancel",M.STRING],labelButtonUndoItemProcessing:["Undo",M.STRING],labelButtonRetryItemProcessing:["Retry",M.STRING],labelButtonProcessItem:["Upload",M.STRING],iconRemove:['',M.STRING],iconProcess:['',M.STRING],iconRetry:['',M.STRING],iconUndo:['',M.STRING],iconDone:['',M.STRING],oninit:[null,M.FUNCTION],onwarning:[null,M.FUNCTION],onerror:[null,M.FUNCTION],onactivatefile:[null,M.FUNCTION],oninitfile:[null,M.FUNCTION],onaddfilestart:[null,M.FUNCTION],onaddfileprogress:[null,M.FUNCTION],onaddfile:[null,M.FUNCTION],onprocessfilestart:[null,M.FUNCTION],onprocessfileprogress:[null,M.FUNCTION],onprocessfileabort:[null,M.FUNCTION],onprocessfilerevert:[null,M.FUNCTION],onprocessfile:[null,M.FUNCTION],onprocessfiles:[null,M.FUNCTION],onremovefile:[null,M.FUNCTION],onpreparefile:[null,M.FUNCTION],onupdatefiles:[null,M.FUNCTION],onreorderfiles:[null,M.FUNCTION],beforeDropFile:[null,M.FUNCTION],beforeAddFile:[null,M.FUNCTION],beforeRemoveFile:[null,M.FUNCTION],beforePrepareFile:[null,M.FUNCTION],stylePanelLayout:[null,M.STRING],stylePanelAspectRatio:[null,M.STRING],styleItemPanelAspectRatio:[null,M.STRING],styleButtonRemoveItemPosition:["left",M.STRING],styleButtonProcessItemPosition:["right",M.STRING],styleLoadIndicatorPosition:["right",M.STRING],styleProgressIndicatorPosition:["right",M.STRING],styleButtonRemoveItemAlign:[!1,M.BOOLEAN],files:[[],M.ARRAY],credits:[["https://pqina.nl/","Powered by PQINA"],M.ARRAY]},Ze=(e,t)=>Ve(t)?e[0]||null:Et(t)?e[t]||null:(typeof t=="object"&&(t=t.id),e.find(i=>i.id===t)||null),wn=e=>{if(Ve(e))return e;if(/:/.test(e)){let t=e.split(":");return t[1]/t[0]}return parseFloat(e)},ze=e=>e.filter(t=>!t.archived),Ln={EMPTY:0,IDLE:1,ERROR:2,BUSY:3,READY:4},Qt=null,Is=()=>{if(Qt===null)try{let e=new DataTransfer;e.items.add(new File(["hello world"],"This_Works.txt"));let t=document.createElement("input");t.setAttribute("type","file"),t.files=e.files,Qt=t.files.length===1}catch{Qt=!1}return Qt},vs=[H.LOAD_ERROR,H.PROCESSING_ERROR,H.PROCESSING_REVERT_ERROR],xs=[H.LOADING,H.PROCESSING,H.PROCESSING_QUEUED,H.INIT],ys=[H.PROCESSING_COMPLETE],Rs=e=>vs.includes(e.status),Ss=e=>xs.includes(e.status),_s=e=>ys.includes(e.status),Ua=e=>de(e.options.server)&&(de(e.options.server.process)||Ke(e.options.server.process)),ws=e=>({GET_STATUS:()=>{let t=ze(e.items),{EMPTY:i,ERROR:a,BUSY:n,IDLE:l,READY:o}=Ln;return t.length===0?i:t.some(Rs)?a:t.some(Ss)?n:t.some(_s)?o:l},GET_ITEM:t=>Ze(e.items,t),GET_ACTIVE_ITEM:t=>Ze(ze(e.items),t),GET_ACTIVE_ITEMS:()=>ze(e.items),GET_ITEMS:()=>e.items,GET_ITEM_NAME:t=>{let i=Ze(e.items,t);return i?i.filename:null},GET_ITEM_SIZE:t=>{let i=Ze(e.items,t);return i?i.fileSize:null},GET_STYLES:()=>Object.keys(e.options).filter(t=>/^style/.test(t)).map(t=>({name:t,value:e.options[t]})),GET_PANEL_ASPECT_RATIO:()=>/circle/.test(e.options.stylePanelLayout)?1:wn(e.options.stylePanelAspectRatio),GET_ITEM_PANEL_ASPECT_RATIO:()=>e.options.styleItemPanelAspectRatio,GET_ITEMS_BY_STATUS:t=>ze(e.items).filter(i=>i.status===t),GET_TOTAL_ITEMS:()=>ze(e.items).length,SHOULD_UPDATE_FILE_INPUT:()=>e.options.storeAsFile&&Is()&&!Ua(e),IS_ASYNC:()=>Ua(e),GET_FILE_SIZE_LABELS:t=>({labelBytes:t("GET_LABEL_FILE_SIZE_BYTES")||void 0,labelKilobytes:t("GET_LABEL_FILE_SIZE_KILOBYTES")||void 0,labelMegabytes:t("GET_LABEL_FILE_SIZE_MEGABYTES")||void 0,labelGigabytes:t("GET_LABEL_FILE_SIZE_GIGABYTES")||void 0})}),Ls=e=>{let t=ze(e.items).length;if(!e.options.allowMultiple)return t===0;let i=e.options.maxFiles;return i===null||tMath.max(Math.min(i,e),t),Ms=(e,t,i)=>e.splice(t,0,i),As=(e,t,i)=>Ve(t)?null:typeof i>"u"?(e.push(t),t):(i=Mn(i,0,e.length),Ms(e,i,t),t),Fi=e=>/^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*)\s*$/i.test(e),Ct=e=>`${e}`.split("/").pop().split("?").shift(),ui=e=>e.split(".").pop(),zs=e=>{if(typeof e!="string")return"";let t=e.split("/").pop();return/svg/.test(t)?"svg":/zip|compressed/.test(t)?"zip":/plain/.test(t)?"txt":/msword/.test(t)?"doc":/[a-z]+/.test(t)?t==="jpeg"?"jpg":t:""},zt=(e,t="")=>(t+e).slice(-t.length),An=(e=new Date)=>`${e.getFullYear()}-${zt(e.getMonth()+1,"00")}-${zt(e.getDate(),"00")}_${zt(e.getHours(),"00")}-${zt(e.getMinutes(),"00")}-${zt(e.getSeconds(),"00")}`,bt=(e,t,i=null,a=null)=>{let n=typeof i=="string"?e.slice(0,e.size,i):e.slice(0,e.size,e.type);return n.lastModifiedDate=new Date,e._relativePath&&(n._relativePath=e._relativePath),ge(t)||(t=An()),t&&a===null&&ui(t)?n.name=t:(a=a||zs(n.type),n.name=t+(a?"."+a:"")),n},Ps=()=>window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,zn=(e,t)=>{let i=Ps();if(i){let a=new i;return a.append(e),a.getBlob(t)}return new Blob([e],{type:t})},Fs=(e,t)=>{let i=new ArrayBuffer(e.length),a=new Uint8Array(i);for(let n=0;n(/^data:(.+);/.exec(e)||[])[1]||null,Os=e=>e.split(",")[1].replace(/\s/g,""),Ds=e=>atob(Os(e)),Cs=e=>{let t=Pn(e),i=Ds(e);return Fs(i,t)},Bs=(e,t,i)=>bt(Cs(e),t,null,i),ks=e=>{if(!/^content-disposition:/i.test(e))return null;let t=e.split(/filename=|filename\*=.+''/).splice(1).map(i=>i.trim().replace(/^["']|[;"']{0,2}$/g,"")).filter(i=>i.length);return t.length?decodeURI(t[t.length-1]):null},Ns=e=>{if(/content-length:/i.test(e)){let t=e.match(/[0-9]+/)[0];return t?parseInt(t,10):null}return null},Vs=e=>/x-content-transfer-id:/i.test(e)&&(e.split(":")[1]||"").trim()||null,Xi=e=>{let t={source:null,name:null,size:null},i=e.split(` +`);for(let a of i){let n=ks(a);if(n){t.name=n;continue}let l=Ns(a);if(l){t.size=l;continue}let o=Vs(a);if(o){t.source=o;continue}}return t},Gs=e=>{let t={source:null,complete:!1,progress:0,size:null,timestamp:null,duration:0,request:null},i=()=>t.progress,a=()=>{t.request&&t.request.abort&&t.request.abort()},n=()=>{let r=t.source;o.fire("init",r),r instanceof File?o.fire("load",r):r instanceof Blob?o.fire("load",bt(r,r.name)):Fi(r)?o.fire("load",Bs(r)):l(r)},l=r=>{if(!e){o.fire("error",{type:"error",body:"Can't load URL",code:400});return}t.timestamp=Date.now(),t.request=e(r,s=>{t.duration=Date.now()-t.timestamp,t.complete=!0,s instanceof Blob&&(s=bt(s,s.name||Ct(r))),o.fire("load",s instanceof Blob?s:s?s.body:null)},s=>{o.fire("error",typeof s=="string"?{type:"error",code:0,body:s}:s)},(s,p,c)=>{if(c&&(t.size=c),t.duration=Date.now()-t.timestamp,!s){t.progress=null;return}t.progress=p/c,o.fire("progress",t.progress)},()=>{o.fire("abort")},s=>{let p=Xi(typeof s=="string"?s:s.headers);o.fire("meta",{size:t.size||p.size,filename:p.name,source:p.source})})},o={...mi(),setSource:r=>t.source=r,getProgress:i,abort:a,load:n};return o},Ha=e=>/GET|HEAD/.test(e),Qe=(e,t,i)=>{let a={onheaders:()=>{},onprogress:()=>{},onload:()=>{},ontimeout:()=>{},onerror:()=>{},onabort:()=>{},abort:()=>{n=!0,o.abort()}},n=!1,l=!1;i={method:"POST",headers:{},withCredentials:!1,...i},t=encodeURI(t),Ha(i.method)&&e&&(t=`${t}${encodeURIComponent(typeof e=="string"?e:JSON.stringify(e))}`);let o=new XMLHttpRequest,r=Ha(i.method)?o:o.upload;return r.onprogress=s=>{n||a.onprogress(s.lengthComputable,s.loaded,s.total)},o.onreadystatechange=()=>{o.readyState<2||o.readyState===4&&o.status===0||l||(l=!0,a.onheaders(o))},o.onload=()=>{o.status>=200&&o.status<300?a.onload(o):a.onerror(o)},o.onerror=()=>a.onerror(o),o.onabort=()=>{n=!0,a.onabort()},o.ontimeout=()=>a.ontimeout(o),o.open(i.method,t,!0),Et(i.timeout)&&(o.timeout=i.timeout),Object.keys(i.headers).forEach(s=>{let p=unescape(encodeURIComponent(i.headers[s]));o.setRequestHeader(s,p)}),i.responseType&&(o.responseType=i.responseType),i.withCredentials&&(o.withCredentials=!0),o.send(e),a},ae=(e,t,i,a)=>({type:e,code:t,body:i,headers:a}),Je=e=>t=>{e(ae("error",0,"Timeout",t.getAllResponseHeaders()))},Wa=e=>/\?/.test(e),Ot=(...e)=>{let t="";return e.forEach(i=>{t+=Wa(t)&&Wa(i)?i.replace(/\?/,"&"):i}),t},_i=(e="",t)=>{if(typeof t=="function")return t;if(!t||!ge(t.url))return null;let i=t.onload||(n=>n),a=t.onerror||(n=>null);return(n,l,o,r,s,p)=>{let c=Qe(n,Ot(e,t.url),{...t,responseType:"blob"});return c.onload=d=>{let m=d.getAllResponseHeaders(),u=Xi(m).name||Ct(n);l(ae("load",d.status,t.method==="HEAD"?null:bt(i(d.response),u),m))},c.onerror=d=>{o(ae("error",d.status,a(d.response)||d.statusText,d.getAllResponseHeaders()))},c.onheaders=d=>{p(ae("headers",d.status,null,d.getAllResponseHeaders()))},c.ontimeout=Je(o),c.onprogress=r,c.onabort=s,c}},xe={QUEUED:0,COMPLETE:1,PROCESSING:2,ERROR:3,WAITING:4},Us=(e,t,i,a,n,l,o,r,s,p,c)=>{let d=[],{chunkTransferId:m,chunkServer:u,chunkSize:g,chunkRetryDelays:f}=c,h={serverId:m,aborted:!1},I=t.ondata||(w=>w),b=t.onload||((w,F)=>F==="HEAD"?w.getResponseHeader("Upload-Offset"):w.response),E=t.onerror||(w=>null),v=w=>{let F=new FormData;de(n)&&F.append(i,JSON.stringify(n));let S=typeof t.headers=="function"?t.headers(a,n):{...t.headers,"Upload-Length":a.size},L={...t,headers:S},D=Qe(I(F),Ot(e,t.url),L);D.onload=O=>w(b(O,L.method)),D.onerror=O=>o(ae("error",O.status,E(O.response)||O.statusText,O.getAllResponseHeaders())),D.ontimeout=Je(o)},y=w=>{let F=Ot(e,u.url,h.serverId),L={headers:typeof t.headers=="function"?t.headers(h.serverId):{...t.headers},method:"HEAD"},D=Qe(null,F,L);D.onload=O=>w(b(O,L.method)),D.onerror=O=>o(ae("error",O.status,E(O.response)||O.statusText,O.getAllResponseHeaders())),D.ontimeout=Je(o)},T=Math.floor(a.size/g);for(let w=0;w<=T;w++){let F=w*g,S=a.slice(F,F+g,"application/offset+octet-stream");d[w]={index:w,size:S.size,offset:F,data:S,file:a,progress:0,retries:[...f],status:xe.QUEUED,error:null,request:null,timeout:null}}let _=()=>l(h.serverId),x=w=>w.status===xe.QUEUED||w.status===xe.ERROR,R=w=>{if(h.aborted)return;if(w=w||d.find(x),!w){d.every(C=>C.status===xe.COMPLETE)&&_();return}w.status=xe.PROCESSING,w.progress=null;let F=u.ondata||(C=>C),S=u.onerror||(C=>null),L=u.onload||(()=>{}),D=Ot(e,u.url,h.serverId),O=typeof u.headers=="function"?u.headers(w):{...u.headers,"Content-Type":"application/offset+octet-stream","Upload-Offset":w.offset,"Upload-Length":a.size,"Upload-Name":a.name},U=w.request=Qe(F(w.data),D,{...u,headers:O});U.onload=C=>{L(C,w.index,d.length),w.status=xe.COMPLETE,w.request=null,A()},U.onprogress=(C,X,K)=>{w.progress=C?X:null,z()},U.onerror=C=>{w.status=xe.ERROR,w.request=null,w.error=S(C.response)||C.statusText,P(w)||o(ae("error",C.status,S(C.response)||C.statusText,C.getAllResponseHeaders()))},U.ontimeout=C=>{w.status=xe.ERROR,w.request=null,P(w)||Je(o)(C)},U.onabort=()=>{w.status=xe.QUEUED,w.request=null,s()}},P=w=>w.retries.length===0?!1:(w.status=xe.WAITING,clearTimeout(w.timeout),w.timeout=setTimeout(()=>{R(w)},w.retries.shift()),!0),z=()=>{let w=d.reduce((S,L)=>S===null||L.progress===null?null:S+L.progress,0);if(w===null)return r(!1,0,0);let F=d.reduce((S,L)=>S+L.size,0);r(!0,w,F)},A=()=>{d.filter(F=>F.status===xe.PROCESSING).length>=1||R()},B=()=>{d.forEach(w=>{clearTimeout(w.timeout),w.request&&w.request.abort()})};return h.serverId?y(w=>{h.aborted||(d.filter(F=>F.offset{F.status=xe.COMPLETE,F.progress=F.size}),A())}):v(w=>{h.aborted||(p(w),h.serverId=w,A())}),{abort:()=>{h.aborted=!0,B()}}},Hs=(e,t,i,a)=>(n,l,o,r,s,p,c)=>{if(!n)return;let d=a.chunkUploads,m=d&&n.size>a.chunkSize,u=d&&(m||a.chunkForce);if(n instanceof Blob&&u)return Us(e,t,i,n,l,o,r,s,p,c,a);let g=t.ondata||(y=>y),f=t.onload||(y=>y),h=t.onerror||(y=>null),I=typeof t.headers=="function"?t.headers(n,l)||{}:{...t.headers},b={...t,headers:I};var E=new FormData;de(l)&&E.append(i,JSON.stringify(l)),(n instanceof Blob?[{name:null,file:n}]:n).forEach(y=>{E.append(i,y.file,y.name===null?y.file.name:`${y.name}${y.file.name}`)});let v=Qe(g(E),Ot(e,t.url),b);return v.onload=y=>{o(ae("load",y.status,f(y.response),y.getAllResponseHeaders()))},v.onerror=y=>{r(ae("error",y.status,h(y.response)||y.statusText,y.getAllResponseHeaders()))},v.ontimeout=Je(r),v.onprogress=s,v.onabort=p,v},Ws=(e="",t,i,a)=>typeof t=="function"?(...n)=>t(i,...n,a):!t||!ge(t.url)?null:Hs(e,t,i,a),Pt=(e="",t)=>{if(typeof t=="function")return t;if(!t||!ge(t.url))return(n,l)=>l();let i=t.onload||(n=>n),a=t.onerror||(n=>null);return(n,l,o)=>{let r=Qe(n,e+t.url,t);return r.onload=s=>{l(ae("load",s.status,i(s.response),s.getAllResponseHeaders()))},r.onerror=s=>{o(ae("error",s.status,a(s.response)||s.statusText,s.getAllResponseHeaders()))},r.ontimeout=Je(o),r}},Fn=(e=0,t=1)=>e+Math.random()*(t-e),js=(e,t=1e3,i=0,a=25,n=250)=>{let l=null,o=Date.now(),r=()=>{let s=Date.now()-o,p=Fn(a,n);s+p>t&&(p=s+p-t);let c=s/t;if(c>=1||document.hidden){e(1);return}e(c),l=setTimeout(r,p)};return t>0&&r(),{clear:()=>{clearTimeout(l)}}},Ys=(e,t)=>{let i={complete:!1,perceivedProgress:0,perceivedPerformanceUpdater:null,progress:null,timestamp:null,perceivedDuration:0,duration:0,request:null,response:null},{allowMinimumUploadDuration:a}=t,n=(c,d)=>{let m=()=>{i.duration===0||i.progress===null||p.fire("progress",p.getProgress())},u=()=>{i.complete=!0,p.fire("load-perceived",i.response.body)};p.fire("start"),i.timestamp=Date.now(),i.perceivedPerformanceUpdater=js(g=>{i.perceivedProgress=g,i.perceivedDuration=Date.now()-i.timestamp,m(),i.response&&i.perceivedProgress===1&&!i.complete&&u()},a?Fn(750,1500):0),i.request=e(c,d,g=>{i.response=de(g)?g:{type:"load",code:200,body:`${g}`,headers:{}},i.duration=Date.now()-i.timestamp,i.progress=1,p.fire("load",i.response.body),(!a||a&&i.perceivedProgress===1)&&u()},g=>{i.perceivedPerformanceUpdater.clear(),p.fire("error",de(g)?g:{type:"error",code:0,body:`${g}`})},(g,f,h)=>{i.duration=Date.now()-i.timestamp,i.progress=g?f/h:null,m()},()=>{i.perceivedPerformanceUpdater.clear(),p.fire("abort",i.response?i.response.body:null)},g=>{p.fire("transfer",g)})},l=()=>{i.request&&(i.perceivedPerformanceUpdater.clear(),i.request.abort&&i.request.abort(),i.complete=!0)},o=()=>{l(),i.complete=!1,i.perceivedProgress=0,i.progress=0,i.timestamp=null,i.perceivedDuration=0,i.duration=0,i.request=null,i.response=null},r=a?()=>i.progress?Math.min(i.progress,i.perceivedProgress):null:()=>i.progress||null,s=a?()=>Math.min(i.duration,i.perceivedDuration):()=>i.duration,p={...mi(),process:n,abort:l,getProgress:r,getDuration:s,reset:o};return p},On=e=>e.substring(0,e.lastIndexOf("."))||e,qs=e=>{let t=[e.name,e.size,e.type];return e instanceof Blob||Fi(e)?t[0]=e.name||An():Fi(e)?(t[1]=e.length,t[2]=Pn(e)):ge(e)&&(t[0]=Ct(e),t[1]=0,t[2]="application/octet-stream"),{name:t[0],size:t[1],type:t[2]}},et=e=>!!(e instanceof File||e instanceof Blob&&e.name),Dn=e=>{if(!de(e))return e;let t=ci(e)?[]:{};for(let i in e){if(!e.hasOwnProperty(i))continue;let a=e[i];t[i]=a&&de(a)?Dn(a):a}return t},$s=(e=null,t=null,i=null)=>{let a=Yi(),n={archived:!1,frozen:!1,released:!1,source:null,file:i,serverFileReference:t,transferId:null,processingAborted:!1,status:t?H.PROCESSING_COMPLETE:H.INIT,activeLoader:null,activeProcessor:null},l=null,o={},r=x=>n.status=x,s=(x,...R)=>{n.released||n.frozen||T.fire(x,...R)},p=()=>ui(n.file.name),c=()=>n.file.type,d=()=>n.file.size,m=()=>n.file,u=(x,R,P)=>{if(n.source=x,T.fireSync("init"),n.file){T.fireSync("load-skip");return}n.file=qs(x),R.on("init",()=>{s("load-init")}),R.on("meta",z=>{n.file.size=z.size,n.file.filename=z.filename,z.source&&(e=re.LIMBO,n.serverFileReference=z.source,n.status=H.PROCESSING_COMPLETE),s("load-meta")}),R.on("progress",z=>{r(H.LOADING),s("load-progress",z)}),R.on("error",z=>{r(H.LOAD_ERROR),s("load-request-error",z)}),R.on("abort",()=>{r(H.INIT),s("load-abort")}),R.on("load",z=>{n.activeLoader=null;let A=w=>{n.file=et(w)?w:n.file,e===re.LIMBO&&n.serverFileReference?r(H.PROCESSING_COMPLETE):r(H.IDLE),s("load")},B=w=>{n.file=z,s("load-meta"),r(H.LOAD_ERROR),s("load-file-error",w)};if(n.serverFileReference){A(z);return}P(z,A,B)}),R.setSource(x),n.activeLoader=R,R.load()},g=()=>{n.activeLoader&&n.activeLoader.load()},f=()=>{if(n.activeLoader){n.activeLoader.abort();return}r(H.INIT),s("load-abort")},h=(x,R)=>{if(n.processingAborted){n.processingAborted=!1;return}if(r(H.PROCESSING),l=null,!(n.file instanceof Blob)){T.on("load",()=>{h(x,R)});return}x.on("load",A=>{n.transferId=null,n.serverFileReference=A}),x.on("transfer",A=>{n.transferId=A}),x.on("load-perceived",A=>{n.activeProcessor=null,n.transferId=null,n.serverFileReference=A,r(H.PROCESSING_COMPLETE),s("process-complete",A)}),x.on("start",()=>{s("process-start")}),x.on("error",A=>{n.activeProcessor=null,r(H.PROCESSING_ERROR),s("process-error",A)}),x.on("abort",A=>{n.activeProcessor=null,n.serverFileReference=A,r(H.IDLE),s("process-abort"),l&&l()}),x.on("progress",A=>{s("process-progress",A)});let P=A=>{n.archived||x.process(A,{...o})},z=console.error;R(n.file,P,z),n.activeProcessor=x},I=()=>{n.processingAborted=!1,r(H.PROCESSING_QUEUED)},b=()=>new Promise(x=>{if(!n.activeProcessor){n.processingAborted=!0,r(H.IDLE),s("process-abort"),x();return}l=()=>{x()},n.activeProcessor.abort()}),E=(x,R)=>new Promise((P,z)=>{let A=n.serverFileReference!==null?n.serverFileReference:n.transferId;if(A===null){P();return}x(A,()=>{n.serverFileReference=null,n.transferId=null,P()},B=>{if(!R){P();return}r(H.PROCESSING_REVERT_ERROR),s("process-revert-error"),z(B)}),r(H.IDLE),s("process-revert")}),v=(x,R,P)=>{let z=x.split("."),A=z[0],B=z.pop(),w=o;z.forEach(F=>w=w[F]),JSON.stringify(w[B])!==JSON.stringify(R)&&(w[B]=R,s("metadata-update",{key:A,value:o[A],silent:P}))},T={id:{get:()=>a},origin:{get:()=>e,set:x=>e=x},serverId:{get:()=>n.serverFileReference},transferId:{get:()=>n.transferId},status:{get:()=>n.status},filename:{get:()=>n.file.name},filenameWithoutExtension:{get:()=>On(n.file.name)},fileExtension:{get:p},fileType:{get:c},fileSize:{get:d},file:{get:m},relativePath:{get:()=>n.file._relativePath},source:{get:()=>n.source},getMetadata:x=>Dn(x?o[x]:o),setMetadata:(x,R,P)=>{if(de(x)){let z=x;return Object.keys(z).forEach(A=>{v(A,z[A],R)}),x}return v(x,R,P),R},extend:(x,R)=>_[x]=R,abortLoad:f,retryLoad:g,requestProcessing:I,abortProcessing:b,load:u,process:h,revert:E,...mi(),freeze:()=>n.frozen=!0,release:()=>n.released=!0,released:{get:()=>n.released},archive:()=>n.archived=!0,archived:{get:()=>n.archived},setFile:x=>n.file=x},_=He(T);return _},Xs=(e,t)=>Ve(t)?0:ge(t)?e.findIndex(i=>i.id===t):-1,ja=(e,t)=>{let i=Xs(e,t);if(!(i<0))return e[i]||null},Ya=(e,t,i,a,n,l)=>{let o=Qe(null,e,{method:"GET",responseType:"blob"});return o.onload=r=>{let s=r.getAllResponseHeaders(),p=Xi(s).name||Ct(e);t(ae("load",r.status,bt(r.response,p),s))},o.onerror=r=>{i(ae("error",r.status,r.statusText,r.getAllResponseHeaders()))},o.onheaders=r=>{l(ae("headers",r.status,null,r.getAllResponseHeaders()))},o.ontimeout=Je(i),o.onprogress=a,o.onabort=n,o},qa=e=>(e.indexOf("//")===0&&(e=location.protocol+e),e.toLowerCase().replace("blob:","").replace(/([a-z])?:\/\//,"$1").split("/")[0]),Ks=e=>(e.indexOf(":")>-1||e.indexOf("//")>-1)&&qa(location.href)!==qa(e),Jt=e=>(...t)=>Ke(e)?e(...t):e,Zs=e=>!et(e.file),wi=(e,t)=>{clearTimeout(t.listUpdateTimeout),t.listUpdateTimeout=setTimeout(()=>{e("DID_UPDATE_ITEMS",{items:ze(t.items)})},0)},$a=(e,...t)=>new Promise(i=>{if(!e)return i(!0);let a=e(...t);if(a==null)return i(!0);if(typeof a=="boolean")return i(a);typeof a.then=="function"&&a.then(i)}),Li=(e,t)=>{e.items.sort((i,a)=>t(he(i),he(a)))},ye=(e,t)=>({query:i,success:a=()=>{},failure:n=()=>{},...l}={})=>{let o=Ze(e.items,i);if(!o){n({error:ae("error",0,"Item not found"),file:null});return}t(o,a,n,l||{})},Qs=(e,t,i)=>({ABORT_ALL:()=>{ze(i.items).forEach(a=>{a.freeze(),a.abortLoad(),a.abortProcessing()})},DID_SET_FILES:({value:a=[]})=>{let n=a.map(o=>({source:o.source?o.source:o,options:o.options})),l=ze(i.items);l.forEach(o=>{n.find(r=>r.source===o.source||r.source===o.file)||e("REMOVE_ITEM",{query:o,remove:!1})}),l=ze(i.items),n.forEach((o,r)=>{l.find(s=>s.source===o.source||s.file===o.source)||e("ADD_ITEM",{...o,interactionMethod:Re.NONE,index:r})})},DID_UPDATE_ITEM_METADATA:({id:a,action:n,change:l})=>{l.silent||(clearTimeout(i.itemUpdateTimeout),i.itemUpdateTimeout=setTimeout(()=>{let o=ja(i.items,a);if(!t("IS_ASYNC")){Ae("SHOULD_PREPARE_OUTPUT",!1,{item:o,query:t,action:n,change:l}).then(c=>{let d=t("GET_BEFORE_PREPARE_FILE");d&&(c=d(o,c)),c&&e("REQUEST_PREPARE_OUTPUT",{query:a,item:o,success:m=>{e("DID_PREPARE_OUTPUT",{id:a,file:m})}},!0)});return}o.origin===re.LOCAL&&e("DID_LOAD_ITEM",{id:o.id,error:null,serverFileReference:o.source});let r=()=>{setTimeout(()=>{e("REQUEST_ITEM_PROCESSING",{query:a})},32)},s=c=>{o.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(c?r:()=>{}).catch(()=>{})},p=c=>{o.abortProcessing().then(c?r:()=>{})};if(o.status===H.PROCESSING_COMPLETE)return s(i.options.instantUpload);if(o.status===H.PROCESSING)return p(i.options.instantUpload);i.options.instantUpload&&r()},0))},MOVE_ITEM:({query:a,index:n})=>{let l=Ze(i.items,a);if(!l)return;let o=i.items.indexOf(l);n=Mn(n,0,i.items.length-1),o!==n&&i.items.splice(n,0,i.items.splice(o,1)[0])},SORT:({compare:a})=>{Li(i,a),e("DID_SORT_ITEMS",{items:t("GET_ACTIVE_ITEMS")})},ADD_ITEMS:({items:a,index:n,interactionMethod:l,success:o=()=>{},failure:r=()=>{}})=>{let s=n;if(n===-1||typeof n>"u"){let u=t("GET_ITEM_INSERT_LOCATION"),g=t("GET_TOTAL_ITEMS");s=u==="before"?0:g}let p=t("GET_IGNORED_FILES"),c=u=>et(u)?!p.includes(u.name.toLowerCase()):!Ve(u),m=a.filter(c).map(u=>new Promise((g,f)=>{e("ADD_ITEM",{interactionMethod:l,source:u.source||u,success:g,failure:f,index:s++,options:u.options||{}})}));Promise.all(m).then(o).catch(r)},ADD_ITEM:({source:a,index:n=-1,interactionMethod:l,success:o=()=>{},failure:r=()=>{},options:s={}})=>{if(Ve(a)){r({error:ae("error",0,"No source"),file:null});return}if(et(a)&&i.options.ignoredFiles.includes(a.name.toLowerCase()))return;if(!Ls(i)){if(i.options.allowMultiple||!i.options.allowMultiple&&!i.options.allowReplace){let b=ae("warning",0,"Max files");e("DID_THROW_MAX_FILES",{source:a,error:b}),r({error:b,file:null});return}let I=ze(i.items)[0];if(I.status===H.PROCESSING_COMPLETE||I.status===H.PROCESSING_REVERT_ERROR){let b=t("GET_FORCE_REVERT");if(I.revert(Pt(i.options.server.url,i.options.server.revert),b).then(()=>{b&&e("ADD_ITEM",{source:a,index:n,interactionMethod:l,success:o,failure:r,options:s})}).catch(()=>{}),b)return}e("REMOVE_ITEM",{query:I.id})}let p=s.type==="local"?re.LOCAL:s.type==="limbo"?re.LIMBO:re.INPUT,c=$s(p,p===re.INPUT?null:a,s.file);Object.keys(s.metadata||{}).forEach(I=>{c.setMetadata(I,s.metadata[I])}),it("DID_CREATE_ITEM",c,{query:t,dispatch:e});let d=t("GET_ITEM_INSERT_LOCATION");i.options.itemInsertLocationFreedom||(n=d==="before"?-1:i.items.length),As(i.items,c,n),Ke(d)&&a&&Li(i,d);let m=c.id;c.on("init",()=>{e("DID_INIT_ITEM",{id:m})}),c.on("load-init",()=>{e("DID_START_ITEM_LOAD",{id:m})}),c.on("load-meta",()=>{e("DID_UPDATE_ITEM_META",{id:m})}),c.on("load-progress",I=>{e("DID_UPDATE_ITEM_LOAD_PROGRESS",{id:m,progress:I})}),c.on("load-request-error",I=>{let b=Jt(i.options.labelFileLoadError)(I);if(I.code>=400&&I.code<500){e("DID_THROW_ITEM_INVALID",{id:m,error:I,status:{main:b,sub:`${I.code} (${I.body})`}}),r({error:I,file:he(c)});return}e("DID_THROW_ITEM_LOAD_ERROR",{id:m,error:I,status:{main:b,sub:i.options.labelTapToRetry}})}),c.on("load-file-error",I=>{e("DID_THROW_ITEM_INVALID",{id:m,error:I.status,status:I.status}),r({error:I.status,file:he(c)})}),c.on("load-abort",()=>{e("REMOVE_ITEM",{query:m})}),c.on("load-skip",()=>{c.on("metadata-update",I=>{et(c.file)&&e("DID_UPDATE_ITEM_METADATA",{id:m,change:I})}),e("COMPLETE_LOAD_ITEM",{query:m,item:c,data:{source:a,success:o}})}),c.on("load",()=>{let I=b=>{if(!b){e("REMOVE_ITEM",{query:m});return}c.on("metadata-update",E=>{e("DID_UPDATE_ITEM_METADATA",{id:m,change:E})}),Ae("SHOULD_PREPARE_OUTPUT",!1,{item:c,query:t}).then(E=>{let v=t("GET_BEFORE_PREPARE_FILE");v&&(E=v(c,E));let y=()=>{e("COMPLETE_LOAD_ITEM",{query:m,item:c,data:{source:a,success:o}}),wi(e,i)};if(E){e("REQUEST_PREPARE_OUTPUT",{query:m,item:c,success:T=>{e("DID_PREPARE_OUTPUT",{id:m,file:T}),y()}},!0);return}y()})};Ae("DID_LOAD_ITEM",c,{query:t,dispatch:e}).then(()=>{$a(t("GET_BEFORE_ADD_FILE"),he(c)).then(I)}).catch(b=>{if(!b||!b.error||!b.status)return I(!1);e("DID_THROW_ITEM_INVALID",{id:m,error:b.error,status:b.status})})}),c.on("process-start",()=>{e("DID_START_ITEM_PROCESSING",{id:m})}),c.on("process-progress",I=>{e("DID_UPDATE_ITEM_PROCESS_PROGRESS",{id:m,progress:I})}),c.on("process-error",I=>{e("DID_THROW_ITEM_PROCESSING_ERROR",{id:m,error:I,status:{main:Jt(i.options.labelFileProcessingError)(I),sub:i.options.labelTapToRetry}})}),c.on("process-revert-error",I=>{e("DID_THROW_ITEM_PROCESSING_REVERT_ERROR",{id:m,error:I,status:{main:Jt(i.options.labelFileProcessingRevertError)(I),sub:i.options.labelTapToRetry}})}),c.on("process-complete",I=>{e("DID_COMPLETE_ITEM_PROCESSING",{id:m,error:null,serverFileReference:I}),e("DID_DEFINE_VALUE",{id:m,value:I})}),c.on("process-abort",()=>{e("DID_ABORT_ITEM_PROCESSING",{id:m})}),c.on("process-revert",()=>{e("DID_REVERT_ITEM_PROCESSING",{id:m}),e("DID_DEFINE_VALUE",{id:m,value:null})}),e("DID_ADD_ITEM",{id:m,index:n,interactionMethod:l}),wi(e,i);let{url:u,load:g,restore:f,fetch:h}=i.options.server||{};c.load(a,Gs(p===re.INPUT?ge(a)&&Ks(a)&&h?_i(u,h):Ya:p===re.LIMBO?_i(u,f):_i(u,g)),(I,b,E)=>{Ae("LOAD_FILE",I,{query:t}).then(b).catch(E)})},REQUEST_PREPARE_OUTPUT:({item:a,success:n,failure:l=()=>{}})=>{let o={error:ae("error",0,"Item not found"),file:null};if(a.archived)return l(o);Ae("PREPARE_OUTPUT",a.file,{query:t,item:a}).then(r=>{Ae("COMPLETE_PREPARE_OUTPUT",r,{query:t,item:a}).then(s=>{if(a.archived)return l(o);n(s)})})},COMPLETE_LOAD_ITEM:({item:a,data:n})=>{let{success:l,source:o}=n,r=t("GET_ITEM_INSERT_LOCATION");if(Ke(r)&&o&&Li(i,r),e("DID_LOAD_ITEM",{id:a.id,error:null,serverFileReference:a.origin===re.INPUT?null:o}),l(he(a)),a.origin===re.LOCAL){e("DID_LOAD_LOCAL_ITEM",{id:a.id});return}if(a.origin===re.LIMBO){e("DID_COMPLETE_ITEM_PROCESSING",{id:a.id,error:null,serverFileReference:o}),e("DID_DEFINE_VALUE",{id:a.id,value:a.serverId||o});return}t("IS_ASYNC")&&i.options.instantUpload&&e("REQUEST_ITEM_PROCESSING",{query:a.id})},RETRY_ITEM_LOAD:ye(i,a=>{a.retryLoad()}),REQUEST_ITEM_PREPARE:ye(i,(a,n,l)=>{e("REQUEST_PREPARE_OUTPUT",{query:a.id,item:a,success:o=>{e("DID_PREPARE_OUTPUT",{id:a.id,file:o}),n({file:a,output:o})},failure:l},!0)}),REQUEST_ITEM_PROCESSING:ye(i,(a,n,l)=>{if(!(a.status===H.IDLE||a.status===H.PROCESSING_ERROR)){let r=()=>e("REQUEST_ITEM_PROCESSING",{query:a,success:n,failure:l}),s=()=>document.hidden?r():setTimeout(r,32);a.status===H.PROCESSING_COMPLETE||a.status===H.PROCESSING_REVERT_ERROR?a.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(s).catch(()=>{}):a.status===H.PROCESSING&&a.abortProcessing().then(s);return}a.status!==H.PROCESSING_QUEUED&&(a.requestProcessing(),e("DID_REQUEST_ITEM_PROCESSING",{id:a.id}),e("PROCESS_ITEM",{query:a,success:n,failure:l},!0))}),PROCESS_ITEM:ye(i,(a,n,l)=>{let o=t("GET_MAX_PARALLEL_UPLOADS");if(t("GET_ITEMS_BY_STATUS",H.PROCESSING).length===o){i.processingQueue.push({id:a.id,success:n,failure:l});return}if(a.status===H.PROCESSING)return;let s=()=>{let c=i.processingQueue.shift();if(!c)return;let{id:d,success:m,failure:u}=c,g=Ze(i.items,d);if(!g||g.archived){s();return}e("PROCESS_ITEM",{query:d,success:m,failure:u},!0)};a.onOnce("process-complete",()=>{n(he(a)),s();let c=i.options.server;if(i.options.instantUpload&&a.origin===re.LOCAL&&Ke(c.remove)){let u=()=>{};a.origin=re.LIMBO,i.options.server.remove(a.source,u,u)}t("GET_ITEMS_BY_STATUS",H.PROCESSING_COMPLETE).length===i.items.length&&e("DID_COMPLETE_ITEM_PROCESSING_ALL")}),a.onOnce("process-error",c=>{l({error:c,file:he(a)}),s()});let p=i.options;a.process(Ys(Ws(p.server.url,p.server.process,p.name,{chunkTransferId:a.transferId,chunkServer:p.server.patch,chunkUploads:p.chunkUploads,chunkForce:p.chunkForce,chunkSize:p.chunkSize,chunkRetryDelays:p.chunkRetryDelays}),{allowMinimumUploadDuration:t("GET_ALLOW_MINIMUM_UPLOAD_DURATION")}),(c,d,m)=>{Ae("PREPARE_OUTPUT",c,{query:t,item:a}).then(u=>{e("DID_PREPARE_OUTPUT",{id:a.id,file:u}),d(u)}).catch(m)})}),RETRY_ITEM_PROCESSING:ye(i,a=>{e("REQUEST_ITEM_PROCESSING",{query:a})}),REQUEST_REMOVE_ITEM:ye(i,a=>{$a(t("GET_BEFORE_REMOVE_FILE"),he(a)).then(n=>{n&&e("REMOVE_ITEM",{query:a})})}),RELEASE_ITEM:ye(i,a=>{a.release()}),REMOVE_ITEM:ye(i,(a,n,l,o)=>{let r=()=>{let p=a.id;ja(i.items,p).archive(),e("DID_REMOVE_ITEM",{error:null,id:p,item:a}),wi(e,i),n(he(a))},s=i.options.server;a.origin===re.LOCAL&&s&&Ke(s.remove)&&o.remove!==!1?(e("DID_START_ITEM_REMOVE",{id:a.id}),s.remove(a.source,()=>r(),p=>{e("DID_THROW_ITEM_REMOVE_ERROR",{id:a.id,error:ae("error",0,p,null),status:{main:Jt(i.options.labelFileRemoveError)(p),sub:i.options.labelTapToRetry}})})):((o.revert&&a.origin!==re.LOCAL&&a.serverId!==null||i.options.chunkUploads&&a.file.size>i.options.chunkSize||i.options.chunkUploads&&i.options.chunkForce)&&a.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")),r())}),ABORT_ITEM_LOAD:ye(i,a=>{a.abortLoad()}),ABORT_ITEM_PROCESSING:ye(i,a=>{if(a.serverId){e("REVERT_ITEM_PROCESSING",{id:a.id});return}a.abortProcessing().then(()=>{i.options.instantUpload&&e("REMOVE_ITEM",{query:a.id})})}),REQUEST_REVERT_ITEM_PROCESSING:ye(i,a=>{if(!i.options.instantUpload){e("REVERT_ITEM_PROCESSING",{query:a});return}let n=r=>{r&&e("REVERT_ITEM_PROCESSING",{query:a})},l=t("GET_BEFORE_REMOVE_FILE");if(!l)return n(!0);let o=l(he(a));if(o==null)return n(!0);if(typeof o=="boolean")return n(o);typeof o.then=="function"&&o.then(n)}),REVERT_ITEM_PROCESSING:ye(i,a=>{a.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(()=>{(i.options.instantUpload||Zs(a))&&e("REMOVE_ITEM",{query:a.id})}).catch(()=>{})}),SET_OPTIONS:({options:a})=>{let n=Object.keys(a),l=Js.filter(r=>n.includes(r));[...l,...Object.keys(a).filter(r=>!l.includes(r))].forEach(r=>{e(`SET_${pi(r,"_").toUpperCase()}`,{value:a[r]})})}}),Js=["server"],Ki=e=>e,Ge=e=>document.createElement(e),ne=(e,t)=>{let i=e.childNodes[0];i?t!==i.nodeValue&&(i.nodeValue=t):(i=document.createTextNode(t),e.appendChild(i))},Xa=(e,t,i,a)=>{let n=(a%360-90)*Math.PI/180;return{x:e+i*Math.cos(n),y:t+i*Math.sin(n)}},ec=(e,t,i,a,n,l)=>{let o=Xa(e,t,i,n),r=Xa(e,t,i,a);return["M",o.x,o.y,"A",i,i,0,l,0,r.x,r.y].join(" ")},tc=(e,t,i,a,n)=>{let l=1;return n>a&&n-a<=.5&&(l=0),a>n&&a-n>=.5&&(l=0),ec(e,t,i,Math.min(.9999,a)*360,Math.min(.9999,n)*360,l)},ic=({root:e,props:t})=>{t.spin=!1,t.progress=0,t.opacity=0;let i=li("svg");e.ref.path=li("path",{"stroke-width":2,"stroke-linecap":"round"}),i.appendChild(e.ref.path),e.ref.svg=i,e.appendChild(i)},ac=({root:e,props:t})=>{if(t.opacity===0)return;t.align&&(e.element.dataset.align=t.align);let i=parseInt(se(e.ref.path,"stroke-width"),10),a=e.rect.element.width*.5,n=0,l=0;t.spin?(n=0,l=.5):(n=0,l=t.progress);let o=tc(a,a,a-i,n,l);se(e.ref.path,"d",o),se(e.ref.path,"stroke-opacity",t.spin||t.progress>0?1:0)},Ka=le({tag:"div",name:"progress-indicator",ignoreRectUpdate:!0,ignoreRect:!0,create:ic,write:ac,mixins:{apis:["progress","spin","align"],styles:["opacity"],animations:{opacity:{type:"tween",duration:500},progress:{type:"spring",stiffness:.95,damping:.65,mass:10}}}}),nc=({root:e,props:t})=>{e.element.innerHTML=(t.icon||"")+`${t.label}`,t.isDisabled=!1},lc=({root:e,props:t})=>{let{isDisabled:i}=t,a=e.query("GET_DISABLED")||t.opacity===0;a&&!i?(t.isDisabled=!0,se(e.element,"disabled","disabled")):!a&&i&&(t.isDisabled=!1,e.element.removeAttribute("disabled"))},Cn=le({tag:"button",attributes:{type:"button"},ignoreRect:!0,ignoreRectUpdate:!0,name:"file-action-button",mixins:{apis:["label"],styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}},listeners:!0},create:nc,write:lc}),Bn=(e,t=".",i=1e3,a={})=>{let{labelBytes:n="bytes",labelKilobytes:l="KB",labelMegabytes:o="MB",labelGigabytes:r="GB"}=a;e=Math.round(Math.abs(e));let s=i,p=i*i,c=i*i*i;return ee.toFixed(t).split(".").filter(a=>a!=="0").join(i),oc=({root:e,props:t})=>{let i=Ge("span");i.className="filepond--file-info-main",se(i,"aria-hidden","true"),e.appendChild(i),e.ref.fileName=i;let a=Ge("span");a.className="filepond--file-info-sub",e.appendChild(a),e.ref.fileSize=a,ne(a,e.query("GET_LABEL_FILE_WAITING_FOR_SIZE")),ne(i,Ki(e.query("GET_ITEM_NAME",t.id)))},Oi=({root:e,props:t})=>{ne(e.ref.fileSize,Bn(e.query("GET_ITEM_SIZE",t.id),".",e.query("GET_FILE_SIZE_BASE"),e.query("GET_FILE_SIZE_LABELS",e.query))),ne(e.ref.fileName,Ki(e.query("GET_ITEM_NAME",t.id)))},Qa=({root:e,props:t})=>{if(Et(e.query("GET_ITEM_SIZE",t.id))){Oi({root:e,props:t});return}ne(e.ref.fileSize,e.query("GET_LABEL_FILE_SIZE_NOT_AVAILABLE"))},rc=le({name:"file-info",ignoreRect:!0,ignoreRectUpdate:!0,write:fe({DID_LOAD_ITEM:Oi,DID_UPDATE_ITEM_META:Oi,DID_THROW_ITEM_LOAD_ERROR:Qa,DID_THROW_ITEM_INVALID:Qa}),didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},create:oc,mixins:{styles:["translateX","translateY"],animations:{translateX:"spring",translateY:"spring"}}}),kn=e=>Math.round(e*100),sc=({root:e})=>{let t=Ge("span");t.className="filepond--file-status-main",e.appendChild(t),e.ref.main=t;let i=Ge("span");i.className="filepond--file-status-sub",e.appendChild(i),e.ref.sub=i,Nn({root:e,action:{progress:null}})},Nn=({root:e,action:t})=>{let i=t.progress===null?e.query("GET_LABEL_FILE_LOADING"):`${e.query("GET_LABEL_FILE_LOADING")} ${kn(t.progress)}%`;ne(e.ref.main,i),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},cc=({root:e,action:t})=>{let i=t.progress===null?e.query("GET_LABEL_FILE_PROCESSING"):`${e.query("GET_LABEL_FILE_PROCESSING")} ${kn(t.progress)}%`;ne(e.ref.main,i),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},dc=({root:e})=>{ne(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING")),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},pc=({root:e})=>{ne(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING_ABORTED")),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_RETRY"))},mc=({root:e})=>{ne(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING_COMPLETE")),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_UNDO"))},Ja=({root:e})=>{ne(e.ref.main,""),ne(e.ref.sub,"")},Ft=({root:e,action:t})=>{ne(e.ref.main,t.status.main),ne(e.ref.sub,t.status.sub)},uc=le({name:"file-status",ignoreRect:!0,ignoreRectUpdate:!0,write:fe({DID_LOAD_ITEM:Ja,DID_REVERT_ITEM_PROCESSING:Ja,DID_REQUEST_ITEM_PROCESSING:dc,DID_ABORT_ITEM_PROCESSING:pc,DID_COMPLETE_ITEM_PROCESSING:mc,DID_UPDATE_ITEM_PROCESS_PROGRESS:cc,DID_UPDATE_ITEM_LOAD_PROGRESS:Nn,DID_THROW_ITEM_LOAD_ERROR:Ft,DID_THROW_ITEM_INVALID:Ft,DID_THROW_ITEM_PROCESSING_ERROR:Ft,DID_THROW_ITEM_PROCESSING_REVERT_ERROR:Ft,DID_THROW_ITEM_REMOVE_ERROR:Ft}),didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},create:sc,mixins:{styles:["translateX","translateY","opacity"],animations:{opacity:{type:"tween",duration:250},translateX:"spring",translateY:"spring"}}}),Di={AbortItemLoad:{label:"GET_LABEL_BUTTON_ABORT_ITEM_LOAD",action:"ABORT_ITEM_LOAD",className:"filepond--action-abort-item-load",align:"LOAD_INDICATOR_POSITION"},RetryItemLoad:{label:"GET_LABEL_BUTTON_RETRY_ITEM_LOAD",action:"RETRY_ITEM_LOAD",icon:"GET_ICON_RETRY",className:"filepond--action-retry-item-load",align:"BUTTON_PROCESS_ITEM_POSITION"},RemoveItem:{label:"GET_LABEL_BUTTON_REMOVE_ITEM",action:"REQUEST_REMOVE_ITEM",icon:"GET_ICON_REMOVE",className:"filepond--action-remove-item",align:"BUTTON_REMOVE_ITEM_POSITION"},ProcessItem:{label:"GET_LABEL_BUTTON_PROCESS_ITEM",action:"REQUEST_ITEM_PROCESSING",icon:"GET_ICON_PROCESS",className:"filepond--action-process-item",align:"BUTTON_PROCESS_ITEM_POSITION"},AbortItemProcessing:{label:"GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING",action:"ABORT_ITEM_PROCESSING",className:"filepond--action-abort-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"},RetryItemProcessing:{label:"GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING",action:"RETRY_ITEM_PROCESSING",icon:"GET_ICON_RETRY",className:"filepond--action-retry-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"},RevertItemProcessing:{label:"GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING",action:"REQUEST_REVERT_ITEM_PROCESSING",icon:"GET_ICON_UNDO",className:"filepond--action-revert-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"}},Ci=[];te(Di,e=>{Ci.push(e)});var Ie=e=>{if(Bi(e)==="right")return 0;let t=e.ref.buttonRemoveItem.rect.element;return t.hidden?null:t.width+t.left},gc=e=>e.ref.buttonAbortItemLoad.rect.element.width,ei=e=>Math.floor(e.ref.buttonRemoveItem.rect.element.height/4),fc=e=>Math.floor(e.ref.buttonRemoveItem.rect.element.left/2),hc=e=>e.query("GET_STYLE_LOAD_INDICATOR_POSITION"),bc=e=>e.query("GET_STYLE_PROGRESS_INDICATOR_POSITION"),Bi=e=>e.query("GET_STYLE_BUTTON_REMOVE_ITEM_POSITION"),Ec={buttonAbortItemLoad:{opacity:0},buttonRetryItemLoad:{opacity:0},buttonRemoveItem:{opacity:0},buttonProcessItem:{opacity:0},buttonAbortItemProcessing:{opacity:0},buttonRetryItemProcessing:{opacity:0},buttonRevertItemProcessing:{opacity:0},loadProgressIndicator:{opacity:0,align:hc},processProgressIndicator:{opacity:0,align:bc},processingCompleteIndicator:{opacity:0,scaleX:.75,scaleY:.75},info:{translateX:0,translateY:0,opacity:0},status:{translateX:0,translateY:0,opacity:0}},en={buttonRemoveItem:{opacity:1},buttonProcessItem:{opacity:1},info:{translateX:Ie},status:{translateX:Ie}},Mi={buttonAbortItemProcessing:{opacity:1},processProgressIndicator:{opacity:1},status:{opacity:1}},ut={DID_THROW_ITEM_INVALID:{buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{translateX:Ie,opacity:1}},DID_START_ITEM_LOAD:{buttonAbortItemLoad:{opacity:1},loadProgressIndicator:{opacity:1},status:{opacity:1}},DID_THROW_ITEM_LOAD_ERROR:{buttonRetryItemLoad:{opacity:1},buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{opacity:1}},DID_START_ITEM_REMOVE:{processProgressIndicator:{opacity:1,align:Bi},info:{translateX:Ie},status:{opacity:0}},DID_THROW_ITEM_REMOVE_ERROR:{processProgressIndicator:{opacity:0,align:Bi},buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{opacity:1,translateX:Ie}},DID_LOAD_ITEM:en,DID_LOAD_LOCAL_ITEM:{buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{translateX:Ie}},DID_START_ITEM_PROCESSING:Mi,DID_REQUEST_ITEM_PROCESSING:Mi,DID_UPDATE_ITEM_PROCESS_PROGRESS:Mi,DID_COMPLETE_ITEM_PROCESSING:{buttonRevertItemProcessing:{opacity:1},info:{opacity:1},status:{opacity:1}},DID_THROW_ITEM_PROCESSING_ERROR:{buttonRemoveItem:{opacity:1},buttonRetryItemProcessing:{opacity:1},status:{opacity:1},info:{translateX:Ie}},DID_THROW_ITEM_PROCESSING_REVERT_ERROR:{buttonRevertItemProcessing:{opacity:1},status:{opacity:1},info:{opacity:1}},DID_ABORT_ITEM_PROCESSING:{buttonRemoveItem:{opacity:1},buttonProcessItem:{opacity:1},info:{translateX:Ie},status:{opacity:1}},DID_REVERT_ITEM_PROCESSING:en},Tc=le({create:({root:e})=>{e.element.innerHTML=e.query("GET_ICON_DONE")},name:"processing-complete-indicator",ignoreRect:!0,mixins:{styles:["scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",opacity:{type:"tween",duration:250}}}}),Ic=({root:e,props:t})=>{let i=Object.keys(Di).reduce((g,f)=>(g[f]={...Di[f]},g),{}),{id:a}=t,n=e.query("GET_ALLOW_REVERT"),l=e.query("GET_ALLOW_REMOVE"),o=e.query("GET_ALLOW_PROCESS"),r=e.query("GET_INSTANT_UPLOAD"),s=e.query("IS_ASYNC"),p=e.query("GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN"),c;s?o&&!n?c=g=>!/RevertItemProcessing/.test(g):!o&&n?c=g=>!/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(g):!o&&!n&&(c=g=>!/Process/.test(g)):c=g=>!/Process/.test(g);let d=c?Ci.filter(c):Ci.concat();if(r&&n&&(i.RevertItemProcessing.label="GET_LABEL_BUTTON_REMOVE_ITEM",i.RevertItemProcessing.icon="GET_ICON_REMOVE"),s&&!n){let g=ut.DID_COMPLETE_ITEM_PROCESSING;g.info.translateX=fc,g.info.translateY=ei,g.status.translateY=ei,g.processingCompleteIndicator={opacity:1,scaleX:1,scaleY:1}}if(s&&!o&&(["DID_START_ITEM_PROCESSING","DID_REQUEST_ITEM_PROCESSING","DID_UPDATE_ITEM_PROCESS_PROGRESS","DID_THROW_ITEM_PROCESSING_ERROR"].forEach(g=>{ut[g].status.translateY=ei}),ut.DID_THROW_ITEM_PROCESSING_ERROR.status.translateX=gc),p&&n){i.RevertItemProcessing.align="BUTTON_REMOVE_ITEM_POSITION";let g=ut.DID_COMPLETE_ITEM_PROCESSING;g.info.translateX=Ie,g.status.translateY=ei,g.processingCompleteIndicator={opacity:1,scaleX:1,scaleY:1}}l||(i.RemoveItem.disabled=!0),te(i,(g,f)=>{let h=e.createChildView(Cn,{label:e.query(f.label),icon:e.query(f.icon),opacity:0});d.includes(g)&&e.appendChildView(h),f.disabled&&(h.element.setAttribute("disabled","disabled"),h.element.setAttribute("hidden","hidden")),h.element.dataset.align=e.query(`GET_STYLE_${f.align}`),h.element.classList.add(f.className),h.on("click",I=>{I.stopPropagation(),!f.disabled&&e.dispatch(f.action,{query:a})}),e.ref[`button${g}`]=h}),e.ref.processingCompleteIndicator=e.appendChildView(e.createChildView(Tc)),e.ref.processingCompleteIndicator.element.dataset.align=e.query("GET_STYLE_BUTTON_PROCESS_ITEM_POSITION"),e.ref.info=e.appendChildView(e.createChildView(rc,{id:a})),e.ref.status=e.appendChildView(e.createChildView(uc,{id:a}));let m=e.appendChildView(e.createChildView(Ka,{opacity:0,align:e.query("GET_STYLE_LOAD_INDICATOR_POSITION")}));m.element.classList.add("filepond--load-indicator"),e.ref.loadProgressIndicator=m;let u=e.appendChildView(e.createChildView(Ka,{opacity:0,align:e.query("GET_STYLE_PROGRESS_INDICATOR_POSITION")}));u.element.classList.add("filepond--process-indicator"),e.ref.processProgressIndicator=u,e.ref.activeStyles=[]},vc=({root:e,actions:t,props:i})=>{xc({root:e,actions:t,props:i});let a=t.concat().filter(n=>/^DID_/.test(n.type)).reverse().find(n=>ut[n.type]);if(a){e.ref.activeStyles=[];let n=ut[a.type];te(Ec,(l,o)=>{let r=e.ref[l];te(o,(s,p)=>{let c=n[l]&&typeof n[l][s]<"u"?n[l][s]:p;e.ref.activeStyles.push({control:r,key:s,value:c})})})}e.ref.activeStyles.forEach(({control:n,key:l,value:o})=>{n[l]=typeof o=="function"?o(e):o})},xc=fe({DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING:({root:e,action:t})=>{e.ref.buttonAbortItemProcessing.label=t.value},DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD:({root:e,action:t})=>{e.ref.buttonAbortItemLoad.label=t.value},DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL:({root:e,action:t})=>{e.ref.buttonAbortItemRemoval.label=t.value},DID_REQUEST_ITEM_PROCESSING:({root:e})=>{e.ref.processProgressIndicator.spin=!0,e.ref.processProgressIndicator.progress=0},DID_START_ITEM_LOAD:({root:e})=>{e.ref.loadProgressIndicator.spin=!0,e.ref.loadProgressIndicator.progress=0},DID_START_ITEM_REMOVE:({root:e})=>{e.ref.processProgressIndicator.spin=!0,e.ref.processProgressIndicator.progress=0},DID_UPDATE_ITEM_LOAD_PROGRESS:({root:e,action:t})=>{e.ref.loadProgressIndicator.spin=!1,e.ref.loadProgressIndicator.progress=t.progress},DID_UPDATE_ITEM_PROCESS_PROGRESS:({root:e,action:t})=>{e.ref.processProgressIndicator.spin=!1,e.ref.processProgressIndicator.progress=t.progress}}),yc=le({create:Ic,write:vc,didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},name:"file"}),Rc=({root:e,props:t})=>{e.ref.fileName=Ge("legend"),e.appendChild(e.ref.fileName),e.ref.file=e.appendChildView(e.createChildView(yc,{id:t.id})),e.ref.data=!1},Sc=({root:e,props:t})=>{ne(e.ref.fileName,Ki(e.query("GET_ITEM_NAME",t.id)))},_c=le({create:Rc,ignoreRect:!0,write:fe({DID_LOAD_ITEM:Sc}),didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},tag:"fieldset",name:"file-wrapper"}),tn={type:"spring",damping:.6,mass:7},wc=({root:e,props:t})=>{[{name:"top"},{name:"center",props:{translateY:null,scaleY:null},mixins:{animations:{scaleY:tn},styles:["translateY","scaleY"]}},{name:"bottom",props:{translateY:null},mixins:{animations:{translateY:tn},styles:["translateY"]}}].forEach(i=>{Lc(e,i,t.name)}),e.element.classList.add(`filepond--${t.name}`),e.ref.scalable=null},Lc=(e,t,i)=>{let a=le({name:`panel-${t.name} filepond--${i}`,mixins:t.mixins,ignoreRectUpdate:!0}),n=e.createChildView(a,t.props);e.ref[t.name]=e.appendChildView(n)},Mc=({root:e,props:t})=>{if((e.ref.scalable===null||t.scalable!==e.ref.scalable)&&(e.ref.scalable=In(t.scalable)?t.scalable:!0,e.element.dataset.scalable=e.ref.scalable),!t.height)return;let i=e.ref.top.rect.element,a=e.ref.bottom.rect.element,n=Math.max(i.height+a.height,t.height);e.ref.center.translateY=i.height,e.ref.center.scaleY=(n-i.height-a.height)/100,e.ref.bottom.translateY=n-a.height},Vn=le({name:"panel",read:({root:e,props:t})=>t.heightCurrent=e.ref.bottom.translateY,write:Mc,create:wc,ignoreRect:!0,mixins:{apis:["height","heightCurrent","scalable"]}}),Ac=e=>{let t=e.map(a=>a.id),i;return{setIndex:a=>{i=a},getIndex:()=>i,getItemIndex:a=>t.indexOf(a.id)}},an={type:"spring",stiffness:.75,damping:.45,mass:10},nn="spring",ln={DID_START_ITEM_LOAD:"busy",DID_UPDATE_ITEM_LOAD_PROGRESS:"loading",DID_THROW_ITEM_INVALID:"load-invalid",DID_THROW_ITEM_LOAD_ERROR:"load-error",DID_LOAD_ITEM:"idle",DID_THROW_ITEM_REMOVE_ERROR:"remove-error",DID_START_ITEM_REMOVE:"busy",DID_START_ITEM_PROCESSING:"busy processing",DID_REQUEST_ITEM_PROCESSING:"busy processing",DID_UPDATE_ITEM_PROCESS_PROGRESS:"processing",DID_COMPLETE_ITEM_PROCESSING:"processing-complete",DID_THROW_ITEM_PROCESSING_ERROR:"processing-error",DID_THROW_ITEM_PROCESSING_REVERT_ERROR:"processing-revert-error",DID_ABORT_ITEM_PROCESSING:"cancelled",DID_REVERT_ITEM_PROCESSING:"idle"},zc=({root:e,props:t})=>{if(e.ref.handleClick=a=>e.dispatch("DID_ACTIVATE_ITEM",{id:t.id}),e.element.id=`filepond--item-${t.id}`,e.element.addEventListener("click",e.ref.handleClick),e.ref.container=e.appendChildView(e.createChildView(_c,{id:t.id})),e.ref.panel=e.appendChildView(e.createChildView(Vn,{name:"item-panel"})),e.ref.panel.height=null,t.markedForRemoval=!1,!e.query("GET_ALLOW_REORDER"))return;e.element.dataset.dragState="idle";let i=a=>{if(!a.isPrimary)return;let n=!1,l={x:a.pageX,y:a.pageY};t.dragOrigin={x:e.translateX,y:e.translateY},t.dragCenter={x:a.offsetX,y:a.offsetY};let o=Ac(e.query("GET_ACTIVE_ITEMS"));e.dispatch("DID_GRAB_ITEM",{id:t.id,dragState:o});let r=d=>{if(!d.isPrimary)return;d.stopPropagation(),d.preventDefault(),t.dragOffset={x:d.pageX-l.x,y:d.pageY-l.y},t.dragOffset.x*t.dragOffset.x+t.dragOffset.y*t.dragOffset.y>16&&!n&&(n=!0,e.element.removeEventListener("click",e.ref.handleClick)),e.dispatch("DID_DRAG_ITEM",{id:t.id,dragState:o})},s=d=>{d.isPrimary&&(t.dragOffset={x:d.pageX-l.x,y:d.pageY-l.y},c())},p=()=>{c()},c=()=>{document.removeEventListener("pointercancel",p),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",s),e.dispatch("DID_DROP_ITEM",{id:t.id,dragState:o}),n&&setTimeout(()=>e.element.addEventListener("click",e.ref.handleClick),0)};document.addEventListener("pointercancel",p),document.addEventListener("pointermove",r),document.addEventListener("pointerup",s)};e.element.addEventListener("pointerdown",i)},Pc=fe({DID_UPDATE_PANEL_HEIGHT:({root:e,action:t})=>{e.height=t.height}}),Fc=fe({DID_GRAB_ITEM:({root:e,props:t})=>{t.dragOrigin={x:e.translateX,y:e.translateY}},DID_DRAG_ITEM:({root:e})=>{e.element.dataset.dragState="drag"},DID_DROP_ITEM:({root:e,props:t})=>{t.dragOffset=null,t.dragOrigin=null,e.element.dataset.dragState="drop"}},({root:e,actions:t,props:i,shouldOptimize:a})=>{e.element.dataset.dragState==="drop"&&e.scaleX<=1&&(e.element.dataset.dragState="idle");let n=t.concat().filter(o=>/^DID_/.test(o.type)).reverse().find(o=>ln[o.type]);n&&n.type!==i.currentState&&(i.currentState=n.type,e.element.dataset.filepondItemState=ln[i.currentState]||"");let l=e.query("GET_ITEM_PANEL_ASPECT_RATIO")||e.query("GET_PANEL_ASPECT_RATIO");l?a||(e.height=e.rect.element.width*l):(Pc({root:e,actions:t,props:i}),!e.height&&e.ref.container.rect.element.height>0&&(e.height=e.ref.container.rect.element.height)),a&&(e.ref.panel.height=null),e.ref.panel.height=e.height}),Oc=le({create:zc,write:Fc,destroy:({root:e,props:t})=>{e.element.removeEventListener("click",e.ref.handleClick),e.dispatch("RELEASE_ITEM",{query:t.id})},tag:"li",name:"item",mixins:{apis:["id","interactionMethod","markedForRemoval","spawnDate","dragCenter","dragOrigin","dragOffset"],styles:["translateX","translateY","scaleX","scaleY","opacity","height"],animations:{scaleX:nn,scaleY:nn,translateX:an,translateY:an,opacity:{type:"tween",duration:150}}}}),Zi=(e,t)=>Math.max(1,Math.floor((e+1)/t)),Qi=(e,t,i)=>{if(!i)return;let a=e.rect.element.width,n=t.length,l=null;if(n===0||i.topb){if(i.left{se(e.element,"role","list"),e.ref.lastItemSpanwDate=Date.now()},Cc=({root:e,action:t})=>{let{id:i,index:a,interactionMethod:n}=t;e.ref.addIndex=a;let l=Date.now(),o=l,r=1;if(n!==Re.NONE){r=0;let s=e.query("GET_ITEM_INSERT_INTERVAL"),p=l-e.ref.lastItemSpanwDate;o=p{e.dragOffset?(e.translateX=null,e.translateY=null,e.translateX=e.dragOrigin.x+e.dragOffset.x,e.translateY=e.dragOrigin.y+e.dragOffset.y,e.scaleX=1.025,e.scaleY=1.025):(e.translateX=t,e.translateY=i,Date.now()>e.spawnDate&&(e.opacity===0&&Bc(e,t,i,a,n),e.scaleX=1,e.scaleY=1,e.opacity=1))},Bc=(e,t,i,a,n)=>{e.interactionMethod===Re.NONE?(e.translateX=null,e.translateX=t,e.translateY=null,e.translateY=i):e.interactionMethod===Re.DROP?(e.translateX=null,e.translateX=t-a*20,e.translateY=null,e.translateY=i-n*10,e.scaleX=.8,e.scaleY=.8):e.interactionMethod===Re.BROWSE?(e.translateY=null,e.translateY=i-30):e.interactionMethod===Re.API&&(e.translateX=null,e.translateX=t-30,e.translateY=null)},kc=({root:e,action:t})=>{let{id:i}=t,a=e.childViews.find(n=>n.id===i);a&&(a.scaleX=.9,a.scaleY=.9,a.opacity=0,a.markedForRemoval=!0)},Ai=e=>e.rect.element.height+e.rect.element.marginBottom+e.rect.element.marginTop,Nc=e=>e.rect.element.width+e.rect.element.marginLeft*.5+e.rect.element.marginRight*.5,Vc=({root:e,action:t})=>{let{id:i,dragState:a}=t,n=e.query("GET_ITEM",{id:i}),l=e.childViews.find(h=>h.id===i),o=e.childViews.length,r=a.getItemIndex(n);if(!l)return;let s={x:l.dragOrigin.x+l.dragOffset.x+l.dragCenter.x,y:l.dragOrigin.y+l.dragOffset.y+l.dragCenter.y},p=Ai(l),c=Nc(l),d=Math.floor(e.rect.outer.width/c);d>o&&(d=o);let m=Math.floor(o/d+1);ti.setHeight=p*m,ti.setWidth=c*d;var u={y:Math.floor(s.y/p),x:Math.floor(s.x/c),getGridIndex:function(){return s.y>ti.getHeight||s.y<0||s.x>ti.getWidth||s.x<0?r:this.y*d+this.x},getColIndex:function(){let I=e.query("GET_ACTIVE_ITEMS"),b=e.childViews.filter(z=>z.rect.element.height),E=I.map(z=>b.find(A=>A.id===z.id)),v=E.findIndex(z=>z===l),y=Ai(l),T=E.length,_=T,x=0,R=0,P=0;for(let z=0;zz){if(s.y1?u.getGridIndex():u.getColIndex();e.dispatch("MOVE_ITEM",{query:l,index:g});let f=a.getIndex();if(f===void 0||f!==g){if(a.setIndex(g),f===void 0)return;e.dispatch("DID_REORDER_ITEMS",{items:e.query("GET_ACTIVE_ITEMS"),origin:r,target:g})}},Gc=fe({DID_ADD_ITEM:Cc,DID_REMOVE_ITEM:kc,DID_DRAG_ITEM:Vc}),Uc=({root:e,props:t,actions:i,shouldOptimize:a})=>{Gc({root:e,props:t,actions:i});let{dragCoordinates:n}=t,l=e.rect.element.width,o=e.childViews.filter(E=>E.rect.element.height),r=e.query("GET_ACTIVE_ITEMS").map(E=>o.find(v=>v.id===E.id)).filter(E=>E),s=n?Qi(e,r,n):null,p=e.ref.addIndex||null;e.ref.addIndex=null;let c=0,d=0,m=0;if(r.length===0)return;let u=r[0].rect.element,g=u.marginTop+u.marginBottom,f=u.marginLeft+u.marginRight,h=u.width+f,I=u.height+g,b=Zi(l,h);if(b===1){let E=0,v=0;r.forEach((y,T)=>{if(s){let R=T-s;R===-2?v=-g*.25:R===-1?v=-g*.75:R===0?v=g*.75:R===1?v=g*.25:v=0}a&&(y.translateX=null,y.translateY=null),y.markedForRemoval||on(y,0,E+v);let x=(y.rect.element.height+g)*(y.markedForRemoval?y.opacity:1);E+=x})}else{let E=0,v=0;r.forEach((y,T)=>{T===s&&(c=1),T===p&&(m+=1),y.markedForRemoval&&y.opacity<.5&&(d-=1);let _=T+m+c+d,x=_%b,R=Math.floor(_/b),P=x*h,z=R*I,A=Math.sign(P-E),B=Math.sign(z-v);E=P,v=z,!y.markedForRemoval&&(a&&(y.translateX=null,y.translateY=null),on(y,P,z,A,B))})}},Hc=(e,t)=>t.filter(i=>i.data&&i.data.id?e.id===i.data.id:!0),Wc=le({create:Dc,write:Uc,tag:"ul",name:"list",didWriteView:({root:e})=>{e.childViews.filter(t=>t.markedForRemoval&&t.opacity===0&&t.resting).forEach(t=>{t._destroy(),e.removeChildView(t)})},filterFrameActionsForChild:Hc,mixins:{apis:["dragCoordinates"]}}),jc=({root:e,props:t})=>{e.ref.list=e.appendChildView(e.createChildView(Wc)),t.dragCoordinates=null,t.overflowing=!1},Yc=({root:e,props:t,action:i})=>{e.query("GET_ITEM_INSERT_LOCATION_FREEDOM")&&(t.dragCoordinates={left:i.position.scopeLeft-e.ref.list.rect.element.left,top:i.position.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},qc=({props:e})=>{e.dragCoordinates=null},$c=fe({DID_DRAG:Yc,DID_END_DRAG:qc}),Xc=({root:e,props:t,actions:i})=>{if($c({root:e,props:t,actions:i}),e.ref.list.dragCoordinates=t.dragCoordinates,t.overflowing&&!t.overflow&&(t.overflowing=!1,e.element.dataset.state="",e.height=null),t.overflow){let a=Math.round(t.overflow);a!==e.height&&(t.overflowing=!0,e.element.dataset.state="overflow",e.height=a)}},Kc=le({create:jc,write:Xc,name:"list-scroller",mixins:{apis:["overflow","dragCoordinates"],styles:["height","translateY"],animations:{translateY:"spring"}}}),Pe=(e,t,i,a="")=>{i?se(e,t,a):e.removeAttribute(t)},Zc=e=>{if(!(!e||e.value==="")){try{e.value=""}catch{}if(e.value){let t=Ge("form"),i=e.parentNode,a=e.nextSibling;t.appendChild(e),t.reset(),a?i.insertBefore(e,a):i.appendChild(e)}}},Qc=({root:e,props:t})=>{e.element.id=`filepond--browser-${t.id}`,se(e.element,"name",e.query("GET_NAME")),se(e.element,"aria-controls",`filepond--assistant-${t.id}`),se(e.element,"aria-labelledby",`filepond--drop-label-${t.id}`),Gn({root:e,action:{value:e.query("GET_ACCEPTED_FILE_TYPES")}}),Un({root:e,action:{value:e.query("GET_ALLOW_MULTIPLE")}}),Hn({root:e,action:{value:e.query("GET_ALLOW_DIRECTORIES_ONLY")}}),ki({root:e}),Wn({root:e,action:{value:e.query("GET_REQUIRED")}}),jn({root:e,action:{value:e.query("GET_CAPTURE_METHOD")}}),e.ref.handleChange=i=>{if(!e.element.value)return;let a=Array.from(e.element.files).map(n=>(n._relativePath=n.webkitRelativePath,n));setTimeout(()=>{t.onload(a),Zc(e.element)},250)},e.element.addEventListener("change",e.ref.handleChange)},Gn=({root:e,action:t})=>{e.query("GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE")&&Pe(e.element,"accept",!!t.value,t.value?t.value.join(","):"")},Un=({root:e,action:t})=>{Pe(e.element,"multiple",t.value)},Hn=({root:e,action:t})=>{Pe(e.element,"webkitdirectory",t.value)},ki=({root:e})=>{let t=e.query("GET_DISABLED"),i=e.query("GET_ALLOW_BROWSE"),a=t||!i;Pe(e.element,"disabled",a)},Wn=({root:e,action:t})=>{t.value?e.query("GET_TOTAL_ITEMS")===0&&Pe(e.element,"required",!0):Pe(e.element,"required",!1)},jn=({root:e,action:t})=>{Pe(e.element,"capture",!!t.value,t.value===!0?"":t.value)},rn=({root:e})=>{let{element:t}=e;if(e.query("GET_TOTAL_ITEMS")>0){Pe(t,"required",!1),Pe(t,"name",!1);let i=e.query("GET_ACTIVE_ITEMS"),a=!1;for(let n=0;n{e.query("GET_CHECK_VALIDITY")&&e.element.setCustomValidity(e.query("GET_LABEL_INVALID_FIELD"))},ed=le({tag:"input",name:"browser",ignoreRect:!0,ignoreRectUpdate:!0,attributes:{type:"file"},create:Qc,destroy:({root:e})=>{e.element.removeEventListener("change",e.ref.handleChange)},write:fe({DID_LOAD_ITEM:rn,DID_REMOVE_ITEM:rn,DID_THROW_ITEM_INVALID:Jc,DID_SET_DISABLED:ki,DID_SET_ALLOW_BROWSE:ki,DID_SET_ALLOW_DIRECTORIES_ONLY:Hn,DID_SET_ALLOW_MULTIPLE:Un,DID_SET_ACCEPTED_FILE_TYPES:Gn,DID_SET_CAPTURE_METHOD:jn,DID_SET_REQUIRED:Wn})}),sn={ENTER:13,SPACE:32},td=({root:e,props:t})=>{let i=Ge("label");se(i,"for",`filepond--browser-${t.id}`),se(i,"id",`filepond--drop-label-${t.id}`),e.ref.handleKeyDown=a=>{(a.keyCode===sn.ENTER||a.keyCode===sn.SPACE)&&(a.preventDefault(),e.ref.label.click())},e.ref.handleClick=a=>{a.target===i||i.contains(a.target)||e.ref.label.click()},i.addEventListener("keydown",e.ref.handleKeyDown),e.element.addEventListener("click",e.ref.handleClick),Yn(i,t.caption),e.appendChild(i),e.ref.label=i},Yn=(e,t)=>{e.innerHTML=t;let i=e.querySelector(".filepond--label-action");return i&&se(i,"tabindex","0"),t},id=le({name:"drop-label",ignoreRect:!0,create:td,destroy:({root:e})=>{e.ref.label.addEventListener("keydown",e.ref.handleKeyDown),e.element.removeEventListener("click",e.ref.handleClick)},write:fe({DID_SET_LABEL_IDLE:({root:e,action:t})=>{Yn(e.ref.label,t.value)}}),mixins:{styles:["opacity","translateX","translateY"],animations:{opacity:{type:"tween",duration:150},translateX:"spring",translateY:"spring"}}}),ad=le({name:"drip-blob",ignoreRect:!0,mixins:{styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}}}}),nd=({root:e})=>{let t=e.rect.element.width*.5,i=e.rect.element.height*.5;e.ref.blob=e.appendChildView(e.createChildView(ad,{opacity:0,scaleX:2.5,scaleY:2.5,translateX:t,translateY:i}))},ld=({root:e,action:t})=>{if(!e.ref.blob){nd({root:e});return}e.ref.blob.translateX=t.position.scopeLeft,e.ref.blob.translateY=t.position.scopeTop,e.ref.blob.scaleX=1,e.ref.blob.scaleY=1,e.ref.blob.opacity=1},od=({root:e})=>{e.ref.blob&&(e.ref.blob.opacity=0)},rd=({root:e})=>{e.ref.blob&&(e.ref.blob.scaleX=2.5,e.ref.blob.scaleY=2.5,e.ref.blob.opacity=0)},sd=({root:e,props:t,actions:i})=>{cd({root:e,props:t,actions:i});let{blob:a}=e.ref;i.length===0&&a&&a.opacity===0&&(e.removeChildView(a),e.ref.blob=null)},cd=fe({DID_DRAG:ld,DID_DROP:rd,DID_END_DRAG:od}),dd=le({ignoreRect:!0,ignoreRectUpdate:!0,name:"drip",write:sd}),qn=(e,t)=>{try{let i=new DataTransfer;t.forEach(a=>{a instanceof File?i.items.add(a):i.items.add(new File([a],a.name,{type:a.type}))}),e.files=i.files}catch{return!1}return!0},pd=({root:e})=>{e.ref.fields={};let t=document.createElement("legend");t.textContent="Files",e.element.appendChild(t)},gi=(e,t)=>e.ref.fields[t],Ji=e=>{e.query("GET_ACTIVE_ITEMS").forEach(t=>{e.ref.fields[t.id]&&e.element.appendChild(e.ref.fields[t.id])})},cn=({root:e})=>Ji(e),md=({root:e,action:t})=>{let n=!(e.query("GET_ITEM",t.id).origin===re.LOCAL)&&e.query("SHOULD_UPDATE_FILE_INPUT"),l=Ge("input");l.type=n?"file":"hidden",l.name=e.query("GET_NAME"),e.ref.fields[t.id]=l,Ji(e)},ud=({root:e,action:t})=>{let i=gi(e,t.id);if(!i||(t.serverFileReference!==null&&(i.value=t.serverFileReference),!e.query("SHOULD_UPDATE_FILE_INPUT")))return;let a=e.query("GET_ITEM",t.id);qn(i,[a.file])},gd=({root:e,action:t})=>{e.query("SHOULD_UPDATE_FILE_INPUT")&&setTimeout(()=>{let i=gi(e,t.id);i&&qn(i,[t.file])},0)},fd=({root:e})=>{e.element.disabled=e.query("GET_DISABLED")},hd=({root:e,action:t})=>{let i=gi(e,t.id);i&&(i.parentNode&&i.parentNode.removeChild(i),delete e.ref.fields[t.id])},bd=({root:e,action:t})=>{let i=gi(e,t.id);i&&(t.value===null?i.removeAttribute("value"):i.type!="file"&&(i.value=t.value),Ji(e))},Ed=fe({DID_SET_DISABLED:fd,DID_ADD_ITEM:md,DID_LOAD_ITEM:ud,DID_REMOVE_ITEM:hd,DID_DEFINE_VALUE:bd,DID_PREPARE_OUTPUT:gd,DID_REORDER_ITEMS:cn,DID_SORT_ITEMS:cn}),Td=le({tag:"fieldset",name:"data",create:pd,write:Ed,ignoreRect:!0}),Id=e=>"getRootNode"in e?e.getRootNode():document,vd=["jpg","jpeg","png","gif","bmp","webp","svg","tiff"],xd=["css","csv","html","txt"],yd={zip:"zip|compressed",epub:"application/epub+zip"},$n=(e="")=>(e=e.toLowerCase(),vd.includes(e)?"image/"+(e==="jpg"?"jpeg":e==="svg"?"svg+xml":e):xd.includes(e)?"text/"+e:yd[e]||""),ea=e=>new Promise((t,i)=>{let a=zd(e);if(a.length&&!Rd(e))return t(a);Sd(e).then(t)}),Rd=e=>e.files?e.files.length>0:!1,Sd=e=>new Promise((t,i)=>{let a=(e.items?Array.from(e.items):[]).filter(n=>_d(n)).map(n=>wd(n));if(!a.length){t(e.files?Array.from(e.files):[]);return}Promise.all(a).then(n=>{let l=[];n.forEach(o=>{l.push.apply(l,o)}),t(l.filter(o=>o).map(o=>(o._relativePath||(o._relativePath=o.webkitRelativePath),o)))}).catch(console.error)}),_d=e=>{if(Xn(e)){let t=ta(e);if(t)return t.isFile||t.isDirectory}return e.kind==="file"},wd=e=>new Promise((t,i)=>{if(Ad(e)){Ld(ta(e)).then(t).catch(i);return}t([e.getAsFile()])}),Ld=e=>new Promise((t,i)=>{let a=[],n=0,l=0,o=()=>{l===0&&n===0&&t(a)},r=s=>{n++;let p=s.createReader(),c=()=>{p.readEntries(d=>{if(d.length===0){n--,o();return}d.forEach(m=>{m.isDirectory?r(m):(l++,m.file(u=>{let g=Md(u);m.fullPath&&(g._relativePath=m.fullPath),a.push(g),l--,o()}))}),c()},i)};c()};r(e)}),Md=e=>{if(e.type.length)return e;let t=e.lastModifiedDate,i=e.name,a=$n(ui(e.name));return a.length&&(e=e.slice(0,e.size,a),e.name=i,e.lastModifiedDate=t),e},Ad=e=>Xn(e)&&(ta(e)||{}).isDirectory,Xn=e=>"webkitGetAsEntry"in e,ta=e=>e.webkitGetAsEntry(),zd=e=>{let t=[];try{if(t=Fd(e),t.length)return t;t=Pd(e)}catch{}return t},Pd=e=>{let t=e.getData("url");return typeof t=="string"&&t.length?[t]:[]},Fd=e=>{let t=e.getData("text/html");if(typeof t=="string"&&t.length){let i=t.match(/src\s*=\s*"(.+?)"/);if(i)return[i[1]]}return[]},ri=[],tt=e=>({pageLeft:e.pageX,pageTop:e.pageY,scopeLeft:e.offsetX||e.layerX,scopeTop:e.offsetY||e.layerY}),Od=(e,t,i)=>{let a=Dd(t),n={element:e,filterElement:i,state:null,ondrop:()=>{},onenter:()=>{},ondrag:()=>{},onexit:()=>{},onload:()=>{},allowdrop:()=>{}};return n.destroy=a.addListener(n),n},Dd=e=>{let t=ri.find(a=>a.element===e);if(t)return t;let i=Cd(e);return ri.push(i),i},Cd=e=>{let t=[],i={dragenter:kd,dragover:Nd,dragleave:Gd,drop:Vd},a={};te(i,(l,o)=>{a[l]=o(e,t),e.addEventListener(l,a[l],!1)});let n={element:e,addListener:l=>(t.push(l),()=>{t.splice(t.indexOf(l),1),t.length===0&&(ri.splice(ri.indexOf(n),1),te(i,o=>{e.removeEventListener(o,a[o],!1)}))})};return n},Bd=(e,t)=>("elementFromPoint"in e||(e=document),e.elementFromPoint(t.x,t.y)),ia=(e,t)=>{let i=Id(t),a=Bd(i,{x:e.pageX-window.pageXOffset,y:e.pageY-window.pageYOffset});return a===t||t.contains(a)},Kn=null,ii=(e,t)=>{try{e.dropEffect=t}catch{}},kd=(e,t)=>i=>{i.preventDefault(),Kn=i.target,t.forEach(a=>{let{element:n,onenter:l}=a;ia(i,n)&&(a.state="enter",l(tt(i)))})},Nd=(e,t)=>i=>{i.preventDefault();let a=i.dataTransfer;ea(a).then(n=>{let l=!1;t.some(o=>{let{filterElement:r,element:s,onenter:p,onexit:c,ondrag:d,allowdrop:m}=o;ii(a,"copy");let u=m(n);if(!u){ii(a,"none");return}if(ia(i,s)){if(l=!0,o.state===null){o.state="enter",p(tt(i));return}if(o.state="over",r&&!u){ii(a,"none");return}d(tt(i))}else r&&!l&&ii(a,"none"),o.state&&(o.state=null,c(tt(i)))})})},Vd=(e,t)=>i=>{i.preventDefault();let a=i.dataTransfer;ea(a).then(n=>{t.forEach(l=>{let{filterElement:o,element:r,ondrop:s,onexit:p,allowdrop:c}=l;if(l.state=null,!(o&&!ia(i,r))){if(!c(n))return p(tt(i));s(tt(i),n)}})})},Gd=(e,t)=>i=>{Kn===i.target&&t.forEach(a=>{let{onexit:n}=a;a.state=null,n(tt(i))})},Ud=(e,t,i)=>{e.classList.add("filepond--hopper");let{catchesDropsOnPage:a,requiresDropOnElement:n,filterItems:l=c=>c}=i,o=Od(e,a?document.documentElement:e,n),r="",s="";o.allowdrop=c=>t(l(c)),o.ondrop=(c,d)=>{let m=l(d);if(!t(m)){p.ondragend(c);return}s="drag-drop",p.onload(m,c)},o.ondrag=c=>{p.ondrag(c)},o.onenter=c=>{s="drag-over",p.ondragstart(c)},o.onexit=c=>{s="drag-exit",p.ondragend(c)};let p={updateHopperState:()=>{r!==s&&(e.dataset.hopperState=s,r=s)},onload:()=>{},ondragstart:()=>{},ondrag:()=>{},ondragend:()=>{},destroy:()=>{o.destroy()}};return p},Ni=!1,gt=[],Zn=e=>{let t=document.activeElement;if(t&&(/textarea|input/i.test(t.nodeName)||t.getAttribute("contenteditable")==="true"||t.getAttribute("contenteditable")==="")){let a=!1,n=t;for(;n!==document.body;){if(n.classList.contains("filepond--root")){a=!0;break}n=n.parentNode}if(!a)return}ea(e.clipboardData).then(a=>{a.length&>.forEach(n=>n(a))})},Hd=e=>{gt.includes(e)||(gt.push(e),!Ni&&(Ni=!0,document.addEventListener("paste",Zn)))},Wd=e=>{qi(gt,gt.indexOf(e)),gt.length===0&&(document.removeEventListener("paste",Zn),Ni=!1)},jd=()=>{let e=i=>{t.onload(i)},t={destroy:()=>{Wd(e)},onload:()=>{}};return Hd(e),t},Yd=({root:e,props:t})=>{e.element.id=`filepond--assistant-${t.id}`,se(e.element,"role","alert"),se(e.element,"aria-live","polite"),se(e.element,"aria-relevant","additions")},dn=null,pn=null,zi=[],fi=(e,t)=>{e.element.textContent=t},qd=e=>{e.element.textContent=""},Qn=(e,t,i)=>{let a=e.query("GET_TOTAL_ITEMS");fi(e,`${i} ${t}, ${a} ${a===1?e.query("GET_LABEL_FILE_COUNT_SINGULAR"):e.query("GET_LABEL_FILE_COUNT_PLURAL")}`),clearTimeout(pn),pn=setTimeout(()=>{qd(e)},1500)},Jn=e=>e.element.parentNode.contains(document.activeElement),$d=({root:e,action:t})=>{if(!Jn(e))return;e.element.textContent="";let i=e.query("GET_ITEM",t.id);zi.push(i.filename),clearTimeout(dn),dn=setTimeout(()=>{Qn(e,zi.join(", "),e.query("GET_LABEL_FILE_ADDED")),zi.length=0},750)},Xd=({root:e,action:t})=>{if(!Jn(e))return;let i=t.item;Qn(e,i.filename,e.query("GET_LABEL_FILE_REMOVED"))},Kd=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename,n=e.query("GET_LABEL_FILE_PROCESSING_COMPLETE");fi(e,`${a} ${n}`)},mn=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename,n=e.query("GET_LABEL_FILE_PROCESSING_ABORTED");fi(e,`${a} ${n}`)},ai=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename;fi(e,`${t.status.main} ${a} ${t.status.sub}`)},Zd=le({create:Yd,ignoreRect:!0,ignoreRectUpdate:!0,write:fe({DID_LOAD_ITEM:$d,DID_REMOVE_ITEM:Xd,DID_COMPLETE_ITEM_PROCESSING:Kd,DID_ABORT_ITEM_PROCESSING:mn,DID_REVERT_ITEM_PROCESSING:mn,DID_THROW_ITEM_REMOVE_ERROR:ai,DID_THROW_ITEM_LOAD_ERROR:ai,DID_THROW_ITEM_INVALID:ai,DID_THROW_ITEM_PROCESSING_ERROR:ai}),tag:"span",name:"assistant"}),el=(e,t="-")=>e.replace(new RegExp(`${t}.`,"g"),i=>i.charAt(1).toUpperCase()),tl=(e,t=16,i=!0)=>{let a=Date.now(),n=null;return(...l)=>{clearTimeout(n);let o=Date.now()-a,r=()=>{a=Date.now(),e(...l)};oe.preventDefault(),Jd=({root:e,props:t})=>{let i=e.query("GET_ID");i&&(e.element.id=i);let a=e.query("GET_CLASS_NAME");a&&a.split(" ").filter(s=>s.length).forEach(s=>{e.element.classList.add(s)}),e.ref.label=e.appendChildView(e.createChildView(id,{...t,translateY:null,caption:e.query("GET_LABEL_IDLE")})),e.ref.list=e.appendChildView(e.createChildView(Kc,{translateY:null})),e.ref.panel=e.appendChildView(e.createChildView(Vn,{name:"panel-root"})),e.ref.assistant=e.appendChildView(e.createChildView(Zd,{...t})),e.ref.data=e.appendChildView(e.createChildView(Td,{...t})),e.ref.measure=Ge("div"),e.ref.measure.style.height="100%",e.element.appendChild(e.ref.measure),e.ref.bounds=null,e.query("GET_STYLES").filter(s=>!Ve(s.value)).map(({name:s,value:p})=>{e.element.dataset[s]=p}),e.ref.widthPrevious=null,e.ref.widthUpdated=tl(()=>{e.ref.updateHistory=[],e.dispatch("DID_RESIZE_ROOT")},250),e.ref.previousAspectRatio=null,e.ref.updateHistory=[];let n=window.matchMedia("(pointer: fine) and (hover: hover)").matches,l="PointerEvent"in window;e.query("GET_ALLOW_REORDER")&&l&&!n&&(e.element.addEventListener("touchmove",si,{passive:!1}),e.element.addEventListener("gesturestart",si));let o=e.query("GET_CREDITS");if(o.length===2){let s=document.createElement("a");s.className="filepond--credits",s.href=o[0],s.tabIndex=-1,s.target="_blank",s.rel="noopener noreferrer nofollow",s.textContent=o[1],e.element.appendChild(s),e.ref.credits=s}},ep=({root:e,props:t,actions:i})=>{if(lp({root:e,props:t,actions:i}),i.filter(T=>/^DID_SET_STYLE_/.test(T.type)).filter(T=>!Ve(T.data.value)).map(({type:T,data:_})=>{let x=el(T.substring(8).toLowerCase(),"_");e.element.dataset[x]=_.value,e.invalidateLayout()}),e.rect.element.hidden)return;e.rect.element.width!==e.ref.widthPrevious&&(e.ref.widthPrevious=e.rect.element.width,e.ref.widthUpdated());let a=e.ref.bounds;a||(a=e.ref.bounds=ap(e),e.element.removeChild(e.ref.measure),e.ref.measure=null);let{hopper:n,label:l,list:o,panel:r}=e.ref;n&&n.updateHopperState();let s=e.query("GET_PANEL_ASPECT_RATIO"),p=e.query("GET_ALLOW_MULTIPLE"),c=e.query("GET_TOTAL_ITEMS"),d=p?e.query("GET_MAX_FILES")||Qd:1,m=c===d,u=i.find(T=>T.type==="DID_ADD_ITEM");if(m&&u){let T=u.data.interactionMethod;l.opacity=0,p?l.translateY=-40:T===Re.API?l.translateX=40:T===Re.BROWSE?l.translateY=40:l.translateY=30}else m||(l.opacity=1,l.translateX=0,l.translateY=0);let g=tp(e),f=ip(e),h=l.rect.element.height,I=!p||m?0:h,b=m?o.rect.element.marginTop:0,E=c===0?0:o.rect.element.marginBottom,v=I+b+f.visual+E,y=I+b+f.bounds+E;if(o.translateY=Math.max(0,I-o.rect.element.marginTop)-g.top,s){let T=e.rect.element.width,_=T*s;s!==e.ref.previousAspectRatio&&(e.ref.previousAspectRatio=s,e.ref.updateHistory=[]);let x=e.ref.updateHistory;x.push(T);let R=2;if(x.length>R*2){let z=x.length,A=z-10,B=0;for(let w=z;w>=A;w--)if(x[w]===x[w-2]&&B++,B>=R)return}r.scalable=!1,r.height=_;let P=_-I-(E-g.bottom)-(m?b:0);f.visual>P?o.overflow=P:o.overflow=null,e.height=_}else if(a.fixedHeight){r.scalable=!1;let T=a.fixedHeight-I-(E-g.bottom)-(m?b:0);f.visual>T?o.overflow=T:o.overflow=null}else if(a.cappedHeight){let T=v>=a.cappedHeight,_=Math.min(a.cappedHeight,v);r.scalable=!0,r.height=T?_:_-g.top-g.bottom;let x=_-I-(E-g.bottom)-(m?b:0);v>a.cappedHeight&&f.visual>x?o.overflow=x:o.overflow=null,e.height=Math.min(a.cappedHeight,y-g.top-g.bottom)}else{let T=c>0?g.top+g.bottom:0;r.scalable=!0,r.height=Math.max(h,v-T),e.height=Math.max(h,y-T)}e.ref.credits&&r.heightCurrent&&(e.ref.credits.style.transform=`translateY(${r.heightCurrent}px)`)},tp=e=>{let t=e.ref.list.childViews[0].childViews[0];return t?{top:t.rect.element.marginTop,bottom:t.rect.element.marginBottom}:{top:0,bottom:0}},ip=e=>{let t=0,i=0,a=e.ref.list,n=a.childViews[0],l=n.childViews.filter(b=>b.rect.element.height),o=e.query("GET_ACTIVE_ITEMS").map(b=>l.find(E=>E.id===b.id)).filter(b=>b);if(o.length===0)return{visual:t,bounds:i};let r=n.rect.element.width,s=Qi(n,o,a.dragCoordinates),p=o[0].rect.element,c=p.marginTop+p.marginBottom,d=p.marginLeft+p.marginRight,m=p.width+d,u=p.height+c,g=typeof s<"u"&&s>=0?1:0,f=o.find(b=>b.markedForRemoval&&b.opacity<.45)?-1:0,h=o.length+g+f,I=Zi(r,m);return I===1?o.forEach(b=>{let E=b.rect.element.height+c;i+=E,t+=E*b.opacity}):(i=Math.ceil(h/I)*u,t=i),{visual:t,bounds:i}},ap=e=>{let t=e.ref.measureHeight||null;return{cappedHeight:parseInt(e.style.maxHeight,10)||null,fixedHeight:t===0?null:t}},aa=(e,t)=>{let i=e.query("GET_ALLOW_REPLACE"),a=e.query("GET_ALLOW_MULTIPLE"),n=e.query("GET_TOTAL_ITEMS"),l=e.query("GET_MAX_FILES"),o=t.length;return!a&&o>1?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ae("warning",0,"Max files")}),!0):(l=a?l:1,!a&&i?!1:Et(l)&&n+o>l?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ae("warning",0,"Max files")}),!0):!1)},np=(e,t,i)=>{let a=e.childViews[0];return Qi(a,t,{left:i.scopeLeft-a.rect.element.left,top:i.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},un=e=>{let t=e.query("GET_ALLOW_DROP"),i=e.query("GET_DISABLED"),a=t&&!i;if(a&&!e.ref.hopper){let n=Ud(e.element,l=>{let o=e.query("GET_BEFORE_DROP_FILE")||(()=>!0);return e.query("GET_DROP_VALIDATION")?l.every(s=>it("ALLOW_HOPPER_ITEM",s,{query:e.query}).every(p=>p===!0)&&o(s)):!0},{filterItems:l=>{let o=e.query("GET_IGNORED_FILES");return l.filter(r=>et(r)?!o.includes(r.name.toLowerCase()):!0)},catchesDropsOnPage:e.query("GET_DROP_ON_PAGE"),requiresDropOnElement:e.query("GET_DROP_ON_ELEMENT")});n.onload=(l,o)=>{let s=e.ref.list.childViews[0].childViews.filter(c=>c.rect.element.height),p=e.query("GET_ACTIVE_ITEMS").map(c=>s.find(d=>d.id===c.id)).filter(c=>c);Ae("ADD_ITEMS",l,{dispatch:e.dispatch}).then(c=>{if(aa(e,c))return!1;e.dispatch("ADD_ITEMS",{items:c,index:np(e.ref.list,p,o),interactionMethod:Re.DROP})}),e.dispatch("DID_DROP",{position:o}),e.dispatch("DID_END_DRAG",{position:o})},n.ondragstart=l=>{e.dispatch("DID_START_DRAG",{position:l})},n.ondrag=tl(l=>{e.dispatch("DID_DRAG",{position:l})}),n.ondragend=l=>{e.dispatch("DID_END_DRAG",{position:l})},e.ref.hopper=n,e.ref.drip=e.appendChildView(e.createChildView(dd))}else!a&&e.ref.hopper&&(e.ref.hopper.destroy(),e.ref.hopper=null,e.removeChildView(e.ref.drip))},gn=(e,t)=>{let i=e.query("GET_ALLOW_BROWSE"),a=e.query("GET_DISABLED"),n=i&&!a;n&&!e.ref.browser?e.ref.browser=e.appendChildView(e.createChildView(ed,{...t,onload:l=>{Ae("ADD_ITEMS",l,{dispatch:e.dispatch}).then(o=>{if(aa(e,o))return!1;e.dispatch("ADD_ITEMS",{items:o,index:-1,interactionMethod:Re.BROWSE})})}}),0):!n&&e.ref.browser&&(e.removeChildView(e.ref.browser),e.ref.browser=null)},fn=e=>{let t=e.query("GET_ALLOW_PASTE"),i=e.query("GET_DISABLED"),a=t&&!i;a&&!e.ref.paster?(e.ref.paster=jd(),e.ref.paster.onload=n=>{Ae("ADD_ITEMS",n,{dispatch:e.dispatch}).then(l=>{if(aa(e,l))return!1;e.dispatch("ADD_ITEMS",{items:l,index:-1,interactionMethod:Re.PASTE})})}):!a&&e.ref.paster&&(e.ref.paster.destroy(),e.ref.paster=null)},lp=fe({DID_SET_ALLOW_BROWSE:({root:e,props:t})=>{gn(e,t)},DID_SET_ALLOW_DROP:({root:e})=>{un(e)},DID_SET_ALLOW_PASTE:({root:e})=>{fn(e)},DID_SET_DISABLED:({root:e,props:t})=>{un(e),fn(e),gn(e,t),e.query("GET_DISABLED")?e.element.dataset.disabled="disabled":e.element.removeAttribute("data-disabled")}}),op=le({name:"root",read:({root:e})=>{e.ref.measure&&(e.ref.measureHeight=e.ref.measure.offsetHeight)},create:Jd,write:ep,destroy:({root:e})=>{e.ref.paster&&e.ref.paster.destroy(),e.ref.hopper&&e.ref.hopper.destroy(),e.element.removeEventListener("touchmove",si),e.element.removeEventListener("gesturestart",si)},mixins:{styles:["height"]}}),rp=(e={})=>{let t=null,i=oi(),a=Rr(cs(i),[ws,ms(i)],[Qs,ps(i)]);a.dispatch("SET_OPTIONS",{options:e});let n=()=>{document.hidden||a.dispatch("KICK")};document.addEventListener("visibilitychange",n);let l=null,o=!1,r=!1,s=null,p=null,c=()=>{o||(o=!0),clearTimeout(l),l=setTimeout(()=>{o=!1,s=null,p=null,r&&(r=!1,a.dispatch("DID_STOP_RESIZE"))},500)};window.addEventListener("resize",c);let d=op(a,{id:Yi()}),m=!1,u=!1,g={_read:()=>{o&&(p=window.innerWidth,s||(s=p),!r&&p!==s&&(a.dispatch("DID_START_RESIZE"),r=!0)),u&&m&&(m=d.element.offsetParent===null),!m&&(d._read(),u=d.rect.element.hidden)},_write:S=>{let L=a.processActionQueue().filter(D=>!/^SET_/.test(D.type));m&&!L.length||(b(L),m=d._write(S,L,r),fs(a.query("GET_ITEMS")),m&&a.processDispatchQueue())}},f=S=>L=>{let D={type:S};if(!L)return D;if(L.hasOwnProperty("error")&&(D.error=L.error?{...L.error}:null),L.status&&(D.status={...L.status}),L.file&&(D.output=L.file),L.source)D.file=L.source;else if(L.item||L.id){let O=L.item?L.item:a.query("GET_ITEM",L.id);D.file=O?he(O):null}return L.items&&(D.items=L.items.map(he)),/progress/.test(S)&&(D.progress=L.progress),L.hasOwnProperty("origin")&&L.hasOwnProperty("target")&&(D.origin=L.origin,D.target=L.target),D},h={DID_DESTROY:f("destroy"),DID_INIT:f("init"),DID_THROW_MAX_FILES:f("warning"),DID_INIT_ITEM:f("initfile"),DID_START_ITEM_LOAD:f("addfilestart"),DID_UPDATE_ITEM_LOAD_PROGRESS:f("addfileprogress"),DID_LOAD_ITEM:f("addfile"),DID_THROW_ITEM_INVALID:[f("error"),f("addfile")],DID_THROW_ITEM_LOAD_ERROR:[f("error"),f("addfile")],DID_THROW_ITEM_REMOVE_ERROR:[f("error"),f("removefile")],DID_PREPARE_OUTPUT:f("preparefile"),DID_START_ITEM_PROCESSING:f("processfilestart"),DID_UPDATE_ITEM_PROCESS_PROGRESS:f("processfileprogress"),DID_ABORT_ITEM_PROCESSING:f("processfileabort"),DID_COMPLETE_ITEM_PROCESSING:f("processfile"),DID_COMPLETE_ITEM_PROCESSING_ALL:f("processfiles"),DID_REVERT_ITEM_PROCESSING:f("processfilerevert"),DID_THROW_ITEM_PROCESSING_ERROR:[f("error"),f("processfile")],DID_REMOVE_ITEM:f("removefile"),DID_UPDATE_ITEMS:f("updatefiles"),DID_ACTIVATE_ITEM:f("activatefile"),DID_REORDER_ITEMS:f("reorderfiles")},I=S=>{let L={pond:F,...S};delete L.type,d.element.dispatchEvent(new CustomEvent(`FilePond:${S.type}`,{detail:L,bubbles:!0,cancelable:!0,composed:!0}));let D=[];S.hasOwnProperty("error")&&D.push(S.error),S.hasOwnProperty("file")&&D.push(S.file);let O=["type","error","file"];Object.keys(S).filter(C=>!O.includes(C)).forEach(C=>D.push(S[C])),F.fire(S.type,...D);let U=a.query(`GET_ON${S.type.toUpperCase()}`);U&&U(...D)},b=S=>{S.length&&S.filter(L=>h[L.type]).forEach(L=>{let D=h[L.type];(Array.isArray(D)?D:[D]).forEach(O=>{L.type==="DID_INIT_ITEM"?I(O(L.data)):setTimeout(()=>{I(O(L.data))},0)})})},E=S=>a.dispatch("SET_OPTIONS",{options:S}),v=S=>a.query("GET_ACTIVE_ITEM",S),y=S=>new Promise((L,D)=>{a.dispatch("REQUEST_ITEM_PREPARE",{query:S,success:O=>{L(O)},failure:O=>{D(O)}})}),T=(S,L={})=>new Promise((D,O)=>{R([{source:S,options:L}],{index:L.index}).then(U=>D(U&&U[0])).catch(O)}),_=S=>S.file&&S.id,x=(S,L)=>(typeof S=="object"&&!_(S)&&!L&&(L=S,S=void 0),a.dispatch("REMOVE_ITEM",{...L,query:S}),a.query("GET_ACTIVE_ITEM",S)===null),R=(...S)=>new Promise((L,D)=>{let O=[],U={};if(ci(S[0]))O.push.apply(O,S[0]),Object.assign(U,S[1]||{});else{let C=S[S.length-1];typeof C=="object"&&!(C instanceof Blob)&&Object.assign(U,S.pop()),O.push(...S)}a.dispatch("ADD_ITEMS",{items:O,index:U.index,interactionMethod:Re.API,success:L,failure:D})}),P=()=>a.query("GET_ACTIVE_ITEMS"),z=S=>new Promise((L,D)=>{a.dispatch("REQUEST_ITEM_PROCESSING",{query:S,success:O=>{L(O)},failure:O=>{D(O)}})}),A=(...S)=>{let L=Array.isArray(S[0])?S[0]:S,D=L.length?L:P();return Promise.all(D.map(y))},B=(...S)=>{let L=Array.isArray(S[0])?S[0]:S;if(!L.length){let D=P().filter(O=>!(O.status===H.IDLE&&O.origin===re.LOCAL)&&O.status!==H.PROCESSING&&O.status!==H.PROCESSING_COMPLETE&&O.status!==H.PROCESSING_REVERT_ERROR);return Promise.all(D.map(z))}return Promise.all(L.map(z))},w=(...S)=>{let L=Array.isArray(S[0])?S[0]:S,D;typeof L[L.length-1]=="object"?D=L.pop():Array.isArray(S[0])&&(D=S[1]);let O=P();return L.length?L.map(C=>Xe(C)?O[C]?O[C].id:null:C).filter(C=>C).map(C=>x(C,D)):Promise.all(O.map(C=>x(C,D)))},F={...mi(),...g,...ds(a,i),setOptions:E,addFile:T,addFiles:R,getFile:v,processFile:z,prepareFile:y,removeFile:x,moveFile:(S,L)=>a.dispatch("MOVE_ITEM",{query:S,index:L}),getFiles:P,processFiles:B,removeFiles:w,prepareFiles:A,sort:S=>a.dispatch("SORT",{compare:S}),browse:()=>{var S=d.element.querySelector("input[type=file]");S&&S.click()},destroy:()=>{F.fire("destroy",d.element),a.dispatch("ABORT_ALL"),d._destroy(),window.removeEventListener("resize",c),document.removeEventListener("visibilitychange",n),a.dispatch("DID_DESTROY")},insertBefore:S=>Ba(d.element,S),insertAfter:S=>ka(d.element,S),appendTo:S=>S.appendChild(d.element),replaceElement:S=>{Ba(d.element,S),S.parentNode.removeChild(S),t=S},restoreElement:()=>{t&&(ka(t,d.element),d.element.parentNode.removeChild(d.element),t=null)},isAttachedTo:S=>d.element===S||t===S,element:{get:()=>d.element},status:{get:()=>a.query("GET_STATUS")}};return a.dispatch("DID_INIT"),He(F)},il=(e={})=>{let t={};return te(oi(),(a,n)=>{t[a]=n[0]}),rp({...t,...e})},sp=e=>e.charAt(0).toLowerCase()+e.slice(1),cp=e=>el(e.replace(/^data-/,"")),al=(e,t)=>{te(t,(i,a)=>{te(e,(n,l)=>{let o=new RegExp(i);if(!o.test(n)||(delete e[n],a===!1))return;if(ge(a)){e[a]=l;return}let s=a.group;de(a)&&!e[s]&&(e[s]={}),e[s][sp(n.replace(o,""))]=l}),a.mapping&&al(e[a.group],a.mapping)})},dp=(e,t={})=>{let i=[];te(e.attributes,n=>{i.push(e.attributes[n])});let a=i.filter(n=>n.name).reduce((n,l)=>{let o=se(e,l.name);return n[cp(l.name)]=o===l.name?!0:o,n},{});return al(a,t),a},pp=(e,t={})=>{let i={"^class$":"className","^multiple$":"allowMultiple","^capture$":"captureMethod","^webkitdirectory$":"allowDirectoriesOnly","^server":{group:"server",mapping:{"^process":{group:"process"},"^revert":{group:"revert"},"^fetch":{group:"fetch"},"^restore":{group:"restore"},"^load":{group:"load"}}},"^type$":!1,"^files$":!1};it("SET_ATTRIBUTE_TO_OPTION_MAP",i);let a={...t},n=dp(e.nodeName==="FIELDSET"?e.querySelector("input[type=file]"):e,i);Object.keys(n).forEach(o=>{de(n[o])?(de(a[o])||(a[o]={}),Object.assign(a[o],n[o])):a[o]=n[o]}),a.files=(t.files||[]).concat(Array.from(e.querySelectorAll("input:not([type=file])")).map(o=>({source:o.value,options:{type:o.dataset.type}})));let l=il(a);return e.files&&Array.from(e.files).forEach(o=>{l.addFile(o)}),l.replaceElement(e),l},mp=(...e)=>yr(e[0])?pp(...e):il(...e),up=["fire","_read","_write"],hn=e=>{let t={};return Rn(e,t,up),t},gp=(e,t)=>e.replace(/(?:{([a-zA-Z]+)})/g,(i,a)=>t[a]),fp=e=>{let t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),i=URL.createObjectURL(t),a=new Worker(i);return{transfer:(n,l)=>{},post:(n,l,o)=>{let r=Yi();a.onmessage=s=>{s.data.id===r&&l(s.data.message)},a.postMessage({id:r,message:n},o)},terminate:()=>{a.terminate(),URL.revokeObjectURL(i)}}},hp=e=>new Promise((t,i)=>{let a=new Image;a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),nl=(e,t)=>{let i=e.slice(0,e.size,e.type);return i.lastModifiedDate=e.lastModifiedDate,i.name=t,i},bp=e=>nl(e,e.name),bn=[],Ep=e=>{if(bn.includes(e))return;bn.push(e);let t=e({addFilter:bs,utils:{Type:M,forin:te,isString:ge,isFile:et,toNaturalFileSize:Bn,replaceInString:gp,getExtensionFromFilename:ui,getFilenameWithoutExtension:On,guesstimateMimeType:$n,getFileFromBlob:bt,getFilenameFromURL:Ct,createRoute:fe,createWorker:fp,createView:le,createItemAPI:he,loadImage:hp,copyFile:bp,renameFile:nl,createBlob:zn,applyFilterChain:Ae,text:ne,getNumericAspectRatioFromString:wn},views:{fileActionButton:Cn}});Es(t.options)},Tp=()=>Object.prototype.toString.call(window.operamini)==="[object OperaMini]",Ip=()=>"Promise"in window,vp=()=>"slice"in Blob.prototype,xp=()=>"URL"in window&&"createObjectURL"in window.URL,yp=()=>"visibilityState"in document,Rp=()=>"performance"in window,Sp=()=>"supports"in(window.CSS||{}),_p=()=>/MSIE|Trident/.test(window.navigator.userAgent),Vi=(()=>{let e=En()&&!Tp()&&yp()&&Ip()&&vp()&&xp()&&Rp()&&(Sp()||_p());return()=>e})(),Ue={apps:[]},wp="filepond",at=()=>{},ll={},Tt={},Bt={},Gi={},ft=at,ht=at,Ui=at,Hi=at,ve=at,Wi=at,Dt=at;if(Vi()){Xr(()=>{Ue.apps.forEach(i=>i._read())},i=>{Ue.apps.forEach(a=>a._write(i))});let e=()=>{document.dispatchEvent(new CustomEvent("FilePond:loaded",{detail:{supported:Vi,create:ft,destroy:ht,parse:Ui,find:Hi,registerPlugin:ve,setOptions:Dt}})),document.removeEventListener("DOMContentLoaded",e)};document.readyState!=="loading"?setTimeout(()=>e(),0):document.addEventListener("DOMContentLoaded",e);let t=()=>te(oi(),(i,a)=>{Gi[i]=a[1]});ll={...Ln},Bt={...re},Tt={...H},Gi={},t(),ft=(...i)=>{let a=mp(...i);return a.on("destroy",ht),Ue.apps.push(a),hn(a)},ht=i=>{let a=Ue.apps.findIndex(n=>n.isAttachedTo(i));return a>=0?(Ue.apps.splice(a,1)[0].restoreElement(),!0):!1},Ui=i=>Array.from(i.querySelectorAll(`.${wp}`)).filter(l=>!Ue.apps.find(o=>o.isAttachedTo(l))).map(l=>ft(l)),Hi=i=>{let a=Ue.apps.find(n=>n.isAttachedTo(i));return a?hn(a):null},ve=(...i)=>{i.forEach(Ep),t()},Wi=()=>{let i={};return te(oi(),(a,n)=>{i[a]=n[0]}),i},Dt=i=>(de(i)&&(Ue.apps.forEach(a=>{a.setOptions(i)}),Ts(i)),Wi())}function ol(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),i.push.apply(i,a)}return i}function xl(e){for(var t=1;te.length)&&(t=e.length);for(var i=0,a=new Array(t);i
',jp=Number.isNaN||De.isNaN;function j(e){return typeof e=="number"&&!jp(e)}var Tl=function(t){return t>0&&t<1/0};function la(e){return typeof e>"u"}function ot(e){return ra(e)==="object"&&e!==null}var Yp=Object.prototype.hasOwnProperty;function vt(e){if(!ot(e))return!1;try{var t=e.constructor,i=t.prototype;return t&&i&&Yp.call(i,"isPrototypeOf")}catch{return!1}}function be(e){return typeof e=="function"}var qp=Array.prototype.slice;function Pl(e){return Array.from?Array.from(e):qp.call(e)}function oe(e,t){return e&&be(t)&&(Array.isArray(e)||j(e.length)?Pl(e).forEach(function(i,a){t.call(e,i,a,e)}):ot(e)&&Object.keys(e).forEach(function(i){t.call(e,e[i],i,e)})),e}var J=Object.assign||function(t){for(var i=arguments.length,a=new Array(i>1?i-1:0),n=1;n0&&a.forEach(function(l){ot(l)&&Object.keys(l).forEach(function(o){t[o]=l[o]})}),t},$p=/\.\d*(?:0|9){12}\d*$/;function yt(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1e11;return $p.test(e)?Math.round(e*t)/t:e}var Xp=/^width|height|left|top|marginLeft|marginTop$/;function je(e,t){var i=e.style;oe(t,function(a,n){Xp.test(n)&&j(a)&&(a="".concat(a,"px")),i[n]=a})}function Kp(e,t){return e.classList?e.classList.contains(t):e.className.indexOf(t)>-1}function pe(e,t){if(t){if(j(e.length)){oe(e,function(a){pe(a,t)});return}if(e.classList){e.classList.add(t);return}var i=e.className.trim();i?i.indexOf(t)<0&&(e.className="".concat(i," ").concat(t)):e.className=t}}function Oe(e,t){if(t){if(j(e.length)){oe(e,function(i){Oe(i,t)});return}if(e.classList){e.classList.remove(t);return}e.className.indexOf(t)>=0&&(e.className=e.className.replace(t,""))}}function xt(e,t,i){if(t){if(j(e.length)){oe(e,function(a){xt(a,t,i)});return}i?pe(e,t):Oe(e,t)}}var Zp=/([a-z\d])([A-Z])/g;function va(e){return e.replace(Zp,"$1-$2").toLowerCase()}function ha(e,t){return ot(e[t])?e[t]:e.dataset?e.dataset[t]:e.getAttribute("data-".concat(va(t)))}function Wt(e,t,i){ot(i)?e[t]=i:e.dataset?e.dataset[t]=i:e.setAttribute("data-".concat(va(t)),i)}function Qp(e,t){if(ot(e[t]))try{delete e[t]}catch{e[t]=void 0}else if(e.dataset)try{delete e.dataset[t]}catch{e.dataset[t]=void 0}else e.removeAttribute("data-".concat(va(t)))}var Fl=/\s\s*/,Ol=(function(){var e=!1;if(Ti){var t=!1,i=function(){},a=Object.defineProperty({},"once",{get:function(){return e=!0,t},set:function(l){t=l}});De.addEventListener("test",i,a),De.removeEventListener("test",i,a)}return e})();function Fe(e,t,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},n=i;t.trim().split(Fl).forEach(function(l){if(!Ol){var o=e.listeners;o&&o[l]&&o[l][i]&&(n=o[l][i],delete o[l][i],Object.keys(o[l]).length===0&&delete o[l],Object.keys(o).length===0&&delete e.listeners)}e.removeEventListener(l,n,a)})}function Se(e,t,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},n=i;t.trim().split(Fl).forEach(function(l){if(a.once&&!Ol){var o=e.listeners,r=o===void 0?{}:o;n=function(){delete r[l][i],e.removeEventListener(l,n,a);for(var p=arguments.length,c=new Array(p),d=0;dMath.abs(i)&&(i=m)})}),i}function bi(e,t){var i=e.pageX,a=e.pageY,n={endX:i,endY:a};return t?n:xl({startX:i,startY:a},n)}function tm(e){var t=0,i=0,a=0;return oe(e,function(n){var l=n.startX,o=n.startY;t+=l,i+=o,a+=1}),t/=a,i/=a,{pageX:t,pageY:i}}function Ye(e){var t=e.aspectRatio,i=e.height,a=e.width,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"contain",l=Tl(a),o=Tl(i);if(l&&o){var r=i*t;n==="contain"&&r>a||n==="cover"&&r90?{width:s,height:r}:{width:r,height:s}}function am(e,t,i,a){var n=t.aspectRatio,l=t.naturalWidth,o=t.naturalHeight,r=t.rotate,s=r===void 0?0:r,p=t.scaleX,c=p===void 0?1:p,d=t.scaleY,m=d===void 0?1:d,u=i.aspectRatio,g=i.naturalWidth,f=i.naturalHeight,h=a.fillColor,I=h===void 0?"transparent":h,b=a.imageSmoothingEnabled,E=b===void 0?!0:b,v=a.imageSmoothingQuality,y=v===void 0?"low":v,T=a.maxWidth,_=T===void 0?1/0:T,x=a.maxHeight,R=x===void 0?1/0:x,P=a.minWidth,z=P===void 0?0:P,A=a.minHeight,B=A===void 0?0:A,w=document.createElement("canvas"),F=w.getContext("2d"),S=Ye({aspectRatio:u,width:_,height:R}),L=Ye({aspectRatio:u,width:z,height:B},"cover"),D=Math.min(S.width,Math.max(L.width,g)),O=Math.min(S.height,Math.max(L.height,f)),U=Ye({aspectRatio:n,width:_,height:R}),C=Ye({aspectRatio:n,width:z,height:B},"cover"),X=Math.min(U.width,Math.max(C.width,l)),K=Math.min(U.height,Math.max(C.height,o)),Z=[-X/2,-K/2,X,K];return w.width=yt(D),w.height=yt(O),F.fillStyle=I,F.fillRect(0,0,D,O),F.save(),F.translate(D/2,O/2),F.rotate(s*Math.PI/180),F.scale(c,m),F.imageSmoothingEnabled=E,F.imageSmoothingQuality=y,F.drawImage.apply(F,[e].concat(Rl(Z.map(function(ce){return Math.floor(yt(ce))})))),F.restore(),w}var Cl=String.fromCharCode;function nm(e,t,i){var a="";i+=t;for(var n=t;n0;)i.push(Cl.apply(null,Pl(n.subarray(0,a)))),n=n.subarray(a);return"data:".concat(t,";base64,").concat(btoa(i.join("")))}function sm(e){var t=new DataView(e),i;try{var a,n,l;if(t.getUint8(0)===255&&t.getUint8(1)===216)for(var o=t.byteLength,r=2;r+1=8&&(l=p+d)}}}if(l){var m=t.getUint16(l,a),u,g;for(g=0;g=0?l:Al),height:Math.max(a.offsetHeight,o>=0?o:zl)};this.containerData=r,je(n,{width:r.width,height:r.height}),pe(t,Ee),Oe(n,Ee)},initCanvas:function(){var t=this.containerData,i=this.imageData,a=this.options.viewMode,n=Math.abs(i.rotate)%180===90,l=n?i.naturalHeight:i.naturalWidth,o=n?i.naturalWidth:i.naturalHeight,r=l/o,s=t.width,p=t.height;t.height*r>t.width?a===3?s=t.height*r:p=t.width/r:a===3?p=t.width/r:s=t.height*r;var c={aspectRatio:r,naturalWidth:l,naturalHeight:o,width:s,height:p};this.canvasData=c,this.limited=a===1||a===2,this.limitCanvas(!0,!0),c.width=Math.min(Math.max(c.width,c.minWidth),c.maxWidth),c.height=Math.min(Math.max(c.height,c.minHeight),c.maxHeight),c.left=(t.width-c.width)/2,c.top=(t.height-c.height)/2,c.oldLeft=c.left,c.oldTop=c.top,this.initialCanvasData=J({},c)},limitCanvas:function(t,i){var a=this.options,n=this.containerData,l=this.canvasData,o=this.cropBoxData,r=a.viewMode,s=l.aspectRatio,p=this.cropped&&o;if(t){var c=Number(a.minCanvasWidth)||0,d=Number(a.minCanvasHeight)||0;r>1?(c=Math.max(c,n.width),d=Math.max(d,n.height),r===3&&(d*s>c?c=d*s:d=c/s)):r>0&&(c?c=Math.max(c,p?o.width:0):d?d=Math.max(d,p?o.height:0):p&&(c=o.width,d=o.height,d*s>c?c=d*s:d=c/s));var m=Ye({aspectRatio:s,width:c,height:d});c=m.width,d=m.height,l.minWidth=c,l.minHeight=d,l.maxWidth=1/0,l.maxHeight=1/0}if(i)if(r>(p?0:1)){var u=n.width-l.width,g=n.height-l.height;l.minLeft=Math.min(0,u),l.minTop=Math.min(0,g),l.maxLeft=Math.max(0,u),l.maxTop=Math.max(0,g),p&&this.limited&&(l.minLeft=Math.min(o.left,o.left+(o.width-l.width)),l.minTop=Math.min(o.top,o.top+(o.height-l.height)),l.maxLeft=o.left,l.maxTop=o.top,r===2&&(l.width>=n.width&&(l.minLeft=Math.min(0,u),l.maxLeft=Math.max(0,u)),l.height>=n.height&&(l.minTop=Math.min(0,g),l.maxTop=Math.max(0,g))))}else l.minLeft=-l.width,l.minTop=-l.height,l.maxLeft=n.width,l.maxTop=n.height},renderCanvas:function(t,i){var a=this.canvasData,n=this.imageData;if(i){var l=im({width:n.naturalWidth*Math.abs(n.scaleX||1),height:n.naturalHeight*Math.abs(n.scaleY||1),degree:n.rotate||0}),o=l.width,r=l.height,s=a.width*(o/a.naturalWidth),p=a.height*(r/a.naturalHeight);a.left-=(s-a.width)/2,a.top-=(p-a.height)/2,a.width=s,a.height=p,a.aspectRatio=o/r,a.naturalWidth=o,a.naturalHeight=r,this.limitCanvas(!0,!1)}(a.width>a.maxWidth||a.widtha.maxHeight||a.heighti.width?l.height=l.width/a:l.width=l.height*a),this.cropBoxData=l,this.limitCropBox(!0,!0),l.width=Math.min(Math.max(l.width,l.minWidth),l.maxWidth),l.height=Math.min(Math.max(l.height,l.minHeight),l.maxHeight),l.width=Math.max(l.minWidth,l.width*n),l.height=Math.max(l.minHeight,l.height*n),l.left=i.left+(i.width-l.width)/2,l.top=i.top+(i.height-l.height)/2,l.oldLeft=l.left,l.oldTop=l.top,this.initialCropBoxData=J({},l)},limitCropBox:function(t,i){var a=this.options,n=this.containerData,l=this.canvasData,o=this.cropBoxData,r=this.limited,s=a.aspectRatio;if(t){var p=Number(a.minCropBoxWidth)||0,c=Number(a.minCropBoxHeight)||0,d=r?Math.min(n.width,l.width,l.width+l.left,n.width-l.left):n.width,m=r?Math.min(n.height,l.height,l.height+l.top,n.height-l.top):n.height;p=Math.min(p,n.width),c=Math.min(c,n.height),s&&(p&&c?c*s>p?c=p/s:p=c*s:p?c=p/s:c&&(p=c*s),m*s>d?m=d/s:d=m*s),o.minWidth=Math.min(p,d),o.minHeight=Math.min(c,m),o.maxWidth=d,o.maxHeight=m}i&&(r?(o.minLeft=Math.max(0,l.left),o.minTop=Math.max(0,l.top),o.maxLeft=Math.min(n.width,l.left+l.width)-o.width,o.maxTop=Math.min(n.height,l.top+l.height)-o.height):(o.minLeft=0,o.minTop=0,o.maxLeft=n.width-o.width,o.maxTop=n.height-o.height))},renderCropBox:function(){var t=this.options,i=this.containerData,a=this.cropBoxData;(a.width>a.maxWidth||a.widtha.maxHeight||a.height=i.width&&a.height>=i.height?_l:Ta),je(this.cropBox,J({width:a.width,height:a.height},Ut({translateX:a.left,translateY:a.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),Rt(this.element,pa,this.getData())}},pm={initPreview:function(){var t=this.element,i=this.crossOrigin,a=this.options.preview,n=i?this.crossOriginUrl:this.url,l=t.alt||"The image to preview",o=document.createElement("img");if(i&&(o.crossOrigin=i),o.src=n,o.alt=l,this.viewBox.appendChild(o),this.viewBoxImage=o,!!a){var r=a;typeof a=="string"?r=t.ownerDocument.querySelectorAll(a):a.querySelector&&(r=[a]),this.previews=r,oe(r,function(s){var p=document.createElement("img");Wt(s,hi,{width:s.offsetWidth,height:s.offsetHeight,html:s.innerHTML}),i&&(p.crossOrigin=i),p.src=n,p.alt=l,p.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',s.innerHTML="",s.appendChild(p)})}},resetPreview:function(){oe(this.previews,function(t){var i=ha(t,hi);je(t,{width:i.width,height:i.height}),t.innerHTML=i.html,Qp(t,hi)})},preview:function(){var t=this.imageData,i=this.canvasData,a=this.cropBoxData,n=a.width,l=a.height,o=t.width,r=t.height,s=a.left-i.left-t.left,p=a.top-i.top-t.top;!this.cropped||this.disabled||(je(this.viewBoxImage,J({width:o,height:r},Ut(J({translateX:-s,translateY:-p},t)))),oe(this.previews,function(c){var d=ha(c,hi),m=d.width,u=d.height,g=m,f=u,h=1;n&&(h=m/n,f=l*h),l&&f>u&&(h=u/l,g=n*h,f=u),je(c,{width:g,height:f}),je(c.getElementsByTagName("img")[0],J({width:o*h,height:r*h},Ut(J({translateX:-s*h,translateY:-p*h},t))))}))}},mm={bind:function(){var t=this.element,i=this.options,a=this.cropper;be(i.cropstart)&&Se(t,ga,i.cropstart),be(i.cropmove)&&Se(t,ua,i.cropmove),be(i.cropend)&&Se(t,ma,i.cropend),be(i.crop)&&Se(t,pa,i.crop),be(i.zoom)&&Se(t,fa,i.zoom),Se(a,pl,this.onCropStart=this.cropStart.bind(this)),i.zoomable&&i.zoomOnWheel&&Se(a,hl,this.onWheel=this.wheel.bind(this),{passive:!1,capture:!0}),i.toggleDragModeOnDblclick&&Se(a,dl,this.onDblclick=this.dblclick.bind(this)),Se(t.ownerDocument,ml,this.onCropMove=this.cropMove.bind(this)),Se(t.ownerDocument,ul,this.onCropEnd=this.cropEnd.bind(this)),i.responsive&&Se(window,fl,this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,i=this.options,a=this.cropper;be(i.cropstart)&&Fe(t,ga,i.cropstart),be(i.cropmove)&&Fe(t,ua,i.cropmove),be(i.cropend)&&Fe(t,ma,i.cropend),be(i.crop)&&Fe(t,pa,i.crop),be(i.zoom)&&Fe(t,fa,i.zoom),Fe(a,pl,this.onCropStart),i.zoomable&&i.zoomOnWheel&&Fe(a,hl,this.onWheel,{passive:!1,capture:!0}),i.toggleDragModeOnDblclick&&Fe(a,dl,this.onDblclick),Fe(t.ownerDocument,ml,this.onCropMove),Fe(t.ownerDocument,ul,this.onCropEnd),i.responsive&&Fe(window,fl,this.onResize)}},um={resize:function(){if(!this.disabled){var t=this.options,i=this.container,a=this.containerData,n=i.offsetWidth/a.width,l=i.offsetHeight/a.height,o=Math.abs(n-1)>Math.abs(l-1)?n:l;if(o!==1){var r,s;t.restore&&(r=this.getCanvasData(),s=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(oe(r,function(p,c){r[c]=p*o})),this.setCropBoxData(oe(s,function(p,c){s[c]=p*o})))}}},dblclick:function(){this.disabled||this.options.dragMode===Ml||this.setDragMode(Kp(this.dragBox,ca)?Ll:Ia)},wheel:function(t){var i=this,a=Number(this.options.wheelZoomRatio)||.1,n=1;this.disabled||(t.preventDefault(),!this.wheeling&&(this.wheeling=!0,setTimeout(function(){i.wheeling=!1},50),t.deltaY?n=t.deltaY>0?1:-1:t.wheelDelta?n=-t.wheelDelta/120:t.detail&&(n=t.detail>0?1:-1),this.zoom(-n*a,t)))},cropStart:function(t){var i=t.buttons,a=t.button;if(!(this.disabled||(t.type==="mousedown"||t.type==="pointerdown"&&t.pointerType==="mouse")&&(j(i)&&i!==1||j(a)&&a!==0||t.ctrlKey))){var n=this.options,l=this.pointers,o;t.changedTouches?oe(t.changedTouches,function(r){l[r.identifier]=bi(r)}):l[t.pointerId||0]=bi(t),Object.keys(l).length>1&&n.zoomable&&n.zoomOnTouch?o=wl:o=ha(t.target,Ht),Vp.test(o)&&Rt(this.element,ga,{originalEvent:t,action:o})!==!1&&(t.preventDefault(),this.action=o,this.cropping=!1,o===Sl&&(this.cropping=!0,pe(this.dragBox,Ei)))}},cropMove:function(t){var i=this.action;if(!(this.disabled||!i)){var a=this.pointers;t.preventDefault(),Rt(this.element,ua,{originalEvent:t,action:i})!==!1&&(t.changedTouches?oe(t.changedTouches,function(n){J(a[n.identifier]||{},bi(n,!0))}):J(a[t.pointerId||0]||{},bi(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var i=this.action,a=this.pointers;t.changedTouches?oe(t.changedTouches,function(n){delete a[n.identifier]}):delete a[t.pointerId||0],i&&(t.preventDefault(),Object.keys(a).length||(this.action=""),this.cropping&&(this.cropping=!1,xt(this.dragBox,Ei,this.cropped&&this.options.modal)),Rt(this.element,ma,{originalEvent:t,action:i}))}}},gm={change:function(t){var i=this.options,a=this.canvasData,n=this.containerData,l=this.cropBoxData,o=this.pointers,r=this.action,s=i.aspectRatio,p=l.left,c=l.top,d=l.width,m=l.height,u=p+d,g=c+m,f=0,h=0,I=n.width,b=n.height,E=!0,v;!s&&t.shiftKey&&(s=d&&m?d/m:1),this.limited&&(f=l.minLeft,h=l.minTop,I=f+Math.min(n.width,a.width,a.left+a.width),b=h+Math.min(n.height,a.height,a.top+a.height));var y=o[Object.keys(o)[0]],T={x:y.endX-y.startX,y:y.endY-y.startY},_=function(R){switch(R){case nt:u+T.x>I&&(T.x=I-u);break;case lt:p+T.xb&&(T.y=b-g);break}};switch(r){case Ta:p+=T.x,c+=T.y;break;case nt:if(T.x>=0&&(u>=I||s&&(c<=h||g>=b))){E=!1;break}_(nt),d+=T.x,d<0&&(r=lt,d=-d,p-=d),s&&(m=d/s,c+=(l.height-m)/2);break;case We:if(T.y<=0&&(c<=h||s&&(p<=f||u>=I))){E=!1;break}_(We),m-=T.y,c+=T.y,m<0&&(r=It,m=-m,c-=m),s&&(d=m*s,p+=(l.width-d)/2);break;case lt:if(T.x<=0&&(p<=f||s&&(c<=h||g>=b))){E=!1;break}_(lt),d-=T.x,p+=T.x,d<0&&(r=nt,d=-d,p-=d),s&&(m=d/s,c+=(l.height-m)/2);break;case It:if(T.y>=0&&(g>=b||s&&(p<=f||u>=I))){E=!1;break}_(It),m+=T.y,m<0&&(r=We,m=-m,c-=m),s&&(d=m*s,p+=(l.width-d)/2);break;case kt:if(s){if(T.y<=0&&(c<=h||u>=I)){E=!1;break}_(We),m-=T.y,c+=T.y,d=m*s}else _(We),_(nt),T.x>=0?uh&&(m-=T.y,c+=T.y):(m-=T.y,c+=T.y);d<0&&m<0?(r=Gt,m=-m,d=-d,c-=m,p-=d):d<0?(r=Nt,d=-d,p-=d):m<0&&(r=Vt,m=-m,c-=m);break;case Nt:if(s){if(T.y<=0&&(c<=h||p<=f)){E=!1;break}_(We),m-=T.y,c+=T.y,d=m*s,p+=l.width-d}else _(We),_(lt),T.x<=0?p>f?(d-=T.x,p+=T.x):T.y<=0&&c<=h&&(E=!1):(d-=T.x,p+=T.x),T.y<=0?c>h&&(m-=T.y,c+=T.y):(m-=T.y,c+=T.y);d<0&&m<0?(r=Vt,m=-m,d=-d,c-=m,p-=d):d<0?(r=kt,d=-d,p-=d):m<0&&(r=Gt,m=-m,c-=m);break;case Gt:if(s){if(T.x<=0&&(p<=f||g>=b)){E=!1;break}_(lt),d-=T.x,p+=T.x,m=d/s}else _(It),_(lt),T.x<=0?p>f?(d-=T.x,p+=T.x):T.y>=0&&g>=b&&(E=!1):(d-=T.x,p+=T.x),T.y>=0?g=0&&(u>=I||g>=b)){E=!1;break}_(nt),d+=T.x,m=d/s}else _(It),_(nt),T.x>=0?u=0&&g>=b&&(E=!1):d+=T.x,T.y>=0?g0?r=T.y>0?Vt:kt:T.x<0&&(p-=d,r=T.y>0?Gt:Nt),T.y<0&&(c-=m),this.cropped||(Oe(this.cropBox,Ee),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0));break}E&&(l.width=d,l.height=m,l.left=p,l.top=c,this.action=r,this.renderCropBox()),oe(o,function(x){x.startX=x.endX,x.startY=x.endY})}},fm={crop:function(){return this.ready&&!this.cropped&&!this.disabled&&(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&pe(this.dragBox,Ei),Oe(this.cropBox,Ee),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=J({},this.initialImageData),this.canvasData=J({},this.initialCanvasData),this.cropBoxData=J({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(J(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),Oe(this.dragBox,Ei),pe(this.cropBox,Ee)),this},replace:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return!this.disabled&&t&&(this.isImg&&(this.element.src=t),i?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,oe(this.previews,function(a){a.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,Oe(this.cropper,sl)),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,pe(this.cropper,sl)),this},destroy:function(){var t=this.element;return t[Q]?(t[Q]=void 0,this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),this):this},move:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.canvasData,n=a.left,l=a.top;return this.moveTo(la(t)?t:n+Number(t),la(i)?i:l+Number(i))},moveTo:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.canvasData,n=!1;return t=Number(t),i=Number(i),this.ready&&!this.disabled&&this.options.movable&&(j(t)&&(a.left=t,n=!0),j(i)&&(a.top=i,n=!0),n&&this.renderCanvas(!0)),this},zoom:function(t,i){var a=this.canvasData;return t=Number(t),t<0?t=1/(1-t):t=1+t,this.zoomTo(a.width*t/a.naturalWidth,null,i)},zoomTo:function(t,i,a){var n=this.options,l=this.canvasData,o=l.width,r=l.height,s=l.naturalWidth,p=l.naturalHeight;if(t=Number(t),t>=0&&this.ready&&!this.disabled&&n.zoomable){var c=s*t,d=p*t;if(Rt(this.element,fa,{ratio:t,oldRatio:o/s,originalEvent:a})===!1)return this;if(a){var m=this.pointers,u=Dl(this.cropper),g=m&&Object.keys(m).length?tm(m):{pageX:a.pageX,pageY:a.pageY};l.left-=(c-o)*((g.pageX-u.left-l.left)/o),l.top-=(d-r)*((g.pageY-u.top-l.top)/r)}else vt(i)&&j(i.x)&&j(i.y)?(l.left-=(c-o)*((i.x-l.left)/o),l.top-=(d-r)*((i.y-l.top)/r)):(l.left-=(c-o)/2,l.top-=(d-r)/2);l.width=c,l.height=d,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return t=Number(t),j(t)&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var i=this.imageData.scaleY;return this.scale(t,j(i)?i:1)},scaleY:function(t){var i=this.imageData.scaleX;return this.scale(j(i)?i:1,t)},scale:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.imageData,n=!1;return t=Number(t),i=Number(i),this.ready&&!this.disabled&&this.options.scalable&&(j(t)&&(a.scaleX=t,n=!0),j(i)&&(a.scaleY=i,n=!0),n&&this.renderCanvas(!0,!0)),this},getData:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,i=this.options,a=this.imageData,n=this.canvasData,l=this.cropBoxData,o;if(this.ready&&this.cropped){o={x:l.left-n.left,y:l.top-n.top,width:l.width,height:l.height};var r=a.width/a.naturalWidth;if(oe(o,function(c,d){o[d]=c/r}),t){var s=Math.round(o.y+o.height),p=Math.round(o.x+o.width);o.x=Math.round(o.x),o.y=Math.round(o.y),o.width=p-o.x,o.height=s-o.y}}else o={x:0,y:0,width:0,height:0};return i.rotatable&&(o.rotate=a.rotate||0),i.scalable&&(o.scaleX=a.scaleX||1,o.scaleY=a.scaleY||1),o},setData:function(t){var i=this.options,a=this.imageData,n=this.canvasData,l={};if(this.ready&&!this.disabled&&vt(t)){var o=!1;i.rotatable&&j(t.rotate)&&t.rotate!==a.rotate&&(a.rotate=t.rotate,o=!0),i.scalable&&(j(t.scaleX)&&t.scaleX!==a.scaleX&&(a.scaleX=t.scaleX,o=!0),j(t.scaleY)&&t.scaleY!==a.scaleY&&(a.scaleY=t.scaleY,o=!0)),o&&this.renderCanvas(!0,!0);var r=a.width/a.naturalWidth;j(t.x)&&(l.left=t.x*r+n.left),j(t.y)&&(l.top=t.y*r+n.top),j(t.width)&&(l.width=t.width*r),j(t.height)&&(l.height=t.height*r),this.setCropBoxData(l)}return this},getContainerData:function(){return this.ready?J({},this.containerData):{}},getImageData:function(){return this.sized?J({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,i={};return this.ready&&oe(["left","top","width","height","naturalWidth","naturalHeight"],function(a){i[a]=t[a]}),i},setCanvasData:function(t){var i=this.canvasData,a=i.aspectRatio;return this.ready&&!this.disabled&&vt(t)&&(j(t.left)&&(i.left=t.left),j(t.top)&&(i.top=t.top),j(t.width)?(i.width=t.width,i.height=t.width/a):j(t.height)&&(i.height=t.height,i.width=t.height*a),this.renderCanvas(!0)),this},getCropBoxData:function(){var t=this.cropBoxData,i;return this.ready&&this.cropped&&(i={left:t.left,top:t.top,width:t.width,height:t.height}),i||{}},setCropBoxData:function(t){var i=this.cropBoxData,a=this.options.aspectRatio,n,l;return this.ready&&this.cropped&&!this.disabled&&vt(t)&&(j(t.left)&&(i.left=t.left),j(t.top)&&(i.top=t.top),j(t.width)&&t.width!==i.width&&(n=!0,i.width=t.width),j(t.height)&&t.height!==i.height&&(l=!0,i.height=t.height),a&&(n?i.height=i.width/a:l&&(i.width=i.height*a)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var i=this.canvasData,a=am(this.image,this.imageData,i,t);if(!this.cropped)return a;var n=this.getData(t.rounded),l=n.x,o=n.y,r=n.width,s=n.height,p=a.width/Math.floor(i.naturalWidth);p!==1&&(l*=p,o*=p,r*=p,s*=p);var c=r/s,d=Ye({aspectRatio:c,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),m=Ye({aspectRatio:c,width:t.minWidth||0,height:t.minHeight||0},"cover"),u=Ye({aspectRatio:c,width:t.width||(p!==1?a.width:r),height:t.height||(p!==1?a.height:s)}),g=u.width,f=u.height;g=Math.min(d.width,Math.max(m.width,g)),f=Math.min(d.height,Math.max(m.height,f));var h=document.createElement("canvas"),I=h.getContext("2d");h.width=yt(g),h.height=yt(f),I.fillStyle=t.fillColor||"transparent",I.fillRect(0,0,g,f);var b=t.imageSmoothingEnabled,E=b===void 0?!0:b,v=t.imageSmoothingQuality;I.imageSmoothingEnabled=E,v&&(I.imageSmoothingQuality=v);var y=a.width,T=a.height,_=l,x=o,R,P,z,A,B,w;_<=-r||_>y?(_=0,R=0,z=0,B=0):_<=0?(z=-_,_=0,R=Math.min(y,r+_),B=R):_<=y&&(z=0,R=Math.min(r,y-_),B=R),R<=0||x<=-s||x>T?(x=0,P=0,A=0,w=0):x<=0?(A=-x,x=0,P=Math.min(T,s+x),w=P):x<=T&&(A=0,P=Math.min(s,T-x),w=P);var F=[_,x,R,P];if(B>0&&w>0){var S=g/r;F.push(z*S,A*S,B*S,w*S)}return I.drawImage.apply(I,[a].concat(Rl(F.map(function(L){return Math.floor(yt(L))})))),h},setAspectRatio:function(t){var i=this.options;return!this.disabled&&!la(t)&&(i.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var i=this.options,a=this.dragBox,n=this.face;if(this.ready&&!this.disabled){var l=t===Ia,o=i.movable&&t===Ll;t=l||o?t:Ml,i.dragMode=t,Wt(a,Ht,t),xt(a,ca,l),xt(a,da,o),i.cropBoxMovable||(Wt(n,Ht,t),xt(n,ca,l),xt(n,da,o))}return this}},hm=De.Cropper,xa=(function(){function e(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(Mp(this,e),!t||!Hp.test(t.tagName))throw new Error("The first argument is required and must be an or element.");this.element=t,this.options=J({},El,vt(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return Ap(e,[{key:"init",value:function(){var i=this.element,a=i.tagName.toLowerCase(),n;if(!i[Q]){if(i[Q]=this,a==="img"){if(this.isImg=!0,n=i.getAttribute("src")||"",this.originalUrl=n,!n)return;n=i.src}else a==="canvas"&&window.HTMLCanvasElement&&(n=i.toDataURL());this.load(n)}}},{key:"load",value:function(i){var a=this;if(i){this.url=i,this.imageData={};var n=this.element,l=this.options;if(!l.rotatable&&!l.scalable&&(l.checkOrientation=!1),!l.checkOrientation||!window.ArrayBuffer){this.clone();return}if(Gp.test(i)){Up.test(i)?this.read(om(i)):this.clone();return}var o=new XMLHttpRequest,r=this.clone.bind(this);this.reloading=!0,this.xhr=o,o.onabort=r,o.onerror=r,o.ontimeout=r,o.onprogress=function(){o.getResponseHeader("content-type")!==bl&&o.abort()},o.onload=function(){a.read(o.response)},o.onloadend=function(){a.reloading=!1,a.xhr=null},l.checkCrossOrigin&&Il(i)&&n.crossOrigin&&(i=vl(i)),o.open("GET",i,!0),o.responseType="arraybuffer",o.withCredentials=n.crossOrigin==="use-credentials",o.send()}}},{key:"read",value:function(i){var a=this.options,n=this.imageData,l=sm(i),o=0,r=1,s=1;if(l>1){this.url=rm(i,bl);var p=cm(l);o=p.rotate,r=p.scaleX,s=p.scaleY}a.rotatable&&(n.rotate=o),a.scalable&&(n.scaleX=r,n.scaleY=s),this.clone()}},{key:"clone",value:function(){var i=this.element,a=this.url,n=i.crossOrigin,l=a;this.options.checkCrossOrigin&&Il(a)&&(n||(n="anonymous"),l=vl(a)),this.crossOrigin=n,this.crossOriginUrl=l;var o=document.createElement("img");n&&(o.crossOrigin=n),o.src=l||a,o.alt=i.alt||"The image to crop",this.image=o,o.onload=this.start.bind(this),o.onerror=this.stop.bind(this),pe(o,cl),i.parentNode.insertBefore(o,i.nextSibling)}},{key:"start",value:function(){var i=this,a=this.image;a.onload=null,a.onerror=null,this.sizing=!0;var n=De.navigator&&/(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(De.navigator.userAgent),l=function(p,c){J(i.imageData,{naturalWidth:p,naturalHeight:c,aspectRatio:p/c}),i.initialImageData=J({},i.imageData),i.sizing=!1,i.sized=!0,i.build()};if(a.naturalWidth&&!n){l(a.naturalWidth,a.naturalHeight);return}var o=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=o,o.onload=function(){l(o.width,o.height),n||r.removeChild(o)},o.src=a.src,n||(o.style.cssText="left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;",r.appendChild(o))}},{key:"stop",value:function(){var i=this.image;i.onload=null,i.onerror=null,i.parentNode.removeChild(i),this.image=null}},{key:"build",value:function(){if(!(!this.sized||this.ready)){var i=this.element,a=this.options,n=this.image,l=i.parentNode,o=document.createElement("div");o.innerHTML=Wp;var r=o.querySelector(".".concat(Q,"-container")),s=r.querySelector(".".concat(Q,"-canvas")),p=r.querySelector(".".concat(Q,"-drag-box")),c=r.querySelector(".".concat(Q,"-crop-box")),d=c.querySelector(".".concat(Q,"-face"));this.container=l,this.cropper=r,this.canvas=s,this.dragBox=p,this.cropBox=c,this.viewBox=r.querySelector(".".concat(Q,"-view-box")),this.face=d,s.appendChild(n),pe(i,Ee),l.insertBefore(r,i.nextSibling),Oe(n,cl),this.initPreview(),this.bind(),a.initialAspectRatio=Math.max(0,a.initialAspectRatio)||NaN,a.aspectRatio=Math.max(0,a.aspectRatio)||NaN,a.viewMode=Math.max(0,Math.min(3,Math.round(a.viewMode)))||0,pe(c,Ee),a.guides||pe(c.getElementsByClassName("".concat(Q,"-dashed")),Ee),a.center||pe(c.getElementsByClassName("".concat(Q,"-center")),Ee),a.background&&pe(r,"".concat(Q,"-bg")),a.highlight||pe(d,Cp),a.cropBoxMovable&&(pe(d,da),Wt(d,Ht,Ta)),a.cropBoxResizable||(pe(c.getElementsByClassName("".concat(Q,"-line")),Ee),pe(c.getElementsByClassName("".concat(Q,"-point")),Ee)),this.render(),this.ready=!0,this.setDragMode(a.dragMode),a.autoCrop&&this.crop(),this.setData(a.data),be(a.ready)&&Se(i,gl,a.ready,{once:!0}),Rt(i,gl)}}},{key:"unbuild",value:function(){if(this.ready){this.ready=!1,this.unbind(),this.resetPreview();var i=this.cropper.parentNode;i&&i.removeChild(this.cropper),Oe(this.element,Ee)}}},{key:"uncreate",value:function(){this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?(this.xhr.onabort=null,this.xhr.abort()):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=hm,e}},{key:"setDefaults",value:function(i){J(El,vt(i)&&i)}}])})();J(xa.prototype,dm,pm,mm,um,gm,fm);var Bl={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.autodesk.fbx":["fbx"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dcmp+xml":["dcmp"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.slides":["ggs"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.drawing":["gdraw"],"application/vnd.google-apps.form":["gform"],"application/vnd.google-apps.jam":["gjam"],"application/vnd.google-apps.map":["gmap"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.script":["gscript"],"application/vnd.google-apps.site":["gsite"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.gov.sk.xmldatacontainer+xml":["xdcf"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-visio.viewer":["vdx"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.nato.bindingdataobject+xml":["bdo"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.procrate.brushset":["brushset"],"application/vnd.procreate.brush":["brush"],"application/vnd.procreate.dream":["drm"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw","vsdx","vtx"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blender":["blend"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-compressed":["*rar"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-ipynb+json":["ipynb"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zip-compressed":["*zip"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.blockfact.facti":["facti"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-adobe-dng":["dng"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.bary":["bary"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["*mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(Bl);var kl=Bl;var Nl={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/dicom":["dcm"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg","one","onea"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"application/zip+dotlottie":["lottie"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a","m4b"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/ief":["ief"],"image/jaii":["jaii"],"image/jais":["jais"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpg","jpeg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxl":["jxl"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/pjpeg":["jfif"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime","mht","mhtml"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step":["step","stp","stpnc","p21","210"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts","m2t","m2ts","mts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(Nl);var Vl=Nl;var _e=function(e,t,i,a){if(i==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof t=="function"?e!==t||!a:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?a:i==="a"?a.call(e):a?a.value:t.get(e)},St,jt,rt,ya=class{constructor(...t){St.set(this,new Map),jt.set(this,new Map),rt.set(this,new Map);for(let i of t)this.define(i)}define(t,i=!1){for(let[a,n]of Object.entries(t)){a=a.toLowerCase(),n=n.map(r=>r.toLowerCase()),_e(this,rt,"f").has(a)||_e(this,rt,"f").set(a,new Set);let l=_e(this,rt,"f").get(a),o=!0;for(let r of n){let s=r.startsWith("*");if(r=s?r.slice(1):r,l?.add(r),o&&_e(this,jt,"f").set(a,r),o=!1,s)continue;let p=_e(this,St,"f").get(r);if(p&&p!=a&&!i)throw new Error(`"${a} -> ${r}" conflicts with "${p} -> ${r}". Pass \`force=true\` to override this definition.`);_e(this,St,"f").set(r,a)}}return this}getType(t){if(typeof t!="string")return null;let i=t.replace(/^.*[/\\]/s,"").toLowerCase(),a=i.replace(/^.*\./s,"").toLowerCase(),n=i.length{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let t of _e(this,rt,"f").values())Object.freeze(t);return this}_getTestState(){return{types:_e(this,St,"f"),extensions:_e(this,jt,"f")}}};St=new WeakMap,jt=new WeakMap,rt=new WeakMap;var Ra=ya;var Gl=new Ra(Vl,kl)._freeze();var Ul=({addFilter:e,utils:t})=>{let{Type:i,replaceInString:a,toNaturalFileSize:n}=t;return e("ALLOW_HOPPER_ITEM",(l,{query:o})=>{if(!o("GET_ALLOW_FILE_SIZE_VALIDATION"))return!0;let r=o("GET_MAX_FILE_SIZE");if(r!==null&&l.size>r)return!1;let s=o("GET_MIN_FILE_SIZE");return!(s!==null&&l.sizenew Promise((r,s)=>{if(!o("GET_ALLOW_FILE_SIZE_VALIDATION"))return r(l);let p=o("GET_FILE_VALIDATE_SIZE_FILTER");if(p&&!p(l))return r(l);let c=o("GET_MAX_FILE_SIZE");if(c!==null&&l.size>c){s({status:{main:o("GET_LABEL_MAX_FILE_SIZE_EXCEEDED"),sub:a(o("GET_LABEL_MAX_FILE_SIZE"),{filesize:n(c,".",o("GET_FILE_SIZE_BASE"),o("GET_FILE_SIZE_LABELS",o))})}});return}let d=o("GET_MIN_FILE_SIZE");if(d!==null&&l.sizeg+f.fileSize,0)>m){s({status:{main:o("GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED"),sub:a(o("GET_LABEL_MAX_TOTAL_FILE_SIZE"),{filesize:n(m,".",o("GET_FILE_SIZE_BASE"),o("GET_FILE_SIZE_LABELS",o))})}});return}r(l)})),{options:{allowFileSizeValidation:[!0,i.BOOLEAN],maxFileSize:[null,i.INT],minFileSize:[null,i.INT],maxTotalFileSize:[null,i.INT],fileValidateSizeFilter:[null,i.FUNCTION],labelMinFileSizeExceeded:["File is too small",i.STRING],labelMinFileSize:["Minimum file size is {filesize}",i.STRING],labelMaxFileSizeExceeded:["File is too large",i.STRING],labelMaxFileSize:["Maximum file size is {filesize}",i.STRING],labelMaxTotalFileSizeExceeded:["Maximum total size exceeded",i.STRING],labelMaxTotalFileSize:["Maximum total file size is {filesize}",i.STRING]}}},bm=typeof window<"u"&&typeof window.document<"u";bm&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Ul}));var Hl=Ul;var Wl=({addFilter:e,utils:t})=>{let{Type:i,isString:a,replaceInString:n,guesstimateMimeType:l,getExtensionFromFilename:o,getFilenameFromURL:r}=t,s=(u,g)=>{let f=(/^[^/]+/.exec(u)||[]).pop(),h=g.slice(0,-2);return f===h},p=(u,g)=>u.some(f=>/\*$/.test(f)?s(g,f):f===g),c=u=>{let g="";if(a(u)){let f=r(u),h=o(f);h&&(g=l(h))}else g=u.type;return g},d=(u,g,f)=>{if(g.length===0)return!0;let h=c(u);return f?new Promise((I,b)=>{f(u,h).then(E=>{p(g,E)?I():b()}).catch(b)}):p(g,h)},m=u=>g=>u[g]===null?!1:u[g]||g;return e("SET_ATTRIBUTE_TO_OPTION_MAP",u=>Object.assign(u,{accept:"acceptedFileTypes"})),e("ALLOW_HOPPER_ITEM",(u,{query:g})=>g("GET_ALLOW_FILE_TYPE_VALIDATION")?d(u,g("GET_ACCEPTED_FILE_TYPES")):!0),e("LOAD_FILE",(u,{query:g})=>new Promise((f,h)=>{if(!g("GET_ALLOW_FILE_TYPE_VALIDATION")){f(u);return}let I=g("GET_ACCEPTED_FILE_TYPES"),b=g("GET_FILE_VALIDATE_TYPE_DETECT_TYPE"),E=d(u,I,b),v=()=>{let y=I.map(m(g("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP"))).filter(_=>_!==!1),T=y.filter((_,x)=>y.indexOf(_)===x);h({status:{main:g("GET_LABEL_FILE_TYPE_NOT_ALLOWED"),sub:n(g("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES"),{allTypes:T.join(", "),allButLastType:T.slice(0,-1).join(", "),lastType:T[T.length-1]})}})};if(typeof E=="boolean")return E?f(u):v();E.then(()=>{f(u)}).catch(v)})),{options:{allowFileTypeValidation:[!0,i.BOOLEAN],acceptedFileTypes:[[],i.ARRAY],labelFileTypeNotAllowed:["File is of invalid type",i.STRING],fileValidateTypeLabelExpectedTypes:["Expects {allButLastType} or {lastType}",i.STRING],fileValidateTypeLabelExpectedTypesMap:[{},i.OBJECT],fileValidateTypeDetectType:[null,i.FUNCTION]}}},Em=typeof window<"u"&&typeof window.document<"u";Em&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Wl}));var jl=Wl;var Yl=e=>/^image/.test(e.type),ql=({addFilter:e,utils:t})=>{let{Type:i,isFile:a,getNumericAspectRatioFromString:n}=t,l=(p,c)=>!(!Yl(p.file)||!c("GET_ALLOW_IMAGE_CROP")),o=p=>typeof p=="object",r=p=>typeof p=="number",s=(p,c)=>p.setMetadata("crop",Object.assign({},p.getMetadata("crop"),c));return e("DID_CREATE_ITEM",(p,{query:c})=>{p.extend("setImageCrop",d=>{if(!(!l(p,c)||!o(center)))return p.setMetadata("crop",d),d}),p.extend("setImageCropCenter",d=>{if(!(!l(p,c)||!o(d)))return s(p,{center:d})}),p.extend("setImageCropZoom",d=>{if(!(!l(p,c)||!r(d)))return s(p,{zoom:Math.max(1,d)})}),p.extend("setImageCropRotation",d=>{if(!(!l(p,c)||!r(d)))return s(p,{rotation:d})}),p.extend("setImageCropFlip",d=>{if(!(!l(p,c)||!o(d)))return s(p,{flip:d})}),p.extend("setImageCropAspectRatio",d=>{if(!l(p,c)||typeof d>"u")return;let m=p.getMetadata("crop"),u=n(d),g={center:{x:.5,y:.5},flip:m?Object.assign({},m.flip):{horizontal:!1,vertical:!1},rotation:0,zoom:1,aspectRatio:u};return p.setMetadata("crop",g),g})}),e("DID_LOAD_ITEM",(p,{query:c})=>new Promise((d,m)=>{let u=p.file;if(!a(u)||!Yl(u)||!c("GET_ALLOW_IMAGE_CROP")||p.getMetadata("crop"))return d(p);let f=c("GET_IMAGE_CROP_ASPECT_RATIO");p.setMetadata("crop",{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},rotation:0,zoom:1,aspectRatio:f?n(f):null}),d(p)})),{options:{allowImageCrop:[!0,i.BOOLEAN],imageCropAspectRatio:[null,i.STRING]}}},Tm=typeof window<"u"&&typeof window.document<"u";Tm&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:ql}));var $l=ql;var Sa=e=>/^image/.test(e.type),Xl=e=>{let{addFilter:t,utils:i,views:a}=e,{Type:n,createRoute:l,createItemAPI:o=c=>c}=i,{fileActionButton:r}=a;t("SHOULD_REMOVE_ON_REVERT",(c,{item:d,query:m})=>new Promise(u=>{let{file:g}=d,f=m("GET_ALLOW_IMAGE_EDIT")&&m("GET_IMAGE_EDIT_ALLOW_EDIT")&&Sa(g);u(!f)})),t("DID_LOAD_ITEM",(c,{query:d,dispatch:m})=>new Promise((u,g)=>{if(c.origin>1){u(c);return}let{file:f}=c;if(!d("GET_ALLOW_IMAGE_EDIT")||!d("GET_IMAGE_EDIT_INSTANT_EDIT")){u(c);return}if(!Sa(f)){u(c);return}let h=(b,E,v)=>y=>{s.shift(),y?E(b):v(b),m("KICK"),I()},I=()=>{if(!s.length)return;let{item:b,resolve:E,reject:v}=s[0];m("EDIT_ITEM",{id:b.id,handleEditorResponse:h(b,E,v)})};p({item:c,resolve:u,reject:g}),s.length===1&&I()})),t("DID_CREATE_ITEM",(c,{query:d,dispatch:m})=>{c.extend("edit",()=>{m("EDIT_ITEM",{id:c.id})})});let s=[],p=c=>(s.push(c),c);return t("CREATE_VIEW",c=>{let{is:d,view:m,query:u}=c;if(!u("GET_ALLOW_IMAGE_EDIT"))return;let g=u("GET_ALLOW_IMAGE_PREVIEW");if(!(d("file-info")&&!g||d("file")&&g))return;let h=u("GET_IMAGE_EDIT_EDITOR");if(!h)return;h.filepondCallbackBridge||(h.outputData=!0,h.outputFile=!1,h.filepondCallbackBridge={onconfirm:h.onconfirm||(()=>{}),oncancel:h.oncancel||(()=>{})});let I=({root:v,props:y,action:T})=>{let{id:_}=y,{handleEditorResponse:x}=T;h.cropAspectRatio=v.query("GET_IMAGE_CROP_ASPECT_RATIO")||h.cropAspectRatio,h.outputCanvasBackgroundColor=v.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||h.outputCanvasBackgroundColor;let R=v.query("GET_ITEM",_);if(!R)return;let P=R.file,z=R.getMetadata("crop"),A={center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},B=R.getMetadata("resize"),w=R.getMetadata("filter")||null,F=R.getMetadata("filters")||null,S=R.getMetadata("colors")||null,L=R.getMetadata("markup")||null,D={crop:z||A,size:B?{upscale:B.upscale,mode:B.mode,width:B.size.width,height:B.size.height}:null,filter:F?F.id||F.matrix:v.query("GET_ALLOW_IMAGE_FILTER")&&v.query("GET_IMAGE_FILTER_COLOR_MATRIX")&&!S?w:null,color:S,markup:L};h.onconfirm=({data:O})=>{let{crop:U,size:C,filter:X,color:K,colorMatrix:Z,markup:ce}=O,V={};if(U&&(V.crop=U),C){let W=(R.getMetadata("resize")||{}).size,$={width:C.width,height:C.height};!($.width&&$.height)&&W&&($.width=W.width,$.height=W.height),($.width||$.height)&&(V.resize={upscale:C.upscale,mode:C.mode,size:$})}ce&&(V.markup=ce),V.colors=K,V.filters=X,V.filter=Z,R.setMetadata(V),h.filepondCallbackBridge.onconfirm(O,o(R)),x&&(h.onclose=()=>{x(!0),h.onclose=null})},h.oncancel=()=>{h.filepondCallbackBridge.oncancel(o(R)),x&&(h.onclose=()=>{x(!1),h.onclose=null})},h.open(P,D)},b=({root:v,props:y})=>{if(!u("GET_IMAGE_EDIT_ALLOW_EDIT"))return;let{id:T}=y,_=u("GET_ITEM",T);if(!_)return;let x=_.file;if(Sa(x))if(v.ref.handleEdit=R=>{R.stopPropagation(),v.dispatch("EDIT_ITEM",{id:T})},g){let R=m.createChildView(r,{label:"edit",icon:u("GET_IMAGE_EDIT_ICON_EDIT"),opacity:0});R.element.classList.add("filepond--action-edit-item"),R.element.dataset.align=u("GET_STYLE_IMAGE_EDIT_BUTTON_EDIT_ITEM_POSITION"),R.on("click",v.ref.handleEdit),v.ref.buttonEditItem=m.appendChildView(R)}else{let R=m.element.querySelector(".filepond--file-info-main"),P=document.createElement("button");P.className="filepond--action-edit-item-alt",P.innerHTML=u("GET_IMAGE_EDIT_ICON_EDIT")+"edit",P.addEventListener("click",v.ref.handleEdit),R.appendChild(P),v.ref.editButton=P}};m.registerDestroyer(({root:v})=>{v.ref.buttonEditItem&&v.ref.buttonEditItem.off("click",v.ref.handleEdit),v.ref.editButton&&v.ref.editButton.removeEventListener("click",v.ref.handleEdit)});let E={EDIT_ITEM:I,DID_LOAD_ITEM:b};if(g){let v=({root:y})=>{y.ref.buttonEditItem&&(y.ref.buttonEditItem.opacity=1)};E.DID_IMAGE_PREVIEW_SHOW=v}m.registerWriter(l(E))}),{options:{allowImageEdit:[!0,n.BOOLEAN],styleImageEditButtonEditItemPosition:["bottom center",n.STRING],imageEditInstantEdit:[!1,n.BOOLEAN],imageEditAllowEdit:[!0,n.BOOLEAN],imageEditIconEdit:['',n.STRING],imageEditEditor:[null,n.OBJECT]}}},Im=typeof window<"u"&&typeof window.document<"u";Im&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Xl}));var Kl=Xl;var vm=e=>/^image\/jpeg/.test(e.type),st={JPEG:65496,APP1:65505,EXIF:1165519206,TIFF:18761,Orientation:274,Unknown:65280},ct=(e,t,i=!1)=>e.getUint16(t,i),Zl=(e,t,i=!1)=>e.getUint32(t,i),xm=e=>new Promise((t,i)=>{let a=new FileReader;a.onload=function(n){let l=new DataView(n.target.result);if(ct(l,0)!==st.JPEG){t(-1);return}let o=l.byteLength,r=2;for(;rym,Sm="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QA6RXhpZgAATU0AKgAAAAgAAwESAAMAAAABAAYAAAEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////wAALCAABAAIBASIA/8QAJgABAAAAAAAAAAAAAAAAAAAAAxABAAAAAAAAAAAAAAAAAAAAAP/aAAgBAQAAPwBH/9k=",Ql,Ii=Rm()?new Image:{};Ii.onload=()=>Ql=Ii.naturalWidth>Ii.naturalHeight;Ii.src=Sm;var _m=()=>Ql,Jl=({addFilter:e,utils:t})=>{let{Type:i,isFile:a}=t;return e("DID_LOAD_ITEM",(n,{query:l})=>new Promise((o,r)=>{let s=n.file;if(!a(s)||!vm(s)||!l("GET_ALLOW_IMAGE_EXIF_ORIENTATION")||!_m())return o(n);xm(s).then(p=>{n.setMetadata("exif",{orientation:p}),o(n)})})),{options:{allowImageExifOrientation:[!0,i.BOOLEAN]}}},wm=typeof window<"u"&&typeof window.document<"u";wm&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Jl}));var eo=Jl;var Lm=e=>/^image/.test(e.type),to=(e,t)=>qt(e.x*t,e.y*t),io=(e,t)=>qt(e.x+t.x,e.y+t.y),Mm=e=>{let t=Math.sqrt(e.x*e.x+e.y*e.y);return t===0?{x:0,y:0}:qt(e.x/t,e.y/t)},vi=(e,t,i)=>{let a=Math.cos(t),n=Math.sin(t),l=qt(e.x-i.x,e.y-i.y);return qt(i.x+a*l.x-n*l.y,i.y+n*l.x+a*l.y)},qt=(e=0,t=0)=>({x:e,y:t}),Te=(e,t,i=1,a)=>{if(typeof e=="string")return parseFloat(e)*i;if(typeof e=="number")return e*(a?t[a]:Math.min(t.width,t.height))},Am=(e,t,i)=>{let a=e.borderStyle||e.lineStyle||"solid",n=e.backgroundColor||e.fontColor||"transparent",l=e.borderColor||e.lineColor||"transparent",o=Te(e.borderWidth||e.lineWidth,t,i),r=e.lineCap||"round",s=e.lineJoin||"round",p=typeof a=="string"?"":a.map(d=>Te(d,t,i)).join(","),c=e.opacity||1;return{"stroke-linecap":r,"stroke-linejoin":s,"stroke-width":o||0,"stroke-dasharray":p,stroke:l,fill:n,opacity:c}},we=e=>e!=null,zm=(e,t,i=1)=>{let a=Te(e.x,t,i,"width")||Te(e.left,t,i,"width"),n=Te(e.y,t,i,"height")||Te(e.top,t,i,"height"),l=Te(e.width,t,i,"width"),o=Te(e.height,t,i,"height"),r=Te(e.right,t,i,"width"),s=Te(e.bottom,t,i,"height");return we(n)||(we(o)&&we(s)?n=t.height-o-s:n=s),we(a)||(we(l)&&we(r)?a=t.width-l-r:a=r),we(l)||(we(a)&&we(r)?l=t.width-a-r:l=0),we(o)||(we(n)&&we(s)?o=t.height-n-s:o=0),{x:a||0,y:n||0,width:l||0,height:o||0}},Pm=e=>e.map((t,i)=>`${i===0?"M":"L"} ${t.x} ${t.y}`).join(" "),Be=(e,t)=>Object.keys(t).forEach(i=>e.setAttribute(i,t[i])),Fm="http://www.w3.org/2000/svg",_t=(e,t)=>{let i=document.createElementNS(Fm,e);return t&&Be(i,t),i},Om=e=>Be(e,{...e.rect,...e.styles}),Dm=e=>{let t=e.rect.x+e.rect.width*.5,i=e.rect.y+e.rect.height*.5,a=e.rect.width*.5,n=e.rect.height*.5;return Be(e,{cx:t,cy:i,rx:a,ry:n,...e.styles})},Cm={contain:"xMidYMid meet",cover:"xMidYMid slice"},Bm=(e,t)=>{Be(e,{...e.rect,...e.styles,preserveAspectRatio:Cm[t.fit]||"none"})},km={left:"start",center:"middle",right:"end"},Nm=(e,t,i,a)=>{let n=Te(t.fontSize,i,a),l=t.fontFamily||"sans-serif",o=t.fontWeight||"normal",r=km[t.textAlign]||"start";Be(e,{...e.rect,...e.styles,"stroke-width":0,"font-weight":o,"font-size":n,"font-family":l,"text-anchor":r}),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},Vm=(e,t,i,a)=>{Be(e,{...e.rect,...e.styles,fill:"none"});let n=e.childNodes[0],l=e.childNodes[1],o=e.childNodes[2],r=e.rect,s={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(Be(n,{x1:r.x,y1:r.y,x2:s.x,y2:s.y}),!t.lineDecoration)return;l.style.display="none",o.style.display="none";let p=Mm({x:s.x-r.x,y:s.y-r.y}),c=Te(.05,i,a);if(t.lineDecoration.indexOf("arrow-begin")!==-1){let d=to(p,c),m=io(r,d),u=vi(r,2,m),g=vi(r,-2,m);Be(l,{style:"display:block;",d:`M${u.x},${u.y} L${r.x},${r.y} L${g.x},${g.y}`})}if(t.lineDecoration.indexOf("arrow-end")!==-1){let d=to(p,-c),m=io(s,d),u=vi(s,2,m),g=vi(s,-2,m);Be(o,{style:"display:block;",d:`M${u.x},${u.y} L${s.x},${s.y} L${g.x},${g.y}`})}},Gm=(e,t,i,a)=>{Be(e,{...e.styles,fill:"none",d:Pm(t.points.map(n=>({x:Te(n.x,i,a,"width"),y:Te(n.y,i,a,"height")})))})},xi=e=>t=>_t(e,{id:t.id}),Um=e=>{let t=_t("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=()=>{t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},Hm=e=>{let t=_t("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=_t("line");t.appendChild(i);let a=_t("path");t.appendChild(a);let n=_t("path");return t.appendChild(n),t},Wm={image:Um,rect:xi("rect"),ellipse:xi("ellipse"),text:xi("text"),path:xi("path"),line:Hm},jm={rect:Om,ellipse:Dm,image:Bm,text:Nm,path:Gm,line:Vm},Ym=(e,t)=>Wm[e](t),qm=(e,t,i,a,n)=>{t!=="path"&&(e.rect=zm(i,a,n)),e.styles=Am(i,a,n),jm[t](e,i,a,n)},$m=["x","y","left","top","right","bottom","width","height"],Xm=e=>typeof e=="string"&&/%/.test(e)?parseFloat(e)/100:e,Km=e=>{let[t,i]=e,a=i.points?{}:$m.reduce((n,l)=>(n[l]=Xm(i[l]),n),{});return[t,{zIndex:0,...i,...a}]},Zm=(e,t)=>e[1].zIndex>t[1].zIndex?1:e[1].zIndexe.utils.createView({name:"image-preview-markup",tag:"svg",ignoreRect:!0,mixins:{apis:["width","height","crop","markup","resize","dirty"]},write:({root:t,props:i})=>{if(!i.dirty)return;let{crop:a,resize:n,markup:l}=i,o=i.width,r=i.height,s=a.width,p=a.height;if(n){let{size:u}=n,g=u&&u.width,f=u&&u.height,h=n.mode,I=n.upscale;g&&!f&&(f=g),f&&!g&&(g=f);let b=s{let[g,f]=u,h=Ym(g,f);qm(h,g,f,c,d),t.element.appendChild(h)})}}),Yt=(e,t)=>({x:e,y:t}),Jm=(e,t)=>e.x*t.x+e.y*t.y,ao=(e,t)=>Yt(e.x-t.x,e.y-t.y),eu=(e,t)=>Jm(ao(e,t),ao(e,t)),no=(e,t)=>Math.sqrt(eu(e,t)),lo=(e,t)=>{let i=e,a=1.5707963267948966,n=t,l=1.5707963267948966-t,o=Math.sin(a),r=Math.sin(n),s=Math.sin(l),p=Math.cos(l),c=i/o,d=c*r,m=c*s;return Yt(p*d,p*m)},tu=(e,t)=>{let i=e.width,a=e.height,n=lo(i,t),l=lo(a,t),o=Yt(e.x+Math.abs(n.x),e.y-Math.abs(n.y)),r=Yt(e.x+e.width+Math.abs(l.y),e.y+Math.abs(l.x)),s=Yt(e.x-Math.abs(l.y),e.y+e.height-Math.abs(l.x));return{width:no(o,r),height:no(o,s)}},iu=(e,t,i=1)=>{let a=e.height/e.width,n=1,l=t,o=1,r=a;r>l&&(r=l,o=r/a);let s=Math.max(n/o,l/r),p=e.width/(i*s*o),c=p*t;return{width:p,height:c}},ro=(e,t,i,a)=>{let n=a.x>.5?1-a.x:a.x,l=a.y>.5?1-a.y:a.y,o=n*2*e.width,r=l*2*e.height,s=tu(t,i);return Math.max(s.width/o,s.height/r)},so=(e,t)=>{let i=e.width,a=i*t;a>e.height&&(a=e.height,i=a/t);let n=(e.width-i)*.5,l=(e.height-a)*.5;return{x:n,y:l,width:i,height:a}},au=(e,t={})=>{let{zoom:i,rotation:a,center:n,aspectRatio:l}=t;l||(l=e.height/e.width);let o=iu(e,l,i),r={x:o.width*.5,y:o.height*.5},s={x:0,y:0,width:o.width,height:o.height,center:r},p=typeof t.scaleToFit>"u"||t.scaleToFit,c=ro(e,so(s,l),a,p?n:{x:.5,y:.5}),d=i*c;return{widthFloat:o.width/d,heightFloat:o.height/d,width:Math.round(o.width/d),height:Math.round(o.height/d)}},Ce={type:"spring",stiffness:.5,damping:.45,mass:10},nu=e=>e.utils.createView({name:"image-bitmap",ignoreRect:!0,mixins:{styles:["scaleX","scaleY"]},create:({root:t,props:i})=>{t.appendChild(i.image)}}),lu=e=>e.utils.createView({name:"image-canvas-wrapper",tag:"div",ignoreRect:!0,mixins:{apis:["crop","width","height"],styles:["originX","originY","translateX","translateY","scaleX","scaleY","rotateZ"],animations:{originX:Ce,originY:Ce,scaleX:Ce,scaleY:Ce,translateX:Ce,translateY:Ce,rotateZ:Ce}},create:({root:t,props:i})=>{i.width=i.image.width,i.height=i.image.height,t.ref.bitmap=t.appendChildView(t.createChildView(nu(e),{image:i.image}))},write:({root:t,props:i})=>{let{flip:a}=i.crop,{bitmap:n}=t.ref;n.scaleX=a.horizontal?-1:1,n.scaleY=a.vertical?-1:1}}),ou=e=>e.utils.createView({name:"image-clip",tag:"div",ignoreRect:!0,mixins:{apis:["crop","markup","resize","width","height","dirty","background"],styles:["width","height","opacity"],animations:{opacity:{type:"tween",duration:250}}},didWriteView:function({root:t,props:i}){i.background&&(t.element.style.backgroundColor=i.background)},create:({root:t,props:i})=>{t.ref.image=t.appendChildView(t.createChildView(lu(e),Object.assign({},i))),t.ref.createMarkup=()=>{t.ref.markup||(t.ref.markup=t.appendChildView(t.createChildView(Qm(e),Object.assign({},i))))},t.ref.destroyMarkup=()=>{t.ref.markup&&(t.removeChildView(t.ref.markup),t.ref.markup=null)};let a=t.query("GET_IMAGE_PREVIEW_TRANSPARENCY_INDICATOR");a!==null&&(a==="grid"?t.element.dataset.transparencyIndicator=a:t.element.dataset.transparencyIndicator="color")},write:({root:t,props:i,shouldOptimize:a})=>{let{crop:n,markup:l,resize:o,dirty:r,width:s,height:p}=i;t.ref.image.crop=n;let c={x:0,y:0,width:s,height:p,center:{x:s*.5,y:p*.5}},d={width:t.ref.image.width,height:t.ref.image.height},m={x:n.center.x*d.width,y:n.center.y*d.height},u={x:c.center.x-d.width*n.center.x,y:c.center.y-d.height*n.center.y},g=Math.PI*2+n.rotation%(Math.PI*2),f=n.aspectRatio||d.height/d.width,h=typeof n.scaleToFit>"u"||n.scaleToFit,I=ro(d,so(c,f),g,h?n.center:{x:.5,y:.5}),b=n.zoom*I;l&&l.length?(t.ref.createMarkup(),t.ref.markup.width=s,t.ref.markup.height=p,t.ref.markup.resize=o,t.ref.markup.dirty=r,t.ref.markup.markup=l,t.ref.markup.crop=au(d,n)):t.ref.markup&&t.ref.destroyMarkup();let E=t.ref.image;if(a){E.originX=null,E.originY=null,E.translateX=null,E.translateY=null,E.rotateZ=null,E.scaleX=null,E.scaleY=null;return}E.originX=m.x,E.originY=m.y,E.translateX=u.x,E.translateY=u.y,E.rotateZ=g,E.scaleX=b,E.scaleY=b}}),ru=e=>e.utils.createView({name:"image-preview",tag:"div",ignoreRect:!0,mixins:{apis:["image","crop","markup","resize","dirty","background"],styles:["translateY","scaleX","scaleY","opacity"],animations:{scaleX:Ce,scaleY:Ce,translateY:Ce,opacity:{type:"tween",duration:400}}},create:({root:t,props:i})=>{t.ref.clip=t.appendChildView(t.createChildView(ou(e),{id:i.id,image:i.image,crop:i.crop,markup:i.markup,resize:i.resize,dirty:i.dirty,background:i.background}))},write:({root:t,props:i,shouldOptimize:a})=>{let{clip:n}=t.ref,{image:l,crop:o,markup:r,resize:s,dirty:p}=i;if(n.crop=o,n.markup=r,n.resize=s,n.dirty=p,n.opacity=a?0:1,a||t.rect.element.hidden)return;let c=l.height/l.width,d=o.aspectRatio||c,m=t.rect.inner.width,u=t.rect.inner.height,g=t.query("GET_IMAGE_PREVIEW_HEIGHT"),f=t.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),h=t.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),I=t.query("GET_PANEL_ASPECT_RATIO"),b=t.query("GET_ALLOW_MULTIPLE");I&&!b&&(g=m*I,d=I);let E=g!==null?g:Math.max(f,Math.min(m*d,h)),v=E/d;v>m&&(v=m,E=v*d),E>u&&(E=u,v=u/d),n.width=v,n.height=E}}),su=` @@ -18,31 +18,31 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho -`,ll=0,Gm=e=>e.utils.createView({name:"image-preview-overlay",tag:"div",ignoreRect:!0,create:({root:t,props:i})=>{let a=Vm;if(document.querySelector("base")){let n=new URL(window.location.href.replace(window.location.hash,"")).href;a=a.replace(/url\(\#/g,"url("+n+"#")}ll++,t.element.classList.add(`filepond--image-preview-overlay-${i.status}`),t.element.innerHTML=a.replace(/__UID__/g,ll)},mixins:{styles:["opacity"],animations:{opacity:{type:"spring",mass:25}}}}),Um=function(){self.onmessage=e=>{createImageBitmap(e.data.message.file).then(t=>{self.postMessage({id:e.data.id,message:t},[t])})}},Wm=function(){self.onmessage=e=>{let t=e.data.message.imageData,i=e.data.message.colorMatrix,a=t.data,n=a.length,o=i[0],l=i[1],r=i[2],s=i[3],p=i[4],c=i[5],d=i[6],m=i[7],u=i[8],f=i[9],h=i[10],g=i[11],v=i[12],E=i[13],T=i[14],I=i[15],y=i[16],b=i[17],w=i[18],x=i[19],_=0,P=0,O=0,M=0,C=0;for(;_{let i=new Image;i.onload=()=>{let a=i.naturalWidth,n=i.naturalHeight;i=null,t(a,n)},i.src=e},jm={1:()=>[1,0,0,1,0,0],2:e=>[-1,0,0,1,e,0],3:(e,t)=>[-1,0,0,-1,e,t],4:(e,t)=>[1,0,0,-1,0,t],5:()=>[0,1,1,0,0,0],6:(e,t)=>[0,1,-1,0,t,0],7:(e,t)=>[0,-1,-1,0,t,e],8:e=>[0,-1,1,0,0,e]},Ym=(e,t,i,a)=>{a!==-1&&e.transform.apply(e,jm[a](t,i))},qm=(e,t,i,a)=>{t=Math.round(t),i=Math.round(i);let n=document.createElement("canvas");n.width=t,n.height=i;let o=n.getContext("2d");return a>=5&&a<=8&&([t,i]=[i,t]),Ym(o,t,i,a),o.drawImage(e,0,0,t,i),n},cl=e=>/^image/.test(e.type)&&!/svg/.test(e.type),$m=10,Xm=10,Qm=e=>{let t=Math.min($m/e.width,Xm/e.height),i=document.createElement("canvas"),a=i.getContext("2d"),n=i.width=Math.ceil(e.width*t),o=i.height=Math.ceil(e.height*t);a.drawImage(e,0,0,n,o);let l=null;try{l=a.getImageData(0,0,n,o).data}catch{return null}let r=l.length,s=0,p=0,c=0,d=0;for(;dMath.floor(Math.sqrt(e/(t/4))),Zm=(e,t)=>(t=t||document.createElement("canvas"),t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t),Km=e=>{let t;try{t=new ImageData(e.width,e.height)}catch{t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(new Uint8ClampedArray(e.data)),t},Jm=e=>new Promise((t,i)=>{let a=new Image;a.crossOrigin="Anonymous",a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),eu=e=>{let t=Gm(e),i=km(e),{createWorker:a}=e.utils,n=(E,T,I)=>new Promise(y=>{E.ref.imageData||(E.ref.imageData=I.getContext("2d").getImageData(0,0,I.width,I.height));let b=Km(E.ref.imageData);if(!T||T.length!==20)return I.getContext("2d").putImageData(b,0,0),y();let w=a(Wm);w.post({imageData:b,colorMatrix:T},x=>{I.getContext("2d").putImageData(x,0,0),w.terminate(),y()},[b.data.buffer])}),o=(E,T)=>{E.removeChildView(T),T.image.width=1,T.image.height=1,T._destroy()},l=({root:E})=>{let T=E.ref.images.shift();return T.opacity=0,T.translateY=-15,E.ref.imageViewBin.push(T),T},r=({root:E,props:T,image:I})=>{let y=T.id,b=E.query("GET_ITEM",{id:y});if(!b)return;let w=b.getMetadata("crop")||{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},x=E.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),_,P,O=!1;E.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(_=b.getMetadata("markup")||[],P=b.getMetadata("resize"),O=!0);let M=E.appendChildView(E.createChildView(i,{id:y,image:I,crop:w,resize:P,markup:_,dirty:O,background:x,opacity:0,scaleX:1.15,scaleY:1.15,translateY:15}),E.childViews.length);E.ref.images.push(M),M.opacity=1,M.scaleX=1,M.scaleY=1,M.translateY=0,setTimeout(()=>{E.dispatch("DID_IMAGE_PREVIEW_SHOW",{id:y})},250)},s=({root:E,props:T})=>{let I=E.query("GET_ITEM",{id:T.id});if(!I)return;let y=E.ref.images[E.ref.images.length-1];y.crop=I.getMetadata("crop"),y.background=E.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),E.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(y.dirty=!0,y.resize=I.getMetadata("resize"),y.markup=I.getMetadata("markup"))},p=({root:E,props:T,action:I})=>{if(!/crop|filter|markup|resize/.test(I.change.key)||!E.ref.images.length)return;let y=E.query("GET_ITEM",{id:T.id});if(y){if(/filter/.test(I.change.key)){let b=E.ref.images[E.ref.images.length-1];n(E,I.change.value,b.image);return}if(/crop|markup|resize/.test(I.change.key)){let b=y.getMetadata("crop"),w=E.ref.images[E.ref.images.length-1];if(b&&b.aspectRatio&&w.crop&&w.crop.aspectRatio&&Math.abs(b.aspectRatio-w.crop.aspectRatio)>1e-5){let x=l({root:E});r({root:E,props:T,image:Zm(x.image)})}else s({root:E,props:T})}}},c=E=>{let I=window.navigator.userAgent.match(/Firefox\/([0-9]+)\./),y=I?parseInt(I[1]):null;return y!==null&&y<=58?!1:"createImageBitmap"in window&&cl(E)},d=({root:E,props:T})=>{let{id:I}=T,y=E.query("GET_ITEM",I);if(!y)return;let b=URL.createObjectURL(y.file);Hm(b,(w,x)=>{E.dispatch("DID_IMAGE_PREVIEW_CALCULATE_SIZE",{id:I,width:w,height:x})})},m=({root:E,props:T})=>{let{id:I}=T,y=E.query("GET_ITEM",I);if(!y)return;let b=URL.createObjectURL(y.file),w=()=>{Jm(b).then(x)},x=_=>{URL.revokeObjectURL(b);let O=(y.getMetadata("exif")||{}).orientation||-1,{width:M,height:C}=_;if(!M||!C)return;O>=5&&O<=8&&([M,C]=[C,M]);let S=Math.max(1,window.devicePixelRatio*.75),R=E.query("GET_IMAGE_PREVIEW_ZOOM_FACTOR")*S,L=C/M,z=E.rect.element.width,D=E.rect.element.height,k=z,B=k*L;L>1?(k=Math.min(M,z*R),B=k*L):(B=Math.min(C,D*R),k=B/L);let X=qm(_,k,B,O),q=()=>{let pe=E.query("GET_IMAGE_PREVIEW_CALCULATE_AVERAGE_IMAGE_COLOR")?Qm(data):null;y.setMetadata("color",pe,!0),"close"in _&&_.close(),E.ref.overlayShadow.opacity=1,r({root:E,props:T,image:X})},Q=y.getMetadata("filter");Q?n(E,Q,X).then(q):q()};if(c(y.file)){let _=a(Um);_.post({file:y.file},P=>{if(_.terminate(),!P){w();return}x(P)})}else w()},u=({root:E})=>{let T=E.ref.images[E.ref.images.length-1];T.translateY=0,T.scaleX=1,T.scaleY=1,T.opacity=1},f=({root:E})=>{E.ref.overlayShadow.opacity=1,E.ref.overlayError.opacity=0,E.ref.overlaySuccess.opacity=0},h=({root:E})=>{E.ref.overlayShadow.opacity=.25,E.ref.overlayError.opacity=1},g=({root:E})=>{E.ref.overlayShadow.opacity=.25,E.ref.overlaySuccess.opacity=1},v=({root:E})=>{E.ref.images=[],E.ref.imageData=null,E.ref.imageViewBin=[],E.ref.overlayShadow=E.appendChildView(E.createChildView(t,{opacity:0,status:"idle"})),E.ref.overlaySuccess=E.appendChildView(E.createChildView(t,{opacity:0,status:"success"})),E.ref.overlayError=E.appendChildView(E.createChildView(t,{opacity:0,status:"failure"}))};return e.utils.createView({name:"image-preview-wrapper",create:v,styles:["height"],apis:["height"],destroy:({root:E})=>{E.ref.images.forEach(T=>{T.image.width=1,T.image.height=1})},didWriteView:({root:E})=>{E.ref.images.forEach(T=>{T.dirty=!1})},write:e.utils.createRoute({DID_IMAGE_PREVIEW_DRAW:u,DID_IMAGE_PREVIEW_CONTAINER_CREATE:d,DID_FINISH_CALCULATE_PREVIEWSIZE:m,DID_UPDATE_ITEM_METADATA:p,DID_THROW_ITEM_LOAD_ERROR:h,DID_THROW_ITEM_PROCESSING_ERROR:h,DID_THROW_ITEM_INVALID:h,DID_COMPLETE_ITEM_PROCESSING:g,DID_START_ITEM_PROCESSING:f,DID_REVERT_ITEM_PROCESSING:f},({root:E})=>{let T=E.ref.imageViewBin.filter(I=>I.opacity===0);E.ref.imageViewBin=E.ref.imageViewBin.filter(I=>I.opacity>0),T.forEach(I=>o(E,I)),T.length=0})})},dl=e=>{let{addFilter:t,utils:i}=e,{Type:a,createRoute:n,isFile:o}=i,l=eu(e);return t("CREATE_VIEW",r=>{let{is:s,view:p,query:c}=r;if(!s("file")||!c("GET_ALLOW_IMAGE_PREVIEW"))return;let d=({root:g,props:v})=>{let{id:E}=v,T=c("GET_ITEM",E);if(!T||!o(T.file)||T.archived)return;let I=T.file;if(!lm(I)||!c("GET_IMAGE_PREVIEW_FILTER_ITEM")(T))return;let y="createImageBitmap"in(window||{}),b=c("GET_IMAGE_PREVIEW_MAX_FILE_SIZE");if(!y&&b&&I.size>b)return;g.ref.imagePreview=p.appendChildView(p.createChildView(l,{id:E}));let w=g.query("GET_IMAGE_PREVIEW_HEIGHT");w&&g.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:T.id,height:w});let x=!y&&I.size>c("GET_IMAGE_PREVIEW_MAX_INSTANT_PREVIEW_FILE_SIZE");g.dispatch("DID_IMAGE_PREVIEW_CONTAINER_CREATE",{id:E},x)},m=(g,v)=>{if(!g.ref.imagePreview)return;let{id:E}=v,T=g.query("GET_ITEM",{id:E});if(!T)return;let I=g.query("GET_PANEL_ASPECT_RATIO"),y=g.query("GET_ITEM_PANEL_ASPECT_RATIO"),b=g.query("GET_IMAGE_PREVIEW_HEIGHT");if(I||y||b)return;let{imageWidth:w,imageHeight:x}=g.ref;if(!w||!x)return;let _=g.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),P=g.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),M=(T.getMetadata("exif")||{}).orientation||-1;if(M>=5&&M<=8&&([w,x]=[x,w]),!cl(T.file)||g.query("GET_IMAGE_PREVIEW_UPSCALE")){let z=2048/w;w*=z,x*=z}let C=x/w,S=(T.getMetadata("crop")||{}).aspectRatio||C,F=Math.max(_,Math.min(x,P)),R=g.rect.element.width,L=Math.min(R*S,F);g.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:T.id,height:L})},u=({root:g})=>{g.ref.shouldRescale=!0},f=({root:g,action:v})=>{v.change.key==="crop"&&(g.ref.shouldRescale=!0)},h=({root:g,action:v})=>{g.ref.imageWidth=v.width,g.ref.imageHeight=v.height,g.ref.shouldRescale=!0,g.ref.shouldDrawPreview=!0,g.dispatch("KICK")};p.registerWriter(n({DID_RESIZE_ROOT:u,DID_STOP_RESIZE:u,DID_LOAD_ITEM:d,DID_IMAGE_PREVIEW_CALCULATE_SIZE:h,DID_UPDATE_ITEM_METADATA:f},({root:g,props:v})=>{g.ref.imagePreview&&(g.rect.element.hidden||(g.ref.shouldRescale&&(m(g,v),g.ref.shouldRescale=!1),g.ref.shouldDrawPreview&&(requestAnimationFrame(()=>{requestAnimationFrame(()=>{g.dispatch("DID_FINISH_CALCULATE_PREVIEWSIZE",{id:v.id})})}),g.ref.shouldDrawPreview=!1)))}))}),{options:{allowImagePreview:[!0,a.BOOLEAN],imagePreviewFilterItem:[()=>!0,a.FUNCTION],imagePreviewHeight:[null,a.INT],imagePreviewMinHeight:[44,a.INT],imagePreviewMaxHeight:[256,a.INT],imagePreviewMaxFileSize:[null,a.INT],imagePreviewZoomFactor:[2,a.INT],imagePreviewUpscale:[!1,a.BOOLEAN],imagePreviewMaxInstantPreviewFileSize:[1e6,a.INT],imagePreviewTransparencyIndicator:[null,a.STRING],imagePreviewCalculateAverageImageColor:[!1,a.BOOLEAN],imagePreviewMarkupShow:[!0,a.BOOLEAN],imagePreviewMarkupFilter:[()=>!0,a.FUNCTION]}}},tu=typeof window<"u"&&typeof window.document<"u";tu&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:dl}));var pl=dl;var iu=e=>/^image/.test(e.type),au=(e,t)=>{let i=new Image;i.onload=()=>{let a=i.naturalWidth,n=i.naturalHeight;i=null,t({width:a,height:n})},i.onerror=()=>t(null),i.src=e},ml=({addFilter:e,utils:t})=>{let{Type:i}=t;return e("DID_LOAD_ITEM",(a,{query:n})=>new Promise((o,l)=>{let r=a.file;if(!iu(r)||!n("GET_ALLOW_IMAGE_RESIZE"))return o(a);let s=n("GET_IMAGE_RESIZE_MODE"),p=n("GET_IMAGE_RESIZE_TARGET_WIDTH"),c=n("GET_IMAGE_RESIZE_TARGET_HEIGHT"),d=n("GET_IMAGE_RESIZE_UPSCALE");if(p===null&&c===null)return o(a);let m=p===null?c:p,u=c===null?m:c,f=URL.createObjectURL(r);au(f,h=>{if(URL.revokeObjectURL(f),!h)return o(a);let{width:g,height:v}=h,E=(a.getMetadata("exif")||{}).orientation||-1;if(E>=5&&E<=8&&([g,v]=[v,g]),g===m&&v===u)return o(a);if(!d){if(s==="cover"){if(g<=m||v<=u)return o(a)}else if(g<=m&&v<=m)return o(a)}a.setMetadata("resize",{mode:s,upscale:d,size:{width:m,height:u}}),o(a)})})),{options:{allowImageResize:[!0,i.BOOLEAN],imageResizeMode:["cover",i.STRING],imageResizeUpscale:[!0,i.BOOLEAN],imageResizeTargetWidth:[null,i.INT],imageResizeTargetHeight:[null,i.INT]}}},nu=typeof window<"u"&&typeof window.document<"u";nu&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:ml}));var ul=ml;var ou=e=>/^image/.test(e.type),lu=e=>e.substr(0,e.lastIndexOf("."))||e,ru={jpeg:"jpg","svg+xml":"svg"},su=(e,t)=>{let i=lu(e),a=t.split("/")[1],n=ru[a]||a;return`${i}.${n}`},cu=e=>/jpeg|png|svg\+xml/.test(e)?e:"image/jpeg",du=e=>/^image/.test(e.type),pu={1:()=>[1,0,0,1,0,0],2:e=>[-1,0,0,1,e,0],3:(e,t)=>[-1,0,0,-1,e,t],4:(e,t)=>[1,0,0,-1,0,t],5:()=>[0,1,1,0,0,0],6:(e,t)=>[0,1,-1,0,t,0],7:(e,t)=>[0,-1,-1,0,t,e],8:e=>[0,-1,1,0,0,e]},mu=(e,t,i)=>(i===-1&&(i=1),pu[i](e,t)),Yt=(e,t)=>({x:e,y:t}),uu=(e,t)=>e.x*t.x+e.y*t.y,fl=(e,t)=>Yt(e.x-t.x,e.y-t.y),fu=(e,t)=>uu(fl(e,t),fl(e,t)),hl=(e,t)=>Math.sqrt(fu(e,t)),gl=(e,t)=>{let i=e,a=1.5707963267948966,n=t,o=1.5707963267948966-t,l=Math.sin(a),r=Math.sin(n),s=Math.sin(o),p=Math.cos(o),c=i/l,d=c*r,m=c*s;return Yt(p*d,p*m)},hu=(e,t)=>{let i=e.width,a=e.height,n=gl(i,t),o=gl(a,t),l=Yt(e.x+Math.abs(n.x),e.y-Math.abs(n.y)),r=Yt(e.x+e.width+Math.abs(o.y),e.y+Math.abs(o.x)),s=Yt(e.x-Math.abs(o.y),e.y+e.height-Math.abs(o.x));return{width:hl(l,r),height:hl(l,s)}},Tl=(e,t,i=0,a={x:.5,y:.5})=>{let n=a.x>.5?1-a.x:a.x,o=a.y>.5?1-a.y:a.y,l=n*2*e.width,r=o*2*e.height,s=hu(t,i);return Math.max(s.width/l,s.height/r)},vl=(e,t)=>{let i=e.width,a=i*t;a>e.height&&(a=e.height,i=a/t);let n=(e.width-i)*.5,o=(e.height-a)*.5;return{x:n,y:o,width:i,height:a}},El=(e,t,i=1)=>{let a=e.height/e.width,n=1,o=t,l=1,r=a;r>o&&(r=o,l=r/a);let s=Math.max(n/l,o/r),p=e.width/(i*s*l),c=p*t;return{width:p,height:c}},Il=e=>{e.width=1,e.height=1,e.getContext("2d").clearRect(0,0,1,1)},bl=e=>e&&(e.horizontal||e.vertical),gu=(e,t,i)=>{if(t<=1&&!bl(i))return e.width=e.naturalWidth,e.height=e.naturalHeight,e;let a=document.createElement("canvas"),n=e.naturalWidth,o=e.naturalHeight,l=t>=5&&t<=8;l?(a.width=o,a.height=n):(a.width=n,a.height=o);let r=a.getContext("2d");if(t&&r.transform.apply(r,mu(n,o,t)),bl(i)){let s=[1,0,0,1,0,0];(!l&&i.horizontal||l&i.vertical)&&(s[0]=-1,s[4]=n),(!l&&i.vertical||l&&i.horizontal)&&(s[3]=-1,s[5]=o),r.transform(...s)}return r.drawImage(e,0,0,n,o),a},Eu=(e,t,i={},a={})=>{let{canvasMemoryLimit:n,background:o=null}=a,l=i.zoom||1,r=gu(e,t,i.flip),s={width:r.width,height:r.height},p=i.aspectRatio||s.height/s.width,c=El(s,p,l);if(n){let T=c.width*c.height;if(T>n){let I=Math.sqrt(n)/Math.sqrt(T);s.width=Math.floor(s.width*I),s.height=Math.floor(s.height*I),c=El(s,p,l)}}let d=document.createElement("canvas"),m={x:c.width*.5,y:c.height*.5},u={x:0,y:0,width:c.width,height:c.height,center:m},f=typeof i.scaleToFit>"u"||i.scaleToFit,h=l*Tl(s,vl(u,p),i.rotation,f?i.center:{x:.5,y:.5});d.width=Math.round(c.width/h),d.height=Math.round(c.height/h),m.x/=h,m.y/=h;let g={x:m.x-s.width*(i.center?i.center.x:.5),y:m.y-s.height*(i.center?i.center.y:.5)},v=d.getContext("2d");o&&(v.fillStyle=o,v.fillRect(0,0,d.width,d.height)),v.translate(m.x,m.y),v.rotate(i.rotation||0),v.drawImage(r,g.x-m.x,g.y-m.y,s.width,s.height);let E=v.getImageData(0,0,d.width,d.height);return Il(d),E},bu=(()=>typeof window<"u"&&typeof window.document<"u")();bu&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,i){var a=this.toDataURL(t,i).split(",")[1];setTimeout(function(){for(var n=atob(a),o=n.length,l=new Uint8Array(o),r=0;rnew Promise(a=>{let n=i?i(e):e;Promise.resolve(n).then(o=>{o.toBlob(a,t.type,t.quality)})}),yi=(e,t)=>qt(e.x*t,e.y*t),_i=(e,t)=>qt(e.x+t.x,e.y+t.y),xl=e=>{let t=Math.sqrt(e.x*e.x+e.y*e.y);return t===0?{x:0,y:0}:qt(e.x/t,e.y/t)},qe=(e,t,i)=>{let a=Math.cos(t),n=Math.sin(t),o=qt(e.x-i.x,e.y-i.y);return qt(i.x+a*o.x-n*o.y,i.y+n*o.x+a*o.y)},qt=(e=0,t=0)=>({x:e,y:t}),me=(e,t,i=1,a)=>{if(typeof e=="string")return parseFloat(e)*i;if(typeof e=="number")return e*(a?t[a]:Math.min(t.width,t.height))},ct=(e,t,i)=>{let a=e.borderStyle||e.lineStyle||"solid",n=e.backgroundColor||e.fontColor||"transparent",o=e.borderColor||e.lineColor||"transparent",l=me(e.borderWidth||e.lineWidth,t,i),r=e.lineCap||"round",s=e.lineJoin||"round",p=typeof a=="string"?"":a.map(d=>me(d,t,i)).join(","),c=e.opacity||1;return{"stroke-linecap":r,"stroke-linejoin":s,"stroke-width":l||0,"stroke-dasharray":p,stroke:o,fill:n,opacity:c}},Le=e=>e!=null,wt=(e,t,i=1)=>{let a=me(e.x,t,i,"width")||me(e.left,t,i,"width"),n=me(e.y,t,i,"height")||me(e.top,t,i,"height"),o=me(e.width,t,i,"width"),l=me(e.height,t,i,"height"),r=me(e.right,t,i,"width"),s=me(e.bottom,t,i,"height");return Le(n)||(Le(l)&&Le(s)?n=t.height-l-s:n=s),Le(a)||(Le(o)&&Le(r)?a=t.width-o-r:a=r),Le(o)||(Le(a)&&Le(r)?o=t.width-a-r:o=0),Le(l)||(Le(n)&&Le(s)?l=t.height-n-s:l=0),{x:a||0,y:n||0,width:o||0,height:l||0}},vu=e=>e.map((t,i)=>`${i===0?"M":"L"} ${t.x} ${t.y}`).join(" "),Ne=(e,t)=>Object.keys(t).forEach(i=>e.setAttribute(i,t[i])),Iu="http://www.w3.org/2000/svg",Rt=(e,t)=>{let i=document.createElementNS(Iu,e);return t&&Ne(i,t),i},xu=e=>Ne(e,{...e.rect,...e.styles}),yu=e=>{let t=e.rect.x+e.rect.width*.5,i=e.rect.y+e.rect.height*.5,a=e.rect.width*.5,n=e.rect.height*.5;return Ne(e,{cx:t,cy:i,rx:a,ry:n,...e.styles})},_u={contain:"xMidYMid meet",cover:"xMidYMid slice"},Ru=(e,t)=>{Ne(e,{...e.rect,...e.styles,preserveAspectRatio:_u[t.fit]||"none"})},wu={left:"start",center:"middle",right:"end"},Su=(e,t,i,a)=>{let n=me(t.fontSize,i,a),o=t.fontFamily||"sans-serif",l=t.fontWeight||"normal",r=wu[t.textAlign]||"start";Ne(e,{...e.rect,...e.styles,"stroke-width":0,"font-weight":l,"font-size":n,"font-family":o,"text-anchor":r}),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},Lu=(e,t,i,a)=>{Ne(e,{...e.rect,...e.styles,fill:"none"});let n=e.childNodes[0],o=e.childNodes[1],l=e.childNodes[2],r=e.rect,s={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(Ne(n,{x1:r.x,y1:r.y,x2:s.x,y2:s.y}),!t.lineDecoration)return;o.style.display="none",l.style.display="none";let p=xl({x:s.x-r.x,y:s.y-r.y}),c=me(.05,i,a);if(t.lineDecoration.indexOf("arrow-begin")!==-1){let d=yi(p,c),m=_i(r,d),u=qe(r,2,m),f=qe(r,-2,m);Ne(o,{style:"display:block;",d:`M${u.x},${u.y} L${r.x},${r.y} L${f.x},${f.y}`})}if(t.lineDecoration.indexOf("arrow-end")!==-1){let d=yi(p,-c),m=_i(s,d),u=qe(s,2,m),f=qe(s,-2,m);Ne(l,{style:"display:block;",d:`M${u.x},${u.y} L${s.x},${s.y} L${f.x},${f.y}`})}},Au=(e,t,i,a)=>{Ne(e,{...e.styles,fill:"none",d:vu(t.points.map(n=>({x:me(n.x,i,a,"width"),y:me(n.y,i,a,"height")})))})},xi=e=>t=>Rt(e,{id:t.id}),Mu=e=>{let t=Rt("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=()=>{t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},Ou=e=>{let t=Rt("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=Rt("line");t.appendChild(i);let a=Rt("path");t.appendChild(a);let n=Rt("path");return t.appendChild(n),t},Pu={image:Mu,rect:xi("rect"),ellipse:xi("ellipse"),text:xi("text"),path:xi("path"),line:Ou},Du={rect:xu,ellipse:yu,image:Ru,text:Su,path:Au,line:Lu},Fu=(e,t)=>Pu[e](t),zu=(e,t,i,a,n)=>{t!=="path"&&(e.rect=wt(i,a,n)),e.styles=ct(i,a,n),Du[t](e,i,a,n)},yl=(e,t)=>e[1].zIndex>t[1].zIndex?1:e[1].zIndexnew Promise(n=>{let{background:o=null}=a,l=new FileReader;l.onloadend=()=>{let r=l.result,s=document.createElement("div");s.style.cssText="position:absolute;pointer-events:none;width:0;height:0;visibility:hidden;",s.innerHTML=r;let p=s.querySelector("svg");document.body.appendChild(s);let c=p.getBBox();s.parentNode.removeChild(s);let d=s.querySelector("title"),m=p.getAttribute("viewBox")||"",u=p.getAttribute("width")||"",f=p.getAttribute("height")||"",h=parseFloat(u)||null,g=parseFloat(f)||null,v=(u.match(/[a-z]+/)||[])[0]||"",E=(f.match(/[a-z]+/)||[])[0]||"",T=m.split(" ").map(parseFloat),I=T.length?{x:T[0],y:T[1],width:T[2],height:T[3]}:c,y=h??I.width,b=g??I.height;p.style.overflow="visible",p.setAttribute("width",y),p.setAttribute("height",b);let w="";if(i&&i.length){let Q={width:y,height:b};w=i.sort(yl).reduce((pe,G)=>{let H=Fu(G[0],G[1]);return zu(H,G[0],G[1],Q),H.removeAttribute("id"),H.getAttribute("opacity")===1&&H.removeAttribute("opacity"),pe+` -`+H.outerHTML+` -`},""),w=` +`,oo=0,cu=e=>e.utils.createView({name:"image-preview-overlay",tag:"div",ignoreRect:!0,create:({root:t,props:i})=>{let a=su;if(document.querySelector("base")){let n=new URL(window.location.href.replace(window.location.hash,"")).href;a=a.replace(/url\(\#/g,"url("+n+"#")}oo++,t.element.classList.add(`filepond--image-preview-overlay-${i.status}`),t.element.innerHTML=a.replace(/__UID__/g,oo)},mixins:{styles:["opacity"],animations:{opacity:{type:"spring",mass:25}}}}),du=function(){self.onmessage=e=>{createImageBitmap(e.data.message.file).then(t=>{self.postMessage({id:e.data.id,message:t},[t])})}},pu=function(){self.onmessage=e=>{let t=e.data.message.imageData,i=e.data.message.colorMatrix,a=t.data,n=a.length,l=i[0],o=i[1],r=i[2],s=i[3],p=i[4],c=i[5],d=i[6],m=i[7],u=i[8],g=i[9],f=i[10],h=i[11],I=i[12],b=i[13],E=i[14],v=i[15],y=i[16],T=i[17],_=i[18],x=i[19],R=0,P=0,z=0,A=0,B=0;for(;R{let i=new Image;i.onload=()=>{let a=i.naturalWidth,n=i.naturalHeight;i=null,t(a,n)},i.src=e},uu={1:()=>[1,0,0,1,0,0],2:e=>[-1,0,0,1,e,0],3:(e,t)=>[-1,0,0,-1,e,t],4:(e,t)=>[1,0,0,-1,0,t],5:()=>[0,1,1,0,0,0],6:(e,t)=>[0,1,-1,0,t,0],7:(e,t)=>[0,-1,-1,0,t,e],8:e=>[0,-1,1,0,0,e]},gu=(e,t,i,a)=>{a!==-1&&e.transform.apply(e,uu[a](t,i))},fu=(e,t,i,a)=>{t=Math.round(t),i=Math.round(i);let n=document.createElement("canvas");n.width=t,n.height=i;let l=n.getContext("2d");return a>=5&&a<=8&&([t,i]=[i,t]),gu(l,t,i,a),l.drawImage(e,0,0,t,i),n},co=e=>/^image/.test(e.type)&&!/svg/.test(e.type),hu=10,bu=10,Eu=e=>{let t=Math.min(hu/e.width,bu/e.height),i=document.createElement("canvas"),a=i.getContext("2d"),n=i.width=Math.ceil(e.width*t),l=i.height=Math.ceil(e.height*t);a.drawImage(e,0,0,n,l);let o=null;try{o=a.getImageData(0,0,n,l).data}catch{return null}let r=o.length,s=0,p=0,c=0,d=0;for(;dMath.floor(Math.sqrt(e/(t/4))),Tu=(e,t)=>(t=t||document.createElement("canvas"),t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t),Iu=e=>{let t;try{t=new ImageData(e.width,e.height)}catch{t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(new Uint8ClampedArray(e.data)),t},vu=e=>new Promise((t,i)=>{let a=new Image;a.crossOrigin="Anonymous",a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),xu=e=>{let t=cu(e),i=ru(e),{createWorker:a}=e.utils,n=(b,E,v)=>new Promise(y=>{b.ref.imageData||(b.ref.imageData=v.getContext("2d").getImageData(0,0,v.width,v.height));let T=Iu(b.ref.imageData);if(!E||E.length!==20)return v.getContext("2d").putImageData(T,0,0),y();let _=a(pu);_.post({imageData:T,colorMatrix:E},x=>{v.getContext("2d").putImageData(x,0,0),_.terminate(),y()},[T.data.buffer])}),l=(b,E)=>{b.removeChildView(E),E.image.width=1,E.image.height=1,E._destroy()},o=({root:b})=>{let E=b.ref.images.shift();return E.opacity=0,E.translateY=-15,b.ref.imageViewBin.push(E),E},r=({root:b,props:E,image:v})=>{let y=E.id,T=b.query("GET_ITEM",{id:y});if(!T)return;let _=T.getMetadata("crop")||{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},x=b.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),R,P,z=!1;b.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(R=T.getMetadata("markup")||[],P=T.getMetadata("resize"),z=!0);let A=b.appendChildView(b.createChildView(i,{id:y,image:v,crop:_,resize:P,markup:R,dirty:z,background:x,opacity:0,scaleX:1.15,scaleY:1.15,translateY:15}),b.childViews.length);b.ref.images.push(A),A.opacity=1,A.scaleX=1,A.scaleY=1,A.translateY=0,setTimeout(()=>{b.dispatch("DID_IMAGE_PREVIEW_SHOW",{id:y})},250)},s=({root:b,props:E})=>{let v=b.query("GET_ITEM",{id:E.id});if(!v)return;let y=b.ref.images[b.ref.images.length-1];y.crop=v.getMetadata("crop"),y.background=b.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),b.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(y.dirty=!0,y.resize=v.getMetadata("resize"),y.markup=v.getMetadata("markup"))},p=({root:b,props:E,action:v})=>{if(!/crop|filter|markup|resize/.test(v.change.key)||!b.ref.images.length)return;let y=b.query("GET_ITEM",{id:E.id});if(y){if(/filter/.test(v.change.key)){let T=b.ref.images[b.ref.images.length-1];n(b,v.change.value,T.image);return}if(/crop|markup|resize/.test(v.change.key)){let T=y.getMetadata("crop"),_=b.ref.images[b.ref.images.length-1];if(T&&T.aspectRatio&&_.crop&&_.crop.aspectRatio&&Math.abs(T.aspectRatio-_.crop.aspectRatio)>1e-5){let x=o({root:b});r({root:b,props:E,image:Tu(x.image)})}else s({root:b,props:E})}}},c=b=>{let v=window.navigator.userAgent.match(/Firefox\/([0-9]+)\./),y=v?parseInt(v[1]):null;return y!==null&&y<=58?!1:"createImageBitmap"in window&&co(b)},d=({root:b,props:E})=>{let{id:v}=E,y=b.query("GET_ITEM",v);if(!y)return;let T=URL.createObjectURL(y.file);mu(T,(_,x)=>{b.dispatch("DID_IMAGE_PREVIEW_CALCULATE_SIZE",{id:v,width:_,height:x})})},m=({root:b,props:E})=>{let{id:v}=E,y=b.query("GET_ITEM",v);if(!y)return;let T=URL.createObjectURL(y.file),_=()=>{vu(T).then(x)},x=R=>{URL.revokeObjectURL(T);let z=(y.getMetadata("exif")||{}).orientation||-1,{width:A,height:B}=R;if(!A||!B)return;z>=5&&z<=8&&([A,B]=[B,A]);let w=Math.max(1,window.devicePixelRatio*.75),S=b.query("GET_IMAGE_PREVIEW_ZOOM_FACTOR")*w,L=B/A,D=b.rect.element.width,O=b.rect.element.height,U=D,C=U*L;L>1?(U=Math.min(A,D*S),C=U*L):(C=Math.min(B,O*S),U=C/L);let X=fu(R,U,C,z),K=()=>{let ce=b.query("GET_IMAGE_PREVIEW_CALCULATE_AVERAGE_IMAGE_COLOR")?Eu(data):null;y.setMetadata("color",ce,!0),"close"in R&&R.close(),b.ref.overlayShadow.opacity=1,r({root:b,props:E,image:X})},Z=y.getMetadata("filter");Z?n(b,Z,X).then(K):K()};if(c(y.file)){let R=a(du);R.post({file:y.file},P=>{if(R.terminate(),!P){_();return}x(P)})}else _()},u=({root:b})=>{let E=b.ref.images[b.ref.images.length-1];E.translateY=0,E.scaleX=1,E.scaleY=1,E.opacity=1},g=({root:b})=>{b.ref.overlayShadow.opacity=1,b.ref.overlayError.opacity=0,b.ref.overlaySuccess.opacity=0},f=({root:b})=>{b.ref.overlayShadow.opacity=.25,b.ref.overlayError.opacity=1},h=({root:b})=>{b.ref.overlayShadow.opacity=.25,b.ref.overlaySuccess.opacity=1},I=({root:b})=>{b.ref.images=[],b.ref.imageData=null,b.ref.imageViewBin=[],b.ref.overlayShadow=b.appendChildView(b.createChildView(t,{opacity:0,status:"idle"})),b.ref.overlaySuccess=b.appendChildView(b.createChildView(t,{opacity:0,status:"success"})),b.ref.overlayError=b.appendChildView(b.createChildView(t,{opacity:0,status:"failure"}))};return e.utils.createView({name:"image-preview-wrapper",create:I,styles:["height"],apis:["height"],destroy:({root:b})=>{b.ref.images.forEach(E=>{E.image.width=1,E.image.height=1})},didWriteView:({root:b})=>{b.ref.images.forEach(E=>{E.dirty=!1})},write:e.utils.createRoute({DID_IMAGE_PREVIEW_DRAW:u,DID_IMAGE_PREVIEW_CONTAINER_CREATE:d,DID_FINISH_CALCULATE_PREVIEWSIZE:m,DID_UPDATE_ITEM_METADATA:p,DID_THROW_ITEM_LOAD_ERROR:f,DID_THROW_ITEM_PROCESSING_ERROR:f,DID_THROW_ITEM_INVALID:f,DID_COMPLETE_ITEM_PROCESSING:h,DID_START_ITEM_PROCESSING:g,DID_REVERT_ITEM_PROCESSING:g},({root:b})=>{let E=b.ref.imageViewBin.filter(v=>v.opacity===0);b.ref.imageViewBin=b.ref.imageViewBin.filter(v=>v.opacity>0),E.forEach(v=>l(b,v)),E.length=0})})},po=e=>{let{addFilter:t,utils:i}=e,{Type:a,createRoute:n,isFile:l}=i,o=xu(e);return t("CREATE_VIEW",r=>{let{is:s,view:p,query:c}=r;if(!s("file")||!c("GET_ALLOW_IMAGE_PREVIEW"))return;let d=({root:h,props:I})=>{let{id:b}=I,E=c("GET_ITEM",b);if(!E||!l(E.file)||E.archived)return;let v=E.file;if(!Lm(v)||!c("GET_IMAGE_PREVIEW_FILTER_ITEM")(E))return;let y="createImageBitmap"in(window||{}),T=c("GET_IMAGE_PREVIEW_MAX_FILE_SIZE");if(!y&&T&&v.size>T)return;h.ref.imagePreview=p.appendChildView(p.createChildView(o,{id:b}));let _=h.query("GET_IMAGE_PREVIEW_HEIGHT");_&&h.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:E.id,height:_});let x=!y&&v.size>c("GET_IMAGE_PREVIEW_MAX_INSTANT_PREVIEW_FILE_SIZE");h.dispatch("DID_IMAGE_PREVIEW_CONTAINER_CREATE",{id:b},x)},m=(h,I)=>{if(!h.ref.imagePreview)return;let{id:b}=I,E=h.query("GET_ITEM",{id:b});if(!E)return;let v=h.query("GET_PANEL_ASPECT_RATIO"),y=h.query("GET_ITEM_PANEL_ASPECT_RATIO"),T=h.query("GET_IMAGE_PREVIEW_HEIGHT");if(v||y||T)return;let{imageWidth:_,imageHeight:x}=h.ref;if(!_||!x)return;let R=h.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),P=h.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),A=(E.getMetadata("exif")||{}).orientation||-1;if(A>=5&&A<=8&&([_,x]=[x,_]),!co(E.file)||h.query("GET_IMAGE_PREVIEW_UPSCALE")){let D=2048/_;_*=D,x*=D}let B=x/_,w=(E.getMetadata("crop")||{}).aspectRatio||B,F=Math.max(R,Math.min(x,P)),S=h.rect.element.width,L=Math.min(S*w,F);h.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:E.id,height:L})},u=({root:h})=>{h.ref.shouldRescale=!0},g=({root:h,action:I})=>{I.change.key==="crop"&&(h.ref.shouldRescale=!0)},f=({root:h,action:I})=>{h.ref.imageWidth=I.width,h.ref.imageHeight=I.height,h.ref.shouldRescale=!0,h.ref.shouldDrawPreview=!0,h.dispatch("KICK")};p.registerWriter(n({DID_RESIZE_ROOT:u,DID_STOP_RESIZE:u,DID_LOAD_ITEM:d,DID_IMAGE_PREVIEW_CALCULATE_SIZE:f,DID_UPDATE_ITEM_METADATA:g},({root:h,props:I})=>{h.ref.imagePreview&&(h.rect.element.hidden||(h.ref.shouldRescale&&(m(h,I),h.ref.shouldRescale=!1),h.ref.shouldDrawPreview&&(requestAnimationFrame(()=>{requestAnimationFrame(()=>{h.dispatch("DID_FINISH_CALCULATE_PREVIEWSIZE",{id:I.id})})}),h.ref.shouldDrawPreview=!1)))}))}),{options:{allowImagePreview:[!0,a.BOOLEAN],imagePreviewFilterItem:[()=>!0,a.FUNCTION],imagePreviewHeight:[null,a.INT],imagePreviewMinHeight:[44,a.INT],imagePreviewMaxHeight:[256,a.INT],imagePreviewMaxFileSize:[null,a.INT],imagePreviewZoomFactor:[2,a.INT],imagePreviewUpscale:[!1,a.BOOLEAN],imagePreviewMaxInstantPreviewFileSize:[1e6,a.INT],imagePreviewTransparencyIndicator:[null,a.STRING],imagePreviewCalculateAverageImageColor:[!1,a.BOOLEAN],imagePreviewMarkupShow:[!0,a.BOOLEAN],imagePreviewMarkupFilter:[()=>!0,a.FUNCTION]}}},yu=typeof window<"u"&&typeof window.document<"u";yu&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:po}));var mo=po;var Ru=e=>/^image/.test(e.type),Su=(e,t)=>{let i=new Image;i.onload=()=>{let a=i.naturalWidth,n=i.naturalHeight;i=null,t({width:a,height:n})},i.onerror=()=>t(null),i.src=e},uo=({addFilter:e,utils:t})=>{let{Type:i}=t;return e("DID_LOAD_ITEM",(a,{query:n})=>new Promise((l,o)=>{let r=a.file;if(!Ru(r)||!n("GET_ALLOW_IMAGE_RESIZE"))return l(a);let s=n("GET_IMAGE_RESIZE_MODE"),p=n("GET_IMAGE_RESIZE_TARGET_WIDTH"),c=n("GET_IMAGE_RESIZE_TARGET_HEIGHT"),d=n("GET_IMAGE_RESIZE_UPSCALE");if(p===null&&c===null)return l(a);let m=p===null?c:p,u=c===null?m:c,g=URL.createObjectURL(r);Su(g,f=>{if(URL.revokeObjectURL(g),!f)return l(a);let{width:h,height:I}=f,b=(a.getMetadata("exif")||{}).orientation||-1;if(b>=5&&b<=8&&([h,I]=[I,h]),h===m&&I===u)return l(a);if(!d){if(s==="cover"){if(h<=m||I<=u)return l(a)}else if(h<=m&&I<=m)return l(a)}a.setMetadata("resize",{mode:s,upscale:d,size:{width:m,height:u}}),l(a)})})),{options:{allowImageResize:[!0,i.BOOLEAN],imageResizeMode:["cover",i.STRING],imageResizeUpscale:[!0,i.BOOLEAN],imageResizeTargetWidth:[null,i.INT],imageResizeTargetHeight:[null,i.INT]}}},_u=typeof window<"u"&&typeof window.document<"u";_u&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:uo}));var go=uo;var wu=e=>/^image/.test(e.type),Lu=e=>e.substr(0,e.lastIndexOf("."))||e,Mu={jpeg:"jpg","svg+xml":"svg"},Au=(e,t)=>{let i=Lu(e),a=t.split("/")[1],n=Mu[a]||a;return`${i}.${n}`},zu=e=>/jpeg|png|svg\+xml/.test(e)?e:"image/jpeg",Pu=e=>/^image/.test(e.type),Fu={1:()=>[1,0,0,1,0,0],2:e=>[-1,0,0,1,e,0],3:(e,t)=>[-1,0,0,-1,e,t],4:(e,t)=>[1,0,0,-1,0,t],5:()=>[0,1,1,0,0,0],6:(e,t)=>[0,1,-1,0,t,0],7:(e,t)=>[0,-1,-1,0,t,e],8:e=>[0,-1,1,0,0,e]},Ou=(e,t,i)=>(i===-1&&(i=1),Fu[i](e,t)),$t=(e,t)=>({x:e,y:t}),Du=(e,t)=>e.x*t.x+e.y*t.y,fo=(e,t)=>$t(e.x-t.x,e.y-t.y),Cu=(e,t)=>Du(fo(e,t),fo(e,t)),ho=(e,t)=>Math.sqrt(Cu(e,t)),bo=(e,t)=>{let i=e,a=1.5707963267948966,n=t,l=1.5707963267948966-t,o=Math.sin(a),r=Math.sin(n),s=Math.sin(l),p=Math.cos(l),c=i/o,d=c*r,m=c*s;return $t(p*d,p*m)},Bu=(e,t)=>{let i=e.width,a=e.height,n=bo(i,t),l=bo(a,t),o=$t(e.x+Math.abs(n.x),e.y-Math.abs(n.y)),r=$t(e.x+e.width+Math.abs(l.y),e.y+Math.abs(l.x)),s=$t(e.x-Math.abs(l.y),e.y+e.height-Math.abs(l.x));return{width:ho(o,r),height:ho(o,s)}},Io=(e,t,i=0,a={x:.5,y:.5})=>{let n=a.x>.5?1-a.x:a.x,l=a.y>.5?1-a.y:a.y,o=n*2*e.width,r=l*2*e.height,s=Bu(t,i);return Math.max(s.width/o,s.height/r)},vo=(e,t)=>{let i=e.width,a=i*t;a>e.height&&(a=e.height,i=a/t);let n=(e.width-i)*.5,l=(e.height-a)*.5;return{x:n,y:l,width:i,height:a}},Eo=(e,t,i=1)=>{let a=e.height/e.width,n=1,l=t,o=1,r=a;r>l&&(r=l,o=r/a);let s=Math.max(n/o,l/r),p=e.width/(i*s*o),c=p*t;return{width:p,height:c}},xo=e=>{e.width=1,e.height=1,e.getContext("2d").clearRect(0,0,1,1)},To=e=>e&&(e.horizontal||e.vertical),ku=(e,t,i)=>{if(t<=1&&!To(i))return e.width=e.naturalWidth,e.height=e.naturalHeight,e;let a=document.createElement("canvas"),n=e.naturalWidth,l=e.naturalHeight,o=t>=5&&t<=8;o?(a.width=l,a.height=n):(a.width=n,a.height=l);let r=a.getContext("2d");if(t&&r.transform.apply(r,Ou(n,l,t)),To(i)){let s=[1,0,0,1,0,0];(!o&&i.horizontal||o&i.vertical)&&(s[0]=-1,s[4]=n),(!o&&i.vertical||o&&i.horizontal)&&(s[3]=-1,s[5]=l),r.transform(...s)}return r.drawImage(e,0,0,n,l),a},Nu=(e,t,i={},a={})=>{let{canvasMemoryLimit:n,background:l=null}=a,o=i.zoom||1,r=ku(e,t,i.flip),s={width:r.width,height:r.height},p=i.aspectRatio||s.height/s.width,c=Eo(s,p,o);if(n){let E=c.width*c.height;if(E>n){let v=Math.sqrt(n)/Math.sqrt(E);s.width=Math.floor(s.width*v),s.height=Math.floor(s.height*v),c=Eo(s,p,o)}}let d=document.createElement("canvas"),m={x:c.width*.5,y:c.height*.5},u={x:0,y:0,width:c.width,height:c.height,center:m},g=typeof i.scaleToFit>"u"||i.scaleToFit,f=o*Io(s,vo(u,p),i.rotation,g?i.center:{x:.5,y:.5});d.width=Math.round(c.width/f),d.height=Math.round(c.height/f),m.x/=f,m.y/=f;let h={x:m.x-s.width*(i.center?i.center.x:.5),y:m.y-s.height*(i.center?i.center.y:.5)},I=d.getContext("2d");l&&(I.fillStyle=l,I.fillRect(0,0,d.width,d.height)),I.translate(m.x,m.y),I.rotate(i.rotation||0),I.drawImage(r,h.x-m.x,h.y-m.y,s.width,s.height);let b=I.getImageData(0,0,d.width,d.height);return xo(d),b},Vu=typeof window<"u"&&typeof window.document<"u";Vu&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,i){var a=this.toDataURL(t,i).split(",")[1];setTimeout(function(){for(var n=atob(a),l=n.length,o=new Uint8Array(l),r=0;rnew Promise(a=>{let n=i?i(e):e;Promise.resolve(n).then(l=>{l.toBlob(a,t.type,t.quality)})}),Ri=(e,t)=>Xt(e.x*t,e.y*t),Si=(e,t)=>Xt(e.x+t.x,e.y+t.y),yo=e=>{let t=Math.sqrt(e.x*e.x+e.y*e.y);return t===0?{x:0,y:0}:Xt(e.x/t,e.y/t)},qe=(e,t,i)=>{let a=Math.cos(t),n=Math.sin(t),l=Xt(e.x-i.x,e.y-i.y);return Xt(i.x+a*l.x-n*l.y,i.y+n*l.x+a*l.y)},Xt=(e=0,t=0)=>({x:e,y:t}),me=(e,t,i=1,a)=>{if(typeof e=="string")return parseFloat(e)*i;if(typeof e=="number")return e*(a?t[a]:Math.min(t.width,t.height))},dt=(e,t,i)=>{let a=e.borderStyle||e.lineStyle||"solid",n=e.backgroundColor||e.fontColor||"transparent",l=e.borderColor||e.lineColor||"transparent",o=me(e.borderWidth||e.lineWidth,t,i),r=e.lineCap||"round",s=e.lineJoin||"round",p=typeof a=="string"?"":a.map(d=>me(d,t,i)).join(","),c=e.opacity||1;return{"stroke-linecap":r,"stroke-linejoin":s,"stroke-width":o||0,"stroke-dasharray":p,stroke:l,fill:n,opacity:c}},Le=e=>e!=null,Lt=(e,t,i=1)=>{let a=me(e.x,t,i,"width")||me(e.left,t,i,"width"),n=me(e.y,t,i,"height")||me(e.top,t,i,"height"),l=me(e.width,t,i,"width"),o=me(e.height,t,i,"height"),r=me(e.right,t,i,"width"),s=me(e.bottom,t,i,"height");return Le(n)||(Le(o)&&Le(s)?n=t.height-o-s:n=s),Le(a)||(Le(l)&&Le(r)?a=t.width-l-r:a=r),Le(l)||(Le(a)&&Le(r)?l=t.width-a-r:l=0),Le(o)||(Le(n)&&Le(s)?o=t.height-n-s:o=0),{x:a||0,y:n||0,width:l||0,height:o||0}},Uu=e=>e.map((t,i)=>`${i===0?"M":"L"} ${t.x} ${t.y}`).join(" "),ke=(e,t)=>Object.keys(t).forEach(i=>e.setAttribute(i,t[i])),Hu="http://www.w3.org/2000/svg",wt=(e,t)=>{let i=document.createElementNS(Hu,e);return t&&ke(i,t),i},Wu=e=>ke(e,{...e.rect,...e.styles}),ju=e=>{let t=e.rect.x+e.rect.width*.5,i=e.rect.y+e.rect.height*.5,a=e.rect.width*.5,n=e.rect.height*.5;return ke(e,{cx:t,cy:i,rx:a,ry:n,...e.styles})},Yu={contain:"xMidYMid meet",cover:"xMidYMid slice"},qu=(e,t)=>{ke(e,{...e.rect,...e.styles,preserveAspectRatio:Yu[t.fit]||"none"})},$u={left:"start",center:"middle",right:"end"},Xu=(e,t,i,a)=>{let n=me(t.fontSize,i,a),l=t.fontFamily||"sans-serif",o=t.fontWeight||"normal",r=$u[t.textAlign]||"start";ke(e,{...e.rect,...e.styles,"stroke-width":0,"font-weight":o,"font-size":n,"font-family":l,"text-anchor":r}),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},Ku=(e,t,i,a)=>{ke(e,{...e.rect,...e.styles,fill:"none"});let n=e.childNodes[0],l=e.childNodes[1],o=e.childNodes[2],r=e.rect,s={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(ke(n,{x1:r.x,y1:r.y,x2:s.x,y2:s.y}),!t.lineDecoration)return;l.style.display="none",o.style.display="none";let p=yo({x:s.x-r.x,y:s.y-r.y}),c=me(.05,i,a);if(t.lineDecoration.indexOf("arrow-begin")!==-1){let d=Ri(p,c),m=Si(r,d),u=qe(r,2,m),g=qe(r,-2,m);ke(l,{style:"display:block;",d:`M${u.x},${u.y} L${r.x},${r.y} L${g.x},${g.y}`})}if(t.lineDecoration.indexOf("arrow-end")!==-1){let d=Ri(p,-c),m=Si(s,d),u=qe(s,2,m),g=qe(s,-2,m);ke(o,{style:"display:block;",d:`M${u.x},${u.y} L${s.x},${s.y} L${g.x},${g.y}`})}},Zu=(e,t,i,a)=>{ke(e,{...e.styles,fill:"none",d:Uu(t.points.map(n=>({x:me(n.x,i,a,"width"),y:me(n.y,i,a,"height")})))})},yi=e=>t=>wt(e,{id:t.id}),Qu=e=>{let t=wt("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=()=>{t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},Ju=e=>{let t=wt("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=wt("line");t.appendChild(i);let a=wt("path");t.appendChild(a);let n=wt("path");return t.appendChild(n),t},eg={image:Qu,rect:yi("rect"),ellipse:yi("ellipse"),text:yi("text"),path:yi("path"),line:Ju},tg={rect:Wu,ellipse:ju,image:qu,text:Xu,path:Zu,line:Ku},ig=(e,t)=>eg[e](t),ag=(e,t,i,a,n)=>{t!=="path"&&(e.rect=Lt(i,a,n)),e.styles=dt(i,a,n),tg[t](e,i,a,n)},Ro=(e,t)=>e[1].zIndex>t[1].zIndex?1:e[1].zIndexnew Promise(n=>{let{background:l=null}=a,o=new FileReader;o.onloadend=()=>{let r=o.result,s=document.createElement("div");s.style.cssText="position:absolute;pointer-events:none;width:0;height:0;visibility:hidden;",s.innerHTML=r;let p=s.querySelector("svg");document.body.appendChild(s);let c=p.getBBox();s.parentNode.removeChild(s);let d=s.querySelector("title"),m=p.getAttribute("viewBox")||"",u=p.getAttribute("width")||"",g=p.getAttribute("height")||"",f=parseFloat(u)||null,h=parseFloat(g)||null,I=(u.match(/[a-z]+/)||[])[0]||"",b=(g.match(/[a-z]+/)||[])[0]||"",E=m.split(" ").map(parseFloat),v=E.length?{x:E[0],y:E[1],width:E[2],height:E[3]}:c,y=f??v.width,T=h??v.height;p.style.overflow="visible",p.setAttribute("width",y),p.setAttribute("height",T);let _="";if(i&&i.length){let Z={width:y,height:T};_=i.sort(Ro).reduce((ce,V)=>{let W=ig(V[0],V[1]);return ag(W,V[0],V[1],Z),W.removeAttribute("id"),W.getAttribute("opacity")===1&&W.removeAttribute("opacity"),ce+` +`+W.outerHTML+` +`},""),_=` -${w.replace(/ /g," ")} +${_.replace(/ /g," ")} -`}let x=t.aspectRatio||b/y,_=y,P=_*x,O=typeof t.scaleToFit>"u"||t.scaleToFit,M=t.center?t.center.x:.5,C=t.center?t.center.y:.5,S=Tl({width:y,height:b},vl({width:_,height:P},x),t.rotation,O?{x:M,y:C}:{x:.5,y:.5}),F=t.zoom*S,R=t.rotation*(180/Math.PI),L={x:_*.5,y:P*.5},z={x:L.x-y*M,y:L.y-b*C},D=[`rotate(${R} ${L.x} ${L.y})`,`translate(${L.x} ${L.y})`,`scale(${F})`,`translate(${-L.x} ${-L.y})`,`translate(${z.x} ${z.y})`],k=t.flip&&t.flip.horizontal,B=t.flip&&t.flip.vertical,X=[`scale(${k?-1:1} ${B?-1:1})`,`translate(${k?-y:0} ${B?-b:0})`],q=` -"u"||t.scaleToFit,A=t.center?t.center.x:.5,B=t.center?t.center.y:.5,w=Io({width:y,height:T},vo({width:R,height:P},x),t.rotation,z?{x:A,y:B}:{x:.5,y:.5}),F=t.zoom*w,S=t.rotation*(180/Math.PI),L={x:R*.5,y:P*.5},D={x:L.x-y*A,y:L.y-T*B},O=[`rotate(${S} ${L.x} ${L.y})`,`translate(${L.x} ${L.y})`,`scale(${F})`,`translate(${-L.x} ${-L.y})`,`translate(${D.x} ${D.y})`],U=t.flip&&t.flip.horizontal,C=t.flip&&t.flip.vertical,X=[`scale(${U?-1:1} ${C?-1:1})`,`translate(${U?-y:0} ${C?-T:0})`],K=` + ${d?d.textContent:""} - + -${p.outerHTML}${w} +${p.outerHTML}${_} -`;n(q)},l.readAsText(e)}),Nu=e=>{let t;try{t=new ImageData(e.width,e.height)}catch{t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(e.data),t},Bu=()=>{let e={resize:c,filter:p},t=(d,m)=>(d.forEach(u=>{m=e[u.type](m,u.data)}),m),i=(d,m)=>{let u=d.transforms,f=null;if(u.forEach(h=>{h.type==="filter"&&(f=h)}),f){let h=null;u.forEach(g=>{g.type==="resize"&&(h=g)}),h&&(h.data.matrix=f.data,u=u.filter(g=>g.type!=="filter"))}m(t(u,d.imageData))};self.onmessage=d=>{i(d.data.message,m=>{self.postMessage({id:d.data.id,message:m},[m.data.buffer])})};let a=1,n=1,o=1;function l(d,m,u){let f=m[d]/255,h=m[d+1]/255,g=m[d+2]/255,v=m[d+3]/255,E=f*u[0]+h*u[1]+g*u[2]+v*u[3]+u[4],T=f*u[5]+h*u[6]+g*u[7]+v*u[8]+u[9],I=f*u[10]+h*u[11]+g*u[12]+v*u[13]+u[14],y=f*u[15]+h*u[16]+g*u[17]+v*u[18]+u[19],b=Math.max(0,E*y)+a*(1-y),w=Math.max(0,T*y)+n*(1-y),x=Math.max(0,I*y)+o*(1-y);m[d]=Math.max(0,Math.min(1,b))*255,m[d+1]=Math.max(0,Math.min(1,w))*255,m[d+2]=Math.max(0,Math.min(1,x))*255}let r=self.JSON.stringify([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]);function s(d){return self.JSON.stringify(d||[])===r}function p(d,m){if(!m||s(m))return d;let u=d.data,f=u.length,h=m[0],g=m[1],v=m[2],E=m[3],T=m[4],I=m[5],y=m[6],b=m[7],w=m[8],x=m[9],_=m[10],P=m[11],O=m[12],M=m[13],C=m[14],S=m[15],F=m[16],R=m[17],L=m[18],z=m[19],D=0,k=0,B=0,X=0,q=0,Q=0,pe=0,G=0,H=0,Y=0,le=0,ee=0;for(;D1&&f===!1)return p(d,v);h=d.width*S,g=d.height*S}let E=d.width,T=d.height,I=Math.round(h),y=Math.round(g),b=d.data,w=new Uint8ClampedArray(I*y*4),x=E/I,_=T/y,P=Math.ceil(x*.5),O=Math.ceil(_*.5);for(let M=0;M=-1&&le<=1&&(F=2*le*le*le-3*le*le+1,F>0)){Y=4*(H+q*E);let ee=b[Y+3];B+=F*ee,L+=F,ee<255&&(F=F*ee/250),z+=F*b[Y],D+=F*b[Y+1],k+=F*b[Y+2],R+=F}}}w[S]=z/R,w[S+1]=D/R,w[S+2]=k/R,w[S+3]=B/L,v&&l(S,w,v)}return{data:w,width:I,height:y}}},ku=(e,t)=>{if(e.getUint32(t+4,!1)!==1165519206)return;t+=4;let i=e.getUint16(t+=6,!1)===18761;t+=e.getUint32(t+4,i);let a=e.getUint16(t,i);t+=2;for(let n=0;n{let t=new DataView(e);if(t.getUint16(0)!==65496)return null;let i=2,a,n,o=!1;for(;i=65504&&a<=65519||a===65534)||(o||(o=ku(t,i,n)),i+n>t.byteLength)));)i+=n;return e.slice(0,i)},Gu=e=>new Promise(t=>{let i=new FileReader;i.onload=()=>t(Vu(i.result)||null),i.readAsArrayBuffer(e.slice(0,256*1024))}),Uu=()=>window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,Wu=(e,t)=>{let i=Uu();if(i){let a=new i;return a.append(e),a.getBlob(t)}return new Blob([e],{type:t})},Hu=()=>Math.random().toString(36).substr(2,9),ju=e=>{let t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),i=URL.createObjectURL(t),a=new Worker(i),n=[];return{transfer:()=>{},post:(o,l,r)=>{let s=Hu();n[s]=l,a.onmessage=p=>{let c=n[p.data.id];c&&(c(p.data.message),delete n[p.data.id])},a.postMessage({id:s,message:o},r)},terminate:()=>{a.terminate(),URL.revokeObjectURL(i)}}},Yu=e=>new Promise((t,i)=>{let a=new Image;a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),qu=e=>e.reduce((t,i)=>t.then(a=>i().then(Array.prototype.concat.bind(a))),Promise.resolve([])),$u=(e,t)=>new Promise(i=>{let a={width:e.width,height:e.height},n=e.getContext("2d"),o=t.sort(yl).map(l=>()=>new Promise(r=>{tf[l[0]](n,a,l[1],r)&&r()}));qu(o).then(()=>i(e))}),St=(e,t)=>{e.beginPath(),e.lineCap=t["stroke-linecap"],e.lineJoin=t["stroke-linejoin"],e.lineWidth=t["stroke-width"],t["stroke-dasharray"].length&&e.setLineDash(t["stroke-dasharray"].split(",")),e.fillStyle=t.fill,e.strokeStyle=t.stroke,e.globalAlpha=t.opacity||1},Lt=e=>{e.fill(),e.stroke(),e.globalAlpha=1},Xu=(e,t,i)=>{let a=wt(i,t),n=ct(i,t);return St(e,n),e.rect(a.x,a.y,a.width,a.height),Lt(e,n),!0},Qu=(e,t,i)=>{let a=wt(i,t),n=ct(i,t);St(e,n);let o=a.x,l=a.y,r=a.width,s=a.height,p=.5522848,c=r/2*p,d=s/2*p,m=o+r,u=l+s,f=o+r/2,h=l+s/2;return e.moveTo(o,h),e.bezierCurveTo(o,h-d,f-c,l,f,l),e.bezierCurveTo(f+c,l,m,h-d,m,h),e.bezierCurveTo(m,h+d,f+c,u,f,u),e.bezierCurveTo(f-c,u,o,h+d,o,h),Lt(e,n),!0},Zu=(e,t,i,a)=>{let n=wt(i,t),o=ct(i,t);St(e,o);let l=new Image;new URL(i.src,window.location.href).origin!==window.location.origin&&(l.crossOrigin=""),l.onload=()=>{if(i.fit==="cover"){let s=n.width/n.height,p=s>1?l.width:l.height*s,c=s>1?l.width/s:l.height,d=l.width*.5-p*.5,m=l.height*.5-c*.5;e.drawImage(l,d,m,p,c,n.x,n.y,n.width,n.height)}else if(i.fit==="contain"){let s=Math.min(n.width/l.width,n.height/l.height),p=s*l.width,c=s*l.height,d=n.x+n.width*.5-p*.5,m=n.y+n.height*.5-c*.5;e.drawImage(l,0,0,l.width,l.height,d,m,p,c)}else e.drawImage(l,0,0,l.width,l.height,n.x,n.y,n.width,n.height);Lt(e,o),a()},l.src=i.src},Ku=(e,t,i)=>{let a=wt(i,t),n=ct(i,t);St(e,n);let o=me(i.fontSize,t),l=i.fontFamily||"sans-serif",r=i.fontWeight||"normal",s=i.textAlign||"left";return e.font=`${r} ${o}px ${l}`,e.textAlign=s,e.fillText(i.text,a.x,a.y),Lt(e,n),!0},Ju=(e,t,i)=>{let a=ct(i,t);St(e,a),e.beginPath();let n=i.points.map(l=>({x:me(l.x,t,1,"width"),y:me(l.y,t,1,"height")}));e.moveTo(n[0].x,n[0].y);let o=n.length;for(let l=1;l{let a=wt(i,t),n=ct(i,t);St(e,n),e.beginPath();let o={x:a.x,y:a.y},l={x:a.x+a.width,y:a.y+a.height};e.moveTo(o.x,o.y),e.lineTo(l.x,l.y);let r=xl({x:l.x-o.x,y:l.y-o.y}),s=.04*Math.min(t.width,t.height);if(i.lineDecoration.indexOf("arrow-begin")!==-1){let p=yi(r,s),c=_i(o,p),d=qe(o,2,c),m=qe(o,-2,c);e.moveTo(d.x,d.y),e.lineTo(o.x,o.y),e.lineTo(m.x,m.y)}if(i.lineDecoration.indexOf("arrow-end")!==-1){let p=yi(r,-s),c=_i(l,p),d=qe(l,2,c),m=qe(l,-2,c);e.moveTo(d.x,d.y),e.lineTo(l.x,l.y),e.lineTo(m.x,m.y)}return Lt(e,n),!0},tf={rect:Xu,ellipse:Qu,image:Zu,text:Ku,line:ef,path:Ju},af=e=>{let t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").putImageData(e,0,0),t},nf=(e,t,i={})=>new Promise((a,n)=>{if(!e||!du(e))return n({status:"not an image file",file:e});let{stripImageHead:o,beforeCreateBlob:l,afterCreateBlob:r,canvasMemoryLimit:s}=i,{crop:p,size:c,filter:d,markup:m,output:u}=t,f=t.image&&t.image.orientation?Math.max(1,Math.min(8,t.image.orientation)):null,h=u&&u.quality,g=h===null?null:h/100,v=u&&u.type||null,E=u&&u.background||null,T=[];c&&(typeof c.width=="number"||typeof c.height=="number")&&T.push({type:"resize",data:c}),d&&d.length===20&&T.push({type:"filter",data:d});let I=w=>{let x=r?r(w):w;Promise.resolve(x).then(a)},y=(w,x)=>{let _=af(w),P=m.length?$u(_,m):_;Promise.resolve(P).then(O=>{Tu(O,x,l).then(M=>{if(Il(O),o)return I(M);Gu(e).then(C=>{C!==null&&(M=new Blob([C,M.slice(20)],{type:M.type})),I(M)})}).catch(n)})};if(/svg/.test(e.type)&&v===null)return Cu(e,p,m,{background:E}).then(w=>{a(Wu(w,"image/svg+xml"))});let b=URL.createObjectURL(e);Yu(b).then(w=>{URL.revokeObjectURL(b);let x=Eu(w,f,p,{canvasMemoryLimit:s,background:E}),_={quality:g,type:v||e.type};if(!T.length)return y(x,_);let P=ju(Bu);P.post({transforms:T,imageData:x},O=>{y(Nu(O),_),P.terminate()},[x.data.buffer])}).catch(n)}),of=["x","y","left","top","right","bottom","width","height"],lf=e=>typeof e=="string"&&/%/.test(e)?parseFloat(e)/100:e,rf=e=>{let[t,i]=e,a=i.points?{}:of.reduce((n,o)=>(n[o]=lf(i[o]),n),{});return[t,{zIndex:0,...i,...a}]},sf=e=>new Promise((t,i)=>{let a=new Image;a.src=URL.createObjectURL(e);let n=()=>{let l=a.naturalWidth,r=a.naturalHeight;l&&r&&(URL.revokeObjectURL(a.src),clearInterval(o),t({width:l,height:r}))};a.onerror=l=>{URL.revokeObjectURL(a.src),clearInterval(o),i(l)};let o=setInterval(n,1);n()});typeof window<"u"&&typeof window.document<"u"&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,i){let a=this;setTimeout(()=>{let n=a.toDataURL(t,i).split(",")[1],o=atob(n),l=o.length,r=new Uint8Array(l);for(;l--;)r[l]=o.charCodeAt(l);e(new Blob([r],{type:t||"image/png"}))})}}));var Sa=typeof window<"u"&&typeof window.document<"u",cf=Sa&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,_l=({addFilter:e,utils:t})=>{let{Type:i,forin:a,getFileFromBlob:n,isFile:o}=t,l=["crop","resize","filter","markup","output"],r=c=>(d,m,u)=>d(m,c?c(u):u),s=c=>c.aspectRatio===null&&c.rotation===0&&c.zoom===1&&c.center&&c.center.x===.5&&c.center.y===.5&&c.flip&&c.flip.horizontal===!1&&c.flip.vertical===!1;e("SHOULD_PREPARE_OUTPUT",(c,{query:d})=>new Promise(m=>{m(!d("IS_ASYNC"))}));let p=(c,d,m)=>new Promise(u=>{if(!c("GET_ALLOW_IMAGE_TRANSFORM")||m.archived||!o(d)||!ou(d))return u(!1);sf(d).then(()=>{let f=c("GET_IMAGE_TRANSFORM_IMAGE_FILTER");if(f){let h=f(d);if(h==null)return handleRevert(!0);if(typeof h=="boolean")return u(h);if(typeof h.then=="function")return h.then(u)}u(!0)}).catch(f=>{u(!1)})});return e("DID_CREATE_ITEM",(c,{query:d,dispatch:m})=>{d("GET_ALLOW_IMAGE_TRANSFORM")&&c.extend("requestPrepare",()=>new Promise((u,f)=>{m("REQUEST_PREPARE_OUTPUT",{query:c.id,item:c,success:u,failure:f},!0)}))}),e("PREPARE_OUTPUT",(c,{query:d,item:m})=>new Promise(u=>{p(d,c,m).then(f=>{if(!f)return u(c);let h=[];d("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_ORIGINAL")&&h.push(()=>new Promise(x=>{x({name:d("GET_IMAGE_TRANSFORM_VARIANTS_ORIGINAL_NAME"),file:c})})),d("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_DEFAULT")&&h.push((x,_,P)=>new Promise(O=>{x(_,P).then(M=>O({name:d("GET_IMAGE_TRANSFORM_VARIANTS_DEFAULT_NAME"),file:M}))}));let g=d("GET_IMAGE_TRANSFORM_VARIANTS")||{};a(g,(x,_)=>{let P=r(_);h.push((O,M,C)=>new Promise(S=>{P(O,M,C).then(F=>S({name:x,file:F}))}))});let v=d("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY"),E=d("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY_MODE"),T=v===null?null:v/100,I=d("GET_IMAGE_TRANSFORM_OUTPUT_MIME_TYPE"),y=d("GET_IMAGE_TRANSFORM_CLIENT_TRANSFORMS")||l;m.setMetadata("output",{type:I,quality:T,client:y},!0);let b=(x,_)=>new Promise((P,O)=>{let M={..._};Object.keys(M).filter(B=>B!=="exif").forEach(B=>{y.indexOf(B)===-1&&delete M[B]});let{resize:C,exif:S,output:F,crop:R,filter:L,markup:z}=M,D={image:{orientation:S?S.orientation:null},output:F&&(F.type||typeof F.quality=="number"||F.background)?{type:F.type,quality:typeof F.quality=="number"?F.quality*100:null,background:F.background||d("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||null}:void 0,size:C&&(C.size.width||C.size.height)?{mode:C.mode,upscale:C.upscale,...C.size}:void 0,crop:R&&!s(R)?{...R}:void 0,markup:z&&z.length?z.map(rf):[],filter:L};if(D.output){let B=F.type?F.type!==x.type:!1,X=/\/jpe?g$/.test(x.type),q=F.quality!==null?X&&E==="always":!1;if(!!!(D.size||D.crop||D.filter||B||q))return P(x)}let k={beforeCreateBlob:d("GET_IMAGE_TRANSFORM_BEFORE_CREATE_BLOB"),afterCreateBlob:d("GET_IMAGE_TRANSFORM_AFTER_CREATE_BLOB"),canvasMemoryLimit:d("GET_IMAGE_TRANSFORM_CANVAS_MEMORY_LIMIT"),stripImageHead:d("GET_IMAGE_TRANSFORM_OUTPUT_STRIP_IMAGE_HEAD")};nf(x,D,k).then(B=>{let X=n(B,su(x.name,cu(B.type)));P(X)}).catch(O)}),w=h.map(x=>x(b,c,m.getMetadata()));Promise.all(w).then(x=>{u(x.length===1&&x[0].name===null?x[0].file:x)})})})),{options:{allowImageTransform:[!0,i.BOOLEAN],imageTransformImageFilter:[null,i.FUNCTION],imageTransformOutputMimeType:[null,i.STRING],imageTransformOutputQuality:[null,i.INT],imageTransformOutputStripImageHead:[!0,i.BOOLEAN],imageTransformClientTransforms:[null,i.ARRAY],imageTransformOutputQualityMode:["always",i.STRING],imageTransformVariants:[null,i.OBJECT],imageTransformVariantsIncludeDefault:[!0,i.BOOLEAN],imageTransformVariantsDefaultName:[null,i.STRING],imageTransformVariantsIncludeOriginal:[!1,i.BOOLEAN],imageTransformVariantsOriginalName:["original_",i.STRING],imageTransformBeforeCreateBlob:[null,i.FUNCTION],imageTransformAfterCreateBlob:[null,i.FUNCTION],imageTransformCanvasMemoryLimit:[Sa&&cf?4096*4096:null,i.INT],imageTransformCanvasBackgroundColor:[null,i.STRING]}}};Sa&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:_l}));var Rl=_l;var La=e=>/^video/.test(e.type),$t=e=>/^audio/.test(e.type),Aa=class{constructor(t,i){this.mediaEl=t,this.audioElems=i,this.onplayhead=!1,this.duration=0,this.timelineWidth=this.audioElems.timeline.offsetWidth-this.audioElems.playhead.offsetWidth,this.moveplayheadFn=this.moveplayhead.bind(this),this.registerListeners()}registerListeners(){this.mediaEl.addEventListener("timeupdate",this.timeUpdate.bind(this),!1),this.mediaEl.addEventListener("canplaythrough",()=>this.duration=this.mediaEl.duration,!1),this.audioElems.timeline.addEventListener("click",this.timelineClicked.bind(this),!1),this.audioElems.button.addEventListener("click",this.play.bind(this)),this.audioElems.playhead.addEventListener("mousedown",this.mouseDown.bind(this),!1),window.addEventListener("mouseup",this.mouseUp.bind(this),!1)}play(){this.mediaEl.paused?this.mediaEl.play():this.mediaEl.pause(),this.audioElems.button.classList.toggle("play"),this.audioElems.button.classList.toggle("pause")}timeUpdate(){let t=this.mediaEl.currentTime/this.duration*100;this.audioElems.playhead.style.marginLeft=t+"%",this.mediaEl.currentTime===this.duration&&(this.audioElems.button.classList.toggle("play"),this.audioElems.button.classList.toggle("pause"))}moveplayhead(t){let i=t.clientX-this.getPosition(this.audioElems.timeline);i>=0&&i<=this.timelineWidth&&(this.audioElems.playhead.style.marginLeft=i+"px"),i<0&&(this.audioElems.playhead.style.marginLeft="0px"),i>this.timelineWidth&&(this.audioElems.playhead.style.marginLeft=this.timelineWidth-4+"px")}timelineClicked(t){this.moveplayhead(t),this.mediaEl.currentTime=this.duration*this.clickPercent(t)}mouseDown(){this.onplayhead=!0,window.addEventListener("mousemove",this.moveplayheadFn,!0),this.mediaEl.removeEventListener("timeupdate",this.timeUpdate.bind(this),!1)}mouseUp(t){window.removeEventListener("mousemove",this.moveplayheadFn,!0),this.onplayhead==!0&&(this.moveplayhead(t),this.mediaEl.currentTime=this.duration*this.clickPercent(t),this.mediaEl.addEventListener("timeupdate",this.timeUpdate.bind(this),!1)),this.onplayhead=!1}clickPercent(t){return(t.clientX-this.getPosition(this.audioElems.timeline))/this.timelineWidth}getPosition(t){return t.getBoundingClientRect().left}},df=e=>e.utils.createView({name:"media-preview",tag:"div",ignoreRect:!0,create:({root:t,props:i})=>{let{id:a}=i,n=t.query("GET_ITEM",{id:i.id}),o=$t(n.file)?"audio":"video";if(t.ref.media=document.createElement(o),t.ref.media.setAttribute("controls",!0),t.element.appendChild(t.ref.media),$t(n.file)){let l=document.createDocumentFragment();t.ref.audio=[],t.ref.audio.container=document.createElement("div"),t.ref.audio.button=document.createElement("span"),t.ref.audio.timeline=document.createElement("div"),t.ref.audio.playhead=document.createElement("div"),t.ref.audio.container.className="audioplayer",t.ref.audio.button.className="playpausebtn play",t.ref.audio.timeline.className="timeline",t.ref.audio.playhead.className="playhead",t.ref.audio.timeline.appendChild(t.ref.audio.playhead),t.ref.audio.container.appendChild(t.ref.audio.button),t.ref.audio.container.appendChild(t.ref.audio.timeline),l.appendChild(t.ref.audio.container),t.element.appendChild(l)}},write:e.utils.createRoute({DID_MEDIA_PREVIEW_LOAD:({root:t,props:i})=>{let{id:a}=i,n=t.query("GET_ITEM",{id:i.id});if(!n)return;let o=window.URL||window.webkitURL,l=new Blob([n.file],{type:n.file.type});t.ref.media.type=n.file.type,t.ref.media.src=n.file.mock&&n.file.url||o.createObjectURL(l),$t(n.file)&&new Aa(t.ref.media,t.ref.audio),t.ref.media.addEventListener("loadeddata",()=>{let r=75;if(La(n.file)){let s=t.ref.media.offsetWidth,p=t.ref.media.videoWidth/s;r=t.ref.media.videoHeight/p}t.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:i.id,height:r})},!1)}})}),pf=e=>{let t=({root:a,props:n})=>{let{id:o}=n;a.query("GET_ITEM",o)&&a.dispatch("DID_MEDIA_PREVIEW_LOAD",{id:o})},i=({root:a,props:n})=>{let o=df(e);a.ref.media=a.appendChildView(a.createChildView(o,{id:n.id}))};return e.utils.createView({name:"media-preview-wrapper",create:i,write:e.utils.createRoute({DID_MEDIA_PREVIEW_CONTAINER_CREATE:t})})},Ma=e=>{let{addFilter:t,utils:i}=e,{Type:a,createRoute:n}=i,o=pf(e);return t("CREATE_VIEW",l=>{let{is:r,view:s,query:p}=l;if(!r("file"))return;let c=({root:d,props:m})=>{let{id:u}=m,f=p("GET_ITEM",u),h=p("GET_ALLOW_VIDEO_PREVIEW"),g=p("GET_ALLOW_AUDIO_PREVIEW");!f||f.archived||(!La(f.file)||!h)&&(!$t(f.file)||!g)||(d.ref.mediaPreview=s.appendChildView(s.createChildView(o,{id:u})),d.dispatch("DID_MEDIA_PREVIEW_CONTAINER_CREATE",{id:u}))};s.registerWriter(n({DID_LOAD_ITEM:c},({root:d,props:m})=>{let{id:u}=m,f=p("GET_ITEM",u),h=d.query("GET_ALLOW_VIDEO_PREVIEW"),g=d.query("GET_ALLOW_AUDIO_PREVIEW");!f||(!La(f.file)||!h)&&(!$t(f.file)||!g)||d.rect.element.hidden}))}),{options:{allowVideoPreview:[!0,a.BOOLEAN],allowAudioPreview:[!0,a.BOOLEAN]}}},mf=typeof window<"u"&&typeof window.document<"u";mf&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Ma}));var wl={labelIdle:'\u0627\u0633\u062D\u0628 \u0648 \u0627\u062F\u0631\u062C \u0645\u0644\u0641\u0627\u062A\u0643 \u0623\u0648 \u062A\u0635\u0641\u062D ',labelInvalidField:"\u0627\u0644\u062D\u0642\u0644 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u063A\u064A\u0631 \u0635\u0627\u0644\u062D\u0629",labelFileWaitingForSize:"\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u062D\u062C\u0645",labelFileSizeNotAvailable:"\u0627\u0644\u062D\u062C\u0645 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",labelFileLoading:"\u0628\u0627\u0644\u0625\u0646\u062A\u0638\u0627\u0631",labelFileLoadError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u062D\u0645\u064A\u0644",labelFileProcessing:"\u064A\u062A\u0645 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingComplete:"\u062A\u0645 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingAborted:"\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingRevertError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u0631\u0627\u062C\u0639",labelFileRemoveError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062D\u0630\u0641",labelTapToCancel:"\u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0644\u063A\u0627\u0621",labelTapToRetry:"\u0627\u0646\u0642\u0631 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",labelTapToUndo:"\u0627\u0646\u0642\u0631 \u0644\u0644\u062A\u0631\u0627\u062C\u0639",labelButtonRemoveItem:"\u0645\u0633\u062D",labelButtonAbortItemLoad:"\u0625\u0644\u063A\u0627\u0621",labelButtonRetryItemLoad:"\u0625\u0639\u0627\u062F\u0629",labelButtonAbortItemProcessing:"\u0625\u0644\u063A\u0627\u0621",labelButtonUndoItemProcessing:"\u062A\u0631\u0627\u062C\u0639",labelButtonRetryItemProcessing:"\u0625\u0639\u0627\u062F\u0629",labelButtonProcessItem:"\u0631\u0641\u0639",labelMaxFileSizeExceeded:"\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064A\u0631 \u062C\u062F\u0627",labelMaxFileSize:"\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0623\u0642\u0635\u0649: {filesize}",labelMaxTotalFileSizeExceeded:"\u062A\u0645 \u062A\u062C\u0627\u0648\u0632 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u062D\u062C\u0645 \u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A",labelMaxTotalFileSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641: {filesize}",labelFileTypeNotAllowed:"\u0645\u0644\u0641 \u0645\u0646 \u0646\u0648\u0639 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",fileValidateTypeLabelExpectedTypes:"\u062A\u062A\u0648\u0642\u0639 {allButLastType} \u0645\u0646 {lastType}",imageValidateSizeLabelFormatError:"\u0646\u0648\u0639 \u0627\u0644\u0635\u0648\u0631\u0629 \u063A\u064A\u0631 \u0645\u062F\u0639\u0648\u0645",imageValidateSizeLabelImageSizeTooSmall:"\u0627\u0644\u0635\u0648\u0631\u0629 \u0635\u063A\u064A\u0631 \u062C\u062F\u0627",imageValidateSizeLabelImageSizeTooBig:"\u0627\u0644\u0635\u0648\u0631\u0629 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u0627",imageValidateSizeLabelExpectedMinSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u0623\u0628\u0639\u0627\u062F \u0647\u0648: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0623\u0628\u0639\u0627\u062F \u0647\u0648: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0627\u0644\u062F\u0642\u0629 \u0636\u0639\u064A\u0641\u0629 \u062C\u062F\u0627",imageValidateSizeLabelImageResolutionTooHigh:"\u0627\u0644\u062F\u0642\u0629 \u0645\u0631\u062A\u0641\u0639\u0629 \u062C\u062F\u0627",imageValidateSizeLabelExpectedMinResolution:"\u0623\u0642\u0644 \u062F\u0642\u0629: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0623\u0642\u0635\u0649 \u062F\u0642\u0629: {maxResolution}"};var Sl={labelIdle:'Arrossega i deixa anar els teus fitxers o Navega ',labelInvalidField:"El camp cont\xE9 fitxers inv\xE0lids",labelFileWaitingForSize:"Esperant mida",labelFileSizeNotAvailable:"Mida no disponible",labelFileLoading:"Carregant",labelFileLoadError:"Error durant la c\xE0rrega",labelFileProcessing:"Pujant",labelFileProcessingComplete:"Pujada completada",labelFileProcessingAborted:"Pujada cancel\xB7lada",labelFileProcessingError:"Error durant la pujada",labelFileProcessingRevertError:"Error durant la reversi\xF3",labelFileRemoveError:"Error durant l'eliminaci\xF3",labelTapToCancel:"toca per cancel\xB7lar",labelTapToRetry:"toca per reintentar",labelTapToUndo:"toca per desfer",labelButtonRemoveItem:"Eliminar",labelButtonAbortItemLoad:"Cancel\xB7lar",labelButtonRetryItemLoad:"Reintentar",labelButtonAbortItemProcessing:"Cancel\xB7lar",labelButtonUndoItemProcessing:"Desfer",labelButtonRetryItemProcessing:"Reintentar",labelButtonProcessItem:"Pujar",labelMaxFileSizeExceeded:"El fitxer \xE9s massa gran",labelMaxFileSize:"La mida m\xE0xima del fitxer \xE9s {filesize}",labelMaxTotalFileSizeExceeded:"Mida m\xE0xima total excedida",labelMaxTotalFileSize:"La mida m\xE0xima total del fitxer \xE9s {filesize}",labelFileTypeNotAllowed:"Fitxer de tipus inv\xE0lid",fileValidateTypeLabelExpectedTypes:"Espera {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipus d'imatge no suportada",imageValidateSizeLabelImageSizeTooSmall:"La imatge \xE9s massa petita",imageValidateSizeLabelImageSizeTooBig:"La imatge \xE9s massa gran",imageValidateSizeLabelExpectedMinSize:"La mida m\xEDnima \xE9s {minWidth} x {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La mida m\xE0xima \xE9s {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La resoluci\xF3 \xE9s massa baixa",imageValidateSizeLabelImageResolutionTooHigh:"La resoluci\xF3 \xE9s massa alta",imageValidateSizeLabelExpectedMinResolution:"La resoluci\xF3 m\xEDnima \xE9s {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La resoluci\xF3 m\xE0xima \xE9s {maxResolution}"};var Ll={labelIdle:'\u067E\u06D5\u0695\u06AF\u06D5\u06A9\u0627\u0646 \u0641\u0695\u06CE \u0628\u062F\u06D5 \u0626\u06CE\u0631\u06D5 \u0628\u06C6 \u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u06CC\u0627\u0646 \u0647\u06D5\u06B5\u0628\u0698\u06CE\u0631\u06D5 ',labelInvalidField:"\u067E\u06D5\u0695\u06AF\u06D5\u06CC \u0646\u0627\u062F\u0631\u0648\u0633\u062A\u06CC \u062A\u06CE\u062F\u0627\u06CC\u06D5",labelFileWaitingForSize:"\u0686\u0627\u0648\u06D5\u0695\u0648\u0627\u0646\u06CC\u06CC \u0642\u06D5\u0628\u0627\u0631\u06D5",labelFileSizeNotAvailable:"\u0642\u06D5\u0628\u0627\u0631\u06D5 \u0628\u06D5\u0631\u062F\u06D5\u0633\u062A \u0646\u06CC\u06D5",labelFileLoading:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileLoadError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5\u0645\u0627\u0648\u06D5\u06CC \u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileProcessing:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileProcessingComplete:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u062A\u06D5\u0648\u0627\u0648 \u0628\u0648\u0648",labelFileProcessingAborted:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u06CC\u06D5\u0648\u06D5",labelFileProcessingError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5\u06A9\u0627\u062A\u06CC \u0628\u0627\u0631\u06A9\u0631\u062F\u0646\u062F\u0627",labelFileProcessingRevertError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5 \u06A9\u0627\u062A\u06CC \u06AF\u06D5\u0695\u0627\u0646\u06D5\u0648\u06D5",labelFileRemoveError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5 \u06A9\u0627\u062A\u06CC \u0633\u0695\u06CC\u0646\u06D5\u0648\u06D5",labelTapToCancel:"\u0628\u06C6 \u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5 Tab \u062F\u0627\u0628\u06AF\u0631\u06D5",labelTapToRetry:"tap \u062F\u0627\u0628\u06AF\u0631\u06D5 \u0628\u06C6 \u062F\u0648\u0648\u0628\u0627\u0631\u06D5\u06A9\u0631\u062F\u0646\u06D5\u0648\u06D5",labelTapToUndo:"tap \u062F\u0627\u0628\u06AF\u0631\u06D5 \u0628\u06C6 \u06AF\u06D5\u0695\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRemoveItem:"\u0633\u0695\u06CC\u0646\u06D5\u0648\u06D5",labelButtonAbortItemLoad:"\u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRetryItemLoad:"\u0647\u06D5\u0648\u06B5\u062F\u0627\u0646\u06D5\u0648\u06D5",labelButtonAbortItemProcessing:"\u067E\u06D5\u0634\u06CC\u0645\u0627\u0646\u0628\u0648\u0648\u0646\u06D5\u0648\u06D5",labelButtonUndoItemProcessing:"\u06AF\u06D5\u0695\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRetryItemProcessing:"\u0647\u06D5\u0648\u06B5\u062F\u0627\u0646\u06D5\u0648\u06D5",labelButtonProcessItem:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelMaxFileSizeExceeded:"\u067E\u06D5\u0695\u06AF\u06D5 \u0632\u06C6\u0631 \u06AF\u06D5\u0648\u0631\u06D5\u06CC\u06D5",labelMaxFileSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {filesize}",labelMaxTotalFileSizeExceeded:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5\u06CC \u06A9\u06C6\u06CC \u06AF\u0634\u062A\u06CC \u062A\u06CE\u067E\u06D5\u0695\u06CE\u0646\u062F\u0631\u0627",labelMaxTotalFileSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5\u06CC \u06A9\u06C6\u06CC \u067E\u06D5\u0695\u06AF\u06D5 {filesize}",labelFileTypeNotAllowed:"\u062C\u06C6\u0631\u06CC \u067E\u06D5\u0695\u06AF\u06D5\u06A9\u06D5 \u0646\u0627\u062F\u0631\u0648\u0633\u062A\u06D5",fileValidateTypeLabelExpectedTypes:"\u062C\u06AF\u06D5 \u0644\u06D5 {allButLastType} \u06CC\u0627\u0646 {lastType}",imageValidateSizeLabelFormatError:"\u062C\u06C6\u0631\u06CC \u0648\u06CE\u0646\u06D5 \u067E\u0627\u06B5\u067E\u0634\u062A\u06CC\u06CC \u0646\u06D5\u06A9\u0631\u0627\u0648\u06D5",imageValidateSizeLabelImageSizeTooSmall:"\u0648\u06CE\u0646\u06D5\u06A9\u06D5 \u0632\u06C6\u0631 \u0628\u0686\u0648\u0648\u06A9\u06D5",imageValidateSizeLabelImageSizeTooBig:"\u0648\u06CE\u0646\u06D5\u06A9\u06D5 \u0632\u06C6\u0631 \u06AF\u06D5\u0648\u0631\u06D5\u06CC\u06D5",imageValidateSizeLabelExpectedMinSize:"\u06A9\u06D5\u0645\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC\u06D5\u06A9\u06D5\u06CC \u0632\u06C6\u0631 \u06A9\u06D5\u0645\u06D5",imageValidateSizeLabelImageResolutionTooHigh:"\u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC\u06D5\u06A9\u06D5\u06CC \u0632\u06C6\u0631 \u0628\u06D5\u0631\u0632\u06D5",imageValidateSizeLabelExpectedMinResolution:"\u06A9\u06D5\u0645\u062A\u0631\u06CC\u0646 \u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0648\u0631\u062F\u0628\u06CC\u0646\u06CC {maxResolution}"};var Al={labelIdle:'P\u0159et\xE1hn\u011Bte soubor sem (drag&drop) nebo Vyhledat ',labelInvalidField:"Pole obsahuje chybn\xE9 soubory",labelFileWaitingForSize:"Zji\u0161\u0165uje se velikost",labelFileSizeNotAvailable:"Velikost nen\xED zn\xE1m\xE1",labelFileLoading:"P\u0159en\xE1\u0161\xED se",labelFileLoadError:"Chyba p\u0159i p\u0159enosu",labelFileProcessing:"Prob\xEDh\xE1 upload",labelFileProcessingComplete:"Upload dokon\u010Den",labelFileProcessingAborted:"Upload stornov\xE1n",labelFileProcessingError:"Chyba p\u0159i uploadu",labelFileProcessingRevertError:"Chyba p\u0159i obnov\u011B",labelFileRemoveError:"Chyba p\u0159i odstran\u011Bn\xED",labelTapToCancel:"klepn\u011Bte pro storno",labelTapToRetry:"klepn\u011Bte pro opakov\xE1n\xED",labelTapToUndo:"klepn\u011Bte pro vr\xE1cen\xED",labelButtonRemoveItem:"Odstranit",labelButtonAbortItemLoad:"Storno",labelButtonRetryItemLoad:"Opakovat",labelButtonAbortItemProcessing:"Zp\u011Bt",labelButtonUndoItemProcessing:"Vr\xE1tit",labelButtonRetryItemProcessing:"Opakovat",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Soubor je p\u0159\xEDli\u0161 velk\xFD",labelMaxFileSize:"Nejv\u011Bt\u0161\xED velikost souboru je {filesize}",labelMaxTotalFileSizeExceeded:"P\u0159ekro\u010Dena maxim\xE1ln\xED celkov\xE1 velikost souboru",labelMaxTotalFileSize:"Maxim\xE1ln\xED celkov\xE1 velikost souboru je {filesize}",labelFileTypeNotAllowed:"Soubor je nespr\xE1vn\xE9ho typu",fileValidateTypeLabelExpectedTypes:"O\u010Dek\xE1v\xE1 se {allButLastType} nebo {lastType}",imageValidateSizeLabelFormatError:"Obr\xE1zek tohoto typu nen\xED podporov\xE1n",imageValidateSizeLabelImageSizeTooSmall:"Obr\xE1zek je p\u0159\xEDli\u0161 mal\xFD",imageValidateSizeLabelImageSizeTooBig:"Obr\xE1zek je p\u0159\xEDli\u0161 velk\xFD",imageValidateSizeLabelExpectedMinSize:"Minim\xE1ln\xED rozm\u011Br je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maxim\xE1ln\xED rozm\u011Br je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozli\u0161en\xED je p\u0159\xEDli\u0161 mal\xE9",imageValidateSizeLabelImageResolutionTooHigh:"Rozli\u0161en\xED je p\u0159\xEDli\u0161 velk\xE9",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1ln\xED rozli\u0161en\xED je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1ln\xED rozli\u0161en\xED je {maxResolution}"};var Ml={labelIdle:'Tr\xE6k & slip filer eller Gennemse ',labelInvalidField:"Felt indeholder ugyldige filer",labelFileWaitingForSize:"Venter p\xE5 st\xF8rrelse",labelFileSizeNotAvailable:"St\xF8rrelse ikke tilg\xE6ngelig",labelFileLoading:"Loader",labelFileLoadError:"Load fejlede",labelFileProcessing:"Uploader",labelFileProcessingComplete:"Upload f\xE6rdig",labelFileProcessingAborted:"Upload annulleret",labelFileProcessingError:"Upload fejlede",labelFileProcessingRevertError:"Fortryd fejlede",labelFileRemoveError:"Fjern fejlede",labelTapToCancel:"tryk for at annullere",labelTapToRetry:"tryk for at pr\xF8ve igen",labelTapToUndo:"tryk for at fortryde",labelButtonRemoveItem:"Fjern",labelButtonAbortItemLoad:"Annuller",labelButtonRetryItemLoad:"Fors\xF8g igen",labelButtonAbortItemProcessing:"Annuller",labelButtonUndoItemProcessing:"Fortryd",labelButtonRetryItemProcessing:"Pr\xF8v igen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Filen er for stor",labelMaxFileSize:"Maksimal filst\xF8rrelse er {filesize}",labelMaxTotalFileSizeExceeded:"Maksimal totalst\xF8rrelse overskredet",labelMaxTotalFileSize:"Maksimal total filst\xF8rrelse er {filesize}",labelFileTypeNotAllowed:"Ugyldig filtype",fileValidateTypeLabelExpectedTypes:"Forventer {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Ugyldigt format",imageValidateSizeLabelImageSizeTooSmall:"Billedet er for lille",imageValidateSizeLabelImageSizeTooBig:"Billedet er for stort",imageValidateSizeLabelExpectedMinSize:"Minimum st\xF8rrelse er {minBredde} \xD7 {minH\xF8jde}",imageValidateSizeLabelExpectedMaxSize:"Maksimal st\xF8rrelse er {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"For lav opl\xF8sning",imageValidateSizeLabelImageResolutionTooHigh:"For h\xF8j opl\xF8sning",imageValidateSizeLabelExpectedMinResolution:"Minimum opl\xF8sning er {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimal opl\xF8sning er {maxResolution}"};var Ol={labelIdle:'Dateien ablegen oder ausw\xE4hlen ',labelInvalidField:"Feld beinhaltet ung\xFCltige Dateien",labelFileWaitingForSize:"Dateigr\xF6\xDFe berechnen",labelFileSizeNotAvailable:"Dateigr\xF6\xDFe nicht verf\xFCgbar",labelFileLoading:"Laden",labelFileLoadError:"Fehler beim Laden",labelFileProcessing:"Upload l\xE4uft",labelFileProcessingComplete:"Upload abgeschlossen",labelFileProcessingAborted:"Upload abgebrochen",labelFileProcessingError:"Fehler beim Upload",labelFileProcessingRevertError:"Fehler beim Wiederherstellen",labelFileRemoveError:"Fehler beim L\xF6schen",labelTapToCancel:"abbrechen",labelTapToRetry:"erneut versuchen",labelTapToUndo:"r\xFCckg\xE4ngig",labelButtonRemoveItem:"Entfernen",labelButtonAbortItemLoad:"Verwerfen",labelButtonRetryItemLoad:"Erneut versuchen",labelButtonAbortItemProcessing:"Abbrechen",labelButtonUndoItemProcessing:"R\xFCckg\xE4ngig",labelButtonRetryItemProcessing:"Erneut versuchen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Datei ist zu gro\xDF",labelMaxFileSize:"Maximale Dateigr\xF6\xDFe: {filesize}",labelMaxTotalFileSizeExceeded:"Maximale gesamte Dateigr\xF6\xDFe \xFCberschritten",labelMaxTotalFileSize:"Maximale gesamte Dateigr\xF6\xDFe: {filesize}",labelFileTypeNotAllowed:"Dateityp ung\xFCltig",fileValidateTypeLabelExpectedTypes:"Erwartet {allButLastType} oder {lastType}",imageValidateSizeLabelFormatError:"Bildtyp nicht unterst\xFCtzt",imageValidateSizeLabelImageSizeTooSmall:"Bild ist zu klein",imageValidateSizeLabelImageSizeTooBig:"Bild ist zu gro\xDF",imageValidateSizeLabelExpectedMinSize:"Mindestgr\xF6\xDFe: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximale Gr\xF6\xDFe: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Aufl\xF6sung ist zu niedrig",imageValidateSizeLabelImageResolutionTooHigh:"Aufl\xF6sung ist zu hoch",imageValidateSizeLabelExpectedMinResolution:"Mindestaufl\xF6sung: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximale Aufl\xF6sung: {maxResolution}"};var Pl={labelIdle:'Drag & Drop your files or Browse ',labelInvalidField:"Field contains invalid files",labelFileWaitingForSize:"Waiting for size",labelFileSizeNotAvailable:"Size not available",labelFileLoading:"Loading",labelFileLoadError:"Error during load",labelFileProcessing:"Uploading",labelFileProcessingComplete:"Upload complete",labelFileProcessingAborted:"Upload cancelled",labelFileProcessingError:"Error during upload",labelFileProcessingRevertError:"Error during revert",labelFileRemoveError:"Error during remove",labelTapToCancel:"tap to cancel",labelTapToRetry:"tap to retry",labelTapToUndo:"tap to undo",labelButtonRemoveItem:"Remove",labelButtonAbortItemLoad:"Abort",labelButtonRetryItemLoad:"Retry",labelButtonAbortItemProcessing:"Cancel",labelButtonUndoItemProcessing:"Undo",labelButtonRetryItemProcessing:"Retry",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"File is too large",labelMaxFileSize:"Maximum file size is {filesize}",labelMaxTotalFileSizeExceeded:"Maximum total size exceeded",labelMaxTotalFileSize:"Maximum total file size is {filesize}",labelFileTypeNotAllowed:"File of invalid type",fileValidateTypeLabelExpectedTypes:"Expects {allButLastType} or {lastType}",imageValidateSizeLabelFormatError:"Image type not supported",imageValidateSizeLabelImageSizeTooSmall:"Image is too small",imageValidateSizeLabelImageSizeTooBig:"Image is too big",imageValidateSizeLabelExpectedMinSize:"Minimum size is {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum size is {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolution is too low",imageValidateSizeLabelImageResolutionTooHigh:"Resolution is too high",imageValidateSizeLabelExpectedMinResolution:"Minimum resolution is {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum resolution is {maxResolution}"};var Dl={labelIdle:'Arrastra y suelta tus archivos o Examina ',labelInvalidField:"El campo contiene archivos inv\xE1lidos",labelFileWaitingForSize:"Esperando tama\xF1o",labelFileSizeNotAvailable:"Tama\xF1o no disponible",labelFileLoading:"Cargando",labelFileLoadError:"Error durante la carga",labelFileProcessing:"Subiendo",labelFileProcessingComplete:"Subida completa",labelFileProcessingAborted:"Subida cancelada",labelFileProcessingError:"Error durante la subida",labelFileProcessingRevertError:"Error durante la reversi\xF3n",labelFileRemoveError:"Error durante la eliminaci\xF3n",labelTapToCancel:"toca para cancelar",labelTapToRetry:"tocar para reintentar",labelTapToUndo:"tocar para deshacer",labelButtonRemoveItem:"Eliminar",labelButtonAbortItemLoad:"Cancelar",labelButtonRetryItemLoad:"Reintentar",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Deshacer",labelButtonRetryItemProcessing:"Reintentar",labelButtonProcessItem:"Subir",labelMaxFileSizeExceeded:"El archivo es demasiado grande",labelMaxFileSize:"El tama\xF1o m\xE1ximo del archivo es {filesize}",labelMaxTotalFileSizeExceeded:"Tama\xF1o total m\xE1ximo excedido",labelMaxTotalFileSize:"El tama\xF1o total m\xE1ximo del archivo es {filesize}",labelFileTypeNotAllowed:"Archivo de tipo inv\xE1lido",fileValidateTypeLabelExpectedTypes:"Espera {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagen no soportada",imageValidateSizeLabelImageSizeTooSmall:"La imagen es demasiado peque\xF1a",imageValidateSizeLabelImageSizeTooBig:"La imagen es demasiado grande",imageValidateSizeLabelExpectedMinSize:"El tama\xF1o m\xEDnimo es {minWidth} x {minHeight}",imageValidateSizeLabelExpectedMaxSize:"El tama\xF1o m\xE1ximo es {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La resoluci\xF3n es demasiado baja",imageValidateSizeLabelImageResolutionTooHigh:"La resoluci\xF3n es demasiado alta",imageValidateSizeLabelExpectedMinResolution:"La resoluci\xF3n m\xEDnima es {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La resoluci\xF3n m\xE1xima es {maxResolution}"};var Fl={labelIdle:'\u0641\u0627\u06CC\u0644 \u0631\u0627 \u0627\u06CC\u0646\u062C\u0627 \u0628\u06A9\u0634\u06CC\u062F \u0648 \u0631\u0647\u0627 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u062C\u0633\u062A\u062C\u0648 \u06A9\u0646\u06CC\u062F ',labelInvalidField:"\u0641\u06CC\u0644\u062F \u062F\u0627\u0631\u0627\u06CC \u0641\u0627\u06CC\u0644 \u0647\u0627\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",labelFileWaitingForSize:"Waiting for size",labelFileSizeNotAvailable:"\u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 \u0645\u062C\u0627\u0632 \u0646\u06CC\u0633\u062A",labelFileLoading:"\u062F\u0631\u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileLoadError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0627\u062C\u0631\u0627",labelFileProcessing:"\u062F\u0631\u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileProcessingComplete:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u06A9\u0627\u0645\u0644 \u0634\u062F",labelFileProcessingAborted:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0644\u063A\u0648 \u0634\u062F",labelFileProcessingError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileProcessingRevertError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u062D\u0630\u0641",labelFileRemoveError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u062D\u0630\u0641",labelTapToCancel:"\u0628\u0631\u0627\u06CC \u0644\u063A\u0648 \u0636\u0631\u0628\u0647 \u0628\u0632\u0646\u06CC\u062F",labelTapToRetry:"\u0628\u0631\u0627\u06CC \u062A\u06A9\u0631\u0627\u0631 \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",labelTapToUndo:"\u0628\u0631\u0627\u06CC \u0628\u0631\u06AF\u0634\u062A \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",labelButtonRemoveItem:"\u062D\u0630\u0641",labelButtonAbortItemLoad:"\u0644\u063A\u0648",labelButtonRetryItemLoad:"\u062A\u06A9\u0631\u0627\u0631",labelButtonAbortItemProcessing:"\u0644\u063A\u0648",labelButtonUndoItemProcessing:"\u0628\u0631\u06AF\u0634\u062A",labelButtonRetryItemProcessing:"\u062A\u06A9\u0631\u0627\u0631",labelButtonProcessItem:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelMaxFileSizeExceeded:"\u0641\u0627\u06CC\u0644 \u0628\u0633\u06CC\u0627\u0631 \u062D\u062C\u06CC\u0645 \u0627\u0633\u062A",labelMaxFileSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0645\u062C\u0627\u0632 \u0641\u0627\u06CC\u0644 {filesize} \u0627\u0633\u062A",labelMaxTotalFileSizeExceeded:"\u0627\u0632 \u062D\u062F\u0627\u06A9\u062B\u0631 \u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 \u0628\u06CC\u0634\u062A\u0631 \u0634\u062F",labelMaxTotalFileSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 {filesize} \u0627\u0633\u062A",labelFileTypeNotAllowed:"\u0646\u0648\u0639 \u0641\u0627\u06CC\u0644 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",fileValidateTypeLabelExpectedTypes:"\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 {allButLastType} \u06CC\u0627 {lastType}",imageValidateSizeLabelFormatError:"\u0641\u0631\u0645\u062A \u062A\u0635\u0648\u06CC\u0631 \u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0646\u0645\u06CC \u0634\u0648\u062F",imageValidateSizeLabelImageSizeTooSmall:"\u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u06A9\u0648\u0686\u06A9 \u0627\u0633\u062A",imageValidateSizeLabelImageSizeTooBig:"\u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u0628\u0632\u0631\u06AF \u0627\u0633\u062A",imageValidateSizeLabelExpectedMinSize:"\u062D\u062F\u0627\u0642\u0644 \u0627\u0646\u062F\u0627\u0632\u0647 {minWidth} \xD7 {minHeight} \u0627\u0633\u062A",imageValidateSizeLabelExpectedMaxSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0627\u0646\u062F\u0627\u0632\u0647 {maxWidth} \xD7 {maxHeight} \u0627\u0633\u062A",imageValidateSizeLabelImageResolutionTooLow:"\u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u06A9\u0645 \u0627\u0633\u062A",imageValidateSizeLabelImageResolutionTooHigh:"\u0648\u0636\u0648\u0639 \u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u0632\u06CC\u0627\u062F \u0627\u0633\u062A",imageValidateSizeLabelExpectedMinResolution:"\u062D\u062F\u0627\u0642\u0644 \u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 {minResolution} \u0627\u0633\u062A",imageValidateSizeLabelExpectedMaxResolution:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 {maxResolution} \u0627\u0633\u062A"};var zl={labelIdle:'Ved\xE4 ja pudota tiedostoja tai Selaa ',labelInvalidField:"Kent\xE4ss\xE4 on virheellisi\xE4 tiedostoja",labelFileWaitingForSize:"Odotetaan kokoa",labelFileSizeNotAvailable:"Kokoa ei saatavilla",labelFileLoading:"Ladataan",labelFileLoadError:"Virhe latauksessa",labelFileProcessing:"L\xE4hetet\xE4\xE4n",labelFileProcessingComplete:"L\xE4hetys valmis",labelFileProcessingAborted:"L\xE4hetys peruttu",labelFileProcessingError:"Virhe l\xE4hetyksess\xE4",labelFileProcessingRevertError:"Virhe palautuksessa",labelFileRemoveError:"Virhe poistamisessa",labelTapToCancel:"peruuta napauttamalla",labelTapToRetry:"yrit\xE4 uudelleen napauttamalla",labelTapToUndo:"kumoa napauttamalla",labelButtonRemoveItem:"Poista",labelButtonAbortItemLoad:"Keskeyt\xE4",labelButtonRetryItemLoad:"Yrit\xE4 uudelleen",labelButtonAbortItemProcessing:"Peruuta",labelButtonUndoItemProcessing:"Kumoa",labelButtonRetryItemProcessing:"Yrit\xE4 uudelleen",labelButtonProcessItem:"L\xE4het\xE4",labelMaxFileSizeExceeded:"Tiedoston koko on liian suuri",labelMaxFileSize:"Tiedoston maksimikoko on {filesize}",labelMaxTotalFileSizeExceeded:"Tiedostojen yhdistetty maksimikoko ylitetty",labelMaxTotalFileSize:"Tiedostojen yhdistetty maksimikoko on {filesize}",labelFileTypeNotAllowed:"Tiedostotyyppi\xE4 ei sallita",fileValidateTypeLabelExpectedTypes:"Sallitaan {allButLastType} tai {lastType}",imageValidateSizeLabelFormatError:"Kuvatyyppi\xE4 ei tueta",imageValidateSizeLabelImageSizeTooSmall:"Kuva on liian pieni",imageValidateSizeLabelImageSizeTooBig:"Kuva on liian suuri",imageValidateSizeLabelExpectedMinSize:"Minimikoko on {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimikoko on {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resoluutio on liian pieni",imageValidateSizeLabelImageResolutionTooHigh:"Resoluutio on liian suuri",imageValidateSizeLabelExpectedMinResolution:"Minimiresoluutio on {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimiresoluutio on {maxResolution}"};var Cl={labelIdle:'Faites glisser vos fichiers ou Parcourir ',labelInvalidField:"Le champ contient des fichiers invalides",labelFileWaitingForSize:"En attente de taille",labelFileSizeNotAvailable:"Taille non disponible",labelFileLoading:"Chargement",labelFileLoadError:"Erreur durant le chargement",labelFileProcessing:"Traitement",labelFileProcessingComplete:"Traitement effectu\xE9",labelFileProcessingAborted:"Traitement interrompu",labelFileProcessingError:"Erreur durant le traitement",labelFileProcessingRevertError:"Erreur durant la restauration",labelFileRemoveError:"Erreur durant la suppression",labelTapToCancel:"appuyer pour annuler",labelTapToRetry:"appuyer pour r\xE9essayer",labelTapToUndo:"appuyer pour revenir en arri\xE8re",labelButtonRemoveItem:"Retirer",labelButtonAbortItemLoad:"Annuler",labelButtonRetryItemLoad:"Recommencer",labelButtonAbortItemProcessing:"Annuler",labelButtonUndoItemProcessing:"Revenir en arri\xE8re",labelButtonRetryItemProcessing:"Recommencer",labelButtonProcessItem:"Transf\xE9rer",labelMaxFileSizeExceeded:"Le fichier est trop volumineux",labelMaxFileSize:"La taille maximale de fichier est {filesize}",labelMaxTotalFileSizeExceeded:"Taille totale maximale d\xE9pass\xE9e",labelMaxTotalFileSize:"La taille totale maximale des fichiers est {filesize}",labelFileTypeNotAllowed:"Fichier non valide",fileValidateTypeLabelExpectedTypes:"Attendu {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Type d'image non pris en charge",imageValidateSizeLabelImageSizeTooSmall:"L'image est trop petite",imageValidateSizeLabelImageSizeTooBig:"L'image est trop grande",imageValidateSizeLabelExpectedMinSize:"La taille minimale est {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La taille maximale est {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La r\xE9solution est trop faible",imageValidateSizeLabelImageResolutionTooHigh:"La r\xE9solution est trop \xE9lev\xE9e",imageValidateSizeLabelExpectedMinResolution:"La r\xE9solution minimale est {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La r\xE9solution maximale est {maxResolution}"};var Nl={labelIdle:'Mozgasd ide a f\xE1jlt a felt\xF6lt\xE9shez, vagy tall\xF3z\xE1s ',labelInvalidField:"A mez\u0151 \xE9rv\xE9nytelen f\xE1jlokat tartalmaz",labelFileWaitingForSize:"F\xE1ljm\xE9ret kisz\xE1mol\xE1sa",labelFileSizeNotAvailable:"A f\xE1jlm\xE9ret nem el\xE9rhet\u0151",labelFileLoading:"T\xF6lt\xE9s",labelFileLoadError:"Hiba a bet\xF6lt\xE9s sor\xE1n",labelFileProcessing:"Felt\xF6lt\xE9s",labelFileProcessingComplete:"Sikeres felt\xF6lt\xE9s",labelFileProcessingAborted:"A felt\xF6lt\xE9s megszak\xEDtva",labelFileProcessingError:"Hiba t\xF6rt\xE9nt a felt\xF6lt\xE9s sor\xE1n",labelFileProcessingRevertError:"Hiba a vissza\xE1ll\xEDt\xE1s sor\xE1n",labelFileRemoveError:"Hiba t\xF6rt\xE9nt az elt\xE1vol\xEDt\xE1s sor\xE1n",labelTapToCancel:"koppints a t\xF6rl\xE9shez",labelTapToRetry:"koppints az \xFAjrakezd\xE9shez",labelTapToUndo:"koppints a visszavon\xE1shoz",labelButtonRemoveItem:"Elt\xE1vol\xEDt\xE1s",labelButtonAbortItemLoad:"Megszak\xEDt\xE1s",labelButtonRetryItemLoad:"\xDAjrapr\xF3b\xE1lkoz\xE1s",labelButtonAbortItemProcessing:"Megszak\xEDt\xE1s",labelButtonUndoItemProcessing:"Visszavon\xE1s",labelButtonRetryItemProcessing:"\xDAjrapr\xF3b\xE1lkoz\xE1s",labelButtonProcessItem:"Felt\xF6lt\xE9s",labelMaxFileSizeExceeded:"A f\xE1jl t\xFAll\xE9pte a maxim\xE1lis m\xE9retet",labelMaxFileSize:"Maxim\xE1lis f\xE1jlm\xE9ret: {filesize}",labelMaxTotalFileSizeExceeded:"T\xFAll\xE9pte a maxim\xE1lis teljes m\xE9retet",labelMaxTotalFileSize:"A maxim\xE1is teljes f\xE1jlm\xE9ret: {filesize}",labelFileTypeNotAllowed:"\xC9rv\xE9nytelen t\xEDpus\xFA f\xE1jl",fileValidateTypeLabelExpectedTypes:"Enged\xE9lyezett t\xEDpusok {allButLastType} vagy {lastType}",imageValidateSizeLabelFormatError:"A k\xE9pt\xEDpus nem t\xE1mogatott",imageValidateSizeLabelImageSizeTooSmall:"A k\xE9p t\xFAl kicsi",imageValidateSizeLabelImageSizeTooBig:"A k\xE9p t\xFAl nagy",imageValidateSizeLabelExpectedMinSize:"Minimum m\xE9ret: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum m\xE9ret: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"A felbont\xE1s t\xFAl alacsony",imageValidateSizeLabelImageResolutionTooHigh:"A felbont\xE1s t\xFAl magas",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1is felbont\xE1s: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1lis felbont\xE1s: {maxResolution}"};var Bl={labelIdle:'Seret & Jatuhkan berkas Anda atau Jelajahi',labelInvalidField:"Isian berisi berkas yang tidak valid",labelFileWaitingForSize:"Menunggu ukuran berkas",labelFileSizeNotAvailable:"Ukuran berkas tidak tersedia",labelFileLoading:"Memuat",labelFileLoadError:"Kesalahan saat memuat",labelFileProcessing:"Mengunggah",labelFileProcessingComplete:"Pengunggahan selesai",labelFileProcessingAborted:"Pengunggahan dibatalkan",labelFileProcessingError:"Kesalahan saat pengunggahan",labelFileProcessingRevertError:"Kesalahan saat pemulihan",labelFileRemoveError:"Kesalahan saat penghapusan",labelTapToCancel:"ketuk untuk membatalkan",labelTapToRetry:"ketuk untuk mencoba lagi",labelTapToUndo:"ketuk untuk mengurungkan",labelButtonRemoveItem:"Hapus",labelButtonAbortItemLoad:"Batalkan",labelButtonRetryItemLoad:"Coba Kembali",labelButtonAbortItemProcessing:"Batalkan",labelButtonUndoItemProcessing:"Urungkan",labelButtonRetryItemProcessing:"Coba Kembali",labelButtonProcessItem:"Unggah",labelMaxFileSizeExceeded:"Berkas terlalu besar",labelMaxFileSize:"Ukuran berkas maksimum adalah {filesize}",labelMaxTotalFileSizeExceeded:"Jumlah berkas maksimum terlampaui",labelMaxTotalFileSize:"Jumlah berkas maksimum adalah {filesize}",labelFileTypeNotAllowed:"Jenis berkas tidak valid",fileValidateTypeLabelExpectedTypes:"Mengharapkan {allButLastType} atau {lastType}",imageValidateSizeLabelFormatError:"Jenis citra tidak didukung",imageValidateSizeLabelImageSizeTooSmall:"Citra terlalu kecil",imageValidateSizeLabelImageSizeTooBig:"Citra terlalu besar",imageValidateSizeLabelExpectedMinSize:"Ukuran minimum adalah {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Ukuran maksimum adalah {minWidth} \xD7 {minHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolusi terlalu rendah",imageValidateSizeLabelImageResolutionTooHigh:"Resolusi terlalu tinggi",imageValidateSizeLabelExpectedMinResolution:"Resolusi minimum adalah {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Resolusi maksimum adalah {maxResolution}"};var kl={labelIdle:'Trascina e rilascia i tuoi file oppure Carica ',labelInvalidField:"Il campo contiene dei file non validi",labelFileWaitingForSize:"Aspettando le dimensioni",labelFileSizeNotAvailable:"Dimensioni non disponibili",labelFileLoading:"Caricamento",labelFileLoadError:"Errore durante il caricamento",labelFileProcessing:"Caricamento",labelFileProcessingComplete:"Caricamento completato",labelFileProcessingAborted:"Caricamento cancellato",labelFileProcessingError:"Errore durante il caricamento",labelFileProcessingRevertError:"Errore durante il ripristino",labelFileRemoveError:"Errore durante l'eliminazione",labelTapToCancel:"tocca per cancellare",labelTapToRetry:"tocca per riprovare",labelTapToUndo:"tocca per ripristinare",labelButtonRemoveItem:"Elimina",labelButtonAbortItemLoad:"Cancella",labelButtonRetryItemLoad:"Ritenta",labelButtonAbortItemProcessing:"Camcella",labelButtonUndoItemProcessing:"Indietro",labelButtonRetryItemProcessing:"Ritenta",labelButtonProcessItem:"Carica",labelMaxFileSizeExceeded:"Il peso del file \xE8 eccessivo",labelMaxFileSize:"Il peso massimo del file \xE8 {filesize}",labelMaxTotalFileSizeExceeded:"Dimensione totale massima superata",labelMaxTotalFileSize:"La dimensione massima totale del file \xE8 {filesize}",labelFileTypeNotAllowed:"File non supportato",fileValidateTypeLabelExpectedTypes:"Aspetta {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipo di immagine non compatibile",imageValidateSizeLabelImageSizeTooSmall:"L'immagine \xE8 troppo piccola",imageValidateSizeLabelImageSizeTooBig:"L'immagine \xE8 troppo grande",imageValidateSizeLabelExpectedMinSize:"La dimensione minima \xE8 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La dimensione massima \xE8 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La risoluzione \xE8 troppo bassa",imageValidateSizeLabelImageResolutionTooHigh:"La risoluzione \xE8 troppo alta",imageValidateSizeLabelExpectedMinResolution:"La risoluzione minima \xE8 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La risoluzione massima \xE8 {maxResolution}"};var Vl={labelIdle:'\u1791\u17B6\u1789&\u178A\u17B6\u1780\u17CB\u17A0\u17D2\u179C\u17B6\u179B\u17CB\u17AF\u1780\u179F\u17B6\u179A\u179A\u1794\u179F\u17CB\u17A2\u17D2\u1793\u1780 \u17AC \u179F\u17D2\u179C\u17C2\u1784\u179A\u1780 ',labelInvalidField:"\u1785\u1793\u17D2\u179B\u17C4\u17C7\u1798\u17B6\u1793\u17AF\u1780\u179F\u17B6\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",labelFileWaitingForSize:"\u1780\u17C6\u1796\u17BB\u1784\u179A\u1784\u17CB\u1785\u17B6\u17C6\u1791\u17C6\u17A0\u17C6",labelFileSizeNotAvailable:"\u1791\u17C6\u17A0\u17C6\u1798\u17B7\u1793\u17A2\u17B6\u1785\u1794\u17D2\u179A\u17BE\u1794\u17B6\u1793",labelFileLoading:"\u1780\u17C6\u1796\u17BB\u1784\u178A\u17C6\u178E\u17BE\u179A\u1780\u17B6\u179A",labelFileLoadError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178A\u17C6\u178E\u17BE\u179A\u1780\u17B6\u179A",labelFileProcessing:"\u1780\u17C6\u1796\u17BB\u1784\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelFileProcessingComplete:"\u1780\u17B6\u179A\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784\u1796\u17C1\u1789\u179B\u17C1\u1789",labelFileProcessingAborted:"\u1780\u17B6\u179A\u1794\u1784\u17D2\u17A0\u17C4\u17C7\u178F\u17D2\u179A\u17BC\u179C\u1794\u17B6\u1793\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelFileProcessingError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u1780\u17C6\u1796\u17BB\u1784\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelFileProcessingRevertError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178F\u17D2\u179A\u17A1\u1794\u17CB",labelFileRemoveError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178A\u1780\u1785\u17C1\u1789",labelTapToCancel:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelTapToRetry:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelTapToUndo:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1798\u17B7\u1793\u1792\u17D2\u179C\u17BE\u179C\u17B7\u1789",labelButtonRemoveItem:"\u1799\u1780\u1785\u17C1\u1789",labelButtonAbortItemLoad:"\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelButtonRetryItemLoad:"\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelButtonAbortItemProcessing:"\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelButtonUndoItemProcessing:"\u1798\u17B7\u1793\u1792\u17D2\u179C\u17BE\u179C\u17B7\u1789",labelButtonRetryItemProcessing:"\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelButtonProcessItem:"\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelMaxFileSizeExceeded:"\u17AF\u1780\u179F\u17B6\u179A\u1792\u17C6\u1796\u17C1\u1780",labelMaxFileSize:"\u1791\u17C6\u17A0\u17C6\u17AF\u1780\u179F\u17B6\u179A\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {filesize}",labelMaxTotalFileSizeExceeded:"\u179B\u17BE\u179F\u1791\u17C6\u17A0\u17C6\u179F\u179A\u17BB\u1794\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6",labelMaxTotalFileSize:"\u1791\u17C6\u17A0\u17C6\u17AF\u1780\u179F\u17B6\u179A\u179F\u179A\u17BB\u1794\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {filesize}",labelFileTypeNotAllowed:"\u1794\u17D2\u179A\u1797\u17C1\u1791\u17AF\u1780\u179F\u17B6\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",fileValidateTypeLabelExpectedTypes:"\u179A\u17C6\u1796\u17B9\u1784\u1790\u17B6 {allButLastType} \u17AC {lastType}",imageValidateSizeLabelFormatError:"\u1794\u17D2\u179A\u1797\u17C1\u1791\u179A\u17BC\u1794\u1797\u17B6\u1796\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",imageValidateSizeLabelImageSizeTooSmall:"\u179A\u17BC\u1794\u1797\u17B6\u1796\u178F\u17BC\u1785\u1796\u17C1\u1780",imageValidateSizeLabelImageSizeTooBig:"\u179A\u17BC\u1794\u1797\u17B6\u1796\u1792\u17C6\u1796\u17C1\u1780",imageValidateSizeLabelExpectedMinSize:"\u1791\u17C6\u17A0\u17C6\u17A2\u1794\u17D2\u1794\u1794\u179A\u1798\u17B6\u1782\u17BA {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u1791\u17C6\u17A0\u17C6\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u1791\u17B6\u1794\u1796\u17C1\u1780",imageValidateSizeLabelImageResolutionTooHigh:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u1781\u17D2\u1796\u179F\u17CB\u1796\u17C1\u1780",imageValidateSizeLabelExpectedMinResolution:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u17A2\u1794\u17D2\u1794\u1794\u179A\u1798\u17B6\u1782\u17BA {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {maxResolution}"};var Gl={labelIdle:'Drag & Drop je bestanden of Bladeren ',labelInvalidField:"Veld bevat ongeldige bestanden",labelFileWaitingForSize:"Wachten op grootte",labelFileSizeNotAvailable:"Grootte niet beschikbaar",labelFileLoading:"Laden",labelFileLoadError:"Fout tijdens laden",labelFileProcessing:"Uploaden",labelFileProcessingComplete:"Upload afgerond",labelFileProcessingAborted:"Upload geannuleerd",labelFileProcessingError:"Fout tijdens upload",labelFileProcessingRevertError:"Fout bij herstellen",labelFileRemoveError:"Fout bij verwijderen",labelTapToCancel:"tik om te annuleren",labelTapToRetry:"tik om opnieuw te proberen",labelTapToUndo:"tik om ongedaan te maken",labelButtonRemoveItem:"Verwijderen",labelButtonAbortItemLoad:"Afbreken",labelButtonRetryItemLoad:"Opnieuw proberen",labelButtonAbortItemProcessing:"Annuleren",labelButtonUndoItemProcessing:"Ongedaan maken",labelButtonRetryItemProcessing:"Opnieuw proberen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Bestand is te groot",labelMaxFileSize:"Maximale bestandsgrootte is {filesize}",labelMaxTotalFileSizeExceeded:"Maximale totale grootte overschreden",labelMaxTotalFileSize:"Maximale totale bestandsgrootte is {filesize}",labelFileTypeNotAllowed:"Ongeldig bestandstype",fileValidateTypeLabelExpectedTypes:"Verwacht {allButLastType} of {lastType}",imageValidateSizeLabelFormatError:"Afbeeldingstype niet ondersteund",imageValidateSizeLabelImageSizeTooSmall:"Afbeelding is te klein",imageValidateSizeLabelImageSizeTooBig:"Afbeelding is te groot",imageValidateSizeLabelExpectedMinSize:"Minimale afmeting is {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximale afmeting is {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolutie is te laag",imageValidateSizeLabelImageResolutionTooHigh:"Resolution is too high",imageValidateSizeLabelExpectedMinResolution:"Minimale resolutie is {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximale resolutie is {maxResolution}"};var Ul={labelIdle:'Dra og slipp filene dine, eller Bla gjennom... ',labelInvalidField:"Feltet inneholder ugyldige filer",labelFileWaitingForSize:"Venter p\xE5 st\xF8rrelse",labelFileSizeNotAvailable:"St\xF8rrelse ikke tilgjengelig",labelFileLoading:"Laster",labelFileLoadError:"Feil under lasting",labelFileProcessing:"Laster opp",labelFileProcessingComplete:"Opplasting ferdig",labelFileProcessingAborted:"Opplasting avbrutt",labelFileProcessingError:"Feil under opplasting",labelFileProcessingRevertError:"Feil under reversering",labelFileRemoveError:"Feil under flytting",labelTapToCancel:"klikk for \xE5 avbryte",labelTapToRetry:"klikk for \xE5 pr\xF8ve p\xE5 nytt",labelTapToUndo:"klikk for \xE5 angre",labelButtonRemoveItem:"Fjern",labelButtonAbortItemLoad:"Avbryt",labelButtonRetryItemLoad:"Pr\xF8v p\xE5 nytt",labelButtonAbortItemProcessing:"Avbryt",labelButtonUndoItemProcessing:"Angre",labelButtonRetryItemProcessing:"Pr\xF8v p\xE5 nytt",labelButtonProcessItem:"Last opp",labelMaxFileSizeExceeded:"Filen er for stor",labelMaxFileSize:"Maksimal filst\xF8rrelse er {filesize}",labelMaxTotalFileSizeExceeded:"Maksimal total st\xF8rrelse oversteget",labelMaxTotalFileSize:"Maksimal total st\xF8rrelse er {filesize}",labelFileTypeNotAllowed:"Ugyldig filtype",fileValidateTypeLabelExpectedTypes:"Forventer {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Bildeformat ikke st\xF8ttet",imageValidateSizeLabelImageSizeTooSmall:"Bildet er for lite",imageValidateSizeLabelImageSizeTooBig:"Bildet er for stort",imageValidateSizeLabelExpectedMinSize:"Minimumsst\xF8rrelse er {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimumsst\xF8rrelse er {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Oppl\xF8sningen er for lav",imageValidateSizeLabelImageResolutionTooHigh:"Oppl\xF8sningen er for h\xF8y",imageValidateSizeLabelExpectedMinResolution:"Minimum oppl\xF8sning er {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimal oppl\xF8sning er {maxResolution}"};var Wl={labelIdle:'Przeci\u0105gnij i upu\u015B\u0107 lub wybierz pliki',labelInvalidField:"Nieprawid\u0142owe pliki",labelFileWaitingForSize:"Pobieranie rozmiaru",labelFileSizeNotAvailable:"Nieznany rozmiar",labelFileLoading:"Wczytywanie",labelFileLoadError:"B\u0142\u0105d wczytywania",labelFileProcessing:"Przesy\u0142anie",labelFileProcessingComplete:"Przes\u0142ano",labelFileProcessingAborted:"Przerwano",labelFileProcessingError:"Przesy\u0142anie nie powiod\u0142o si\u0119",labelFileProcessingRevertError:"Co\u015B posz\u0142o nie tak",labelFileRemoveError:"Nieudane usuni\u0119cie",labelTapToCancel:"Anuluj",labelTapToRetry:"Pon\xF3w",labelTapToUndo:"Cofnij",labelButtonRemoveItem:"Usu\u0144",labelButtonAbortItemLoad:"Przerwij",labelButtonRetryItemLoad:"Pon\xF3w",labelButtonAbortItemProcessing:"Anuluj",labelButtonUndoItemProcessing:"Cofnij",labelButtonRetryItemProcessing:"Pon\xF3w",labelButtonProcessItem:"Prze\u015Blij",labelMaxFileSizeExceeded:"Plik jest zbyt du\u017Cy",labelMaxFileSize:"Dopuszczalna wielko\u015B\u0107 pliku to {filesize}",labelMaxTotalFileSizeExceeded:"Przekroczono \u0142\u0105czny rozmiar plik\xF3w",labelMaxTotalFileSize:"\u0141\u0105czny rozmiar plik\xF3w nie mo\u017Ce przekroczy\u0107 {filesize}",labelFileTypeNotAllowed:"Niedozwolony rodzaj pliku",fileValidateTypeLabelExpectedTypes:"Oczekiwano {allButLastType} lub {lastType}",imageValidateSizeLabelFormatError:"Nieobs\u0142ugiwany format obrazu",imageValidateSizeLabelImageSizeTooSmall:"Obraz jest zbyt ma\u0142y",imageValidateSizeLabelImageSizeTooBig:"Obraz jest zbyt du\u017Cy",imageValidateSizeLabelExpectedMinSize:"Minimalne wymiary obrazu to {minWidth}\xD7{minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksymalna wymiary obrazu to {maxWidth}\xD7{maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozdzielczo\u015B\u0107 jest zbyt niska",imageValidateSizeLabelImageResolutionTooHigh:"Rozdzielczo\u015B\u0107 jest zbyt wysoka",imageValidateSizeLabelExpectedMinResolution:"Minimalna rozdzielczo\u015B\u0107 to {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksymalna rozdzielczo\u015B\u0107 to {maxResolution}"};var Ri={labelIdle:'Arraste e solte os arquivos ou Clique aqui ',labelInvalidField:"Arquivos inv\xE1lidos",labelFileWaitingForSize:"Calculando o tamanho do arquivo",labelFileSizeNotAvailable:"Tamanho do arquivo indispon\xEDvel",labelFileLoading:"Carregando",labelFileLoadError:"Erro durante o carregamento",labelFileProcessing:"Enviando",labelFileProcessingComplete:"Envio finalizado",labelFileProcessingAborted:"Envio cancelado",labelFileProcessingError:"Erro durante o envio",labelFileProcessingRevertError:"Erro ao reverter o envio",labelFileRemoveError:"Erro ao remover o arquivo",labelTapToCancel:"clique para cancelar",labelTapToRetry:"clique para reenviar",labelTapToUndo:"clique para desfazer",labelButtonRemoveItem:"Remover",labelButtonAbortItemLoad:"Abortar",labelButtonRetryItemLoad:"Reenviar",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Desfazer",labelButtonRetryItemProcessing:"Reenviar",labelButtonProcessItem:"Enviar",labelMaxFileSizeExceeded:"Arquivo \xE9 muito grande",labelMaxFileSize:"O tamanho m\xE1ximo permitido: {filesize}",labelMaxTotalFileSizeExceeded:"Tamanho total dos arquivos excedido",labelMaxTotalFileSize:"Tamanho total permitido: {filesize}",labelFileTypeNotAllowed:"Tipo de arquivo inv\xE1lido",fileValidateTypeLabelExpectedTypes:"Tipos de arquivo suportados s\xE3o {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagem inv\xE1lida",imageValidateSizeLabelImageSizeTooSmall:"Imagem muito pequena",imageValidateSizeLabelImageSizeTooBig:"Imagem muito grande",imageValidateSizeLabelExpectedMinSize:"Tamanho m\xEDnimo permitida: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Tamanho m\xE1ximo permitido: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolu\xE7\xE3o muito baixa",imageValidateSizeLabelImageResolutionTooHigh:"Resolu\xE7\xE3o muito alta",imageValidateSizeLabelExpectedMinResolution:"Resolu\xE7\xE3o m\xEDnima permitida: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Resolu\xE7\xE3o m\xE1xima permitida: {maxResolution}"};var Hl={labelIdle:'Trage \u0219i plaseaz\u0103 fi\u0219iere sau Caut\u0103-le ',labelInvalidField:"C\xE2mpul con\u021Bine fi\u0219iere care nu sunt valide",labelFileWaitingForSize:"\xCEn a\u0219teptarea dimensiunii",labelFileSizeNotAvailable:"Dimensiunea nu este diponibil\u0103",labelFileLoading:"Se \xEEncarc\u0103",labelFileLoadError:"Eroare la \xEEnc\u0103rcare",labelFileProcessing:"Se \xEEncarc\u0103",labelFileProcessingComplete:"\xCEnc\u0103rcare finalizat\u0103",labelFileProcessingAborted:"\xCEnc\u0103rcare anulat\u0103",labelFileProcessingError:"Eroare la \xEEnc\u0103rcare",labelFileProcessingRevertError:"Eroare la anulare",labelFileRemoveError:"Eroare la \u015Ftergere",labelTapToCancel:"apas\u0103 pentru a anula",labelTapToRetry:"apas\u0103 pentru a re\xEEncerca",labelTapToUndo:"apas\u0103 pentru a anula",labelButtonRemoveItem:"\u015Eterge",labelButtonAbortItemLoad:"Anuleaz\u0103",labelButtonRetryItemLoad:"Re\xEEncearc\u0103",labelButtonAbortItemProcessing:"Anuleaz\u0103",labelButtonUndoItemProcessing:"Anuleaz\u0103",labelButtonRetryItemProcessing:"Re\xEEncearc\u0103",labelButtonProcessItem:"\xCEncarc\u0103",labelMaxFileSizeExceeded:"Fi\u0219ierul este prea mare",labelMaxFileSize:"Dimensiunea maxim\u0103 a unui fi\u0219ier este de {filesize}",labelMaxTotalFileSizeExceeded:"Dimensiunea total\u0103 maxim\u0103 a fost dep\u0103\u0219it\u0103",labelMaxTotalFileSize:"Dimensiunea total\u0103 maxim\u0103 a fi\u0219ierelor este de {filesize}",labelFileTypeNotAllowed:"Tipul fi\u0219ierului nu este valid",fileValidateTypeLabelExpectedTypes:"Se a\u0219teapt\u0103 {allButLastType} sau {lastType}",imageValidateSizeLabelFormatError:"Formatul imaginii nu este acceptat",imageValidateSizeLabelImageSizeTooSmall:"Imaginea este prea mic\u0103",imageValidateSizeLabelImageSizeTooBig:"Imaginea este prea mare",imageValidateSizeLabelExpectedMinSize:"M\u0103rimea minim\u0103 este de {maxWidth} x {maxHeight}",imageValidateSizeLabelExpectedMaxSize:"M\u0103rimea maxim\u0103 este de {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezolu\u021Bia este prea mic\u0103",imageValidateSizeLabelImageResolutionTooHigh:"Rezolu\u021Bia este prea mare",imageValidateSizeLabelExpectedMinResolution:"Rezolu\u021Bia minim\u0103 este de {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Rezolu\u021Bia maxim\u0103 este de {maxResolution}"};var jl={labelIdle:'\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B \u0438\u043B\u0438 \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 ',labelInvalidField:"\u041F\u043E\u043B\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0444\u0430\u0439\u043B\u044B",labelFileWaitingForSize:"\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0440\u0430\u0437\u043C\u0435\u0440",labelFileSizeNotAvailable:"\u0420\u0430\u0437\u043C\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",labelFileLoading:"\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435",labelFileLoadError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0438",labelFileProcessing:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",labelFileProcessingComplete:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430",labelFileProcessingAborted:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430",labelFileProcessingError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435",labelFileProcessingRevertError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0442\u0435",labelFileRemoveError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438",labelTapToCancel:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B",labelTapToRetry:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelTapToUndo:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",labelButtonRemoveItem:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",labelButtonAbortItemLoad:"\u041F\u0440\u0435\u043A\u0440\u0430\u0449\u0435\u043D\u043E",labelButtonRetryItemLoad:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelButtonAbortItemProcessing:"\u041E\u0442\u043C\u0435\u043D\u0430",labelButtonUndoItemProcessing:"\u041E\u0442\u043C\u0435\u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",labelButtonRetryItemProcessing:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelButtonProcessItem:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",labelMaxFileSizeExceeded:"\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439",labelMaxFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430: {filesize}",labelMaxTotalFileSizeExceeded:"\u041F\u0440\u0435\u0432\u044B\u0448\u0435\u043D \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440",labelMaxTotalFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430: {filesize}",labelFileTypeNotAllowed:"\u0424\u0430\u0439\u043B \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u0442\u0438\u043F\u0430",fileValidateTypeLabelExpectedTypes:"\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F {allButLastType} \u0438\u043B\u0438 {lastType}",imageValidateSizeLabelFormatError:"\u0422\u0438\u043F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",imageValidateSizeLabelImageSizeTooSmall:"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435",imageValidateSizeLabelImageSizeTooBig:"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435",imageValidateSizeLabelExpectedMinSize:"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043D\u0438\u0437\u043A\u043E\u0435",imageValidateSizeLabelImageResolutionTooHigh:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0432\u044B\u0441\u043E\u043A\u043E\u0435",imageValidateSizeLabelExpectedMinResolution:"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435: {maxResolution}"};var Yl={labelIdle:'Drag och sl\xE4pp dina filer eller Bl\xE4ddra ',labelInvalidField:"F\xE4ltet inneh\xE5ller felaktiga filer",labelFileWaitingForSize:"V\xE4ntar p\xE5 storlek",labelFileSizeNotAvailable:"Storleken finns inte tillg\xE4nglig",labelFileLoading:"Laddar",labelFileLoadError:"Fel under laddning",labelFileProcessing:"Laddar upp",labelFileProcessingComplete:"Uppladdning klar",labelFileProcessingAborted:"Uppladdning avbruten",labelFileProcessingError:"Fel under uppladdning",labelFileProcessingRevertError:"Fel under \xE5terst\xE4llning",labelFileRemoveError:"Fel under borttagning",labelTapToCancel:"tryck f\xF6r att avbryta",labelTapToRetry:"tryck f\xF6r att f\xF6rs\xF6ka igen",labelTapToUndo:"tryck f\xF6r att \xE5ngra",labelButtonRemoveItem:"Tabort",labelButtonAbortItemLoad:"Avbryt",labelButtonRetryItemLoad:"F\xF6rs\xF6k igen",labelButtonAbortItemProcessing:"Avbryt",labelButtonUndoItemProcessing:"\xC5ngra",labelButtonRetryItemProcessing:"F\xF6rs\xF6k igen",labelButtonProcessItem:"Ladda upp",labelMaxFileSizeExceeded:"Filen \xE4r f\xF6r stor",labelMaxFileSize:"St\xF6rsta till\xE5tna filstorlek \xE4r {filesize}",labelMaxTotalFileSizeExceeded:"Maximal uppladdningsstorlek uppn\xE5d",labelMaxTotalFileSize:"Maximal uppladdningsstorlek \xE4r {filesize}",labelFileTypeNotAllowed:"Felaktig filtyp",fileValidateTypeLabelExpectedTypes:"Godk\xE4nda filtyper {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Bildtypen saknar st\xF6d",imageValidateSizeLabelImageSizeTooSmall:"Bilden \xE4r f\xF6r liten",imageValidateSizeLabelImageSizeTooBig:"Bilden \xE4r f\xF6r stor",imageValidateSizeLabelExpectedMinSize:"Minimal storlek \xE4r {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximal storlek \xE4r {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Uppl\xF6sningen \xE4r f\xF6r l\xE5g",imageValidateSizeLabelImageResolutionTooHigh:"Uppl\xF6sningen \xE4r f\xF6r h\xF6g",imageValidateSizeLabelExpectedMinResolution:"Minsta till\xE5tna uppl\xF6sning \xE4r {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"H\xF6gsta till\xE5tna uppl\xF6sning \xE4r {maxResolution}"};var ql={labelIdle:'Dosyan\u0131z\u0131 S\xFCr\xFCkleyin & B\u0131rak\u0131n ya da Se\xE7in ',labelInvalidField:"Alan ge\xE7ersiz dosyalar i\xE7eriyor",labelFileWaitingForSize:"Boyut hesaplan\u0131yor",labelFileSizeNotAvailable:"Boyut mevcut de\u011Fil",labelFileLoading:"Y\xFCkleniyor",labelFileLoadError:"Y\xFCkleme s\u0131ras\u0131nda hata olu\u015Ftu",labelFileProcessing:"Y\xFCkleniyor",labelFileProcessingComplete:"Y\xFCkleme tamamland\u0131",labelFileProcessingAborted:"Y\xFCkleme iptal edildi",labelFileProcessingError:"Y\xFCklerken hata olu\u015Ftu",labelFileProcessingRevertError:"Geri \xE7ekerken hata olu\u015Ftu",labelFileRemoveError:"Kald\u0131r\u0131rken hata olu\u015Ftu",labelTapToCancel:"\u0130ptal etmek i\xE7in t\u0131klay\u0131n",labelTapToRetry:"Tekrar denemek i\xE7in t\u0131klay\u0131n",labelTapToUndo:"Geri almak i\xE7in t\u0131klay\u0131n",labelButtonRemoveItem:"Kald\u0131r",labelButtonAbortItemLoad:"\u0130ptal Et",labelButtonRetryItemLoad:"Tekrar dene",labelButtonAbortItemProcessing:"\u0130ptal et",labelButtonUndoItemProcessing:"Geri Al",labelButtonRetryItemProcessing:"Tekrar dene",labelButtonProcessItem:"Y\xFCkle",labelMaxFileSizeExceeded:"Dosya \xE7ok b\xFCy\xFCk",labelMaxFileSize:"En fazla dosya boyutu: {filesize}",labelMaxTotalFileSizeExceeded:"Maximum boyut a\u015F\u0131ld\u0131",labelMaxTotalFileSize:"Maximum dosya boyutu :{filesize}",labelFileTypeNotAllowed:"Ge\xE7ersiz dosya tipi",fileValidateTypeLabelExpectedTypes:"\u015Eu {allButLastType} ya da \u015Fu dosya olmas\u0131 gerekir: {lastType}",imageValidateSizeLabelFormatError:"Resim tipi desteklenmiyor",imageValidateSizeLabelImageSizeTooSmall:"Resim \xE7ok k\xFC\xE7\xFCk",imageValidateSizeLabelImageSizeTooBig:"Resim \xE7ok b\xFCy\xFCk",imageValidateSizeLabelExpectedMinSize:"Minimum boyut {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum boyut {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\xC7\xF6z\xFCn\xFCrl\xFCk \xE7ok d\xFC\u015F\xFCk",imageValidateSizeLabelImageResolutionTooHigh:"\xC7\xF6z\xFCn\xFCrl\xFCk \xE7ok y\xFCksek",imageValidateSizeLabelExpectedMinResolution:"Minimum \xE7\xF6z\xFCn\xFCrl\xFCk {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum \xE7\xF6z\xFCn\xFCrl\xFCk {maxResolution}"};var $l={labelIdle:'\u041F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0456\u0442\u044C \u0444\u0430\u0439\u043B\u0438 \u0430\u0431\u043E \u0432\u0438\u0431\u0435\u0440\u0456\u0442\u044C ',labelInvalidField:"\u041F\u043E\u043B\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0456 \u0444\u0430\u0439\u043B\u0438",labelFileWaitingForSize:"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0440\u043E\u0437\u043C\u0456\u0440",labelFileSizeNotAvailable:"\u0420\u043E\u0437\u043C\u0456\u0440 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",labelFileLoading:"\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F",labelFileLoadError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u0456",labelFileProcessing:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",labelFileProcessingComplete:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",labelFileProcessingAborted:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E",labelFileProcessingError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u0456",labelFileProcessingRevertError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0456",labelFileRemoveError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u0456",labelTapToCancel:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelTapToRetry:"\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelTapToUndo:"\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0434\u0456\u044E",labelButtonRemoveItem:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438",labelButtonAbortItemLoad:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelButtonRetryItemLoad:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelButtonAbortItemProcessing:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelButtonUndoItemProcessing:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0434\u0456\u044E",labelButtonRetryItemProcessing:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelButtonProcessItem:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",labelMaxFileSizeExceeded:"\u0424\u0430\u0439\u043B \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0438\u0439",labelMaxFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440 \u0444\u0430\u0439\u043B\u0443: {filesize}",labelMaxTotalFileSizeExceeded:"\u041F\u0435\u0440\u0435\u0432\u0438\u0449\u0435\u043D\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440",labelMaxTotalFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {filesize}",labelFileTypeNotAllowed:"\u0424\u043E\u0440\u043C\u0430\u0442 \u0444\u0430\u0439\u043B\u0443 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",fileValidateTypeLabelExpectedTypes:"\u041E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F {allButLastType} \u0430\u0431\u043E {lastType}",imageValidateSizeLabelFormatError:"\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",imageValidateSizeLabelImageSizeTooSmall:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0435",imageValidateSizeLabelImageSizeTooBig:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435",imageValidateSizeLabelExpectedMinSize:"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456",imageValidateSizeLabelImageResolutionTooHigh:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0456",imageValidateSizeLabelExpectedMinResolution:"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0438: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0438: {maxResolution}"};var Xl={labelIdle:'K\xE9o th\u1EA3 t\u1EC7p c\u1EE7a b\u1EA1n ho\u1EB7c T\xECm ki\u1EBFm ',labelInvalidField:"Tr\u01B0\u1EDDng ch\u1EE9a c\xE1c t\u1EC7p kh\xF4ng h\u1EE3p l\u1EC7",labelFileWaitingForSize:"\u0110ang ch\u1EDD k\xEDch th\u01B0\u1EDBc",labelFileSizeNotAvailable:"K\xEDch th\u01B0\u1EDBc kh\xF4ng c\xF3 s\u1EB5n",labelFileLoading:"\u0110ang t\u1EA3i",labelFileLoadError:"L\u1ED7i khi t\u1EA3i",labelFileProcessing:"\u0110ang t\u1EA3i l\xEAn",labelFileProcessingComplete:"T\u1EA3i l\xEAn th\xE0nh c\xF4ng",labelFileProcessingAborted:"\u0110\xE3 hu\u1EF7 t\u1EA3i l\xEAn",labelFileProcessingError:"L\u1ED7i khi t\u1EA3i l\xEAn",labelFileProcessingRevertError:"L\u1ED7i khi ho\xE0n nguy\xEAn",labelFileRemoveError:"L\u1ED7i khi x\xF3a",labelTapToCancel:"nh\u1EA5n \u0111\u1EC3 h\u1EE7y",labelTapToRetry:"nh\u1EA5n \u0111\u1EC3 th\u1EED l\u1EA1i",labelTapToUndo:"nh\u1EA5n \u0111\u1EC3 ho\xE0n t\xE1c",labelButtonRemoveItem:"Xo\xE1",labelButtonAbortItemLoad:"Hu\u1EF7 b\u1ECF",labelButtonRetryItemLoad:"Th\u1EED l\u1EA1i",labelButtonAbortItemProcessing:"H\u1EE7y b\u1ECF",labelButtonUndoItemProcessing:"Ho\xE0n t\xE1c",labelButtonRetryItemProcessing:"Th\u1EED l\u1EA1i",labelButtonProcessItem:"T\u1EA3i l\xEAn",labelMaxFileSizeExceeded:"T\u1EADp tin qu\xE1 l\u1EDBn",labelMaxFileSize:"K\xEDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a l\xE0 {filesize}",labelMaxTotalFileSizeExceeded:"\u0110\xE3 v\u01B0\u1EE3t qu\xE1 t\u1ED5ng k\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a",labelMaxTotalFileSize:"T\u1ED5ng k\xEDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a l\xE0 {filesize}",labelFileTypeNotAllowed:"T\u1EC7p thu\u1ED9c lo\u1EA1i kh\xF4ng h\u1EE3p l\u1EC7",fileValidateTypeLabelExpectedTypes:"Ki\u1EC3u t\u1EC7p h\u1EE3p l\u1EC7 l\xE0 {allButLastType} ho\u1EB7c {lastType}",imageValidateSizeLabelFormatError:"Lo\u1EA1i h\xECnh \u1EA3nh kh\xF4ng \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3",imageValidateSizeLabelImageSizeTooSmall:"H\xECnh \u1EA3nh qu\xE1 nh\u1ECF",imageValidateSizeLabelImageSizeTooBig:"H\xECnh \u1EA3nh qu\xE1 l\u1EDBn",imageValidateSizeLabelExpectedMinSize:"K\xEDch th\u01B0\u1EDBc t\u1ED1i thi\u1EC3u l\xE0 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"K\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a l\xE0 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0110\u1ED9 ph\xE2n gi\u1EA3i qu\xE1 th\u1EA5p",imageValidateSizeLabelImageResolutionTooHigh:"\u0110\u1ED9 ph\xE2n gi\u1EA3i qu\xE1 cao",imageValidateSizeLabelExpectedMinResolution:"\u0110\u1ED9 ph\xE2n gi\u1EA3i t\u1ED1i thi\u1EC3u l\xE0 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0110\u1ED9 ph\xE2n gi\u1EA3i t\u1ED1i \u0111a l\xE0 {maxResolution}"};var Ql={labelIdle:'\u62D6\u653E\u6587\u4EF6\uFF0C\u6216\u8005 \u6D4F\u89C8 ',labelInvalidField:"\u5B57\u6BB5\u5305\u542B\u65E0\u6548\u6587\u4EF6",labelFileWaitingForSize:"\u8BA1\u7B97\u6587\u4EF6\u5927\u5C0F",labelFileSizeNotAvailable:"\u6587\u4EF6\u5927\u5C0F\u4E0D\u53EF\u7528",labelFileLoading:"\u52A0\u8F7D",labelFileLoadError:"\u52A0\u8F7D\u9519\u8BEF",labelFileProcessing:"\u4E0A\u4F20",labelFileProcessingComplete:"\u5DF2\u4E0A\u4F20",labelFileProcessingAborted:"\u4E0A\u4F20\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u4F20\u51FA\u9519",labelFileProcessingRevertError:"\u8FD8\u539F\u51FA\u9519",labelFileRemoveError:"\u5220\u9664\u51FA\u9519",labelTapToCancel:"\u70B9\u51FB\u53D6\u6D88",labelTapToRetry:"\u70B9\u51FB\u91CD\u8BD5",labelTapToUndo:"\u70B9\u51FB\u64A4\u6D88",labelButtonRemoveItem:"\u5220\u9664",labelButtonAbortItemLoad:"\u4E2D\u6B62",labelButtonRetryItemLoad:"\u91CD\u8BD5",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u64A4\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8BD5",labelButtonProcessItem:"\u4E0A\u4F20",labelMaxFileSizeExceeded:"\u6587\u4EF6\u592A\u5927",labelMaxFileSize:"\u6700\u5927\u503C: {filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u8FC7\u6700\u5927\u6587\u4EF6\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u6587\u4EF6\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u6587\u4EF6\u7C7B\u578B\u65E0\u6548",fileValidateTypeLabelExpectedTypes:"\u5E94\u4E3A {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u56FE\u50CF\u7C7B\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u56FE\u50CF\u592A\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u56FE\u50CF\u592A\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u503C: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u503C: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u5206\u8FA8\u7387\u592A\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u5206\u8FA8\u7387\u592A\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u5C0F\u5206\u8FA8\u7387\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u5927\u5206\u8FA8\u7387\uFF1A{maxResolution}"};var Zl={labelIdle:'\u62D6\u653E\u6A94\u6848\uFF0C\u6216\u8005 \u700F\u89BD ',labelInvalidField:"\u4E0D\u652F\u63F4\u6B64\u6A94\u6848",labelFileWaitingForSize:"\u6B63\u5728\u8A08\u7B97\u6A94\u6848\u5927\u5C0F",labelFileSizeNotAvailable:"\u6A94\u6848\u5927\u5C0F\u4E0D\u7B26",labelFileLoading:"\u8B80\u53D6\u4E2D",labelFileLoadError:"\u8B80\u53D6\u932F\u8AA4",labelFileProcessing:"\u4E0A\u50B3",labelFileProcessingComplete:"\u5DF2\u4E0A\u50B3",labelFileProcessingAborted:"\u4E0A\u50B3\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u50B3\u767C\u751F\u932F\u8AA4",labelFileProcessingRevertError:"\u9084\u539F\u932F\u8AA4",labelFileRemoveError:"\u522A\u9664\u932F\u8AA4",labelTapToCancel:"\u9EDE\u64CA\u53D6\u6D88",labelTapToRetry:"\u9EDE\u64CA\u91CD\u8A66",labelTapToUndo:"\u9EDE\u64CA\u9084\u539F",labelButtonRemoveItem:"\u522A\u9664",labelButtonAbortItemLoad:"\u505C\u6B62",labelButtonRetryItemLoad:"\u91CD\u8A66",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u53D6\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8A66",labelButtonProcessItem:"\u4E0A\u50B3",labelMaxFileSizeExceeded:"\u6A94\u6848\u904E\u5927",labelMaxFileSize:"\u6700\u5927\u503C\uFF1A{filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u904E\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u4E0D\u652F\u63F4\u6B64\u985E\u578B\u6A94\u6848",fileValidateTypeLabelExpectedTypes:"\u61C9\u70BA {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u6B64\u985E\u5716\u7247\u985E\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u5716\u7247\u904E\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u5716\u7247\u904E\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u5C3A\u5BF8\uFF1A{minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u5C3A\u5BF8\uFF1A{maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u89E3\u6790\u5EA6\u904E\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u89E3\u6790\u5EA6\u904E\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u4F4E\u89E3\u6790\u5EA6\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u9AD8\u89E3\u6790\u5EA6\uFF1A{maxResolution}"};Ie(Wo);Ie(jo);Ie($o);Ie(Qo);Ie(el);Ie(pl);Ie(ul);Ie(Rl);Ie(Ma);window.FilePond=na;function uf({acceptedFileTypes:e,imageEditorEmptyFillColor:t,imageEditorMode:i,imageEditorViewportHeight:a,imageEditorViewportWidth:n,deleteUploadedFileUsing:o,isDeletable:l,isDisabled:r,getUploadedFilesUsing:s,imageCropAspectRatio:p,imagePreviewHeight:c,imageResizeMode:d,imageResizeTargetHeight:m,imageResizeTargetWidth:u,imageResizeUpscale:f,isAvatar:h,hasImageEditor:g,hasCircleCropper:v,canEditSvgs:E,isSvgEditingConfirmed:T,confirmSvgEditingMessage:I,disabledSvgEditingMessage:y,isDownloadable:b,isMultiple:w,isOpenable:x,isPreviewable:_,isReorderable:P,itemPanelAspectRatio:O,loadingIndicatorPosition:M,locale:C,maxFiles:S,maxSize:F,minSize:R,panelAspectRatio:L,panelLayout:z,placeholder:D,removeUploadedFileButtonPosition:k,removeUploadedFileUsing:B,reorderUploadedFilesUsing:X,shouldAppendFiles:q,shouldOrientImageFromExif:Q,shouldTransformImage:pe,state:G,uploadButtonPosition:H,uploadingMessage:Y,uploadProgressIndicatorPosition:le,uploadUsing:ee}){return{fileKeyIndex:{},pond:null,shouldUpdateState:!0,state:G,lastState:null,error:null,uploadedFileIndex:{},isEditorOpen:!1,editingFile:{},currentRatio:"",editor:{},init:async function(){Dt(Kl[C]??Kl.en),this.pond=ut(this.$refs.input,{acceptedFileTypes:e,allowImageExifOrientation:Q,allowPaste:!1,allowRemove:l,allowReorder:P,allowImagePreview:_,allowVideoPreview:_,allowAudioPreview:_,allowImageTransform:pe,credits:!1,files:await this.getFiles(),imageCropAspectRatio:p,imagePreviewHeight:c,imageResizeTargetHeight:m,imageResizeTargetWidth:u,imageResizeMode:d,imageResizeUpscale:f,itemInsertLocation:q?"after":"before",...D&&{labelIdle:D},maxFiles:S,maxFileSize:F,minFileSize:R,styleButtonProcessItemPosition:H,styleButtonRemoveItemPosition:k,styleItemPanelAspectRatio:O,styleLoadIndicatorPosition:M,stylePanelAspectRatio:L,stylePanelLayout:z,styleProgressIndicatorPosition:le,server:{load:async(N,U)=>{let Z=await(await fetch(N,{cache:"no-store"})).blob();U(Z)},process:(N,U,$,Z,Ve,Ge)=>{this.shouldUpdateState=!1;let Xt=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,Qt=>(Qt^crypto.getRandomValues(new Uint8Array(1))[0]&15>>Qt/4).toString(16));ee(Xt,U,Qt=>{this.shouldUpdateState=!0,Z(Qt)},Ve,Ge)},remove:async(N,U)=>{let $=this.uploadedFileIndex[N]??null;$&&(await o($),U())},revert:async(N,U)=>{await B(N),U()}},allowImageEdit:g,imageEditEditor:{open:N=>this.loadEditor(N),onconfirm:()=>{},oncancel:()=>this.closeEditor(),onclose:()=>this.closeEditor()},fileValidateTypeDetectType:(N,U)=>new Promise(($,Z)=>{let Ve=U||Go.getType(N.name.split(".").pop());Ve?$(Ve):Z()})}),this.$watch("state",async()=>{if(this.pond&&this.shouldUpdateState&&this.state!==void 0){if(this.state!==null&&Object.values(this.state).filter(N=>N.startsWith("livewire-file:")).length){this.lastState=null;return}JSON.stringify(this.state)!==this.lastState&&(this.lastState=JSON.stringify(this.state),this.pond.files=await this.getFiles())}}),this.pond.on("reorderfiles",async N=>{let U=N.map($=>$.source instanceof File?$.serverId:this.uploadedFileIndex[$.source]??null).filter($=>$);await X(q?U:U.reverse())}),this.pond.on("initfile",async N=>{b&&(h||this.insertDownloadLink(N))}),this.pond.on("initfile",async N=>{x&&(h||this.insertOpenLink(N))}),this.pond.on("addfilestart",async N=>{N.status===Et.PROCESSING_QUEUED&&this.dispatchFormEvent("form-processing-started",{message:Y})});let V=async()=>{this.pond.getFiles().filter(N=>N.status===Et.PROCESSING||N.status===Et.PROCESSING_QUEUED).length||this.dispatchFormEvent("form-processing-finished")};this.pond.on("processfile",V),this.pond.on("processfileabort",V),this.pond.on("processfilerevert",V),z==="compact circle"&&(this.pond.on("error",N=>{this.error=`${N.main}: ${N.sub}`.replace("Expects or","Expects")}),this.pond.on("removefile",()=>this.error=null))},destroy:function(){this.destroyEditor(),ft(this.$refs.input),this.pond=null},dispatchFormEvent:function(V,N={}){this.$el.closest("form")?.dispatchEvent(new CustomEvent(V,{composed:!0,cancelable:!0,detail:N}))},getUploadedFiles:async function(){let V=await s();this.fileKeyIndex=V??{},this.uploadedFileIndex=Object.entries(this.fileKeyIndex).filter(([N,U])=>U?.url).reduce((N,[U,$])=>(N[$.url]=U,N),{})},getFiles:async function(){await this.getUploadedFiles();let V=[];for(let N of Object.values(this.fileKeyIndex))N&&V.push({source:N.url,options:{type:"local",...!N.type||_&&(/^audio/.test(N.type)||/^image/.test(N.type)||/^video/.test(N.type))?{}:{file:{name:N.name,size:N.size,type:N.type}}}});return q?V:V.reverse()},insertDownloadLink:function(V){if(V.origin!==zt.LOCAL)return;let N=this.getDownloadLink(V);N&&document.getElementById(`filepond--item-${V.id}`).querySelector(".filepond--file-info-main").prepend(N)},insertOpenLink:function(V){if(V.origin!==zt.LOCAL)return;let N=this.getOpenLink(V);N&&document.getElementById(`filepond--item-${V.id}`).querySelector(".filepond--file-info-main").prepend(N)},getDownloadLink:function(V){let N=V.source;if(!N)return;let U=document.createElement("a");return U.className="filepond--download-icon",U.href=N,U.download=V.file.name,U},getOpenLink:function(V){let N=V.source;if(!N)return;let U=document.createElement("a");return U.className="filepond--open-icon",U.href=N,U.target="_blank",U},initEditor:function(){r||g&&(this.editor=new xa(this.$refs.editor,{aspectRatio:n/a,autoCropArea:1,center:!0,crop:V=>{this.$refs.xPositionInput.value=Math.round(V.detail.x),this.$refs.yPositionInput.value=Math.round(V.detail.y),this.$refs.heightInput.value=Math.round(V.detail.height),this.$refs.widthInput.value=Math.round(V.detail.width),this.$refs.rotationInput.value=V.detail.rotate},cropBoxResizable:!0,guides:!0,highlight:!0,responsive:!0,toggleDragModeOnDblclick:!0,viewMode:i,wheelZoomRatio:.02}))},closeEditor:function(){this.editingFile={},this.isEditorOpen=!1,this.destroyEditor()},fixImageDimensions:function(V,N){if(V.type!=="image/svg+xml")return N(V);let U=new FileReader;U.onload=$=>{let Z=new DOMParser().parseFromString($.target.result,"image/svg+xml")?.querySelector("svg");if(!Z)return N(V);let Ve=["viewBox","ViewBox","viewbox"].find(Xt=>Z.hasAttribute(Xt));if(!Ve)return N(V);let Ge=Z.getAttribute(Ve).split(" ");return!Ge||Ge.length!==4?N(V):(Z.setAttribute("width",parseFloat(Ge[2])+"pt"),Z.setAttribute("height",parseFloat(Ge[3])+"pt"),N(new File([new Blob([new XMLSerializer().serializeToString(Z)],{type:"image/svg+xml"})],V.name,{type:"image/svg+xml",_relativePath:""})))},U.readAsText(V)},loadEditor:function(V){if(r||!g||!V)return;let N=V.type==="image/svg+xml";if(!E&&N){alert(y);return}T&&N&&!confirm(I)||this.fixImageDimensions(V,U=>{this.editingFile=U,this.initEditor();let $=new FileReader;$.onload=Z=>{this.isEditorOpen=!0,setTimeout(()=>this.editor.replace(Z.target.result),200)},$.readAsDataURL(V)})},getRoundedCanvas:function(V){let N=V.width,U=V.height,$=document.createElement("canvas");$.width=N,$.height=U;let Z=$.getContext("2d");return Z.imageSmoothingEnabled=!0,Z.drawImage(V,0,0,N,U),Z.globalCompositeOperation="destination-in",Z.beginPath(),Z.ellipse(N/2,U/2,N/2,U/2,0,0,2*Math.PI),Z.fill(),$},saveEditor:function(){if(r||!g)return;let V=this.editor.getCroppedCanvas({fillColor:t??"transparent",height:m,imageSmoothingEnabled:!0,imageSmoothingQuality:"high",width:u});v&&(V=this.getRoundedCanvas(V)),V.toBlob(N=>{w&&this.pond.removeFile(this.pond.getFiles().find(U=>U.filename===this.editingFile.name)?.id,{revert:!0}),this.$nextTick(()=>{this.shouldUpdateState=!1;let U=this.editingFile.name.slice(0,this.editingFile.name.lastIndexOf(".")),$=this.editingFile.name.split(".").pop();$==="svg"&&($="png");let Z=/-v(\d+)/;Z.test(U)?U=U.replace(Z,(Ve,Ge)=>`-v${Number(Ge)+1}`):U+="-v1",this.pond.addFile(new File([N],`${U}.${$}`,{type:this.editingFile.type==="image/svg+xml"||v?"image/png":this.editingFile.type,lastModified:new Date().getTime()})).then(()=>{this.closeEditor()}).catch(()=>{this.closeEditor()})})},v?"image/png":this.editingFile.type)},destroyEditor:function(){this.editor&&typeof this.editor.destroy=="function"&&this.editor.destroy(),this.editor=null}}}var Kl={ar:wl,ca:Sl,ckb:Ll,cs:Al,da:Ml,de:Ol,en:Pl,es:Dl,fa:Fl,fi:zl,fr:Cl,hu:Nl,id:Bl,it:kl,km:Vl,nl:Gl,no:Ul,pl:Wl,pt_BR:Ri,pt_PT:Ri,ro:Hl,ru:jl,sv:Yl,tr:ql,uk:$l,vi:Xl,zh_CN:Ql,zh_TW:Zl};export{uf as default}; +`;n(K)},o.readAsText(e)}),lg=e=>{let t;try{t=new ImageData(e.width,e.height)}catch{t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(e.data),t},og=()=>{let e={resize:c,filter:p},t=(d,m)=>(d.forEach(u=>{m=e[u.type](m,u.data)}),m),i=(d,m)=>{let u=d.transforms,g=null;if(u.forEach(f=>{f.type==="filter"&&(g=f)}),g){let f=null;u.forEach(h=>{h.type==="resize"&&(f=h)}),f&&(f.data.matrix=g.data,u=u.filter(h=>h.type!=="filter"))}m(t(u,d.imageData))};self.onmessage=d=>{i(d.data.message,m=>{self.postMessage({id:d.data.id,message:m},[m.data.buffer])})};let a=1,n=1,l=1;function o(d,m,u){let g=m[d]/255,f=m[d+1]/255,h=m[d+2]/255,I=m[d+3]/255,b=g*u[0]+f*u[1]+h*u[2]+I*u[3]+u[4],E=g*u[5]+f*u[6]+h*u[7]+I*u[8]+u[9],v=g*u[10]+f*u[11]+h*u[12]+I*u[13]+u[14],y=g*u[15]+f*u[16]+h*u[17]+I*u[18]+u[19],T=Math.max(0,b*y)+a*(1-y),_=Math.max(0,E*y)+n*(1-y),x=Math.max(0,v*y)+l*(1-y);m[d]=Math.max(0,Math.min(1,T))*255,m[d+1]=Math.max(0,Math.min(1,_))*255,m[d+2]=Math.max(0,Math.min(1,x))*255}let r=self.JSON.stringify([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]);function s(d){return self.JSON.stringify(d||[])===r}function p(d,m){if(!m||s(m))return d;let u=d.data,g=u.length,f=m[0],h=m[1],I=m[2],b=m[3],E=m[4],v=m[5],y=m[6],T=m[7],_=m[8],x=m[9],R=m[10],P=m[11],z=m[12],A=m[13],B=m[14],w=m[15],F=m[16],S=m[17],L=m[18],D=m[19],O=0,U=0,C=0,X=0,K=0,Z=0,ce=0,V=0,W=0,$=0,ie=0,ee=0;for(;O1&&g===!1)return p(d,I);f=d.width*w,h=d.height*w}let b=d.width,E=d.height,v=Math.round(f),y=Math.round(h),T=d.data,_=new Uint8ClampedArray(v*y*4),x=b/v,R=E/y,P=Math.ceil(x*.5),z=Math.ceil(R*.5);for(let A=0;A=-1&&ie<=1&&(F=2*ie*ie*ie-3*ie*ie+1,F>0)){$=4*(W+K*b);let ee=T[$+3];C+=F*ee,L+=F,ee<255&&(F=F*ee/250),D+=F*T[$],O+=F*T[$+1],U+=F*T[$+2],S+=F}}}_[w]=D/S,_[w+1]=O/S,_[w+2]=U/S,_[w+3]=C/L,I&&o(w,_,I)}return{data:_,width:v,height:y}}},rg=(e,t)=>{if(e.getUint32(t+4,!1)!==1165519206)return;t+=4;let i=e.getUint16(t+=6,!1)===18761;t+=e.getUint32(t+4,i);let a=e.getUint16(t,i);t+=2;for(let n=0;n{let t=new DataView(e);if(t.getUint16(0)!==65496)return null;let i=2,a,n,l=!1;for(;i=65504&&a<=65519||a===65534)||(l||(l=rg(t,i,n)),i+n>t.byteLength)));)i+=n;return e.slice(0,i)},cg=e=>new Promise(t=>{let i=new FileReader;i.onload=()=>t(sg(i.result)||null),i.readAsArrayBuffer(e.slice(0,256*1024))}),dg=()=>window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,pg=(e,t)=>{let i=dg();if(i){let a=new i;return a.append(e),a.getBlob(t)}return new Blob([e],{type:t})},mg=()=>Math.random().toString(36).substr(2,9),ug=e=>{let t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),i=URL.createObjectURL(t),a=new Worker(i),n=[];return{transfer:()=>{},post:(l,o,r)=>{let s=mg();n[s]=o,a.onmessage=p=>{let c=n[p.data.id];c&&(c(p.data.message),delete n[p.data.id])},a.postMessage({id:s,message:l},r)},terminate:()=>{a.terminate(),URL.revokeObjectURL(i)}}},gg=e=>new Promise((t,i)=>{let a=new Image;a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),fg=e=>e.reduce((t,i)=>t.then(a=>i().then(Array.prototype.concat.bind(a))),Promise.resolve([])),hg=(e,t)=>new Promise(i=>{let a={width:e.width,height:e.height},n=e.getContext("2d"),l=t.sort(Ro).map(o=>()=>new Promise(r=>{yg[o[0]](n,a,o[1],r)&&r()}));fg(l).then(()=>i(e))}),Mt=(e,t)=>{e.beginPath(),e.lineCap=t["stroke-linecap"],e.lineJoin=t["stroke-linejoin"],e.lineWidth=t["stroke-width"],t["stroke-dasharray"].length&&e.setLineDash(t["stroke-dasharray"].split(",")),e.fillStyle=t.fill,e.strokeStyle=t.stroke,e.globalAlpha=t.opacity||1},At=e=>{e.fill(),e.stroke(),e.globalAlpha=1},bg=(e,t,i)=>{let a=Lt(i,t),n=dt(i,t);return Mt(e,n),e.rect(a.x,a.y,a.width,a.height),At(e,n),!0},Eg=(e,t,i)=>{let a=Lt(i,t),n=dt(i,t);Mt(e,n);let l=a.x,o=a.y,r=a.width,s=a.height,p=.5522848,c=r/2*p,d=s/2*p,m=l+r,u=o+s,g=l+r/2,f=o+s/2;return e.moveTo(l,f),e.bezierCurveTo(l,f-d,g-c,o,g,o),e.bezierCurveTo(g+c,o,m,f-d,m,f),e.bezierCurveTo(m,f+d,g+c,u,g,u),e.bezierCurveTo(g-c,u,l,f+d,l,f),At(e,n),!0},Tg=(e,t,i,a)=>{let n=Lt(i,t),l=dt(i,t);Mt(e,l);let o=new Image;new URL(i.src,window.location.href).origin!==window.location.origin&&(o.crossOrigin=""),o.onload=()=>{if(i.fit==="cover"){let s=n.width/n.height,p=s>1?o.width:o.height*s,c=s>1?o.width/s:o.height,d=o.width*.5-p*.5,m=o.height*.5-c*.5;e.drawImage(o,d,m,p,c,n.x,n.y,n.width,n.height)}else if(i.fit==="contain"){let s=Math.min(n.width/o.width,n.height/o.height),p=s*o.width,c=s*o.height,d=n.x+n.width*.5-p*.5,m=n.y+n.height*.5-c*.5;e.drawImage(o,0,0,o.width,o.height,d,m,p,c)}else e.drawImage(o,0,0,o.width,o.height,n.x,n.y,n.width,n.height);At(e,l),a()},o.src=i.src},Ig=(e,t,i)=>{let a=Lt(i,t),n=dt(i,t);Mt(e,n);let l=me(i.fontSize,t),o=i.fontFamily||"sans-serif",r=i.fontWeight||"normal",s=i.textAlign||"left";return e.font=`${r} ${l}px ${o}`,e.textAlign=s,e.fillText(i.text,a.x,a.y),At(e,n),!0},vg=(e,t,i)=>{let a=dt(i,t);Mt(e,a),e.beginPath();let n=i.points.map(o=>({x:me(o.x,t,1,"width"),y:me(o.y,t,1,"height")}));e.moveTo(n[0].x,n[0].y);let l=n.length;for(let o=1;o{let a=Lt(i,t),n=dt(i,t);Mt(e,n),e.beginPath();let l={x:a.x,y:a.y},o={x:a.x+a.width,y:a.y+a.height};e.moveTo(l.x,l.y),e.lineTo(o.x,o.y);let r=yo({x:o.x-l.x,y:o.y-l.y}),s=.04*Math.min(t.width,t.height);if(i.lineDecoration.indexOf("arrow-begin")!==-1){let p=Ri(r,s),c=Si(l,p),d=qe(l,2,c),m=qe(l,-2,c);e.moveTo(d.x,d.y),e.lineTo(l.x,l.y),e.lineTo(m.x,m.y)}if(i.lineDecoration.indexOf("arrow-end")!==-1){let p=Ri(r,-s),c=Si(o,p),d=qe(o,2,c),m=qe(o,-2,c);e.moveTo(d.x,d.y),e.lineTo(o.x,o.y),e.lineTo(m.x,m.y)}return At(e,n),!0},yg={rect:bg,ellipse:Eg,image:Tg,text:Ig,line:xg,path:vg},Rg=e=>{let t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").putImageData(e,0,0),t},Sg=(e,t,i={})=>new Promise((a,n)=>{if(!e||!Pu(e))return n({status:"not an image file",file:e});let{stripImageHead:l,beforeCreateBlob:o,afterCreateBlob:r,canvasMemoryLimit:s}=i,{crop:p,size:c,filter:d,markup:m,output:u}=t,g=t.image&&t.image.orientation?Math.max(1,Math.min(8,t.image.orientation)):null,f=u&&u.quality,h=f===null?null:f/100,I=u&&u.type||null,b=u&&u.background||null,E=[];c&&(typeof c.width=="number"||typeof c.height=="number")&&E.push({type:"resize",data:c}),d&&d.length===20&&E.push({type:"filter",data:d});let v=_=>{let x=r?r(_):_;Promise.resolve(x).then(a)},y=(_,x)=>{let R=Rg(_),P=m.length?hg(R,m):R;Promise.resolve(P).then(z=>{Gu(z,x,o).then(A=>{if(xo(z),l)return v(A);cg(e).then(B=>{B!==null&&(A=new Blob([B,A.slice(20)],{type:A.type})),v(A)})}).catch(n)})};if(/svg/.test(e.type)&&I===null)return ng(e,p,m,{background:b}).then(_=>{a(pg(_,"image/svg+xml"))});let T=URL.createObjectURL(e);gg(T).then(_=>{URL.revokeObjectURL(T);let x=Nu(_,g,p,{canvasMemoryLimit:s,background:b}),R={quality:h,type:I||e.type};if(!E.length)return y(x,R);let P=ug(og);P.post({transforms:E,imageData:x},z=>{y(lg(z),R),P.terminate()},[x.data.buffer])}).catch(n)}),_g=["x","y","left","top","right","bottom","width","height"],wg=e=>typeof e=="string"&&/%/.test(e)?parseFloat(e)/100:e,Lg=e=>{let[t,i]=e,a=i.points?{}:_g.reduce((n,l)=>(n[l]=wg(i[l]),n),{});return[t,{zIndex:0,...i,...a}]},Mg=e=>new Promise((t,i)=>{let a=new Image;a.src=URL.createObjectURL(e);let n=()=>{let o=a.naturalWidth,r=a.naturalHeight;o&&r&&(URL.revokeObjectURL(a.src),clearInterval(l),t({width:o,height:r}))};a.onerror=o=>{URL.revokeObjectURL(a.src),clearInterval(l),i(o)};let l=setInterval(n,1);n()});typeof window<"u"&&typeof window.document<"u"&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,i){let a=this;setTimeout(()=>{let n=a.toDataURL(t,i).split(",")[1],l=atob(n),o=l.length,r=new Uint8Array(o);for(;o--;)r[o]=l.charCodeAt(o);e(new Blob([r],{type:t||"image/png"}))})}}));var wa=typeof window<"u"&&typeof window.document<"u",Ag=wa&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,So=({addFilter:e,utils:t})=>{let{Type:i,forin:a,getFileFromBlob:n,isFile:l}=t,o=["crop","resize","filter","markup","output"],r=c=>(d,m,u)=>d(m,c?c(u):u),s=c=>c.aspectRatio===null&&c.rotation===0&&c.zoom===1&&c.center&&c.center.x===.5&&c.center.y===.5&&c.flip&&c.flip.horizontal===!1&&c.flip.vertical===!1;e("SHOULD_PREPARE_OUTPUT",(c,{query:d})=>new Promise(m=>{m(!d("IS_ASYNC"))}));let p=(c,d,m)=>new Promise(u=>{if(!c("GET_ALLOW_IMAGE_TRANSFORM")||m.archived||!l(d)||!wu(d))return u(!1);Mg(d).then(()=>{let g=c("GET_IMAGE_TRANSFORM_IMAGE_FILTER");if(g){let f=g(d);if(f==null)return handleRevert(!0);if(typeof f=="boolean")return u(f);if(typeof f.then=="function")return f.then(u)}u(!0)}).catch(g=>{u(!1)})});return e("DID_CREATE_ITEM",(c,{query:d,dispatch:m})=>{d("GET_ALLOW_IMAGE_TRANSFORM")&&c.extend("requestPrepare",()=>new Promise((u,g)=>{m("REQUEST_PREPARE_OUTPUT",{query:c.id,item:c,success:u,failure:g},!0)}))}),e("PREPARE_OUTPUT",(c,{query:d,item:m})=>new Promise(u=>{p(d,c,m).then(g=>{if(!g)return u(c);let f=[];d("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_ORIGINAL")&&f.push(()=>new Promise(x=>{x({name:d("GET_IMAGE_TRANSFORM_VARIANTS_ORIGINAL_NAME"),file:c})})),d("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_DEFAULT")&&f.push((x,R,P)=>new Promise(z=>{x(R,P).then(A=>z({name:d("GET_IMAGE_TRANSFORM_VARIANTS_DEFAULT_NAME"),file:A}))}));let h=d("GET_IMAGE_TRANSFORM_VARIANTS")||{};a(h,(x,R)=>{let P=r(R);f.push((z,A,B)=>new Promise(w=>{P(z,A,B).then(F=>w({name:x,file:F}))}))});let I=d("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY"),b=d("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY_MODE"),E=I===null?null:I/100,v=d("GET_IMAGE_TRANSFORM_OUTPUT_MIME_TYPE"),y=d("GET_IMAGE_TRANSFORM_CLIENT_TRANSFORMS")||o;m.setMetadata("output",{type:v,quality:E,client:y},!0);let T=(x,R)=>new Promise((P,z)=>{let A={...R};Object.keys(A).filter(C=>C!=="exif").forEach(C=>{y.indexOf(C)===-1&&delete A[C]});let{resize:B,exif:w,output:F,crop:S,filter:L,markup:D}=A,O={image:{orientation:w?w.orientation:null},output:F&&(F.type||typeof F.quality=="number"||F.background)?{type:F.type,quality:typeof F.quality=="number"?F.quality*100:null,background:F.background||d("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||null}:void 0,size:B&&(B.size.width||B.size.height)?{mode:B.mode,upscale:B.upscale,...B.size}:void 0,crop:S&&!s(S)?{...S}:void 0,markup:D&&D.length?D.map(Lg):[],filter:L};if(O.output){let C=F.type?F.type!==x.type:!1,X=/\/jpe?g$/.test(x.type),K=F.quality!==null?X&&b==="always":!1;if(!!!(O.size||O.crop||O.filter||C||K))return P(x)}let U={beforeCreateBlob:d("GET_IMAGE_TRANSFORM_BEFORE_CREATE_BLOB"),afterCreateBlob:d("GET_IMAGE_TRANSFORM_AFTER_CREATE_BLOB"),canvasMemoryLimit:d("GET_IMAGE_TRANSFORM_CANVAS_MEMORY_LIMIT"),stripImageHead:d("GET_IMAGE_TRANSFORM_OUTPUT_STRIP_IMAGE_HEAD")};Sg(x,O,U).then(C=>{let X=n(C,Au(x.name,zu(C.type)));P(X)}).catch(z)}),_=f.map(x=>x(T,c,m.getMetadata()));Promise.all(_).then(x=>{u(x.length===1&&x[0].name===null?x[0].file:x)})})})),{options:{allowImageTransform:[!0,i.BOOLEAN],imageTransformImageFilter:[null,i.FUNCTION],imageTransformOutputMimeType:[null,i.STRING],imageTransformOutputQuality:[null,i.INT],imageTransformOutputStripImageHead:[!0,i.BOOLEAN],imageTransformClientTransforms:[null,i.ARRAY],imageTransformOutputQualityMode:["always",i.STRING],imageTransformVariants:[null,i.OBJECT],imageTransformVariantsIncludeDefault:[!0,i.BOOLEAN],imageTransformVariantsDefaultName:[null,i.STRING],imageTransformVariantsIncludeOriginal:[!1,i.BOOLEAN],imageTransformVariantsOriginalName:["original_",i.STRING],imageTransformBeforeCreateBlob:[null,i.FUNCTION],imageTransformAfterCreateBlob:[null,i.FUNCTION],imageTransformCanvasMemoryLimit:[wa&&Ag?4096*4096:null,i.INT],imageTransformCanvasBackgroundColor:[null,i.STRING]}}};wa&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:So}));var _o=So;var La=e=>/^video/.test(e.type),Kt=e=>/^audio/.test(e.type),Ma=class{constructor(t,i){this.mediaEl=t,this.audioElems=i,this.onplayhead=!1,this.duration=0,this.timelineWidth=this.audioElems.timeline.offsetWidth-this.audioElems.playhead.offsetWidth,this.moveplayheadFn=this.moveplayhead.bind(this),this.registerListeners()}registerListeners(){this.mediaEl.addEventListener("timeupdate",this.timeUpdate.bind(this),!1),this.mediaEl.addEventListener("canplaythrough",()=>this.duration=this.mediaEl.duration,!1),this.audioElems.timeline.addEventListener("click",this.timelineClicked.bind(this),!1),this.audioElems.button.addEventListener("click",this.play.bind(this)),this.audioElems.playhead.addEventListener("mousedown",this.mouseDown.bind(this),!1),window.addEventListener("mouseup",this.mouseUp.bind(this),!1)}play(){this.mediaEl.paused?this.mediaEl.play():this.mediaEl.pause(),this.audioElems.button.classList.toggle("play"),this.audioElems.button.classList.toggle("pause")}timeUpdate(){let t=this.mediaEl.currentTime/this.duration*100;this.audioElems.playhead.style.marginLeft=t+"%",this.mediaEl.currentTime===this.duration&&(this.audioElems.button.classList.toggle("play"),this.audioElems.button.classList.toggle("pause"))}moveplayhead(t){let i=t.clientX-this.getPosition(this.audioElems.timeline);i>=0&&i<=this.timelineWidth&&(this.audioElems.playhead.style.marginLeft=i+"px"),i<0&&(this.audioElems.playhead.style.marginLeft="0px"),i>this.timelineWidth&&(this.audioElems.playhead.style.marginLeft=this.timelineWidth-4+"px")}timelineClicked(t){this.moveplayhead(t),this.mediaEl.currentTime=this.duration*this.clickPercent(t)}mouseDown(){this.onplayhead=!0,window.addEventListener("mousemove",this.moveplayheadFn,!0),this.mediaEl.removeEventListener("timeupdate",this.timeUpdate.bind(this),!1)}mouseUp(t){window.removeEventListener("mousemove",this.moveplayheadFn,!0),this.onplayhead==!0&&(this.moveplayhead(t),this.mediaEl.currentTime=this.duration*this.clickPercent(t),this.mediaEl.addEventListener("timeupdate",this.timeUpdate.bind(this),!1)),this.onplayhead=!1}clickPercent(t){return(t.clientX-this.getPosition(this.audioElems.timeline))/this.timelineWidth}getPosition(t){return t.getBoundingClientRect().left}},zg=e=>e.utils.createView({name:"media-preview",tag:"div",ignoreRect:!0,create:({root:t,props:i})=>{let{id:a}=i,n=t.query("GET_ITEM",{id:i.id}),l=Kt(n.file)?"audio":"video";if(t.ref.media=document.createElement(l),t.ref.media.setAttribute("controls",!0),t.element.appendChild(t.ref.media),Kt(n.file)){let o=document.createDocumentFragment();t.ref.audio=[],t.ref.audio.container=document.createElement("div"),t.ref.audio.button=document.createElement("span"),t.ref.audio.timeline=document.createElement("div"),t.ref.audio.playhead=document.createElement("div"),t.ref.audio.container.className="audioplayer",t.ref.audio.button.className="playpausebtn play",t.ref.audio.timeline.className="timeline",t.ref.audio.playhead.className="playhead",t.ref.audio.timeline.appendChild(t.ref.audio.playhead),t.ref.audio.container.appendChild(t.ref.audio.button),t.ref.audio.container.appendChild(t.ref.audio.timeline),o.appendChild(t.ref.audio.container),t.element.appendChild(o)}},write:e.utils.createRoute({DID_MEDIA_PREVIEW_LOAD:({root:t,props:i})=>{let{id:a}=i,n=t.query("GET_ITEM",{id:i.id});if(!n)return;let l=window.URL||window.webkitURL,o=new Blob([n.file],{type:n.file.type});t.ref.media.type=n.file.type,t.ref.media.src=n.file.mock&&n.file.url||l.createObjectURL(o),Kt(n.file)&&new Ma(t.ref.media,t.ref.audio),t.ref.media.addEventListener("loadeddata",()=>{let r=75;if(La(n.file)){let s=t.ref.media.offsetWidth,p=t.ref.media.videoWidth/s;r=t.ref.media.videoHeight/p}t.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:i.id,height:r})},!1)}})}),Pg=e=>{let t=({root:a,props:n})=>{let{id:l}=n;a.query("GET_ITEM",l)&&a.dispatch("DID_MEDIA_PREVIEW_LOAD",{id:l})},i=({root:a,props:n})=>{let l=zg(e);a.ref.media=a.appendChildView(a.createChildView(l,{id:n.id}))};return e.utils.createView({name:"media-preview-wrapper",create:i,write:e.utils.createRoute({DID_MEDIA_PREVIEW_CONTAINER_CREATE:t})})},Aa=e=>{let{addFilter:t,utils:i}=e,{Type:a,createRoute:n}=i,l=Pg(e);return t("CREATE_VIEW",o=>{let{is:r,view:s,query:p}=o;if(!r("file"))return;let c=({root:d,props:m})=>{let{id:u}=m,g=p("GET_ITEM",u),f=p("GET_ALLOW_VIDEO_PREVIEW"),h=p("GET_ALLOW_AUDIO_PREVIEW");!g||g.archived||(!La(g.file)||!f)&&(!Kt(g.file)||!h)||(d.ref.mediaPreview=s.appendChildView(s.createChildView(l,{id:u})),d.dispatch("DID_MEDIA_PREVIEW_CONTAINER_CREATE",{id:u}))};s.registerWriter(n({DID_LOAD_ITEM:c},({root:d,props:m})=>{let{id:u}=m,g=p("GET_ITEM",u),f=d.query("GET_ALLOW_VIDEO_PREVIEW"),h=d.query("GET_ALLOW_AUDIO_PREVIEW");!g||(!La(g.file)||!f)&&(!Kt(g.file)||!h)||d.rect.element.hidden}))}),{options:{allowVideoPreview:[!0,a.BOOLEAN],allowAudioPreview:[!0,a.BOOLEAN]}}},Fg=typeof window<"u"&&typeof window.document<"u";Fg&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Aa}));var wo={labelIdle:'\u134B\u12ED\u120E\u127D \u1235\u1260\u12CD \u12A5\u12DA\u1205 \u130B\u122D \u12ED\u120D\u1240\u1241\u1275 \u12C8\u12ED\u121D \u134B\u12ED\u1209\u1295 \u12ED\u121D\u1228\u1321 ',labelInvalidField:"\u1218\u1235\u12A9 \u120D\u12AD \u12EB\u120D\u1206\u1291 \u134B\u12ED\u120E\u127D\u1295 \u12ED\u12DF\u120D",labelFileWaitingForSize:"\u12E8\u134B\u12ED\u1209\u1295 \u1218\u1320\u1295 \u1260\u1218\u1320\u1263\u1260\u1245 \u120B\u12ED",labelFileSizeNotAvailable:"\u12E8\u134B\u12ED\u1209\u1295 \u1218\u1320\u1295 \u120A\u1308\u129D \u12A0\u120D\u127B\u1208\u121D",labelFileLoading:"\u1260\u121B\u1295\u1260\u1265 \u120B\u12ED",labelFileLoadError:"\u1260\u121B\u1295\u1260\u1265 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelFileProcessing:"\u134B\u12ED\u1209\u1295 \u1260\u1218\u132B\u1295 \u120B\u12ED",labelFileProcessingComplete:"\u134B\u12ED\u1209\u1295 \u1218\u132B\u1295 \u1270\u1320\u1293\u1245\u124B\u120D",labelFileProcessingAborted:"\u134B\u12ED\u1209\u1295 \u1218\u132B\u1295 \u1270\u124B\u122D\u1327\u120D",labelFileProcessingError:"\u134B\u12ED\u1209\u1295 \u1260\u1218\u132B\u1295 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelFileProcessingRevertError:"\u1348\u12ED\u1209\u1295 \u1260\u1218\u1240\u120D\u1260\u1235 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelFileRemoveError:"\u1260\u121B\u1325\u134B\u1275 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelTapToCancel:"\u1208\u121B\u124B\u1228\u1325 \u1290\u12AB \u12EB\u12F5\u122D\u1309",labelTapToRetry:"\u12F0\u130D\u121E \u1208\u1218\u121E\u12A8\u122D \u1290\u12AB \u12EB\u12F5\u122D\u1309",labelTapToUndo:"\u12C8\u12F0\u1290\u1260\u1228\u1260\u1275 \u1208\u1218\u1218\u1208\u1235 \u1290\u12AB \u12EB\u12F5\u122D\u1309",labelButtonRemoveItem:"\u120B\u1325\u134B",labelButtonAbortItemLoad:"\u120B\u124B\u122D\u1325",labelButtonRetryItemLoad:"\u12F0\u130D\u121C \u120D\u121E\u12AD\u122D",labelButtonAbortItemProcessing:"\u12ED\u1245\u122D",labelButtonUndoItemProcessing:"\u12C8\u12F0\u1290\u1260\u1228\u1260\u1275 \u120D\u1218\u120D\u1235",labelButtonRetryItemProcessing:"\u12F0\u130D\u121C \u120D\u121E\u12AD\u122D",labelButtonProcessItem:"\u120D\u132B\u1295",labelMaxFileSizeExceeded:"\u134B\u12ED\u1209 \u1270\u120D\u124B\u120D",labelMaxFileSize:"\u12E8\u134B\u12ED\u120D \u1218\u1320\u1295 \u12A8 {filesize} \u1218\u1265\u1208\u1325 \u12A0\u12ED\u1348\u1240\u12F5\u121D",labelMaxTotalFileSizeExceeded:"\u12E8\u121A\u1348\u1240\u12F0\u12CD\u1295 \u1320\u1245\u120B\u120B \u12E8\u134B\u12ED\u120D \u1218\u1320\u1295 \u12A0\u120D\u1348\u12CB\u120D",labelMaxTotalFileSize:"\u1320\u1245\u120B\u120B \u12E8\u134B\u12ED\u120D \u1218\u1320\u1295 \u12A8 {filesize} \u1218\u1265\u1208\u1325 \u12A0\u12ED\u1348\u1240\u12F5\u121D",labelFileTypeNotAllowed:"\u12E8\u1270\u1233\u1233\u1270 \u12E8\u134B\u12ED\u120D \u12A0\u12ED\u1290\u1275 \u1290\u12CD",fileValidateTypeLabelExpectedTypes:"\u12E8\u134B\u12ED\u120D \u12A0\u12ED\u1290\u1271 \u1218\u1206\u1295 \u12E8\u121A\u1308\u1263\u12CD {allButLastType} \u12A5\u1293 {lastType} \u1290\u12CD",imageValidateSizeLabelFormatError:"\u12E8\u121D\u1235\u120D \u12A0\u12ED\u1290\u1271 \u1208\u1218\u132B\u1295 \u12A0\u12ED\u1206\u1295\u121D",imageValidateSizeLabelImageSizeTooSmall:"\u121D\u1235\u1209 \u1260\u1323\u121D \u12A0\u1295\u1237\u120D",imageValidateSizeLabelImageSizeTooBig:"\u121D\u1235\u1209 \u1260\u1323\u121D \u1270\u120D\u124B\u120D",imageValidateSizeLabelExpectedMinSize:"\u12DD\u1245\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u120D\u12AC\u1275 {minWidth} \xD7 {minHeight} \u1290\u12CD",imageValidateSizeLabelExpectedMaxSize:"\u12A8\u134D\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u120D\u12AC\u1275 {maxWidth} \xD7 {maxHeight} \u1290\u12CD",imageValidateSizeLabelImageResolutionTooLow:"\u12E8\u121D\u1235\u1209 \u1325\u122B\u1275 \u1260\u1323\u121D \u12DD\u1245\u1270\u129B \u1290\u12CD",imageValidateSizeLabelImageResolutionTooHigh:"\u12E8\u121D\u1235\u1209 \u1325\u122B\u1275 \u1260\u1323\u121D \u12A8\u134D\u1270\u129B \u1290\u12CD",imageValidateSizeLabelExpectedMinResolution:"\u12DD\u1245\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u1325\u122B\u1275 {minResolution} \u1290\u12CD",imageValidateSizeLabelExpectedMaxResolution:"\u12A8\u134D\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u1325\u122B\u1275 {maxResolution} \u1290\u12CD"};var Lo={labelIdle:'\u0627\u0633\u062D\u0628 \u0648 \u0627\u062F\u0631\u062C \u0645\u0644\u0641\u0627\u062A\u0643 \u0623\u0648 \u062A\u0635\u0641\u062D ',labelInvalidField:"\u0627\u0644\u062D\u0642\u0644 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u063A\u064A\u0631 \u0635\u0627\u0644\u062D\u0629",labelFileWaitingForSize:"\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u062D\u062C\u0645",labelFileSizeNotAvailable:"\u0627\u0644\u062D\u062C\u0645 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",labelFileLoading:"\u0628\u0627\u0644\u0625\u0646\u062A\u0638\u0627\u0631",labelFileLoadError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u062D\u0645\u064A\u0644",labelFileProcessing:"\u064A\u062A\u0645 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingComplete:"\u062A\u0645 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingAborted:"\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingRevertError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u0631\u0627\u062C\u0639",labelFileRemoveError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062D\u0630\u0641",labelTapToCancel:"\u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0644\u063A\u0627\u0621",labelTapToRetry:"\u0627\u0646\u0642\u0631 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",labelTapToUndo:"\u0627\u0646\u0642\u0631 \u0644\u0644\u062A\u0631\u0627\u062C\u0639",labelButtonRemoveItem:"\u0645\u0633\u062D",labelButtonAbortItemLoad:"\u0625\u0644\u063A\u0627\u0621",labelButtonRetryItemLoad:"\u0625\u0639\u0627\u062F\u0629",labelButtonAbortItemProcessing:"\u0625\u0644\u063A\u0627\u0621",labelButtonUndoItemProcessing:"\u062A\u0631\u0627\u062C\u0639",labelButtonRetryItemProcessing:"\u0625\u0639\u0627\u062F\u0629",labelButtonProcessItem:"\u0631\u0641\u0639",labelMaxFileSizeExceeded:"\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064A\u0631 \u062C\u062F\u0627",labelMaxFileSize:"\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0623\u0642\u0635\u0649: {filesize}",labelMaxTotalFileSizeExceeded:"\u062A\u0645 \u062A\u062C\u0627\u0648\u0632 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u062D\u062C\u0645 \u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A",labelMaxTotalFileSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641: {filesize}",labelFileTypeNotAllowed:"\u0645\u0644\u0641 \u0645\u0646 \u0646\u0648\u0639 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",fileValidateTypeLabelExpectedTypes:"\u062A\u062A\u0648\u0642\u0639 {allButLastType} \u0645\u0646 {lastType}",imageValidateSizeLabelFormatError:"\u0646\u0648\u0639 \u0627\u0644\u0635\u0648\u0631\u0629 \u063A\u064A\u0631 \u0645\u062F\u0639\u0648\u0645",imageValidateSizeLabelImageSizeTooSmall:"\u0627\u0644\u0635\u0648\u0631\u0629 \u0635\u063A\u064A\u0631 \u062C\u062F\u0627",imageValidateSizeLabelImageSizeTooBig:"\u0627\u0644\u0635\u0648\u0631\u0629 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u0627",imageValidateSizeLabelExpectedMinSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u0623\u0628\u0639\u0627\u062F \u0647\u0648: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0623\u0628\u0639\u0627\u062F \u0647\u0648: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0627\u0644\u062F\u0642\u0629 \u0636\u0639\u064A\u0641\u0629 \u062C\u062F\u0627",imageValidateSizeLabelImageResolutionTooHigh:"\u0627\u0644\u062F\u0642\u0629 \u0645\u0631\u062A\u0641\u0639\u0629 \u062C\u062F\u0627",imageValidateSizeLabelExpectedMinResolution:"\u0623\u0642\u0644 \u062F\u0642\u0629: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0623\u0642\u0635\u0649 \u062F\u0642\u0629: {maxResolution}"};var Mo={labelIdle:'Fayl\u0131n\u0131z\u0131 S\xFCr\xFC\u015Fd\xFCr\xFCn & Burax\u0131n ya da Se\xE7in ',labelInvalidField:"Sah\u0259d\u0259 etibars\u0131z fayllar var",labelFileWaitingForSize:"\xD6l\xE7\xFC hesablan\u0131r",labelFileSizeNotAvailable:"\xD6l\xE7\xFC m\xF6vcud deyil",labelFileLoading:"Y\xFCkl\u0259nir",labelFileLoadError:"Y\xFCkl\u0259m\u0259 \u0259snas\u0131nda x\u0259ta ba\u015F verdi",labelFileProcessing:"Y\xFCkl\u0259nir",labelFileProcessingComplete:"Y\xFCkl\u0259m\u0259 tamamland\u0131",labelFileProcessingAborted:"Y\xFCkl\u0259m\u0259 l\u0259\u011Fv edildi",labelFileProcessingError:"Y\xFCk\u0259y\u0259rk\u0259n x\u0259ta ba\u015F verdi",labelFileProcessingRevertError:"Geri \xE7\u0259k\u0259rk\u0259n x\u0259ta ba\u015F verdi",labelFileRemoveError:"\xC7\u0131xarark\u0259n x\u0259ta ba\u015F verdi",labelTapToCancel:"\u0130mtina etm\u0259k \xFC\xE7\xFCn klikl\u0259yin",labelTapToRetry:"T\u0259krar yoxlamaq \xFC\xE7\xFCn klikl\u0259yin",labelTapToUndo:"Geri almaq \xFC\xE7\xFCn klikl\u0259yin",labelButtonRemoveItem:"\xC7\u0131xar",labelButtonAbortItemLoad:"\u0130mtina Et",labelButtonRetryItemLoad:"T\u0259krar yoxla",labelButtonAbortItemProcessing:"\u0130mtina et",labelButtonUndoItemProcessing:"Geri Al",labelButtonRetryItemProcessing:"T\u0259krar yoxla",labelButtonProcessItem:"Y\xFCkl\u0259",labelMaxFileSizeExceeded:"Fayl \xE7ox b\xF6y\xFCkd\xFCr",labelMaxFileSize:"\u018Fn b\xF6y\xFCk fayl \xF6l\xE7\xFCs\xFC: {filesize}",labelMaxTotalFileSizeExceeded:"Maksimum \xF6l\xE7\xFC ke\xE7ildi",labelMaxTotalFileSize:"Maksimum fayl \xF6l\xE7\xFCs\xFC :{filesize}",labelFileTypeNotAllowed:"Etibars\u0131z fayl tipi",fileValidateTypeLabelExpectedTypes:"Bu {allButLastType} ya da bu fayl olmas\u0131 laz\u0131md\u0131r: {lastType}",imageValidateSizeLabelFormatError:"\u015E\u0259kil tipi d\u0259st\u0259kl\u0259nmir",imageValidateSizeLabelImageSizeTooSmall:"\u015E\u0259kil \xE7ox ki\xE7ik",imageValidateSizeLabelImageSizeTooBig:"\u015E\u0259kil \xE7ox b\xF6y\xFCk",imageValidateSizeLabelExpectedMinSize:"Minimum \xF6l\xE7\xFC {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimum \xF6l\xE7\xFC {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"G\xF6r\xFCnt\xFC imkan\u0131 \xE7ox a\u015Fa\u011F\u0131",imageValidateSizeLabelImageResolutionTooHigh:"G\xF6r\xFCnt\xFC imkan\u0131 \xE7ox y\xFCks\u0259k",imageValidateSizeLabelExpectedMinResolution:"Minimum g\xF6r\xFCnt\xFC imkan\u0131 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum g\xF6r\xFCnt\xFC imkan\u0131 {maxResolution}"};var Ao={labelIdle:'Arrossega i deixa anar els teus fitxers o Navega ',labelInvalidField:"El camp cont\xE9 fitxers inv\xE0lids",labelFileWaitingForSize:"Esperant mida",labelFileSizeNotAvailable:"Mida no disponible",labelFileLoading:"Carregant",labelFileLoadError:"Error durant la c\xE0rrega",labelFileProcessing:"Pujant",labelFileProcessingComplete:"Pujada completada",labelFileProcessingAborted:"Pujada cancel\xB7lada",labelFileProcessingError:"Error durant la pujada",labelFileProcessingRevertError:"Error durant la reversi\xF3",labelFileRemoveError:"Error durant l'eliminaci\xF3",labelTapToCancel:"toca per cancel\xB7lar",labelTapToRetry:"toca per reintentar",labelTapToUndo:"toca per desfer",labelButtonRemoveItem:"Eliminar",labelButtonAbortItemLoad:"Cancel\xB7lar",labelButtonRetryItemLoad:"Reintentar",labelButtonAbortItemProcessing:"Cancel\xB7lar",labelButtonUndoItemProcessing:"Desfer",labelButtonRetryItemProcessing:"Reintentar",labelButtonProcessItem:"Pujar",labelMaxFileSizeExceeded:"El fitxer \xE9s massa gran",labelMaxFileSize:"La mida m\xE0xima del fitxer \xE9s {filesize}",labelMaxTotalFileSizeExceeded:"Mida m\xE0xima total excedida",labelMaxTotalFileSize:"La mida m\xE0xima total del fitxer \xE9s {filesize}",labelFileTypeNotAllowed:"Fitxer de tipus inv\xE0lid",fileValidateTypeLabelExpectedTypes:"Espera {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipus d'imatge no suportada",imageValidateSizeLabelImageSizeTooSmall:"La imatge \xE9s massa petita",imageValidateSizeLabelImageSizeTooBig:"La imatge \xE9s massa gran",imageValidateSizeLabelExpectedMinSize:"La mida m\xEDnima \xE9s {minWidth} x {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La mida m\xE0xima \xE9s {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La resoluci\xF3 \xE9s massa baixa",imageValidateSizeLabelImageResolutionTooHigh:"La resoluci\xF3 \xE9s massa alta",imageValidateSizeLabelExpectedMinResolution:"La resoluci\xF3 m\xEDnima \xE9s {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La resoluci\xF3 m\xE0xima \xE9s {maxResolution}"};var zo={labelIdle:'\u067E\u06D5\u0695\u06AF\u06D5\u06A9\u0627\u0646 \u0641\u0695\u06CE \u0628\u062F\u06D5 \u0626\u06CE\u0631\u06D5 \u0628\u06C6 \u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u06CC\u0627\u0646 \u0647\u06D5\u06B5\u0628\u0698\u06CE\u0631\u06D5 ',labelInvalidField:"\u067E\u06D5\u0695\u06AF\u06D5\u06CC \u0646\u0627\u062F\u0631\u0648\u0633\u062A\u06CC \u062A\u06CE\u062F\u0627\u06CC\u06D5",labelFileWaitingForSize:"\u0686\u0627\u0648\u06D5\u0695\u0648\u0627\u0646\u06CC\u06CC \u0642\u06D5\u0628\u0627\u0631\u06D5",labelFileSizeNotAvailable:"\u0642\u06D5\u0628\u0627\u0631\u06D5 \u0628\u06D5\u0631\u062F\u06D5\u0633\u062A \u0646\u06CC\u06D5",labelFileLoading:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileLoadError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5\u0645\u0627\u0648\u06D5\u06CC \u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileProcessing:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileProcessingComplete:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u062A\u06D5\u0648\u0627\u0648 \u0628\u0648\u0648",labelFileProcessingAborted:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u06CC\u06D5\u0648\u06D5",labelFileProcessingError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5\u06A9\u0627\u062A\u06CC \u0628\u0627\u0631\u06A9\u0631\u062F\u0646\u062F\u0627",labelFileProcessingRevertError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5 \u06A9\u0627\u062A\u06CC \u06AF\u06D5\u0695\u0627\u0646\u06D5\u0648\u06D5",labelFileRemoveError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5 \u06A9\u0627\u062A\u06CC \u0633\u0695\u06CC\u0646\u06D5\u0648\u06D5",labelTapToCancel:"\u0628\u06C6 \u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5 Tab \u062F\u0627\u0628\u06AF\u0631\u06D5",labelTapToRetry:"tap \u062F\u0627\u0628\u06AF\u0631\u06D5 \u0628\u06C6 \u062F\u0648\u0648\u0628\u0627\u0631\u06D5\u06A9\u0631\u062F\u0646\u06D5\u0648\u06D5",labelTapToUndo:"tap \u062F\u0627\u0628\u06AF\u0631\u06D5 \u0628\u06C6 \u06AF\u06D5\u0695\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRemoveItem:"\u0633\u0695\u06CC\u0646\u06D5\u0648\u06D5",labelButtonAbortItemLoad:"\u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRetryItemLoad:"\u0647\u06D5\u0648\u06B5\u062F\u0627\u0646\u06D5\u0648\u06D5",labelButtonAbortItemProcessing:"\u067E\u06D5\u0634\u06CC\u0645\u0627\u0646\u0628\u0648\u0648\u0646\u06D5\u0648\u06D5",labelButtonUndoItemProcessing:"\u06AF\u06D5\u0695\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRetryItemProcessing:"\u0647\u06D5\u0648\u06B5\u062F\u0627\u0646\u06D5\u0648\u06D5",labelButtonProcessItem:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelMaxFileSizeExceeded:"\u067E\u06D5\u0695\u06AF\u06D5 \u0632\u06C6\u0631 \u06AF\u06D5\u0648\u0631\u06D5\u06CC\u06D5",labelMaxFileSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {filesize}",labelMaxTotalFileSizeExceeded:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5\u06CC \u06A9\u06C6\u06CC \u06AF\u0634\u062A\u06CC \u062A\u06CE\u067E\u06D5\u0695\u06CE\u0646\u062F\u0631\u0627",labelMaxTotalFileSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5\u06CC \u06A9\u06C6\u06CC \u067E\u06D5\u0695\u06AF\u06D5 {filesize}",labelFileTypeNotAllowed:"\u062C\u06C6\u0631\u06CC \u067E\u06D5\u0695\u06AF\u06D5\u06A9\u06D5 \u0646\u0627\u062F\u0631\u0648\u0633\u062A\u06D5",fileValidateTypeLabelExpectedTypes:"\u062C\u06AF\u06D5 \u0644\u06D5 {allButLastType} \u06CC\u0627\u0646 {lastType}",imageValidateSizeLabelFormatError:"\u062C\u06C6\u0631\u06CC \u0648\u06CE\u0646\u06D5 \u067E\u0627\u06B5\u067E\u0634\u062A\u06CC\u06CC \u0646\u06D5\u06A9\u0631\u0627\u0648\u06D5",imageValidateSizeLabelImageSizeTooSmall:"\u0648\u06CE\u0646\u06D5\u06A9\u06D5 \u0632\u06C6\u0631 \u0628\u0686\u0648\u0648\u06A9\u06D5",imageValidateSizeLabelImageSizeTooBig:"\u0648\u06CE\u0646\u06D5\u06A9\u06D5 \u0632\u06C6\u0631 \u06AF\u06D5\u0648\u0631\u06D5\u06CC\u06D5",imageValidateSizeLabelExpectedMinSize:"\u06A9\u06D5\u0645\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC\u06D5\u06A9\u06D5\u06CC \u0632\u06C6\u0631 \u06A9\u06D5\u0645\u06D5",imageValidateSizeLabelImageResolutionTooHigh:"\u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC\u06D5\u06A9\u06D5\u06CC \u0632\u06C6\u0631 \u0628\u06D5\u0631\u0632\u06D5",imageValidateSizeLabelExpectedMinResolution:"\u06A9\u06D5\u0645\u062A\u0631\u06CC\u0646 \u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0648\u0631\u062F\u0628\u06CC\u0646\u06CC {maxResolution}"};var Po={labelIdle:'P\u0159et\xE1hn\u011Bte soubor sem (drag&drop) nebo Vyhledat ',labelInvalidField:"Pole obsahuje chybn\xE9 soubory",labelFileWaitingForSize:"Zji\u0161\u0165uje se velikost",labelFileSizeNotAvailable:"Velikost nen\xED zn\xE1m\xE1",labelFileLoading:"P\u0159en\xE1\u0161\xED se",labelFileLoadError:"Chyba p\u0159i p\u0159enosu",labelFileProcessing:"Prob\xEDh\xE1 upload",labelFileProcessingComplete:"Upload dokon\u010Den",labelFileProcessingAborted:"Upload stornov\xE1n",labelFileProcessingError:"Chyba p\u0159i uploadu",labelFileProcessingRevertError:"Chyba p\u0159i obnov\u011B",labelFileRemoveError:"Chyba p\u0159i odstran\u011Bn\xED",labelTapToCancel:"klepn\u011Bte pro storno",labelTapToRetry:"klepn\u011Bte pro opakov\xE1n\xED",labelTapToUndo:"klepn\u011Bte pro vr\xE1cen\xED",labelButtonRemoveItem:"Odstranit",labelButtonAbortItemLoad:"Storno",labelButtonRetryItemLoad:"Opakovat",labelButtonAbortItemProcessing:"Zp\u011Bt",labelButtonUndoItemProcessing:"Vr\xE1tit",labelButtonRetryItemProcessing:"Opakovat",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Soubor je p\u0159\xEDli\u0161 velk\xFD",labelMaxFileSize:"Nejv\u011Bt\u0161\xED velikost souboru je {filesize}",labelMaxTotalFileSizeExceeded:"P\u0159ekro\u010Dena maxim\xE1ln\xED celkov\xE1 velikost souboru",labelMaxTotalFileSize:"Maxim\xE1ln\xED celkov\xE1 velikost souboru je {filesize}",labelFileTypeNotAllowed:"Soubor je nespr\xE1vn\xE9ho typu",fileValidateTypeLabelExpectedTypes:"O\u010Dek\xE1v\xE1 se {allButLastType} nebo {lastType}",imageValidateSizeLabelFormatError:"Obr\xE1zek tohoto typu nen\xED podporov\xE1n",imageValidateSizeLabelImageSizeTooSmall:"Obr\xE1zek je p\u0159\xEDli\u0161 mal\xFD",imageValidateSizeLabelImageSizeTooBig:"Obr\xE1zek je p\u0159\xEDli\u0161 velk\xFD",imageValidateSizeLabelExpectedMinSize:"Minim\xE1ln\xED rozm\u011Br je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maxim\xE1ln\xED rozm\u011Br je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozli\u0161en\xED je p\u0159\xEDli\u0161 mal\xE9",imageValidateSizeLabelImageResolutionTooHigh:"Rozli\u0161en\xED je p\u0159\xEDli\u0161 velk\xE9",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1ln\xED rozli\u0161en\xED je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1ln\xED rozli\u0161en\xED je {maxResolution}"};var Fo={labelIdle:'Tr\xE6k & slip filer eller Gennemse ',labelInvalidField:"Felt indeholder ugyldige filer",labelFileWaitingForSize:"Venter p\xE5 st\xF8rrelse",labelFileSizeNotAvailable:"St\xF8rrelse ikke tilg\xE6ngelig",labelFileLoading:"Loader",labelFileLoadError:"Load fejlede",labelFileProcessing:"Uploader",labelFileProcessingComplete:"Upload f\xE6rdig",labelFileProcessingAborted:"Upload annulleret",labelFileProcessingError:"Upload fejlede",labelFileProcessingRevertError:"Fortryd fejlede",labelFileRemoveError:"Fjern fejlede",labelTapToCancel:"tryk for at annullere",labelTapToRetry:"tryk for at pr\xF8ve igen",labelTapToUndo:"tryk for at fortryde",labelButtonRemoveItem:"Fjern",labelButtonAbortItemLoad:"Annuller",labelButtonRetryItemLoad:"Fors\xF8g igen",labelButtonAbortItemProcessing:"Annuller",labelButtonUndoItemProcessing:"Fortryd",labelButtonRetryItemProcessing:"Pr\xF8v igen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Filen er for stor",labelMaxFileSize:"Maksimal filst\xF8rrelse er {filesize}",labelMaxTotalFileSizeExceeded:"Maksimal totalst\xF8rrelse overskredet",labelMaxTotalFileSize:"Maksimal total filst\xF8rrelse er {filesize}",labelFileTypeNotAllowed:"Ugyldig filtype",fileValidateTypeLabelExpectedTypes:"Forventer {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Ugyldigt format",imageValidateSizeLabelImageSizeTooSmall:"Billedet er for lille",imageValidateSizeLabelImageSizeTooBig:"Billedet er for stort",imageValidateSizeLabelExpectedMinSize:"Minimum st\xF8rrelse er {minBredde} \xD7 {minH\xF8jde}",imageValidateSizeLabelExpectedMaxSize:"Maksimal st\xF8rrelse er {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"For lav opl\xF8sning",imageValidateSizeLabelImageResolutionTooHigh:"For h\xF8j opl\xF8sning",imageValidateSizeLabelExpectedMinResolution:"Minimum opl\xF8sning er {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimal opl\xF8sning er {maxResolution}"};var Oo={labelIdle:'Dateien ablegen oder ausw\xE4hlen ',labelInvalidField:"Feld beinhaltet ung\xFCltige Dateien",labelFileWaitingForSize:"Dateigr\xF6\xDFe berechnen",labelFileSizeNotAvailable:"Dateigr\xF6\xDFe nicht verf\xFCgbar",labelFileLoading:"Laden",labelFileLoadError:"Fehler beim Laden",labelFileProcessing:"Upload l\xE4uft",labelFileProcessingComplete:"Upload abgeschlossen",labelFileProcessingAborted:"Upload abgebrochen",labelFileProcessingError:"Fehler beim Upload",labelFileProcessingRevertError:"Fehler beim Wiederherstellen",labelFileRemoveError:"Fehler beim L\xF6schen",labelTapToCancel:"abbrechen",labelTapToRetry:"erneut versuchen",labelTapToUndo:"r\xFCckg\xE4ngig",labelButtonRemoveItem:"Entfernen",labelButtonAbortItemLoad:"Verwerfen",labelButtonRetryItemLoad:"Erneut versuchen",labelButtonAbortItemProcessing:"Abbrechen",labelButtonUndoItemProcessing:"R\xFCckg\xE4ngig",labelButtonRetryItemProcessing:"Erneut versuchen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Datei ist zu gro\xDF",labelMaxFileSize:"Maximale Dateigr\xF6\xDFe: {filesize}",labelMaxTotalFileSizeExceeded:"Maximale gesamte Dateigr\xF6\xDFe \xFCberschritten",labelMaxTotalFileSize:"Maximale gesamte Dateigr\xF6\xDFe: {filesize}",labelFileTypeNotAllowed:"Dateityp ung\xFCltig",fileValidateTypeLabelExpectedTypes:"Erwartet {allButLastType} oder {lastType}",imageValidateSizeLabelFormatError:"Bildtyp nicht unterst\xFCtzt",imageValidateSizeLabelImageSizeTooSmall:"Bild ist zu klein",imageValidateSizeLabelImageSizeTooBig:"Bild ist zu gro\xDF",imageValidateSizeLabelExpectedMinSize:"Mindestgr\xF6\xDFe: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximale Gr\xF6\xDFe: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Aufl\xF6sung ist zu niedrig",imageValidateSizeLabelImageResolutionTooHigh:"Aufl\xF6sung ist zu hoch",imageValidateSizeLabelExpectedMinResolution:"Mindestaufl\xF6sung: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximale Aufl\xF6sung: {maxResolution}"};var Do={labelIdle:'\u03A3\u03CD\u03C1\u03B5\u03C4\u03B5 \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C3\u03B1\u03C2 \u03C3\u03C4\u03BF \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF \u03AE \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 ',labelInvalidField:"\u03A4\u03BF \u03C0\u03B5\u03B4\u03AF\u03BF \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BC\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1",labelFileWaitingForSize:"\u03A3\u03B5 \u03B1\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03B3\u03B9\u03B1 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2",labelFileSizeNotAvailable:"\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03BC\u03B7 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03BF",labelFileLoading:"\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03C3\u03B5 \u03B5\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7",labelFileLoadError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7",labelFileProcessing:"\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1",labelFileProcessingComplete:"\u0397 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5",labelFileProcessingAborted:"\u0397 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B1\u03BA\u03C5\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5",labelFileProcessingError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1",labelFileProcessingRevertError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC",labelFileRemoveError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE",labelTapToCancel:"\u03C0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03B1\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7",labelTapToRetry:"\u03C0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7",labelTapToUndo:"\u03C0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03B1\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7",labelButtonRemoveItem:"\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7",labelButtonAbortItemLoad:"\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7",labelButtonRetryItemLoad:"\u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7",labelButtonAbortItemProcessing:"\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7",labelButtonUndoItemProcessing:"\u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7",labelButtonRetryItemProcessing:"\u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7",labelButtonProcessItem:"\u039C\u03B5\u03C4\u03B1\u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7",labelMaxFileSizeExceeded:"\u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF",labelMaxFileSize:"\u03A4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 {filesize}",labelMaxTotalFileSizeExceeded:"\u03A5\u03C0\u03AD\u03C1\u03B2\u03B1\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C5 \u03C3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03BF\u03CD \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2",labelMaxTotalFileSize:"\u03A4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03C3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 {filesize}",labelFileTypeNotAllowed:"\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5",fileValidateTypeLabelExpectedTypes:"\u03A4\u03B1 \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 {allButLastType} \u03AE {lastType}",imageValidateSizeLabelFormatError:"\u039F \u03C4\u03CD\u03C0\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B4\u03B5\u03BD \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9",imageValidateSizeLabelImageSizeTooSmall:"\u0397 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B9\u03BA\u03C1\u03AE",imageValidateSizeLabelImageSizeTooBig:"\u0397 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7",imageValidateSizeLabelExpectedMinSize:"\u03A4\u03BF \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u03A4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0397 \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03C7\u03B1\u03BC\u03B7\u03BB\u03AE",imageValidateSizeLabelImageResolutionTooHigh:"\u0397 \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03C5\u03C8\u03B7\u03BB\u03AE",imageValidateSizeLabelExpectedMinResolution:"\u0397 \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03AE \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0397 \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03AE \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 {maxResolution}"};var Co={labelIdle:'Drag & Drop your files or Browse ',labelInvalidField:"Field contains invalid files",labelFileWaitingForSize:"Waiting for size",labelFileSizeNotAvailable:"Size not available",labelFileLoading:"Loading",labelFileLoadError:"Error during load",labelFileProcessing:"Uploading",labelFileProcessingComplete:"Upload complete",labelFileProcessingAborted:"Upload cancelled",labelFileProcessingError:"Error during upload",labelFileProcessingRevertError:"Error during revert",labelFileRemoveError:"Error during remove",labelTapToCancel:"tap to cancel",labelTapToRetry:"tap to retry",labelTapToUndo:"tap to undo",labelButtonRemoveItem:"Remove",labelButtonAbortItemLoad:"Abort",labelButtonRetryItemLoad:"Retry",labelButtonAbortItemProcessing:"Cancel",labelButtonUndoItemProcessing:"Undo",labelButtonRetryItemProcessing:"Retry",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"File is too large",labelMaxFileSize:"Maximum file size is {filesize}",labelMaxTotalFileSizeExceeded:"Maximum total size exceeded",labelMaxTotalFileSize:"Maximum total file size is {filesize}",labelFileTypeNotAllowed:"File of invalid type",fileValidateTypeLabelExpectedTypes:"Expects {allButLastType} or {lastType}",imageValidateSizeLabelFormatError:"Image type not supported",imageValidateSizeLabelImageSizeTooSmall:"Image is too small",imageValidateSizeLabelImageSizeTooBig:"Image is too big",imageValidateSizeLabelExpectedMinSize:"Minimum size is {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum size is {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolution is too low",imageValidateSizeLabelImageResolutionTooHigh:"Resolution is too high",imageValidateSizeLabelExpectedMinResolution:"Minimum resolution is {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum resolution is {maxResolution}"};var Bo={labelIdle:'Arrastra y suelta tus archivos o Examina ',labelInvalidField:"El campo contiene archivos inv\xE1lidos",labelFileWaitingForSize:"Esperando tama\xF1o",labelFileSizeNotAvailable:"Tama\xF1o no disponible",labelFileLoading:"Cargando",labelFileLoadError:"Error durante la carga",labelFileProcessing:"Subiendo",labelFileProcessingComplete:"Subida completa",labelFileProcessingAborted:"Subida cancelada",labelFileProcessingError:"Error durante la subida",labelFileProcessingRevertError:"Error durante la reversi\xF3n",labelFileRemoveError:"Error durante la eliminaci\xF3n",labelTapToCancel:"toca para cancelar",labelTapToRetry:"tocar para reintentar",labelTapToUndo:"tocar para deshacer",labelButtonRemoveItem:"Eliminar",labelButtonAbortItemLoad:"Cancelar",labelButtonRetryItemLoad:"Reintentar",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Deshacer",labelButtonRetryItemProcessing:"Reintentar",labelButtonProcessItem:"Subir",labelMaxFileSizeExceeded:"El archivo es demasiado grande",labelMaxFileSize:"El tama\xF1o m\xE1ximo del archivo es {filesize}",labelMaxTotalFileSizeExceeded:"Tama\xF1o total m\xE1ximo excedido",labelMaxTotalFileSize:"El tama\xF1o total m\xE1ximo del archivo es {filesize}",labelFileTypeNotAllowed:"Archivo de tipo inv\xE1lido",fileValidateTypeLabelExpectedTypes:"Espera {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagen no soportada",imageValidateSizeLabelImageSizeTooSmall:"La imagen es demasiado peque\xF1a",imageValidateSizeLabelImageSizeTooBig:"La imagen es demasiado grande",imageValidateSizeLabelExpectedMinSize:"El tama\xF1o m\xEDnimo es {minWidth} x {minHeight}",imageValidateSizeLabelExpectedMaxSize:"El tama\xF1o m\xE1ximo es {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La resoluci\xF3n es demasiado baja",imageValidateSizeLabelImageResolutionTooHigh:"La resoluci\xF3n es demasiado alta",imageValidateSizeLabelExpectedMinResolution:"La resoluci\xF3n m\xEDnima es {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La resoluci\xF3n m\xE1xima es {maxResolution}"};var ko={labelIdle:'\u0641\u0627\u06CC\u0644 \u0631\u0627 \u0627\u06CC\u0646\u062C\u0627 \u0628\u06A9\u0634\u06CC\u062F \u0648 \u0631\u0647\u0627 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u062C\u0633\u062A\u062C\u0648 \u06A9\u0646\u06CC\u062F ',labelInvalidField:"\u0641\u06CC\u0644\u062F \u062F\u0627\u0631\u0627\u06CC \u0641\u0627\u06CC\u0644 \u0647\u0627\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",labelFileWaitingForSize:"Waiting for size",labelFileSizeNotAvailable:"\u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 \u0645\u062C\u0627\u0632 \u0646\u06CC\u0633\u062A",labelFileLoading:"\u062F\u0631\u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileLoadError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0627\u062C\u0631\u0627",labelFileProcessing:"\u062F\u0631\u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileProcessingComplete:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u06A9\u0627\u0645\u0644 \u0634\u062F",labelFileProcessingAborted:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0644\u063A\u0648 \u0634\u062F",labelFileProcessingError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileProcessingRevertError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u062D\u0630\u0641",labelFileRemoveError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u062D\u0630\u0641",labelTapToCancel:"\u0628\u0631\u0627\u06CC \u0644\u063A\u0648 \u0636\u0631\u0628\u0647 \u0628\u0632\u0646\u06CC\u062F",labelTapToRetry:"\u0628\u0631\u0627\u06CC \u062A\u06A9\u0631\u0627\u0631 \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",labelTapToUndo:"\u0628\u0631\u0627\u06CC \u0628\u0631\u06AF\u0634\u062A \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",labelButtonRemoveItem:"\u062D\u0630\u0641",labelButtonAbortItemLoad:"\u0644\u063A\u0648",labelButtonRetryItemLoad:"\u062A\u06A9\u0631\u0627\u0631",labelButtonAbortItemProcessing:"\u0644\u063A\u0648",labelButtonUndoItemProcessing:"\u0628\u0631\u06AF\u0634\u062A",labelButtonRetryItemProcessing:"\u062A\u06A9\u0631\u0627\u0631",labelButtonProcessItem:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelMaxFileSizeExceeded:"\u0641\u0627\u06CC\u0644 \u0628\u0633\u06CC\u0627\u0631 \u062D\u062C\u06CC\u0645 \u0627\u0633\u062A",labelMaxFileSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0645\u062C\u0627\u0632 \u0641\u0627\u06CC\u0644 {filesize} \u0627\u0633\u062A",labelMaxTotalFileSizeExceeded:"\u0627\u0632 \u062D\u062F\u0627\u06A9\u062B\u0631 \u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 \u0628\u06CC\u0634\u062A\u0631 \u0634\u062F",labelMaxTotalFileSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 {filesize} \u0627\u0633\u062A",labelFileTypeNotAllowed:"\u0646\u0648\u0639 \u0641\u0627\u06CC\u0644 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",fileValidateTypeLabelExpectedTypes:"\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 {allButLastType} \u06CC\u0627 {lastType}",imageValidateSizeLabelFormatError:"\u0641\u0631\u0645\u062A \u062A\u0635\u0648\u06CC\u0631 \u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0646\u0645\u06CC \u0634\u0648\u062F",imageValidateSizeLabelImageSizeTooSmall:"\u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u06A9\u0648\u0686\u06A9 \u0627\u0633\u062A",imageValidateSizeLabelImageSizeTooBig:"\u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u0628\u0632\u0631\u06AF \u0627\u0633\u062A",imageValidateSizeLabelExpectedMinSize:"\u062D\u062F\u0627\u0642\u0644 \u0627\u0646\u062F\u0627\u0632\u0647 {minWidth} \xD7 {minHeight} \u0627\u0633\u062A",imageValidateSizeLabelExpectedMaxSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0627\u0646\u062F\u0627\u0632\u0647 {maxWidth} \xD7 {maxHeight} \u0627\u0633\u062A",imageValidateSizeLabelImageResolutionTooLow:"\u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u06A9\u0645 \u0627\u0633\u062A",imageValidateSizeLabelImageResolutionTooHigh:"\u0648\u0636\u0648\u0639 \u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u0632\u06CC\u0627\u062F \u0627\u0633\u062A",imageValidateSizeLabelExpectedMinResolution:"\u062D\u062F\u0627\u0642\u0644 \u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 {minResolution} \u0627\u0633\u062A",imageValidateSizeLabelExpectedMaxResolution:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 {maxResolution} \u0627\u0633\u062A"};var No={labelIdle:'Ved\xE4 ja pudota tiedostoja tai Selaa ',labelInvalidField:"Kent\xE4ss\xE4 on virheellisi\xE4 tiedostoja",labelFileWaitingForSize:"Odotetaan kokoa",labelFileSizeNotAvailable:"Kokoa ei saatavilla",labelFileLoading:"Ladataan",labelFileLoadError:"Virhe latauksessa",labelFileProcessing:"L\xE4hetet\xE4\xE4n",labelFileProcessingComplete:"L\xE4hetys valmis",labelFileProcessingAborted:"L\xE4hetys peruttu",labelFileProcessingError:"Virhe l\xE4hetyksess\xE4",labelFileProcessingRevertError:"Virhe palautuksessa",labelFileRemoveError:"Virhe poistamisessa",labelTapToCancel:"peruuta napauttamalla",labelTapToRetry:"yrit\xE4 uudelleen napauttamalla",labelTapToUndo:"kumoa napauttamalla",labelButtonRemoveItem:"Poista",labelButtonAbortItemLoad:"Keskeyt\xE4",labelButtonRetryItemLoad:"Yrit\xE4 uudelleen",labelButtonAbortItemProcessing:"Peruuta",labelButtonUndoItemProcessing:"Kumoa",labelButtonRetryItemProcessing:"Yrit\xE4 uudelleen",labelButtonProcessItem:"L\xE4het\xE4",labelMaxFileSizeExceeded:"Tiedoston koko on liian suuri",labelMaxFileSize:"Tiedoston maksimikoko on {filesize}",labelMaxTotalFileSizeExceeded:"Tiedostojen yhdistetty maksimikoko ylitetty",labelMaxTotalFileSize:"Tiedostojen yhdistetty maksimikoko on {filesize}",labelFileTypeNotAllowed:"Tiedostotyyppi\xE4 ei sallita",fileValidateTypeLabelExpectedTypes:"Sallitaan {allButLastType} tai {lastType}",imageValidateSizeLabelFormatError:"Kuvatyyppi\xE4 ei tueta",imageValidateSizeLabelImageSizeTooSmall:"Kuva on liian pieni",imageValidateSizeLabelImageSizeTooBig:"Kuva on liian suuri",imageValidateSizeLabelExpectedMinSize:"Minimikoko on {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimikoko on {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resoluutio on liian pieni",imageValidateSizeLabelImageResolutionTooHigh:"Resoluutio on liian suuri",imageValidateSizeLabelExpectedMinResolution:"Minimiresoluutio on {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimiresoluutio on {maxResolution}"};var Vo={labelIdle:'Faites glisser vos fichiers ou Parcourir ',labelInvalidField:"Le champ contient des fichiers invalides",labelFileWaitingForSize:"En attente de taille",labelFileSizeNotAvailable:"Taille non disponible",labelFileLoading:"Chargement",labelFileLoadError:"Erreur durant le chargement",labelFileProcessing:"Traitement",labelFileProcessingComplete:"Traitement effectu\xE9",labelFileProcessingAborted:"Traitement interrompu",labelFileProcessingError:"Erreur durant le traitement",labelFileProcessingRevertError:"Erreur durant la restauration",labelFileRemoveError:"Erreur durant la suppression",labelTapToCancel:"appuyer pour annuler",labelTapToRetry:"appuyer pour r\xE9essayer",labelTapToUndo:"appuyer pour revenir en arri\xE8re",labelButtonRemoveItem:"Retirer",labelButtonAbortItemLoad:"Annuler",labelButtonRetryItemLoad:"Recommencer",labelButtonAbortItemProcessing:"Annuler",labelButtonUndoItemProcessing:"Revenir en arri\xE8re",labelButtonRetryItemProcessing:"Recommencer",labelButtonProcessItem:"Transf\xE9rer",labelMaxFileSizeExceeded:"Le fichier est trop volumineux",labelMaxFileSize:"La taille maximale de fichier est {filesize}",labelMaxTotalFileSizeExceeded:"Taille totale maximale d\xE9pass\xE9e",labelMaxTotalFileSize:"La taille totale maximale des fichiers est {filesize}",labelFileTypeNotAllowed:"Fichier non valide",fileValidateTypeLabelExpectedTypes:"Attendu {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Type d'image non pris en charge",imageValidateSizeLabelImageSizeTooSmall:"L'image est trop petite",imageValidateSizeLabelImageSizeTooBig:"L'image est trop grande",imageValidateSizeLabelExpectedMinSize:"La taille minimale est {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La taille maximale est {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La r\xE9solution est trop faible",imageValidateSizeLabelImageResolutionTooHigh:"La r\xE9solution est trop \xE9lev\xE9e",imageValidateSizeLabelExpectedMinResolution:"La r\xE9solution minimale est {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La r\xE9solution maximale est {maxResolution}"};var Go={labelIdle:'\u05D2\u05E8\u05D5\u05E8 \u05D5\u05E9\u05D7\u05E8\u05E8 \u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05DB\u05D0\u05DF \u05D0\u05D5 \u05DC\u05D7\u05E5 \u05DB\u05D0\u05DF \u05DC\u05D1\u05D7\u05D9\u05E8\u05D4 ',labelInvalidField:"\u05E7\u05D5\u05D1\u05E5 \u05DC\u05D0 \u05D7\u05D5\u05E7\u05D9",labelFileWaitingForSize:"\u05DE\u05D7\u05E9\u05D1 \u05D0\u05EA \u05D2\u05D5\u05D3\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileSizeNotAvailable:"\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E7\u05D1\u05D5\u05E2 \u05D0\u05EA \u05D2\u05D5\u05D3\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileLoading:"\u05D8\u05D5\u05E2\u05DF...",labelFileLoadError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileProcessing:"\u05DE\u05E2\u05DC\u05D4 \u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileProcessingComplete:"\u05D4\u05E2\u05DC\u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4",labelFileProcessingAborted:"\u05D4\u05E2\u05DC\u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D1\u05D5\u05D8\u05DC\u05D4",labelFileProcessingError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05D4\u05E2\u05DC\u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileProcessingRevertError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05E9\u05D7\u05D6\u05D5\u05E8 \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileRemoveError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05D4\u05E1\u05E8\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5",labelTapToCancel:"\u05D4\u05E7\u05DC\u05E7 \u05DC\u05D1\u05D9\u05D8\u05D5\u05DC",labelTapToRetry:"\u05D4\u05E7\u05DC\u05E7 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05E0\u05D9\u05EA",labelTapToUndo:"\u05D4\u05E7\u05DC\u05E7 \u05DC\u05E9\u05D7\u05D6\u05E8",labelButtonRemoveItem:"\u05D4\u05E1\u05E8",labelButtonAbortItemLoad:"\u05D1\u05D8\u05DC",labelButtonRetryItemLoad:"\u05D8\u05E2\u05DF \u05E9\u05E0\u05D9\u05EA",labelButtonAbortItemProcessing:"\u05D1\u05D8\u05DC",labelButtonUndoItemProcessing:"\u05E9\u05D7\u05D6\u05E8",labelButtonRetryItemProcessing:"\u05E0\u05E1\u05D4 \u05E9\u05E0\u05D9\u05EA",labelButtonProcessItem:"\u05D4\u05E2\u05DC\u05D4 \u05E7\u05D5\u05D1\u05E5",labelMaxFileSizeExceeded:"\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9",labelMaxFileSize:"\u05D2\u05D5\u05D3\u05DC \u05D4\u05DE\u05D9\u05E8\u05D1\u05D9 \u05D4\u05DE\u05D5\u05EA\u05E8 \u05D4\u05D5\u05D0: {filesize}",labelMaxTotalFileSizeExceeded:"\u05D2\u05D5\u05D3\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D7\u05D5\u05E8\u05D2 \u05DE\u05D4\u05DB\u05DE\u05D5\u05EA \u05D4\u05DE\u05D5\u05EA\u05E8\u05EA",labelMaxTotalFileSize:"\u05D4\u05D2\u05D5\u05D3\u05DC \u05D4\u05DE\u05D9\u05E8\u05D1\u05D9 \u05E9\u05DC \u05E1\u05DA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD: {filesize}",labelFileTypeNotAllowed:"\u05E7\u05D5\u05D1\u05E5 \u05DE\u05E1\u05D5\u05D2 \u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05EA\u05E8",fileValidateTypeLabelExpectedTypes:"\u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D4\u05DE\u05D5\u05EA\u05E8\u05D9\u05DD \u05D4\u05DD {allButLastType} \u05D0\u05D5 {lastType}",imageValidateSizeLabelFormatError:"\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 \u05D6\u05D4 \u05D0\u05D9\u05E0\u05D4 \u05E0\u05EA\u05DE\u05DB\u05EA",imageValidateSizeLabelImageSizeTooSmall:"\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05E7\u05D8\u05E0\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelImageSizeTooBig:"\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05D2\u05D3\u05D5\u05DC\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelExpectedMinSize:"\u05D4\u05D2\u05D5\u05D3\u05DC \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA \u05DC\u05E4\u05D7\u05D5\u05EA: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u05D4\u05D2\u05D5\u05D3\u05DC \u05D4\u05DE\u05E8\u05D1\u05D9 \u05D4\u05DE\u05D5\u05EA\u05E8: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05E9\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05E0\u05DE\u05D5\u05DB\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelImageResolutionTooHigh:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05E9\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05D2\u05D1\u05D5\u05D4\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelExpectedMinResolution:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05D9\u05D5\u05EA \u05DC\u05E4\u05D7\u05D5\u05EA: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05D4\u05DE\u05D9\u05E8\u05D1\u05D9\u05EA \u05D4\u05DE\u05D5\u05EA\u05E8\u05EA \u05D4\u05D9\u05D0: {maxResolution}"};var Uo={labelIdle:'Ovdje "ispusti" datoteku ili Pretra\u017Ei ',labelInvalidField:"Polje sadr\u017Ei neispravne datoteke",labelFileWaitingForSize:"\u010Cekanje na veli\u010Dinu datoteke",labelFileSizeNotAvailable:"Veli\u010Dina datoteke nije dostupna",labelFileLoading:"U\u010Ditavanje",labelFileLoadError:"Gre\u0161ka tijekom u\u010Ditavanja",labelFileProcessing:"Prijenos",labelFileProcessingComplete:"Prijenos zavr\u0161en",labelFileProcessingAborted:"Prijenos otkazan",labelFileProcessingError:"Gre\u0161ka tijekom prijenosa",labelFileProcessingRevertError:"Gre\u0161ka tijekom vra\u0107anja",labelFileRemoveError:"Gre\u0161ka tijekom uklananja datoteke",labelTapToCancel:"Dodirni za prekid",labelTapToRetry:"Dodirni za ponovno",labelTapToUndo:"Dodirni za vra\u0107anje",labelButtonRemoveItem:"Ukloni",labelButtonAbortItemLoad:"Odbaci",labelButtonRetryItemLoad:"Ponovi",labelButtonAbortItemProcessing:"Prekini",labelButtonUndoItemProcessing:"Vrati",labelButtonRetryItemProcessing:"Ponovi",labelButtonProcessItem:"Prijenos",labelMaxFileSizeExceeded:"Datoteka je prevelika",labelMaxFileSize:"Maksimalna veli\u010Dina datoteke je {filesize}",labelMaxTotalFileSizeExceeded:"Maksimalna ukupna veli\u010Dina datoteke prekora\u010Dena",labelMaxTotalFileSize:"Maksimalna ukupna veli\u010Dina datoteke je {filesize}",labelFileTypeNotAllowed:"Tip datoteke nije podr\u017Ean",fileValidateTypeLabelExpectedTypes:"O\u010Dekivan {allButLastType} ili {lastType}",imageValidateSizeLabelFormatError:"Tip slike nije podr\u017Ean",imageValidateSizeLabelImageSizeTooSmall:"Slika je premala",imageValidateSizeLabelImageSizeTooBig:"Slika je prevelika",imageValidateSizeLabelExpectedMinSize:"Minimalna veli\u010Dina je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimalna veli\u010Dina je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezolucija je preniska",imageValidateSizeLabelImageResolutionTooHigh:"Rezolucija je previsoka",imageValidateSizeLabelExpectedMinResolution:"Minimalna rezolucija je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimalna rezolucija je {maxResolution}"};var Ho={labelIdle:'Mozgasd ide a f\xE1jlt a felt\xF6lt\xE9shez, vagy tall\xF3z\xE1s ',labelInvalidField:"A mez\u0151 \xE9rv\xE9nytelen f\xE1jlokat tartalmaz",labelFileWaitingForSize:"F\xE1ljm\xE9ret kisz\xE1mol\xE1sa",labelFileSizeNotAvailable:"A f\xE1jlm\xE9ret nem el\xE9rhet\u0151",labelFileLoading:"T\xF6lt\xE9s",labelFileLoadError:"Hiba a bet\xF6lt\xE9s sor\xE1n",labelFileProcessing:"Felt\xF6lt\xE9s",labelFileProcessingComplete:"Sikeres felt\xF6lt\xE9s",labelFileProcessingAborted:"A felt\xF6lt\xE9s megszak\xEDtva",labelFileProcessingError:"Hiba t\xF6rt\xE9nt a felt\xF6lt\xE9s sor\xE1n",labelFileProcessingRevertError:"Hiba a vissza\xE1ll\xEDt\xE1s sor\xE1n",labelFileRemoveError:"Hiba t\xF6rt\xE9nt az elt\xE1vol\xEDt\xE1s sor\xE1n",labelTapToCancel:"koppints a t\xF6rl\xE9shez",labelTapToRetry:"koppints az \xFAjrakezd\xE9shez",labelTapToUndo:"koppints a visszavon\xE1shoz",labelButtonRemoveItem:"Elt\xE1vol\xEDt\xE1s",labelButtonAbortItemLoad:"Megszak\xEDt\xE1s",labelButtonRetryItemLoad:"\xDAjrapr\xF3b\xE1lkoz\xE1s",labelButtonAbortItemProcessing:"Megszak\xEDt\xE1s",labelButtonUndoItemProcessing:"Visszavon\xE1s",labelButtonRetryItemProcessing:"\xDAjrapr\xF3b\xE1lkoz\xE1s",labelButtonProcessItem:"Felt\xF6lt\xE9s",labelMaxFileSizeExceeded:"A f\xE1jl t\xFAll\xE9pte a maxim\xE1lis m\xE9retet",labelMaxFileSize:"Maxim\xE1lis f\xE1jlm\xE9ret: {filesize}",labelMaxTotalFileSizeExceeded:"T\xFAll\xE9pte a maxim\xE1lis teljes m\xE9retet",labelMaxTotalFileSize:"A maxim\xE1is teljes f\xE1jlm\xE9ret: {filesize}",labelFileTypeNotAllowed:"\xC9rv\xE9nytelen t\xEDpus\xFA f\xE1jl",fileValidateTypeLabelExpectedTypes:"Enged\xE9lyezett t\xEDpusok {allButLastType} vagy {lastType}",imageValidateSizeLabelFormatError:"A k\xE9pt\xEDpus nem t\xE1mogatott",imageValidateSizeLabelImageSizeTooSmall:"A k\xE9p t\xFAl kicsi",imageValidateSizeLabelImageSizeTooBig:"A k\xE9p t\xFAl nagy",imageValidateSizeLabelExpectedMinSize:"Minimum m\xE9ret: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum m\xE9ret: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"A felbont\xE1s t\xFAl alacsony",imageValidateSizeLabelImageResolutionTooHigh:"A felbont\xE1s t\xFAl magas",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1is felbont\xE1s: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1lis felbont\xE1s: {maxResolution}"};var Wo={labelIdle:'Seret & Jatuhkan berkas Anda atau Jelajahi',labelInvalidField:"Isian berisi berkas yang tidak valid",labelFileWaitingForSize:"Menunggu ukuran berkas",labelFileSizeNotAvailable:"Ukuran berkas tidak tersedia",labelFileLoading:"Memuat",labelFileLoadError:"Kesalahan saat memuat",labelFileProcessing:"Mengunggah",labelFileProcessingComplete:"Pengunggahan selesai",labelFileProcessingAborted:"Pengunggahan dibatalkan",labelFileProcessingError:"Kesalahan saat pengunggahan",labelFileProcessingRevertError:"Kesalahan saat pemulihan",labelFileRemoveError:"Kesalahan saat penghapusan",labelTapToCancel:"ketuk untuk membatalkan",labelTapToRetry:"ketuk untuk mencoba lagi",labelTapToUndo:"ketuk untuk mengurungkan",labelButtonRemoveItem:"Hapus",labelButtonAbortItemLoad:"Batalkan",labelButtonRetryItemLoad:"Coba Kembali",labelButtonAbortItemProcessing:"Batalkan",labelButtonUndoItemProcessing:"Urungkan",labelButtonRetryItemProcessing:"Coba Kembali",labelButtonProcessItem:"Unggah",labelMaxFileSizeExceeded:"Berkas terlalu besar",labelMaxFileSize:"Ukuran berkas maksimum adalah {filesize}",labelMaxTotalFileSizeExceeded:"Jumlah berkas maksimum terlampaui",labelMaxTotalFileSize:"Jumlah berkas maksimum adalah {filesize}",labelFileTypeNotAllowed:"Jenis berkas tidak valid",fileValidateTypeLabelExpectedTypes:"Mengharapkan {allButLastType} atau {lastType}",imageValidateSizeLabelFormatError:"Jenis citra tidak didukung",imageValidateSizeLabelImageSizeTooSmall:"Citra terlalu kecil",imageValidateSizeLabelImageSizeTooBig:"Citra terlalu besar",imageValidateSizeLabelExpectedMinSize:"Ukuran minimum adalah {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Ukuran maksimum adalah {minWidth} \xD7 {minHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolusi terlalu rendah",imageValidateSizeLabelImageResolutionTooHigh:"Resolusi terlalu tinggi",imageValidateSizeLabelExpectedMinResolution:"Resolusi minimum adalah {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Resolusi maksimum adalah {maxResolution}"};var jo={labelIdle:'Trascina e rilascia i tuoi file oppure Sfoglia ',labelInvalidField:"Il campo contiene dei file non validi",labelFileWaitingForSize:"In attesa della dimensione",labelFileSizeNotAvailable:"Dimensione non disponibile",labelFileLoading:"Caricamento",labelFileLoadError:"Errore durante il caricamento",labelFileProcessing:"Caricamento",labelFileProcessingComplete:"Caricamento completato",labelFileProcessingAborted:"Caricamento cancellato",labelFileProcessingError:"Errore durante il caricamento",labelFileProcessingRevertError:"Errore durante il ripristino",labelFileRemoveError:"Errore durante l'eliminazione",labelTapToCancel:"tocca per cancellare",labelTapToRetry:"tocca per riprovare",labelTapToUndo:"tocca per ripristinare",labelButtonRemoveItem:"Elimina",labelButtonAbortItemLoad:"Cancella",labelButtonRetryItemLoad:"Ritenta",labelButtonAbortItemProcessing:"Cancella",labelButtonUndoItemProcessing:"Indietro",labelButtonRetryItemProcessing:"Ritenta",labelButtonProcessItem:"Carica",labelMaxFileSizeExceeded:"La dimensione del file \xE8 eccessiva",labelMaxFileSize:"La dimensione massima del file \xE8 {filesize}",labelMaxTotalFileSizeExceeded:"Dimensione totale massima superata",labelMaxTotalFileSize:"La dimensione massima totale dei file \xE8 {filesize}",labelFileTypeNotAllowed:"File non supportato",fileValidateTypeLabelExpectedTypes:"Aspetta {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipo di immagine non supportata",imageValidateSizeLabelImageSizeTooSmall:"L'immagine \xE8 troppo piccola",imageValidateSizeLabelImageSizeTooBig:"L'immagine \xE8 troppo grande",imageValidateSizeLabelExpectedMinSize:"La dimensione minima \xE8 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La dimensione massima \xE8 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La risoluzione \xE8 troppo bassa",imageValidateSizeLabelImageResolutionTooHigh:"La risoluzione \xE8 troppo alta",imageValidateSizeLabelExpectedMinResolution:"La risoluzione minima \xE8 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La risoluzione massima \xE8 {maxResolution}"};var Yo={labelIdle:'\u30D5\u30A1\u30A4\u30EB\u3092\u30C9\u30E9\u30C3\u30B0&\u30C9\u30ED\u30C3\u30D7\u53C8\u306F\u30D5\u30A1\u30A4\u30EB\u9078\u629E',labelInvalidField:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3067\u304D\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059",labelFileWaitingForSize:"\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u3092\u5F85\u3063\u3066\u3044\u307E\u3059",labelFileSizeNotAvailable:"\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u304C\u307F\u3064\u304B\u308A\u307E\u305B\u3093",labelFileLoading:"\u8AAD\u8FBC\u4E2D...",labelFileLoadError:"\u8AAD\u8FBC\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelFileProcessing:"\u8AAD\u8FBC\u4E2D...",labelFileProcessingComplete:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u5B8C\u4E86",labelFileProcessingAborted:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F",labelFileProcessingError:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelFileProcessingRevertError:"\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelFileRemoveError:"\u524A\u9664\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelTapToCancel:"\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30AD\u30E3\u30F3\u30BB\u30EB",labelTapToRetry:"\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u4E0B\u3055\u3044",labelTapToUndo:"\u5143\u306B\u623B\u3059\u306B\u306F\u30BF\u30C3\u30D7\u3057\u307E\u3059",labelButtonRemoveItem:"\u524A\u9664",labelButtonAbortItemLoad:"\u4E2D\u65AD",labelButtonRetryItemLoad:"\u3082\u3046\u4E00\u5EA6\u5B9F\u884C",labelButtonAbortItemProcessing:"\u30AD\u30E3\u30F3\u30BB\u30EB",labelButtonUndoItemProcessing:"\u5143\u306B\u623B\u3059",labelButtonRetryItemProcessing:"\u3082\u3046\u4E00\u5EA6\u5B9F\u884C",labelButtonProcessItem:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",labelMaxFileSizeExceeded:"\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u304C\u5927\u304D\u3059\u304E\u307E\u3059",labelMaxFileSize:"\u6700\u5927\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u306F {filesize} \u3067\u3059",labelMaxTotalFileSizeExceeded:"\u6700\u5927\u5408\u8A08\u30B5\u30A4\u30BA\u3092\u8D85\u3048\u307E\u3057\u305F",labelMaxTotalFileSize:"\u6700\u5927\u5408\u8A08\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u306F {filesize} \u3067\u3059",labelFileTypeNotAllowed:"\u7121\u52B9\u306A\u30D5\u30A1\u30A4\u30EB\u3067\u3059",fileValidateTypeLabelExpectedTypes:"\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u308B\u30D5\u30A1\u30A4\u30EB\u306F {allButLastType} \u53C8\u306F {lastType} \u3067\u3059",imageValidateSizeLabelFormatError:"\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u306A\u3044\u753B\u50CF\u3067\u3059",imageValidateSizeLabelImageSizeTooSmall:"\u753B\u50CF\u304C\u5C0F\u3055\u3059\u304E\u307E\u3059",imageValidateSizeLabelImageSizeTooBig:"\u753B\u50CF\u304C\u5927\u304D\u3059\u304E\u307E\u3059",imageValidateSizeLabelExpectedMinSize:"\u753B\u50CF\u306E\u6700\u5C0F\u30B5\u30A4\u30BA\u306F{minWidth}\xD7{minHeight}\u3067\u3059",imageValidateSizeLabelExpectedMaxSize:"\u753B\u50CF\u306E\u6700\u5927\u30B5\u30A4\u30BA\u306F{maxWidth} \xD7 {maxHeight}\u3067\u3059",imageValidateSizeLabelImageResolutionTooLow:"\u753B\u50CF\u306E\u89E3\u50CF\u5EA6\u304C\u4F4E\u3059\u304E\u307E\u3059",imageValidateSizeLabelImageResolutionTooHigh:"\u753B\u50CF\u306E\u89E3\u50CF\u5EA6\u304C\u9AD8\u3059\u304E\u307E\u3059",imageValidateSizeLabelExpectedMinResolution:"\u753B\u50CF\u306E\u6700\u5C0F\u89E3\u50CF\u5EA6\u306F{minResolution}\u3067\u3059",imageValidateSizeLabelExpectedMaxResolution:"\u753B\u50CF\u306E\u6700\u5927\u89E3\u50CF\u5EA6\u306F{maxResolution}\u3067\u3059"};var qo={labelIdle:'\u1791\u17B6\u1789&\u178A\u17B6\u1780\u17CB\u17A0\u17D2\u179C\u17B6\u179B\u17CB\u17AF\u1780\u179F\u17B6\u179A\u179A\u1794\u179F\u17CB\u17A2\u17D2\u1793\u1780 \u17AC \u179F\u17D2\u179C\u17C2\u1784\u179A\u1780 ',labelInvalidField:"\u1785\u1793\u17D2\u179B\u17C4\u17C7\u1798\u17B6\u1793\u17AF\u1780\u179F\u17B6\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",labelFileWaitingForSize:"\u1780\u17C6\u1796\u17BB\u1784\u179A\u1784\u17CB\u1785\u17B6\u17C6\u1791\u17C6\u17A0\u17C6",labelFileSizeNotAvailable:"\u1791\u17C6\u17A0\u17C6\u1798\u17B7\u1793\u17A2\u17B6\u1785\u1794\u17D2\u179A\u17BE\u1794\u17B6\u1793",labelFileLoading:"\u1780\u17C6\u1796\u17BB\u1784\u178A\u17C6\u178E\u17BE\u179A\u1780\u17B6\u179A",labelFileLoadError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178A\u17C6\u178E\u17BE\u179A\u1780\u17B6\u179A",labelFileProcessing:"\u1780\u17C6\u1796\u17BB\u1784\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelFileProcessingComplete:"\u1780\u17B6\u179A\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784\u1796\u17C1\u1789\u179B\u17C1\u1789",labelFileProcessingAborted:"\u1780\u17B6\u179A\u1794\u1784\u17D2\u17A0\u17C4\u17C7\u178F\u17D2\u179A\u17BC\u179C\u1794\u17B6\u1793\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelFileProcessingError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u1780\u17C6\u1796\u17BB\u1784\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelFileProcessingRevertError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178F\u17D2\u179A\u17A1\u1794\u17CB",labelFileRemoveError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178A\u1780\u1785\u17C1\u1789",labelTapToCancel:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelTapToRetry:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelTapToUndo:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1798\u17B7\u1793\u1792\u17D2\u179C\u17BE\u179C\u17B7\u1789",labelButtonRemoveItem:"\u1799\u1780\u1785\u17C1\u1789",labelButtonAbortItemLoad:"\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelButtonRetryItemLoad:"\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelButtonAbortItemProcessing:"\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelButtonUndoItemProcessing:"\u1798\u17B7\u1793\u1792\u17D2\u179C\u17BE\u179C\u17B7\u1789",labelButtonRetryItemProcessing:"\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelButtonProcessItem:"\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelMaxFileSizeExceeded:"\u17AF\u1780\u179F\u17B6\u179A\u1792\u17C6\u1796\u17C1\u1780",labelMaxFileSize:"\u1791\u17C6\u17A0\u17C6\u17AF\u1780\u179F\u17B6\u179A\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {filesize}",labelMaxTotalFileSizeExceeded:"\u179B\u17BE\u179F\u1791\u17C6\u17A0\u17C6\u179F\u179A\u17BB\u1794\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6",labelMaxTotalFileSize:"\u1791\u17C6\u17A0\u17C6\u17AF\u1780\u179F\u17B6\u179A\u179F\u179A\u17BB\u1794\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {filesize}",labelFileTypeNotAllowed:"\u1794\u17D2\u179A\u1797\u17C1\u1791\u17AF\u1780\u179F\u17B6\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",fileValidateTypeLabelExpectedTypes:"\u179A\u17C6\u1796\u17B9\u1784\u1790\u17B6 {allButLastType} \u17AC {lastType}",imageValidateSizeLabelFormatError:"\u1794\u17D2\u179A\u1797\u17C1\u1791\u179A\u17BC\u1794\u1797\u17B6\u1796\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",imageValidateSizeLabelImageSizeTooSmall:"\u179A\u17BC\u1794\u1797\u17B6\u1796\u178F\u17BC\u1785\u1796\u17C1\u1780",imageValidateSizeLabelImageSizeTooBig:"\u179A\u17BC\u1794\u1797\u17B6\u1796\u1792\u17C6\u1796\u17C1\u1780",imageValidateSizeLabelExpectedMinSize:"\u1791\u17C6\u17A0\u17C6\u17A2\u1794\u17D2\u1794\u1794\u179A\u1798\u17B6\u1782\u17BA {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u1791\u17C6\u17A0\u17C6\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u1791\u17B6\u1794\u1796\u17C1\u1780",imageValidateSizeLabelImageResolutionTooHigh:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u1781\u17D2\u1796\u179F\u17CB\u1796\u17C1\u1780",imageValidateSizeLabelExpectedMinResolution:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u17A2\u1794\u17D2\u1794\u1794\u179A\u1798\u17B6\u1782\u17BA {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {maxResolution}"};var $o={labelIdle:'\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8 \uD558\uAC70\uB098 \uCC3E\uC544\uBCF4\uAE30 ',labelInvalidField:"\uD544\uB4DC\uC5D0 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uD30C\uC77C\uC774 \uC788\uC2B5\uB2C8\uB2E4.",labelFileWaitingForSize:"\uC6A9\uB7C9 \uD655\uC778\uC911",labelFileSizeNotAvailable:"\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uC6A9\uB7C9",labelFileLoading:"\uBD88\uB7EC\uC624\uB294 \uC911",labelFileLoadError:"\uD30C\uC77C \uBD88\uB7EC\uC624\uAE30 \uC2E4\uD328",labelFileProcessing:"\uC5C5\uB85C\uB4DC \uC911",labelFileProcessingComplete:"\uC5C5\uB85C\uB4DC \uC131\uACF5",labelFileProcessingAborted:"\uC5C5\uB85C\uB4DC \uCDE8\uC18C\uB428",labelFileProcessingError:"\uD30C\uC77C \uC5C5\uB85C\uB4DC \uC2E4\uD328",labelFileProcessingRevertError:"\uB418\uB3CC\uB9AC\uAE30 \uC2E4\uD328",labelFileRemoveError:"\uC81C\uAC70 \uC2E4\uD328",labelTapToCancel:"\uD0ED\uD558\uC5EC \uCDE8\uC18C",labelTapToRetry:"\uD0ED\uD558\uC5EC \uC7AC\uC2DC\uC791",labelTapToUndo:"\uD0ED\uD558\uC5EC \uC2E4\uD589 \uCDE8\uC18C",labelButtonRemoveItem:"\uC81C\uAC70",labelButtonAbortItemLoad:"\uC911\uB2E8",labelButtonRetryItemLoad:"\uC7AC\uC2DC\uC791",labelButtonAbortItemProcessing:"\uCDE8\uC18C",labelButtonUndoItemProcessing:"\uC2E4\uD589 \uCDE8\uC18C",labelButtonRetryItemProcessing:"\uC7AC\uC2DC\uC791",labelButtonProcessItem:"\uC5C5\uB85C\uB4DC",labelMaxFileSizeExceeded:"\uD30C\uC77C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4.",labelMaxFileSize:"\uCD5C\uB300 \uD30C\uC77C \uC6A9\uB7C9\uC740 {filesize} \uC785\uB2C8\uB2E4.",labelMaxTotalFileSizeExceeded:"\uCD5C\uB300 \uC804\uCCB4 \uD30C\uC77C \uC6A9\uB7C9 \uCD08\uACFC\uD558\uC600\uC2B5\uB2C8\uB2E4.",labelMaxTotalFileSize:"\uCD5C\uB300 \uC804\uCCB4 \uD30C\uC77C \uC6A9\uB7C9\uC740 {filesize} \uC785\uB2C8\uB2E4.",labelFileTypeNotAllowed:"\uC798\uBABB\uB41C \uD615\uC2DD\uC758 \uD30C\uC77C",fileValidateTypeLabelExpectedTypes:"{allButLastType} \uB610\uB294 {lastType}",imageValidateSizeLabelFormatError:"\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uC774\uBBF8\uC9C0 \uC720\uD615",imageValidateSizeLabelImageSizeTooSmall:"\uC774\uBBF8\uC9C0\uAC00 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4.",imageValidateSizeLabelImageSizeTooBig:"\uC774\uBBF8\uC9C0\uAC00 \uB108\uBB34 \uD07D\uB2C8\uB2E4.",imageValidateSizeLabelExpectedMinSize:"\uC774\uBBF8\uC9C0 \uCD5C\uC18C \uD06C\uAE30\uB294 {minWidth} \xD7 {minHeight} \uC785\uB2C8\uB2E4",imageValidateSizeLabelExpectedMaxSize:"\uC774\uBBF8\uC9C0 \uCD5C\uB300 \uD06C\uAE30\uB294 {maxWidth} \xD7 {maxHeight} \uC785\uB2C8\uB2E4",imageValidateSizeLabelImageResolutionTooLow:"\uD574\uC0C1\uB3C4\uAC00 \uB108\uBB34 \uB0AE\uC2B5\uB2C8\uB2E4.",imageValidateSizeLabelImageResolutionTooHigh:"\uD574\uC0C1\uB3C4\uAC00 \uB108\uBB34 \uB192\uC2B5\uB2C8\uB2E4.",imageValidateSizeLabelExpectedMinResolution:"\uCD5C\uC18C \uD574\uC0C1\uB3C4\uB294 {minResolution} \uC785\uB2C8\uB2E4.",imageValidateSizeLabelExpectedMaxResolution:"\uCD5C\uB300 \uD574\uC0C1\uB3C4\uB294 {maxResolution} \uC785\uB2C8\uB2E4."};var Xo={labelIdle:'\u012Ed\u0117kite failus \u010Dia arba Ie\u0161kokite ',labelInvalidField:"Laukelis talpina netinkamus failus",labelFileWaitingForSize:"Laukiama dyd\u017Eio",labelFileSizeNotAvailable:"Dydis ne\u017Einomas",labelFileLoading:"Kraunama",labelFileLoadError:"Klaida \u012Fkeliant",labelFileProcessing:"\u012Ekeliama",labelFileProcessingComplete:"\u012Ek\u0117limas s\u0117kmingas",labelFileProcessingAborted:"\u012Ek\u0117limas at\u0161auktas",labelFileProcessingError:"\u012Ekeliant \u012Fvyko klaida",labelFileProcessingRevertError:"At\u0161aukiant \u012Fvyko klaida",labelFileRemoveError:"I\u0161trinant \u012Fvyko klaida",labelTapToCancel:"Palieskite nor\u0117dami at\u0161aukti",labelTapToRetry:"Palieskite nor\u0117dami pakartoti",labelTapToUndo:"Palieskite nor\u0117dami at\u0161aukti",labelButtonRemoveItem:"I\u0161trinti",labelButtonAbortItemLoad:"Sustabdyti",labelButtonRetryItemLoad:"Pakartoti",labelButtonAbortItemProcessing:"At\u0161aukti",labelButtonUndoItemProcessing:"At\u0161aukti",labelButtonRetryItemProcessing:"Pakartoti",labelButtonProcessItem:"\u012Ekelti",labelMaxFileSizeExceeded:"Failas per didelis",labelMaxFileSize:"Maksimalus failo dydis yra {filesize}",labelMaxTotalFileSizeExceeded:"Vir\u0161ijote maksimal\u0173 leistin\u0105 dyd\u012F",labelMaxTotalFileSize:"Maksimalus leistinas dydis yra {filesize}",labelFileTypeNotAllowed:"Netinkamas failas",fileValidateTypeLabelExpectedTypes:"Tikisi {allButLastType} arba {lastType}",imageValidateSizeLabelFormatError:"Nuotraukos formatas nepalaikomas",imageValidateSizeLabelImageSizeTooSmall:"Nuotrauka per ma\u017Ea",imageValidateSizeLabelImageSizeTooBig:"Nuotrauka per didel\u0117",imageValidateSizeLabelExpectedMinSize:"Minimalus dydis yra {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimalus dydis yra {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezoliucija per ma\u017Ea",imageValidateSizeLabelImageResolutionTooHigh:"Rezoliucija per didel\u0117",imageValidateSizeLabelExpectedMinResolution:"Minimali rezoliucija yra {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimali rezoliucija yra {maxResolution}"};var Ko={labelIdle:'I file hn\xFBkl\xFBt rawh, emaw Zawnna ',labelInvalidField:"Hemi hian files diklo a kengtel",labelFileWaitingForSize:"A lenzawng a ngh\xE2k mek",labelFileSizeNotAvailable:"A lenzawng a awmlo",labelFileLoading:"Loading",labelFileLoadError:"Load laiin dik lo a awm",labelFileProcessing:"Uploading",labelFileProcessingComplete:"Upload a zo",labelFileProcessingAborted:"Upload s\xFBt a ni",labelFileProcessingError:"Upload laiin dik lo a awm",labelFileProcessingRevertError:"Dahk\xEEr laiin dik lo a awm",labelFileRemoveError:"Paih laiin dik lo a awm",labelTapToCancel:"S\xFBt turin hmet rawh",labelTapToRetry:"Tinawn turin hmet rawh",labelTapToUndo:"Tilet turin hmet rawh",labelButtonRemoveItem:"Paihna",labelButtonAbortItemLoad:"Tihtlawlhna",labelButtonRetryItemLoad:"Tihnawnna",labelButtonAbortItemProcessing:"S\xFBtna",labelButtonUndoItemProcessing:"Tihletna",labelButtonRetryItemProcessing:"Tihnawnna",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"File a lian lutuk",labelMaxFileSize:"File lenzawng tam ber chu {filesize} ani",labelMaxTotalFileSizeExceeded:"A lenzawng belh kh\xE2wm tam ber a p\xEAl",labelMaxTotalFileSize:"File lenzawng belh kh\xE2wm tam ber chu {filesize} a ni",labelFileTypeNotAllowed:"File type dik lo a ni",fileValidateTypeLabelExpectedTypes:"{allButLastType} emaw {lastType} emaw beisei a ni",imageValidateSizeLabelFormatError:"Thlal\xE2k type a thl\xE2wplo",imageValidateSizeLabelImageSizeTooSmall:"Thlal\xE2k hi a t\xEA lutuk",imageValidateSizeLabelImageSizeTooBig:"Thlal\xE2k hi a lian lutuk",imageValidateSizeLabelExpectedMinSize:"A lenzawng tl\xEAm ber chu {minWidth} x {minHeight} a ni",imageValidateSizeLabelExpectedMaxSize:"A lenzawng tam ber chu {maxWidth} x {maxHeight} a ni",imageValidateSizeLabelImageResolutionTooLow:"Resolution a hniam lutuk",imageValidateSizeLabelImageResolutionTooHigh:"Resolution a s\xE2ng lutuk",imageValidateSizeLabelExpectedMinResolution:"Resolution hniam ber chu {minResolution} a ni",imageValidateSizeLabelExpectedMaxResolution:"Resolution s\xE2ng ber chu {maxResolution} a ni"};var Zo={labelIdle:'Ievelciet savus failus vai p\u0101rl\u016Bkojiet \u0161eit ',labelInvalidField:"Lauks satur neder\u012Bgus failus",labelFileWaitingForSize:"Gaid\u0101m faila izm\u0113ru",labelFileSizeNotAvailable:"Izm\u0113rs nav pieejams",labelFileLoading:"Notiek iel\u0101de",labelFileLoadError:"Notika k\u013C\u016Bda iel\u0101des laik\u0101",labelFileProcessing:"Notiek aug\u0161upiel\u0101de",labelFileProcessingComplete:"Aug\u0161upiel\u0101de pabeigta",labelFileProcessingAborted:"Aug\u0161upiel\u0101de atcelta",labelFileProcessingError:"Notika k\u013C\u016Bda aug\u0161upiel\u0101des laik\u0101",labelFileProcessingRevertError:"Notika k\u013C\u016Bda atgrie\u0161anas laik\u0101",labelFileRemoveError:"Notika k\u013C\u016Bda dz\u0113\u0161anas laik\u0101",labelTapToCancel:"pieskarieties, lai atceltu",labelTapToRetry:"pieskarieties, lai m\u0113\u0123in\u0101tu v\u0113lreiz",labelTapToUndo:"pieskarieties, lai atsauktu",labelButtonRemoveItem:"Dz\u0113st",labelButtonAbortItemLoad:"P\u0101rtraukt",labelButtonRetryItemLoad:"M\u0113\u0123in\u0101t v\u0113lreiz",labelButtonAbortItemProcessing:"P\u0101rtraucam",labelButtonUndoItemProcessing:"Atsaucam",labelButtonRetryItemProcessing:"M\u0113\u0123in\u0101m v\u0113lreiz",labelButtonProcessItem:"Aug\u0161upiel\u0101d\u0113t",labelMaxFileSizeExceeded:"Fails ir p\u0101r\u0101k liels",labelMaxFileSize:"Maksim\u0101lais faila izm\u0113rs ir {filesize}",labelMaxTotalFileSizeExceeded:"P\u0101rsniegts maksim\u0101lais kop\u0113jais failu izm\u0113rs",labelMaxTotalFileSize:"Maksim\u0101lais kop\u0113jais failu izm\u0113rs ir {filesize}",labelFileTypeNotAllowed:"Neder\u012Bgs faila tips",fileValidateTypeLabelExpectedTypes:"Sagaid\u0101m {allButLastType} vai {lastType}",imageValidateSizeLabelFormatError:"Neatbilsto\u0161s att\u0113la tips",imageValidateSizeLabelImageSizeTooSmall:"Att\u0113ls ir p\u0101r\u0101k mazs",imageValidateSizeLabelImageSizeTooBig:"Att\u0113ls ir p\u0101r\u0101k liels",imageValidateSizeLabelExpectedMinSize:"Minim\u0101lais izm\u0113rs ir {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksim\u0101lais izm\u0113rs ir {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Iz\u0161\u0137irtsp\u0113ja ir p\u0101r\u0101k zema",imageValidateSizeLabelImageResolutionTooHigh:"Iz\u0161\u0137irtsp\u0113ja ir p\u0101r\u0101k augsta",imageValidateSizeLabelExpectedMinResolution:"Minim\u0101l\u0101 iz\u0161\u0137irtsp\u0113ja ir {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksim\u0101l\u0101 iz\u0161\u0137irtsp\u0113ja ir {maxResolution}"};var Qo={labelIdle:'Dra og slipp filene dine, eller Bla gjennom... ',labelInvalidField:"Feltet inneholder ugyldige filer",labelFileWaitingForSize:"Venter p\xE5 st\xF8rrelse",labelFileSizeNotAvailable:"St\xF8rrelse ikke tilgjengelig",labelFileLoading:"Laster",labelFileLoadError:"Feil under lasting",labelFileProcessing:"Laster opp",labelFileProcessingComplete:"Opplasting ferdig",labelFileProcessingAborted:"Opplasting avbrutt",labelFileProcessingError:"Feil under opplasting",labelFileProcessingRevertError:"Feil under reversering",labelFileRemoveError:"Feil under flytting",labelTapToCancel:"klikk for \xE5 avbryte",labelTapToRetry:"klikk for \xE5 pr\xF8ve p\xE5 nytt",labelTapToUndo:"klikk for \xE5 angre",labelButtonRemoveItem:"Fjern",labelButtonAbortItemLoad:"Avbryt",labelButtonRetryItemLoad:"Pr\xF8v p\xE5 nytt",labelButtonAbortItemProcessing:"Avbryt",labelButtonUndoItemProcessing:"Angre",labelButtonRetryItemProcessing:"Pr\xF8v p\xE5 nytt",labelButtonProcessItem:"Last opp",labelMaxFileSizeExceeded:"Filen er for stor",labelMaxFileSize:"Maksimal filst\xF8rrelse er {filesize}",labelMaxTotalFileSizeExceeded:"Maksimal total st\xF8rrelse oversteget",labelMaxTotalFileSize:"Maksimal total st\xF8rrelse er {filesize}",labelFileTypeNotAllowed:"Ugyldig filtype",fileValidateTypeLabelExpectedTypes:"Forventer {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Bildeformat ikke st\xF8ttet",imageValidateSizeLabelImageSizeTooSmall:"Bildet er for lite",imageValidateSizeLabelImageSizeTooBig:"Bildet er for stort",imageValidateSizeLabelExpectedMinSize:"Minimumsst\xF8rrelse er {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimumsst\xF8rrelse er {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Oppl\xF8sningen er for lav",imageValidateSizeLabelImageResolutionTooHigh:"Oppl\xF8sningen er for h\xF8y",imageValidateSizeLabelExpectedMinResolution:"Minimum oppl\xF8sning er {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimal oppl\xF8sning er {maxResolution}"};var Jo={labelIdle:'Drag & Drop je bestanden of Bladeren ',labelInvalidField:"Veld bevat ongeldige bestanden",labelFileWaitingForSize:"Wachten op grootte",labelFileSizeNotAvailable:"Grootte niet beschikbaar",labelFileLoading:"Laden",labelFileLoadError:"Fout tijdens laden",labelFileProcessing:"Uploaden",labelFileProcessingComplete:"Upload afgerond",labelFileProcessingAborted:"Upload geannuleerd",labelFileProcessingError:"Fout tijdens upload",labelFileProcessingRevertError:"Fout bij herstellen",labelFileRemoveError:"Fout bij verwijderen",labelTapToCancel:"tik om te annuleren",labelTapToRetry:"tik om opnieuw te proberen",labelTapToUndo:"tik om ongedaan te maken",labelButtonRemoveItem:"Verwijderen",labelButtonAbortItemLoad:"Afbreken",labelButtonRetryItemLoad:"Opnieuw proberen",labelButtonAbortItemProcessing:"Annuleren",labelButtonUndoItemProcessing:"Ongedaan maken",labelButtonRetryItemProcessing:"Opnieuw proberen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Bestand is te groot",labelMaxFileSize:"Maximale bestandsgrootte is {filesize}",labelMaxTotalFileSizeExceeded:"Maximale totale grootte overschreden",labelMaxTotalFileSize:"Maximale totale bestandsgrootte is {filesize}",labelFileTypeNotAllowed:"Ongeldig bestandstype",fileValidateTypeLabelExpectedTypes:"Verwacht {allButLastType} of {lastType}",imageValidateSizeLabelFormatError:"Afbeeldingstype niet ondersteund",imageValidateSizeLabelImageSizeTooSmall:"Afbeelding is te klein",imageValidateSizeLabelImageSizeTooBig:"Afbeelding is te groot",imageValidateSizeLabelExpectedMinSize:"Minimale afmeting is {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximale afmeting is {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolutie is te laag",imageValidateSizeLabelImageResolutionTooHigh:"Resolution is too high",imageValidateSizeLabelExpectedMinResolution:"Minimale resolutie is {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximale resolutie is {maxResolution}"};var er={labelIdle:'Przeci\u0105gnij i upu\u015B\u0107 lub wybierz pliki',labelInvalidField:"Nieprawid\u0142owe pliki",labelFileWaitingForSize:"Pobieranie rozmiaru",labelFileSizeNotAvailable:"Nieznany rozmiar",labelFileLoading:"Wczytywanie",labelFileLoadError:"B\u0142\u0105d wczytywania",labelFileProcessing:"Przesy\u0142anie",labelFileProcessingComplete:"Przes\u0142ano",labelFileProcessingAborted:"Przerwano",labelFileProcessingError:"Przesy\u0142anie nie powiod\u0142o si\u0119",labelFileProcessingRevertError:"Co\u015B posz\u0142o nie tak",labelFileRemoveError:"Nieudane usuni\u0119cie",labelTapToCancel:"Anuluj",labelTapToRetry:"Pon\xF3w",labelTapToUndo:"Cofnij",labelButtonRemoveItem:"Usu\u0144",labelButtonAbortItemLoad:"Przerwij",labelButtonRetryItemLoad:"Pon\xF3w",labelButtonAbortItemProcessing:"Anuluj",labelButtonUndoItemProcessing:"Cofnij",labelButtonRetryItemProcessing:"Pon\xF3w",labelButtonProcessItem:"Prze\u015Blij",labelMaxFileSizeExceeded:"Plik jest zbyt du\u017Cy",labelMaxFileSize:"Dopuszczalna wielko\u015B\u0107 pliku to {filesize}",labelMaxTotalFileSizeExceeded:"Przekroczono \u0142\u0105czny rozmiar plik\xF3w",labelMaxTotalFileSize:"\u0141\u0105czny rozmiar plik\xF3w nie mo\u017Ce przekroczy\u0107 {filesize}",labelFileTypeNotAllowed:"Niedozwolony rodzaj pliku",fileValidateTypeLabelExpectedTypes:"Oczekiwano {allButLastType} lub {lastType}",imageValidateSizeLabelFormatError:"Nieobs\u0142ugiwany format obrazu",imageValidateSizeLabelImageSizeTooSmall:"Obraz jest zbyt ma\u0142y",imageValidateSizeLabelImageSizeTooBig:"Obraz jest zbyt du\u017Cy",imageValidateSizeLabelExpectedMinSize:"Minimalne wymiary obrazu to {minWidth}\xD7{minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksymalna wymiary obrazu to {maxWidth}\xD7{maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozdzielczo\u015B\u0107 jest zbyt niska",imageValidateSizeLabelImageResolutionTooHigh:"Rozdzielczo\u015B\u0107 jest zbyt wysoka",imageValidateSizeLabelExpectedMinResolution:"Minimalna rozdzielczo\u015B\u0107 to {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksymalna rozdzielczo\u015B\u0107 to {maxResolution}"};var tr={labelIdle:'Arraste & Largue os ficheiros ou Seleccione ',labelInvalidField:"O campo cont\xE9m ficheiros inv\xE1lidos",labelFileWaitingForSize:"A aguardar tamanho",labelFileSizeNotAvailable:"Tamanho n\xE3o dispon\xEDvel",labelFileLoading:"A carregar",labelFileLoadError:"Erro ao carregar",labelFileProcessing:"A carregar",labelFileProcessingComplete:"Carregamento completo",labelFileProcessingAborted:"Carregamento cancelado",labelFileProcessingError:"Erro ao carregar",labelFileProcessingRevertError:"Erro ao reverter",labelFileRemoveError:"Erro ao remover",labelTapToCancel:"carregue para cancelar",labelTapToRetry:"carregue para tentar novamente",labelTapToUndo:"carregue para desfazer",labelButtonRemoveItem:"Remover",labelButtonAbortItemLoad:"Abortar",labelButtonRetryItemLoad:"Tentar novamente",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Desfazer",labelButtonRetryItemProcessing:"Tentar novamente",labelButtonProcessItem:"Carregar",labelMaxFileSizeExceeded:"Ficheiro demasiado grande",labelMaxFileSize:"O tamanho m\xE1ximo do ficheiro \xE9 de {filesize}",labelMaxTotalFileSizeExceeded:"Tamanho m\xE1ximo total excedido",labelMaxTotalFileSize:"O tamanho m\xE1ximo total do ficheiro \xE9 de {filesize}",labelFileTypeNotAllowed:"Tipo de ficheiro inv\xE1lido",fileValidateTypeLabelExpectedTypes:"\xC9 esperado {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagem n\xE3o suportada",imageValidateSizeLabelImageSizeTooSmall:"A imagem \xE9 demasiado pequena",imageValidateSizeLabelImageSizeTooBig:"A imagem \xE9 demasiado grande",imageValidateSizeLabelExpectedMinSize:"O tamanho m\xEDnimo \xE9 de {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"O tamanho m\xE1ximo \xE9 de {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"A resolu\xE7\xE3o \xE9 demasiado baixa",imageValidateSizeLabelImageResolutionTooHigh:"A resolu\xE7\xE3o \xE9 demasiado grande",imageValidateSizeLabelExpectedMinResolution:"A resolu\xE7\xE3o m\xEDnima \xE9 de {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"A resolu\xE7\xE3o m\xE1xima \xE9 de {maxResolution}"};var ir={labelIdle:'Arraste e solte os arquivos ou Clique aqui ',labelInvalidField:"Arquivos inv\xE1lidos",labelFileWaitingForSize:"Calculando o tamanho do arquivo",labelFileSizeNotAvailable:"Tamanho do arquivo indispon\xEDvel",labelFileLoading:"Carregando",labelFileLoadError:"Erro durante o carregamento",labelFileProcessing:"Enviando",labelFileProcessingComplete:"Envio finalizado",labelFileProcessingAborted:"Envio cancelado",labelFileProcessingError:"Erro durante o envio",labelFileProcessingRevertError:"Erro ao reverter o envio",labelFileRemoveError:"Erro ao remover o arquivo",labelTapToCancel:"clique para cancelar",labelTapToRetry:"clique para reenviar",labelTapToUndo:"clique para desfazer",labelButtonRemoveItem:"Remover",labelButtonAbortItemLoad:"Abortar",labelButtonRetryItemLoad:"Reenviar",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Desfazer",labelButtonRetryItemProcessing:"Reenviar",labelButtonProcessItem:"Enviar",labelMaxFileSizeExceeded:"Arquivo \xE9 muito grande",labelMaxFileSize:"O tamanho m\xE1ximo permitido: {filesize}",labelMaxTotalFileSizeExceeded:"Tamanho total dos arquivos excedido",labelMaxTotalFileSize:"Tamanho total permitido: {filesize}",labelFileTypeNotAllowed:"Tipo de arquivo inv\xE1lido",fileValidateTypeLabelExpectedTypes:"Tipos de arquivo suportados s\xE3o {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagem inv\xE1lida",imageValidateSizeLabelImageSizeTooSmall:"Imagem muito pequena",imageValidateSizeLabelImageSizeTooBig:"Imagem muito grande",imageValidateSizeLabelExpectedMinSize:"Tamanho m\xEDnimo permitida: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Tamanho m\xE1ximo permitido: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolu\xE7\xE3o muito baixa",imageValidateSizeLabelImageResolutionTooHigh:"Resolu\xE7\xE3o muito alta",imageValidateSizeLabelExpectedMinResolution:"Resolu\xE7\xE3o m\xEDnima permitida: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Resolu\xE7\xE3o m\xE1xima permitida: {maxResolution}"};var ar={labelIdle:'Trage \u0219i plaseaz\u0103 fi\u0219iere sau Caut\u0103-le ',labelInvalidField:"C\xE2mpul con\u021Bine fi\u0219iere care nu sunt valide",labelFileWaitingForSize:"\xCEn a\u0219teptarea dimensiunii",labelFileSizeNotAvailable:"Dimensiunea nu este diponibil\u0103",labelFileLoading:"Se \xEEncarc\u0103",labelFileLoadError:"Eroare la \xEEnc\u0103rcare",labelFileProcessing:"Se \xEEncarc\u0103",labelFileProcessingComplete:"\xCEnc\u0103rcare finalizat\u0103",labelFileProcessingAborted:"\xCEnc\u0103rcare anulat\u0103",labelFileProcessingError:"Eroare la \xEEnc\u0103rcare",labelFileProcessingRevertError:"Eroare la anulare",labelFileRemoveError:"Eroare la \u015Ftergere",labelTapToCancel:"apas\u0103 pentru a anula",labelTapToRetry:"apas\u0103 pentru a re\xEEncerca",labelTapToUndo:"apas\u0103 pentru a anula",labelButtonRemoveItem:"\u015Eterge",labelButtonAbortItemLoad:"Anuleaz\u0103",labelButtonRetryItemLoad:"Re\xEEncearc\u0103",labelButtonAbortItemProcessing:"Anuleaz\u0103",labelButtonUndoItemProcessing:"Anuleaz\u0103",labelButtonRetryItemProcessing:"Re\xEEncearc\u0103",labelButtonProcessItem:"\xCEncarc\u0103",labelMaxFileSizeExceeded:"Fi\u0219ierul este prea mare",labelMaxFileSize:"Dimensiunea maxim\u0103 a unui fi\u0219ier este de {filesize}",labelMaxTotalFileSizeExceeded:"Dimensiunea total\u0103 maxim\u0103 a fost dep\u0103\u0219it\u0103",labelMaxTotalFileSize:"Dimensiunea total\u0103 maxim\u0103 a fi\u0219ierelor este de {filesize}",labelFileTypeNotAllowed:"Tipul fi\u0219ierului nu este valid",fileValidateTypeLabelExpectedTypes:"Se a\u0219teapt\u0103 {allButLastType} sau {lastType}",imageValidateSizeLabelFormatError:"Formatul imaginii nu este acceptat",imageValidateSizeLabelImageSizeTooSmall:"Imaginea este prea mic\u0103",imageValidateSizeLabelImageSizeTooBig:"Imaginea este prea mare",imageValidateSizeLabelExpectedMinSize:"M\u0103rimea minim\u0103 este de {maxWidth} x {maxHeight}",imageValidateSizeLabelExpectedMaxSize:"M\u0103rimea maxim\u0103 este de {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezolu\u021Bia este prea mic\u0103",imageValidateSizeLabelImageResolutionTooHigh:"Rezolu\u021Bia este prea mare",imageValidateSizeLabelExpectedMinResolution:"Rezolu\u021Bia minim\u0103 este de {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Rezolu\u021Bia maxim\u0103 este de {maxResolution}"};var nr={labelIdle:'\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B \u0438\u043B\u0438 \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 ',labelInvalidField:"\u041F\u043E\u043B\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0444\u0430\u0439\u043B\u044B",labelFileWaitingForSize:"\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0440\u0430\u0437\u043C\u0435\u0440",labelFileSizeNotAvailable:"\u0420\u0430\u0437\u043C\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",labelFileLoading:"\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435",labelFileLoadError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0438",labelFileProcessing:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",labelFileProcessingComplete:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430",labelFileProcessingAborted:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430",labelFileProcessingError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435",labelFileProcessingRevertError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0442\u0435",labelFileRemoveError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438",labelTapToCancel:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B",labelTapToRetry:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelTapToUndo:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",labelButtonRemoveItem:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",labelButtonAbortItemLoad:"\u041F\u0440\u0435\u043A\u0440\u0430\u0449\u0435\u043D\u043E",labelButtonRetryItemLoad:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelButtonAbortItemProcessing:"\u041E\u0442\u043C\u0435\u043D\u0430",labelButtonUndoItemProcessing:"\u041E\u0442\u043C\u0435\u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",labelButtonRetryItemProcessing:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelButtonProcessItem:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",labelMaxFileSizeExceeded:"\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439",labelMaxFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430: {filesize}",labelMaxTotalFileSizeExceeded:"\u041F\u0440\u0435\u0432\u044B\u0448\u0435\u043D \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440",labelMaxTotalFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430: {filesize}",labelFileTypeNotAllowed:"\u0424\u0430\u0439\u043B \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u0442\u0438\u043F\u0430",fileValidateTypeLabelExpectedTypes:"\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F {allButLastType} \u0438\u043B\u0438 {lastType}",imageValidateSizeLabelFormatError:"\u0422\u0438\u043F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",imageValidateSizeLabelImageSizeTooSmall:"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435",imageValidateSizeLabelImageSizeTooBig:"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435",imageValidateSizeLabelExpectedMinSize:"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043D\u0438\u0437\u043A\u043E\u0435",imageValidateSizeLabelImageResolutionTooHigh:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0432\u044B\u0441\u043E\u043A\u043E\u0435",imageValidateSizeLabelExpectedMinResolution:"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435: {maxResolution}"};var lr={labelIdle:'Natiahn\xFA\u0165 s\xFAbor (drag&drop) alebo Vyh\u013Eada\u0165 ',labelInvalidField:"Pole obsahuje chybn\xE9 s\xFAbory",labelFileWaitingForSize:"Zis\u0165uje sa ve\u013Ekos\u0165",labelFileSizeNotAvailable:"Nezn\xE1ma ve\u013Ekos\u0165",labelFileLoading:"Pren\xE1\u0161a sa",labelFileLoadError:"Chyba pri prenose",labelFileProcessing:"Prebieha upload",labelFileProcessingComplete:"Upload dokon\u010Den\xFD",labelFileProcessingAborted:"Upload stornovan\xFD",labelFileProcessingError:"Chyba pri uploade",labelFileProcessingRevertError:"Chyba pri obnove",labelFileRemoveError:"Chyba pri odstr\xE1nen\xED",labelTapToCancel:"Kliknite pre storno",labelTapToRetry:"Kliknite pre opakovanie",labelTapToUndo:"Kliknite pre vr\xE1tenie",labelButtonRemoveItem:"Odstr\xE1ni\u0165",labelButtonAbortItemLoad:"Storno",labelButtonRetryItemLoad:"Opakova\u0165",labelButtonAbortItemProcessing:"Sp\xE4\u0165",labelButtonUndoItemProcessing:"Vr\xE1ti\u0165",labelButtonRetryItemProcessing:"Opakova\u0165",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"S\xFAbor je pr\xEDli\u0161 ve\u013Ek\xFD",labelMaxFileSize:"Najv\xE4\u010D\u0161ia ve\u013Ekos\u0165 s\xFAboru je {filesize}",labelMaxTotalFileSizeExceeded:"Prekro\u010Den\xE1 maxim\xE1lna celkov\xE1 ve\u013Ekos\u0165 s\xFAboru",labelMaxTotalFileSize:"Maxim\xE1lna celkov\xE1 ve\u013Ekos\u0165 s\xFAboru je {filesize}",labelFileTypeNotAllowed:"S\xFAbor je nespr\xE1vneho typu",fileValidateTypeLabelExpectedTypes:"O\u010Dak\xE1va sa {allButLastType} alebo {lastType}",imageValidateSizeLabelFormatError:"Obr\xE1zok tohto typu nie je podporovan\xFD",imageValidateSizeLabelImageSizeTooSmall:"Obr\xE1zok je pr\xEDli\u0161 mal\xFD",imageValidateSizeLabelImageSizeTooBig:"Obr\xE1zok je pr\xEDli\u0161 ve\u013Ek\xFD",imageValidateSizeLabelExpectedMinSize:"Minim\xE1lny rozmer je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maxim\xE1lny rozmer je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozl\xED\u0161enie je pr\xEDli\u0161 mal\xE9",imageValidateSizeLabelImageResolutionTooHigh:"Rozli\u0161enie je pr\xEDli\u0161 ve\u013Ek\xE9",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1lne rozl\xED\u0161enie je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1lne rozl\xED\u0161enie je {maxResolution}"};var or={labelIdle:'Drag och sl\xE4pp dina filer eller Bl\xE4ddra ',labelInvalidField:"F\xE4ltet inneh\xE5ller felaktiga filer",labelFileWaitingForSize:"V\xE4ntar p\xE5 storlek",labelFileSizeNotAvailable:"Storleken finns inte tillg\xE4nglig",labelFileLoading:"Laddar",labelFileLoadError:"Fel under laddning",labelFileProcessing:"Laddar upp",labelFileProcessingComplete:"Uppladdning klar",labelFileProcessingAborted:"Uppladdning avbruten",labelFileProcessingError:"Fel under uppladdning",labelFileProcessingRevertError:"Fel under \xE5terst\xE4llning",labelFileRemoveError:"Fel under borttagning",labelTapToCancel:"tryck f\xF6r att avbryta",labelTapToRetry:"tryck f\xF6r att f\xF6rs\xF6ka igen",labelTapToUndo:"tryck f\xF6r att \xE5ngra",labelButtonRemoveItem:"Tabort",labelButtonAbortItemLoad:"Avbryt",labelButtonRetryItemLoad:"F\xF6rs\xF6k igen",labelButtonAbortItemProcessing:"Avbryt",labelButtonUndoItemProcessing:"\xC5ngra",labelButtonRetryItemProcessing:"F\xF6rs\xF6k igen",labelButtonProcessItem:"Ladda upp",labelMaxFileSizeExceeded:"Filen \xE4r f\xF6r stor",labelMaxFileSize:"St\xF6rsta till\xE5tna filstorlek \xE4r {filesize}",labelMaxTotalFileSizeExceeded:"Maximal uppladdningsstorlek uppn\xE5d",labelMaxTotalFileSize:"Maximal uppladdningsstorlek \xE4r {filesize}",labelFileTypeNotAllowed:"Felaktig filtyp",fileValidateTypeLabelExpectedTypes:"Godk\xE4nda filtyper {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Bildtypen saknar st\xF6d",imageValidateSizeLabelImageSizeTooSmall:"Bilden \xE4r f\xF6r liten",imageValidateSizeLabelImageSizeTooBig:"Bilden \xE4r f\xF6r stor",imageValidateSizeLabelExpectedMinSize:"Minimal storlek \xE4r {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximal storlek \xE4r {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Uppl\xF6sningen \xE4r f\xF6r l\xE5g",imageValidateSizeLabelImageResolutionTooHigh:"Uppl\xF6sningen \xE4r f\xF6r h\xF6g",imageValidateSizeLabelExpectedMinResolution:"Minsta till\xE5tna uppl\xF6sning \xE4r {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"H\xF6gsta till\xE5tna uppl\xF6sning \xE4r {maxResolution}"};var rr={labelIdle:'Dosyan\u0131z\u0131 S\xFCr\xFCkleyin & B\u0131rak\u0131n ya da Se\xE7in ',labelInvalidField:"Alan ge\xE7ersiz dosyalar i\xE7eriyor",labelFileWaitingForSize:"Boyut hesaplan\u0131yor",labelFileSizeNotAvailable:"Boyut mevcut de\u011Fil",labelFileLoading:"Y\xFCkleniyor",labelFileLoadError:"Y\xFCkleme s\u0131ras\u0131nda hata olu\u015Ftu",labelFileProcessing:"Y\xFCkleniyor",labelFileProcessingComplete:"Y\xFCkleme tamamland\u0131",labelFileProcessingAborted:"Y\xFCkleme iptal edildi",labelFileProcessingError:"Y\xFCklerken hata olu\u015Ftu",labelFileProcessingRevertError:"Geri \xE7ekerken hata olu\u015Ftu",labelFileRemoveError:"Kald\u0131r\u0131rken hata olu\u015Ftu",labelTapToCancel:"\u0130ptal etmek i\xE7in t\u0131klay\u0131n",labelTapToRetry:"Tekrar denemek i\xE7in t\u0131klay\u0131n",labelTapToUndo:"Geri almak i\xE7in t\u0131klay\u0131n",labelButtonRemoveItem:"Kald\u0131r",labelButtonAbortItemLoad:"\u0130ptal Et",labelButtonRetryItemLoad:"Tekrar dene",labelButtonAbortItemProcessing:"\u0130ptal et",labelButtonUndoItemProcessing:"Geri Al",labelButtonRetryItemProcessing:"Tekrar dene",labelButtonProcessItem:"Y\xFCkle",labelMaxFileSizeExceeded:"Dosya \xE7ok b\xFCy\xFCk",labelMaxFileSize:"En fazla dosya boyutu: {filesize}",labelMaxTotalFileSizeExceeded:"Maximum boyut a\u015F\u0131ld\u0131",labelMaxTotalFileSize:"Maximum dosya boyutu :{filesize}",labelFileTypeNotAllowed:"Ge\xE7ersiz dosya tipi",fileValidateTypeLabelExpectedTypes:"\u015Eu {allButLastType} ya da \u015Fu dosya olmas\u0131 gerekir: {lastType}",imageValidateSizeLabelFormatError:"Resim tipi desteklenmiyor",imageValidateSizeLabelImageSizeTooSmall:"Resim \xE7ok k\xFC\xE7\xFCk",imageValidateSizeLabelImageSizeTooBig:"Resim \xE7ok b\xFCy\xFCk",imageValidateSizeLabelExpectedMinSize:"Minimum boyut {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum boyut {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\xC7\xF6z\xFCn\xFCrl\xFCk \xE7ok d\xFC\u015F\xFCk",imageValidateSizeLabelImageResolutionTooHigh:"\xC7\xF6z\xFCn\xFCrl\xFCk \xE7ok y\xFCksek",imageValidateSizeLabelExpectedMinResolution:"Minimum \xE7\xF6z\xFCn\xFCrl\xFCk {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum \xE7\xF6z\xFCn\xFCrl\xFCk {maxResolution}"};var sr={labelIdle:'\u041F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0456\u0442\u044C \u0444\u0430\u0439\u043B\u0438 \u0430\u0431\u043E \u0432\u0438\u0431\u0435\u0440\u0456\u0442\u044C ',labelInvalidField:"\u041F\u043E\u043B\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0456 \u0444\u0430\u0439\u043B\u0438",labelFileWaitingForSize:"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0440\u043E\u0437\u043C\u0456\u0440",labelFileSizeNotAvailable:"\u0420\u043E\u0437\u043C\u0456\u0440 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",labelFileLoading:"\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F",labelFileLoadError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u0456",labelFileProcessing:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",labelFileProcessingComplete:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",labelFileProcessingAborted:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E",labelFileProcessingError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u0456",labelFileProcessingRevertError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0456",labelFileRemoveError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u0456",labelTapToCancel:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelTapToRetry:"\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelTapToUndo:"\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0434\u0456\u044E",labelButtonRemoveItem:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438",labelButtonAbortItemLoad:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelButtonRetryItemLoad:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelButtonAbortItemProcessing:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelButtonUndoItemProcessing:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0434\u0456\u044E",labelButtonRetryItemProcessing:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelButtonProcessItem:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",labelMaxFileSizeExceeded:"\u0424\u0430\u0439\u043B \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0438\u0439",labelMaxFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440 \u0444\u0430\u0439\u043B\u0443: {filesize}",labelMaxTotalFileSizeExceeded:"\u041F\u0435\u0440\u0435\u0432\u0438\u0449\u0435\u043D\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440",labelMaxTotalFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {filesize}",labelFileTypeNotAllowed:"\u0424\u043E\u0440\u043C\u0430\u0442 \u0444\u0430\u0439\u043B\u0443 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",fileValidateTypeLabelExpectedTypes:"\u041E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F {allButLastType} \u0430\u0431\u043E {lastType}",imageValidateSizeLabelFormatError:"\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",imageValidateSizeLabelImageSizeTooSmall:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0435",imageValidateSizeLabelImageSizeTooBig:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435",imageValidateSizeLabelExpectedMinSize:"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456",imageValidateSizeLabelImageResolutionTooHigh:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0456",imageValidateSizeLabelExpectedMinResolution:"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0438: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0438: {maxResolution}"};var cr={labelIdle:'K\xE9o th\u1EA3 t\u1EC7p c\u1EE7a b\u1EA1n ho\u1EB7c T\xECm ki\u1EBFm ',labelInvalidField:"Tr\u01B0\u1EDDng ch\u1EE9a c\xE1c t\u1EC7p kh\xF4ng h\u1EE3p l\u1EC7",labelFileWaitingForSize:"\u0110ang ch\u1EDD k\xEDch th\u01B0\u1EDBc",labelFileSizeNotAvailable:"K\xEDch th\u01B0\u1EDBc kh\xF4ng c\xF3 s\u1EB5n",labelFileLoading:"\u0110ang t\u1EA3i",labelFileLoadError:"L\u1ED7i khi t\u1EA3i",labelFileProcessing:"\u0110ang t\u1EA3i l\xEAn",labelFileProcessingComplete:"T\u1EA3i l\xEAn th\xE0nh c\xF4ng",labelFileProcessingAborted:"\u0110\xE3 hu\u1EF7 t\u1EA3i l\xEAn",labelFileProcessingError:"L\u1ED7i khi t\u1EA3i l\xEAn",labelFileProcessingRevertError:"L\u1ED7i khi ho\xE0n nguy\xEAn",labelFileRemoveError:"L\u1ED7i khi x\xF3a",labelTapToCancel:"nh\u1EA5n \u0111\u1EC3 h\u1EE7y",labelTapToRetry:"nh\u1EA5n \u0111\u1EC3 th\u1EED l\u1EA1i",labelTapToUndo:"nh\u1EA5n \u0111\u1EC3 ho\xE0n t\xE1c",labelButtonRemoveItem:"Xo\xE1",labelButtonAbortItemLoad:"Hu\u1EF7 b\u1ECF",labelButtonRetryItemLoad:"Th\u1EED l\u1EA1i",labelButtonAbortItemProcessing:"H\u1EE7y b\u1ECF",labelButtonUndoItemProcessing:"Ho\xE0n t\xE1c",labelButtonRetryItemProcessing:"Th\u1EED l\u1EA1i",labelButtonProcessItem:"T\u1EA3i l\xEAn",labelMaxFileSizeExceeded:"T\u1EADp tin qu\xE1 l\u1EDBn",labelMaxFileSize:"K\xEDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a l\xE0 {filesize}",labelMaxTotalFileSizeExceeded:"\u0110\xE3 v\u01B0\u1EE3t qu\xE1 t\u1ED5ng k\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a",labelMaxTotalFileSize:"T\u1ED5ng k\xEDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a l\xE0 {filesize}",labelFileTypeNotAllowed:"T\u1EC7p thu\u1ED9c lo\u1EA1i kh\xF4ng h\u1EE3p l\u1EC7",fileValidateTypeLabelExpectedTypes:"Ki\u1EC3u t\u1EC7p h\u1EE3p l\u1EC7 l\xE0 {allButLastType} ho\u1EB7c {lastType}",imageValidateSizeLabelFormatError:"Lo\u1EA1i h\xECnh \u1EA3nh kh\xF4ng \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3",imageValidateSizeLabelImageSizeTooSmall:"H\xECnh \u1EA3nh qu\xE1 nh\u1ECF",imageValidateSizeLabelImageSizeTooBig:"H\xECnh \u1EA3nh qu\xE1 l\u1EDBn",imageValidateSizeLabelExpectedMinSize:"K\xEDch th\u01B0\u1EDBc t\u1ED1i thi\u1EC3u l\xE0 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"K\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a l\xE0 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0110\u1ED9 ph\xE2n gi\u1EA3i qu\xE1 th\u1EA5p",imageValidateSizeLabelImageResolutionTooHigh:"\u0110\u1ED9 ph\xE2n gi\u1EA3i qu\xE1 cao",imageValidateSizeLabelExpectedMinResolution:"\u0110\u1ED9 ph\xE2n gi\u1EA3i t\u1ED1i thi\u1EC3u l\xE0 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0110\u1ED9 ph\xE2n gi\u1EA3i t\u1ED1i \u0111a l\xE0 {maxResolution}"};var dr={labelIdle:'\u62D6\u653E\u6587\u4EF6\uFF0C\u6216\u8005 \u6D4F\u89C8 ',labelInvalidField:"\u5B57\u6BB5\u5305\u542B\u65E0\u6548\u6587\u4EF6",labelFileWaitingForSize:"\u8BA1\u7B97\u6587\u4EF6\u5927\u5C0F",labelFileSizeNotAvailable:"\u6587\u4EF6\u5927\u5C0F\u4E0D\u53EF\u7528",labelFileLoading:"\u52A0\u8F7D",labelFileLoadError:"\u52A0\u8F7D\u9519\u8BEF",labelFileProcessing:"\u4E0A\u4F20",labelFileProcessingComplete:"\u5DF2\u4E0A\u4F20",labelFileProcessingAborted:"\u4E0A\u4F20\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u4F20\u51FA\u9519",labelFileProcessingRevertError:"\u8FD8\u539F\u51FA\u9519",labelFileRemoveError:"\u5220\u9664\u51FA\u9519",labelTapToCancel:"\u70B9\u51FB\u53D6\u6D88",labelTapToRetry:"\u70B9\u51FB\u91CD\u8BD5",labelTapToUndo:"\u70B9\u51FB\u64A4\u6D88",labelButtonRemoveItem:"\u5220\u9664",labelButtonAbortItemLoad:"\u4E2D\u6B62",labelButtonRetryItemLoad:"\u91CD\u8BD5",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u64A4\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8BD5",labelButtonProcessItem:"\u4E0A\u4F20",labelMaxFileSizeExceeded:"\u6587\u4EF6\u592A\u5927",labelMaxFileSize:"\u6700\u5927\u503C: {filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u8FC7\u6700\u5927\u6587\u4EF6\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u6587\u4EF6\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u6587\u4EF6\u7C7B\u578B\u65E0\u6548",fileValidateTypeLabelExpectedTypes:"\u5E94\u4E3A {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u56FE\u50CF\u7C7B\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u56FE\u50CF\u592A\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u56FE\u50CF\u592A\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u503C: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u503C: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u5206\u8FA8\u7387\u592A\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u5206\u8FA8\u7387\u592A\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u5C0F\u5206\u8FA8\u7387\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u5927\u5206\u8FA8\u7387\uFF1A{maxResolution}"};var pr={labelIdle:'\u62D6\u653E\u6A94\u6848\uFF0C\u6216\u8005 \u700F\u89BD ',labelInvalidField:"\u4E0D\u652F\u63F4\u6B64\u6A94\u6848",labelFileWaitingForSize:"\u6B63\u5728\u8A08\u7B97\u6A94\u6848\u5927\u5C0F",labelFileSizeNotAvailable:"\u6A94\u6848\u5927\u5C0F\u4E0D\u7B26",labelFileLoading:"\u8B80\u53D6\u4E2D",labelFileLoadError:"\u8B80\u53D6\u932F\u8AA4",labelFileProcessing:"\u4E0A\u50B3",labelFileProcessingComplete:"\u5DF2\u4E0A\u50B3",labelFileProcessingAborted:"\u4E0A\u50B3\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u50B3\u767C\u751F\u932F\u8AA4",labelFileProcessingRevertError:"\u9084\u539F\u932F\u8AA4",labelFileRemoveError:"\u522A\u9664\u932F\u8AA4",labelTapToCancel:"\u9EDE\u64CA\u53D6\u6D88",labelTapToRetry:"\u9EDE\u64CA\u91CD\u8A66",labelTapToUndo:"\u9EDE\u64CA\u9084\u539F",labelButtonRemoveItem:"\u522A\u9664",labelButtonAbortItemLoad:"\u505C\u6B62",labelButtonRetryItemLoad:"\u91CD\u8A66",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u53D6\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8A66",labelButtonProcessItem:"\u4E0A\u50B3",labelMaxFileSizeExceeded:"\u6A94\u6848\u904E\u5927",labelMaxFileSize:"\u6700\u5927\u503C\uFF1A{filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u904E\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u4E0D\u652F\u63F4\u6B64\u985E\u578B\u6A94\u6848",fileValidateTypeLabelExpectedTypes:"\u61C9\u70BA {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u6B64\u985E\u5716\u7247\u985E\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u5716\u7247\u904E\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u5716\u7247\u904E\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u5C3A\u5BF8\uFF1A{minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u5C3A\u5BF8\uFF1A{maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u89E3\u6790\u5EA6\u904E\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u89E3\u6790\u5EA6\u904E\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u4F4E\u89E3\u6790\u5EA6\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u9AD8\u89E3\u6790\u5EA6\uFF1A{maxResolution}"};var mr={labelIdle:'\u62D6\u653E\u6A94\u6848\uFF0C\u6216\u8005 \u700F\u89BD ',labelInvalidField:"\u4E0D\u652F\u63F4\u6B64\u6A94\u6848",labelFileWaitingForSize:"\u6B63\u5728\u8A08\u7B97\u6A94\u6848\u5927\u5C0F",labelFileSizeNotAvailable:"\u6A94\u6848\u5927\u5C0F\u4E0D\u7B26",labelFileLoading:"\u8B80\u53D6\u4E2D",labelFileLoadError:"\u8B80\u53D6\u932F\u8AA4",labelFileProcessing:"\u4E0A\u50B3",labelFileProcessingComplete:"\u5DF2\u4E0A\u50B3",labelFileProcessingAborted:"\u4E0A\u50B3\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u50B3\u767C\u751F\u932F\u8AA4",labelFileProcessingRevertError:"\u9084\u539F\u932F\u8AA4",labelFileRemoveError:"\u522A\u9664\u932F\u8AA4",labelTapToCancel:"\u9EDE\u64CA\u53D6\u6D88",labelTapToRetry:"\u9EDE\u64CA\u91CD\u8A66",labelTapToUndo:"\u9EDE\u64CA\u9084\u539F",labelButtonRemoveItem:"\u522A\u9664",labelButtonAbortItemLoad:"\u505C\u6B62",labelButtonRetryItemLoad:"\u91CD\u8A66",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u53D6\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8A66",labelButtonProcessItem:"\u4E0A\u50B3",labelMaxFileSizeExceeded:"\u6A94\u6848\u904E\u5927",labelMaxFileSize:"\u6700\u5927\u503C\uFF1A{filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u904E\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u4E0D\u652F\u63F4\u6B64\u985E\u578B\u6A94\u6848",fileValidateTypeLabelExpectedTypes:"\u61C9\u70BA {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u6B64\u985E\u5716\u7247\u985E\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u5716\u7247\u904E\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u5716\u7247\u904E\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u5C3A\u5BF8\uFF1A{minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u5C3A\u5BF8\uFF1A{maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u89E3\u6790\u5EA6\u904E\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u89E3\u6790\u5EA6\u904E\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u4F4E\u89E3\u6790\u5EA6\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u9AD8\u89E3\u6790\u5EA6\uFF1A{maxResolution}"};ve(Hl);ve(jl);ve($l);ve(Kl);ve(eo);ve(mo);ve(go);ve(_o);ve(Aa);window.FilePond=na;function Og({acceptedFileTypes:e,automaticallyCropImagesAspectRatio:t,automaticallyOpenImageEditorForAspectRatio:i,automaticallyResizeImagesHeight:a,automaticallyResizeImagesMode:n,automaticallyResizeImagesWidth:l,cancelUploadUsing:o,canEditSvgs:r,confirmSvgEditingMessage:s,deleteUploadedFileUsing:p,disabledSvgEditingMessage:c,getUploadedFilesUsing:d,hasCircleCropper:m,hasImageEditor:u,imageEditorEmptyFillColor:g,imageEditorMode:f,imageEditorViewportHeight:h,imageEditorViewportWidth:I,imagePreviewHeight:b,isAvatar:E,isDeletable:v,isDisabled:y,isDownloadable:T,isImageEditorExplicitlyEnabled:_,isMultiple:x,isOpenable:R,isPasteable:P,isPreviewable:z,isReorderable:A,isSvgEditingConfirmed:B,itemPanelAspectRatio:w,loadingIndicatorPosition:F,locale:S,maxFiles:L,maxFilesValidationMessage:D,maxParallelUploads:O,maxSize:U,mimeTypeMap:C,minSize:X,panelAspectRatio:K,panelLayout:Z,placeholder:ce,removeUploadedFileButtonPosition:V,removeUploadedFileUsing:W,reorderUploadedFilesUsing:$,shouldAppendFiles:ie,shouldAutomaticallyUpscaleImagesWhenResizing:ee,shouldOrientImageFromExif:pt,shouldTransformImage:gr,state:fr,uploadButtonPosition:hr,uploadingMessage:br,uploadProgressIndicatorPosition:Er,uploadUsing:Tr}){return{fileKeyIndex:{},pond:null,shouldUpdateState:!0,state:fr,lastState:null,error:null,uploadedFileIndex:{},isEditorOpen:!1,isEditorOpenedForAspectRatio:!1,editingFile:{},currentRatio:"",editor:{},visibilityObserver:null,isInitializing:!1,async init(){if(this.pond||this.isInitializing)return;if(this.isInitializing=!0,this.visibilityObserver||(this.visibilityObserver=new ResizeObserver(()=>{this.$el.offsetParent===null||getComputedStyle(this.$el).visibility==="hidden"||(this.pond?document.dispatchEvent(new Event("visibilitychange")):this.init())}),this.visibilityObserver.observe(this.$el)),this.$el.offsetParent===null||getComputedStyle(this.$el).visibility==="hidden"){this.isInitializing=!1;return}Dt(ur[S]??ur.en),this.pond=ft(this.$refs.input,{acceptedFileTypes:e,allowImageExifOrientation:pt,allowPaste:P,allowRemove:v,allowReorder:A,allowImagePreview:z,allowVideoPreview:z,allowAudioPreview:z,allowImageTransform:gr,credits:!1,files:await this.getFiles(),imageCropAspectRatio:t,imagePreviewHeight:b,imageResizeTargetHeight:a,imageResizeTargetWidth:l,imageResizeMode:n,imageResizeUpscale:ee,imageTransformOutputStripImageHead:!1,itemInsertLocation:ie?"after":"before",...ce&&{labelIdle:ce},maxFiles:L,maxFileSize:U,minFileSize:X,...O&&{maxParallelUploads:O},styleButtonProcessItemPosition:hr,styleButtonRemoveItemPosition:V,styleItemPanelAspectRatio:w,styleLoadIndicatorPosition:F,stylePanelAspectRatio:K,stylePanelLayout:Z,styleProgressIndicatorPosition:Er,server:{load:async(k,Y)=>{let Ne=await(await fetch(k,{cache:"no-store"})).blob();Y(Ne)},process:(k,Y,q,Ne,Me,$e,Ir)=>{this.shouldUpdateState=!1;let za=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,Zt=>(Zt^crypto.getRandomValues(new Uint8Array(1))[0]&15>>Zt/4).toString(16));return Tr(za,Y,Zt=>{this.shouldUpdateState=!0,Ne(Zt)},Me,$e),{abort:()=>{o(za),Ir()}}},remove:async(k,Y)=>{let q=this.uploadedFileIndex[k]??null;q&&(await p(q),Y())},revert:async(k,Y)=>{await W(k),Y()}},allowImageEdit:_,imageEditEditor:{open:k=>this.loadEditor(k),onconfirm:()=>{},oncancel:()=>this.closeEditor(),onclose:()=>this.closeEditor()},fileValidateTypeDetectType:(k,Y)=>new Promise((q,Ne)=>{let Me=k.name.split(".").pop().toLowerCase(),$e=C[Me]||Y||Gl.getType(Me);$e?q($e):Ne()})}),this.$watch("state",async()=>{if(this.pond&&this.shouldUpdateState&&this.state!==void 0){if(this.state!==null&&Object.values(this.state).filter(k=>k.startsWith("livewire-file:")).length){this.lastState=null;return}JSON.stringify(this.state)!==this.lastState&&(this.lastState=JSON.stringify(this.state),this.pond.files=await this.getFiles())}}),this.pond.on("reorderfiles",async k=>{let Y=k.map(q=>q.source instanceof File?q.serverId:this.uploadedFileIndex[q.source]??null).filter(q=>q);await $(ie?Y:Y.reverse())}),this.pond.on("initfile",async k=>{T&&(E||this.insertDownloadLink(k))}),this.pond.on("initfile",async k=>{R&&(E||this.insertOpenLink(k))}),this.pond.on("addfilestart",async k=>{this.error=null,k.status===Tt.PROCESSING_QUEUED&&this.dispatchFormEvent("form-processing-started",{message:br})});let N=async()=>{this.pond.getFiles().filter(k=>k.status===Tt.PROCESSING||k.status===Tt.PROCESSING_QUEUED).length||this.dispatchFormEvent("form-processing-finished")};this.pond.on("processfile",N),this.pond.on("processfileabort",N),this.pond.on("processfilerevert",N),this.pond.on("removefile",N),this.pond.on("warning",k=>{k.body==="Max files"&&(this.error=D)}),Z==="compact circle"&&this.pond.on("error",k=>{this.error=`${k.main}: ${k.sub}`.replace("Expects or","Expects")}),this.pond.on("removefile",()=>this.error=null),i&&this.pond.on("addfile",(k,Y)=>{k||Y.file instanceof File&&Y.file.type.startsWith("image/")&&this.checkImageAspectRatio(Y.file)}),this.isInitializing=!1},destroy(){this.visibilityObserver?.disconnect(),this.destroyEditor(),this.pond&&(ht(this.$refs.input),this.pond=null)},dispatchFormEvent(G,N={}){this.$el.closest("form")?.dispatchEvent(new CustomEvent(G,{composed:!0,cancelable:!0,detail:N}))},async getUploadedFiles(){let G=await d();this.fileKeyIndex=G??{},this.uploadedFileIndex=Object.entries(this.fileKeyIndex).filter(([N,k])=>k?.url).reduce((N,[k,Y])=>(N[Y.url]=k,N),{})},async getFiles(){await this.getUploadedFiles();let G=[];for(let N of Object.values(this.fileKeyIndex))N&&G.push({source:N.url,options:{type:"local",...!N.type||z&&(/^audio/.test(N.type)||/^image/.test(N.type)||/^video/.test(N.type))?{}:{file:{name:N.name,size:N.size,type:N.type}}}});return ie?G:G.reverse()},insertDownloadLink(G){if(G.origin!==Bt.LOCAL)return;let N=this.getDownloadLink(G);N&&document.getElementById(`filepond--item-${G.id}`).querySelector(".filepond--file-info-main").prepend(N)},insertOpenLink(G){if(G.origin!==Bt.LOCAL)return;let N=this.getOpenLink(G);N&&document.getElementById(`filepond--item-${G.id}`).querySelector(".filepond--file-info-main").prepend(N)},getDownloadLink(G){let N=G.source;if(!N)return;let k=document.createElement("a");return k.className="filepond--download-icon",k.href=N,k.download=G.file.name,k},getOpenLink(G){let N=G.source;if(!N)return;let k=document.createElement("a");return k.className="filepond--open-icon",k.href=N,k.target="_blank",k},initEditor(){if(y||!u)return;let G={aspectRatio:i??I/h,autoCropArea:1,center:!0,cropBoxResizable:!0,guides:!0,highlight:!0,responsive:!0,toggleDragModeOnDblclick:!0,viewMode:f,wheelZoomRatio:.02};_&&(G.crop=N=>{this.$refs.xPositionInput.value=Math.round(N.detail.x),this.$refs.yPositionInput.value=Math.round(N.detail.y),this.$refs.heightInput.value=Math.round(N.detail.height),this.$refs.widthInput.value=Math.round(N.detail.width),this.$refs.rotationInput.value=N.detail.rotate}),this.editor=new xa(this.$refs.editor,G)},closeEditor(){if(this.isEditorOpenedForAspectRatio){let G=this.pond.getFiles().find(N=>N.filename===this.editingFile.name);G&&this.pond.removeFile(G.id,{revert:!0}),this.isEditorOpenedForAspectRatio=!1}this.editingFile={},this.isEditorOpen=!1,this.destroyEditor()},fixImageDimensions(G,N){if(G.type!=="image/svg+xml")return N(G);let k=new FileReader;k.onload=Y=>{let q=new DOMParser().parseFromString(Y.target.result,"image/svg+xml")?.querySelector("svg");if(!q)return N(G);let Ne=["viewBox","ViewBox","viewbox"].find($e=>q.hasAttribute($e));if(!Ne)return N(G);let Me=q.getAttribute(Ne).split(" ");return!Me||Me.length!==4?N(G):(q.setAttribute("width",parseFloat(Me[2])+"pt"),q.setAttribute("height",parseFloat(Me[3])+"pt"),N(new File([new Blob([new XMLSerializer().serializeToString(q)],{type:"image/svg+xml"})],G.name,{type:"image/svg+xml",_relativePath:""})))},k.readAsText(G)},loadEditor(G){if(y||!u||!G)return;let N=G.type==="image/svg+xml";if(!r&&N){alert(c);return}B&&N&&!confirm(s)||this.fixImageDimensions(G,k=>{this.editingFile=k,this.initEditor();let Y=new FileReader;Y.onload=q=>{this.isEditorOpen=!0,setTimeout(()=>this.editor.replace(q.target.result),200)},Y.readAsDataURL(G)})},getRoundedCanvas(G){let N=G.width,k=G.height,Y=document.createElement("canvas");Y.width=N,Y.height=k;let q=Y.getContext("2d");return q.imageSmoothingEnabled=!0,q.drawImage(G,0,0,N,k),q.globalCompositeOperation="destination-in",q.beginPath(),q.ellipse(N/2,k/2,N/2,k/2,0,0,2*Math.PI),q.fill(),Y},saveEditor(){if(y||!u)return;this.isEditorOpenedForAspectRatio=!1;let G=this.editor.getCroppedCanvas({fillColor:g??"transparent",height:a,imageSmoothingEnabled:!0,imageSmoothingQuality:"high",width:l});m&&(G=this.getRoundedCanvas(G)),G.toBlob(N=>{this.pond.removeFile(this.pond.getFiles().find(k=>k.filename===this.editingFile.name)?.id,{revert:!0}),this.$nextTick(()=>{this.shouldUpdateState=!1;let k=this.editingFile.name.slice(0,this.editingFile.name.lastIndexOf(".")),Y=this.editingFile.name.split(".").pop();Y==="svg"&&(Y="png");let q=/-v(\d+)/;q.test(k)?k=k.replace(q,(Ne,Me)=>`-v${Number(Me)+1}`):k+="-v1",this.pond.addFile(new File([N],`${k}.${Y}`,{type:this.editingFile.type==="image/svg+xml"||m?"image/png":this.editingFile.type,lastModified:new Date().getTime()})).then(()=>{this.closeEditor()}).catch(()=>{this.closeEditor()})})},m?"image/png":this.editingFile.type)},destroyEditor(){this.editor&&typeof this.editor.destroy=="function"&&this.editor.destroy(),this.editor=null},checkImageAspectRatio(G){if(!i)return;let N=new Image,k=URL.createObjectURL(G);N.onload=()=>{URL.revokeObjectURL(k);let Y=N.width/N.height;Math.abs(Y-i)>.01&&(this.isEditorOpenedForAspectRatio=!0,this.loadEditor(G))},N.onerror=()=>{URL.revokeObjectURL(k)},N.src=k}}}var ur={am:wo,ar:Lo,az:Mo,ca:Ao,ckb:zo,cs:Po,da:Fo,de:Oo,el:Do,en:Co,es:Bo,fa:ko,fi:No,fr:Vo,he:Go,hr:Uo,hu:Ho,id:Wo,it:jo,ja:Yo,km:qo,ko:$o,lt:Xo,lus:Ko,lv:Zo,nb:Qo,nl:Jo,pl:er,pt:tr,pt_BR:ir,ro:ar,ru:nr,sk:lr,sv:or,tr:rr,uk:sr,vi:cr,zh_CN:dr,zh_HK:pr,zh_TW:mr};export{Og as default}; /*! Bundled license information: filepond/dist/filepond.esm.js: (*! - * FilePond 4.31.4 + * FilePond 4.32.10 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) diff --git a/public/js/filament/forms/components/key-value.js b/public/js/filament/forms/components/key-value.js index 9c847c018c..293864bec1 100644 --- a/public/js/filament/forms/components/key-value.js +++ b/public/js/filament/forms/components/key-value.js @@ -1 +1 @@ -function r({state:o}){return{state:o,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(t,e)=>{let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows);this.rows=[];let s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.$nextTick(()=>{this.rows=e,this.updateState()})},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default}; +function a({state:r}){return{state:r,rows:[],init(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(e,t)=>{if(!Array.isArray(e))return;let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(e)===0&&s(t)===0||this.updateRows()})},addRow(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow(e){this.rows.splice(e,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows(e){let t=Alpine.raw(this.rows);this.rows=[];let s=t.splice(e.oldIndex,1)[0];t.splice(e.newIndex,0,s),this.$nextTick(()=>{this.rows=t,this.updateState()})},updateRows(){let t=Alpine.raw(this.state).map(({key:s,value:i})=>({key:s,value:i}));this.rows.forEach(s=>{(s.key===""||s.key===null)&&t.push({key:"",value:s.value})}),this.rows=t},updateState(){let e=[];this.rows.forEach(t=>{t.key===""||t.key===null||e.push({key:t.key,value:t.value})}),JSON.stringify(this.state)!==JSON.stringify(e)&&(this.state=e)}}}export{a as default}; diff --git a/public/js/filament/forms/components/markdown-editor.js b/public/js/filament/forms/components/markdown-editor.js index c5861840b4..0ae0a7596d 100644 --- a/public/js/filament/forms/components/markdown-editor.js +++ b/public/js/filament/forms/components/markdown-editor.js @@ -1,43 +1,43 @@ -var ss=Object.defineProperty;var Sd=Object.getOwnPropertyDescriptor;var Td=Object.getOwnPropertyNames;var Ld=Object.prototype.hasOwnProperty;var Cd=(o,p)=>()=>(o&&(p=o(o=0)),p);var Ke=(o,p)=>()=>(p||o((p={exports:{}}).exports,p),p.exports);var Ed=(o,p,v,C)=>{if(p&&typeof p=="object"||typeof p=="function")for(let b of Td(p))!Ld.call(o,b)&&b!==v&&ss(o,b,{get:()=>p[b],enumerable:!(C=Sd(p,b))||C.enumerable});return o};var zd=o=>Ed(ss({},"__esModule",{value:!0}),o);var We=Ke((Yo,Qo)=>{(function(o,p){typeof Yo=="object"&&typeof Qo<"u"?Qo.exports=p():typeof define=="function"&&define.amd?define(p):(o=o||self,o.CodeMirror=p())})(Yo,function(){"use strict";var o=navigator.userAgent,p=navigator.platform,v=/gecko\/\d/i.test(o),C=/MSIE \d/.test(o),b=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(o),S=/Edge\/(\d+)/.exec(o),s=C||b||S,h=s&&(C?document.documentMode||6:+(S||b)[1]),g=!S&&/WebKit\//.test(o),T=g&&/Qt\/\d+\.\d+/.test(o),x=!S&&/Chrome\/(\d+)/.exec(o),c=x&&+x[1],d=/Opera\//.test(o),w=/Apple Computer/.test(navigator.vendor),E=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(o),z=/PhantomJS/.test(o),y=w&&(/Mobile\/\w+/.test(o)||navigator.maxTouchPoints>2),R=/Android/.test(o),M=y||R||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(o),H=y||/Mac/.test(p),Z=/\bCrOS\b/.test(o),ee=/win/i.test(p),re=d&&o.match(/Version\/(\d*\.\d*)/);re&&(re=Number(re[1])),re&&re>=15&&(d=!1,g=!0);var N=H&&(T||d&&(re==null||re<12.11)),F=v||s&&h>=9;function D(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var Q=function(e,t){var n=e.className,r=D(t).exec(n);if(r){var i=n.slice(r.index+r[0].length);e.className=n.slice(0,r.index)+(i?r[1]+i:"")}};function j(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function V(e,t){return j(e).appendChild(t)}function _(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),typeof t=="string")i.appendChild(document.createTextNode(t));else if(t)for(var a=0;a=t)return l+(t-a);l+=u-a,l+=n-l%n,a=u+1}}var qe=function(){this.id=null,this.f=null,this.time=0,this.handler=Ee(this.onTimeout,this)};qe.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-+new Date)},qe.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n=t)return r+Math.min(l,t-i);if(i+=a-r,i+=n-i%n,r=a+1,i>=t)return r}}var U=[""];function G(e){for(;U.length<=e;)U.push(ce(U)+" ");return U[e]}function ce(e){return e[e.length-1]}function Be(e,t){for(var n=[],r=0;r"\x80"&&(e.toUpperCase()!=e.toLowerCase()||Ue.test(e))}function Me(e,t){return t?t.source.indexOf("\\w")>-1&&we(e)?!0:t.test(e):we(e)}function Le(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var $=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function W(e){return e.charCodeAt(0)>=768&&$.test(e)}function se(e,t,n){for(;(n<0?t>0:tn?-1:1;;){if(t==n)return t;var i=(t+n)/2,a=r<0?Math.ceil(i):Math.floor(i);if(a==t)return e(a)?t:n;e(a)?n=a:t=a+r}}function nt(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,a=0;at||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),l.level==1?"rtl":"ltr",a),i=!0)}i||r(t,n,"ltr")}var dt=null;function Pt(e,t,n){var r;dt=null;for(var i=0;it)return i;a.to==t&&(a.from!=a.to&&n=="before"?r=i:dt=i),a.from==t&&(a.from!=a.to&&n!="before"?r=i:dt=i)}return r??dt}var It=function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";function n(m){return m<=247?e.charAt(m):1424<=m&&m<=1524?"R":1536<=m&&m<=1785?t.charAt(m-1536):1774<=m&&m<=2220?"r":8192<=m&&m<=8203?"w":m==8204?"b":"L"}var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,i=/[stwN]/,a=/[LRr]/,l=/[Lb1n]/,u=/[1n]/;function f(m,A,P){this.level=m,this.from=A,this.to=P}return function(m,A){var P=A=="ltr"?"L":"R";if(m.length==0||A=="ltr"&&!r.test(m))return!1;for(var J=m.length,Y=[],ie=0;ie-1&&(r[t]=i.slice(0,a).concat(i.slice(a+1)))}}}function it(e,t){var n=nr(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i0}function Wt(e){e.prototype.on=function(t,n){Fe(this,t,n)},e.prototype.off=function(t,n){_t(this,t,n)}}function kt(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Hr(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ct(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==!1}function dr(e){kt(e),Hr(e)}function yn(e){return e.target||e.srcElement}function Ut(e){var t=e.which;return t==null&&(e.button&1?t=1:e.button&2?t=3:e.button&4&&(t=2)),H&&e.ctrlKey&&t==1&&(t=3),t}var eo=function(){if(s&&h<9)return!1;var e=_("div");return"draggable"in e||"dragDrop"in e}(),Br;function ei(e){if(Br==null){var t=_("span","\u200B");V(e,_("span",[t,document.createTextNode("x")])),e.firstChild.offsetHeight!=0&&(Br=t.offsetWidth<=1&&t.offsetHeight>2&&!(s&&h<8))}var n=Br?_("span","\u200B"):_("span","\xA0",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}var xn;function pr(e){if(xn!=null)return xn;var t=V(e,document.createTextNode("A\u062EA")),n=X(t,0,1).getBoundingClientRect(),r=X(t,1,2).getBoundingClientRect();return j(e),!n||n.left==n.right?!1:xn=r.right-n.right<3}var Bt=` +var ss=Object.defineProperty;var Sd=Object.getOwnPropertyDescriptor;var Td=Object.getOwnPropertyNames;var Ld=Object.prototype.hasOwnProperty;var Cd=(o,p)=>()=>(o&&(p=o(o=0)),p);var Ke=(o,p)=>()=>(p||o((p={exports:{}}).exports,p),p.exports);var Ed=(o,p,v,C)=>{if(p&&typeof p=="object"||typeof p=="function")for(let b of Td(p))!Ld.call(o,b)&&b!==v&&ss(o,b,{get:()=>p[b],enumerable:!(C=Sd(p,b))||C.enumerable});return o};var zd=o=>Ed(ss({},"__esModule",{value:!0}),o);var We=Ke((Yo,Qo)=>{(function(o,p){typeof Yo=="object"&&typeof Qo<"u"?Qo.exports=p():typeof define=="function"&&define.amd?define(p):(o=o||self,o.CodeMirror=p())})(Yo,(function(){"use strict";var o=navigator.userAgent,p=navigator.platform,v=/gecko\/\d/i.test(o),C=/MSIE \d/.test(o),b=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(o),S=/Edge\/(\d+)/.exec(o),s=C||b||S,h=s&&(C?document.documentMode||6:+(S||b)[1]),g=!S&&/WebKit\//.test(o),T=g&&/Qt\/\d+\.\d+/.test(o),w=!S&&/Chrome\/(\d+)/.exec(o),c=w&&+w[1],d=/Opera\//.test(o),k=/Apple Computer/.test(navigator.vendor),z=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(o),M=/PhantomJS/.test(o),_=k&&(/Mobile\/\w+/.test(o)||navigator.maxTouchPoints>2),W=/Android/.test(o),E=_||W||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(o),O=_||/Mac/.test(p),G=/\bCrOS\b/.test(o),J=/win/i.test(p),re=d&&o.match(/Version\/(\d*\.\d*)/);re&&(re=Number(re[1])),re&&re>=15&&(d=!1,g=!0);var q=O&&(T||d&&(re==null||re<12.11)),I=v||s&&h>=9;function D(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var Q=function(e,t){var n=e.className,r=D(t).exec(n);if(r){var i=n.slice(r.index+r[0].length);e.className=n.slice(0,r.index)+(i?r[1]+i:"")}};function j(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function V(e,t){return j(e).appendChild(t)}function y(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),typeof t=="string")i.appendChild(document.createTextNode(t));else if(t)for(var a=0;a=t)return l+(t-a);l+=u-a,l+=n-l%n,a=u+1}}var qe=function(){this.id=null,this.f=null,this.time=0,this.handler=Ee(this.onTimeout,this)};qe.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-+new Date)},qe.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n=t)return r+Math.min(l,t-i);if(i+=a-r,i+=n-i%n,r=a+1,i>=t)return r}}var U=[""];function Z(e){for(;U.length<=e;)U.push(ce(U)+" ");return U[e]}function ce(e){return e[e.length-1]}function He(e,t){for(var n=[],r=0;r"\x80"&&(e.toUpperCase()!=e.toLowerCase()||Ue.test(e))}function Me(e,t){return t?t.source.indexOf("\\w")>-1&&we(e)?!0:t.test(e):we(e)}function Le(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var $=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function H(e){return e.charCodeAt(0)>=768&&$.test(e)}function se(e,t,n){for(;(n<0?t>0:tn?-1:1;;){if(t==n)return t;var i=(t+n)/2,a=r<0?Math.ceil(i):Math.floor(i);if(a==t)return e(a)?t:n;e(a)?n=a:t=a+r}}function nt(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,a=0;at||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),l.level==1?"rtl":"ltr",a),i=!0)}i||r(t,n,"ltr")}var dt=null;function Pt(e,t,n){var r;dt=null;for(var i=0;it)return i;a.to==t&&(a.from!=a.to&&n=="before"?r=i:dt=i),a.from==t&&(a.from!=a.to&&n!="before"?r=i:dt=i)}return r??dt}var Ft=(function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";function n(m){return m<=247?e.charAt(m):1424<=m&&m<=1524?"R":1536<=m&&m<=1785?t.charAt(m-1536):1774<=m&&m<=2220?"r":8192<=m&&m<=8203?"w":m==8204?"b":"L"}var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,i=/[stwN]/,a=/[LRr]/,l=/[Lb1n]/,u=/[1n]/;function f(m,A,B){this.level=m,this.from=A,this.to=B}return function(m,A){var B=A=="ltr"?"L":"R";if(m.length==0||A=="ltr"&&!r.test(m))return!1;for(var ee=m.length,Y=[],ie=0;ie-1&&(r[t]=i.slice(0,a).concat(i.slice(a+1)))}}}function it(e,t){var n=nr(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i0}function Wt(e){e.prototype.on=function(t,n){Ie(this,t,n)},e.prototype.off=function(t,n){_t(this,t,n)}}function kt(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Rr(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ct(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==!1}function dr(e){kt(e),Rr(e)}function yn(e){return e.target||e.srcElement}function Ut(e){var t=e.which;return t==null&&(e.button&1?t=1:e.button&2?t=3:e.button&4&&(t=2)),O&&e.ctrlKey&&t==1&&(t=3),t}var eo=(function(){if(s&&h<9)return!1;var e=y("div");return"draggable"in e||"dragDrop"in e})(),Hr;function ei(e){if(Hr==null){var t=y("span","\u200B");V(e,y("span",[t,document.createTextNode("x")])),e.firstChild.offsetHeight!=0&&(Hr=t.offsetWidth<=1&&t.offsetHeight>2&&!(s&&h<8))}var n=Hr?y("span","\u200B"):y("span","\xA0",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}var xn;function pr(e){if(xn!=null)return xn;var t=V(e,document.createTextNode("A\u062EA")),n=X(t,0,1).getBoundingClientRect(),r=X(t,1,2).getBoundingClientRect();return j(e),!n||n.left==n.right?!1:xn=r.right-n.right<3}var Ht=` b`.split(/\n/).length!=3?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf(` -`,t);i==-1&&(i=e.length);var a=e.slice(t,e.charAt(i-1)=="\r"?i-1:i),l=a.indexOf("\r");l!=-1?(n.push(a.slice(0,l)),t+=l+1):(n.push(a),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},hr=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch{return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch{}return!t||t.parentElement()!=e?!1:t.compareEndPoints("StartToEnd",t)!=0},ti=function(){var e=_("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),typeof e.oncopy=="function")}(),$t=null;function to(e){if($t!=null)return $t;var t=V(e,_("span","x")),n=t.getBoundingClientRect(),r=X(t,0,1).getBoundingClientRect();return $t=Math.abs(n.left-r.left)>1}var Wr={},Kt={};function Gt(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Wr[e]=t}function Cr(e,t){Kt[e]=t}function Ur(e){if(typeof e=="string"&&Kt.hasOwnProperty(e))e=Kt[e];else if(e&&typeof e.name=="string"&&Kt.hasOwnProperty(e.name)){var t=Kt[e.name];typeof t=="string"&&(t={name:t}),e=oe(t,e),e.name=t.name}else{if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ur("application/xml");if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ur("application/json")}return typeof e=="string"?{name:e}:e||{name:"null"}}function $r(e,t){t=Ur(t);var n=Wr[t.name];if(!n)return $r(e,"text/plain");var r=n(e,t);if(gr.hasOwnProperty(t.name)){var i=gr[t.name];for(var a in i)i.hasOwnProperty(a)&&(r.hasOwnProperty(a)&&(r["_"+a]=r[a]),r[a]=i[a])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var gr={};function Kr(e,t){var n=gr.hasOwnProperty(e)?gr[e]:gr[e]={};ge(t,n)}function Vt(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function _n(e,t){for(var n;e.innerMode&&(n=e.innerMode(t),!(!n||n.mode==e));)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Gr(e,t,n){return e.startState?e.startState(t,n):!0}var at=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};at.prototype.eol=function(){return this.pos>=this.string.length},at.prototype.sol=function(){return this.pos==this.lineStart},at.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},at.prototype.next=function(){if(this.post},at.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},at.prototype.skipToEnd=function(){this.pos=this.string.length},at.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},at.prototype.backUp=function(e){this.pos-=e},at.prototype.column=function(){return this.lastColumnPos0?null:(a&&t!==!1&&(this.pos+=a[0].length),a)}},at.prototype.current=function(){return this.string.slice(this.start,this.pos)},at.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},at.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},at.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};function Ae(e,t){if(t-=e.first,t<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],a=i.chunkSize();if(t=e.first&&tn?ne(n,Ae(e,n).text.length):Sc(t,Ae(e,t.line).text.length)}function Sc(e,t){var n=e.ch;return n==null||n>t?ne(e.line,t):n<0?ne(e.line,0):e}function ca(e,t){for(var n=[],r=0;rthis.maxLookAhead&&(this.maxLookAhead=e),t},Jt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},Jt.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Jt.fromSaved=function(e,t,n){return t instanceof ri?new Jt(e,Vt(e.mode,t.state),n,t.lookAhead):new Jt(e,Vt(e.mode,t),n)},Jt.prototype.save=function(e){var t=e!==!1?Vt(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ri(t,this.maxLookAhead):t};function fa(e,t,n,r){var i=[e.state.modeGen],a={};va(e,t.text,e.doc.mode,n,function(m,A){return i.push(m,A)},a,r);for(var l=n.state,u=function(m){n.baseTokens=i;var A=e.state.overlays[m],P=1,J=0;n.state=!0,va(e,t.text,A.mode,n,function(Y,ie){for(var ue=P;JY&&i.splice(P,1,Y,i[P+1],me),P+=2,J=Math.min(Y,me)}if(ie)if(A.opaque)i.splice(ue,P-ue,Y,"overlay "+ie),P=ue+2;else for(;uee.options.maxHighlightLength&&Vt(e.doc.mode,r.state),a=fa(e,t,r);i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=a.styles,a.classes?t.styleClasses=a.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function wn(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return new Jt(r,!0,t);var a=Tc(e,t,n),l=a>r.first&&Ae(r,a-1).stateAfter,u=l?Jt.fromSaved(r,l,a):new Jt(r,Gr(r.mode),a);return r.iter(a,t,function(f){ro(e,f.text,u);var m=u.line;f.stateAfter=m==t-1||m%5==0||m>=i.viewFrom&&mt.start)return a}throw new Error("Mode "+e.name+" failed to advance stream.")}var ha=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function ga(e,t,n,r){var i=e.doc,a=i.mode,l;t=Re(i,t);var u=Ae(i,t.line),f=wn(e,t.line,n),m=new at(u.text,e.options.tabSize,f),A;for(r&&(A=[]);(r||m.pose.options.maxHighlightLength?(u=!1,l&&ro(e,t,r,A.pos),A.pos=t.length,P=null):P=ma(no(n,A,r.state,J),a),J){var Y=J[0].name;Y&&(P="m-"+(P?Y+" "+P:Y))}if(!u||m!=P){for(;fl;--u){if(u<=a.first)return a.first;var f=Ae(a,u-1),m=f.stateAfter;if(m&&(!n||u+(m instanceof ri?m.lookAhead:0)<=a.modeFrontier))return u;var A=Oe(f.text,null,e.options.tabSize);(i==null||r>A)&&(i=u-1,r=A)}return i}function Lc(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontiern;r--){var i=Ae(e,r).stateAfter;if(i&&(!(i instanceof ri)||r+i.lookAhead=t:a.to>t);(r||(r=[])).push(new ni(l,a.from,f?null:a.to))}}return r}function Dc(e,t,n){var r;if(e)for(var i=0;i=t:a.to>t);if(u||a.from==t&&l.type=="bookmark"&&(!n||a.marker.insertLeft)){var f=a.from==null||(l.inclusiveLeft?a.from<=t:a.from0&&u)for(var Ce=0;Ce0)){var A=[f,1],P=ye(m.from,u.from),J=ye(m.to,u.to);(P<0||!l.inclusiveLeft&&!P)&&A.push({from:m.from,to:u.from}),(J>0||!l.inclusiveRight&&!J)&&A.push({from:u.to,to:m.to}),i.splice.apply(i,A),f+=A.length-3}}return i}function xa(e){var t=e.markedSpans;if(t){for(var n=0;nt)&&(!r||oo(r,a.marker)<0)&&(r=a.marker)}return r}function Sa(e,t,n,r,i){var a=Ae(e,t),l=or&&a.markedSpans;if(l)for(var u=0;u=0&&P<=0||A<=0&&P>=0)&&(A<=0&&(f.marker.inclusiveRight&&i.inclusiveLeft?ye(m.to,n)>=0:ye(m.to,n)>0)||A>=0&&(f.marker.inclusiveRight&&i.inclusiveLeft?ye(m.from,r)<=0:ye(m.from,r)<0)))return!0}}}function Zt(e){for(var t;t=wa(e);)e=t.find(-1,!0).line;return e}function Fc(e){for(var t;t=ai(e);)e=t.find(1,!0).line;return e}function Nc(e){for(var t,n;t=ai(e);)e=t.find(1,!0).line,(n||(n=[])).push(e);return n}function ao(e,t){var n=Ae(e,t),r=Zt(n);return n==r?t:k(r)}function Ta(e,t){if(t>e.lastLine())return t;var n=Ae(e,t),r;if(!mr(e,n))return t;for(;r=ai(n);)n=r.find(1,!0).line;return k(n)+1}function mr(e,t){var n=or&&t.markedSpans;if(n){for(var r=void 0,i=0;it.maxLineLength&&(t.maxLineLength=i,t.maxLine=r)})}var Xr=function(e,t,n){this.text=e,_a(this,t),this.height=n?n(this):1};Xr.prototype.lineNo=function(){return k(this)},Wt(Xr);function Oc(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),e.order!=null&&(e.order=null),xa(e),_a(e,n);var i=r?r(e):1;i!=e.height&&jt(e,i)}function Pc(e){e.parent=null,xa(e)}var jc={},Rc={};function La(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Rc:jc;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Ca(e,t){var n=K("span",null,null,g?"padding-right: .1px":null),r={pre:K("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var a=i?t.rest[i-1]:t.line,l=void 0;r.pos=0,r.addToken=Bc,pr(e.display.measure)&&(l=Pe(a,e.doc.direction))&&(r.addToken=Uc(r.addToken,l)),r.map=[];var u=t!=e.display.externalMeasured&&k(a);$c(a,r,da(e,a,u)),a.styleClasses&&(a.styleClasses.bgClass&&(r.bgClass=xe(a.styleClasses.bgClass,r.bgClass||"")),a.styleClasses.textClass&&(r.textClass=xe(a.styleClasses.textClass,r.textClass||""))),r.map.length==0&&r.map.push(0,0,r.content.appendChild(ei(e.display.measure))),i==0?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(g){var f=r.content.lastChild;(/\bcm-tab\b/.test(f.className)||f.querySelector&&f.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")}return it(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=xe(r.pre.className,r.textClass||"")),r}function Hc(e){var t=_("span","\u2022","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Bc(e,t,n,r,i,a,l){if(t){var u=e.splitSpaces?Wc(t,e.trailingSpace):t,f=e.cm.state.specialChars,m=!1,A;if(!f.test(t))e.col+=t.length,A=document.createTextNode(u),e.map.push(e.pos,e.pos+t.length,A),s&&h<9&&(m=!0),e.pos+=t.length;else{A=document.createDocumentFragment();for(var P=0;;){f.lastIndex=P;var J=f.exec(t),Y=J?J.index-P:t.length-P;if(Y){var ie=document.createTextNode(u.slice(P,P+Y));s&&h<9?A.appendChild(_("span",[ie])):A.appendChild(ie),e.map.push(e.pos,e.pos+Y,ie),e.col+=Y,e.pos+=Y}if(!J)break;P+=Y+1;var ue=void 0;if(J[0]==" "){var me=e.cm.options.tabSize,ve=me-e.col%me;ue=A.appendChild(_("span",G(ve),"cm-tab")),ue.setAttribute("role","presentation"),ue.setAttribute("cm-text"," "),e.col+=ve}else J[0]=="\r"||J[0]==` -`?(ue=A.appendChild(_("span",J[0]=="\r"?"\u240D":"\u2424","cm-invalidchar")),ue.setAttribute("cm-text",J[0]),e.col+=1):(ue=e.cm.options.specialCharPlaceholder(J[0]),ue.setAttribute("cm-text",J[0]),s&&h<9?A.appendChild(_("span",[ue])):A.appendChild(ue),e.col+=1);e.map.push(e.pos,e.pos+1,ue),e.pos++}}if(e.trailingSpace=u.charCodeAt(t.length-1)==32,n||r||i||m||a||l){var _e=n||"";r&&(_e+=r),i&&(_e+=i);var be=_("span",[A],_e,a);if(l)for(var Ce in l)l.hasOwnProperty(Ce)&&Ce!="style"&&Ce!="class"&&be.setAttribute(Ce,l[Ce]);return e.content.appendChild(be)}e.content.appendChild(A)}}function Wc(e,t){if(e.length>1&&!/ /.test(e))return e;for(var n=t,r="",i=0;im&&P.from<=m));J++);if(P.to>=A)return e(n,r,i,a,l,u,f);e(n,r.slice(0,P.to-m),i,a,null,u,f),a=null,r=r.slice(P.to-m),m=P.to}}}function Ea(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function $c(e,t,n){var r=e.markedSpans,i=e.text,a=0;if(!r){for(var l=1;lf||$e.collapsed&&Ie.to==f&&Ie.from==f)){if(Ie.to!=null&&Ie.to!=f&&Y>Ie.to&&(Y=Ie.to,ue=""),$e.className&&(ie+=" "+$e.className),$e.css&&(J=(J?J+";":"")+$e.css),$e.startStyle&&Ie.from==f&&(me+=" "+$e.startStyle),$e.endStyle&&Ie.to==Y&&(Ce||(Ce=[])).push($e.endStyle,Ie.to),$e.title&&((_e||(_e={})).title=$e.title),$e.attributes)for(var Ve in $e.attributes)(_e||(_e={}))[Ve]=$e.attributes[Ve];$e.collapsed&&(!ve||oo(ve.marker,$e)<0)&&(ve=Ie)}else Ie.from>f&&Y>Ie.from&&(Y=Ie.from)}if(Ce)for(var vt=0;vt=u)break;for(var Ot=Math.min(u,Y);;){if(A){var At=f+A.length;if(!ve){var ut=At>Ot?A.slice(0,Ot-f):A;t.addToken(t,ut,P?P+ie:ie,me,f+ut.length==Y?ue:"",J,_e)}if(At>=Ot){A=A.slice(Ot-f),f=Ot;break}f=At,me=""}A=i.slice(a,a=n[m++]),P=La(n[m++],t.cm.options)}}}function za(e,t,n){this.line=t,this.rest=Nc(t),this.size=this.rest?k(ce(this.rest))-n+1:1,this.node=this.text=null,this.hidden=mr(e,t)}function si(e,t,n){for(var r=[],i,a=t;a2&&a.push((f.bottom+m.top)/2-n.top)}}a.push(n.bottom-n.top)}}function Na(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};if(e.rest){for(var r=0;rn)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}}function rf(e,t){t=Zt(t);var n=k(t),r=e.display.externalMeasured=new za(e.doc,t,n);r.lineN=n;var i=r.built=Ca(e,r);return r.text=i.pre,V(e.display.lineMeasure,i.pre),r}function Oa(e,t,n,r){return tr(e,Qr(e,t),n,r)}function po(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&tt)&&(a=f-u,i=a-1,t>=f&&(l="right")),i!=null){if(r=e[m+2],u==f&&n==(r.insertLeft?"left":"right")&&(l=n),n=="left"&&i==0)for(;m&&e[m-2]==e[m-3]&&e[m-1].insertLeft;)r=e[(m-=3)+2],l="left";if(n=="right"&&i==f-u)for(;m=0&&(n=e[i]).left==n.right;i--);return n}function of(e,t,n,r){var i=ja(t.map,n,r),a=i.node,l=i.start,u=i.end,f=i.collapse,m;if(a.nodeType==3){for(var A=0;A<4;A++){for(;l&&W(t.line.text.charAt(i.coverStart+l));)--l;for(;i.coverStart+u0&&(f=r="right");var P;e.options.lineWrapping&&(P=a.getClientRects()).length>1?m=P[r=="right"?P.length-1:0]:m=a.getBoundingClientRect()}if(s&&h<9&&!l&&(!m||!m.left&&!m.right)){var J=a.parentNode.getClientRects()[0];J?m={left:J.left,right:J.left+Jr(e.display),top:J.top,bottom:J.bottom}:m=Pa}for(var Y=m.top-t.rect.top,ie=m.bottom-t.rect.top,ue=(Y+ie)/2,me=t.view.measure.heights,ve=0;ve=r.text.length?(f=r.text.length,m="before"):f<=0&&(f=0,m="after"),!u)return l(m=="before"?f-1:f,m=="before");function A(ie,ue,me){var ve=u[ue],_e=ve.level==1;return l(me?ie-1:ie,_e!=me)}var P=Pt(u,f,m),J=dt,Y=A(f,P,m=="before");return J!=null&&(Y.other=A(f,J,m!="before")),Y}function $a(e,t){var n=0;t=Re(e.doc,t),e.options.lineWrapping||(n=Jr(e.display)*t.ch);var r=Ae(e.doc,t.line),i=ar(r)+ui(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function go(e,t,n,r,i){var a=ne(e,t,n);return a.xRel=i,r&&(a.outside=r),a}function mo(e,t,n){var r=e.doc;if(n+=e.display.viewOffset,n<0)return go(r.first,0,null,-1,-1);var i=O(r,n),a=r.first+r.size-1;if(i>a)return go(r.first+r.size-1,Ae(r,a).text.length,null,1,1);t<0&&(t=0);for(var l=Ae(r,i);;){var u=lf(e,l,i,t,n),f=Ic(l,u.ch+(u.xRel>0||u.outside>0?1:0));if(!f)return u;var m=f.find(1);if(m.line==i)return m;l=Ae(r,i=m.line)}}function Ka(e,t,n,r){r-=ho(t);var i=t.text.length,a=De(function(l){return tr(e,n,l-1).bottom<=r},i,0);return i=De(function(l){return tr(e,n,l).top>r},a,i),{begin:a,end:i}}function Ga(e,t,n,r){n||(n=Qr(e,t));var i=ci(e,t,tr(e,n,r),"line").top;return Ka(e,t,n,i)}function vo(e,t,n,r){return e.bottom<=n?!1:e.top>n?!0:(r?e.left:e.right)>t}function lf(e,t,n,r,i){i-=ar(t);var a=Qr(e,t),l=ho(t),u=0,f=t.text.length,m=!0,A=Pe(t,e.doc.direction);if(A){var P=(e.options.lineWrapping?uf:sf)(e,t,n,a,A,r,i);m=P.level!=1,u=m?P.from:P.to-1,f=m?P.to:P.from-1}var J=null,Y=null,ie=De(function(Ne){var Ie=tr(e,a,Ne);return Ie.top+=l,Ie.bottom+=l,vo(Ie,r,i,!1)?(Ie.top<=i&&Ie.left<=r&&(J=Ne,Y=Ie),!0):!1},u,f),ue,me,ve=!1;if(Y){var _e=r-Y.left=Ce.bottom?1:0}return ie=se(t.text,ie,1),go(n,ie,me,ve,r-ue)}function sf(e,t,n,r,i,a,l){var u=De(function(P){var J=i[P],Y=J.level!=1;return vo(Xt(e,ne(n,Y?J.to:J.from,Y?"before":"after"),"line",t,r),a,l,!0)},0,i.length-1),f=i[u];if(u>0){var m=f.level!=1,A=Xt(e,ne(n,m?f.from:f.to,m?"after":"before"),"line",t,r);vo(A,a,l,!0)&&A.top>l&&(f=i[u-1])}return f}function uf(e,t,n,r,i,a,l){var u=Ka(e,t,r,l),f=u.begin,m=u.end;/\s/.test(t.text.charAt(m-1))&&m--;for(var A=null,P=null,J=0;J=m||Y.to<=f)){var ie=Y.level!=1,ue=tr(e,r,ie?Math.min(m,Y.to)-1:Math.max(f,Y.from)).right,me=ueme)&&(A=Y,P=me)}}return A||(A=i[i.length-1]),A.fromm&&(A={from:A.from,to:m,level:A.level}),A}var zr;function Vr(e){if(e.cachedTextHeight!=null)return e.cachedTextHeight;if(zr==null){zr=_("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)zr.appendChild(document.createTextNode("x")),zr.appendChild(_("br"));zr.appendChild(document.createTextNode("x"))}V(e.measure,zr);var n=zr.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),j(e.measure),n||1}function Jr(e){if(e.cachedCharWidth!=null)return e.cachedCharWidth;var t=_("span","xxxxxxxxxx"),n=_("pre",[t],"CodeMirror-line-like");V(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function bo(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,a=t.gutters.firstChild,l=0;a;a=a.nextSibling,++l){var u=e.display.gutterSpecs[l].className;n[u]=a.offsetLeft+a.clientLeft+i,r[u]=a.clientWidth}return{fixedPos:yo(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function yo(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function Za(e){var t=Vr(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/Jr(e.display)-3);return function(i){if(mr(e.doc,i))return 0;var a=0;if(i.widgets)for(var l=0;l0&&(m=Ae(e.doc,f.line).text).length==f.ch){var A=Oe(m,m.length,e.options.tabSize)-m.length;f=ne(f.line,Math.max(0,Math.round((a-Fa(e.display).left)/Jr(e.display))-A))}return f}function Ar(e,t){if(t>=e.display.viewTo||(t-=e.display.viewFrom,t<0))return null;for(var n=e.display.view,r=0;rt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)or&&ao(e.doc,t)i.viewFrom?br(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)br(e);else if(t<=i.viewFrom){var a=di(e,n,n+r,1);a?(i.view=i.view.slice(a.index),i.viewFrom=a.lineN,i.viewTo+=r):br(e)}else if(n>=i.viewTo){var l=di(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):br(e)}else{var u=di(e,t,t,-1),f=di(e,n,n+r,1);u&&f?(i.view=i.view.slice(0,u.index).concat(si(e,u.lineN,f.lineN)).concat(i.view.slice(f.index)),i.viewTo+=r):br(e)}var m=i.externalMeasured;m&&(n=i.lineN&&t=r.viewTo)){var a=r.view[Ar(e,t)];if(a.node!=null){var l=a.changes||(a.changes=[]);Se(l,n)==-1&&l.push(n)}}}function br(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function di(e,t,n,r){var i=Ar(e,t),a,l=e.display.view;if(!or||n==e.doc.first+e.doc.size)return{index:i,lineN:n};for(var u=e.display.viewFrom,f=0;f0){if(i==l.length-1)return null;a=u+l[i].size-t,i++}else a=u-t;t+=a,n+=a}for(;ao(e.doc,n)!=n;){if(i==(r<0?0:l.length-1))return null;n+=r*l[i-(r<0?1:0)].size,i+=r}return{index:i,lineN:n}}function cf(e,t,n){var r=e.display,i=r.view;i.length==0||t>=r.viewTo||n<=r.viewFrom?(r.view=si(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=si(e,t,r.viewFrom).concat(r.view):r.viewFromn&&(r.view=r.view.slice(0,Ar(e,n)))),r.viewTo=n}function Xa(e){for(var t=e.display.view,n=0,r=0;r=e.display.viewTo||f.to().line0?l:e.defaultCharWidth())+"px"}if(r.other){var u=n.appendChild(_("div","\xA0","CodeMirror-cursor CodeMirror-secondarycursor"));u.style.display="",u.style.left=r.other.left+"px",u.style.top=r.other.top+"px",u.style.height=(r.other.bottom-r.other.top)*.85+"px"}}function pi(e,t){return e.top-t.top||e.left-t.left}function ff(e,t,n){var r=e.display,i=e.doc,a=document.createDocumentFragment(),l=Fa(e.display),u=l.left,f=Math.max(r.sizerWidth,Er(e)-r.sizer.offsetLeft)-l.right,m=i.direction=="ltr";function A(be,Ce,Ne,Ie){Ce<0&&(Ce=0),Ce=Math.round(Ce),Ie=Math.round(Ie),a.appendChild(_("div",null,"CodeMirror-selected","position: absolute; left: "+be+`px; +`,t);i==-1&&(i=e.length);var a=e.slice(t,e.charAt(i-1)=="\r"?i-1:i),l=a.indexOf("\r");l!=-1?(n.push(a.slice(0,l)),t+=l+1):(n.push(a),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},hr=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch{return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch{}return!t||t.parentElement()!=e?!1:t.compareEndPoints("StartToEnd",t)!=0},ti=(function(){var e=y("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),typeof e.oncopy=="function")})(),$t=null;function to(e){if($t!=null)return $t;var t=V(e,y("span","x")),n=t.getBoundingClientRect(),r=X(t,0,1).getBoundingClientRect();return $t=Math.abs(n.left-r.left)>1}var Wr={},Kt={};function Gt(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Wr[e]=t}function Cr(e,t){Kt[e]=t}function Ur(e){if(typeof e=="string"&&Kt.hasOwnProperty(e))e=Kt[e];else if(e&&typeof e.name=="string"&&Kt.hasOwnProperty(e.name)){var t=Kt[e.name];typeof t=="string"&&(t={name:t}),e=oe(t,e),e.name=t.name}else{if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ur("application/xml");if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ur("application/json")}return typeof e=="string"?{name:e}:e||{name:"null"}}function $r(e,t){t=Ur(t);var n=Wr[t.name];if(!n)return $r(e,"text/plain");var r=n(e,t);if(gr.hasOwnProperty(t.name)){var i=gr[t.name];for(var a in i)i.hasOwnProperty(a)&&(r.hasOwnProperty(a)&&(r["_"+a]=r[a]),r[a]=i[a])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var gr={};function Kr(e,t){var n=gr.hasOwnProperty(e)?gr[e]:gr[e]={};ge(t,n)}function Vt(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function _n(e,t){for(var n;e.innerMode&&(n=e.innerMode(t),!(!n||n.mode==e));)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Gr(e,t,n){return e.startState?e.startState(t,n):!0}var at=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};at.prototype.eol=function(){return this.pos>=this.string.length},at.prototype.sol=function(){return this.pos==this.lineStart},at.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},at.prototype.next=function(){if(this.post},at.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},at.prototype.skipToEnd=function(){this.pos=this.string.length},at.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},at.prototype.backUp=function(e){this.pos-=e},at.prototype.column=function(){return this.lastColumnPos0?null:(a&&t!==!1&&(this.pos+=a[0].length),a)}},at.prototype.current=function(){return this.string.slice(this.start,this.pos)},at.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},at.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},at.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};function Ae(e,t){if(t-=e.first,t<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],a=i.chunkSize();if(t=e.first&&tn?ne(n,Ae(e,n).text.length):Sc(t,Ae(e,t.line).text.length)}function Sc(e,t){var n=e.ch;return n==null||n>t?ne(e.line,t):n<0?ne(e.line,0):e}function ca(e,t){for(var n=[],r=0;rthis.maxLookAhead&&(this.maxLookAhead=e),t},Jt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},Jt.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Jt.fromSaved=function(e,t,n){return t instanceof ri?new Jt(e,Vt(e.mode,t.state),n,t.lookAhead):new Jt(e,Vt(e.mode,t),n)},Jt.prototype.save=function(e){var t=e!==!1?Vt(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ri(t,this.maxLookAhead):t};function fa(e,t,n,r){var i=[e.state.modeGen],a={};va(e,t.text,e.doc.mode,n,function(m,A){return i.push(m,A)},a,r);for(var l=n.state,u=function(m){n.baseTokens=i;var A=e.state.overlays[m],B=1,ee=0;n.state=!0,va(e,t.text,A.mode,n,function(Y,ie){for(var ue=B;eeY&&i.splice(B,1,Y,i[B+1],me),B+=2,ee=Math.min(Y,me)}if(ie)if(A.opaque)i.splice(ue,B-ue,Y,"overlay "+ie),B=ue+2;else for(;uee.options.maxHighlightLength&&Vt(e.doc.mode,r.state),a=fa(e,t,r);i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=a.styles,a.classes?t.styleClasses=a.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function wn(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return new Jt(r,!0,t);var a=Tc(e,t,n),l=a>r.first&&Ae(r,a-1).stateAfter,u=l?Jt.fromSaved(r,l,a):new Jt(r,Gr(r.mode),a);return r.iter(a,t,function(f){ro(e,f.text,u);var m=u.line;f.stateAfter=m==t-1||m%5==0||m>=i.viewFrom&&mt.start)return a}throw new Error("Mode "+e.name+" failed to advance stream.")}var ha=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function ga(e,t,n,r){var i=e.doc,a=i.mode,l;t=je(i,t);var u=Ae(i,t.line),f=wn(e,t.line,n),m=new at(u.text,e.options.tabSize,f),A;for(r&&(A=[]);(r||m.pose.options.maxHighlightLength?(u=!1,l&&ro(e,t,r,A.pos),A.pos=t.length,B=null):B=ma(no(n,A,r.state,ee),a),ee){var Y=ee[0].name;Y&&(B="m-"+(B?Y+" "+B:Y))}if(!u||m!=B){for(;fl;--u){if(u<=a.first)return a.first;var f=Ae(a,u-1),m=f.stateAfter;if(m&&(!n||u+(m instanceof ri?m.lookAhead:0)<=a.modeFrontier))return u;var A=Oe(f.text,null,e.options.tabSize);(i==null||r>A)&&(i=u-1,r=A)}return i}function Lc(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontiern;r--){var i=Ae(e,r).stateAfter;if(i&&(!(i instanceof ri)||r+i.lookAhead=t:a.to>t);(r||(r=[])).push(new ni(l,a.from,f?null:a.to))}}return r}function Dc(e,t,n){var r;if(e)for(var i=0;i=t:a.to>t);if(u||a.from==t&&l.type=="bookmark"&&(!n||a.marker.insertLeft)){var f=a.from==null||(l.inclusiveLeft?a.from<=t:a.from0&&u)for(var Ce=0;Ce0)){var A=[f,1],B=ye(m.from,u.from),ee=ye(m.to,u.to);(B<0||!l.inclusiveLeft&&!B)&&A.push({from:m.from,to:u.from}),(ee>0||!l.inclusiveRight&&!ee)&&A.push({from:u.to,to:m.to}),i.splice.apply(i,A),f+=A.length-3}}return i}function xa(e){var t=e.markedSpans;if(t){for(var n=0;nt)&&(!r||oo(r,a.marker)<0)&&(r=a.marker)}return r}function Sa(e,t,n,r,i){var a=Ae(e,t),l=or&&a.markedSpans;if(l)for(var u=0;u=0&&B<=0||A<=0&&B>=0)&&(A<=0&&(f.marker.inclusiveRight&&i.inclusiveLeft?ye(m.to,n)>=0:ye(m.to,n)>0)||A>=0&&(f.marker.inclusiveRight&&i.inclusiveLeft?ye(m.from,r)<=0:ye(m.from,r)<0)))return!0}}}function Zt(e){for(var t;t=wa(e);)e=t.find(-1,!0).line;return e}function Ic(e){for(var t;t=ai(e);)e=t.find(1,!0).line;return e}function Nc(e){for(var t,n;t=ai(e);)e=t.find(1,!0).line,(n||(n=[])).push(e);return n}function ao(e,t){var n=Ae(e,t),r=Zt(n);return n==r?t:x(r)}function Ta(e,t){if(t>e.lastLine())return t;var n=Ae(e,t),r;if(!mr(e,n))return t;for(;r=ai(n);)n=r.find(1,!0).line;return x(n)+1}function mr(e,t){var n=or&&t.markedSpans;if(n){for(var r=void 0,i=0;it.maxLineLength&&(t.maxLineLength=i,t.maxLine=r)})}var Xr=function(e,t,n){this.text=e,_a(this,t),this.height=n?n(this):1};Xr.prototype.lineNo=function(){return x(this)},Wt(Xr);function Oc(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),e.order!=null&&(e.order=null),xa(e),_a(e,n);var i=r?r(e):1;i!=e.height&&Bt(e,i)}function Pc(e){e.parent=null,xa(e)}var Bc={},jc={};function La(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?jc:Bc;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Ca(e,t){var n=K("span",null,null,g?"padding-right: .1px":null),r={pre:K("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var a=i?t.rest[i-1]:t.line,l=void 0;r.pos=0,r.addToken=Hc,pr(e.display.measure)&&(l=Pe(a,e.doc.direction))&&(r.addToken=Uc(r.addToken,l)),r.map=[];var u=t!=e.display.externalMeasured&&x(a);$c(a,r,da(e,a,u)),a.styleClasses&&(a.styleClasses.bgClass&&(r.bgClass=xe(a.styleClasses.bgClass,r.bgClass||"")),a.styleClasses.textClass&&(r.textClass=xe(a.styleClasses.textClass,r.textClass||""))),r.map.length==0&&r.map.push(0,0,r.content.appendChild(ei(e.display.measure))),i==0?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(g){var f=r.content.lastChild;(/\bcm-tab\b/.test(f.className)||f.querySelector&&f.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")}return it(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=xe(r.pre.className,r.textClass||"")),r}function Rc(e){var t=y("span","\u2022","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Hc(e,t,n,r,i,a,l){if(t){var u=e.splitSpaces?Wc(t,e.trailingSpace):t,f=e.cm.state.specialChars,m=!1,A;if(!f.test(t))e.col+=t.length,A=document.createTextNode(u),e.map.push(e.pos,e.pos+t.length,A),s&&h<9&&(m=!0),e.pos+=t.length;else{A=document.createDocumentFragment();for(var B=0;;){f.lastIndex=B;var ee=f.exec(t),Y=ee?ee.index-B:t.length-B;if(Y){var ie=document.createTextNode(u.slice(B,B+Y));s&&h<9?A.appendChild(y("span",[ie])):A.appendChild(ie),e.map.push(e.pos,e.pos+Y,ie),e.col+=Y,e.pos+=Y}if(!ee)break;B+=Y+1;var ue=void 0;if(ee[0]==" "){var me=e.cm.options.tabSize,ve=me-e.col%me;ue=A.appendChild(y("span",Z(ve),"cm-tab")),ue.setAttribute("role","presentation"),ue.setAttribute("cm-text"," "),e.col+=ve}else ee[0]=="\r"||ee[0]==` +`?(ue=A.appendChild(y("span",ee[0]=="\r"?"\u240D":"\u2424","cm-invalidchar")),ue.setAttribute("cm-text",ee[0]),e.col+=1):(ue=e.cm.options.specialCharPlaceholder(ee[0]),ue.setAttribute("cm-text",ee[0]),s&&h<9?A.appendChild(y("span",[ue])):A.appendChild(ue),e.col+=1);e.map.push(e.pos,e.pos+1,ue),e.pos++}}if(e.trailingSpace=u.charCodeAt(t.length-1)==32,n||r||i||m||a||l){var _e=n||"";r&&(_e+=r),i&&(_e+=i);var be=y("span",[A],_e,a);if(l)for(var Ce in l)l.hasOwnProperty(Ce)&&Ce!="style"&&Ce!="class"&&be.setAttribute(Ce,l[Ce]);return e.content.appendChild(be)}e.content.appendChild(A)}}function Wc(e,t){if(e.length>1&&!/ /.test(e))return e;for(var n=t,r="",i=0;im&&B.from<=m));ee++);if(B.to>=A)return e(n,r,i,a,l,u,f);e(n,r.slice(0,B.to-m),i,a,null,u,f),a=null,r=r.slice(B.to-m),m=B.to}}}function Ea(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function $c(e,t,n){var r=e.markedSpans,i=e.text,a=0;if(!r){for(var l=1;lf||$e.collapsed&&Fe.to==f&&Fe.from==f)){if(Fe.to!=null&&Fe.to!=f&&Y>Fe.to&&(Y=Fe.to,ue=""),$e.className&&(ie+=" "+$e.className),$e.css&&(ee=(ee?ee+";":"")+$e.css),$e.startStyle&&Fe.from==f&&(me+=" "+$e.startStyle),$e.endStyle&&Fe.to==Y&&(Ce||(Ce=[])).push($e.endStyle,Fe.to),$e.title&&((_e||(_e={})).title=$e.title),$e.attributes)for(var Ve in $e.attributes)(_e||(_e={}))[Ve]=$e.attributes[Ve];$e.collapsed&&(!ve||oo(ve.marker,$e)<0)&&(ve=Fe)}else Fe.from>f&&Y>Fe.from&&(Y=Fe.from)}if(Ce)for(var vt=0;vt=u)break;for(var Ot=Math.min(u,Y);;){if(A){var At=f+A.length;if(!ve){var ut=At>Ot?A.slice(0,Ot-f):A;t.addToken(t,ut,B?B+ie:ie,me,f+ut.length==Y?ue:"",ee,_e)}if(At>=Ot){A=A.slice(Ot-f),f=Ot;break}f=At,me=""}A=i.slice(a,a=n[m++]),B=La(n[m++],t.cm.options)}}}function za(e,t,n){this.line=t,this.rest=Nc(t),this.size=this.rest?x(ce(this.rest))-n+1:1,this.node=this.text=null,this.hidden=mr(e,t)}function si(e,t,n){for(var r=[],i,a=t;a2&&a.push((f.bottom+m.top)/2-n.top)}}a.push(n.bottom-n.top)}}function Na(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};if(e.rest){for(var r=0;rn)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}}function rf(e,t){t=Zt(t);var n=x(t),r=e.display.externalMeasured=new za(e.doc,t,n);r.lineN=n;var i=r.built=Ca(e,r);return r.text=i.pre,V(e.display.lineMeasure,i.pre),r}function Oa(e,t,n,r){return tr(e,Qr(e,t),n,r)}function po(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&tt)&&(a=f-u,i=a-1,t>=f&&(l="right")),i!=null){if(r=e[m+2],u==f&&n==(r.insertLeft?"left":"right")&&(l=n),n=="left"&&i==0)for(;m&&e[m-2]==e[m-3]&&e[m-1].insertLeft;)r=e[(m-=3)+2],l="left";if(n=="right"&&i==f-u)for(;m=0&&(n=e[i]).left==n.right;i--);return n}function of(e,t,n,r){var i=Ba(t.map,n,r),a=i.node,l=i.start,u=i.end,f=i.collapse,m;if(a.nodeType==3){for(var A=0;A<4;A++){for(;l&&H(t.line.text.charAt(i.coverStart+l));)--l;for(;i.coverStart+u0&&(f=r="right");var B;e.options.lineWrapping&&(B=a.getClientRects()).length>1?m=B[r=="right"?B.length-1:0]:m=a.getBoundingClientRect()}if(s&&h<9&&!l&&(!m||!m.left&&!m.right)){var ee=a.parentNode.getClientRects()[0];ee?m={left:ee.left,right:ee.left+Jr(e.display),top:ee.top,bottom:ee.bottom}:m=Pa}for(var Y=m.top-t.rect.top,ie=m.bottom-t.rect.top,ue=(Y+ie)/2,me=t.view.measure.heights,ve=0;ve=r.text.length?(f=r.text.length,m="before"):f<=0&&(f=0,m="after"),!u)return l(m=="before"?f-1:f,m=="before");function A(ie,ue,me){var ve=u[ue],_e=ve.level==1;return l(me?ie-1:ie,_e!=me)}var B=Pt(u,f,m),ee=dt,Y=A(f,B,m=="before");return ee!=null&&(Y.other=A(f,ee,m!="before")),Y}function $a(e,t){var n=0;t=je(e.doc,t),e.options.lineWrapping||(n=Jr(e.display)*t.ch);var r=Ae(e.doc,t.line),i=ar(r)+ui(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function go(e,t,n,r,i){var a=ne(e,t,n);return a.xRel=i,r&&(a.outside=r),a}function mo(e,t,n){var r=e.doc;if(n+=e.display.viewOffset,n<0)return go(r.first,0,null,-1,-1);var i=P(r,n),a=r.first+r.size-1;if(i>a)return go(r.first+r.size-1,Ae(r,a).text.length,null,1,1);t<0&&(t=0);for(var l=Ae(r,i);;){var u=lf(e,l,i,t,n),f=Fc(l,u.ch+(u.xRel>0||u.outside>0?1:0));if(!f)return u;var m=f.find(1);if(m.line==i)return m;l=Ae(r,i=m.line)}}function Ka(e,t,n,r){r-=ho(t);var i=t.text.length,a=De(function(l){return tr(e,n,l-1).bottom<=r},i,0);return i=De(function(l){return tr(e,n,l).top>r},a,i),{begin:a,end:i}}function Ga(e,t,n,r){n||(n=Qr(e,t));var i=ci(e,t,tr(e,n,r),"line").top;return Ka(e,t,n,i)}function vo(e,t,n,r){return e.bottom<=n?!1:e.top>n?!0:(r?e.left:e.right)>t}function lf(e,t,n,r,i){i-=ar(t);var a=Qr(e,t),l=ho(t),u=0,f=t.text.length,m=!0,A=Pe(t,e.doc.direction);if(A){var B=(e.options.lineWrapping?uf:sf)(e,t,n,a,A,r,i);m=B.level!=1,u=m?B.from:B.to-1,f=m?B.to:B.from-1}var ee=null,Y=null,ie=De(function(Ne){var Fe=tr(e,a,Ne);return Fe.top+=l,Fe.bottom+=l,vo(Fe,r,i,!1)?(Fe.top<=i&&Fe.left<=r&&(ee=Ne,Y=Fe),!0):!1},u,f),ue,me,ve=!1;if(Y){var _e=r-Y.left=Ce.bottom?1:0}return ie=se(t.text,ie,1),go(n,ie,me,ve,r-ue)}function sf(e,t,n,r,i,a,l){var u=De(function(B){var ee=i[B],Y=ee.level!=1;return vo(Xt(e,ne(n,Y?ee.to:ee.from,Y?"before":"after"),"line",t,r),a,l,!0)},0,i.length-1),f=i[u];if(u>0){var m=f.level!=1,A=Xt(e,ne(n,m?f.from:f.to,m?"after":"before"),"line",t,r);vo(A,a,l,!0)&&A.top>l&&(f=i[u-1])}return f}function uf(e,t,n,r,i,a,l){var u=Ka(e,t,r,l),f=u.begin,m=u.end;/\s/.test(t.text.charAt(m-1))&&m--;for(var A=null,B=null,ee=0;ee=m||Y.to<=f)){var ie=Y.level!=1,ue=tr(e,r,ie?Math.min(m,Y.to)-1:Math.max(f,Y.from)).right,me=ueme)&&(A=Y,B=me)}}return A||(A=i[i.length-1]),A.fromm&&(A={from:A.from,to:m,level:A.level}),A}var zr;function Vr(e){if(e.cachedTextHeight!=null)return e.cachedTextHeight;if(zr==null){zr=y("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)zr.appendChild(document.createTextNode("x")),zr.appendChild(y("br"));zr.appendChild(document.createTextNode("x"))}V(e.measure,zr);var n=zr.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),j(e.measure),n||1}function Jr(e){if(e.cachedCharWidth!=null)return e.cachedCharWidth;var t=y("span","xxxxxxxxxx"),n=y("pre",[t],"CodeMirror-line-like");V(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function bo(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,a=t.gutters.firstChild,l=0;a;a=a.nextSibling,++l){var u=e.display.gutterSpecs[l].className;n[u]=a.offsetLeft+a.clientLeft+i,r[u]=a.clientWidth}return{fixedPos:yo(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function yo(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function Za(e){var t=Vr(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/Jr(e.display)-3);return function(i){if(mr(e.doc,i))return 0;var a=0;if(i.widgets)for(var l=0;l0&&(m=Ae(e.doc,f.line).text).length==f.ch){var A=Oe(m,m.length,e.options.tabSize)-m.length;f=ne(f.line,Math.max(0,Math.round((a-Ia(e.display).left)/Jr(e.display))-A))}return f}function Ar(e,t){if(t>=e.display.viewTo||(t-=e.display.viewFrom,t<0))return null;for(var n=e.display.view,r=0;rt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)or&&ao(e.doc,t)i.viewFrom?br(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)br(e);else if(t<=i.viewFrom){var a=di(e,n,n+r,1);a?(i.view=i.view.slice(a.index),i.viewFrom=a.lineN,i.viewTo+=r):br(e)}else if(n>=i.viewTo){var l=di(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):br(e)}else{var u=di(e,t,t,-1),f=di(e,n,n+r,1);u&&f?(i.view=i.view.slice(0,u.index).concat(si(e,u.lineN,f.lineN)).concat(i.view.slice(f.index)),i.viewTo+=r):br(e)}var m=i.externalMeasured;m&&(n=i.lineN&&t=r.viewTo)){var a=r.view[Ar(e,t)];if(a.node!=null){var l=a.changes||(a.changes=[]);Se(l,n)==-1&&l.push(n)}}}function br(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function di(e,t,n,r){var i=Ar(e,t),a,l=e.display.view;if(!or||n==e.doc.first+e.doc.size)return{index:i,lineN:n};for(var u=e.display.viewFrom,f=0;f0){if(i==l.length-1)return null;a=u+l[i].size-t,i++}else a=u-t;t+=a,n+=a}for(;ao(e.doc,n)!=n;){if(i==(r<0?0:l.length-1))return null;n+=r*l[i-(r<0?1:0)].size,i+=r}return{index:i,lineN:n}}function cf(e,t,n){var r=e.display,i=r.view;i.length==0||t>=r.viewTo||n<=r.viewFrom?(r.view=si(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=si(e,t,r.viewFrom).concat(r.view):r.viewFromn&&(r.view=r.view.slice(0,Ar(e,n)))),r.viewTo=n}function Xa(e){for(var t=e.display.view,n=0,r=0;r=e.display.viewTo||f.to().line0?l:e.defaultCharWidth())+"px"}if(r.other){var u=n.appendChild(y("div","\xA0","CodeMirror-cursor CodeMirror-secondarycursor"));u.style.display="",u.style.left=r.other.left+"px",u.style.top=r.other.top+"px",u.style.height=(r.other.bottom-r.other.top)*.85+"px"}}function pi(e,t){return e.top-t.top||e.left-t.left}function ff(e,t,n){var r=e.display,i=e.doc,a=document.createDocumentFragment(),l=Ia(e.display),u=l.left,f=Math.max(r.sizerWidth,Er(e)-r.sizer.offsetLeft)-l.right,m=i.direction=="ltr";function A(be,Ce,Ne,Fe){Ce<0&&(Ce=0),Ce=Math.round(Ce),Fe=Math.round(Fe),a.appendChild(y("div",null,"CodeMirror-selected","position: absolute; left: "+be+`px; top: `+Ce+"px; width: "+(Ne??f-be)+`px; - height: `+(Ie-Ce)+"px"))}function P(be,Ce,Ne){var Ie=Ae(i,be),$e=Ie.text.length,Ve,vt;function rt(ut,Dt){return fi(e,ne(be,ut),"div",Ie,Dt)}function Ot(ut,Dt,yt){var ft=Ga(e,Ie,null,ut),ct=Dt=="ltr"==(yt=="after")?"left":"right",lt=yt=="after"?ft.begin:ft.end-(/\s/.test(Ie.text.charAt(ft.end-1))?2:1);return rt(lt,ct)[ct]}var At=Pe(Ie,i.direction);return nt(At,Ce||0,Ne??$e,function(ut,Dt,yt,ft){var ct=yt=="ltr",lt=rt(ut,ct?"left":"right"),qt=rt(Dt-1,ct?"right":"left"),pn=Ce==null&&ut==0,Sr=Ne==null&&Dt==$e,St=ft==0,rr=!At||ft==At.length-1;if(qt.top-lt.top<=3){var bt=(m?pn:Sr)&&St,Zo=(m?Sr:pn)&&rr,cr=bt?u:(ct?lt:qt).left,Nr=Zo?f:(ct?qt:lt).right;A(cr,lt.top,Nr-cr,lt.bottom)}else{var Or,Lt,hn,Xo;ct?(Or=m&&pn&&St?u:lt.left,Lt=m?f:Ot(ut,yt,"before"),hn=m?u:Ot(Dt,yt,"after"),Xo=m&&Sr&&rr?f:qt.right):(Or=m?Ot(ut,yt,"before"):u,Lt=!m&&pn&&St?f:lt.right,hn=!m&&Sr&&rr?u:qt.left,Xo=m?Ot(Dt,yt,"after"):f),A(Or,lt.top,Lt-Or,lt.bottom),lt.bottom0?t.blinker=setInterval(function(){e.hasFocus()||en(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Qa(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||So(e))}function wo(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&en(e))},100)}function So(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),e.options.readOnly!="nocursor"&&(e.state.focused||(it(e,"focus",e,t),e.state.focused=!0,le(e.display.wrapper,"CodeMirror-focused"),!e.curOp&&e.display.selForContextMenu!=e.doc.sel&&(e.display.input.reset(),g&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),ko(e))}function en(e,t){e.state.delayingBlurEvent||(e.state.focused&&(it(e,"blur",e,t),e.state.focused=!1,Q(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function hi(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=Math.max(0,t.scroller.getBoundingClientRect().top),i=t.lineDiv.getBoundingClientRect().top,a=0,l=0;l.005||Y<-.005)&&(ie.display.sizerWidth){var ue=Math.ceil(A/Jr(e.display));ue>e.display.maxLineLength&&(e.display.maxLineLength=ue,e.display.maxLine=u.line,e.display.maxLineChanged=!0)}}}Math.abs(a)>2&&(t.scroller.scrollTop+=a)}function Va(e){if(e.widgets)for(var t=0;t=l&&(a=O(t,ar(Ae(t,f))-e.wrapper.clientHeight),l=f)}return{from:a,to:Math.max(l,a+1)}}function df(e,t){if(!ot(e,"scrollCursorIntoView")){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null,a=n.wrapper.ownerDocument;if(t.top+r.top<0?i=!0:t.bottom+r.top>(a.defaultView.innerHeight||a.documentElement.clientHeight)&&(i=!1),i!=null&&!z){var l=_("div","\u200B",null,`position: absolute; + height: `+(Fe-Ce)+"px"))}function B(be,Ce,Ne){var Fe=Ae(i,be),$e=Fe.text.length,Ve,vt;function rt(ut,Dt){return fi(e,ne(be,ut),"div",Fe,Dt)}function Ot(ut,Dt,yt){var ft=Ga(e,Fe,null,ut),ct=Dt=="ltr"==(yt=="after")?"left":"right",lt=yt=="after"?ft.begin:ft.end-(/\s/.test(Fe.text.charAt(ft.end-1))?2:1);return rt(lt,ct)[ct]}var At=Pe(Fe,i.direction);return nt(At,Ce||0,Ne??$e,function(ut,Dt,yt,ft){var ct=yt=="ltr",lt=rt(ut,ct?"left":"right"),qt=rt(Dt-1,ct?"right":"left"),pn=Ce==null&&ut==0,Sr=Ne==null&&Dt==$e,St=ft==0,rr=!At||ft==At.length-1;if(qt.top-lt.top<=3){var bt=(m?pn:Sr)&&St,Zo=(m?Sr:pn)&&rr,cr=bt?u:(ct?lt:qt).left,Nr=Zo?f:(ct?qt:lt).right;A(cr,lt.top,Nr-cr,lt.bottom)}else{var Or,Lt,hn,Xo;ct?(Or=m&&pn&&St?u:lt.left,Lt=m?f:Ot(ut,yt,"before"),hn=m?u:Ot(Dt,yt,"after"),Xo=m&&Sr&&rr?f:qt.right):(Or=m?Ot(ut,yt,"before"):u,Lt=!m&&pn&&St?f:lt.right,hn=!m&&Sr&&rr?u:qt.left,Xo=m?Ot(Dt,yt,"after"):f),A(Or,lt.top,Lt-Or,lt.bottom),lt.bottom0?t.blinker=setInterval(function(){e.hasFocus()||en(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Qa(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||So(e))}function wo(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&en(e))},100)}function So(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),e.options.readOnly!="nocursor"&&(e.state.focused||(it(e,"focus",e,t),e.state.focused=!0,le(e.display.wrapper,"CodeMirror-focused"),!e.curOp&&e.display.selForContextMenu!=e.doc.sel&&(e.display.input.reset(),g&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),ko(e))}function en(e,t){e.state.delayingBlurEvent||(e.state.focused&&(it(e,"blur",e,t),e.state.focused=!1,Q(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function hi(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=Math.max(0,t.scroller.getBoundingClientRect().top),i=t.lineDiv.getBoundingClientRect().top,a=0,l=0;l.005||Y<-.005)&&(ie.display.sizerWidth){var ue=Math.ceil(A/Jr(e.display));ue>e.display.maxLineLength&&(e.display.maxLineLength=ue,e.display.maxLine=u.line,e.display.maxLineChanged=!0)}}}Math.abs(a)>2&&(t.scroller.scrollTop+=a)}function Va(e){if(e.widgets)for(var t=0;t=l&&(a=P(t,ar(Ae(t,f))-e.wrapper.clientHeight),l=f)}return{from:a,to:Math.max(l,a+1)}}function df(e,t){if(!ot(e,"scrollCursorIntoView")){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null,a=n.wrapper.ownerDocument;if(t.top+r.top<0?i=!0:t.bottom+r.top>(a.defaultView.innerHeight||a.documentElement.clientHeight)&&(i=!1),i!=null&&!M){var l=y("div","\u200B",null,`position: absolute; top: `+(t.top-n.viewOffset-ui(e.display))+`px; height: `+(t.bottom-t.top+er(e)+n.barHeight)+`px; - left: `+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(l),l.scrollIntoView(i),e.display.lineSpace.removeChild(l)}}}function pf(e,t,n,r){r==null&&(r=0);var i;!e.options.lineWrapping&&t==n&&(n=t.sticky=="before"?ne(t.line,t.ch+1,"before"):t,t=t.ch?ne(t.line,t.sticky=="before"?t.ch-1:t.ch,"after"):t);for(var a=0;a<5;a++){var l=!1,u=Xt(e,t),f=!n||n==t?u:Xt(e,n);i={left:Math.min(u.left,f.left),top:Math.min(u.top,f.top)-r,right:Math.max(u.left,f.left),bottom:Math.max(u.bottom,f.bottom)+r};var m=To(e,i),A=e.doc.scrollTop,P=e.doc.scrollLeft;if(m.scrollTop!=null&&(An(e,m.scrollTop),Math.abs(e.doc.scrollTop-A)>1&&(l=!0)),m.scrollLeft!=null&&(Dr(e,m.scrollLeft),Math.abs(e.doc.scrollLeft-P)>1&&(l=!0)),!l)break}return i}function hf(e,t){var n=To(e,t);n.scrollTop!=null&&An(e,n.scrollTop),n.scrollLeft!=null&&Dr(e,n.scrollLeft)}function To(e,t){var n=e.display,r=Vr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&e.curOp.scrollTop!=null?e.curOp.scrollTop:n.scroller.scrollTop,a=fo(e),l={};t.bottom-t.top>a&&(t.bottom=t.top+a);var u=e.doc.height+co(n),f=t.topu-r;if(t.topi+a){var A=Math.min(t.top,(m?u:t.bottom)-a);A!=i&&(l.scrollTop=A)}var P=e.options.fixedGutter?0:n.gutters.offsetWidth,J=e.curOp&&e.curOp.scrollLeft!=null?e.curOp.scrollLeft:n.scroller.scrollLeft-P,Y=Er(e)-n.gutters.offsetWidth,ie=t.right-t.left>Y;return ie&&(t.right=t.left+Y),t.left<10?l.scrollLeft=0:t.leftY+J-3&&(l.scrollLeft=t.right+(ie?0:10)-Y),l}function Lo(e,t){t!=null&&(mi(e),e.curOp.scrollTop=(e.curOp.scrollTop==null?e.doc.scrollTop:e.curOp.scrollTop)+t)}function tn(e){mi(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Mn(e,t,n){(t!=null||n!=null)&&mi(e),t!=null&&(e.curOp.scrollLeft=t),n!=null&&(e.curOp.scrollTop=n)}function gf(e,t){mi(e),e.curOp.scrollToPos=t}function mi(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=$a(e,t.from),r=$a(e,t.to);Ja(e,n,r,t.margin)}}function Ja(e,t,n,r){var i=To(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Mn(e,i.scrollLeft,i.scrollTop)}function An(e,t){Math.abs(e.doc.scrollTop-t)<2||(v||Eo(e,{top:t}),el(e,t,!0),v&&Eo(e),In(e,100))}function el(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),!(e.display.scroller.scrollTop==t&&!n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Dr(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),!((n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r)&&(e.doc.scrollLeft=t,ol(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Dn(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+co(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+er(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}var qr=function(e,t,n){this.cm=n;var r=this.vert=_("div",[_("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=_("div",[_("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),Fe(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),Fe(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,s&&h<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};qr.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.scrollTop=0,this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var a=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+a)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(r==0&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},qr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},qr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},qr.prototype.zeroWidthHack=function(){var e=H&&!E?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.visibility=this.vert.style.visibility="hidden",this.disableHoriz=new qe,this.disableVert=new qe},qr.prototype.enableZeroWidthBar=function(e,t,n){e.style.visibility="";function r(){var i=e.getBoundingClientRect(),a=n=="vert"?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1);a!=e?e.style.visibility="hidden":t.set(1e3,r)}t.set(1e3,r)},qr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var qn=function(){};qn.prototype.update=function(){return{bottom:0,right:0}},qn.prototype.setScrollLeft=function(){},qn.prototype.setScrollTop=function(){},qn.prototype.clear=function(){};function rn(e,t){t||(t=Dn(e));var n=e.display.barWidth,r=e.display.barHeight;tl(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&hi(e),tl(e,Dn(e)),n=e.display.barWidth,r=e.display.barHeight}function tl(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}var rl={native:qr,null:qn};function nl(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&Q(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new rl[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Fe(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,n){n=="horizontal"?Dr(e,t):An(e,t)},e),e.display.scrollbars.addClass&&le(e.display.wrapper,e.display.scrollbars.addClass)}var mf=0;function Ir(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++mf,markArrays:null},Kc(e.curOp)}function Fr(e){var t=e.curOp;t&&Zc(t,function(n){for(var r=0;r=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new vi(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function yf(e){e.updatedDisplay=e.mustUpdate&&Co(e.cm,e.update)}function xf(e){var t=e.cm,n=t.display;e.updatedDisplay&&hi(t),e.barMeasure=Dn(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Oa(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+er(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Er(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function _f(e){var t=e.cm;e.adjustWidthTo!=null&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft=e.display.viewTo)){var n=+new Date+e.options.workTime,r=wn(e,t.highlightFrontier),i=[];t.iter(r.line,Math.min(t.first+t.size,e.display.viewTo+500),function(a){if(r.line>=e.display.viewFrom){var l=a.styles,u=a.text.length>e.options.maxHighlightLength?Vt(t.mode,r.state):null,f=fa(e,a,r,!0);u&&(r.state=u),a.styles=f.styles;var m=a.styleClasses,A=f.classes;A?a.styleClasses=A:m&&(a.styleClasses=null);for(var P=!l||l.length!=a.styles.length||m!=A&&(!m||!A||m.bgClass!=A.bgClass||m.textClass!=A.textClass),J=0;!P&&Jn)return In(e,e.options.workDelay),!0}),t.highlightFrontier=r.line,t.modeFrontier=Math.max(t.modeFrontier,r.line),i.length&&Nt(e,function(){for(var a=0;a=n.viewFrom&&t.visible.to<=n.viewTo&&(n.updateLineNumbers==null||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&Xa(e)==0)return!1;al(e)&&(br(e),t.dims=bo(e));var i=r.first+r.size,a=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFroml&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),or&&(a=ao(e.doc,a),l=Ta(e.doc,l));var u=a!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;cf(e,a,l),n.viewOffset=ar(Ae(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var f=Xa(e);if(!u&&f==0&&!t.force&&n.renderedView==n.view&&(n.updateLineNumbers==null||n.updateLineNumbers>=n.viewTo))return!1;var m=Tf(e);return f>4&&(n.lineDiv.style.display="none"),Cf(e,n.updateLineNumbers,t.dims),f>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,Lf(m),j(n.cursorDiv),j(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,u&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,In(e,400)),n.updateLineNumbers=null,!0}function il(e,t){for(var n=t.viewport,r=!0;;r=!1){if(!r||!e.options.lineWrapping||t.oldDisplayWidth==Er(e)){if(n&&n.top!=null&&(n={top:Math.min(e.doc.height+co(e.display)-fo(e),n.top)}),t.visible=gi(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break}else r&&(t.visible=gi(e.display,e.doc,n));if(!Co(e,t))break;hi(e);var i=Dn(e);zn(e),rn(e,i),Mo(e,i),t.force=!1}t.signal(e,"update",e),(e.display.viewFrom!=e.display.reportedViewFrom||e.display.viewTo!=e.display.reportedViewTo)&&(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function Eo(e,t){var n=new vi(e,t);if(Co(e,n)){hi(e),il(e,n);var r=Dn(e);zn(e),rn(e,r),Mo(e,r),n.finish()}}function Cf(e,t,n){var r=e.display,i=e.options.lineNumbers,a=r.lineDiv,l=a.firstChild;function u(ie){var ue=ie.nextSibling;return g&&H&&e.display.currentWheelTarget==ie?ie.style.display="none":ie.parentNode.removeChild(ie),ue}for(var f=r.view,m=r.viewFrom,A=0;A-1&&(Y=!1),Ma(e,P,m,n)),Y&&(j(P.lineNumber),P.lineNumber.appendChild(document.createTextNode(he(e.options,m)))),l=P.node.nextSibling}m+=P.size}for(;l;)l=u(l)}function zo(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px",ht(e,"gutterChanged",e)}function Mo(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+er(e)+"px"}function ol(e){var t=e.display,n=t.view;if(!(!t.alignWidgets&&(!t.gutters.firstChild||!e.options.fixedGutter))){for(var r=yo(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,a=r+"px",l=0;l=105&&(i.wrapper.style.clipPath="inset(0px)"),i.wrapper.setAttribute("translate","no"),s&&h<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),!g&&!(v&&M)&&(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,i.gutterSpecs=Ao(r.gutters,r.lineNumbers),ll(i),n.init(i)}var bi=0,sr=null;s?sr=-.53:v?sr=15:x?sr=-.7:w&&(sr=-1/3);function sl(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return t==null&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),n==null&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:n==null&&(n=e.wheelDelta),{x:t,y:n}}function zf(e){var t=sl(e);return t.x*=sr,t.y*=sr,t}function ul(e,t){x&&c==102&&(e.display.chromeScrollHack==null?e.display.sizer.style.pointerEvents="none":clearTimeout(e.display.chromeScrollHack),e.display.chromeScrollHack=setTimeout(function(){e.display.chromeScrollHack=null,e.display.sizer.style.pointerEvents=""},100));var n=sl(t),r=n.x,i=n.y,a=sr;t.deltaMode===0&&(r=t.deltaX,i=t.deltaY,a=1);var l=e.display,u=l.scroller,f=u.scrollWidth>u.clientWidth,m=u.scrollHeight>u.clientHeight;if(r&&f||i&&m){if(i&&H&&g){e:for(var A=t.target,P=l.view;A!=u;A=A.parentNode)for(var J=0;J=0&&ye(e,r.to())<=0)return n}return-1};var Ye=function(e,t){this.anchor=e,this.head=t};Ye.prototype.from=function(){return Zr(this.anchor,this.head)},Ye.prototype.to=function(){return Et(this.anchor,this.head)},Ye.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch};function Yt(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(J,Y){return ye(J.from(),Y.from())}),n=Se(t,i);for(var a=1;a0:f>=0){var m=Zr(u.from(),l.from()),A=Et(u.to(),l.to()),P=u.empty()?l.from()==l.head:u.from()==u.head;a<=n&&--n,t.splice(--a,2,new Ye(P?A:m,P?m:A))}}return new Rt(t,n)}function yr(e,t){return new Rt([new Ye(e,t||e)],0)}function xr(e){return e.text?ne(e.from.line+e.text.length-1,ce(e.text).length+(e.text.length==1?e.from.ch:0)):e.to}function cl(e,t){if(ye(e,t.from)<0)return e;if(ye(e,t.to)<=0)return xr(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=xr(t).ch-t.to.ch),ne(n,r)}function Do(e,t){for(var n=[],r=0;r1&&e.remove(u.line+1,ie-1),e.insert(u.line+1,ve)}ht(e,"change",e,t)}function _r(e,t,n){function r(i,a,l){if(i.linked)for(var u=0;u1&&!e.done[e.done.length-2].ranges)return e.done.pop(),ce(e.done)}function ml(e,t,n,r){var i=e.history;i.undone.length=0;var a=+new Date,l,u;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&(t.origin.charAt(0)=="+"&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||t.origin.charAt(0)=="*"))&&(l=Df(i,i.lastOp==r)))u=ce(l.changes),ye(t.from,t.to)==0&&ye(t.from,u.to)==0?u.to=xr(t):l.changes.push(Fo(e,t));else{var f=ce(i.done);for((!f||!f.ranges)&&xi(e.sel,i.done),l={changes:[Fo(e,t)],generation:i.generation},i.done.push(l);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,u||it(e,"historyAdded")}function qf(e,t,n,r){var i=t.charAt(0);return i=="*"||i=="+"&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function If(e,t,n,r){var i=e.history,a=r&&r.origin;n==i.lastSelOp||a&&i.lastSelOrigin==a&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==a||qf(e,a,ce(i.done),t))?i.done[i.done.length-1]=t:xi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=a,i.lastSelOp=n,r&&r.clearRedo!==!1&&gl(i.undone)}function xi(e,t){var n=ce(t);n&&n.ranges&&n.equals(e)||t.push(e)}function vl(e,t,n,r){var i=t["spans_"+e.id],a=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(l){l.markedSpans&&((i||(i=t["spans_"+e.id]={}))[a]=l.markedSpans),++a})}function Ff(e){if(!e)return null;for(var t,n=0;n-1&&(ce(u)[P]=m[P],delete m[P])}}return r}function No(e,t,n,r){if(r){var i=e.anchor;if(n){var a=ye(t,i)<0;a!=ye(n,i)<0?(i=t,t=n):a!=ye(t,n)<0&&(t=n)}return new Ye(i,t)}else return new Ye(n||t,t)}function _i(e,t,n,r,i){i==null&&(i=e.cm&&(e.cm.display.shift||e.extend)),wt(e,new Rt([No(e.sel.primary(),t,n,i)],0),r)}function yl(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),a=0;a=t.ch:u.to>t.ch))){if(i&&(it(f,"beforeCursorEnter"),f.explicitlyCleared))if(a.markedSpans){--l;continue}else break;if(!f.atomic)continue;if(n){var P=f.find(r<0?1:-1),J=void 0;if((r<0?A:m)&&(P=Tl(e,P,-r,P&&P.line==t.line?a:null)),P&&P.line==t.line&&(J=ye(P,n))&&(r<0?J<0:J>0))return on(e,P,t,r,i)}var Y=f.find(r<0?-1:1);return(r<0?m:A)&&(Y=Tl(e,Y,r,Y.line==t.line?a:null)),Y?on(e,Y,t,r,i):null}}return t}function wi(e,t,n,r,i){var a=r||1,l=on(e,t,n,a,i)||!i&&on(e,t,n,a,!0)||on(e,t,n,-a,i)||!i&&on(e,t,n,-a,!0);return l||(e.cantEdit=!0,ne(e.first,0))}function Tl(e,t,n,r){return n<0&&t.ch==0?t.line>e.first?Re(e,ne(t.line-1)):null:n>0&&t.ch==(r||Ae(e,t.line)).text.length?t.line=0;--i)El(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else El(e,t)}}function El(e,t){if(!(t.text.length==1&&t.text[0]==""&&ye(t.from,t.to)==0)){var n=Do(e,t);ml(e,t,n,e.cm?e.cm.curOp.id:NaN),On(e,t,n,io(e,t));var r=[];_r(e,function(i,a){!a&&Se(r,i.history)==-1&&(Dl(i.history,t),r.push(i.history)),On(i,t,null,io(i,t))})}}function Si(e,t,n){var r=e.cm&&e.cm.state.suppressEdits;if(!(r&&!n)){for(var i=e.history,a,l=e.sel,u=t=="undo"?i.done:i.undone,f=t=="undo"?i.undone:i.done,m=0;m=0;--Y){var ie=J(Y);if(ie)return ie.v}}}}function zl(e,t){if(t!=0&&(e.first+=t,e.sel=new Rt(Be(e.sel.ranges,function(i){return new Ye(ne(i.anchor.line+t,i.anchor.ch),ne(i.head.line+t,i.head.ch))}),e.sel.primIndex),e.cm)){zt(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;re.lastLine())){if(t.from.linea&&(t={from:t.from,to:ne(a,Ae(e,a).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ir(e,t.from,t.to),n||(n=Do(e,t)),e.cm?Pf(e.cm,t,r):Io(e,t,r),ki(e,n,ke),e.cantEdit&&wi(e,ne(e.firstLine(),0))&&(e.cantEdit=!1)}}function Pf(e,t,n){var r=e.doc,i=e.display,a=t.from,l=t.to,u=!1,f=a.line;e.options.lineWrapping||(f=k(Zt(Ae(r,a.line))),r.iter(f,l.line+1,function(Y){if(Y==i.maxLine)return u=!0,!0})),r.sel.contains(t.from,t.to)>-1&&Ht(e),Io(r,t,n,Za(e)),e.options.lineWrapping||(r.iter(f,a.line+t.text.length,function(Y){var ie=li(Y);ie>i.maxLineLength&&(i.maxLine=Y,i.maxLineLength=ie,i.maxLineChanged=!0,u=!1)}),u&&(e.curOp.updateMaxLine=!0)),Lc(r,a.line),In(e,400);var m=t.text.length-(l.line-a.line)-1;t.full?zt(e):a.line==l.line&&t.text.length==1&&!dl(e.doc,t)?vr(e,a.line,"text"):zt(e,a.line,l.line+1,m);var A=Ft(e,"changes"),P=Ft(e,"change");if(P||A){var J={from:a,to:l,text:t.text,removed:t.removed,origin:t.origin};P&&ht(e,"change",e,J),A&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(J)}e.display.selForContextMenu=null}function ln(e,t,n,r,i){var a;r||(r=n),ye(r,n)<0&&(a=[r,n],n=a[0],r=a[1]),typeof t=="string"&&(t=e.splitLines(t)),an(e,{from:n,to:r,text:t,origin:i})}function Ml(e,t,n,r){n1||!(this.children[0]instanceof jn))){var u=[];this.collapse(u),this.children=[new jn(u)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var l=i.lines.length%25+25,u=l;u10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;re.display.maxLineLength&&(e.display.maxLine=m,e.display.maxLineLength=A,e.display.maxLineChanged=!0)}r!=null&&e&&this.collapsed&&zt(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&wl(e.doc)),e&&ht(e,"markerCleared",e,this,r,i),t&&Fr(e),this.parent&&this.parent.clear()}},kr.prototype.find=function(e,t){e==null&&this.type=="bookmark"&&(e=1);for(var n,r,i=0;i0||l==0&&a.clearWhenEmpty!==!1)return a;if(a.replacedWith&&(a.collapsed=!0,a.widgetNode=K("span",[a.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||a.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(a.widgetNode.insertLeft=!0)),a.collapsed){if(Sa(e,t.line,t,n,a)||t.line!=n.line&&Sa(e,n.line,t,n,a))throw new Error("Inserting collapsed marker partially overlapping an existing one");Ec()}a.addToHistory&&ml(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var u=t.line,f=e.cm,m;if(e.iter(u,n.line+1,function(P){f&&a.collapsed&&!f.options.lineWrapping&&Zt(P)==f.display.maxLine&&(m=!0),a.collapsed&&u!=t.line&&jt(P,0),Mc(P,new ni(a,u==t.line?t.ch:null,u==n.line?n.ch:null),e.cm&&e.cm.curOp),++u}),a.collapsed&&e.iter(t.line,n.line+1,function(P){mr(e,P)&&jt(P,0)}),a.clearOnEnter&&Fe(a,"beforeCursorEnter",function(){return a.clear()}),a.readOnly&&(Cc(),(e.history.done.length||e.history.undone.length)&&e.clearHistory()),a.collapsed&&(a.id=++Il,a.atomic=!0),f){if(m&&(f.curOp.updateMaxLine=!0),a.collapsed)zt(f,t.line,n.line+1);else if(a.className||a.startStyle||a.endStyle||a.css||a.attributes||a.title)for(var A=t.line;A<=n.line;A++)vr(f,A,"text");a.atomic&&wl(f.doc),ht(f,"markerAdded",f,a)}return a}var Bn=function(e,t){this.markers=e,this.primary=t;for(var n=0;n=0;f--)an(this,r[f]);u?_l(this,u):this.cm&&tn(this.cm)}),undo:mt(function(){Si(this,"undo")}),redo:mt(function(){Si(this,"redo")}),undoSelection:mt(function(){Si(this,"undo",!0)}),redoSelection:mt(function(){Si(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=Re(this,e),t=Re(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,function(a){var l=a.markedSpans;if(l)for(var u=0;u=f.to||f.from==null&&i!=e.line||f.from!=null&&i==t.line&&f.from>=t.ch)&&(!n||n(f.marker))&&r.push(f.marker.parent||f.marker)}++i}),r},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;re)return t=e,!0;e-=a,++n}),Re(this,ne(n,t))},indexFromPos:function(e){e=Re(this,e);var t=e.ch;if(e.linet&&(t=e.from),e.to!=null&&e.to-1){t.state.draggingText(e),setTimeout(function(){return t.display.input.focus()},20);return}try{var A=e.dataTransfer.getData("Text");if(A){var P;if(t.state.draggingText&&!t.state.draggingText.copy&&(P=t.listSelections()),ki(t.doc,yr(n,n)),P)for(var J=0;J=0;u--)ln(e.doc,"",r[u].from,r[u].to,"+delete");tn(e)})}function Po(e,t,n){var r=se(e.text,t+n,n);return r<0||r>e.text.length?null:r}function jo(e,t,n){var r=Po(e,t.ch,n);return r==null?null:new ne(t.line,r,n<0?"after":"before")}function Ro(e,t,n,r,i){if(e){t.doc.direction=="rtl"&&(i=-i);var a=Pe(n,t.doc.direction);if(a){var l=i<0?ce(a):a[0],u=i<0==(l.level==1),f=u?"after":"before",m;if(l.level>0||t.doc.direction=="rtl"){var A=Qr(t,n);m=i<0?n.text.length-1:0;var P=tr(t,A,m).top;m=De(function(J){return tr(t,A,J).top==P},i<0==(l.level==1)?l.from:l.to-1,m),f=="before"&&(m=Po(n,m,1))}else m=i<0?l.to:l.from;return new ne(r,m,f)}}return new ne(r,i<0?n.text.length:0,i<0?"before":"after")}function Vf(e,t,n,r){var i=Pe(t,e.doc.direction);if(!i)return jo(t,n,r);n.ch>=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var a=Pt(i,n.ch,n.sticky),l=i[a];if(e.doc.direction=="ltr"&&l.level%2==0&&(r>0?l.to>n.ch:l.from=l.from&&J>=A.begin)){var Y=P?"before":"after";return new ne(n.line,J,Y)}}var ie=function(ve,_e,be){for(var Ce=function(Ve,vt){return vt?new ne(n.line,u(Ve,1),"before"):new ne(n.line,Ve,"after")};ve>=0&&ve0==(Ne.level!=1),$e=Ie?be.begin:u(be.end,-1);if(Ne.from<=$e&&$e0?A.end:u(A.begin,-1);return me!=null&&!(r>0&&me==t.text.length)&&(ue=ie(r>0?0:i.length-1,r,m(me)),ue)?ue:null}var $n={selectAll:Ll,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),ke)},killLine:function(e){return cn(e,function(t){if(t.empty()){var n=Ae(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)i=new ne(i.line,i.ch+1),e.replaceRange(a.charAt(i.ch-1)+a.charAt(i.ch-2),ne(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Ae(e.doc,i.line-1).text;l&&(i=new ne(i.line,1),e.replaceRange(a.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ne(i.line-1,l.length-1),i,"+transpose"))}}n.push(new Ye(i,i))}e.setSelections(n)})},newlineAndIndent:function(e){return Nt(e,function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var r=0;re&&ye(t,this.pos)==0&&n==this.button};var Gn,Zn;function od(e,t){var n=+new Date;return Zn&&Zn.compare(n,e,t)?(Gn=Zn=null,"triple"):Gn&&Gn.compare(n,e,t)?(Zn=new Bo(n,e,t),Gn=null,"double"):(Gn=new Bo(n,e,t),Zn=null,"single")}function Yl(e){var t=this,n=t.display;if(!(ot(t,e)||n.activeTouch&&n.input.supportsTouch())){if(n.input.ensurePolled(),n.shift=e.shiftKey,lr(n,e)){g||(n.scroller.draggable=!1,setTimeout(function(){return n.scroller.draggable=!0},100));return}if(!Wo(t,e)){var r=Mr(t,e),i=Ut(e),a=r?od(r,i):"single";pe(t).focus(),i==1&&t.state.selectingText&&t.state.selectingText(e),!(r&&ad(t,i,r,a,e))&&(i==1?r?sd(t,r,a,e):yn(e)==n.scroller&&kt(e):i==2?(r&&_i(t.doc,r),setTimeout(function(){return n.input.focus()},20)):i==3&&(F?t.display.input.onContextMenu(e):wo(t)))}}}function ad(e,t,n,r,i){var a="Click";return r=="double"?a="Double"+a:r=="triple"&&(a="Triple"+a),a=(t==1?"Left":t==2?"Middle":"Right")+a,Kn(e,Hl(a,i),i,function(l){if(typeof l=="string"&&(l=$n[l]),!l)return!1;var u=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),u=l(e,n)!=Ze}finally{e.state.suppressEdits=!1}return u})}function ld(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};if(i.unit==null){var a=Z?n.shiftKey&&n.metaKey:n.altKey;i.unit=a?"rectangle":t=="single"?"char":t=="double"?"word":"line"}return(i.extend==null||e.doc.extend)&&(i.extend=e.doc.extend||n.shiftKey),i.addNew==null&&(i.addNew=H?n.metaKey:n.ctrlKey),i.moveOnDrag==null&&(i.moveOnDrag=!(H?n.altKey:n.ctrlKey)),i}function sd(e,t,n,r){s?setTimeout(Ee(Qa,e),0):e.curOp.focus=B(de(e));var i=ld(e,n,r),a=e.doc.sel,l;e.options.dragDrop&&eo&&!e.isReadOnly()&&n=="single"&&(l=a.contains(t))>-1&&(ye((l=a.ranges[l]).from(),t)<0||t.xRel>0)&&(ye(l.to(),t)>0||t.xRel<0)?ud(e,r,t,i):cd(e,r,t,i)}function ud(e,t,n,r){var i=e.display,a=!1,l=gt(e,function(m){g&&(i.scroller.draggable=!1),e.state.draggingText=!1,e.state.delayingBlurEvent&&(e.hasFocus()?e.state.delayingBlurEvent=!1:wo(e)),_t(i.wrapper.ownerDocument,"mouseup",l),_t(i.wrapper.ownerDocument,"mousemove",u),_t(i.scroller,"dragstart",f),_t(i.scroller,"drop",l),a||(kt(m),r.addNew||_i(e.doc,n,null,null,r.extend),g&&!w||s&&h==9?setTimeout(function(){i.wrapper.ownerDocument.body.focus({preventScroll:!0}),i.input.focus()},20):i.input.focus())}),u=function(m){a=a||Math.abs(t.clientX-m.clientX)+Math.abs(t.clientY-m.clientY)>=10},f=function(){return a=!0};g&&(i.scroller.draggable=!0),e.state.draggingText=l,l.copy=!r.moveOnDrag,Fe(i.wrapper.ownerDocument,"mouseup",l),Fe(i.wrapper.ownerDocument,"mousemove",u),Fe(i.scroller,"dragstart",f),Fe(i.scroller,"drop",l),e.state.delayingBlurEvent=!0,setTimeout(function(){return i.input.focus()},20),i.scroller.dragDrop&&i.scroller.dragDrop()}function Ql(e,t,n){if(n=="char")return new Ye(t,t);if(n=="word")return e.findWordAt(t);if(n=="line")return new Ye(ne(t.line,0),Re(e.doc,ne(t.line+1,0)));var r=n(e,t);return new Ye(r.from,r.to)}function cd(e,t,n,r){s&&wo(e);var i=e.display,a=e.doc;kt(t);var l,u,f=a.sel,m=f.ranges;if(r.addNew&&!r.extend?(u=a.sel.contains(n),u>-1?l=m[u]:l=new Ye(n,n)):(l=a.sel.primary(),u=a.sel.primIndex),r.unit=="rectangle")r.addNew||(l=new Ye(n,n)),n=Mr(e,t,!0,!0),u=-1;else{var A=Ql(e,n,r.unit);r.extend?l=No(l,A.anchor,A.head,r.extend):l=A}r.addNew?u==-1?(u=m.length,wt(a,Yt(e,m.concat([l]),u),{scroll:!1,origin:"*mouse"})):m.length>1&&m[u].empty()&&r.unit=="char"&&!r.extend?(wt(a,Yt(e,m.slice(0,u).concat(m.slice(u+1)),0),{scroll:!1,origin:"*mouse"}),f=a.sel):Oo(a,u,l,Je):(u=0,wt(a,new Rt([l],0),Je),f=a.sel);var P=n;function J(be){if(ye(P,be)!=0)if(P=be,r.unit=="rectangle"){for(var Ce=[],Ne=e.options.tabSize,Ie=Oe(Ae(a,n.line).text,n.ch,Ne),$e=Oe(Ae(a,be.line).text,be.ch,Ne),Ve=Math.min(Ie,$e),vt=Math.max(Ie,$e),rt=Math.min(n.line,be.line),Ot=Math.min(e.lastLine(),Math.max(n.line,be.line));rt<=Ot;rt++){var At=Ae(a,rt).text,ut=Ge(At,Ve,Ne);Ve==vt?Ce.push(new Ye(ne(rt,ut),ne(rt,ut))):At.length>ut&&Ce.push(new Ye(ne(rt,ut),ne(rt,Ge(At,vt,Ne))))}Ce.length||Ce.push(new Ye(n,n)),wt(a,Yt(e,f.ranges.slice(0,u).concat(Ce),u),{origin:"*mouse",scroll:!1}),e.scrollIntoView(be)}else{var Dt=l,yt=Ql(e,be,r.unit),ft=Dt.anchor,ct;ye(yt.anchor,ft)>0?(ct=yt.head,ft=Zr(Dt.from(),yt.anchor)):(ct=yt.anchor,ft=Et(Dt.to(),yt.head));var lt=f.ranges.slice(0);lt[u]=fd(e,new Ye(Re(a,ft),ct)),wt(a,Yt(e,lt,u),Je)}}var Y=i.wrapper.getBoundingClientRect(),ie=0;function ue(be){var Ce=++ie,Ne=Mr(e,be,!0,r.unit=="rectangle");if(Ne)if(ye(Ne,P)!=0){e.curOp.focus=B(de(e)),J(Ne);var Ie=gi(i,a);(Ne.line>=Ie.to||Ne.lineY.bottom?20:0;$e&&setTimeout(gt(e,function(){ie==Ce&&(i.scroller.scrollTop+=$e,ue(be))}),50)}}function me(be){e.state.selectingText=!1,ie=1/0,be&&(kt(be),i.input.focus()),_t(i.wrapper.ownerDocument,"mousemove",ve),_t(i.wrapper.ownerDocument,"mouseup",_e),a.history.lastSelOrigin=null}var ve=gt(e,function(be){be.buttons===0||!Ut(be)?me(be):ue(be)}),_e=gt(e,me);e.state.selectingText=_e,Fe(i.wrapper.ownerDocument,"mousemove",ve),Fe(i.wrapper.ownerDocument,"mouseup",_e)}function fd(e,t){var n=t.anchor,r=t.head,i=Ae(e.doc,n.line);if(ye(n,r)==0&&n.sticky==r.sticky)return t;var a=Pe(i);if(!a)return t;var l=Pt(a,n.ch,n.sticky),u=a[l];if(u.from!=n.ch&&u.to!=n.ch)return t;var f=l+(u.from==n.ch==(u.level!=1)?0:1);if(f==0||f==a.length)return t;var m;if(r.line!=n.line)m=(r.line-n.line)*(e.doc.direction=="ltr"?1:-1)>0;else{var A=Pt(a,r.ch,r.sticky),P=A-l||(r.ch-n.ch)*(u.level==1?-1:1);A==f-1||A==f?m=P<0:m=P>0}var J=a[f+(m?-1:0)],Y=m==(J.level==1),ie=Y?J.from:J.to,ue=Y?"after":"before";return n.ch==ie&&n.sticky==ue?t:new Ye(new ne(n.line,ie,ue),r)}function Vl(e,t,n,r){var i,a;if(t.touches)i=t.touches[0].clientX,a=t.touches[0].clientY;else try{i=t.clientX,a=t.clientY}catch{return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&kt(t);var l=e.display,u=l.lineDiv.getBoundingClientRect();if(a>u.bottom||!Ft(e,n))return Ct(t);a-=u.top-l.viewOffset;for(var f=0;f=i){var A=O(e.doc,a),P=e.display.gutterSpecs[f];return it(e,n,e,A,P.className,t),Ct(t)}}}function Wo(e,t){return Vl(e,t,"gutterClick",!0)}function Jl(e,t){lr(e.display,t)||dd(e,t)||ot(e,t,"contextmenu")||F||e.display.input.onContextMenu(t)}function dd(e,t){return Ft(e,"gutterContextMenu")?Vl(e,t,"gutterContextMenu",!1):!1}function es(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),En(e)}var fn={toString:function(){return"CodeMirror.Init"}},ts={},Ei={};function pd(e){var t=e.optionHandlers;function n(r,i,a,l){e.defaults[r]=i,a&&(t[r]=l?function(u,f,m){m!=fn&&a(u,f,m)}:a)}e.defineOption=n,e.Init=fn,n("value","",function(r,i){return r.setValue(i)},!0),n("mode",null,function(r,i){r.doc.modeOption=i,qo(r)},!0),n("indentUnit",2,qo,!0),n("indentWithTabs",!1),n("smartIndent",!0),n("tabSize",4,function(r){Nn(r),En(r),zt(r)},!0),n("lineSeparator",null,function(r,i){if(r.doc.lineSep=i,!!i){var a=[],l=r.doc.first;r.doc.iter(function(f){for(var m=0;;){var A=f.text.indexOf(i,m);if(A==-1)break;m=A+i.length,a.push(ne(l,A))}l++});for(var u=a.length-1;u>=0;u--)ln(r.doc,i,a[u],ne(a[u].line,a[u].ch+i.length))}}),n("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g,function(r,i,a){r.state.specialChars=new RegExp(i.source+(i.test(" ")?"":"| "),"g"),a!=fn&&r.refresh()}),n("specialCharPlaceholder",Hc,function(r){return r.refresh()},!0),n("electricChars",!0),n("inputStyle",M?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),n("spellcheck",!1,function(r,i){return r.getInputField().spellcheck=i},!0),n("autocorrect",!1,function(r,i){return r.getInputField().autocorrect=i},!0),n("autocapitalize",!1,function(r,i){return r.getInputField().autocapitalize=i},!0),n("rtlMoveVisually",!ee),n("wholeLineUpdateBefore",!0),n("theme","default",function(r){es(r),Fn(r)},!0),n("keyMap","default",function(r,i,a){var l=Li(i),u=a!=fn&&Li(a);u&&u.detach&&u.detach(r,l),l.attach&&l.attach(r,u||null)}),n("extraKeys",null),n("configureMouse",null),n("lineWrapping",!1,gd,!0),n("gutters",[],function(r,i){r.display.gutterSpecs=Ao(i,r.options.lineNumbers),Fn(r)},!0),n("fixedGutter",!0,function(r,i){r.display.gutters.style.left=i?yo(r.display)+"px":"0",r.refresh()},!0),n("coverGutterNextToScrollbar",!1,function(r){return rn(r)},!0),n("scrollbarStyle","native",function(r){nl(r),rn(r),r.display.scrollbars.setScrollTop(r.doc.scrollTop),r.display.scrollbars.setScrollLeft(r.doc.scrollLeft)},!0),n("lineNumbers",!1,function(r,i){r.display.gutterSpecs=Ao(r.options.gutters,i),Fn(r)},!0),n("firstLineNumber",1,Fn,!0),n("lineNumberFormatter",function(r){return r},Fn,!0),n("showCursorWhenSelecting",!1,zn,!0),n("resetSelectionOnContextMenu",!0),n("lineWiseCopyCut",!0),n("pasteLinesPerSelection",!0),n("selectionsMayTouch",!1),n("readOnly",!1,function(r,i){i=="nocursor"&&(en(r),r.display.input.blur()),r.display.input.readOnlyChanged(i)}),n("screenReaderLabel",null,function(r,i){i=i===""?null:i,r.display.input.screenReaderLabelChanged(i)}),n("disableInput",!1,function(r,i){i||r.display.input.reset()},!0),n("dragDrop",!0,hd),n("allowDropFileTypes",null),n("cursorBlinkRate",530),n("cursorScrollMargin",0),n("cursorHeight",1,zn,!0),n("singleCursorHeightPerLine",!0,zn,!0),n("workTime",100),n("workDelay",100),n("flattenSpans",!0,Nn,!0),n("addModeClass",!1,Nn,!0),n("pollInterval",100),n("undoDepth",200,function(r,i){return r.doc.history.undoDepth=i}),n("historyEventDelay",1250),n("viewportMargin",10,function(r){return r.refresh()},!0),n("maxHighlightLength",1e4,Nn,!0),n("moveInputWithCursor",!0,function(r,i){i||r.display.input.resetPosition()}),n("tabindex",null,function(r,i){return r.display.input.getField().tabIndex=i||""}),n("autofocus",null),n("direction","ltr",function(r,i){return r.doc.setDirection(i)},!0),n("phrases",null)}function hd(e,t,n){var r=n&&n!=fn;if(!t!=!r){var i=e.display.dragFunctions,a=t?Fe:_t;a(e.display.scroller,"dragstart",i.start),a(e.display.scroller,"dragenter",i.enter),a(e.display.scroller,"dragover",i.over),a(e.display.scroller,"dragleave",i.leave),a(e.display.scroller,"drop",i.drop)}}function gd(e){e.options.lineWrapping?(le(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(Q(e.display.wrapper,"CodeMirror-wrap"),so(e)),xo(e),zt(e),En(e),setTimeout(function(){return rn(e)},100)}function tt(e,t){var n=this;if(!(this instanceof tt))return new tt(e,t);this.options=t=t?ge(t):{},ge(ts,t,!1);var r=t.value;typeof r=="string"?r=new Mt(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new tt.inputStyles[t.inputStyle](this),a=this.display=new Ef(e,r,i,t);a.wrapper.CodeMirror=this,es(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),nl(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new qe,keySeq:null,specialChars:null},t.autofocus&&!M&&a.input.focus(),s&&h<11&&setTimeout(function(){return n.display.input.reset(!0)},20),md(this),Gf(),Ir(this),this.curOp.forceUpdate=!0,pl(this,r),t.autofocus&&!M||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&So(n)},20):en(this);for(var l in Ei)Ei.hasOwnProperty(l)&&Ei[l](this,t[l],fn);al(this),t.finishInit&&t.finishInit(this);for(var u=0;u20*20}Fe(t.scroller,"touchstart",function(f){if(!ot(e,f)&&!a(f)&&!Wo(e,f)){t.input.ensurePolled(),clearTimeout(n);var m=+new Date;t.activeTouch={start:m,moved:!1,prev:m-r.end<=300?r:null},f.touches.length==1&&(t.activeTouch.left=f.touches[0].pageX,t.activeTouch.top=f.touches[0].pageY)}}),Fe(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Fe(t.scroller,"touchend",function(f){var m=t.activeTouch;if(m&&!lr(t,f)&&m.left!=null&&!m.moved&&new Date-m.start<300){var A=e.coordsChar(t.activeTouch,"page"),P;!m.prev||l(m,m.prev)?P=new Ye(A,A):!m.prev.prev||l(m,m.prev.prev)?P=e.findWordAt(A):P=new Ye(ne(A.line,0),Re(e.doc,ne(A.line+1,0))),e.setSelection(P.anchor,P.head),e.focus(),kt(f)}i()}),Fe(t.scroller,"touchcancel",i),Fe(t.scroller,"scroll",function(){t.scroller.clientHeight&&(An(e,t.scroller.scrollTop),Dr(e,t.scroller.scrollLeft,!0),it(e,"scroll",e))}),Fe(t.scroller,"mousewheel",function(f){return ul(e,f)}),Fe(t.scroller,"DOMMouseScroll",function(f){return ul(e,f)}),Fe(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(f){ot(e,f)||dr(f)},over:function(f){ot(e,f)||(Kf(e,f),dr(f))},start:function(f){return $f(e,f)},drop:gt(e,Uf),leave:function(f){ot(e,f)||Ol(e)}};var u=t.input.getField();Fe(u,"keyup",function(f){return Zl.call(e,f)}),Fe(u,"keydown",gt(e,Gl)),Fe(u,"keypress",gt(e,Xl)),Fe(u,"focus",function(f){return So(e,f)}),Fe(u,"blur",function(f){return en(e,f)})}var Uo=[];tt.defineInitHook=function(e){return Uo.push(e)};function Xn(e,t,n,r){var i=e.doc,a;n==null&&(n="add"),n=="smart"&&(i.mode.indent?a=wn(e,t).state:n="prev");var l=e.options.tabSize,u=Ae(i,t),f=Oe(u.text,null,l);u.stateAfter&&(u.stateAfter=null);var m=u.text.match(/^\s*/)[0],A;if(!r&&!/\S/.test(u.text))A=0,n="not";else if(n=="smart"&&(A=i.mode.indent(a,u.text.slice(m.length),u.text),A==Ze||A>150)){if(!r)return;n="prev"}n=="prev"?t>i.first?A=Oe(Ae(i,t-1).text,null,l):A=0:n=="add"?A=f+e.options.indentUnit:n=="subtract"?A=f-e.options.indentUnit:typeof n=="number"&&(A=f+n),A=Math.max(0,A);var P="",J=0;if(e.options.indentWithTabs)for(var Y=Math.floor(A/l);Y;--Y)J+=l,P+=" ";if(Jl,f=Bt(t),m=null;if(u&&r.ranges.length>1)if(Qt&&Qt.text.join(` -`)==t){if(r.ranges.length%Qt.text.length==0){m=[];for(var A=0;A=0;J--){var Y=r.ranges[J],ie=Y.from(),ue=Y.to();Y.empty()&&(n&&n>0?ie=ne(ie.line,ie.ch-n):e.state.overwrite&&!u?ue=ne(ue.line,Math.min(Ae(a,ue.line).text.length,ue.ch+ce(f).length)):u&&Qt&&Qt.lineWise&&Qt.text.join(` + left: `+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(l),l.scrollIntoView(i),e.display.lineSpace.removeChild(l)}}}function pf(e,t,n,r){r==null&&(r=0);var i;!e.options.lineWrapping&&t==n&&(n=t.sticky=="before"?ne(t.line,t.ch+1,"before"):t,t=t.ch?ne(t.line,t.sticky=="before"?t.ch-1:t.ch,"after"):t);for(var a=0;a<5;a++){var l=!1,u=Xt(e,t),f=!n||n==t?u:Xt(e,n);i={left:Math.min(u.left,f.left),top:Math.min(u.top,f.top)-r,right:Math.max(u.left,f.left),bottom:Math.max(u.bottom,f.bottom)+r};var m=To(e,i),A=e.doc.scrollTop,B=e.doc.scrollLeft;if(m.scrollTop!=null&&(An(e,m.scrollTop),Math.abs(e.doc.scrollTop-A)>1&&(l=!0)),m.scrollLeft!=null&&(Dr(e,m.scrollLeft),Math.abs(e.doc.scrollLeft-B)>1&&(l=!0)),!l)break}return i}function hf(e,t){var n=To(e,t);n.scrollTop!=null&&An(e,n.scrollTop),n.scrollLeft!=null&&Dr(e,n.scrollLeft)}function To(e,t){var n=e.display,r=Vr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&e.curOp.scrollTop!=null?e.curOp.scrollTop:n.scroller.scrollTop,a=fo(e),l={};t.bottom-t.top>a&&(t.bottom=t.top+a);var u=e.doc.height+co(n),f=t.topu-r;if(t.topi+a){var A=Math.min(t.top,(m?u:t.bottom)-a);A!=i&&(l.scrollTop=A)}var B=e.options.fixedGutter?0:n.gutters.offsetWidth,ee=e.curOp&&e.curOp.scrollLeft!=null?e.curOp.scrollLeft:n.scroller.scrollLeft-B,Y=Er(e)-n.gutters.offsetWidth,ie=t.right-t.left>Y;return ie&&(t.right=t.left+Y),t.left<10?l.scrollLeft=0:t.leftY+ee-3&&(l.scrollLeft=t.right+(ie?0:10)-Y),l}function Lo(e,t){t!=null&&(mi(e),e.curOp.scrollTop=(e.curOp.scrollTop==null?e.doc.scrollTop:e.curOp.scrollTop)+t)}function tn(e){mi(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Mn(e,t,n){(t!=null||n!=null)&&mi(e),t!=null&&(e.curOp.scrollLeft=t),n!=null&&(e.curOp.scrollTop=n)}function gf(e,t){mi(e),e.curOp.scrollToPos=t}function mi(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=$a(e,t.from),r=$a(e,t.to);Ja(e,n,r,t.margin)}}function Ja(e,t,n,r){var i=To(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Mn(e,i.scrollLeft,i.scrollTop)}function An(e,t){Math.abs(e.doc.scrollTop-t)<2||(v||Eo(e,{top:t}),el(e,t,!0),v&&Eo(e),Fn(e,100))}function el(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),!(e.display.scroller.scrollTop==t&&!n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Dr(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),!((n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r)&&(e.doc.scrollLeft=t,ol(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Dn(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+co(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+er(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}var qr=function(e,t,n){this.cm=n;var r=this.vert=y("div",[y("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=y("div",[y("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),Ie(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),Ie(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,s&&h<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};qr.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.scrollTop=0,this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var a=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+a)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(r==0&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},qr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},qr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},qr.prototype.zeroWidthHack=function(){var e=O&&!z?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.visibility=this.vert.style.visibility="hidden",this.disableHoriz=new qe,this.disableVert=new qe},qr.prototype.enableZeroWidthBar=function(e,t,n){e.style.visibility="";function r(){var i=e.getBoundingClientRect(),a=n=="vert"?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1);a!=e?e.style.visibility="hidden":t.set(1e3,r)}t.set(1e3,r)},qr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var qn=function(){};qn.prototype.update=function(){return{bottom:0,right:0}},qn.prototype.setScrollLeft=function(){},qn.prototype.setScrollTop=function(){},qn.prototype.clear=function(){};function rn(e,t){t||(t=Dn(e));var n=e.display.barWidth,r=e.display.barHeight;tl(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&hi(e),tl(e,Dn(e)),n=e.display.barWidth,r=e.display.barHeight}function tl(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}var rl={native:qr,null:qn};function nl(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&Q(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new rl[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Ie(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,n){n=="horizontal"?Dr(e,t):An(e,t)},e),e.display.scrollbars.addClass&&le(e.display.wrapper,e.display.scrollbars.addClass)}var mf=0;function Fr(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++mf,markArrays:null},Kc(e.curOp)}function Ir(e){var t=e.curOp;t&&Zc(t,function(n){for(var r=0;r=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new vi(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function yf(e){e.updatedDisplay=e.mustUpdate&&Co(e.cm,e.update)}function xf(e){var t=e.cm,n=t.display;e.updatedDisplay&&hi(t),e.barMeasure=Dn(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Oa(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+er(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Er(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function _f(e){var t=e.cm;e.adjustWidthTo!=null&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft=e.display.viewTo)){var n=+new Date+e.options.workTime,r=wn(e,t.highlightFrontier),i=[];t.iter(r.line,Math.min(t.first+t.size,e.display.viewTo+500),function(a){if(r.line>=e.display.viewFrom){var l=a.styles,u=a.text.length>e.options.maxHighlightLength?Vt(t.mode,r.state):null,f=fa(e,a,r,!0);u&&(r.state=u),a.styles=f.styles;var m=a.styleClasses,A=f.classes;A?a.styleClasses=A:m&&(a.styleClasses=null);for(var B=!l||l.length!=a.styles.length||m!=A&&(!m||!A||m.bgClass!=A.bgClass||m.textClass!=A.textClass),ee=0;!B&&een)return Fn(e,e.options.workDelay),!0}),t.highlightFrontier=r.line,t.modeFrontier=Math.max(t.modeFrontier,r.line),i.length&&Nt(e,function(){for(var a=0;a=n.viewFrom&&t.visible.to<=n.viewTo&&(n.updateLineNumbers==null||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&Xa(e)==0)return!1;al(e)&&(br(e),t.dims=bo(e));var i=r.first+r.size,a=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFroml&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),or&&(a=ao(e.doc,a),l=Ta(e.doc,l));var u=a!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;cf(e,a,l),n.viewOffset=ar(Ae(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var f=Xa(e);if(!u&&f==0&&!t.force&&n.renderedView==n.view&&(n.updateLineNumbers==null||n.updateLineNumbers>=n.viewTo))return!1;var m=Tf(e);return f>4&&(n.lineDiv.style.display="none"),Cf(e,n.updateLineNumbers,t.dims),f>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,Lf(m),j(n.cursorDiv),j(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,u&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Fn(e,400)),n.updateLineNumbers=null,!0}function il(e,t){for(var n=t.viewport,r=!0;;r=!1){if(!r||!e.options.lineWrapping||t.oldDisplayWidth==Er(e)){if(n&&n.top!=null&&(n={top:Math.min(e.doc.height+co(e.display)-fo(e),n.top)}),t.visible=gi(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break}else r&&(t.visible=gi(e.display,e.doc,n));if(!Co(e,t))break;hi(e);var i=Dn(e);zn(e),rn(e,i),Mo(e,i),t.force=!1}t.signal(e,"update",e),(e.display.viewFrom!=e.display.reportedViewFrom||e.display.viewTo!=e.display.reportedViewTo)&&(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function Eo(e,t){var n=new vi(e,t);if(Co(e,n)){hi(e),il(e,n);var r=Dn(e);zn(e),rn(e,r),Mo(e,r),n.finish()}}function Cf(e,t,n){var r=e.display,i=e.options.lineNumbers,a=r.lineDiv,l=a.firstChild;function u(ie){var ue=ie.nextSibling;return g&&O&&e.display.currentWheelTarget==ie?ie.style.display="none":ie.parentNode.removeChild(ie),ue}for(var f=r.view,m=r.viewFrom,A=0;A-1&&(Y=!1),Ma(e,B,m,n)),Y&&(j(B.lineNumber),B.lineNumber.appendChild(document.createTextNode(he(e.options,m)))),l=B.node.nextSibling}m+=B.size}for(;l;)l=u(l)}function zo(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px",ht(e,"gutterChanged",e)}function Mo(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+er(e)+"px"}function ol(e){var t=e.display,n=t.view;if(!(!t.alignWidgets&&(!t.gutters.firstChild||!e.options.fixedGutter))){for(var r=yo(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,a=r+"px",l=0;lu.clientWidth,m=u.scrollHeight>u.clientHeight;if(r&&f||i&&m){if(i&&O&&g){e:for(var A=t.target,B=l.view;A!=u;A=A.parentNode)for(var ee=0;ee=0&&ye(e,r.to())<=0)return n}return-1};var Ye=function(e,t){this.anchor=e,this.head=t};Ye.prototype.from=function(){return Zr(this.anchor,this.head)},Ye.prototype.to=function(){return Et(this.anchor,this.head)},Ye.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch};function Yt(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(ee,Y){return ye(ee.from(),Y.from())}),n=Se(t,i);for(var a=1;a0:f>=0){var m=Zr(u.from(),l.from()),A=Et(u.to(),l.to()),B=u.empty()?l.from()==l.head:u.from()==u.head;a<=n&&--n,t.splice(--a,2,new Ye(B?A:m,B?m:A))}}return new jt(t,n)}function yr(e,t){return new jt([new Ye(e,t||e)],0)}function xr(e){return e.text?ne(e.from.line+e.text.length-1,ce(e.text).length+(e.text.length==1?e.from.ch:0)):e.to}function cl(e,t){if(ye(e,t.from)<0)return e;if(ye(e,t.to)<=0)return xr(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=xr(t).ch-t.to.ch),ne(n,r)}function Do(e,t){for(var n=[],r=0;r1&&e.remove(u.line+1,ie-1),e.insert(u.line+1,ve)}ht(e,"change",e,t)}function _r(e,t,n){function r(i,a,l){if(i.linked)for(var u=0;u1&&!e.done[e.done.length-2].ranges)return e.done.pop(),ce(e.done)}function ml(e,t,n,r){var i=e.history;i.undone.length=0;var a=+new Date,l,u;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&(t.origin.charAt(0)=="+"&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||t.origin.charAt(0)=="*"))&&(l=Df(i,i.lastOp==r)))u=ce(l.changes),ye(t.from,t.to)==0&&ye(t.from,u.to)==0?u.to=xr(t):l.changes.push(Io(e,t));else{var f=ce(i.done);for((!f||!f.ranges)&&xi(e.sel,i.done),l={changes:[Io(e,t)],generation:i.generation},i.done.push(l);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,u||it(e,"historyAdded")}function qf(e,t,n,r){var i=t.charAt(0);return i=="*"||i=="+"&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function Ff(e,t,n,r){var i=e.history,a=r&&r.origin;n==i.lastSelOp||a&&i.lastSelOrigin==a&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==a||qf(e,a,ce(i.done),t))?i.done[i.done.length-1]=t:xi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=a,i.lastSelOp=n,r&&r.clearRedo!==!1&&gl(i.undone)}function xi(e,t){var n=ce(t);n&&n.ranges&&n.equals(e)||t.push(e)}function vl(e,t,n,r){var i=t["spans_"+e.id],a=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(l){l.markedSpans&&((i||(i=t["spans_"+e.id]={}))[a]=l.markedSpans),++a})}function If(e){if(!e)return null;for(var t,n=0;n-1&&(ce(u)[B]=m[B],delete m[B])}}return r}function No(e,t,n,r){if(r){var i=e.anchor;if(n){var a=ye(t,i)<0;a!=ye(n,i)<0?(i=t,t=n):a!=ye(t,n)<0&&(t=n)}return new Ye(i,t)}else return new Ye(n||t,t)}function _i(e,t,n,r,i){i==null&&(i=e.cm&&(e.cm.display.shift||e.extend)),wt(e,new jt([No(e.sel.primary(),t,n,i)],0),r)}function yl(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),a=0;a=t.ch:u.to>t.ch))){if(i&&(it(f,"beforeCursorEnter"),f.explicitlyCleared))if(a.markedSpans){--l;continue}else break;if(!f.atomic)continue;if(n){var B=f.find(r<0?1:-1),ee=void 0;if((r<0?A:m)&&(B=Tl(e,B,-r,B&&B.line==t.line?a:null)),B&&B.line==t.line&&(ee=ye(B,n))&&(r<0?ee<0:ee>0))return on(e,B,t,r,i)}var Y=f.find(r<0?-1:1);return(r<0?m:A)&&(Y=Tl(e,Y,r,Y.line==t.line?a:null)),Y?on(e,Y,t,r,i):null}}return t}function wi(e,t,n,r,i){var a=r||1,l=on(e,t,n,a,i)||!i&&on(e,t,n,a,!0)||on(e,t,n,-a,i)||!i&&on(e,t,n,-a,!0);return l||(e.cantEdit=!0,ne(e.first,0))}function Tl(e,t,n,r){return n<0&&t.ch==0?t.line>e.first?je(e,ne(t.line-1)):null:n>0&&t.ch==(r||Ae(e,t.line)).text.length?t.line=0;--i)El(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else El(e,t)}}function El(e,t){if(!(t.text.length==1&&t.text[0]==""&&ye(t.from,t.to)==0)){var n=Do(e,t);ml(e,t,n,e.cm?e.cm.curOp.id:NaN),On(e,t,n,io(e,t));var r=[];_r(e,function(i,a){!a&&Se(r,i.history)==-1&&(Dl(i.history,t),r.push(i.history)),On(i,t,null,io(i,t))})}}function Si(e,t,n){var r=e.cm&&e.cm.state.suppressEdits;if(!(r&&!n)){for(var i=e.history,a,l=e.sel,u=t=="undo"?i.done:i.undone,f=t=="undo"?i.undone:i.done,m=0;m=0;--Y){var ie=ee(Y);if(ie)return ie.v}}}}function zl(e,t){if(t!=0&&(e.first+=t,e.sel=new jt(He(e.sel.ranges,function(i){return new Ye(ne(i.anchor.line+t,i.anchor.ch),ne(i.head.line+t,i.head.ch))}),e.sel.primIndex),e.cm)){zt(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;re.lastLine())){if(t.from.linea&&(t={from:t.from,to:ne(a,Ae(e,a).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ir(e,t.from,t.to),n||(n=Do(e,t)),e.cm?Pf(e.cm,t,r):Fo(e,t,r),ki(e,n,ke),e.cantEdit&&wi(e,ne(e.firstLine(),0))&&(e.cantEdit=!1)}}function Pf(e,t,n){var r=e.doc,i=e.display,a=t.from,l=t.to,u=!1,f=a.line;e.options.lineWrapping||(f=x(Zt(Ae(r,a.line))),r.iter(f,l.line+1,function(Y){if(Y==i.maxLine)return u=!0,!0})),r.sel.contains(t.from,t.to)>-1&&Rt(e),Fo(r,t,n,Za(e)),e.options.lineWrapping||(r.iter(f,a.line+t.text.length,function(Y){var ie=li(Y);ie>i.maxLineLength&&(i.maxLine=Y,i.maxLineLength=ie,i.maxLineChanged=!0,u=!1)}),u&&(e.curOp.updateMaxLine=!0)),Lc(r,a.line),Fn(e,400);var m=t.text.length-(l.line-a.line)-1;t.full?zt(e):a.line==l.line&&t.text.length==1&&!dl(e.doc,t)?vr(e,a.line,"text"):zt(e,a.line,l.line+1,m);var A=It(e,"changes"),B=It(e,"change");if(B||A){var ee={from:a,to:l,text:t.text,removed:t.removed,origin:t.origin};B&&ht(e,"change",e,ee),A&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(ee)}e.display.selForContextMenu=null}function ln(e,t,n,r,i){var a;r||(r=n),ye(r,n)<0&&(a=[r,n],n=a[0],r=a[1]),typeof t=="string"&&(t=e.splitLines(t)),an(e,{from:n,to:r,text:t,origin:i})}function Ml(e,t,n,r){n1||!(this.children[0]instanceof Bn))){var u=[];this.collapse(u),this.children=[new Bn(u)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var l=i.lines.length%25+25,u=l;u10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;re.display.maxLineLength&&(e.display.maxLine=m,e.display.maxLineLength=A,e.display.maxLineChanged=!0)}r!=null&&e&&this.collapsed&&zt(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&wl(e.doc)),e&&ht(e,"markerCleared",e,this,r,i),t&&Ir(e),this.parent&&this.parent.clear()}},kr.prototype.find=function(e,t){e==null&&this.type=="bookmark"&&(e=1);for(var n,r,i=0;i0||l==0&&a.clearWhenEmpty!==!1)return a;if(a.replacedWith&&(a.collapsed=!0,a.widgetNode=K("span",[a.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||a.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(a.widgetNode.insertLeft=!0)),a.collapsed){if(Sa(e,t.line,t,n,a)||t.line!=n.line&&Sa(e,n.line,t,n,a))throw new Error("Inserting collapsed marker partially overlapping an existing one");Ec()}a.addToHistory&&ml(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var u=t.line,f=e.cm,m;if(e.iter(u,n.line+1,function(B){f&&a.collapsed&&!f.options.lineWrapping&&Zt(B)==f.display.maxLine&&(m=!0),a.collapsed&&u!=t.line&&Bt(B,0),Mc(B,new ni(a,u==t.line?t.ch:null,u==n.line?n.ch:null),e.cm&&e.cm.curOp),++u}),a.collapsed&&e.iter(t.line,n.line+1,function(B){mr(e,B)&&Bt(B,0)}),a.clearOnEnter&&Ie(a,"beforeCursorEnter",function(){return a.clear()}),a.readOnly&&(Cc(),(e.history.done.length||e.history.undone.length)&&e.clearHistory()),a.collapsed&&(a.id=++Fl,a.atomic=!0),f){if(m&&(f.curOp.updateMaxLine=!0),a.collapsed)zt(f,t.line,n.line+1);else if(a.className||a.startStyle||a.endStyle||a.css||a.attributes||a.title)for(var A=t.line;A<=n.line;A++)vr(f,A,"text");a.atomic&&wl(f.doc),ht(f,"markerAdded",f,a)}return a}var Hn=function(e,t){this.markers=e,this.primary=t;for(var n=0;n=0;f--)an(this,r[f]);u?_l(this,u):this.cm&&tn(this.cm)}),undo:mt(function(){Si(this,"undo")}),redo:mt(function(){Si(this,"redo")}),undoSelection:mt(function(){Si(this,"undo",!0)}),redoSelection:mt(function(){Si(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=je(this,e),t=je(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,function(a){var l=a.markedSpans;if(l)for(var u=0;u=f.to||f.from==null&&i!=e.line||f.from!=null&&i==t.line&&f.from>=t.ch)&&(!n||n(f.marker))&&r.push(f.marker.parent||f.marker)}++i}),r},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;re)return t=e,!0;e-=a,++n}),je(this,ne(n,t))},indexFromPos:function(e){e=je(this,e);var t=e.ch;if(e.linet&&(t=e.from),e.to!=null&&e.to-1){t.state.draggingText(e),setTimeout(function(){return t.display.input.focus()},20);return}try{var A=e.dataTransfer.getData("Text");if(A){var B;if(t.state.draggingText&&!t.state.draggingText.copy&&(B=t.listSelections()),ki(t.doc,yr(n,n)),B)for(var ee=0;ee=0;u--)ln(e.doc,"",r[u].from,r[u].to,"+delete");tn(e)})}function Po(e,t,n){var r=se(e.text,t+n,n);return r<0||r>e.text.length?null:r}function Bo(e,t,n){var r=Po(e,t.ch,n);return r==null?null:new ne(t.line,r,n<0?"after":"before")}function jo(e,t,n,r,i){if(e){t.doc.direction=="rtl"&&(i=-i);var a=Pe(n,t.doc.direction);if(a){var l=i<0?ce(a):a[0],u=i<0==(l.level==1),f=u?"after":"before",m;if(l.level>0||t.doc.direction=="rtl"){var A=Qr(t,n);m=i<0?n.text.length-1:0;var B=tr(t,A,m).top;m=De(function(ee){return tr(t,A,ee).top==B},i<0==(l.level==1)?l.from:l.to-1,m),f=="before"&&(m=Po(n,m,1))}else m=i<0?l.to:l.from;return new ne(r,m,f)}}return new ne(r,i<0?n.text.length:0,i<0?"before":"after")}function Vf(e,t,n,r){var i=Pe(t,e.doc.direction);if(!i)return Bo(t,n,r);n.ch>=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var a=Pt(i,n.ch,n.sticky),l=i[a];if(e.doc.direction=="ltr"&&l.level%2==0&&(r>0?l.to>n.ch:l.from=l.from&&ee>=A.begin)){var Y=B?"before":"after";return new ne(n.line,ee,Y)}}var ie=function(ve,_e,be){for(var Ce=function(Ve,vt){return vt?new ne(n.line,u(Ve,1),"before"):new ne(n.line,Ve,"after")};ve>=0&&ve0==(Ne.level!=1),$e=Fe?be.begin:u(be.end,-1);if(Ne.from<=$e&&$e0?A.end:u(A.begin,-1);return me!=null&&!(r>0&&me==t.text.length)&&(ue=ie(r>0?0:i.length-1,r,m(me)),ue)?ue:null}var $n={selectAll:Ll,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),ke)},killLine:function(e){return cn(e,function(t){if(t.empty()){var n=Ae(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)i=new ne(i.line,i.ch+1),e.replaceRange(a.charAt(i.ch-1)+a.charAt(i.ch-2),ne(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Ae(e.doc,i.line-1).text;l&&(i=new ne(i.line,1),e.replaceRange(a.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ne(i.line-1,l.length-1),i,"+transpose"))}}n.push(new Ye(i,i))}e.setSelections(n)})},newlineAndIndent:function(e){return Nt(e,function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var r=0;re&&ye(t,this.pos)==0&&n==this.button};var Gn,Zn;function od(e,t){var n=+new Date;return Zn&&Zn.compare(n,e,t)?(Gn=Zn=null,"triple"):Gn&&Gn.compare(n,e,t)?(Zn=new Ho(n,e,t),Gn=null,"double"):(Gn=new Ho(n,e,t),Zn=null,"single")}function Yl(e){var t=this,n=t.display;if(!(ot(t,e)||n.activeTouch&&n.input.supportsTouch())){if(n.input.ensurePolled(),n.shift=e.shiftKey,lr(n,e)){g||(n.scroller.draggable=!1,setTimeout(function(){return n.scroller.draggable=!0},100));return}if(!Wo(t,e)){var r=Mr(t,e),i=Ut(e),a=r?od(r,i):"single";pe(t).focus(),i==1&&t.state.selectingText&&t.state.selectingText(e),!(r&&ad(t,i,r,a,e))&&(i==1?r?sd(t,r,a,e):yn(e)==n.scroller&&kt(e):i==2?(r&&_i(t.doc,r),setTimeout(function(){return n.input.focus()},20)):i==3&&(I?t.display.input.onContextMenu(e):wo(t)))}}}function ad(e,t,n,r,i){var a="Click";return r=="double"?a="Double"+a:r=="triple"&&(a="Triple"+a),a=(t==1?"Left":t==2?"Middle":"Right")+a,Kn(e,Rl(a,i),i,function(l){if(typeof l=="string"&&(l=$n[l]),!l)return!1;var u=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),u=l(e,n)!=Ze}finally{e.state.suppressEdits=!1}return u})}function ld(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};if(i.unit==null){var a=G?n.shiftKey&&n.metaKey:n.altKey;i.unit=a?"rectangle":t=="single"?"char":t=="double"?"word":"line"}return(i.extend==null||e.doc.extend)&&(i.extend=e.doc.extend||n.shiftKey),i.addNew==null&&(i.addNew=O?n.metaKey:n.ctrlKey),i.moveOnDrag==null&&(i.moveOnDrag=!(O?n.altKey:n.ctrlKey)),i}function sd(e,t,n,r){s?setTimeout(Ee(Qa,e),0):e.curOp.focus=R(de(e));var i=ld(e,n,r),a=e.doc.sel,l;e.options.dragDrop&&eo&&!e.isReadOnly()&&n=="single"&&(l=a.contains(t))>-1&&(ye((l=a.ranges[l]).from(),t)<0||t.xRel>0)&&(ye(l.to(),t)>0||t.xRel<0)?ud(e,r,t,i):cd(e,r,t,i)}function ud(e,t,n,r){var i=e.display,a=!1,l=gt(e,function(m){g&&(i.scroller.draggable=!1),e.state.draggingText=!1,e.state.delayingBlurEvent&&(e.hasFocus()?e.state.delayingBlurEvent=!1:wo(e)),_t(i.wrapper.ownerDocument,"mouseup",l),_t(i.wrapper.ownerDocument,"mousemove",u),_t(i.scroller,"dragstart",f),_t(i.scroller,"drop",l),a||(kt(m),r.addNew||_i(e.doc,n,null,null,r.extend),g&&!k||s&&h==9?setTimeout(function(){i.wrapper.ownerDocument.body.focus({preventScroll:!0}),i.input.focus()},20):i.input.focus())}),u=function(m){a=a||Math.abs(t.clientX-m.clientX)+Math.abs(t.clientY-m.clientY)>=10},f=function(){return a=!0};g&&(i.scroller.draggable=!0),e.state.draggingText=l,l.copy=!r.moveOnDrag,Ie(i.wrapper.ownerDocument,"mouseup",l),Ie(i.wrapper.ownerDocument,"mousemove",u),Ie(i.scroller,"dragstart",f),Ie(i.scroller,"drop",l),e.state.delayingBlurEvent=!0,setTimeout(function(){return i.input.focus()},20),i.scroller.dragDrop&&i.scroller.dragDrop()}function Ql(e,t,n){if(n=="char")return new Ye(t,t);if(n=="word")return e.findWordAt(t);if(n=="line")return new Ye(ne(t.line,0),je(e.doc,ne(t.line+1,0)));var r=n(e,t);return new Ye(r.from,r.to)}function cd(e,t,n,r){s&&wo(e);var i=e.display,a=e.doc;kt(t);var l,u,f=a.sel,m=f.ranges;if(r.addNew&&!r.extend?(u=a.sel.contains(n),u>-1?l=m[u]:l=new Ye(n,n)):(l=a.sel.primary(),u=a.sel.primIndex),r.unit=="rectangle")r.addNew||(l=new Ye(n,n)),n=Mr(e,t,!0,!0),u=-1;else{var A=Ql(e,n,r.unit);r.extend?l=No(l,A.anchor,A.head,r.extend):l=A}r.addNew?u==-1?(u=m.length,wt(a,Yt(e,m.concat([l]),u),{scroll:!1,origin:"*mouse"})):m.length>1&&m[u].empty()&&r.unit=="char"&&!r.extend?(wt(a,Yt(e,m.slice(0,u).concat(m.slice(u+1)),0),{scroll:!1,origin:"*mouse"}),f=a.sel):Oo(a,u,l,Je):(u=0,wt(a,new jt([l],0),Je),f=a.sel);var B=n;function ee(be){if(ye(B,be)!=0)if(B=be,r.unit=="rectangle"){for(var Ce=[],Ne=e.options.tabSize,Fe=Oe(Ae(a,n.line).text,n.ch,Ne),$e=Oe(Ae(a,be.line).text,be.ch,Ne),Ve=Math.min(Fe,$e),vt=Math.max(Fe,$e),rt=Math.min(n.line,be.line),Ot=Math.min(e.lastLine(),Math.max(n.line,be.line));rt<=Ot;rt++){var At=Ae(a,rt).text,ut=Ge(At,Ve,Ne);Ve==vt?Ce.push(new Ye(ne(rt,ut),ne(rt,ut))):At.length>ut&&Ce.push(new Ye(ne(rt,ut),ne(rt,Ge(At,vt,Ne))))}Ce.length||Ce.push(new Ye(n,n)),wt(a,Yt(e,f.ranges.slice(0,u).concat(Ce),u),{origin:"*mouse",scroll:!1}),e.scrollIntoView(be)}else{var Dt=l,yt=Ql(e,be,r.unit),ft=Dt.anchor,ct;ye(yt.anchor,ft)>0?(ct=yt.head,ft=Zr(Dt.from(),yt.anchor)):(ct=yt.anchor,ft=Et(Dt.to(),yt.head));var lt=f.ranges.slice(0);lt[u]=fd(e,new Ye(je(a,ft),ct)),wt(a,Yt(e,lt,u),Je)}}var Y=i.wrapper.getBoundingClientRect(),ie=0;function ue(be){var Ce=++ie,Ne=Mr(e,be,!0,r.unit=="rectangle");if(Ne)if(ye(Ne,B)!=0){e.curOp.focus=R(de(e)),ee(Ne);var Fe=gi(i,a);(Ne.line>=Fe.to||Ne.lineY.bottom?20:0;$e&&setTimeout(gt(e,function(){ie==Ce&&(i.scroller.scrollTop+=$e,ue(be))}),50)}}function me(be){e.state.selectingText=!1,ie=1/0,be&&(kt(be),i.input.focus()),_t(i.wrapper.ownerDocument,"mousemove",ve),_t(i.wrapper.ownerDocument,"mouseup",_e),a.history.lastSelOrigin=null}var ve=gt(e,function(be){be.buttons===0||!Ut(be)?me(be):ue(be)}),_e=gt(e,me);e.state.selectingText=_e,Ie(i.wrapper.ownerDocument,"mousemove",ve),Ie(i.wrapper.ownerDocument,"mouseup",_e)}function fd(e,t){var n=t.anchor,r=t.head,i=Ae(e.doc,n.line);if(ye(n,r)==0&&n.sticky==r.sticky)return t;var a=Pe(i);if(!a)return t;var l=Pt(a,n.ch,n.sticky),u=a[l];if(u.from!=n.ch&&u.to!=n.ch)return t;var f=l+(u.from==n.ch==(u.level!=1)?0:1);if(f==0||f==a.length)return t;var m;if(r.line!=n.line)m=(r.line-n.line)*(e.doc.direction=="ltr"?1:-1)>0;else{var A=Pt(a,r.ch,r.sticky),B=A-l||(r.ch-n.ch)*(u.level==1?-1:1);A==f-1||A==f?m=B<0:m=B>0}var ee=a[f+(m?-1:0)],Y=m==(ee.level==1),ie=Y?ee.from:ee.to,ue=Y?"after":"before";return n.ch==ie&&n.sticky==ue?t:new Ye(new ne(n.line,ie,ue),r)}function Vl(e,t,n,r){var i,a;if(t.touches)i=t.touches[0].clientX,a=t.touches[0].clientY;else try{i=t.clientX,a=t.clientY}catch{return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&kt(t);var l=e.display,u=l.lineDiv.getBoundingClientRect();if(a>u.bottom||!It(e,n))return Ct(t);a-=u.top-l.viewOffset;for(var f=0;f=i){var A=P(e.doc,a),B=e.display.gutterSpecs[f];return it(e,n,e,A,B.className,t),Ct(t)}}}function Wo(e,t){return Vl(e,t,"gutterClick",!0)}function Jl(e,t){lr(e.display,t)||dd(e,t)||ot(e,t,"contextmenu")||I||e.display.input.onContextMenu(t)}function dd(e,t){return It(e,"gutterContextMenu")?Vl(e,t,"gutterContextMenu",!1):!1}function es(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),En(e)}var fn={toString:function(){return"CodeMirror.Init"}},ts={},Ei={};function pd(e){var t=e.optionHandlers;function n(r,i,a,l){e.defaults[r]=i,a&&(t[r]=l?function(u,f,m){m!=fn&&a(u,f,m)}:a)}e.defineOption=n,e.Init=fn,n("value","",function(r,i){return r.setValue(i)},!0),n("mode",null,function(r,i){r.doc.modeOption=i,qo(r)},!0),n("indentUnit",2,qo,!0),n("indentWithTabs",!1),n("smartIndent",!0),n("tabSize",4,function(r){Nn(r),En(r),zt(r)},!0),n("lineSeparator",null,function(r,i){if(r.doc.lineSep=i,!!i){var a=[],l=r.doc.first;r.doc.iter(function(f){for(var m=0;;){var A=f.text.indexOf(i,m);if(A==-1)break;m=A+i.length,a.push(ne(l,A))}l++});for(var u=a.length-1;u>=0;u--)ln(r.doc,i,a[u],ne(a[u].line,a[u].ch+i.length))}}),n("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g,function(r,i,a){r.state.specialChars=new RegExp(i.source+(i.test(" ")?"":"| "),"g"),a!=fn&&r.refresh()}),n("specialCharPlaceholder",Rc,function(r){return r.refresh()},!0),n("electricChars",!0),n("inputStyle",E?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),n("spellcheck",!1,function(r,i){return r.getInputField().spellcheck=i},!0),n("autocorrect",!1,function(r,i){return r.getInputField().autocorrect=i},!0),n("autocapitalize",!1,function(r,i){return r.getInputField().autocapitalize=i},!0),n("rtlMoveVisually",!J),n("wholeLineUpdateBefore",!0),n("theme","default",function(r){es(r),In(r)},!0),n("keyMap","default",function(r,i,a){var l=Li(i),u=a!=fn&&Li(a);u&&u.detach&&u.detach(r,l),l.attach&&l.attach(r,u||null)}),n("extraKeys",null),n("configureMouse",null),n("lineWrapping",!1,gd,!0),n("gutters",[],function(r,i){r.display.gutterSpecs=Ao(i,r.options.lineNumbers),In(r)},!0),n("fixedGutter",!0,function(r,i){r.display.gutters.style.left=i?yo(r.display)+"px":"0",r.refresh()},!0),n("coverGutterNextToScrollbar",!1,function(r){return rn(r)},!0),n("scrollbarStyle","native",function(r){nl(r),rn(r),r.display.scrollbars.setScrollTop(r.doc.scrollTop),r.display.scrollbars.setScrollLeft(r.doc.scrollLeft)},!0),n("lineNumbers",!1,function(r,i){r.display.gutterSpecs=Ao(r.options.gutters,i),In(r)},!0),n("firstLineNumber",1,In,!0),n("lineNumberFormatter",function(r){return r},In,!0),n("showCursorWhenSelecting",!1,zn,!0),n("resetSelectionOnContextMenu",!0),n("lineWiseCopyCut",!0),n("pasteLinesPerSelection",!0),n("selectionsMayTouch",!1),n("readOnly",!1,function(r,i){i=="nocursor"&&(en(r),r.display.input.blur()),r.display.input.readOnlyChanged(i)}),n("screenReaderLabel",null,function(r,i){i=i===""?null:i,r.display.input.screenReaderLabelChanged(i)}),n("disableInput",!1,function(r,i){i||r.display.input.reset()},!0),n("dragDrop",!0,hd),n("allowDropFileTypes",null),n("cursorBlinkRate",530),n("cursorScrollMargin",0),n("cursorHeight",1,zn,!0),n("singleCursorHeightPerLine",!0,zn,!0),n("workTime",100),n("workDelay",100),n("flattenSpans",!0,Nn,!0),n("addModeClass",!1,Nn,!0),n("pollInterval",100),n("undoDepth",200,function(r,i){return r.doc.history.undoDepth=i}),n("historyEventDelay",1250),n("viewportMargin",10,function(r){return r.refresh()},!0),n("maxHighlightLength",1e4,Nn,!0),n("moveInputWithCursor",!0,function(r,i){i||r.display.input.resetPosition()}),n("tabindex",null,function(r,i){return r.display.input.getField().tabIndex=i||""}),n("autofocus",null),n("direction","ltr",function(r,i){return r.doc.setDirection(i)},!0),n("phrases",null)}function hd(e,t,n){var r=n&&n!=fn;if(!t!=!r){var i=e.display.dragFunctions,a=t?Ie:_t;a(e.display.scroller,"dragstart",i.start),a(e.display.scroller,"dragenter",i.enter),a(e.display.scroller,"dragover",i.over),a(e.display.scroller,"dragleave",i.leave),a(e.display.scroller,"drop",i.drop)}}function gd(e){e.options.lineWrapping?(le(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(Q(e.display.wrapper,"CodeMirror-wrap"),so(e)),xo(e),zt(e),En(e),setTimeout(function(){return rn(e)},100)}function tt(e,t){var n=this;if(!(this instanceof tt))return new tt(e,t);this.options=t=t?ge(t):{},ge(ts,t,!1);var r=t.value;typeof r=="string"?r=new Mt(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new tt.inputStyles[t.inputStyle](this),a=this.display=new Ef(e,r,i,t);a.wrapper.CodeMirror=this,es(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),nl(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new qe,keySeq:null,specialChars:null},t.autofocus&&!E&&a.input.focus(),s&&h<11&&setTimeout(function(){return n.display.input.reset(!0)},20),md(this),Gf(),Fr(this),this.curOp.forceUpdate=!0,pl(this,r),t.autofocus&&!E||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&So(n)},20):en(this);for(var l in Ei)Ei.hasOwnProperty(l)&&Ei[l](this,t[l],fn);al(this),t.finishInit&&t.finishInit(this);for(var u=0;u400}Ie(t.scroller,"touchstart",function(f){if(!ot(e,f)&&!a(f)&&!Wo(e,f)){t.input.ensurePolled(),clearTimeout(n);var m=+new Date;t.activeTouch={start:m,moved:!1,prev:m-r.end<=300?r:null},f.touches.length==1&&(t.activeTouch.left=f.touches[0].pageX,t.activeTouch.top=f.touches[0].pageY)}}),Ie(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Ie(t.scroller,"touchend",function(f){var m=t.activeTouch;if(m&&!lr(t,f)&&m.left!=null&&!m.moved&&new Date-m.start<300){var A=e.coordsChar(t.activeTouch,"page"),B;!m.prev||l(m,m.prev)?B=new Ye(A,A):!m.prev.prev||l(m,m.prev.prev)?B=e.findWordAt(A):B=new Ye(ne(A.line,0),je(e.doc,ne(A.line+1,0))),e.setSelection(B.anchor,B.head),e.focus(),kt(f)}i()}),Ie(t.scroller,"touchcancel",i),Ie(t.scroller,"scroll",function(){t.scroller.clientHeight&&(An(e,t.scroller.scrollTop),Dr(e,t.scroller.scrollLeft,!0),it(e,"scroll",e))}),Ie(t.scroller,"mousewheel",function(f){return ul(e,f)}),Ie(t.scroller,"DOMMouseScroll",function(f){return ul(e,f)}),Ie(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(f){ot(e,f)||dr(f)},over:function(f){ot(e,f)||(Kf(e,f),dr(f))},start:function(f){return $f(e,f)},drop:gt(e,Uf),leave:function(f){ot(e,f)||Ol(e)}};var u=t.input.getField();Ie(u,"keyup",function(f){return Zl.call(e,f)}),Ie(u,"keydown",gt(e,Gl)),Ie(u,"keypress",gt(e,Xl)),Ie(u,"focus",function(f){return So(e,f)}),Ie(u,"blur",function(f){return en(e,f)})}var Uo=[];tt.defineInitHook=function(e){return Uo.push(e)};function Xn(e,t,n,r){var i=e.doc,a;n==null&&(n="add"),n=="smart"&&(i.mode.indent?a=wn(e,t).state:n="prev");var l=e.options.tabSize,u=Ae(i,t),f=Oe(u.text,null,l);u.stateAfter&&(u.stateAfter=null);var m=u.text.match(/^\s*/)[0],A;if(!r&&!/\S/.test(u.text))A=0,n="not";else if(n=="smart"&&(A=i.mode.indent(a,u.text.slice(m.length),u.text),A==Ze||A>150)){if(!r)return;n="prev"}n=="prev"?t>i.first?A=Oe(Ae(i,t-1).text,null,l):A=0:n=="add"?A=f+e.options.indentUnit:n=="subtract"?A=f-e.options.indentUnit:typeof n=="number"&&(A=f+n),A=Math.max(0,A);var B="",ee=0;if(e.options.indentWithTabs)for(var Y=Math.floor(A/l);Y;--Y)ee+=l,B+=" ";if(eel,f=Ht(t),m=null;if(u&&r.ranges.length>1)if(Qt&&Qt.text.join(` +`)==t){if(r.ranges.length%Qt.text.length==0){m=[];for(var A=0;A=0;ee--){var Y=r.ranges[ee],ie=Y.from(),ue=Y.to();Y.empty()&&(n&&n>0?ie=ne(ie.line,ie.ch-n):e.state.overwrite&&!u?ue=ne(ue.line,Math.min(Ae(a,ue.line).text.length,ue.ch+ce(f).length)):u&&Qt&&Qt.lineWise&&Qt.text.join(` `)==f.join(` -`)&&(ie=ue=ne(ie.line,0)));var me={from:ie,to:ue,text:m?m[J%m.length]:f,origin:i||(u?"paste":e.state.cutIncoming>l?"cut":"+input")};an(e.doc,me),ht(e,"inputRead",e,me)}t&&!u&&ns(e,t),tn(e),e.curOp.updateInput<2&&(e.curOp.updateInput=P),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function rs(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),!t.isReadOnly()&&!t.options.disableInput&&t.hasFocus()&&Nt(t,function(){return $o(t,n,0,null,"paste")}),!0}function ns(e,t){if(!(!e.options.electricChars||!e.options.smartIndent))for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var a=e.getModeAt(i.head),l=!1;if(a.electricChars){for(var u=0;u-1){l=Xn(e,i.head.line,"smart");break}}else a.electricInput&&a.electricInput.test(Ae(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Xn(e,i.head.line,"smart"));l&&ht(e,"electricInput",e,i.head.line)}}}function is(e){for(var t=[],n=[],r=0;ra&&(Xn(this,u.head.line,r,!0),a=u.head.line,l==this.doc.sel.primIndex&&tn(this));else{var f=u.from(),m=u.to(),A=Math.max(a,f.line);a=Math.min(this.lastLine(),m.line-(m.ch?0:1))+1;for(var P=A;P0&&Oo(this.doc,l,new Ye(f,J[l].to()),ke)}}}),getTokenAt:function(r,i){return ga(this,r,i)},getLineTokens:function(r,i){return ga(this,ne(r),i,!0)},getTokenTypeAt:function(r){r=Re(this.doc,r);var i=da(this,Ae(this.doc,r.line)),a=0,l=(i.length-1)/2,u=r.ch,f;if(u==0)f=i[2];else for(;;){var m=a+l>>1;if((m?i[m*2-1]:0)>=u)l=m;else if(i[m*2+1]f&&(r=f,l=!0),u=Ae(this.doc,r)}else u=r;return ci(this,u,{top:0,left:0},i||"page",a||l).top+(l?this.doc.height-ar(u):0)},defaultTextHeight:function(){return Vr(this.display)},defaultCharWidth:function(){return Jr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(r,i,a,l,u){var f=this.display;r=Xt(this,Re(this.doc,r));var m=r.bottom,A=r.left;if(i.style.position="absolute",i.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(i),f.sizer.appendChild(i),l=="over")m=r.top;else if(l=="above"||l=="near"){var P=Math.max(f.wrapper.clientHeight,this.doc.height),J=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);(l=="above"||r.bottom+i.offsetHeight>P)&&r.top>i.offsetHeight?m=r.top-i.offsetHeight:r.bottom+i.offsetHeight<=P&&(m=r.bottom),A+i.offsetWidth>J&&(A=J-i.offsetWidth)}i.style.top=m+"px",i.style.left=i.style.right="",u=="right"?(A=f.sizer.clientWidth-i.offsetWidth,i.style.right="0px"):(u=="left"?A=0:u=="middle"&&(A=(f.sizer.clientWidth-i.offsetWidth)/2),i.style.left=A+"px"),a&&hf(this,{left:A,top:m,right:A+i.offsetWidth,bottom:m+i.offsetHeight})},triggerOnKeyDown:Tt(Gl),triggerOnKeyPress:Tt(Xl),triggerOnKeyUp:Zl,triggerOnMouseDown:Tt(Yl),execCommand:function(r){if($n.hasOwnProperty(r))return $n[r].call(null,this)},triggerElectric:Tt(function(r){ns(this,r)}),findPosH:function(r,i,a,l){var u=1;i<0&&(u=-1,i=-i);for(var f=Re(this.doc,r),m=0;m0&&A(a.charAt(l-1));)--l;for(;u.5||this.options.lineWrapping)&&xo(this),it(this,"refresh",this)}),swapDoc:Tt(function(r){var i=this.doc;return i.cm=null,this.state.selectingText&&this.state.selectingText(),pl(this,r),En(this),this.display.input.reset(),Mn(this,r.scrollLeft,r.scrollTop),this.curOp.forceScroll=!0,ht(this,"swapDoc",this,i),i}),phrase:function(r){var i=this.options.phrases;return i&&Object.prototype.hasOwnProperty.call(i,r)?i[r]:r},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Wt(e),e.registerHelper=function(r,i,a){n.hasOwnProperty(r)||(n[r]=e[r]={_global:[]}),n[r][i]=a},e.registerGlobalHelper=function(r,i,a,l){e.registerHelper(r,i,l),n[r]._global.push({pred:a,val:l})}}function Go(e,t,n,r,i){var a=t,l=n,u=Ae(e,t.line),f=i&&e.direction=="rtl"?-n:n;function m(){var _e=t.line+f;return _e=e.first+e.size?!1:(t=new ne(_e,t.ch,t.sticky),u=Ae(e,_e))}function A(_e){var be;if(r=="codepoint"){var Ce=u.text.charCodeAt(t.ch+(n>0?0:-1));if(isNaN(Ce))be=null;else{var Ne=n>0?Ce>=55296&&Ce<56320:Ce>=56320&&Ce<57343;be=new ne(t.line,Math.max(0,Math.min(u.text.length,t.ch+n*(Ne?2:1))),-n)}}else i?be=Vf(e.cm,u,t,n):be=jo(u,t,n);if(be==null)if(!_e&&m())t=Ro(i,e.cm,u,t.line,f);else return!1;else t=be;return!0}if(r=="char"||r=="codepoint")A();else if(r=="column")A(!0);else if(r=="word"||r=="group")for(var P=null,J=r=="group",Y=e.cm&&e.cm.getHelper(t,"wordChars"),ie=!0;!(n<0&&!A(!ie));ie=!1){var ue=u.text.charAt(t.ch)||` -`,me=Me(ue,Y)?"w":J&&ue==` -`?"n":!J||/\s/.test(ue)?null:"p";if(J&&!ie&&!me&&(me="s"),P&&P!=me){n<0&&(n=1,A(),t.sticky="after");break}if(me&&(P=me),n>0&&!A(!ie))break}var ve=wi(e,t,a,l,!0);return Xe(a,ve)&&(ve.hitSide=!0),ve}function as(e,t,n,r){var i=e.doc,a=t.left,l;if(r=="page"){var u=Math.min(e.display.wrapper.clientHeight,pe(e).innerHeight||i(e).documentElement.clientHeight),f=Math.max(u-.5*Vr(e.display),3);l=(n>0?t.bottom:t.top)+n*f}else r=="line"&&(l=n>0?t.bottom+3:t.top-3);for(var m;m=mo(e,a,l),!!m.outside;){if(n<0?l<=0:l>=i.height){m.hitSide=!0;break}l+=n*5}return m}var Qe=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new qe,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};Qe.prototype.init=function(e){var t=this,n=this,r=n.cm,i=n.div=e.lineDiv;i.contentEditable=!0,Ko(i,r.options.spellcheck,r.options.autocorrect,r.options.autocapitalize);function a(u){for(var f=u.target;f;f=f.parentNode){if(f==i)return!0;if(/\bCodeMirror-(?:line)?widget\b/.test(f.className))break}return!1}Fe(i,"paste",function(u){!a(u)||ot(r,u)||rs(u,r)||h<=11&&setTimeout(gt(r,function(){return t.updateFromDOM()}),20)}),Fe(i,"compositionstart",function(u){t.composing={data:u.data,done:!1}}),Fe(i,"compositionupdate",function(u){t.composing||(t.composing={data:u.data,done:!1})}),Fe(i,"compositionend",function(u){t.composing&&(u.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Fe(i,"touchstart",function(){return n.forceCompositionEnd()}),Fe(i,"input",function(){t.composing||t.readFromDOMSoon()});function l(u){if(!(!a(u)||ot(r,u))){if(r.somethingSelected())zi({lineWise:!1,text:r.getSelections()}),u.type=="cut"&&r.replaceSelection("",null,"cut");else if(r.options.lineWiseCopyCut){var f=is(r);zi({lineWise:!0,text:f.text}),u.type=="cut"&&r.operation(function(){r.setSelections(f.ranges,0,ke),r.replaceSelection("",null,"cut")})}else return;if(u.clipboardData){u.clipboardData.clearData();var m=Qt.text.join(` -`);if(u.clipboardData.setData("Text",m),u.clipboardData.getData("Text")==m){u.preventDefault();return}}var A=os(),P=A.firstChild;Ko(P),r.display.lineSpace.insertBefore(A,r.display.lineSpace.firstChild),P.value=Qt.text.join(` -`);var J=B(ze(i));q(P),setTimeout(function(){r.display.lineSpace.removeChild(A),J.focus(),J==i&&n.showPrimarySelection()},50)}}Fe(i,"copy",l),Fe(i,"cut",l)},Qe.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Qe.prototype.prepareSelection=function(){var e=Ya(this.cm,!1);return e.focus=B(ze(this.div))==this.div,e},Qe.prototype.showSelection=function(e,t){!e||!this.cm.display.view.length||((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Qe.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Qe.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line=t.display.viewFrom&&ls(t,r)||{node:u[0].measure.map[2],offset:0},m=i.linee.firstLine()&&(r=ne(r.line-1,Ae(e.doc,r.line-1).length)),i.ch==Ae(e.doc,i.line).text.length&&i.linet.viewTo-1)return!1;var a,l,u;r.line==t.viewFrom||(a=Ar(e,r.line))==0?(l=k(t.view[0].line),u=t.view[0].node):(l=k(t.view[a].line),u=t.view[a-1].node.nextSibling);var f=Ar(e,i.line),m,A;if(f==t.view.length-1?(m=t.viewTo-1,A=t.lineDiv.lastChild):(m=k(t.view[f+1].line)-1,A=t.view[f+1].node.previousSibling),!u)return!1;for(var P=e.doc.splitLines(yd(e,u,A,l,m)),J=ir(e.doc,ne(l,0),ne(m,Ae(e.doc,m).text.length));P.length>1&&J.length>1;)if(ce(P)==ce(J))P.pop(),J.pop(),m--;else if(P[0]==J[0])P.shift(),J.shift(),l++;else break;for(var Y=0,ie=0,ue=P[0],me=J[0],ve=Math.min(ue.length,me.length);Yr.ch&&_e.charCodeAt(_e.length-ie-1)==be.charCodeAt(be.length-ie-1);)Y--,ie++;P[P.length-1]=_e.slice(0,_e.length-ie).replace(/^\u200b+/,""),P[0]=P[0].slice(Y).replace(/\u200b+$/,"");var Ne=ne(l,Y),Ie=ne(m,J.length?ce(J).length-ie:0);if(P.length>1||P[0]||ye(Ne,Ie))return ln(e.doc,P,Ne,Ie,"+input"),!0},Qe.prototype.ensurePolled=function(){this.forceCompositionEnd()},Qe.prototype.reset=function(){this.forceCompositionEnd()},Qe.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Qe.prototype.readFromDOMSoon=function(){var e=this;this.readDOMTimeout==null&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing)if(e.composing.done)e.composing=null;else return;e.updateFromDOM()},80))},Qe.prototype.updateFromDOM=function(){var e=this;(this.cm.isReadOnly()||!this.pollContent())&&Nt(this.cm,function(){return zt(e.cm)})},Qe.prototype.setUneditable=function(e){e.contentEditable="false"},Qe.prototype.onKeyPress=function(e){e.charCode==0||this.composing||(e.preventDefault(),this.cm.isReadOnly()||gt(this.cm,$o)(this.cm,String.fromCharCode(e.charCode==null?e.keyCode:e.charCode),0))},Qe.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(e!="nocursor")},Qe.prototype.onContextMenu=function(){},Qe.prototype.resetPosition=function(){},Qe.prototype.needsContentAttribute=!0;function ls(e,t){var n=po(e,t.line);if(!n||n.hidden)return null;var r=Ae(e.doc,t.line),i=Na(n,r,t.line),a=Pe(r,e.doc.direction),l="left";if(a){var u=Pt(a,t.ch);l=u%2?"right":"left"}var f=ja(i.map,t.ch,l);return f.offset=f.collapse=="right"?f.end:f.start,f}function bd(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}function dn(e,t){return t&&(e.bad=!0),e}function yd(e,t,n,r,i){var a="",l=!1,u=e.doc.lineSeparator(),f=!1;function m(Y){return function(ie){return ie.id==Y}}function A(){l&&(a+=u,f&&(a+=u),l=f=!1)}function P(Y){Y&&(A(),a+=Y)}function J(Y){if(Y.nodeType==1){var ie=Y.getAttribute("cm-text");if(ie){P(ie);return}var ue=Y.getAttribute("cm-marker"),me;if(ue){var ve=e.findMarks(ne(r,0),ne(i+1,0),m(+ue));ve.length&&(me=ve[0].find(0))&&P(ir(e.doc,me.from,me.to).join(u));return}if(Y.getAttribute("contenteditable")=="false")return;var _e=/^(pre|div|p|li|table|br)$/i.test(Y.nodeName);if(!/^br$/i.test(Y.nodeName)&&Y.textContent.length==0)return;_e&&A();for(var be=0;be=9&&t.hasSelection&&(t.hasSelection=null),n.poll()}),Fe(i,"paste",function(l){ot(r,l)||rs(l,r)||(r.state.pasteIncoming=+new Date,n.fastPoll())});function a(l){if(!ot(r,l)){if(r.somethingSelected())zi({lineWise:!1,text:r.getSelections()});else if(r.options.lineWiseCopyCut){var u=is(r);zi({lineWise:!0,text:u.text}),l.type=="cut"?r.setSelections(u.ranges,null,ke):(n.prevInput="",i.value=u.text.join(` -`),q(i))}else return;l.type=="cut"&&(r.state.cutIncoming=+new Date)}}Fe(i,"cut",a),Fe(i,"copy",a),Fe(e.scroller,"paste",function(l){if(!(lr(e,l)||ot(r,l))){if(!i.dispatchEvent){r.state.pasteIncoming=+new Date,n.focus();return}var u=new Event("paste");u.clipboardData=l.clipboardData,i.dispatchEvent(u)}}),Fe(e.lineSpace,"selectstart",function(l){lr(e,l)||kt(l)}),Fe(i,"compositionstart",function(){var l=r.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:l,range:r.markText(l,r.getCursor("to"),{className:"CodeMirror-composing"})}}),Fe(i,"compositionend",function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)})},st.prototype.createField=function(e){this.wrapper=os(),this.textarea=this.wrapper.firstChild;var t=this.cm.options;Ko(this.textarea,t.spellcheck,t.autocorrect,t.autocapitalize)},st.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},st.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,r=Ya(e);if(e.options.moveInputWithCursor){var i=Xt(e,n.sel.primary().head,"div"),a=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-a.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-a.left))}return r},st.prototype.showSelection=function(e){var t=this.cm,n=t.display;V(n.cursorDiv,e.cursors),V(n.selectionDiv,e.selection),e.teTop!=null&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},st.prototype.reset=function(e){if(!(this.contextMenuPending||this.composing&&e)){var t=this.cm;if(this.resetting=!0,t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&q(this.textarea),s&&h>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",s&&h>=9&&(this.hasSelection=null));this.resetting=!1}},st.prototype.getField=function(){return this.textarea},st.prototype.supportsTouch=function(){return!1},st.prototype.focus=function(){if(this.cm.options.readOnly!="nocursor"&&(!M||B(ze(this.textarea))!=this.textarea))try{this.textarea.focus()}catch{}},st.prototype.blur=function(){this.textarea.blur()},st.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},st.prototype.receivedFocus=function(){this.slowPoll()},st.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},st.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0;function n(){var r=t.poll();!r&&!e?(e=!0,t.polling.set(60,n)):(t.pollingFast=!1,t.slowPoll())}t.polling.set(20,n)},st.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||this.resetting||!t.state.focused||hr(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(s&&h>=9&&this.hasSelection===i||H&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var a=i.charCodeAt(0);if(a==8203&&!r&&(r="\u200B"),a==8666)return this.reset(),this.cm.execCommand("undo")}for(var l=0,u=Math.min(r.length,i.length);l1e3||i.indexOf(` +`)&&(ie=ue=ne(ie.line,0)));var me={from:ie,to:ue,text:m?m[ee%m.length]:f,origin:i||(u?"paste":e.state.cutIncoming>l?"cut":"+input")};an(e.doc,me),ht(e,"inputRead",e,me)}t&&!u&&ns(e,t),tn(e),e.curOp.updateInput<2&&(e.curOp.updateInput=B),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function rs(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),!t.isReadOnly()&&!t.options.disableInput&&t.hasFocus()&&Nt(t,function(){return $o(t,n,0,null,"paste")}),!0}function ns(e,t){if(!(!e.options.electricChars||!e.options.smartIndent))for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var a=e.getModeAt(i.head),l=!1;if(a.electricChars){for(var u=0;u-1){l=Xn(e,i.head.line,"smart");break}}else a.electricInput&&a.electricInput.test(Ae(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Xn(e,i.head.line,"smart"));l&&ht(e,"electricInput",e,i.head.line)}}}function is(e){for(var t=[],n=[],r=0;ra&&(Xn(this,u.head.line,r,!0),a=u.head.line,l==this.doc.sel.primIndex&&tn(this));else{var f=u.from(),m=u.to(),A=Math.max(a,f.line);a=Math.min(this.lastLine(),m.line-(m.ch?0:1))+1;for(var B=A;B0&&Oo(this.doc,l,new Ye(f,ee[l].to()),ke)}}}),getTokenAt:function(r,i){return ga(this,r,i)},getLineTokens:function(r,i){return ga(this,ne(r),i,!0)},getTokenTypeAt:function(r){r=je(this.doc,r);var i=da(this,Ae(this.doc,r.line)),a=0,l=(i.length-1)/2,u=r.ch,f;if(u==0)f=i[2];else for(;;){var m=a+l>>1;if((m?i[m*2-1]:0)>=u)l=m;else if(i[m*2+1]f&&(r=f,l=!0),u=Ae(this.doc,r)}else u=r;return ci(this,u,{top:0,left:0},i||"page",a||l).top+(l?this.doc.height-ar(u):0)},defaultTextHeight:function(){return Vr(this.display)},defaultCharWidth:function(){return Jr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(r,i,a,l,u){var f=this.display;r=Xt(this,je(this.doc,r));var m=r.bottom,A=r.left;if(i.style.position="absolute",i.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(i),f.sizer.appendChild(i),l=="over")m=r.top;else if(l=="above"||l=="near"){var B=Math.max(f.wrapper.clientHeight,this.doc.height),ee=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);(l=="above"||r.bottom+i.offsetHeight>B)&&r.top>i.offsetHeight?m=r.top-i.offsetHeight:r.bottom+i.offsetHeight<=B&&(m=r.bottom),A+i.offsetWidth>ee&&(A=ee-i.offsetWidth)}i.style.top=m+"px",i.style.left=i.style.right="",u=="right"?(A=f.sizer.clientWidth-i.offsetWidth,i.style.right="0px"):(u=="left"?A=0:u=="middle"&&(A=(f.sizer.clientWidth-i.offsetWidth)/2),i.style.left=A+"px"),a&&hf(this,{left:A,top:m,right:A+i.offsetWidth,bottom:m+i.offsetHeight})},triggerOnKeyDown:Tt(Gl),triggerOnKeyPress:Tt(Xl),triggerOnKeyUp:Zl,triggerOnMouseDown:Tt(Yl),execCommand:function(r){if($n.hasOwnProperty(r))return $n[r].call(null,this)},triggerElectric:Tt(function(r){ns(this,r)}),findPosH:function(r,i,a,l){var u=1;i<0&&(u=-1,i=-i);for(var f=je(this.doc,r),m=0;m0&&A(a.charAt(l-1));)--l;for(;u.5||this.options.lineWrapping)&&xo(this),it(this,"refresh",this)}),swapDoc:Tt(function(r){var i=this.doc;return i.cm=null,this.state.selectingText&&this.state.selectingText(),pl(this,r),En(this),this.display.input.reset(),Mn(this,r.scrollLeft,r.scrollTop),this.curOp.forceScroll=!0,ht(this,"swapDoc",this,i),i}),phrase:function(r){var i=this.options.phrases;return i&&Object.prototype.hasOwnProperty.call(i,r)?i[r]:r},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Wt(e),e.registerHelper=function(r,i,a){n.hasOwnProperty(r)||(n[r]=e[r]={_global:[]}),n[r][i]=a},e.registerGlobalHelper=function(r,i,a,l){e.registerHelper(r,i,l),n[r]._global.push({pred:a,val:l})}}function Go(e,t,n,r,i){var a=t,l=n,u=Ae(e,t.line),f=i&&e.direction=="rtl"?-n:n;function m(){var _e=t.line+f;return _e=e.first+e.size?!1:(t=new ne(_e,t.ch,t.sticky),u=Ae(e,_e))}function A(_e){var be;if(r=="codepoint"){var Ce=u.text.charCodeAt(t.ch+(n>0?0:-1));if(isNaN(Ce))be=null;else{var Ne=n>0?Ce>=55296&&Ce<56320:Ce>=56320&&Ce<57343;be=new ne(t.line,Math.max(0,Math.min(u.text.length,t.ch+n*(Ne?2:1))),-n)}}else i?be=Vf(e.cm,u,t,n):be=Bo(u,t,n);if(be==null)if(!_e&&m())t=jo(i,e.cm,u,t.line,f);else return!1;else t=be;return!0}if(r=="char"||r=="codepoint")A();else if(r=="column")A(!0);else if(r=="word"||r=="group")for(var B=null,ee=r=="group",Y=e.cm&&e.cm.getHelper(t,"wordChars"),ie=!0;!(n<0&&!A(!ie));ie=!1){var ue=u.text.charAt(t.ch)||` +`,me=Me(ue,Y)?"w":ee&&ue==` +`?"n":!ee||/\s/.test(ue)?null:"p";if(ee&&!ie&&!me&&(me="s"),B&&B!=me){n<0&&(n=1,A(),t.sticky="after");break}if(me&&(B=me),n>0&&!A(!ie))break}var ve=wi(e,t,a,l,!0);return Xe(a,ve)&&(ve.hitSide=!0),ve}function as(e,t,n,r){var i=e.doc,a=t.left,l;if(r=="page"){var u=Math.min(e.display.wrapper.clientHeight,pe(e).innerHeight||i(e).documentElement.clientHeight),f=Math.max(u-.5*Vr(e.display),3);l=(n>0?t.bottom:t.top)+n*f}else r=="line"&&(l=n>0?t.bottom+3:t.top-3);for(var m;m=mo(e,a,l),!!m.outside;){if(n<0?l<=0:l>=i.height){m.hitSide=!0;break}l+=n*5}return m}var Qe=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new qe,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};Qe.prototype.init=function(e){var t=this,n=this,r=n.cm,i=n.div=e.lineDiv;i.contentEditable=!0,Ko(i,r.options.spellcheck,r.options.autocorrect,r.options.autocapitalize);function a(u){for(var f=u.target;f;f=f.parentNode){if(f==i)return!0;if(/\bCodeMirror-(?:line)?widget\b/.test(f.className))break}return!1}Ie(i,"paste",function(u){!a(u)||ot(r,u)||rs(u,r)||h<=11&&setTimeout(gt(r,function(){return t.updateFromDOM()}),20)}),Ie(i,"compositionstart",function(u){t.composing={data:u.data,done:!1}}),Ie(i,"compositionupdate",function(u){t.composing||(t.composing={data:u.data,done:!1})}),Ie(i,"compositionend",function(u){t.composing&&(u.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Ie(i,"touchstart",function(){return n.forceCompositionEnd()}),Ie(i,"input",function(){t.composing||t.readFromDOMSoon()});function l(u){if(!(!a(u)||ot(r,u))){if(r.somethingSelected())zi({lineWise:!1,text:r.getSelections()}),u.type=="cut"&&r.replaceSelection("",null,"cut");else if(r.options.lineWiseCopyCut){var f=is(r);zi({lineWise:!0,text:f.text}),u.type=="cut"&&r.operation(function(){r.setSelections(f.ranges,0,ke),r.replaceSelection("",null,"cut")})}else return;if(u.clipboardData){u.clipboardData.clearData();var m=Qt.text.join(` +`);if(u.clipboardData.setData("Text",m),u.clipboardData.getData("Text")==m){u.preventDefault();return}}var A=os(),B=A.firstChild;Ko(B),r.display.lineSpace.insertBefore(A,r.display.lineSpace.firstChild),B.value=Qt.text.join(` +`);var ee=R(ze(i));F(B),setTimeout(function(){r.display.lineSpace.removeChild(A),ee.focus(),ee==i&&n.showPrimarySelection()},50)}}Ie(i,"copy",l),Ie(i,"cut",l)},Qe.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Qe.prototype.prepareSelection=function(){var e=Ya(this.cm,!1);return e.focus=R(ze(this.div))==this.div,e},Qe.prototype.showSelection=function(e,t){!e||!this.cm.display.view.length||((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Qe.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Qe.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line=t.display.viewFrom&&ls(t,r)||{node:u[0].measure.map[2],offset:0},m=i.linee.firstLine()&&(r=ne(r.line-1,Ae(e.doc,r.line-1).length)),i.ch==Ae(e.doc,i.line).text.length&&i.linet.viewTo-1)return!1;var a,l,u;r.line==t.viewFrom||(a=Ar(e,r.line))==0?(l=x(t.view[0].line),u=t.view[0].node):(l=x(t.view[a].line),u=t.view[a-1].node.nextSibling);var f=Ar(e,i.line),m,A;if(f==t.view.length-1?(m=t.viewTo-1,A=t.lineDiv.lastChild):(m=x(t.view[f+1].line)-1,A=t.view[f+1].node.previousSibling),!u)return!1;for(var B=e.doc.splitLines(yd(e,u,A,l,m)),ee=ir(e.doc,ne(l,0),ne(m,Ae(e.doc,m).text.length));B.length>1&&ee.length>1;)if(ce(B)==ce(ee))B.pop(),ee.pop(),m--;else if(B[0]==ee[0])B.shift(),ee.shift(),l++;else break;for(var Y=0,ie=0,ue=B[0],me=ee[0],ve=Math.min(ue.length,me.length);Yr.ch&&_e.charCodeAt(_e.length-ie-1)==be.charCodeAt(be.length-ie-1);)Y--,ie++;B[B.length-1]=_e.slice(0,_e.length-ie).replace(/^\u200b+/,""),B[0]=B[0].slice(Y).replace(/\u200b+$/,"");var Ne=ne(l,Y),Fe=ne(m,ee.length?ce(ee).length-ie:0);if(B.length>1||B[0]||ye(Ne,Fe))return ln(e.doc,B,Ne,Fe,"+input"),!0},Qe.prototype.ensurePolled=function(){this.forceCompositionEnd()},Qe.prototype.reset=function(){this.forceCompositionEnd()},Qe.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Qe.prototype.readFromDOMSoon=function(){var e=this;this.readDOMTimeout==null&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing)if(e.composing.done)e.composing=null;else return;e.updateFromDOM()},80))},Qe.prototype.updateFromDOM=function(){var e=this;(this.cm.isReadOnly()||!this.pollContent())&&Nt(this.cm,function(){return zt(e.cm)})},Qe.prototype.setUneditable=function(e){e.contentEditable="false"},Qe.prototype.onKeyPress=function(e){e.charCode==0||this.composing||(e.preventDefault(),this.cm.isReadOnly()||gt(this.cm,$o)(this.cm,String.fromCharCode(e.charCode==null?e.keyCode:e.charCode),0))},Qe.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(e!="nocursor")},Qe.prototype.onContextMenu=function(){},Qe.prototype.resetPosition=function(){},Qe.prototype.needsContentAttribute=!0;function ls(e,t){var n=po(e,t.line);if(!n||n.hidden)return null;var r=Ae(e.doc,t.line),i=Na(n,r,t.line),a=Pe(r,e.doc.direction),l="left";if(a){var u=Pt(a,t.ch);l=u%2?"right":"left"}var f=Ba(i.map,t.ch,l);return f.offset=f.collapse=="right"?f.end:f.start,f}function bd(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}function dn(e,t){return t&&(e.bad=!0),e}function yd(e,t,n,r,i){var a="",l=!1,u=e.doc.lineSeparator(),f=!1;function m(Y){return function(ie){return ie.id==Y}}function A(){l&&(a+=u,f&&(a+=u),l=f=!1)}function B(Y){Y&&(A(),a+=Y)}function ee(Y){if(Y.nodeType==1){var ie=Y.getAttribute("cm-text");if(ie){B(ie);return}var ue=Y.getAttribute("cm-marker"),me;if(ue){var ve=e.findMarks(ne(r,0),ne(i+1,0),m(+ue));ve.length&&(me=ve[0].find(0))&&B(ir(e.doc,me.from,me.to).join(u));return}if(Y.getAttribute("contenteditable")=="false")return;var _e=/^(pre|div|p|li|table|br)$/i.test(Y.nodeName);if(!/^br$/i.test(Y.nodeName)&&Y.textContent.length==0)return;_e&&A();for(var be=0;be=9&&t.hasSelection&&(t.hasSelection=null),n.poll()}),Ie(i,"paste",function(l){ot(r,l)||rs(l,r)||(r.state.pasteIncoming=+new Date,n.fastPoll())});function a(l){if(!ot(r,l)){if(r.somethingSelected())zi({lineWise:!1,text:r.getSelections()});else if(r.options.lineWiseCopyCut){var u=is(r);zi({lineWise:!0,text:u.text}),l.type=="cut"?r.setSelections(u.ranges,null,ke):(n.prevInput="",i.value=u.text.join(` +`),F(i))}else return;l.type=="cut"&&(r.state.cutIncoming=+new Date)}}Ie(i,"cut",a),Ie(i,"copy",a),Ie(e.scroller,"paste",function(l){if(!(lr(e,l)||ot(r,l))){if(!i.dispatchEvent){r.state.pasteIncoming=+new Date,n.focus();return}var u=new Event("paste");u.clipboardData=l.clipboardData,i.dispatchEvent(u)}}),Ie(e.lineSpace,"selectstart",function(l){lr(e,l)||kt(l)}),Ie(i,"compositionstart",function(){var l=r.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:l,range:r.markText(l,r.getCursor("to"),{className:"CodeMirror-composing"})}}),Ie(i,"compositionend",function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)})},st.prototype.createField=function(e){this.wrapper=os(),this.textarea=this.wrapper.firstChild;var t=this.cm.options;Ko(this.textarea,t.spellcheck,t.autocorrect,t.autocapitalize)},st.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},st.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,r=Ya(e);if(e.options.moveInputWithCursor){var i=Xt(e,n.sel.primary().head,"div"),a=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-a.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-a.left))}return r},st.prototype.showSelection=function(e){var t=this.cm,n=t.display;V(n.cursorDiv,e.cursors),V(n.selectionDiv,e.selection),e.teTop!=null&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},st.prototype.reset=function(e){if(!(this.contextMenuPending||this.composing&&e)){var t=this.cm;if(this.resetting=!0,t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&F(this.textarea),s&&h>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",s&&h>=9&&(this.hasSelection=null));this.resetting=!1}},st.prototype.getField=function(){return this.textarea},st.prototype.supportsTouch=function(){return!1},st.prototype.focus=function(){if(this.cm.options.readOnly!="nocursor"&&(!E||R(ze(this.textarea))!=this.textarea))try{this.textarea.focus()}catch{}},st.prototype.blur=function(){this.textarea.blur()},st.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},st.prototype.receivedFocus=function(){this.slowPoll()},st.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},st.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0;function n(){var r=t.poll();!r&&!e?(e=!0,t.polling.set(60,n)):(t.pollingFast=!1,t.slowPoll())}t.polling.set(20,n)},st.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||this.resetting||!t.state.focused||hr(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(s&&h>=9&&this.hasSelection===i||O&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var a=i.charCodeAt(0);if(a==8203&&!r&&(r="\u200B"),a==8666)return this.reset(),this.cm.execCommand("undo")}for(var l=0,u=Math.min(r.length,i.length);l1e3||i.indexOf(` `)>-1?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},st.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},st.prototype.onKeyPress=function(){s&&h>=9&&(this.hasSelection=null),this.fastPoll()},st.prototype.onContextMenu=function(e){var t=this,n=t.cm,r=n.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var a=Mr(n,e),l=r.scroller.scrollTop;if(!a||d)return;var u=n.options.resetSelectionOnContextMenu;u&&n.doc.sel.contains(a)==-1&>(n,wt)(n.doc,yr(a),ke);var f=i.style.cssText,m=t.wrapper.style.cssText,A=t.wrapper.offsetParent.getBoundingClientRect();t.wrapper.style.cssText="position: static",i.style.cssText=`position: absolute; width: 30px; height: 30px; top: `+(e.clientY-A.top-5)+"px; left: "+(e.clientX-A.left-5)+`px; z-index: 1000; background: `+(s?"rgba(255, 255, 255, .05)":"transparent")+`; - outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`;var P;g&&(P=i.ownerDocument.defaultView.scrollY),r.input.focus(),g&&i.ownerDocument.defaultView.scrollTo(null,P),r.input.reset(),n.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=Y,r.selForContextMenu=n.doc.sel,clearTimeout(r.detectingSelectAll);function J(){if(i.selectionStart!=null){var ue=n.somethingSelected(),me="\u200B"+(ue?i.value:"");i.value="\u21DA",i.value=me,t.prevInput=ue?"":"\u200B",i.selectionStart=1,i.selectionEnd=me.length,r.selForContextMenu=n.doc.sel}}function Y(){if(t.contextMenuPending==Y&&(t.contextMenuPending=!1,t.wrapper.style.cssText=m,i.style.cssText=f,s&&h<9&&r.scrollbars.setScrollTop(r.scroller.scrollTop=l),i.selectionStart!=null)){(!s||s&&h<9)&&J();var ue=0,me=function(){r.selForContextMenu==n.doc.sel&&i.selectionStart==0&&i.selectionEnd>0&&t.prevInput=="\u200B"?gt(n,Ll)(n):ue++<10?r.detectingSelectAll=setTimeout(me,500):(r.selForContextMenu=null,r.input.reset())};r.detectingSelectAll=setTimeout(me,200)}}if(s&&h>=9&&J(),F){dr(e);var ie=function(){_t(window,"mouseup",ie),setTimeout(Y,20)};Fe(window,"mouseup",ie)}else setTimeout(Y,50)},st.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=e=="nocursor",this.textarea.readOnly=!!e},st.prototype.setUneditable=function(){},st.prototype.needsContentAttribute=!1;function _d(e,t){if(t=t?ge(t):{},t.value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),t.autofocus==null){var n=B(ze(e));t.autofocus=n==e||e.getAttribute("autofocus")!=null&&n==document.body}function r(){e.value=u.getValue()}var i;if(e.form&&(Fe(e.form,"submit",r),!t.leaveSubmitMethodAlone)){var a=e.form;i=a.submit;try{var l=a.submit=function(){r(),a.submit=i,a.submit(),a.submit=l}}catch{}}t.finishInit=function(f){f.save=r,f.getTextArea=function(){return e},f.toTextArea=function(){f.toTextArea=isNaN,r(),e.parentNode.removeChild(f.getWrapperElement()),e.style.display="",e.form&&(_t(e.form,"submit",r),!t.leaveSubmitMethodAlone&&typeof e.form.submit=="function"&&(e.form.submit=i))}},e.style.display="none";var u=tt(function(f){return e.parentNode.insertBefore(f,e.nextSibling)},t);return u}function kd(e){e.off=_t,e.on=Fe,e.wheelEventPixels=zf,e.Doc=Mt,e.splitLines=Bt,e.countColumn=Oe,e.findColumn=Ge,e.isWordChar=we,e.Pass=Ze,e.signal=it,e.Line=Xr,e.changeEnd=xr,e.scrollbarModel=rl,e.Pos=ne,e.cmpPos=ye,e.modes=Wr,e.mimeModes=Kt,e.resolveMode=Ur,e.getMode=$r,e.modeExtensions=gr,e.extendMode=Kr,e.copyState=Vt,e.startState=Gr,e.innerMode=_n,e.commands=$n,e.keyMap=ur,e.keyName=Bl,e.isModifierKey=Rl,e.lookupKey=un,e.normalizeKeyMap=Qf,e.StringStream=at,e.SharedTextMarker=Bn,e.TextMarker=kr,e.LineWidget=Hn,e.e_preventDefault=kt,e.e_stopPropagation=Hr,e.e_stop=dr,e.addClass=le,e.contains=I,e.rmClass=Q,e.keyNames=wr}pd(tt),vd(tt);var wd="iter insert remove copy getEditor constructor".split(" ");for(var Ai in Mt.prototype)Mt.prototype.hasOwnProperty(Ai)&&Se(wd,Ai)<0&&(tt.prototype[Ai]=function(e){return function(){return e.apply(this.doc,arguments)}}(Mt.prototype[Ai]));return Wt(Mt),tt.inputStyles={textarea:st,contenteditable:Qe},tt.defineMode=function(e){!tt.defaults.mode&&e!="null"&&(tt.defaults.mode=e),Gt.apply(this,arguments)},tt.defineMIME=Cr,tt.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),tt.defineMIME("text/plain","null"),tt.defineExtension=function(e,t){tt.prototype[e]=t},tt.defineDocExtension=function(e,t){Mt.prototype[e]=t},tt.fromTextArea=_d,kd(tt),tt.version="5.65.18",tt})});var Yn=Ke((us,cs)=>{(function(o){typeof us=="object"&&typeof cs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.overlayMode=function(p,v,C){return{startState:function(){return{base:o.startState(p),overlay:o.startState(v),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(b){return{base:o.copyState(p,b.base),overlay:o.copyState(v,b.overlay),basePos:b.basePos,baseCur:null,overlayPos:b.overlayPos,overlayCur:null}},token:function(b,S){return(b!=S.streamSeen||Math.min(S.basePos,S.overlayPos){(function(o){typeof fs=="object"&&typeof ds=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p=/^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,v=/^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,C=/[*+-]\s/;o.commands.newlineAndIndentContinueMarkdownList=function(S){if(S.getOption("disableInput"))return o.Pass;for(var s=S.listSelections(),h=[],g=0;g\s*$/.test(E),M=!/>\s*$/.test(E);(R||M)&&S.replaceRange("",{line:T.line,ch:0},{line:T.line,ch:T.ch+1}),h[g]=` -`}else{var H=z[1],Z=z[5],ee=!(C.test(z[2])||z[2].indexOf(">")>=0),re=ee?parseInt(z[3],10)+1+z[4]:z[2].replace("x"," ");h[g]=` -`+H+re+Z,ee&&b(S,T)}}S.replaceSelections(h)};function b(S,s){var h=s.line,g=0,T=0,x=p.exec(S.getLine(h)),c=x[1];do{g+=1;var d=h+g,w=S.getLine(d),E=p.exec(w);if(E){var z=E[1],y=parseInt(x[3],10)+g-T,R=parseInt(E[3],10),M=R;if(c===z&&!isNaN(R))y===R&&(M=R+1),y>R&&(M=y+1),S.replaceRange(w.replace(p,z+M+E[4]+E[5]),{line:d,ch:0},{line:d,ch:w.length});else{if(c.length>z.length||c.length{(function(o){typeof hs=="object"&&typeof gs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){o.defineOption("placeholder","",function(h,g,T){var x=T&&T!=o.Init;if(g&&!x)h.on("blur",b),h.on("change",S),h.on("swapDoc",S),o.on(h.getInputField(),"compositionupdate",h.state.placeholderCompose=function(){C(h)}),S(h);else if(!g&&x){h.off("blur",b),h.off("change",S),h.off("swapDoc",S),o.off(h.getInputField(),"compositionupdate",h.state.placeholderCompose),p(h);var c=h.getWrapperElement();c.className=c.className.replace(" CodeMirror-empty","")}g&&!h.hasFocus()&&b(h)});function p(h){h.state.placeholder&&(h.state.placeholder.parentNode.removeChild(h.state.placeholder),h.state.placeholder=null)}function v(h){p(h);var g=h.state.placeholder=document.createElement("pre");g.style.cssText="height: 0; overflow: visible",g.style.direction=h.getOption("direction"),g.className="CodeMirror-placeholder CodeMirror-line-like";var T=h.getOption("placeholder");typeof T=="string"&&(T=document.createTextNode(T)),g.appendChild(T),h.display.lineSpace.insertBefore(g,h.display.lineSpace.firstChild)}function C(h){setTimeout(function(){var g=!1;if(h.lineCount()==1){var T=h.getInputField();g=T.nodeName=="TEXTAREA"?!h.getLine(0).length:!/[^\u200b]/.test(T.querySelector(".CodeMirror-line").textContent)}g?v(h):p(h)},20)}function b(h){s(h)&&v(h)}function S(h){var g=h.getWrapperElement(),T=s(h);g.className=g.className.replace(" CodeMirror-empty","")+(T?" CodeMirror-empty":""),T?v(h):p(h)}function s(h){return h.lineCount()===1&&h.getLine(0)===""}})});var ys=Ke((vs,bs)=>{(function(o){typeof vs=="object"&&typeof bs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineOption("styleSelectedText",!1,function(x,c,d){var w=d&&d!=o.Init;c&&!w?(x.state.markedSelection=[],x.state.markedSelectionStyle=typeof c=="string"?c:"CodeMirror-selectedtext",g(x),x.on("cursorActivity",p),x.on("change",v)):!c&&w&&(x.off("cursorActivity",p),x.off("change",v),h(x),x.state.markedSelection=x.state.markedSelectionStyle=null)});function p(x){x.state.markedSelection&&x.operation(function(){T(x)})}function v(x){x.state.markedSelection&&x.state.markedSelection.length&&x.operation(function(){h(x)})}var C=8,b=o.Pos,S=o.cmpPos;function s(x,c,d,w){if(S(c,d)!=0)for(var E=x.state.markedSelection,z=x.state.markedSelectionStyle,y=c.line;;){var R=y==c.line?c:b(y,0),M=y+C,H=M>=d.line,Z=H?d:b(M,0),ee=x.markText(R,Z,{className:z});if(w==null?E.push(ee):E.splice(w++,0,ee),H)break;y=M}}function h(x){for(var c=x.state.markedSelection,d=0;d1)return g(x);var c=x.getCursor("start"),d=x.getCursor("end"),w=x.state.markedSelection;if(!w.length)return s(x,c,d);var E=w[0].find(),z=w[w.length-1].find();if(!E||!z||d.line-c.line<=C||S(c,z.to)>=0||S(d,E.from)<=0)return g(x);for(;S(c,E.from)>0;)w.shift().clear(),E=w[0].find();for(S(c,E.from)<0&&(E.to.line-c.line0&&(d.line-z.from.line{(function(o){typeof xs=="object"&&typeof _s=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p=o.Pos;function v(y){var R=y.flags;return R??(y.ignoreCase?"i":"")+(y.global?"g":"")+(y.multiline?"m":"")}function C(y,R){for(var M=v(y),H=M,Z=0;Zre);N++){var F=y.getLine(ee++);H=H==null?F:H+` -`+F}Z=Z*2,R.lastIndex=M.ch;var D=R.exec(H);if(D){var Q=H.slice(0,D.index).split(` + outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`;var B;g&&(B=i.ownerDocument.defaultView.scrollY),r.input.focus(),g&&i.ownerDocument.defaultView.scrollTo(null,B),r.input.reset(),n.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=Y,r.selForContextMenu=n.doc.sel,clearTimeout(r.detectingSelectAll);function ee(){if(i.selectionStart!=null){var ue=n.somethingSelected(),me="\u200B"+(ue?i.value:"");i.value="\u21DA",i.value=me,t.prevInput=ue?"":"\u200B",i.selectionStart=1,i.selectionEnd=me.length,r.selForContextMenu=n.doc.sel}}function Y(){if(t.contextMenuPending==Y&&(t.contextMenuPending=!1,t.wrapper.style.cssText=m,i.style.cssText=f,s&&h<9&&r.scrollbars.setScrollTop(r.scroller.scrollTop=l),i.selectionStart!=null)){(!s||s&&h<9)&&ee();var ue=0,me=function(){r.selForContextMenu==n.doc.sel&&i.selectionStart==0&&i.selectionEnd>0&&t.prevInput=="\u200B"?gt(n,Ll)(n):ue++<10?r.detectingSelectAll=setTimeout(me,500):(r.selForContextMenu=null,r.input.reset())};r.detectingSelectAll=setTimeout(me,200)}}if(s&&h>=9&&ee(),I){dr(e);var ie=function(){_t(window,"mouseup",ie),setTimeout(Y,20)};Ie(window,"mouseup",ie)}else setTimeout(Y,50)},st.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=e=="nocursor",this.textarea.readOnly=!!e},st.prototype.setUneditable=function(){},st.prototype.needsContentAttribute=!1;function _d(e,t){if(t=t?ge(t):{},t.value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),t.autofocus==null){var n=R(ze(e));t.autofocus=n==e||e.getAttribute("autofocus")!=null&&n==document.body}function r(){e.value=u.getValue()}var i;if(e.form&&(Ie(e.form,"submit",r),!t.leaveSubmitMethodAlone)){var a=e.form;i=a.submit;try{var l=a.submit=function(){r(),a.submit=i,a.submit(),a.submit=l}}catch{}}t.finishInit=function(f){f.save=r,f.getTextArea=function(){return e},f.toTextArea=function(){f.toTextArea=isNaN,r(),e.parentNode.removeChild(f.getWrapperElement()),e.style.display="",e.form&&(_t(e.form,"submit",r),!t.leaveSubmitMethodAlone&&typeof e.form.submit=="function"&&(e.form.submit=i))}},e.style.display="none";var u=tt(function(f){return e.parentNode.insertBefore(f,e.nextSibling)},t);return u}function kd(e){e.off=_t,e.on=Ie,e.wheelEventPixels=zf,e.Doc=Mt,e.splitLines=Ht,e.countColumn=Oe,e.findColumn=Ge,e.isWordChar=we,e.Pass=Ze,e.signal=it,e.Line=Xr,e.changeEnd=xr,e.scrollbarModel=rl,e.Pos=ne,e.cmpPos=ye,e.modes=Wr,e.mimeModes=Kt,e.resolveMode=Ur,e.getMode=$r,e.modeExtensions=gr,e.extendMode=Kr,e.copyState=Vt,e.startState=Gr,e.innerMode=_n,e.commands=$n,e.keyMap=ur,e.keyName=Hl,e.isModifierKey=jl,e.lookupKey=un,e.normalizeKeyMap=Qf,e.StringStream=at,e.SharedTextMarker=Hn,e.TextMarker=kr,e.LineWidget=Rn,e.e_preventDefault=kt,e.e_stopPropagation=Rr,e.e_stop=dr,e.addClass=le,e.contains=N,e.rmClass=Q,e.keyNames=wr}pd(tt),vd(tt);var wd="iter insert remove copy getEditor constructor".split(" ");for(var Ai in Mt.prototype)Mt.prototype.hasOwnProperty(Ai)&&Se(wd,Ai)<0&&(tt.prototype[Ai]=(function(e){return function(){return e.apply(this.doc,arguments)}})(Mt.prototype[Ai]));return Wt(Mt),tt.inputStyles={textarea:st,contenteditable:Qe},tt.defineMode=function(e){!tt.defaults.mode&&e!="null"&&(tt.defaults.mode=e),Gt.apply(this,arguments)},tt.defineMIME=Cr,tt.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),tt.defineMIME("text/plain","null"),tt.defineExtension=function(e,t){tt.prototype[e]=t},tt.defineDocExtension=function(e,t){Mt.prototype[e]=t},tt.fromTextArea=_d,kd(tt),tt.version="5.65.20",tt}))});var Yn=Ke((us,cs)=>{(function(o){typeof us=="object"&&typeof cs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.overlayMode=function(p,v,C){return{startState:function(){return{base:o.startState(p),overlay:o.startState(v),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(b){return{base:o.copyState(p,b.base),overlay:o.copyState(v,b.overlay),basePos:b.basePos,baseCur:null,overlayPos:b.overlayPos,overlayCur:null}},token:function(b,S){return(b!=S.streamSeen||Math.min(S.basePos,S.overlayPos){(function(o){typeof fs=="object"&&typeof ds=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p=/^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,v=/^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,C=/[*+-]\s/;o.commands.newlineAndIndentContinueMarkdownList=function(S){if(S.getOption("disableInput"))return o.Pass;for(var s=S.listSelections(),h=[],g=0;g\s*$/.test(z),E=!/>\s*$/.test(z);(W||E)&&S.replaceRange("",{line:T.line,ch:0},{line:T.line,ch:T.ch+1}),h[g]=` +`}else{var O=M[1],G=M[5],J=!(C.test(M[2])||M[2].indexOf(">")>=0),re=J?parseInt(M[3],10)+1+M[4]:M[2].replace("x"," ");h[g]=` +`+O+re+G,J&&b(S,T)}}S.replaceSelections(h)};function b(S,s){var h=s.line,g=0,T=0,w=p.exec(S.getLine(h)),c=w[1];do{g+=1;var d=h+g,k=S.getLine(d),z=p.exec(k);if(z){var M=z[1],_=parseInt(w[3],10)+g-T,W=parseInt(z[3],10),E=W;if(c===M&&!isNaN(W))_===W&&(E=W+1),_>W&&(E=_+1),S.replaceRange(k.replace(p,M+E+z[4]+z[5]),{line:d,ch:0},{line:d,ch:k.length});else{if(c.length>M.length||c.length{(function(o){typeof hs=="object"&&typeof gs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){o.defineOption("placeholder","",function(h,g,T){var w=T&&T!=o.Init;if(g&&!w)h.on("blur",b),h.on("change",S),h.on("swapDoc",S),o.on(h.getInputField(),"compositionupdate",h.state.placeholderCompose=function(){C(h)}),S(h);else if(!g&&w){h.off("blur",b),h.off("change",S),h.off("swapDoc",S),o.off(h.getInputField(),"compositionupdate",h.state.placeholderCompose),p(h);var c=h.getWrapperElement();c.className=c.className.replace(" CodeMirror-empty","")}g&&!h.hasFocus()&&b(h)});function p(h){h.state.placeholder&&(h.state.placeholder.parentNode.removeChild(h.state.placeholder),h.state.placeholder=null)}function v(h){p(h);var g=h.state.placeholder=document.createElement("pre");g.style.cssText="height: 0; overflow: visible",g.style.direction=h.getOption("direction"),g.className="CodeMirror-placeholder CodeMirror-line-like";var T=h.getOption("placeholder");typeof T=="string"&&(T=document.createTextNode(T)),g.appendChild(T),h.display.lineSpace.insertBefore(g,h.display.lineSpace.firstChild)}function C(h){setTimeout(function(){var g=!1;if(h.lineCount()==1){var T=h.getInputField();g=T.nodeName=="TEXTAREA"?!h.getLine(0).length:!/[^\u200b]/.test(T.querySelector(".CodeMirror-line").textContent)}g?v(h):p(h)},20)}function b(h){s(h)&&v(h)}function S(h){var g=h.getWrapperElement(),T=s(h);g.className=g.className.replace(" CodeMirror-empty","")+(T?" CodeMirror-empty":""),T?v(h):p(h)}function s(h){return h.lineCount()===1&&h.getLine(0)===""}})});var ys=Ke((vs,bs)=>{(function(o){typeof vs=="object"&&typeof bs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineOption("styleSelectedText",!1,function(w,c,d){var k=d&&d!=o.Init;c&&!k?(w.state.markedSelection=[],w.state.markedSelectionStyle=typeof c=="string"?c:"CodeMirror-selectedtext",g(w),w.on("cursorActivity",p),w.on("change",v)):!c&&k&&(w.off("cursorActivity",p),w.off("change",v),h(w),w.state.markedSelection=w.state.markedSelectionStyle=null)});function p(w){w.state.markedSelection&&w.operation(function(){T(w)})}function v(w){w.state.markedSelection&&w.state.markedSelection.length&&w.operation(function(){h(w)})}var C=8,b=o.Pos,S=o.cmpPos;function s(w,c,d,k){if(S(c,d)!=0)for(var z=w.state.markedSelection,M=w.state.markedSelectionStyle,_=c.line;;){var W=_==c.line?c:b(_,0),E=_+C,O=E>=d.line,G=O?d:b(E,0),J=w.markText(W,G,{className:M});if(k==null?z.push(J):z.splice(k++,0,J),O)break;_=E}}function h(w){for(var c=w.state.markedSelection,d=0;d1)return g(w);var c=w.getCursor("start"),d=w.getCursor("end"),k=w.state.markedSelection;if(!k.length)return s(w,c,d);var z=k[0].find(),M=k[k.length-1].find();if(!z||!M||d.line-c.line<=C||S(c,M.to)>=0||S(d,z.from)<=0)return g(w);for(;S(c,z.from)>0;)k.shift().clear(),z=k[0].find();for(S(c,z.from)<0&&(z.to.line-c.line0&&(d.line-M.from.line{(function(o){typeof xs=="object"&&typeof _s=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p=o.Pos;function v(_){var W=_.flags;return W??(_.ignoreCase?"i":"")+(_.global?"g":"")+(_.multiline?"m":"")}function C(_,W){for(var E=v(_),O=E,G=0;Gre);q++){var I=_.getLine(J++);O=O==null?I:O+` +`+I}G=G*2,W.lastIndex=E.ch;var D=W.exec(O);if(D){var Q=O.slice(0,D.index).split(` `),j=D[0].split(` -`),V=M.line+Q.length-1,_=Q[Q.length-1].length;return{from:p(V,_),to:p(V+j.length-1,j.length==1?_+j[0].length:j[j.length-1].length),match:D}}}}function h(y,R,M){for(var H,Z=0;Z<=y.length;){R.lastIndex=Z;var ee=R.exec(y);if(!ee)break;var re=ee.index+ee[0].length;if(re>y.length-M)break;(!H||re>H.index+H[0].length)&&(H=ee),Z=ee.index+1}return H}function g(y,R,M){R=C(R,"g");for(var H=M.line,Z=M.ch,ee=y.firstLine();H>=ee;H--,Z=-1){var re=y.getLine(H),N=h(re,R,Z<0?0:re.length-Z);if(N)return{from:p(H,N.index),to:p(H,N.index+N[0].length),match:N}}}function T(y,R,M){if(!b(R))return g(y,R,M);R=C(R,"gm");for(var H,Z=1,ee=y.getLine(M.line).length-M.ch,re=M.line,N=y.firstLine();re>=N;){for(var F=0;F=N;F++){var D=y.getLine(re--);H=H==null?D:D+` -`+H}Z*=2;var Q=h(H,R,ee);if(Q){var j=H.slice(0,Q.index).split(` +`),V=E.line+Q.length-1,y=Q[Q.length-1].length;return{from:p(V,y),to:p(V+j.length-1,j.length==1?y+j[0].length:j[j.length-1].length),match:D}}}}function h(_,W,E){for(var O,G=0;G<=_.length;){W.lastIndex=G;var J=W.exec(_);if(!J)break;var re=J.index+J[0].length;if(re>_.length-E)break;(!O||re>O.index+O[0].length)&&(O=J),G=J.index+1}return O}function g(_,W,E){W=C(W,"g");for(var O=E.line,G=E.ch,J=_.firstLine();O>=J;O--,G=-1){var re=_.getLine(O),q=h(re,W,G<0?0:re.length-G);if(q)return{from:p(O,q.index),to:p(O,q.index+q[0].length),match:q}}}function T(_,W,E){if(!b(W))return g(_,W,E);W=C(W,"gm");for(var O,G=1,J=_.getLine(E.line).length-E.ch,re=E.line,q=_.firstLine();re>=q;){for(var I=0;I=q;I++){var D=_.getLine(re--);O=O==null?D:D+` +`+O}G*=2;var Q=h(O,W,J);if(Q){var j=O.slice(0,Q.index).split(` `),V=Q[0].split(` -`),_=re+j.length,K=j[j.length-1].length;return{from:p(_,K),to:p(_+V.length-1,V.length==1?K+V[0].length:V[V.length-1].length),match:Q}}}}var x,c;String.prototype.normalize?(x=function(y){return y.normalize("NFD").toLowerCase()},c=function(y){return y.normalize("NFD")}):(x=function(y){return y.toLowerCase()},c=function(y){return y});function d(y,R,M,H){if(y.length==R.length)return M;for(var Z=0,ee=M+Math.max(0,y.length-R.length);;){if(Z==ee)return Z;var re=Z+ee>>1,N=H(y.slice(0,re)).length;if(N==M)return re;N>M?ee=re:Z=re+1}}function w(y,R,M,H){if(!R.length)return null;var Z=H?x:c,ee=Z(R).split(/\r|\n\r?/);e:for(var re=M.line,N=M.ch,F=y.lastLine()+1-ee.length;re<=F;re++,N=0){var D=y.getLine(re).slice(N),Q=Z(D);if(ee.length==1){var j=Q.indexOf(ee[0]);if(j==-1)continue e;var M=d(D,Q,j,Z)+N;return{from:p(re,d(D,Q,j,Z)+N),to:p(re,d(D,Q,j+ee[0].length,Z)+N)}}else{var V=Q.length-ee[0].length;if(Q.slice(V)!=ee[0])continue e;for(var _=1;_=F;re--,N=-1){var D=y.getLine(re);N>-1&&(D=D.slice(0,N));var Q=Z(D);if(ee.length==1){var j=Q.lastIndexOf(ee[0]);if(j==-1)continue e;return{from:p(re,d(D,Q,j,Z)),to:p(re,d(D,Q,j+ee[0].length,Z))}}else{var V=ee[ee.length-1];if(Q.slice(0,V.length)!=V)continue e;for(var _=1,M=re-ee.length+1;_(this.doc.getLine(R.line)||"").length&&(R.ch=0,R.line++)),o.cmpPos(R,this.doc.clipPos(R))!=0))return this.atOccurrence=!1;var M=this.matches(y,R);if(this.afterEmptyMatch=M&&o.cmpPos(M.from,M.to)==0,M)return this.pos=M,this.atOccurrence=!0,this.pos.match||!0;var H=p(y?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:H,to:H},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(y,R){if(this.atOccurrence){var M=o.splitLines(y);this.doc.replaceRange(M,this.pos.from,this.pos.to,R),this.pos.to=p(this.pos.from.line+M.length-1,M[M.length-1].length+(M.length==1?this.pos.from.ch:0))}}},o.defineExtension("getSearchCursor",function(y,R,M){return new z(this.doc,y,R,M)}),o.defineDocExtension("getSearchCursor",function(y,R,M){return new z(this,y,R,M)}),o.defineExtension("selectMatches",function(y,R){for(var M=[],H=this.getSearchCursor(y,this.getCursor("from"),R);H.findNext()&&!(o.cmpPos(H.to(),this.getCursor("to"))>0);)M.push({anchor:H.from(),head:H.to()});M.length&&this.setSelections(M,0)})})});var Vo=Ke((ws,Ss)=>{(function(o){typeof ws=="object"&&typeof Ss=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(I,B,le,xe,q,L){this.indented=I,this.column=B,this.type=le,this.info=xe,this.align=q,this.prev=L}function v(I,B,le,xe){var q=I.indented;return I.context&&I.context.type=="statement"&&le!="statement"&&(q=I.context.indented),I.context=new p(q,B,le,xe,null,I.context)}function C(I){var B=I.context.type;return(B==")"||B=="]"||B=="}")&&(I.indented=I.context.indented),I.context=I.context.prev}function b(I,B,le){if(B.prevToken=="variable"||B.prevToken=="type"||/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(I.string.slice(0,le))||B.typeAtEndOfLine&&I.column()==I.indentation())return!0}function S(I){for(;;){if(!I||I.type=="top")return!0;if(I.type=="}"&&I.prev.info!="namespace")return!1;I=I.prev}}o.defineMode("clike",function(I,B){var le=I.indentUnit,xe=B.statementIndentUnit||le,q=B.dontAlignCalls,L=B.keywords||{},de=B.types||{},ze=B.builtin||{},pe=B.blockKeywords||{},Ee=B.defKeywords||{},ge=B.atoms||{},Oe=B.hooks||{},qe=B.multiLineStrings,Se=B.indentStatements!==!1,je=B.indentSwitch!==!1,Ze=B.namespaceSeparator,ke=B.isPunctuationChar||/[\[\]{}\(\),;\:\.]/,Je=B.numberStart||/[\d\.]/,He=B.number||/^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i,Ge=B.isOperatorChar||/[+\-*&%=<>!?|\/]/,U=B.isIdentifierChar||/[\w\$_\xa1-\uffff]/,G=B.isReservedIdentifier||!1,ce,Be;function te(we,Me){var Le=we.next();if(Oe[Le]){var $=Oe[Le](we,Me);if($!==!1)return $}if(Le=='"'||Le=="'")return Me.tokenize=fe(Le),Me.tokenize(we,Me);if(Je.test(Le)){if(we.backUp(1),we.match(He))return"number";we.next()}if(ke.test(Le))return ce=Le,null;if(Le=="/"){if(we.eat("*"))return Me.tokenize=oe,oe(we,Me);if(we.eat("/"))return we.skipToEnd(),"comment"}if(Ge.test(Le)){for(;!we.match(/^\/[\/*]/,!1)&&we.eat(Ge););return"operator"}if(we.eatWhile(U),Ze)for(;we.match(Ze);)we.eatWhile(U);var W=we.current();return h(L,W)?(h(pe,W)&&(ce="newstatement"),h(Ee,W)&&(Be=!0),"keyword"):h(de,W)?"type":h(ze,W)||G&&G(W)?(h(pe,W)&&(ce="newstatement"),"builtin"):h(ge,W)?"atom":"variable"}function fe(we){return function(Me,Le){for(var $=!1,W,se=!1;(W=Me.next())!=null;){if(W==we&&!$){se=!0;break}$=!$&&W=="\\"}return(se||!($||qe))&&(Le.tokenize=null),"string"}}function oe(we,Me){for(var Le=!1,$;$=we.next();){if($=="/"&&Le){Me.tokenize=null;break}Le=$=="*"}return"comment"}function Ue(we,Me){B.typeFirstDefinitions&&we.eol()&&S(Me.context)&&(Me.typeAtEndOfLine=b(we,Me,we.pos))}return{startState:function(we){return{tokenize:null,context:new p((we||0)-le,0,"top",null,!1),indented:0,startOfLine:!0,prevToken:null}},token:function(we,Me){var Le=Me.context;if(we.sol()&&(Le.align==null&&(Le.align=!1),Me.indented=we.indentation(),Me.startOfLine=!0),we.eatSpace())return Ue(we,Me),null;ce=Be=null;var $=(Me.tokenize||te)(we,Me);if($=="comment"||$=="meta")return $;if(Le.align==null&&(Le.align=!0),ce==";"||ce==":"||ce==","&&we.match(/^\s*(?:\/\/.*)?$/,!1))for(;Me.context.type=="statement";)C(Me);else if(ce=="{")v(Me,we.column(),"}");else if(ce=="[")v(Me,we.column(),"]");else if(ce=="(")v(Me,we.column(),")");else if(ce=="}"){for(;Le.type=="statement";)Le=C(Me);for(Le.type=="}"&&(Le=C(Me));Le.type=="statement";)Le=C(Me)}else ce==Le.type?C(Me):Se&&((Le.type=="}"||Le.type=="top")&&ce!=";"||Le.type=="statement"&&ce=="newstatement")&&v(Me,we.column(),"statement",we.current());if($=="variable"&&(Me.prevToken=="def"||B.typeFirstDefinitions&&b(we,Me,we.start)&&S(Me.context)&&we.match(/^\s*\(/,!1))&&($="def"),Oe.token){var W=Oe.token(we,Me,$);W!==void 0&&($=W)}return $=="def"&&B.styleDefs===!1&&($="variable"),Me.startOfLine=!1,Me.prevToken=Be?"def":$||ce,Ue(we,Me),$},indent:function(we,Me){if(we.tokenize!=te&&we.tokenize!=null||we.typeAtEndOfLine&&S(we.context))return o.Pass;var Le=we.context,$=Me&&Me.charAt(0),W=$==Le.type;if(Le.type=="statement"&&$=="}"&&(Le=Le.prev),B.dontIndentStatements)for(;Le.type=="statement"&&B.dontIndentStatements.test(Le.info);)Le=Le.prev;if(Oe.indent){var se=Oe.indent(we,Le,Me,le);if(typeof se=="number")return se}var De=Le.prev&&Le.prev.info=="switch";if(B.allmanIndentation&&/[{(]/.test($)){for(;Le.type!="top"&&Le.type!="}";)Le=Le.prev;return Le.indented}return Le.type=="statement"?Le.indented+($=="{"?0:xe):Le.align&&(!q||Le.type!=")")?Le.column+(W?0:1):Le.type==")"&&!W?Le.indented+xe:Le.indented+(W?0:le)+(!W&&De&&!/^(?:case|default)\b/.test(Me)?le:0)},electricInput:je?/^\s*(?:case .*?:|default:|\{\}?|\})$/:/^\s*[{}]$/,blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:"//",fold:"brace"}});function s(I){for(var B={},le=I.split(" "),xe=0;xe!?|\/#:@]/,hooks:{"@":function(I){return I.eatWhile(/[\w\$_]/),"meta"},'"':function(I,B){return I.match('""')?(B.tokenize=j,B.tokenize(I,B)):!1},"'":function(I){return I.match(/^(\\[^'\s]+|[^\\'])'/)?"string-2":(I.eatWhile(/[\w\$_\xa1-\uffff]/),"atom")},"=":function(I,B){var le=B.context;return le.type=="}"&&le.align&&I.eat(">")?(B.context=new p(le.indented,le.column,le.type,le.info,null,le.prev),"operator"):!1},"/":function(I,B){return I.eat("*")?(B.tokenize=V(1),B.tokenize(I,B)):!1}},modeProps:{closeBrackets:{pairs:'()[]{}""',triples:'"'}}});function _(I){return function(B,le){for(var xe=!1,q,L=!1;!B.eol();){if(!I&&!xe&&B.match('"')){L=!0;break}if(I&&B.match('"""')){L=!0;break}q=B.next(),!xe&&q=="$"&&B.match("{")&&B.skipTo("}"),xe=!xe&&q=="\\"&&!I}return(L||!I)&&(le.tokenize=null),"string"}}Q("text/x-kotlin",{name:"clike",keywords:s("package as typealias class interface this super val operator var fun for is in This throw return annotation break continue object if else while do try when !in !is as? file import where by get set abstract enum open inner override private public internal protected catch finally out final vararg reified dynamic companion constructor init sealed field property receiver param sparam lateinit data inline noinline tailrec external annotation crossinline const operator infix suspend actual expect setparam value"),types:s("Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy LazyThreadSafetyMode LongArray Nothing ShortArray Unit"),intendSwitch:!1,indentStatements:!1,multiLineStrings:!0,number:/^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,blockKeywords:s("catch class do else finally for if where try while enum"),defKeywords:s("class val var object interface fun"),atoms:s("true false null this"),hooks:{"@":function(I){return I.eatWhile(/[\w\$_]/),"meta"},"*":function(I,B){return B.prevToken=="."?"variable":"operator"},'"':function(I,B){return B.tokenize=_(I.match('""')),B.tokenize(I,B)},"/":function(I,B){return I.eat("*")?(B.tokenize=V(1),B.tokenize(I,B)):!1},indent:function(I,B,le,xe){var q=le&&le.charAt(0);if((I.prevToken=="}"||I.prevToken==")")&&le=="")return I.indented;if(I.prevToken=="operator"&&le!="}"&&I.context.type!="}"||I.prevToken=="variable"&&q=="."||(I.prevToken=="}"||I.prevToken==")")&&q==".")return xe*2+B.indented;if(B.align&&B.type=="}")return B.indented+(I.context.type==(le||"").charAt(0)?0:xe)}},modeProps:{closeBrackets:{triples:'"'}}}),Q(["x-shader/x-vertex","x-shader/x-fragment"],{name:"clike",keywords:s("sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout"),types:s("float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4"),blockKeywords:s("for while do if else struct"),builtin:s("radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4"),atoms:s("true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers"),indentSwitch:!1,hooks:{"#":M},modeProps:{fold:["brace","include"]}}),Q("text/x-nesc",{name:"clike",keywords:s(g+" as atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends"),types:E,blockKeywords:s(y),atoms:s("null true false"),hooks:{"#":M},modeProps:{fold:["brace","include"]}}),Q("text/x-objectivec",{name:"clike",keywords:s(g+" "+x),types:z,builtin:s(c),blockKeywords:s(y+" @synthesize @try @catch @finally @autoreleasepool @synchronized"),defKeywords:s(R+" @interface @implementation @protocol @class"),dontIndentStatements:/^@.*$/,typeFirstDefinitions:!0,atoms:s("YES NO NULL Nil nil true false nullptr"),isReservedIdentifier:Z,hooks:{"#":M,"*":H},modeProps:{fold:["brace","include"]}}),Q("text/x-objectivec++",{name:"clike",keywords:s(g+" "+x+" "+T),types:z,builtin:s(c),blockKeywords:s(y+" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"),defKeywords:s(R+" @interface @implementation @protocol @class class namespace"),dontIndentStatements:/^@.*$|^template$/,typeFirstDefinitions:!0,atoms:s("YES NO NULL Nil nil true false nullptr"),isReservedIdentifier:Z,hooks:{"#":M,"*":H,u:re,U:re,L:re,R:re,0:ee,1:ee,2:ee,3:ee,4:ee,5:ee,6:ee,7:ee,8:ee,9:ee,token:function(I,B,le){if(le=="variable"&&I.peek()=="("&&(B.prevToken==";"||B.prevToken==null||B.prevToken=="}")&&N(I.current()))return"def"}},namespaceSeparator:"::",modeProps:{fold:["brace","include"]}}),Q("text/x-squirrel",{name:"clike",keywords:s("base break clone continue const default delete enum extends function in class foreach local resume return this throw typeof yield constructor instanceof static"),types:E,blockKeywords:s("case catch class else for foreach if switch try while"),defKeywords:s("function local class"),typeFirstDefinitions:!0,atoms:s("true false null"),hooks:{"#":M},modeProps:{fold:["brace","include"]}});var K=null;function X(I){return function(B,le){for(var xe=!1,q,L=!1;!B.eol();){if(!xe&&B.match('"')&&(I=="single"||B.match('""'))){L=!0;break}if(!xe&&B.match("``")){K=X(I),L=!0;break}q=B.next(),xe=I=="single"&&!xe&&q=="\\"}return L&&(le.tokenize=null),"string"}}Q("text/x-ceylon",{name:"clike",keywords:s("abstracts alias assembly assert assign break case catch class continue dynamic else exists extends finally for function given if import in interface is let module new nonempty object of out outer package return satisfies super switch then this throw try value void while"),types:function(I){var B=I.charAt(0);return B===B.toUpperCase()&&B!==B.toLowerCase()},blockKeywords:s("case catch class dynamic else finally for function if interface module new object switch try while"),defKeywords:s("class dynamic function interface module object package value"),builtin:s("abstract actual aliased annotation by default deprecated doc final formal late license native optional sealed see serializable shared suppressWarnings tagged throws variable"),isPunctuationChar:/[\[\]{}\(\),;\:\.`]/,isOperatorChar:/[+\-*&%=<>!?|^~:\/]/,numberStart:/[\d#$]/,number:/^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i,multiLineStrings:!0,typeFirstDefinitions:!0,atoms:s("true false null larger smaller equal empty finished"),indentSwitch:!1,styleDefs:!1,hooks:{"@":function(I){return I.eatWhile(/[\w\$_]/),"meta"},'"':function(I,B){return B.tokenize=X(I.match('""')?"triple":"single"),B.tokenize(I,B)},"`":function(I,B){return!K||!I.match("`")?!1:(B.tokenize=K,K=null,B.tokenize(I,B))},"'":function(I){return I.eatWhile(/[\w\$_\xa1-\uffff]/),"atom"},token:function(I,B,le){if((le=="variable"||le=="type")&&B.prevToken==".")return"variable-2"}},modeProps:{fold:["brace","import"],closeBrackets:{triples:'"'}}})})});var Cs=Ke((Ts,Ls)=>{(function(o){typeof Ts=="object"&&typeof Ls=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("cmake",function(){var p=/({)?[a-zA-Z0-9_]+(})?/;function v(b,S){for(var s,h,g=!1;!b.eol()&&(s=b.next())!=S.pending;){if(s==="$"&&h!="\\"&&S.pending=='"'){g=!0;break}h=s}return g&&b.backUp(1),s==S.pending?S.continueString=!1:S.continueString=!0,"string"}function C(b,S){var s=b.next();return s==="$"?b.match(p)?"variable-2":"variable":S.continueString?(b.backUp(1),v(b,S)):b.match(/(\s+)?\w+\(/)||b.match(/(\s+)?\w+\ \(/)?(b.backUp(1),"def"):s=="#"?(b.skipToEnd(),"comment"):s=="'"||s=='"'?(S.pending=s,v(b,S)):s=="("||s==")"?"bracket":s.match(/[0-9]/)?"number":(b.eatWhile(/[\w-]/),null)}return{startState:function(){var b={};return b.inDefinition=!1,b.inInclude=!1,b.continueString=!1,b.pending=!1,b},token:function(b,S){return b.eatSpace()?null:C(b,S)}}}),o.defineMIME("text/x-cmake","cmake")})});var gn=Ke((Es,zs)=>{(function(o){typeof Es=="object"&&typeof zs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("css",function(F,D){var Q=D.inline;D.propertyKeywords||(D=o.resolveMode("text/css"));var j=F.indentUnit,V=D.tokenHooks,_=D.documentTypes||{},K=D.mediaTypes||{},X=D.mediaFeatures||{},I=D.mediaValueKeywords||{},B=D.propertyKeywords||{},le=D.nonStandardPropertyKeywords||{},xe=D.fontProperties||{},q=D.counterDescriptors||{},L=D.colorKeywords||{},de=D.valueKeywords||{},ze=D.allowNested,pe=D.lineComment,Ee=D.supportsAtComponent===!0,ge=F.highlightNonStandardPropertyKeywords!==!1,Oe,qe;function Se(te,fe){return Oe=fe,te}function je(te,fe){var oe=te.next();if(V[oe]){var Ue=V[oe](te,fe);if(Ue!==!1)return Ue}if(oe=="@")return te.eatWhile(/[\w\\\-]/),Se("def",te.current());if(oe=="="||(oe=="~"||oe=="|")&&te.eat("="))return Se(null,"compare");if(oe=='"'||oe=="'")return fe.tokenize=Ze(oe),fe.tokenize(te,fe);if(oe=="#")return te.eatWhile(/[\w\\\-]/),Se("atom","hash");if(oe=="!")return te.match(/^\s*\w*/),Se("keyword","important");if(/\d/.test(oe)||oe=="."&&te.eat(/\d/))return te.eatWhile(/[\w.%]/),Se("number","unit");if(oe==="-"){if(/[\d.]/.test(te.peek()))return te.eatWhile(/[\w.%]/),Se("number","unit");if(te.match(/^-[\w\\\-]*/))return te.eatWhile(/[\w\\\-]/),te.match(/^\s*:/,!1)?Se("variable-2","variable-definition"):Se("variable-2","variable");if(te.match(/^\w+-/))return Se("meta","meta")}else return/[,+>*\/]/.test(oe)?Se(null,"select-op"):oe=="."&&te.match(/^-?[_a-z][_a-z0-9-]*/i)?Se("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(oe)?Se(null,oe):te.match(/^[\w-.]+(?=\()/)?(/^(url(-prefix)?|domain|regexp)$/i.test(te.current())&&(fe.tokenize=ke),Se("variable callee","variable")):/[\w\\\-]/.test(oe)?(te.eatWhile(/[\w\\\-]/),Se("property","word")):Se(null,null)}function Ze(te){return function(fe,oe){for(var Ue=!1,we;(we=fe.next())!=null;){if(we==te&&!Ue){te==")"&&fe.backUp(1);break}Ue=!Ue&&we=="\\"}return(we==te||!Ue&&te!=")")&&(oe.tokenize=null),Se("string","string")}}function ke(te,fe){return te.next(),te.match(/^\s*[\"\')]/,!1)?fe.tokenize=null:fe.tokenize=Ze(")"),Se(null,"(")}function Je(te,fe,oe){this.type=te,this.indent=fe,this.prev=oe}function He(te,fe,oe,Ue){return te.context=new Je(oe,fe.indentation()+(Ue===!1?0:j),te.context),oe}function Ge(te){return te.context.prev&&(te.context=te.context.prev),te.context.type}function U(te,fe,oe){return Be[oe.context.type](te,fe,oe)}function G(te,fe,oe,Ue){for(var we=Ue||1;we>0;we--)oe.context=oe.context.prev;return U(te,fe,oe)}function ce(te){var fe=te.current().toLowerCase();de.hasOwnProperty(fe)?qe="atom":L.hasOwnProperty(fe)?qe="keyword":qe="variable"}var Be={};return Be.top=function(te,fe,oe){if(te=="{")return He(oe,fe,"block");if(te=="}"&&oe.context.prev)return Ge(oe);if(Ee&&/@component/i.test(te))return He(oe,fe,"atComponentBlock");if(/^@(-moz-)?document$/i.test(te))return He(oe,fe,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/i.test(te))return He(oe,fe,"atBlock");if(/^@(font-face|counter-style)/i.test(te))return oe.stateArg=te,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(te))return"keyframes";if(te&&te.charAt(0)=="@")return He(oe,fe,"at");if(te=="hash")qe="builtin";else if(te=="word")qe="tag";else{if(te=="variable-definition")return"maybeprop";if(te=="interpolation")return He(oe,fe,"interpolation");if(te==":")return"pseudo";if(ze&&te=="(")return He(oe,fe,"parens")}return oe.context.type},Be.block=function(te,fe,oe){if(te=="word"){var Ue=fe.current().toLowerCase();return B.hasOwnProperty(Ue)?(qe="property","maybeprop"):le.hasOwnProperty(Ue)?(qe=ge?"string-2":"property","maybeprop"):ze?(qe=fe.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(qe+=" error","maybeprop")}else return te=="meta"?"block":!ze&&(te=="hash"||te=="qualifier")?(qe="error","block"):Be.top(te,fe,oe)},Be.maybeprop=function(te,fe,oe){return te==":"?He(oe,fe,"prop"):U(te,fe,oe)},Be.prop=function(te,fe,oe){if(te==";")return Ge(oe);if(te=="{"&&ze)return He(oe,fe,"propBlock");if(te=="}"||te=="{")return G(te,fe,oe);if(te=="(")return He(oe,fe,"parens");if(te=="hash"&&!/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(fe.current()))qe+=" error";else if(te=="word")ce(fe);else if(te=="interpolation")return He(oe,fe,"interpolation");return"prop"},Be.propBlock=function(te,fe,oe){return te=="}"?Ge(oe):te=="word"?(qe="property","maybeprop"):oe.context.type},Be.parens=function(te,fe,oe){return te=="{"||te=="}"?G(te,fe,oe):te==")"?Ge(oe):te=="("?He(oe,fe,"parens"):te=="interpolation"?He(oe,fe,"interpolation"):(te=="word"&&ce(fe),"parens")},Be.pseudo=function(te,fe,oe){return te=="meta"?"pseudo":te=="word"?(qe="variable-3",oe.context.type):U(te,fe,oe)},Be.documentTypes=function(te,fe,oe){return te=="word"&&_.hasOwnProperty(fe.current())?(qe="tag",oe.context.type):Be.atBlock(te,fe,oe)},Be.atBlock=function(te,fe,oe){if(te=="(")return He(oe,fe,"atBlock_parens");if(te=="}"||te==";")return G(te,fe,oe);if(te=="{")return Ge(oe)&&He(oe,fe,ze?"block":"top");if(te=="interpolation")return He(oe,fe,"interpolation");if(te=="word"){var Ue=fe.current().toLowerCase();Ue=="only"||Ue=="not"||Ue=="and"||Ue=="or"?qe="keyword":K.hasOwnProperty(Ue)?qe="attribute":X.hasOwnProperty(Ue)?qe="property":I.hasOwnProperty(Ue)?qe="keyword":B.hasOwnProperty(Ue)?qe="property":le.hasOwnProperty(Ue)?qe=ge?"string-2":"property":de.hasOwnProperty(Ue)?qe="atom":L.hasOwnProperty(Ue)?qe="keyword":qe="error"}return oe.context.type},Be.atComponentBlock=function(te,fe,oe){return te=="}"?G(te,fe,oe):te=="{"?Ge(oe)&&He(oe,fe,ze?"block":"top",!1):(te=="word"&&(qe="error"),oe.context.type)},Be.atBlock_parens=function(te,fe,oe){return te==")"?Ge(oe):te=="{"||te=="}"?G(te,fe,oe,2):Be.atBlock(te,fe,oe)},Be.restricted_atBlock_before=function(te,fe,oe){return te=="{"?He(oe,fe,"restricted_atBlock"):te=="word"&&oe.stateArg=="@counter-style"?(qe="variable","restricted_atBlock_before"):U(te,fe,oe)},Be.restricted_atBlock=function(te,fe,oe){return te=="}"?(oe.stateArg=null,Ge(oe)):te=="word"?(oe.stateArg=="@font-face"&&!xe.hasOwnProperty(fe.current().toLowerCase())||oe.stateArg=="@counter-style"&&!q.hasOwnProperty(fe.current().toLowerCase())?qe="error":qe="property","maybeprop"):"restricted_atBlock"},Be.keyframes=function(te,fe,oe){return te=="word"?(qe="variable","keyframes"):te=="{"?He(oe,fe,"top"):U(te,fe,oe)},Be.at=function(te,fe,oe){return te==";"?Ge(oe):te=="{"||te=="}"?G(te,fe,oe):(te=="word"?qe="tag":te=="hash"&&(qe="builtin"),"at")},Be.interpolation=function(te,fe,oe){return te=="}"?Ge(oe):te=="{"||te==";"?G(te,fe,oe):(te=="word"?qe="variable":te!="variable"&&te!="("&&te!=")"&&(qe="error"),"interpolation")},{startState:function(te){return{tokenize:null,state:Q?"block":"top",stateArg:null,context:new Je(Q?"block":"top",te||0,null)}},token:function(te,fe){if(!fe.tokenize&&te.eatSpace())return null;var oe=(fe.tokenize||je)(te,fe);return oe&&typeof oe=="object"&&(Oe=oe[1],oe=oe[0]),qe=oe,Oe!="comment"&&(fe.state=Be[fe.state](Oe,te,fe)),qe},indent:function(te,fe){var oe=te.context,Ue=fe&&fe.charAt(0),we=oe.indent;return oe.type=="prop"&&(Ue=="}"||Ue==")")&&(oe=oe.prev),oe.prev&&(Ue=="}"&&(oe.type=="block"||oe.type=="top"||oe.type=="interpolation"||oe.type=="restricted_atBlock")?(oe=oe.prev,we=oe.indent):(Ue==")"&&(oe.type=="parens"||oe.type=="atBlock_parens")||Ue=="{"&&(oe.type=="at"||oe.type=="atBlock"))&&(we=Math.max(0,oe.indent-j))),we},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:pe,fold:"brace"}});function p(F){for(var D={},Q=0;Q{(function(o){typeof Ms=="object"&&typeof As=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("diff",function(){var p={"+":"positive","-":"negative","@":"meta"};return{token:function(v){var C=v.string.search(/[\t ]+?$/);if(!v.sol()||C===0)return v.skipToEnd(),("error "+(p[v.string.charAt(0)]||"")).replace(/ $/,"");var b=p[v.peek()]||v.skipToEnd();return C===-1?v.skipToEnd():v.pos=C,b}}}),o.defineMIME("text/x-diff","diff")})});var mn=Ke((qs,Is)=>{(function(o){typeof qs=="object"&&typeof Is=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},v={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};o.defineMode("xml",function(C,b){var S=C.indentUnit,s={},h=b.htmlMode?p:v;for(var g in h)s[g]=h[g];for(var g in b)s[g]=b[g];var T,x;function c(_,K){function X(le){return K.tokenize=le,le(_,K)}var I=_.next();if(I=="<")return _.eat("!")?_.eat("[")?_.match("CDATA[")?X(E("atom","]]>")):null:_.match("--")?X(E("comment","-->")):_.match("DOCTYPE",!0,!0)?(_.eatWhile(/[\w\._\-]/),X(z(1))):null:_.eat("?")?(_.eatWhile(/[\w\._\-]/),K.tokenize=E("meta","?>"),"meta"):(T=_.eat("/")?"closeTag":"openTag",K.tokenize=d,"tag bracket");if(I=="&"){var B;return _.eat("#")?_.eat("x")?B=_.eatWhile(/[a-fA-F\d]/)&&_.eat(";"):B=_.eatWhile(/[\d]/)&&_.eat(";"):B=_.eatWhile(/[\w\.\-:]/)&&_.eat(";"),B?"atom":"error"}else return _.eatWhile(/[^&<]/),null}c.isInText=!0;function d(_,K){var X=_.next();if(X==">"||X=="/"&&_.eat(">"))return K.tokenize=c,T=X==">"?"endTag":"selfcloseTag","tag bracket";if(X=="=")return T="equals",null;if(X=="<"){K.tokenize=c,K.state=Z,K.tagName=K.tagStart=null;var I=K.tokenize(_,K);return I?I+" tag error":"tag error"}else return/[\'\"]/.test(X)?(K.tokenize=w(X),K.stringStartCol=_.column(),K.tokenize(_,K)):(_.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function w(_){var K=function(X,I){for(;!X.eol();)if(X.next()==_){I.tokenize=d;break}return"string"};return K.isInAttribute=!0,K}function E(_,K){return function(X,I){for(;!X.eol();){if(X.match(K)){I.tokenize=c;break}X.next()}return _}}function z(_){return function(K,X){for(var I;(I=K.next())!=null;){if(I=="<")return X.tokenize=z(_+1),X.tokenize(K,X);if(I==">")if(_==1){X.tokenize=c;break}else return X.tokenize=z(_-1),X.tokenize(K,X)}return"meta"}}function y(_){return _&&_.toLowerCase()}function R(_,K,X){this.prev=_.context,this.tagName=K||"",this.indent=_.indented,this.startOfLine=X,(s.doNotIndent.hasOwnProperty(K)||_.context&&_.context.noIndent)&&(this.noIndent=!0)}function M(_){_.context&&(_.context=_.context.prev)}function H(_,K){for(var X;;){if(!_.context||(X=_.context.tagName,!s.contextGrabbers.hasOwnProperty(y(X))||!s.contextGrabbers[y(X)].hasOwnProperty(y(K))))return;M(_)}}function Z(_,K,X){return _=="openTag"?(X.tagStart=K.column(),ee):_=="closeTag"?re:Z}function ee(_,K,X){return _=="word"?(X.tagName=K.current(),x="tag",D):s.allowMissingTagName&&_=="endTag"?(x="tag bracket",D(_,K,X)):(x="error",ee)}function re(_,K,X){if(_=="word"){var I=K.current();return X.context&&X.context.tagName!=I&&s.implicitlyClosed.hasOwnProperty(y(X.context.tagName))&&M(X),X.context&&X.context.tagName==I||s.matchClosing===!1?(x="tag",N):(x="tag error",F)}else return s.allowMissingTagName&&_=="endTag"?(x="tag bracket",N(_,K,X)):(x="error",F)}function N(_,K,X){return _!="endTag"?(x="error",N):(M(X),Z)}function F(_,K,X){return x="error",N(_,K,X)}function D(_,K,X){if(_=="word")return x="attribute",Q;if(_=="endTag"||_=="selfcloseTag"){var I=X.tagName,B=X.tagStart;return X.tagName=X.tagStart=null,_=="selfcloseTag"||s.autoSelfClosers.hasOwnProperty(y(I))?H(X,I):(H(X,I),X.context=new R(X,I,B==X.indented)),Z}return x="error",D}function Q(_,K,X){return _=="equals"?j:(s.allowMissing||(x="error"),D(_,K,X))}function j(_,K,X){return _=="string"?V:_=="word"&&s.allowUnquoted?(x="string",D):(x="error",D(_,K,X))}function V(_,K,X){return _=="string"?V:D(_,K,X)}return{startState:function(_){var K={tokenize:c,state:Z,indented:_||0,tagName:null,tagStart:null,context:null};return _!=null&&(K.baseIndent=_),K},token:function(_,K){if(!K.tagName&&_.sol()&&(K.indented=_.indentation()),_.eatSpace())return null;T=null;var X=K.tokenize(_,K);return(X||T)&&X!="comment"&&(x=null,K.state=K.state(T||X,_,K),x&&(X=x=="error"?X+" error":x)),X},indent:function(_,K,X){var I=_.context;if(_.tokenize.isInAttribute)return _.tagStart==_.indented?_.stringStartCol+1:_.indented+S;if(I&&I.noIndent)return o.Pass;if(_.tokenize!=d&&_.tokenize!=c)return X?X.match(/^(\s*)/)[0].length:0;if(_.tagName)return s.multilineTagIndentPastTag!==!1?_.tagStart+_.tagName.length+2:_.tagStart+S*(s.multilineTagIndentFactor||1);if(s.alignCDATA&&/$/,blockCommentStart:"",configuration:s.htmlMode?"html":"xml",helperType:s.htmlMode?"html":"xml",skipAttribute:function(_){_.state==j&&(_.state=D)},xmlCurrentTag:function(_){return _.tagName?{name:_.tagName,close:_.type=="closeTag"}:null},xmlCurrentContext:function(_){for(var K=[],X=_.context;X;X=X.prev)K.push(X.tagName);return K.reverse()}}}),o.defineMIME("text/xml","xml"),o.defineMIME("application/xml","xml"),o.mimeModes.hasOwnProperty("text/html")||o.defineMIME("text/html",{name:"xml",htmlMode:!0})})});var vn=Ke((Fs,Ns)=>{(function(o){typeof Fs=="object"&&typeof Ns=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("javascript",function(p,v){var C=p.indentUnit,b=v.statementIndent,S=v.jsonld,s=v.json||S,h=v.trackScope!==!1,g=v.typescript,T=v.wordCharacters||/[\w$\xa1-\uffff]/,x=function(){function k(pt){return{type:pt,style:"keyword"}}var O=k("keyword a"),ae=k("keyword b"),he=k("keyword c"),ne=k("keyword d"),ye=k("operator"),Xe={type:"atom",style:"atom"};return{if:k("if"),while:O,with:O,else:ae,do:ae,try:ae,finally:ae,return:ne,break:ne,continue:ne,new:k("new"),delete:he,void:he,throw:he,debugger:k("debugger"),var:k("var"),const:k("var"),let:k("var"),function:k("function"),catch:k("catch"),for:k("for"),switch:k("switch"),case:k("case"),default:k("default"),in:ye,typeof:ye,instanceof:ye,true:Xe,false:Xe,null:Xe,undefined:Xe,NaN:Xe,Infinity:Xe,this:k("this"),class:k("class"),super:k("atom"),yield:he,export:k("export"),import:k("import"),extends:he,await:he}}(),c=/[+\-*&%=<>!?|~^@]/,d=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function w(k){for(var O=!1,ae,he=!1;(ae=k.next())!=null;){if(!O){if(ae=="/"&&!he)return;ae=="["?he=!0:he&&ae=="]"&&(he=!1)}O=!O&&ae=="\\"}}var E,z;function y(k,O,ae){return E=k,z=ae,O}function R(k,O){var ae=k.next();if(ae=='"'||ae=="'")return O.tokenize=M(ae),O.tokenize(k,O);if(ae=="."&&k.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/))return y("number","number");if(ae=="."&&k.match(".."))return y("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(ae))return y(ae);if(ae=="="&&k.eat(">"))return y("=>","operator");if(ae=="0"&&k.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/))return y("number","number");if(/\d/.test(ae))return k.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/),y("number","number");if(ae=="/")return k.eat("*")?(O.tokenize=H,H(k,O)):k.eat("/")?(k.skipToEnd(),y("comment","comment")):jt(k,O,1)?(w(k),k.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),y("regexp","string-2")):(k.eat("="),y("operator","operator",k.current()));if(ae=="`")return O.tokenize=Z,Z(k,O);if(ae=="#"&&k.peek()=="!")return k.skipToEnd(),y("meta","meta");if(ae=="#"&&k.eatWhile(T))return y("variable","property");if(ae=="<"&&k.match("!--")||ae=="-"&&k.match("->")&&!/\S/.test(k.string.slice(0,k.start)))return k.skipToEnd(),y("comment","comment");if(c.test(ae))return(ae!=">"||!O.lexical||O.lexical.type!=">")&&(k.eat("=")?(ae=="!"||ae=="=")&&k.eat("="):/[<>*+\-|&?]/.test(ae)&&(k.eat(ae),ae==">"&&k.eat(ae))),ae=="?"&&k.eat(".")?y("."):y("operator","operator",k.current());if(T.test(ae)){k.eatWhile(T);var he=k.current();if(O.lastType!="."){if(x.propertyIsEnumerable(he)){var ne=x[he];return y(ne.type,ne.style,he)}if(he=="async"&&k.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/,!1))return y("async","keyword",he)}return y("variable","variable",he)}}function M(k){return function(O,ae){var he=!1,ne;if(S&&O.peek()=="@"&&O.match(d))return ae.tokenize=R,y("jsonld-keyword","meta");for(;(ne=O.next())!=null&&!(ne==k&&!he);)he=!he&&ne=="\\";return he||(ae.tokenize=R),y("string","string")}}function H(k,O){for(var ae=!1,he;he=k.next();){if(he=="/"&&ae){O.tokenize=R;break}ae=he=="*"}return y("comment","comment")}function Z(k,O){for(var ae=!1,he;(he=k.next())!=null;){if(!ae&&(he=="`"||he=="$"&&k.eat("{"))){O.tokenize=R;break}ae=!ae&&he=="\\"}return y("quasi","string-2",k.current())}var ee="([{}])";function re(k,O){O.fatArrowAt&&(O.fatArrowAt=null);var ae=k.string.indexOf("=>",k.start);if(!(ae<0)){if(g){var he=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(k.string.slice(k.start,ae));he&&(ae=he.index)}for(var ne=0,ye=!1,Xe=ae-1;Xe>=0;--Xe){var pt=k.string.charAt(Xe),Et=ee.indexOf(pt);if(Et>=0&&Et<3){if(!ne){++Xe;break}if(--ne==0){pt=="("&&(ye=!0);break}}else if(Et>=3&&Et<6)++ne;else if(T.test(pt))ye=!0;else if(/["'\/`]/.test(pt))for(;;--Xe){if(Xe==0)return;var Zr=k.string.charAt(Xe-1);if(Zr==pt&&k.string.charAt(Xe-2)!="\\"){Xe--;break}}else if(ye&&!ne){++Xe;break}}ye&&!ne&&(O.fatArrowAt=Xe)}}var N={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,import:!0,"jsonld-keyword":!0};function F(k,O,ae,he,ne,ye){this.indented=k,this.column=O,this.type=ae,this.prev=ne,this.info=ye,he!=null&&(this.align=he)}function D(k,O){if(!h)return!1;for(var ae=k.localVars;ae;ae=ae.next)if(ae.name==O)return!0;for(var he=k.context;he;he=he.prev)for(var ae=he.vars;ae;ae=ae.next)if(ae.name==O)return!0}function Q(k,O,ae,he,ne){var ye=k.cc;for(j.state=k,j.stream=ne,j.marked=null,j.cc=ye,j.style=O,k.lexical.hasOwnProperty("align")||(k.lexical.align=!0);;){var Xe=ye.length?ye.pop():s?Se:Oe;if(Xe(ae,he)){for(;ye.length&&ye[ye.length-1].lex;)ye.pop()();return j.marked?j.marked:ae=="variable"&&D(k,he)?"variable-2":O}}}var j={state:null,column:null,marked:null,cc:null};function V(){for(var k=arguments.length-1;k>=0;k--)j.cc.push(arguments[k])}function _(){return V.apply(null,arguments),!0}function K(k,O){for(var ae=O;ae;ae=ae.next)if(ae.name==k)return!0;return!1}function X(k){var O=j.state;if(j.marked="def",!!h){if(O.context){if(O.lexical.info=="var"&&O.context&&O.context.block){var ae=I(k,O.context);if(ae!=null){O.context=ae;return}}else if(!K(k,O.localVars)){O.localVars=new xe(k,O.localVars);return}}v.globalVars&&!K(k,O.globalVars)&&(O.globalVars=new xe(k,O.globalVars))}}function I(k,O){if(O)if(O.block){var ae=I(k,O.prev);return ae?ae==O.prev?O:new le(ae,O.vars,!0):null}else return K(k,O.vars)?O:new le(O.prev,new xe(k,O.vars),!1);else return null}function B(k){return k=="public"||k=="private"||k=="protected"||k=="abstract"||k=="readonly"}function le(k,O,ae){this.prev=k,this.vars=O,this.block=ae}function xe(k,O){this.name=k,this.next=O}var q=new xe("this",new xe("arguments",null));function L(){j.state.context=new le(j.state.context,j.state.localVars,!1),j.state.localVars=q}function de(){j.state.context=new le(j.state.context,j.state.localVars,!0),j.state.localVars=null}L.lex=de.lex=!0;function ze(){j.state.localVars=j.state.context.vars,j.state.context=j.state.context.prev}ze.lex=!0;function pe(k,O){var ae=function(){var he=j.state,ne=he.indented;if(he.lexical.type=="stat")ne=he.lexical.indented;else for(var ye=he.lexical;ye&&ye.type==")"&&ye.align;ye=ye.prev)ne=ye.indented;he.lexical=new F(ne,j.stream.column(),k,null,he.lexical,O)};return ae.lex=!0,ae}function Ee(){var k=j.state;k.lexical.prev&&(k.lexical.type==")"&&(k.indented=k.lexical.indented),k.lexical=k.lexical.prev)}Ee.lex=!0;function ge(k){function O(ae){return ae==k?_():k==";"||ae=="}"||ae==")"||ae=="]"?V():_(O)}return O}function Oe(k,O){return k=="var"?_(pe("vardef",O),Hr,ge(";"),Ee):k=="keyword a"?_(pe("form"),Ze,Oe,Ee):k=="keyword b"?_(pe("form"),Oe,Ee):k=="keyword d"?j.stream.match(/^\s*$/,!1)?_():_(pe("stat"),Je,ge(";"),Ee):k=="debugger"?_(ge(";")):k=="{"?_(pe("}"),de,De,Ee,ze):k==";"?_():k=="if"?(j.state.lexical.info=="else"&&j.state.cc[j.state.cc.length-1]==Ee&&j.state.cc.pop()(),_(pe("form"),Ze,Oe,Ee,Br)):k=="function"?_(Bt):k=="for"?_(pe("form"),de,ei,Oe,ze,Ee):k=="class"||g&&O=="interface"?(j.marked="keyword",_(pe("form",k=="class"?k:O),Wr,Ee)):k=="variable"?g&&O=="declare"?(j.marked="keyword",_(Oe)):g&&(O=="module"||O=="enum"||O=="type")&&j.stream.match(/^\s*\w/,!1)?(j.marked="keyword",O=="enum"?_(Ae):O=="type"?_(ti,ge("operator"),Pe,ge(";")):_(pe("form"),Ct,ge("{"),pe("}"),De,Ee,Ee)):g&&O=="namespace"?(j.marked="keyword",_(pe("form"),Se,Oe,Ee)):g&&O=="abstract"?(j.marked="keyword",_(Oe)):_(pe("stat"),Ue):k=="switch"?_(pe("form"),Ze,ge("{"),pe("}","switch"),de,De,Ee,Ee,ze):k=="case"?_(Se,ge(":")):k=="default"?_(ge(":")):k=="catch"?_(pe("form"),L,qe,Oe,Ee,ze):k=="export"?_(pe("stat"),Ur,Ee):k=="import"?_(pe("stat"),gr,Ee):k=="async"?_(Oe):O=="@"?_(Se,Oe):V(pe("stat"),Se,ge(";"),Ee)}function qe(k){if(k=="(")return _($t,ge(")"))}function Se(k,O){return ke(k,O,!1)}function je(k,O){return ke(k,O,!0)}function Ze(k){return k!="("?V():_(pe(")"),Je,ge(")"),Ee)}function ke(k,O,ae){if(j.state.fatArrowAt==j.stream.start){var he=ae?Be:ce;if(k=="(")return _(L,pe(")"),W($t,")"),Ee,ge("=>"),he,ze);if(k=="variable")return V(L,Ct,ge("=>"),he,ze)}var ne=ae?Ge:He;return N.hasOwnProperty(k)?_(ne):k=="function"?_(Bt,ne):k=="class"||g&&O=="interface"?(j.marked="keyword",_(pe("form"),to,Ee)):k=="keyword c"||k=="async"?_(ae?je:Se):k=="("?_(pe(")"),Je,ge(")"),Ee,ne):k=="operator"||k=="spread"?_(ae?je:Se):k=="["?_(pe("]"),at,Ee,ne):k=="{"?se(Me,"}",null,ne):k=="quasi"?V(U,ne):k=="new"?_(te(ae)):_()}function Je(k){return k.match(/[;\}\)\],]/)?V():V(Se)}function He(k,O){return k==","?_(Je):Ge(k,O,!1)}function Ge(k,O,ae){var he=ae==!1?He:Ge,ne=ae==!1?Se:je;if(k=="=>")return _(L,ae?Be:ce,ze);if(k=="operator")return/\+\+|--/.test(O)||g&&O=="!"?_(he):g&&O=="<"&&j.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/,!1)?_(pe(">"),W(Pe,">"),Ee,he):O=="?"?_(Se,ge(":"),ne):_(ne);if(k=="quasi")return V(U,he);if(k!=";"){if(k=="(")return se(je,")","call",he);if(k==".")return _(we,he);if(k=="[")return _(pe("]"),Je,ge("]"),Ee,he);if(g&&O=="as")return j.marked="keyword",_(Pe,he);if(k=="regexp")return j.state.lastType=j.marked="operator",j.stream.backUp(j.stream.pos-j.stream.start-1),_(ne)}}function U(k,O){return k!="quasi"?V():O.slice(O.length-2)!="${"?_(U):_(Je,G)}function G(k){if(k=="}")return j.marked="string-2",j.state.tokenize=Z,_(U)}function ce(k){return re(j.stream,j.state),V(k=="{"?Oe:Se)}function Be(k){return re(j.stream,j.state),V(k=="{"?Oe:je)}function te(k){return function(O){return O=="."?_(k?oe:fe):O=="variable"&&g?_(Ft,k?Ge:He):V(k?je:Se)}}function fe(k,O){if(O=="target")return j.marked="keyword",_(He)}function oe(k,O){if(O=="target")return j.marked="keyword",_(Ge)}function Ue(k){return k==":"?_(Ee,Oe):V(He,ge(";"),Ee)}function we(k){if(k=="variable")return j.marked="property",_()}function Me(k,O){if(k=="async")return j.marked="property",_(Me);if(k=="variable"||j.style=="keyword"){if(j.marked="property",O=="get"||O=="set")return _(Le);var ae;return g&&j.state.fatArrowAt==j.stream.start&&(ae=j.stream.match(/^\s*:\s*/,!1))&&(j.state.fatArrowAt=j.stream.pos+ae[0].length),_($)}else{if(k=="number"||k=="string")return j.marked=S?"property":j.style+" property",_($);if(k=="jsonld-keyword")return _($);if(g&&B(O))return j.marked="keyword",_(Me);if(k=="[")return _(Se,nt,ge("]"),$);if(k=="spread")return _(je,$);if(O=="*")return j.marked="keyword",_(Me);if(k==":")return V($)}}function Le(k){return k!="variable"?V($):(j.marked="property",_(Bt))}function $(k){if(k==":")return _(je);if(k=="(")return V(Bt)}function W(k,O,ae){function he(ne,ye){if(ae?ae.indexOf(ne)>-1:ne==","){var Xe=j.state.lexical;return Xe.info=="call"&&(Xe.pos=(Xe.pos||0)+1),_(function(pt,Et){return pt==O||Et==O?V():V(k)},he)}return ne==O||ye==O?_():ae&&ae.indexOf(";")>-1?V(k):_(ge(O))}return function(ne,ye){return ne==O||ye==O?_():V(k,he)}}function se(k,O,ae){for(var he=3;he"),Pe);if(k=="quasi")return V(_t,Ht)}function xt(k){if(k=="=>")return _(Pe)}function Fe(k){return k.match(/[\}\)\]]/)?_():k==","||k==";"?_(Fe):V(nr,Fe)}function nr(k,O){if(k=="variable"||j.style=="keyword")return j.marked="property",_(nr);if(O=="?"||k=="number"||k=="string")return _(nr);if(k==":")return _(Pe);if(k=="[")return _(ge("variable"),dt,ge("]"),nr);if(k=="(")return V(hr,nr);if(!k.match(/[;\}\)\],]/))return _()}function _t(k,O){return k!="quasi"?V():O.slice(O.length-2)!="${"?_(_t):_(Pe,it)}function it(k){if(k=="}")return j.marked="string-2",j.state.tokenize=Z,_(_t)}function ot(k,O){return k=="variable"&&j.stream.match(/^\s*[?:]/,!1)||O=="?"?_(ot):k==":"?_(Pe):k=="spread"?_(ot):V(Pe)}function Ht(k,O){if(O=="<")return _(pe(">"),W(Pe,">"),Ee,Ht);if(O=="|"||k=="."||O=="&")return _(Pe);if(k=="[")return _(Pe,ge("]"),Ht);if(O=="extends"||O=="implements")return j.marked="keyword",_(Pe);if(O=="?")return _(Pe,ge(":"),Pe)}function Ft(k,O){if(O=="<")return _(pe(">"),W(Pe,">"),Ee,Ht)}function Wt(){return V(Pe,kt)}function kt(k,O){if(O=="=")return _(Pe)}function Hr(k,O){return O=="enum"?(j.marked="keyword",_(Ae)):V(Ct,nt,Ut,eo)}function Ct(k,O){if(g&&B(O))return j.marked="keyword",_(Ct);if(k=="variable")return X(O),_();if(k=="spread")return _(Ct);if(k=="[")return se(yn,"]");if(k=="{")return se(dr,"}")}function dr(k,O){return k=="variable"&&!j.stream.match(/^\s*:/,!1)?(X(O),_(Ut)):(k=="variable"&&(j.marked="property"),k=="spread"?_(Ct):k=="}"?V():k=="["?_(Se,ge("]"),ge(":"),dr):_(ge(":"),Ct,Ut))}function yn(){return V(Ct,Ut)}function Ut(k,O){if(O=="=")return _(je)}function eo(k){if(k==",")return _(Hr)}function Br(k,O){if(k=="keyword b"&&O=="else")return _(pe("form","else"),Oe,Ee)}function ei(k,O){if(O=="await")return _(ei);if(k=="(")return _(pe(")"),xn,Ee)}function xn(k){return k=="var"?_(Hr,pr):k=="variable"?_(pr):V(pr)}function pr(k,O){return k==")"?_():k==";"?_(pr):O=="in"||O=="of"?(j.marked="keyword",_(Se,pr)):V(Se,pr)}function Bt(k,O){if(O=="*")return j.marked="keyword",_(Bt);if(k=="variable")return X(O),_(Bt);if(k=="(")return _(L,pe(")"),W($t,")"),Ee,Pt,Oe,ze);if(g&&O=="<")return _(pe(">"),W(Wt,">"),Ee,Bt)}function hr(k,O){if(O=="*")return j.marked="keyword",_(hr);if(k=="variable")return X(O),_(hr);if(k=="(")return _(L,pe(")"),W($t,")"),Ee,Pt,ze);if(g&&O=="<")return _(pe(">"),W(Wt,">"),Ee,hr)}function ti(k,O){if(k=="keyword"||k=="variable")return j.marked="type",_(ti);if(O=="<")return _(pe(">"),W(Wt,">"),Ee)}function $t(k,O){return O=="@"&&_(Se,$t),k=="spread"?_($t):g&&B(O)?(j.marked="keyword",_($t)):g&&k=="this"?_(nt,Ut):V(Ct,nt,Ut)}function to(k,O){return k=="variable"?Wr(k,O):Kt(k,O)}function Wr(k,O){if(k=="variable")return X(O),_(Kt)}function Kt(k,O){if(O=="<")return _(pe(">"),W(Wt,">"),Ee,Kt);if(O=="extends"||O=="implements"||g&&k==",")return O=="implements"&&(j.marked="keyword"),_(g?Pe:Se,Kt);if(k=="{")return _(pe("}"),Gt,Ee)}function Gt(k,O){if(k=="async"||k=="variable"&&(O=="static"||O=="get"||O=="set"||g&&B(O))&&j.stream.match(/^\s+#?[\w$\xa1-\uffff]/,!1))return j.marked="keyword",_(Gt);if(k=="variable"||j.style=="keyword")return j.marked="property",_(Cr,Gt);if(k=="number"||k=="string")return _(Cr,Gt);if(k=="[")return _(Se,nt,ge("]"),Cr,Gt);if(O=="*")return j.marked="keyword",_(Gt);if(g&&k=="(")return V(hr,Gt);if(k==";"||k==",")return _(Gt);if(k=="}")return _();if(O=="@")return _(Se,Gt)}function Cr(k,O){if(O=="!"||O=="?")return _(Cr);if(k==":")return _(Pe,Ut);if(O=="=")return _(je);var ae=j.state.lexical.prev,he=ae&&ae.info=="interface";return V(he?hr:Bt)}function Ur(k,O){return O=="*"?(j.marked="keyword",_(Gr,ge(";"))):O=="default"?(j.marked="keyword",_(Se,ge(";"))):k=="{"?_(W($r,"}"),Gr,ge(";")):V(Oe)}function $r(k,O){if(O=="as")return j.marked="keyword",_(ge("variable"));if(k=="variable")return V(je,$r)}function gr(k){return k=="string"?_():k=="("?V(Se):k=="."?V(He):V(Kr,Vt,Gr)}function Kr(k,O){return k=="{"?se(Kr,"}"):(k=="variable"&&X(O),O=="*"&&(j.marked="keyword"),_(_n))}function Vt(k){if(k==",")return _(Kr,Vt)}function _n(k,O){if(O=="as")return j.marked="keyword",_(Kr)}function Gr(k,O){if(O=="from")return j.marked="keyword",_(Se)}function at(k){return k=="]"?_():V(W(je,"]"))}function Ae(){return V(pe("form"),Ct,ge("{"),pe("}"),W(ir,"}"),Ee,Ee)}function ir(){return V(Ct,Ut)}function kn(k,O){return k.lastType=="operator"||k.lastType==","||c.test(O.charAt(0))||/[,.]/.test(O.charAt(0))}function jt(k,O,ae){return O.tokenize==R&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(O.lastType)||O.lastType=="quasi"&&/\{\s*$/.test(k.string.slice(0,k.pos-(ae||0)))}return{startState:function(k){var O={tokenize:R,lastType:"sof",cc:[],lexical:new F((k||0)-C,0,"block",!1),localVars:v.localVars,context:v.localVars&&new le(null,null,!1),indented:k||0};return v.globalVars&&typeof v.globalVars=="object"&&(O.globalVars=v.globalVars),O},token:function(k,O){if(k.sol()&&(O.lexical.hasOwnProperty("align")||(O.lexical.align=!1),O.indented=k.indentation(),re(k,O)),O.tokenize!=H&&k.eatSpace())return null;var ae=O.tokenize(k,O);return E=="comment"?ae:(O.lastType=E=="operator"&&(z=="++"||z=="--")?"incdec":E,Q(O,ae,E,z,k))},indent:function(k,O){if(k.tokenize==H||k.tokenize==Z)return o.Pass;if(k.tokenize!=R)return 0;var ae=O&&O.charAt(0),he=k.lexical,ne;if(!/^\s*else\b/.test(O))for(var ye=k.cc.length-1;ye>=0;--ye){var Xe=k.cc[ye];if(Xe==Ee)he=he.prev;else if(Xe!=Br&&Xe!=ze)break}for(;(he.type=="stat"||he.type=="form")&&(ae=="}"||(ne=k.cc[k.cc.length-1])&&(ne==He||ne==Ge)&&!/^[,\.=+\-*:?[\(]/.test(O));)he=he.prev;b&&he.type==")"&&he.prev.type=="stat"&&(he=he.prev);var pt=he.type,Et=ae==pt;return pt=="vardef"?he.indented+(k.lastType=="operator"||k.lastType==","?he.info.length+1:0):pt=="form"&&ae=="{"?he.indented:pt=="form"?he.indented+C:pt=="stat"?he.indented+(kn(k,O)?b||C:0):he.info=="switch"&&!Et&&v.doubleIndentSwitch!=!1?he.indented+(/^(?:case|default)\b/.test(O)?C:2*C):he.align?he.column+(Et?0:1):he.indented+(Et?0:C)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:s?null:"/*",blockCommentEnd:s?null:"*/",blockCommentContinue:s?null:" * ",lineComment:s?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:s?"json":"javascript",jsonldMode:S,jsonMode:s,expressionAllowed:jt,skipExpression:function(k){Q(k,"atom","atom","true",new o.StringStream("",2,null))}}}),o.registerHelper("wordChars","javascript",/[\w$]/),o.defineMIME("text/javascript","javascript"),o.defineMIME("text/ecmascript","javascript"),o.defineMIME("application/javascript","javascript"),o.defineMIME("application/x-javascript","javascript"),o.defineMIME("application/ecmascript","javascript"),o.defineMIME("application/json",{name:"javascript",json:!0}),o.defineMIME("application/x-json",{name:"javascript",json:!0}),o.defineMIME("application/manifest+json",{name:"javascript",json:!0}),o.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),o.defineMIME("text/typescript",{name:"javascript",typescript:!0}),o.defineMIME("application/typescript",{name:"javascript",typescript:!0})})});var Qn=Ke((Os,Ps)=>{(function(o){typeof Os=="object"&&typeof Ps=="object"?o(We(),mn(),vn(),gn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],o):o(CodeMirror)})(function(o){"use strict";var p={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};function v(T,x,c){var d=T.current(),w=d.search(x);return w>-1?T.backUp(d.length-w):d.match(/<\/?$/)&&(T.backUp(d.length),T.match(x,!1)||T.match(d)),c}var C={};function b(T){var x=C[T];return x||(C[T]=new RegExp("\\s+"+T+`\\s*=\\s*('|")?([^'"]+)('|")?\\s*`))}function S(T,x){var c=T.match(b(x));return c?/^\s*(.*?)\s*$/.exec(c[2])[1]:""}function s(T,x){return new RegExp((x?"^":"")+"","i")}function h(T,x){for(var c in T)for(var d=x[c]||(x[c]=[]),w=T[c],E=w.length-1;E>=0;E--)d.unshift(w[E])}function g(T,x){for(var c=0;c=0;z--)d.script.unshift(["type",E[z].matches,E[z].mode]);function y(R,M){var H=c.token(R,M.htmlState),Z=/\btag\b/.test(H),ee;if(Z&&!/[<>\s\/]/.test(R.current())&&(ee=M.htmlState.tagName&&M.htmlState.tagName.toLowerCase())&&d.hasOwnProperty(ee))M.inTag=ee+" ";else if(M.inTag&&Z&&/>$/.test(R.current())){var re=/^([\S]+) (.*)/.exec(M.inTag);M.inTag=null;var N=R.current()==">"&&g(d[re[1]],re[2]),F=o.getMode(T,N),D=s(re[1],!0),Q=s(re[1],!1);M.token=function(j,V){return j.match(D,!1)?(V.token=y,V.localState=V.localMode=null,null):v(j,Q,V.localMode.token(j,V.localState))},M.localMode=F,M.localState=o.startState(F,c.indent(M.htmlState,"",""))}else M.inTag&&(M.inTag+=R.current(),R.eol()&&(M.inTag+=" "));return H}return{startState:function(){var R=o.startState(c);return{token:y,inTag:null,localMode:null,localState:null,htmlState:R}},copyState:function(R){var M;return R.localState&&(M=o.copyState(R.localMode,R.localState)),{token:R.token,inTag:R.inTag,localMode:R.localMode,localState:M,htmlState:o.copyState(c,R.htmlState)}},token:function(R,M){return M.token(R,M)},indent:function(R,M,H){return!R.localMode||/^\s*<\//.test(M)?c.indent(R.htmlState,M,H):R.localMode.indent?R.localMode.indent(R.localState,M,H):o.Pass},innerMode:function(R){return{state:R.localState||R.htmlState,mode:R.localMode||c}}}},"xml","javascript","css"),o.defineMIME("text/html","htmlmixed")})});var Hs=Ke((js,Rs)=>{(function(o){typeof js=="object"&&typeof Rs=="object"?o(We(),Qn(),Yn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../../addon/mode/overlay"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("django:inner",function(){var p=["block","endblock","for","endfor","true","false","filter","endfilter","loop","none","self","super","if","elif","endif","as","else","import","with","endwith","without","context","ifequal","endifequal","ifnotequal","endifnotequal","extends","include","load","comment","endcomment","empty","url","static","trans","blocktrans","endblocktrans","now","regroup","lorem","ifchanged","endifchanged","firstof","debug","cycle","csrf_token","autoescape","endautoescape","spaceless","endspaceless","ssi","templatetag","verbatim","endverbatim","widthratio"],v=["add","addslashes","capfirst","center","cut","date","default","default_if_none","dictsort","dictsortreversed","divisibleby","escape","escapejs","filesizeformat","first","floatformat","force_escape","get_digit","iriencode","join","last","length","length_is","linebreaks","linebreaksbr","linenumbers","ljust","lower","make_list","phone2numeric","pluralize","pprint","random","removetags","rjust","safe","safeseq","slice","slugify","stringformat","striptags","time","timesince","timeuntil","title","truncatechars","truncatechars_html","truncatewords","truncatewords_html","unordered_list","upper","urlencode","urlize","urlizetrunc","wordcount","wordwrap","yesno"],C=["==","!=","<",">","<=",">="],b=["in","not","or","and"];p=new RegExp("^\\b("+p.join("|")+")\\b"),v=new RegExp("^\\b("+v.join("|")+")\\b"),C=new RegExp("^\\b("+C.join("|")+")\\b"),b=new RegExp("^\\b("+b.join("|")+")\\b");function S(c,d){if(c.match("{{"))return d.tokenize=h,"tag";if(c.match("{%"))return d.tokenize=g,"tag";if(c.match("{#"))return d.tokenize=T,"comment";for(;c.next()!=null&&!c.match(/\{[{%#]/,!1););return null}function s(c,d){return function(w,E){if(!E.escapeNext&&w.eat(c))E.tokenize=d;else{E.escapeNext&&(E.escapeNext=!1);var z=w.next();z=="\\"&&(E.escapeNext=!0)}return"string"}}function h(c,d){if(d.waitDot){if(d.waitDot=!1,c.peek()!=".")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("."))return d.waitProperty=!0,"null";throw Error("Unexpected error while waiting for property.")}if(d.waitPipe){if(d.waitPipe=!1,c.peek()!="|")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("|"))return d.waitFilter=!0,"null";throw Error("Unexpected error while waiting for filter.")}return d.waitProperty&&(d.waitProperty=!1,c.match(/\b(\w+)\b/))?(d.waitDot=!0,d.waitPipe=!0,"property"):d.waitFilter&&(d.waitFilter=!1,c.match(v))?"variable-2":c.eatSpace()?(d.waitProperty=!1,"null"):c.match(/\b\d+(\.\d+)?\b/)?"number":c.match("'")?(d.tokenize=s("'",d.tokenize),"string"):c.match('"')?(d.tokenize=s('"',d.tokenize),"string"):c.match(/\b(\w+)\b/)&&!d.foundVariable?(d.waitDot=!0,d.waitPipe=!0,"variable"):c.match("}}")?(d.waitProperty=null,d.waitFilter=null,d.waitDot=null,d.waitPipe=null,d.tokenize=S,"tag"):(c.next(),"null")}function g(c,d){if(d.waitDot){if(d.waitDot=!1,c.peek()!=".")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("."))return d.waitProperty=!0,"null";throw Error("Unexpected error while waiting for property.")}if(d.waitPipe){if(d.waitPipe=!1,c.peek()!="|")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("|"))return d.waitFilter=!0,"null";throw Error("Unexpected error while waiting for filter.")}if(d.waitProperty&&(d.waitProperty=!1,c.match(/\b(\w+)\b/)))return d.waitDot=!0,d.waitPipe=!0,"property";if(d.waitFilter&&(d.waitFilter=!1,c.match(v)))return"variable-2";if(c.eatSpace())return d.waitProperty=!1,"null";if(c.match(/\b\d+(\.\d+)?\b/))return"number";if(c.match("'"))return d.tokenize=s("'",d.tokenize),"string";if(c.match('"'))return d.tokenize=s('"',d.tokenize),"string";if(c.match(C))return"operator";if(c.match(b))return"keyword";var w=c.match(p);return w?(w[0]=="comment"&&(d.blockCommentTag=!0),"keyword"):c.match(/\b(\w+)\b/)?(d.waitDot=!0,d.waitPipe=!0,"variable"):c.match("%}")?(d.waitProperty=null,d.waitFilter=null,d.waitDot=null,d.waitPipe=null,d.blockCommentTag?(d.blockCommentTag=!1,d.tokenize=x):d.tokenize=S,"tag"):(c.next(),"null")}function T(c,d){return c.match(/^.*?#\}/)?d.tokenize=S:c.skipToEnd(),"comment"}function x(c,d){return c.match(/\{%\s*endcomment\s*%\}/,!1)?(d.tokenize=g,c.match("{%"),"tag"):(c.next(),"comment")}return{startState:function(){return{tokenize:S}},token:function(c,d){return d.tokenize(c,d)},blockCommentStart:"{% comment %}",blockCommentEnd:"{% endcomment %}"}}),o.defineMode("django",function(p){var v=o.getMode(p,"text/html"),C=o.getMode(p,"django:inner");return o.overlayMode(v,C)}),o.defineMIME("text/x-django","django")})});var Di=Ke((Bs,Ws)=>{(function(o){typeof Bs=="object"&&typeof Ws=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode=function(x,c){o.defineMode(x,function(d){return o.simpleMode(d,c)})},o.simpleMode=function(x,c){p(c,"start");var d={},w=c.meta||{},E=!1;for(var z in c)if(z!=w&&c.hasOwnProperty(z))for(var y=d[z]=[],R=c[z],M=0;M2&&H.token&&typeof H.token!="string"){for(var re=2;re-1)return o.Pass;var z=d.indent.length-1,y=x[d.state];e:for(;;){for(var R=0;R{(function(o){typeof Us=="object"&&typeof $s=="object"?o(We(),Di()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple"],o):o(CodeMirror)})(function(o){"use strict";var p="from",v=new RegExp("^(\\s*)\\b("+p+")\\b","i"),C=["run","cmd","entrypoint","shell"],b=new RegExp("^(\\s*)("+C.join("|")+")(\\s+\\[)","i"),S="expose",s=new RegExp("^(\\s*)("+S+")(\\s+)","i"),h=["arg","from","maintainer","label","env","add","copy","volume","user","workdir","onbuild","stopsignal","healthcheck","shell"],g=[p,S].concat(C).concat(h),T="("+g.join("|")+")",x=new RegExp("^(\\s*)"+T+"(\\s*)(#.*)?$","i"),c=new RegExp("^(\\s*)"+T+"(\\s+)","i");o.defineSimpleMode("dockerfile",{start:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:v,token:[null,"keyword"],sol:!0,next:"from"},{regex:x,token:[null,"keyword",null,"error"],sol:!0},{regex:b,token:[null,"keyword",null],sol:!0,next:"array"},{regex:s,token:[null,"keyword",null],sol:!0,next:"expose"},{regex:c,token:[null,"keyword",null],sol:!0,next:"arguments"},{regex:/./,token:null}],from:[{regex:/\s*$/,token:null,next:"start"},{regex:/(\s*)(#.*)$/,token:[null,"error"],next:"start"},{regex:/(\s*\S+\s+)(as)/i,token:[null,"keyword"],next:"start"},{token:null,next:"start"}],single:[{regex:/(?:[^\\']|\\.)/,token:"string"},{regex:/'/,token:"string",pop:!0}],double:[{regex:/(?:[^\\"]|\\.)/,token:"string"},{regex:/"/,token:"string",pop:!0}],array:[{regex:/\]/,token:null,next:"start"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"}],expose:[{regex:/\d+$/,token:"number",next:"start"},{regex:/[^\d]+$/,token:null,next:"start"},{regex:/\d+/,token:"number"},{regex:/[^\d]+/,token:null},{token:null,next:"start"}],arguments:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:/"(?:[^\\"]|\\.)*"?$/,token:"string",next:"start"},{regex:/"/,token:"string",push:"double"},{regex:/'(?:[^\\']|\\.)*'?$/,token:"string",next:"start"},{regex:/'/,token:"string",push:"single"},{regex:/[^#"']+[\\`]$/,token:null},{regex:/[^#"']+$/,token:null,next:"start"},{regex:/[^#"']+/,token:null},{token:null,next:"start"}],meta:{lineComment:"#"}}),o.defineMIME("text/x-dockerfile","dockerfile")})});var Xs=Ke((Gs,Zs)=>{(function(o){typeof Gs=="object"&&typeof Zs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-encrypted","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["asc","pgp","sig"]},{name:"ASN.1",mime:"text/x-ttcn-asn",mode:"asn.1",ext:["asn","asn1"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"Brainfuck",mime:"text/x-brainfuck",mode:"brainfuck",ext:["b","bf"]},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h","ino"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy","cbl"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp","cs"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj","cljc","cljx"]},{name:"ClojureScript",mime:"text/x-clojurescript",mode:"clojure",ext:["cljs"]},{name:"Closure Stylesheets (GSS)",mime:"text/x-gss",mode:"css",ext:["gss"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists\.txt$/},{name:"CoffeeScript",mimes:["application/vnd.coffeescript","text/coffeescript","text/x-coffeescript"],mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"Crystal",mime:"text/x-crystal",mode:"crystal",ext:["cr"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"edn",mime:"application/edn",mode:"clojure",ext:["edn"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Elm",mime:"text/x-elm",mode:"elm",ext:["elm"]},{name:"Embedded JavaScript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Esper",mime:"text/x-esper",mode:"sql"},{name:"Factor",mime:"text/x-factor",mode:"factor",ext:["factor"]},{name:"FCL",mime:"text/x-fcl",mode:"fcl"},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90","f95"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history)\.md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy","gradle"],file:/^Jenkinsfile$/},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haskell (Literate)",mime:"text/x-literate-haskell",mode:"haskell-literate",ext:["lhs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm","handlebars","hbs"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Pug",mime:"text/x-pug",mode:"pug",ext:["jade","pug"],alias:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"JSX",mime:"text/jsx",mode:"jsx",ext:["jsx"]},{name:"Jinja2",mime:"text/jinja2",mode:"jinja2",ext:["j2","jinja","jinja2"]},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"],alias:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"clike",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb","wl","wls"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps",ext:["mps"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"mbox",mime:"application/mbox",mode:"mbox",ext:["mbox"]},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NSIS",mime:"text/x-nsis",mode:"nsis",ext:["nsh","nsi"]},{name:"NTriples",mimes:["application/n-triples","application/n-quads","text/n-triples"],mode:"ntriples",ext:["nt","nq"]},{name:"Objective-C",mime:"text/x-objectivec",mode:"clike",ext:["m"],alias:["objective-c","objc"]},{name:"Objective-C++",mime:"text/x-objectivec++",mode:"clike",ext:["mm"],alias:["objective-c++","objc++"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Oz",mime:"text/x-oz",mode:"oz",ext:["oz"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mimes:["text/x-php","application/x-httpd-php","application/x-httpd-php-open"],mode:"php",ext:["php","php3","php4","php5","php7","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"PostgreSQL",mime:"text/x-pgsql",mode:"sql"},{name:"PowerShell",mime:"application/x-powershell",mode:"powershell",ext:["ps1","psd1","psm1"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"ProtoBuf",mime:"text/x-protobuf",mode:"protobuf",ext:["proto"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["BUILD","bzl","py","pyw"],file:/^(BUCK|BUILD)$/},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r","R"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"SAS",mime:"text/x-sas",mode:"sas",ext:["sas"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mimes:["text/x-sh","application/x-sh"],mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"],file:/^PKGBUILD$/},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"SML",mime:"text/x-sml",mode:"mllike",ext:["sml","sig","fun","smackspec"]},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"SQLite",mime:"text/x-sqlite",mode:"sql"},{name:"Squirrel",mime:"text/x-squirrel",mode:"clike",ext:["nut"]},{name:"Stylus",mime:"text/x-styl",mode:"stylus",ext:["styl"]},{name:"Swift",mime:"text/x-swift",mode:"swift",ext:["swift"]},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx","tex"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v","sv","svh"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"text/troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"TTCN",mime:"text/x-ttcn",mode:"ttcn",ext:["ttcn","ttcn3","ttcnpp"]},{name:"TTCN_CFG",mime:"text/x-ttcn-cfg",mode:"ttcn-cfg",ext:["cfg"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"TypeScript-JSX",mime:"text/typescript-jsx",mode:"jsx",ext:["tsx"],alias:["tsx"]},{name:"Twig",mime:"text/x-twig",mode:"twig"},{name:"Web IDL",mime:"text/x-webidl",mode:"webidl",ext:["webidl"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"VHDL",mime:"text/x-vhdl",mode:"vhdl",ext:["vhd","vhdl"]},{name:"Vue.js Component",mimes:["script/x-vue","text/x-vue"],mode:"vue",ext:["vue"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd","svg"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"Yacas",mime:"text/x-yacas",mode:"yacas",ext:["ys"]},{name:"YAML",mimes:["text/x-yaml","text/yaml"],mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]},{name:"mscgen",mime:"text/x-mscgen",mode:"mscgen",ext:["mscgen","mscin","msc"]},{name:"xu",mime:"text/x-xu",mode:"mscgen",ext:["xu"]},{name:"msgenny",mime:"text/x-msgenny",mode:"mscgen",ext:["msgenny"]},{name:"WebAssembly",mime:"text/webassembly",mode:"wast",ext:["wat","wast"]}];for(var p=0;p-1&&C.substring(s+1,C.length);if(h)return o.findModeByExtension(h)},o.findModeByName=function(C){C=C.toLowerCase();for(var b=0;b{(function(o){typeof Ys=="object"&&typeof Qs=="object"?o(We(),mn(),Xs()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../meta"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("markdown",function(p,v){var C=o.getMode(p,"text/html"),b=C.name=="null";function S(q){if(o.findModeByName){var L=o.findModeByName(q);L&&(q=L.mime||L.mimes[0])}var de=o.getMode(p,q);return de.name=="null"?null:de}v.highlightFormatting===void 0&&(v.highlightFormatting=!1),v.maxBlockquoteDepth===void 0&&(v.maxBlockquoteDepth=0),v.taskLists===void 0&&(v.taskLists=!1),v.strikethrough===void 0&&(v.strikethrough=!1),v.emoji===void 0&&(v.emoji=!1),v.fencedCodeBlockHighlighting===void 0&&(v.fencedCodeBlockHighlighting=!0),v.fencedCodeBlockDefaultMode===void 0&&(v.fencedCodeBlockDefaultMode="text/plain"),v.xml===void 0&&(v.xml=!0),v.tokenTypeOverrides===void 0&&(v.tokenTypeOverrides={});var s={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"image",imageAltText:"image-alt-text",imageMarker:"image-marker",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough",emoji:"builtin"};for(var h in s)s.hasOwnProperty(h)&&v.tokenTypeOverrides[h]&&(s[h]=v.tokenTypeOverrides[h]);var g=/^([*\-_])(?:\s*\1){2,}\s*$/,T=/^(?:[*\-+]|^[0-9]+([.)]))\s+/,x=/^\[(x| )\](?=\s)/i,c=v.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,d=/^ {0,3}(?:\={1,}|-{2,})\s*$/,w=/^[^#!\[\]*_\\<>` "'(~:]+/,E=/^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/,z=/^\s*\[[^\]]+?\]:.*$/,y=/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/,R=" ";function M(q,L,de){return L.f=L.inline=de,de(q,L)}function H(q,L,de){return L.f=L.block=de,de(q,L)}function Z(q){return!q||!/\S/.test(q.string)}function ee(q){if(q.linkTitle=!1,q.linkHref=!1,q.linkText=!1,q.em=!1,q.strong=!1,q.strikethrough=!1,q.quote=0,q.indentedCode=!1,q.f==N){var L=b;if(!L){var de=o.innerMode(C,q.htmlState);L=de.mode.name=="xml"&&de.state.tagStart===null&&!de.state.context&&de.state.tokenize.isInText}L&&(q.f=j,q.block=re,q.htmlState=null)}return q.trailingSpace=0,q.trailingSpaceNewLine=!1,q.prevLine=q.thisLine,q.thisLine={stream:null},null}function re(q,L){var de=q.column()===L.indentation,ze=Z(L.prevLine.stream),pe=L.indentedCode,Ee=L.prevLine.hr,ge=L.list!==!1,Oe=(L.listStack[L.listStack.length-1]||0)+3;L.indentedCode=!1;var qe=L.indentation;if(L.indentationDiff===null&&(L.indentationDiff=L.indentation,ge)){for(L.list=null;qe=4&&(pe||L.prevLine.fencedCodeEnd||L.prevLine.header||ze))return q.skipToEnd(),L.indentedCode=!0,s.code;if(q.eatSpace())return null;if(de&&L.indentation<=Oe&&(Ze=q.match(c))&&Ze[1].length<=6)return L.quote=0,L.header=Ze[1].length,L.thisLine.header=!0,v.highlightFormatting&&(L.formatting="header"),L.f=L.inline,D(L);if(L.indentation<=Oe&&q.eat(">"))return L.quote=de?1:L.quote+1,v.highlightFormatting&&(L.formatting="quote"),q.eatSpace(),D(L);if(!je&&!L.setext&&de&&L.indentation<=Oe&&(Ze=q.match(T))){var ke=Ze[1]?"ol":"ul";return L.indentation=qe+q.current().length,L.list=!0,L.quote=0,L.listStack.push(L.indentation),L.em=!1,L.strong=!1,L.code=!1,L.strikethrough=!1,v.taskLists&&q.match(x,!1)&&(L.taskList=!0),L.f=L.inline,v.highlightFormatting&&(L.formatting=["list","list-"+ke]),D(L)}else{if(de&&L.indentation<=Oe&&(Ze=q.match(E,!0)))return L.quote=0,L.fencedEndRE=new RegExp(Ze[1]+"+ *$"),L.localMode=v.fencedCodeBlockHighlighting&&S(Ze[2]||v.fencedCodeBlockDefaultMode),L.localMode&&(L.localState=o.startState(L.localMode)),L.f=L.block=F,v.highlightFormatting&&(L.formatting="code-block"),L.code=-1,D(L);if(L.setext||(!Se||!ge)&&!L.quote&&L.list===!1&&!L.code&&!je&&!z.test(q.string)&&(Ze=q.lookAhead(1))&&(Ze=Ze.match(d)))return L.setext?(L.header=L.setext,L.setext=0,q.skipToEnd(),v.highlightFormatting&&(L.formatting="header")):(L.header=Ze[0].charAt(0)=="="?1:2,L.setext=L.header),L.thisLine.header=!0,L.f=L.inline,D(L);if(je)return q.skipToEnd(),L.hr=!0,L.thisLine.hr=!0,s.hr;if(q.peek()==="[")return M(q,L,I)}return M(q,L,L.inline)}function N(q,L){var de=C.token(q,L.htmlState);if(!b){var ze=o.innerMode(C,L.htmlState);(ze.mode.name=="xml"&&ze.state.tagStart===null&&!ze.state.context&&ze.state.tokenize.isInText||L.md_inside&&q.current().indexOf(">")>-1)&&(L.f=j,L.block=re,L.htmlState=null)}return de}function F(q,L){var de=L.listStack[L.listStack.length-1]||0,ze=L.indentation=q.quote?L.push(s.formatting+"-"+q.formatting[de]+"-"+q.quote):L.push("error"))}if(q.taskOpen)return L.push("meta"),L.length?L.join(" "):null;if(q.taskClosed)return L.push("property"),L.length?L.join(" "):null;if(q.linkHref?L.push(s.linkHref,"url"):(q.strong&&L.push(s.strong),q.em&&L.push(s.em),q.strikethrough&&L.push(s.strikethrough),q.emoji&&L.push(s.emoji),q.linkText&&L.push(s.linkText),q.code&&L.push(s.code),q.image&&L.push(s.image),q.imageAltText&&L.push(s.imageAltText,"link"),q.imageMarker&&L.push(s.imageMarker)),q.header&&L.push(s.header,s.header+"-"+q.header),q.quote&&(L.push(s.quote),!v.maxBlockquoteDepth||v.maxBlockquoteDepth>=q.quote?L.push(s.quote+"-"+q.quote):L.push(s.quote+"-"+v.maxBlockquoteDepth)),q.list!==!1){var ze=(q.listStack.length-1)%3;ze?ze===1?L.push(s.list2):L.push(s.list3):L.push(s.list1)}return q.trailingSpaceNewLine?L.push("trailing-space-new-line"):q.trailingSpace&&L.push("trailing-space-"+(q.trailingSpace%2?"a":"b")),L.length?L.join(" "):null}function Q(q,L){if(q.match(w,!0))return D(L)}function j(q,L){var de=L.text(q,L);if(typeof de<"u")return de;if(L.list)return L.list=null,D(L);if(L.taskList){var ze=q.match(x,!0)[1]===" ";return ze?L.taskOpen=!0:L.taskClosed=!0,v.highlightFormatting&&(L.formatting="task"),L.taskList=!1,D(L)}if(L.taskOpen=!1,L.taskClosed=!1,L.header&&q.match(/^#+$/,!0))return v.highlightFormatting&&(L.formatting="header"),D(L);var pe=q.next();if(L.linkTitle){L.linkTitle=!1;var Ee=pe;pe==="("&&(Ee=")"),Ee=(Ee+"").replace(/([.?*+^\[\]\\(){}|-])/g,"\\$1");var ge="^\\s*(?:[^"+Ee+"\\\\]+|\\\\\\\\|\\\\.)"+Ee;if(q.match(new RegExp(ge),!0))return s.linkHref}if(pe==="`"){var Oe=L.formatting;v.highlightFormatting&&(L.formatting="code"),q.eatWhile("`");var qe=q.current().length;if(L.code==0&&(!L.quote||qe==1))return L.code=qe,D(L);if(qe==L.code){var Se=D(L);return L.code=0,Se}else return L.formatting=Oe,D(L)}else if(L.code)return D(L);if(pe==="\\"&&(q.next(),v.highlightFormatting)){var je=D(L),Ze=s.formatting+"-escape";return je?je+" "+Ze:Ze}if(pe==="!"&&q.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return L.imageMarker=!0,L.image=!0,v.highlightFormatting&&(L.formatting="image"),D(L);if(pe==="["&&L.imageMarker&&q.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/,!1))return L.imageMarker=!1,L.imageAltText=!0,v.highlightFormatting&&(L.formatting="image"),D(L);if(pe==="]"&&L.imageAltText){v.highlightFormatting&&(L.formatting="image");var je=D(L);return L.imageAltText=!1,L.image=!1,L.inline=L.f=_,je}if(pe==="["&&!L.image)return L.linkText&&q.match(/^.*?\]/)||(L.linkText=!0,v.highlightFormatting&&(L.formatting="link")),D(L);if(pe==="]"&&L.linkText){v.highlightFormatting&&(L.formatting="link");var je=D(L);return L.linkText=!1,L.inline=L.f=q.match(/\(.*?\)| ?\[.*?\]/,!1)?_:j,je}if(pe==="<"&&q.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1)){L.f=L.inline=V,v.highlightFormatting&&(L.formatting="link");var je=D(L);return je?je+=" ":je="",je+s.linkInline}if(pe==="<"&&q.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1)){L.f=L.inline=V,v.highlightFormatting&&(L.formatting="link");var je=D(L);return je?je+=" ":je="",je+s.linkEmail}if(v.xml&&pe==="<"&&q.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i,!1)){var ke=q.string.indexOf(">",q.pos);if(ke!=-1){var Je=q.string.substring(q.start,ke);/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(Je)&&(L.md_inside=!0)}return q.backUp(1),L.htmlState=o.startState(C),H(q,L,N)}if(v.xml&&pe==="<"&&q.match(/^\/\w*?>/))return L.md_inside=!1,"tag";if(pe==="*"||pe==="_"){for(var He=1,Ge=q.pos==1?" ":q.string.charAt(q.pos-2);He<3&&q.eat(pe);)He++;var U=q.peek()||" ",G=!/\s/.test(U)&&(!y.test(U)||/\s/.test(Ge)||y.test(Ge)),ce=!/\s/.test(Ge)&&(!y.test(Ge)||/\s/.test(U)||y.test(U)),Be=null,te=null;if(He%2&&(!L.em&&G&&(pe==="*"||!ce||y.test(Ge))?Be=!0:L.em==pe&&ce&&(pe==="*"||!G||y.test(U))&&(Be=!1)),He>1&&(!L.strong&&G&&(pe==="*"||!ce||y.test(Ge))?te=!0:L.strong==pe&&ce&&(pe==="*"||!G||y.test(U))&&(te=!1)),te!=null||Be!=null){v.highlightFormatting&&(L.formatting=Be==null?"strong":te==null?"em":"strong em"),Be===!0&&(L.em=pe),te===!0&&(L.strong=pe);var Se=D(L);return Be===!1&&(L.em=!1),te===!1&&(L.strong=!1),Se}}else if(pe===" "&&(q.eat("*")||q.eat("_"))){if(q.peek()===" ")return D(L);q.backUp(1)}if(v.strikethrough){if(pe==="~"&&q.eatWhile(pe)){if(L.strikethrough){v.highlightFormatting&&(L.formatting="strikethrough");var Se=D(L);return L.strikethrough=!1,Se}else if(q.match(/^[^\s]/,!1))return L.strikethrough=!0,v.highlightFormatting&&(L.formatting="strikethrough"),D(L)}else if(pe===" "&&q.match("~~",!0)){if(q.peek()===" ")return D(L);q.backUp(2)}}if(v.emoji&&pe===":"&&q.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)){L.emoji=!0,v.highlightFormatting&&(L.formatting="emoji");var fe=D(L);return L.emoji=!1,fe}return pe===" "&&(q.match(/^ +$/,!1)?L.trailingSpace++:L.trailingSpace&&(L.trailingSpaceNewLine=!0)),D(L)}function V(q,L){var de=q.next();if(de===">"){L.f=L.inline=j,v.highlightFormatting&&(L.formatting="link");var ze=D(L);return ze?ze+=" ":ze="",ze+s.linkInline}return q.match(/^[^>]+/,!0),s.linkInline}function _(q,L){if(q.eatSpace())return null;var de=q.next();return de==="("||de==="["?(L.f=L.inline=X(de==="("?")":"]"),v.highlightFormatting&&(L.formatting="link-string"),L.linkHref=!0,D(L)):"error"}var K={")":/^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,"]":/^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/};function X(q){return function(L,de){var ze=L.next();if(ze===q){de.f=de.inline=j,v.highlightFormatting&&(de.formatting="link-string");var pe=D(de);return de.linkHref=!1,pe}return L.match(K[q]),de.linkHref=!0,D(de)}}function I(q,L){return q.match(/^([^\]\\]|\\.)*\]:/,!1)?(L.f=B,q.next(),v.highlightFormatting&&(L.formatting="link"),L.linkText=!0,D(L)):M(q,L,j)}function B(q,L){if(q.match("]:",!0)){L.f=L.inline=le,v.highlightFormatting&&(L.formatting="link");var de=D(L);return L.linkText=!1,de}return q.match(/^([^\]\\]|\\.)+/,!0),s.linkText}function le(q,L){return q.eatSpace()?null:(q.match(/^[^\s]+/,!0),q.peek()===void 0?L.linkTitle=!0:q.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/,!0),L.f=L.inline=j,s.linkHref+" url")}var xe={startState:function(){return{f:re,prevLine:{stream:null},thisLine:{stream:null},block:re,htmlState:null,indentation:0,inline:j,text:Q,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,setext:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,emoji:!1,fencedEndRE:null}},copyState:function(q){return{f:q.f,prevLine:q.prevLine,thisLine:q.thisLine,block:q.block,htmlState:q.htmlState&&o.copyState(C,q.htmlState),indentation:q.indentation,localMode:q.localMode,localState:q.localMode?o.copyState(q.localMode,q.localState):null,inline:q.inline,text:q.text,formatting:!1,linkText:q.linkText,linkTitle:q.linkTitle,linkHref:q.linkHref,code:q.code,em:q.em,strong:q.strong,strikethrough:q.strikethrough,emoji:q.emoji,header:q.header,setext:q.setext,hr:q.hr,taskList:q.taskList,list:q.list,listStack:q.listStack.slice(0),quote:q.quote,indentedCode:q.indentedCode,trailingSpace:q.trailingSpace,trailingSpaceNewLine:q.trailingSpaceNewLine,md_inside:q.md_inside,fencedEndRE:q.fencedEndRE}},token:function(q,L){if(L.formatting=!1,q!=L.thisLine.stream){if(L.header=0,L.hr=!1,q.match(/^\s*$/,!0))return ee(L),null;if(L.prevLine=L.thisLine,L.thisLine={stream:q},L.taskList=!1,L.trailingSpace=0,L.trailingSpaceNewLine=!1,!L.localState&&(L.f=L.block,L.f!=N)){var de=q.match(/^\s*/,!0)[0].replace(/\t/g,R).length;if(L.indentation=de,L.indentationDiff=null,de>0)return null}}return L.f(q,L)},innerMode:function(q){return q.block==N?{state:q.htmlState,mode:C}:q.localState?{state:q.localState,mode:q.localMode}:{state:q,mode:xe}},indent:function(q,L,de){return q.block==N&&C.indent?C.indent(q.htmlState,L,de):q.localState&&q.localMode.indent?q.localMode.indent(q.localState,L,de):o.Pass},blankLine:ee,getType:D,blockCommentStart:"",closeBrackets:"()[]{}''\"\"``",fold:"markdown"};return xe},"xml"),o.defineMIME("text/markdown","markdown"),o.defineMIME("text/x-markdown","markdown")})});var eu=Ke((Vs,Js)=>{(function(o){typeof Vs=="object"&&typeof Js=="object"?o(We(),Jo(),Yn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../markdown/markdown","../../addon/mode/overlay"],o):o(CodeMirror)})(function(o){"use strict";var p=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i;o.defineMode("gfm",function(v,C){var b=0;function S(T){return T.code=!1,null}var s={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(T){return{code:T.code,codeBlock:T.codeBlock,ateSpace:T.ateSpace}},token:function(T,x){if(x.combineTokens=null,x.codeBlock)return T.match(/^```+/)?(x.codeBlock=!1,null):(T.skipToEnd(),null);if(T.sol()&&(x.code=!1),T.sol()&&T.match(/^```+/))return T.skipToEnd(),x.codeBlock=!0,null;if(T.peek()==="`"){T.next();var c=T.pos;T.eatWhile("`");var d=1+T.pos-c;return x.code?d===b&&(x.code=!1):(b=d,x.code=!0),null}else if(x.code)return T.next(),null;if(T.eatSpace())return x.ateSpace=!0,null;if((T.sol()||x.ateSpace)&&(x.ateSpace=!1,C.gitHubSpice!==!1)){if(T.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/))return x.combineTokens=!0,"link";if(T.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return x.combineTokens=!0,"link"}return T.match(p)&&T.string.slice(T.start-2,T.start)!="]("&&(T.start==0||/\W/.test(T.string.charAt(T.start-1)))?(x.combineTokens=!0,"link"):(T.next(),null)},blankLine:S},h={taskLists:!0,strikethrough:!0,emoji:!0};for(var g in C)h[g]=C[g];return h.name="markdown",o.overlayMode(o.getMode(v,h),s)},"markdown"),o.defineMIME("text/x-gfm","gfm")})});var nu=Ke((tu,ru)=>{(function(o){typeof tu=="object"&&typeof ru=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("go",function(p){var v=p.indentUnit,C={break:!0,case:!0,chan:!0,const:!0,continue:!0,default:!0,defer:!0,else:!0,fallthrough:!0,for:!0,func:!0,go:!0,goto:!0,if:!0,import:!0,interface:!0,map:!0,package:!0,range:!0,return:!0,select:!0,struct:!0,switch:!0,type:!0,var:!0,bool:!0,byte:!0,complex64:!0,complex128:!0,float32:!0,float64:!0,int8:!0,int16:!0,int32:!0,int64:!0,string:!0,uint8:!0,uint16:!0,uint32:!0,uint64:!0,int:!0,uint:!0,uintptr:!0,error:!0,rune:!0,any:!0,comparable:!0},b={true:!0,false:!0,iota:!0,nil:!0,append:!0,cap:!0,close:!0,complex:!0,copy:!0,delete:!0,imag:!0,len:!0,make:!0,new:!0,panic:!0,print:!0,println:!0,real:!0,recover:!0},S=/[+\-*&^%:=<>!|\/]/,s;function h(w,E){var z=w.next();if(z=='"'||z=="'"||z=="`")return E.tokenize=g(z),E.tokenize(w,E);if(/[\d\.]/.test(z))return z=="."?w.match(/^[0-9_]+([eE][\-+]?[0-9_]+)?/):z=="0"?w.match(/^[xX][0-9a-fA-F_]+/)||w.match(/^[0-7_]+/):w.match(/^[0-9_]*\.?[0-9_]*([eE][\-+]?[0-9_]+)?/),"number";if(/[\[\]{}\(\),;\:\.]/.test(z))return s=z,null;if(z=="/"){if(w.eat("*"))return E.tokenize=T,T(w,E);if(w.eat("/"))return w.skipToEnd(),"comment"}if(S.test(z))return w.eatWhile(S),"operator";w.eatWhile(/[\w\$_\xa1-\uffff]/);var y=w.current();return C.propertyIsEnumerable(y)?((y=="case"||y=="default")&&(s="case"),"keyword"):b.propertyIsEnumerable(y)?"atom":"variable"}function g(w){return function(E,z){for(var y=!1,R,M=!1;(R=E.next())!=null;){if(R==w&&!y){M=!0;break}y=!y&&w!="`"&&R=="\\"}return(M||!(y||w=="`"))&&(z.tokenize=h),"string"}}function T(w,E){for(var z=!1,y;y=w.next();){if(y=="/"&&z){E.tokenize=h;break}z=y=="*"}return"comment"}function x(w,E,z,y,R){this.indented=w,this.column=E,this.type=z,this.align=y,this.prev=R}function c(w,E,z){return w.context=new x(w.indented,E,z,null,w.context)}function d(w){if(w.context.prev){var E=w.context.type;return(E==")"||E=="]"||E=="}")&&(w.indented=w.context.indented),w.context=w.context.prev}}return{startState:function(w){return{tokenize:null,context:new x((w||0)-v,0,"top",!1),indented:0,startOfLine:!0}},token:function(w,E){var z=E.context;if(w.sol()&&(z.align==null&&(z.align=!1),E.indented=w.indentation(),E.startOfLine=!0,z.type=="case"&&(z.type="}")),w.eatSpace())return null;s=null;var y=(E.tokenize||h)(w,E);return y=="comment"||(z.align==null&&(z.align=!0),s=="{"?c(E,w.column(),"}"):s=="["?c(E,w.column(),"]"):s=="("?c(E,w.column(),")"):s=="case"?z.type="case":(s=="}"&&z.type=="}"||s==z.type)&&d(E),E.startOfLine=!1),y},indent:function(w,E){if(w.tokenize!=h&&w.tokenize!=null)return o.Pass;var z=w.context,y=E&&E.charAt(0);if(z.type=="case"&&/^(?:case|default)\b/.test(E))return w.context.type="}",z.indented;var R=y==z.type;return z.align?z.column+(R?0:1):z.indented+(R?0:v)},electricChars:"{}):",closeBrackets:"()[]{}''\"\"``",fold:"brace",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//"}}),o.defineMIME("text/x-go","go")})});var au=Ke((iu,ou)=>{(function(o){typeof iu=="object"&&typeof ou=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("http",function(){function p(T,x){return T.skipToEnd(),x.cur=h,"error"}function v(T,x){return T.match(/^HTTP\/\d\.\d/)?(x.cur=C,"keyword"):T.match(/^[A-Z]+/)&&/[ \t]/.test(T.peek())?(x.cur=S,"keyword"):p(T,x)}function C(T,x){var c=T.match(/^\d+/);if(!c)return p(T,x);x.cur=b;var d=Number(c[0]);return d>=100&&d<200?"positive informational":d>=200&&d<300?"positive success":d>=300&&d<400?"positive redirect":d>=400&&d<500?"negative client-error":d>=500&&d<600?"negative server-error":"error"}function b(T,x){return T.skipToEnd(),x.cur=h,null}function S(T,x){return T.eatWhile(/\S/),x.cur=s,"string-2"}function s(T,x){return T.match(/^HTTP\/\d\.\d$/)?(x.cur=h,"keyword"):p(T,x)}function h(T){return T.sol()&&!T.eat(/[ \t]/)?T.match(/^.*?:/)?"atom":(T.skipToEnd(),"error"):(T.skipToEnd(),"string")}function g(T){return T.skipToEnd(),null}return{token:function(T,x){var c=x.cur;return c!=h&&c!=g&&T.eatSpace()?null:c(T,x)},blankLine:function(T){T.cur=g},startState:function(){return{cur:v}}}}),o.defineMIME("message/http","http")})});var uu=Ke((lu,su)=>{(function(o){typeof lu=="object"&&typeof su=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("jinja2",function(){var p=["and","as","block","endblock","by","cycle","debug","else","elif","extends","filter","endfilter","firstof","do","for","endfor","if","endif","ifchanged","endifchanged","ifequal","endifequal","ifnotequal","set","raw","endraw","endifnotequal","in","include","load","not","now","or","parsed","regroup","reversed","spaceless","call","endcall","macro","endmacro","endspaceless","ssi","templatetag","openblock","closeblock","openvariable","closevariable","without","context","openbrace","closebrace","opencomment","closecomment","widthratio","url","with","endwith","get_current_language","trans","endtrans","noop","blocktrans","endblocktrans","get_available_languages","get_current_language_bidi","pluralize","autoescape","endautoescape"],v=/^[+\-*&%=<>!?|~^]/,C=/^[:\[\(\{]/,b=["true","false"],S=/^(\d[+\-\*\/])?\d+(\.\d+)?/;p=new RegExp("(("+p.join(")|(")+"))\\b"),b=new RegExp("(("+b.join(")|(")+"))\\b");function s(h,g){var T=h.peek();if(g.incomment)return h.skipTo("#}")?(h.eatWhile(/\#|}/),g.incomment=!1):h.skipToEnd(),"comment";if(g.intag){if(g.operator){if(g.operator=!1,h.match(b))return"atom";if(h.match(S))return"number"}if(g.sign){if(g.sign=!1,h.match(b))return"atom";if(h.match(S))return"number"}if(g.instring)return T==g.instring&&(g.instring=!1),h.next(),"string";if(T=="'"||T=='"')return g.instring=T,h.next(),"string";if(g.inbraces>0&&T==")")h.next(),g.inbraces--;else if(T=="(")h.next(),g.inbraces++;else if(g.inbrackets>0&&T=="]")h.next(),g.inbrackets--;else if(T=="[")h.next(),g.inbrackets++;else{if(!g.lineTag&&(h.match(g.intag+"}")||h.eat("-")&&h.match(g.intag+"}")))return g.intag=!1,"tag";if(h.match(v))return g.operator=!0,"operator";if(h.match(C))g.sign=!0;else{if(h.column()==1&&g.lineTag&&h.match(p))return"keyword";if(h.eat(" ")||h.sol()){if(h.match(p))return"keyword";if(h.match(b))return"atom";if(h.match(S))return"number";h.sol()&&h.next()}else h.next()}}return"variable"}else if(h.eat("{")){if(h.eat("#"))return g.incomment=!0,h.skipTo("#}")?(h.eatWhile(/\#|}/),g.incomment=!1):h.skipToEnd(),"comment";if(T=h.eat(/\{|%/))return g.intag=T,g.inbraces=0,g.inbrackets=0,T=="{"&&(g.intag="}"),h.eat("-"),"tag"}else if(h.eat("#")){if(h.peek()=="#")return h.skipToEnd(),"comment";if(!h.eol())return g.intag=!0,g.lineTag=!0,g.inbraces=0,g.inbrackets=0,"tag"}h.next()}return{startState:function(){return{tokenize:s,inbrackets:0,inbraces:0}},token:function(h,g){var T=g.tokenize(h,g);return h.eol()&&g.lineTag&&!g.instring&&g.inbraces==0&&g.inbrackets==0&&(g.intag=!1,g.lineTag=!1),T},blockCommentStart:"{#",blockCommentEnd:"#}",lineComment:"##"}}),o.defineMIME("text/jinja2","jinja2")})});var du=Ke((cu,fu)=>{(function(o){typeof cu=="object"&&typeof fu=="object"?o(We(),mn(),vn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript"],o):o(CodeMirror)})(function(o){"use strict";function p(C,b,S,s){this.state=C,this.mode=b,this.depth=S,this.prev=s}function v(C){return new p(o.copyState(C.mode,C.state),C.mode,C.depth,C.prev&&v(C.prev))}o.defineMode("jsx",function(C,b){var S=o.getMode(C,{name:"xml",allowMissing:!0,multilineTagIndentPastTag:!1,allowMissingTagName:!0}),s=o.getMode(C,b&&b.base||"javascript");function h(c){var d=c.tagName;c.tagName=null;var w=S.indent(c,"","");return c.tagName=d,w}function g(c,d){return d.context.mode==S?T(c,d,d.context):x(c,d,d.context)}function T(c,d,w){if(w.depth==2)return c.match(/^.*?\*\//)?w.depth=1:c.skipToEnd(),"comment";if(c.peek()=="{"){S.skipAttribute(w.state);var E=h(w.state),z=w.state.context;if(z&&c.match(/^[^>]*>\s*$/,!1)){for(;z.prev&&!z.startOfLine;)z=z.prev;z.startOfLine?E-=C.indentUnit:w.prev.state.lexical&&(E=w.prev.state.lexical.indented)}else w.depth==1&&(E+=C.indentUnit);return d.context=new p(o.startState(s,E),s,0,d.context),null}if(w.depth==1){if(c.peek()=="<")return S.skipAttribute(w.state),d.context=new p(o.startState(S,h(w.state)),S,0,d.context),null;if(c.match("//"))return c.skipToEnd(),"comment";if(c.match("/*"))return w.depth=2,g(c,d)}var y=S.token(c,w.state),R=c.current(),M;return/\btag\b/.test(y)?/>$/.test(R)?w.state.context?w.depth=0:d.context=d.context.prev:/^-1&&c.backUp(R.length-M),y}function x(c,d,w){if(c.peek()=="<"&&!c.match(/^<([^<>]|<[^>]*>)+,\s*>/,!1)&&s.expressionAllowed(c,w.state))return d.context=new p(o.startState(S,s.indent(w.state,"","")),S,0,d.context),s.skipExpression(w.state),null;var E=s.token(c,w.state);if(!E&&w.depth!=null){var z=c.current();z=="{"?w.depth++:z=="}"&&--w.depth==0&&(d.context=d.context.prev)}return E}return{startState:function(){return{context:new p(o.startState(s),s)}},copyState:function(c){return{context:v(c.context)}},token:g,indent:function(c,d,w){return c.context.mode.indent(c.context.state,d,w)},innerMode:function(c){return c.context}}},"xml","javascript"),o.defineMIME("text/jsx","jsx"),o.defineMIME("text/typescript-jsx",{name:"jsx",base:{name:"javascript",typescript:!0}})})});var gu=Ke((pu,hu)=>{(function(o){typeof pu=="object"&&typeof hu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("nginx",function(p){function v(w){for(var E={},z=w.split(" "),y=0;y*\/]/.test(y)?g(null,"select-op"):/[;{}:\[\]]/.test(y)?g(null,y):(w.eatWhile(/[\w\\\-]/),g("variable","variable"))}function x(w,E){for(var z=!1,y;(y=w.next())!=null;){if(z&&y=="/"){E.tokenize=T;break}z=y=="*"}return g("comment","comment")}function c(w,E){for(var z=0,y;(y=w.next())!=null;){if(z>=2&&y==">"){E.tokenize=T;break}z=y=="-"?z+1:0}return g("comment","comment")}function d(w){return function(E,z){for(var y=!1,R;(R=E.next())!=null&&!(R==w&&!y);)y=!y&&R=="\\";return y||(z.tokenize=T),g("string","string")}}return{startState:function(w){return{tokenize:T,baseIndent:w||0,stack:[]}},token:function(w,E){if(w.eatSpace())return null;h=null;var z=E.tokenize(w,E),y=E.stack[E.stack.length-1];return h=="hash"&&y=="rule"?z="atom":z=="variable"&&(y=="rule"?z="number":(!y||y=="@media{")&&(z="tag")),y=="rule"&&/^[\{\};]$/.test(h)&&E.stack.pop(),h=="{"?y=="@media"?E.stack[E.stack.length-1]="@media{":E.stack.push("{"):h=="}"?E.stack.pop():h=="@media"?E.stack.push("@media"):y=="{"&&h!="comment"&&E.stack.push("rule"),z},indent:function(w,E){var z=w.stack.length;return/^\}/.test(E)&&(z-=w.stack[w.stack.length-1]=="rule"?2:1),w.baseIndent+z*s},electricChars:"}"}}),o.defineMIME("text/x-nginx-conf","nginx")})});var bu=Ke((mu,vu)=>{(function(o){typeof mu=="object"&&typeof vu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("pascal",function(){function p(T){for(var x={},c=T.split(" "),d=0;d!?|\/]/;function S(T,x){var c=T.next();if(c=="#"&&x.startOfLine)return T.skipToEnd(),"meta";if(c=='"'||c=="'")return x.tokenize=s(c),x.tokenize(T,x);if(c=="("&&T.eat("*"))return x.tokenize=h,h(T,x);if(c=="{")return x.tokenize=g,g(T,x);if(/[\[\]\(\),;\:\.]/.test(c))return null;if(/\d/.test(c))return T.eatWhile(/[\w\.]/),"number";if(c=="/"&&T.eat("/"))return T.skipToEnd(),"comment";if(b.test(c))return T.eatWhile(b),"operator";T.eatWhile(/[\w\$_]/);var d=T.current();return v.propertyIsEnumerable(d)?"keyword":C.propertyIsEnumerable(d)?"atom":"variable"}function s(T){return function(x,c){for(var d=!1,w,E=!1;(w=x.next())!=null;){if(w==T&&!d){E=!0;break}d=!d&&w=="\\"}return(E||!d)&&(c.tokenize=null),"string"}}function h(T,x){for(var c=!1,d;d=T.next();){if(d==")"&&c){x.tokenize=null;break}c=d=="*"}return"comment"}function g(T,x){for(var c;c=T.next();)if(c=="}"){x.tokenize=null;break}return"comment"}return{startState:function(){return{tokenize:null}},token:function(T,x){if(T.eatSpace())return null;var c=(x.tokenize||S)(T,x);return c=="comment"||c=="meta",c},electricChars:"{}"}}),o.defineMIME("text/x-pascal","pascal")})});var _u=Ke((yu,xu)=>{(function(o){typeof yu=="object"&&typeof xu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("perl",function(){var S={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,if:[1,1],elsif:[1,1],else:[1,1],while:[1,1],unless:[1,1],for:[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,break:1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,continue:[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,default:1,defined:1,delete:1,die:1,do:1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,goto:1,grep:1,hex:1,import:1,index:1,int:1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,new:1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,package:1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,return:1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,y:null},s="string-2",h=/[goseximacplud]/;function g(c,d,w,E,z){return d.chain=null,d.style=null,d.tail=null,d.tokenize=function(y,R){for(var M=!1,H,Z=0;H=y.next();){if(H===w[Z]&&!M)return w[++Z]!==void 0?(R.chain=w[Z],R.style=E,R.tail=z):z&&y.eatWhile(z),R.tokenize=x,E;M=!M&&H=="\\"}return E},d.tokenize(c,d)}function T(c,d,w){return d.tokenize=function(E,z){return E.string==w&&(z.tokenize=x),E.skipToEnd(),"string"},d.tokenize(c,d)}function x(c,d){if(c.eatSpace())return null;if(d.chain)return g(c,d,d.chain,d.style,d.tail);if(c.match(/^(\-?((\d[\d_]*)?\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F_]+|0b[01_]+|\d[\d_]*(e[+-]?\d+)?)/))return"number";if(c.match(/^<<(?=[_a-zA-Z])/))return c.eatWhile(/\w/),T(c,d,c.current().substr(2));if(c.sol()&&c.match(/^\=item(?!\w)/))return T(c,d,"=cut");var w=c.next();if(w=='"'||w=="'"){if(v(c,3)=="<<"+w){var E=c.pos;c.eatWhile(/\w/);var z=c.current().substr(1);if(z&&c.eat(w))return T(c,d,z);c.pos=E}return g(c,d,[w],"string")}if(w=="q"){var y=p(c,-2);if(!(y&&/\w/.test(y))){if(y=p(c,0),y=="x"){if(y=p(c,1),y=="(")return b(c,2),g(c,d,[")"],s,h);if(y=="[")return b(c,2),g(c,d,["]"],s,h);if(y=="{")return b(c,2),g(c,d,["}"],s,h);if(y=="<")return b(c,2),g(c,d,[">"],s,h);if(/[\^'"!~\/]/.test(y))return b(c,1),g(c,d,[c.eat(y)],s,h)}else if(y=="q"){if(y=p(c,1),y=="(")return b(c,2),g(c,d,[")"],"string");if(y=="[")return b(c,2),g(c,d,["]"],"string");if(y=="{")return b(c,2),g(c,d,["}"],"string");if(y=="<")return b(c,2),g(c,d,[">"],"string");if(/[\^'"!~\/]/.test(y))return b(c,1),g(c,d,[c.eat(y)],"string")}else if(y=="w"){if(y=p(c,1),y=="(")return b(c,2),g(c,d,[")"],"bracket");if(y=="[")return b(c,2),g(c,d,["]"],"bracket");if(y=="{")return b(c,2),g(c,d,["}"],"bracket");if(y=="<")return b(c,2),g(c,d,[">"],"bracket");if(/[\^'"!~\/]/.test(y))return b(c,1),g(c,d,[c.eat(y)],"bracket")}else if(y=="r"){if(y=p(c,1),y=="(")return b(c,2),g(c,d,[")"],s,h);if(y=="[")return b(c,2),g(c,d,["]"],s,h);if(y=="{")return b(c,2),g(c,d,["}"],s,h);if(y=="<")return b(c,2),g(c,d,[">"],s,h);if(/[\^'"!~\/]/.test(y))return b(c,1),g(c,d,[c.eat(y)],s,h)}else if(/[\^'"!~\/(\[{<]/.test(y)){if(y=="(")return b(c,1),g(c,d,[")"],"string");if(y=="[")return b(c,1),g(c,d,["]"],"string");if(y=="{")return b(c,1),g(c,d,["}"],"string");if(y=="<")return b(c,1),g(c,d,[">"],"string");if(/[\^'"!~\/]/.test(y))return g(c,d,[c.eat(y)],"string")}}}if(w=="m"){var y=p(c,-2);if(!(y&&/\w/.test(y))&&(y=c.eat(/[(\[{<\^'"!~\/]/),y)){if(/[\^'"!~\/]/.test(y))return g(c,d,[y],s,h);if(y=="(")return g(c,d,[")"],s,h);if(y=="[")return g(c,d,["]"],s,h);if(y=="{")return g(c,d,["}"],s,h);if(y=="<")return g(c,d,[">"],s,h)}}if(w=="s"){var y=/[\/>\]})\w]/.test(p(c,-2));if(!y&&(y=c.eat(/[(\[{<\^'"!~\/]/),y))return y=="["?g(c,d,["]","]"],s,h):y=="{"?g(c,d,["}","}"],s,h):y=="<"?g(c,d,[">",">"],s,h):y=="("?g(c,d,[")",")"],s,h):g(c,d,[y,y],s,h)}if(w=="y"){var y=/[\/>\]})\w]/.test(p(c,-2));if(!y&&(y=c.eat(/[(\[{<\^'"!~\/]/),y))return y=="["?g(c,d,["]","]"],s,h):y=="{"?g(c,d,["}","}"],s,h):y=="<"?g(c,d,[">",">"],s,h):y=="("?g(c,d,[")",")"],s,h):g(c,d,[y,y],s,h)}if(w=="t"){var y=/[\/>\]})\w]/.test(p(c,-2));if(!y&&(y=c.eat("r"),y&&(y=c.eat(/[(\[{<\^'"!~\/]/),y)))return y=="["?g(c,d,["]","]"],s,h):y=="{"?g(c,d,["}","}"],s,h):y=="<"?g(c,d,[">",">"],s,h):y=="("?g(c,d,[")",")"],s,h):g(c,d,[y,y],s,h)}if(w=="`")return g(c,d,[w],"variable-2");if(w=="/")return/~\s*$/.test(v(c))?g(c,d,[w],s,h):"operator";if(w=="$"){var E=c.pos;if(c.eatWhile(/\d/)||c.eat("{")&&c.eatWhile(/\d/)&&c.eat("}"))return"variable-2";c.pos=E}if(/[$@%]/.test(w)){var E=c.pos;if(c.eat("^")&&c.eat(/[A-Z]/)||!/[@$%&]/.test(p(c,-2))&&c.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var y=c.current();if(S[y])return"variable-2"}c.pos=E}if(/[$@%&]/.test(w)&&(c.eatWhile(/[\w$]/)||c.eat("{")&&c.eatWhile(/[\w$]/)&&c.eat("}"))){var y=c.current();return S[y]?"variable-2":"variable"}if(w=="#"&&p(c,-2)!="$")return c.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(w)){var E=c.pos;if(c.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),S[c.current()])return"operator";c.pos=E}if(w=="_"&&c.pos==1){if(C(c,6)=="_END__")return g(c,d,["\0"],"comment");if(C(c,7)=="_DATA__")return g(c,d,["\0"],"variable-2");if(C(c,7)=="_C__")return g(c,d,["\0"],"string")}if(/\w/.test(w)){var E=c.pos;if(p(c,-2)=="{"&&(p(c,0)=="}"||c.eatWhile(/\w/)&&p(c,0)=="}"))return"string";c.pos=E}if(/[A-Z]/.test(w)){var R=p(c,-2),E=c.pos;if(c.eatWhile(/[A-Z_]/),/[\da-z]/.test(p(c,0)))c.pos=E;else{var y=S[c.current()];return y?(y[1]&&(y=y[0]),R!=":"?y==1?"keyword":y==2?"def":y==3?"atom":y==4?"operator":y==5?"variable-2":"meta":"meta"):"meta"}}if(/[a-zA-Z_]/.test(w)){var R=p(c,-2);c.eatWhile(/\w/);var y=S[c.current()];return y?(y[1]&&(y=y[0]),R!=":"?y==1?"keyword":y==2?"def":y==3?"atom":y==4?"operator":y==5?"variable-2":"meta":"meta"):"meta"}return null}return{startState:function(){return{tokenize:x,chain:null,style:null,tail:null}},token:function(c,d){return(d.tokenize||x)(c,d)},lineComment:"#"}}),o.registerHelper("wordChars","perl",/[\w$]/),o.defineMIME("text/x-perl","perl");function p(S,s){return S.string.charAt(S.pos+(s||0))}function v(S,s){if(s){var h=S.pos-s;return S.string.substr(h>=0?h:0,s)}else return S.string.substr(0,S.pos-1)}function C(S,s){var h=S.string.length,g=h-S.pos+1;return S.string.substr(S.pos,s&&s=(g=S.string.length-1)?S.pos=g:S.pos=h}})});var Su=Ke((ku,wu)=>{(function(o){typeof ku=="object"&&typeof wu=="object"?o(We(),Qn(),Vo()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../clike/clike"],o):o(CodeMirror)})(function(o){"use strict";function p(T){for(var x={},c=T.split(" "),d=0;d\w/,!1)&&(x.tokenize=v([[["->",null]],[[/[\w]+/,"variable"]]],c,d)),"variable-2";for(var w=!1;!T.eol()&&(w||d===!1||!T.match("{$",!1)&&!T.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/,!1));){if(!w&&T.match(c)){x.tokenize=null,x.tokStack.pop(),x.tokStack.pop();break}w=T.next()=="\\"&&!w}return"string"}var S="abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally readonly match",s="true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__",h="func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";o.registerHelper("hintWords","php",[S,s,h].join(" ").split(" ")),o.registerHelper("wordChars","php",/[\w$]/);var g={name:"clike",helperType:"php",keywords:p(S),blockKeywords:p("catch do else elseif for foreach if switch try while finally"),defKeywords:p("class enum function interface namespace trait"),atoms:p(s),builtin:p(h),multiLineStrings:!0,hooks:{$:function(T){return T.eatWhile(/[\w\$_]/),"variable-2"},"<":function(T,x){var c;if(c=T.match(/^<<\s*/)){var d=T.eat(/['"]/);T.eatWhile(/[\w\.]/);var w=T.current().slice(c[0].length+(d?2:1));if(d&&T.eat(d),w)return(x.tokStack||(x.tokStack=[])).push(w,0),x.tokenize=C(w,d!="'"),"string"}return!1},"#":function(T){for(;!T.eol()&&!T.match("?>",!1);)T.next();return"comment"},"/":function(T){if(T.eat("/")){for(;!T.eol()&&!T.match("?>",!1);)T.next();return"comment"}return!1},'"':function(T,x){return(x.tokStack||(x.tokStack=[])).push('"',0),x.tokenize=C('"'),"string"},"{":function(T,x){return x.tokStack&&x.tokStack.length&&x.tokStack[x.tokStack.length-1]++,!1},"}":function(T,x){return x.tokStack&&x.tokStack.length>0&&!--x.tokStack[x.tokStack.length-1]&&(x.tokenize=C(x.tokStack[x.tokStack.length-2])),!1}}};o.defineMode("php",function(T,x){var c=o.getMode(T,x&&x.htmlMode||"text/html"),d=o.getMode(T,g);function w(E,z){var y=z.curMode==d;if(E.sol()&&z.pending&&z.pending!='"'&&z.pending!="'"&&(z.pending=null),y)return y&&z.php.tokenize==null&&E.match("?>")?(z.curMode=c,z.curState=z.html,z.php.context.prev||(z.php=null),"meta"):d.token(E,z.curState);if(E.match(/^<\?\w*/))return z.curMode=d,z.php||(z.php=o.startState(d,c.indent(z.html,"",""))),z.curState=z.php,"meta";if(z.pending=='"'||z.pending=="'"){for(;!E.eol()&&E.next()!=z.pending;);var R="string"}else if(z.pending&&E.pos/.test(M)?z.pending=Z[0]:z.pending={end:E.pos,style:R},E.backUp(M.length-H)),R}return{startState:function(){var E=o.startState(c),z=x.startOpen?o.startState(d):null;return{html:E,php:z,curMode:x.startOpen?d:c,curState:x.startOpen?z:E,pending:null}},copyState:function(E){var z=E.html,y=o.copyState(c,z),R=E.php,M=R&&o.copyState(d,R),H;return E.curMode==c?H=y:H=M,{html:y,php:M,curMode:E.curMode,curState:H,pending:E.pending}},token:w,indent:function(E,z,y){return E.curMode!=d&&/^\s*<\//.test(z)||E.curMode==d&&/^\?>/.test(z)?c.indent(E.html,z,y):E.curMode.indent(E.curState,z,y)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(E){return{state:E.curState,mode:E.curMode}}}},"htmlmixed","clike"),o.defineMIME("application/x-httpd-php","php"),o.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:!0}),o.defineMIME("text/x-php",g)})});var Cu=Ke((Tu,Lu)=>{(function(o){typeof Tu=="object"&&typeof Lu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(s){return new RegExp("^(("+s.join(")|(")+"))\\b","i")}var v=["package","message","import","syntax","required","optional","repeated","reserved","default","extensions","packed","bool","bytes","double","enum","float","string","int32","int64","uint32","uint64","sint32","sint64","fixed32","fixed64","sfixed32","sfixed64","option","service","rpc","returns"],C=p(v);o.registerHelper("hintWords","protobuf",v);var b=new RegExp("^[_A-Za-z\xA1-\uFFFF][_A-Za-z0-9\xA1-\uFFFF]*");function S(s){return s.eatSpace()?null:s.match("//")?(s.skipToEnd(),"comment"):s.match(/^[0-9\.+-]/,!1)&&(s.match(/^[+-]?0x[0-9a-fA-F]+/)||s.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)||s.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))?"number":s.match(/^"([^"]|(""))*"/)||s.match(/^'([^']|(''))*'/)?"string":s.match(C)?"keyword":s.match(b)?"variable":(s.next(),null)}o.defineMode("protobuf",function(){return{token:S,fold:"brace"}}),o.defineMIME("text/x-protobuf","protobuf")})});var Mu=Ke((Eu,zu)=>{(function(o){typeof Eu=="object"&&typeof zu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(h){return new RegExp("^(("+h.join(")|(")+"))\\b")}var v=p(["and","or","not","is"]),C=["as","assert","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","lambda","pass","raise","return","try","while","with","yield","in","False","True"],b=["abs","all","any","bin","bool","bytearray","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip","__import__","NotImplemented","Ellipsis","__debug__"];o.registerHelper("hintWords","python",C.concat(b).concat(["exec","print"]));function S(h){return h.scopes[h.scopes.length-1]}o.defineMode("python",function(h,g){for(var T="error",x=g.delimiters||g.singleDelimiters||/^[\(\)\[\]\{\}@,:`=;\.\\]/,c=[g.singleOperators,g.doubleOperators,g.doubleDelimiters,g.tripleDelimiters,g.operators||/^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/],d=0;dB?D(X):le0&&j(K,X)&&(xe+=" "+T),xe}}return re(K,X)}function re(K,X,I){if(K.eatSpace())return null;if(!I&&K.match(/^#.*/))return"comment";if(K.match(/^[0-9\.]/,!1)){var B=!1;if(K.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i)&&(B=!0),K.match(/^[\d_]+\.\d*/)&&(B=!0),K.match(/^\.\d+/)&&(B=!0),B)return K.eat(/J/i),"number";var le=!1;if(K.match(/^0x[0-9a-f_]+/i)&&(le=!0),K.match(/^0b[01_]+/i)&&(le=!0),K.match(/^0o[0-7_]+/i)&&(le=!0),K.match(/^[1-9][\d_]*(e[\+\-]?[\d_]+)?/)&&(K.eat(/J/i),le=!0),K.match(/^0(?![\dx])/i)&&(le=!0),le)return K.eat(/L/i),"number"}if(K.match(M)){var xe=K.current().toLowerCase().indexOf("f")!==-1;return xe?(X.tokenize=N(K.current(),X.tokenize),X.tokenize(K,X)):(X.tokenize=F(K.current(),X.tokenize),X.tokenize(K,X))}for(var q=0;q=0;)K=K.substr(1);var I=K.length==1,B="string";function le(q){return function(L,de){var ze=re(L,de,!0);return ze=="punctuation"&&(L.current()=="{"?de.tokenize=le(q+1):L.current()=="}"&&(q>1?de.tokenize=le(q-1):de.tokenize=xe)),ze}}function xe(q,L){for(;!q.eol();)if(q.eatWhile(/[^'"\{\}\\]/),q.eat("\\")){if(q.next(),I&&q.eol())return B}else{if(q.match(K))return L.tokenize=X,B;if(q.match("{{"))return B;if(q.match("{",!1))return L.tokenize=le(0),q.current()?B:L.tokenize(q,L);if(q.match("}}"))return B;if(q.match("}"))return T;q.eat(/['"]/)}if(I){if(g.singleLineStringErrors)return T;L.tokenize=X}return B}return xe.isString=!0,xe}function F(K,X){for(;"rubf".indexOf(K.charAt(0).toLowerCase())>=0;)K=K.substr(1);var I=K.length==1,B="string";function le(xe,q){for(;!xe.eol();)if(xe.eatWhile(/[^'"\\]/),xe.eat("\\")){if(xe.next(),I&&xe.eol())return B}else{if(xe.match(K))return q.tokenize=X,B;xe.eat(/['"]/)}if(I){if(g.singleLineStringErrors)return T;q.tokenize=X}return B}return le.isString=!0,le}function D(K){for(;S(K).type!="py";)K.scopes.pop();K.scopes.push({offset:S(K).offset+h.indentUnit,type:"py",align:null})}function Q(K,X,I){var B=K.match(/^[\s\[\{\(]*(?:#|$)/,!1)?null:K.column()+1;X.scopes.push({offset:X.indent+w,type:I,align:B})}function j(K,X){for(var I=K.indentation();X.scopes.length>1&&S(X).offset>I;){if(S(X).type!="py")return!0;X.scopes.pop()}return S(X).offset!=I}function V(K,X){K.sol()&&(X.beginningOfLine=!0,X.dedent=!1);var I=X.tokenize(K,X),B=K.current();if(X.beginningOfLine&&B=="@")return K.match(R,!1)?"meta":y?"operator":T;if(/\S/.test(B)&&(X.beginningOfLine=!1),(I=="variable"||I=="builtin")&&X.lastToken=="meta"&&(I="meta"),(B=="pass"||B=="return")&&(X.dedent=!0),B=="lambda"&&(X.lambda=!0),B==":"&&!X.lambda&&S(X).type=="py"&&K.match(/^\s*(?:#|$)/,!1)&&D(X),B.length==1&&!/string|comment/.test(I)){var le="[({".indexOf(B);if(le!=-1&&Q(K,X,"])}".slice(le,le+1)),le="])}".indexOf(B),le!=-1)if(S(X).type==B)X.indent=X.scopes.pop().offset-w;else return T}return X.dedent&&K.eol()&&S(X).type=="py"&&X.scopes.length>1&&X.scopes.pop(),I}var _={startState:function(K){return{tokenize:ee,scopes:[{offset:K||0,type:"py",align:null}],indent:K||0,lastToken:null,lambda:!1,dedent:0}},token:function(K,X){var I=X.errorToken;I&&(X.errorToken=!1);var B=V(K,X);return B&&B!="comment"&&(X.lastToken=B=="keyword"||B=="punctuation"?K.current():B),B=="punctuation"&&(B=null),K.eol()&&X.lambda&&(X.lambda=!1),I?B+" "+T:B},indent:function(K,X){if(K.tokenize!=ee)return K.tokenize.isString?o.Pass:0;var I=S(K),B=I.type==X.charAt(0)||I.type=="py"&&!K.dedent&&/^(else:|elif |except |finally:)/.test(X);return I.align!=null?I.align-(B?1:0):I.offset-(B?w:0)},electricInput:/^\s*([\}\]\)]|else:|elif |except |finally:)$/,closeBrackets:{triples:`'"`},lineComment:"#",fold:"indent"};return _}),o.defineMIME("text/x-python","python");var s=function(h){return h.split(" ")};o.defineMIME("text/x-cython",{name:"python",extra_keywords:s("by cdef cimport cpdef ctypedef enum except extern gil include nogil property public readonly struct union DEF IF ELIF ELSE")})})});var qu=Ke((Au,Du)=>{(function(o){typeof Au=="object"&&typeof Du=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(g){for(var T={},x=0,c=g.length;x]/)?(M.eat(/[\<\>]/),"atom"):M.eat(/[\+\-\*\/\&\|\:\!]/)?"atom":M.eat(/[a-zA-Z$@_\xa1-\uffff]/)?(M.eatWhile(/[\w$\xa1-\uffff]/),M.eat(/[\?\!\=]/),"atom"):"operator";if(Z=="@"&&M.match(/^@?[a-zA-Z_\xa1-\uffff]/))return M.eat("@"),M.eatWhile(/[\w\xa1-\uffff]/),"variable-2";if(Z=="$")return M.eat(/[a-zA-Z_]/)?M.eatWhile(/[\w]/):M.eat(/\d/)?M.eat(/\d/):M.next(),"variable-3";if(/[a-zA-Z_\xa1-\uffff]/.test(Z))return M.eatWhile(/[\w\xa1-\uffff]/),M.eat(/[\?\!]/),M.eat(":")?"atom":"ident";if(Z=="|"&&(H.varList||H.lastTok=="{"||H.lastTok=="do"))return T="|",null;if(/[\(\)\[\]{}\\;]/.test(Z))return T=Z,null;if(Z=="-"&&M.eat(">"))return"arrow";if(/[=+\-\/*:\.^%<>~|]/.test(Z)){var D=M.eatWhile(/[=+\-\/*:\.^%<>~|]/);return Z=="."&&!D&&(T="."),"operator"}else return null}}}function d(M){for(var H=M.pos,Z=0,ee,re=!1,N=!1;(ee=M.next())!=null;)if(N)N=!1;else{if("[{(".indexOf(ee)>-1)Z++;else if("]})".indexOf(ee)>-1){if(Z--,Z<0)break}else if(ee=="/"&&Z==0){re=!0;break}N=ee=="\\"}return M.backUp(M.pos-H),re}function w(M){return M||(M=1),function(H,Z){if(H.peek()=="}"){if(M==1)return Z.tokenize.pop(),Z.tokenize[Z.tokenize.length-1](H,Z);Z.tokenize[Z.tokenize.length-1]=w(M-1)}else H.peek()=="{"&&(Z.tokenize[Z.tokenize.length-1]=w(M+1));return c(H,Z)}}function E(){var M=!1;return function(H,Z){return M?(Z.tokenize.pop(),Z.tokenize[Z.tokenize.length-1](H,Z)):(M=!0,c(H,Z))}}function z(M,H,Z,ee){return function(re,N){var F=!1,D;for(N.context.type==="read-quoted-paused"&&(N.context=N.context.prev,re.eat("}"));(D=re.next())!=null;){if(D==M&&(ee||!F)){N.tokenize.pop();break}if(Z&&D=="#"&&!F){if(re.eat("{")){M=="}"&&(N.context={prev:N.context,type:"read-quoted-paused"}),N.tokenize.push(w());break}else if(/[@\$]/.test(re.peek())){N.tokenize.push(E());break}}F=!F&&D=="\\"}return H}}function y(M,H){return function(Z,ee){return H&&Z.eatSpace(),Z.match(M)?ee.tokenize.pop():Z.skipToEnd(),"string"}}function R(M,H){return M.sol()&&M.match("=end")&&M.eol()&&H.tokenize.pop(),M.skipToEnd(),"comment"}return{startState:function(){return{tokenize:[c],indented:0,context:{type:"top",indented:-g.indentUnit},continuedLine:!1,lastTok:null,varList:!1}},token:function(M,H){T=null,M.sol()&&(H.indented=M.indentation());var Z=H.tokenize[H.tokenize.length-1](M,H),ee,re=T;if(Z=="ident"){var N=M.current();Z=H.lastTok=="."?"property":C.propertyIsEnumerable(M.current())?"keyword":/^[A-Z]/.test(N)?"tag":H.lastTok=="def"||H.lastTok=="class"||H.varList?"def":"variable",Z=="keyword"&&(re=N,b.propertyIsEnumerable(N)?ee="indent":S.propertyIsEnumerable(N)?ee="dedent":((N=="if"||N=="unless")&&M.column()==M.indentation()||N=="do"&&H.context.indented{(function(o){typeof Iu=="object"&&typeof Fu=="object"?o(We(),Di()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode("rust",{start:[{regex:/b?"/,token:"string",next:"string"},{regex:/b?r"/,token:"string",next:"string_raw"},{regex:/b?r#+"/,token:"string",next:"string_raw_hash"},{regex:/'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/,token:"string-2"},{regex:/b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/,token:"string-2"},{regex:/(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,token:"number"},{regex:/(let(?:\s+mut)?|fn|enum|mod|struct|type|union)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:["keyword",null,"def"]},{regex:/(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,token:"keyword"},{regex:/\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/,token:"atom"},{regex:/\b(?:true|false|Some|None|Ok|Err)\b/,token:"builtin"},{regex:/\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:["keyword",null,"def"]},{regex:/#!?\[.*\]/,token:"meta"},{regex:/\/\/.*/,token:"comment"},{regex:/\/\*/,token:"comment",next:"comment"},{regex:/[-+\/*=<>!]+/,token:"operator"},{regex:/[a-zA-Z_]\w*!/,token:"variable-3"},{regex:/[a-zA-Z_]\w*/,token:"variable"},{regex:/[\{\[\(]/,indent:!0},{regex:/[\}\]\)]/,dedent:!0}],string:[{regex:/"/,token:"string",next:"start"},{regex:/(?:[^\\"]|\\(?:.|$))*/,token:"string"}],string_raw:[{regex:/"/,token:"string",next:"start"},{regex:/[^"]*/,token:"string"}],string_raw_hash:[{regex:/"#+/,token:"string",next:"start"},{regex:/(?:[^"]|"(?!#))*/,token:"string"}],comment:[{regex:/.*?\*\//,token:"comment",next:"start"},{regex:/.*/,token:"comment"}],meta:{dontIndentStates:["comment"],electricInput:/^\s*\}$/,blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",fold:"brace"}}),o.defineMIME("text/x-rustsrc","rust"),o.defineMIME("text/rust","rust")})});var ea=Ke((Ou,Pu)=>{(function(o){typeof Ou=="object"&&typeof Pu=="object"?o(We(),gn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../css/css"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("sass",function(p){var v=o.mimeModes["text/css"],C=v.propertyKeywords||{},b=v.colorKeywords||{},S=v.valueKeywords||{},s=v.fontProperties||{};function h(N){return new RegExp("^"+N.join("|"))}var g=["true","false","null","auto"],T=new RegExp("^"+g.join("|")),x=["\\(","\\)","=",">","<","==",">=","<=","\\+","-","\\!=","/","\\*","%","and","or","not",";","\\{","\\}",":"],c=h(x),d=/^::?[a-zA-Z_][\w\-]*/,w;function E(N){return!N.peek()||N.match(/\s+$/,!1)}function z(N,F){var D=N.peek();return D===")"?(N.next(),F.tokenizer=ee,"operator"):D==="("?(N.next(),N.eatSpace(),"operator"):D==="'"||D==='"'?(F.tokenizer=R(N.next()),"string"):(F.tokenizer=R(")",!1),"string")}function y(N,F){return function(D,Q){return D.sol()&&D.indentation()<=N?(Q.tokenizer=ee,ee(D,Q)):(F&&D.skipTo("*/")?(D.next(),D.next(),Q.tokenizer=ee):D.skipToEnd(),"comment")}}function R(N,F){F==null&&(F=!0);function D(Q,j){var V=Q.next(),_=Q.peek(),K=Q.string.charAt(Q.pos-2),X=V!=="\\"&&_===N||V===N&&K!=="\\";return X?(V!==N&&F&&Q.next(),E(Q)&&(j.cursorHalf=0),j.tokenizer=ee,"string"):V==="#"&&_==="{"?(j.tokenizer=M(D),Q.next(),"operator"):"string"}return D}function M(N){return function(F,D){return F.peek()==="}"?(F.next(),D.tokenizer=N,"operator"):ee(F,D)}}function H(N){if(N.indentCount==0){N.indentCount++;var F=N.scopes[0].offset,D=F+p.indentUnit;N.scopes.unshift({offset:D})}}function Z(N){N.scopes.length!=1&&N.scopes.shift()}function ee(N,F){var D=N.peek();if(N.match("/*"))return F.tokenizer=y(N.indentation(),!0),F.tokenizer(N,F);if(N.match("//"))return F.tokenizer=y(N.indentation(),!1),F.tokenizer(N,F);if(N.match("#{"))return F.tokenizer=M(ee),"operator";if(D==='"'||D==="'")return N.next(),F.tokenizer=R(D),"string";if(F.cursorHalf){if(D==="#"&&(N.next(),N.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/))||N.match(/^-?[0-9\.]+/))return E(N)&&(F.cursorHalf=0),"number";if(N.match(/^(px|em|in)\b/))return E(N)&&(F.cursorHalf=0),"unit";if(N.match(T))return E(N)&&(F.cursorHalf=0),"keyword";if(N.match(/^url/)&&N.peek()==="(")return F.tokenizer=z,E(N)&&(F.cursorHalf=0),"atom";if(D==="$")return N.next(),N.eatWhile(/[\w-]/),E(N)&&(F.cursorHalf=0),"variable-2";if(D==="!")return N.next(),F.cursorHalf=0,N.match(/^[\w]+/)?"keyword":"operator";if(N.match(c))return E(N)&&(F.cursorHalf=0),"operator";if(N.eatWhile(/[\w-]/))return E(N)&&(F.cursorHalf=0),w=N.current().toLowerCase(),S.hasOwnProperty(w)?"atom":b.hasOwnProperty(w)?"keyword":C.hasOwnProperty(w)?(F.prevProp=N.current().toLowerCase(),"property"):"tag";if(E(N))return F.cursorHalf=0,null}else{if(D==="-"&&N.match(/^-\w+-/))return"meta";if(D==="."){if(N.next(),N.match(/^[\w-]+/))return H(F),"qualifier";if(N.peek()==="#")return H(F),"tag"}if(D==="#"){if(N.next(),N.match(/^[\w-]+/))return H(F),"builtin";if(N.peek()==="#")return H(F),"tag"}if(D==="$")return N.next(),N.eatWhile(/[\w-]/),"variable-2";if(N.match(/^-?[0-9\.]+/))return"number";if(N.match(/^(px|em|in)\b/))return"unit";if(N.match(T))return"keyword";if(N.match(/^url/)&&N.peek()==="(")return F.tokenizer=z,"atom";if(D==="="&&N.match(/^=[\w-]+/))return H(F),"meta";if(D==="+"&&N.match(/^\+[\w-]+/))return"variable-3";if(D==="@"&&N.match("@extend")&&(N.match(/\s*[\w]/)||Z(F)),N.match(/^@(else if|if|media|else|for|each|while|mixin|function)/))return H(F),"def";if(D==="@")return N.next(),N.eatWhile(/[\w-]/),"def";if(N.eatWhile(/[\w-]/))if(N.match(/ *: *[\w-\+\$#!\("']/,!1)){w=N.current().toLowerCase();var Q=F.prevProp+"-"+w;return C.hasOwnProperty(Q)?"property":C.hasOwnProperty(w)?(F.prevProp=w,"property"):s.hasOwnProperty(w)?"property":"tag"}else return N.match(/ *:/,!1)?(H(F),F.cursorHalf=1,F.prevProp=N.current().toLowerCase(),"property"):(N.match(/ *,/,!1)||H(F),"tag");if(D===":")return N.match(d)?"variable-3":(N.next(),F.cursorHalf=1,"operator")}return N.match(c)?"operator":(N.next(),null)}function re(N,F){N.sol()&&(F.indentCount=0);var D=F.tokenizer(N,F),Q=N.current();if((Q==="@return"||Q==="}")&&Z(F),D!==null){for(var j=N.pos-Q.length,V=j+p.indentUnit*F.indentCount,_=[],K=0;K{(function(o){typeof ju=="object"&&typeof Ru=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("shell",function(){var p={};function v(d,w){for(var E=0;E1&&d.eat("$");var E=d.next();return/['"({]/.test(E)?(w.tokens[0]=h(E,E=="("?"quote":E=="{"?"def":"string"),c(d,w)):(/\d/.test(E)||d.eatWhile(/\w/),w.tokens.shift(),"def")};function x(d){return function(w,E){return w.sol()&&w.string==d&&E.tokens.shift(),w.skipToEnd(),"string-2"}}function c(d,w){return(w.tokens[0]||s)(d,w)}return{startState:function(){return{tokens:[]}},token:function(d,w){return c(d,w)},closeBrackets:"()[]{}''\"\"``",lineComment:"#",fold:"brace"}}),o.defineMIME("text/x-sh","shell"),o.defineMIME("application/x-sh","shell")})});var Uu=Ke((Bu,Wu)=>{(function(o){typeof Bu=="object"&&typeof Wu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("sql",function(g,T){var x=T.client||{},c=T.atoms||{false:!0,true:!0,null:!0},d=T.builtin||s(h),w=T.keywords||s(S),E=T.operatorChars||/^[*+\-%<>!=&|~^\/]/,z=T.support||{},y=T.hooks||{},R=T.dateSQL||{date:!0,time:!0,timestamp:!0},M=T.backslashStringEscapes!==!1,H=T.brackets||/^[\{}\(\)\[\]]/,Z=T.punctuation||/^[;.,:]/;function ee(Q,j){var V=Q.next();if(y[V]){var _=y[V](Q,j);if(_!==!1)return _}if(z.hexNumber&&(V=="0"&&Q.match(/^[xX][0-9a-fA-F]+/)||(V=="x"||V=="X")&&Q.match(/^'[0-9a-fA-F]*'/)))return"number";if(z.binaryNumber&&((V=="b"||V=="B")&&Q.match(/^'[01]*'/)||V=="0"&&Q.match(/^b[01]+/)))return"number";if(V.charCodeAt(0)>47&&V.charCodeAt(0)<58)return Q.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/),z.decimallessFloat&&Q.match(/^\.(?!\.)/),"number";if(V=="?"&&(Q.eatSpace()||Q.eol()||Q.eat(";")))return"variable-3";if(V=="'"||V=='"'&&z.doubleQuote)return j.tokenize=re(V),j.tokenize(Q,j);if((z.nCharCast&&(V=="n"||V=="N")||z.charsetCast&&V=="_"&&Q.match(/[a-z][a-z0-9]*/i))&&(Q.peek()=="'"||Q.peek()=='"'))return"keyword";if(z.escapeConstant&&(V=="e"||V=="E")&&(Q.peek()=="'"||Q.peek()=='"'&&z.doubleQuote))return j.tokenize=function(X,I){return(I.tokenize=re(X.next(),!0))(X,I)},"keyword";if(z.commentSlashSlash&&V=="/"&&Q.eat("/"))return Q.skipToEnd(),"comment";if(z.commentHash&&V=="#"||V=="-"&&Q.eat("-")&&(!z.commentSpaceRequired||Q.eat(" ")))return Q.skipToEnd(),"comment";if(V=="/"&&Q.eat("*"))return j.tokenize=N(1),j.tokenize(Q,j);if(V=="."){if(z.zerolessFloat&&Q.match(/^(?:\d+(?:e[+-]?\d+)?)/i))return"number";if(Q.match(/^\.+/))return null;if(Q.match(/^[\w\d_$#]+/))return"variable-2"}else{if(E.test(V))return Q.eatWhile(E),"operator";if(H.test(V))return"bracket";if(Z.test(V))return Q.eatWhile(Z),"punctuation";if(V=="{"&&(Q.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/)||Q.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/)))return"number";Q.eatWhile(/^[_\w\d]/);var K=Q.current().toLowerCase();return R.hasOwnProperty(K)&&(Q.match(/^( )+'[^']*'/)||Q.match(/^( )+"[^"]*"/))?"number":c.hasOwnProperty(K)?"atom":d.hasOwnProperty(K)?"type":w.hasOwnProperty(K)?"keyword":x.hasOwnProperty(K)?"builtin":null}}function re(Q,j){return function(V,_){for(var K=!1,X;(X=V.next())!=null;){if(X==Q&&!K){_.tokenize=ee;break}K=(M||j)&&!K&&X=="\\"}return"string"}}function N(Q){return function(j,V){var _=j.match(/^.*?(\/\*|\*\/)/);return _?_[1]=="/*"?V.tokenize=N(Q+1):Q>1?V.tokenize=N(Q-1):V.tokenize=ee:j.skipToEnd(),"comment"}}function F(Q,j,V){j.context={prev:j.context,indent:Q.indentation(),col:Q.column(),type:V}}function D(Q){Q.indent=Q.context.indent,Q.context=Q.context.prev}return{startState:function(){return{tokenize:ee,context:null}},token:function(Q,j){if(Q.sol()&&j.context&&j.context.align==null&&(j.context.align=!1),j.tokenize==ee&&Q.eatSpace())return null;var V=j.tokenize(Q,j);if(V=="comment")return V;j.context&&j.context.align==null&&(j.context.align=!0);var _=Q.current();return _=="("?F(Q,j,")"):_=="["?F(Q,j,"]"):j.context&&j.context.type==_&&D(j),V},indent:function(Q,j){var V=Q.context;if(!V)return o.Pass;var _=j.charAt(0)==V.type;return V.align?V.col+(_?0:1):V.indent+(_?0:g.indentUnit)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:z.commentSlashSlash?"//":z.commentHash?"#":"--",closeBrackets:"()[]{}''\"\"``",config:T}});function p(g){for(var T;(T=g.next())!=null;)if(T=="`"&&!g.eat("`"))return"variable-2";return g.backUp(g.current().length-1),g.eatWhile(/\w/)?"variable-2":null}function v(g){for(var T;(T=g.next())!=null;)if(T=='"'&&!g.eat('"'))return"variable-2";return g.backUp(g.current().length-1),g.eatWhile(/\w/)?"variable-2":null}function C(g){return g.eat("@")&&(g.match("session."),g.match("local."),g.match("global.")),g.eat("'")?(g.match(/^.*'/),"variable-2"):g.eat('"')?(g.match(/^.*"/),"variable-2"):g.eat("`")?(g.match(/^.*`/),"variable-2"):g.match(/^[0-9a-zA-Z$\.\_]+/)?"variable-2":null}function b(g){return g.eat("N")?"atom":g.match(/^[a-zA-Z.#!?]/)?"variable-2":null}var S="alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit ";function s(g){for(var T={},x=g.split(" "),c=0;c!=^\&|\/]/,brackets:/^[\{}\(\)]/,punctuation:/^[;.,:/]/,backslashStringEscapes:!1,dateSQL:s("date datetimeoffset datetime2 smalldatetime datetime time"),hooks:{"@":C}}),o.defineMIME("text/x-mysql",{name:"sql",client:s("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:s(S+"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":C,"`":p,"\\":b}}),o.defineMIME("text/x-mariadb",{name:"sql",client:s("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:s(S+"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":C,"`":p,"\\":b}}),o.defineMIME("text/x-sqlite",{name:"sql",client:s("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"),keywords:s(S+"abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"),atoms:s("null current_date current_time current_timestamp"),operatorChars:/^[*+\-%<>!=&|/~]/,dateSQL:s("date time timestamp datetime"),support:s("decimallessFloat zerolessFloat"),identifierQuote:'"',hooks:{"@":C,":":C,"?":C,$:C,'"':v,"`":p}}),o.defineMIME("text/x-cassandra",{name:"sql",client:{},keywords:s("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"),builtin:s("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"),atoms:s("false true infinity NaN"),operatorChars:/^[<>=]/,dateSQL:{},support:s("commentSlashSlash decimallessFloat"),hooks:{}}),o.defineMIME("text/x-plsql",{name:"sql",client:s("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),keywords:s("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),builtin:s("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),operatorChars:/^[*\/+\-%<>!=~]/,dateSQL:s("date time timestamp"),support:s("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")}),o.defineMIME("text/x-hive",{name:"sql",keywords:s("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"),builtin:s("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:s("date timestamp"),support:s("doubleQuote binaryNumber hexNumber")}),o.defineMIME("text/x-pgsql",{name:"sql",client:s("source"),keywords:s(S+"a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"),builtin:s("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time zone timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),atoms:s("false true null unknown"),operatorChars:/^[*\/+\-%<>!=&|^\/#@?~]/,backslashStringEscapes:!1,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant")}),o.defineMIME("text/x-gql",{name:"sql",keywords:s("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"),atoms:s("false true"),builtin:s("blob datetime first key __key__ string integer double boolean null"),operatorChars:/^[*+\-%<>!=]/}),o.defineMIME("text/x-gpsql",{name:"sql",client:s("source"),keywords:s("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"),builtin:s("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^\/#@?~]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast")}),o.defineMIME("text/x-sparksql",{name:"sql",keywords:s("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"),builtin:s("abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with"),atoms:s("false true null"),operatorChars:/^[*\/+\-%<>!=~&|^]/,dateSQL:s("date time timestamp"),support:s("doubleQuote zerolessFloat")}),o.defineMIME("text/x-esper",{name:"sql",client:s("source"),keywords:s("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"),builtin:{},atoms:s("false true null"),operatorChars:/^[*+\-%<>!=&|^\/#@?~]/,dateSQL:s("time"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber")}),o.defineMIME("text/x-trino",{name:"sql",keywords:s("abs absent acos add admin after all all_match alter analyze and any any_match approx_distinct approx_most_frequent approx_percentile approx_set arbitrary array_agg array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_sort array_union arrays_overlap as asc asin at at_timezone atan atan2 authorization avg bar bernoulli beta_cdf between bing_tile bing_tile_at bing_tile_coordinates bing_tile_polygon bing_tile_quadkey bing_tile_zoom_level bing_tiles_around bit_count bitwise_and bitwise_and_agg bitwise_left_shift bitwise_not bitwise_or bitwise_or_agg bitwise_right_shift bitwise_right_shift_arithmetic bitwise_xor bool_and bool_or both by call cardinality cascade case cast catalogs cbrt ceil ceiling char2hexint checksum chr classify coalesce codepoint column columns combinations comment commit committed concat concat_ws conditional constraint contains contains_sequence convex_hull_agg copartition corr cos cosh cosine_similarity count count_if covar_pop covar_samp crc32 create cross cube cume_dist current current_catalog current_date current_groups current_path current_role current_schema current_time current_timestamp current_timezone current_user data date_add date_diff date_format date_parse date_trunc day day_of_month day_of_week day_of_year deallocate default define definer degrees delete dense_rank deny desc describe descriptor distinct distributed dow doy drop e element_at else empty empty_approx_set encoding end error escape evaluate_classifier_predictions every except excluding execute exists exp explain extract false features fetch filter final first first_value flatten floor following for format format_datetime format_number from from_base from_base32 from_base64 from_base64url from_big_endian_32 from_big_endian_64 from_encoded_polyline from_geojson_geometry from_hex from_ieee754_32 from_ieee754_64 from_iso8601_date from_iso8601_timestamp from_iso8601_timestamp_nanos from_unixtime from_unixtime_nanos from_utf8 full functions geometric_mean geometry_from_hadoop_shape geometry_invalid_reason geometry_nearest_points geometry_to_bing_tiles geometry_union geometry_union_agg grant granted grants graphviz great_circle_distance greatest group grouping groups hamming_distance hash_counts having histogram hmac_md5 hmac_sha1 hmac_sha256 hmac_sha512 hour human_readable_seconds if ignore in including index infinity initial inner input insert intersect intersection_cardinality into inverse_beta_cdf inverse_normal_cdf invoker io is is_finite is_infinite is_json_scalar is_nan isolation jaccard_index join json_array json_array_contains json_array_get json_array_length json_exists json_extract json_extract_scalar json_format json_object json_parse json_query json_size json_value keep key keys kurtosis lag last last_day_of_month last_value lateral lead leading learn_classifier learn_libsvm_classifier learn_libsvm_regressor learn_regressor least left length level levenshtein_distance like limit line_interpolate_point line_interpolate_points line_locate_point listagg ln local localtime localtimestamp log log10 log2 logical lower lpad ltrim luhn_check make_set_digest map_agg map_concat map_entries map_filter map_from_entries map_keys map_union map_values map_zip_with match match_recognize matched matches materialized max max_by md5 measures merge merge_set_digest millisecond min min_by minute mod month multimap_agg multimap_from_entries murmur3 nan natural next nfc nfd nfkc nfkd ngrams no none none_match normal_cdf normalize not now nth_value ntile null nullif nulls numeric_histogram object objectid_timestamp of offset omit on one only option or order ordinality outer output over overflow parse_data_size parse_datetime parse_duration partition partitions passing past path pattern per percent_rank permute pi position pow power preceding prepare privileges properties prune qdigest_agg quarter quotes radians rand random range rank read recursive reduce reduce_agg refresh regexp_count regexp_extract regexp_extract_all regexp_like regexp_position regexp_replace regexp_split regr_intercept regr_slope regress rename render repeat repeatable replace reset respect restrict returning reverse revoke rgb right role roles rollback rollup round row_number rows rpad rtrim running scalar schema schemas second security seek select sequence serializable session set sets sha1 sha256 sha512 show shuffle sign simplify_geometry sin skewness skip slice some soundex spatial_partitioning spatial_partitions split split_part split_to_map split_to_multimap spooky_hash_v2_32 spooky_hash_v2_64 sqrt st_area st_asbinary st_astext st_boundary st_buffer st_centroid st_contains st_convexhull st_coorddim st_crosses st_difference st_dimension st_disjoint st_distance st_endpoint st_envelope st_envelopeaspts st_equals st_exteriorring st_geometries st_geometryfromtext st_geometryn st_geometrytype st_geomfrombinary st_interiorringn st_interiorrings st_intersection st_intersects st_isclosed st_isempty st_isring st_issimple st_isvalid st_length st_linefromtext st_linestring st_multipoint st_numgeometries st_numinteriorring st_numpoints st_overlaps st_point st_pointn st_points st_polygon st_relate st_startpoint st_symdifference st_touches st_union st_within st_x st_xmax st_xmin st_y st_ymax st_ymin start starts_with stats stddev stddev_pop stddev_samp string strpos subset substr substring sum system table tables tablesample tan tanh tdigest_agg text then ties timestamp_objectid timezone_hour timezone_minute to to_base to_base32 to_base64 to_base64url to_big_endian_32 to_big_endian_64 to_char to_date to_encoded_polyline to_geojson_geometry to_geometry to_hex to_ieee754_32 to_ieee754_64 to_iso8601 to_milliseconds to_spherical_geography to_timestamp to_unixtime to_utf8 trailing transaction transform transform_keys transform_values translate trim trim_array true truncate try try_cast type typeof uescape unbounded uncommitted unconditional union unique unknown unmatched unnest update upper url_decode url_encode url_extract_fragment url_extract_host url_extract_parameter url_extract_path url_extract_port url_extract_protocol url_extract_query use user using utf16 utf32 utf8 validate value value_at_quantile values values_at_quantiles var_pop var_samp variance verbose version view week week_of_year when where width_bucket wilson_interval_lower wilson_interval_upper window with with_timezone within without word_stem work wrapper write xxhash64 year year_of_week yow zip zip_with"),builtin:s("array bigint bingtile boolean char codepoints color date decimal double function geometry hyperloglog int integer interval ipaddress joniregexp json json2016 jsonpath kdbtree likepattern map model objectid p4hyperloglog precision qdigest re2jregexp real regressor row setdigest smallint sphericalgeography tdigest time timestamp tinyint uuid varbinary varchar zone"),atoms:s("false true null unknown"),operatorChars:/^[[\]|<>=!\-+*/%]/,dateSQL:s("date time timestamp zone"),support:s("decimallessFloat zerolessFloat hexNumber")})})});var ta=Ke(($u,Ku)=>{(function(o){typeof $u=="object"&&typeof Ku=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("stylus",function(M){for(var H=M.indentUnit,Z="",ee=y(p),re=/^(a|b|i|s|col|em)$/i,N=y(S),F=y(s),D=y(T),Q=y(g),j=y(v),V=z(v),_=y(b),K=y(C),X=y(h),I=/^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/,B=z(x),le=y(c),xe=new RegExp(/^\-(moz|ms|o|webkit)-/i),q=y(d),L="",de={},ze,pe,Ee,ge;Z.length|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/),W.context.line.firstWord=L?L[0].replace(/^\s*/,""):"",W.context.line.indent=$.indentation(),ze=$.peek(),$.match("//"))return $.skipToEnd(),["comment","comment"];if($.match("/*"))return W.tokenize=qe,qe($,W);if(ze=='"'||ze=="'")return $.next(),W.tokenize=Se(ze),W.tokenize($,W);if(ze=="@")return $.next(),$.eatWhile(/[\w\\-]/),["def",$.current()];if(ze=="#"){if($.next(),$.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\b(?!-)/i))return["atom","atom"];if($.match(/^[a-z][\w-]*/i))return["builtin","hash"]}return $.match(xe)?["meta","vendor-prefixes"]:$.match(/^-?[0-9]?\.?[0-9]/)?($.eatWhile(/[a-z%]/i),["number","unit"]):ze=="!"?($.next(),[$.match(/^(important|optional)/i)?"keyword":"operator","important"]):ze=="."&&$.match(/^\.[a-z][\w-]*/i)?["qualifier","qualifier"]:$.match(V)?($.peek()=="("&&(W.tokenize=je),["property","word"]):$.match(/^[a-z][\w-]*\(/i)?($.backUp(1),["keyword","mixin"]):$.match(/^(\+|-)[a-z][\w-]*\(/i)?($.backUp(1),["keyword","block-mixin"]):$.string.match(/^\s*&/)&&$.match(/^[-_]+[a-z][\w-]*/)?["qualifier","qualifier"]:$.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)?($.backUp(1),["variable-3","reference"]):$.match(/^&{1}\s*$/)?["variable-3","reference"]:$.match(B)?["operator","operator"]:$.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)?$.match(/^(\.|\[)[\w-\'\"\]]+/i,!1)&&!U($.current())?($.match("."),["variable-2","variable-name"]):["variable-2","word"]:$.match(I)?["operator",$.current()]:/[:;,{}\[\]\(\)]/.test(ze)?($.next(),[null,ze]):($.next(),[null,null])}function qe($,W){for(var se=!1,De;(De=$.next())!=null;){if(se&&De=="/"){W.tokenize=null;break}se=De=="*"}return["comment","comment"]}function Se($){return function(W,se){for(var De=!1,nt;(nt=W.next())!=null;){if(nt==$&&!De){$==")"&&W.backUp(1);break}De=!De&&nt=="\\"}return(nt==$||!De&&$!=")")&&(se.tokenize=null),["string","string"]}}function je($,W){return $.next(),$.match(/\s*[\"\')]/,!1)?W.tokenize=null:W.tokenize=Se(")"),[null,"("]}function Ze($,W,se,De){this.type=$,this.indent=W,this.prev=se,this.line=De||{firstWord:"",indent:0}}function ke($,W,se,De){return De=De>=0?De:H,$.context=new Ze(se,W.indentation()+De,$.context),se}function Je($,W){var se=$.context.indent-H;return W=W||!1,$.context=$.context.prev,W&&($.context.indent=se),$.context.type}function He($,W,se){return de[se.context.type]($,W,se)}function Ge($,W,se,De){for(var nt=De||1;nt>0;nt--)se.context=se.context.prev;return He($,W,se)}function U($){return $.toLowerCase()in ee}function G($){return $=$.toLowerCase(),$ in N||$ in X}function ce($){return $.toLowerCase()in le}function Be($){return $.toLowerCase().match(xe)}function te($){var W=$.toLowerCase(),se="variable-2";return U($)?se="tag":ce($)?se="block-keyword":G($)?se="property":W in D||W in q?se="atom":W=="return"||W in Q?se="keyword":$.match(/^[A-Z]/)&&(se="string"),se}function fe($,W){return Me(W)&&($=="{"||$=="]"||$=="hash"||$=="qualifier")||$=="block-mixin"}function oe($,W){return $=="{"&&W.match(/^\s*\$?[\w-]+/i,!1)}function Ue($,W){return $==":"&&W.match(/^[a-z-]+/,!1)}function we($){return $.sol()||$.string.match(new RegExp("^\\s*"+R($.current())))}function Me($){return $.eol()||$.match(/^\s*$/,!1)}function Le($){var W=/^\s*[-_]*[a-z0-9]+[\w-]*/i,se=typeof $=="string"?$.match(W):$.string.match(W);return se?se[0].replace(/^\s*/,""):""}return de.block=function($,W,se){if($=="comment"&&we(W)||$==","&&Me(W)||$=="mixin")return ke(se,W,"block",0);if(oe($,W))return ke(se,W,"interpolation");if(Me(W)&&$=="]"&&!/^\s*(\.|#|:|\[|\*|&)/.test(W.string)&&!U(Le(W)))return ke(se,W,"block",0);if(fe($,W))return ke(se,W,"block");if($=="}"&&Me(W))return ke(se,W,"block",0);if($=="variable-name")return W.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)||ce(Le(W))?ke(se,W,"variableName"):ke(se,W,"variableName",0);if($=="=")return!Me(W)&&!ce(Le(W))?ke(se,W,"block",0):ke(se,W,"block");if($=="*"&&(Me(W)||W.match(/\s*(,|\.|#|\[|:|{)/,!1)))return ge="tag",ke(se,W,"block");if(Ue($,W))return ke(se,W,"pseudo");if(/@(font-face|media|supports|(-moz-)?document)/.test($))return ke(se,W,Me(W)?"block":"atBlock");if(/@(-(moz|ms|o|webkit)-)?keyframes$/.test($))return ke(se,W,"keyframes");if(/@extends?/.test($))return ke(se,W,"extend",0);if($&&$.charAt(0)=="@")return W.indentation()>0&&G(W.current().slice(1))?(ge="variable-2","block"):/(@import|@require|@charset)/.test($)?ke(se,W,"block",0):ke(se,W,"block");if($=="reference"&&Me(W))return ke(se,W,"block");if($=="(")return ke(se,W,"parens");if($=="vendor-prefixes")return ke(se,W,"vendorPrefixes");if($=="word"){var De=W.current();if(ge=te(De),ge=="property")return we(W)?ke(se,W,"block",0):(ge="atom","block");if(ge=="tag"){if(/embed|menu|pre|progress|sub|table/.test(De)&&G(Le(W))||W.string.match(new RegExp("\\[\\s*"+De+"|"+De+"\\s*\\]")))return ge="atom","block";if(re.test(De)&&(we(W)&&W.string.match(/=/)||!we(W)&&!W.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/)&&!U(Le(W))))return ge="variable-2",ce(Le(W))?"block":ke(se,W,"block",0);if(Me(W))return ke(se,W,"block")}if(ge=="block-keyword")return ge="keyword",W.current(/(if|unless)/)&&!we(W)?"block":ke(se,W,"block");if(De=="return")return ke(se,W,"block",0);if(ge=="variable-2"&&W.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/))return ke(se,W,"block")}return se.context.type},de.parens=function($,W,se){if($=="(")return ke(se,W,"parens");if($==")")return se.context.prev.type=="parens"?Je(se):W.string.match(/^[a-z][\w-]*\(/i)&&Me(W)||ce(Le(W))||/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(Le(W))||!W.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/)&&U(Le(W))?ke(se,W,"block"):W.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/)||W.string.match(/^\s*(\(|\)|[0-9])/)||W.string.match(/^\s+[a-z][\w-]*\(/i)||W.string.match(/^\s+[\$-]?[a-z]/i)?ke(se,W,"block",0):Me(W)?ke(se,W,"block"):ke(se,W,"block",0);if($&&$.charAt(0)=="@"&&G(W.current().slice(1))&&(ge="variable-2"),$=="word"){var De=W.current();ge=te(De),ge=="tag"&&re.test(De)&&(ge="variable-2"),(ge=="property"||De=="to")&&(ge="atom")}return $=="variable-name"?ke(se,W,"variableName"):Ue($,W)?ke(se,W,"pseudo"):se.context.type},de.vendorPrefixes=function($,W,se){return $=="word"?(ge="property",ke(se,W,"block",0)):Je(se)},de.pseudo=function($,W,se){return G(Le(W.string))?Ge($,W,se):(W.match(/^[a-z-]+/),ge="variable-3",Me(W)?ke(se,W,"block"):Je(se))},de.atBlock=function($,W,se){if($=="(")return ke(se,W,"atBlock_parens");if(fe($,W))return ke(se,W,"block");if(oe($,W))return ke(se,W,"interpolation");if($=="word"){var De=W.current().toLowerCase();if(/^(only|not|and|or)$/.test(De)?ge="keyword":j.hasOwnProperty(De)?ge="tag":K.hasOwnProperty(De)?ge="attribute":_.hasOwnProperty(De)?ge="property":F.hasOwnProperty(De)?ge="string-2":ge=te(W.current()),ge=="tag"&&Me(W))return ke(se,W,"block")}return $=="operator"&&/^(not|and|or)$/.test(W.current())&&(ge="keyword"),se.context.type},de.atBlock_parens=function($,W,se){if($=="{"||$=="}")return se.context.type;if($==")")return Me(W)?ke(se,W,"block"):ke(se,W,"atBlock");if($=="word"){var De=W.current().toLowerCase();return ge=te(De),/^(max|min)/.test(De)&&(ge="property"),ge=="tag"&&(re.test(De)?ge="variable-2":ge="atom"),se.context.type}return de.atBlock($,W,se)},de.keyframes=function($,W,se){return W.indentation()=="0"&&($=="}"&&we(W)||$=="]"||$=="hash"||$=="qualifier"||U(W.current()))?Ge($,W,se):$=="{"?ke(se,W,"keyframes"):$=="}"?we(W)?Je(se,!0):ke(se,W,"keyframes"):$=="unit"&&/^[0-9]+\%$/.test(W.current())?ke(se,W,"keyframes"):$=="word"&&(ge=te(W.current()),ge=="block-keyword")?(ge="keyword",ke(se,W,"keyframes")):/@(font-face|media|supports|(-moz-)?document)/.test($)?ke(se,W,Me(W)?"block":"atBlock"):$=="mixin"?ke(se,W,"block",0):se.context.type},de.interpolation=function($,W,se){return $=="{"&&Je(se)&&ke(se,W,"block"),$=="}"?W.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i)||W.string.match(/^\s*[a-z]/i)&&U(Le(W))?ke(se,W,"block"):!W.string.match(/^(\{|\s*\&)/)||W.match(/\s*[\w-]/,!1)?ke(se,W,"block",0):ke(se,W,"block"):$=="variable-name"?ke(se,W,"variableName",0):($=="word"&&(ge=te(W.current()),ge=="tag"&&(ge="atom")),se.context.type)},de.extend=function($,W,se){return $=="["||$=="="?"extend":$=="]"?Je(se):$=="word"?(ge=te(W.current()),"extend"):Je(se)},de.variableName=function($,W,se){return $=="string"||$=="["||$=="]"||W.current().match(/^(\.|\$)/)?(W.current().match(/^\.[\w-]+/i)&&(ge="variable-2"),"variableName"):Ge($,W,se)},{startState:function($){return{tokenize:null,state:"block",context:new Ze("block",$||0,null)}},token:function($,W){return!W.tokenize&&$.eatSpace()?null:(pe=(W.tokenize||Oe)($,W),pe&&typeof pe=="object"&&(Ee=pe[1],pe=pe[0]),ge=pe,W.state=de[W.state](Ee,$,W),ge)},indent:function($,W,se){var De=$.context,nt=W&&W.charAt(0),dt=De.indent,Pt=Le(W),It=se.match(/^\s*/)[0].replace(/\t/g,Z).length,Pe=$.context.prev?$.context.prev.line.firstWord:"",xt=$.context.prev?$.context.prev.line.indent:It;return De.prev&&(nt=="}"&&(De.type=="block"||De.type=="atBlock"||De.type=="keyframes")||nt==")"&&(De.type=="parens"||De.type=="atBlock_parens")||nt=="{"&&De.type=="at")?dt=De.indent-H:/(\})/.test(nt)||(/@|\$|\d/.test(nt)||/^\{/.test(W)||/^\s*\/(\/|\*)/.test(W)||/^\s*\/\*/.test(Pe)||/^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(W)||/^(\+|-)?[a-z][\w-]*\(/i.test(W)||/^return/.test(W)||ce(Pt)?dt=It:/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(nt)||U(Pt)?/\,\s*$/.test(Pe)?dt=xt:/^\s+/.test(se)&&(/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(Pe)||U(Pe))?dt=It<=xt?xt:xt+H:dt=It:!/,\s*$/.test(se)&&(Be(Pt)||G(Pt))&&(ce(Pe)?dt=It<=xt?xt:xt+H:/^\{/.test(Pe)?dt=It<=xt?It:xt+H:Be(Pe)||G(Pe)?dt=It>=xt?xt:It:/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(Pe)||/=\s*$/.test(Pe)||U(Pe)||/^\$[\w-\.\[\]\'\"]/.test(Pe)?dt=xt+H:dt=It)),dt},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:"//",fold:"indent"}});var p=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","bgsound","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","var","video"],v=["domain","regexp","url-prefix","url"],C=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],b=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","dynamic-range","video-dynamic-range"],S=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"],s=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],h=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],g=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],T=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","conic-gradient","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","high","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-play-button","media-slider","media-sliderthumb","media-volume-slider","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","standard","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around","unset"],x=["in","and","or","not","is not","is a","is","isnt","defined","if unless"],c=["for","if","else","unless","from","to"],d=["null","true","false","href","title","type","not-allowed","readonly","disabled"],w=["@font-face","@keyframes","@media","@viewport","@page","@host","@supports","@block","@css"],E=p.concat(v,C,b,S,s,g,T,h,x,c,d,w);function z(M){return M=M.sort(function(H,Z){return Z>H}),new RegExp("^(("+M.join(")|(")+"))\\b")}function y(M){for(var H={},Z=0;Z{(function(o){typeof Gu=="object"&&typeof Zu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(N){for(var F={},D=0;D~^?!",h=":;,.(){}[]",g=/^\-?0b[01][01_]*/,T=/^\-?0o[0-7][0-7_]*/,x=/^\-?0x[\dA-Fa-f][\dA-Fa-f_]*(?:(?:\.[\dA-Fa-f][\dA-Fa-f_]*)?[Pp]\-?\d[\d_]*)?/,c=/^\-?\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee]\-?\d[\d_]*)?/,d=/^\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1/,w=/^\.(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/,E=/^\#[A-Za-z]+/,z=/^@(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/;function y(N,F,D){if(N.sol()&&(F.indented=N.indentation()),N.eatSpace())return null;var Q=N.peek();if(Q=="/"){if(N.match("//"))return N.skipToEnd(),"comment";if(N.match("/*"))return F.tokenize.push(H),H(N,F)}if(N.match(E))return"builtin";if(N.match(z))return"attribute";if(N.match(g)||N.match(T)||N.match(x)||N.match(c))return"number";if(N.match(w))return"property";if(s.indexOf(Q)>-1)return N.next(),"operator";if(h.indexOf(Q)>-1)return N.next(),N.match(".."),"punctuation";var j;if(j=N.match(/("""|"|')/)){var V=M.bind(null,j[0]);return F.tokenize.push(V),V(N,F)}if(N.match(d)){var _=N.current();return S.hasOwnProperty(_)?"variable-2":b.hasOwnProperty(_)?"atom":v.hasOwnProperty(_)?(C.hasOwnProperty(_)&&(F.prev="define"),"keyword"):D=="define"?"def":"variable"}return N.next(),null}function R(){var N=0;return function(F,D,Q){var j=y(F,D,Q);if(j=="punctuation"){if(F.current()=="(")++N;else if(F.current()==")"){if(N==0)return F.backUp(1),D.tokenize.pop(),D.tokenize[D.tokenize.length-1](F,D);--N}}return j}}function M(N,F,D){for(var Q=N.length==1,j,V=!1;j=F.peek();)if(V){if(F.next(),j=="(")return D.tokenize.push(R()),"string";V=!1}else{if(F.match(N))return D.tokenize.pop(),"string";F.next(),V=j=="\\"}return Q&&D.tokenize.pop(),"string"}function H(N,F){for(var D;D=N.next();)if(D==="/"&&N.eat("*"))F.tokenize.push(H);else if(D==="*"&&N.eat("/")){F.tokenize.pop();break}return"comment"}function Z(N,F,D){this.prev=N,this.align=F,this.indented=D}function ee(N,F){var D=F.match(/^\s*($|\/[\/\*])/,!1)?null:F.column()+1;N.context=new Z(N.context,D,N.indented)}function re(N){N.context&&(N.indented=N.context.indented,N.context=N.context.prev)}o.defineMode("swift",function(N){return{startState:function(){return{prev:null,context:null,indented:0,tokenize:[]}},token:function(F,D){var Q=D.prev;D.prev=null;var j=D.tokenize[D.tokenize.length-1]||y,V=j(F,D,Q);if(!V||V=="comment"?D.prev=Q:D.prev||(D.prev=V),V=="punctuation"){var _=/[\(\[\{]|([\]\)\}])/.exec(F.current());_&&(_[1]?re:ee)(D,F)}return V},indent:function(F,D){var Q=F.context;if(!Q)return 0;var j=/^[\]\}\)]/.test(D);return Q.align!=null?Q.align-(j?1:0):Q.indented+(j?0:N.indentUnit)},electricInput:/^\s*[\)\}\]]$/,lineComment:"//",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace",closeBrackets:"()[]{}''\"\"``"}}),o.defineMIME("text/x-swift","swift")})});var Vu=Ke((Yu,Qu)=>{(function(o){typeof Yu=="object"&&typeof Qu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("coffeescript",function(p,v){var C="error";function b(F){return new RegExp("^(("+F.join(")|(")+"))\\b")}var S=/^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/,s=/^(?:[()\[\]{},:`=;]|\.\.?\.?)/,h=/^[_A-Za-z$][_A-Za-z$0-9]*/,g=/^@[_A-Za-z$][_A-Za-z$0-9]*/,T=b(["and","or","not","is","isnt","in","instanceof","typeof"]),x=["for","while","loop","if","unless","else","switch","try","catch","finally","class"],c=["break","by","continue","debugger","delete","do","in","of","new","return","then","this","@","throw","when","until","extends"],d=b(x.concat(c));x=b(x);var w=/^('{3}|\"{3}|['\"])/,E=/^(\/{3}|\/)/,z=["Infinity","NaN","undefined","null","true","false","on","off","yes","no"],y=b(z);function R(F,D){if(F.sol()){D.scope.align===null&&(D.scope.align=!1);var Q=D.scope.offset;if(F.eatSpace()){var j=F.indentation();return j>Q&&D.scope.type=="coffee"?"indent":j0&&ee(F,D)}if(F.eatSpace())return null;var V=F.peek();if(F.match("####"))return F.skipToEnd(),"comment";if(F.match("###"))return D.tokenize=H,D.tokenize(F,D);if(V==="#")return F.skipToEnd(),"comment";if(F.match(/^-?[0-9\.]/,!1)){var _=!1;if(F.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)&&(_=!0),F.match(/^-?\d+\.\d*/)&&(_=!0),F.match(/^-?\.\d+/)&&(_=!0),_)return F.peek()=="."&&F.backUp(1),"number";var K=!1;if(F.match(/^-?0x[0-9a-f]+/i)&&(K=!0),F.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)&&(K=!0),F.match(/^-?0(?![\dx])/i)&&(K=!0),K)return"number"}if(F.match(w))return D.tokenize=M(F.current(),!1,"string"),D.tokenize(F,D);if(F.match(E)){if(F.current()!="/"||F.match(/^.*\//,!1))return D.tokenize=M(F.current(),!0,"string-2"),D.tokenize(F,D);F.backUp(1)}return F.match(S)||F.match(T)?"operator":F.match(s)?"punctuation":F.match(y)?"atom":F.match(g)||D.prop&&F.match(h)?"property":F.match(d)?"keyword":F.match(h)?"variable":(F.next(),C)}function M(F,D,Q){return function(j,V){for(;!j.eol();)if(j.eatWhile(/[^'"\/\\]/),j.eat("\\")){if(j.next(),D&&j.eol())return Q}else{if(j.match(F))return V.tokenize=R,Q;j.eat(/['"\/]/)}return D&&(v.singleLineStringErrors?Q=C:V.tokenize=R),Q}}function H(F,D){for(;!F.eol();){if(F.eatWhile(/[^#]/),F.match("###")){D.tokenize=R;break}F.eatWhile("#")}return"comment"}function Z(F,D,Q){Q=Q||"coffee";for(var j=0,V=!1,_=null,K=D.scope;K;K=K.prev)if(K.type==="coffee"||K.type=="}"){j=K.offset+p.indentUnit;break}Q!=="coffee"?(V=null,_=F.column()+F.current().length):D.scope.align&&(D.scope.align=!1),D.scope={offset:j,type:Q,prev:D.scope,align:V,alignOffset:_}}function ee(F,D){if(D.scope.prev)if(D.scope.type==="coffee"){for(var Q=F.indentation(),j=!1,V=D.scope;V;V=V.prev)if(Q===V.offset){j=!0;break}if(!j)return!0;for(;D.scope.prev&&D.scope.offset!==Q;)D.scope=D.scope.prev;return!1}else return D.scope=D.scope.prev,!1}function re(F,D){var Q=D.tokenize(F,D),j=F.current();j==="return"&&(D.dedent=!0),((j==="->"||j==="=>")&&F.eol()||Q==="indent")&&Z(F,D);var V="[({".indexOf(j);if(V!==-1&&Z(F,D,"])}".slice(V,V+1)),x.exec(j)&&Z(F,D),j=="then"&&ee(F,D),Q==="dedent"&&ee(F,D))return C;if(V="])}".indexOf(j),V!==-1){for(;D.scope.type=="coffee"&&D.scope.prev;)D.scope=D.scope.prev;D.scope.type==j&&(D.scope=D.scope.prev)}return D.dedent&&F.eol()&&(D.scope.type=="coffee"&&D.scope.prev&&(D.scope=D.scope.prev),D.dedent=!1),Q}var N={startState:function(F){return{tokenize:R,scope:{offset:F||0,type:"coffee",prev:null,align:!1},prop:!1,dedent:0}},token:function(F,D){var Q=D.scope.align===null&&D.scope;Q&&F.sol()&&(Q.align=!1);var j=re(F,D);return j&&j!="comment"&&(Q&&(Q.align=!0),D.prop=j=="punctuation"&&F.current()=="."),j},indent:function(F,D){if(F.tokenize!=R)return 0;var Q=F.scope,j=D&&"])}".indexOf(D.charAt(0))>-1;if(j)for(;Q.type=="coffee"&&Q.prev;)Q=Q.prev;var V=j&&Q.type===D.charAt(0);return Q.align?Q.alignOffset-(V?1:0):(V?Q.prev:Q).offset},lineComment:"#",fold:"indent"};return N}),o.defineMIME("application/vnd.coffeescript","coffeescript"),o.defineMIME("text/x-coffeescript","coffeescript"),o.defineMIME("text/coffeescript","coffeescript")})});var tc=Ke((Ju,ec)=>{(function(o){typeof Ju=="object"&&typeof ec=="object"?o(We(),vn(),gn(),Qn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../javascript/javascript","../css/css","../htmlmixed/htmlmixed"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("pug",function(p){var v="keyword",C="meta",b="builtin",S="qualifier",s={"{":"}","(":")","[":"]"},h=o.getMode(p,"javascript");function g(){this.javaScriptLine=!1,this.javaScriptLineExcludesColon=!1,this.javaScriptArguments=!1,this.javaScriptArgumentsDepth=0,this.isInterpolating=!1,this.interpolationNesting=0,this.jsState=o.startState(h),this.restOfLine="",this.isIncludeFiltered=!1,this.isEach=!1,this.lastTag="",this.scriptType="",this.isAttrs=!1,this.attrsNest=[],this.inAttributeName=!0,this.attributeIsType=!1,this.attrValue="",this.indentOf=1/0,this.indentToken="",this.innerMode=null,this.innerState=null,this.innerModeForLine=!1}g.prototype.copy=function(){var U=new g;return U.javaScriptLine=this.javaScriptLine,U.javaScriptLineExcludesColon=this.javaScriptLineExcludesColon,U.javaScriptArguments=this.javaScriptArguments,U.javaScriptArgumentsDepth=this.javaScriptArgumentsDepth,U.isInterpolating=this.isInterpolating,U.interpolationNesting=this.interpolationNesting,U.jsState=o.copyState(h,this.jsState),U.innerMode=this.innerMode,this.innerMode&&this.innerState&&(U.innerState=o.copyState(this.innerMode,this.innerState)),U.restOfLine=this.restOfLine,U.isIncludeFiltered=this.isIncludeFiltered,U.isEach=this.isEach,U.lastTag=this.lastTag,U.scriptType=this.scriptType,U.isAttrs=this.isAttrs,U.attrsNest=this.attrsNest.slice(),U.inAttributeName=this.inAttributeName,U.attributeIsType=this.attributeIsType,U.attrValue=this.attrValue,U.indentOf=this.indentOf,U.indentToken=this.indentToken,U.innerModeForLine=this.innerModeForLine,U};function T(U,G){if(U.sol()&&(G.javaScriptLine=!1,G.javaScriptLineExcludesColon=!1),G.javaScriptLine){if(G.javaScriptLineExcludesColon&&U.peek()===":"){G.javaScriptLine=!1,G.javaScriptLineExcludesColon=!1;return}var ce=h.token(U,G.jsState);return U.eol()&&(G.javaScriptLine=!1),ce||!0}}function x(U,G){if(G.javaScriptArguments){if(G.javaScriptArgumentsDepth===0&&U.peek()!=="("){G.javaScriptArguments=!1;return}if(U.peek()==="("?G.javaScriptArgumentsDepth++:U.peek()===")"&&G.javaScriptArgumentsDepth--,G.javaScriptArgumentsDepth===0){G.javaScriptArguments=!1;return}var ce=h.token(U,G.jsState);return ce||!0}}function c(U){if(U.match(/^yield\b/))return"keyword"}function d(U){if(U.match(/^(?:doctype) *([^\n]+)?/))return C}function w(U,G){if(U.match("#{"))return G.isInterpolating=!0,G.interpolationNesting=0,"punctuation"}function E(U,G){if(G.isInterpolating){if(U.peek()==="}"){if(G.interpolationNesting--,G.interpolationNesting<0)return U.next(),G.isInterpolating=!1,"punctuation"}else U.peek()==="{"&&G.interpolationNesting++;return h.token(U,G.jsState)||!0}}function z(U,G){if(U.match(/^case\b/))return G.javaScriptLine=!0,v}function y(U,G){if(U.match(/^when\b/))return G.javaScriptLine=!0,G.javaScriptLineExcludesColon=!0,v}function R(U){if(U.match(/^default\b/))return v}function M(U,G){if(U.match(/^extends?\b/))return G.restOfLine="string",v}function H(U,G){if(U.match(/^append\b/))return G.restOfLine="variable",v}function Z(U,G){if(U.match(/^prepend\b/))return G.restOfLine="variable",v}function ee(U,G){if(U.match(/^block\b *(?:(prepend|append)\b)?/))return G.restOfLine="variable",v}function re(U,G){if(U.match(/^include\b/))return G.restOfLine="string",v}function N(U,G){if(U.match(/^include:([a-zA-Z0-9\-]+)/,!1)&&U.match("include"))return G.isIncludeFiltered=!0,v}function F(U,G){if(G.isIncludeFiltered){var ce=B(U,G);return G.isIncludeFiltered=!1,G.restOfLine="string",ce}}function D(U,G){if(U.match(/^mixin\b/))return G.javaScriptLine=!0,v}function Q(U,G){if(U.match(/^\+([-\w]+)/))return U.match(/^\( *[-\w]+ *=/,!1)||(G.javaScriptArguments=!0,G.javaScriptArgumentsDepth=0),"variable";if(U.match("+#{",!1))return U.next(),G.mixinCallAfter=!0,w(U,G)}function j(U,G){if(G.mixinCallAfter)return G.mixinCallAfter=!1,U.match(/^\( *[-\w]+ *=/,!1)||(G.javaScriptArguments=!0,G.javaScriptArgumentsDepth=0),!0}function V(U,G){if(U.match(/^(if|unless|else if|else)\b/))return G.javaScriptLine=!0,v}function _(U,G){if(U.match(/^(- *)?(each|for)\b/))return G.isEach=!0,v}function K(U,G){if(G.isEach){if(U.match(/^ in\b/))return G.javaScriptLine=!0,G.isEach=!1,v;if(U.sol()||U.eol())G.isEach=!1;else if(U.next()){for(;!U.match(/^ in\b/,!1)&&U.next(););return"variable"}}}function X(U,G){if(U.match(/^while\b/))return G.javaScriptLine=!0,v}function I(U,G){var ce;if(ce=U.match(/^(\w(?:[-:\w]*\w)?)\/?/))return G.lastTag=ce[1].toLowerCase(),G.lastTag==="script"&&(G.scriptType="application/javascript"),"tag"}function B(U,G){if(U.match(/^:([\w\-]+)/)){var ce;return p&&p.innerModes&&(ce=p.innerModes(U.current().substring(1))),ce||(ce=U.current().substring(1)),typeof ce=="string"&&(ce=o.getMode(p,ce)),je(U,G,ce),"atom"}}function le(U,G){if(U.match(/^(!?=|-)/))return G.javaScriptLine=!0,"punctuation"}function xe(U){if(U.match(/^#([\w-]+)/))return b}function q(U){if(U.match(/^\.([\w-]+)/))return S}function L(U,G){if(U.peek()=="(")return U.next(),G.isAttrs=!0,G.attrsNest=[],G.inAttributeName=!0,G.attrValue="",G.attributeIsType=!1,"punctuation"}function de(U,G){if(G.isAttrs){if(s[U.peek()]&&G.attrsNest.push(s[U.peek()]),G.attrsNest[G.attrsNest.length-1]===U.peek())G.attrsNest.pop();else if(U.eat(")"))return G.isAttrs=!1,"punctuation";if(G.inAttributeName&&U.match(/^[^=,\)!]+/))return(U.peek()==="="||U.peek()==="!")&&(G.inAttributeName=!1,G.jsState=o.startState(h),G.lastTag==="script"&&U.current().trim().toLowerCase()==="type"?G.attributeIsType=!0:G.attributeIsType=!1),"attribute";var ce=h.token(U,G.jsState);if(G.attributeIsType&&ce==="string"&&(G.scriptType=U.current().toString()),G.attrsNest.length===0&&(ce==="string"||ce==="variable"||ce==="keyword"))try{return Function("","var x "+G.attrValue.replace(/,\s*$/,"").replace(/^!/,"")),G.inAttributeName=!0,G.attrValue="",U.backUp(U.current().length),de(U,G)}catch{}return G.attrValue+=U.current(),ce||!0}}function ze(U,G){if(U.match(/^&attributes\b/))return G.javaScriptArguments=!0,G.javaScriptArgumentsDepth=0,"keyword"}function pe(U){if(U.sol()&&U.eatSpace())return"indent"}function Ee(U,G){if(U.match(/^ *\/\/(-)?([^\n]*)/))return G.indentOf=U.indentation(),G.indentToken="comment","comment"}function ge(U){if(U.match(/^: */))return"colon"}function Oe(U,G){if(U.match(/^(?:\| ?| )([^\n]+)/))return"string";if(U.match(/^(<[^\n]*)/,!1))return je(U,G,"htmlmixed"),G.innerModeForLine=!0,Ze(U,G,!0)}function qe(U,G){if(U.eat(".")){var ce=null;return G.lastTag==="script"&&G.scriptType.toLowerCase().indexOf("javascript")!=-1?ce=G.scriptType.toLowerCase().replace(/"|'/g,""):G.lastTag==="style"&&(ce="css"),je(U,G,ce),"dot"}}function Se(U){return U.next(),null}function je(U,G,ce){ce=o.mimeModes[ce]||ce,ce=p.innerModes&&p.innerModes(ce)||ce,ce=o.mimeModes[ce]||ce,ce=o.getMode(p,ce),G.indentOf=U.indentation(),ce&&ce.name!=="null"?G.innerMode=ce:G.indentToken="string"}function Ze(U,G,ce){if(U.indentation()>G.indentOf||G.innerModeForLine&&!U.sol()||ce)return G.innerMode?(G.innerState||(G.innerState=G.innerMode.startState?o.startState(G.innerMode,U.indentation()):{}),U.hideFirstChars(G.indentOf+2,function(){return G.innerMode.token(U,G.innerState)||!0})):(U.skipToEnd(),G.indentToken);U.sol()&&(G.indentOf=1/0,G.indentToken=null,G.innerMode=null,G.innerState=null)}function ke(U,G){if(U.sol()&&(G.restOfLine=""),G.restOfLine){U.skipToEnd();var ce=G.restOfLine;return G.restOfLine="",ce}}function Je(){return new g}function He(U){return U.copy()}function Ge(U,G){var ce=Ze(U,G)||ke(U,G)||E(U,G)||F(U,G)||K(U,G)||de(U,G)||T(U,G)||x(U,G)||j(U,G)||c(U)||d(U)||w(U,G)||z(U,G)||y(U,G)||R(U)||M(U,G)||H(U,G)||Z(U,G)||ee(U,G)||re(U,G)||N(U,G)||D(U,G)||Q(U,G)||V(U,G)||_(U,G)||X(U,G)||I(U,G)||B(U,G)||le(U,G)||xe(U)||q(U)||L(U,G)||ze(U,G)||pe(U)||Oe(U,G)||Ee(U,G)||ge(U)||qe(U,G)||Se(U);return ce===!0?null:ce}return{startState:Je,copyState:He,token:Ge}},"javascript","css","htmlmixed"),o.defineMIME("text/x-pug","pug"),o.defineMIME("text/x-jade","pug")})});var ic=Ke((rc,nc)=>{(function(o){typeof rc=="object"&&typeof nc=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.multiplexingMode=function(p){var v=Array.prototype.slice.call(arguments,1);function C(b,S,s,h){if(typeof S=="string"){var g=b.indexOf(S,s);return h&&g>-1?g+S.length:g}var T=S.exec(s?b.slice(s):b);return T?T.index+s+(h?T[0].length:0):-1}return{startState:function(){return{outer:o.startState(p),innerActive:null,inner:null,startingInner:!1}},copyState:function(b){return{outer:o.copyState(p,b.outer),innerActive:b.innerActive,inner:b.innerActive&&o.copyState(b.innerActive.mode,b.inner),startingInner:b.startingInner}},token:function(b,S){if(S.innerActive){var E=S.innerActive,h=b.string;if(!E.close&&b.sol())return S.innerActive=S.inner=null,this.token(b,S);var x=E.close&&!S.startingInner?C(h,E.close,b.pos,E.parseDelimiters):-1;if(x==b.pos&&!E.parseDelimiters)return b.match(E.close),S.innerActive=S.inner=null,E.delimStyle&&E.delimStyle+" "+E.delimStyle+"-close";x>-1&&(b.string=h.slice(0,x));var z=E.mode.token(b,S.inner);return x>-1?b.string=h:b.pos>b.start&&(S.startingInner=!1),x==b.pos&&E.parseDelimiters&&(S.innerActive=S.inner=null),E.innerStyle&&(z?z=z+" "+E.innerStyle:z=E.innerStyle),z}else{for(var s=1/0,h=b.string,g=0;g>1,q=O(_.slice(0,re)).length;if(q==E)return re;q>E?J=re:G=re+1}}function k(_,W,E,O){if(!W.length)return null;var G=O?w:c,J=G(W).split(/\r|\n\r?/);e:for(var re=E.line,q=E.ch,I=_.lastLine()+1-J.length;re<=I;re++,q=0){var D=_.getLine(re).slice(q),Q=G(D);if(J.length==1){var j=Q.indexOf(J[0]);if(j==-1)continue e;var E=d(D,Q,j,G)+q;return{from:p(re,d(D,Q,j,G)+q),to:p(re,d(D,Q,j+J[0].length,G)+q)}}else{var V=Q.length-J[0].length;if(Q.slice(V)!=J[0])continue e;for(var y=1;y=I;re--,q=-1){var D=_.getLine(re);q>-1&&(D=D.slice(0,q));var Q=G(D);if(J.length==1){var j=Q.lastIndexOf(J[0]);if(j==-1)continue e;return{from:p(re,d(D,Q,j,G)),to:p(re,d(D,Q,j+J[0].length,G))}}else{var V=J[J.length-1];if(Q.slice(0,V.length)!=V)continue e;for(var y=1,E=re-J.length+1;y(this.doc.getLine(W.line)||"").length&&(W.ch=0,W.line++)),o.cmpPos(W,this.doc.clipPos(W))!=0))return this.atOccurrence=!1;var E=this.matches(_,W);if(this.afterEmptyMatch=E&&o.cmpPos(E.from,E.to)==0,E)return this.pos=E,this.atOccurrence=!0,this.pos.match||!0;var O=p(_?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:O,to:O},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(_,W){if(this.atOccurrence){var E=o.splitLines(_);this.doc.replaceRange(E,this.pos.from,this.pos.to,W),this.pos.to=p(this.pos.from.line+E.length-1,E[E.length-1].length+(E.length==1?this.pos.from.ch:0))}}},o.defineExtension("getSearchCursor",function(_,W,E){return new M(this.doc,_,W,E)}),o.defineDocExtension("getSearchCursor",function(_,W,E){return new M(this,_,W,E)}),o.defineExtension("selectMatches",function(_,W){for(var E=[],O=this.getSearchCursor(_,this.getCursor("from"),W);O.findNext()&&!(o.cmpPos(O.to(),this.getCursor("to"))>0);)E.push({anchor:O.from(),head:O.to()});E.length&&this.setSelections(E,0)})})});var Vo=Ke((ws,Ss)=>{(function(o){typeof ws=="object"&&typeof Ss=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(N,R,le,xe,F,L){this.indented=N,this.column=R,this.type=le,this.info=xe,this.align=F,this.prev=L}function v(N,R,le,xe){var F=N.indented;return N.context&&N.context.type=="statement"&&le!="statement"&&(F=N.context.indented),N.context=new p(F,R,le,xe,null,N.context)}function C(N){var R=N.context.type;return(R==")"||R=="]"||R=="}")&&(N.indented=N.context.indented),N.context=N.context.prev}function b(N,R,le){if(R.prevToken=="variable"||R.prevToken=="type"||/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(N.string.slice(0,le))||R.typeAtEndOfLine&&N.column()==N.indentation())return!0}function S(N){for(;;){if(!N||N.type=="top")return!0;if(N.type=="}"&&N.prev.info!="namespace")return!1;N=N.prev}}o.defineMode("clike",function(N,R){var le=N.indentUnit,xe=R.statementIndentUnit||le,F=R.dontAlignCalls,L=R.keywords||{},de=R.types||{},ze=R.builtin||{},pe=R.blockKeywords||{},Ee=R.defKeywords||{},ge=R.atoms||{},Oe=R.hooks||{},qe=R.multiLineStrings,Se=R.indentStatements!==!1,Be=R.indentSwitch!==!1,Ze=R.namespaceSeparator,ke=R.isPunctuationChar||/[\[\]{}\(\),;\:\.]/,Je=R.numberStart||/[\d\.]/,Re=R.number||/^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i,Ge=R.isOperatorChar||/[+\-*&%=<>!?|\/]/,U=R.isIdentifierChar||/[\w\$_\xa1-\uffff]/,Z=R.isReservedIdentifier||!1,ce,He;function te(we,Me){var Le=we.next();if(Oe[Le]){var $=Oe[Le](we,Me);if($!==!1)return $}if(Le=='"'||Le=="'")return Me.tokenize=fe(Le),Me.tokenize(we,Me);if(Je.test(Le)){if(we.backUp(1),we.match(Re))return"number";we.next()}if(ke.test(Le))return ce=Le,null;if(Le=="/"){if(we.eat("*"))return Me.tokenize=oe,oe(we,Me);if(we.eat("/"))return we.skipToEnd(),"comment"}if(Ge.test(Le)){for(;!we.match(/^\/[\/*]/,!1)&&we.eat(Ge););return"operator"}if(we.eatWhile(U),Ze)for(;we.match(Ze);)we.eatWhile(U);var H=we.current();return h(L,H)?(h(pe,H)&&(ce="newstatement"),h(Ee,H)&&(He=!0),"keyword"):h(de,H)?"type":h(ze,H)||Z&&Z(H)?(h(pe,H)&&(ce="newstatement"),"builtin"):h(ge,H)?"atom":"variable"}function fe(we){return function(Me,Le){for(var $=!1,H,se=!1;(H=Me.next())!=null;){if(H==we&&!$){se=!0;break}$=!$&&H=="\\"}return(se||!($||qe))&&(Le.tokenize=null),"string"}}function oe(we,Me){for(var Le=!1,$;$=we.next();){if($=="/"&&Le){Me.tokenize=null;break}Le=$=="*"}return"comment"}function Ue(we,Me){R.typeFirstDefinitions&&we.eol()&&S(Me.context)&&(Me.typeAtEndOfLine=b(we,Me,we.pos))}return{startState:function(we){return{tokenize:null,context:new p((we||0)-le,0,"top",null,!1),indented:0,startOfLine:!0,prevToken:null}},token:function(we,Me){var Le=Me.context;if(we.sol()&&(Le.align==null&&(Le.align=!1),Me.indented=we.indentation(),Me.startOfLine=!0),we.eatSpace())return Ue(we,Me),null;ce=He=null;var $=(Me.tokenize||te)(we,Me);if($=="comment"||$=="meta")return $;if(Le.align==null&&(Le.align=!0),ce==";"||ce==":"||ce==","&&we.match(/^\s*(?:\/\/.*)?$/,!1))for(;Me.context.type=="statement";)C(Me);else if(ce=="{")v(Me,we.column(),"}");else if(ce=="[")v(Me,we.column(),"]");else if(ce=="(")v(Me,we.column(),")");else if(ce=="}"){for(;Le.type=="statement";)Le=C(Me);for(Le.type=="}"&&(Le=C(Me));Le.type=="statement";)Le=C(Me)}else ce==Le.type?C(Me):Se&&((Le.type=="}"||Le.type=="top")&&ce!=";"||Le.type=="statement"&&ce=="newstatement")&&v(Me,we.column(),"statement",we.current());if($=="variable"&&(Me.prevToken=="def"||R.typeFirstDefinitions&&b(we,Me,we.start)&&S(Me.context)&&we.match(/^\s*\(/,!1))&&($="def"),Oe.token){var H=Oe.token(we,Me,$);H!==void 0&&($=H)}return $=="def"&&R.styleDefs===!1&&($="variable"),Me.startOfLine=!1,Me.prevToken=He?"def":$||ce,Ue(we,Me),$},indent:function(we,Me){if(we.tokenize!=te&&we.tokenize!=null||we.typeAtEndOfLine&&S(we.context))return o.Pass;var Le=we.context,$=Me&&Me.charAt(0),H=$==Le.type;if(Le.type=="statement"&&$=="}"&&(Le=Le.prev),R.dontIndentStatements)for(;Le.type=="statement"&&R.dontIndentStatements.test(Le.info);)Le=Le.prev;if(Oe.indent){var se=Oe.indent(we,Le,Me,le);if(typeof se=="number")return se}var De=Le.prev&&Le.prev.info=="switch";if(R.allmanIndentation&&/[{(]/.test($)){for(;Le.type!="top"&&Le.type!="}";)Le=Le.prev;return Le.indented}return Le.type=="statement"?Le.indented+($=="{"?0:xe):Le.align&&(!F||Le.type!=")")?Le.column+(H?0:1):Le.type==")"&&!H?Le.indented+xe:Le.indented+(H?0:le)+(!H&&De&&!/^(?:case|default)\b/.test(Me)?le:0)},electricInput:Be?/^\s*(?:case .*?:|default:|\{\}?|\})$/:/^\s*[{}]$/,blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:"//",fold:"brace"}});function s(N){for(var R={},le=N.split(" "),xe=0;xe!?|\/#:@]/,hooks:{"@":function(N){return N.eatWhile(/[\w\$_]/),"meta"},'"':function(N,R){return N.match('""')?(R.tokenize=j,R.tokenize(N,R)):!1},"'":function(N){return N.match(/^(\\[^'\s]+|[^\\'])'/)?"string-2":(N.eatWhile(/[\w\$_\xa1-\uffff]/),"atom")},"=":function(N,R){var le=R.context;return le.type=="}"&&le.align&&N.eat(">")?(R.context=new p(le.indented,le.column,le.type,le.info,null,le.prev),"operator"):!1},"/":function(N,R){return N.eat("*")?(R.tokenize=V(1),R.tokenize(N,R)):!1}},modeProps:{closeBrackets:{pairs:'()[]{}""',triples:'"'}}});function y(N){return function(R,le){for(var xe=!1,F,L=!1;!R.eol();){if(!N&&!xe&&R.match('"')){L=!0;break}if(N&&R.match('"""')){L=!0;break}F=R.next(),!xe&&F=="$"&&R.match("{")&&R.skipTo("}"),xe=!xe&&F=="\\"&&!N}return(L||!N)&&(le.tokenize=null),"string"}}Q("text/x-kotlin",{name:"clike",keywords:s("package as typealias class interface this super val operator var fun for is in This throw return annotation break continue object if else while do try when !in !is as? file import where by get set abstract enum open inner override private public internal protected catch finally out final vararg reified dynamic companion constructor init sealed field property receiver param sparam lateinit data inline noinline tailrec external annotation crossinline const operator infix suspend actual expect setparam value"),types:s("Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy LazyThreadSafetyMode LongArray Nothing ShortArray Unit"),intendSwitch:!1,indentStatements:!1,multiLineStrings:!0,number:/^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,blockKeywords:s("catch class do else finally for if where try while enum"),defKeywords:s("class val var object interface fun"),atoms:s("true false null this"),hooks:{"@":function(N){return N.eatWhile(/[\w\$_]/),"meta"},"*":function(N,R){return R.prevToken=="."?"variable":"operator"},'"':function(N,R){return R.tokenize=y(N.match('""')),R.tokenize(N,R)},"/":function(N,R){return N.eat("*")?(R.tokenize=V(1),R.tokenize(N,R)):!1},indent:function(N,R,le,xe){var F=le&&le.charAt(0);if((N.prevToken=="}"||N.prevToken==")")&&le=="")return N.indented;if(N.prevToken=="operator"&&le!="}"&&N.context.type!="}"||N.prevToken=="variable"&&F=="."||(N.prevToken=="}"||N.prevToken==")")&&F==".")return xe*2+R.indented;if(R.align&&R.type=="}")return R.indented+(N.context.type==(le||"").charAt(0)?0:xe)}},modeProps:{closeBrackets:{triples:'"'}}}),Q(["x-shader/x-vertex","x-shader/x-fragment"],{name:"clike",keywords:s("sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout"),types:s("float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4"),blockKeywords:s("for while do if else struct"),builtin:s("radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4"),atoms:s("true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers"),indentSwitch:!1,hooks:{"#":E},modeProps:{fold:["brace","include"]}}),Q("text/x-nesc",{name:"clike",keywords:s(g+" as atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends"),types:z,blockKeywords:s(_),atoms:s("null true false"),hooks:{"#":E},modeProps:{fold:["brace","include"]}}),Q("text/x-objectivec",{name:"clike",keywords:s(g+" "+w),types:M,builtin:s(c),blockKeywords:s(_+" @synthesize @try @catch @finally @autoreleasepool @synchronized"),defKeywords:s(W+" @interface @implementation @protocol @class"),dontIndentStatements:/^@.*$/,typeFirstDefinitions:!0,atoms:s("YES NO NULL Nil nil true false nullptr"),isReservedIdentifier:G,hooks:{"#":E,"*":O},modeProps:{fold:["brace","include"]}}),Q("text/x-objectivec++",{name:"clike",keywords:s(g+" "+w+" "+T),types:M,builtin:s(c),blockKeywords:s(_+" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"),defKeywords:s(W+" @interface @implementation @protocol @class class namespace"),dontIndentStatements:/^@.*$|^template$/,typeFirstDefinitions:!0,atoms:s("YES NO NULL Nil nil true false nullptr"),isReservedIdentifier:G,hooks:{"#":E,"*":O,u:re,U:re,L:re,R:re,0:J,1:J,2:J,3:J,4:J,5:J,6:J,7:J,8:J,9:J,token:function(N,R,le){if(le=="variable"&&N.peek()=="("&&(R.prevToken==";"||R.prevToken==null||R.prevToken=="}")&&q(N.current()))return"def"}},namespaceSeparator:"::",modeProps:{fold:["brace","include"]}}),Q("text/x-squirrel",{name:"clike",keywords:s("base break clone continue const default delete enum extends function in class foreach local resume return this throw typeof yield constructor instanceof static"),types:z,blockKeywords:s("case catch class else for foreach if switch try while"),defKeywords:s("function local class"),typeFirstDefinitions:!0,atoms:s("true false null"),hooks:{"#":E},modeProps:{fold:["brace","include"]}});var K=null;function X(N){return function(R,le){for(var xe=!1,F,L=!1;!R.eol();){if(!xe&&R.match('"')&&(N=="single"||R.match('""'))){L=!0;break}if(!xe&&R.match("``")){K=X(N),L=!0;break}F=R.next(),xe=N=="single"&&!xe&&F=="\\"}return L&&(le.tokenize=null),"string"}}Q("text/x-ceylon",{name:"clike",keywords:s("abstracts alias assembly assert assign break case catch class continue dynamic else exists extends finally for function given if import in interface is let module new nonempty object of out outer package return satisfies super switch then this throw try value void while"),types:function(N){var R=N.charAt(0);return R===R.toUpperCase()&&R!==R.toLowerCase()},blockKeywords:s("case catch class dynamic else finally for function if interface module new object switch try while"),defKeywords:s("class dynamic function interface module object package value"),builtin:s("abstract actual aliased annotation by default deprecated doc final formal late license native optional sealed see serializable shared suppressWarnings tagged throws variable"),isPunctuationChar:/[\[\]{}\(\),;\:\.`]/,isOperatorChar:/[+\-*&%=<>!?|^~:\/]/,numberStart:/[\d#$]/,number:/^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i,multiLineStrings:!0,typeFirstDefinitions:!0,atoms:s("true false null larger smaller equal empty finished"),indentSwitch:!1,styleDefs:!1,hooks:{"@":function(N){return N.eatWhile(/[\w\$_]/),"meta"},'"':function(N,R){return R.tokenize=X(N.match('""')?"triple":"single"),R.tokenize(N,R)},"`":function(N,R){return!K||!N.match("`")?!1:(R.tokenize=K,K=null,R.tokenize(N,R))},"'":function(N){return N.eatWhile(/[\w\$_\xa1-\uffff]/),"atom"},token:function(N,R,le){if((le=="variable"||le=="type")&&R.prevToken==".")return"variable-2"}},modeProps:{fold:["brace","import"],closeBrackets:{triples:'"'}}})})});var Cs=Ke((Ts,Ls)=>{(function(o){typeof Ts=="object"&&typeof Ls=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("cmake",function(){var p=/({)?[a-zA-Z0-9_]+(})?/;function v(b,S){for(var s,h,g=!1;!b.eol()&&(s=b.next())!=S.pending;){if(s==="$"&&h!="\\"&&S.pending=='"'){g=!0;break}h=s}return g&&b.backUp(1),s==S.pending?S.continueString=!1:S.continueString=!0,"string"}function C(b,S){var s=b.next();return s==="$"?b.match(p)?"variable-2":"variable":S.continueString?(b.backUp(1),v(b,S)):b.match(/(\s+)?\w+\(/)||b.match(/(\s+)?\w+\ \(/)?(b.backUp(1),"def"):s=="#"?(b.skipToEnd(),"comment"):s=="'"||s=='"'?(S.pending=s,v(b,S)):s=="("||s==")"?"bracket":s.match(/[0-9]/)?"number":(b.eatWhile(/[\w-]/),null)}return{startState:function(){var b={};return b.inDefinition=!1,b.inInclude=!1,b.continueString=!1,b.pending=!1,b},token:function(b,S){return b.eatSpace()?null:C(b,S)}}}),o.defineMIME("text/x-cmake","cmake")})});var gn=Ke((Es,zs)=>{(function(o){typeof Es=="object"&&typeof zs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("css",function(I,D){var Q=D.inline;D.propertyKeywords||(D=o.resolveMode("text/css"));var j=I.indentUnit,V=D.tokenHooks,y=D.documentTypes||{},K=D.mediaTypes||{},X=D.mediaFeatures||{},N=D.mediaValueKeywords||{},R=D.propertyKeywords||{},le=D.nonStandardPropertyKeywords||{},xe=D.fontProperties||{},F=D.counterDescriptors||{},L=D.colorKeywords||{},de=D.valueKeywords||{},ze=D.allowNested,pe=D.lineComment,Ee=D.supportsAtComponent===!0,ge=I.highlightNonStandardPropertyKeywords!==!1,Oe,qe;function Se(te,fe){return Oe=fe,te}function Be(te,fe){var oe=te.next();if(V[oe]){var Ue=V[oe](te,fe);if(Ue!==!1)return Ue}if(oe=="@")return te.eatWhile(/[\w\\\-]/),Se("def",te.current());if(oe=="="||(oe=="~"||oe=="|")&&te.eat("="))return Se(null,"compare");if(oe=='"'||oe=="'")return fe.tokenize=Ze(oe),fe.tokenize(te,fe);if(oe=="#")return te.eatWhile(/[\w\\\-]/),Se("atom","hash");if(oe=="!")return te.match(/^\s*\w*/),Se("keyword","important");if(/\d/.test(oe)||oe=="."&&te.eat(/\d/))return te.eatWhile(/[\w.%]/),Se("number","unit");if(oe==="-"){if(/[\d.]/.test(te.peek()))return te.eatWhile(/[\w.%]/),Se("number","unit");if(te.match(/^-[\w\\\-]*/))return te.eatWhile(/[\w\\\-]/),te.match(/^\s*:/,!1)?Se("variable-2","variable-definition"):Se("variable-2","variable");if(te.match(/^\w+-/))return Se("meta","meta")}else return/[,+>*\/]/.test(oe)?Se(null,"select-op"):oe=="."&&te.match(/^-?[_a-z][_a-z0-9-]*/i)?Se("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(oe)?Se(null,oe):te.match(/^[\w-.]+(?=\()/)?(/^(url(-prefix)?|domain|regexp)$/i.test(te.current())&&(fe.tokenize=ke),Se("variable callee","variable")):/[\w\\\-]/.test(oe)?(te.eatWhile(/[\w\\\-]/),Se("property","word")):Se(null,null)}function Ze(te){return function(fe,oe){for(var Ue=!1,we;(we=fe.next())!=null;){if(we==te&&!Ue){te==")"&&fe.backUp(1);break}Ue=!Ue&&we=="\\"}return(we==te||!Ue&&te!=")")&&(oe.tokenize=null),Se("string","string")}}function ke(te,fe){return te.next(),te.match(/^\s*[\"\')]/,!1)?fe.tokenize=null:fe.tokenize=Ze(")"),Se(null,"(")}function Je(te,fe,oe){this.type=te,this.indent=fe,this.prev=oe}function Re(te,fe,oe,Ue){return te.context=new Je(oe,fe.indentation()+(Ue===!1?0:j),te.context),oe}function Ge(te){return te.context.prev&&(te.context=te.context.prev),te.context.type}function U(te,fe,oe){return He[oe.context.type](te,fe,oe)}function Z(te,fe,oe,Ue){for(var we=Ue||1;we>0;we--)oe.context=oe.context.prev;return U(te,fe,oe)}function ce(te){var fe=te.current().toLowerCase();de.hasOwnProperty(fe)?qe="atom":L.hasOwnProperty(fe)?qe="keyword":qe="variable"}var He={};return He.top=function(te,fe,oe){if(te=="{")return Re(oe,fe,"block");if(te=="}"&&oe.context.prev)return Ge(oe);if(Ee&&/@component/i.test(te))return Re(oe,fe,"atComponentBlock");if(/^@(-moz-)?document$/i.test(te))return Re(oe,fe,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/i.test(te))return Re(oe,fe,"atBlock");if(/^@(font-face|counter-style)/i.test(te))return oe.stateArg=te,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(te))return"keyframes";if(te&&te.charAt(0)=="@")return Re(oe,fe,"at");if(te=="hash")qe="builtin";else if(te=="word")qe="tag";else{if(te=="variable-definition")return"maybeprop";if(te=="interpolation")return Re(oe,fe,"interpolation");if(te==":")return"pseudo";if(ze&&te=="(")return Re(oe,fe,"parens")}return oe.context.type},He.block=function(te,fe,oe){if(te=="word"){var Ue=fe.current().toLowerCase();return R.hasOwnProperty(Ue)?(qe="property","maybeprop"):le.hasOwnProperty(Ue)?(qe=ge?"string-2":"property","maybeprop"):ze?(qe=fe.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(qe+=" error","maybeprop")}else return te=="meta"?"block":!ze&&(te=="hash"||te=="qualifier")?(qe="error","block"):He.top(te,fe,oe)},He.maybeprop=function(te,fe,oe){return te==":"?Re(oe,fe,"prop"):U(te,fe,oe)},He.prop=function(te,fe,oe){if(te==";")return Ge(oe);if(te=="{"&&ze)return Re(oe,fe,"propBlock");if(te=="}"||te=="{")return Z(te,fe,oe);if(te=="(")return Re(oe,fe,"parens");if(te=="hash"&&!/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(fe.current()))qe+=" error";else if(te=="word")ce(fe);else if(te=="interpolation")return Re(oe,fe,"interpolation");return"prop"},He.propBlock=function(te,fe,oe){return te=="}"?Ge(oe):te=="word"?(qe="property","maybeprop"):oe.context.type},He.parens=function(te,fe,oe){return te=="{"||te=="}"?Z(te,fe,oe):te==")"?Ge(oe):te=="("?Re(oe,fe,"parens"):te=="interpolation"?Re(oe,fe,"interpolation"):(te=="word"&&ce(fe),"parens")},He.pseudo=function(te,fe,oe){return te=="meta"?"pseudo":te=="word"?(qe="variable-3",oe.context.type):U(te,fe,oe)},He.documentTypes=function(te,fe,oe){return te=="word"&&y.hasOwnProperty(fe.current())?(qe="tag",oe.context.type):He.atBlock(te,fe,oe)},He.atBlock=function(te,fe,oe){if(te=="(")return Re(oe,fe,"atBlock_parens");if(te=="}"||te==";")return Z(te,fe,oe);if(te=="{")return Ge(oe)&&Re(oe,fe,ze?"block":"top");if(te=="interpolation")return Re(oe,fe,"interpolation");if(te=="word"){var Ue=fe.current().toLowerCase();Ue=="only"||Ue=="not"||Ue=="and"||Ue=="or"?qe="keyword":K.hasOwnProperty(Ue)?qe="attribute":X.hasOwnProperty(Ue)?qe="property":N.hasOwnProperty(Ue)?qe="keyword":R.hasOwnProperty(Ue)?qe="property":le.hasOwnProperty(Ue)?qe=ge?"string-2":"property":de.hasOwnProperty(Ue)?qe="atom":L.hasOwnProperty(Ue)?qe="keyword":qe="error"}return oe.context.type},He.atComponentBlock=function(te,fe,oe){return te=="}"?Z(te,fe,oe):te=="{"?Ge(oe)&&Re(oe,fe,ze?"block":"top",!1):(te=="word"&&(qe="error"),oe.context.type)},He.atBlock_parens=function(te,fe,oe){return te==")"?Ge(oe):te=="{"||te=="}"?Z(te,fe,oe,2):He.atBlock(te,fe,oe)},He.restricted_atBlock_before=function(te,fe,oe){return te=="{"?Re(oe,fe,"restricted_atBlock"):te=="word"&&oe.stateArg=="@counter-style"?(qe="variable","restricted_atBlock_before"):U(te,fe,oe)},He.restricted_atBlock=function(te,fe,oe){return te=="}"?(oe.stateArg=null,Ge(oe)):te=="word"?(oe.stateArg=="@font-face"&&!xe.hasOwnProperty(fe.current().toLowerCase())||oe.stateArg=="@counter-style"&&!F.hasOwnProperty(fe.current().toLowerCase())?qe="error":qe="property","maybeprop"):"restricted_atBlock"},He.keyframes=function(te,fe,oe){return te=="word"?(qe="variable","keyframes"):te=="{"?Re(oe,fe,"top"):U(te,fe,oe)},He.at=function(te,fe,oe){return te==";"?Ge(oe):te=="{"||te=="}"?Z(te,fe,oe):(te=="word"?qe="tag":te=="hash"&&(qe="builtin"),"at")},He.interpolation=function(te,fe,oe){return te=="}"?Ge(oe):te=="{"||te==";"?Z(te,fe,oe):(te=="word"?qe="variable":te!="variable"&&te!="("&&te!=")"&&(qe="error"),"interpolation")},{startState:function(te){return{tokenize:null,state:Q?"block":"top",stateArg:null,context:new Je(Q?"block":"top",te||0,null)}},token:function(te,fe){if(!fe.tokenize&&te.eatSpace())return null;var oe=(fe.tokenize||Be)(te,fe);return oe&&typeof oe=="object"&&(Oe=oe[1],oe=oe[0]),qe=oe,Oe!="comment"&&(fe.state=He[fe.state](Oe,te,fe)),qe},indent:function(te,fe){var oe=te.context,Ue=fe&&fe.charAt(0),we=oe.indent;return oe.type=="prop"&&(Ue=="}"||Ue==")")&&(oe=oe.prev),oe.prev&&(Ue=="}"&&(oe.type=="block"||oe.type=="top"||oe.type=="interpolation"||oe.type=="restricted_atBlock")?(oe=oe.prev,we=oe.indent):(Ue==")"&&(oe.type=="parens"||oe.type=="atBlock_parens")||Ue=="{"&&(oe.type=="at"||oe.type=="atBlock"))&&(we=Math.max(0,oe.indent-j))),we},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:pe,fold:"brace"}});function p(I){for(var D={},Q=0;Q{(function(o){typeof Ms=="object"&&typeof As=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("diff",function(){var p={"+":"positive","-":"negative","@":"meta"};return{token:function(v){var C=v.string.search(/[\t ]+?$/);if(!v.sol()||C===0)return v.skipToEnd(),("error "+(p[v.string.charAt(0)]||"")).replace(/ $/,"");var b=p[v.peek()]||v.skipToEnd();return C===-1?v.skipToEnd():v.pos=C,b}}}),o.defineMIME("text/x-diff","diff")})});var mn=Ke((qs,Fs)=>{(function(o){typeof qs=="object"&&typeof Fs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},v={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};o.defineMode("xml",function(C,b){var S=C.indentUnit,s={},h=b.htmlMode?p:v;for(var g in h)s[g]=h[g];for(var g in b)s[g]=b[g];var T,w;function c(y,K){function X(le){return K.tokenize=le,le(y,K)}var N=y.next();if(N=="<")return y.eat("!")?y.eat("[")?y.match("CDATA[")?X(z("atom","]]>")):null:y.match("--")?X(z("comment","-->")):y.match("DOCTYPE",!0,!0)?(y.eatWhile(/[\w\._\-]/),X(M(1))):null:y.eat("?")?(y.eatWhile(/[\w\._\-]/),K.tokenize=z("meta","?>"),"meta"):(T=y.eat("/")?"closeTag":"openTag",K.tokenize=d,"tag bracket");if(N=="&"){var R;return y.eat("#")?y.eat("x")?R=y.eatWhile(/[a-fA-F\d]/)&&y.eat(";"):R=y.eatWhile(/[\d]/)&&y.eat(";"):R=y.eatWhile(/[\w\.\-:]/)&&y.eat(";"),R?"atom":"error"}else return y.eatWhile(/[^&<]/),null}c.isInText=!0;function d(y,K){var X=y.next();if(X==">"||X=="/"&&y.eat(">"))return K.tokenize=c,T=X==">"?"endTag":"selfcloseTag","tag bracket";if(X=="=")return T="equals",null;if(X=="<"){K.tokenize=c,K.state=G,K.tagName=K.tagStart=null;var N=K.tokenize(y,K);return N?N+" tag error":"tag error"}else return/[\'\"]/.test(X)?(K.tokenize=k(X),K.stringStartCol=y.column(),K.tokenize(y,K)):(y.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function k(y){var K=function(X,N){for(;!X.eol();)if(X.next()==y){N.tokenize=d;break}return"string"};return K.isInAttribute=!0,K}function z(y,K){return function(X,N){for(;!X.eol();){if(X.match(K)){N.tokenize=c;break}X.next()}return y}}function M(y){return function(K,X){for(var N;(N=K.next())!=null;){if(N=="<")return X.tokenize=M(y+1),X.tokenize(K,X);if(N==">")if(y==1){X.tokenize=c;break}else return X.tokenize=M(y-1),X.tokenize(K,X)}return"meta"}}function _(y){return y&&y.toLowerCase()}function W(y,K,X){this.prev=y.context,this.tagName=K||"",this.indent=y.indented,this.startOfLine=X,(s.doNotIndent.hasOwnProperty(K)||y.context&&y.context.noIndent)&&(this.noIndent=!0)}function E(y){y.context&&(y.context=y.context.prev)}function O(y,K){for(var X;;){if(!y.context||(X=y.context.tagName,!s.contextGrabbers.hasOwnProperty(_(X))||!s.contextGrabbers[_(X)].hasOwnProperty(_(K))))return;E(y)}}function G(y,K,X){return y=="openTag"?(X.tagStart=K.column(),J):y=="closeTag"?re:G}function J(y,K,X){return y=="word"?(X.tagName=K.current(),w="tag",D):s.allowMissingTagName&&y=="endTag"?(w="tag bracket",D(y,K,X)):(w="error",J)}function re(y,K,X){if(y=="word"){var N=K.current();return X.context&&X.context.tagName!=N&&s.implicitlyClosed.hasOwnProperty(_(X.context.tagName))&&E(X),X.context&&X.context.tagName==N||s.matchClosing===!1?(w="tag",q):(w="tag error",I)}else return s.allowMissingTagName&&y=="endTag"?(w="tag bracket",q(y,K,X)):(w="error",I)}function q(y,K,X){return y!="endTag"?(w="error",q):(E(X),G)}function I(y,K,X){return w="error",q(y,K,X)}function D(y,K,X){if(y=="word")return w="attribute",Q;if(y=="endTag"||y=="selfcloseTag"){var N=X.tagName,R=X.tagStart;return X.tagName=X.tagStart=null,y=="selfcloseTag"||s.autoSelfClosers.hasOwnProperty(_(N))?O(X,N):(O(X,N),X.context=new W(X,N,R==X.indented)),G}return w="error",D}function Q(y,K,X){return y=="equals"?j:(s.allowMissing||(w="error"),D(y,K,X))}function j(y,K,X){return y=="string"?V:y=="word"&&s.allowUnquoted?(w="string",D):(w="error",D(y,K,X))}function V(y,K,X){return y=="string"?V:D(y,K,X)}return{startState:function(y){var K={tokenize:c,state:G,indented:y||0,tagName:null,tagStart:null,context:null};return y!=null&&(K.baseIndent=y),K},token:function(y,K){if(!K.tagName&&y.sol()&&(K.indented=y.indentation()),y.eatSpace())return null;T=null;var X=K.tokenize(y,K);return(X||T)&&X!="comment"&&(w=null,K.state=K.state(T||X,y,K),w&&(X=w=="error"?X+" error":w)),X},indent:function(y,K,X){var N=y.context;if(y.tokenize.isInAttribute)return y.tagStart==y.indented?y.stringStartCol+1:y.indented+S;if(N&&N.noIndent)return o.Pass;if(y.tokenize!=d&&y.tokenize!=c)return X?X.match(/^(\s*)/)[0].length:0;if(y.tagName)return s.multilineTagIndentPastTag!==!1?y.tagStart+y.tagName.length+2:y.tagStart+S*(s.multilineTagIndentFactor||1);if(s.alignCDATA&&/$/,blockCommentStart:"",configuration:s.htmlMode?"html":"xml",helperType:s.htmlMode?"html":"xml",skipAttribute:function(y){y.state==j&&(y.state=D)},xmlCurrentTag:function(y){return y.tagName?{name:y.tagName,close:y.type=="closeTag"}:null},xmlCurrentContext:function(y){for(var K=[],X=y.context;X;X=X.prev)K.push(X.tagName);return K.reverse()}}}),o.defineMIME("text/xml","xml"),o.defineMIME("application/xml","xml"),o.mimeModes.hasOwnProperty("text/html")||o.defineMIME("text/html",{name:"xml",htmlMode:!0})})});var vn=Ke((Is,Ns)=>{(function(o){typeof Is=="object"&&typeof Ns=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("javascript",function(p,v){var C=p.indentUnit,b=v.statementIndent,S=v.jsonld,s=v.json||S,h=v.trackScope!==!1,g=v.typescript,T=v.wordCharacters||/[\w$\xa1-\uffff]/,w=(function(){function x(pt){return{type:pt,style:"keyword"}}var P=x("keyword a"),ae=x("keyword b"),he=x("keyword c"),ne=x("keyword d"),ye=x("operator"),Xe={type:"atom",style:"atom"};return{if:x("if"),while:P,with:P,else:ae,do:ae,try:ae,finally:ae,return:ne,break:ne,continue:ne,new:x("new"),delete:he,void:he,throw:he,debugger:x("debugger"),var:x("var"),const:x("var"),let:x("var"),function:x("function"),catch:x("catch"),for:x("for"),switch:x("switch"),case:x("case"),default:x("default"),in:ye,typeof:ye,instanceof:ye,true:Xe,false:Xe,null:Xe,undefined:Xe,NaN:Xe,Infinity:Xe,this:x("this"),class:x("class"),super:x("atom"),yield:he,export:x("export"),import:x("import"),extends:he,await:he}})(),c=/[+\-*&%=<>!?|~^@]/,d=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function k(x){for(var P=!1,ae,he=!1;(ae=x.next())!=null;){if(!P){if(ae=="/"&&!he)return;ae=="["?he=!0:he&&ae=="]"&&(he=!1)}P=!P&&ae=="\\"}}var z,M;function _(x,P,ae){return z=x,M=ae,P}function W(x,P){var ae=x.next();if(ae=='"'||ae=="'")return P.tokenize=E(ae),P.tokenize(x,P);if(ae=="."&&x.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/))return _("number","number");if(ae=="."&&x.match(".."))return _("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(ae))return _(ae);if(ae=="="&&x.eat(">"))return _("=>","operator");if(ae=="0"&&x.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/))return _("number","number");if(/\d/.test(ae))return x.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/),_("number","number");if(ae=="/")return x.eat("*")?(P.tokenize=O,O(x,P)):x.eat("/")?(x.skipToEnd(),_("comment","comment")):Bt(x,P,1)?(k(x),x.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),_("regexp","string-2")):(x.eat("="),_("operator","operator",x.current()));if(ae=="`")return P.tokenize=G,G(x,P);if(ae=="#"&&x.peek()=="!")return x.skipToEnd(),_("meta","meta");if(ae=="#"&&x.eatWhile(T))return _("variable","property");if(ae=="<"&&x.match("!--")||ae=="-"&&x.match("->")&&!/\S/.test(x.string.slice(0,x.start)))return x.skipToEnd(),_("comment","comment");if(c.test(ae))return(ae!=">"||!P.lexical||P.lexical.type!=">")&&(x.eat("=")?(ae=="!"||ae=="=")&&x.eat("="):/[<>*+\-|&?]/.test(ae)&&(x.eat(ae),ae==">"&&x.eat(ae))),ae=="?"&&x.eat(".")?_("."):_("operator","operator",x.current());if(T.test(ae)){x.eatWhile(T);var he=x.current();if(P.lastType!="."){if(w.propertyIsEnumerable(he)){var ne=w[he];return _(ne.type,ne.style,he)}if(he=="async"&&x.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/,!1))return _("async","keyword",he)}return _("variable","variable",he)}}function E(x){return function(P,ae){var he=!1,ne;if(S&&P.peek()=="@"&&P.match(d))return ae.tokenize=W,_("jsonld-keyword","meta");for(;(ne=P.next())!=null&&!(ne==x&&!he);)he=!he&&ne=="\\";return he||(ae.tokenize=W),_("string","string")}}function O(x,P){for(var ae=!1,he;he=x.next();){if(he=="/"&&ae){P.tokenize=W;break}ae=he=="*"}return _("comment","comment")}function G(x,P){for(var ae=!1,he;(he=x.next())!=null;){if(!ae&&(he=="`"||he=="$"&&x.eat("{"))){P.tokenize=W;break}ae=!ae&&he=="\\"}return _("quasi","string-2",x.current())}var J="([{}])";function re(x,P){P.fatArrowAt&&(P.fatArrowAt=null);var ae=x.string.indexOf("=>",x.start);if(!(ae<0)){if(g){var he=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(x.string.slice(x.start,ae));he&&(ae=he.index)}for(var ne=0,ye=!1,Xe=ae-1;Xe>=0;--Xe){var pt=x.string.charAt(Xe),Et=J.indexOf(pt);if(Et>=0&&Et<3){if(!ne){++Xe;break}if(--ne==0){pt=="("&&(ye=!0);break}}else if(Et>=3&&Et<6)++ne;else if(T.test(pt))ye=!0;else if(/["'\/`]/.test(pt))for(;;--Xe){if(Xe==0)return;var Zr=x.string.charAt(Xe-1);if(Zr==pt&&x.string.charAt(Xe-2)!="\\"){Xe--;break}}else if(ye&&!ne){++Xe;break}}ye&&!ne&&(P.fatArrowAt=Xe)}}var q={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,import:!0,"jsonld-keyword":!0};function I(x,P,ae,he,ne,ye){this.indented=x,this.column=P,this.type=ae,this.prev=ne,this.info=ye,he!=null&&(this.align=he)}function D(x,P){if(!h)return!1;for(var ae=x.localVars;ae;ae=ae.next)if(ae.name==P)return!0;for(var he=x.context;he;he=he.prev)for(var ae=he.vars;ae;ae=ae.next)if(ae.name==P)return!0}function Q(x,P,ae,he,ne){var ye=x.cc;for(j.state=x,j.stream=ne,j.marked=null,j.cc=ye,j.style=P,x.lexical.hasOwnProperty("align")||(x.lexical.align=!0);;){var Xe=ye.length?ye.pop():s?Se:Oe;if(Xe(ae,he)){for(;ye.length&&ye[ye.length-1].lex;)ye.pop()();return j.marked?j.marked:ae=="variable"&&D(x,he)?"variable-2":P}}}var j={state:null,column:null,marked:null,cc:null};function V(){for(var x=arguments.length-1;x>=0;x--)j.cc.push(arguments[x])}function y(){return V.apply(null,arguments),!0}function K(x,P){for(var ae=P;ae;ae=ae.next)if(ae.name==x)return!0;return!1}function X(x){var P=j.state;if(j.marked="def",!!h){if(P.context){if(P.lexical.info=="var"&&P.context&&P.context.block){var ae=N(x,P.context);if(ae!=null){P.context=ae;return}}else if(!K(x,P.localVars)){P.localVars=new xe(x,P.localVars);return}}v.globalVars&&!K(x,P.globalVars)&&(P.globalVars=new xe(x,P.globalVars))}}function N(x,P){if(P)if(P.block){var ae=N(x,P.prev);return ae?ae==P.prev?P:new le(ae,P.vars,!0):null}else return K(x,P.vars)?P:new le(P.prev,new xe(x,P.vars),!1);else return null}function R(x){return x=="public"||x=="private"||x=="protected"||x=="abstract"||x=="readonly"}function le(x,P,ae){this.prev=x,this.vars=P,this.block=ae}function xe(x,P){this.name=x,this.next=P}var F=new xe("this",new xe("arguments",null));function L(){j.state.context=new le(j.state.context,j.state.localVars,!1),j.state.localVars=F}function de(){j.state.context=new le(j.state.context,j.state.localVars,!0),j.state.localVars=null}L.lex=de.lex=!0;function ze(){j.state.localVars=j.state.context.vars,j.state.context=j.state.context.prev}ze.lex=!0;function pe(x,P){var ae=function(){var he=j.state,ne=he.indented;if(he.lexical.type=="stat")ne=he.lexical.indented;else for(var ye=he.lexical;ye&&ye.type==")"&&ye.align;ye=ye.prev)ne=ye.indented;he.lexical=new I(ne,j.stream.column(),x,null,he.lexical,P)};return ae.lex=!0,ae}function Ee(){var x=j.state;x.lexical.prev&&(x.lexical.type==")"&&(x.indented=x.lexical.indented),x.lexical=x.lexical.prev)}Ee.lex=!0;function ge(x){function P(ae){return ae==x?y():x==";"||ae=="}"||ae==")"||ae=="]"?V():y(P)}return P}function Oe(x,P){return x=="var"?y(pe("vardef",P),Rr,ge(";"),Ee):x=="keyword a"?y(pe("form"),Ze,Oe,Ee):x=="keyword b"?y(pe("form"),Oe,Ee):x=="keyword d"?j.stream.match(/^\s*$/,!1)?y():y(pe("stat"),Je,ge(";"),Ee):x=="debugger"?y(ge(";")):x=="{"?y(pe("}"),de,De,Ee,ze):x==";"?y():x=="if"?(j.state.lexical.info=="else"&&j.state.cc[j.state.cc.length-1]==Ee&&j.state.cc.pop()(),y(pe("form"),Ze,Oe,Ee,Hr)):x=="function"?y(Ht):x=="for"?y(pe("form"),de,ei,Oe,ze,Ee):x=="class"||g&&P=="interface"?(j.marked="keyword",y(pe("form",x=="class"?x:P),Wr,Ee)):x=="variable"?g&&P=="declare"?(j.marked="keyword",y(Oe)):g&&(P=="module"||P=="enum"||P=="type")&&j.stream.match(/^\s*\w/,!1)?(j.marked="keyword",P=="enum"?y(Ae):P=="type"?y(ti,ge("operator"),Pe,ge(";")):y(pe("form"),Ct,ge("{"),pe("}"),De,Ee,Ee)):g&&P=="namespace"?(j.marked="keyword",y(pe("form"),Se,Oe,Ee)):g&&P=="abstract"?(j.marked="keyword",y(Oe)):y(pe("stat"),Ue):x=="switch"?y(pe("form"),Ze,ge("{"),pe("}","switch"),de,De,Ee,Ee,ze):x=="case"?y(Se,ge(":")):x=="default"?y(ge(":")):x=="catch"?y(pe("form"),L,qe,Oe,Ee,ze):x=="export"?y(pe("stat"),Ur,Ee):x=="import"?y(pe("stat"),gr,Ee):x=="async"?y(Oe):P=="@"?y(Se,Oe):V(pe("stat"),Se,ge(";"),Ee)}function qe(x){if(x=="(")return y($t,ge(")"))}function Se(x,P){return ke(x,P,!1)}function Be(x,P){return ke(x,P,!0)}function Ze(x){return x!="("?V():y(pe(")"),Je,ge(")"),Ee)}function ke(x,P,ae){if(j.state.fatArrowAt==j.stream.start){var he=ae?He:ce;if(x=="(")return y(L,pe(")"),H($t,")"),Ee,ge("=>"),he,ze);if(x=="variable")return V(L,Ct,ge("=>"),he,ze)}var ne=ae?Ge:Re;return q.hasOwnProperty(x)?y(ne):x=="function"?y(Ht,ne):x=="class"||g&&P=="interface"?(j.marked="keyword",y(pe("form"),to,Ee)):x=="keyword c"||x=="async"?y(ae?Be:Se):x=="("?y(pe(")"),Je,ge(")"),Ee,ne):x=="operator"||x=="spread"?y(ae?Be:Se):x=="["?y(pe("]"),at,Ee,ne):x=="{"?se(Me,"}",null,ne):x=="quasi"?V(U,ne):x=="new"?y(te(ae)):y()}function Je(x){return x.match(/[;\}\)\],]/)?V():V(Se)}function Re(x,P){return x==","?y(Je):Ge(x,P,!1)}function Ge(x,P,ae){var he=ae==!1?Re:Ge,ne=ae==!1?Se:Be;if(x=="=>")return y(L,ae?He:ce,ze);if(x=="operator")return/\+\+|--/.test(P)||g&&P=="!"?y(he):g&&P=="<"&&j.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/,!1)?y(pe(">"),H(Pe,">"),Ee,he):P=="?"?y(Se,ge(":"),ne):y(ne);if(x=="quasi")return V(U,he);if(x!=";"){if(x=="(")return se(Be,")","call",he);if(x==".")return y(we,he);if(x=="[")return y(pe("]"),Je,ge("]"),Ee,he);if(g&&P=="as")return j.marked="keyword",y(Pe,he);if(x=="regexp")return j.state.lastType=j.marked="operator",j.stream.backUp(j.stream.pos-j.stream.start-1),y(ne)}}function U(x,P){return x!="quasi"?V():P.slice(P.length-2)!="${"?y(U):y(Je,Z)}function Z(x){if(x=="}")return j.marked="string-2",j.state.tokenize=G,y(U)}function ce(x){return re(j.stream,j.state),V(x=="{"?Oe:Se)}function He(x){return re(j.stream,j.state),V(x=="{"?Oe:Be)}function te(x){return function(P){return P=="."?y(x?oe:fe):P=="variable"&&g?y(It,x?Ge:Re):V(x?Be:Se)}}function fe(x,P){if(P=="target")return j.marked="keyword",y(Re)}function oe(x,P){if(P=="target")return j.marked="keyword",y(Ge)}function Ue(x){return x==":"?y(Ee,Oe):V(Re,ge(";"),Ee)}function we(x){if(x=="variable")return j.marked="property",y()}function Me(x,P){if(x=="async")return j.marked="property",y(Me);if(x=="variable"||j.style=="keyword"){if(j.marked="property",P=="get"||P=="set")return y(Le);var ae;return g&&j.state.fatArrowAt==j.stream.start&&(ae=j.stream.match(/^\s*:\s*/,!1))&&(j.state.fatArrowAt=j.stream.pos+ae[0].length),y($)}else{if(x=="number"||x=="string")return j.marked=S?"property":j.style+" property",y($);if(x=="jsonld-keyword")return y($);if(g&&R(P))return j.marked="keyword",y(Me);if(x=="[")return y(Se,nt,ge("]"),$);if(x=="spread")return y(Be,$);if(P=="*")return j.marked="keyword",y(Me);if(x==":")return V($)}}function Le(x){return x!="variable"?V($):(j.marked="property",y(Ht))}function $(x){if(x==":")return y(Be);if(x=="(")return V(Ht)}function H(x,P,ae){function he(ne,ye){if(ae?ae.indexOf(ne)>-1:ne==","){var Xe=j.state.lexical;return Xe.info=="call"&&(Xe.pos=(Xe.pos||0)+1),y(function(pt,Et){return pt==P||Et==P?V():V(x)},he)}return ne==P||ye==P?y():ae&&ae.indexOf(";")>-1?V(x):y(ge(P))}return function(ne,ye){return ne==P||ye==P?y():V(x,he)}}function se(x,P,ae){for(var he=3;he"),Pe);if(x=="quasi")return V(_t,Rt)}function xt(x){if(x=="=>")return y(Pe)}function Ie(x){return x.match(/[\}\)\]]/)?y():x==","||x==";"?y(Ie):V(nr,Ie)}function nr(x,P){if(x=="variable"||j.style=="keyword")return j.marked="property",y(nr);if(P=="?"||x=="number"||x=="string")return y(nr);if(x==":")return y(Pe);if(x=="[")return y(ge("variable"),dt,ge("]"),nr);if(x=="(")return V(hr,nr);if(!x.match(/[;\}\)\],]/))return y()}function _t(x,P){return x!="quasi"?V():P.slice(P.length-2)!="${"?y(_t):y(Pe,it)}function it(x){if(x=="}")return j.marked="string-2",j.state.tokenize=G,y(_t)}function ot(x,P){return x=="variable"&&j.stream.match(/^\s*[?:]/,!1)||P=="?"?y(ot):x==":"?y(Pe):x=="spread"?y(ot):V(Pe)}function Rt(x,P){if(P=="<")return y(pe(">"),H(Pe,">"),Ee,Rt);if(P=="|"||x=="."||P=="&")return y(Pe);if(x=="[")return y(Pe,ge("]"),Rt);if(P=="extends"||P=="implements")return j.marked="keyword",y(Pe);if(P=="?")return y(Pe,ge(":"),Pe)}function It(x,P){if(P=="<")return y(pe(">"),H(Pe,">"),Ee,Rt)}function Wt(){return V(Pe,kt)}function kt(x,P){if(P=="=")return y(Pe)}function Rr(x,P){return P=="enum"?(j.marked="keyword",y(Ae)):V(Ct,nt,Ut,eo)}function Ct(x,P){if(g&&R(P))return j.marked="keyword",y(Ct);if(x=="variable")return X(P),y();if(x=="spread")return y(Ct);if(x=="[")return se(yn,"]");if(x=="{")return se(dr,"}")}function dr(x,P){return x=="variable"&&!j.stream.match(/^\s*:/,!1)?(X(P),y(Ut)):(x=="variable"&&(j.marked="property"),x=="spread"?y(Ct):x=="}"?V():x=="["?y(Se,ge("]"),ge(":"),dr):y(ge(":"),Ct,Ut))}function yn(){return V(Ct,Ut)}function Ut(x,P){if(P=="=")return y(Be)}function eo(x){if(x==",")return y(Rr)}function Hr(x,P){if(x=="keyword b"&&P=="else")return y(pe("form","else"),Oe,Ee)}function ei(x,P){if(P=="await")return y(ei);if(x=="(")return y(pe(")"),xn,Ee)}function xn(x){return x=="var"?y(Rr,pr):x=="variable"?y(pr):V(pr)}function pr(x,P){return x==")"?y():x==";"?y(pr):P=="in"||P=="of"?(j.marked="keyword",y(Se,pr)):V(Se,pr)}function Ht(x,P){if(P=="*")return j.marked="keyword",y(Ht);if(x=="variable")return X(P),y(Ht);if(x=="(")return y(L,pe(")"),H($t,")"),Ee,Pt,Oe,ze);if(g&&P=="<")return y(pe(">"),H(Wt,">"),Ee,Ht)}function hr(x,P){if(P=="*")return j.marked="keyword",y(hr);if(x=="variable")return X(P),y(hr);if(x=="(")return y(L,pe(")"),H($t,")"),Ee,Pt,ze);if(g&&P=="<")return y(pe(">"),H(Wt,">"),Ee,hr)}function ti(x,P){if(x=="keyword"||x=="variable")return j.marked="type",y(ti);if(P=="<")return y(pe(">"),H(Wt,">"),Ee)}function $t(x,P){return P=="@"&&y(Se,$t),x=="spread"?y($t):g&&R(P)?(j.marked="keyword",y($t)):g&&x=="this"?y(nt,Ut):V(Ct,nt,Ut)}function to(x,P){return x=="variable"?Wr(x,P):Kt(x,P)}function Wr(x,P){if(x=="variable")return X(P),y(Kt)}function Kt(x,P){if(P=="<")return y(pe(">"),H(Wt,">"),Ee,Kt);if(P=="extends"||P=="implements"||g&&x==",")return P=="implements"&&(j.marked="keyword"),y(g?Pe:Se,Kt);if(x=="{")return y(pe("}"),Gt,Ee)}function Gt(x,P){if(x=="async"||x=="variable"&&(P=="static"||P=="get"||P=="set"||g&&R(P))&&j.stream.match(/^\s+#?[\w$\xa1-\uffff]/,!1))return j.marked="keyword",y(Gt);if(x=="variable"||j.style=="keyword")return j.marked="property",y(Cr,Gt);if(x=="number"||x=="string")return y(Cr,Gt);if(x=="[")return y(Se,nt,ge("]"),Cr,Gt);if(P=="*")return j.marked="keyword",y(Gt);if(g&&x=="(")return V(hr,Gt);if(x==";"||x==",")return y(Gt);if(x=="}")return y();if(P=="@")return y(Se,Gt)}function Cr(x,P){if(P=="!"||P=="?")return y(Cr);if(x==":")return y(Pe,Ut);if(P=="=")return y(Be);var ae=j.state.lexical.prev,he=ae&&ae.info=="interface";return V(he?hr:Ht)}function Ur(x,P){return P=="*"?(j.marked="keyword",y(Gr,ge(";"))):P=="default"?(j.marked="keyword",y(Se,ge(";"))):x=="{"?y(H($r,"}"),Gr,ge(";")):V(Oe)}function $r(x,P){if(P=="as")return j.marked="keyword",y(ge("variable"));if(x=="variable")return V(Be,$r)}function gr(x){return x=="string"?y():x=="("?V(Se):x=="."?V(Re):V(Kr,Vt,Gr)}function Kr(x,P){return x=="{"?se(Kr,"}"):(x=="variable"&&X(P),P=="*"&&(j.marked="keyword"),y(_n))}function Vt(x){if(x==",")return y(Kr,Vt)}function _n(x,P){if(P=="as")return j.marked="keyword",y(Kr)}function Gr(x,P){if(P=="from")return j.marked="keyword",y(Se)}function at(x){return x=="]"?y():V(H(Be,"]"))}function Ae(){return V(pe("form"),Ct,ge("{"),pe("}"),H(ir,"}"),Ee,Ee)}function ir(){return V(Ct,Ut)}function kn(x,P){return x.lastType=="operator"||x.lastType==","||c.test(P.charAt(0))||/[,.]/.test(P.charAt(0))}function Bt(x,P,ae){return P.tokenize==W&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(P.lastType)||P.lastType=="quasi"&&/\{\s*$/.test(x.string.slice(0,x.pos-(ae||0)))}return{startState:function(x){var P={tokenize:W,lastType:"sof",cc:[],lexical:new I((x||0)-C,0,"block",!1),localVars:v.localVars,context:v.localVars&&new le(null,null,!1),indented:x||0};return v.globalVars&&typeof v.globalVars=="object"&&(P.globalVars=v.globalVars),P},token:function(x,P){if(x.sol()&&(P.lexical.hasOwnProperty("align")||(P.lexical.align=!1),P.indented=x.indentation(),re(x,P)),P.tokenize!=O&&x.eatSpace())return null;var ae=P.tokenize(x,P);return z=="comment"?ae:(P.lastType=z=="operator"&&(M=="++"||M=="--")?"incdec":z,Q(P,ae,z,M,x))},indent:function(x,P){if(x.tokenize==O||x.tokenize==G)return o.Pass;if(x.tokenize!=W)return 0;var ae=P&&P.charAt(0),he=x.lexical,ne;if(!/^\s*else\b/.test(P))for(var ye=x.cc.length-1;ye>=0;--ye){var Xe=x.cc[ye];if(Xe==Ee)he=he.prev;else if(Xe!=Hr&&Xe!=ze)break}for(;(he.type=="stat"||he.type=="form")&&(ae=="}"||(ne=x.cc[x.cc.length-1])&&(ne==Re||ne==Ge)&&!/^[,\.=+\-*:?[\(]/.test(P));)he=he.prev;b&&he.type==")"&&he.prev.type=="stat"&&(he=he.prev);var pt=he.type,Et=ae==pt;return pt=="vardef"?he.indented+(x.lastType=="operator"||x.lastType==","?he.info.length+1:0):pt=="form"&&ae=="{"?he.indented:pt=="form"?he.indented+C:pt=="stat"?he.indented+(kn(x,P)?b||C:0):he.info=="switch"&&!Et&&v.doubleIndentSwitch!=!1?he.indented+(/^(?:case|default)\b/.test(P)?C:2*C):he.align?he.column+(Et?0:1):he.indented+(Et?0:C)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:s?null:"/*",blockCommentEnd:s?null:"*/",blockCommentContinue:s?null:" * ",lineComment:s?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:s?"json":"javascript",jsonldMode:S,jsonMode:s,expressionAllowed:Bt,skipExpression:function(x){Q(x,"atom","atom","true",new o.StringStream("",2,null))}}}),o.registerHelper("wordChars","javascript",/[\w$]/),o.defineMIME("text/javascript","javascript"),o.defineMIME("text/ecmascript","javascript"),o.defineMIME("application/javascript","javascript"),o.defineMIME("application/x-javascript","javascript"),o.defineMIME("application/ecmascript","javascript"),o.defineMIME("application/json",{name:"javascript",json:!0}),o.defineMIME("application/x-json",{name:"javascript",json:!0}),o.defineMIME("application/manifest+json",{name:"javascript",json:!0}),o.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),o.defineMIME("text/typescript",{name:"javascript",typescript:!0}),o.defineMIME("application/typescript",{name:"javascript",typescript:!0})})});var Qn=Ke((Os,Ps)=>{(function(o){typeof Os=="object"&&typeof Ps=="object"?o(We(),mn(),vn(),gn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],o):o(CodeMirror)})(function(o){"use strict";var p={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};function v(T,w,c){var d=T.current(),k=d.search(w);return k>-1?T.backUp(d.length-k):d.match(/<\/?$/)&&(T.backUp(d.length),T.match(w,!1)||T.match(d)),c}var C={};function b(T){var w=C[T];return w||(C[T]=new RegExp("\\s+"+T+`\\s*=\\s*('|")?([^'"]+)('|")?\\s*`))}function S(T,w){var c=T.match(b(w));return c?/^\s*(.*?)\s*$/.exec(c[2])[1]:""}function s(T,w){return new RegExp((w?"^":"")+"","i")}function h(T,w){for(var c in T)for(var d=w[c]||(w[c]=[]),k=T[c],z=k.length-1;z>=0;z--)d.unshift(k[z])}function g(T,w){for(var c=0;c=0;M--)d.script.unshift(["type",z[M].matches,z[M].mode]);function _(W,E){var O=c.token(W,E.htmlState),G=/\btag\b/.test(O),J;if(G&&!/[<>\s\/]/.test(W.current())&&(J=E.htmlState.tagName&&E.htmlState.tagName.toLowerCase())&&d.hasOwnProperty(J))E.inTag=J+" ";else if(E.inTag&&G&&/>$/.test(W.current())){var re=/^([\S]+) (.*)/.exec(E.inTag);E.inTag=null;var q=W.current()==">"&&g(d[re[1]],re[2]),I=o.getMode(T,q),D=s(re[1],!0),Q=s(re[1],!1);E.token=function(j,V){return j.match(D,!1)?(V.token=_,V.localState=V.localMode=null,null):v(j,Q,V.localMode.token(j,V.localState))},E.localMode=I,E.localState=o.startState(I,c.indent(E.htmlState,"",""))}else E.inTag&&(E.inTag+=W.current(),W.eol()&&(E.inTag+=" "));return O}return{startState:function(){var W=o.startState(c);return{token:_,inTag:null,localMode:null,localState:null,htmlState:W}},copyState:function(W){var E;return W.localState&&(E=o.copyState(W.localMode,W.localState)),{token:W.token,inTag:W.inTag,localMode:W.localMode,localState:E,htmlState:o.copyState(c,W.htmlState)}},token:function(W,E){return E.token(W,E)},indent:function(W,E,O){return!W.localMode||/^\s*<\//.test(E)?c.indent(W.htmlState,E,O):W.localMode.indent?W.localMode.indent(W.localState,E,O):o.Pass},innerMode:function(W){return{state:W.localState||W.htmlState,mode:W.localMode||c}}}},"xml","javascript","css"),o.defineMIME("text/html","htmlmixed")})});var Rs=Ke((Bs,js)=>{(function(o){typeof Bs=="object"&&typeof js=="object"?o(We(),Qn(),Yn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../../addon/mode/overlay"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("django:inner",function(){var p=["block","endblock","for","endfor","true","false","filter","endfilter","loop","none","self","super","if","elif","endif","as","else","import","with","endwith","without","context","ifequal","endifequal","ifnotequal","endifnotequal","extends","include","load","comment","endcomment","empty","url","static","trans","blocktrans","endblocktrans","now","regroup","lorem","ifchanged","endifchanged","firstof","debug","cycle","csrf_token","autoescape","endautoescape","spaceless","endspaceless","ssi","templatetag","verbatim","endverbatim","widthratio"],v=["add","addslashes","capfirst","center","cut","date","default","default_if_none","dictsort","dictsortreversed","divisibleby","escape","escapejs","filesizeformat","first","floatformat","force_escape","get_digit","iriencode","join","last","length","length_is","linebreaks","linebreaksbr","linenumbers","ljust","lower","make_list","phone2numeric","pluralize","pprint","random","removetags","rjust","safe","safeseq","slice","slugify","stringformat","striptags","time","timesince","timeuntil","title","truncatechars","truncatechars_html","truncatewords","truncatewords_html","unordered_list","upper","urlencode","urlize","urlizetrunc","wordcount","wordwrap","yesno"],C=["==","!=","<",">","<=",">="],b=["in","not","or","and"];p=new RegExp("^\\b("+p.join("|")+")\\b"),v=new RegExp("^\\b("+v.join("|")+")\\b"),C=new RegExp("^\\b("+C.join("|")+")\\b"),b=new RegExp("^\\b("+b.join("|")+")\\b");function S(c,d){if(c.match("{{"))return d.tokenize=h,"tag";if(c.match("{%"))return d.tokenize=g,"tag";if(c.match("{#"))return d.tokenize=T,"comment";for(;c.next()!=null&&!c.match(/\{[{%#]/,!1););return null}function s(c,d){return function(k,z){if(!z.escapeNext&&k.eat(c))z.tokenize=d;else{z.escapeNext&&(z.escapeNext=!1);var M=k.next();M=="\\"&&(z.escapeNext=!0)}return"string"}}function h(c,d){if(d.waitDot){if(d.waitDot=!1,c.peek()!=".")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("."))return d.waitProperty=!0,"null";throw Error("Unexpected error while waiting for property.")}if(d.waitPipe){if(d.waitPipe=!1,c.peek()!="|")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("|"))return d.waitFilter=!0,"null";throw Error("Unexpected error while waiting for filter.")}return d.waitProperty&&(d.waitProperty=!1,c.match(/\b(\w+)\b/))?(d.waitDot=!0,d.waitPipe=!0,"property"):d.waitFilter&&(d.waitFilter=!1,c.match(v))?"variable-2":c.eatSpace()?(d.waitProperty=!1,"null"):c.match(/\b\d+(\.\d+)?\b/)?"number":c.match("'")?(d.tokenize=s("'",d.tokenize),"string"):c.match('"')?(d.tokenize=s('"',d.tokenize),"string"):c.match(/\b(\w+)\b/)&&!d.foundVariable?(d.waitDot=!0,d.waitPipe=!0,"variable"):c.match("}}")?(d.waitProperty=null,d.waitFilter=null,d.waitDot=null,d.waitPipe=null,d.tokenize=S,"tag"):(c.next(),"null")}function g(c,d){if(d.waitDot){if(d.waitDot=!1,c.peek()!=".")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("."))return d.waitProperty=!0,"null";throw Error("Unexpected error while waiting for property.")}if(d.waitPipe){if(d.waitPipe=!1,c.peek()!="|")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("|"))return d.waitFilter=!0,"null";throw Error("Unexpected error while waiting for filter.")}if(d.waitProperty&&(d.waitProperty=!1,c.match(/\b(\w+)\b/)))return d.waitDot=!0,d.waitPipe=!0,"property";if(d.waitFilter&&(d.waitFilter=!1,c.match(v)))return"variable-2";if(c.eatSpace())return d.waitProperty=!1,"null";if(c.match(/\b\d+(\.\d+)?\b/))return"number";if(c.match("'"))return d.tokenize=s("'",d.tokenize),"string";if(c.match('"'))return d.tokenize=s('"',d.tokenize),"string";if(c.match(C))return"operator";if(c.match(b))return"keyword";var k=c.match(p);return k?(k[0]=="comment"&&(d.blockCommentTag=!0),"keyword"):c.match(/\b(\w+)\b/)?(d.waitDot=!0,d.waitPipe=!0,"variable"):c.match("%}")?(d.waitProperty=null,d.waitFilter=null,d.waitDot=null,d.waitPipe=null,d.blockCommentTag?(d.blockCommentTag=!1,d.tokenize=w):d.tokenize=S,"tag"):(c.next(),"null")}function T(c,d){return c.match(/^.*?#\}/)?d.tokenize=S:c.skipToEnd(),"comment"}function w(c,d){return c.match(/\{%\s*endcomment\s*%\}/,!1)?(d.tokenize=g,c.match("{%"),"tag"):(c.next(),"comment")}return{startState:function(){return{tokenize:S}},token:function(c,d){return d.tokenize(c,d)},blockCommentStart:"{% comment %}",blockCommentEnd:"{% endcomment %}"}}),o.defineMode("django",function(p){var v=o.getMode(p,"text/html"),C=o.getMode(p,"django:inner");return o.overlayMode(v,C)}),o.defineMIME("text/x-django","django")})});var Di=Ke((Hs,Ws)=>{(function(o){typeof Hs=="object"&&typeof Ws=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode=function(w,c){o.defineMode(w,function(d){return o.simpleMode(d,c)})},o.simpleMode=function(w,c){p(c,"start");var d={},k=c.meta||{},z=!1;for(var M in c)if(M!=k&&c.hasOwnProperty(M))for(var _=d[M]=[],W=c[M],E=0;E2&&O.token&&typeof O.token!="string"){for(var re=2;re-1)return o.Pass;var M=d.indent.length-1,_=w[d.state];e:for(;;){for(var W=0;W<_.length;W++){var E=_[W];if(E.data.dedent&&E.data.dedentIfLineStart!==!1){var O=E.regex.exec(k);if(O&&O[0]){M--,(E.next||E.push)&&(_=w[E.next||E.push]),k=k.slice(O[0].length);continue e}}}break}return M<0?0:d.indent[M]}}})});var Ks=Ke((Us,$s)=>{(function(o){typeof Us=="object"&&typeof $s=="object"?o(We(),Di()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple"],o):o(CodeMirror)})(function(o){"use strict";var p="from",v=new RegExp("^(\\s*)\\b("+p+")\\b","i"),C=["run","cmd","entrypoint","shell"],b=new RegExp("^(\\s*)("+C.join("|")+")(\\s+\\[)","i"),S="expose",s=new RegExp("^(\\s*)("+S+")(\\s+)","i"),h=["arg","from","maintainer","label","env","add","copy","volume","user","workdir","onbuild","stopsignal","healthcheck","shell"],g=[p,S].concat(C).concat(h),T="("+g.join("|")+")",w=new RegExp("^(\\s*)"+T+"(\\s*)(#.*)?$","i"),c=new RegExp("^(\\s*)"+T+"(\\s+)","i");o.defineSimpleMode("dockerfile",{start:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:v,token:[null,"keyword"],sol:!0,next:"from"},{regex:w,token:[null,"keyword",null,"error"],sol:!0},{regex:b,token:[null,"keyword",null],sol:!0,next:"array"},{regex:s,token:[null,"keyword",null],sol:!0,next:"expose"},{regex:c,token:[null,"keyword",null],sol:!0,next:"arguments"},{regex:/./,token:null}],from:[{regex:/\s*$/,token:null,next:"start"},{regex:/(\s*)(#.*)$/,token:[null,"error"],next:"start"},{regex:/(\s*\S+\s+)(as)/i,token:[null,"keyword"],next:"start"},{token:null,next:"start"}],single:[{regex:/(?:[^\\']|\\.)/,token:"string"},{regex:/'/,token:"string",pop:!0}],double:[{regex:/(?:[^\\"]|\\.)/,token:"string"},{regex:/"/,token:"string",pop:!0}],array:[{regex:/\]/,token:null,next:"start"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"}],expose:[{regex:/\d+$/,token:"number",next:"start"},{regex:/[^\d]+$/,token:null,next:"start"},{regex:/\d+/,token:"number"},{regex:/[^\d]+/,token:null},{token:null,next:"start"}],arguments:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:/"(?:[^\\"]|\\.)*"?$/,token:"string",next:"start"},{regex:/"/,token:"string",push:"double"},{regex:/'(?:[^\\']|\\.)*'?$/,token:"string",next:"start"},{regex:/'/,token:"string",push:"single"},{regex:/[^#"']+[\\`]$/,token:null},{regex:/[^#"']+$/,token:null,next:"start"},{regex:/[^#"']+/,token:null},{token:null,next:"start"}],meta:{lineComment:"#"}}),o.defineMIME("text/x-dockerfile","dockerfile")})});var Xs=Ke((Gs,Zs)=>{(function(o){typeof Gs=="object"&&typeof Zs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-encrypted","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["asc","pgp","sig"]},{name:"ASN.1",mime:"text/x-ttcn-asn",mode:"asn.1",ext:["asn","asn1"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"Brainfuck",mime:"text/x-brainfuck",mode:"brainfuck",ext:["b","bf"]},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h","ino"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy","cbl"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp","cs"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj","cljc","cljx"]},{name:"ClojureScript",mime:"text/x-clojurescript",mode:"clojure",ext:["cljs"]},{name:"Closure Stylesheets (GSS)",mime:"text/x-gss",mode:"css",ext:["gss"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists\.txt$/},{name:"CoffeeScript",mimes:["application/vnd.coffeescript","text/coffeescript","text/x-coffeescript"],mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"Crystal",mime:"text/x-crystal",mode:"crystal",ext:["cr"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"edn",mime:"application/edn",mode:"clojure",ext:["edn"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Elm",mime:"text/x-elm",mode:"elm",ext:["elm"]},{name:"Embedded JavaScript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Esper",mime:"text/x-esper",mode:"sql"},{name:"Factor",mime:"text/x-factor",mode:"factor",ext:["factor"]},{name:"FCL",mime:"text/x-fcl",mode:"fcl"},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90","f95"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history)\.md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy","gradle"],file:/^Jenkinsfile$/},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haskell (Literate)",mime:"text/x-literate-haskell",mode:"haskell-literate",ext:["lhs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm","handlebars","hbs"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Pug",mime:"text/x-pug",mode:"pug",ext:["jade","pug"],alias:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"JSX",mime:"text/jsx",mode:"jsx",ext:["jsx"]},{name:"Jinja2",mime:"text/jinja2",mode:"jinja2",ext:["j2","jinja","jinja2"]},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"],alias:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"clike",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb","wl","wls"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps",ext:["mps"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"mbox",mime:"application/mbox",mode:"mbox",ext:["mbox"]},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NSIS",mime:"text/x-nsis",mode:"nsis",ext:["nsh","nsi"]},{name:"NTriples",mimes:["application/n-triples","application/n-quads","text/n-triples"],mode:"ntriples",ext:["nt","nq"]},{name:"Objective-C",mime:"text/x-objectivec",mode:"clike",ext:["m"],alias:["objective-c","objc"]},{name:"Objective-C++",mime:"text/x-objectivec++",mode:"clike",ext:["mm"],alias:["objective-c++","objc++"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Oz",mime:"text/x-oz",mode:"oz",ext:["oz"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mimes:["text/x-php","application/x-httpd-php","application/x-httpd-php-open"],mode:"php",ext:["php","php3","php4","php5","php7","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"PostgreSQL",mime:"text/x-pgsql",mode:"sql"},{name:"PowerShell",mime:"application/x-powershell",mode:"powershell",ext:["ps1","psd1","psm1"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"ProtoBuf",mime:"text/x-protobuf",mode:"protobuf",ext:["proto"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["BUILD","bzl","py","pyw"],file:/^(BUCK|BUILD)$/},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r","R"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"SAS",mime:"text/x-sas",mode:"sas",ext:["sas"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mimes:["text/x-sh","application/x-sh"],mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"],file:/^PKGBUILD$/},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"SML",mime:"text/x-sml",mode:"mllike",ext:["sml","sig","fun","smackspec"]},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"SQLite",mime:"text/x-sqlite",mode:"sql"},{name:"Squirrel",mime:"text/x-squirrel",mode:"clike",ext:["nut"]},{name:"Stylus",mime:"text/x-styl",mode:"stylus",ext:["styl"]},{name:"Swift",mime:"text/x-swift",mode:"swift",ext:["swift"]},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx","tex"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v","sv","svh"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"text/troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"TTCN",mime:"text/x-ttcn",mode:"ttcn",ext:["ttcn","ttcn3","ttcnpp"]},{name:"TTCN_CFG",mime:"text/x-ttcn-cfg",mode:"ttcn-cfg",ext:["cfg"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"TypeScript-JSX",mime:"text/typescript-jsx",mode:"jsx",ext:["tsx"],alias:["tsx"]},{name:"Twig",mime:"text/x-twig",mode:"twig"},{name:"Web IDL",mime:"text/x-webidl",mode:"webidl",ext:["webidl"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"VHDL",mime:"text/x-vhdl",mode:"vhdl",ext:["vhd","vhdl"]},{name:"Vue.js Component",mimes:["script/x-vue","text/x-vue"],mode:"vue",ext:["vue"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd","svg"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"Yacas",mime:"text/x-yacas",mode:"yacas",ext:["ys"]},{name:"YAML",mimes:["text/x-yaml","text/yaml"],mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]},{name:"mscgen",mime:"text/x-mscgen",mode:"mscgen",ext:["mscgen","mscin","msc"]},{name:"xu",mime:"text/x-xu",mode:"mscgen",ext:["xu"]},{name:"msgenny",mime:"text/x-msgenny",mode:"mscgen",ext:["msgenny"]},{name:"WebAssembly",mime:"text/webassembly",mode:"wast",ext:["wat","wast"]}];for(var p=0;p-1&&C.substring(s+1,C.length);if(h)return o.findModeByExtension(h)},o.findModeByName=function(C){C=C.toLowerCase();for(var b=0;b{(function(o){typeof Ys=="object"&&typeof Qs=="object"?o(We(),mn(),Xs()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../meta"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("markdown",function(p,v){var C=o.getMode(p,"text/html"),b=C.name=="null";function S(F){if(o.findModeByName){var L=o.findModeByName(F);L&&(F=L.mime||L.mimes[0])}var de=o.getMode(p,F);return de.name=="null"?null:de}v.highlightFormatting===void 0&&(v.highlightFormatting=!1),v.maxBlockquoteDepth===void 0&&(v.maxBlockquoteDepth=0),v.taskLists===void 0&&(v.taskLists=!1),v.strikethrough===void 0&&(v.strikethrough=!1),v.emoji===void 0&&(v.emoji=!1),v.fencedCodeBlockHighlighting===void 0&&(v.fencedCodeBlockHighlighting=!0),v.fencedCodeBlockDefaultMode===void 0&&(v.fencedCodeBlockDefaultMode="text/plain"),v.xml===void 0&&(v.xml=!0),v.tokenTypeOverrides===void 0&&(v.tokenTypeOverrides={});var s={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"image",imageAltText:"image-alt-text",imageMarker:"image-marker",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough",emoji:"builtin"};for(var h in s)s.hasOwnProperty(h)&&v.tokenTypeOverrides[h]&&(s[h]=v.tokenTypeOverrides[h]);var g=/^([*\-_])(?:\s*\1){2,}\s*$/,T=/^(?:[*\-+]|^[0-9]+([.)]))\s+/,w=/^\[(x| )\](?=\s)/i,c=v.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,d=/^ {0,3}(?:\={1,}|-{2,})\s*$/,k=/^[^#!\[\]*_\\<>` "'(~:]+/,z=/^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/,M=/^\s*\[[^\]]+?\]:.*$/,_=/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/,W=" ";function E(F,L,de){return L.f=L.inline=de,de(F,L)}function O(F,L,de){return L.f=L.block=de,de(F,L)}function G(F){return!F||!/\S/.test(F.string)}function J(F){if(F.linkTitle=!1,F.linkHref=!1,F.linkText=!1,F.em=!1,F.strong=!1,F.strikethrough=!1,F.quote=0,F.indentedCode=!1,F.f==q){var L=b;if(!L){var de=o.innerMode(C,F.htmlState);L=de.mode.name=="xml"&&de.state.tagStart===null&&!de.state.context&&de.state.tokenize.isInText}L&&(F.f=j,F.block=re,F.htmlState=null)}return F.trailingSpace=0,F.trailingSpaceNewLine=!1,F.prevLine=F.thisLine,F.thisLine={stream:null},null}function re(F,L){var de=F.column()===L.indentation,ze=G(L.prevLine.stream),pe=L.indentedCode,Ee=L.prevLine.hr,ge=L.list!==!1,Oe=(L.listStack[L.listStack.length-1]||0)+3;L.indentedCode=!1;var qe=L.indentation;if(L.indentationDiff===null&&(L.indentationDiff=L.indentation,ge)){for(L.list=null;qe=4&&(pe||L.prevLine.fencedCodeEnd||L.prevLine.header||ze))return F.skipToEnd(),L.indentedCode=!0,s.code;if(F.eatSpace())return null;if(de&&L.indentation<=Oe&&(Ze=F.match(c))&&Ze[1].length<=6)return L.quote=0,L.header=Ze[1].length,L.thisLine.header=!0,v.highlightFormatting&&(L.formatting="header"),L.f=L.inline,D(L);if(L.indentation<=Oe&&F.eat(">"))return L.quote=de?1:L.quote+1,v.highlightFormatting&&(L.formatting="quote"),F.eatSpace(),D(L);if(!Be&&!L.setext&&de&&L.indentation<=Oe&&(Ze=F.match(T))){var ke=Ze[1]?"ol":"ul";return L.indentation=qe+F.current().length,L.list=!0,L.quote=0,L.listStack.push(L.indentation),L.em=!1,L.strong=!1,L.code=!1,L.strikethrough=!1,v.taskLists&&F.match(w,!1)&&(L.taskList=!0),L.f=L.inline,v.highlightFormatting&&(L.formatting=["list","list-"+ke]),D(L)}else{if(de&&L.indentation<=Oe&&(Ze=F.match(z,!0)))return L.quote=0,L.fencedEndRE=new RegExp(Ze[1]+"+ *$"),L.localMode=v.fencedCodeBlockHighlighting&&S(Ze[2]||v.fencedCodeBlockDefaultMode),L.localMode&&(L.localState=o.startState(L.localMode)),L.f=L.block=I,v.highlightFormatting&&(L.formatting="code-block"),L.code=-1,D(L);if(L.setext||(!Se||!ge)&&!L.quote&&L.list===!1&&!L.code&&!Be&&!M.test(F.string)&&(Ze=F.lookAhead(1))&&(Ze=Ze.match(d)))return L.setext?(L.header=L.setext,L.setext=0,F.skipToEnd(),v.highlightFormatting&&(L.formatting="header")):(L.header=Ze[0].charAt(0)=="="?1:2,L.setext=L.header),L.thisLine.header=!0,L.f=L.inline,D(L);if(Be)return F.skipToEnd(),L.hr=!0,L.thisLine.hr=!0,s.hr;if(F.peek()==="[")return E(F,L,N)}return E(F,L,L.inline)}function q(F,L){var de=C.token(F,L.htmlState);if(!b){var ze=o.innerMode(C,L.htmlState);(ze.mode.name=="xml"&&ze.state.tagStart===null&&!ze.state.context&&ze.state.tokenize.isInText||L.md_inside&&F.current().indexOf(">")>-1)&&(L.f=j,L.block=re,L.htmlState=null)}return de}function I(F,L){var de=L.listStack[L.listStack.length-1]||0,ze=L.indentation=F.quote?L.push(s.formatting+"-"+F.formatting[de]+"-"+F.quote):L.push("error"))}if(F.taskOpen)return L.push("meta"),L.length?L.join(" "):null;if(F.taskClosed)return L.push("property"),L.length?L.join(" "):null;if(F.linkHref?L.push(s.linkHref,"url"):(F.strong&&L.push(s.strong),F.em&&L.push(s.em),F.strikethrough&&L.push(s.strikethrough),F.emoji&&L.push(s.emoji),F.linkText&&L.push(s.linkText),F.code&&L.push(s.code),F.image&&L.push(s.image),F.imageAltText&&L.push(s.imageAltText,"link"),F.imageMarker&&L.push(s.imageMarker)),F.header&&L.push(s.header,s.header+"-"+F.header),F.quote&&(L.push(s.quote),!v.maxBlockquoteDepth||v.maxBlockquoteDepth>=F.quote?L.push(s.quote+"-"+F.quote):L.push(s.quote+"-"+v.maxBlockquoteDepth)),F.list!==!1){var ze=(F.listStack.length-1)%3;ze?ze===1?L.push(s.list2):L.push(s.list3):L.push(s.list1)}return F.trailingSpaceNewLine?L.push("trailing-space-new-line"):F.trailingSpace&&L.push("trailing-space-"+(F.trailingSpace%2?"a":"b")),L.length?L.join(" "):null}function Q(F,L){if(F.match(k,!0))return D(L)}function j(F,L){var de=L.text(F,L);if(typeof de<"u")return de;if(L.list)return L.list=null,D(L);if(L.taskList){var ze=F.match(w,!0)[1]===" ";return ze?L.taskOpen=!0:L.taskClosed=!0,v.highlightFormatting&&(L.formatting="task"),L.taskList=!1,D(L)}if(L.taskOpen=!1,L.taskClosed=!1,L.header&&F.match(/^#+$/,!0))return v.highlightFormatting&&(L.formatting="header"),D(L);var pe=F.next();if(L.linkTitle){L.linkTitle=!1;var Ee=pe;pe==="("&&(Ee=")"),Ee=(Ee+"").replace(/([.?*+^\[\]\\(){}|-])/g,"\\$1");var ge="^\\s*(?:[^"+Ee+"\\\\]+|\\\\\\\\|\\\\.)"+Ee;if(F.match(new RegExp(ge),!0))return s.linkHref}if(pe==="`"){var Oe=L.formatting;v.highlightFormatting&&(L.formatting="code"),F.eatWhile("`");var qe=F.current().length;if(L.code==0&&(!L.quote||qe==1))return L.code=qe,D(L);if(qe==L.code){var Se=D(L);return L.code=0,Se}else return L.formatting=Oe,D(L)}else if(L.code)return D(L);if(pe==="\\"&&(F.next(),v.highlightFormatting)){var Be=D(L),Ze=s.formatting+"-escape";return Be?Be+" "+Ze:Ze}if(pe==="!"&&F.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return L.imageMarker=!0,L.image=!0,v.highlightFormatting&&(L.formatting="image"),D(L);if(pe==="["&&L.imageMarker&&F.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/,!1))return L.imageMarker=!1,L.imageAltText=!0,v.highlightFormatting&&(L.formatting="image"),D(L);if(pe==="]"&&L.imageAltText){v.highlightFormatting&&(L.formatting="image");var Be=D(L);return L.imageAltText=!1,L.image=!1,L.inline=L.f=y,Be}if(pe==="["&&!L.image)return L.linkText&&F.match(/^.*?\]/)||(L.linkText=!0,v.highlightFormatting&&(L.formatting="link")),D(L);if(pe==="]"&&L.linkText){v.highlightFormatting&&(L.formatting="link");var Be=D(L);return L.linkText=!1,L.inline=L.f=F.match(/\(.*?\)| ?\[.*?\]/,!1)?y:j,Be}if(pe==="<"&&F.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1)){L.f=L.inline=V,v.highlightFormatting&&(L.formatting="link");var Be=D(L);return Be?Be+=" ":Be="",Be+s.linkInline}if(pe==="<"&&F.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1)){L.f=L.inline=V,v.highlightFormatting&&(L.formatting="link");var Be=D(L);return Be?Be+=" ":Be="",Be+s.linkEmail}if(v.xml&&pe==="<"&&F.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i,!1)){var ke=F.string.indexOf(">",F.pos);if(ke!=-1){var Je=F.string.substring(F.start,ke);/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(Je)&&(L.md_inside=!0)}return F.backUp(1),L.htmlState=o.startState(C),O(F,L,q)}if(v.xml&&pe==="<"&&F.match(/^\/\w*?>/))return L.md_inside=!1,"tag";if(pe==="*"||pe==="_"){for(var Re=1,Ge=F.pos==1?" ":F.string.charAt(F.pos-2);Re<3&&F.eat(pe);)Re++;var U=F.peek()||" ",Z=!/\s/.test(U)&&(!_.test(U)||/\s/.test(Ge)||_.test(Ge)),ce=!/\s/.test(Ge)&&(!_.test(Ge)||/\s/.test(U)||_.test(U)),He=null,te=null;if(Re%2&&(!L.em&&Z&&(pe==="*"||!ce||_.test(Ge))?He=!0:L.em==pe&&ce&&(pe==="*"||!Z||_.test(U))&&(He=!1)),Re>1&&(!L.strong&&Z&&(pe==="*"||!ce||_.test(Ge))?te=!0:L.strong==pe&&ce&&(pe==="*"||!Z||_.test(U))&&(te=!1)),te!=null||He!=null){v.highlightFormatting&&(L.formatting=He==null?"strong":te==null?"em":"strong em"),He===!0&&(L.em=pe),te===!0&&(L.strong=pe);var Se=D(L);return He===!1&&(L.em=!1),te===!1&&(L.strong=!1),Se}}else if(pe===" "&&(F.eat("*")||F.eat("_"))){if(F.peek()===" ")return D(L);F.backUp(1)}if(v.strikethrough){if(pe==="~"&&F.eatWhile(pe)){if(L.strikethrough){v.highlightFormatting&&(L.formatting="strikethrough");var Se=D(L);return L.strikethrough=!1,Se}else if(F.match(/^[^\s]/,!1))return L.strikethrough=!0,v.highlightFormatting&&(L.formatting="strikethrough"),D(L)}else if(pe===" "&&F.match("~~",!0)){if(F.peek()===" ")return D(L);F.backUp(2)}}if(v.emoji&&pe===":"&&F.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)){L.emoji=!0,v.highlightFormatting&&(L.formatting="emoji");var fe=D(L);return L.emoji=!1,fe}return pe===" "&&(F.match(/^ +$/,!1)?L.trailingSpace++:L.trailingSpace&&(L.trailingSpaceNewLine=!0)),D(L)}function V(F,L){var de=F.next();if(de===">"){L.f=L.inline=j,v.highlightFormatting&&(L.formatting="link");var ze=D(L);return ze?ze+=" ":ze="",ze+s.linkInline}return F.match(/^[^>]+/,!0),s.linkInline}function y(F,L){if(F.eatSpace())return null;var de=F.next();return de==="("||de==="["?(L.f=L.inline=X(de==="("?")":"]"),v.highlightFormatting&&(L.formatting="link-string"),L.linkHref=!0,D(L)):"error"}var K={")":/^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,"]":/^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/};function X(F){return function(L,de){var ze=L.next();if(ze===F){de.f=de.inline=j,v.highlightFormatting&&(de.formatting="link-string");var pe=D(de);return de.linkHref=!1,pe}return L.match(K[F]),de.linkHref=!0,D(de)}}function N(F,L){return F.match(/^([^\]\\]|\\.)*\]:/,!1)?(L.f=R,F.next(),v.highlightFormatting&&(L.formatting="link"),L.linkText=!0,D(L)):E(F,L,j)}function R(F,L){if(F.match("]:",!0)){L.f=L.inline=le,v.highlightFormatting&&(L.formatting="link");var de=D(L);return L.linkText=!1,de}return F.match(/^([^\]\\]|\\.)+/,!0),s.linkText}function le(F,L){return F.eatSpace()?null:(F.match(/^[^\s]+/,!0),F.peek()===void 0?L.linkTitle=!0:F.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/,!0),L.f=L.inline=j,s.linkHref+" url")}var xe={startState:function(){return{f:re,prevLine:{stream:null},thisLine:{stream:null},block:re,htmlState:null,indentation:0,inline:j,text:Q,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,setext:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,emoji:!1,fencedEndRE:null}},copyState:function(F){return{f:F.f,prevLine:F.prevLine,thisLine:F.thisLine,block:F.block,htmlState:F.htmlState&&o.copyState(C,F.htmlState),indentation:F.indentation,localMode:F.localMode,localState:F.localMode?o.copyState(F.localMode,F.localState):null,inline:F.inline,text:F.text,formatting:!1,linkText:F.linkText,linkTitle:F.linkTitle,linkHref:F.linkHref,code:F.code,em:F.em,strong:F.strong,strikethrough:F.strikethrough,emoji:F.emoji,header:F.header,setext:F.setext,hr:F.hr,taskList:F.taskList,list:F.list,listStack:F.listStack.slice(0),quote:F.quote,indentedCode:F.indentedCode,trailingSpace:F.trailingSpace,trailingSpaceNewLine:F.trailingSpaceNewLine,md_inside:F.md_inside,fencedEndRE:F.fencedEndRE}},token:function(F,L){if(L.formatting=!1,F!=L.thisLine.stream){if(L.header=0,L.hr=!1,F.match(/^\s*$/,!0))return J(L),null;if(L.prevLine=L.thisLine,L.thisLine={stream:F},L.taskList=!1,L.trailingSpace=0,L.trailingSpaceNewLine=!1,!L.localState&&(L.f=L.block,L.f!=q)){var de=F.match(/^\s*/,!0)[0].replace(/\t/g,W).length;if(L.indentation=de,L.indentationDiff=null,de>0)return null}}return L.f(F,L)},innerMode:function(F){return F.block==q?{state:F.htmlState,mode:C}:F.localState?{state:F.localState,mode:F.localMode}:{state:F,mode:xe}},indent:function(F,L,de){return F.block==q&&C.indent?C.indent(F.htmlState,L,de):F.localState&&F.localMode.indent?F.localMode.indent(F.localState,L,de):o.Pass},blankLine:J,getType:D,blockCommentStart:"",closeBrackets:"()[]{}''\"\"``",fold:"markdown"};return xe},"xml"),o.defineMIME("text/markdown","markdown"),o.defineMIME("text/x-markdown","markdown")})});var eu=Ke((Vs,Js)=>{(function(o){typeof Vs=="object"&&typeof Js=="object"?o(We(),Jo(),Yn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../markdown/markdown","../../addon/mode/overlay"],o):o(CodeMirror)})(function(o){"use strict";var p=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i;o.defineMode("gfm",function(v,C){var b=0;function S(T){return T.code=!1,null}var s={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(T){return{code:T.code,codeBlock:T.codeBlock,ateSpace:T.ateSpace}},token:function(T,w){if(w.combineTokens=null,w.codeBlock)return T.match(/^```+/)?(w.codeBlock=!1,null):(T.skipToEnd(),null);if(T.sol()&&(w.code=!1),T.sol()&&T.match(/^```+/))return T.skipToEnd(),w.codeBlock=!0,null;if(T.peek()==="`"){T.next();var c=T.pos;T.eatWhile("`");var d=1+T.pos-c;return w.code?d===b&&(w.code=!1):(b=d,w.code=!0),null}else if(w.code)return T.next(),null;if(T.eatSpace())return w.ateSpace=!0,null;if((T.sol()||w.ateSpace)&&(w.ateSpace=!1,C.gitHubSpice!==!1)){if(T.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/))return w.combineTokens=!0,"link";if(T.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return w.combineTokens=!0,"link"}return T.match(p)&&T.string.slice(T.start-2,T.start)!="]("&&(T.start==0||/\W/.test(T.string.charAt(T.start-1)))?(w.combineTokens=!0,"link"):(T.next(),null)},blankLine:S},h={taskLists:!0,strikethrough:!0,emoji:!0};for(var g in C)h[g]=C[g];return h.name="markdown",o.overlayMode(o.getMode(v,h),s)},"markdown"),o.defineMIME("text/x-gfm","gfm")})});var nu=Ke((tu,ru)=>{(function(o){typeof tu=="object"&&typeof ru=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("go",function(p){var v=p.indentUnit,C={break:!0,case:!0,chan:!0,const:!0,continue:!0,default:!0,defer:!0,else:!0,fallthrough:!0,for:!0,func:!0,go:!0,goto:!0,if:!0,import:!0,interface:!0,map:!0,package:!0,range:!0,return:!0,select:!0,struct:!0,switch:!0,type:!0,var:!0,bool:!0,byte:!0,complex64:!0,complex128:!0,float32:!0,float64:!0,int8:!0,int16:!0,int32:!0,int64:!0,string:!0,uint8:!0,uint16:!0,uint32:!0,uint64:!0,int:!0,uint:!0,uintptr:!0,error:!0,rune:!0,any:!0,comparable:!0},b={true:!0,false:!0,iota:!0,nil:!0,append:!0,cap:!0,close:!0,complex:!0,copy:!0,delete:!0,imag:!0,len:!0,make:!0,new:!0,panic:!0,print:!0,println:!0,real:!0,recover:!0},S=/[+\-*&^%:=<>!|\/]/,s;function h(k,z){var M=k.next();if(M=='"'||M=="'"||M=="`")return z.tokenize=g(M),z.tokenize(k,z);if(/[\d\.]/.test(M))return M=="."?k.match(/^[0-9_]+([eE][\-+]?[0-9_]+)?/):M=="0"?k.match(/^[xX][0-9a-fA-F_]+/)||k.match(/^[0-7_]+/):k.match(/^[0-9_]*\.?[0-9_]*([eE][\-+]?[0-9_]+)?/),"number";if(/[\[\]{}\(\),;\:\.]/.test(M))return s=M,null;if(M=="/"){if(k.eat("*"))return z.tokenize=T,T(k,z);if(k.eat("/"))return k.skipToEnd(),"comment"}if(S.test(M))return k.eatWhile(S),"operator";k.eatWhile(/[\w\$_\xa1-\uffff]/);var _=k.current();return C.propertyIsEnumerable(_)?((_=="case"||_=="default")&&(s="case"),"keyword"):b.propertyIsEnumerable(_)?"atom":"variable"}function g(k){return function(z,M){for(var _=!1,W,E=!1;(W=z.next())!=null;){if(W==k&&!_){E=!0;break}_=!_&&k!="`"&&W=="\\"}return(E||!(_||k=="`"))&&(M.tokenize=h),"string"}}function T(k,z){for(var M=!1,_;_=k.next();){if(_=="/"&&M){z.tokenize=h;break}M=_=="*"}return"comment"}function w(k,z,M,_,W){this.indented=k,this.column=z,this.type=M,this.align=_,this.prev=W}function c(k,z,M){return k.context=new w(k.indented,z,M,null,k.context)}function d(k){if(k.context.prev){var z=k.context.type;return(z==")"||z=="]"||z=="}")&&(k.indented=k.context.indented),k.context=k.context.prev}}return{startState:function(k){return{tokenize:null,context:new w((k||0)-v,0,"top",!1),indented:0,startOfLine:!0}},token:function(k,z){var M=z.context;if(k.sol()&&(M.align==null&&(M.align=!1),z.indented=k.indentation(),z.startOfLine=!0,M.type=="case"&&(M.type="}")),k.eatSpace())return null;s=null;var _=(z.tokenize||h)(k,z);return _=="comment"||(M.align==null&&(M.align=!0),s=="{"?c(z,k.column(),"}"):s=="["?c(z,k.column(),"]"):s=="("?c(z,k.column(),")"):s=="case"?M.type="case":(s=="}"&&M.type=="}"||s==M.type)&&d(z),z.startOfLine=!1),_},indent:function(k,z){if(k.tokenize!=h&&k.tokenize!=null)return o.Pass;var M=k.context,_=z&&z.charAt(0);if(M.type=="case"&&/^(?:case|default)\b/.test(z))return k.context.type="}",M.indented;var W=_==M.type;return M.align?M.column+(W?0:1):M.indented+(W?0:v)},electricChars:"{}):",closeBrackets:"()[]{}''\"\"``",fold:"brace",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//"}}),o.defineMIME("text/x-go","go")})});var au=Ke((iu,ou)=>{(function(o){typeof iu=="object"&&typeof ou=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("http",function(){function p(T,w){return T.skipToEnd(),w.cur=h,"error"}function v(T,w){return T.match(/^HTTP\/\d\.\d/)?(w.cur=C,"keyword"):T.match(/^[A-Z]+/)&&/[ \t]/.test(T.peek())?(w.cur=S,"keyword"):p(T,w)}function C(T,w){var c=T.match(/^\d+/);if(!c)return p(T,w);w.cur=b;var d=Number(c[0]);return d>=100&&d<200?"positive informational":d>=200&&d<300?"positive success":d>=300&&d<400?"positive redirect":d>=400&&d<500?"negative client-error":d>=500&&d<600?"negative server-error":"error"}function b(T,w){return T.skipToEnd(),w.cur=h,null}function S(T,w){return T.eatWhile(/\S/),w.cur=s,"string-2"}function s(T,w){return T.match(/^HTTP\/\d\.\d$/)?(w.cur=h,"keyword"):p(T,w)}function h(T){return T.sol()&&!T.eat(/[ \t]/)?T.match(/^.*?:/)?"atom":(T.skipToEnd(),"error"):(T.skipToEnd(),"string")}function g(T){return T.skipToEnd(),null}return{token:function(T,w){var c=w.cur;return c!=h&&c!=g&&T.eatSpace()?null:c(T,w)},blankLine:function(T){T.cur=g},startState:function(){return{cur:v}}}}),o.defineMIME("message/http","http")})});var uu=Ke((lu,su)=>{(function(o){typeof lu=="object"&&typeof su=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("jinja2",function(){var p=["and","as","block","endblock","by","cycle","debug","else","elif","extends","filter","endfilter","firstof","do","for","endfor","if","endif","ifchanged","endifchanged","ifequal","endifequal","ifnotequal","set","raw","endraw","endifnotequal","in","include","load","not","now","or","parsed","regroup","reversed","spaceless","call","endcall","macro","endmacro","endspaceless","ssi","templatetag","openblock","closeblock","openvariable","closevariable","without","context","openbrace","closebrace","opencomment","closecomment","widthratio","url","with","endwith","get_current_language","trans","endtrans","noop","blocktrans","endblocktrans","get_available_languages","get_current_language_bidi","pluralize","autoescape","endautoescape"],v=/^[+\-*&%=<>!?|~^]/,C=/^[:\[\(\{]/,b=["true","false"],S=/^(\d[+\-\*\/])?\d+(\.\d+)?/;p=new RegExp("(("+p.join(")|(")+"))\\b"),b=new RegExp("(("+b.join(")|(")+"))\\b");function s(h,g){var T=h.peek();if(g.incomment)return h.skipTo("#}")?(h.eatWhile(/\#|}/),g.incomment=!1):h.skipToEnd(),"comment";if(g.intag){if(g.operator){if(g.operator=!1,h.match(b))return"atom";if(h.match(S))return"number"}if(g.sign){if(g.sign=!1,h.match(b))return"atom";if(h.match(S))return"number"}if(g.instring)return T==g.instring&&(g.instring=!1),h.next(),"string";if(T=="'"||T=='"')return g.instring=T,h.next(),"string";if(g.inbraces>0&&T==")")h.next(),g.inbraces--;else if(T=="(")h.next(),g.inbraces++;else if(g.inbrackets>0&&T=="]")h.next(),g.inbrackets--;else if(T=="[")h.next(),g.inbrackets++;else{if(!g.lineTag&&(h.match(g.intag+"}")||h.eat("-")&&h.match(g.intag+"}")))return g.intag=!1,"tag";if(h.match(v))return g.operator=!0,"operator";if(h.match(C))g.sign=!0;else{if(h.column()==1&&g.lineTag&&h.match(p))return"keyword";if(h.eat(" ")||h.sol()){if(h.match(p))return"keyword";if(h.match(b))return"atom";if(h.match(S))return"number";h.sol()&&h.next()}else h.next()}}return"variable"}else if(h.eat("{")){if(h.eat("#"))return g.incomment=!0,h.skipTo("#}")?(h.eatWhile(/\#|}/),g.incomment=!1):h.skipToEnd(),"comment";if(T=h.eat(/\{|%/))return g.intag=T,g.inbraces=0,g.inbrackets=0,T=="{"&&(g.intag="}"),h.eat("-"),"tag"}else if(h.eat("#")){if(h.peek()=="#")return h.skipToEnd(),"comment";if(!h.eol())return g.intag=!0,g.lineTag=!0,g.inbraces=0,g.inbrackets=0,"tag"}h.next()}return{startState:function(){return{tokenize:s,inbrackets:0,inbraces:0}},token:function(h,g){var T=g.tokenize(h,g);return h.eol()&&g.lineTag&&!g.instring&&g.inbraces==0&&g.inbrackets==0&&(g.intag=!1,g.lineTag=!1),T},blockCommentStart:"{#",blockCommentEnd:"#}",lineComment:"##"}}),o.defineMIME("text/jinja2","jinja2")})});var du=Ke((cu,fu)=>{(function(o){typeof cu=="object"&&typeof fu=="object"?o(We(),mn(),vn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript"],o):o(CodeMirror)})(function(o){"use strict";function p(C,b,S,s){this.state=C,this.mode=b,this.depth=S,this.prev=s}function v(C){return new p(o.copyState(C.mode,C.state),C.mode,C.depth,C.prev&&v(C.prev))}o.defineMode("jsx",function(C,b){var S=o.getMode(C,{name:"xml",allowMissing:!0,multilineTagIndentPastTag:!1,allowMissingTagName:!0}),s=o.getMode(C,b&&b.base||"javascript");function h(c){var d=c.tagName;c.tagName=null;var k=S.indent(c,"","");return c.tagName=d,k}function g(c,d){return d.context.mode==S?T(c,d,d.context):w(c,d,d.context)}function T(c,d,k){if(k.depth==2)return c.match(/^.*?\*\//)?k.depth=1:c.skipToEnd(),"comment";if(c.peek()=="{"){S.skipAttribute(k.state);var z=h(k.state),M=k.state.context;if(M&&c.match(/^[^>]*>\s*$/,!1)){for(;M.prev&&!M.startOfLine;)M=M.prev;M.startOfLine?z-=C.indentUnit:k.prev.state.lexical&&(z=k.prev.state.lexical.indented)}else k.depth==1&&(z+=C.indentUnit);return d.context=new p(o.startState(s,z),s,0,d.context),null}if(k.depth==1){if(c.peek()=="<")return S.skipAttribute(k.state),d.context=new p(o.startState(S,h(k.state)),S,0,d.context),null;if(c.match("//"))return c.skipToEnd(),"comment";if(c.match("/*"))return k.depth=2,g(c,d)}var _=S.token(c,k.state),W=c.current(),E;return/\btag\b/.test(_)?/>$/.test(W)?k.state.context?k.depth=0:d.context=d.context.prev:/^-1&&c.backUp(W.length-E),_}function w(c,d,k){if(c.peek()=="<"&&!c.match(/^<([^<>]|<[^>]*>)+,\s*>/,!1)&&s.expressionAllowed(c,k.state))return d.context=new p(o.startState(S,s.indent(k.state,"","")),S,0,d.context),s.skipExpression(k.state),null;var z=s.token(c,k.state);if(!z&&k.depth!=null){var M=c.current();M=="{"?k.depth++:M=="}"&&--k.depth==0&&(d.context=d.context.prev)}return z}return{startState:function(){return{context:new p(o.startState(s),s)}},copyState:function(c){return{context:v(c.context)}},token:g,indent:function(c,d,k){return c.context.mode.indent(c.context.state,d,k)},innerMode:function(c){return c.context}}},"xml","javascript"),o.defineMIME("text/jsx","jsx"),o.defineMIME("text/typescript-jsx",{name:"jsx",base:{name:"javascript",typescript:!0}})})});var gu=Ke((pu,hu)=>{(function(o){typeof pu=="object"&&typeof hu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("nginx",function(p){function v(k){for(var z={},M=k.split(" "),_=0;_*\/]/.test(_)?g(null,"select-op"):/[;{}:\[\]]/.test(_)?g(null,_):(k.eatWhile(/[\w\\\-]/),g("variable","variable"))}function w(k,z){for(var M=!1,_;(_=k.next())!=null;){if(M&&_=="/"){z.tokenize=T;break}M=_=="*"}return g("comment","comment")}function c(k,z){for(var M=0,_;(_=k.next())!=null;){if(M>=2&&_==">"){z.tokenize=T;break}M=_=="-"?M+1:0}return g("comment","comment")}function d(k){return function(z,M){for(var _=!1,W;(W=z.next())!=null&&!(W==k&&!_);)_=!_&&W=="\\";return _||(M.tokenize=T),g("string","string")}}return{startState:function(k){return{tokenize:T,baseIndent:k||0,stack:[]}},token:function(k,z){if(k.eatSpace())return null;h=null;var M=z.tokenize(k,z),_=z.stack[z.stack.length-1];return h=="hash"&&_=="rule"?M="atom":M=="variable"&&(_=="rule"?M="number":(!_||_=="@media{")&&(M="tag")),_=="rule"&&/^[\{\};]$/.test(h)&&z.stack.pop(),h=="{"?_=="@media"?z.stack[z.stack.length-1]="@media{":z.stack.push("{"):h=="}"?z.stack.pop():h=="@media"?z.stack.push("@media"):_=="{"&&h!="comment"&&z.stack.push("rule"),M},indent:function(k,z){var M=k.stack.length;return/^\}/.test(z)&&(M-=k.stack[k.stack.length-1]=="rule"?2:1),k.baseIndent+M*s},electricChars:"}"}}),o.defineMIME("text/x-nginx-conf","nginx")})});var bu=Ke((mu,vu)=>{(function(o){typeof mu=="object"&&typeof vu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("pascal",function(){function p(T){for(var w={},c=T.split(" "),d=0;d!?|\/]/;function S(T,w){var c=T.next();if(c=="#"&&w.startOfLine)return T.skipToEnd(),"meta";if(c=='"'||c=="'")return w.tokenize=s(c),w.tokenize(T,w);if(c=="("&&T.eat("*"))return w.tokenize=h,h(T,w);if(c=="{")return w.tokenize=g,g(T,w);if(/[\[\]\(\),;\:\.]/.test(c))return null;if(/\d/.test(c))return T.eatWhile(/[\w\.]/),"number";if(c=="/"&&T.eat("/"))return T.skipToEnd(),"comment";if(b.test(c))return T.eatWhile(b),"operator";T.eatWhile(/[\w\$_]/);var d=T.current().toLowerCase();return v.propertyIsEnumerable(d)?"keyword":C.propertyIsEnumerable(d)?"atom":"variable"}function s(T){return function(w,c){for(var d=!1,k,z=!1;(k=w.next())!=null;){if(k==T&&!d){z=!0;break}d=!d&&k=="\\"}return(z||!d)&&(c.tokenize=null),"string"}}function h(T,w){for(var c=!1,d;d=T.next();){if(d==")"&&c){w.tokenize=null;break}c=d=="*"}return"comment"}function g(T,w){for(var c;c=T.next();)if(c=="}"){w.tokenize=null;break}return"comment"}return{startState:function(){return{tokenize:null}},token:function(T,w){if(T.eatSpace())return null;var c=(w.tokenize||S)(T,w);return c=="comment"||c=="meta",c},electricChars:"{}"}}),o.defineMIME("text/x-pascal","pascal")})});var _u=Ke((yu,xu)=>{(function(o){typeof yu=="object"&&typeof xu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("perl",function(){var S={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,if:[1,1],elsif:[1,1],else:[1,1],while:[1,1],unless:[1,1],for:[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,break:1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,continue:[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,default:1,defined:1,delete:1,die:1,do:1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,goto:1,grep:1,hex:1,import:1,index:1,int:1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,new:1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,package:1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,return:1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,y:null},s="string-2",h=/[goseximacplud]/;function g(c,d,k,z,M){return d.chain=null,d.style=null,d.tail=null,d.tokenize=function(_,W){for(var E=!1,O,G=0;O=_.next();){if(O===k[G]&&!E)return k[++G]!==void 0?(W.chain=k[G],W.style=z,W.tail=M):M&&_.eatWhile(M),W.tokenize=w,z;E=!E&&O=="\\"}return z},d.tokenize(c,d)}function T(c,d,k){return d.tokenize=function(z,M){return z.string==k&&(M.tokenize=w),z.skipToEnd(),"string"},d.tokenize(c,d)}function w(c,d){if(c.eatSpace())return null;if(d.chain)return g(c,d,d.chain,d.style,d.tail);if(c.match(/^(\-?((\d[\d_]*)?\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F_]+|0b[01_]+|\d[\d_]*(e[+-]?\d+)?)/))return"number";if(c.match(/^<<(?=[_a-zA-Z])/))return c.eatWhile(/\w/),T(c,d,c.current().substr(2));if(c.sol()&&c.match(/^\=item(?!\w)/))return T(c,d,"=cut");var k=c.next();if(k=='"'||k=="'"){if(v(c,3)=="<<"+k){var z=c.pos;c.eatWhile(/\w/);var M=c.current().substr(1);if(M&&c.eat(k))return T(c,d,M);c.pos=z}return g(c,d,[k],"string")}if(k=="q"){var _=p(c,-2);if(!(_&&/\w/.test(_))){if(_=p(c,0),_=="x"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],s,h);if(_=="[")return b(c,2),g(c,d,["]"],s,h);if(_=="{")return b(c,2),g(c,d,["}"],s,h);if(_=="<")return b(c,2),g(c,d,[">"],s,h);if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],s,h)}else if(_=="q"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],"string");if(_=="[")return b(c,2),g(c,d,["]"],"string");if(_=="{")return b(c,2),g(c,d,["}"],"string");if(_=="<")return b(c,2),g(c,d,[">"],"string");if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],"string")}else if(_=="w"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],"bracket");if(_=="[")return b(c,2),g(c,d,["]"],"bracket");if(_=="{")return b(c,2),g(c,d,["}"],"bracket");if(_=="<")return b(c,2),g(c,d,[">"],"bracket");if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],"bracket")}else if(_=="r"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],s,h);if(_=="[")return b(c,2),g(c,d,["]"],s,h);if(_=="{")return b(c,2),g(c,d,["}"],s,h);if(_=="<")return b(c,2),g(c,d,[">"],s,h);if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],s,h)}else if(/[\^'"!~\/(\[{<]/.test(_)){if(_=="(")return b(c,1),g(c,d,[")"],"string");if(_=="[")return b(c,1),g(c,d,["]"],"string");if(_=="{")return b(c,1),g(c,d,["}"],"string");if(_=="<")return b(c,1),g(c,d,[">"],"string");if(/[\^'"!~\/]/.test(_))return g(c,d,[c.eat(_)],"string")}}}if(k=="m"){var _=p(c,-2);if(!(_&&/\w/.test(_))&&(_=c.eat(/[(\[{<\^'"!~\/]/),_)){if(/[\^'"!~\/]/.test(_))return g(c,d,[_],s,h);if(_=="(")return g(c,d,[")"],s,h);if(_=="[")return g(c,d,["]"],s,h);if(_=="{")return g(c,d,["}"],s,h);if(_=="<")return g(c,d,[">"],s,h)}}if(k=="s"){var _=/[\/>\]})\w]/.test(p(c,-2));if(!_&&(_=c.eat(/[(\[{<\^'"!~\/]/),_))return _=="["?g(c,d,["]","]"],s,h):_=="{"?g(c,d,["}","}"],s,h):_=="<"?g(c,d,[">",">"],s,h):_=="("?g(c,d,[")",")"],s,h):g(c,d,[_,_],s,h)}if(k=="y"){var _=/[\/>\]})\w]/.test(p(c,-2));if(!_&&(_=c.eat(/[(\[{<\^'"!~\/]/),_))return _=="["?g(c,d,["]","]"],s,h):_=="{"?g(c,d,["}","}"],s,h):_=="<"?g(c,d,[">",">"],s,h):_=="("?g(c,d,[")",")"],s,h):g(c,d,[_,_],s,h)}if(k=="t"){var _=/[\/>\]})\w]/.test(p(c,-2));if(!_&&(_=c.eat("r"),_&&(_=c.eat(/[(\[{<\^'"!~\/]/),_)))return _=="["?g(c,d,["]","]"],s,h):_=="{"?g(c,d,["}","}"],s,h):_=="<"?g(c,d,[">",">"],s,h):_=="("?g(c,d,[")",")"],s,h):g(c,d,[_,_],s,h)}if(k=="`")return g(c,d,[k],"variable-2");if(k=="/")return/~\s*$/.test(v(c))?g(c,d,[k],s,h):"operator";if(k=="$"){var z=c.pos;if(c.eatWhile(/\d/)||c.eat("{")&&c.eatWhile(/\d/)&&c.eat("}"))return"variable-2";c.pos=z}if(/[$@%]/.test(k)){var z=c.pos;if(c.eat("^")&&c.eat(/[A-Z]/)||!/[@$%&]/.test(p(c,-2))&&c.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var _=c.current();if(S[_])return"variable-2"}c.pos=z}if(/[$@%&]/.test(k)&&(c.eatWhile(/[\w$]/)||c.eat("{")&&c.eatWhile(/[\w$]/)&&c.eat("}"))){var _=c.current();return S[_]?"variable-2":"variable"}if(k=="#"&&p(c,-2)!="$")return c.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(k)){var z=c.pos;if(c.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),S[c.current()])return"operator";c.pos=z}if(k=="_"&&c.pos==1){if(C(c,6)=="_END__")return g(c,d,["\0"],"comment");if(C(c,7)=="_DATA__")return g(c,d,["\0"],"variable-2");if(C(c,7)=="_C__")return g(c,d,["\0"],"string")}if(/\w/.test(k)){var z=c.pos;if(p(c,-2)=="{"&&(p(c,0)=="}"||c.eatWhile(/\w/)&&p(c,0)=="}"))return"string";c.pos=z}if(/[A-Z]/.test(k)){var W=p(c,-2),z=c.pos;if(c.eatWhile(/[A-Z_]/),/[\da-z]/.test(p(c,0)))c.pos=z;else{var _=S[c.current()];return _?(_[1]&&(_=_[0]),W!=":"?_==1?"keyword":_==2?"def":_==3?"atom":_==4?"operator":_==5?"variable-2":"meta":"meta"):"meta"}}if(/[a-zA-Z_]/.test(k)){var W=p(c,-2);c.eatWhile(/\w/);var _=S[c.current()];return _?(_[1]&&(_=_[0]),W!=":"?_==1?"keyword":_==2?"def":_==3?"atom":_==4?"operator":_==5?"variable-2":"meta":"meta"):"meta"}return null}return{startState:function(){return{tokenize:w,chain:null,style:null,tail:null}},token:function(c,d){return(d.tokenize||w)(c,d)},lineComment:"#"}}),o.registerHelper("wordChars","perl",/[\w$]/),o.defineMIME("text/x-perl","perl");function p(S,s){return S.string.charAt(S.pos+(s||0))}function v(S,s){if(s){var h=S.pos-s;return S.string.substr(h>=0?h:0,s)}else return S.string.substr(0,S.pos-1)}function C(S,s){var h=S.string.length,g=h-S.pos+1;return S.string.substr(S.pos,s&&s=(g=S.string.length-1)?S.pos=g:S.pos=h}})});var Su=Ke((ku,wu)=>{(function(o){typeof ku=="object"&&typeof wu=="object"?o(We(),Qn(),Vo()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../clike/clike"],o):o(CodeMirror)})(function(o){"use strict";function p(T){for(var w={},c=T.split(" "),d=0;d\w/,!1)&&(w.tokenize=v([[["->",null]],[[/[\w]+/,"variable"]]],c,d)),"variable-2";for(var k=!1;!T.eol()&&(k||d===!1||!T.match("{$",!1)&&!T.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/,!1));){if(!k&&T.match(c)){w.tokenize=null,w.tokStack.pop(),w.tokStack.pop();break}k=T.next()=="\\"&&!k}return"string"}var S="abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally readonly match",s="true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__",h="func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";o.registerHelper("hintWords","php",[S,s,h].join(" ").split(" ")),o.registerHelper("wordChars","php",/[\w$]/);var g={name:"clike",helperType:"php",keywords:p(S),blockKeywords:p("catch do else elseif for foreach if switch try while finally"),defKeywords:p("class enum function interface namespace trait"),atoms:p(s),builtin:p(h),multiLineStrings:!0,hooks:{$:function(T){return T.eatWhile(/[\w\$_]/),"variable-2"},"<":function(T,w){var c;if(c=T.match(/^<<\s*/)){var d=T.eat(/['"]/);T.eatWhile(/[\w\.]/);var k=T.current().slice(c[0].length+(d?2:1));if(d&&T.eat(d),k)return(w.tokStack||(w.tokStack=[])).push(k,0),w.tokenize=C(k,d!="'"),"string"}return!1},"#":function(T){for(;!T.eol()&&!T.match("?>",!1);)T.next();return"comment"},"/":function(T){if(T.eat("/")){for(;!T.eol()&&!T.match("?>",!1);)T.next();return"comment"}return!1},'"':function(T,w){return(w.tokStack||(w.tokStack=[])).push('"',0),w.tokenize=C('"'),"string"},"{":function(T,w){return w.tokStack&&w.tokStack.length&&w.tokStack[w.tokStack.length-1]++,!1},"}":function(T,w){return w.tokStack&&w.tokStack.length>0&&!--w.tokStack[w.tokStack.length-1]&&(w.tokenize=C(w.tokStack[w.tokStack.length-2])),!1}}};o.defineMode("php",function(T,w){var c=o.getMode(T,w&&w.htmlMode||"text/html"),d=o.getMode(T,g);function k(z,M){var _=M.curMode==d;if(z.sol()&&M.pending&&M.pending!='"'&&M.pending!="'"&&(M.pending=null),_)return _&&M.php.tokenize==null&&z.match("?>")?(M.curMode=c,M.curState=M.html,M.php.context.prev||(M.php=null),"meta"):d.token(z,M.curState);if(z.match(/^<\?\w*/))return M.curMode=d,M.php||(M.php=o.startState(d,c.indent(M.html,"",""))),M.curState=M.php,"meta";if(M.pending=='"'||M.pending=="'"){for(;!z.eol()&&z.next()!=M.pending;);var W="string"}else if(M.pending&&z.pos/.test(E)?M.pending=G[0]:M.pending={end:z.pos,style:W},z.backUp(E.length-O)),W}return{startState:function(){var z=o.startState(c),M=w.startOpen?o.startState(d):null;return{html:z,php:M,curMode:w.startOpen?d:c,curState:w.startOpen?M:z,pending:null}},copyState:function(z){var M=z.html,_=o.copyState(c,M),W=z.php,E=W&&o.copyState(d,W),O;return z.curMode==c?O=_:O=E,{html:_,php:E,curMode:z.curMode,curState:O,pending:z.pending}},token:k,indent:function(z,M,_){return z.curMode!=d&&/^\s*<\//.test(M)||z.curMode==d&&/^\?>/.test(M)?c.indent(z.html,M,_):z.curMode.indent(z.curState,M,_)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(z){return{state:z.curState,mode:z.curMode}}}},"htmlmixed","clike"),o.defineMIME("application/x-httpd-php","php"),o.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:!0}),o.defineMIME("text/x-php",g)})});var Cu=Ke((Tu,Lu)=>{(function(o){typeof Tu=="object"&&typeof Lu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(s){return new RegExp("^(("+s.join(")|(")+"))\\b","i")}var v=["package","message","import","syntax","required","optional","repeated","reserved","default","extensions","packed","bool","bytes","double","enum","float","string","int32","int64","uint32","uint64","sint32","sint64","fixed32","fixed64","sfixed32","sfixed64","option","service","rpc","returns"],C=p(v);o.registerHelper("hintWords","protobuf",v);var b=new RegExp("^[_A-Za-z\xA1-\uFFFF][_A-Za-z0-9\xA1-\uFFFF]*");function S(s){return s.eatSpace()?null:s.match("//")?(s.skipToEnd(),"comment"):s.match(/^[0-9\.+-]/,!1)&&(s.match(/^[+-]?0x[0-9a-fA-F]+/)||s.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)||s.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))?"number":s.match(/^"([^"]|(""))*"/)||s.match(/^'([^']|(''))*'/)?"string":s.match(C)?"keyword":s.match(b)?"variable":(s.next(),null)}o.defineMode("protobuf",function(){return{token:S,fold:"brace"}}),o.defineMIME("text/x-protobuf","protobuf")})});var Mu=Ke((Eu,zu)=>{(function(o){typeof Eu=="object"&&typeof zu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(h){return new RegExp("^(("+h.join(")|(")+"))\\b")}var v=p(["and","or","not","is"]),C=["as","assert","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","lambda","pass","raise","return","try","while","with","yield","in","False","True"],b=["abs","all","any","bin","bool","bytearray","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip","__import__","NotImplemented","Ellipsis","__debug__"];o.registerHelper("hintWords","python",C.concat(b).concat(["exec","print"]));function S(h){return h.scopes[h.scopes.length-1]}o.defineMode("python",function(h,g){for(var T="error",w=g.delimiters||g.singleDelimiters||/^[\(\)\[\]\{\}@,:`=;\.\\]/,c=[g.singleOperators,g.doubleOperators,g.doubleDelimiters,g.tripleDelimiters,g.operators||/^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/],d=0;dR?D(X):le0&&j(K,X)&&(xe+=" "+T),xe}}return re(K,X)}function re(K,X,N){if(K.eatSpace())return null;if(!N&&K.match(/^#.*/))return"comment";if(K.match(/^[0-9\.]/,!1)){var R=!1;if(K.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i)&&(R=!0),K.match(/^[\d_]+\.\d*/)&&(R=!0),K.match(/^\.\d+/)&&(R=!0),R)return K.eat(/J/i),"number";var le=!1;if(K.match(/^0x[0-9a-f_]+/i)&&(le=!0),K.match(/^0b[01_]+/i)&&(le=!0),K.match(/^0o[0-7_]+/i)&&(le=!0),K.match(/^[1-9][\d_]*(e[\+\-]?[\d_]+)?/)&&(K.eat(/J/i),le=!0),K.match(/^0(?![\dx])/i)&&(le=!0),le)return K.eat(/L/i),"number"}if(K.match(E)){var xe=K.current().toLowerCase().indexOf("f")!==-1;return xe?(X.tokenize=q(K.current(),X.tokenize),X.tokenize(K,X)):(X.tokenize=I(K.current(),X.tokenize),X.tokenize(K,X))}for(var F=0;F=0;)K=K.substr(1);var N=K.length==1,R="string";function le(F){return function(L,de){var ze=re(L,de,!0);return ze=="punctuation"&&(L.current()=="{"?de.tokenize=le(F+1):L.current()=="}"&&(F>1?de.tokenize=le(F-1):de.tokenize=xe)),ze}}function xe(F,L){for(;!F.eol();)if(F.eatWhile(/[^'"\{\}\\]/),F.eat("\\")){if(F.next(),N&&F.eol())return R}else{if(F.match(K))return L.tokenize=X,R;if(F.match("{{"))return R;if(F.match("{",!1))return L.tokenize=le(0),F.current()?R:L.tokenize(F,L);if(F.match("}}"))return R;if(F.match("}"))return T;F.eat(/['"]/)}if(N){if(g.singleLineStringErrors)return T;L.tokenize=X}return R}return xe.isString=!0,xe}function I(K,X){for(;"rubf".indexOf(K.charAt(0).toLowerCase())>=0;)K=K.substr(1);var N=K.length==1,R="string";function le(xe,F){for(;!xe.eol();)if(xe.eatWhile(/[^'"\\]/),xe.eat("\\")){if(xe.next(),N&&xe.eol())return R}else{if(xe.match(K))return F.tokenize=X,R;xe.eat(/['"]/)}if(N){if(g.singleLineStringErrors)return T;F.tokenize=X}return R}return le.isString=!0,le}function D(K){for(;S(K).type!="py";)K.scopes.pop();K.scopes.push({offset:S(K).offset+h.indentUnit,type:"py",align:null})}function Q(K,X,N){var R=K.match(/^[\s\[\{\(]*(?:#|$)/,!1)?null:K.column()+1;X.scopes.push({offset:X.indent+k,type:N,align:R})}function j(K,X){for(var N=K.indentation();X.scopes.length>1&&S(X).offset>N;){if(S(X).type!="py")return!0;X.scopes.pop()}return S(X).offset!=N}function V(K,X){K.sol()&&(X.beginningOfLine=!0,X.dedent=!1);var N=X.tokenize(K,X),R=K.current();if(X.beginningOfLine&&R=="@")return K.match(W,!1)?"meta":_?"operator":T;if(/\S/.test(R)&&(X.beginningOfLine=!1),(N=="variable"||N=="builtin")&&X.lastToken=="meta"&&(N="meta"),(R=="pass"||R=="return")&&(X.dedent=!0),R=="lambda"&&(X.lambda=!0),R==":"&&!X.lambda&&S(X).type=="py"&&K.match(/^\s*(?:#|$)/,!1)&&D(X),R.length==1&&!/string|comment/.test(N)){var le="[({".indexOf(R);if(le!=-1&&Q(K,X,"])}".slice(le,le+1)),le="])}".indexOf(R),le!=-1)if(S(X).type==R)X.indent=X.scopes.pop().offset-k;else return T}return X.dedent&&K.eol()&&S(X).type=="py"&&X.scopes.length>1&&X.scopes.pop(),N}var y={startState:function(K){return{tokenize:J,scopes:[{offset:K||0,type:"py",align:null}],indent:K||0,lastToken:null,lambda:!1,dedent:0}},token:function(K,X){var N=X.errorToken;N&&(X.errorToken=!1);var R=V(K,X);return R&&R!="comment"&&(X.lastToken=R=="keyword"||R=="punctuation"?K.current():R),R=="punctuation"&&(R=null),K.eol()&&X.lambda&&(X.lambda=!1),N?R+" "+T:R},indent:function(K,X){if(K.tokenize!=J)return K.tokenize.isString?o.Pass:0;var N=S(K),R=N.type==X.charAt(0)||N.type=="py"&&!K.dedent&&/^(else:|elif |except |finally:)/.test(X);return N.align!=null?N.align-(R?1:0):N.offset-(R?k:0)},electricInput:/^\s*([\}\]\)]|else:|elif |except |finally:)$/,closeBrackets:{triples:`'"`},lineComment:"#",fold:"indent"};return y}),o.defineMIME("text/x-python","python");var s=function(h){return h.split(" ")};o.defineMIME("text/x-cython",{name:"python",extra_keywords:s("by cdef cimport cpdef ctypedef enum except extern gil include nogil property public readonly struct union DEF IF ELIF ELSE")})})});var qu=Ke((Au,Du)=>{(function(o){typeof Au=="object"&&typeof Du=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(g){for(var T={},w=0,c=g.length;w]/)?(E.eat(/[\<\>]/),"atom"):E.eat(/[\+\-\*\/\&\|\:\!]/)?"atom":E.eat(/[a-zA-Z$@_\xa1-\uffff]/)?(E.eatWhile(/[\w$\xa1-\uffff]/),E.eat(/[\?\!\=]/),"atom"):"operator";if(G=="@"&&E.match(/^@?[a-zA-Z_\xa1-\uffff]/))return E.eat("@"),E.eatWhile(/[\w\xa1-\uffff]/),"variable-2";if(G=="$")return E.eat(/[a-zA-Z_]/)?E.eatWhile(/[\w]/):E.eat(/\d/)?E.eat(/\d/):E.next(),"variable-3";if(/[a-zA-Z_\xa1-\uffff]/.test(G))return E.eatWhile(/[\w\xa1-\uffff]/),E.eat(/[\?\!]/),E.eat(":")?"atom":"ident";if(G=="|"&&(O.varList||O.lastTok=="{"||O.lastTok=="do"))return T="|",null;if(/[\(\)\[\]{}\\;]/.test(G))return T=G,null;if(G=="-"&&E.eat(">"))return"arrow";if(/[=+\-\/*:\.^%<>~|]/.test(G)){var D=E.eatWhile(/[=+\-\/*:\.^%<>~|]/);return G=="."&&!D&&(T="."),"operator"}else return null}}}function d(E){for(var O=E.pos,G=0,J,re=!1,q=!1;(J=E.next())!=null;)if(q)q=!1;else{if("[{(".indexOf(J)>-1)G++;else if("]})".indexOf(J)>-1){if(G--,G<0)break}else if(J=="/"&&G==0){re=!0;break}q=J=="\\"}return E.backUp(E.pos-O),re}function k(E){return E||(E=1),function(O,G){if(O.peek()=="}"){if(E==1)return G.tokenize.pop(),G.tokenize[G.tokenize.length-1](O,G);G.tokenize[G.tokenize.length-1]=k(E-1)}else O.peek()=="{"&&(G.tokenize[G.tokenize.length-1]=k(E+1));return c(O,G)}}function z(){var E=!1;return function(O,G){return E?(G.tokenize.pop(),G.tokenize[G.tokenize.length-1](O,G)):(E=!0,c(O,G))}}function M(E,O,G,J){return function(re,q){var I=!1,D;for(q.context.type==="read-quoted-paused"&&(q.context=q.context.prev,re.eat("}"));(D=re.next())!=null;){if(D==E&&(J||!I)){q.tokenize.pop();break}if(G&&D=="#"&&!I){if(re.eat("{")){E=="}"&&(q.context={prev:q.context,type:"read-quoted-paused"}),q.tokenize.push(k());break}else if(/[@\$]/.test(re.peek())){q.tokenize.push(z());break}}I=!I&&D=="\\"}return O}}function _(E,O){return function(G,J){return O&&G.eatSpace(),G.match(E)?J.tokenize.pop():G.skipToEnd(),"string"}}function W(E,O){return E.sol()&&E.match("=end")&&E.eol()&&O.tokenize.pop(),E.skipToEnd(),"comment"}return{startState:function(){return{tokenize:[c],indented:0,context:{type:"top",indented:-g.indentUnit},continuedLine:!1,lastTok:null,varList:!1}},token:function(E,O){T=null,E.sol()&&(O.indented=E.indentation());var G=O.tokenize[O.tokenize.length-1](E,O),J,re=T;if(G=="ident"){var q=E.current();G=O.lastTok=="."?"property":C.propertyIsEnumerable(E.current())?"keyword":/^[A-Z]/.test(q)?"tag":O.lastTok=="def"||O.lastTok=="class"||O.varList?"def":"variable",G=="keyword"&&(re=q,b.propertyIsEnumerable(q)?J="indent":S.propertyIsEnumerable(q)?J="dedent":((q=="if"||q=="unless")&&E.column()==E.indentation()||q=="do"&&O.context.indented{(function(o){typeof Fu=="object"&&typeof Iu=="object"?o(We(),Di()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode("rust",{start:[{regex:/b?"/,token:"string",next:"string"},{regex:/b?r"/,token:"string",next:"string_raw"},{regex:/b?r#+"/,token:"string",next:"string_raw_hash"},{regex:/'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/,token:"string-2"},{regex:/b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/,token:"string-2"},{regex:/(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,token:"number"},{regex:/(let(?:\s+mut)?|fn|enum|mod|struct|type|union)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:["keyword",null,"def"]},{regex:/(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,token:"keyword"},{regex:/\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/,token:"atom"},{regex:/\b(?:true|false|Some|None|Ok|Err)\b/,token:"builtin"},{regex:/\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:["keyword",null,"def"]},{regex:/#!?\[.*\]/,token:"meta"},{regex:/\/\/.*/,token:"comment"},{regex:/\/\*/,token:"comment",next:"comment"},{regex:/[-+\/*=<>!]+/,token:"operator"},{regex:/[a-zA-Z_]\w*!/,token:"variable-3"},{regex:/[a-zA-Z_]\w*/,token:"variable"},{regex:/[\{\[\(]/,indent:!0},{regex:/[\}\]\)]/,dedent:!0}],string:[{regex:/"/,token:"string",next:"start"},{regex:/(?:[^\\"]|\\(?:.|$))*/,token:"string"}],string_raw:[{regex:/"/,token:"string",next:"start"},{regex:/[^"]*/,token:"string"}],string_raw_hash:[{regex:/"#+/,token:"string",next:"start"},{regex:/(?:[^"]|"(?!#))*/,token:"string"}],comment:[{regex:/.*?\*\//,token:"comment",next:"start"},{regex:/.*/,token:"comment"}],meta:{dontIndentStates:["comment"],electricInput:/^\s*\}$/,blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",fold:"brace"}}),o.defineMIME("text/x-rustsrc","rust"),o.defineMIME("text/rust","rust")})});var ea=Ke((Ou,Pu)=>{(function(o){typeof Ou=="object"&&typeof Pu=="object"?o(We(),gn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../css/css"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("sass",function(p){var v=o.mimeModes["text/css"],C=v.propertyKeywords||{},b=v.colorKeywords||{},S=v.valueKeywords||{},s=v.fontProperties||{};function h(q){return new RegExp("^"+q.join("|"))}var g=["true","false","null","auto"],T=new RegExp("^"+g.join("|")),w=["\\(","\\)","=",">","<","==",">=","<=","\\+","-","\\!=","/","\\*","%","and","or","not",";","\\{","\\}",":"],c=h(w),d=/^::?[a-zA-Z_][\w\-]*/,k;function z(q){return!q.peek()||q.match(/\s+$/,!1)}function M(q,I){var D=q.peek();return D===")"?(q.next(),I.tokenizer=J,"operator"):D==="("?(q.next(),q.eatSpace(),"operator"):D==="'"||D==='"'?(I.tokenizer=W(q.next()),"string"):(I.tokenizer=W(")",!1),"string")}function _(q,I){return function(D,Q){return D.sol()&&D.indentation()<=q?(Q.tokenizer=J,J(D,Q)):(I&&D.skipTo("*/")?(D.next(),D.next(),Q.tokenizer=J):D.skipToEnd(),"comment")}}function W(q,I){I==null&&(I=!0);function D(Q,j){var V=Q.next(),y=Q.peek(),K=Q.string.charAt(Q.pos-2),X=V!=="\\"&&y===q||V===q&&K!=="\\";return X?(V!==q&&I&&Q.next(),z(Q)&&(j.cursorHalf=0),j.tokenizer=J,"string"):V==="#"&&y==="{"?(j.tokenizer=E(D),Q.next(),"operator"):"string"}return D}function E(q){return function(I,D){return I.peek()==="}"?(I.next(),D.tokenizer=q,"operator"):J(I,D)}}function O(q){if(q.indentCount==0){q.indentCount++;var I=q.scopes[0].offset,D=I+p.indentUnit;q.scopes.unshift({offset:D})}}function G(q){q.scopes.length!=1&&q.scopes.shift()}function J(q,I){var D=q.peek();if(q.match("/*"))return I.tokenizer=_(q.indentation(),!0),I.tokenizer(q,I);if(q.match("//"))return I.tokenizer=_(q.indentation(),!1),I.tokenizer(q,I);if(q.match("#{"))return I.tokenizer=E(J),"operator";if(D==='"'||D==="'")return q.next(),I.tokenizer=W(D),"string";if(I.cursorHalf){if(D==="#"&&(q.next(),q.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/))||q.match(/^-?[0-9\.]+/))return z(q)&&(I.cursorHalf=0),"number";if(q.match(/^(px|em|in)\b/))return z(q)&&(I.cursorHalf=0),"unit";if(q.match(T))return z(q)&&(I.cursorHalf=0),"keyword";if(q.match(/^url/)&&q.peek()==="(")return I.tokenizer=M,z(q)&&(I.cursorHalf=0),"atom";if(D==="$")return q.next(),q.eatWhile(/[\w-]/),z(q)&&(I.cursorHalf=0),"variable-2";if(D==="!")return q.next(),I.cursorHalf=0,q.match(/^[\w]+/)?"keyword":"operator";if(q.match(c))return z(q)&&(I.cursorHalf=0),"operator";if(q.eatWhile(/[\w-]/))return z(q)&&(I.cursorHalf=0),k=q.current().toLowerCase(),S.hasOwnProperty(k)?"atom":b.hasOwnProperty(k)?"keyword":C.hasOwnProperty(k)?(I.prevProp=q.current().toLowerCase(),"property"):"tag";if(z(q))return I.cursorHalf=0,null}else{if(D==="-"&&q.match(/^-\w+-/))return"meta";if(D==="."){if(q.next(),q.match(/^[\w-]+/))return O(I),"qualifier";if(q.peek()==="#")return O(I),"tag"}if(D==="#"){if(q.next(),q.match(/^[\w-]+/))return O(I),"builtin";if(q.peek()==="#")return O(I),"tag"}if(D==="$")return q.next(),q.eatWhile(/[\w-]/),"variable-2";if(q.match(/^-?[0-9\.]+/))return"number";if(q.match(/^(px|em|in)\b/))return"unit";if(q.match(T))return"keyword";if(q.match(/^url/)&&q.peek()==="(")return I.tokenizer=M,"atom";if(D==="="&&q.match(/^=[\w-]+/))return O(I),"meta";if(D==="+"&&q.match(/^\+[\w-]+/))return"variable-3";if(D==="@"&&q.match("@extend")&&(q.match(/\s*[\w]/)||G(I)),q.match(/^@(else if|if|media|else|for|each|while|mixin|function)/))return O(I),"def";if(D==="@")return q.next(),q.eatWhile(/[\w-]/),"def";if(q.eatWhile(/[\w-]/))if(q.match(/ *: *[\w-\+\$#!\("']/,!1)){k=q.current().toLowerCase();var Q=I.prevProp+"-"+k;return C.hasOwnProperty(Q)?"property":C.hasOwnProperty(k)?(I.prevProp=k,"property"):s.hasOwnProperty(k)?"property":"tag"}else return q.match(/ *:/,!1)?(O(I),I.cursorHalf=1,I.prevProp=q.current().toLowerCase(),"property"):(q.match(/ *,/,!1)||O(I),"tag");if(D===":")return q.match(d)?"variable-3":(q.next(),I.cursorHalf=1,"operator")}return q.match(c)?"operator":(q.next(),null)}function re(q,I){q.sol()&&(I.indentCount=0);var D=I.tokenizer(q,I),Q=q.current();if((Q==="@return"||Q==="}")&&G(I),D!==null){for(var j=q.pos-Q.length,V=j+p.indentUnit*I.indentCount,y=[],K=0;K{(function(o){typeof Bu=="object"&&typeof ju=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("shell",function(){var p={};function v(d,k){for(var z=0;z1&&d.eat("$");var z=d.next();return/['"({]/.test(z)?(k.tokens[0]=h(z,z=="("?"quote":z=="{"?"def":"string"),c(d,k)):(/\d/.test(z)||d.eatWhile(/\w/),k.tokens.shift(),"def")};function w(d){return function(k,z){return k.sol()&&k.string==d&&z.tokens.shift(),k.skipToEnd(),"string-2"}}function c(d,k){return(k.tokens[0]||s)(d,k)}return{startState:function(){return{tokens:[]}},token:function(d,k){return c(d,k)},closeBrackets:"()[]{}''\"\"``",lineComment:"#",fold:"brace"}}),o.defineMIME("text/x-sh","shell"),o.defineMIME("application/x-sh","shell")})});var Uu=Ke((Hu,Wu)=>{(function(o){typeof Hu=="object"&&typeof Wu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("sql",function(g,T){var w=T.client||{},c=T.atoms||{false:!0,true:!0,null:!0},d=T.builtin||s(h),k=T.keywords||s(S),z=T.operatorChars||/^[*+\-%<>!=&|~^\/]/,M=T.support||{},_=T.hooks||{},W=T.dateSQL||{date:!0,time:!0,timestamp:!0},E=T.backslashStringEscapes!==!1,O=T.brackets||/^[\{}\(\)\[\]]/,G=T.punctuation||/^[;.,:]/;function J(Q,j){var V=Q.next();if(_[V]){var y=_[V](Q,j);if(y!==!1)return y}if(M.hexNumber&&(V=="0"&&Q.match(/^[xX][0-9a-fA-F]+/)||(V=="x"||V=="X")&&Q.match(/^'[0-9a-fA-F]*'/)))return"number";if(M.binaryNumber&&((V=="b"||V=="B")&&Q.match(/^'[01]*'/)||V=="0"&&Q.match(/^b[01]+/)))return"number";if(V.charCodeAt(0)>47&&V.charCodeAt(0)<58)return Q.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/),M.decimallessFloat&&Q.match(/^\.(?!\.)/),"number";if(V=="?"&&(Q.eatSpace()||Q.eol()||Q.eat(";")))return"variable-3";if(V=="'"||V=='"'&&M.doubleQuote)return j.tokenize=re(V),j.tokenize(Q,j);if((M.nCharCast&&(V=="n"||V=="N")||M.charsetCast&&V=="_"&&Q.match(/[a-z][a-z0-9]*/i))&&(Q.peek()=="'"||Q.peek()=='"'))return"keyword";if(M.escapeConstant&&(V=="e"||V=="E")&&(Q.peek()=="'"||Q.peek()=='"'&&M.doubleQuote))return j.tokenize=function(X,N){return(N.tokenize=re(X.next(),!0))(X,N)},"keyword";if(M.commentSlashSlash&&V=="/"&&Q.eat("/"))return Q.skipToEnd(),"comment";if(M.commentHash&&V=="#"||V=="-"&&Q.eat("-")&&(!M.commentSpaceRequired||Q.eat(" ")))return Q.skipToEnd(),"comment";if(V=="/"&&Q.eat("*"))return j.tokenize=q(1),j.tokenize(Q,j);if(V=="."){if(M.zerolessFloat&&Q.match(/^(?:\d+(?:e[+-]?\d+)?)/i))return"number";if(Q.match(/^\.+/))return null;if(Q.match(/^[\w\d_$#]+/))return"variable-2"}else{if(z.test(V))return Q.eatWhile(z),"operator";if(O.test(V))return"bracket";if(G.test(V))return Q.eatWhile(G),"punctuation";if(V=="{"&&(Q.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/)||Q.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/)))return"number";Q.eatWhile(/^[_\w\d]/);var K=Q.current().toLowerCase();return W.hasOwnProperty(K)&&(Q.match(/^( )+'[^']*'/)||Q.match(/^( )+"[^"]*"/))?"number":c.hasOwnProperty(K)?"atom":d.hasOwnProperty(K)?"type":k.hasOwnProperty(K)?"keyword":w.hasOwnProperty(K)?"builtin":null}}function re(Q,j){return function(V,y){for(var K=!1,X;(X=V.next())!=null;){if(X==Q&&!K){y.tokenize=J;break}K=(E||j)&&!K&&X=="\\"}return"string"}}function q(Q){return function(j,V){var y=j.match(/^.*?(\/\*|\*\/)/);return y?y[1]=="/*"?V.tokenize=q(Q+1):Q>1?V.tokenize=q(Q-1):V.tokenize=J:j.skipToEnd(),"comment"}}function I(Q,j,V){j.context={prev:j.context,indent:Q.indentation(),col:Q.column(),type:V}}function D(Q){Q.indent=Q.context.indent,Q.context=Q.context.prev}return{startState:function(){return{tokenize:J,context:null}},token:function(Q,j){if(Q.sol()&&j.context&&j.context.align==null&&(j.context.align=!1),j.tokenize==J&&Q.eatSpace())return null;var V=j.tokenize(Q,j);if(V=="comment")return V;j.context&&j.context.align==null&&(j.context.align=!0);var y=Q.current();return y=="("?I(Q,j,")"):y=="["?I(Q,j,"]"):j.context&&j.context.type==y&&D(j),V},indent:function(Q,j){var V=Q.context;if(!V)return o.Pass;var y=j.charAt(0)==V.type;return V.align?V.col+(y?0:1):V.indent+(y?0:g.indentUnit)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:M.commentSlashSlash?"//":M.commentHash?"#":"--",closeBrackets:"()[]{}''\"\"``",config:T}});function p(g){for(var T;(T=g.next())!=null;)if(T=="`"&&!g.eat("`"))return"variable-2";return g.backUp(g.current().length-1),g.eatWhile(/\w/)?"variable-2":null}function v(g){for(var T;(T=g.next())!=null;)if(T=='"'&&!g.eat('"'))return"variable-2";return g.backUp(g.current().length-1),g.eatWhile(/\w/)?"variable-2":null}function C(g){return g.eat("@")&&(g.match("session."),g.match("local."),g.match("global.")),g.eat("'")?(g.match(/^.*'/),"variable-2"):g.eat('"')?(g.match(/^.*"/),"variable-2"):g.eat("`")?(g.match(/^.*`/),"variable-2"):g.match(/^[0-9a-zA-Z$\.\_]+/)?"variable-2":null}function b(g){return g.eat("N")?"atom":g.match(/^[a-zA-Z.#!?]/)?"variable-2":null}var S="alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit ";function s(g){for(var T={},w=g.split(" "),c=0;c!=^\&|\/]/,brackets:/^[\{}\(\)]/,punctuation:/^[;.,:/]/,backslashStringEscapes:!1,dateSQL:s("date datetimeoffset datetime2 smalldatetime datetime time"),hooks:{"@":C}}),o.defineMIME("text/x-mysql",{name:"sql",client:s("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:s(S+"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":C,"`":p,"\\":b}}),o.defineMIME("text/x-mariadb",{name:"sql",client:s("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:s(S+"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":C,"`":p,"\\":b}}),o.defineMIME("text/x-sqlite",{name:"sql",client:s("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"),keywords:s(S+"abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"),atoms:s("null current_date current_time current_timestamp"),operatorChars:/^[*+\-%<>!=&|/~]/,dateSQL:s("date time timestamp datetime"),support:s("decimallessFloat zerolessFloat"),identifierQuote:'"',hooks:{"@":C,":":C,"?":C,$:C,'"':v,"`":p}}),o.defineMIME("text/x-cassandra",{name:"sql",client:{},keywords:s("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"),builtin:s("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"),atoms:s("false true infinity NaN"),operatorChars:/^[<>=]/,dateSQL:{},support:s("commentSlashSlash decimallessFloat"),hooks:{}}),o.defineMIME("text/x-plsql",{name:"sql",client:s("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),keywords:s("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),builtin:s("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),operatorChars:/^[*\/+\-%<>!=~]/,dateSQL:s("date time timestamp"),support:s("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")}),o.defineMIME("text/x-hive",{name:"sql",keywords:s("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"),builtin:s("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:s("date timestamp"),support:s("doubleQuote binaryNumber hexNumber")}),o.defineMIME("text/x-pgsql",{name:"sql",client:s("source"),keywords:s(S+"a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"),builtin:s("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time zone timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),atoms:s("false true null unknown"),operatorChars:/^[*\/+\-%<>!=&|^\/#@?~]/,backslashStringEscapes:!1,identifierQuote:'"',hooks:{'"':v},dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant")}),o.defineMIME("text/x-gql",{name:"sql",keywords:s("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"),atoms:s("false true"),builtin:s("blob datetime first key __key__ string integer double boolean null"),operatorChars:/^[*+\-%<>!=]/}),o.defineMIME("text/x-gpsql",{name:"sql",client:s("source"),keywords:s("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"),builtin:s("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^\/#@?~]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast")}),o.defineMIME("text/x-sparksql",{name:"sql",keywords:s("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"),builtin:s("abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with"),atoms:s("false true null"),operatorChars:/^[*\/+\-%<>!=~&|^]/,dateSQL:s("date time timestamp"),support:s("doubleQuote zerolessFloat")}),o.defineMIME("text/x-esper",{name:"sql",client:s("source"),keywords:s("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"),builtin:{},atoms:s("false true null"),operatorChars:/^[*+\-%<>!=&|^\/#@?~]/,dateSQL:s("time"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber")}),o.defineMIME("text/x-trino",{name:"sql",keywords:s("abs absent acos add admin after all all_match alter analyze and any any_match approx_distinct approx_most_frequent approx_percentile approx_set arbitrary array_agg array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_sort array_union arrays_overlap as asc asin at at_timezone atan atan2 authorization avg bar bernoulli beta_cdf between bing_tile bing_tile_at bing_tile_coordinates bing_tile_polygon bing_tile_quadkey bing_tile_zoom_level bing_tiles_around bit_count bitwise_and bitwise_and_agg bitwise_left_shift bitwise_not bitwise_or bitwise_or_agg bitwise_right_shift bitwise_right_shift_arithmetic bitwise_xor bool_and bool_or both by call cardinality cascade case cast catalogs cbrt ceil ceiling char2hexint checksum chr classify coalesce codepoint column columns combinations comment commit committed concat concat_ws conditional constraint contains contains_sequence convex_hull_agg copartition corr cos cosh cosine_similarity count count_if covar_pop covar_samp crc32 create cross cube cume_dist current current_catalog current_date current_groups current_path current_role current_schema current_time current_timestamp current_timezone current_user data date_add date_diff date_format date_parse date_trunc day day_of_month day_of_week day_of_year deallocate default define definer degrees delete dense_rank deny desc describe descriptor distinct distributed dow doy drop e element_at else empty empty_approx_set encoding end error escape evaluate_classifier_predictions every except excluding execute exists exp explain extract false features fetch filter final first first_value flatten floor following for format format_datetime format_number from from_base from_base32 from_base64 from_base64url from_big_endian_32 from_big_endian_64 from_encoded_polyline from_geojson_geometry from_hex from_ieee754_32 from_ieee754_64 from_iso8601_date from_iso8601_timestamp from_iso8601_timestamp_nanos from_unixtime from_unixtime_nanos from_utf8 full functions geometric_mean geometry_from_hadoop_shape geometry_invalid_reason geometry_nearest_points geometry_to_bing_tiles geometry_union geometry_union_agg grant granted grants graphviz great_circle_distance greatest group grouping groups hamming_distance hash_counts having histogram hmac_md5 hmac_sha1 hmac_sha256 hmac_sha512 hour human_readable_seconds if ignore in including index infinity initial inner input insert intersect intersection_cardinality into inverse_beta_cdf inverse_normal_cdf invoker io is is_finite is_infinite is_json_scalar is_nan isolation jaccard_index join json_array json_array_contains json_array_get json_array_length json_exists json_extract json_extract_scalar json_format json_object json_parse json_query json_size json_value keep key keys kurtosis lag last last_day_of_month last_value lateral lead leading learn_classifier learn_libsvm_classifier learn_libsvm_regressor learn_regressor least left length level levenshtein_distance like limit line_interpolate_point line_interpolate_points line_locate_point listagg ln local localtime localtimestamp log log10 log2 logical lower lpad ltrim luhn_check make_set_digest map_agg map_concat map_entries map_filter map_from_entries map_keys map_union map_values map_zip_with match match_recognize matched matches materialized max max_by md5 measures merge merge_set_digest millisecond min min_by minute mod month multimap_agg multimap_from_entries murmur3 nan natural next nfc nfd nfkc nfkd ngrams no none none_match normal_cdf normalize not now nth_value ntile null nullif nulls numeric_histogram object objectid_timestamp of offset omit on one only option or order ordinality outer output over overflow parse_data_size parse_datetime parse_duration partition partitions passing past path pattern per percent_rank permute pi position pow power preceding prepare privileges properties prune qdigest_agg quarter quotes radians rand random range rank read recursive reduce reduce_agg refresh regexp_count regexp_extract regexp_extract_all regexp_like regexp_position regexp_replace regexp_split regr_intercept regr_slope regress rename render repeat repeatable replace reset respect restrict returning reverse revoke rgb right role roles rollback rollup round row_number rows rpad rtrim running scalar schema schemas second security seek select sequence serializable session set sets sha1 sha256 sha512 show shuffle sign simplify_geometry sin skewness skip slice some soundex spatial_partitioning spatial_partitions split split_part split_to_map split_to_multimap spooky_hash_v2_32 spooky_hash_v2_64 sqrt st_area st_asbinary st_astext st_boundary st_buffer st_centroid st_contains st_convexhull st_coorddim st_crosses st_difference st_dimension st_disjoint st_distance st_endpoint st_envelope st_envelopeaspts st_equals st_exteriorring st_geometries st_geometryfromtext st_geometryn st_geometrytype st_geomfrombinary st_interiorringn st_interiorrings st_intersection st_intersects st_isclosed st_isempty st_isring st_issimple st_isvalid st_length st_linefromtext st_linestring st_multipoint st_numgeometries st_numinteriorring st_numpoints st_overlaps st_point st_pointn st_points st_polygon st_relate st_startpoint st_symdifference st_touches st_union st_within st_x st_xmax st_xmin st_y st_ymax st_ymin start starts_with stats stddev stddev_pop stddev_samp string strpos subset substr substring sum system table tables tablesample tan tanh tdigest_agg text then ties timestamp_objectid timezone_hour timezone_minute to to_base to_base32 to_base64 to_base64url to_big_endian_32 to_big_endian_64 to_char to_date to_encoded_polyline to_geojson_geometry to_geometry to_hex to_ieee754_32 to_ieee754_64 to_iso8601 to_milliseconds to_spherical_geography to_timestamp to_unixtime to_utf8 trailing transaction transform transform_keys transform_values translate trim trim_array true truncate try try_cast type typeof uescape unbounded uncommitted unconditional union unique unknown unmatched unnest update upper url_decode url_encode url_extract_fragment url_extract_host url_extract_parameter url_extract_path url_extract_port url_extract_protocol url_extract_query use user using utf16 utf32 utf8 validate value value_at_quantile values values_at_quantiles var_pop var_samp variance verbose version view week week_of_year when where width_bucket wilson_interval_lower wilson_interval_upper window with with_timezone within without word_stem work wrapper write xxhash64 year year_of_week yow zip zip_with"),builtin:s("array bigint bingtile boolean char codepoints color date decimal double function geometry hyperloglog int integer interval ipaddress joniregexp json json2016 jsonpath kdbtree likepattern map model objectid p4hyperloglog precision qdigest re2jregexp real regressor row setdigest smallint sphericalgeography tdigest time timestamp tinyint uuid varbinary varchar zone"),atoms:s("false true null unknown"),operatorChars:/^[[\]|<>=!\-+*/%]/,dateSQL:s("date time timestamp zone"),support:s("decimallessFloat zerolessFloat hexNumber")})})});var ta=Ke(($u,Ku)=>{(function(o){typeof $u=="object"&&typeof Ku=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("stylus",function(E){for(var O=E.indentUnit,G="",J=_(p),re=/^(a|b|i|s|col|em)$/i,q=_(S),I=_(s),D=_(T),Q=_(g),j=_(v),V=M(v),y=_(b),K=_(C),X=_(h),N=/^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/,R=M(w),le=_(c),xe=new RegExp(/^\-(moz|ms|o|webkit)-/i),F=_(d),L="",de={},ze,pe,Ee,ge;G.length|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/),H.context.line.firstWord=L?L[0].replace(/^\s*/,""):"",H.context.line.indent=$.indentation(),ze=$.peek(),$.match("//"))return $.skipToEnd(),["comment","comment"];if($.match("/*"))return H.tokenize=qe,qe($,H);if(ze=='"'||ze=="'")return $.next(),H.tokenize=Se(ze),H.tokenize($,H);if(ze=="@")return $.next(),$.eatWhile(/[\w\\-]/),["def",$.current()];if(ze=="#"){if($.next(),$.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\b(?!-)/i))return["atom","atom"];if($.match(/^[a-z][\w-]*/i))return["builtin","hash"]}return $.match(xe)?["meta","vendor-prefixes"]:$.match(/^-?[0-9]?\.?[0-9]/)?($.eatWhile(/[a-z%]/i),["number","unit"]):ze=="!"?($.next(),[$.match(/^(important|optional)/i)?"keyword":"operator","important"]):ze=="."&&$.match(/^\.[a-z][\w-]*/i)?["qualifier","qualifier"]:$.match(V)?($.peek()=="("&&(H.tokenize=Be),["property","word"]):$.match(/^[a-z][\w-]*\(/i)?($.backUp(1),["keyword","mixin"]):$.match(/^(\+|-)[a-z][\w-]*\(/i)?($.backUp(1),["keyword","block-mixin"]):$.string.match(/^\s*&/)&&$.match(/^[-_]+[a-z][\w-]*/)?["qualifier","qualifier"]:$.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)?($.backUp(1),["variable-3","reference"]):$.match(/^&{1}\s*$/)?["variable-3","reference"]:$.match(R)?["operator","operator"]:$.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)?$.match(/^(\.|\[)[\w-\'\"\]]+/i,!1)&&!U($.current())?($.match("."),["variable-2","variable-name"]):["variable-2","word"]:$.match(N)?["operator",$.current()]:/[:;,{}\[\]\(\)]/.test(ze)?($.next(),[null,ze]):($.next(),[null,null])}function qe($,H){for(var se=!1,De;(De=$.next())!=null;){if(se&&De=="/"){H.tokenize=null;break}se=De=="*"}return["comment","comment"]}function Se($){return function(H,se){for(var De=!1,nt;(nt=H.next())!=null;){if(nt==$&&!De){$==")"&&H.backUp(1);break}De=!De&&nt=="\\"}return(nt==$||!De&&$!=")")&&(se.tokenize=null),["string","string"]}}function Be($,H){return $.next(),$.match(/\s*[\"\')]/,!1)?H.tokenize=null:H.tokenize=Se(")"),[null,"("]}function Ze($,H,se,De){this.type=$,this.indent=H,this.prev=se,this.line=De||{firstWord:"",indent:0}}function ke($,H,se,De){return De=De>=0?De:O,$.context=new Ze(se,H.indentation()+De,$.context),se}function Je($,H){var se=$.context.indent-O;return H=H||!1,$.context=$.context.prev,H&&($.context.indent=se),$.context.type}function Re($,H,se){return de[se.context.type]($,H,se)}function Ge($,H,se,De){for(var nt=De||1;nt>0;nt--)se.context=se.context.prev;return Re($,H,se)}function U($){return $.toLowerCase()in J}function Z($){return $=$.toLowerCase(),$ in q||$ in X}function ce($){return $.toLowerCase()in le}function He($){return $.toLowerCase().match(xe)}function te($){var H=$.toLowerCase(),se="variable-2";return U($)?se="tag":ce($)?se="block-keyword":Z($)?se="property":H in D||H in F?se="atom":H=="return"||H in Q?se="keyword":$.match(/^[A-Z]/)&&(se="string"),se}function fe($,H){return Me(H)&&($=="{"||$=="]"||$=="hash"||$=="qualifier")||$=="block-mixin"}function oe($,H){return $=="{"&&H.match(/^\s*\$?[\w-]+/i,!1)}function Ue($,H){return $==":"&&H.match(/^[a-z-]+/,!1)}function we($){return $.sol()||$.string.match(new RegExp("^\\s*"+W($.current())))}function Me($){return $.eol()||$.match(/^\s*$/,!1)}function Le($){var H=/^\s*[-_]*[a-z0-9]+[\w-]*/i,se=typeof $=="string"?$.match(H):$.string.match(H);return se?se[0].replace(/^\s*/,""):""}return de.block=function($,H,se){if($=="comment"&&we(H)||$==","&&Me(H)||$=="mixin")return ke(se,H,"block",0);if(oe($,H))return ke(se,H,"interpolation");if(Me(H)&&$=="]"&&!/^\s*(\.|#|:|\[|\*|&)/.test(H.string)&&!U(Le(H)))return ke(se,H,"block",0);if(fe($,H))return ke(se,H,"block");if($=="}"&&Me(H))return ke(se,H,"block",0);if($=="variable-name")return H.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)||ce(Le(H))?ke(se,H,"variableName"):ke(se,H,"variableName",0);if($=="=")return!Me(H)&&!ce(Le(H))?ke(se,H,"block",0):ke(se,H,"block");if($=="*"&&(Me(H)||H.match(/\s*(,|\.|#|\[|:|{)/,!1)))return ge="tag",ke(se,H,"block");if(Ue($,H))return ke(se,H,"pseudo");if(/@(font-face|media|supports|(-moz-)?document)/.test($))return ke(se,H,Me(H)?"block":"atBlock");if(/@(-(moz|ms|o|webkit)-)?keyframes$/.test($))return ke(se,H,"keyframes");if(/@extends?/.test($))return ke(se,H,"extend",0);if($&&$.charAt(0)=="@")return H.indentation()>0&&Z(H.current().slice(1))?(ge="variable-2","block"):/(@import|@require|@charset)/.test($)?ke(se,H,"block",0):ke(se,H,"block");if($=="reference"&&Me(H))return ke(se,H,"block");if($=="(")return ke(se,H,"parens");if($=="vendor-prefixes")return ke(se,H,"vendorPrefixes");if($=="word"){var De=H.current();if(ge=te(De),ge=="property")return we(H)?ke(se,H,"block",0):(ge="atom","block");if(ge=="tag"){if(/embed|menu|pre|progress|sub|table/.test(De)&&Z(Le(H))||H.string.match(new RegExp("\\[\\s*"+De+"|"+De+"\\s*\\]")))return ge="atom","block";if(re.test(De)&&(we(H)&&H.string.match(/=/)||!we(H)&&!H.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/)&&!U(Le(H))))return ge="variable-2",ce(Le(H))?"block":ke(se,H,"block",0);if(Me(H))return ke(se,H,"block")}if(ge=="block-keyword")return ge="keyword",H.current(/(if|unless)/)&&!we(H)?"block":ke(se,H,"block");if(De=="return")return ke(se,H,"block",0);if(ge=="variable-2"&&H.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/))return ke(se,H,"block")}return se.context.type},de.parens=function($,H,se){if($=="(")return ke(se,H,"parens");if($==")")return se.context.prev.type=="parens"?Je(se):H.string.match(/^[a-z][\w-]*\(/i)&&Me(H)||ce(Le(H))||/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(Le(H))||!H.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/)&&U(Le(H))?ke(se,H,"block"):H.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/)||H.string.match(/^\s*(\(|\)|[0-9])/)||H.string.match(/^\s+[a-z][\w-]*\(/i)||H.string.match(/^\s+[\$-]?[a-z]/i)?ke(se,H,"block",0):Me(H)?ke(se,H,"block"):ke(se,H,"block",0);if($&&$.charAt(0)=="@"&&Z(H.current().slice(1))&&(ge="variable-2"),$=="word"){var De=H.current();ge=te(De),ge=="tag"&&re.test(De)&&(ge="variable-2"),(ge=="property"||De=="to")&&(ge="atom")}return $=="variable-name"?ke(se,H,"variableName"):Ue($,H)?ke(se,H,"pseudo"):se.context.type},de.vendorPrefixes=function($,H,se){return $=="word"?(ge="property",ke(se,H,"block",0)):Je(se)},de.pseudo=function($,H,se){return Z(Le(H.string))?Ge($,H,se):(H.match(/^[a-z-]+/),ge="variable-3",Me(H)?ke(se,H,"block"):Je(se))},de.atBlock=function($,H,se){if($=="(")return ke(se,H,"atBlock_parens");if(fe($,H))return ke(se,H,"block");if(oe($,H))return ke(se,H,"interpolation");if($=="word"){var De=H.current().toLowerCase();if(/^(only|not|and|or)$/.test(De)?ge="keyword":j.hasOwnProperty(De)?ge="tag":K.hasOwnProperty(De)?ge="attribute":y.hasOwnProperty(De)?ge="property":I.hasOwnProperty(De)?ge="string-2":ge=te(H.current()),ge=="tag"&&Me(H))return ke(se,H,"block")}return $=="operator"&&/^(not|and|or)$/.test(H.current())&&(ge="keyword"),se.context.type},de.atBlock_parens=function($,H,se){if($=="{"||$=="}")return se.context.type;if($==")")return Me(H)?ke(se,H,"block"):ke(se,H,"atBlock");if($=="word"){var De=H.current().toLowerCase();return ge=te(De),/^(max|min)/.test(De)&&(ge="property"),ge=="tag"&&(re.test(De)?ge="variable-2":ge="atom"),se.context.type}return de.atBlock($,H,se)},de.keyframes=function($,H,se){return H.indentation()=="0"&&($=="}"&&we(H)||$=="]"||$=="hash"||$=="qualifier"||U(H.current()))?Ge($,H,se):$=="{"?ke(se,H,"keyframes"):$=="}"?we(H)?Je(se,!0):ke(se,H,"keyframes"):$=="unit"&&/^[0-9]+\%$/.test(H.current())?ke(se,H,"keyframes"):$=="word"&&(ge=te(H.current()),ge=="block-keyword")?(ge="keyword",ke(se,H,"keyframes")):/@(font-face|media|supports|(-moz-)?document)/.test($)?ke(se,H,Me(H)?"block":"atBlock"):$=="mixin"?ke(se,H,"block",0):se.context.type},de.interpolation=function($,H,se){return $=="{"&&Je(se)&&ke(se,H,"block"),$=="}"?H.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i)||H.string.match(/^\s*[a-z]/i)&&U(Le(H))?ke(se,H,"block"):!H.string.match(/^(\{|\s*\&)/)||H.match(/\s*[\w-]/,!1)?ke(se,H,"block",0):ke(se,H,"block"):$=="variable-name"?ke(se,H,"variableName",0):($=="word"&&(ge=te(H.current()),ge=="tag"&&(ge="atom")),se.context.type)},de.extend=function($,H,se){return $=="["||$=="="?"extend":$=="]"?Je(se):$=="word"?(ge=te(H.current()),"extend"):Je(se)},de.variableName=function($,H,se){return $=="string"||$=="["||$=="]"||H.current().match(/^(\.|\$)/)?(H.current().match(/^\.[\w-]+/i)&&(ge="variable-2"),"variableName"):Ge($,H,se)},{startState:function($){return{tokenize:null,state:"block",context:new Ze("block",$||0,null)}},token:function($,H){return!H.tokenize&&$.eatSpace()?null:(pe=(H.tokenize||Oe)($,H),pe&&typeof pe=="object"&&(Ee=pe[1],pe=pe[0]),ge=pe,H.state=de[H.state](Ee,$,H),ge)},indent:function($,H,se){var De=$.context,nt=H&&H.charAt(0),dt=De.indent,Pt=Le(H),Ft=se.match(/^\s*/)[0].replace(/\t/g,G).length,Pe=$.context.prev?$.context.prev.line.firstWord:"",xt=$.context.prev?$.context.prev.line.indent:Ft;return De.prev&&(nt=="}"&&(De.type=="block"||De.type=="atBlock"||De.type=="keyframes")||nt==")"&&(De.type=="parens"||De.type=="atBlock_parens")||nt=="{"&&De.type=="at")?dt=De.indent-O:/(\})/.test(nt)||(/@|\$|\d/.test(nt)||/^\{/.test(H)||/^\s*\/(\/|\*)/.test(H)||/^\s*\/\*/.test(Pe)||/^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(H)||/^(\+|-)?[a-z][\w-]*\(/i.test(H)||/^return/.test(H)||ce(Pt)?dt=Ft:/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(nt)||U(Pt)?/\,\s*$/.test(Pe)?dt=xt:/^\s+/.test(se)&&(/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(Pe)||U(Pe))?dt=Ft<=xt?xt:xt+O:dt=Ft:!/,\s*$/.test(se)&&(He(Pt)||Z(Pt))&&(ce(Pe)?dt=Ft<=xt?xt:xt+O:/^\{/.test(Pe)?dt=Ft<=xt?Ft:xt+O:He(Pe)||Z(Pe)?dt=Ft>=xt?xt:Ft:/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(Pe)||/=\s*$/.test(Pe)||U(Pe)||/^\$[\w-\.\[\]\'\"]/.test(Pe)?dt=xt+O:dt=Ft)),dt},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:"//",fold:"indent"}});var p=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","bgsound","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","var","video"],v=["domain","regexp","url-prefix","url"],C=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],b=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","dynamic-range","video-dynamic-range"],S=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"],s=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],h=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],g=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],T=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","conic-gradient","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","high","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-play-button","media-slider","media-sliderthumb","media-volume-slider","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","standard","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around","unset"],w=["in","and","or","not","is not","is a","is","isnt","defined","if unless"],c=["for","if","else","unless","from","to"],d=["null","true","false","href","title","type","not-allowed","readonly","disabled"],k=["@font-face","@keyframes","@media","@viewport","@page","@host","@supports","@block","@css"],z=p.concat(v,C,b,S,s,g,T,h,w,c,d,k);function M(E){return E=E.sort(function(O,G){return G>O}),new RegExp("^(("+E.join(")|(")+"))\\b")}function _(E){for(var O={},G=0;G{(function(o){typeof Gu=="object"&&typeof Zu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(q){for(var I={},D=0;D~^?!",h=":;,.(){}[]",g=/^\-?0b[01][01_]*/,T=/^\-?0o[0-7][0-7_]*/,w=/^\-?0x[\dA-Fa-f][\dA-Fa-f_]*(?:(?:\.[\dA-Fa-f][\dA-Fa-f_]*)?[Pp]\-?\d[\d_]*)?/,c=/^\-?\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee]\-?\d[\d_]*)?/,d=/^\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1/,k=/^\.(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/,z=/^\#[A-Za-z]+/,M=/^@(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/;function _(q,I,D){if(q.sol()&&(I.indented=q.indentation()),q.eatSpace())return null;var Q=q.peek();if(Q=="/"){if(q.match("//"))return q.skipToEnd(),"comment";if(q.match("/*"))return I.tokenize.push(O),O(q,I)}if(q.match(z))return"builtin";if(q.match(M))return"attribute";if(q.match(g)||q.match(T)||q.match(w)||q.match(c))return"number";if(q.match(k))return"property";if(s.indexOf(Q)>-1)return q.next(),"operator";if(h.indexOf(Q)>-1)return q.next(),q.match(".."),"punctuation";var j;if(j=q.match(/("""|"|')/)){var V=E.bind(null,j[0]);return I.tokenize.push(V),V(q,I)}if(q.match(d)){var y=q.current();return S.hasOwnProperty(y)?"variable-2":b.hasOwnProperty(y)?"atom":v.hasOwnProperty(y)?(C.hasOwnProperty(y)&&(I.prev="define"),"keyword"):D=="define"?"def":"variable"}return q.next(),null}function W(){var q=0;return function(I,D,Q){var j=_(I,D,Q);if(j=="punctuation"){if(I.current()=="(")++q;else if(I.current()==")"){if(q==0)return I.backUp(1),D.tokenize.pop(),D.tokenize[D.tokenize.length-1](I,D);--q}}return j}}function E(q,I,D){for(var Q=q.length==1,j,V=!1;j=I.peek();)if(V){if(I.next(),j=="(")return D.tokenize.push(W()),"string";V=!1}else{if(I.match(q))return D.tokenize.pop(),"string";I.next(),V=j=="\\"}return Q&&D.tokenize.pop(),"string"}function O(q,I){for(var D;D=q.next();)if(D==="/"&&q.eat("*"))I.tokenize.push(O);else if(D==="*"&&q.eat("/")){I.tokenize.pop();break}return"comment"}function G(q,I,D){this.prev=q,this.align=I,this.indented=D}function J(q,I){var D=I.match(/^\s*($|\/[\/\*])/,!1)?null:I.column()+1;q.context=new G(q.context,D,q.indented)}function re(q){q.context&&(q.indented=q.context.indented,q.context=q.context.prev)}o.defineMode("swift",function(q){return{startState:function(){return{prev:null,context:null,indented:0,tokenize:[]}},token:function(I,D){var Q=D.prev;D.prev=null;var j=D.tokenize[D.tokenize.length-1]||_,V=j(I,D,Q);if(!V||V=="comment"?D.prev=Q:D.prev||(D.prev=V),V=="punctuation"){var y=/[\(\[\{]|([\]\)\}])/.exec(I.current());y&&(y[1]?re:J)(D,I)}return V},indent:function(I,D){var Q=I.context;if(!Q)return 0;var j=/^[\]\}\)]/.test(D);return Q.align!=null?Q.align-(j?1:0):Q.indented+(j?0:q.indentUnit)},electricInput:/^\s*[\)\}\]]$/,lineComment:"//",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace",closeBrackets:"()[]{}''\"\"``"}}),o.defineMIME("text/x-swift","swift")})});var Vu=Ke((Yu,Qu)=>{(function(o){typeof Yu=="object"&&typeof Qu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("coffeescript",function(p,v){var C="error";function b(I){return new RegExp("^(("+I.join(")|(")+"))\\b")}var S=/^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/,s=/^(?:[()\[\]{},:`=;]|\.\.?\.?)/,h=/^[_A-Za-z$][_A-Za-z$0-9]*/,g=/^@[_A-Za-z$][_A-Za-z$0-9]*/,T=b(["and","or","not","is","isnt","in","instanceof","typeof"]),w=["for","while","loop","if","unless","else","switch","try","catch","finally","class"],c=["break","by","continue","debugger","delete","do","in","of","new","return","then","this","@","throw","when","until","extends"],d=b(w.concat(c));w=b(w);var k=/^('{3}|\"{3}|['\"])/,z=/^(\/{3}|\/)/,M=["Infinity","NaN","undefined","null","true","false","on","off","yes","no"],_=b(M);function W(I,D){if(I.sol()){D.scope.align===null&&(D.scope.align=!1);var Q=D.scope.offset;if(I.eatSpace()){var j=I.indentation();return j>Q&&D.scope.type=="coffee"?"indent":j0&&J(I,D)}if(I.eatSpace())return null;var V=I.peek();if(I.match("####"))return I.skipToEnd(),"comment";if(I.match("###"))return D.tokenize=O,D.tokenize(I,D);if(V==="#")return I.skipToEnd(),"comment";if(I.match(/^-?[0-9\.]/,!1)){var y=!1;if(I.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)&&(y=!0),I.match(/^-?\d+\.\d*/)&&(y=!0),I.match(/^-?\.\d+/)&&(y=!0),y)return I.peek()=="."&&I.backUp(1),"number";var K=!1;if(I.match(/^-?0x[0-9a-f]+/i)&&(K=!0),I.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)&&(K=!0),I.match(/^-?0(?![\dx])/i)&&(K=!0),K)return"number"}if(I.match(k))return D.tokenize=E(I.current(),!1,"string"),D.tokenize(I,D);if(I.match(z)){if(I.current()!="/"||I.match(/^.*\//,!1))return D.tokenize=E(I.current(),!0,"string-2"),D.tokenize(I,D);I.backUp(1)}return I.match(S)||I.match(T)?"operator":I.match(s)?"punctuation":I.match(_)?"atom":I.match(g)||D.prop&&I.match(h)?"property":I.match(d)?"keyword":I.match(h)?"variable":(I.next(),C)}function E(I,D,Q){return function(j,V){for(;!j.eol();)if(j.eatWhile(/[^'"\/\\]/),j.eat("\\")){if(j.next(),D&&j.eol())return Q}else{if(j.match(I))return V.tokenize=W,Q;j.eat(/['"\/]/)}return D&&(v.singleLineStringErrors?Q=C:V.tokenize=W),Q}}function O(I,D){for(;!I.eol();){if(I.eatWhile(/[^#]/),I.match("###")){D.tokenize=W;break}I.eatWhile("#")}return"comment"}function G(I,D,Q){Q=Q||"coffee";for(var j=0,V=!1,y=null,K=D.scope;K;K=K.prev)if(K.type==="coffee"||K.type=="}"){j=K.offset+p.indentUnit;break}Q!=="coffee"?(V=null,y=I.column()+I.current().length):D.scope.align&&(D.scope.align=!1),D.scope={offset:j,type:Q,prev:D.scope,align:V,alignOffset:y}}function J(I,D){if(D.scope.prev)if(D.scope.type==="coffee"){for(var Q=I.indentation(),j=!1,V=D.scope;V;V=V.prev)if(Q===V.offset){j=!0;break}if(!j)return!0;for(;D.scope.prev&&D.scope.offset!==Q;)D.scope=D.scope.prev;return!1}else return D.scope=D.scope.prev,!1}function re(I,D){var Q=D.tokenize(I,D),j=I.current();j==="return"&&(D.dedent=!0),((j==="->"||j==="=>")&&I.eol()||Q==="indent")&&G(I,D);var V="[({".indexOf(j);if(V!==-1&&G(I,D,"])}".slice(V,V+1)),w.exec(j)&&G(I,D),j=="then"&&J(I,D),Q==="dedent"&&J(I,D))return C;if(V="])}".indexOf(j),V!==-1){for(;D.scope.type=="coffee"&&D.scope.prev;)D.scope=D.scope.prev;D.scope.type==j&&(D.scope=D.scope.prev)}return D.dedent&&I.eol()&&(D.scope.type=="coffee"&&D.scope.prev&&(D.scope=D.scope.prev),D.dedent=!1),Q}var q={startState:function(I){return{tokenize:W,scope:{offset:I||0,type:"coffee",prev:null,align:!1},prop:!1,dedent:0}},token:function(I,D){var Q=D.scope.align===null&&D.scope;Q&&I.sol()&&(Q.align=!1);var j=re(I,D);return j&&j!="comment"&&(Q&&(Q.align=!0),D.prop=j=="punctuation"&&I.current()=="."),j},indent:function(I,D){if(I.tokenize!=W)return 0;var Q=I.scope,j=D&&"])}".indexOf(D.charAt(0))>-1;if(j)for(;Q.type=="coffee"&&Q.prev;)Q=Q.prev;var V=j&&Q.type===D.charAt(0);return Q.align?Q.alignOffset-(V?1:0):(V?Q.prev:Q).offset},lineComment:"#",fold:"indent"};return q}),o.defineMIME("application/vnd.coffeescript","coffeescript"),o.defineMIME("text/x-coffeescript","coffeescript"),o.defineMIME("text/coffeescript","coffeescript")})});var tc=Ke((Ju,ec)=>{(function(o){typeof Ju=="object"&&typeof ec=="object"?o(We(),vn(),gn(),Qn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../javascript/javascript","../css/css","../htmlmixed/htmlmixed"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("pug",function(p){var v="keyword",C="meta",b="builtin",S="qualifier",s={"{":"}","(":")","[":"]"},h=o.getMode(p,"javascript");function g(){this.javaScriptLine=!1,this.javaScriptLineExcludesColon=!1,this.javaScriptArguments=!1,this.javaScriptArgumentsDepth=0,this.isInterpolating=!1,this.interpolationNesting=0,this.jsState=o.startState(h),this.restOfLine="",this.isIncludeFiltered=!1,this.isEach=!1,this.lastTag="",this.scriptType="",this.isAttrs=!1,this.attrsNest=[],this.inAttributeName=!0,this.attributeIsType=!1,this.attrValue="",this.indentOf=1/0,this.indentToken="",this.innerMode=null,this.innerState=null,this.innerModeForLine=!1}g.prototype.copy=function(){var U=new g;return U.javaScriptLine=this.javaScriptLine,U.javaScriptLineExcludesColon=this.javaScriptLineExcludesColon,U.javaScriptArguments=this.javaScriptArguments,U.javaScriptArgumentsDepth=this.javaScriptArgumentsDepth,U.isInterpolating=this.isInterpolating,U.interpolationNesting=this.interpolationNesting,U.jsState=o.copyState(h,this.jsState),U.innerMode=this.innerMode,this.innerMode&&this.innerState&&(U.innerState=o.copyState(this.innerMode,this.innerState)),U.restOfLine=this.restOfLine,U.isIncludeFiltered=this.isIncludeFiltered,U.isEach=this.isEach,U.lastTag=this.lastTag,U.scriptType=this.scriptType,U.isAttrs=this.isAttrs,U.attrsNest=this.attrsNest.slice(),U.inAttributeName=this.inAttributeName,U.attributeIsType=this.attributeIsType,U.attrValue=this.attrValue,U.indentOf=this.indentOf,U.indentToken=this.indentToken,U.innerModeForLine=this.innerModeForLine,U};function T(U,Z){if(U.sol()&&(Z.javaScriptLine=!1,Z.javaScriptLineExcludesColon=!1),Z.javaScriptLine){if(Z.javaScriptLineExcludesColon&&U.peek()===":"){Z.javaScriptLine=!1,Z.javaScriptLineExcludesColon=!1;return}var ce=h.token(U,Z.jsState);return U.eol()&&(Z.javaScriptLine=!1),ce||!0}}function w(U,Z){if(Z.javaScriptArguments){if(Z.javaScriptArgumentsDepth===0&&U.peek()!=="("){Z.javaScriptArguments=!1;return}if(U.peek()==="("?Z.javaScriptArgumentsDepth++:U.peek()===")"&&Z.javaScriptArgumentsDepth--,Z.javaScriptArgumentsDepth===0){Z.javaScriptArguments=!1;return}var ce=h.token(U,Z.jsState);return ce||!0}}function c(U){if(U.match(/^yield\b/))return"keyword"}function d(U){if(U.match(/^(?:doctype) *([^\n]+)?/))return C}function k(U,Z){if(U.match("#{"))return Z.isInterpolating=!0,Z.interpolationNesting=0,"punctuation"}function z(U,Z){if(Z.isInterpolating){if(U.peek()==="}"){if(Z.interpolationNesting--,Z.interpolationNesting<0)return U.next(),Z.isInterpolating=!1,"punctuation"}else U.peek()==="{"&&Z.interpolationNesting++;return h.token(U,Z.jsState)||!0}}function M(U,Z){if(U.match(/^case\b/))return Z.javaScriptLine=!0,v}function _(U,Z){if(U.match(/^when\b/))return Z.javaScriptLine=!0,Z.javaScriptLineExcludesColon=!0,v}function W(U){if(U.match(/^default\b/))return v}function E(U,Z){if(U.match(/^extends?\b/))return Z.restOfLine="string",v}function O(U,Z){if(U.match(/^append\b/))return Z.restOfLine="variable",v}function G(U,Z){if(U.match(/^prepend\b/))return Z.restOfLine="variable",v}function J(U,Z){if(U.match(/^block\b *(?:(prepend|append)\b)?/))return Z.restOfLine="variable",v}function re(U,Z){if(U.match(/^include\b/))return Z.restOfLine="string",v}function q(U,Z){if(U.match(/^include:([a-zA-Z0-9\-]+)/,!1)&&U.match("include"))return Z.isIncludeFiltered=!0,v}function I(U,Z){if(Z.isIncludeFiltered){var ce=R(U,Z);return Z.isIncludeFiltered=!1,Z.restOfLine="string",ce}}function D(U,Z){if(U.match(/^mixin\b/))return Z.javaScriptLine=!0,v}function Q(U,Z){if(U.match(/^\+([-\w]+)/))return U.match(/^\( *[-\w]+ *=/,!1)||(Z.javaScriptArguments=!0,Z.javaScriptArgumentsDepth=0),"variable";if(U.match("+#{",!1))return U.next(),Z.mixinCallAfter=!0,k(U,Z)}function j(U,Z){if(Z.mixinCallAfter)return Z.mixinCallAfter=!1,U.match(/^\( *[-\w]+ *=/,!1)||(Z.javaScriptArguments=!0,Z.javaScriptArgumentsDepth=0),!0}function V(U,Z){if(U.match(/^(if|unless|else if|else)\b/))return Z.javaScriptLine=!0,v}function y(U,Z){if(U.match(/^(- *)?(each|for)\b/))return Z.isEach=!0,v}function K(U,Z){if(Z.isEach){if(U.match(/^ in\b/))return Z.javaScriptLine=!0,Z.isEach=!1,v;if(U.sol()||U.eol())Z.isEach=!1;else if(U.next()){for(;!U.match(/^ in\b/,!1)&&U.next(););return"variable"}}}function X(U,Z){if(U.match(/^while\b/))return Z.javaScriptLine=!0,v}function N(U,Z){var ce;if(ce=U.match(/^(\w(?:[-:\w]*\w)?)\/?/))return Z.lastTag=ce[1].toLowerCase(),Z.lastTag==="script"&&(Z.scriptType="application/javascript"),"tag"}function R(U,Z){if(U.match(/^:([\w\-]+)/)){var ce;return p&&p.innerModes&&(ce=p.innerModes(U.current().substring(1))),ce||(ce=U.current().substring(1)),typeof ce=="string"&&(ce=o.getMode(p,ce)),Be(U,Z,ce),"atom"}}function le(U,Z){if(U.match(/^(!?=|-)/))return Z.javaScriptLine=!0,"punctuation"}function xe(U){if(U.match(/^#([\w-]+)/))return b}function F(U){if(U.match(/^\.([\w-]+)/))return S}function L(U,Z){if(U.peek()=="(")return U.next(),Z.isAttrs=!0,Z.attrsNest=[],Z.inAttributeName=!0,Z.attrValue="",Z.attributeIsType=!1,"punctuation"}function de(U,Z){if(Z.isAttrs){if(s[U.peek()]&&Z.attrsNest.push(s[U.peek()]),Z.attrsNest[Z.attrsNest.length-1]===U.peek())Z.attrsNest.pop();else if(U.eat(")"))return Z.isAttrs=!1,"punctuation";if(Z.inAttributeName&&U.match(/^[^=,\)!]+/))return(U.peek()==="="||U.peek()==="!")&&(Z.inAttributeName=!1,Z.jsState=o.startState(h),Z.lastTag==="script"&&U.current().trim().toLowerCase()==="type"?Z.attributeIsType=!0:Z.attributeIsType=!1),"attribute";var ce=h.token(U,Z.jsState);if(Z.attributeIsType&&ce==="string"&&(Z.scriptType=U.current().toString()),Z.attrsNest.length===0&&(ce==="string"||ce==="variable"||ce==="keyword"))try{return Function("","var x "+Z.attrValue.replace(/,\s*$/,"").replace(/^!/,"")),Z.inAttributeName=!0,Z.attrValue="",U.backUp(U.current().length),de(U,Z)}catch{}return Z.attrValue+=U.current(),ce||!0}}function ze(U,Z){if(U.match(/^&attributes\b/))return Z.javaScriptArguments=!0,Z.javaScriptArgumentsDepth=0,"keyword"}function pe(U){if(U.sol()&&U.eatSpace())return"indent"}function Ee(U,Z){if(U.match(/^ *\/\/(-)?([^\n]*)/))return Z.indentOf=U.indentation(),Z.indentToken="comment","comment"}function ge(U){if(U.match(/^: */))return"colon"}function Oe(U,Z){if(U.match(/^(?:\| ?| )([^\n]+)/))return"string";if(U.match(/^(<[^\n]*)/,!1))return Be(U,Z,"htmlmixed"),Z.innerModeForLine=!0,Ze(U,Z,!0)}function qe(U,Z){if(U.eat(".")){var ce=null;return Z.lastTag==="script"&&Z.scriptType.toLowerCase().indexOf("javascript")!=-1?ce=Z.scriptType.toLowerCase().replace(/"|'/g,""):Z.lastTag==="style"&&(ce="css"),Be(U,Z,ce),"dot"}}function Se(U){return U.next(),null}function Be(U,Z,ce){ce=o.mimeModes[ce]||ce,ce=p.innerModes&&p.innerModes(ce)||ce,ce=o.mimeModes[ce]||ce,ce=o.getMode(p,ce),Z.indentOf=U.indentation(),ce&&ce.name!=="null"?Z.innerMode=ce:Z.indentToken="string"}function Ze(U,Z,ce){if(U.indentation()>Z.indentOf||Z.innerModeForLine&&!U.sol()||ce)return Z.innerMode?(Z.innerState||(Z.innerState=Z.innerMode.startState?o.startState(Z.innerMode,U.indentation()):{}),U.hideFirstChars(Z.indentOf+2,function(){return Z.innerMode.token(U,Z.innerState)||!0})):(U.skipToEnd(),Z.indentToken);U.sol()&&(Z.indentOf=1/0,Z.indentToken=null,Z.innerMode=null,Z.innerState=null)}function ke(U,Z){if(U.sol()&&(Z.restOfLine=""),Z.restOfLine){U.skipToEnd();var ce=Z.restOfLine;return Z.restOfLine="",ce}}function Je(){return new g}function Re(U){return U.copy()}function Ge(U,Z){var ce=Ze(U,Z)||ke(U,Z)||z(U,Z)||I(U,Z)||K(U,Z)||de(U,Z)||T(U,Z)||w(U,Z)||j(U,Z)||c(U)||d(U)||k(U,Z)||M(U,Z)||_(U,Z)||W(U)||E(U,Z)||O(U,Z)||G(U,Z)||J(U,Z)||re(U,Z)||q(U,Z)||D(U,Z)||Q(U,Z)||V(U,Z)||y(U,Z)||X(U,Z)||N(U,Z)||R(U,Z)||le(U,Z)||xe(U)||F(U)||L(U,Z)||ze(U,Z)||pe(U)||Oe(U,Z)||Ee(U,Z)||ge(U)||qe(U,Z)||Se(U);return ce===!0?null:ce}return{startState:Je,copyState:Re,token:Ge}},"javascript","css","htmlmixed"),o.defineMIME("text/x-pug","pug"),o.defineMIME("text/x-jade","pug")})});var ic=Ke((rc,nc)=>{(function(o){typeof rc=="object"&&typeof nc=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.multiplexingMode=function(p){var v=Array.prototype.slice.call(arguments,1);function C(b,S,s,h){if(typeof S=="string"){var g=b.indexOf(S,s);return h&&g>-1?g+S.length:g}var T=S.exec(s?b.slice(s):b);return T?T.index+s+(h?T[0].length:0):-1}return{startState:function(){return{outer:o.startState(p),innerActive:null,inner:null,startingInner:!1}},copyState:function(b){return{outer:o.copyState(p,b.outer),innerActive:b.innerActive,inner:b.innerActive&&o.copyState(b.innerActive.mode,b.inner),startingInner:b.startingInner}},token:function(b,S){if(S.innerActive){var z=S.innerActive,h=b.string;if(!z.close&&b.sol())return S.innerActive=S.inner=null,this.token(b,S);var w=z.close&&!S.startingInner?C(h,z.close,b.pos,z.parseDelimiters):-1;if(w==b.pos&&!z.parseDelimiters)return b.match(z.close),S.innerActive=S.inner=null,z.delimStyle&&z.delimStyle+" "+z.delimStyle+"-close";w>-1&&(b.string=h.slice(0,w));var M=z.mode.token(b,S.inner);return w>-1?b.string=h:b.pos>b.start&&(S.startingInner=!1),w==b.pos&&z.parseDelimiters&&(S.innerActive=S.inner=null),z.innerStyle&&(M?M=M+" "+z.innerStyle:M=z.innerStyle),M}else{for(var s=1/0,h=b.string,g=0;g{(function(o){typeof oc=="object"&&typeof ac=="object"?o(We(),Di(),ic()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple","../../addon/mode/multiplex"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode("handlebars-tags",{start:[{regex:/\{\{\{/,push:"handlebars_raw",token:"tag"},{regex:/\{\{!--/,push:"dash_comment",token:"comment"},{regex:/\{\{!/,push:"comment",token:"comment"},{regex:/\{\{/,push:"handlebars",token:"tag"}],handlebars_raw:[{regex:/\}\}\}/,pop:!0,token:"tag"}],handlebars:[{regex:/\}\}/,pop:!0,token:"tag"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"},{regex:/'(?:[^\\']|\\.)*'?/,token:"string"},{regex:/>|[#\/]([A-Za-z_]\w*)/,token:"keyword"},{regex:/(?:else|this)\b/,token:"keyword"},{regex:/\d+/i,token:"number"},{regex:/=|~|@|true|false/,token:"atom"},{regex:/(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/,token:"variable-2"}],dash_comment:[{regex:/--\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],comment:[{regex:/\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],meta:{blockCommentStart:"{{--",blockCommentEnd:"--}}"}}),o.defineMode("handlebars",function(p,v){var C=o.getMode(p,"handlebars-tags");return!v||!v.base?C:o.multiplexingMode(o.getMode(p,v.base),{open:"{{",close:/\}\}\}?/,mode:C,parseDelimiters:!0})}),o.defineMIME("text/x-handlebars-template","handlebars")})});var cc=Ke((sc,uc)=>{(function(o){"use strict";typeof sc=="object"&&typeof uc=="object"?o(We(),Yn(),mn(),vn(),Vu(),gn(),ea(),ta(),tc(),lc()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/overlay","../xml/xml","../javascript/javascript","../coffeescript/coffeescript","../css/css","../sass/sass","../stylus/stylus","../pug/pug","../handlebars/handlebars"],o):o(CodeMirror)})(function(o){var p={script:[["lang",/coffee(script)?/,"coffeescript"],["type",/^(?:text|application)\/(?:x-)?coffee(?:script)?$/,"coffeescript"],["lang",/^babel$/,"javascript"],["type",/^text\/babel$/,"javascript"],["type",/^text\/ecmascript-\d+$/,"javascript"]],style:[["lang",/^stylus$/i,"stylus"],["lang",/^sass$/i,"sass"],["lang",/^less$/i,"text/x-less"],["lang",/^scss$/i,"text/x-scss"],["type",/^(text\/)?(x-)?styl(us)?$/i,"stylus"],["type",/^text\/sass/i,"sass"],["type",/^(text\/)?(x-)?scss$/i,"text/x-scss"],["type",/^(text\/)?(x-)?less$/i,"text/x-less"]],template:[["lang",/^vue-template$/i,"vue"],["lang",/^pug$/i,"pug"],["lang",/^handlebars$/i,"handlebars"],["type",/^(text\/)?(x-)?pug$/i,"pug"],["type",/^text\/x-handlebars-template$/i,"handlebars"],[null,null,"vue-template"]]};o.defineMode("vue-template",function(v,C){var b={token:function(S){if(S.match(/^\{\{.*?\}\}/))return"meta mustache";for(;S.next()&&!S.match("{{",!1););return null}};return o.overlayMode(o.getMode(v,C.backdrop||"text/html"),b)}),o.defineMode("vue",function(v){return o.getMode(v,{name:"htmlmixed",tags:p})},"htmlmixed","xml","javascript","coffeescript","css","sass","stylus","pug","handlebars"),o.defineMIME("script/x-vue","vue"),o.defineMIME("text/x-vue","vue")})});var pc=Ke((fc,dc)=>{(function(o){typeof fc=="object"&&typeof dc=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("yaml",function(){var p=["true","false","on","off","yes","no"],v=new RegExp("\\b(("+p.join(")|(")+"))$","i");return{token:function(C,b){var S=C.peek(),s=b.escaped;if(b.escaped=!1,S=="#"&&(C.pos==0||/\s/.test(C.string.charAt(C.pos-1))))return C.skipToEnd(),"comment";if(C.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(b.literal&&C.indentation()>b.keyCol)return C.skipToEnd(),"string";if(b.literal&&(b.literal=!1),C.sol()){if(b.keyCol=0,b.pair=!1,b.pairStart=!1,C.match("---")||C.match("..."))return"def";if(C.match(/\s*-\s+/))return"meta"}if(C.match(/^(\{|\}|\[|\])/))return S=="{"?b.inlinePairs++:S=="}"?b.inlinePairs--:S=="["?b.inlineList++:b.inlineList--,"meta";if(b.inlineList>0&&!s&&S==",")return C.next(),"meta";if(b.inlinePairs>0&&!s&&S==",")return b.keyCol=0,b.pair=!1,b.pairStart=!1,C.next(),"meta";if(b.pairStart){if(C.match(/^\s*(\||\>)\s*/))return b.literal=!0,"meta";if(C.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(b.inlinePairs==0&&C.match(/^\s*-?[0-9\.\,]+\s?$/)||b.inlinePairs>0&&C.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(C.match(v))return"keyword"}return!b.pair&&C.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^\s,\[\]{}#&*!|>'"%@`])[^#:]*(?=:($|\s))/)?(b.pair=!0,b.keyCol=C.indentation(),"atom"):b.pair&&C.match(/^:\s*/)?(b.pairStart=!0,"meta"):(b.pairStart=!1,b.escaped=S=="\\",C.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),o.defineMIME("text/x-yaml","yaml"),o.defineMIME("text/yaml","yaml")})});var $d={};function qd(o){for(var p;(p=Md.exec(o))!==null;){var v=p[0];if(v.indexOf("target=")===-1){var C=v.replace(/>$/,' target="_blank">');o=o.replace(v,C)}}return o}function Id(o){for(var p=new DOMParser,v=p.parseFromString(o,"text/html"),C=v.getElementsByTagName("li"),b=0;b0){for(var d=document.createElement("i"),w=0;w{(function(o){typeof oc=="object"&&typeof ac=="object"?o(We(),Di(),ic()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple","../../addon/mode/multiplex"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode("handlebars-tags",{start:[{regex:/\{\{\{/,push:"handlebars_raw",token:"tag"},{regex:/\{\{!--/,push:"dash_comment",token:"comment"},{regex:/\{\{!/,push:"comment",token:"comment"},{regex:/\{\{/,push:"handlebars",token:"tag"}],handlebars_raw:[{regex:/\}\}\}/,pop:!0,token:"tag"}],handlebars:[{regex:/\}\}/,pop:!0,token:"tag"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"},{regex:/'(?:[^\\']|\\.)*'?/,token:"string"},{regex:/>|[#\/]([A-Za-z_]\w*)/,token:"keyword"},{regex:/(?:else|this)\b/,token:"keyword"},{regex:/\d+/i,token:"number"},{regex:/=|~|@|true|false/,token:"atom"},{regex:/(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/,token:"variable-2"}],dash_comment:[{regex:/--\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],comment:[{regex:/\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],meta:{blockCommentStart:"{{--",blockCommentEnd:"--}}"}}),o.defineMode("handlebars",function(p,v){var C=o.getMode(p,"handlebars-tags");return!v||!v.base?C:o.multiplexingMode(o.getMode(p,v.base),{open:"{{",close:/\}\}\}?/,mode:C,parseDelimiters:!0})}),o.defineMIME("text/x-handlebars-template","handlebars")})});var cc=Ke((sc,uc)=>{(function(o){"use strict";typeof sc=="object"&&typeof uc=="object"?o(We(),Yn(),mn(),vn(),Vu(),gn(),ea(),ta(),tc(),lc()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/overlay","../xml/xml","../javascript/javascript","../coffeescript/coffeescript","../css/css","../sass/sass","../stylus/stylus","../pug/pug","../handlebars/handlebars"],o):o(CodeMirror)})(function(o){var p={script:[["lang",/coffee(script)?/,"coffeescript"],["type",/^(?:text|application)\/(?:x-)?coffee(?:script)?$/,"coffeescript"],["lang",/^babel$/,"javascript"],["type",/^text\/babel$/,"javascript"],["type",/^text\/ecmascript-\d+$/,"javascript"]],style:[["lang",/^stylus$/i,"stylus"],["lang",/^sass$/i,"sass"],["lang",/^less$/i,"text/x-less"],["lang",/^scss$/i,"text/x-scss"],["type",/^(text\/)?(x-)?styl(us)?$/i,"stylus"],["type",/^text\/sass/i,"sass"],["type",/^(text\/)?(x-)?scss$/i,"text/x-scss"],["type",/^(text\/)?(x-)?less$/i,"text/x-less"]],template:[["lang",/^vue-template$/i,"vue"],["lang",/^pug$/i,"pug"],["lang",/^handlebars$/i,"handlebars"],["type",/^(text\/)?(x-)?pug$/i,"pug"],["type",/^text\/x-handlebars-template$/i,"handlebars"],[null,null,"vue-template"]]};o.defineMode("vue-template",function(v,C){var b={token:function(S){if(S.match(/^\{\{.*?\}\}/))return"meta mustache";for(;S.next()&&!S.match("{{",!1););return null}};return o.overlayMode(o.getMode(v,C.backdrop||"text/html"),b)}),o.defineMode("vue",function(v){return o.getMode(v,{name:"htmlmixed",tags:p})},"htmlmixed","xml","javascript","coffeescript","css","sass","stylus","pug","handlebars"),o.defineMIME("script/x-vue","vue"),o.defineMIME("text/x-vue","vue")})});var pc=Ke((fc,dc)=>{(function(o){typeof fc=="object"&&typeof dc=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("yaml",function(){var p=["true","false","on","off","yes","no"],v=new RegExp("\\b(("+p.join(")|(")+"))$","i");return{token:function(C,b){var S=C.peek(),s=b.escaped;if(b.escaped=!1,S=="#"&&(C.pos==0||/\s/.test(C.string.charAt(C.pos-1))))return C.skipToEnd(),"comment";if(C.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(b.literal&&C.indentation()>b.keyCol)return C.skipToEnd(),"string";if(b.literal&&(b.literal=!1),C.sol()){if(b.keyCol=0,b.pair=!1,b.pairStart=!1,C.match("---")||C.match("..."))return"def";if(C.match(/\s*-\s+/))return"meta"}if(C.match(/^(\{|\}|\[|\])/))return S=="{"?b.inlinePairs++:S=="}"?b.inlinePairs--:S=="["?b.inlineList++:b.inlineList--,"meta";if(b.inlineList>0&&!s&&S==",")return C.next(),"meta";if(b.inlinePairs>0&&!s&&S==",")return b.keyCol=0,b.pair=!1,b.pairStart=!1,C.next(),"meta";if(b.pairStart){if(C.match(/^\s*(\||\>)\s*/))return b.literal=!0,"meta";if(C.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(b.inlinePairs==0&&C.match(/^\s*-?[0-9\.\,]+\s?$/)||b.inlinePairs>0&&C.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(C.match(v))return"keyword"}return!b.pair&&C.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^\s,\[\]{}#&*!|>'"%@`])[^#:]*(?=:($|\s))/)?(b.pair=!0,b.keyCol=C.indentation(),"atom"):b.pair&&C.match(/^:\s*/)?(b.pairStart=!0,"meta"):(b.pairStart=!1,b.escaped=S=="\\",C.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),o.defineMIME("text/x-yaml","yaml"),o.defineMIME("text/yaml","yaml")})});var $d={};function qd(o){for(var p;(p=Md.exec(o))!==null;){var v=p[0];if(v.indexOf("target=")===-1){var C=v.replace(/>$/,' target="_blank">');o=o.replace(v,C)}}return o}function Fd(o){for(var p=new DOMParser,v=p.parseFromString(o,"text/html"),C=v.getElementsByTagName("li"),b=0;b0){for(var d=document.createElement("i"),k=0;k=0&&(x=s.getLineHandle(d),!v(x));d--);var R=s.getTokenAt({line:d,ch:1}),M=C(R).fencedChars,H,Z,ee,re;v(s.getLineHandle(h.line))?(H="",Z=h.line):v(s.getLineHandle(h.line-1))?(H="",Z=h.line-1):(H=M+` -`,Z=h.line),v(s.getLineHandle(g.line))?(ee="",re=g.line,g.ch===0&&(re+=1)):g.ch!==0&&v(s.getLineHandle(g.line+1))?(ee="",re=g.line+1):(ee=M+` -`,re=g.line+1),g.ch===0&&(re-=1),s.operation(function(){s.replaceRange(ee,{line:re,ch:0},{line:re+(ee?0:1),ch:0}),s.replaceRange(H,{line:Z,ch:0},{line:Z+(H?0:1),ch:0})}),s.setSelection({line:Z+(H?1:0),ch:0},{line:re+(H?1:-1),ch:0}),s.focus()}else{var N=h.line;if(v(s.getLineHandle(h.line))&&(b(s,h.line+1)==="fenced"?(d=h.line,N=h.line+1):(w=h.line,N=h.line-1)),d===void 0)for(d=N;d>=0&&(x=s.getLineHandle(d),!v(x));d--);if(w===void 0)for(E=s.lineCount(),w=N;w=0;d--)if(x=s.getLineHandle(d),!x.text.match(/^\s*$/)&&b(s,d,x)!=="indented"){d+=1;break}for(E=s.lineCount(),w=h.line;w\s+/,"unordered-list":C,"ordered-list":C},T=function(E,z){var y={quote:">","unordered-list":v,"ordered-list":"%%i."};return y[E].replace("%%i",z)},x=function(E,z){var y={quote:">","unordered-list":"\\"+v,"ordered-list":"\\d+."},R=new RegExp(y[E]);return z&&R.test(z)},c=function(E,z,y){var R=C.exec(z),M=T(E,d);return R!==null?(x(E,R[2])&&(M=""),z=R[1]+M+R[3]+z.replace(b,"").replace(g[E],"$1")):y==!1&&(z=M+" "+z),z},d=1,w=s.line;w<=h.line;w++)(function(E){var z=o.getLine(E);S[p]?z=z.replace(g[p],"$1"):(p=="unordered-list"&&(z=c("ordered-list",z,!0)),z=c(p,z,!1),d+=1),o.replaceRange(z,{line:E,ch:0},{line:E,ch:99999999999999})})(w);o.focus()}}function xc(o,p,v,C){if(!(!o.codemirror||o.isPreviewActive())){var b=o.codemirror,S=Tr(b),s=S[p];if(!s){Rr(b,s,v,C);return}var h=b.getCursor("start"),g=b.getCursor("end"),T=b.getLine(h.line),x=T.slice(0,h.ch),c=T.slice(h.ch);p=="link"?x=x.replace(/(.*)[^!]\[/,"$1"):p=="image"&&(x=x.replace(/(.*)!\[$/,"$1")),c=c.replace(/]\(.*?\)/,""),b.replaceRange(x+c,{line:h.line,ch:0},{line:h.line,ch:99999999999999}),h.ch-=v[0].length,h!==g&&(g.ch-=v[0].length),b.setSelection(h,g),b.focus()}}function sa(o,p,v,C){if(!(!o.codemirror||o.isPreviewActive())){C=typeof C>"u"?v:C;var b=o.codemirror,S=Tr(b),s,h=v,g=C,T=b.getCursor("start"),x=b.getCursor("end");S[p]?(s=b.getLine(T.line),h=s.slice(0,T.ch),g=s.slice(T.ch),p=="bold"?(h=h.replace(/(\*\*|__)(?![\s\S]*(\*\*|__))/,""),g=g.replace(/(\*\*|__)/,"")):p=="italic"?(h=h.replace(/(\*|_)(?![\s\S]*(\*|_))/,""),g=g.replace(/(\*|_)/,"")):p=="strikethrough"&&(h=h.replace(/(\*\*|~~)(?![\s\S]*(\*\*|~~))/,""),g=g.replace(/(\*\*|~~)/,"")),b.replaceRange(h+g,{line:T.line,ch:0},{line:T.line,ch:99999999999999}),p=="bold"||p=="strikethrough"?(T.ch-=2,T!==x&&(x.ch-=2)):p=="italic"&&(T.ch-=1,T!==x&&(x.ch-=1))):(s=b.getSelection(),p=="bold"?(s=s.split("**").join(""),s=s.split("__").join("")):p=="italic"?(s=s.split("*").join(""),s=s.split("_").join("")):p=="strikethrough"&&(s=s.split("~~").join("")),b.replaceSelection(h+s+g),T.ch+=v.length,x.ch=T.ch+s.length),b.setSelection(T,x),b.focus()}}function Pd(o){if(!o.getWrapperElement().lastChild.classList.contains("editor-preview-active"))for(var p=o.getCursor("start"),v=o.getCursor("end"),C,b=p.line;b<=v.line;b++)C=o.getLine(b),C=C.replace(/^[ ]*([# ]+|\*|-|[> ]+|[0-9]+(.|\)))[ ]*/,""),o.replaceRange(C,{line:b,ch:0},{line:b,ch:99999999999999})}function Ii(o,p){if(Math.abs(o)<1024)return""+o+p[0];var v=0;do o/=1024,++v;while(Math.abs(o)>=1024&&v=19968?C+=v[b].length:C+=1;return C}function Te(o){o=o||{},o.parent=this;var p=!0;if(o.autoDownloadFontAwesome===!1&&(p=!1),o.autoDownloadFontAwesome!==!0)for(var v=document.styleSheets,C=0;C-1&&(p=!1);if(p){var b=document.createElement("link");b.rel="stylesheet",b.href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css",document.getElementsByTagName("head")[0].appendChild(b)}if(o.element)this.element=o.element;else if(o.element===null){console.log("EasyMDE: Error. No element was found.");return}if(o.toolbar===void 0){o.toolbar=[];for(var S in Pr)Object.prototype.hasOwnProperty.call(Pr,S)&&(S.indexOf("separator-")!=-1&&o.toolbar.push("|"),(Pr[S].default===!0||o.showIcons&&o.showIcons.constructor===Array&&o.showIcons.indexOf(S)!=-1)&&o.toolbar.push(S))}if(Object.prototype.hasOwnProperty.call(o,"previewClass")||(o.previewClass="editor-preview"),Object.prototype.hasOwnProperty.call(o,"status")||(o.status=["autosave","lines","words","cursor"],o.uploadImage&&o.status.unshift("upload-image")),o.previewRender||(o.previewRender=function(h){return this.parent.markdown(h)}),o.parsingConfig=fr({highlightFormatting:!0},o.parsingConfig||{}),o.insertTexts=fr({},jd,o.insertTexts||{}),o.promptTexts=fr({},Rd,o.promptTexts||{}),o.blockStyles=fr({},Bd,o.blockStyles||{}),o.autosave!=null&&(o.autosave.timeFormat=fr({},Hd,o.autosave.timeFormat||{})),o.iconClassMap=fr({},et,o.iconClassMap||{}),o.shortcuts=fr({},Ad,o.shortcuts||{}),o.maxHeight=o.maxHeight||void 0,o.direction=o.direction||"ltr",typeof o.maxHeight<"u"?o.minHeight=o.maxHeight:o.minHeight=o.minHeight||"300px",o.errorCallback=o.errorCallback||function(h){alert(h)},o.uploadImage=o.uploadImage||!1,o.imageMaxSize=o.imageMaxSize||2097152,o.imageAccept=o.imageAccept||"image/png, image/jpeg, image/gif, image/avif",o.imageTexts=fr({},Wd,o.imageTexts||{}),o.errorMessages=fr({},Ud,o.errorMessages||{}),o.imagePathAbsolute=o.imagePathAbsolute||!1,o.imageCSRFName=o.imageCSRFName||"csrfmiddlewaretoken",o.imageCSRFHeader=o.imageCSRFHeader||!1,o.autosave!=null&&o.autosave.unique_id!=null&&o.autosave.unique_id!=""&&(o.autosave.uniqueId=o.autosave.unique_id),o.overlayMode&&o.overlayMode.combine===void 0&&(o.overlayMode.combine=!0),this.options=o,this.render(),o.initialValue&&(!this.options.autosave||this.options.autosave.foundSavedValue!==!0)&&this.value(o.initialValue),o.uploadImage){var s=this;this.codemirror.on("dragenter",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbOnDragEnter),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragend",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbInit),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragleave",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbInit),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragover",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbOnDragEnter),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("drop",function(h,g){g.stopPropagation(),g.preventDefault(),o.imageUploadFunction?s.uploadImagesUsingCustomFunction(o.imageUploadFunction,g.dataTransfer.files):s.uploadImages(g.dataTransfer.files)}),this.codemirror.on("paste",function(h,g){o.imageUploadFunction?s.uploadImagesUsingCustomFunction(o.imageUploadFunction,g.clipboardData.files):s.uploadImages(g.clipboardData.files)})}}function kc(){if(typeof localStorage=="object")try{localStorage.setItem("smde_localStorage",1),localStorage.removeItem("smde_localStorage")}catch{return!1}else return!1;return!0}var mc,Md,Vn,Ad,Dd,ra,hc,et,Pr,jd,Rd,Hd,Bd,Wd,Ud,wc=Cd(()=>{mc=/Mac/.test(navigator.platform),Md=new RegExp(/()+?/g),Vn={toggleBold:Fi,toggleItalic:Ni,drawLink:Gi,toggleHeadingSmaller:Jn,toggleHeadingBigger:Ri,drawImage:Zi,toggleBlockquote:ji,toggleOrderedList:$i,toggleUnorderedList:Ui,toggleCodeBlock:Pi,togglePreview:Ji,toggleStrikethrough:Oi,toggleHeading1:Hi,toggleHeading2:Bi,toggleHeading3:Wi,toggleHeading4:na,toggleHeading5:ia,toggleHeading6:oa,cleanBlock:Ki,drawTable:Xi,drawHorizontalRule:Yi,undo:Qi,redo:Vi,toggleSideBySide:bn,toggleFullScreen:jr},Ad={toggleBold:"Cmd-B",toggleItalic:"Cmd-I",drawLink:"Cmd-K",toggleHeadingSmaller:"Cmd-H",toggleHeadingBigger:"Shift-Cmd-H",toggleHeading1:"Ctrl+Alt+1",toggleHeading2:"Ctrl+Alt+2",toggleHeading3:"Ctrl+Alt+3",toggleHeading4:"Ctrl+Alt+4",toggleHeading5:"Ctrl+Alt+5",toggleHeading6:"Ctrl+Alt+6",cleanBlock:"Cmd-E",drawImage:"Cmd-Alt-I",toggleBlockquote:"Cmd-'",toggleOrderedList:"Cmd-Alt-L",toggleUnorderedList:"Cmd-L",toggleCodeBlock:"Cmd-Alt-C",togglePreview:"Cmd-P",toggleSideBySide:"F9",toggleFullScreen:"F11"},Dd=function(o){for(var p in Vn)if(Vn[p]===o)return p;return null},ra=function(){var o=!1;return function(p){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(p)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(p.substr(0,4)))&&(o=!0)}(navigator.userAgent||navigator.vendor||window.opera),o};hc="";et={bold:"fa fa-bold",italic:"fa fa-italic",strikethrough:"fa fa-strikethrough",heading:"fa fa-header fa-heading","heading-smaller":"fa fa-header fa-heading header-smaller","heading-bigger":"fa fa-header fa-heading header-bigger","heading-1":"fa fa-header fa-heading header-1","heading-2":"fa fa-header fa-heading header-2","heading-3":"fa fa-header fa-heading header-3",code:"fa fa-code",quote:"fa fa-quote-left","ordered-list":"fa fa-list-ol","unordered-list":"fa fa-list-ul","clean-block":"fa fa-eraser",link:"fa fa-link",image:"fa fa-image","upload-image":"fa fa-image",table:"fa fa-table","horizontal-rule":"fa fa-minus",preview:"fa fa-eye","side-by-side":"fa fa-columns",fullscreen:"fa fa-arrows-alt",guide:"fa fa-question-circle",undo:"fa fa-undo",redo:"fa fa-repeat fa-redo"},Pr={bold:{name:"bold",action:Fi,className:et.bold,title:"Bold",default:!0},italic:{name:"italic",action:Ni,className:et.italic,title:"Italic",default:!0},strikethrough:{name:"strikethrough",action:Oi,className:et.strikethrough,title:"Strikethrough"},heading:{name:"heading",action:Jn,className:et.heading,title:"Heading",default:!0},"heading-smaller":{name:"heading-smaller",action:Jn,className:et["heading-smaller"],title:"Smaller Heading"},"heading-bigger":{name:"heading-bigger",action:Ri,className:et["heading-bigger"],title:"Bigger Heading"},"heading-1":{name:"heading-1",action:Hi,className:et["heading-1"],title:"Big Heading"},"heading-2":{name:"heading-2",action:Bi,className:et["heading-2"],title:"Medium Heading"},"heading-3":{name:"heading-3",action:Wi,className:et["heading-3"],title:"Small Heading"},"separator-1":{name:"separator-1"},code:{name:"code",action:Pi,className:et.code,title:"Code"},quote:{name:"quote",action:ji,className:et.quote,title:"Quote",default:!0},"unordered-list":{name:"unordered-list",action:Ui,className:et["unordered-list"],title:"Generic List",default:!0},"ordered-list":{name:"ordered-list",action:$i,className:et["ordered-list"],title:"Numbered List",default:!0},"clean-block":{name:"clean-block",action:Ki,className:et["clean-block"],title:"Clean block"},"separator-2":{name:"separator-2"},link:{name:"link",action:Gi,className:et.link,title:"Create Link",default:!0},image:{name:"image",action:Zi,className:et.image,title:"Insert Image",default:!0},"upload-image":{name:"upload-image",action:aa,className:et["upload-image"],title:"Import an image"},table:{name:"table",action:Xi,className:et.table,title:"Insert Table"},"horizontal-rule":{name:"horizontal-rule",action:Yi,className:et["horizontal-rule"],title:"Insert Horizontal Line"},"separator-3":{name:"separator-3"},preview:{name:"preview",action:Ji,className:et.preview,noDisable:!0,title:"Toggle Preview",default:!0},"side-by-side":{name:"side-by-side",action:bn,className:et["side-by-side"],noDisable:!0,noMobile:!0,title:"Toggle Side by Side",default:!0},fullscreen:{name:"fullscreen",action:jr,className:et.fullscreen,noDisable:!0,noMobile:!0,title:"Toggle Fullscreen",default:!0},"separator-4":{name:"separator-4"},guide:{name:"guide",action:"https://www.markdownguide.org/basic-syntax/",className:et.guide,noDisable:!0,title:"Markdown Guide",default:!0},"separator-5":{name:"separator-5"},undo:{name:"undo",action:Qi,className:et.undo,noDisable:!0,title:"Undo"},redo:{name:"redo",action:Vi,className:et.redo,noDisable:!0,title:"Redo"}},jd={link:["[","](#url#)"],image:["![","](#url#)"],uploadedImage:["![](#url#)",""],table:["",` +`+R;F&&xe++,F&&N.ch===0&&(de=R+` +`,xe--),jr(K,!1,[L,de]),K.setSelection({line:le,ch:0},{line:xe,ch:0})}var s=o.codemirror,h=s.getCursor("start"),g=s.getCursor("end"),T=s.getTokenAt({line:h.line,ch:h.ch||1}),w=s.getLineHandle(h.line),c=b(s,h.line,w,T),d,k,z;if(c==="single"){var M=w.text.slice(0,h.ch).replace("`",""),_=w.text.slice(h.ch).replace("`","");s.replaceRange(M+_,{line:h.line,ch:0},{line:h.line,ch:99999999999999}),h.ch--,h!==g&&g.ch--,s.setSelection(h,g),s.focus()}else if(c==="fenced")if(h.line!==g.line||h.ch!==g.ch){for(d=h.line;d>=0&&(w=s.getLineHandle(d),!v(w));d--);var W=s.getTokenAt({line:d,ch:1}),E=C(W).fencedChars,O,G,J,re;v(s.getLineHandle(h.line))?(O="",G=h.line):v(s.getLineHandle(h.line-1))?(O="",G=h.line-1):(O=E+` +`,G=h.line),v(s.getLineHandle(g.line))?(J="",re=g.line,g.ch===0&&(re+=1)):g.ch!==0&&v(s.getLineHandle(g.line+1))?(J="",re=g.line+1):(J=E+` +`,re=g.line+1),g.ch===0&&(re-=1),s.operation(function(){s.replaceRange(J,{line:re,ch:0},{line:re+(J?0:1),ch:0}),s.replaceRange(O,{line:G,ch:0},{line:G+(O?0:1),ch:0})}),s.setSelection({line:G+(O?1:0),ch:0},{line:re+(O?1:-1),ch:0}),s.focus()}else{var q=h.line;if(v(s.getLineHandle(h.line))&&(b(s,h.line+1)==="fenced"?(d=h.line,q=h.line+1):(k=h.line,q=h.line-1)),d===void 0)for(d=q;d>=0&&(w=s.getLineHandle(d),!v(w));d--);if(k===void 0)for(z=s.lineCount(),k=q;k=0;d--)if(w=s.getLineHandle(d),!w.text.match(/^\s*$/)&&b(s,d,w)!=="indented"){d+=1;break}for(z=s.lineCount(),k=h.line;k\s+/,"unordered-list":C,"ordered-list":C},T=function(z,M){var _={quote:">","unordered-list":v,"ordered-list":"%%i."};return _[z].replace("%%i",M)},w=function(z,M){var _={quote:">","unordered-list":"\\"+v,"ordered-list":"\\d+."},W=new RegExp(_[z]);return M&&W.test(M)},c=function(z,M,_){var W=C.exec(M),E=T(z,d);return W!==null?(w(z,W[2])&&(E=""),M=W[1]+E+W[3]+M.replace(b,"").replace(g[z],"$1")):_==!1&&(M=E+" "+M),M},d=1,k=s.line;k<=h.line;k++)(function(z){var M=o.getLine(z);S[p]?M=M.replace(g[p],"$1"):(p=="unordered-list"&&(M=c("ordered-list",M,!0)),M=c(p,M,!1),d+=1),o.replaceRange(M,{line:z,ch:0},{line:z,ch:99999999999999})})(k);o.focus()}}function xc(o,p,v,C){if(!(!o.codemirror||o.isPreviewActive())){var b=o.codemirror,S=Tr(b),s=S[p];if(!s){jr(b,s,v,C);return}var h=b.getCursor("start"),g=b.getCursor("end"),T=b.getLine(h.line),w=T.slice(0,h.ch),c=T.slice(h.ch);p=="link"?w=w.replace(/(.*)[^!]\[/,"$1"):p=="image"&&(w=w.replace(/(.*)!\[$/,"$1")),c=c.replace(/]\(.*?\)/,""),b.replaceRange(w+c,{line:h.line,ch:0},{line:h.line,ch:99999999999999}),h.ch-=v[0].length,h!==g&&(g.ch-=v[0].length),b.setSelection(h,g),b.focus()}}function sa(o,p,v,C){if(!(!o.codemirror||o.isPreviewActive())){C=typeof C>"u"?v:C;var b=o.codemirror,S=Tr(b),s,h=v,g=C,T=b.getCursor("start"),w=b.getCursor("end");S[p]?(s=b.getLine(T.line),h=s.slice(0,T.ch),g=s.slice(T.ch),p=="bold"?(h=h.replace(/(\*\*|__)(?![\s\S]*(\*\*|__))/,""),g=g.replace(/(\*\*|__)/,"")):p=="italic"?(h=h.replace(/(\*|_)(?![\s\S]*(\*|_))/,""),g=g.replace(/(\*|_)/,"")):p=="strikethrough"&&(h=h.replace(/(\*\*|~~)(?![\s\S]*(\*\*|~~))/,""),g=g.replace(/(\*\*|~~)/,"")),b.replaceRange(h+g,{line:T.line,ch:0},{line:T.line,ch:99999999999999}),p=="bold"||p=="strikethrough"?(T.ch-=2,T!==w&&(w.ch-=2)):p=="italic"&&(T.ch-=1,T!==w&&(w.ch-=1))):(s=b.getSelection(),p=="bold"?(s=s.split("**").join(""),s=s.split("__").join("")):p=="italic"?(s=s.split("*").join(""),s=s.split("_").join("")):p=="strikethrough"&&(s=s.split("~~").join("")),b.replaceSelection(h+s+g),T.ch+=v.length,w.ch=T.ch+s.length),b.setSelection(T,w),b.focus()}}function Pd(o){if(!o.getWrapperElement().lastChild.classList.contains("editor-preview-active"))for(var p=o.getCursor("start"),v=o.getCursor("end"),C,b=p.line;b<=v.line;b++)C=o.getLine(b),C=C.replace(/^[ ]*([# ]+|\*|-|[> ]+|[0-9]+(.|\)))[ ]*/,""),o.replaceRange(C,{line:b,ch:0},{line:b,ch:99999999999999})}function Fi(o,p){if(Math.abs(o)<1024)return""+o+p[0];var v=0;do o/=1024,++v;while(Math.abs(o)>=1024&&v=19968?C+=v[b].length:C+=1;return C}function Te(o){o=o||{},o.parent=this;var p=!0;if(o.autoDownloadFontAwesome===!1&&(p=!1),o.autoDownloadFontAwesome!==!0)for(var v=document.styleSheets,C=0;C-1&&(p=!1);if(p){var b=document.createElement("link");b.rel="stylesheet",b.href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css",document.getElementsByTagName("head")[0].appendChild(b)}if(o.element)this.element=o.element;else if(o.element===null){console.log("EasyMDE: Error. No element was found.");return}if(o.toolbar===void 0){o.toolbar=[];for(var S in Pr)Object.prototype.hasOwnProperty.call(Pr,S)&&(S.indexOf("separator-")!=-1&&o.toolbar.push("|"),(Pr[S].default===!0||o.showIcons&&o.showIcons.constructor===Array&&o.showIcons.indexOf(S)!=-1)&&o.toolbar.push(S))}if(Object.prototype.hasOwnProperty.call(o,"previewClass")||(o.previewClass="editor-preview"),Object.prototype.hasOwnProperty.call(o,"status")||(o.status=["autosave","lines","words","cursor"],o.uploadImage&&o.status.unshift("upload-image")),o.previewRender||(o.previewRender=function(h){return this.parent.markdown(h)}),o.parsingConfig=fr({highlightFormatting:!0},o.parsingConfig||{}),o.insertTexts=fr({},Bd,o.insertTexts||{}),o.promptTexts=fr({},jd,o.promptTexts||{}),o.blockStyles=fr({},Hd,o.blockStyles||{}),o.autosave!=null&&(o.autosave.timeFormat=fr({},Rd,o.autosave.timeFormat||{})),o.iconClassMap=fr({},et,o.iconClassMap||{}),o.shortcuts=fr({},Ad,o.shortcuts||{}),o.maxHeight=o.maxHeight||void 0,o.direction=o.direction||"ltr",typeof o.maxHeight<"u"?o.minHeight=o.maxHeight:o.minHeight=o.minHeight||"300px",o.errorCallback=o.errorCallback||function(h){alert(h)},o.uploadImage=o.uploadImage||!1,o.imageMaxSize=o.imageMaxSize||2097152,o.imageAccept=o.imageAccept||"image/png, image/jpeg, image/gif, image/avif",o.imageTexts=fr({},Wd,o.imageTexts||{}),o.errorMessages=fr({},Ud,o.errorMessages||{}),o.imagePathAbsolute=o.imagePathAbsolute||!1,o.imageCSRFName=o.imageCSRFName||"csrfmiddlewaretoken",o.imageCSRFHeader=o.imageCSRFHeader||!1,o.autosave!=null&&o.autosave.unique_id!=null&&o.autosave.unique_id!=""&&(o.autosave.uniqueId=o.autosave.unique_id),o.overlayMode&&o.overlayMode.combine===void 0&&(o.overlayMode.combine=!0),this.options=o,this.render(),o.initialValue&&(!this.options.autosave||this.options.autosave.foundSavedValue!==!0)&&this.value(o.initialValue),o.uploadImage){var s=this;this.codemirror.on("dragenter",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbOnDragEnter),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragend",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbInit),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragleave",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbInit),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragover",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbOnDragEnter),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("drop",function(h,g){g.stopPropagation(),g.preventDefault(),o.imageUploadFunction?s.uploadImagesUsingCustomFunction(o.imageUploadFunction,g.dataTransfer.files):s.uploadImages(g.dataTransfer.files)}),this.codemirror.on("paste",function(h,g){o.imageUploadFunction?s.uploadImagesUsingCustomFunction(o.imageUploadFunction,g.clipboardData.files):s.uploadImages(g.clipboardData.files)})}}function kc(){if(typeof localStorage=="object")try{localStorage.setItem("smde_localStorage",1),localStorage.removeItem("smde_localStorage")}catch{return!1}else return!1;return!0}var mc,Md,Vn,Ad,Dd,ra,hc,et,Pr,Bd,jd,Rd,Hd,Wd,Ud,wc=Cd(()=>{mc=/Mac/.test(navigator.platform),Md=new RegExp(/()+?/g),Vn={toggleBold:Ii,toggleItalic:Ni,drawLink:Gi,toggleHeadingSmaller:Jn,toggleHeadingBigger:ji,drawImage:Zi,toggleBlockquote:Bi,toggleOrderedList:$i,toggleUnorderedList:Ui,toggleCodeBlock:Pi,togglePreview:Ji,toggleStrikethrough:Oi,toggleHeading1:Ri,toggleHeading2:Hi,toggleHeading3:Wi,toggleHeading4:na,toggleHeading5:ia,toggleHeading6:oa,cleanBlock:Ki,drawTable:Xi,drawHorizontalRule:Yi,undo:Qi,redo:Vi,toggleSideBySide:bn,toggleFullScreen:Br},Ad={toggleBold:"Cmd-B",toggleItalic:"Cmd-I",drawLink:"Cmd-K",toggleHeadingSmaller:"Cmd-H",toggleHeadingBigger:"Shift-Cmd-H",toggleHeading1:"Ctrl+Alt+1",toggleHeading2:"Ctrl+Alt+2",toggleHeading3:"Ctrl+Alt+3",toggleHeading4:"Ctrl+Alt+4",toggleHeading5:"Ctrl+Alt+5",toggleHeading6:"Ctrl+Alt+6",cleanBlock:"Cmd-E",drawImage:"Cmd-Alt-I",toggleBlockquote:"Cmd-'",toggleOrderedList:"Cmd-Alt-L",toggleUnorderedList:"Cmd-L",toggleCodeBlock:"Cmd-Alt-C",togglePreview:"Cmd-P",toggleSideBySide:"F9",toggleFullScreen:"F11"},Dd=function(o){for(var p in Vn)if(Vn[p]===o)return p;return null},ra=function(){var o=!1;return(function(p){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(p)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(p.substr(0,4)))&&(o=!0)})(navigator.userAgent||navigator.vendor||window.opera),o};hc="";et={bold:"fa fa-bold",italic:"fa fa-italic",strikethrough:"fa fa-strikethrough",heading:"fa fa-header fa-heading","heading-smaller":"fa fa-header fa-heading header-smaller","heading-bigger":"fa fa-header fa-heading header-bigger","heading-1":"fa fa-header fa-heading header-1","heading-2":"fa fa-header fa-heading header-2","heading-3":"fa fa-header fa-heading header-3",code:"fa fa-code",quote:"fa fa-quote-left","ordered-list":"fa fa-list-ol","unordered-list":"fa fa-list-ul","clean-block":"fa fa-eraser",link:"fa fa-link",image:"fa fa-image","upload-image":"fa fa-image",table:"fa fa-table","horizontal-rule":"fa fa-minus",preview:"fa fa-eye","side-by-side":"fa fa-columns",fullscreen:"fa fa-arrows-alt",guide:"fa fa-question-circle",undo:"fa fa-undo",redo:"fa fa-repeat fa-redo"},Pr={bold:{name:"bold",action:Ii,className:et.bold,title:"Bold",default:!0},italic:{name:"italic",action:Ni,className:et.italic,title:"Italic",default:!0},strikethrough:{name:"strikethrough",action:Oi,className:et.strikethrough,title:"Strikethrough"},heading:{name:"heading",action:Jn,className:et.heading,title:"Heading",default:!0},"heading-smaller":{name:"heading-smaller",action:Jn,className:et["heading-smaller"],title:"Smaller Heading"},"heading-bigger":{name:"heading-bigger",action:ji,className:et["heading-bigger"],title:"Bigger Heading"},"heading-1":{name:"heading-1",action:Ri,className:et["heading-1"],title:"Big Heading"},"heading-2":{name:"heading-2",action:Hi,className:et["heading-2"],title:"Medium Heading"},"heading-3":{name:"heading-3",action:Wi,className:et["heading-3"],title:"Small Heading"},"separator-1":{name:"separator-1"},code:{name:"code",action:Pi,className:et.code,title:"Code"},quote:{name:"quote",action:Bi,className:et.quote,title:"Quote",default:!0},"unordered-list":{name:"unordered-list",action:Ui,className:et["unordered-list"],title:"Generic List",default:!0},"ordered-list":{name:"ordered-list",action:$i,className:et["ordered-list"],title:"Numbered List",default:!0},"clean-block":{name:"clean-block",action:Ki,className:et["clean-block"],title:"Clean block"},"separator-2":{name:"separator-2"},link:{name:"link",action:Gi,className:et.link,title:"Create Link",default:!0},image:{name:"image",action:Zi,className:et.image,title:"Insert Image",default:!0},"upload-image":{name:"upload-image",action:aa,className:et["upload-image"],title:"Import an image"},table:{name:"table",action:Xi,className:et.table,title:"Insert Table"},"horizontal-rule":{name:"horizontal-rule",action:Yi,className:et["horizontal-rule"],title:"Insert Horizontal Line"},"separator-3":{name:"separator-3"},preview:{name:"preview",action:Ji,className:et.preview,noDisable:!0,title:"Toggle Preview",default:!0},"side-by-side":{name:"side-by-side",action:bn,className:et["side-by-side"],noDisable:!0,noMobile:!0,title:"Toggle Side by Side",default:!0},fullscreen:{name:"fullscreen",action:Br,className:et.fullscreen,noDisable:!0,noMobile:!0,title:"Toggle Fullscreen",default:!0},"separator-4":{name:"separator-4"},guide:{name:"guide",action:"https://www.markdownguide.org/basic-syntax/",className:et.guide,noDisable:!0,title:"Markdown Guide",default:!0},"separator-5":{name:"separator-5"},undo:{name:"undo",action:Qi,className:et.undo,noDisable:!0,title:"Undo"},redo:{name:"redo",action:Vi,className:et.redo,noDisable:!0,title:"Redo"}},Bd={link:["[","](#url#)"],image:["![","](#url#)"],uploadedImage:["![](#url#)",""],table:["",` | Column 1 | Column 2 | Column 3 | | -------- | -------- | -------- | @@ -47,5 +47,5 @@ b`.split(/\n/).length!=3?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e. ----- -`]},Rd={link:"URL for the link:",image:"URL of the image:"},Hd={locale:"en-US",format:{hour:"2-digit",minute:"2-digit"}},Bd={bold:"**",code:"```",italic:"*"},Wd={sbInit:"Attach files by drag and dropping or pasting from clipboard.",sbOnDragEnter:"Drop image to upload it.",sbOnDrop:"Uploading image #images_names#...",sbProgress:"Uploading #file_name#: #progress#%",sbOnUploaded:"Uploaded #image_name#",sizeUnits:" B, KB, MB"},Ud={noFileGiven:"You must select a file.",typeNotAllowed:"This image type is not allowed.",fileTooLarge:`Image #image_name# is too big (#image_size#). -Maximum file size is #image_max_size#.`,importError:"Something went wrong when uploading the image #image_name#."};Te.prototype.uploadImages=function(o,p,v){if(o.length!==0){for(var C=[],b=0;b=2){var H=M[1];if(p.imagesPreviewHandler){var Z=p.imagesPreviewHandler(M[1]);typeof Z=="string"&&(H=Z)}if(window.EMDEimagesCache[H])w(R,window.EMDEimagesCache[H]);else{var ee=document.createElement("img");ee.onload=function(){window.EMDEimagesCache[H]={naturalWidth:ee.naturalWidth,naturalHeight:ee.naturalHeight,url:H},w(R,window.EMDEimagesCache[H])},ee.src=H}}}})}this.codemirror.on("update",function(){E()}),this.gui.sideBySide=this.createSideBySide(),this._rendered=this.element,(p.autofocus===!0||o.autofocus)&&this.codemirror.focus();var z=this.codemirror;setTimeout(function(){z.refresh()}.bind(z),0)};Te.prototype.cleanup=function(){document.removeEventListener("keydown",this.documentOnKeyDown)};Te.prototype.autosave=function(){if(kc()){var o=this;if(this.options.autosave.uniqueId==null||this.options.autosave.uniqueId==""){console.log("EasyMDE: You must set a uniqueId to use the autosave feature");return}this.options.autosave.binded!==!0&&(o.element.form!=null&&o.element.form!=null&&o.element.form.addEventListener("submit",function(){clearTimeout(o.autosaveTimeoutId),o.autosaveTimeoutId=void 0,localStorage.removeItem("smde_"+o.options.autosave.uniqueId)}),this.options.autosave.binded=!0),this.options.autosave.loaded!==!0&&(typeof localStorage.getItem("smde_"+this.options.autosave.uniqueId)=="string"&&localStorage.getItem("smde_"+this.options.autosave.uniqueId)!=""&&(this.codemirror.setValue(localStorage.getItem("smde_"+this.options.autosave.uniqueId)),this.options.autosave.foundSavedValue=!0),this.options.autosave.loaded=!0);var p=o.value();p!==""?localStorage.setItem("smde_"+this.options.autosave.uniqueId,p):localStorage.removeItem("smde_"+this.options.autosave.uniqueId);var v=document.getElementById("autosaved");if(v!=null&&v!=null&&v!=""){var C=new Date,b=new Intl.DateTimeFormat([this.options.autosave.timeFormat.locale,"en-US"],this.options.autosave.timeFormat.format).format(C),S=this.options.autosave.text==null?"Autosaved: ":this.options.autosave.text;v.innerHTML=S+b}}else console.log("EasyMDE: localStorage not available, cannot autosave")};Te.prototype.clearAutosavedValue=function(){if(kc()){if(this.options.autosave==null||this.options.autosave.uniqueId==null||this.options.autosave.uniqueId==""){console.log("EasyMDE: You must set a uniqueId to clear the autosave value");return}localStorage.removeItem("smde_"+this.options.autosave.uniqueId)}else console.log("EasyMDE: localStorage not available, cannot autosave")};Te.prototype.openBrowseFileWindow=function(o,p){var v=this,C=this.gui.toolbar.getElementsByClassName("imageInput")[0];C.click();function b(S){v.options.imageUploadFunction?v.uploadImagesUsingCustomFunction(v.options.imageUploadFunction,S.target.files):v.uploadImages(S.target.files,o,p),C.removeEventListener("change",b)}C.addEventListener("change",b)};Te.prototype.uploadImage=function(o,p,v){var C=this;p=p||function(T){yc(C,T)};function b(g){C.updateStatusBar("upload-image",g),setTimeout(function(){C.updateStatusBar("upload-image",C.options.imageTexts.sbInit)},1e4),v&&typeof v=="function"&&v(g),C.options.errorCallback(g)}function S(g){var T=C.options.imageTexts.sizeUnits.split(",");return g.replace("#image_name#",o.name).replace("#image_size#",Ii(o.size,T)).replace("#image_max_size#",Ii(C.options.imageMaxSize,T))}if(o.size>this.options.imageMaxSize){b(S(this.options.errorMessages.fileTooLarge));return}var s=new FormData;s.append("image",o),C.options.imageCSRFToken&&!C.options.imageCSRFHeader&&s.append(C.options.imageCSRFName,C.options.imageCSRFToken);var h=new XMLHttpRequest;h.upload.onprogress=function(g){if(g.lengthComputable){var T=""+Math.round(g.loaded*100/g.total);C.updateStatusBar("upload-image",C.options.imageTexts.sbProgress.replace("#file_name#",o.name).replace("#progress#",T))}},h.open("POST",this.options.imageUploadEndpoint),C.options.imageCSRFToken&&C.options.imageCSRFHeader&&h.setRequestHeader(C.options.imageCSRFName,C.options.imageCSRFToken),h.onload=function(){try{var g=JSON.parse(this.responseText)}catch{console.error("EasyMDE: The server did not return a valid json."),b(S(C.options.errorMessages.importError));return}this.status===200&&g&&!g.error&&g.data&&g.data.filePath?p((C.options.imagePathAbsolute?"":window.location.origin+"/")+g.data.filePath):g.error&&g.error in C.options.errorMessages?b(S(C.options.errorMessages[g.error])):g.error?b(S(g.error)):(console.error("EasyMDE: Received an unexpected response after uploading the image."+this.status+" ("+this.statusText+")"),b(S(C.options.errorMessages.importError)))},h.onerror=function(g){console.error("EasyMDE: An unexpected error occurred when trying to upload the image."+g.target.status+" ("+g.target.statusText+")"),b(C.options.errorMessages.importError)},h.send(s)};Te.prototype.uploadImageUsingCustomFunction=function(o,p){var v=this;function C(s){yc(v,s)}function b(s){var h=S(s);v.updateStatusBar("upload-image",h),setTimeout(function(){v.updateStatusBar("upload-image",v.options.imageTexts.sbInit)},1e4),v.options.errorCallback(h)}function S(s){var h=v.options.imageTexts.sizeUnits.split(",");return s.replace("#image_name#",p.name).replace("#image_size#",Ii(p.size,h)).replace("#image_max_size#",Ii(v.options.imageMaxSize,h))}o.apply(this,[p,C,b])};Te.prototype.setPreviewMaxHeight=function(){var o=this.codemirror,p=o.getWrapperElement(),v=p.nextSibling,C=parseInt(window.getComputedStyle(p).paddingTop),b=parseInt(window.getComputedStyle(p).borderTopWidth),S=parseInt(this.options.maxHeight),s=S+C*2+b*2,h=s.toString()+"px";v.style.height=h};Te.prototype.createSideBySide=function(){var o=this.codemirror,p=o.getWrapperElement(),v=p.nextSibling;if(!v||!v.classList.contains("editor-preview-side")){if(v=document.createElement("div"),v.className="editor-preview-side",this.options.previewClass)if(Array.isArray(this.options.previewClass))for(var C=0;C{try{let E=w[w.length-1];if(E.origin==="+input"){let z="(https://)",y=E.text[E.text.length-1];if(y.endsWith(z)&&y!=="[]"+z){let R=E.from,M=E.to,Z=E.text.length>1?0:R.ch;setTimeout(()=>{d.setSelection({line:M.line,ch:Z+y.lastIndexOf("(")+1},{line:M.line,ch:Z+y.lastIndexOf(")")})},25)}}}catch{}}),this.editor.codemirror.on("change",Alpine.debounce(()=>{this.editor&&(this.state=this.editor.value(),p&&this.$wire.call("$refresh"))},C??300)),v&&this.editor.codemirror.on("blur",()=>this.$wire.call("$refresh")),this.$watch("state",()=>{this.editor&&(this.editor.codemirror.hasFocus()||Alpine.raw(this.editor).value(this.state??""))}),h&&h(this)},destroy:function(){this.editor.cleanup(),this.editor=null},getToolbar:function(){let d=[];return x.includes("bold")&&d.push({name:"bold",action:EasyMDE.toggleBold,title:T.toolbar_buttons?.bold}),x.includes("italic")&&d.push({name:"italic",action:EasyMDE.toggleItalic,title:T.toolbar_buttons?.italic}),x.includes("strike")&&d.push({name:"strikethrough",action:EasyMDE.toggleStrikethrough,title:T.toolbar_buttons?.strike}),x.includes("link")&&d.push({name:"link",action:EasyMDE.drawLink,title:T.toolbar_buttons?.link}),["bold","italic","strike","link"].some(w=>x.includes(w))&&["heading"].some(w=>x.includes(w))&&d.push("|"),x.includes("heading")&&d.push({name:"heading",action:EasyMDE.toggleHeadingSmaller,title:T.toolbar_buttons?.heading}),["heading"].some(w=>x.includes(w))&&["blockquote","codeBlock","bulletList","orderedList"].some(w=>x.includes(w))&&d.push("|"),x.includes("blockquote")&&d.push({name:"quote",action:EasyMDE.toggleBlockquote,title:T.toolbar_buttons?.blockquote}),x.includes("codeBlock")&&d.push({name:"code",action:EasyMDE.toggleCodeBlock,title:T.toolbar_buttons?.code_block}),x.includes("bulletList")&&d.push({name:"unordered-list",action:EasyMDE.toggleUnorderedList,title:T.toolbar_buttons?.bullet_list}),x.includes("orderedList")&&d.push({name:"ordered-list",action:EasyMDE.toggleOrderedList,title:T.toolbar_buttons?.ordered_list}),["blockquote","codeBlock","bulletList","orderedList"].some(w=>x.includes(w))&&["table","attachFiles"].some(w=>x.includes(w))&&d.push("|"),x.includes("table")&&d.push({name:"table",action:EasyMDE.drawTable,title:T.toolbar_buttons?.table}),x.includes("attachFiles")&&d.push({name:"upload-image",action:EasyMDE.drawUploadedImage,title:T.toolbar_buttons?.attach_files}),["table","attachFiles"].some(w=>x.includes(w))&&["undo","redo"].some(w=>x.includes(w))&&d.push("|"),x.includes("undo")&&d.push({name:"undo",action:EasyMDE.undo,title:T.toolbar_buttons?.undo}),x.includes("redo")&&d.push({name:"redo",action:EasyMDE.redo,title:T.toolbar_buttons?.redo}),d}}}export{Kd as default}; +`]},jd={link:"URL for the link:",image:"URL of the image:"},Rd={locale:"en-US",format:{hour:"2-digit",minute:"2-digit"}},Hd={bold:"**",code:"```",italic:"*"},Wd={sbInit:"Attach files by drag and dropping or pasting from clipboard.",sbOnDragEnter:"Drop image to upload it.",sbOnDrop:"Uploading image #images_names#...",sbProgress:"Uploading #file_name#: #progress#%",sbOnUploaded:"Uploaded #image_name#",sizeUnits:" B, KB, MB"},Ud={noFileGiven:"You must select a file.",typeNotAllowed:"This image type is not allowed.",fileTooLarge:`Image #image_name# is too big (#image_size#). +Maximum file size is #image_max_size#.`,importError:"Something went wrong when uploading the image #image_name#."};Te.prototype.uploadImages=function(o,p,v){if(o.length!==0){for(var C=[],b=0;b!(q.closest&&q.closest(".editor-toolbar")||q.offsetParent===null)),re=J.indexOf(O);re!==-1&&re+1!(q.closest&&q.closest(".editor-toolbar")||q.offsetParent===null)),re=J.indexOf(O);if(re!==-1)for(let q=re-1;q>=0;q--){let I=J[q];if(I){I.focus();break}}}}for(var s in p.shortcuts)p.shortcuts[s]!==null&&Vn[s]!==null&&(function(E){C[vc(p.shortcuts[E])]=function(){var O=Vn[E];typeof O=="function"?O(v):typeof O=="string"&&window.open(O,"_blank")}})(s);C.Enter="newlineAndIndentContinueMarkdownList",C.Tab=E=>{let O=E.getSelection();O&&O.length>0?E.execCommand("indentMore"):b(E)},C["Shift-Tab"]=E=>{let O=E.getSelection();O&&O.length>0?E.execCommand("indentLess"):S(E)},C.Esc=function(E){E.getOption("fullScreen")&&Br(v)},this.documentOnKeyDown=function(E){E=E||window.event,E.keyCode==27&&v.codemirror.getOption("fullScreen")&&Br(v)},document.addEventListener("keydown",this.documentOnKeyDown,!1);var h,g;p.overlayMode?(CodeMirror.defineMode("overlay-mode",function(E){return CodeMirror.overlayMode(CodeMirror.getMode(E,p.spellChecker!==!1?"spell-checker":"gfm"),p.overlayMode.mode,p.overlayMode.combine)}),h="overlay-mode",g=p.parsingConfig,g.gitHubSpice=!1):(h=p.parsingConfig,h.name="gfm",h.gitHubSpice=!1),p.spellChecker!==!1&&(h="spell-checker",g=p.parsingConfig,g.name="gfm",g.gitHubSpice=!1,typeof p.spellChecker=="function"?p.spellChecker({codeMirrorInstance:CodeMirror}):CodeMirrorSpellChecker({codeMirrorInstance:CodeMirror}));function T(E,O,G){return{addNew:!1}}if(CodeMirror.getMode("php").mime="text/x-php",this.codemirror=CodeMirror.fromTextArea(o,{mode:h,backdrop:g,theme:p.theme!=null?p.theme:"easymde",tabSize:p.tabSize!=null?p.tabSize:2,indentUnit:p.tabSize!=null?p.tabSize:2,indentWithTabs:p.indentWithTabs!==!1,lineNumbers:p.lineNumbers===!0,autofocus:p.autofocus===!0,extraKeys:C,direction:p.direction,lineWrapping:p.lineWrapping!==!1,allowDropFileTypes:["text/plain"],placeholder:p.placeholder||o.getAttribute("placeholder")||"",styleSelectedText:p.styleSelectedText!=null?p.styleSelectedText:!ra(),scrollbarStyle:p.scrollbarStyle!=null?p.scrollbarStyle:"native",configureMouse:T,inputStyle:p.inputStyle!=null?p.inputStyle:ra()?"contenteditable":"textarea",spellcheck:p.nativeSpellcheck!=null?p.nativeSpellcheck:!0,autoRefresh:p.autoRefresh!=null?p.autoRefresh:!1}),this.codemirror.getScrollerElement().style.minHeight=p.minHeight,typeof p.maxHeight<"u"&&(this.codemirror.getScrollerElement().style.height=p.maxHeight),p.forceSync===!0){var w=this.codemirror;w.on("change",function(){w.save()})}this.gui={};var c=document.createElement("div");c.classList.add("EasyMDEContainer"),c.setAttribute("role","application");var d=this.codemirror.getWrapperElement();d.parentNode.insertBefore(c,d),c.appendChild(d),p.toolbar!==!1&&(this.gui.toolbar=this.createToolbar()),p.status!==!1&&(this.gui.statusbar=this.createStatusbar()),p.autosave!=null&&p.autosave.enabled===!0&&(this.autosave(),this.codemirror.on("change",function(){clearTimeout(v._autosave_timeout),v._autosave_timeout=setTimeout(function(){v.autosave()},v.options.autosave.submit_delay||v.options.autosave.delay||1e3)}));function k(E,O){var G,J=window.getComputedStyle(document.querySelector(".CodeMirror-sizer")).width.replace("px","");return E=2){var J=G[1];if(p.imagesPreviewHandler){var re=p.imagesPreviewHandler(G[1]);typeof re=="string"&&(J=re)}if(window.EMDEimagesCache[J])M(O,window.EMDEimagesCache[J]);else{var q=document.createElement("img");q.onload=function(){window.EMDEimagesCache[J]={naturalWidth:q.naturalWidth,naturalHeight:q.naturalHeight,url:J},M(O,window.EMDEimagesCache[J])},q.src=J}}}})}this.codemirror.on("update",function(){_()}),this.gui.sideBySide=this.createSideBySide(),this._rendered=this.element,(p.autofocus===!0||o.autofocus)&&this.codemirror.focus();var W=this.codemirror;setTimeout(function(){W.refresh()}.bind(W),0)};Te.prototype.cleanup=function(){document.removeEventListener("keydown",this.documentOnKeyDown)};Te.prototype.autosave=function(){if(kc()){var o=this;if(this.options.autosave.uniqueId==null||this.options.autosave.uniqueId==""){console.log("EasyMDE: You must set a uniqueId to use the autosave feature");return}this.options.autosave.binded!==!0&&(o.element.form!=null&&o.element.form!=null&&o.element.form.addEventListener("submit",function(){clearTimeout(o.autosaveTimeoutId),o.autosaveTimeoutId=void 0,localStorage.removeItem("smde_"+o.options.autosave.uniqueId)}),this.options.autosave.binded=!0),this.options.autosave.loaded!==!0&&(typeof localStorage.getItem("smde_"+this.options.autosave.uniqueId)=="string"&&localStorage.getItem("smde_"+this.options.autosave.uniqueId)!=""&&(this.codemirror.setValue(localStorage.getItem("smde_"+this.options.autosave.uniqueId)),this.options.autosave.foundSavedValue=!0),this.options.autosave.loaded=!0);var p=o.value();p!==""?localStorage.setItem("smde_"+this.options.autosave.uniqueId,p):localStorage.removeItem("smde_"+this.options.autosave.uniqueId);var v=document.getElementById("autosaved");if(v!=null&&v!=null&&v!=""){var C=new Date,b=new Intl.DateTimeFormat([this.options.autosave.timeFormat.locale,"en-US"],this.options.autosave.timeFormat.format).format(C),S=this.options.autosave.text==null?"Autosaved: ":this.options.autosave.text;v.innerHTML=S+b}}else console.log("EasyMDE: localStorage not available, cannot autosave")};Te.prototype.clearAutosavedValue=function(){if(kc()){if(this.options.autosave==null||this.options.autosave.uniqueId==null||this.options.autosave.uniqueId==""){console.log("EasyMDE: You must set a uniqueId to clear the autosave value");return}localStorage.removeItem("smde_"+this.options.autosave.uniqueId)}else console.log("EasyMDE: localStorage not available, cannot autosave")};Te.prototype.openBrowseFileWindow=function(o,p){var v=this,C=this.gui.toolbar.getElementsByClassName("imageInput")[0];C.click();function b(S){v.options.imageUploadFunction?v.uploadImagesUsingCustomFunction(v.options.imageUploadFunction,S.target.files):v.uploadImages(S.target.files,o,p),C.removeEventListener("change",b)}C.addEventListener("change",b)};Te.prototype.uploadImage=function(o,p,v){var C=this;p=p||function(T){yc(C,T)};function b(g){C.updateStatusBar("upload-image",g),setTimeout(function(){C.updateStatusBar("upload-image",C.options.imageTexts.sbInit)},1e4),v&&typeof v=="function"&&v(g),C.options.errorCallback(g)}function S(g){var T=C.options.imageTexts.sizeUnits.split(",");return g.replace("#image_name#",o.name).replace("#image_size#",Fi(o.size,T)).replace("#image_max_size#",Fi(C.options.imageMaxSize,T))}if(o.size>this.options.imageMaxSize){b(S(this.options.errorMessages.fileTooLarge));return}var s=new FormData;s.append("image",o),C.options.imageCSRFToken&&!C.options.imageCSRFHeader&&s.append(C.options.imageCSRFName,C.options.imageCSRFToken);var h=new XMLHttpRequest;h.upload.onprogress=function(g){if(g.lengthComputable){var T=""+Math.round(g.loaded*100/g.total);C.updateStatusBar("upload-image",C.options.imageTexts.sbProgress.replace("#file_name#",o.name).replace("#progress#",T))}},h.open("POST",this.options.imageUploadEndpoint),C.options.imageCSRFToken&&C.options.imageCSRFHeader&&h.setRequestHeader(C.options.imageCSRFName,C.options.imageCSRFToken),h.onload=function(){try{var g=JSON.parse(this.responseText)}catch{console.error("EasyMDE: The server did not return a valid json."),b(S(C.options.errorMessages.importError));return}this.status===200&&g&&!g.error&&g.data&&g.data.filePath?p((C.options.imagePathAbsolute?"":window.location.origin+"/")+g.data.filePath):g.error&&g.error in C.options.errorMessages?b(S(C.options.errorMessages[g.error])):g.error?b(S(g.error)):(console.error("EasyMDE: Received an unexpected response after uploading the image."+this.status+" ("+this.statusText+")"),b(S(C.options.errorMessages.importError)))},h.onerror=function(g){console.error("EasyMDE: An unexpected error occurred when trying to upload the image."+g.target.status+" ("+g.target.statusText+")"),b(C.options.errorMessages.importError)},h.send(s)};Te.prototype.uploadImageUsingCustomFunction=function(o,p){var v=this;function C(s){yc(v,s)}function b(s){var h=S(s);v.updateStatusBar("upload-image",h),setTimeout(function(){v.updateStatusBar("upload-image",v.options.imageTexts.sbInit)},1e4),v.options.errorCallback(h)}function S(s){var h=v.options.imageTexts.sizeUnits.split(",");return s.replace("#image_name#",p.name).replace("#image_size#",Fi(p.size,h)).replace("#image_max_size#",Fi(v.options.imageMaxSize,h))}o.apply(this,[p,C,b])};Te.prototype.setPreviewMaxHeight=function(){var o=this.codemirror,p=o.getWrapperElement(),v=p.nextSibling,C=parseInt(window.getComputedStyle(p).paddingTop),b=parseInt(window.getComputedStyle(p).borderTopWidth),S=parseInt(this.options.maxHeight),s=S+C*2+b*2,h=s.toString()+"px";v.style.height=h};Te.prototype.createSideBySide=function(){var o=this.codemirror,p=o.getWrapperElement(),v=p.nextSibling;if(!v||!v.classList.contains("editor-preview-side")){if(v=document.createElement("div"),v.className="editor-preview-side",this.options.previewClass)if(Array.isArray(this.options.previewClass))for(var C=0;CsetTimeout(d,300)),this.$root._editor&&(this.$root._editor.toTextArea(),this.$root._editor=null),this.$root._editor=this.editor=new EasyMDE({autoDownloadFontAwesome:!1,autoRefresh:!0,autoSave:!1,element:this.$refs.editor,imageAccept:"image/png, image/jpeg, image/gif, image/avif, image/webp",imageUploadFunction:c,initialValue:this.state??"",maxHeight:b,minHeight:S,placeholder:s,previewImagesInEditor:!0,spellChecker:!1,status:[{className:"upload-image",defaultValue:""}],toolbar:this.getToolbar(),uploadImage:o}),this.editor.codemirror.setOption("direction",document.documentElement?.dir??"ltr"),this.editor.codemirror.on("changes",(d,k)=>{try{let z=k[k.length-1];if(z.origin==="+input"){let M="(https://)",_=z.text[z.text.length-1];if(_.endsWith(M)&&_!=="[]"+M){let W=z.from,E=z.to,G=z.text.length>1?0:W.ch;setTimeout(()=>{d.setSelection({line:E.line,ch:G+_.lastIndexOf("(")+1},{line:E.line,ch:G+_.lastIndexOf(")")})},25)}}}catch{}}),this.editor.codemirror.on("change",Alpine.debounce(()=>{this.editor&&(this.state=this.editor.value(),p&&this.$wire.commit())},C??300)),v&&this.editor.codemirror.on("blur",()=>this.$wire.commit()),this.$watch("state",()=>{this.editor&&(this.editor.codemirror.hasFocus()||Alpine.raw(this.editor).value(this.state??""))}),h&&h(this)},destroy(){this.editor.cleanup(),this.editor=null},getToolbar(){let d=[];return w.forEach(k=>{k.forEach(z=>d.push(this.getToolbarButton(z))),k.length>0&&d.push("|")}),d[d.length-1]==="|"&&d.pop(),d},getToolbarButton(d){if(d==="bold")return this.getBoldToolbarButton();if(d==="italic")return this.getItalicToolbarButton();if(d==="strike")return this.getStrikeToolbarButton();if(d==="link")return this.getLinkToolbarButton();if(d==="heading")return this.getHeadingToolbarButton();if(d==="blockquote")return this.getBlockquoteToolbarButton();if(d==="codeBlock")return this.getCodeBlockToolbarButton();if(d==="bulletList")return this.getBulletListToolbarButton();if(d==="orderedList")return this.getOrderedListToolbarButton();if(d==="table")return this.getTableToolbarButton();if(d==="attachFiles")return this.getAttachFilesToolbarButton();if(d==="undo")return this.getUndoToolbarButton();if(d==="redo")return this.getRedoToolbarButton();console.error(`Markdown editor toolbar button "${d}" not found.`)},getBoldToolbarButton(){return{name:"bold",action:EasyMDE.toggleBold,title:T.tools?.bold}},getItalicToolbarButton(){return{name:"italic",action:EasyMDE.toggleItalic,title:T.tools?.italic}},getStrikeToolbarButton(){return{name:"strikethrough",action:EasyMDE.toggleStrikethrough,title:T.tools?.strike}},getLinkToolbarButton(){return{name:"link",action:EasyMDE.drawLink,title:T.tools?.link}},getHeadingToolbarButton(){return{name:"heading",action:EasyMDE.toggleHeadingSmaller,title:T.tools?.heading}},getBlockquoteToolbarButton(){return{name:"quote",action:EasyMDE.toggleBlockquote,title:T.tools?.blockquote}},getCodeBlockToolbarButton(){return{name:"code",action:EasyMDE.toggleCodeBlock,title:T.tools?.code_block}},getBulletListToolbarButton(){return{name:"unordered-list",action:EasyMDE.toggleUnorderedList,title:T.tools?.bullet_list}},getOrderedListToolbarButton(){return{name:"ordered-list",action:EasyMDE.toggleOrderedList,title:T.tools?.ordered_list}},getTableToolbarButton(){return{name:"table",action:EasyMDE.drawTable,title:T.tools?.table}},getAttachFilesToolbarButton(){return{name:"upload-image",action:EasyMDE.drawUploadedImage,title:T.tools?.attach_files}},getUndoToolbarButton(){return{name:"undo",action:EasyMDE.undo,title:T.tools?.undo}},getRedoToolbarButton(){return{name:"redo",action:EasyMDE.redo,title:T.tools?.redo}}}}export{Kd as default}; diff --git a/public/js/filament/forms/components/rich-editor.js b/public/js/filament/forms/components/rich-editor.js index 712b5c6596..c4e6984c70 100644 --- a/public/js/filament/forms/components/rich-editor.js +++ b/public/js/filament/forms/components/rich-editor.js @@ -1,144 +1,144 @@ -var Mi="2.1.5",K="[data-trix-attachment]",je={preview:{presentation:"gallery",caption:{name:!0,size:!0}},file:{caption:{size:!0}}},y={default:{tagName:"div",parse:!1},quote:{tagName:"blockquote",nestable:!0},heading1:{tagName:"h1",terminal:!0,breakOnReturn:!0,group:!1},code:{tagName:"pre",terminal:!0,htmlAttributes:["language"],text:{plaintext:!0}},bulletList:{tagName:"ul",parse:!1},bullet:{tagName:"li",listAttribute:"bulletList",group:!1,nestable:!0,test(n){return Je(n.parentNode)===y[this.listAttribute].tagName}},numberList:{tagName:"ol",parse:!1},number:{tagName:"li",listAttribute:"numberList",group:!1,nestable:!0,test(n){return Je(n.parentNode)===y[this.listAttribute].tagName}},attachmentGallery:{tagName:"div",exclusive:!0,terminal:!0,parse:!1,group:!1}},Je=n=>{var t;return n==null||(t=n.tagName)===null||t===void 0?void 0:t.toLowerCase()},Ke=navigator.userAgent.match(/android\s([0-9]+.*Chrome)/i),se=Ke&&parseInt(Ke[1]),St={composesExistingText:/Android.*Chrome/.test(navigator.userAgent),recentAndroid:se&&se>12,samsungAndroid:se&&navigator.userAgent.match(/Android.*SM-/),forcesObjectResizing:/Trident.*rv:11/.test(navigator.userAgent),supportsInputEvents:typeof InputEvent<"u"&&["data","getTargetRanges","inputType"].every(n=>n in InputEvent.prototype)},h={attachFiles:"Attach Files",bold:"Bold",bullets:"Bullets",byte:"Byte",bytes:"Bytes",captionPlaceholder:"Add a caption\u2026",code:"Code",heading1:"Heading",indent:"Increase Level",italic:"Italic",link:"Link",numbers:"Numbers",outdent:"Decrease Level",quote:"Quote",redo:"Redo",remove:"Remove",strike:"Strikethrough",undo:"Undo",unlink:"Unlink",url:"URL",urlPlaceholder:"Enter a URL\u2026",GB:"GB",KB:"KB",MB:"MB",PB:"PB",TB:"TB"},ji=[h.bytes,h.KB,h.MB,h.GB,h.TB,h.PB],vi={prefix:"IEC",precision:2,formatter(n){switch(n){case 0:return"0 ".concat(h.bytes);case 1:return"1 ".concat(h.byte);default:let t;this.prefix==="SI"?t=1e3:this.prefix==="IEC"&&(t=1024);let e=Math.floor(Math.log(n)/Math.log(t)),i=(n/Math.pow(t,e)).toFixed(this.precision).replace(/0*$/,"").replace(/\.$/,"");return"".concat(i," ").concat(ji[e])}}},te="\uFEFF",U="\xA0",Ai=function(n){for(let t in n){let e=n[t];this[t]=e}return this},We=document.documentElement,Wi=We.matches,p=function(n){let{onElement:t,matchingSelector:e,withCallback:i,inPhase:r,preventDefault:o,times:s}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a=t||We,l=e,c=r==="capturing",u=function(b){s!=null&&--s==0&&u.destroy();let A=q(b.target,{matchingSelector:l});A!=null&&(i?.call(A,b,A),o&&b.preventDefault())};return u.destroy=()=>a.removeEventListener(n,u,c),a.addEventListener(n,u,c),u},vt=function(n){let{onElement:t,bubbles:e,cancelable:i,attributes:r}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=t??We;e=e!==!1,i=i!==!1;let s=document.createEvent("Events");return s.initEvent(n,e,i),r!=null&&Ai.call(s,r),o.dispatchEvent(s)},xi=function(n,t){if(n?.nodeType===1)return Wi.call(n,t)},q=function(n){let{matchingSelector:t,untilNode:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};for(;n&&n.nodeType!==Node.ELEMENT_NODE;)n=n.parentNode;if(n!=null){if(t==null)return n;if(n.closest&&e==null)return n.closest(t);for(;n&&n!==e;){if(xi(n,t))return n;n=n.parentNode}}},Ue=n=>document.activeElement!==n&&J(n,document.activeElement),J=function(n,t){if(n&&t)for(;t;){if(t===n)return!0;t=t.parentNode}},ae=function(n){var t;if((t=n)===null||t===void 0||!t.parentNode)return;let e=0;for(n=n.previousSibling;n;)e++,n=n.previousSibling;return e},V=n=>{var t;return n==null||(t=n.parentNode)===null||t===void 0?void 0:t.removeChild(n)},Ft=function(n){let{onlyNodesOfType:t,usingFilter:e,expandEntityReferences:i}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=(()=>{switch(t){case"element":return NodeFilter.SHOW_ELEMENT;case"text":return NodeFilter.SHOW_TEXT;case"comment":return NodeFilter.SHOW_COMMENT;default:return NodeFilter.SHOW_ALL}})();return document.createTreeWalker(n,r,e??null,i===!0)},x=n=>{var t;return n==null||(t=n.tagName)===null||t===void 0?void 0:t.toLowerCase()},d=function(n){let t,e,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};typeof n=="object"?(i=n,n=i.tagName):i={attributes:i};let r=document.createElement(n);if(i.editable!=null&&(i.attributes==null&&(i.attributes={}),i.attributes.contenteditable=i.editable),i.attributes)for(t in i.attributes)e=i.attributes[t],r.setAttribute(t,e);if(i.style)for(t in i.style)e=i.style[t],r.style[t]=e;if(i.data)for(t in i.data)e=i.data[t],r.dataset[t]=e;return i.className&&i.className.split(" ").forEach(o=>{r.classList.add(o)}),i.textContent&&(r.textContent=i.textContent),i.childNodes&&[].concat(i.childNodes).forEach(o=>{r.appendChild(o)}),r},pt,At=function(){if(pt!=null)return pt;pt=[];for(let n in y){let t=y[n];t.tagName&&pt.push(t.tagName)}return pt},le=n=>ot(n?.firstChild),$e=function(n){let{strict:t}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{strict:!0};return t?ot(n):ot(n)||!ot(n.firstChild)&&function(e){return At().includes(x(e))&&!At().includes(x(e.firstChild))}(n)},ot=n=>Ui(n)&&n?.data==="block",Ui=n=>n?.nodeType===Node.COMMENT_NODE,st=function(n){let{name:t}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(n)return xt(n)?n.data===te?!t||n.parentNode.dataset.trixCursorTarget===t:void 0:st(n.firstChild)},$=n=>xi(n,K),yi=n=>xt(n)&&n?.data==="",xt=n=>n?.nodeType===Node.TEXT_NODE,qe={level2Enabled:!0,getLevel(){return this.level2Enabled&&St.supportsInputEvents?2:0},pickFiles(n){let t=d("input",{type:"file",multiple:!0,hidden:!0,id:this.fileInputId});t.addEventListener("change",()=>{n(t.files),V(t)}),V(document.getElementById(this.fileInputId)),document.body.appendChild(t),t.click()}},Tt={removeBlankTableCells:!1,tableCellSeparator:" | ",tableRowSeparator:` -`},Y={bold:{tagName:"strong",inheritable:!0,parser(n){let t=window.getComputedStyle(n);return t.fontWeight==="bold"||t.fontWeight>=600}},italic:{tagName:"em",inheritable:!0,parser:n=>window.getComputedStyle(n).fontStyle==="italic"},href:{groupTagName:"a",parser(n){let t="a:not(".concat(K,")"),e=n.closest(t);if(e)return e.getAttribute("href")}},strike:{tagName:"del",inheritable:!0},frozen:{style:{backgroundColor:"highlight"}}},Ci={getDefaultHTML:()=>`
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
`)},Re={interval:5e3},Lt=Object.freeze({__proto__:null,attachments:je,blockAttributes:y,browser:St,css:{attachment:"attachment",attachmentCaption:"attachment__caption",attachmentCaptionEditor:"attachment__caption-editor",attachmentMetadata:"attachment__metadata",attachmentMetadataContainer:"attachment__metadata-container",attachmentName:"attachment__name",attachmentProgress:"attachment__progress",attachmentSize:"attachment__size",attachmentToolbar:"attachment__toolbar",attachmentGallery:"attachment-gallery"},fileSize:vi,input:qe,keyNames:{8:"backspace",9:"tab",13:"return",27:"escape",37:"left",39:"right",46:"delete",68:"d",72:"h",79:"o"},lang:h,parser:Tt,textAttributes:Y,toolbar:Ci,undo:Re}),f=class{static proxyMethod(t){let{name:e,toMethod:i,toProperty:r,optional:o}=qi(t);this.prototype[e]=function(){let s,a;var l,c;return i?a=o?(l=this[i])===null||l===void 0?void 0:l.call(this):this[i]():r&&(a=this[r]),o?(s=(c=a)===null||c===void 0?void 0:c[e],s?Ge.call(s,a,arguments):void 0):(s=a[e],Ge.call(s,a,arguments))}}},qi=function(n){let t=n.match(Vi);if(!t)throw new Error("can't parse @proxyMethod expression: ".concat(n));let e={name:t[4]};return t[2]!=null?e.toMethod=t[1]:e.toProperty=t[1],t[3]!=null&&(e.optional=!0),e},{apply:Ge}=Function.prototype,Vi=new RegExp("^(.+?)(\\(\\))?(\\?)?\\.(.+?)$"),ce,ue,he,Z=class extends f{static box(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return t instanceof this?t:this.fromUCS2String(t?.toString())}static fromUCS2String(t){return new this(t,Ee(t))}static fromCodepoints(t){return new this(Se(t),t)}constructor(t,e){super(...arguments),this.ucs2String=t,this.codepoints=e,this.length=this.codepoints.length,this.ucs2Length=this.ucs2String.length}offsetToUCS2Offset(t){return Se(this.codepoints.slice(0,Math.max(0,t))).length}offsetFromUCS2Offset(t){return Ee(this.ucs2String.slice(0,Math.max(0,t))).length}slice(){return this.constructor.fromCodepoints(this.codepoints.slice(...arguments))}charAt(t){return this.slice(t,t+1)}isEqualTo(t){return this.constructor.box(t).ucs2String===this.ucs2String}toJSON(){return this.ucs2String}getCacheKey(){return this.ucs2String}toString(){return this.ucs2String}},Hi=((ce=Array.from)===null||ce===void 0?void 0:ce.call(Array,"\u{1F47C}").length)===1,zi=((ue=" ".codePointAt)===null||ue===void 0?void 0:ue.call(" ",0))!=null,_i=((he=String.fromCodePoint)===null||he===void 0?void 0:he.call(String,32,128124))===" \u{1F47C}",Ee,Se;Ee=Hi&&zi?n=>Array.from(n).map(t=>t.codePointAt(0)):function(n){let t=[],e=0,{length:i}=n;for(;eString.fromCodePoint(...Array.from(n||[])):function(n){return(()=>{let t=[];return Array.from(n).forEach(e=>{let i="";e>65535&&(e-=65536,i+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t.push(i+String.fromCharCode(e))}),t})().join("")};var Ji=0,O=class extends f{static fromJSONString(t){return this.fromJSON(JSON.parse(t))}constructor(){super(...arguments),this.id=++Ji}hasSameConstructorAs(t){return this.constructor===t?.constructor}isEqualTo(t){return this===t}inspect(){let t=[],e=this.contentsForInspection()||{};for(let i in e){let r=e[i];t.push("".concat(i,"=").concat(r))}return"#<".concat(this.constructor.name,":").concat(this.id).concat(t.length?" ".concat(t.join(", ")):"",">")}contentsForInspection(){}toJSONString(){return JSON.stringify(this)}toUTF16String(){return Z.box(this)}getCacheKey(){return this.id.toString()}},Q=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];if(n.length!==t.length)return!1;for(let e=0;e1?e-1:0),r=1;r(de||(de=Xi().concat(Gi())),de),v=n=>y[n],Gi=()=>(ge||(ge=Object.keys(y)),ge),De=n=>Y[n],Xi=()=>(me||(me=Object.keys(Y)),me),ki=function(n,t){Yi(n).textContent=t.replace(/%t/g,n)},Yi=function(n){let t=document.createElement("style");t.setAttribute("type","text/css"),t.setAttribute("data-tag-name",n.toLowerCase());let e=Zi();return e&&t.setAttribute("nonce",e),document.head.insertBefore(t,document.head.firstChild),t},Zi=function(){let n=Xe("trix-csp-nonce")||Xe("csp-nonce");if(n)return n.getAttribute("content")},Xe=n=>document.head.querySelector("meta[name=".concat(n,"]")),Ye={"application/x-trix-feature-detection":"test"},Ri=function(n){let t=n.getData("text/plain"),e=n.getData("text/html");if(!t||!e)return t?.length;{let{body:i}=new DOMParser().parseFromString(e,"text/html");if(i.textContent===t)return!i.querySelector("*")}},Ei=/Mac|^iP/.test(navigator.platform)?n=>n.metaKey:n=>n.ctrlKey,He=n=>setTimeout(n,1),Si=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t={};for(let e in n){let i=n[e];t[e]=i}return t},dt=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(Object.keys(n).length!==Object.keys(t).length)return!1;for(let e in n)if(n[e]!==t[e])return!1;return!0},g=function(n){if(n!=null)return Array.isArray(n)||(n=[n,n]),[Ze(n[0]),Ze(n[1]!=null?n[1]:n[0])]},N=function(n){if(n==null)return;let[t,e]=g(n);return we(t,e)},Pt=function(n,t){if(n==null||t==null)return;let[e,i]=g(n),[r,o]=g(t);return we(e,r)&&we(i,o)},Ze=function(n){return typeof n=="number"?n:Si(n)},we=function(n,t){return typeof n=="number"?n===t:dt(n,t)},It=class extends f{constructor(){super(...arguments),this.update=this.update.bind(this),this.selectionManagers=[]}start(){this.started||(this.started=!0,document.addEventListener("selectionchange",this.update,!0))}stop(){if(this.started)return this.started=!1,document.removeEventListener("selectionchange",this.update,!0)}registerSelectionManager(t){if(!this.selectionManagers.includes(t))return this.selectionManagers.push(t),this.start()}unregisterSelectionManager(t){if(this.selectionManagers=this.selectionManagers.filter(e=>e!==t),this.selectionManagers.length===0)return this.stop()}notifySelectionManagersOfSelectionChange(){return this.selectionManagers.map(t=>t.selectionDidChange())}update(){this.notifySelectionManagersOfSelectionChange()}reset(){this.update()}},tt=new It,Li=function(){let n=window.getSelection();if(n.rangeCount>0)return n},yt=function(){var n;let t=(n=Li())===null||n===void 0?void 0:n.getRangeAt(0);if(t&&!Qi(t))return t},Di=function(n){let t=window.getSelection();return t.removeAllRanges(),t.addRange(n),tt.update()},Qi=n=>Qe(n.startContainer)||Qe(n.endContainer),Qe=n=>!Object.getPrototypeOf(n),bt=n=>n.replace(new RegExp("".concat(te),"g"),"").replace(new RegExp("".concat(U),"g")," "),ze=new RegExp("[^\\S".concat(U,"]")),_e=n=>n.replace(new RegExp("".concat(ze.source),"g")," ").replace(/\ {2,}/g," "),ti=function(n,t){if(n.isEqualTo(t))return["",""];let e=pe(n,t),{length:i}=e.utf16String,r;if(i){let{offset:o}=e,s=n.codepoints.slice(0,o).concat(n.codepoints.slice(o+i));r=pe(t,Z.fromCodepoints(s))}else r=pe(t,n);return[e.utf16String.toString(),r.utf16String.toString()]},pe=function(n,t){let e=0,i=n.length,r=t.length;for(;ee+1&&n.charAt(i-1).isEqualTo(t.charAt(r-1));)i--,r--;return{utf16String:n.slice(e,i),offset:e}},C=class extends O{static fromCommonAttributesOfObjects(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];if(!t.length)return new this;let e=ft(t[0]),i=e.getKeys();return t.slice(1).forEach(r=>{i=e.getKeysCommonToHash(ft(r)),e=e.slice(i)}),e}static box(t){return ft(t)}constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};super(...arguments),this.values=Bt(t)}add(t,e){return this.merge(tn(t,e))}remove(t){return new C(Bt(this.values,t))}get(t){return this.values[t]}has(t){return t in this.values}merge(t){return new C(en(this.values,nn(t)))}slice(t){let e={};return Array.from(t).forEach(i=>{this.has(i)&&(e[i]=this.values[i])}),new C(e)}getKeys(){return Object.keys(this.values)}getKeysCommonToHash(t){return t=ft(t),this.getKeys().filter(e=>this.values[e]===t.values[e])}isEqualTo(t){return Q(this.toArray(),ft(t).toArray())}isEmpty(){return this.getKeys().length===0}toArray(){if(!this.array){let t=[];for(let e in this.values){let i=this.values[e];t.push(t.push(e,i))}this.array=t.slice(0)}return this.array}toObject(){return Bt(this.values)}toJSON(){return this.toObject()}contentsForInspection(){return{values:JSON.stringify(this.values)}}},tn=function(n,t){let e={};return e[n]=t,e},en=function(n,t){let e=Bt(n);for(let i in t){let r=t[i];e[i]=r}return e},Bt=function(n,t){let e={};return Object.keys(n).sort().forEach(i=>{i!==t&&(e[i]=n[i])}),e},ft=function(n){return n instanceof C?n:new C(n)},nn=function(n){return n instanceof C?n.values:n},Ct=class{static groupObjects(){let t,e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],{depth:i,asTree:r}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};r&&i==null&&(i=0);let o=[];return Array.from(e).forEach(s=>{var a;if(t){var l,c,u;if((l=s.canBeGrouped)!==null&&l!==void 0&&l.call(s,i)&&(c=(u=t[t.length-1]).canBeGroupedWith)!==null&&c!==void 0&&c.call(u,s,i))return void t.push(s);o.push(new this(t,{depth:i,asTree:r})),t=null}(a=s.canBeGrouped)!==null&&a!==void 0&&a.call(s,i)?t=[s]:o.push(s)}),t&&o.push(new this(t,{depth:i,asTree:r})),o}constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],{depth:e,asTree:i}=arguments.length>1?arguments[1]:void 0;this.objects=t,i&&(this.depth=e,this.objects=this.constructor.groupObjects(this.objects,{asTree:i,depth:this.depth+1}))}getObjects(){return this.objects}getDepth(){return this.depth}getCacheKey(){let t=["objectGroup"];return Array.from(this.getObjects()).forEach(e=>{t.push(e.getCacheKey())}),t.join("/")}},Te=class extends f{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];super(...arguments),this.objects={},Array.from(t).forEach(e=>{let i=JSON.stringify(e);this.objects[i]==null&&(this.objects[i]=e)})}find(t){let e=JSON.stringify(t);return this.objects[e]}},Be=class{constructor(t){this.reset(t)}add(t){let e=ei(t);this.elements[e]=t}remove(t){let e=ei(t),i=this.elements[e];if(i)return delete this.elements[e],i}reset(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];return this.elements={},Array.from(t).forEach(e=>{this.add(e)}),t}},ei=n=>n.dataset.trixStoreKey,at=class extends f{isPerforming(){return this.performing===!0}hasPerformed(){return this.performed===!0}hasSucceeded(){return this.performed&&this.succeeded}hasFailed(){return this.performed&&!this.succeeded}getPromise(){return this.promise||(this.promise=new Promise((t,e)=>(this.performing=!0,this.perform((i,r)=>{this.succeeded=i,this.performing=!1,this.performed=!0,this.succeeded?t(r):e(r)})))),this.promise}perform(t){return t(!1)}release(){var t,e;(t=this.promise)===null||t===void 0||(e=t.cancel)===null||e===void 0||e.call(t),this.promise=null,this.performing=null,this.performed=null,this.succeeded=null}};at.proxyMethod("getPromise().then"),at.proxyMethod("getPromise().catch");var M=class extends f{constructor(t){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(...arguments),this.object=t,this.options=e,this.childViews=[],this.rootView=this}getNodes(){return this.nodes||(this.nodes=this.createNodes()),this.nodes.map(t=>t.cloneNode(!0))}invalidate(){var t;return this.nodes=null,this.childViews=[],(t=this.parentView)===null||t===void 0?void 0:t.invalidate()}invalidateViewForObject(t){var e;return(e=this.findViewForObject(t))===null||e===void 0?void 0:e.invalidate()}findOrCreateCachedChildView(t,e,i){let r=this.getCachedViewForObject(e);return r?this.recordChildView(r):(r=this.createChildView(...arguments),this.cacheViewForObject(r,e)),r}createChildView(t,e){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};e instanceof Ct&&(i.viewClass=t,t=Fe);let r=new t(e,i);return this.recordChildView(r)}recordChildView(t){return t.parentView=this,t.rootView=this.rootView,this.childViews.push(t),t}getAllChildViews(){let t=[];return this.childViews.forEach(e=>{t.push(e),t=t.concat(e.getAllChildViews())}),t}findElement(){return this.findElementForObject(this.object)}findElementForObject(t){let e=t?.id;if(e)return this.rootView.element.querySelector("[data-trix-id='".concat(e,"']"))}findViewForObject(t){for(let e of this.getAllChildViews())if(e.object===t)return e}getViewCache(){return this.rootView!==this?this.rootView.getViewCache():this.isViewCachingEnabled()?(this.viewCache||(this.viewCache={}),this.viewCache):void 0}isViewCachingEnabled(){return this.shouldCacheViews!==!1}enableViewCaching(){this.shouldCacheViews=!0}disableViewCaching(){this.shouldCacheViews=!1}getCachedViewForObject(t){var e;return(e=this.getViewCache())===null||e===void 0?void 0:e[t.getCacheKey()]}cacheViewForObject(t,e){let i=this.getViewCache();i&&(i[e.getCacheKey()]=t)}garbageCollectCachedViews(){let t=this.getViewCache();if(t){let e=this.getAllChildViews().concat(this).map(i=>i.object.getCacheKey());for(let i in t)e.includes(i)||delete t[i]}}},Fe=class extends M{constructor(){super(...arguments),this.objectGroup=this.object,this.viewClass=this.options.viewClass,delete this.options.viewClass}getChildViews(){return this.childViews.length||Array.from(this.objectGroup.getObjects()).forEach(t=>{this.findOrCreateCachedChildView(this.viewClass,t,this.options)}),this.childViews}createNodes(){let t=this.createContainerElement();return this.getChildViews().forEach(e=>{Array.from(e.getNodes()).forEach(i=>{t.appendChild(i)})}),[t]}createContainerElement(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.objectGroup.getDepth();return this.getChildViews()[0].createContainerElement(t)}},rn="style href src width height language class".split(" "),on="javascript:".split(" "),sn="script iframe form noscript".split(" "),lt=class extends f{static setHTML(t,e){let i=new this(e).sanitize(),r=i.getHTML?i.getHTML():i.outerHTML;t.innerHTML=r}static sanitize(t,e){let i=new this(t,e);return i.sanitize(),i}constructor(t){let{allowedAttributes:e,forbiddenProtocols:i,forbiddenElements:r}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(...arguments),this.allowedAttributes=e||rn,this.forbiddenProtocols=i||on,this.forbiddenElements=r||sn,this.body=an(t)}sanitize(){return this.sanitizeElements(),this.normalizeListElementNesting()}getHTML(){return this.body.innerHTML}getBody(){return this.body}sanitizeElements(){let t=Ft(this.body),e=[];for(;t.nextNode();){let i=t.currentNode;switch(i.nodeType){case Node.ELEMENT_NODE:this.elementIsRemovable(i)?e.push(i):this.sanitizeElement(i);break;case Node.COMMENT_NODE:e.push(i)}}return e.forEach(i=>V(i)),this.body}sanitizeElement(t){return t.hasAttribute("href")&&this.forbiddenProtocols.includes(t.protocol)&&t.removeAttribute("href"),Array.from(t.attributes).forEach(e=>{let{name:i}=e;this.allowedAttributes.includes(i)||i.indexOf("data-trix")===0||t.removeAttribute(i)}),t}normalizeListElementNesting(){return Array.from(this.body.querySelectorAll("ul,ol")).forEach(t=>{let e=t.previousElementSibling;e&&x(e)==="li"&&e.appendChild(t)}),this.body}elementIsRemovable(t){if(t?.nodeType===Node.ELEMENT_NODE)return this.elementIsForbidden(t)||this.elementIsntSerializable(t)}elementIsForbidden(t){return this.forbiddenElements.includes(x(t))}elementIsntSerializable(t){return t.getAttribute("data-trix-serialize")==="false"&&!$(t)}},an=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";n=n.replace(/<\/html[^>]*>[^]*$/i,"");let t=document.implementation.createHTMLDocument("");return t.documentElement.innerHTML=n,Array.from(t.head.querySelectorAll("style")).forEach(e=>{t.body.appendChild(e)}),t.body},{css:W}=Lt,kt=class extends M{constructor(){super(...arguments),this.attachment=this.object,this.attachment.uploadProgressDelegate=this,this.attachmentPiece=this.options.piece}createContentNodes(){return[]}createNodes(){let t,e=t=d({tagName:"figure",className:this.getClassName(),data:this.getData(),editable:!1}),i=this.getHref();return i&&(t=d({tagName:"a",editable:!1,attributes:{href:i,tabindex:-1}}),e.appendChild(t)),this.attachment.hasContent()?lt.setHTML(t,this.attachment.getContent()):this.createContentNodes().forEach(r=>{t.appendChild(r)}),t.appendChild(this.createCaptionElement()),this.attachment.isPending()&&(this.progressElement=d({tagName:"progress",attributes:{class:W.attachmentProgress,value:this.attachment.getUploadProgress(),max:100},data:{trixMutable:!0,trixStoreKey:["progressElement",this.attachment.id].join("/")}}),e.appendChild(this.progressElement)),[ii("left"),e,ii("right")]}createCaptionElement(){let t=d({tagName:"figcaption",className:W.attachmentCaption}),e=this.attachmentPiece.getCaption();if(e)t.classList.add("".concat(W.attachmentCaption,"--edited")),t.textContent=e;else{let i,r,o=this.getCaptionConfig();if(o.name&&(i=this.attachment.getFilename()),o.size&&(r=this.attachment.getFormattedFilesize()),i){let s=d({tagName:"span",className:W.attachmentName,textContent:i});t.appendChild(s)}if(r){i&&t.appendChild(document.createTextNode(" "));let s=d({tagName:"span",className:W.attachmentSize,textContent:r});t.appendChild(s)}}return t}getClassName(){let t=[W.attachment,"".concat(W.attachment,"--").concat(this.attachment.getType())],e=this.attachment.getExtension();return e&&t.push("".concat(W.attachment,"--").concat(e)),t.join(" ")}getData(){let t={trixAttachment:JSON.stringify(this.attachment),trixContentType:this.attachment.getContentType(),trixId:this.attachment.id},{attributes:e}=this.attachmentPiece;return e.isEmpty()||(t.trixAttributes=JSON.stringify(e)),this.attachment.isPending()&&(t.trixSerialize=!1),t}getHref(){if(!ln(this.attachment.getContent(),"a"))return this.attachment.getHref()}getCaptionConfig(){var t;let e=this.attachment.getType(),i=Si((t=je[e])===null||t===void 0?void 0:t.caption);return e==="file"&&(i.name=!0),i}findProgressElement(){var t;return(t=this.findElement())===null||t===void 0?void 0:t.querySelector("progress")}attachmentDidChangeUploadProgress(){let t=this.attachment.getUploadProgress(),e=this.findProgressElement();e&&(e.value=t)}},ii=n=>d({tagName:"span",textContent:te,data:{trixCursorTarget:n,trixSerialize:!1}}),ln=function(n,t){let e=d("div");return lt.setHTML(e,n||""),e.querySelector(t)},Nt=class extends kt{constructor(){super(...arguments),this.attachment.previewDelegate=this}createContentNodes(){return this.image=d({tagName:"img",attributes:{src:""},data:{trixMutable:!0}}),this.refresh(this.image),[this.image]}createCaptionElement(){let t=super.createCaptionElement(...arguments);return t.textContent||t.setAttribute("data-trix-placeholder",h.captionPlaceholder),t}refresh(t){var e;if(t||(t=(e=this.findElement())===null||e===void 0?void 0:e.querySelector("img")),t)return this.updateAttributesForImage(t)}updateAttributesForImage(t){let e=this.attachment.getURL(),i=this.attachment.getPreviewURL();if(t.src=i||e,i===e)t.removeAttribute("data-trix-serialized-attributes");else{let a=JSON.stringify({src:e});t.setAttribute("data-trix-serialized-attributes",a)}let r=this.attachment.getWidth(),o=this.attachment.getHeight();r!=null&&(t.width=r),o!=null&&(t.height=o);let s=["imageElement",this.attachment.id,t.src,t.width,t.height].join("/");t.dataset.trixStoreKey=s}attachmentDidChangeAttributes(){return this.refresh(this.image),this.refresh()}},Ot=class extends M{constructor(){super(...arguments),this.piece=this.object,this.attributes=this.piece.getAttributes(),this.textConfig=this.options.textConfig,this.context=this.options.context,this.piece.attachment?this.attachment=this.piece.attachment:this.string=this.piece.toString()}createNodes(){let t=this.attachment?this.createAttachmentNodes():this.createStringNodes(),e=this.createElement();if(e){let i=function(r){for(;(o=r)!==null&&o!==void 0&&o.firstElementChild;){var o;r=r.firstElementChild}return r}(e);Array.from(t).forEach(r=>{i.appendChild(r)}),t=[e]}return t}createAttachmentNodes(){let t=this.attachment.isPreviewable()?Nt:kt;return this.createChildView(t,this.piece.attachment,{piece:this.piece}).getNodes()}createStringNodes(){var t;if((t=this.textConfig)!==null&&t!==void 0&&t.plaintext)return[document.createTextNode(this.string)];{let e=[],i=this.string.split(` -`);for(let r=0;r0){let s=d("br");e.push(s)}if(o.length){let s=document.createTextNode(this.preserveSpaces(o));e.push(s)}}return e}}createElement(){let t,e,i,r={};for(e in this.attributes){i=this.attributes[e];let s=De(e);if(s){if(s.tagName){var o;let a=d(s.tagName);o?(o.appendChild(a),o=a):t=o=a}if(s.styleProperty&&(r[s.styleProperty]=i),s.style)for(e in s.style)i=s.style[e],r[e]=i}}if(Object.keys(r).length)for(e in t||(t=d("span")),r)i=r[e],t.style[e]=i;return t}createContainerElement(){for(let t in this.attributes){let e=this.attributes[t],i=De(t);if(i&&i.groupTagName){let r={};return r[t]=e,d(i.groupTagName,r)}}}preserveSpaces(t){return this.context.isLast&&(t=t.replace(/\ $/,U)),t=t.replace(/(\S)\ {3}(\S)/g,"$1 ".concat(U," $2")).replace(/\ {2}/g,"".concat(U," ")).replace(/\ {2}/g," ".concat(U)),(this.context.isFirst||this.context.followsWhitespace)&&(t=t.replace(/^\ /,U)),t}},Mt=class extends M{constructor(){super(...arguments),this.text=this.object,this.textConfig=this.options.textConfig}createNodes(){let t=[],e=Ct.groupObjects(this.getPieces()),i=e.length-1;for(let o=0;o!t.hasAttribute("blockBreak"))}},cn=n=>/\s$/.test(n?.toString()),{css:ni}=Lt,jt=class extends M{constructor(){super(...arguments),this.block=this.object,this.attributes=this.block.getAttributes()}createNodes(){let t=[document.createComment("block")];if(this.block.isEmpty())t.push(d("br"));else{var e;let i=(e=v(this.block.getLastAttribute()))===null||e===void 0?void 0:e.text,r=this.findOrCreateCachedChildView(Mt,this.block.text,{textConfig:i});t.push(...Array.from(r.getNodes()||[])),this.shouldAddExtraNewlineElement()&&t.push(d("br"))}if(this.attributes.length)return t;{let i,{tagName:r}=y.default;this.block.isRTL()&&(i={dir:"rtl"});let o=d({tagName:r,attributes:i});return t.forEach(s=>o.appendChild(s)),[o]}}createContainerElement(t){let e={},i,r=this.attributes[t],{tagName:o,htmlAttributes:s=[]}=v(r);if(t===0&&this.block.isRTL()&&Object.assign(e,{dir:"rtl"}),r==="attachmentGallery"){let a=this.block.getBlockBreakPosition();i="".concat(ni.attachmentGallery," ").concat(ni.attachmentGallery,"--").concat(a)}return Object.entries(this.block.htmlAttributes).forEach(a=>{let[l,c]=a;s.includes(l)&&(e[l]=c)}),d({tagName:o,className:i,attributes:e})}shouldAddExtraNewlineElement(){return/\n\n$/.test(this.block.toString())}},ct=class extends M{static render(t){let e=d("div"),i=new this(t,{element:e});return i.render(),i.sync(),e}constructor(){super(...arguments),this.element=this.options.element,this.elementStore=new Be,this.setDocument(this.object)}setDocument(t){t.isEqualTo(this.document)||(this.document=this.object=t)}render(){if(this.childViews=[],this.shadowElement=d("div"),!this.document.isEmpty()){let t=Ct.groupObjects(this.document.getBlocks(),{asTree:!0});Array.from(t).forEach(e=>{let i=this.findOrCreateCachedChildView(jt,e);Array.from(i.getNodes()).map(r=>this.shadowElement.appendChild(r))})}}isSynced(){return un(this.shadowElement,this.element)}sync(){let t=this.createDocumentFragmentForSync();for(;this.element.lastChild;)this.element.removeChild(this.element.lastChild);return this.element.appendChild(t),this.didSync()}didSync(){return this.elementStore.reset(ri(this.element)),He(()=>this.garbageCollectCachedViews())}createDocumentFragmentForSync(){let t=document.createDocumentFragment();return Array.from(this.shadowElement.childNodes).forEach(e=>{t.appendChild(e.cloneNode(!0))}),Array.from(ri(t)).forEach(e=>{let i=this.elementStore.remove(e);i&&e.parentNode.replaceChild(i,e)}),t}},ri=n=>n.querySelectorAll("[data-trix-store-key]"),un=(n,t)=>oi(n.innerHTML)===oi(t.innerHTML),oi=n=>n.replace(/ /g," ");function wt(n){var t,e;function i(o,s){try{var a=n[o](s),l=a.value,c=l instanceof hn;Promise.resolve(c?l.v:l).then(function(u){if(c){var b=o==="return"?"return":"next";if(!l.k||u.done)return i(b,u);u=n[b](u).value}r(a.done?"return":"normal",u)},function(u){i("throw",u)})}catch(u){r("throw",u)}}function r(o,s){switch(o){case"return":t.resolve({value:s,done:!0});break;case"throw":t.reject(s);break;default:t.resolve({value:s,done:!1})}(t=t.next)?i(t.key,t.arg):e=null}this._invoke=function(o,s){return new Promise(function(a,l){var c={key:o,arg:s,resolve:a,reject:l,next:null};e?e=e.next=c:(t=e=c,i(o,s))})},typeof n.return!="function"&&(this.return=void 0)}function hn(n,t){this.v=n,this.k=t}function E(n,t,e){return(t=dn(t))in n?Object.defineProperty(n,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[t]=e,n}function dn(n){var t=function(e,i){if(typeof e!="object"||e===null)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var o=r.call(e,i||"default");if(typeof o!="object")return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return(i==="string"?String:Number)(e)}(n,"string");return typeof t=="symbol"?t:String(t)}wt.prototype[typeof Symbol=="function"&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},wt.prototype.next=function(n){return this._invoke("next",n)},wt.prototype.throw=function(n){return this._invoke("throw",n)},wt.prototype.return=function(n){return this._invoke("return",n)};var j=class extends O{static registerType(t,e){e.type=t,this.types[t]=e}static fromJSON(t){let e=this.types[t.type];if(e)return e.fromJSON(t)}constructor(t){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(...arguments),this.attributes=C.box(e)}copyWithAttributes(t){return new this.constructor(this.getValue(),t)}copyWithAdditionalAttributes(t){return this.copyWithAttributes(this.attributes.merge(t))}copyWithoutAttribute(t){return this.copyWithAttributes(this.attributes.remove(t))}copy(){return this.copyWithAttributes(this.attributes)}getAttribute(t){return this.attributes.get(t)}getAttributesHash(){return this.attributes}getAttributes(){return this.attributes.toObject()}hasAttribute(t){return this.attributes.has(t)}hasSameStringValueAsPiece(t){return t&&this.toString()===t.toString()}hasSameAttributesAsPiece(t){return t&&(this.attributes===t.attributes||this.attributes.isEqualTo(t.attributes))}isBlockBreak(){return!1}isEqualTo(t){return super.isEqualTo(...arguments)||this.hasSameConstructorAs(t)&&this.hasSameStringValueAsPiece(t)&&this.hasSameAttributesAsPiece(t)}isEmpty(){return this.length===0}isSerializable(){return!0}toJSON(){return{type:this.constructor.type,attributes:this.getAttributes()}}contentsForInspection(){return{type:this.constructor.type,attributes:this.attributes.inspect()}}canBeGrouped(){return this.hasAttribute("href")}canBeGroupedWith(t){return this.getAttribute("href")===t.getAttribute("href")}getLength(){return this.length}canBeConsolidatedWith(t){return!1}};E(j,"types",{});var Wt=class extends at{constructor(t){super(...arguments),this.url=t}perform(t){let e=new Image;e.onload=()=>(e.width=this.width=e.naturalWidth,e.height=this.height=e.naturalHeight,t(!0,e)),e.onerror=()=>t(!1),e.src=this.url}},H=class extends O{static attachmentForFile(t){let e=new this(this.attributesForFile(t));return e.setFile(t),e}static attributesForFile(t){return new C({filename:t.name,filesize:t.size,contentType:t.type})}static fromJSON(t){return new this(t)}constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};super(t),this.releaseFile=this.releaseFile.bind(this),this.attributes=C.box(t),this.didChangeAttributes()}getAttribute(t){return this.attributes.get(t)}hasAttribute(t){return this.attributes.has(t)}getAttributes(){return this.attributes.toObject()}setAttributes(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=this.attributes.merge(t);var i,r,o,s;if(!this.attributes.isEqualTo(e))return this.attributes=e,this.didChangeAttributes(),(i=this.previewDelegate)===null||i===void 0||(r=i.attachmentDidChangeAttributes)===null||r===void 0||r.call(i,this),(o=this.delegate)===null||o===void 0||(s=o.attachmentDidChangeAttributes)===null||s===void 0?void 0:s.call(o,this)}didChangeAttributes(){if(this.isPreviewable())return this.preloadURL()}isPending(){return this.file!=null&&!(this.getURL()||this.getHref())}isPreviewable(){return this.attributes.has("previewable")?this.attributes.get("previewable"):H.previewablePattern.test(this.getContentType())}getType(){return this.hasContent()?"content":this.isPreviewable()?"preview":"file"}getURL(){return this.attributes.get("url")}getHref(){return this.attributes.get("href")}getFilename(){return this.attributes.get("filename")||""}getFilesize(){return this.attributes.get("filesize")}getFormattedFilesize(){let t=this.attributes.get("filesize");return typeof t=="number"?vi.formatter(t):""}getExtension(){var t;return(t=this.getFilename().match(/\.(\w+)$/))===null||t===void 0?void 0:t[1].toLowerCase()}getContentType(){return this.attributes.get("contentType")}hasContent(){return this.attributes.has("content")}getContent(){return this.attributes.get("content")}getWidth(){return this.attributes.get("width")}getHeight(){return this.attributes.get("height")}getFile(){return this.file}setFile(t){if(this.file=t,this.isPreviewable())return this.preloadFile()}releaseFile(){this.releasePreloadedFile(),this.file=null}getUploadProgress(){return this.uploadProgress!=null?this.uploadProgress:0}setUploadProgress(t){var e,i;if(this.uploadProgress!==t)return this.uploadProgress=t,(e=this.uploadProgressDelegate)===null||e===void 0||(i=e.attachmentDidChangeUploadProgress)===null||i===void 0?void 0:i.call(e,this)}toJSON(){return this.getAttributes()}getCacheKey(){return[super.getCacheKey(...arguments),this.attributes.getCacheKey(),this.getPreviewURL()].join("/")}getPreviewURL(){return this.previewURL||this.preloadingURL}setPreviewURL(t){var e,i,r,o;if(t!==this.getPreviewURL())return this.previewURL=t,(e=this.previewDelegate)===null||e===void 0||(i=e.attachmentDidChangeAttributes)===null||i===void 0||i.call(e,this),(r=this.delegate)===null||r===void 0||(o=r.attachmentDidChangePreviewURL)===null||o===void 0?void 0:o.call(r,this)}preloadURL(){return this.preload(this.getURL(),this.releaseFile)}preloadFile(){if(this.file)return this.fileObjectURL=URL.createObjectURL(this.file),this.preload(this.fileObjectURL)}releasePreloadedFile(){this.fileObjectURL&&(URL.revokeObjectURL(this.fileObjectURL),this.fileObjectURL=null)}preload(t,e){if(t&&t!==this.getPreviewURL())return this.preloadingURL=t,new Wt(t).then(i=>{let{width:r,height:o}=i;return this.getWidth()&&this.getHeight()||this.setAttributes({width:r,height:o}),this.preloadingURL=null,this.setPreviewURL(t),e?.()}).catch(()=>(this.preloadingURL=null,e?.()))}};E(H,"previewablePattern",/^image(\/(gif|png|webp|jpe?g)|$)/);var z=class extends j{static fromJSON(t){return new this(H.fromJSON(t.attachment),t.attributes)}constructor(t){super(...arguments),this.attachment=t,this.length=1,this.ensureAttachmentExclusivelyHasAttribute("href"),this.attachment.hasContent()||this.removeProhibitedAttributes()}ensureAttachmentExclusivelyHasAttribute(t){this.hasAttribute(t)&&(this.attachment.hasAttribute(t)||this.attachment.setAttributes(this.attributes.slice([t])),this.attributes=this.attributes.remove(t))}removeProhibitedAttributes(){let t=this.attributes.slice(z.permittedAttributes);t.isEqualTo(this.attributes)||(this.attributes=t)}getValue(){return this.attachment}isSerializable(){return!this.attachment.isPending()}getCaption(){return this.attributes.get("caption")||""}isEqualTo(t){var e;return super.isEqualTo(t)&&this.attachment.id===(t==null||(e=t.attachment)===null||e===void 0?void 0:e.id)}toString(){return"\uFFFC"}toJSON(){let t=super.toJSON(...arguments);return t.attachment=this.attachment,t}getCacheKey(){return[super.getCacheKey(...arguments),this.attachment.getCacheKey()].join("/")}toConsole(){return JSON.stringify(this.toString())}};E(z,"permittedAttributes",["caption","presentation"]),j.registerType("attachment",z);var Rt=class extends j{static fromJSON(t){return new this(t.string,t.attributes)}constructor(t){super(...arguments),this.string=(e=>e.replace(/\r\n?/g,` -`))(t),this.length=this.string.length}getValue(){return this.string}toString(){return this.string.toString()}isBlockBreak(){return this.toString()===` -`&&this.getAttribute("blockBreak")===!0}toJSON(){let t=super.toJSON(...arguments);return t.string=this.string,t}canBeConsolidatedWith(t){return t&&this.hasSameConstructorAs(t)&&this.hasSameAttributesAsPiece(t)}consolidateWith(t){return new this.constructor(this.toString()+t.toString(),this.attributes)}splitAtOffset(t){let e,i;return t===0?(e=null,i=this):t===this.length?(e=this,i=null):(e=new this.constructor(this.string.slice(0,t),this.attributes),i=new this.constructor(this.string.slice(t),this.attributes)),[e,i]}toConsole(){let{string:t}=this;return t.length>15&&(t=t.slice(0,14)+"\u2026"),JSON.stringify(t.toString())}};j.registerType("string",Rt);var ut=class extends O{static box(t){return t instanceof this?t:new this(t)}constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];super(...arguments),this.objects=t.slice(0),this.length=this.objects.length}indexOf(t){return this.objects.indexOf(t)}splice(){for(var t=arguments.length,e=new Array(t),i=0;it(e,i))}insertObjectAtIndex(t,e){return this.splice(e,0,t)}insertSplittableListAtIndex(t,e){return this.splice(e,0,...t.objects)}insertSplittableListAtPosition(t,e){let[i,r]=this.splitObjectAtPosition(e);return new this.constructor(i).insertSplittableListAtIndex(t,r)}editObjectAtIndex(t,e){return this.replaceObjectAtIndex(e(this.objects[t]),t)}replaceObjectAtIndex(t,e){return this.splice(e,1,t)}removeObjectAtIndex(t){return this.splice(t,1)}getObjectAtIndex(t){return this.objects[t]}getSplittableListInRange(t){let[e,i,r]=this.splitObjectsAtRange(t);return new this.constructor(e.slice(i,r+1))}selectSplittableList(t){let e=this.objects.filter(i=>t(i));return new this.constructor(e)}removeObjectsInRange(t){let[e,i,r]=this.splitObjectsAtRange(t);return new this.constructor(e).splice(i,r-i+1)}transformObjectsInRange(t,e){let[i,r,o]=this.splitObjectsAtRange(t),s=i.map((a,l)=>r<=l&&l<=o?e(a):a);return new this.constructor(s)}splitObjectsAtRange(t){let e,[i,r,o]=this.splitObjectAtPosition(mn(t));return[i,e]=new this.constructor(i).splitObjectAtPosition(pn(t)+o),[i,r,e-1]}getObjectAtPosition(t){let{index:e}=this.findIndexAndOffsetAtPosition(t);return this.objects[e]}splitObjectAtPosition(t){let e,i,{index:r,offset:o}=this.findIndexAndOffsetAtPosition(t),s=this.objects.slice(0);if(r!=null)if(o===0)e=r,i=0;else{let a=this.getObjectAtIndex(r),[l,c]=a.splitAtOffset(o);s.splice(r,1,l,c),e=r+1,i=l.getLength()-o}else e=s.length,i=0;return[s,e,i]}consolidate(){let t=[],e=this.objects[0];return this.objects.slice(1).forEach(i=>{var r,o;(r=(o=e).canBeConsolidatedWith)!==null&&r!==void 0&&r.call(o,i)?e=e.consolidateWith(i):(t.push(e),e=i)}),e&&t.push(e),new this.constructor(t)}consolidateFromIndexToIndex(t,e){let i=this.objects.slice(0).slice(t,e+1),r=new this.constructor(i).consolidate().toArray();return this.splice(t,i.length,...r)}findIndexAndOffsetAtPosition(t){let e,i=0;for(e=0;ethis.endPosition+=t.getLength())),this.endPosition}toString(){return this.objects.join("")}toArray(){return this.objects.slice(0)}toJSON(){return this.toArray()}isEqualTo(t){return super.isEqualTo(...arguments)||gn(this.objects,t?.objects)}contentsForInspection(){return{objects:"[".concat(this.objects.map(t=>t.inspect()).join(", "),"]")}}},gn=function(n){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];if(n.length!==t.length)return!1;let e=!0;for(let i=0;in[0],pn=n=>n[1],R=class extends O{static textForAttachmentWithAttributes(t,e){return new this([new z(t,e)])}static textForStringWithAttributes(t,e){return new this([new Rt(t,e)])}static fromJSON(t){return new this(Array.from(t).map(e=>j.fromJSON(e)))}constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];super(...arguments);let e=t.filter(i=>!i.isEmpty());this.pieceList=new ut(e)}copy(){return this.copyWithPieceList(this.pieceList)}copyWithPieceList(t){return new this.constructor(t.consolidate().toArray())}copyUsingObjectMap(t){let e=this.getPieces().map(i=>t.find(i)||i);return new this.constructor(e)}appendText(t){return this.insertTextAtPosition(t,this.getLength())}insertTextAtPosition(t,e){return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(t.pieceList,e))}removeTextAtRange(t){return this.copyWithPieceList(this.pieceList.removeObjectsInRange(t))}replaceTextAtRange(t,e){return this.removeTextAtRange(e).insertTextAtPosition(t,e[0])}moveTextFromRangeToPosition(t,e){if(t[0]<=e&&e<=t[1])return;let i=this.getTextAtRange(t),r=i.getLength();return t[0]i.copyWithAdditionalAttributes(t)))}removeAttributeAtRange(t,e){return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e,i=>i.copyWithoutAttribute(t)))}setAttributesAtRange(t,e){return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e,i=>i.copyWithAttributes(t)))}getAttributesAtPosition(t){var e;return((e=this.pieceList.getObjectAtPosition(t))===null||e===void 0?void 0:e.getAttributes())||{}}getCommonAttributes(){let t=Array.from(this.pieceList.toArray()).map(e=>e.getAttributes());return C.fromCommonAttributesOfObjects(t).toObject()}getCommonAttributesAtRange(t){return this.getTextAtRange(t).getCommonAttributes()||{}}getExpandedRangeForAttributeAtOffset(t,e){let i,r=i=e,o=this.getLength();for(;r>0&&this.getCommonAttributesAtRange([r-1,i])[t];)r--;for(;i!!t.attachment)}getAttachments(){return this.getAttachmentPieces().map(t=>t.attachment)}getAttachmentAndPositionById(t){let e=0;for(let r of this.pieceList.toArray()){var i;if(((i=r.attachment)===null||i===void 0?void 0:i.id)===t)return{attachment:r.attachment,position:e};e+=r.length}return{attachment:null,position:null}}getAttachmentById(t){let{attachment:e}=this.getAttachmentAndPositionById(t);return e}getRangeOfAttachment(t){let e=this.getAttachmentAndPositionById(t.id),i=e.position;if(t=e.attachment)return[i,i+1]}updateAttributesForAttachment(t,e){let i=this.getRangeOfAttachment(e);return i?this.addAttributesAtRange(t,i):this}getLength(){return this.pieceList.getEndPosition()}isEmpty(){return this.getLength()===0}isEqualTo(t){var e;return super.isEqualTo(t)||(t==null||(e=t.pieceList)===null||e===void 0?void 0:e.isEqualTo(this.pieceList))}isBlockBreak(){return this.getLength()===1&&this.pieceList.getObjectAtIndex(0).isBlockBreak()}eachPiece(t){return this.pieceList.eachObject(t)}getPieces(){return this.pieceList.toArray()}getPieceAtPosition(t){return this.pieceList.getObjectAtPosition(t)}contentsForInspection(){return{pieceList:this.pieceList.inspect()}}toSerializableText(){let t=this.pieceList.selectSplittableList(e=>e.isSerializable());return this.copyWithPieceList(t)}toString(){return this.pieceList.toString()}toJSON(){return this.pieceList.toJSON()}toConsole(){return JSON.stringify(this.pieceList.toArray().map(t=>JSON.parse(t.toConsole())))}getDirection(){return $i(this.toString())}isRTL(){return this.getDirection()==="rtl"}},S=class extends O{static fromJSON(t){return new this(R.fromJSON(t.text),t.attributes,t.htmlAttributes)}constructor(t,e,i){super(...arguments),this.text=fn(t||new R),this.attributes=e||[],this.htmlAttributes=i||{}}isEmpty(){return this.text.isBlockBreak()}isEqualTo(t){return!!super.isEqualTo(t)||this.text.isEqualTo(t?.text)&&Q(this.attributes,t?.attributes)&&dt(this.htmlAttributes,t?.htmlAttributes)}copyWithText(t){return new S(t,this.attributes,this.htmlAttributes)}copyWithoutText(){return this.copyWithText(null)}copyWithAttributes(t){return new S(this.text,t,this.htmlAttributes)}copyWithoutAttributes(){return this.copyWithAttributes(null)}copyUsingObjectMap(t){let e=t.find(this.text);return e?this.copyWithText(e):this.copyWithText(this.text.copyUsingObjectMap(t))}addAttribute(t){let e=this.attributes.concat(si(t));return this.copyWithAttributes(e)}addHTMLAttribute(t,e){let i=Object.assign({},this.htmlAttributes,{[t]:e});return new S(this.text,this.attributes,i)}removeAttribute(t){let{listAttribute:e}=v(t),i=li(li(this.attributes,t),e);return this.copyWithAttributes(i)}removeLastAttribute(){return this.removeAttribute(this.getLastAttribute())}getLastAttribute(){return ai(this.attributes)}getAttributes(){return this.attributes.slice(0)}getAttributeLevel(){return this.attributes.length}getAttributeAtLevel(t){return this.attributes[t-1]}hasAttribute(t){return this.attributes.includes(t)}hasAttributes(){return this.getAttributeLevel()>0}getLastNestableAttribute(){return ai(this.getNestableAttributes())}getNestableAttributes(){return this.attributes.filter(t=>v(t).nestable)}getNestingLevel(){return this.getNestableAttributes().length}decreaseNestingLevel(){let t=this.getLastNestableAttribute();return t?this.removeAttribute(t):this}increaseNestingLevel(){let t=this.getLastNestableAttribute();if(t){let e=this.attributes.lastIndexOf(t),i=Ve(this.attributes,e+1,0,...si(t));return this.copyWithAttributes(i)}return this}getListItemAttributes(){return this.attributes.filter(t=>v(t).listAttribute)}isListItem(){var t;return(t=v(this.getLastAttribute()))===null||t===void 0?void 0:t.listAttribute}isTerminalBlock(){var t;return(t=v(this.getLastAttribute()))===null||t===void 0?void 0:t.terminal}breaksOnReturn(){var t;return(t=v(this.getLastAttribute()))===null||t===void 0?void 0:t.breakOnReturn}findLineBreakInDirectionFromPosition(t,e){let i=this.toString(),r;switch(t){case"forward":r=i.indexOf(` -`,e);break;case"backward":r=i.slice(0,e).lastIndexOf(` -`)}if(r!==-1)return r}contentsForInspection(){return{text:this.text.inspect(),attributes:this.attributes}}toString(){return this.text.toString()}toJSON(){return{text:this.text,attributes:this.attributes,htmlAttributes:this.htmlAttributes}}getDirection(){return this.text.getDirection()}isRTL(){return this.text.isRTL()}getLength(){return this.text.getLength()}canBeConsolidatedWith(t){return!this.hasAttributes()&&!t.hasAttributes()&&this.getDirection()===t.getDirection()}consolidateWith(t){let e=R.textForStringWithAttributes(` -`),i=this.getTextWithoutBlockBreak().appendText(e);return this.copyWithText(i.appendText(t.text))}splitAtOffset(t){let e,i;return t===0?(e=null,i=this):t===this.getLength()?(e=this,i=null):(e=this.copyWithText(this.text.getTextAtRange([0,t])),i=this.copyWithText(this.text.getTextAtRange([t,this.getLength()]))),[e,i]}getBlockBreakPosition(){return this.text.getLength()-1}getTextWithoutBlockBreak(){return wi(this.text)?this.text.getTextAtRange([0,this.getBlockBreakPosition()]):this.text.copy()}canBeGrouped(t){return this.attributes[t]}canBeGroupedWith(t,e){let i=t.getAttributes(),r=i[e],o=this.attributes[e];return o===r&&!(v(o).group===!1&&!(()=>{if(!Dt){Dt=[];for(let s in y){let{listAttribute:a}=y[s];a!=null&&Dt.push(a)}}return Dt})().includes(i[e+1]))&&(this.getDirection()===t.getDirection()||t.isEmpty())}},fn=function(n){return n=bn(n),n=An(n)},bn=function(n){let t=!1,e=n.getPieces(),i=e.slice(0,e.length-1),r=e[e.length-1];return r?(i=i.map(o=>o.isBlockBreak()?(t=!0,xn(o)):o),t?new R([...i,r]):n):n},vn=R.textForStringWithAttributes(` -`,{blockBreak:!0}),An=function(n){return wi(n)?n:n.appendText(vn)},wi=function(n){let t=n.getLength();return t===0?!1:n.getTextAtRange([t-1,t]).isBlockBreak()},xn=n=>n.copyWithoutAttribute("blockBreak"),si=function(n){let{listAttribute:t}=v(n);return t?[t,n]:[n]},ai=n=>n.slice(-1)[0],li=function(n,t){let e=n.lastIndexOf(t);return e===-1?n:Ve(n,e,1)},k=class extends O{static fromJSON(t){return new this(Array.from(t).map(e=>S.fromJSON(e)))}static fromString(t,e){let i=R.textForStringWithAttributes(t,e);return new this([new S(i)])}constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];super(...arguments),t.length===0&&(t=[new S]),this.blockList=ut.box(t)}isEmpty(){let t=this.getBlockAtIndex(0);return this.blockList.length===1&&t.isEmpty()&&!t.hasAttributes()}copy(){let t=(arguments.length>0&&arguments[0]!==void 0?arguments[0]:{}).consolidateBlocks?this.blockList.consolidate().toArray():this.blockList.toArray();return new this.constructor(t)}copyUsingObjectsFromDocument(t){let e=new Te(t.getObjects());return this.copyUsingObjectMap(e)}copyUsingObjectMap(t){let e=this.getBlocks().map(i=>t.find(i)||i.copyUsingObjectMap(t));return new this.constructor(e)}copyWithBaseBlockAttributes(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],e=this.getBlocks().map(i=>{let r=t.concat(i.getAttributes());return i.copyWithAttributes(r)});return new this.constructor(e)}replaceBlock(t,e){let i=this.blockList.indexOf(t);return i===-1?this:new this.constructor(this.blockList.replaceObjectAtIndex(e,i))}insertDocumentAtRange(t,e){let{blockList:i}=t;e=g(e);let[r]=e,{index:o,offset:s}=this.locationFromPosition(r),a=this,l=this.getBlockAtPosition(r);return N(e)&&l.isEmpty()&&!l.hasAttributes()?a=new this.constructor(a.blockList.removeObjectAtIndex(o)):l.getBlockBreakPosition()===s&&r++,a=a.removeTextAtRange(e),new this.constructor(a.blockList.insertSplittableListAtPosition(i,r))}mergeDocumentAtRange(t,e){let i,r;e=g(e);let[o]=e,s=this.locationFromPosition(o),a=this.getBlockAtIndex(s.index).getAttributes(),l=t.getBaseBlockAttributes(),c=a.slice(-l.length);if(Q(l,c)){let A=a.slice(0,-l.length);i=t.copyWithBaseBlockAttributes(A)}else i=t.copy({consolidateBlocks:!0}).copyWithBaseBlockAttributes(a);let u=i.getBlockCount(),b=i.getBlockAtIndex(0);if(Q(a,b.getAttributes())){let A=b.getTextWithoutBlockBreak();if(r=this.insertTextAtRange(A,e),u>1){i=new this.constructor(i.getBlocks().slice(1));let L=o+A.getLength();r=r.insertDocumentAtRange(i,L)}}else r=this.insertDocumentAtRange(i,e);return r}insertTextAtRange(t,e){e=g(e);let[i]=e,{index:r,offset:o}=this.locationFromPosition(i),s=this.removeTextAtRange(e);return new this.constructor(s.blockList.editObjectAtIndex(r,a=>a.copyWithText(a.text.insertTextAtPosition(t,o))))}removeTextAtRange(t){let e;t=g(t);let[i,r]=t;if(N(t))return this;let[o,s]=Array.from(this.locationRangeFromRange(t)),a=o.index,l=o.offset,c=this.getBlockAtIndex(a),u=s.index,b=s.offset,A=this.getBlockAtIndex(u);if(r-i==1&&c.getBlockBreakPosition()===l&&A.getBlockBreakPosition()!==b&&A.text.getStringAtPosition(b)===` -`)e=this.blockList.editObjectAtIndex(u,L=>L.copyWithText(L.text.removeTextAtRange([b,b+1])));else{let L,gt=c.text.getTextAtRange([0,l]),P=A.text.getTextAtRange([b,A.getLength()]),it=gt.appendText(P);L=a!==u&&l===0&&c.getAttributeLevel()>=A.getAttributeLevel()?A.copyWithText(it):c.copyWithText(it);let mt=u+1-a;e=this.blockList.splice(a,mt,L)}return new this.constructor(e)}moveTextFromRangeToPosition(t,e){let i;t=g(t);let[r,o]=t;if(r<=e&&e<=o)return this;let s=this.getDocumentAtRange(t),a=this.removeTextAtRange(t),l=rr=r.editObjectAtIndex(a,function(){return v(t)?o.addAttribute(t,e):s[0]===s[1]?o:o.copyWithText(o.text.addAttributeAtRange(t,e,s))})),new this.constructor(r)}addAttribute(t,e){let{blockList:i}=this;return this.eachBlock((r,o)=>i=i.editObjectAtIndex(o,()=>r.addAttribute(t,e))),new this.constructor(i)}removeAttributeAtRange(t,e){let{blockList:i}=this;return this.eachBlockAtRange(e,function(r,o,s){v(t)?i=i.editObjectAtIndex(s,()=>r.removeAttribute(t)):o[0]!==o[1]&&(i=i.editObjectAtIndex(s,()=>r.copyWithText(r.text.removeAttributeAtRange(t,o))))}),new this.constructor(i)}updateAttributesForAttachment(t,e){let i=this.getRangeOfAttachment(e),[r]=Array.from(i),{index:o}=this.locationFromPosition(r),s=this.getTextAtIndex(o);return new this.constructor(this.blockList.editObjectAtIndex(o,a=>a.copyWithText(s.updateAttributesForAttachment(t,e))))}removeAttributeForAttachment(t,e){let i=this.getRangeOfAttachment(e);return this.removeAttributeAtRange(t,i)}setHTMLAttributeAtPosition(t,e,i){let r=this.getBlockAtPosition(t),o=r.addHTMLAttribute(e,i);return this.replaceBlock(r,o)}insertBlockBreakAtRange(t){let e;t=g(t);let[i]=t,{offset:r}=this.locationFromPosition(i),o=this.removeTextAtRange(t);return r===0&&(e=[new S]),new this.constructor(o.blockList.insertSplittableListAtPosition(new ut(e),i))}applyBlockAttributeAtRange(t,e,i){let r=this.expandRangeToLineBreaksAndSplitBlocks(i),o=r.document;i=r.range;let s=v(t);if(s.listAttribute){o=o.removeLastListAttributeAtRange(i,{exceptAttributeName:t});let a=o.convertLineBreaksToBlockBreaksInRange(i);o=a.document,i=a.range}else o=s.exclusive?o.removeBlockAttributesAtRange(i):s.terminal?o.removeLastTerminalAttributeAtRange(i):o.consolidateBlocksAtRange(i);return o.addAttributeAtRange(t,e,i)}removeLastListAttributeAtRange(t){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},{blockList:i}=this;return this.eachBlockAtRange(t,function(r,o,s){let a=r.getLastAttribute();a&&v(a).listAttribute&&a!==e.exceptAttributeName&&(i=i.editObjectAtIndex(s,()=>r.removeAttribute(a)))}),new this.constructor(i)}removeLastTerminalAttributeAtRange(t){let{blockList:e}=this;return this.eachBlockAtRange(t,function(i,r,o){let s=i.getLastAttribute();s&&v(s).terminal&&(e=e.editObjectAtIndex(o,()=>i.removeAttribute(s)))}),new this.constructor(e)}removeBlockAttributesAtRange(t){let{blockList:e}=this;return this.eachBlockAtRange(t,function(i,r,o){i.hasAttributes()&&(e=e.editObjectAtIndex(o,()=>i.copyWithoutAttributes()))}),new this.constructor(e)}expandRangeToLineBreaksAndSplitBlocks(t){let e;t=g(t);let[i,r]=t,o=this.locationFromPosition(i),s=this.locationFromPosition(r),a=this,l=a.getBlockAtIndex(o.index);if(o.offset=l.findLineBreakInDirectionFromPosition("backward",o.offset),o.offset!=null&&(e=a.positionFromLocation(o),a=a.insertBlockBreakAtRange([e,e+1]),s.index+=1,s.offset-=a.getBlockAtIndex(o.index).getLength(),o.index+=1),o.offset=0,s.offset===0&&s.index>o.index)s.index-=1,s.offset=a.getBlockAtIndex(s.index).getBlockBreakPosition();else{let c=a.getBlockAtIndex(s.index);c.text.getStringAtRange([s.offset-1,s.offset])===` -`?s.offset-=1:s.offset=c.findLineBreakInDirectionFromPosition("forward",s.offset),s.offset!==c.getBlockBreakPosition()&&(e=a.positionFromLocation(s),a=a.insertBlockBreakAtRange([e,e+1]))}return i=a.positionFromLocation(o),r=a.positionFromLocation(s),{document:a,range:t=g([i,r])}}convertLineBreaksToBlockBreaksInRange(t){t=g(t);let[e]=t,i=this.getStringAtRange(t).slice(0,-1),r=this;return i.replace(/.*?\n/g,function(o){e+=o.length,r=r.insertBlockBreakAtRange([e-1,e])}),{document:r,range:t}}consolidateBlocksAtRange(t){t=g(t);let[e,i]=t,r=this.locationFromPosition(e).index,o=this.locationFromPosition(i).index;return new this.constructor(this.blockList.consolidateFromIndexToIndex(r,o))}getDocumentAtRange(t){t=g(t);let e=this.blockList.getSplittableListInRange(t).toArray();return new this.constructor(e)}getStringAtRange(t){let e,i=t=g(t);return i[i.length-1]!==this.getLength()&&(e=-1),this.getDocumentAtRange(t).toString().slice(0,e)}getBlockAtIndex(t){return this.blockList.getObjectAtIndex(t)}getBlockAtPosition(t){let{index:e}=this.locationFromPosition(t);return this.getBlockAtIndex(e)}getTextAtIndex(t){var e;return(e=this.getBlockAtIndex(t))===null||e===void 0?void 0:e.text}getTextAtPosition(t){let{index:e}=this.locationFromPosition(t);return this.getTextAtIndex(e)}getPieceAtPosition(t){let{index:e,offset:i}=this.locationFromPosition(t);return this.getTextAtIndex(e).getPieceAtPosition(i)}getCharacterAtPosition(t){let{index:e,offset:i}=this.locationFromPosition(t);return this.getTextAtIndex(e).getStringAtRange([i,i+1])}getLength(){return this.blockList.getEndPosition()}getBlocks(){return this.blockList.toArray()}getBlockCount(){return this.blockList.length}getEditCount(){return this.editCount}eachBlock(t){return this.blockList.eachObject(t)}eachBlockAtRange(t,e){let i,r;t=g(t);let[o,s]=t,a=this.locationFromPosition(o),l=this.locationFromPosition(s);if(a.index===l.index)return i=this.getBlockAtIndex(a.index),r=[a.offset,l.offset],e(i,r,a.index);for(let c=a.index;c<=l.index;c++)if(i=this.getBlockAtIndex(c),i){switch(c){case a.index:r=[a.offset,i.text.getLength()];break;case l.index:r=[0,l.offset];break;default:r=[0,i.text.getLength()]}e(i,r,c)}}getCommonAttributesAtRange(t){t=g(t);let[e]=t;if(N(t))return this.getCommonAttributesAtPosition(e);{let i=[],r=[];return this.eachBlockAtRange(t,function(o,s){if(s[0]!==s[1])return i.push(o.text.getCommonAttributesAtRange(s)),r.push(ci(o))}),C.fromCommonAttributesOfObjects(i).merge(C.fromCommonAttributesOfObjects(r)).toObject()}}getCommonAttributesAtPosition(t){let e,i,{index:r,offset:o}=this.locationFromPosition(t),s=this.getBlockAtIndex(r);if(!s)return{};let a=ci(s),l=s.text.getAttributesAtPosition(o),c=s.text.getAttributesAtPosition(o-1),u=Object.keys(Y).filter(b=>Y[b].inheritable);for(e in c)i=c[e],(i===l[e]||u.includes(e))&&(a[e]=i);return a}getRangeOfCommonAttributeAtPosition(t,e){let{index:i,offset:r}=this.locationFromPosition(e),o=this.getTextAtIndex(i),[s,a]=Array.from(o.getExpandedRangeForAttributeAtOffset(t,r)),l=this.positionFromLocation({index:i,offset:s}),c=this.positionFromLocation({index:i,offset:a});return g([l,c])}getBaseBlockAttributes(){let t=this.getBlockAtIndex(0).getAttributes();for(let e=1;e{let o=[];for(let s=0;s{let{text:i}=e;return t=t.concat(i.getAttachmentPieces())}),t}getAttachments(){return this.getAttachmentPieces().map(t=>t.attachment)}getRangeOfAttachment(t){let e=0,i=this.blockList.toArray();for(let r=0;r{let o=r.getLength();r.hasAttribute(t)&&i.push([e,e+o]),e+=o}),i}findRangesForTextAttribute(t){let{withValue:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=0,r=[],o=[];return this.getPieces().forEach(s=>{let a=s.getLength();(function(l){return e?l.getAttribute(t)===e:l.hasAttribute(t)})(s)&&(r[1]===i?r[1]=i+a:o.push(r=[i,i+a])),i+=a}),o}locationFromPosition(t){let e=this.blockList.findIndexAndOffsetAtPosition(Math.max(0,t));if(e.index!=null)return e;{let i=this.getBlocks();return{index:i.length-1,offset:i[i.length-1].getLength()}}}positionFromLocation(t){return this.blockList.findPositionAtIndexAndOffset(t.index,t.offset)}locationRangeFromPosition(t){return g(this.locationFromPosition(t))}locationRangeFromRange(t){if(!(t=g(t)))return;let[e,i]=Array.from(t),r=this.locationFromPosition(e),o=this.locationFromPosition(i);return g([r,o])}rangeFromLocationRange(t){let e;t=g(t);let i=this.positionFromLocation(t[0]);return N(t)||(e=this.positionFromLocation(t[1])),g([i,e])}isEqualTo(t){return this.blockList.isEqualTo(t?.blockList)}getTexts(){return this.getBlocks().map(t=>t.text)}getPieces(){let t=[];return Array.from(this.getTexts()).forEach(e=>{t.push(...Array.from(e.getPieces()||[]))}),t}getObjects(){return this.getBlocks().concat(this.getTexts()).concat(this.getPieces())}toSerializableDocument(){let t=[];return this.blockList.eachObject(e=>t.push(e.copyWithText(e.text.toSerializableText()))),new this.constructor(t)}toString(){return this.blockList.toString()}toJSON(){return this.blockList.toJSON()}toConsole(){return JSON.stringify(this.blockList.toArray().map(t=>JSON.parse(t.text.toConsole())))}},ci=function(n){let t={},e=n.getLastAttribute();return e&&(t[e]=!0),t},fe=function(n){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return{string:n=bt(n),attributes:t,type:"string"}},ui=(n,t)=>{try{return JSON.parse(n.getAttribute("data-trix-".concat(t)))}catch{return{}}},et=class extends f{static parse(t,e){let i=new this(t,e);return i.parse(),i}constructor(t){let{referenceElement:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(...arguments),this.html=t,this.referenceElement=e,this.blocks=[],this.blockElements=[],this.processedElements=[]}getDocument(){return k.fromJSON(this.blocks)}parse(){try{this.createHiddenContainer(),lt.setHTML(this.containerElement,this.html);let t=Ft(this.containerElement,{usingFilter:Cn});for(;t.nextNode();)this.processNode(t.currentNode);return this.translateBlockElementMarginsToNewlines()}finally{this.removeHiddenContainer()}}createHiddenContainer(){return this.referenceElement?(this.containerElement=this.referenceElement.cloneNode(!1),this.containerElement.removeAttribute("id"),this.containerElement.setAttribute("data-trix-internal",""),this.containerElement.style.display="none",this.referenceElement.parentNode.insertBefore(this.containerElement,this.referenceElement.nextSibling)):(this.containerElement=d({tagName:"div",style:{display:"none"}}),document.body.appendChild(this.containerElement))}removeHiddenContainer(){return V(this.containerElement)}processNode(t){switch(t.nodeType){case Node.TEXT_NODE:if(!this.isInsignificantTextNode(t))return this.appendBlockForTextNode(t),this.processTextNode(t);break;case Node.ELEMENT_NODE:return this.appendBlockForElement(t),this.processElement(t)}}appendBlockForTextNode(t){let e=t.parentNode;if(e===this.currentBlockElement&&this.isBlockElement(t.previousSibling))return this.appendStringWithAttributes(` -`);if(e===this.containerElement||this.isBlockElement(e)){var i;let r=this.getBlockAttributes(e),o=this.getBlockHTMLAttributes(e);Q(r,(i=this.currentBlock)===null||i===void 0?void 0:i.attributes)||(this.currentBlock=this.appendBlockForAttributesWithElement(r,e,o),this.currentBlockElement=e)}}appendBlockForElement(t){let e=this.isBlockElement(t),i=J(this.currentBlockElement,t);if(e&&!this.isBlockElement(t.firstChild)){if(!this.isInsignificantTextNode(t.firstChild)||!this.isBlockElement(t.firstElementChild)){let r=this.getBlockAttributes(t),o=this.getBlockHTMLAttributes(t);if(t.firstChild){if(i&&Q(r,this.currentBlock.attributes))return this.appendStringWithAttributes(` -`);this.currentBlock=this.appendBlockForAttributesWithElement(r,t,o),this.currentBlockElement=t}}}else if(this.currentBlockElement&&!i&&!e){let r=this.findParentBlockElement(t);if(r)return this.appendBlockForElement(r);this.currentBlock=this.appendEmptyBlock(),this.currentBlockElement=null}}findParentBlockElement(t){let{parentElement:e}=t;for(;e&&e!==this.containerElement;){if(this.isBlockElement(e)&&this.blockElements.includes(e))return e;e=e.parentElement}return null}processTextNode(t){let e=t.data;var i;return hi(t.parentNode)||(e=_e(e),Ti((i=t.previousSibling)===null||i===void 0?void 0:i.textContent)&&(e=kn(e))),this.appendStringWithAttributes(e,this.getTextAttributes(t.parentNode))}processElement(t){let e;if($(t)){if(e=ui(t,"attachment"),Object.keys(e).length){let i=this.getTextAttributes(t);this.appendAttachmentWithAttributes(e,i),t.innerHTML=""}return this.processedElements.push(t)}switch(x(t)){case"br":return this.isExtraBR(t)||this.isBlockElement(t.nextSibling)||this.appendStringWithAttributes(` -`,this.getTextAttributes(t)),this.processedElements.push(t);case"img":e={url:t.getAttribute("src"),contentType:"image"};let i=(r=>{let o=r.getAttribute("width"),s=r.getAttribute("height"),a={};return o&&(a.width=parseInt(o,10)),s&&(a.height=parseInt(s,10)),a})(t);for(let r in i){let o=i[r];e[r]=o}return this.appendAttachmentWithAttributes(e,this.getTextAttributes(t)),this.processedElements.push(t);case"tr":if(this.needsTableSeparator(t))return this.appendStringWithAttributes(Tt.tableRowSeparator);break;case"td":if(this.needsTableSeparator(t))return this.appendStringWithAttributes(Tt.tableCellSeparator)}}appendBlockForAttributesWithElement(t,e){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.blockElements.push(e);let r=function(){return{text:[],attributes:arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},htmlAttributes:arguments.length>1&&arguments[1]!==void 0?arguments[1]:{}}}(t,i);return this.blocks.push(r),r}appendEmptyBlock(){return this.appendBlockForAttributesWithElement([],null)}appendStringWithAttributes(t,e){return this.appendPiece(fe(t,e))}appendAttachmentWithAttributes(t,e){return this.appendPiece(function(i){return{attachment:i,attributes:arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},type:"attachment"}}(t,e))}appendPiece(t){return this.blocks.length===0&&this.appendEmptyBlock(),this.blocks[this.blocks.length-1].text.push(t)}appendStringToTextAtIndex(t,e){let{text:i}=this.blocks[e],r=i[i.length-1];if(r?.type!=="string")return i.push(fe(t));r.string+=t}prependStringToTextAtIndex(t,e){let{text:i}=this.blocks[e],r=i[0];if(r?.type!=="string")return i.unshift(fe(t));r.string=t+r.string}getTextAttributes(t){let e,i={};for(let r in Y){let o=Y[r];if(o.tagName&&q(t,{matchingSelector:o.tagName,untilNode:this.containerElement}))i[r]=!0;else if(o.parser){if(e=o.parser(t),e){let s=!1;for(let a of this.findBlockElementAncestors(t))if(o.parser(a)===e){s=!0;break}s||(i[r]=e)}}else o.styleProperty&&(e=t.style[o.styleProperty],e&&(i[r]=e))}if($(t)){let r=ui(t,"attributes");for(let o in r)e=r[o],i[o]=e}return i}getBlockAttributes(t){let e=[];for(;t&&t!==this.containerElement;){for(let r in y){let o=y[r];var i;o.parse!==!1&&x(t)===o.tagName&&((i=o.test)!==null&&i!==void 0&&i.call(o,t)||!o.test)&&(e.push(r),o.listAttribute&&e.push(o.listAttribute))}t=t.parentNode}return e.reverse()}getBlockHTMLAttributes(t){let e={},i=Object.values(y).find(r=>r.tagName===x(t));return(i?.htmlAttributes||[]).forEach(r=>{t.hasAttribute(r)&&(e[r]=t.getAttribute(r))}),e}findBlockElementAncestors(t){let e=[];for(;t&&t!==this.containerElement;){let i=x(t);At().includes(i)&&e.push(t),t=t.parentNode}return e}isBlockElement(t){if(t?.nodeType===Node.ELEMENT_NODE&&!$(t)&&!q(t,{matchingSelector:"td",untilNode:this.containerElement}))return At().includes(x(t))||window.getComputedStyle(t).display==="block"}isInsignificantTextNode(t){if(t?.nodeType!==Node.TEXT_NODE||!Rn(t.data))return;let{parentNode:e,previousSibling:i,nextSibling:r}=t;return yn(e.previousSibling)&&!this.isBlockElement(e.previousSibling)||hi(e)?void 0:!i||this.isBlockElement(i)||!r||this.isBlockElement(r)}isExtraBR(t){return x(t)==="br"&&this.isBlockElement(t.parentNode)&&t.parentNode.lastChild===t}needsTableSeparator(t){if(Tt.removeBlankTableCells){var e;let i=(e=t.previousSibling)===null||e===void 0?void 0:e.textContent;return i&&/\S/.test(i)}return t.previousSibling}translateBlockElementMarginsToNewlines(){let t=this.getMarginOfDefaultBlockElement();for(let e=0;e2*t.top&&this.prependStringToTextAtIndex(` -`,e),i.bottom>2*t.bottom&&this.appendStringToTextAtIndex(` -`,e))}}getMarginOfBlockElementAtIndex(t){let e=this.blockElements[t];if(e&&e.textContent&&!At().includes(x(e))&&!this.processedElements.includes(e))return di(e)}getMarginOfDefaultBlockElement(){let t=d(y.default.tagName);return this.containerElement.appendChild(t),di(t)}},hi=function(n){let{whiteSpace:t}=window.getComputedStyle(n);return["pre","pre-wrap","pre-line"].includes(t)},yn=n=>n&&!Ti(n.textContent),di=function(n){let t=window.getComputedStyle(n);if(t.display==="block")return{top:parseInt(t.marginTop),bottom:parseInt(t.marginBottom)}},Cn=function(n){return x(n)==="style"?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},kn=n=>n.replace(new RegExp("^".concat(ze.source,"+")),""),Rn=n=>new RegExp("^".concat(ze.source,"*$")).test(n),Ti=n=>/\s$/.test(n),En=["contenteditable","data-trix-id","data-trix-store-key","data-trix-mutable","data-trix-placeholder","tabindex"],Pe="data-trix-serialized-attributes",Sn="[".concat(Pe,"]"),Ln=new RegExp("","g"),Dn={"application/json":function(n){let t;if(n instanceof k)t=n;else{if(!(n instanceof HTMLElement))throw new Error("unserializable object");t=et.parse(n.innerHTML).getDocument()}return t.toSerializableDocument().toJSONString()},"text/html":function(n){let t;if(n instanceof k)t=ct.render(n);else{if(!(n instanceof HTMLElement))throw new Error("unserializable object");t=n.cloneNode(!0)}return Array.from(t.querySelectorAll("[data-trix-serialize=false]")).forEach(e=>{V(e)}),En.forEach(e=>{Array.from(t.querySelectorAll("[".concat(e,"]"))).forEach(i=>{i.removeAttribute(e)})}),Array.from(t.querySelectorAll(Sn)).forEach(e=>{try{let i=JSON.parse(e.getAttribute(Pe));e.removeAttribute(Pe);for(let r in i){let o=i[r];e.setAttribute(r,o)}}catch{}}),t.innerHTML.replace(Ln,"")}},wn=Object.freeze({__proto__:null}),m=class extends f{constructor(t,e){super(...arguments),this.attachmentManager=t,this.attachment=e,this.id=this.attachment.id,this.file=this.attachment.file}remove(){return this.attachmentManager.requestRemovalOfAttachment(this.attachment)}};m.proxyMethod("attachment.getAttribute"),m.proxyMethod("attachment.hasAttribute"),m.proxyMethod("attachment.setAttribute"),m.proxyMethod("attachment.getAttributes"),m.proxyMethod("attachment.setAttributes"),m.proxyMethod("attachment.isPending"),m.proxyMethod("attachment.isPreviewable"),m.proxyMethod("attachment.getURL"),m.proxyMethod("attachment.getHref"),m.proxyMethod("attachment.getFilename"),m.proxyMethod("attachment.getFilesize"),m.proxyMethod("attachment.getFormattedFilesize"),m.proxyMethod("attachment.getExtension"),m.proxyMethod("attachment.getContentType"),m.proxyMethod("attachment.getFile"),m.proxyMethod("attachment.setFile"),m.proxyMethod("attachment.releaseFile"),m.proxyMethod("attachment.getUploadProgress"),m.proxyMethod("attachment.setUploadProgress");var Ut=class extends f{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];super(...arguments),this.managedAttachments={},Array.from(t).forEach(e=>{this.manageAttachment(e)})}getAttachments(){let t=[];for(let e in this.managedAttachments){let i=this.managedAttachments[e];t.push(i)}return t}manageAttachment(t){return this.managedAttachments[t.id]||(this.managedAttachments[t.id]=new m(this,t)),this.managedAttachments[t.id]}attachmentIsManaged(t){return t.id in this.managedAttachments}requestRemovalOfAttachment(t){var e,i;if(this.attachmentIsManaged(t))return(e=this.delegate)===null||e===void 0||(i=e.attachmentManagerDidRequestRemovalOfAttachment)===null||i===void 0?void 0:i.call(e,t)}unmanageAttachment(t){let e=this.managedAttachments[t.id];return delete this.managedAttachments[t.id],e}},qt=class{constructor(t){this.composition=t,this.document=this.composition.document;let e=this.composition.getSelectedRange();this.startPosition=e[0],this.endPosition=e[1],this.startLocation=this.document.locationFromPosition(this.startPosition),this.endLocation=this.document.locationFromPosition(this.endPosition),this.block=this.document.getBlockAtIndex(this.endLocation.index),this.breaksOnReturn=this.block.breaksOnReturn(),this.previousCharacter=this.block.text.getStringAtPosition(this.endLocation.offset-1),this.nextCharacter=this.block.text.getStringAtPosition(this.endLocation.offset)}shouldInsertBlockBreak(){return this.block.hasAttributes()&&this.block.isListItem()&&!this.block.isEmpty()?this.startLocation.offset!==0:this.breaksOnReturn&&this.nextCharacter!==` -`}shouldBreakFormattedBlock(){return this.block.hasAttributes()&&!this.block.isListItem()&&(this.breaksOnReturn&&this.nextCharacter===` -`||this.previousCharacter===` -`)}shouldDecreaseListLevel(){return this.block.hasAttributes()&&this.block.isListItem()&&this.block.isEmpty()}shouldPrependListItem(){return this.block.isListItem()&&this.startLocation.offset===0&&!this.block.isEmpty()}shouldRemoveLastBlockAttribute(){return this.block.hasAttributes()&&!this.block.isListItem()&&this.block.isEmpty()}},F=class extends f{constructor(){super(...arguments),this.document=new k,this.attachments=[],this.currentAttributes={},this.revision=0}setDocument(t){var e,i;if(!t.isEqualTo(this.document))return this.document=t,this.refreshAttachments(),this.revision++,(e=this.delegate)===null||e===void 0||(i=e.compositionDidChangeDocument)===null||i===void 0?void 0:i.call(e,t)}getSnapshot(){return{document:this.document,selectedRange:this.getSelectedRange()}}loadSnapshot(t){var e,i,r,o;let{document:s,selectedRange:a}=t;return(e=this.delegate)===null||e===void 0||(i=e.compositionWillLoadSnapshot)===null||i===void 0||i.call(e),this.setDocument(s??new k),this.setSelection(a??[0,0]),(r=this.delegate)===null||r===void 0||(o=r.compositionDidLoadSnapshot)===null||o===void 0?void 0:o.call(r)}insertText(t){let{updatePosition:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{updatePosition:!0},i=this.getSelectedRange();this.setDocument(this.document.insertTextAtRange(t,i));let r=i[0],o=r+t.getLength();return e&&this.setSelection(o),this.notifyDelegateOfInsertionAtRange([r,o])}insertBlock(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:new S,e=new k([t]);return this.insertDocument(e)}insertDocument(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:new k,e=this.getSelectedRange();this.setDocument(this.document.insertDocumentAtRange(t,e));let i=e[0],r=i+t.getLength();return this.setSelection(r),this.notifyDelegateOfInsertionAtRange([i,r])}insertString(t,e){let i=this.getCurrentTextAttributes(),r=R.textForStringWithAttributes(t,i);return this.insertText(r,e)}insertBlockBreak(){let t=this.getSelectedRange();this.setDocument(this.document.insertBlockBreakAtRange(t));let e=t[0],i=e+1;return this.setSelection(i),this.notifyDelegateOfInsertionAtRange([e,i])}insertLineBreak(){let t=new qt(this);if(t.shouldDecreaseListLevel())return this.decreaseListLevel(),this.setSelection(t.startPosition);if(t.shouldPrependListItem()){let e=new k([t.block.copyWithoutText()]);return this.insertDocument(e)}return t.shouldInsertBlockBreak()?this.insertBlockBreak():t.shouldRemoveLastBlockAttribute()?this.removeLastBlockAttribute():t.shouldBreakFormattedBlock()?this.breakFormattedBlock(t):this.insertString(` -`)}insertHTML(t){let e=et.parse(t).getDocument(),i=this.getSelectedRange();this.setDocument(this.document.mergeDocumentAtRange(e,i));let r=i[0],o=r+e.getLength()-1;return this.setSelection(o),this.notifyDelegateOfInsertionAtRange([r,o])}replaceHTML(t){let e=et.parse(t).getDocument().copyUsingObjectsFromDocument(this.document),i=this.getLocationRange({strict:!1}),r=this.document.rangeFromLocationRange(i);return this.setDocument(e),this.setSelection(r)}insertFile(t){return this.insertFiles([t])}insertFiles(t){let e=[];return Array.from(t).forEach(i=>{var r;if((r=this.delegate)!==null&&r!==void 0&&r.compositionShouldAcceptFile(i)){let o=H.attachmentForFile(i);e.push(o)}}),this.insertAttachments(e)}insertAttachment(t){return this.insertAttachments([t])}insertAttachments(t){let e=new R;return Array.from(t).forEach(i=>{var r;let o=i.getType(),s=(r=je[o])===null||r===void 0?void 0:r.presentation,a=this.getCurrentTextAttributes();s&&(a.presentation=s);let l=R.textForAttachmentWithAttributes(i,a);e=e.appendText(l)}),this.insertText(e)}shouldManageDeletingInDirection(t){let e=this.getLocationRange();if(N(e)){if(t==="backward"&&e[0].offset===0||this.shouldManageMovingCursorInDirection(t))return!0}else if(e[0].index!==e[1].index)return!0;return!1}deleteInDirection(t){let e,i,r,{length:o}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s=this.getLocationRange(),a=this.getSelectedRange(),l=N(a);if(l?i=t==="backward"&&s[0].offset===0:r=s[0].index!==s[1].index,i&&this.canDecreaseBlockAttributeLevel()){let c=this.getBlock();if(c.isListItem()?this.decreaseListLevel():this.decreaseBlockAttributeLevel(),this.setSelection(a[0]),c.isEmpty())return!1}return l&&(a=this.getExpandedRangeInDirection(t,{length:o}),t==="backward"&&(e=this.getAttachmentAtRange(a))),e?(this.editAttachment(e),!1):(this.setDocument(this.document.removeTextAtRange(a)),this.setSelection(a[0]),!i&&!r&&void 0)}moveTextFromRange(t){let[e]=Array.from(this.getSelectedRange());return this.setDocument(this.document.moveTextFromRangeToPosition(t,e)),this.setSelection(e)}removeAttachment(t){let e=this.document.getRangeOfAttachment(t);if(e)return this.stopEditingAttachment(),this.setDocument(this.document.removeTextAtRange(e)),this.setSelection(e[0])}removeLastBlockAttribute(){let[t,e]=Array.from(this.getSelectedRange()),i=this.document.getBlockAtPosition(e);return this.removeCurrentAttribute(i.getLastAttribute()),this.setSelection(t)}insertPlaceholder(){return this.placeholderPosition=this.getPosition(),this.insertString(" ")}selectPlaceholder(){if(this.placeholderPosition!=null)return this.setSelectedRange([this.placeholderPosition,this.placeholderPosition+1]),this.getSelectedRange()}forgetPlaceholder(){this.placeholderPosition=null}hasCurrentAttribute(t){let e=this.currentAttributes[t];return e!=null&&e!==!1}toggleCurrentAttribute(t){let e=!this.currentAttributes[t];return e?this.setCurrentAttribute(t,e):this.removeCurrentAttribute(t)}canSetCurrentAttribute(t){return v(t)?this.canSetCurrentBlockAttribute(t):this.canSetCurrentTextAttribute(t)}canSetCurrentTextAttribute(t){let e=this.getSelectedDocument();if(e){for(let i of Array.from(e.getAttachments()))if(!i.hasContent())return!1;return!0}}canSetCurrentBlockAttribute(t){let e=this.getBlock();if(e)return!e.isTerminalBlock()}setCurrentAttribute(t,e){return v(t)?this.setBlockAttribute(t,e):(this.setTextAttribute(t,e),this.currentAttributes[t]=e,this.notifyDelegateOfCurrentAttributesChange())}setHTMLAtributeAtPosition(t,e,i){var r;let o=this.document.getBlockAtPosition(t),s=(r=v(o.getLastAttribute()))===null||r===void 0?void 0:r.htmlAttributes;if(o&&s!=null&&s.includes(e)){let a=this.document.setHTMLAttributeAtPosition(t,e,i);this.setDocument(a)}}setTextAttribute(t,e){let i=this.getSelectedRange();if(!i)return;let[r,o]=Array.from(i);if(r!==o)return this.setDocument(this.document.addAttributeAtRange(t,e,i));if(t==="href"){let s=R.textForStringWithAttributes(e,{href:e});return this.insertText(s)}}setBlockAttribute(t,e){let i=this.getSelectedRange();if(this.canSetCurrentAttribute(t))return this.setDocument(this.document.applyBlockAttributeAtRange(t,e,i)),this.setSelection(i)}removeCurrentAttribute(t){return v(t)?(this.removeBlockAttribute(t),this.updateCurrentAttributes()):(this.removeTextAttribute(t),delete this.currentAttributes[t],this.notifyDelegateOfCurrentAttributesChange())}removeTextAttribute(t){let e=this.getSelectedRange();if(e)return this.setDocument(this.document.removeAttributeAtRange(t,e))}removeBlockAttribute(t){let e=this.getSelectedRange();if(e)return this.setDocument(this.document.removeAttributeAtRange(t,e))}canDecreaseNestingLevel(){var t;return((t=this.getBlock())===null||t===void 0?void 0:t.getNestingLevel())>0}canIncreaseNestingLevel(){var t;let e=this.getBlock();if(e){if((t=v(e.getLastNestableAttribute()))===null||t===void 0||!t.listAttribute)return e.getNestingLevel()>0;{let i=this.getPreviousBlock();if(i)return function(){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];return Q((arguments.length>0&&arguments[0]!==void 0?arguments[0]:[]).slice(0,r.length),r)}(i.getListItemAttributes(),e.getListItemAttributes())}}}decreaseNestingLevel(){let t=this.getBlock();if(t)return this.setDocument(this.document.replaceBlock(t,t.decreaseNestingLevel()))}increaseNestingLevel(){let t=this.getBlock();if(t)return this.setDocument(this.document.replaceBlock(t,t.increaseNestingLevel()))}canDecreaseBlockAttributeLevel(){var t;return((t=this.getBlock())===null||t===void 0?void 0:t.getAttributeLevel())>0}decreaseBlockAttributeLevel(){var t;let e=(t=this.getBlock())===null||t===void 0?void 0:t.getLastAttribute();if(e)return this.removeCurrentAttribute(e)}decreaseListLevel(){let[t]=Array.from(this.getSelectedRange()),{index:e}=this.document.locationFromPosition(t),i=e,r=this.getBlock().getAttributeLevel(),o=this.document.getBlockAtIndex(i+1);for(;o&&o.isListItem()&&!(o.getAttributeLevel()<=r);)i++,o=this.document.getBlockAtIndex(i+1);t=this.document.positionFromLocation({index:e,offset:0});let s=this.document.positionFromLocation({index:i,offset:0});return this.setDocument(this.document.removeLastListAttributeAtRange([t,s]))}updateCurrentAttributes(){let t=this.getSelectedRange({ignoreLock:!0});if(t){let e=this.document.getCommonAttributesAtRange(t);if(Array.from(Le()).forEach(i=>{e[i]||this.canSetCurrentAttribute(i)||(e[i]=!1)}),!dt(e,this.currentAttributes))return this.currentAttributes=e,this.notifyDelegateOfCurrentAttributesChange()}}getCurrentAttributes(){return Ai.call({},this.currentAttributes)}getCurrentTextAttributes(){let t={};for(let e in this.currentAttributes){let i=this.currentAttributes[e];i!==!1&&De(e)&&(t[e]=i)}return t}freezeSelection(){return this.setCurrentAttribute("frozen",!0)}thawSelection(){return this.removeCurrentAttribute("frozen")}hasFrozenSelection(){return this.hasCurrentAttribute("frozen")}setSelection(t){var e;let i=this.document.locationRangeFromRange(t);return(e=this.delegate)===null||e===void 0?void 0:e.compositionDidRequestChangingSelectionToLocationRange(i)}getSelectedRange(){let t=this.getLocationRange();if(t)return this.document.rangeFromLocationRange(t)}setSelectedRange(t){let e=this.document.locationRangeFromRange(t);return this.getSelectionManager().setLocationRange(e)}getPosition(){let t=this.getLocationRange();if(t)return this.document.positionFromLocation(t[0])}getLocationRange(t){return this.targetLocationRange?this.targetLocationRange:this.getSelectionManager().getLocationRange(t)||g({index:0,offset:0})}withTargetLocationRange(t,e){let i;this.targetLocationRange=t;try{i=e()}finally{this.targetLocationRange=null}return i}withTargetRange(t,e){let i=this.document.locationRangeFromRange(t);return this.withTargetLocationRange(i,e)}withTargetDOMRange(t,e){let i=this.createLocationRangeFromDOMRange(t,{strict:!1});return this.withTargetLocationRange(i,e)}getExpandedRangeInDirection(t){let{length:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},[i,r]=Array.from(this.getSelectedRange());return t==="backward"?e?i-=e:i=this.translateUTF16PositionFromOffset(i,-1):e?r+=e:r=this.translateUTF16PositionFromOffset(r,1),g([i,r])}shouldManageMovingCursorInDirection(t){if(this.editingAttachment)return!0;let e=this.getExpandedRangeInDirection(t);return this.getAttachmentAtRange(e)!=null}moveCursorInDirection(t){let e,i;if(this.editingAttachment)i=this.document.getRangeOfAttachment(this.editingAttachment);else{let r=this.getSelectedRange();i=this.getExpandedRangeInDirection(t),e=!Pt(r,i)}if(t==="backward"?this.setSelectedRange(i[0]):this.setSelectedRange(i[1]),e){let r=this.getAttachmentAtRange(i);if(r)return this.editAttachment(r)}}expandSelectionInDirection(t){let{length:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=this.getExpandedRangeInDirection(t,{length:e});return this.setSelectedRange(i)}expandSelectionForEditing(){if(this.hasCurrentAttribute("href"))return this.expandSelectionAroundCommonAttribute("href")}expandSelectionAroundCommonAttribute(t){let e=this.getPosition(),i=this.document.getRangeOfCommonAttributeAtPosition(t,e);return this.setSelectedRange(i)}selectionContainsAttachments(){var t;return((t=this.getSelectedAttachments())===null||t===void 0?void 0:t.length)>0}selectionIsInCursorTarget(){return this.editingAttachment||this.positionIsCursorTarget(this.getPosition())}positionIsCursorTarget(t){let e=this.document.locationFromPosition(t);if(e)return this.locationIsCursorTarget(e)}positionIsBlockBreak(t){var e;return(e=this.document.getPieceAtPosition(t))===null||e===void 0?void 0:e.isBlockBreak()}getSelectedDocument(){let t=this.getSelectedRange();if(t)return this.document.getDocumentAtRange(t)}getSelectedAttachments(){var t;return(t=this.getSelectedDocument())===null||t===void 0?void 0:t.getAttachments()}getAttachments(){return this.attachments.slice(0)}refreshAttachments(){let t=this.document.getAttachments(),{added:e,removed:i}=function(){let r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],s=[],a=[],l=new Set;r.forEach(u=>{l.add(u)});let c=new Set;return o.forEach(u=>{c.add(u),l.has(u)||s.push(u)}),r.forEach(u=>{c.has(u)||a.push(u)}),{added:s,removed:a}}(this.attachments,t);return this.attachments=t,Array.from(i).forEach(r=>{var o,s;r.delegate=null,(o=this.delegate)===null||o===void 0||(s=o.compositionDidRemoveAttachment)===null||s===void 0||s.call(o,r)}),(()=>{let r=[];return Array.from(e).forEach(o=>{var s,a;o.delegate=this,r.push((s=this.delegate)===null||s===void 0||(a=s.compositionDidAddAttachment)===null||a===void 0?void 0:a.call(s,o))}),r})()}attachmentDidChangeAttributes(t){var e,i;return this.revision++,(e=this.delegate)===null||e===void 0||(i=e.compositionDidEditAttachment)===null||i===void 0?void 0:i.call(e,t)}attachmentDidChangePreviewURL(t){var e,i;return this.revision++,(e=this.delegate)===null||e===void 0||(i=e.compositionDidChangeAttachmentPreviewURL)===null||i===void 0?void 0:i.call(e,t)}editAttachment(t,e){var i,r;if(t!==this.editingAttachment)return this.stopEditingAttachment(),this.editingAttachment=t,(i=this.delegate)===null||i===void 0||(r=i.compositionDidStartEditingAttachment)===null||r===void 0?void 0:r.call(i,this.editingAttachment,e)}stopEditingAttachment(){var t,e;this.editingAttachment&&((t=this.delegate)===null||t===void 0||(e=t.compositionDidStopEditingAttachment)===null||e===void 0||e.call(t,this.editingAttachment),this.editingAttachment=null)}updateAttributesForAttachment(t,e){return this.setDocument(this.document.updateAttributesForAttachment(t,e))}removeAttributeForAttachment(t,e){return this.setDocument(this.document.removeAttributeForAttachment(t,e))}breakFormattedBlock(t){let{document:e}=t,{block:i}=t,r=t.startPosition,o=[r-1,r];i.getBlockBreakPosition()===t.startLocation.offset?(i.breaksOnReturn()&&t.nextCharacter===` -`?r+=1:e=e.removeTextAtRange(o),o=[r,r]):t.nextCharacter===` -`?t.previousCharacter===` -`?o=[r-1,r+1]:(o=[r,r+1],r+=1):t.startLocation.offset-1!=0&&(r+=1);let s=new k([i.removeLastAttribute().copyWithoutText()]);return this.setDocument(e.insertDocumentAtRange(s,o)),this.setSelection(r)}getPreviousBlock(){let t=this.getLocationRange();if(t){let{index:e}=t[0];if(e>0)return this.document.getBlockAtIndex(e-1)}}getBlock(){let t=this.getLocationRange();if(t)return this.document.getBlockAtIndex(t[0].index)}getAttachmentAtRange(t){let e=this.document.getDocumentAtRange(t);if(e.toString()==="".concat("\uFFFC",` -`))return e.getAttachments()[0]}notifyDelegateOfCurrentAttributesChange(){var t,e;return(t=this.delegate)===null||t===void 0||(e=t.compositionDidChangeCurrentAttributes)===null||e===void 0?void 0:e.call(t,this.currentAttributes)}notifyDelegateOfInsertionAtRange(t){var e,i;return(e=this.delegate)===null||e===void 0||(i=e.compositionDidPerformInsertionAtRange)===null||i===void 0?void 0:i.call(e,t)}translateUTF16PositionFromOffset(t,e){let i=this.document.toUTF16String(),r=i.offsetFromUCS2Offset(t);return i.offsetToUCS2Offset(r+e)}};F.proxyMethod("getSelectionManager().getPointRange"),F.proxyMethod("getSelectionManager().setLocationRangeFromPointRange"),F.proxyMethod("getSelectionManager().createLocationRangeFromDOMRange"),F.proxyMethod("getSelectionManager().locationIsCursorTarget"),F.proxyMethod("getSelectionManager().selectionIsExpanded"),F.proxyMethod("delegate?.getSelectionManager");var Et=class extends f{constructor(t){super(...arguments),this.composition=t,this.undoEntries=[],this.redoEntries=[]}recordUndoEntry(t){let{context:e,consolidatable:i}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=this.undoEntries.slice(-1)[0];if(!i||!Tn(r,t,e)){let o=this.createEntry({description:t,context:e});this.undoEntries.push(o),this.redoEntries=[]}}undo(){let t=this.undoEntries.pop();if(t){let e=this.createEntry(t);return this.redoEntries.push(e),this.composition.loadSnapshot(t.snapshot)}}redo(){let t=this.redoEntries.pop();if(t){let e=this.createEntry(t);return this.undoEntries.push(e),this.composition.loadSnapshot(t.snapshot)}}canUndo(){return this.undoEntries.length>0}canRedo(){return this.redoEntries.length>0}createEntry(){let{description:t,context:e}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return{description:t?.toString(),context:JSON.stringify(e),snapshot:this.composition.getSnapshot()}}},Tn=(n,t,e)=>n?.description===t?.toString()&&n?.context===JSON.stringify(e),be="attachmentGallery",Vt=class{constructor(t){this.document=t.document,this.selectedRange=t.selectedRange}perform(){return this.removeBlockAttribute(),this.applyBlockAttribute()}getSnapshot(){return{document:this.document,selectedRange:this.selectedRange}}removeBlockAttribute(){return this.findRangesOfBlocks().map(t=>this.document=this.document.removeAttributeAtRange(be,t))}applyBlockAttribute(){let t=0;this.findRangesOfPieces().forEach(e=>{e[1]-e[0]>1&&(e[0]+=t,e[1]+=t,this.document.getCharacterAtPosition(e[1])!==` -`&&(this.document=this.document.insertBlockBreakAtRange(e[1]),e[1]0&&arguments[0]!==void 0?arguments[0]:"",e=et.parse(t,{referenceElement:this.element}).getDocument();return this.loadDocument(e)}loadJSON(t){let{document:e,selectedRange:i}=t;return e=k.fromJSON(e),this.loadSnapshot({document:e,selectedRange:i})}loadSnapshot(t){return this.undoManager=new Et(this.composition),this.composition.loadSnapshot(t)}getDocument(){return this.composition.document}getSelectedDocument(){return this.composition.getSelectedDocument()}getSnapshot(){return this.composition.getSnapshot()}toJSON(){return this.getSnapshot()}deleteInDirection(t){return this.composition.deleteInDirection(t)}insertAttachment(t){return this.composition.insertAttachment(t)}insertAttachments(t){return this.composition.insertAttachments(t)}insertDocument(t){return this.composition.insertDocument(t)}insertFile(t){return this.composition.insertFile(t)}insertFiles(t){return this.composition.insertFiles(t)}insertHTML(t){return this.composition.insertHTML(t)}insertString(t){return this.composition.insertString(t)}insertText(t){return this.composition.insertText(t)}insertLineBreak(){return this.composition.insertLineBreak()}getSelectedRange(){return this.composition.getSelectedRange()}getPosition(){return this.composition.getPosition()}getClientRectAtPosition(t){let e=this.getDocument().locationRangeFromRange([t,t+1]);return this.selectionManager.getClientRectAtLocationRange(e)}expandSelectionInDirection(t){return this.composition.expandSelectionInDirection(t)}moveCursorInDirection(t){return this.composition.moveCursorInDirection(t)}setSelectedRange(t){return this.composition.setSelectedRange(t)}activateAttribute(t){let e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];return this.composition.setCurrentAttribute(t,e)}attributeIsActive(t){return this.composition.hasCurrentAttribute(t)}canActivateAttribute(t){return this.composition.canSetCurrentAttribute(t)}deactivateAttribute(t){return this.composition.removeCurrentAttribute(t)}setHTMLAtributeAtPosition(t,e,i){this.composition.setHTMLAtributeAtPosition(t,e,i)}canDecreaseNestingLevel(){return this.composition.canDecreaseNestingLevel()}canIncreaseNestingLevel(){return this.composition.canIncreaseNestingLevel()}decreaseNestingLevel(){if(this.canDecreaseNestingLevel())return this.composition.decreaseNestingLevel()}increaseNestingLevel(){if(this.canIncreaseNestingLevel())return this.composition.increaseNestingLevel()}canRedo(){return this.undoManager.canRedo()}canUndo(){return this.undoManager.canUndo()}recordUndoEntry(t){let{context:e,consolidatable:i}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return this.undoManager.recordUndoEntry(t,{context:e,consolidatable:i})}redo(){if(this.canRedo())return this.undoManager.redo()}undo(){if(this.canUndo())return this.undoManager.undo()}},zt=class{constructor(t){this.element=t}findLocationFromContainerAndOffset(t,e){let{strict:i}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{strict:!0},r=0,o=!1,s={index:0,offset:0},a=this.findAttachmentElementParentForNode(t);a&&(t=a.parentNode,e=ae(a));let l=Ft(this.element,{usingFilter:Fi});for(;l.nextNode();){let c=l.currentNode;if(c===t&&xt(t)){st(c)||(s.offset+=e);break}if(c.parentNode===t){if(r++===e)break}else if(!J(t,c)&&r>0)break;$e(c,{strict:i})?(o&&s.index++,s.offset=0,o=!0):s.offset+=ve(c)}return s}findContainerAndOffsetFromLocation(t){let e,i;if(t.index===0&&t.offset===0){for(e=this.element,i=0;e.firstChild;)if(e=e.firstChild,le(e)){i=1;break}return[e,i]}let[r,o]=this.findNodeAndOffsetFromLocation(t);if(r){if(xt(r))ve(r)===0?(e=r.parentNode.parentNode,i=ae(r.parentNode),st(r,{name:"right"})&&i++):(e=r,i=t.offset-o);else{if(e=r.parentNode,!$e(r.previousSibling)&&!le(e))for(;r===e.lastChild&&(r=e,e=e.parentNode,!le(e)););i=ae(r),t.offset!==0&&i++}return[e,i]}}findNodeAndOffsetFromLocation(t){let e,i,r=0;for(let o of this.getSignificantNodesForIndex(t.index)){let s=ve(o);if(t.offset<=r+s)if(xt(o)){if(e=o,i=r,t.offset===i&&st(e))break}else e||(e=o,i=r);if(r+=s,r>t.offset)break}return[e,i]}findAttachmentElementParentForNode(t){for(;t&&t!==this.element;){if($(t))return t;t=t.parentNode}}getSignificantNodesForIndex(t){let e=[],i=Ft(this.element,{usingFilter:Fn}),r=!1;for(;i.nextNode();){let s=i.currentNode;var o;if(ot(s)){if(o!=null?o++:o=0,o===t)r=!0;else if(r)break}else r&&e.push(s)}return e}},ve=function(n){return n.nodeType===Node.TEXT_NODE?st(n)?0:n.textContent.length:x(n)==="br"||$(n)?1:0},Fn=function(n){return Pn(n)===NodeFilter.FILTER_ACCEPT?Fi(n):NodeFilter.FILTER_REJECT},Pn=function(n){return yi(n)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},Fi=function(n){return $(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},_t=class{createDOMRangeFromPoint(t){let e,{x:i,y:r}=t;if(document.caretPositionFromPoint){let{offsetNode:o,offset:s}=document.caretPositionFromPoint(i,r);return e=document.createRange(),e.setStart(o,s),e}if(document.caretRangeFromPoint)return document.caretRangeFromPoint(i,r);if(document.body.createTextRange){let o=yt();try{let s=document.body.createTextRange();s.moveToPoint(i,r),s.select()}catch{}return e=yt(),Di(o),e}}getClientRectsForDOMRange(t){let e=Array.from(t.getClientRects());return[e[0],e[e.length-1]]}},I=class extends f{constructor(t){super(...arguments),this.didMouseDown=this.didMouseDown.bind(this),this.selectionDidChange=this.selectionDidChange.bind(this),this.element=t,this.locationMapper=new zt(this.element),this.pointMapper=new _t,this.lockCount=0,p("mousedown",{onElement:this.element,withCallback:this.didMouseDown})}getLocationRange(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return t.strict===!1?this.createLocationRangeFromDOMRange(yt()):t.ignoreLock?this.currentLocationRange:this.lockedLocationRange?this.lockedLocationRange:this.currentLocationRange}setLocationRange(t){if(this.lockedLocationRange)return;t=g(t);let e=this.createDOMRangeFromLocationRange(t);e&&(Di(e),this.updateCurrentLocationRange(t))}setLocationRangeFromPointRange(t){t=g(t);let e=this.getLocationAtPoint(t[0]),i=this.getLocationAtPoint(t[1]);this.setLocationRange([e,i])}getClientRectAtLocationRange(t){let e=this.createDOMRangeFromLocationRange(t);if(e)return this.getClientRectsForDOMRange(e)[1]}locationIsCursorTarget(t){let e=Array.from(this.findNodeAndOffsetFromLocation(t))[0];return st(e)}lock(){this.lockCount++==0&&(this.updateCurrentLocationRange(),this.lockedLocationRange=this.getLocationRange())}unlock(){if(--this.lockCount==0){let{lockedLocationRange:t}=this;if(this.lockedLocationRange=null,t!=null)return this.setLocationRange(t)}}clearSelection(){var t;return(t=Li())===null||t===void 0?void 0:t.removeAllRanges()}selectionIsCollapsed(){var t;return((t=yt())===null||t===void 0?void 0:t.collapsed)===!0}selectionIsExpanded(){return!this.selectionIsCollapsed()}createLocationRangeFromDOMRange(t,e){if(t==null||!this.domRangeWithinElement(t))return;let i=this.findLocationFromContainerAndOffset(t.startContainer,t.startOffset,e);if(!i)return;let r=t.collapsed?void 0:this.findLocationFromContainerAndOffset(t.endContainer,t.endOffset,e);return g([i,r])}didMouseDown(){return this.pauseTemporarily()}pauseTemporarily(){let t;this.paused=!0;let e=()=>{if(this.paused=!1,clearTimeout(i),Array.from(t).forEach(r=>{r.destroy()}),J(document,this.element))return this.selectionDidChange()},i=setTimeout(e,200);t=["mousemove","keydown"].map(r=>p(r,{onElement:document,withCallback:e}))}selectionDidChange(){if(!this.paused&&!Ue(this.element))return this.updateCurrentLocationRange()}updateCurrentLocationRange(t){var e,i;if((t??(t=this.createLocationRangeFromDOMRange(yt())))&&!Pt(t,this.currentLocationRange))return this.currentLocationRange=t,(e=this.delegate)===null||e===void 0||(i=e.locationRangeDidChange)===null||i===void 0?void 0:i.call(e,this.currentLocationRange.slice(0))}createDOMRangeFromLocationRange(t){let e=this.findContainerAndOffsetFromLocation(t[0]),i=N(t)?e:this.findContainerAndOffsetFromLocation(t[1])||e;if(e!=null&&i!=null){let r=document.createRange();return r.setStart(...Array.from(e||[])),r.setEnd(...Array.from(i||[])),r}}getLocationAtPoint(t){let e=this.createDOMRangeFromPoint(t);var i;if(e)return(i=this.createLocationRangeFromDOMRange(e))===null||i===void 0?void 0:i[0]}domRangeWithinElement(t){return t.collapsed?J(this.element,t.startContainer):J(this.element,t.startContainer)&&J(this.element,t.endContainer)}};I.proxyMethod("locationMapper.findLocationFromContainerAndOffset"),I.proxyMethod("locationMapper.findContainerAndOffsetFromLocation"),I.proxyMethod("locationMapper.findNodeAndOffsetFromLocation"),I.proxyMethod("pointMapper.createDOMRangeFromPoint"),I.proxyMethod("pointMapper.getClientRectsForDOMRange");var Pi=Object.freeze({__proto__:null,Attachment:H,AttachmentManager:Ut,AttachmentPiece:z,Block:S,Composition:F,Document:k,Editor:Ht,HTMLParser:et,HTMLSanitizer:lt,LineBreakInsertion:qt,LocationMapper:zt,ManagedAttachment:m,Piece:j,PointMapper:_t,SelectionManager:I,SplittableList:ut,StringPiece:Rt,Text:R,UndoManager:Et}),In=Object.freeze({__proto__:null,ObjectView:M,AttachmentView:kt,BlockView:jt,DocumentView:ct,PieceView:Ot,PreviewableAttachmentView:Nt,TextView:Mt}),{lang:Ae,css:_,keyNames:Nn}=Lt,xe=function(n){return function(){let t=n.apply(this,arguments);t.do(),this.undos||(this.undos=[]),this.undos.push(t.undo)}},Jt=class extends f{constructor(t,e,i){let r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};super(...arguments),E(this,"makeElementMutable",xe(()=>({do:()=>{this.element.dataset.trixMutable=!0},undo:()=>delete this.element.dataset.trixMutable}))),E(this,"addToolbar",xe(()=>{let o=d({tagName:"div",className:_.attachmentToolbar,data:{trixMutable:!0},childNodes:d({tagName:"div",className:"trix-button-row",childNodes:d({tagName:"span",className:"trix-button-group trix-button-group--actions",childNodes:d({tagName:"button",className:"trix-button trix-button--remove",textContent:Ae.remove,attributes:{title:Ae.remove},data:{trixAction:"remove"}})})})});return this.attachment.isPreviewable()&&o.appendChild(d({tagName:"div",className:_.attachmentMetadataContainer,childNodes:d({tagName:"span",className:_.attachmentMetadata,childNodes:[d({tagName:"span",className:_.attachmentName,textContent:this.attachment.getFilename(),attributes:{title:this.attachment.getFilename()}}),d({tagName:"span",className:_.attachmentSize,textContent:this.attachment.getFormattedFilesize()})]})})),p("click",{onElement:o,withCallback:this.didClickToolbar}),p("click",{onElement:o,matchingSelector:"[data-trix-action]",withCallback:this.didClickActionButton}),vt("trix-attachment-before-toolbar",{onElement:this.element,attributes:{toolbar:o,attachment:this.attachment}}),{do:()=>this.element.appendChild(o),undo:()=>V(o)}})),E(this,"installCaptionEditor",xe(()=>{let o=d({tagName:"textarea",className:_.attachmentCaptionEditor,attributes:{placeholder:Ae.captionPlaceholder},data:{trixMutable:!0}});o.value=this.attachmentPiece.getCaption();let s=o.cloneNode();s.classList.add("trix-autoresize-clone"),s.tabIndex=-1;let a=function(){s.value=o.value,o.style.height=s.scrollHeight+"px"};p("input",{onElement:o,withCallback:a}),p("input",{onElement:o,withCallback:this.didInputCaption}),p("keydown",{onElement:o,withCallback:this.didKeyDownCaption}),p("change",{onElement:o,withCallback:this.didChangeCaption}),p("blur",{onElement:o,withCallback:this.didBlurCaption});let l=this.element.querySelector("figcaption"),c=l.cloneNode();return{do:()=>{if(l.style.display="none",c.appendChild(o),c.appendChild(s),c.classList.add("".concat(_.attachmentCaption,"--editing")),l.parentElement.insertBefore(c,l),a(),this.options.editCaption)return He(()=>o.focus())},undo(){V(c),l.style.display=null}}})),this.didClickToolbar=this.didClickToolbar.bind(this),this.didClickActionButton=this.didClickActionButton.bind(this),this.didKeyDownCaption=this.didKeyDownCaption.bind(this),this.didInputCaption=this.didInputCaption.bind(this),this.didChangeCaption=this.didChangeCaption.bind(this),this.didBlurCaption=this.didBlurCaption.bind(this),this.attachmentPiece=t,this.element=e,this.container=i,this.options=r,this.attachment=this.attachmentPiece.attachment,x(this.element)==="a"&&(this.element=this.element.firstChild),this.install()}install(){this.makeElementMutable(),this.addToolbar(),this.attachment.isPreviewable()&&this.installCaptionEditor()}uninstall(){var t;let e=this.undos.pop();for(this.savePendingCaption();e;)e(),e=this.undos.pop();(t=this.delegate)===null||t===void 0||t.didUninstallAttachmentEditor(this)}savePendingCaption(){if(this.pendingCaption!=null){let o=this.pendingCaption;var t,e,i,r;this.pendingCaption=null,o?(t=this.delegate)===null||t===void 0||(e=t.attachmentEditorDidRequestUpdatingAttributesForAttachment)===null||e===void 0||e.call(t,{caption:o},this.attachment):(i=this.delegate)===null||i===void 0||(r=i.attachmentEditorDidRequestRemovingAttributeForAttachment)===null||r===void 0||r.call(i,"caption",this.attachment)}}didClickToolbar(t){return t.preventDefault(),t.stopPropagation()}didClickActionButton(t){var e;if(t.target.getAttribute("data-trix-action")==="remove")return(e=this.delegate)===null||e===void 0?void 0:e.attachmentEditorDidRequestRemovalOfAttachment(this.attachment)}didKeyDownCaption(t){var e,i;if(Nn[t.keyCode]==="return")return t.preventDefault(),this.savePendingCaption(),(e=this.delegate)===null||e===void 0||(i=e.attachmentEditorDidRequestDeselectingAttachment)===null||i===void 0?void 0:i.call(e,this.attachment)}didInputCaption(t){this.pendingCaption=t.target.value.replace(/\s/g," ").trim()}didChangeCaption(t){return this.savePendingCaption()}didBlurCaption(t){return this.savePendingCaption()}},Kt=class extends f{constructor(t,e){super(...arguments),this.didFocus=this.didFocus.bind(this),this.didBlur=this.didBlur.bind(this),this.didClickAttachment=this.didClickAttachment.bind(this),this.element=t,this.composition=e,this.documentView=new ct(this.composition.document,{element:this.element}),p("focus",{onElement:this.element,withCallback:this.didFocus}),p("blur",{onElement:this.element,withCallback:this.didBlur}),p("click",{onElement:this.element,matchingSelector:"a[contenteditable=false]",preventDefault:!0}),p("mousedown",{onElement:this.element,matchingSelector:K,withCallback:this.didClickAttachment}),p("click",{onElement:this.element,matchingSelector:"a".concat(K),preventDefault:!0})}didFocus(t){var e;let i=()=>{var r,o;if(!this.focused)return this.focused=!0,(r=this.delegate)===null||r===void 0||(o=r.compositionControllerDidFocus)===null||o===void 0?void 0:o.call(r)};return((e=this.blurPromise)===null||e===void 0?void 0:e.then(i))||i()}didBlur(t){this.blurPromise=new Promise(e=>He(()=>{var i,r;return Ue(this.element)||(this.focused=null,(i=this.delegate)===null||i===void 0||(r=i.compositionControllerDidBlur)===null||r===void 0||r.call(i)),this.blurPromise=null,e()}))}didClickAttachment(t,e){var i,r;let o=this.findAttachmentForElement(e),s=!!q(t.target,{matchingSelector:"figcaption"});return(i=this.delegate)===null||i===void 0||(r=i.compositionControllerDidSelectAttachment)===null||r===void 0?void 0:r.call(i,o,{editCaption:s})}getSerializableElement(){return this.isEditingAttachment()?this.documentView.shadowElement:this.element}render(){var t,e,i,r,o,s;return this.revision!==this.composition.revision&&(this.documentView.setDocument(this.composition.document),this.documentView.render(),this.revision=this.composition.revision),this.canSyncDocumentView()&&!this.documentView.isSynced()&&((i=this.delegate)===null||i===void 0||(r=i.compositionControllerWillSyncDocumentView)===null||r===void 0||r.call(i),this.documentView.sync(),(o=this.delegate)===null||o===void 0||(s=o.compositionControllerDidSyncDocumentView)===null||s===void 0||s.call(o)),(t=this.delegate)===null||t===void 0||(e=t.compositionControllerDidRender)===null||e===void 0?void 0:e.call(t)}rerenderViewForObject(t){return this.invalidateViewForObject(t),this.render()}invalidateViewForObject(t){return this.documentView.invalidateViewForObject(t)}isViewCachingEnabled(){return this.documentView.isViewCachingEnabled()}enableViewCaching(){return this.documentView.enableViewCaching()}disableViewCaching(){return this.documentView.disableViewCaching()}refreshViewCache(){return this.documentView.garbageCollectCachedViews()}isEditingAttachment(){return!!this.attachmentEditor}installAttachmentEditorForAttachment(t,e){var i;if(((i=this.attachmentEditor)===null||i===void 0?void 0:i.attachment)===t)return;let r=this.documentView.findElementForObject(t);if(!r)return;this.uninstallAttachmentEditor();let o=this.composition.document.getAttachmentPieceForAttachment(t);this.attachmentEditor=new Jt(o,r,this.element,e),this.attachmentEditor.delegate=this}uninstallAttachmentEditor(){var t;return(t=this.attachmentEditor)===null||t===void 0?void 0:t.uninstall()}didUninstallAttachmentEditor(){return this.attachmentEditor=null,this.render()}attachmentEditorDidRequestUpdatingAttributesForAttachment(t,e){var i,r;return(i=this.delegate)===null||i===void 0||(r=i.compositionControllerWillUpdateAttachment)===null||r===void 0||r.call(i,e),this.composition.updateAttributesForAttachment(t,e)}attachmentEditorDidRequestRemovingAttributeForAttachment(t,e){var i,r;return(i=this.delegate)===null||i===void 0||(r=i.compositionControllerWillUpdateAttachment)===null||r===void 0||r.call(i,e),this.composition.removeAttributeForAttachment(t,e)}attachmentEditorDidRequestRemovalOfAttachment(t){var e,i;return(e=this.delegate)===null||e===void 0||(i=e.compositionControllerDidRequestRemovalOfAttachment)===null||i===void 0?void 0:i.call(e,t)}attachmentEditorDidRequestDeselectingAttachment(t){var e,i;return(e=this.delegate)===null||e===void 0||(i=e.compositionControllerDidRequestDeselectingAttachment)===null||i===void 0?void 0:i.call(e,t)}canSyncDocumentView(){return!this.isEditingAttachment()}findAttachmentForElement(t){return this.composition.document.getAttachmentById(parseInt(t.dataset.trixId,10))}},$t=class extends f{},Ii="data-trix-mutable",On="[".concat(Ii,"]"),Mn={attributes:!0,childList:!0,characterData:!0,characterDataOldValue:!0,subtree:!0},Gt=class extends f{constructor(t){super(t),this.didMutate=this.didMutate.bind(this),this.element=t,this.observer=new window.MutationObserver(this.didMutate),this.start()}start(){return this.reset(),this.observer.observe(this.element,Mn)}stop(){return this.observer.disconnect()}didMutate(t){var e,i;if(this.mutations.push(...Array.from(this.findSignificantMutations(t)||[])),this.mutations.length)return(e=this.delegate)===null||e===void 0||(i=e.elementDidMutate)===null||i===void 0||i.call(e,this.getMutationSummary()),this.reset()}reset(){this.mutations=[]}findSignificantMutations(t){return t.filter(e=>this.mutationIsSignificant(e))}mutationIsSignificant(t){if(this.nodeIsMutable(t.target))return!1;for(let e of Array.from(this.nodesModifiedByMutation(t)))if(this.nodeIsSignificant(e))return!0;return!1}nodeIsSignificant(t){return t!==this.element&&!this.nodeIsMutable(t)&&!yi(t)}nodeIsMutable(t){return q(t,{matchingSelector:On})}nodesModifiedByMutation(t){let e=[];switch(t.type){case"attributes":t.attributeName!==Ii&&e.push(t.target);break;case"characterData":e.push(t.target.parentNode),e.push(t.target);break;case"childList":e.push(...Array.from(t.addedNodes||[])),e.push(...Array.from(t.removedNodes||[]))}return e}getMutationSummary(){return this.getTextMutationSummary()}getTextMutationSummary(){let{additions:t,deletions:e}=this.getTextChangesFromCharacterData(),i=this.getTextChangesFromChildList();Array.from(i.additions).forEach(a=>{Array.from(t).includes(a)||t.push(a)}),e.push(...Array.from(i.deletions||[]));let r={},o=t.join("");o&&(r.textAdded=o);let s=e.join("");return s&&(r.textDeleted=s),r}getMutationsByType(t){return Array.from(this.mutations).filter(e=>e.type===t)}getTextChangesFromChildList(){let t,e,i=[],r=[];return Array.from(this.getMutationsByType("childList")).forEach(o=>{i.push(...Array.from(o.addedNodes||[])),r.push(...Array.from(o.removedNodes||[]))}),i.length===0&&r.length===1&&ot(r[0])?(t=[],e=[` -`]):(t=Ie(i),e=Ie(r)),{additions:t.filter((o,s)=>o!==e[s]).map(bt),deletions:e.filter((o,s)=>o!==t[s]).map(bt)}}getTextChangesFromCharacterData(){let t,e,i=this.getMutationsByType("characterData");if(i.length){let r=i[0],o=i[i.length-1],s=function(a,l){let c,u;return a=Z.box(a),(l=Z.box(l)).length0&&arguments[0]!==void 0?arguments[0]:[],t=[];for(let e of Array.from(n))switch(e.nodeType){case Node.TEXT_NODE:t.push(e.data);break;case Node.ELEMENT_NODE:x(e)==="br"?t.push(` -`):t.push(...Array.from(Ie(e.childNodes)||[]))}return t},Xt=class extends at{constructor(t){super(...arguments),this.file=t}perform(t){let e=new FileReader;return e.onerror=()=>t(!1),e.onload=()=>{e.onerror=null;try{e.abort()}catch{}return t(!0,this.file)},e.readAsArrayBuffer(this.file)}},Ne=class{constructor(t){this.element=t}shouldIgnore(t){return!!St.samsungAndroid&&(this.previousEvent=this.event,this.event=t,this.checkSamsungKeyboardBuggyModeStart(),this.checkSamsungKeyboardBuggyModeEnd(),this.buggyMode)}checkSamsungKeyboardBuggyModeStart(){this.insertingLongTextAfterUnidentifiedChar()&&jn(this.element.innerText,this.event.data)&&(this.buggyMode=!0,this.event.preventDefault())}checkSamsungKeyboardBuggyModeEnd(){this.buggyMode&&this.event.inputType!=="insertText"&&(this.buggyMode=!1)}insertingLongTextAfterUnidentifiedChar(){var t;return this.isBeforeInputInsertText()&&this.previousEventWasUnidentifiedKeydown()&&((t=this.event.data)===null||t===void 0?void 0:t.length)>50}isBeforeInputInsertText(){return this.event.type==="beforeinput"&&this.event.inputType==="insertText"}previousEventWasUnidentifiedKeydown(){var t,e;return((t=this.previousEvent)===null||t===void 0?void 0:t.type)==="keydown"&&((e=this.previousEvent)===null||e===void 0?void 0:e.key)==="Unidentified"}},jn=(n,t)=>gi(n)===gi(t),Wn=new RegExp("(".concat("\uFFFC","|").concat(te,"|").concat(U,"|\\s)+"),"g"),gi=n=>n.replace(Wn," ").trim(),ht=class extends f{constructor(t){super(...arguments),this.element=t,this.mutationObserver=new Gt(this.element),this.mutationObserver.delegate=this,this.flakyKeyboardDetector=new Ne(this.element);for(let e in this.constructor.events)p(e,{onElement:this.element,withCallback:this.handlerFor(e)})}elementDidMutate(t){}editorWillSyncDocumentView(){return this.mutationObserver.stop()}editorDidSyncDocumentView(){return this.mutationObserver.start()}requestRender(){var t,e;return(t=this.delegate)===null||t===void 0||(e=t.inputControllerDidRequestRender)===null||e===void 0?void 0:e.call(t)}requestReparse(){var t,e;return(t=this.delegate)===null||t===void 0||(e=t.inputControllerDidRequestReparse)===null||e===void 0||e.call(t),this.requestRender()}attachFiles(t){let e=Array.from(t).map(i=>new Xt(i));return Promise.all(e).then(i=>{this.handleInput(function(){var r,o;return(r=this.delegate)===null||r===void 0||r.inputControllerWillAttachFiles(),(o=this.responder)===null||o===void 0||o.insertFiles(i),this.requestRender()})})}handlerFor(t){return e=>{e.defaultPrevented||this.handleInput(()=>{if(!Ue(this.element)){if(this.flakyKeyboardDetector.shouldIgnore(e))return;this.eventName=t,this.constructor.events[t].call(this,e)}})}}handleInput(t){try{var e;(e=this.delegate)===null||e===void 0||e.inputControllerWillHandleInput(),t.call(this)}finally{var i;(i=this.delegate)===null||i===void 0||i.inputControllerDidHandleInput()}}createLinkHTML(t,e){let i=document.createElement("a");return i.href=t,i.textContent=e||t,i.outerHTML}},ye;E(ht,"events",{});var{browser:Un,keyNames:Ni}=Lt,qn=0,w=class extends ht{constructor(){super(...arguments),this.resetInputSummary()}setInputSummary(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.inputSummary.eventName=this.eventName;for(let e in t){let i=t[e];this.inputSummary[e]=i}return this.inputSummary}resetInputSummary(){this.inputSummary={}}reset(){return this.resetInputSummary(),tt.reset()}elementDidMutate(t){var e,i;return this.isComposing()?(e=this.delegate)===null||e===void 0||(i=e.inputControllerDidAllowUnhandledInput)===null||i===void 0?void 0:i.call(e):this.handleInput(function(){return this.mutationIsSignificant(t)&&(this.mutationIsExpected(t)?this.requestRender():this.requestReparse()),this.reset()})}mutationIsExpected(t){let{textAdded:e,textDeleted:i}=t;if(this.inputSummary.preferDocument)return!0;let r=e!=null?e===this.inputSummary.textAdded:!this.inputSummary.textAdded,o=i!=null?this.inputSummary.didDelete:!this.inputSummary.didDelete,s=[` -`,` -`].includes(e)&&!r,a=i===` -`&&!o;if(s&&!a||a&&!s){let c=this.getSelectedRange();if(c){var l;let u=s?e.replace(/\n$/,"").length||-1:e?.length||1;if((l=this.responder)!==null&&l!==void 0&&l.positionIsBlockBreak(c[1]+u))return!0}}return r&&o}mutationIsSignificant(t){var e;let i=Object.keys(t).length>0,r=((e=this.compositionInput)===null||e===void 0?void 0:e.getEndData())==="";return i||!r}getCompositionInput(){if(this.isComposing())return this.compositionInput;this.compositionInput=new B(this)}isComposing(){return this.compositionInput&&!this.compositionInput.isEnded()}deleteInDirection(t,e){var i;return((i=this.responder)===null||i===void 0?void 0:i.deleteInDirection(t))!==!1?this.setInputSummary({didDelete:!0}):e?(e.preventDefault(),this.requestRender()):void 0}serializeSelectionToDataTransfer(t){var e;if(!function(r){if(r==null||!r.setData)return!1;for(let o in Ye){let s=Ye[o];try{if(r.setData(o,s),!r.getData(o)===s)return!1}catch{return!1}}return!0}(t))return;let i=(e=this.responder)===null||e===void 0?void 0:e.getSelectedDocument().toSerializableDocument();return t.setData("application/x-trix-document",JSON.stringify(i)),t.setData("text/html",ct.render(i).innerHTML),t.setData("text/plain",i.toString().replace(/\n$/,"")),!0}canAcceptDataTransfer(t){let e={};return Array.from(t?.types||[]).forEach(i=>{e[i]=!0}),e.Files||e["application/x-trix-document"]||e["text/html"]||e["text/plain"]}getPastedHTMLUsingHiddenElement(t){let e=this.getSelectedRange(),i={position:"absolute",left:"".concat(window.pageXOffset,"px"),top:"".concat(window.pageYOffset,"px"),opacity:0},r=d({style:i,tagName:"div",editable:!0});return document.body.appendChild(r),r.focus(),requestAnimationFrame(()=>{let o=r.innerHTML;return V(r),this.setSelectedRange(e),t(o)})}};E(w,"events",{keydown(n){this.isComposing()||this.resetInputSummary(),this.inputSummary.didInput=!0;let t=Ni[n.keyCode];if(t){var e;let r=this.keys;["ctrl","alt","shift","meta"].forEach(o=>{var s;n["".concat(o,"Key")]&&(o==="ctrl"&&(o="control"),r=(s=r)===null||s===void 0?void 0:s[o])}),((e=r)===null||e===void 0?void 0:e[t])!=null&&(this.setInputSummary({keyName:t}),tt.reset(),r[t].call(this,n))}if(Ei(n)){let r=String.fromCharCode(n.keyCode).toLowerCase();if(r){var i;let o=["alt","shift"].map(s=>{if(n["".concat(s,"Key")])return s}).filter(s=>s);o.push(r),(i=this.delegate)!==null&&i!==void 0&&i.inputControllerDidReceiveKeyboardCommand(o)&&n.preventDefault()}}},keypress(n){if(this.inputSummary.eventName!=null||n.metaKey||n.ctrlKey&&!n.altKey)return;let t=zn(n);var e,i;return t?((e=this.delegate)===null||e===void 0||e.inputControllerWillPerformTyping(),(i=this.responder)===null||i===void 0||i.insertString(t),this.setInputSummary({textAdded:t,didDelete:this.selectionIsExpanded()})):void 0},textInput(n){let{data:t}=n,{textAdded:e}=this.inputSummary;if(e&&e!==t&&e.toUpperCase()===t){var i;let r=this.getSelectedRange();return this.setSelectedRange([r[0],r[1]+e.length]),(i=this.responder)===null||i===void 0||i.insertString(t),this.setInputSummary({textAdded:t}),this.setSelectedRange(r)}},dragenter(n){n.preventDefault()},dragstart(n){var t,e;return this.serializeSelectionToDataTransfer(n.dataTransfer),this.draggedRange=this.getSelectedRange(),(t=this.delegate)===null||t===void 0||(e=t.inputControllerDidStartDrag)===null||e===void 0?void 0:e.call(t)},dragover(n){if(this.draggedRange||this.canAcceptDataTransfer(n.dataTransfer)){n.preventDefault();let i={x:n.clientX,y:n.clientY};var t,e;if(!dt(i,this.draggingPoint))return this.draggingPoint=i,(t=this.delegate)===null||t===void 0||(e=t.inputControllerDidReceiveDragOverPoint)===null||e===void 0?void 0:e.call(t,this.draggingPoint)}},dragend(n){var t,e;(t=this.delegate)===null||t===void 0||(e=t.inputControllerDidCancelDrag)===null||e===void 0||e.call(t),this.draggedRange=null,this.draggingPoint=null},drop(n){var t,e;n.preventDefault();let i=(t=n.dataTransfer)===null||t===void 0?void 0:t.files,r=n.dataTransfer.getData("application/x-trix-document"),o={x:n.clientX,y:n.clientY};if((e=this.responder)===null||e===void 0||e.setLocationRangeFromPointRange(o),i!=null&&i.length)this.attachFiles(i);else if(this.draggedRange){var s,a;(s=this.delegate)===null||s===void 0||s.inputControllerWillMoveText(),(a=this.responder)===null||a===void 0||a.moveTextFromRange(this.draggedRange),this.draggedRange=null,this.requestRender()}else if(r){var l;let c=k.fromJSONString(r);(l=this.responder)===null||l===void 0||l.insertDocument(c),this.requestRender()}this.draggedRange=null,this.draggingPoint=null},cut(n){var t,e;if((t=this.responder)!==null&&t!==void 0&&t.selectionIsExpanded()&&(this.serializeSelectionToDataTransfer(n.clipboardData)&&n.preventDefault(),(e=this.delegate)===null||e===void 0||e.inputControllerWillCutText(),this.deleteInDirection("backward"),n.defaultPrevented))return this.requestRender()},copy(n){var t;(t=this.responder)!==null&&t!==void 0&&t.selectionIsExpanded()&&this.serializeSelectionToDataTransfer(n.clipboardData)&&n.preventDefault()},paste(n){let t=n.clipboardData||n.testClipboardData,e={clipboard:t};if(!t||_n(n))return void this.getPastedHTMLUsingHiddenElement(D=>{var nt,re,oe;return e.type="text/html",e.html=D,(nt=this.delegate)===null||nt===void 0||nt.inputControllerWillPaste(e),(re=this.responder)===null||re===void 0||re.insertHTML(e.html),this.requestRender(),(oe=this.delegate)===null||oe===void 0?void 0:oe.inputControllerDidPaste(e)});let i=t.getData("URL"),r=t.getData("text/html"),o=t.getData("public.url-name");if(i){var s,a,l;let D;e.type="text/html",D=o?_e(o).trim():i,e.html=this.createLinkHTML(i,D),(s=this.delegate)===null||s===void 0||s.inputControllerWillPaste(e),this.setInputSummary({textAdded:D,didDelete:this.selectionIsExpanded()}),(a=this.responder)===null||a===void 0||a.insertHTML(e.html),this.requestRender(),(l=this.delegate)===null||l===void 0||l.inputControllerDidPaste(e)}else if(Ri(t)){var c,u,b;e.type="text/plain",e.string=t.getData("text/plain"),(c=this.delegate)===null||c===void 0||c.inputControllerWillPaste(e),this.setInputSummary({textAdded:e.string,didDelete:this.selectionIsExpanded()}),(u=this.responder)===null||u===void 0||u.insertString(e.string),this.requestRender(),(b=this.delegate)===null||b===void 0||b.inputControllerDidPaste(e)}else if(r){var A,L,gt;e.type="text/html",e.html=r,(A=this.delegate)===null||A===void 0||A.inputControllerWillPaste(e),(L=this.responder)===null||L===void 0||L.insertHTML(e.html),this.requestRender(),(gt=this.delegate)===null||gt===void 0||gt.inputControllerDidPaste(e)}else if(Array.from(t.types).includes("Files")){var P,it;let D=(P=t.items)===null||P===void 0||(P=P[0])===null||P===void 0||(it=P.getAsFile)===null||it===void 0?void 0:it.call(P);if(D){var mt,ie,ne;let nt=Vn(D);!D.name&&nt&&(D.name="pasted-file-".concat(++qn,".").concat(nt)),e.type="File",e.file=D,(mt=this.delegate)===null||mt===void 0||mt.inputControllerWillAttachFiles(),(ie=this.responder)===null||ie===void 0||ie.insertFile(e.file),this.requestRender(),(ne=this.delegate)===null||ne===void 0||ne.inputControllerDidPaste(e)}}n.preventDefault()},compositionstart(n){return this.getCompositionInput().start(n.data)},compositionupdate(n){return this.getCompositionInput().update(n.data)},compositionend(n){return this.getCompositionInput().end(n.data)},beforeinput(n){this.inputSummary.didInput=!0},input(n){return this.inputSummary.didInput=!0,n.stopPropagation()}}),E(w,"keys",{backspace(n){var t;return(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),this.deleteInDirection("backward",n)},delete(n){var t;return(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),this.deleteInDirection("forward",n)},return(n){var t,e;return this.setInputSummary({preferDocument:!0}),(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),(e=this.responder)===null||e===void 0?void 0:e.insertLineBreak()},tab(n){var t,e;(t=this.responder)!==null&&t!==void 0&&t.canIncreaseNestingLevel()&&((e=this.responder)===null||e===void 0||e.increaseNestingLevel(),this.requestRender(),n.preventDefault())},left(n){var t;if(this.selectionIsInCursorTarget())return n.preventDefault(),(t=this.responder)===null||t===void 0?void 0:t.moveCursorInDirection("backward")},right(n){var t;if(this.selectionIsInCursorTarget())return n.preventDefault(),(t=this.responder)===null||t===void 0?void 0:t.moveCursorInDirection("forward")},control:{d(n){var t;return(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),this.deleteInDirection("forward",n)},h(n){var t;return(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),this.deleteInDirection("backward",n)},o(n){var t,e;return n.preventDefault(),(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),(e=this.responder)===null||e===void 0||e.insertString(` -`,{updatePosition:!1}),this.requestRender()}},shift:{return(n){var t,e;(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),(e=this.responder)===null||e===void 0||e.insertString(` -`),this.requestRender(),n.preventDefault()},tab(n){var t,e;(t=this.responder)!==null&&t!==void 0&&t.canDecreaseNestingLevel()&&((e=this.responder)===null||e===void 0||e.decreaseNestingLevel(),this.requestRender(),n.preventDefault())},left(n){if(this.selectionIsInCursorTarget())return n.preventDefault(),this.expandSelectionInDirection("backward")},right(n){if(this.selectionIsInCursorTarget())return n.preventDefault(),this.expandSelectionInDirection("forward")}},alt:{backspace(n){var t;return this.setInputSummary({preferDocument:!1}),(t=this.delegate)===null||t===void 0?void 0:t.inputControllerWillPerformTyping()}},meta:{backspace(n){var t;return this.setInputSummary({preferDocument:!1}),(t=this.delegate)===null||t===void 0?void 0:t.inputControllerWillPerformTyping()}}}),w.proxyMethod("responder?.getSelectedRange"),w.proxyMethod("responder?.setSelectedRange"),w.proxyMethod("responder?.expandSelectionInDirection"),w.proxyMethod("responder?.selectionIsInCursorTarget"),w.proxyMethod("responder?.selectionIsExpanded");var Vn=n=>{var t;return(t=n.type)===null||t===void 0||(t=t.match(/\/(\w+)$/))===null||t===void 0?void 0:t[1]},Hn=!((ye=" ".codePointAt)===null||ye===void 0||!ye.call(" ",0)),zn=function(n){if(n.key&&Hn&&n.key.codePointAt(0)===n.keyCode)return n.key;{let t;if(n.which===null?t=n.keyCode:n.which!==0&&n.charCode!==0&&(t=n.charCode),t!=null&&Ni[t]!=="escape")return Z.fromCodepoints([t]).toString()}},_n=function(n){let t=n.clipboardData;if(t){if(t.types.includes("text/html")){for(let e of t.types){let i=/^CorePasteboardFlavorType/.test(e),r=/^dyn\./.test(e)&&t.getData(e);if(i||r)return!0}return!1}{let e=t.types.includes("com.apple.webarchive"),i=t.types.includes("com.apple.flat-rtfd");return e||i}}},B=class extends f{constructor(t){super(...arguments),this.inputController=t,this.responder=this.inputController.responder,this.delegate=this.inputController.delegate,this.inputSummary=this.inputController.inputSummary,this.data={}}start(t){if(this.data.start=t,this.isSignificant()){var e,i;this.inputSummary.eventName==="keypress"&&this.inputSummary.textAdded&&((i=this.responder)===null||i===void 0||i.deleteInDirection("left")),this.selectionIsExpanded()||(this.insertPlaceholder(),this.requestRender()),this.range=(e=this.responder)===null||e===void 0?void 0:e.getSelectedRange()}}update(t){if(this.data.update=t,this.isSignificant()){let e=this.selectPlaceholder();e&&(this.forgetPlaceholder(),this.range=e)}}end(t){return this.data.end=t,this.isSignificant()?(this.forgetPlaceholder(),this.canApplyToDocument()?(this.setInputSummary({preferDocument:!0,didInput:!1}),(e=this.delegate)===null||e===void 0||e.inputControllerWillPerformTyping(),(i=this.responder)===null||i===void 0||i.setSelectedRange(this.range),(r=this.responder)===null||r===void 0||r.insertString(this.data.end),(o=this.responder)===null||o===void 0?void 0:o.setSelectedRange(this.range[0]+this.data.end.length)):this.data.start!=null||this.data.update!=null?(this.requestReparse(),this.inputController.reset()):void 0):this.inputController.reset();var e,i,r,o}getEndData(){return this.data.end}isEnded(){return this.getEndData()!=null}isSignificant(){return!Un.composesExistingText||this.inputSummary.didInput}canApplyToDocument(){var t,e;return((t=this.data.start)===null||t===void 0?void 0:t.length)===0&&((e=this.data.end)===null||e===void 0?void 0:e.length)>0&&this.range}};B.proxyMethod("inputController.setInputSummary"),B.proxyMethod("inputController.requestRender"),B.proxyMethod("inputController.requestReparse"),B.proxyMethod("responder?.selectionIsExpanded"),B.proxyMethod("responder?.insertPlaceholder"),B.proxyMethod("responder?.selectPlaceholder"),B.proxyMethod("responder?.forgetPlaceholder");var G=class extends ht{constructor(){super(...arguments),this.render=this.render.bind(this)}elementDidMutate(){return this.scheduledRender?this.composing?(t=this.delegate)===null||t===void 0||(e=t.inputControllerDidAllowUnhandledInput)===null||e===void 0?void 0:e.call(t):void 0:this.reparse();var t,e}scheduleRender(){return this.scheduledRender?this.scheduledRender:this.scheduledRender=requestAnimationFrame(this.render)}render(){var t,e;cancelAnimationFrame(this.scheduledRender),this.scheduledRender=null,this.composing||(e=this.delegate)===null||e===void 0||e.render(),(t=this.afterRender)===null||t===void 0||t.call(this),this.afterRender=null}reparse(){var t;return(t=this.delegate)===null||t===void 0?void 0:t.reparse()}insertString(){var t;let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",i=arguments.length>1?arguments[1]:void 0;return(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),this.withTargetDOMRange(function(){var r;return(r=this.responder)===null||r===void 0?void 0:r.insertString(e,i)})}toggleAttributeIfSupported(t){var e;if(Le().includes(t))return(e=this.delegate)===null||e===void 0||e.inputControllerWillPerformFormatting(t),this.withTargetDOMRange(function(){var i;return(i=this.responder)===null||i===void 0?void 0:i.toggleCurrentAttribute(t)})}activateAttributeIfSupported(t,e){var i;if(Le().includes(t))return(i=this.delegate)===null||i===void 0||i.inputControllerWillPerformFormatting(t),this.withTargetDOMRange(function(){var r;return(r=this.responder)===null||r===void 0?void 0:r.setCurrentAttribute(t,e)})}deleteInDirection(t){let{recordUndoEntry:e}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{recordUndoEntry:!0};var i;e&&((i=this.delegate)===null||i===void 0||i.inputControllerWillPerformTyping());let r=()=>{var s;return(s=this.responder)===null||s===void 0?void 0:s.deleteInDirection(t)},o=this.getTargetDOMRange({minLength:this.composing?1:2});return o?this.withTargetDOMRange(o,r):r()}withTargetDOMRange(t,e){var i;return typeof t=="function"&&(e=t,t=this.getTargetDOMRange()),t?(i=this.responder)===null||i===void 0?void 0:i.withTargetDOMRange(t,e.bind(this)):(tt.reset(),e.call(this))}getTargetDOMRange(){var t,e;let{minLength:i}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{minLength:0},r=(t=(e=this.event).getTargetRanges)===null||t===void 0?void 0:t.call(e);if(r&&r.length){let o=Jn(r[0]);if(i===0||o.toString().length>=i)return o}}withEvent(t,e){let i;this.event=t;try{i=e.call(this)}finally{this.event=null}return i}};E(G,"events",{keydown(n){if(Ei(n)){var t;let e=Gn(n);(t=this.delegate)!==null&&t!==void 0&&t.inputControllerDidReceiveKeyboardCommand(e)&&n.preventDefault()}else{let e=n.key;n.altKey&&(e+="+Alt"),n.shiftKey&&(e+="+Shift");let i=this.constructor.keys[e];if(i)return this.withEvent(n,i)}},paste(n){var t;let e,i=(t=n.clipboardData)===null||t===void 0?void 0:t.getData("URL");return Oi(n)?(n.preventDefault(),this.attachFiles(n.clipboardData.files)):$n(n)?(n.preventDefault(),e={type:"text/plain",string:n.clipboardData.getData("text/plain")},(r=this.delegate)===null||r===void 0||r.inputControllerWillPaste(e),(o=this.responder)===null||o===void 0||o.insertString(e.string),this.render(),(s=this.delegate)===null||s===void 0?void 0:s.inputControllerDidPaste(e)):i?(n.preventDefault(),e={type:"text/html",html:this.createLinkHTML(i)},(a=this.delegate)===null||a===void 0||a.inputControllerWillPaste(e),(l=this.responder)===null||l===void 0||l.insertHTML(e.html),this.render(),(c=this.delegate)===null||c===void 0?void 0:c.inputControllerDidPaste(e)):void 0;var r,o,s,a,l,c},beforeinput(n){let t=this.constructor.inputTypes[n.inputType];t&&(this.withEvent(n,t),this.scheduleRender())},input(n){tt.reset()},dragstart(n){var t,e;(t=this.responder)!==null&&t!==void 0&&t.selectionContainsAttachments()&&(n.dataTransfer.setData("application/x-trix-dragging",!0),this.dragging={range:(e=this.responder)===null||e===void 0?void 0:e.getSelectedRange(),point:ke(n)})},dragenter(n){Ce(n)&&n.preventDefault()},dragover(n){if(this.dragging){n.preventDefault();let e=ke(n);var t;if(!dt(e,this.dragging.point))return this.dragging.point=e,(t=this.responder)===null||t===void 0?void 0:t.setLocationRangeFromPointRange(e)}else Ce(n)&&n.preventDefault()},drop(n){var t,e;if(this.dragging)return n.preventDefault(),(t=this.delegate)===null||t===void 0||t.inputControllerWillMoveText(),(e=this.responder)===null||e===void 0||e.moveTextFromRange(this.dragging.range),this.dragging=null,this.scheduleRender();if(Ce(n)){var i;n.preventDefault();let r=ke(n);return(i=this.responder)===null||i===void 0||i.setLocationRangeFromPointRange(r),this.attachFiles(n.dataTransfer.files)}},dragend(){var n;this.dragging&&((n=this.responder)===null||n===void 0||n.setSelectedRange(this.dragging.range),this.dragging=null)},compositionend(n){this.composing&&(this.composing=!1,St.recentAndroid||this.scheduleRender())}}),E(G,"keys",{ArrowLeft(){var n,t;if((n=this.responder)!==null&&n!==void 0&&n.shouldManageMovingCursorInDirection("backward"))return this.event.preventDefault(),(t=this.responder)===null||t===void 0?void 0:t.moveCursorInDirection("backward")},ArrowRight(){var n,t;if((n=this.responder)!==null&&n!==void 0&&n.shouldManageMovingCursorInDirection("forward"))return this.event.preventDefault(),(t=this.responder)===null||t===void 0?void 0:t.moveCursorInDirection("forward")},Backspace(){var n,t,e;if((n=this.responder)!==null&&n!==void 0&&n.shouldManageDeletingInDirection("backward"))return this.event.preventDefault(),(t=this.delegate)===null||t===void 0||t.inputControllerWillPerformTyping(),(e=this.responder)===null||e===void 0||e.deleteInDirection("backward"),this.render()},Tab(){var n,t;if((n=this.responder)!==null&&n!==void 0&&n.canIncreaseNestingLevel())return this.event.preventDefault(),(t=this.responder)===null||t===void 0||t.increaseNestingLevel(),this.render()},"Tab+Shift"(){var n,t;if((n=this.responder)!==null&&n!==void 0&&n.canDecreaseNestingLevel())return this.event.preventDefault(),(t=this.responder)===null||t===void 0||t.decreaseNestingLevel(),this.render()}}),E(G,"inputTypes",{deleteByComposition(){return this.deleteInDirection("backward",{recordUndoEntry:!1})},deleteByCut(){return this.deleteInDirection("backward")},deleteByDrag(){return this.event.preventDefault(),this.withTargetDOMRange(function(){var n;this.deleteByDragRange=(n=this.responder)===null||n===void 0?void 0:n.getSelectedRange()})},deleteCompositionText(){return this.deleteInDirection("backward",{recordUndoEntry:!1})},deleteContent(){return this.deleteInDirection("backward")},deleteContentBackward(){return this.deleteInDirection("backward")},deleteContentForward(){return this.deleteInDirection("forward")},deleteEntireSoftLine(){return this.deleteInDirection("forward")},deleteHardLineBackward(){return this.deleteInDirection("backward")},deleteHardLineForward(){return this.deleteInDirection("forward")},deleteSoftLineBackward(){return this.deleteInDirection("backward")},deleteSoftLineForward(){return this.deleteInDirection("forward")},deleteWordBackward(){return this.deleteInDirection("backward")},deleteWordForward(){return this.deleteInDirection("forward")},formatBackColor(){return this.activateAttributeIfSupported("backgroundColor",this.event.data)},formatBold(){return this.toggleAttributeIfSupported("bold")},formatFontColor(){return this.activateAttributeIfSupported("color",this.event.data)},formatFontName(){return this.activateAttributeIfSupported("font",this.event.data)},formatIndent(){var n;if((n=this.responder)!==null&&n!==void 0&&n.canIncreaseNestingLevel())return this.withTargetDOMRange(function(){var t;return(t=this.responder)===null||t===void 0?void 0:t.increaseNestingLevel()})},formatItalic(){return this.toggleAttributeIfSupported("italic")},formatJustifyCenter(){return this.toggleAttributeIfSupported("justifyCenter")},formatJustifyFull(){return this.toggleAttributeIfSupported("justifyFull")},formatJustifyLeft(){return this.toggleAttributeIfSupported("justifyLeft")},formatJustifyRight(){return this.toggleAttributeIfSupported("justifyRight")},formatOutdent(){var n;if((n=this.responder)!==null&&n!==void 0&&n.canDecreaseNestingLevel())return this.withTargetDOMRange(function(){var t;return(t=this.responder)===null||t===void 0?void 0:t.decreaseNestingLevel()})},formatRemove(){this.withTargetDOMRange(function(){for(let e in(n=this.responder)===null||n===void 0?void 0:n.getCurrentAttributes()){var n,t;(t=this.responder)===null||t===void 0||t.removeCurrentAttribute(e)}})},formatSetBlockTextDirection(){return this.activateAttributeIfSupported("blockDir",this.event.data)},formatSetInlineTextDirection(){return this.activateAttributeIfSupported("textDir",this.event.data)},formatStrikeThrough(){return this.toggleAttributeIfSupported("strike")},formatSubscript(){return this.toggleAttributeIfSupported("sub")},formatSuperscript(){return this.toggleAttributeIfSupported("sup")},formatUnderline(){return this.toggleAttributeIfSupported("underline")},historyRedo(){var n;return(n=this.delegate)===null||n===void 0?void 0:n.inputControllerWillPerformRedo()},historyUndo(){var n;return(n=this.delegate)===null||n===void 0?void 0:n.inputControllerWillPerformUndo()},insertCompositionText(){return this.composing=!0,this.insertString(this.event.data)},insertFromComposition(){return this.composing=!1,this.insertString(this.event.data)},insertFromDrop(){let n=this.deleteByDragRange;var t;if(n)return this.deleteByDragRange=null,(t=this.delegate)===null||t===void 0||t.inputControllerWillMoveText(),this.withTargetDOMRange(function(){var e;return(e=this.responder)===null||e===void 0?void 0:e.moveTextFromRange(n)})},insertFromPaste(){let{dataTransfer:n}=this.event,t={dataTransfer:n},e=n.getData("URL"),i=n.getData("text/html");if(e){var r;let l;this.event.preventDefault(),t.type="text/html";let c=n.getData("public.url-name");l=c?_e(c).trim():e,t.html=this.createLinkHTML(e,l),(r=this.delegate)===null||r===void 0||r.inputControllerWillPaste(t),this.withTargetDOMRange(function(){var u;return(u=this.responder)===null||u===void 0?void 0:u.insertHTML(t.html)}),this.afterRender=()=>{var u;return(u=this.delegate)===null||u===void 0?void 0:u.inputControllerDidPaste(t)}}else if(Ri(n)){var o;t.type="text/plain",t.string=n.getData("text/plain"),(o=this.delegate)===null||o===void 0||o.inputControllerWillPaste(t),this.withTargetDOMRange(function(){var l;return(l=this.responder)===null||l===void 0?void 0:l.insertString(t.string)}),this.afterRender=()=>{var l;return(l=this.delegate)===null||l===void 0?void 0:l.inputControllerDidPaste(t)}}else if(Kn(this.event)){var s;t.type="File",t.file=n.files[0],(s=this.delegate)===null||s===void 0||s.inputControllerWillPaste(t),this.withTargetDOMRange(function(){var l;return(l=this.responder)===null||l===void 0?void 0:l.insertFile(t.file)}),this.afterRender=()=>{var l;return(l=this.delegate)===null||l===void 0?void 0:l.inputControllerDidPaste(t)}}else if(i){var a;this.event.preventDefault(),t.type="text/html",t.html=i,(a=this.delegate)===null||a===void 0||a.inputControllerWillPaste(t),this.withTargetDOMRange(function(){var l;return(l=this.responder)===null||l===void 0?void 0:l.insertHTML(t.html)}),this.afterRender=()=>{var l;return(l=this.delegate)===null||l===void 0?void 0:l.inputControllerDidPaste(t)}}},insertFromYank(){return this.insertString(this.event.data)},insertLineBreak(){return this.insertString(` -`)},insertLink(){return this.activateAttributeIfSupported("href",this.event.data)},insertOrderedList(){return this.toggleAttributeIfSupported("number")},insertParagraph(){var n;return(n=this.delegate)===null||n===void 0||n.inputControllerWillPerformTyping(),this.withTargetDOMRange(function(){var t;return(t=this.responder)===null||t===void 0?void 0:t.insertLineBreak()})},insertReplacementText(){let n=this.event.dataTransfer.getData("text/plain"),t=this.event.getTargetRanges()[0];this.withTargetDOMRange(t,()=>{this.insertString(n,{updatePosition:!1})})},insertText(){var n;return this.insertString(this.event.data||((n=this.event.dataTransfer)===null||n===void 0?void 0:n.getData("text/plain")))},insertTranspose(){return this.insertString(this.event.data)},insertUnorderedList(){return this.toggleAttributeIfSupported("bullet")}});var Jn=function(n){let t=document.createRange();return t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),t},Ce=n=>{var t;return Array.from(((t=n.dataTransfer)===null||t===void 0?void 0:t.types)||[]).includes("Files")},Kn=n=>{var t;return((t=n.dataTransfer.files)===null||t===void 0?void 0:t[0])&&!Oi(n)&&!(e=>{let{dataTransfer:i}=e;return i.types.includes("Files")&&i.types.includes("text/html")&&i.getData("text/html").includes("urn:schemas-microsoft-com:office:office")})(n)},Oi=function(n){let t=n.clipboardData;if(t)return Array.from(t.types).filter(e=>e.match(/file/i)).length===t.types.length&&t.files.length>=1},$n=function(n){let t=n.clipboardData;if(t)return t.types.includes("text/plain")&&t.types.length===1},Gn=function(n){let t=[];return n.altKey&&t.push("alt"),n.shiftKey&&t.push("shift"),t.push(n.key),t},ke=n=>({x:n.clientX,y:n.clientY}),Oe="[data-trix-attribute]",Me="[data-trix-action]",Xn="".concat(Oe,", ").concat(Me),ee="[data-trix-dialog]",Yn="".concat(ee,"[data-trix-active]"),Zn="".concat(ee," [data-trix-method]"),mi="".concat(ee," [data-trix-input]"),pi=(n,t)=>(t||(t=rt(n)),n.querySelector("[data-trix-input][name='".concat(t,"']"))),fi=n=>n.getAttribute("data-trix-action"),rt=n=>n.getAttribute("data-trix-attribute")||n.getAttribute("data-trix-dialog-attribute"),Yt=class extends f{constructor(t){super(t),this.didClickActionButton=this.didClickActionButton.bind(this),this.didClickAttributeButton=this.didClickAttributeButton.bind(this),this.didClickDialogButton=this.didClickDialogButton.bind(this),this.didKeyDownDialogInput=this.didKeyDownDialogInput.bind(this),this.element=t,this.attributes={},this.actions={},this.resetDialogInputs(),p("mousedown",{onElement:this.element,matchingSelector:Me,withCallback:this.didClickActionButton}),p("mousedown",{onElement:this.element,matchingSelector:Oe,withCallback:this.didClickAttributeButton}),p("click",{onElement:this.element,matchingSelector:Xn,preventDefault:!0}),p("click",{onElement:this.element,matchingSelector:Zn,withCallback:this.didClickDialogButton}),p("keydown",{onElement:this.element,matchingSelector:mi,withCallback:this.didKeyDownDialogInput})}didClickActionButton(t,e){var i;(i=this.delegate)===null||i===void 0||i.toolbarDidClickButton(),t.preventDefault();let r=fi(e);return this.getDialog(r)?this.toggleDialog(r):(o=this.delegate)===null||o===void 0?void 0:o.toolbarDidInvokeAction(r,e);var o}didClickAttributeButton(t,e){var i;(i=this.delegate)===null||i===void 0||i.toolbarDidClickButton(),t.preventDefault();let r=rt(e);var o;return this.getDialog(r)?this.toggleDialog(r):(o=this.delegate)===null||o===void 0||o.toolbarDidToggleAttribute(r),this.refreshAttributeButtons()}didClickDialogButton(t,e){let i=q(e,{matchingSelector:ee});return this[e.getAttribute("data-trix-method")].call(this,i)}didKeyDownDialogInput(t,e){if(t.keyCode===13){t.preventDefault();let i=e.getAttribute("name"),r=this.getDialog(i);this.setAttribute(r)}if(t.keyCode===27)return t.preventDefault(),this.hideDialog()}updateActions(t){return this.actions=t,this.refreshActionButtons()}refreshActionButtons(){return this.eachActionButton((t,e)=>{t.disabled=this.actions[e]===!1})}eachActionButton(t){return Array.from(this.element.querySelectorAll(Me)).map(e=>t(e,fi(e)))}updateAttributes(t){return this.attributes=t,this.refreshAttributeButtons()}refreshAttributeButtons(){return this.eachAttributeButton((t,e)=>(t.disabled=this.attributes[e]===!1,this.attributes[e]||this.dialogIsVisible(e)?(t.setAttribute("data-trix-active",""),t.classList.add("trix-active")):(t.removeAttribute("data-trix-active"),t.classList.remove("trix-active"))))}eachAttributeButton(t){return Array.from(this.element.querySelectorAll(Oe)).map(e=>t(e,rt(e)))}applyKeyboardCommand(t){let e=JSON.stringify(t.sort());for(let i of Array.from(this.element.querySelectorAll("[data-trix-key]"))){let r=i.getAttribute("data-trix-key").split("+");if(JSON.stringify(r.sort())===e)return vt("mousedown",{onElement:i}),!0}return!1}dialogIsVisible(t){let e=this.getDialog(t);if(e)return e.hasAttribute("data-trix-active")}toggleDialog(t){return this.dialogIsVisible(t)?this.hideDialog():this.showDialog(t)}showDialog(t){var e,i;this.hideDialog(),(e=this.delegate)===null||e===void 0||e.toolbarWillShowDialog();let r=this.getDialog(t);r.setAttribute("data-trix-active",""),r.classList.add("trix-active"),Array.from(r.querySelectorAll("input[disabled]")).forEach(s=>{s.removeAttribute("disabled")});let o=rt(r);if(o){let s=pi(r,t);s&&(s.value=this.attributes[o]||"",s.select())}return(i=this.delegate)===null||i===void 0?void 0:i.toolbarDidShowDialog(t)}setAttribute(t){let e=rt(t),i=pi(t,e);return i.willValidate&&!i.checkValidity()?(i.setAttribute("data-trix-validate",""),i.classList.add("trix-validate"),i.focus()):((r=this.delegate)===null||r===void 0||r.toolbarDidUpdateAttribute(e,i.value),this.hideDialog());var r}removeAttribute(t){var e;let i=rt(t);return(e=this.delegate)===null||e===void 0||e.toolbarDidRemoveAttribute(i),this.hideDialog()}hideDialog(){let t=this.element.querySelector(Yn);var e;if(t)return t.removeAttribute("data-trix-active"),t.classList.remove("trix-active"),this.resetDialogInputs(),(e=this.delegate)===null||e===void 0?void 0:e.toolbarDidHideDialog((i=>i.getAttribute("data-trix-dialog"))(t))}resetDialogInputs(){Array.from(this.element.querySelectorAll(mi)).forEach(t=>{t.setAttribute("disabled","disabled"),t.removeAttribute("data-trix-validate"),t.classList.remove("trix-validate")})}getDialog(t){return this.element.querySelector("[data-trix-dialog=".concat(t,"]"))}},X=class extends $t{constructor(t){let{editorElement:e,document:i,html:r}=t;super(...arguments),this.editorElement=e,this.selectionManager=new I(this.editorElement),this.selectionManager.delegate=this,this.composition=new F,this.composition.delegate=this,this.attachmentManager=new Ut(this.composition.getAttachments()),this.attachmentManager.delegate=this,this.inputController=qe.getLevel()===2?new G(this.editorElement):new w(this.editorElement),this.inputController.delegate=this,this.inputController.responder=this.composition,this.compositionController=new Kt(this.editorElement,this.composition),this.compositionController.delegate=this,this.toolbarController=new Yt(this.editorElement.toolbarElement),this.toolbarController.delegate=this,this.editor=new Ht(this.composition,this.selectionManager,this.editorElement),i?this.editor.loadDocument(i):this.editor.loadHTML(r)}registerSelectionManager(){return tt.registerSelectionManager(this.selectionManager)}unregisterSelectionManager(){return tt.unregisterSelectionManager(this.selectionManager)}render(){return this.compositionController.render()}reparse(){return this.composition.replaceHTML(this.editorElement.innerHTML)}compositionDidChangeDocument(t){if(this.notifyEditorElement("document-change"),!this.handlingInput)return this.render()}compositionDidChangeCurrentAttributes(t){return this.currentAttributes=t,this.toolbarController.updateAttributes(this.currentAttributes),this.updateCurrentActions(),this.notifyEditorElement("attributes-change",{attributes:this.currentAttributes})}compositionDidPerformInsertionAtRange(t){this.pasting&&(this.pastedRange=t)}compositionShouldAcceptFile(t){return this.notifyEditorElement("file-accept",{file:t})}compositionDidAddAttachment(t){let e=this.attachmentManager.manageAttachment(t);return this.notifyEditorElement("attachment-add",{attachment:e})}compositionDidEditAttachment(t){this.compositionController.rerenderViewForObject(t);let e=this.attachmentManager.manageAttachment(t);return this.notifyEditorElement("attachment-edit",{attachment:e}),this.notifyEditorElement("change")}compositionDidChangeAttachmentPreviewURL(t){return this.compositionController.invalidateViewForObject(t),this.notifyEditorElement("change")}compositionDidRemoveAttachment(t){let e=this.attachmentManager.unmanageAttachment(t);return this.notifyEditorElement("attachment-remove",{attachment:e})}compositionDidStartEditingAttachment(t,e){return this.attachmentLocationRange=this.composition.document.getLocationRangeOfAttachment(t),this.compositionController.installAttachmentEditorForAttachment(t,e),this.selectionManager.setLocationRange(this.attachmentLocationRange)}compositionDidStopEditingAttachment(t){this.compositionController.uninstallAttachmentEditor(),this.attachmentLocationRange=null}compositionDidRequestChangingSelectionToLocationRange(t){if(!this.loadingSnapshot||this.isFocused())return this.requestedLocationRange=t,this.compositionRevisionWhenLocationRangeRequested=this.composition.revision,this.handlingInput?void 0:this.render()}compositionWillLoadSnapshot(){this.loadingSnapshot=!0}compositionDidLoadSnapshot(){this.compositionController.refreshViewCache(),this.render(),this.loadingSnapshot=!1}getSelectionManager(){return this.selectionManager}attachmentManagerDidRequestRemovalOfAttachment(t){return this.removeAttachment(t)}compositionControllerWillSyncDocumentView(){return this.inputController.editorWillSyncDocumentView(),this.selectionManager.lock(),this.selectionManager.clearSelection()}compositionControllerDidSyncDocumentView(){return this.inputController.editorDidSyncDocumentView(),this.selectionManager.unlock(),this.updateCurrentActions(),this.notifyEditorElement("sync")}compositionControllerDidRender(){this.requestedLocationRange&&(this.compositionRevisionWhenLocationRangeRequested===this.composition.revision&&this.selectionManager.setLocationRange(this.requestedLocationRange),this.requestedLocationRange=null,this.compositionRevisionWhenLocationRangeRequested=null),this.renderedCompositionRevision!==this.composition.revision&&(this.runEditorFilters(),this.composition.updateCurrentAttributes(),this.notifyEditorElement("render")),this.renderedCompositionRevision=this.composition.revision}compositionControllerDidFocus(){return this.isFocusedInvisibly()&&this.setLocationRange({index:0,offset:0}),this.toolbarController.hideDialog(),this.notifyEditorElement("focus")}compositionControllerDidBlur(){return this.notifyEditorElement("blur")}compositionControllerDidSelectAttachment(t,e){return this.toolbarController.hideDialog(),this.composition.editAttachment(t,e)}compositionControllerDidRequestDeselectingAttachment(t){let e=this.attachmentLocationRange||this.composition.document.getLocationRangeOfAttachment(t);return this.selectionManager.setLocationRange(e[1])}compositionControllerWillUpdateAttachment(t){return this.editor.recordUndoEntry("Edit Attachment",{context:t.id,consolidatable:!0})}compositionControllerDidRequestRemovalOfAttachment(t){return this.removeAttachment(t)}inputControllerWillHandleInput(){this.handlingInput=!0,this.requestedRender=!1}inputControllerDidRequestRender(){this.requestedRender=!0}inputControllerDidHandleInput(){if(this.handlingInput=!1,this.requestedRender)return this.requestedRender=!1,this.render()}inputControllerDidAllowUnhandledInput(){return this.notifyEditorElement("change")}inputControllerDidRequestReparse(){return this.reparse()}inputControllerWillPerformTyping(){return this.recordTypingUndoEntry()}inputControllerWillPerformFormatting(t){return this.recordFormattingUndoEntry(t)}inputControllerWillCutText(){return this.editor.recordUndoEntry("Cut")}inputControllerWillPaste(t){return this.editor.recordUndoEntry("Paste"),this.pasting=!0,this.notifyEditorElement("before-paste",{paste:t})}inputControllerDidPaste(t){return t.range=this.pastedRange,this.pastedRange=null,this.pasting=null,this.notifyEditorElement("paste",{paste:t})}inputControllerWillMoveText(){return this.editor.recordUndoEntry("Move")}inputControllerWillAttachFiles(){return this.editor.recordUndoEntry("Drop Files")}inputControllerWillPerformUndo(){return this.editor.undo()}inputControllerWillPerformRedo(){return this.editor.redo()}inputControllerDidReceiveKeyboardCommand(t){return this.toolbarController.applyKeyboardCommand(t)}inputControllerDidStartDrag(){this.locationRangeBeforeDrag=this.selectionManager.getLocationRange()}inputControllerDidReceiveDragOverPoint(t){return this.selectionManager.setLocationRangeFromPointRange(t)}inputControllerDidCancelDrag(){this.selectionManager.setLocationRange(this.locationRangeBeforeDrag),this.locationRangeBeforeDrag=null}locationRangeDidChange(t){return this.composition.updateCurrentAttributes(),this.updateCurrentActions(),this.attachmentLocationRange&&!Pt(this.attachmentLocationRange,t)&&this.composition.stopEditingAttachment(),this.notifyEditorElement("selection-change")}toolbarDidClickButton(){if(!this.getLocationRange())return this.setLocationRange({index:0,offset:0})}toolbarDidInvokeAction(t,e){return this.invokeAction(t,e)}toolbarDidToggleAttribute(t){if(this.recordFormattingUndoEntry(t),this.composition.toggleCurrentAttribute(t),this.render(),!this.selectionFrozen)return this.editorElement.focus()}toolbarDidUpdateAttribute(t,e){if(this.recordFormattingUndoEntry(t),this.composition.setCurrentAttribute(t,e),this.render(),!this.selectionFrozen)return this.editorElement.focus()}toolbarDidRemoveAttribute(t){if(this.recordFormattingUndoEntry(t),this.composition.removeCurrentAttribute(t),this.render(),!this.selectionFrozen)return this.editorElement.focus()}toolbarWillShowDialog(t){return this.composition.expandSelectionForEditing(),this.freezeSelection()}toolbarDidShowDialog(t){return this.notifyEditorElement("toolbar-dialog-show",{dialogName:t})}toolbarDidHideDialog(t){return this.thawSelection(),this.editorElement.focus(),this.notifyEditorElement("toolbar-dialog-hide",{dialogName:t})}freezeSelection(){if(!this.selectionFrozen)return this.selectionManager.lock(),this.composition.freezeSelection(),this.selectionFrozen=!0,this.render()}thawSelection(){if(this.selectionFrozen)return this.composition.thawSelection(),this.selectionManager.unlock(),this.selectionFrozen=!1,this.render()}canInvokeAction(t){return!!this.actionIsExternal(t)||!((e=this.actions[t])===null||e===void 0||(e=e.test)===null||e===void 0||!e.call(this));var e}invokeAction(t,e){return this.actionIsExternal(t)?this.notifyEditorElement("action-invoke",{actionName:t,invokingElement:e}):(i=this.actions[t])===null||i===void 0||(i=i.perform)===null||i===void 0?void 0:i.call(this);var i}actionIsExternal(t){return/^x-./.test(t)}getCurrentActions(){let t={};for(let e in this.actions)t[e]=this.canInvokeAction(e);return t}updateCurrentActions(){let t=this.getCurrentActions();if(!dt(t,this.currentActions))return this.currentActions=t,this.toolbarController.updateActions(this.currentActions),this.notifyEditorElement("actions-change",{actions:this.currentActions})}runEditorFilters(){let t=this.composition.getSnapshot();if(Array.from(this.editor.filters).forEach(r=>{let{document:o,selectedRange:s}=t;t=r.call(this.editor,t)||{},t.document||(t.document=o),t.selectedRange||(t.selectedRange=s)}),e=t,i=this.composition.getSnapshot(),!Pt(e.selectedRange,i.selectedRange)||!e.document.isEqualTo(i.document))return this.composition.loadSnapshot(t);var e,i}updateInputElement(){let t=function(e,i){let r=Dn[i];if(r)return r(e);throw new Error("unknown content type: ".concat(i))}(this.compositionController.getSerializableElement(),"text/html");return this.editorElement.setInputElementValue(t)}notifyEditorElement(t,e){switch(t){case"document-change":this.documentChangedSinceLastRender=!0;break;case"render":this.documentChangedSinceLastRender&&(this.documentChangedSinceLastRender=!1,this.notifyEditorElement("change"));break;case"change":case"attachment-add":case"attachment-edit":case"attachment-remove":this.updateInputElement()}return this.editorElement.notify(t,e)}removeAttachment(t){return this.editor.recordUndoEntry("Delete Attachment"),this.composition.removeAttachment(t),this.render()}recordFormattingUndoEntry(t){let e=v(t),i=this.selectionManager.getLocationRange();if(e||!N(i))return this.editor.recordUndoEntry("Formatting",{context:this.getUndoContext(),consolidatable:!0})}recordTypingUndoEntry(){return this.editor.recordUndoEntry("Typing",{context:this.getUndoContext(this.currentAttributes),consolidatable:!0})}getUndoContext(){for(var t=arguments.length,e=new Array(t),i=0;i0?Math.floor(new Date().getTime()/Re.interval):0}isFocused(){var t;return this.editorElement===((t=this.editorElement.ownerDocument)===null||t===void 0?void 0:t.activeElement)}isFocusedInvisibly(){return this.isFocused()&&!this.getLocationRange()}get actions(){return this.constructor.actions}};E(X,"actions",{undo:{test(){return this.editor.canUndo()},perform(){return this.editor.undo()}},redo:{test(){return this.editor.canRedo()},perform(){return this.editor.redo()}},link:{test(){return this.editor.canActivateAttribute("href")}},increaseNestingLevel:{test(){return this.editor.canIncreaseNestingLevel()},perform(){return this.editor.increaseNestingLevel()&&this.render()}},decreaseNestingLevel:{test(){return this.editor.canDecreaseNestingLevel()},perform(){return this.editor.decreaseNestingLevel()&&this.render()}},attachFiles:{test:()=>!0,perform(){return qe.pickFiles(this.editor.insertFiles)}}}),X.proxyMethod("getSelectionManager().setLocationRange"),X.proxyMethod("getSelectionManager().getLocationRange");var Qn=Object.freeze({__proto__:null,AttachmentEditorController:Jt,CompositionController:Kt,Controller:$t,EditorController:X,InputController:ht,Level0InputController:w,Level2InputController:G,ToolbarController:Yt}),tr=Object.freeze({__proto__:null,MutationObserver:Gt,SelectionChangeObserver:It}),er=Object.freeze({__proto__:null,FileVerificationOperation:Xt,ImagePreloadOperation:Wt});ki("trix-toolbar",`%t { - display: block; -} - -%t { - white-space: nowrap; +function ge(t){this.content=t}ge.prototype={constructor:ge,find:function(t){for(var e=0;e>1}};ge.from=function(t){if(t instanceof ge)return t;var e=[];if(t)for(var n in t)e.push(n,t[n]);return new ge(e)};var vi=ge;function ba(t,e,n){for(let r=0;;r++){if(r==t.childCount||r==e.childCount)return t.childCount==e.childCount?null:n;let o=t.child(r),i=e.child(r);if(o==i){n+=o.nodeSize;continue}if(!o.sameMarkup(i))return n;if(o.isText&&o.text!=i.text){for(let s=0;o.text[s]==i.text[s];s++)n++;return n}if(o.content.size||i.content.size){let s=ba(o.content,i.content,n+1);if(s!=null)return s}n+=o.nodeSize}}function wa(t,e,n,r){for(let o=t.childCount,i=e.childCount;;){if(o==0||i==0)return o==i?null:{a:n,b:r};let s=t.child(--o),l=e.child(--i),a=s.nodeSize;if(s==l){n-=a,r-=a;continue}if(!s.sameMarkup(l))return{a:n,b:r};if(s.isText&&s.text!=l.text){let c=0,d=Math.min(s.text.length,l.text.length);for(;ce&&r(a,o+l,i||null,s)!==!1&&a.content.size){let d=l+1;a.nodesBetween(Math.max(0,e-d),Math.min(a.content.size,n-d),r,o+d)}l=c}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,n,r,o){let i="",s=!0;return this.nodesBetween(e,n,(l,a)=>{let c=l.isText?l.text.slice(Math.max(e,a)-a,n-a):l.isLeaf?o?typeof o=="function"?o(l):o:l.type.spec.leafText?l.type.spec.leafText(l):"":"";l.isBlock&&(l.isLeaf&&c||l.isTextblock)&&r&&(s?s=!1:i+=r),i+=c},0),i}append(e){if(!e.size)return this;if(!this.size)return e;let n=this.lastChild,r=e.firstChild,o=this.content.slice(),i=0;for(n.isText&&n.sameMarkup(r)&&(o[o.length-1]=n.withText(n.text+r.text),i=1);ie)for(let i=0,s=0;se&&((sn)&&(l.isText?l=l.cut(Math.max(0,e-s),Math.min(l.text.length,n-s)):l=l.cut(Math.max(0,e-s-1),Math.min(l.content.size,n-s-1))),r.push(l),o+=l.nodeSize),s=a}return new t(r,o)}cutByIndex(e,n){return e==n?t.empty:e==0&&n==this.content.length?this:new t(this.content.slice(e,n))}replaceChild(e,n){let r=this.content[e];if(r==n)return this;let o=this.content.slice(),i=this.size+n.nodeSize-r.nodeSize;return o[e]=n,new t(o,i)}addToStart(e){return new t([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new t(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let n=0;nthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let n=0,r=0;;n++){let o=this.child(n),i=r+o.nodeSize;if(i>=e)return i==e?Ar(n+1,i):Ar(n,r);r=i}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,n){if(!n)return t.empty;if(!Array.isArray(n))throw new RangeError("Invalid input for Fragment.fromJSON");return new t(n.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return t.empty;let n,r=0;for(let o=0;othis.type.rank&&(n||(n=e.slice(0,o)),n.push(this),r=!0),n&&n.push(i)}}return n||(n=e.slice()),r||n.push(this),n}removeFromSet(e){for(let n=0;nr.type.rank-o.type.rank),n}};J.none=[];var Ft=class extends Error{},E=class t{constructor(e,n,r){this.content=e,this.openStart=n,this.openEnd=r}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,n){let r=ka(this.content,e+this.openStart,n);return r&&new t(r,this.openStart,this.openEnd)}removeBetween(e,n){return new t(xa(this.content,e+this.openStart,n+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,n){if(!n)return t.empty;let r=n.openStart||0,o=n.openEnd||0;if(typeof r!="number"||typeof o!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new t(v.fromJSON(e,n.content),r,o)}static maxOpen(e,n=!0){let r=0,o=0;for(let i=e.firstChild;i&&!i.isLeaf&&(n||!i.type.spec.isolating);i=i.firstChild)r++;for(let i=e.lastChild;i&&!i.isLeaf&&(n||!i.type.spec.isolating);i=i.lastChild)o++;return new t(e,r,o)}};E.empty=new E(v.empty,0,0);function xa(t,e,n){let{index:r,offset:o}=t.findIndex(e),i=t.maybeChild(r),{index:s,offset:l}=t.findIndex(n);if(o==e||i.isText){if(l!=n&&!t.child(s).isText)throw new RangeError("Removing non-flat range");return t.cut(0,e).append(t.cut(n))}if(r!=s)throw new RangeError("Removing non-flat range");return t.replaceChild(r,i.copy(xa(i.content,e-o-1,n-o-1)))}function ka(t,e,n,r){let{index:o,offset:i}=t.findIndex(e),s=t.maybeChild(o);if(i==e||s.isText)return r&&!r.canReplace(o,o,n)?null:t.cut(0,e).append(n).append(t.cut(e));let l=ka(s.content,e-i-1,n,s);return l&&t.replaceChild(o,s.copy(l))}function sp(t,e,n){if(n.openStart>t.depth)throw new Ft("Inserted content deeper than insertion position");if(t.depth-n.openStart!=e.depth-n.openEnd)throw new Ft("Inconsistent open depths");return Sa(t,e,n,0)}function Sa(t,e,n,r){let o=t.index(r),i=t.node(r);if(o==e.index(r)&&r=0&&t.isText&&t.sameMarkup(e[n])?e[n]=t.withText(e[n].text+t.text):e.push(t)}function zn(t,e,n,r){let o=(e||t).node(n),i=0,s=e?e.index(n):o.childCount;t&&(i=t.index(n),t.depth>n?i++:t.textOffset&&(Ht(t.nodeAfter,r),i++));for(let l=i;lo&&Ai(t,e,o+1),s=r.depth>o&&Ai(n,r,o+1),l=[];return zn(null,t,o,l),i&&s&&e.index(o)==n.index(o)?(Ca(i,s),Ht($t(i,va(t,e,n,r,o+1)),l)):(i&&Ht($t(i,Or(t,e,o+1)),l),zn(e,n,o,l),s&&Ht($t(s,Or(n,r,o+1)),l)),zn(r,null,o,l),new v(l)}function Or(t,e,n){let r=[];if(zn(null,t,n,r),t.depth>n){let o=Ai(t,e,n+1);Ht($t(o,Or(t,e,n+1)),r)}return zn(e,null,n,r),new v(r)}function lp(t,e){let n=e.depth-t.openStart,o=e.node(n).copy(t.content);for(let i=n-1;i>=0;i--)o=e.node(i).copy(v.from(o));return{start:o.resolveNoCache(t.openStart+n),end:o.resolveNoCache(o.content.size-t.openEnd-n)}}var Rr=class t{constructor(e,n,r){this.pos=e,this.path=n,this.parentOffset=r,this.depth=n.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,n=this.index(this.depth);if(n==e.childCount)return null;let r=this.pos-this.path[this.path.length-1],o=e.child(n);return r?e.child(n).cut(r):o}get nodeBefore(){let e=this.index(this.depth),n=this.pos-this.path[this.path.length-1];return n?this.parent.child(e).cut(0,n):e==0?null:this.parent.child(e-1)}posAtIndex(e,n){n=this.resolveDepth(n);let r=this.path[n*3],o=n==0?0:this.path[n*3-1]+1;for(let i=0;i0;n--)if(this.start(n)<=e&&this.end(n)>=e)return n;return 0}blockRange(e=this,n){if(e.pos=0;r--)if(e.pos<=this.end(r)&&(!n||n(this.node(r))))return new Vt(this,e,r);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&n<=e.content.size))throw new RangeError("Position "+n+" out of range");let r=[],o=0,i=n;for(let s=e;;){let{index:l,offset:a}=s.content.findIndex(i),c=i-a;if(r.push(s,l,o+a),!c||(s=s.child(l),s.isText))break;i=c-1,o+=a+1}return new t(n,r,i)}static resolveCached(e,n){let r=ca.get(e);if(r)for(let i=0;ie&&this.nodesBetween(e,n,i=>(r.isInSet(i.marks)&&(o=!0),!o)),o}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),Ma(this.marks,e)}contentMatchAt(e){let n=this.type.contentMatch.matchFragment(this.content,0,e);if(!n)throw new Error("Called contentMatchAt on a node with invalid content");return n}canReplace(e,n,r=v.empty,o=0,i=r.childCount){let s=this.contentMatchAt(e).matchFragment(r,o,i),l=s&&s.matchFragment(this.content,n);if(!l||!l.validEnd)return!1;for(let a=o;an.type.name)}`);this.content.forEach(n=>n.check())}toJSON(){let e={type:this.type.name};for(let n in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(n=>n.toJSON())),e}static fromJSON(e,n){if(!n)throw new RangeError("Invalid input for Node.fromJSON");let r;if(n.marks){if(!Array.isArray(n.marks))throw new RangeError("Invalid mark data for Node.fromJSON");r=n.marks.map(e.markFromJSON)}if(n.type=="text"){if(typeof n.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(n.text,r)}let o=v.fromJSON(e,n.content),i=e.nodeType(n.type).create(n.attrs,o,r);return i.type.checkAttrs(i.attrs),i}};ie.prototype.text=void 0;var Ni=class t extends ie{constructor(e,n,r,o){if(super(e,n,null,o),!r)throw new RangeError("Empty text nodes are not allowed");this.text=r}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):Ma(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,n){return this.text.slice(e,n)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new t(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new t(this.type,this.attrs,e,this.marks)}cut(e=0,n=this.text.length){return e==0&&n==this.text.length?this:this.withText(this.text.slice(e,n))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function Ma(t,e){for(let n=t.length-1;n>=0;n--)e=t[n].type.name+"("+e+")";return e}var _t=class t{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,n){let r=new Oi(e,n);if(r.next==null)return t.empty;let o=Ta(r);r.next&&r.err("Unexpected trailing text");let i=gp(mp(o));return yp(i,r),i}matchType(e){for(let n=0;nc.createAndFill()));for(let c=0;c=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function n(r){e.push(r);for(let o=0;o{let i=o+(r.validEnd?"*":" ")+" ";for(let s=0;s"+e.indexOf(r.next[s].next);return i}).join(` +`)}};_t.empty=new _t(!0);var Oi=class{constructor(e,n){this.string=e,this.nodeTypes=n,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}};function Ta(t){let e=[];do e.push(dp(t));while(t.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function dp(t){let e=[];do e.push(up(t));while(t.next&&t.next!=")"&&t.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function up(t){let e=pp(t);for(;;)if(t.eat("+"))e={type:"plus",expr:e};else if(t.eat("*"))e={type:"star",expr:e};else if(t.eat("?"))e={type:"opt",expr:e};else if(t.eat("{"))e=fp(t,e);else break;return e}function da(t){/\D/.test(t.next)&&t.err("Expected number, got '"+t.next+"'");let e=Number(t.next);return t.pos++,e}function fp(t,e){let n=da(t),r=n;return t.eat(",")&&(t.next!="}"?r=da(t):r=-1),t.eat("}")||t.err("Unclosed braced range"),{type:"range",min:n,max:r,expr:e}}function hp(t,e){let n=t.nodeTypes,r=n[e];if(r)return[r];let o=[];for(let i in n){let s=n[i];s.isInGroup(e)&&o.push(s)}return o.length==0&&t.err("No node type or group '"+e+"' found"),o}function pp(t){if(t.eat("(")){let e=Ta(t);return t.eat(")")||t.err("Missing closing paren"),e}else if(/\W/.test(t.next))t.err("Unexpected token '"+t.next+"'");else{let e=hp(t,t.next).map(n=>(t.inline==null?t.inline=n.isInline:t.inline!=n.isInline&&t.err("Mixing inline and block content"),{type:"name",value:n}));return t.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function mp(t){let e=[[]];return o(i(t,0),n()),e;function n(){return e.push([])-1}function r(s,l,a){let c={term:a,to:l};return e[s].push(c),c}function o(s,l){s.forEach(a=>a.to=l)}function i(s,l){if(s.type=="choice")return s.exprs.reduce((a,c)=>a.concat(i(c,l)),[]);if(s.type=="seq")for(let a=0;;a++){let c=i(s.exprs[a],l);if(a==s.exprs.length-1)return c;o(c,l=n())}else if(s.type=="star"){let a=n();return r(l,a),o(i(s.expr,a),a),[r(a)]}else if(s.type=="plus"){let a=n();return o(i(s.expr,l),a),o(i(s.expr,a),a),[r(a)]}else{if(s.type=="opt")return[r(l)].concat(i(s.expr,l));if(s.type=="range"){let a=l;for(let c=0;c{t[s].forEach(({term:l,to:a})=>{if(!l)return;let c;for(let d=0;d{c||o.push([l,c=[]]),c.indexOf(d)==-1&&c.push(d)})})});let i=e[r.join(",")]=new _t(r.indexOf(t.length-1)>-1);for(let s=0;s-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:Na(this.attrs,e)}create(e=null,n,r){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new ie(this,this.computeAttrs(e),v.from(n),J.setFrom(r))}createChecked(e=null,n,r){return n=v.from(n),this.checkContent(n),new ie(this,this.computeAttrs(e),n,J.setFrom(r))}createAndFill(e=null,n,r){if(e=this.computeAttrs(e),n=v.from(n),n.size){let s=this.contentMatch.fillBefore(n);if(!s)return null;n=s.append(n)}let o=this.contentMatch.matchFragment(n),i=o&&o.fillBefore(v.empty,!0);return i?new ie(this,e,n.append(i),J.setFrom(r)):null}validContent(e){let n=this.contentMatch.matchFragment(e);if(!n||!n.validEnd)return!1;for(let r=0;r-1}allowsMarks(e){if(this.markSet==null)return!0;for(let n=0;nr[i]=new t(i,n,s));let o=n.spec.topNode||"doc";if(!r[o])throw new RangeError("Schema is missing its top node type ('"+o+"')");if(!r.text)throw new RangeError("Every schema needs a 'text' type");for(let i in r.text.attrs)throw new RangeError("The text node type should not have attributes");return r}};function bp(t,e,n){let r=n.split("|");return o=>{let i=o===null?"null":typeof o;if(r.indexOf(i)<0)throw new RangeError(`Expected value of type ${r} for attribute ${e} on type ${t}, got ${i}`)}}var Ri=class{constructor(e,n,r){this.hasDefault=Object.prototype.hasOwnProperty.call(r,"default"),this.default=r.default,this.validate=typeof r.validate=="string"?bp(e,n,r.validate):r.validate}get isRequired(){return!this.hasDefault}},$n=class t{constructor(e,n,r,o){this.name=e,this.rank=n,this.schema=r,this.spec=o,this.attrs=Ra(e,o.attrs),this.excluded=null;let i=Ea(this.attrs);this.instance=i?new J(this,i):null}create(e=null){return!e&&this.instance?this.instance:new J(this,Na(this.attrs,e))}static compile(e,n){let r=Object.create(null),o=0;return e.forEach((i,s)=>r[i]=new t(i,o++,n,s)),r}removeFromSet(e){for(var n=0;n-1}},fn=class{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let n=this.spec={};for(let o in e)n[o]=e[o];n.nodes=vi.from(e.nodes),n.marks=vi.from(e.marks||{}),this.nodes=Dr.compile(this.spec.nodes,this),this.marks=$n.compile(this.spec.marks,this);let r=Object.create(null);for(let o in this.nodes){if(o in this.marks)throw new RangeError(o+" can not be both a node and a mark");let i=this.nodes[o],s=i.spec.content||"",l=i.spec.marks;if(i.contentMatch=r[s]||(r[s]=_t.parse(s,this.nodes)),i.inlineContent=i.contentMatch.inlineContent,i.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!i.isInline||!i.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=i}i.markSet=l=="_"?null:l?fa(this,l.split(" ")):l==""||!i.inlineContent?[]:null}for(let o in this.marks){let i=this.marks[o],s=i.spec.excludes;i.excluded=s==null?[i]:s==""?[]:fa(this,s.split(" "))}this.nodeFromJSON=o=>ie.fromJSON(this,o),this.markFromJSON=o=>J.fromJSON(this,o),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,n=null,r,o){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof Dr){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(n,r,o)}text(e,n){let r=this.nodes.text;return new Ni(r,r.defaultAttrs,e,J.setFrom(n))}mark(e,n){return typeof e=="string"&&(e=this.marks[e]),e.create(n)}nodeType(e){let n=this.nodes[e];if(!n)throw new RangeError("Unknown node type: "+e);return n}};function fa(t,e){let n=[];for(let r=0;r-1)&&n.push(s=a)}if(!s)throw new SyntaxError("Unknown mark type: '"+e[r]+"'")}return n}function wp(t){return t.tag!=null}function xp(t){return t.style!=null}var Xe=class t{constructor(e,n){this.schema=e,this.rules=n,this.tags=[],this.styles=[];let r=this.matchedStyles=[];n.forEach(o=>{if(wp(o))this.tags.push(o);else if(xp(o)){let i=/[^=]*/.exec(o.style)[0];r.indexOf(i)<0&&r.push(i),this.styles.push(o)}}),this.normalizeLists=!this.tags.some(o=>{if(!/^(ul|ol)\b/.test(o.tag)||!o.node)return!1;let i=e.nodes[o.node];return i.contentMatch.matchType(i)})}parse(e,n={}){let r=new Ir(this,n,!1);return r.addAll(e,J.none,n.from,n.to),r.finish()}parseSlice(e,n={}){let r=new Ir(this,n,!0);return r.addAll(e,J.none,n.from,n.to),E.maxOpen(r.finish())}matchTag(e,n,r){for(let o=r?this.tags.indexOf(r)+1:0;oe.length&&(l.charCodeAt(e.length)!=61||l.slice(e.length+1)!=n))){if(s.getAttrs){let a=s.getAttrs(n);if(a===!1)continue;s.attrs=a||void 0}return s}}}static schemaRules(e){let n=[];function r(o){let i=o.priority==null?50:o.priority,s=0;for(;s{r(s=pa(s)),s.mark||s.ignore||s.clearMark||(s.mark=o)})}for(let o in e.nodes){let i=e.nodes[o].spec.parseDOM;i&&i.forEach(s=>{r(s=pa(s)),s.node||s.ignore||s.mark||(s.node=o)})}return n}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new t(e,t.schemaRules(e)))}},Da={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},kp={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},Ia={ol:!0,ul:!0},Fn=1,Di=2,Hn=4;function ha(t,e,n){return e!=null?(e?Fn:0)|(e==="full"?Di:0):t&&t.whitespace=="pre"?Fn|Di:n&~Hn}var un=class{constructor(e,n,r,o,i,s){this.type=e,this.attrs=n,this.marks=r,this.solid=o,this.options=s,this.content=[],this.activeMarks=J.none,this.match=i||(s&Hn?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let n=this.type.contentMatch.fillBefore(v.from(e));if(n)this.match=this.type.contentMatch.matchFragment(n);else{let r=this.type.contentMatch,o;return(o=r.findWrapping(e.type))?(this.match=r,o):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&Fn)){let r=this.content[this.content.length-1],o;if(r&&r.isText&&(o=/[ \t\r\n\u000c]+$/.exec(r.text))){let i=r;r.text.length==o[0].length?this.content.pop():this.content[this.content.length-1]=i.withText(i.text.slice(0,i.text.length-o[0].length))}}let n=v.from(this.content);return!e&&this.match&&(n=n.append(this.match.fillBefore(v.empty,!0))),this.type?this.type.create(this.attrs,n,this.marks):n}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!Da.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}},Ir=class{constructor(e,n,r){this.parser=e,this.options=n,this.isOpen=r,this.open=0,this.localPreserveWS=!1;let o=n.topNode,i,s=ha(null,n.preserveWhitespace,0)|(r?Hn:0);o?i=new un(o.type,o.attrs,J.none,!0,n.topMatch||o.type.contentMatch,s):r?i=new un(null,null,J.none,!0,null,s):i=new un(e.schema.topNodeType,null,J.none,!0,null,s),this.nodes=[i],this.find=n.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,n){e.nodeType==3?this.addTextNode(e,n):e.nodeType==1&&this.addElement(e,n)}addTextNode(e,n){let r=e.nodeValue,o=this.top,i=o.options&Di?"full":this.localPreserveWS||(o.options&Fn)>0,{schema:s}=this.parser;if(i==="full"||o.inlineContext(e)||/[^ \t\r\n\u000c]/.test(r)){if(i)if(i==="full")r=r.replace(/\r\n?/g,` +`);else if(s.linebreakReplacement&&/[\r\n]/.test(r)&&this.top.findWrapping(s.linebreakReplacement.create())){let l=r.split(/\r?\n|\r/);for(let a=0;a!a.clearMark(c)):n=n.concat(this.parser.schema.marks[a.mark].create(a.attrs)),a.consuming===!1)l=a;else break}}return n}addElementByRule(e,n,r,o){let i,s;if(n.node)if(s=this.parser.schema.nodes[n.node],s.isLeaf)this.insertNode(s.create(n.attrs),r,e.nodeName=="BR")||this.leafFallback(e,r);else{let a=this.enter(s,n.attrs||null,r,n.preserveWhitespace);a&&(i=!0,r=a)}else{let a=this.parser.schema.marks[n.mark];r=r.concat(a.create(n.attrs))}let l=this.top;if(s&&s.isLeaf)this.findInside(e);else if(o)this.addElement(e,r,o);else if(n.getContent)this.findInside(e),n.getContent(e,this.parser.schema).forEach(a=>this.insertNode(a,r,!1));else{let a=e;typeof n.contentElement=="string"?a=e.querySelector(n.contentElement):typeof n.contentElement=="function"?a=n.contentElement(e):n.contentElement&&(a=n.contentElement),this.findAround(e,a,!0),this.addAll(a,r),this.findAround(e,a,!1)}i&&this.sync(l)&&this.open--}addAll(e,n,r,o){let i=r||0;for(let s=r?e.childNodes[r]:e.firstChild,l=o==null?null:e.childNodes[o];s!=l;s=s.nextSibling,++i)this.findAtPoint(e,i),this.addDOM(s,n);this.findAtPoint(e,i)}findPlace(e,n,r){let o,i;for(let s=this.open,l=0;s>=0;s--){let a=this.nodes[s],c=a.findWrapping(e);if(c&&(!o||o.length>c.length+l)&&(o=c,i=a,!c.length))break;if(a.solid){if(r)break;l+=2}}if(!o)return null;this.sync(i);for(let s=0;s(s.type?s.type.allowsMarkType(c.type):ma(c.type,e))?(a=c.addToSet(a),!1):!0),this.nodes.push(new un(e,n,a,o,null,l)),this.open++,r}closeExtra(e=!1){let n=this.nodes.length-1;if(n>this.open){for(;n>this.open;n--)this.nodes[n-1].content.push(this.nodes[n].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!!(this.isOpen||this.options.topOpen))}sync(e){for(let n=this.open;n>=0;n--){if(this.nodes[n]==e)return this.open=n,!0;this.localPreserveWS&&(this.nodes[n].options|=Fn)}return!1}get currentPos(){this.closeExtra();let e=0;for(let n=this.open;n>=0;n--){let r=this.nodes[n].content;for(let o=r.length-1;o>=0;o--)e+=r[o].nodeSize;n&&e++}return e}findAtPoint(e,n){if(this.find)for(let r=0;r-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let n=e.split("/"),r=this.options.context,o=!this.isOpen&&(!r||r.parent.type==this.nodes[0].type),i=-(r?r.depth+1:0)+(o?0:1),s=(l,a)=>{for(;l>=0;l--){let c=n[l];if(c==""){if(l==n.length-1||l==0)continue;for(;a>=i;a--)if(s(l-1,a))return!0;return!1}else{let d=a>0||a==0&&o?this.nodes[a].type:r&&a>=i?r.node(a-i).type:null;if(!d||d.name!=c&&!d.isInGroup(c))return!1;a--}}return!0};return s(n.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let n=e.depth;n>=0;n--){let r=e.node(n).contentMatchAt(e.indexAfter(n)).defaultType;if(r&&r.isTextblock&&r.defaultAttrs)return r}for(let n in this.parser.schema.nodes){let r=this.parser.schema.nodes[n];if(r.isTextblock&&r.defaultAttrs)return r}}};function Sp(t){for(let e=t.firstChild,n=null;e;e=e.nextSibling){let r=e.nodeType==1?e.nodeName.toLowerCase():null;r&&Ia.hasOwnProperty(r)&&n?(n.appendChild(e),e=n):r=="li"?n=e:r&&(n=null)}}function Cp(t,e){return(t.matches||t.msMatchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector).call(t,e)}function pa(t){let e={};for(let n in t)e[n]=t[n];return e}function ma(t,e){let n=e.schema.nodes;for(let r in n){let o=n[r];if(!o.allowsMarkType(t))continue;let i=[],s=l=>{i.push(l);for(let a=0;a{if(i.length||s.marks.length){let l=0,a=0;for(;l=0;o--){let i=this.serializeMark(e.marks[o],e.isInline,n);i&&((i.contentDOM||i.dom).appendChild(r),r=i.dom)}return r}serializeMark(e,n,r={}){let o=this.marks[e.type.name];return o&&Er(Ti(r),o(e,n),null,e.attrs)}static renderSpec(e,n,r=null,o){return Er(e,n,r,o)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new t(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let n=ga(e.nodes);return n.text||(n.text=r=>r.text),n}static marksFromSchema(e){return ga(e.marks)}};function ga(t){let e={};for(let n in t){let r=t[n].spec.toDOM;r&&(e[n]=r)}return e}function Ti(t){return t.document||window.document}var ya=new WeakMap;function vp(t){let e=ya.get(t);return e===void 0&&ya.set(t,e=Mp(t)),e}function Mp(t){let e=null;function n(r){if(r&&typeof r=="object")if(Array.isArray(r))if(typeof r[0]=="string")e||(e=[]),e.push(r);else for(let o=0;o-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let s=o.indexOf(" ");s>0&&(n=o.slice(0,s),o=o.slice(s+1));let l,a=n?t.createElementNS(n,o):t.createElement(o),c=e[1],d=1;if(c&&typeof c=="object"&&c.nodeType==null&&!Array.isArray(c)){d=2;for(let u in c)if(c[u]!=null){let f=u.indexOf(" ");f>0?a.setAttributeNS(u.slice(0,f),u.slice(f+1),c[u]):u=="style"&&a.style?a.style.cssText=c[u]:a.setAttribute(u,c[u])}}for(let u=d;ud)throw new RangeError("Content hole must be the only child of its parent node");return{dom:a,contentDOM:a}}else{let{dom:h,contentDOM:p}=Er(t,f,n,r);if(a.appendChild(h),p){if(l)throw new RangeError("Multiple content holes");l=p}}}return{dom:a,contentDOM:l}}var Ba=65535,za=Math.pow(2,16);function Tp(t,e){return t+e*za}function Pa(t){return t&Ba}function Ap(t){return(t-(t&Ba))/za}var Ha=1,$a=2,Pr=4,Fa=8,Wn=class{constructor(e,n,r){this.pos=e,this.delInfo=n,this.recover=r}get deleted(){return(this.delInfo&Fa)>0}get deletedBefore(){return(this.delInfo&(Ha|Pr))>0}get deletedAfter(){return(this.delInfo&($a|Pr))>0}get deletedAcross(){return(this.delInfo&Pr)>0}},dt=class t{constructor(e,n=!1){if(this.ranges=e,this.inverted=n,!e.length&&t.empty)return t.empty}recover(e){let n=0,r=Pa(e);if(!this.inverted)for(let o=0;oe)break;let c=this.ranges[l+i],d=this.ranges[l+s],u=a+c;if(e<=u){let f=c?e==a?-1:e==u?1:n:n,h=a+o+(f<0?0:d);if(r)return h;let p=e==(n<0?a:u)?null:Tp(l/3,e-a),m=e==a?$a:e==u?Ha:Pr;return(n<0?e!=a:e!=u)&&(m|=Fa),new Wn(h,m,p)}o+=d-c}return r?e+o:new Wn(e+o,0,null)}touches(e,n){let r=0,o=Pa(n),i=this.inverted?2:1,s=this.inverted?1:2;for(let l=0;le)break;let c=this.ranges[l+i],d=a+c;if(e<=d&&l==o*3)return!0;r+=this.ranges[l+s]-c}return!1}forEach(e){let n=this.inverted?2:1,r=this.inverted?1:2;for(let o=0,i=0;o=0;n--){let o=e.getMirror(n);this.appendMap(e._maps[n].invert(),o!=null&&o>n?r-o-1:void 0)}}invert(){let e=new t;return e.appendMappingInverted(this),e}map(e,n=1){if(this.mirror)return this._map(e,n,!0);for(let r=this.from;ri&&a!s.isAtom||!l.type.allowsMarkType(this.mark.type)?s:s.mark(this.mark.addToSet(s.marks)),o),n.openStart,n.openEnd);return ue.fromReplace(e,this.from,this.to,i)}invert(){return new ut(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};ce.jsonID("addMark",Un);var ut=class t extends ce{constructor(e,n,r){super(),this.from=e,this.to=n,this.mark=r}apply(e){let n=e.slice(this.from,this.to),r=new E(Hi(n.content,o=>o.mark(this.mark.removeFromSet(o.marks)),e),n.openStart,n.openEnd);return ue.fromReplace(e,this.from,this.to,r)}invert(){return new Un(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};ce.jsonID("removeMark",ut);var Kn=class t extends ce{constructor(e,n){super(),this.pos=e,this.mark=n}apply(e){let n=e.nodeAt(this.pos);if(!n)return ue.fail("No node at mark step's position");let r=n.type.create(n.attrs,null,this.mark.addToSet(n.marks));return ue.fromReplace(e,this.pos,this.pos+1,new E(v.from(r),0,n.isLeaf?0:1))}invert(e){let n=e.nodeAt(this.pos);if(n){let r=this.mark.addToSet(n.marks);if(r.length==n.marks.length){for(let o=0;or.pos?null:new t(n.pos,r.pos,o,i,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number"||typeof n.gapFrom!="number"||typeof n.gapTo!="number"||typeof n.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new t(n.from,n.to,n.gapFrom,n.gapTo,E.fromJSON(e,n.slice),n.insert,!!n.structure)}};ce.jsonID("replaceAround",se);function Bi(t,e,n){let r=t.resolve(e),o=n-e,i=r.depth;for(;o>0&&i>0&&r.indexAfter(i)==r.node(i).childCount;)i--,o--;if(o>0){let s=r.node(i).maybeChild(r.indexAfter(i));for(;o>0;){if(!s||s.isLeaf)return!0;s=s.firstChild,o--}}return!1}function Ep(t,e,n,r){let o=[],i=[],s,l;t.doc.nodesBetween(e,n,(a,c,d)=>{if(!a.isInline)return;let u=a.marks;if(!r.isInSet(u)&&d.type.allowsMarkType(r.type)){let f=Math.max(c,e),h=Math.min(c+a.nodeSize,n),p=r.addToSet(u);for(let m=0;mt.step(a)),i.forEach(a=>t.step(a))}function Np(t,e,n,r){let o=[],i=0;t.doc.nodesBetween(e,n,(s,l)=>{if(!s.isInline)return;i++;let a=null;if(r instanceof $n){let c=s.marks,d;for(;d=r.isInSet(c);)(a||(a=[])).push(d),c=d.removeFromSet(c)}else r?r.isInSet(s.marks)&&(a=[r]):a=s.marks;if(a&&a.length){let c=Math.min(l+s.nodeSize,n);for(let d=0;dt.step(new ut(s.from,s.to,s.style)))}function $i(t,e,n,r=n.contentMatch,o=!0){let i=t.doc.nodeAt(e),s=[],l=e+1;for(let a=0;a=0;a--)t.step(s[a])}function Op(t,e,n){return(e==0||t.canReplace(e,t.childCount))&&(n==t.childCount||t.canReplace(0,n))}function ft(t){let n=t.parent.content.cutByIndex(t.startIndex,t.endIndex);for(let r=t.depth,o=0,i=0;;--r){let s=t.$from.node(r),l=t.$from.index(r)+o,a=t.$to.indexAfter(r)-i;if(rn;p--)m||r.index(p)>0?(m=!0,d=v.from(r.node(p).copy(d)),u++):a--;let f=v.empty,h=0;for(let p=i,m=!1;p>n;p--)m||o.after(p+1)=0;s--){if(r.size){let l=n[s].type.contentMatch.matchFragment(r);if(!l||!l.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=v.from(n[s].type.create(n[s].attrs,r))}let o=e.start,i=e.end;t.step(new se(o,i,o,i,new E(r,0,0),n.length,!0))}function Lp(t,e,n,r,o){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let i=t.steps.length;t.doc.nodesBetween(e,n,(s,l)=>{let a=typeof o=="function"?o(s):o;if(s.isTextblock&&!s.hasMarkup(r,a)&&Bp(t.doc,t.mapping.slice(i).map(l),r)){let c=null;if(r.schema.linebreakReplacement){let h=r.whitespace=="pre",p=!!r.contentMatch.matchType(r.schema.linebreakReplacement);h&&!p?c=!1:!h&&p&&(c=!0)}c===!1&&_a(t,s,l,i),$i(t,t.mapping.slice(i).map(l,1),r,void 0,c===null);let d=t.mapping.slice(i),u=d.map(l,1),f=d.map(l+s.nodeSize,1);return t.step(new se(u,f,u+1,f-1,new E(v.from(r.create(a,null,s.marks)),0,0),1,!0)),c===!0&&Va(t,s,l,i),!1}})}function Va(t,e,n,r){e.forEach((o,i)=>{if(o.isText){let s,l=/\r?\n|\r/g;for(;s=l.exec(o.text);){let a=t.mapping.slice(r).map(n+1+i+s.index);t.replaceWith(a,a+1,e.type.schema.linebreakReplacement.create())}}})}function _a(t,e,n,r){e.forEach((o,i)=>{if(o.type==o.type.schema.linebreakReplacement){let s=t.mapping.slice(r).map(n+1+i);t.replaceWith(s,s+1,e.type.schema.text(` +`))}})}function Bp(t,e,n){let r=t.resolve(e),o=r.index();return r.parent.canReplaceWith(o,o+1,n)}function zp(t,e,n,r,o){let i=t.doc.nodeAt(e);if(!i)throw new RangeError("No node at given position");n||(n=i.type);let s=n.create(r,null,o||i.marks);if(i.isLeaf)return t.replaceWith(e,e+i.nodeSize,s);if(!n.validContent(i.content))throw new RangeError("Invalid content for node type "+n.name);t.step(new se(e,e+i.nodeSize,e+1,e+i.nodeSize-1,new E(v.from(s),0,0),1,!0))}function Ee(t,e,n=1,r){let o=t.resolve(e),i=o.depth-n,s=r&&r[r.length-1]||o.parent;if(i<0||o.parent.type.spec.isolating||!o.parent.canReplace(o.index(),o.parent.childCount)||!s.type.validContent(o.parent.content.cutByIndex(o.index(),o.parent.childCount)))return!1;for(let c=o.depth-1,d=n-2;c>i;c--,d--){let u=o.node(c),f=o.index(c);if(u.type.spec.isolating)return!1;let h=u.content.cutByIndex(f,u.childCount),p=r&&r[d+1];p&&(h=h.replaceChild(0,p.type.create(p.attrs)));let m=r&&r[d]||u;if(!u.canReplace(f+1,u.childCount)||!m.type.validContent(h))return!1}let l=o.indexAfter(i),a=r&&r[0];return o.node(i).canReplaceWith(l,l,a?a.type:o.node(i+1).type)}function Hp(t,e,n=1,r){let o=t.doc.resolve(e),i=v.empty,s=v.empty;for(let l=o.depth,a=o.depth-n,c=n-1;l>a;l--,c--){i=v.from(o.node(l).copy(i));let d=r&&r[c];s=v.from(d?d.type.create(d.attrs,s):o.node(l).copy(s))}t.step(new ye(e,e,new E(i.append(s),n,n),!0))}function Re(t,e){let n=t.resolve(e),r=n.index();return Wa(n.nodeBefore,n.nodeAfter)&&n.parent.canReplace(r,r+1)}function $p(t,e){e.content.size||t.type.compatibleContent(e.type);let n=t.contentMatchAt(t.childCount),{linebreakReplacement:r}=t.type.schema;for(let o=0;o0?(i=r.node(o+1),l++,s=r.node(o).maybeChild(l)):(i=r.node(o).maybeChild(l-1),s=r.node(o+1)),i&&!i.isTextblock&&Wa(i,s)&&r.node(o).canReplace(l,l+1))return e;if(o==0)break;e=n<0?r.before(o):r.after(o)}}function Fp(t,e,n){let r=null,{linebreakReplacement:o}=t.doc.type.schema,i=t.doc.resolve(e-n),s=i.node().type;if(o&&s.inlineContent){let d=s.whitespace=="pre",u=!!s.contentMatch.matchType(o);d&&!u?r=!1:!d&&u&&(r=!0)}let l=t.steps.length;if(r===!1){let d=t.doc.resolve(e+n);_a(t,d.node(),d.before(),l)}s.inlineContent&&$i(t,e+n-1,s,i.node().contentMatchAt(i.index()),r==null);let a=t.mapping.slice(l),c=a.map(e-n);if(t.step(new ye(c,a.map(e+n,-1),E.empty,!0)),r===!0){let d=t.doc.resolve(c);Va(t,d.node(),d.before(),t.steps.length)}return t}function Vp(t,e,n){let r=t.resolve(e);if(r.parent.canReplaceWith(r.index(),r.index(),n))return e;if(r.parentOffset==0)for(let o=r.depth-1;o>=0;o--){let i=r.index(o);if(r.node(o).canReplaceWith(i,i,n))return r.before(o+1);if(i>0)return null}if(r.parentOffset==r.parent.content.size)for(let o=r.depth-1;o>=0;o--){let i=r.indexAfter(o);if(r.node(o).canReplaceWith(i,i,n))return r.after(o+1);if(i=0;s--){let l=s==r.depth?0:r.pos<=(r.start(s+1)+r.end(s+1))/2?-1:1,a=r.index(s)+(l>0?1:0),c=r.node(s),d=!1;if(i==1)d=c.canReplace(a,a,o);else{let u=c.contentMatchAt(a).findWrapping(o.firstChild.type);d=u&&c.canReplaceWith(a,a,u[0])}if(d)return l==0?r.pos:l<0?r.before(s+1):r.after(s+1)}return null}function qn(t,e,n=e,r=E.empty){if(e==n&&!r.size)return null;let o=t.resolve(e),i=t.resolve(n);return ja(o,i,r)?new ye(e,n,r):new zi(o,i,r).fit()}function ja(t,e,n){return!n.openStart&&!n.openEnd&&t.start()==e.start()&&t.parent.canReplace(t.index(),e.index(),n.content)}var zi=class{constructor(e,n,r){this.$from=e,this.$to=n,this.unplaced=r,this.frontier=[],this.placed=v.empty;for(let o=0;o<=e.depth;o++){let i=e.node(o);this.frontier.push({type:i.type,match:i.contentMatchAt(e.indexAfter(o))})}for(let o=e.depth;o>0;o--)this.placed=v.from(e.node(o).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let c=this.findFittable();c?this.placeNodes(c):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),n=this.placed.size-this.depth-this.$from.depth,r=this.$from,o=this.close(e<0?this.$to:r.doc.resolve(e));if(!o)return null;let i=this.placed,s=r.depth,l=o.depth;for(;s&&l&&i.childCount==1;)i=i.firstChild.content,s--,l--;let a=new E(i,s,l);return e>-1?new se(r.pos,e,this.$to.pos,this.$to.end(),a,n):a.size||r.pos!=this.$to.pos?new ye(r.pos,o.pos,a):null}findFittable(){let e=this.unplaced.openStart;for(let n=this.unplaced.content,r=0,o=this.unplaced.openEnd;r1&&(o=0),i.type.spec.isolating&&o<=r){e=r;break}n=i.content}for(let n=1;n<=2;n++)for(let r=n==1?e:this.unplaced.openStart;r>=0;r--){let o,i=null;r?(i=Pi(this.unplaced.content,r-1).firstChild,o=i.content):o=this.unplaced.content;let s=o.firstChild;for(let l=this.depth;l>=0;l--){let{type:a,match:c}=this.frontier[l],d,u=null;if(n==1&&(s?c.matchType(s.type)||(u=c.fillBefore(v.from(s),!1)):i&&a.compatibleContent(i.type)))return{sliceDepth:r,frontierDepth:l,parent:i,inject:u};if(n==2&&s&&(d=c.findWrapping(s.type)))return{sliceDepth:r,frontierDepth:l,parent:i,wrap:d};if(i&&c.matchType(i.type))break}}}openMore(){let{content:e,openStart:n,openEnd:r}=this.unplaced,o=Pi(e,n);return!o.childCount||o.firstChild.isLeaf?!1:(this.unplaced=new E(e,n+1,Math.max(r,o.size+n>=e.size-r?n+1:0)),!0)}dropNode(){let{content:e,openStart:n,openEnd:r}=this.unplaced,o=Pi(e,n);if(o.childCount<=1&&n>0){let i=e.size-n<=n+o.size;this.unplaced=new E(Vn(e,n-1,1),n-1,i?n-1:r)}else this.unplaced=new E(Vn(e,n,1),n,r)}placeNodes({sliceDepth:e,frontierDepth:n,parent:r,inject:o,wrap:i}){for(;this.depth>n;)this.closeFrontierNode();if(i)for(let m=0;m1||a==0||m.content.size)&&(u=g,d.push(Ua(m.mark(f.allowedMarks(m.marks)),c==1?a:0,c==l.childCount?h:-1)))}let p=c==l.childCount;p||(h=-1),this.placed=_n(this.placed,n,v.from(d)),this.frontier[n].match=u,p&&h<0&&r&&r.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let m=0,g=l;m1&&o==this.$to.end(--r);)++o;return o}findCloseLevel(e){e:for(let n=Math.min(this.depth,e.depth);n>=0;n--){let{match:r,type:o}=this.frontier[n],i=n=0;l--){let{match:a,type:c}=this.frontier[l],d=Li(e,l,c,a,!0);if(!d||d.childCount)continue e}return{depth:n,fit:s,move:i?e.doc.resolve(e.after(n+1)):e}}}}close(e){let n=this.findCloseLevel(e);if(!n)return null;for(;this.depth>n.depth;)this.closeFrontierNode();n.fit.childCount&&(this.placed=_n(this.placed,n.depth,n.fit)),e=n.move;for(let r=n.depth+1;r<=e.depth;r++){let o=e.node(r),i=o.type.contentMatch.fillBefore(o.content,!0,e.index(r));this.openFrontierNode(o.type,o.attrs,i)}return e}openFrontierNode(e,n=null,r){let o=this.frontier[this.depth];o.match=o.match.matchType(e),this.placed=_n(this.placed,this.depth,v.from(e.create(n,r))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let n=this.frontier.pop().match.fillBefore(v.empty,!0);n.childCount&&(this.placed=_n(this.placed,this.frontier.length,n))}};function Vn(t,e,n){return e==0?t.cutByIndex(n,t.childCount):t.replaceChild(0,t.firstChild.copy(Vn(t.firstChild.content,e-1,n)))}function _n(t,e,n){return e==0?t.append(n):t.replaceChild(t.childCount-1,t.lastChild.copy(_n(t.lastChild.content,e-1,n)))}function Pi(t,e){for(let n=0;n1&&(r=r.replaceChild(0,Ua(r.firstChild,e-1,r.childCount==1?n-1:0))),e>0&&(r=t.type.contentMatch.fillBefore(r).append(r),n<=0&&(r=r.append(t.type.contentMatch.matchFragment(r).fillBefore(v.empty,!0)))),t.copy(r)}function Li(t,e,n,r,o){let i=t.node(e),s=o?t.indexAfter(e):t.index(e);if(s==i.childCount&&!n.compatibleContent(i.type))return null;let l=r.fillBefore(i.content,!0,s);return l&&!_p(n,i.content,s)?l:null}function _p(t,e,n){for(let r=n;r0;f--,h--){let p=o.node(f).type.spec;if(p.defining||p.definingAsContext||p.isolating)break;s.indexOf(f)>-1?l=f:o.before(f)==h&&s.splice(1,0,-f)}let a=s.indexOf(l),c=[],d=r.openStart;for(let f=r.content,h=0;;h++){let p=f.firstChild;if(c.push(p),h==r.openStart)break;f=p.content}for(let f=d-1;f>=0;f--){let h=c[f],p=Wp(h.type);if(p&&!h.sameMarkup(o.node(Math.abs(l)-1)))d=f;else if(p||!h.type.isTextblock)break}for(let f=r.openStart;f>=0;f--){let h=(f+d+1)%(r.openStart+1),p=c[h];if(p)for(let m=0;m=0&&(t.replace(e,n,r),!(t.steps.length>u));f--){let h=s[f];h<0||(e=o.before(h),n=i.after(h))}}function Ka(t,e,n,r,o){if(er){let i=o.contentMatchAt(0),s=i.fillBefore(t).append(t);t=s.append(i.matchFragment(s).fillBefore(v.empty,!0))}return t}function Up(t,e,n,r){if(!r.isInline&&e==n&&t.doc.resolve(e).parent.content.size){let o=Vp(t.doc,e,r.type);o!=null&&(e=n=o)}t.replaceRange(e,n,new E(v.from(r),0,0))}function Kp(t,e,n){let r=t.doc.resolve(e),o=t.doc.resolve(n),i=qa(r,o);for(let s=0;s0&&(a||r.node(l-1).canReplace(r.index(l-1),o.indexAfter(l-1))))return t.delete(r.before(l),o.after(l))}for(let s=1;s<=r.depth&&s<=o.depth;s++)if(e-r.start(s)==r.depth-s&&n>r.end(s)&&o.end(s)-n!=o.depth-s&&r.start(s-1)==o.start(s-1)&&r.node(s-1).canReplace(r.index(s-1),o.index(s-1)))return t.delete(r.before(s),n);t.delete(e,n)}function qa(t,e){let n=[],r=Math.min(t.depth,e.depth);for(let o=r;o>=0;o--){let i=t.start(o);if(ie.pos+(e.depth-o)||t.node(o).type.spec.isolating||e.node(o).type.spec.isolating)break;(i==e.start(o)||o==t.depth&&o==e.depth&&t.parent.inlineContent&&e.parent.inlineContent&&o&&e.start(o-1)==i-1)&&n.push(o)}return n}var Lr=class t extends ce{constructor(e,n,r){super(),this.pos=e,this.attr=n,this.value=r}apply(e){let n=e.nodeAt(this.pos);if(!n)return ue.fail("No node at attribute step's position");let r=Object.create(null);for(let i in n.attrs)r[i]=n.attrs[i];r[this.attr]=this.value;let o=n.type.create(r,null,n.marks);return ue.fromReplace(e,this.pos,this.pos+1,new E(v.from(o),0,n.isLeaf?0:1))}getMap(){return dt.empty}invert(e){return new t(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let n=e.mapResult(this.pos,1);return n.deletedAfter?null:new t(n.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.pos!="number"||typeof n.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new t(n.pos,n.attr,n.value)}};ce.jsonID("attr",Lr);var Br=class t extends ce{constructor(e,n){super(),this.attr=e,this.value=n}apply(e){let n=Object.create(null);for(let o in e.attrs)n[o]=e.attrs[o];n[this.attr]=this.value;let r=e.type.create(n,e.content,e.marks);return ue.ok(r)}getMap(){return dt.empty}invert(e){return new t(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new t(n.attr,n.value)}};ce.jsonID("docAttr",Br);var pn=class extends Error{};pn=function t(e){let n=Error.call(this,e);return n.__proto__=t.prototype,n};pn.prototype=Object.create(Error.prototype);pn.prototype.constructor=pn;pn.prototype.name="TransformError";var Tt=class{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new jn}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let n=this.maybeStep(e);if(n.failed)throw new pn(n.failed);return this}maybeStep(e){let n=e.apply(this.doc);return n.failed||this.addStep(e,n.doc),n}get docChanged(){return this.steps.length>0}addStep(e,n){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=n}replace(e,n=e,r=E.empty){let o=qn(this.doc,e,n,r);return o&&this.step(o),this}replaceWith(e,n,r){return this.replace(e,n,new E(v.from(r),0,0))}delete(e,n){return this.replace(e,n,E.empty)}insert(e,n){return this.replaceWith(e,e,n)}replaceRange(e,n,r){return jp(this,e,n,r),this}replaceRangeWith(e,n,r){return Up(this,e,n,r),this}deleteRange(e,n){return Kp(this,e,n),this}lift(e,n){return Rp(this,e,n),this}join(e,n=1){return Fp(this,e,n),this}wrap(e,n){return Pp(this,e,n),this}setBlockType(e,n=e,r,o=null){return Lp(this,e,n,r,o),this}setNodeMarkup(e,n,r=null,o){return zp(this,e,n,r,o),this}setNodeAttribute(e,n,r){return this.step(new Lr(e,n,r)),this}setDocAttribute(e,n){return this.step(new Br(e,n)),this}addNodeMark(e,n){return this.step(new Kn(e,n)),this}removeNodeMark(e,n){let r=this.doc.nodeAt(e);if(!r)throw new RangeError("No node at position "+e);if(n instanceof J)n.isInSet(r.marks)&&this.step(new hn(e,n));else{let o=r.marks,i,s=[];for(;i=n.isInSet(o);)s.push(new hn(e,i)),o=i.removeFromSet(o);for(let l=s.length-1;l>=0;l--)this.step(s[l])}return this}split(e,n=1,r){return Hp(this,e,n,r),this}addMark(e,n,r){return Ep(this,e,n,r),this}removeMark(e,n,r){return Np(this,e,n,r),this}clearIncompatible(e,n,r){return $i(this,e,n,r),this}};var Fi=Object.create(null),I=class{constructor(e,n,r){this.$anchor=e,this.$head=n,this.ranges=r||[new yn(e.min(n),e.max(n))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let n=0;n=0;i--){let s=n<0?gn(e.node(0),e.node(i),e.before(i+1),e.index(i),n,r):gn(e.node(0),e.node(i),e.after(i+1),e.index(i)+1,n,r);if(s)return s}return null}static near(e,n=1){return this.findFrom(e,n)||this.findFrom(e,-n)||new ke(e.node(0))}static atStart(e){return gn(e,e,0,0,1)||new ke(e)}static atEnd(e){return gn(e,e,e.content.size,e.childCount,-1)||new ke(e)}static fromJSON(e,n){if(!n||!n.type)throw new RangeError("Invalid input for Selection.fromJSON");let r=Fi[n.type];if(!r)throw new RangeError(`No selection type ${n.type} defined`);return r.fromJSON(e,n)}static jsonID(e,n){if(e in Fi)throw new RangeError("Duplicate use of selection JSON ID "+e);return Fi[e]=n,n.prototype.jsonID=e,n}getBookmark(){return D.between(this.$anchor,this.$head).getBookmark()}};I.prototype.visible=!0;var yn=class{constructor(e,n){this.$from=e,this.$to=n}},Ja=!1;function Ga(t){!Ja&&!t.parent.inlineContent&&(Ja=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+t.parent.type.name+")"))}var D=class t extends I{constructor(e,n=e){Ga(e),Ga(n),super(e,n)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,n){let r=e.resolve(n.map(this.head));if(!r.parent.inlineContent)return I.near(r);let o=e.resolve(n.map(this.anchor));return new t(o.parent.inlineContent?o:r,r)}replace(e,n=E.empty){if(super.replace(e,n),n==E.empty){let r=this.$from.marksAcross(this.$to);r&&e.ensureMarks(r)}}eq(e){return e instanceof t&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new $r(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,n){if(typeof n.anchor!="number"||typeof n.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new t(e.resolve(n.anchor),e.resolve(n.head))}static create(e,n,r=n){let o=e.resolve(n);return new this(o,r==n?o:e.resolve(r))}static between(e,n,r){let o=e.pos-n.pos;if((!r||o)&&(r=o>=0?1:-1),!n.parent.inlineContent){let i=I.findFrom(n,r,!0)||I.findFrom(n,-r,!0);if(i)n=i.$head;else return I.near(n,r)}return e.parent.inlineContent||(o==0?e=n:(e=(I.findFrom(e,-r,!0)||I.findFrom(e,r,!0)).$anchor,e.pos0?0:1);o>0?s=0;s+=o){let l=e.child(s);if(l.isAtom){if(!i&&L.isSelectable(l))return L.create(t,n-(o<0?l.nodeSize:0))}else{let a=gn(t,l,n+o,o<0?l.childCount:0,o,i);if(a)return a}n+=l.nodeSize*o}return null}function Xa(t,e,n){let r=t.steps.length-1;if(r{s==null&&(s=d)}),t.setSelection(I.near(t.doc.resolve(s),n))}var Ya=1,Hr=2,Qa=4,Wi=class extends Tt{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=Hr,this}ensureMarks(e){return J.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&Hr)>0}addStep(e,n){super.addStep(e,n),this.updated=this.updated&~Hr,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,n=!0){let r=this.selection;return n&&(e=e.mark(this.storedMarks||(r.empty?r.$from.marks():r.$from.marksAcross(r.$to)||J.none))),r.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,n,r){let o=this.doc.type.schema;if(n==null)return e?this.replaceSelectionWith(o.text(e),!0):this.deleteSelection();{if(r==null&&(r=n),!e)return this.deleteRange(n,r);let i=this.storedMarks;if(!i){let s=this.doc.resolve(n);i=r==n?s.marks():s.marksAcross(this.doc.resolve(r))}return this.replaceRangeWith(n,r,o.text(e,i)),!this.selection.empty&&this.selection.to==n+e.length&&this.setSelection(I.near(this.selection.$to)),this}}setMeta(e,n){return this.meta[typeof e=="string"?e:e.key]=n,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=Qa,this}get scrolledIntoView(){return(this.updated&Qa)>0}};function Za(t,e){return!e||!t?t:t.bind(e)}var jt=class{constructor(e,n,r){this.name=e,this.init=Za(n.init,r),this.apply=Za(n.apply,r)}},Jp=[new jt("doc",{init(t){return t.doc||t.schema.topNodeType.createAndFill()},apply(t){return t.doc}}),new jt("selection",{init(t,e){return t.selection||I.atStart(e.doc)},apply(t){return t.selection}}),new jt("storedMarks",{init(t){return t.storedMarks||null},apply(t,e,n,r){return r.selection.$cursor?t.storedMarks:null}}),new jt("scrollToSelection",{init(){return 0},apply(t,e){return t.scrolledIntoView?e+1:e}})],Jn=class{constructor(e,n){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=Jp.slice(),n&&n.forEach(r=>{if(this.pluginsByKey[r.key])throw new RangeError("Adding different instances of a keyed plugin ("+r.key+")");this.plugins.push(r),this.pluginsByKey[r.key]=r,r.spec.state&&this.fields.push(new jt(r.key,r.spec.state,r))})}},Fr=class t{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,n=-1){for(let r=0;rr.toJSON())),e&&typeof e=="object")for(let r in e){if(r=="doc"||r=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let o=e[r],i=o.spec.state;i&&i.toJSON&&(n[r]=i.toJSON.call(o,this[o.key]))}return n}static fromJSON(e,n,r){if(!n)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let o=new Jn(e.schema,e.plugins),i=new t(o);return o.fields.forEach(s=>{if(s.name=="doc")i.doc=ie.fromJSON(e.schema,n.doc);else if(s.name=="selection")i.selection=I.fromJSON(i.doc,n.selection);else if(s.name=="storedMarks")n.storedMarks&&(i.storedMarks=n.storedMarks.map(e.schema.markFromJSON));else{if(r)for(let l in r){let a=r[l],c=a.spec.state;if(a.key==s.name&&c&&c.fromJSON&&Object.prototype.hasOwnProperty.call(n,l)){i[s.name]=c.fromJSON.call(a,e,n[l],i);return}}i[s.name]=s.init(e,i)}}),i}};function ec(t,e,n){for(let r in t){let o=t[r];o instanceof Function?o=o.bind(e):r=="handleDOMEvents"&&(o=ec(o,e,{})),n[r]=o}return n}var P=class{constructor(e){this.spec=e,this.props={},e.props&&ec(e.props,this,this.props),this.key=e.key?e.key.key:tc("plugin")}getState(e){return e[this.key]}},Vi=Object.create(null);function tc(t){return t in Vi?t+"$"+ ++Vi[t]:(Vi[t]=0,t+"$")}var H=class{constructor(e="key"){this.key=tc(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}};var Vr=(t,e)=>t.selection.empty?!1:(e&&e(t.tr.deleteSelection().scrollIntoView()),!0);function rc(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("backward",t):n.parentOffset>0)?null:n}var Ui=(t,e,n)=>{let r=rc(t,n);if(!r)return!1;let o=qi(r);if(!o){let s=r.blockRange(),l=s&&ft(s);return l==null?!1:(e&&e(t.tr.lift(s,l).scrollIntoView()),!0)}let i=o.nodeBefore;if(fc(t,o,e,-1))return!0;if(r.parent.content.size==0&&(bn(i,"end")||L.isSelectable(i)))for(let s=r.depth;;s--){let l=qn(t.doc,r.before(s),r.after(s),E.empty);if(l&&l.slice.size1)break}return i.isAtom&&o.depth==r.depth-1?(e&&e(t.tr.delete(o.pos-i.nodeSize,o.pos).scrollIntoView()),!0):!1},oc=(t,e,n)=>{let r=rc(t,n);if(!r)return!1;let o=qi(r);return o?sc(t,o,e):!1},ic=(t,e,n)=>{let r=lc(t,n);if(!r)return!1;let o=Xi(r);return o?sc(t,o,e):!1};function sc(t,e,n){let r=e.nodeBefore,o=r,i=e.pos-1;for(;!o.isTextblock;i--){if(o.type.spec.isolating)return!1;let d=o.lastChild;if(!d)return!1;o=d}let s=e.nodeAfter,l=s,a=e.pos+1;for(;!l.isTextblock;a++){if(l.type.spec.isolating)return!1;let d=l.firstChild;if(!d)return!1;l=d}let c=qn(t.doc,i,a,E.empty);if(!c||c.from!=i||c instanceof ye&&c.slice.size>=a-i)return!1;if(n){let d=t.tr.step(c);d.setSelection(D.create(d.doc,i)),n(d.scrollIntoView())}return!0}function bn(t,e,n=!1){for(let r=t;r;r=e=="start"?r.firstChild:r.lastChild){if(r.isTextblock)return!0;if(n&&r.childCount!=1)return!1}return!1}var Ki=(t,e,n)=>{let{$head:r,empty:o}=t.selection,i=r;if(!o)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("backward",t):r.parentOffset>0)return!1;i=qi(r)}let s=i&&i.nodeBefore;return!s||!L.isSelectable(s)?!1:(e&&e(t.tr.setSelection(L.create(t.doc,i.pos-s.nodeSize)).scrollIntoView()),!0)};function qi(t){if(!t.parent.type.spec.isolating)for(let e=t.depth-1;e>=0;e--){if(t.index(e)>0)return t.doc.resolve(t.before(e+1));if(t.node(e).type.spec.isolating)break}return null}function lc(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("forward",t):n.parentOffset{let r=lc(t,n);if(!r)return!1;let o=Xi(r);if(!o)return!1;let i=o.nodeAfter;if(fc(t,o,e,1))return!0;if(r.parent.content.size==0&&(bn(i,"start")||L.isSelectable(i))){let s=qn(t.doc,r.before(),r.after(),E.empty);if(s&&s.slice.size{let{$head:r,empty:o}=t.selection,i=r;if(!o)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("forward",t):r.parentOffset=0;e--){let n=t.node(e);if(t.index(e)+1{let n=t.selection,r=n instanceof L,o;if(r){if(n.node.isTextblock||!Re(t.doc,n.from))return!1;o=n.from}else if(o=Wt(t.doc,n.from,-1),o==null)return!1;if(e){let i=t.tr.join(o);r&&i.setSelection(L.create(i.doc,o-t.doc.resolve(o).nodeBefore.nodeSize)),e(i.scrollIntoView())}return!0},cc=(t,e)=>{let n=t.selection,r;if(n instanceof L){if(n.node.isTextblock||!Re(t.doc,n.to))return!1;r=n.to}else if(r=Wt(t.doc,n.to,1),r==null)return!1;return e&&e(t.tr.join(r).scrollIntoView()),!0},dc=(t,e)=>{let{$from:n,$to:r}=t.selection,o=n.blockRange(r),i=o&&ft(o);return i==null?!1:(e&&e(t.tr.lift(o,i).scrollIntoView()),!0)},Yi=(t,e)=>{let{$head:n,$anchor:r}=t.selection;return!n.parent.type.spec.code||!n.sameParent(r)?!1:(e&&e(t.tr.insertText(` +`).scrollIntoView()),!0)};function Qi(t){for(let e=0;e{let{$head:n,$anchor:r}=t.selection;if(!n.parent.type.spec.code||!n.sameParent(r))return!1;let o=n.node(-1),i=n.indexAfter(-1),s=Qi(o.contentMatchAt(i));if(!s||!o.canReplaceWith(i,i,s))return!1;if(e){let l=n.after(),a=t.tr.replaceWith(l,l,s.createAndFill());a.setSelection(I.near(a.doc.resolve(l),1)),e(a.scrollIntoView())}return!0},es=(t,e)=>{let n=t.selection,{$from:r,$to:o}=n;if(n instanceof ke||r.parent.inlineContent||o.parent.inlineContent)return!1;let i=Qi(o.parent.contentMatchAt(o.indexAfter()));if(!i||!i.isTextblock)return!1;if(e){let s=(!r.parentOffset&&o.index(){let{$cursor:n}=t.selection;if(!n||n.parent.content.size)return!1;if(n.depth>1&&n.after()!=n.end(-1)){let i=n.before();if(Ee(t.doc,i))return e&&e(t.tr.split(i).scrollIntoView()),!0}let r=n.blockRange(),o=r&&ft(r);return o==null?!1:(e&&e(t.tr.lift(r,o).scrollIntoView()),!0)};function Gp(t){return(e,n)=>{let{$from:r,$to:o}=e.selection;if(e.selection instanceof L&&e.selection.node.isBlock)return!r.parentOffset||!Ee(e.doc,r.pos)?!1:(n&&n(e.tr.split(r.pos).scrollIntoView()),!0);if(!r.depth)return!1;let i=[],s,l,a=!1,c=!1;for(let h=r.depth;;h--)if(r.node(h).isBlock){a=r.end(h)==r.pos+(r.depth-h),c=r.start(h)==r.pos-(r.depth-h),l=Qi(r.node(h-1).contentMatchAt(r.indexAfter(h-1)));let m=t&&t(o.parent,a,r);i.unshift(m||(a&&l?{type:l}:null)),s=h;break}else{if(h==1)return!1;i.unshift(null)}let d=e.tr;(e.selection instanceof D||e.selection instanceof ke)&&d.deleteSelection();let u=d.mapping.map(r.pos),f=Ee(d.doc,u,i.length,i);if(f||(i[0]=l?{type:l}:null,f=Ee(d.doc,u,i.length,i)),!f)return!1;if(d.split(u,i.length,i),!a&&c&&r.node(s).type!=l){let h=d.mapping.map(r.before(s)),p=d.doc.resolve(h);l&&r.node(s-1).canReplaceWith(p.index(),p.index()+1,l)&&d.setNodeMarkup(d.mapping.map(r.before(s)),l)}return n&&n(d.scrollIntoView()),!0}}var Xp=Gp();var uc=(t,e)=>{let{$from:n,to:r}=t.selection,o,i=n.sharedDepth(r);return i==0?!1:(o=n.before(i),e&&e(t.tr.setSelection(L.create(t.doc,o))),!0)},Yp=(t,e)=>(e&&e(t.tr.setSelection(new ke(t.doc))),!0);function Qp(t,e,n){let r=e.nodeBefore,o=e.nodeAfter,i=e.index();return!r||!o||!r.type.compatibleContent(o.type)?!1:!r.content.size&&e.parent.canReplace(i-1,i)?(n&&n(t.tr.delete(e.pos-r.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(i,i+1)||!(o.isTextblock||Re(t.doc,e.pos))?!1:(n&&n(t.tr.join(e.pos).scrollIntoView()),!0)}function fc(t,e,n,r){let o=e.nodeBefore,i=e.nodeAfter,s,l,a=o.type.spec.isolating||i.type.spec.isolating;if(!a&&Qp(t,e,n))return!0;let c=!a&&e.parent.canReplace(e.index(),e.index()+1);if(c&&(s=(l=o.contentMatchAt(o.childCount)).findWrapping(i.type))&&l.matchType(s[0]||i.type).validEnd){if(n){let h=e.pos+i.nodeSize,p=v.empty;for(let y=s.length-1;y>=0;y--)p=v.from(s[y].create(null,p));p=v.from(o.copy(p));let m=t.tr.step(new se(e.pos-1,h,e.pos,h,new E(p,1,0),s.length,!0)),g=m.doc.resolve(h+2*s.length);g.nodeAfter&&g.nodeAfter.type==o.type&&Re(m.doc,g.pos)&&m.join(g.pos),n(m.scrollIntoView())}return!0}let d=i.type.spec.isolating||r>0&&a?null:I.findFrom(e,1),u=d&&d.$from.blockRange(d.$to),f=u&&ft(u);if(f!=null&&f>=e.depth)return n&&n(t.tr.lift(u,f).scrollIntoView()),!0;if(c&&bn(i,"start",!0)&&bn(o,"end")){let h=o,p=[];for(;p.push(h),!h.isTextblock;)h=h.lastChild;let m=i,g=1;for(;!m.isTextblock;m=m.firstChild)g++;if(h.canReplace(h.childCount,h.childCount,m.content)){if(n){let y=v.empty;for(let b=p.length-1;b>=0;b--)y=v.from(p[b].copy(y));let w=t.tr.step(new se(e.pos-p.length,e.pos+i.nodeSize,e.pos+g,e.pos+i.nodeSize-g,new E(y,p.length,0),0,!0));n(w.scrollIntoView())}return!0}}return!1}function hc(t){return function(e,n){let r=e.selection,o=t<0?r.$from:r.$to,i=o.depth;for(;o.node(i).isInline;){if(!i)return!1;i--}return o.node(i).isTextblock?(n&&n(e.tr.setSelection(D.create(e.doc,t<0?o.start(i):o.end(i)))),!0):!1}}var ns=hc(-1),rs=hc(1);function pc(t,e=null){return function(n,r){let{$from:o,$to:i}=n.selection,s=o.blockRange(i),l=s&&mn(s,t,e);return l?(r&&r(n.tr.wrap(s,l).scrollIntoView()),!0):!1}}function is(t,e=null){return function(n,r){let o=!1;for(let i=0;i{if(o)return!1;if(!(!a.isTextblock||a.hasMarkup(t,e)))if(a.type==t)o=!0;else{let d=n.doc.resolve(c),u=d.index();o=d.parent.canReplaceWith(u,u+1,t)}})}if(!o)return!1;if(r){let i=n.tr;for(let s=0;s=2&&e.$from.node(e.depth-1).type.compatibleContent(n)&&e.startIndex==0){if(e.$from.index(e.depth-1)==0)return!1;let a=s.resolve(e.start-2);i=new Vt(a,a,e.depth),e.endIndex=0;d--)i=v.from(n[d].type.create(n[d].attrs,i));t.step(new se(e.start-(r?2:0),e.end,e.start,e.end,new E(i,0,0),n.length,!0));let s=0;for(let d=0;ds.childCount>0&&s.firstChild.type==t);return i?n?r.node(i.depth-1).type==t?nm(e,n,t,i):rm(e,n,i):!0:!1}}function nm(t,e,n,r){let o=t.tr,i=r.end,s=r.$to.end(r.depth);im;p--)h-=o.child(p).nodeSize,r.delete(h-1,h+1);let i=r.doc.resolve(n.start),s=i.nodeAfter;if(r.mapping.map(n.end)!=n.start+i.nodeAfter.nodeSize)return!1;let l=n.startIndex==0,a=n.endIndex==o.childCount,c=i.node(-1),d=i.index(-1);if(!c.canReplace(d+(l?0:1),d+1,s.content.append(a?v.empty:v.from(o))))return!1;let u=i.pos,f=u+s.nodeSize;return r.step(new se(u-(l?1:0),f+(a?1:0),u+1,f-1,new E((l?v.empty:v.from(o.copy(v.empty))).append(a?v.empty:v.from(o.copy(v.empty))),l?0:1,a?0:1),l?0:1)),e(r.scrollIntoView()),!0}function yc(t){return function(e,n){let{$from:r,$to:o}=e.selection,i=r.blockRange(o,c=>c.childCount>0&&c.firstChild.type==t);if(!i)return!1;let s=i.startIndex;if(s==0)return!1;let l=i.parent,a=l.child(s-1);if(a.type!=t)return!1;if(n){let c=a.lastChild&&a.lastChild.type==l.type,d=v.from(c?t.create():null),u=new E(v.from(t.create(null,v.from(l.type.create(null,d)))),c?3:1,0),f=i.start,h=i.end;n(e.tr.step(new se(f-(c?3:1),h,f,h,u,1,!0)).scrollIntoView())}return!0}}var fe=function(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e},Cn=function(t){let e=t.assignedSlot||t.parentNode;return e&&e.nodeType==11?e.host:e},fs=null,pt=function(t,e,n){let r=fs||(fs=document.createRange());return r.setEnd(t,n??t.nodeValue.length),r.setStart(t,e||0),r},om=function(){fs=null},Yt=function(t,e,n,r){return n&&(bc(t,e,n,r,-1)||bc(t,e,n,r,1))},im=/^(img|br|input|textarea|hr)$/i;function bc(t,e,n,r,o){for(var i;;){if(t==n&&e==r)return!0;if(e==(o<0?0:Ie(t))){let s=t.parentNode;if(!s||s.nodeType!=1||nr(t)||im.test(t.nodeName)||t.contentEditable=="false")return!1;e=fe(t)+(o<0?0:1),t=s}else if(t.nodeType==1){let s=t.childNodes[e+(o<0?-1:0)];if(s.nodeType==1&&s.contentEditable=="false")if(!((i=s.pmViewDesc)===null||i===void 0)&&i.ignoreForSelection)e+=o;else return!1;else t=s,e=o<0?Ie(t):0}else return!1}}function Ie(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function sm(t,e){for(;;){if(t.nodeType==3&&e)return t;if(t.nodeType==1&&e>0){if(t.contentEditable=="false")return null;t=t.childNodes[e-1],e=Ie(t)}else if(t.parentNode&&!nr(t))e=fe(t),t=t.parentNode;else return null}}function lm(t,e){for(;;){if(t.nodeType==3&&e2),De=vn||(Ye?/Mac/.test(Ye.platform):!1),Zc=Ye?/Win/.test(Ye.platform):!1,mt=/Android \d/.test(It),rr=!!wc&&"webkitFontSmoothing"in wc.documentElement.style,um=rr?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function fm(t){let e=t.defaultView&&t.defaultView.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function ht(t,e){return typeof t=="number"?t:t[e]}function hm(t){let e=t.getBoundingClientRect(),n=e.width/t.offsetWidth||1,r=e.height/t.offsetHeight||1;return{left:e.left,right:e.left+t.clientWidth*n,top:e.top,bottom:e.top+t.clientHeight*r}}function xc(t,e,n){let r=t.someProp("scrollThreshold")||0,o=t.someProp("scrollMargin")||5,i=t.dom.ownerDocument;for(let s=n||t.dom;s;){if(s.nodeType!=1){s=Cn(s);continue}let l=s,a=l==i.body,c=a?fm(i):hm(l),d=0,u=0;if(e.topc.bottom-ht(r,"bottom")&&(u=e.bottom-e.top>c.bottom-c.top?e.top+ht(o,"top")-c.top:e.bottom-c.bottom+ht(o,"bottom")),e.leftc.right-ht(r,"right")&&(d=e.right-c.right+ht(o,"right")),d||u)if(a)i.defaultView.scrollBy(d,u);else{let h=l.scrollLeft,p=l.scrollTop;u&&(l.scrollTop+=u),d&&(l.scrollLeft+=d);let m=l.scrollLeft-h,g=l.scrollTop-p;e={left:e.left-m,top:e.top-g,right:e.right-m,bottom:e.bottom-g}}let f=a?"fixed":getComputedStyle(s).position;if(/^(fixed|sticky)$/.test(f))break;s=f=="absolute"?s.offsetParent:Cn(s)}}function pm(t){let e=t.dom.getBoundingClientRect(),n=Math.max(0,e.top),r,o;for(let i=(e.left+e.right)/2,s=n+1;s=n-20){r=l,o=a.top;break}}return{refDOM:r,refTop:o,stack:ed(t.dom)}}function ed(t){let e=[],n=t.ownerDocument;for(let r=t;r&&(e.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),t!=n);r=Cn(r));return e}function mm({refDOM:t,refTop:e,stack:n}){let r=t?t.getBoundingClientRect().top:0;td(n,r==0?0:r-e)}function td(t,e){for(let n=0;n=l){s=Math.max(p.bottom,s),l=Math.min(p.top,l);let m=p.left>e.left?p.left-e.left:p.right=(p.left+p.right)/2?1:0));continue}}else p.top>e.top&&!a&&p.left<=e.left&&p.right>=e.left&&(a=d,c={left:Math.max(p.left,Math.min(p.right,e.left)),top:p.top});!n&&(e.left>=p.right&&e.top>=p.top||e.left>=p.left&&e.top>=p.bottom)&&(i=u+1)}}return!n&&a&&(n=a,o=c,r=0),n&&n.nodeType==3?ym(n,o):!n||r&&n.nodeType==1?{node:t,offset:i}:nd(n,o)}function ym(t,e){let n=t.nodeValue.length,r=document.createRange(),o;for(let i=0;i=(s.left+s.right)/2?1:0)};break}}return r.detach(),o||{node:t,offset:0}}function Os(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function bm(t,e){let n=t.parentNode;return n&&/^li$/i.test(n.nodeName)&&e.left(s.left+s.right)/2?1:-1}return t.docView.posFromDOM(r,o,i)}function xm(t,e,n,r){let o=-1;for(let i=e,s=!1;i!=t.dom;){let l=t.docView.nearestDesc(i,!0),a;if(!l)return null;if(l.dom.nodeType==1&&(l.node.isBlock&&l.parent||!l.contentDOM)&&((a=l.dom.getBoundingClientRect()).width||a.height)&&(l.node.isBlock&&l.parent&&!/^T(R|BODY|HEAD|FOOT)$/.test(l.dom.nodeName)&&(!s&&a.left>r.left||a.top>r.top?o=l.posBefore:(!s&&a.right-1?o:t.docView.posFromDOM(e,n,-1)}function rd(t,e,n){let r=t.childNodes.length;if(r&&n.tope.top&&o++}let c;rr&&o&&r.nodeType==1&&(c=r.childNodes[o-1]).nodeType==1&&c.contentEditable=="false"&&c.getBoundingClientRect().top>=e.top&&o--,r==t.dom&&o==r.childNodes.length-1&&r.lastChild.nodeType==1&&e.top>r.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:(o==0||r.nodeType!=1||r.childNodes[o-1].nodeName!="BR")&&(l=xm(t,r,o,e))}l==null&&(l=wm(t,s,e));let a=t.docView.nearestDesc(s,!0);return{pos:l,inside:a?a.posAtStart-a.border:-1}}function kc(t){return t.top=0&&o==r.nodeValue.length?(a--,d=1):n<0?a--:c++,Gn(Et(pt(r,a,c),d),d<0)}if(!t.state.doc.resolve(e-(i||0)).parent.inlineContent){if(i==null&&o&&(n<0||o==Ie(r))){let a=r.childNodes[o-1];if(a.nodeType==1)return ls(a.getBoundingClientRect(),!1)}if(i==null&&o=0)}if(i==null&&o&&(n<0||o==Ie(r))){let a=r.childNodes[o-1],c=a.nodeType==3?pt(a,Ie(a)-(s?0:1)):a.nodeType==1&&(a.nodeName!="BR"||!a.nextSibling)?a:null;if(c)return Gn(Et(c,1),!1)}if(i==null&&o=0)}function Gn(t,e){if(t.width==0)return t;let n=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:n,right:n}}function ls(t,e){if(t.height==0)return t;let n=e?t.top:t.bottom;return{top:n,bottom:n,left:t.left,right:t.right}}function id(t,e,n){let r=t.state,o=t.root.activeElement;r!=e&&t.updateState(e),o!=t.dom&&t.focus();try{return n()}finally{r!=e&&t.updateState(r),o!=t.dom&&o&&o.focus()}}function Cm(t,e,n){let r=e.selection,o=n=="up"?r.$from:r.$to;return id(t,e,()=>{let{node:i}=t.docView.domFromPos(o.pos,n=="up"?-1:1);for(;;){let l=t.docView.nearestDesc(i,!0);if(!l)break;if(l.node.isBlock){i=l.contentDOM||l.dom;break}i=l.dom.parentNode}let s=od(t,o.pos,1);for(let l=i.firstChild;l;l=l.nextSibling){let a;if(l.nodeType==1)a=l.getClientRects();else if(l.nodeType==3)a=pt(l,0,l.nodeValue.length).getClientRects();else continue;for(let c=0;cd.top+1&&(n=="up"?s.top-d.top>(d.bottom-s.top)*2:d.bottom-s.bottom>(s.bottom-d.top)*2))return!1}}return!0})}var vm=/[\u0590-\u08ac]/;function Mm(t,e,n){let{$head:r}=e.selection;if(!r.parent.isTextblock)return!1;let o=r.parentOffset,i=!o,s=o==r.parent.content.size,l=t.domSelection();return l?!vm.test(r.parent.textContent)||!l.modify?n=="left"||n=="backward"?i:s:id(t,e,()=>{let{focusNode:a,focusOffset:c,anchorNode:d,anchorOffset:u}=t.domSelectionRange(),f=l.caretBidiLevel;l.modify("move",n,"character");let h=r.depth?t.docView.domAfterPos(r.before()):t.dom,{focusNode:p,focusOffset:m}=t.domSelectionRange(),g=p&&!h.contains(p.nodeType==1?p:p.parentNode)||a==p&&c==m;try{l.collapse(d,u),a&&(a!=d||c!=u)&&l.extend&&l.extend(a,c)}catch{}return f!=null&&(l.caretBidiLevel=f),g}):r.pos==r.start()||r.pos==r.end()}var Sc=null,Cc=null,vc=!1;function Tm(t,e,n){return Sc==e&&Cc==n?vc:(Sc=e,Cc=n,vc=n=="up"||n=="down"?Cm(t,e,n):Mm(t,e,n))}var Le=0,Mc=1,Kt=2,Qe=3,Qt=class{constructor(e,n,r,o){this.parent=e,this.children=n,this.dom=r,this.contentDOM=o,this.dirty=Le,r.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,n,r){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let n=0;nfe(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))o=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(n==0)for(let i=e;;i=i.parentNode){if(i==this.dom){o=!1;break}if(i.previousSibling)break}if(o==null&&n==e.childNodes.length)for(let i=e;;i=i.parentNode){if(i==this.dom){o=!0;break}if(i.nextSibling)break}}return o??r>0?this.posAtEnd:this.posAtStart}nearestDesc(e,n=!1){for(let r=!0,o=e;o;o=o.parentNode){let i=this.getDesc(o),s;if(i&&(!n||i.node))if(r&&(s=i.nodeDOM)&&!(s.nodeType==1?s.contains(e.nodeType==1?e:e.parentNode):s==e))r=!1;else return i}}getDesc(e){let n=e.pmViewDesc;for(let r=n;r;r=r.parent)if(r==this)return n}posFromDOM(e,n,r){for(let o=e;o;o=o.parentNode){let i=this.getDesc(o);if(i)return i.localPosFromDOM(e,n,r)}return-1}descAt(e){for(let n=0,r=0;ne||s instanceof jr){o=e-i;break}i=l}if(o)return this.children[r].domFromPos(o-this.children[r].border,n);for(let i;r&&!(i=this.children[r-1]).size&&i instanceof _r&&i.side>=0;r--);if(n<=0){let i,s=!0;for(;i=r?this.children[r-1]:null,!(!i||i.dom.parentNode==this.contentDOM);r--,s=!1);return i&&n&&s&&!i.border&&!i.domAtom?i.domFromPos(i.size,n):{node:this.contentDOM,offset:i?fe(i.dom)+1:0}}else{let i,s=!0;for(;i=r=d&&n<=c-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(e,n,d);e=s;for(let u=l;u>0;u--){let f=this.children[u-1];if(f.size&&f.dom.parentNode==this.contentDOM&&!f.emptyChildAt(1)){o=fe(f.dom)+1;break}e-=f.size}o==-1&&(o=0)}if(o>-1&&(c>n||l==this.children.length-1)){n=c;for(let d=l+1;dp&&sn){let p=l;l=a,a=p}let h=document.createRange();h.setEnd(a.node,a.offset),h.setStart(l.node,l.offset),c.removeAllRanges(),c.addRange(h)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,n){for(let r=0,o=0;o=r:er){let l=r+i.border,a=s-i.border;if(e>=l&&n<=a){this.dirty=e==r||n==s?Kt:Mc,e==l&&n==a&&(i.contentLost||i.dom.parentNode!=this.contentDOM)?i.dirty=Qe:i.markDirty(e-l,n-l);return}else i.dirty=i.dom==i.contentDOM&&i.dom.parentNode==this.contentDOM&&!i.children.length?Kt:Qe}r=s}this.dirty=Kt}markParentsDirty(){let e=1;for(let n=this.parent;n;n=n.parent,e++){let r=e==1?Kt:Mc;n.dirty{if(!i)return o;if(i.parent)return i.parent.posBeforeChild(i)})),!n.type.spec.raw){if(s.nodeType!=1){let l=document.createElement("span");l.appendChild(s),s=l}s.contentEditable="false",s.classList.add("ProseMirror-widget")}super(e,[],s,null),this.widget=n,this.widget=n,i=this}matchesWidget(e){return this.dirty==Le&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let n=this.widget.spec.stopEvent;return n?n(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get ignoreForSelection(){return!!this.widget.type.spec.relaxedSide}get side(){return this.widget.type.side}},gs=class extends Qt{constructor(e,n,r,o){super(e,[],n,null),this.textDOM=r,this.text=o}get size(){return this.text.length}localPosFromDOM(e,n){return e!=this.textDOM?this.posAtStart+(n?this.size:0):this.posAtStart+n}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}},Mn=class t extends Qt{constructor(e,n,r,o,i){super(e,[],r,o),this.mark=n,this.spec=i}static create(e,n,r,o){let i=o.nodeViews[n.type.name],s=i&&i(n,o,r);return(!s||!s.dom)&&(s=ct.renderSpec(document,n.type.spec.toDOM(n,r),null,n.attrs)),new t(e,n,s.dom,s.contentDOM||s.dom,s)}parseRule(){return this.dirty&Qe||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=Qe&&this.mark.eq(e)}markDirty(e,n){if(super.markDirty(e,n),this.dirty!=Le){let r=this.parent;for(;!r.node;)r=r.parent;r.dirty0&&(i=xs(i,0,e,r));for(let l=0;l{if(!a)return s;if(a.parent)return a.parent.posBeforeChild(a)},r,o),d=c&&c.dom,u=c&&c.contentDOM;if(n.isText){if(!d)d=document.createTextNode(n.text);else if(d.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else d||({dom:d,contentDOM:u}=ct.renderSpec(document,n.type.spec.toDOM(n),null,n.attrs));!u&&!n.isText&&d.nodeName!="BR"&&(d.hasAttribute("contenteditable")||(d.contentEditable="false"),n.type.spec.draggable&&(d.draggable=!0));let f=d;return d=ad(d,r,n),c?a=new ys(e,n,r,o,d,u||null,f,c,i,s+1):n.isText?new Wr(e,n,r,o,d,f,i):new t(e,n,r,o,d,u||null,f,i,s+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(e.preserveWhitespace="full"),!this.contentDOM)e.getContent=()=>this.node.content;else if(!this.contentLost)e.contentElement=this.contentDOM;else{for(let n=this.children.length-1;n>=0;n--){let r=this.children[n];if(this.dom.contains(r.dom.parentNode)){e.contentElement=r.dom.parentNode;break}}e.contentElement||(e.getContent=()=>v.empty)}return e}matchesNode(e,n,r){return this.dirty==Le&&e.eq(this.node)&&Ur(n,this.outerDeco)&&r.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,n){let r=this.node.inlineContent,o=n,i=e.composing?this.localCompositionInfo(e,n):null,s=i&&i.pos>-1?i:null,l=i&&i.pos<0,a=new ws(this,s&&s.node,e);Om(this.node,this.innerDeco,(c,d,u)=>{c.spec.marks?a.syncToMarks(c.spec.marks,r,e):c.type.side>=0&&!u&&a.syncToMarks(d==this.node.childCount?J.none:this.node.child(d).marks,r,e),a.placeWidget(c,e,o)},(c,d,u,f)=>{a.syncToMarks(c.marks,r,e);let h;a.findNodeMatch(c,d,u,f)||l&&e.state.selection.from>o&&e.state.selection.to-1&&a.updateNodeAt(c,d,u,h,e)||a.updateNextNode(c,d,u,e,f,o)||a.addNode(c,d,u,e,o),o+=c.nodeSize}),a.syncToMarks([],r,e),this.node.isTextblock&&a.addTextblockHacks(),a.destroyRest(),(a.changed||this.dirty==Kt)&&(s&&this.protectLocalComposition(e,s),sd(this.contentDOM,this.children,e),vn&&Rm(this.dom))}localCompositionInfo(e,n){let{from:r,to:o}=e.state.selection;if(!(e.state.selection instanceof D)||rn+this.node.content.size)return null;let i=e.input.compositionNode;if(!i||!this.dom.contains(i.parentNode))return null;if(this.node.inlineContent){let s=i.nodeValue,l=Dm(this.node.content,s,r-n,o-n);return l<0?null:{node:i,pos:l,text:s}}else return{node:i,pos:-1,text:""}}protectLocalComposition(e,{node:n,pos:r,text:o}){if(this.getDesc(n))return;let i=n;for(;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=void 0)}let s=new gs(this,i,n,o);e.input.compositionNodes.push(s),this.children=xs(this.children,r,r+o.length,e,s)}update(e,n,r,o){return this.dirty==Qe||!e.sameMarkup(this.node)?!1:(this.updateInner(e,n,r,o),!0)}updateInner(e,n,r,o){this.updateOuterDeco(n),this.node=e,this.innerDeco=r,this.contentDOM&&this.updateChildren(o,this.posAtStart),this.dirty=Le}updateOuterDeco(e){if(Ur(e,this.outerDeco))return;let n=this.nodeDOM.nodeType!=1,r=this.dom;this.dom=ld(this.dom,this.nodeDOM,bs(this.outerDeco,this.node,n),bs(e,this.node,n)),this.dom!=r&&(r.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.nodeDOM.draggable=!0))}deselectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.nodeDOM.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}};function Tc(t,e,n,r,o){ad(r,e,t);let i=new Dt(void 0,t,e,n,r,r,r,o,0);return i.contentDOM&&i.updateChildren(o,0),i}var Wr=class t extends Dt{constructor(e,n,r,o,i,s,l){super(e,n,r,o,i,null,s,l,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,n,r,o){return this.dirty==Qe||this.dirty!=Le&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(n),(this.dirty!=Le||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,o.trackWrites==this.nodeDOM&&(o.trackWrites=null)),this.node=e,this.dirty=Le,!0)}inParent(){let e=this.parent.contentDOM;for(let n=this.nodeDOM;n;n=n.parentNode)if(n==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,n,r){return e==this.nodeDOM?this.posAtStart+Math.min(n,this.node.text.length):super.localPosFromDOM(e,n,r)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,n,r){let o=this.node.cut(e,n),i=document.createTextNode(o.text);return new t(this.parent,o,this.outerDeco,this.innerDeco,i,i,r)}markDirty(e,n){super.markDirty(e,n),this.dom!=this.nodeDOM&&(e==0||n==this.nodeDOM.nodeValue.length)&&(this.dirty=Qe)}get domAtom(){return!1}isText(e){return this.node.text==e}},jr=class extends Qt{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==Le&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}},ys=class extends Dt{constructor(e,n,r,o,i,s,l,a,c,d){super(e,n,r,o,i,s,l,c,d),this.spec=a}update(e,n,r,o){if(this.dirty==Qe)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let i=this.spec.update(e,n,r);return i&&this.updateInner(e,n,r,o),i}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,n,r,o)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,n,r,o){this.spec.setSelection?this.spec.setSelection(e,n,r.root):super.setSelection(e,n,r,o)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}};function sd(t,e,n){let r=t.firstChild,o=!1;for(let i=0;i>1,s=Math.min(i,e.length);for(;o-1)l>this.index&&(this.changed=!0,this.destroyBetween(this.index,l)),this.top=this.top.children[this.index];else{let a=Mn.create(this.top,e[i],n,r);this.top.children.splice(this.index,0,a),this.top=a,this.changed=!0}this.index=0,i++}}findNodeMatch(e,n,r,o){let i=-1,s;if(o>=this.preMatch.index&&(s=this.preMatch.matches[o-this.preMatch.index]).parent==this.top&&s.matchesNode(e,n,r))i=this.top.children.indexOf(s,this.index);else for(let l=this.index,a=Math.min(this.top.children.length,l+5);l0;){let l;for(;;)if(r){let c=n.children[r-1];if(c instanceof Mn)n=c,r=c.children.length;else{l=c,r--;break}}else{if(n==e)break e;r=n.parent.children.indexOf(n),n=n.parent}let a=l.node;if(a){if(a!=t.child(o-1))break;--o,i.set(l,o),s.push(l)}}return{index:o,matched:i,matches:s.reverse()}}function Nm(t,e){return t.type.side-e.type.side}function Om(t,e,n,r){let o=e.locals(t),i=0;if(o.length==0){for(let c=0;ci;)l.push(o[s++]);let p=i+f.nodeSize;if(f.isText){let g=p;s!g.inline):l.slice();r(f,m,e.forChild(i,f),h),i=p}}function Rm(t){if(t.nodeName=="UL"||t.nodeName=="OL"){let e=t.style.cssText;t.style.cssText=e+"; list-style: square !important",window.getComputedStyle(t).listStyle,t.style.cssText=e}}function Dm(t,e,n,r){for(let o=0,i=0;o=n){if(i>=r&&a.slice(r-e.length-l,r-l)==e)return r-e.length;let c=l=0&&c+e.length+l>=n)return l+c;if(n==r&&a.length>=r+e.length-l&&a.slice(r-l,r-l+e.length)==e)return r}}return-1}function xs(t,e,n,r,o){let i=[];for(let s=0,l=0;s=n||d<=e?i.push(a):(cn&&i.push(a.slice(n-c,a.size,r)))}return i}function Rs(t,e=null){let n=t.domSelectionRange(),r=t.state.doc;if(!n.focusNode)return null;let o=t.docView.nearestDesc(n.focusNode),i=o&&o.size==0,s=t.docView.posFromDOM(n.focusNode,n.focusOffset,1);if(s<0)return null;let l=r.resolve(s),a,c;if(Qr(n)){for(a=s;o&&!o.node;)o=o.parent;let u=o.node;if(o&&u.isAtom&&L.isSelectable(u)&&o.parent&&!(u.isInline&&am(n.focusNode,n.focusOffset,o.dom))){let f=o.posBefore;c=new L(s==f?l:r.resolve(f))}}else{if(n instanceof t.dom.ownerDocument.defaultView.Selection&&n.rangeCount>1){let u=s,f=s;for(let h=0;h{(n.anchorNode!=r||n.anchorOffset!=o)&&(e.removeEventListener("selectionchange",t.input.hideSelectionGuard),setTimeout(()=>{(!cd(t)||t.state.selection.visible)&&t.dom.classList.remove("ProseMirror-hideselection")},20))})}function Pm(t){let e=t.domSelection();if(!e)return;let n=t.cursorWrapper.dom,r=n.nodeName=="IMG";r?e.collapse(n.parentNode,fe(n)+1):e.collapse(n,0),!r&&!t.state.selection.visible&&ve&&Rt<=11&&(n.disabled=!0,n.disabled=!1)}function dd(t,e){if(e instanceof L){let n=t.docView.descAt(e.from);n!=t.lastSelectedViewDesc&&(Rc(t),n&&n.selectNode(),t.lastSelectedViewDesc=n)}else Rc(t)}function Rc(t){t.lastSelectedViewDesc&&(t.lastSelectedViewDesc.parent&&t.lastSelectedViewDesc.deselectNode(),t.lastSelectedViewDesc=void 0)}function Ds(t,e,n,r){return t.someProp("createSelectionBetween",o=>o(t,e,n))||D.between(e,n,r)}function Dc(t){return t.editable&&!t.hasFocus()?!1:ud(t)}function ud(t){let e=t.domSelectionRange();if(!e.anchorNode)return!1;try{return t.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(t.editable||t.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function Lm(t){let e=t.docView.domFromPos(t.state.selection.anchor,0),n=t.domSelectionRange();return Yt(e.node,e.offset,n.anchorNode,n.anchorOffset)}function ks(t,e){let{$anchor:n,$head:r}=t.selection,o=e>0?n.max(r):n.min(r),i=o.parent.inlineContent?o.depth?t.doc.resolve(e>0?o.after():o.before()):null:o;return i&&I.findFrom(i,e)}function Nt(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function Ic(t,e,n){let r=t.state.selection;if(r instanceof D)if(n.indexOf("s")>-1){let{$head:o}=r,i=o.textOffset?null:e<0?o.nodeBefore:o.nodeAfter;if(!i||i.isText||!i.isLeaf)return!1;let s=t.state.doc.resolve(o.pos+i.nodeSize*(e<0?-1:1));return Nt(t,new D(r.$anchor,s))}else if(r.empty){if(t.endOfTextblock(e>0?"forward":"backward")){let o=ks(t.state,e);return o&&o instanceof L?Nt(t,o):!1}else if(!(De&&n.indexOf("m")>-1)){let o=r.$head,i=o.textOffset?null:e<0?o.nodeBefore:o.nodeAfter,s;if(!i||i.isText)return!1;let l=e<0?o.pos-i.nodeSize:o.pos;return i.isAtom||(s=t.docView.descAt(l))&&!s.contentDOM?L.isSelectable(i)?Nt(t,new L(e<0?t.state.doc.resolve(o.pos-i.nodeSize):o)):rr?Nt(t,new D(t.state.doc.resolve(e<0?l:l+i.nodeSize))):!1:!1}}else return!1;else{if(r instanceof L&&r.node.isInline)return Nt(t,new D(e>0?r.$to:r.$from));{let o=ks(t.state,e);return o?Nt(t,o):!1}}}function Kr(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function Yn(t,e){let n=t.pmViewDesc;return n&&n.size==0&&(e<0||t.nextSibling||t.nodeName!="BR")}function xn(t,e){return e<0?Bm(t):zm(t)}function Bm(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let o,i,s=!1;for(Pe&&n.nodeType==1&&r0){if(n.nodeType!=1)break;{let l=n.childNodes[r-1];if(Yn(l,-1))o=n,i=--r;else if(l.nodeType==3)n=l,r=n.nodeValue.length;else break}}else{if(fd(n))break;{let l=n.previousSibling;for(;l&&Yn(l,-1);)o=n.parentNode,i=fe(l),l=l.previousSibling;if(l)n=l,r=Kr(n);else{if(n=n.parentNode,n==t.dom)break;r=0}}}s?Ss(t,n,r):o&&Ss(t,o,i)}function zm(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let o=Kr(n),i,s;for(;;)if(r{t.state==o&>(t)},50)}function Pc(t,e){let n=t.state.doc.resolve(e);if(!(de||Zc)&&n.parent.inlineContent){let o=t.coordsAtPos(e);if(e>n.start()){let i=t.coordsAtPos(e-1),s=(i.top+i.bottom)/2;if(s>o.top&&s1)return i.lefto.top&&s1)return i.left>o.left?"ltr":"rtl"}}return getComputedStyle(t.dom).direction=="rtl"?"rtl":"ltr"}function Lc(t,e,n){let r=t.state.selection;if(r instanceof D&&!r.empty||n.indexOf("s")>-1||De&&n.indexOf("m")>-1)return!1;let{$from:o,$to:i}=r;if(!o.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){let s=ks(t.state,e);if(s&&s instanceof L)return Nt(t,s)}if(!o.parent.inlineContent){let s=e<0?o:i,l=r instanceof ke?I.near(s,e):I.findFrom(s,e);return l?Nt(t,l):!1}return!1}function Bc(t,e){if(!(t.state.selection instanceof D))return!0;let{$head:n,$anchor:r,empty:o}=t.state.selection;if(!n.sameParent(r))return!0;if(!o)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;let i=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(i&&!i.isText){let s=t.state.tr;return e<0?s.delete(n.pos-i.nodeSize,n.pos):s.delete(n.pos,n.pos+i.nodeSize),t.dispatch(s),!0}return!1}function zc(t,e,n){t.domObserver.stop(),e.contentEditable=n,t.domObserver.start()}function Fm(t){if(!we||t.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:n}=t.domSelectionRange();if(e&&e.nodeType==1&&n==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let r=e.firstChild;zc(t,r,"true"),setTimeout(()=>zc(t,r,"false"),20)}return!1}function Vm(t){let e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}function _m(t,e){let n=e.keyCode,r=Vm(e);if(n==8||De&&n==72&&r=="c")return Bc(t,-1)||xn(t,-1);if(n==46&&!e.shiftKey||De&&n==68&&r=="c")return Bc(t,1)||xn(t,1);if(n==13||n==27)return!0;if(n==37||De&&n==66&&r=="c"){let o=n==37?Pc(t,t.state.selection.from)=="ltr"?-1:1:-1;return Ic(t,o,r)||xn(t,o)}else if(n==39||De&&n==70&&r=="c"){let o=n==39?Pc(t,t.state.selection.from)=="ltr"?1:-1:1;return Ic(t,o,r)||xn(t,o)}else{if(n==38||De&&n==80&&r=="c")return Lc(t,-1,r)||xn(t,-1);if(n==40||De&&n==78&&r=="c")return Fm(t)||Lc(t,1,r)||xn(t,1);if(r==(De?"m":"c")&&(n==66||n==73||n==89||n==90))return!0}return!1}function Is(t,e){t.someProp("transformCopied",h=>{e=h(e,t)});let n=[],{content:r,openStart:o,openEnd:i}=e;for(;o>1&&i>1&&r.childCount==1&&r.firstChild.childCount==1;){o--,i--;let h=r.firstChild;n.push(h.type.name,h.attrs!=h.type.defaultAttrs?h.attrs:null),r=h.content}let s=t.someProp("clipboardSerializer")||ct.fromSchema(t.state.schema),l=bd(),a=l.createElement("div");a.appendChild(s.serializeFragment(r,{document:l}));let c=a.firstChild,d,u=0;for(;c&&c.nodeType==1&&(d=yd[c.nodeName.toLowerCase()]);){for(let h=d.length-1;h>=0;h--){let p=l.createElement(d[h]);for(;a.firstChild;)p.appendChild(a.firstChild);a.appendChild(p),u++}c=a.firstChild}c&&c.nodeType==1&&c.setAttribute("data-pm-slice",`${o} ${i}${u?` -${u}`:""} ${JSON.stringify(n)}`);let f=t.someProp("clipboardTextSerializer",h=>h(e,t))||e.content.textBetween(0,e.content.size,` + +`);return{dom:a,text:f,slice:e}}function hd(t,e,n,r,o){let i=o.parent.type.spec.code,s,l;if(!n&&!e)return null;let a=!!e&&(r||i||!n);if(a){if(t.someProp("transformPastedText",f=>{e=f(e,i||r,t)}),i)return l=new E(v.from(t.state.schema.text(e.replace(/\r\n?/g,` +`))),0,0),t.someProp("transformPasted",f=>{l=f(l,t,!0)}),l;let u=t.someProp("clipboardTextParser",f=>f(e,o,r,t));if(u)l=u;else{let f=o.marks(),{schema:h}=t.state,p=ct.fromSchema(h);s=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(m=>{let g=s.appendChild(document.createElement("p"));m&&g.appendChild(p.serializeNode(h.text(m,f)))})}}else t.someProp("transformPastedHTML",u=>{n=u(n,t)}),s=Km(n),rr&&qm(s);let c=s&&s.querySelector("[data-pm-slice]"),d=c&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(c.getAttribute("data-pm-slice")||"");if(d&&d[3])for(let u=+d[3];u>0;u--){let f=s.firstChild;for(;f&&f.nodeType!=1;)f=f.nextSibling;if(!f)break;s=f}if(l||(l=(t.someProp("clipboardParser")||t.someProp("domParser")||Xe.fromSchema(t.state.schema)).parseSlice(s,{preserveWhitespace:!!(a||d),context:o,ruleFromNode(f){return f.nodeName=="BR"&&!f.nextSibling&&f.parentNode&&!Wm.test(f.parentNode.nodeName)?{ignore:!0}:null}})),d)l=Jm(Hc(l,+d[1],+d[2]),d[4]);else if(l=E.maxOpen(jm(l.content,o),!0),l.openStart||l.openEnd){let u=0,f=0;for(let h=l.content.firstChild;u{l=u(l,t,a)}),l}var Wm=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function jm(t,e){if(t.childCount<2)return t;for(let n=e.depth;n>=0;n--){let o=e.node(n).contentMatchAt(e.index(n)),i,s=[];if(t.forEach(l=>{if(!s)return;let a=o.findWrapping(l.type),c;if(!a)return s=null;if(c=s.length&&i.length&&md(a,i,l,s[s.length-1],0))s[s.length-1]=c;else{s.length&&(s[s.length-1]=gd(s[s.length-1],i.length));let d=pd(l,a);s.push(d),o=o.matchType(d.type),i=a}}),s)return v.from(s)}return t}function pd(t,e,n=0){for(let r=e.length-1;r>=n;r--)t=e[r].create(null,v.from(t));return t}function md(t,e,n,r,o){if(o1&&(i=0),o=n&&(l=e<0?s.contentMatchAt(0).fillBefore(l,i<=o).append(l):l.append(s.contentMatchAt(s.childCount).fillBefore(v.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(l))}function Hc(t,e,n){return en})),cs.createHTML(t)):t}function Km(t){let e=/^(\s*]*>)*/.exec(t);e&&(t=t.slice(e[0].length));let n=bd().createElement("div"),r=/<([a-z][^>\s]+)/i.exec(t),o;if((o=r&&yd[r[1].toLowerCase()])&&(t=o.map(i=>"<"+i+">").join("")+t+o.map(i=>"").reverse().join("")),n.innerHTML=Um(t),o)for(let i=0;i=0;l-=2){let a=n.nodes[r[l]];if(!a||a.hasRequiredAttrs())break;o=v.from(a.create(r[l+1],o)),i++,s++}return new E(o,i,s)}var Se={},Ce={},Gm={touchstart:!0,touchmove:!0},vs=class{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:"",button:0},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastChromeDelete=0,this.composing=!1,this.compositionNode=null,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}};function Xm(t){for(let e in Se){let n=Se[e];t.dom.addEventListener(e,t.input.eventHandlers[e]=r=>{Qm(t,r)&&!Ps(t,r)&&(t.editable||!(r.type in Ce))&&n(t,r)},Gm[e]?{passive:!0}:void 0)}we&&t.dom.addEventListener("input",()=>null),Ms(t)}function Ot(t,e){t.input.lastSelectionOrigin=e,t.input.lastSelectionTime=Date.now()}function Ym(t){t.domObserver.stop();for(let e in t.input.eventHandlers)t.dom.removeEventListener(e,t.input.eventHandlers[e]);clearTimeout(t.input.composingTimeout),clearTimeout(t.input.lastIOSEnterFallbackTimeout)}function Ms(t){t.someProp("handleDOMEvents",e=>{for(let n in e)t.input.eventHandlers[n]||t.dom.addEventListener(n,t.input.eventHandlers[n]=r=>Ps(t,r))})}function Ps(t,e){return t.someProp("handleDOMEvents",n=>{let r=n[e.type];return r?r(t,e)||e.defaultPrevented:!1})}function Qm(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let n=e.target;n!=t.dom;n=n.parentNode)if(!n||n.nodeType==11||n.pmViewDesc&&n.pmViewDesc.stopEvent(e))return!1;return!0}function Zm(t,e){!Ps(t,e)&&Se[e.type]&&(t.editable||!(e.type in Ce))&&Se[e.type](t,e)}Ce.keydown=(t,e)=>{let n=e;if(t.input.shiftKey=n.keyCode==16||n.shiftKey,!xd(t,n)&&(t.input.lastKeyCode=n.keyCode,t.input.lastKeyCodeTime=Date.now(),!(mt&&de&&n.keyCode==13)))if(n.keyCode!=229&&t.domObserver.forceFlush(),vn&&n.keyCode==13&&!n.ctrlKey&&!n.altKey&&!n.metaKey){let r=Date.now();t.input.lastIOSEnter=r,t.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{t.input.lastIOSEnter==r&&(t.someProp("handleKeyDown",o=>o(t,Ut(13,"Enter"))),t.input.lastIOSEnter=0)},200)}else t.someProp("handleKeyDown",r=>r(t,n))||_m(t,n)?n.preventDefault():Ot(t,"key")};Ce.keyup=(t,e)=>{e.keyCode==16&&(t.input.shiftKey=!1)};Ce.keypress=(t,e)=>{let n=e;if(xd(t,n)||!n.charCode||n.ctrlKey&&!n.altKey||De&&n.metaKey)return;if(t.someProp("handleKeyPress",o=>o(t,n))){n.preventDefault();return}let r=t.state.selection;if(!(r instanceof D)||!r.$from.sameParent(r.$to)){let o=String.fromCharCode(n.charCode),i=()=>t.state.tr.insertText(o).scrollIntoView();!/[\r\n]/.test(o)&&!t.someProp("handleTextInput",s=>s(t,r.$from.pos,r.$to.pos,o,i))&&t.dispatch(i()),n.preventDefault()}};function Zr(t){return{left:t.clientX,top:t.clientY}}function eg(t,e){let n=e.x-t.clientX,r=e.y-t.clientY;return n*n+r*r<100}function Ls(t,e,n,r,o){if(r==-1)return!1;let i=t.state.doc.resolve(r);for(let s=i.depth+1;s>0;s--)if(t.someProp(e,l=>s>i.depth?l(t,n,i.nodeAfter,i.before(s),o,!0):l(t,n,i.node(s),i.before(s),o,!1)))return!0;return!1}function Sn(t,e,n){if(t.focused||t.focus(),t.state.selection.eq(e))return;let r=t.state.tr.setSelection(e);n=="pointer"&&r.setMeta("pointer",!0),t.dispatch(r)}function tg(t,e){if(e==-1)return!1;let n=t.state.doc.resolve(e),r=n.nodeAfter;return r&&r.isAtom&&L.isSelectable(r)?(Sn(t,new L(n),"pointer"),!0):!1}function ng(t,e){if(e==-1)return!1;let n=t.state.selection,r,o;n instanceof L&&(r=n.node);let i=t.state.doc.resolve(e);for(let s=i.depth+1;s>0;s--){let l=s>i.depth?i.nodeAfter:i.node(s);if(L.isSelectable(l)){r&&n.$from.depth>0&&s>=n.$from.depth&&i.before(n.$from.depth+1)==n.$from.pos?o=i.before(n.$from.depth):o=i.before(s);break}}return o!=null?(Sn(t,L.create(t.state.doc,o),"pointer"),!0):!1}function rg(t,e,n,r,o){return Ls(t,"handleClickOn",e,n,r)||t.someProp("handleClick",i=>i(t,e,r))||(o?ng(t,n):tg(t,n))}function og(t,e,n,r){return Ls(t,"handleDoubleClickOn",e,n,r)||t.someProp("handleDoubleClick",o=>o(t,e,r))}function ig(t,e,n,r){return Ls(t,"handleTripleClickOn",e,n,r)||t.someProp("handleTripleClick",o=>o(t,e,r))||sg(t,n,r)}function sg(t,e,n){if(n.button!=0)return!1;let r=t.state.doc;if(e==-1)return r.inlineContent?(Sn(t,D.create(r,0,r.content.size),"pointer"),!0):!1;let o=r.resolve(e);for(let i=o.depth+1;i>0;i--){let s=i>o.depth?o.nodeAfter:o.node(i),l=o.before(i);if(s.inlineContent)Sn(t,D.create(r,l+1,l+1+s.content.size),"pointer");else if(L.isSelectable(s))Sn(t,L.create(r,l),"pointer");else continue;return!0}}function Bs(t){return qr(t)}var wd=De?"metaKey":"ctrlKey";Se.mousedown=(t,e)=>{let n=e;t.input.shiftKey=n.shiftKey;let r=Bs(t),o=Date.now(),i="singleClick";o-t.input.lastClick.time<500&&eg(n,t.input.lastClick)&&!n[wd]&&t.input.lastClick.button==n.button&&(t.input.lastClick.type=="singleClick"?i="doubleClick":t.input.lastClick.type=="doubleClick"&&(i="tripleClick")),t.input.lastClick={time:o,x:n.clientX,y:n.clientY,type:i,button:n.button};let s=t.posAtCoords(Zr(n));s&&(i=="singleClick"?(t.input.mouseDown&&t.input.mouseDown.done(),t.input.mouseDown=new Ts(t,s,n,!!r)):(i=="doubleClick"?og:ig)(t,s.pos,s.inside,n)?n.preventDefault():Ot(t,"pointer"))};var Ts=class{constructor(e,n,r,o){this.view=e,this.pos=n,this.event=r,this.flushed=o,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!r[wd],this.allowDefault=r.shiftKey;let i,s;if(n.inside>-1)i=e.state.doc.nodeAt(n.inside),s=n.inside;else{let d=e.state.doc.resolve(n.pos);i=d.parent,s=d.depth?d.before():0}let l=o?null:r.target,a=l?e.docView.nearestDesc(l,!0):null;this.target=a&&a.nodeDOM.nodeType==1?a.nodeDOM:null;let{selection:c}=e.state;(r.button==0&&i.type.spec.draggable&&i.type.spec.selectable!==!1||c instanceof L&&c.from<=s&&c.to>s)&&(this.mightDrag={node:i,pos:s,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&Pe&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),Ot(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>gt(this.view)),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let n=this.pos;this.view.state.doc!=this.startDoc&&(n=this.view.posAtCoords(Zr(e))),this.updateAllowDefault(e),this.allowDefault||!n?Ot(this.view,"pointer"):rg(this.view,n.pos,n.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||we&&this.mightDrag&&!this.mightDrag.node.isAtom||de&&!this.view.state.selection.visible&&Math.min(Math.abs(n.pos-this.view.state.selection.from),Math.abs(n.pos-this.view.state.selection.to))<=2)?(Sn(this.view,I.near(this.view.state.doc.resolve(n.pos)),"pointer"),e.preventDefault()):Ot(this.view,"pointer")}move(e){this.updateAllowDefault(e),Ot(this.view,"pointer"),e.buttons==0&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}};Se.touchstart=t=>{t.input.lastTouch=Date.now(),Bs(t),Ot(t,"pointer")};Se.touchmove=t=>{t.input.lastTouch=Date.now(),Ot(t,"pointer")};Se.contextmenu=t=>Bs(t);function xd(t,e){return t.composing?!0:we&&Math.abs(e.timeStamp-t.input.compositionEndedAt)<500?(t.input.compositionEndedAt=-2e8,!0):!1}var lg=mt?5e3:-1;Ce.compositionstart=Ce.compositionupdate=t=>{if(!t.composing){t.domObserver.flush();let{state:e}=t,n=e.selection.$to;if(e.selection instanceof D&&(e.storedMarks||!n.textOffset&&n.parentOffset&&n.nodeBefore.marks.some(r=>r.type.spec.inclusive===!1)||de&&Zc&&ag(t)))t.markCursor=t.state.storedMarks||n.marks(),qr(t,!0),t.markCursor=null;else if(qr(t,!e.selection.empty),Pe&&e.selection.empty&&n.parentOffset&&!n.textOffset&&n.nodeBefore.marks.length){let r=t.domSelectionRange();for(let o=r.focusNode,i=r.focusOffset;o&&o.nodeType==1&&i!=0;){let s=i<0?o.lastChild:o.childNodes[i-1];if(!s)break;if(s.nodeType==3){let l=t.domSelection();l&&l.collapse(s,s.nodeValue.length);break}else o=s,i=-1}}t.input.composing=!0}kd(t,lg)};function ag(t){let{focusNode:e,focusOffset:n}=t.domSelectionRange();if(!e||e.nodeType!=1||n>=e.childNodes.length)return!1;let r=e.childNodes[n];return r.nodeType==1&&r.contentEditable=="false"}Ce.compositionend=(t,e)=>{t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=e.timeStamp,t.input.compositionPendingChanges=t.domObserver.pendingRecords().length?t.input.compositionID:0,t.input.compositionNode=null,t.input.compositionPendingChanges&&Promise.resolve().then(()=>t.domObserver.flush()),t.input.compositionID++,kd(t,20))};function kd(t,e){clearTimeout(t.input.composingTimeout),e>-1&&(t.input.composingTimeout=setTimeout(()=>qr(t),e))}function Sd(t){for(t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=dg());t.input.compositionNodes.length>0;)t.input.compositionNodes.pop().markParentsDirty()}function cg(t){let e=t.domSelectionRange();if(!e.focusNode)return null;let n=sm(e.focusNode,e.focusOffset),r=lm(e.focusNode,e.focusOffset);if(n&&r&&n!=r){let o=r.pmViewDesc,i=t.domObserver.lastChangedTextNode;if(n==i||r==i)return i;if(!o||!o.isText(r.nodeValue))return r;if(t.input.compositionNode==r){let s=n.pmViewDesc;if(!(!s||!s.isText(n.nodeValue)))return r}}return n||r}function dg(){let t=document.createEvent("Event");return t.initEvent("event",!0,!0),t.timeStamp}function qr(t,e=!1){if(!(mt&&t.domObserver.flushingSoon>=0)){if(t.domObserver.forceFlush(),Sd(t),e||t.docView&&t.docView.dirty){let n=Rs(t),r=t.state.selection;return n&&!n.eq(r)?t.dispatch(t.state.tr.setSelection(n)):(t.markCursor||e)&&!r.$from.node(r.$from.sharedDepth(r.to)).inlineContent?t.dispatch(t.state.tr.deleteSelection()):t.updateState(t.state),!0}return!1}}function ug(t,e){if(!t.dom.parentNode)return;let n=t.dom.parentNode.appendChild(document.createElement("div"));n.appendChild(e),n.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),o=document.createRange();o.selectNodeContents(e),t.dom.blur(),r.removeAllRanges(),r.addRange(o),setTimeout(()=>{n.parentNode&&n.parentNode.removeChild(n),t.focus()},50)}var Qn=ve&&Rt<15||vn&&um<604;Se.copy=Ce.cut=(t,e)=>{let n=e,r=t.state.selection,o=n.type=="cut";if(r.empty)return;let i=Qn?null:n.clipboardData,s=r.content(),{dom:l,text:a}=Is(t,s);i?(n.preventDefault(),i.clearData(),i.setData("text/html",l.innerHTML),i.setData("text/plain",a)):ug(t,l),o&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function fg(t){return t.openStart==0&&t.openEnd==0&&t.content.childCount==1?t.content.firstChild:null}function hg(t,e){if(!t.dom.parentNode)return;let n=t.input.shiftKey||t.state.selection.$from.parent.type.spec.code,r=t.dom.parentNode.appendChild(document.createElement(n?"textarea":"div"));n||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let o=t.input.shiftKey&&t.input.lastKeyCode!=45;setTimeout(()=>{t.focus(),r.parentNode&&r.parentNode.removeChild(r),n?Zn(t,r.value,null,o,e):Zn(t,r.textContent,r.innerHTML,o,e)},50)}function Zn(t,e,n,r,o){let i=hd(t,e,n,r,t.state.selection.$from);if(t.someProp("handlePaste",a=>a(t,o,i||E.empty)))return!0;if(!i)return!1;let s=fg(i),l=s?t.state.tr.replaceSelectionWith(s,r):t.state.tr.replaceSelection(i);return t.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function Cd(t){let e=t.getData("text/plain")||t.getData("Text");if(e)return e;let n=t.getData("text/uri-list");return n?n.replace(/\r?\n/g," "):""}Ce.paste=(t,e)=>{let n=e;if(t.composing&&!mt)return;let r=Qn?null:n.clipboardData,o=t.input.shiftKey&&t.input.lastKeyCode!=45;r&&Zn(t,Cd(r),r.getData("text/html"),o,n)?n.preventDefault():hg(t,n)};var Jr=class{constructor(e,n,r){this.slice=e,this.move=n,this.node=r}},pg=De?"altKey":"ctrlKey";function vd(t,e){let n=t.someProp("dragCopies",r=>!r(e));return n??!e[pg]}Se.dragstart=(t,e)=>{let n=e,r=t.input.mouseDown;if(r&&r.done(),!n.dataTransfer)return;let o=t.state.selection,i=o.empty?null:t.posAtCoords(Zr(n)),s;if(!(i&&i.pos>=o.from&&i.pos<=(o instanceof L?o.to-1:o.to))){if(r&&r.mightDrag)s=L.create(t.state.doc,r.mightDrag.pos);else if(n.target&&n.target.nodeType==1){let u=t.docView.nearestDesc(n.target,!0);u&&u.node.type.spec.draggable&&u!=t.docView&&(s=L.create(t.state.doc,u.posBefore))}}let l=(s||t.state.selection).content(),{dom:a,text:c,slice:d}=Is(t,l);(!n.dataTransfer.files.length||!de||Qc>120)&&n.dataTransfer.clearData(),n.dataTransfer.setData(Qn?"Text":"text/html",a.innerHTML),n.dataTransfer.effectAllowed="copyMove",Qn||n.dataTransfer.setData("text/plain",c),t.dragging=new Jr(d,vd(t,n),s)};Se.dragend=t=>{let e=t.dragging;window.setTimeout(()=>{t.dragging==e&&(t.dragging=null)},50)};Ce.dragover=Ce.dragenter=(t,e)=>e.preventDefault();Ce.drop=(t,e)=>{try{mg(t,e,t.dragging)}finally{t.dragging=null}};function mg(t,e,n){if(!e.dataTransfer)return;let r=t.posAtCoords(Zr(e));if(!r)return;let o=t.state.doc.resolve(r.pos),i=n&&n.slice;i?t.someProp("transformPasted",h=>{i=h(i,t,!1)}):i=hd(t,Cd(e.dataTransfer),Qn?null:e.dataTransfer.getData("text/html"),!1,o);let s=!!(n&&vd(t,e));if(t.someProp("handleDrop",h=>h(t,e,i||E.empty,s))){e.preventDefault();return}if(!i)return;e.preventDefault();let l=i?zr(t.state.doc,o.pos,i):o.pos;l==null&&(l=o.pos);let a=t.state.tr;if(s){let{node:h}=n;h?h.replace(a):a.deleteSelection()}let c=a.mapping.map(l),d=i.openStart==0&&i.openEnd==0&&i.content.childCount==1,u=a.doc;if(d?a.replaceRangeWith(c,c,i.content.firstChild):a.replaceRange(c,c,i),a.doc.eq(u))return;let f=a.doc.resolve(c);if(d&&L.isSelectable(i.content.firstChild)&&f.nodeAfter&&f.nodeAfter.sameMarkup(i.content.firstChild))a.setSelection(new L(f));else{let h=a.mapping.map(l);a.mapping.maps[a.mapping.maps.length-1].forEach((p,m,g,y)=>h=y),a.setSelection(Ds(t,f,a.doc.resolve(h)))}t.focus(),t.dispatch(a.setMeta("uiEvent","drop"))}Se.focus=t=>{t.input.lastFocus=Date.now(),t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout(()=>{t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.domSelectionRange())&>(t)},20))};Se.blur=(t,e)=>{let n=e;t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),n.relatedTarget&&t.dom.contains(n.relatedTarget)&&t.domObserver.currentSelection.clear(),t.focused=!1)};Se.beforeinput=(t,e)=>{if(de&&mt&&e.inputType=="deleteContentBackward"){t.domObserver.flushSoon();let{domChangeCount:r}=t.input;setTimeout(()=>{if(t.input.domChangeCount!=r||(t.dom.blur(),t.focus(),t.someProp("handleKeyDown",i=>i(t,Ut(8,"Backspace")))))return;let{$cursor:o}=t.state.selection;o&&o.pos>0&&t.dispatch(t.state.tr.delete(o.pos-1,o.pos).scrollIntoView())},50)}};for(let t in Ce)Se[t]=Ce[t];function er(t,e){if(t==e)return!0;for(let n in t)if(t[n]!==e[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}var Gr=class t{constructor(e,n){this.toDOM=e,this.spec=n||Gt,this.side=this.spec.side||0}map(e,n,r,o){let{pos:i,deleted:s}=e.mapResult(n.from+o,this.side<0?-1:1);return s?null:new te(i-r,i-r,this)}valid(){return!0}eq(e){return this==e||e instanceof t&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&er(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}},Jt=class t{constructor(e,n){this.attrs=e,this.spec=n||Gt}map(e,n,r,o){let i=e.map(n.from+o,this.spec.inclusiveStart?-1:1)-r,s=e.map(n.to+o,this.spec.inclusiveEnd?1:-1)-r;return i>=s?null:new te(i,s,this)}valid(e,n){return n.from=e&&(!i||i(l.spec))&&r.push(l.copy(l.from+o,l.to+o))}for(let s=0;se){let l=this.children[s]+1;this.children[s+2].findInner(e-l,n-l,r,o+l,i)}}map(e,n,r){return this==be||e.maps.length==0?this:this.mapInner(e,n,0,0,r||Gt)}mapInner(e,n,r,o,i){let s;for(let l=0;l{let c=a+r,d;if(d=Td(n,l,c)){for(o||(o=this.children.slice());il&&u.to=e){this.children[l]==e&&(r=this.children[l+2]);break}let i=e+1,s=i+n.content.size;for(let l=0;li&&a.type instanceof Jt){let c=Math.max(i,a.from)-i,d=Math.min(s,a.to)-i;co.map(e,n,Gt));return t.from(r)}forChild(e,n){if(n.isLeaf)return Y.empty;let r=[];for(let o=0;on instanceof Y)?e:e.reduce((n,r)=>n.concat(r instanceof Y?r:r.members),[]))}}forEachSet(e){for(let n=0;n{let g=m-p-(h-f);for(let y=0;yw+d-u)continue;let b=l[y]+d-u;h>=b?l[y+1]=f<=b?-2:-1:f>=d&&g&&(l[y]+=g,l[y+1]+=g)}u+=g}),d=n.maps[c].map(d,-1)}let a=!1;for(let c=0;c=r.content.size){a=!0;continue}let f=n.map(t[c+1]+i,-1),h=f-o,{index:p,offset:m}=r.content.findIndex(u),g=r.maybeChild(p);if(g&&m==u&&m+g.nodeSize==h){let y=l[c+2].mapInner(n,g,d+1,t[c]+i+1,s);y!=be?(l[c]=u,l[c+1]=h,l[c+2]=y):(l[c+1]=-2,a=!0)}else a=!0}if(a){let c=yg(l,t,e,n,o,i,s),d=Yr(c,r,0,s);e=d.local;for(let u=0;un&&s.to{let c=Td(t,l,a+n);if(c){i=!0;let d=Yr(c,l,n+a+1,r);d!=be&&o.push(a,a+l.nodeSize,d)}});let s=Md(i?Ad(t):t,-n).sort(Xt);for(let l=0;l0;)e++;t.splice(e,0,n)}function ds(t){let e=[];return t.someProp("decorations",n=>{let r=n(t.state);r&&r!=be&&e.push(r)}),t.cursorWrapper&&e.push(Y.create(t.state.doc,[t.cursorWrapper.deco])),Xr.from(e)}var bg={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},wg=ve&&Rt<=11,Es=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}},Ns=class{constructor(e,n){this.view=e,this.handleDOMChange=n,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new Es,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver(r=>{for(let o=0;oo.type=="childList"&&o.removedNodes.length||o.type=="characterData"&&o.oldValue.length>o.target.nodeValue.length)?this.flushSoon():this.flush()}),wg&&(this.onCharData=r=>{this.queue.push({target:r.target,type:"characterData",oldValue:r.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,bg)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let n=0;nthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(Dc(this.view)){if(this.suppressingSelectionUpdates)return gt(this.view);if(ve&&Rt<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&Yt(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let n=new Set,r;for(let i=e.focusNode;i;i=Cn(i))n.add(i);for(let i=e.anchorNode;i;i=Cn(i))if(n.has(i)){r=i;break}let o=r&&this.view.docView.nearestDesc(r);if(o&&o.ignoreMutation({type:"selection",target:r.nodeType==3?r.parentNode:r}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let n=this.pendingRecords();n.length&&(this.queue=[]);let r=e.domSelectionRange(),o=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(r)&&Dc(e)&&!this.ignoreSelectionChange(r),i=-1,s=-1,l=!1,a=[];if(e.editable)for(let d=0;du.nodeName=="BR");if(d.length==2){let[u,f]=d;u.parentNode&&u.parentNode.parentNode==f.parentNode?f.remove():u.remove()}else{let{focusNode:u}=this.currentSelection;for(let f of d){let h=f.parentNode;h&&h.nodeName=="LI"&&(!u||Sg(e,u)!=h)&&f.remove()}}}else if((de||we)&&a.some(d=>d.nodeName=="BR")&&(e.input.lastKeyCode==8||e.input.lastKeyCode==46)){for(let d of a)if(d.nodeName=="BR"&&d.parentNode){let u=d.nextSibling;u&&u.nodeType==1&&u.contentEditable=="false"&&d.parentNode.removeChild(d)}}let c=null;i<0&&o&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||o)&&(i>-1&&(e.docView.markDirty(i,s),xg(e)),this.handleDOMChange(i,s,l,a),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(r)||gt(e),this.currentSelection.set(r))}registerMutation(e,n){if(n.indexOf(e.target)>-1)return null;let r=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(r==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!r||r.ignoreMutation(e))return null;if(e.type=="childList"){for(let d=0;do;g--){let y=r.childNodes[g-1],w=y.pmViewDesc;if(y.nodeName=="BR"&&!w){i=g;break}if(!w||w.size)break}let u=t.state.doc,f=t.someProp("domParser")||Xe.fromSchema(t.state.schema),h=u.resolve(s),p=null,m=f.parse(r,{topNode:h.parent,topMatch:h.parent.contentMatchAt(h.index()),topOpen:!0,from:o,to:i,preserveWhitespace:h.parent.type.whitespace=="pre"?"full":!0,findPositions:c,ruleFromNode:vg,context:h});if(c&&c[0].pos!=null){let g=c[0].pos,y=c[1]&&c[1].pos;y==null&&(y=g),p={anchor:g+s,head:y+s}}return{doc:m,sel:p,from:s,to:l}}function vg(t){let e=t.pmViewDesc;if(e)return e.parseRule();if(t.nodeName=="BR"&&t.parentNode){if(we&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){let n=document.createElement("div");return n.appendChild(document.createElement("li")),{skip:n}}else if(t.parentNode.lastChild==t||we&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if(t.nodeName=="IMG"&&t.getAttribute("mark-placeholder"))return{ignore:!0};return null}var Mg=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function Tg(t,e,n,r,o){let i=t.input.compositionPendingChanges||(t.composing?t.input.compositionID:0);if(t.input.compositionPendingChanges=0,e<0){let k=t.input.lastSelectionTime>Date.now()-50?t.input.lastSelectionOrigin:null,O=Rs(t,k);if(O&&!t.state.selection.eq(O)){if(de&&mt&&t.input.lastKeyCode===13&&Date.now()-100A(t,Ut(13,"Enter"))))return;let T=t.state.tr.setSelection(O);k=="pointer"?T.setMeta("pointer",!0):k=="key"&&T.scrollIntoView(),i&&T.setMeta("composition",i),t.dispatch(T)}return}let s=t.state.doc.resolve(e),l=s.sharedDepth(n);e=s.before(l+1),n=t.state.doc.resolve(n).after(l+1);let a=t.state.selection,c=Cg(t,e,n),d=t.state.doc,u=d.slice(c.from,c.to),f,h;t.input.lastKeyCode===8&&Date.now()-100Date.now()-225||mt)&&o.some(k=>k.nodeType==1&&!Mg.test(k.nodeName))&&(!p||p.endA>=p.endB)&&t.someProp("handleKeyDown",k=>k(t,Ut(13,"Enter")))){t.input.lastIOSEnter=0;return}if(!p)if(r&&a instanceof D&&!a.empty&&a.$head.sameParent(a.$anchor)&&!t.composing&&!(c.sel&&c.sel.anchor!=c.sel.head))p={start:a.from,endA:a.to,endB:a.to};else{if(c.sel){let k=jc(t,t.state.doc,c.sel);if(k&&!k.eq(t.state.selection)){let O=t.state.tr.setSelection(k);i&&O.setMeta("composition",i),t.dispatch(O)}}return}t.state.selection.fromt.state.selection.from&&p.start<=t.state.selection.from+2&&t.state.selection.from>=c.from?p.start=t.state.selection.from:p.endA=t.state.selection.to-2&&t.state.selection.to<=c.to&&(p.endB+=t.state.selection.to-p.endA,p.endA=t.state.selection.to)),ve&&Rt<=11&&p.endB==p.start+1&&p.endA==p.start&&p.start>c.from&&c.doc.textBetween(p.start-c.from-1,p.start-c.from+1)==" \xA0"&&(p.start--,p.endA--,p.endB--);let m=c.doc.resolveNoCache(p.start-c.from),g=c.doc.resolveNoCache(p.endB-c.from),y=d.resolve(p.start),w=m.sameParent(g)&&m.parent.inlineContent&&y.end()>=p.endA;if((vn&&t.input.lastIOSEnter>Date.now()-225&&(!w||o.some(k=>k.nodeName=="DIV"||k.nodeName=="P"))||!w&&m.posk(t,Ut(13,"Enter")))){t.input.lastIOSEnter=0;return}if(t.state.selection.anchor>p.start&&Eg(d,p.start,p.endA,m,g)&&t.someProp("handleKeyDown",k=>k(t,Ut(8,"Backspace")))){mt&&de&&t.domObserver.suppressSelectionUpdates();return}de&&p.endB==p.start&&(t.input.lastChromeDelete=Date.now()),mt&&!w&&m.start()!=g.start()&&g.parentOffset==0&&m.depth==g.depth&&c.sel&&c.sel.anchor==c.sel.head&&c.sel.head==p.endA&&(p.endB-=2,g=c.doc.resolveNoCache(p.endB-c.from),setTimeout(()=>{t.someProp("handleKeyDown",function(k){return k(t,Ut(13,"Enter"))})},20));let b=p.start,C=p.endA,x=k=>{let O=k||t.state.tr.replace(b,C,c.doc.slice(p.start-c.from,p.endB-c.from));if(c.sel){let T=jc(t,O.doc,c.sel);T&&!(de&&t.composing&&T.empty&&(p.start!=p.endB||t.input.lastChromeDeletegt(t),20));let k=x(t.state.tr.delete(b,C)),O=d.resolve(p.start).marksAcross(d.resolve(p.endA));O&&k.ensureMarks(O),t.dispatch(k)}else if(p.endA==p.endB&&(S=Ag(m.parent.content.cut(m.parentOffset,g.parentOffset),y.parent.content.cut(y.parentOffset,p.endA-y.start())))){let k=x(t.state.tr);S.type=="add"?k.addMark(b,C,S.mark):k.removeMark(b,C,S.mark),t.dispatch(k)}else if(m.parent.child(m.index()).isText&&m.index()==g.index()-(g.textOffset?0:1)){let k=m.parent.textBetween(m.parentOffset,g.parentOffset),O=()=>x(t.state.tr.insertText(k,b,C));t.someProp("handleTextInput",T=>T(t,b,C,k,O))||t.dispatch(O())}else t.dispatch(x());else t.dispatch(x())}function jc(t,e,n){return Math.max(n.anchor,n.head)>e.content.size?null:Ds(t,e.resolve(n.anchor),e.resolve(n.head))}function Ag(t,e){let n=t.firstChild.marks,r=e.firstChild.marks,o=n,i=r,s,l,a;for(let d=0;dd.mark(l.addToSet(d.marks));else if(o.length==0&&i.length==1)l=i[0],s="remove",a=d=>d.mark(l.removeFromSet(d.marks));else return null;let c=[];for(let d=0;dn||us(s,!0,!1)0&&(e||t.indexAfter(r)==t.node(r).childCount);)r--,o++,e=!1;if(n){let i=t.node(r).maybeChild(t.indexAfter(r));for(;i&&!i.isLeaf;)i=i.firstChild,o++}return o}function Ng(t,e,n,r,o){let i=t.findDiffStart(e,n);if(i==null)return null;let{a:s,b:l}=t.findDiffEnd(e,n+t.size,n+e.size);if(o=="end"){let a=Math.max(0,i-Math.min(s,l));r-=s+a-i}if(s=s?i-r:0;i-=a,i&&i=l?i-r:0;i-=a,i&&i=56320&&e<=57343&&n>=55296&&n<=56319}var tr=class{constructor(e,n){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new vs,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=n,this.state=n.state,this.directPlugins=n.plugins||[],this.directPlugins.forEach(Xc),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=Jc(this),qc(this),this.nodeViews=Gc(this),this.docView=Tc(this.state.doc,Kc(this),ds(this),this.dom,this),this.domObserver=new Ns(this,(r,o,i,s)=>Tg(this,r,o,i,s)),this.domObserver.start(),Xm(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let n in e)this._props[n]=e[n];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&Ms(this);let n=this._props;this._props=e,e.plugins&&(e.plugins.forEach(Xc),this.directPlugins=e.plugins),this.updateStateInner(e.state,n)}setProps(e){let n={};for(let r in this._props)n[r]=this._props[r];n.state=this.state;for(let r in e)n[r]=e[r];this.update(n)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,n){var r;let o=this.state,i=!1,s=!1;e.storedMarks&&this.composing&&(Sd(this),s=!0),this.state=e;let l=o.plugins!=e.plugins||this._props.plugins!=n.plugins;if(l||this._props.plugins!=n.plugins||this._props.nodeViews!=n.nodeViews){let h=Gc(this);Rg(h,this.nodeViews)&&(this.nodeViews=h,i=!0)}(l||n.handleDOMEvents!=this._props.handleDOMEvents)&&Ms(this),this.editable=Jc(this),qc(this);let a=ds(this),c=Kc(this),d=o.plugins!=e.plugins&&!o.doc.eq(e.doc)?"reset":e.scrollToSelection>o.scrollToSelection?"to selection":"preserve",u=i||!this.docView.matchesNode(e.doc,c,a);(u||!e.selection.eq(o.selection))&&(s=!0);let f=d=="preserve"&&s&&this.dom.style.overflowAnchor==null&&pm(this);if(s){this.domObserver.stop();let h=u&&(ve||de)&&!this.composing&&!o.selection.empty&&!e.selection.empty&&Og(o.selection,e.selection);if(u){let p=de?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=cg(this)),(i||!this.docView.update(e.doc,c,a,this))&&(this.docView.updateOuterDeco(c),this.docView.destroy(),this.docView=Tc(e.doc,c,a,this.dom,this)),p&&!this.trackWrites&&(h=!0)}h||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&Lm(this))?gt(this,h):(dd(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(o),!((r=this.dragging)===null||r===void 0)&&r.node&&!o.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,o),d=="reset"?this.dom.scrollTop=0:d=="to selection"?this.scrollToSelection():f&&mm(f)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!(!e||!this.dom.contains(e.nodeType==1?e:e.parentNode))){if(!this.someProp("handleScrollToSelection",n=>n(this)))if(this.state.selection instanceof L){let n=this.docView.domAfterPos(this.state.selection.from);n.nodeType==1&&xc(this,n.getBoundingClientRect(),e)}else xc(this,this.coordsAtPos(this.state.selection.head,1),e)}}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let n=0;n0&&this.state.doc.nodeAt(i))==r.node&&(o=i)}this.dragging=new Jr(e.slice,e.move,o<0?void 0:L.create(this.state.doc,o))}someProp(e,n){let r=this._props&&this._props[e],o;if(r!=null&&(o=n?n(r):r))return o;for(let s=0;sn.ownerDocument.getSelection()),this._root=n}return e||document}updateRoot(){this._root=null}posAtCoords(e){return km(this,e)}coordsAtPos(e,n=1){return od(this,e,n)}domAtPos(e,n=0){return this.docView.domFromPos(e,n)}nodeDOM(e){let n=this.docView.descAt(e);return n?n.nodeDOM:null}posAtDOM(e,n,r=-1){let o=this.docView.posFromDOM(e,n,r);if(o==null)throw new RangeError("DOM position not inside the editor");return o}endOfTextblock(e,n){return Tm(this,n||this.state,e)}pasteHTML(e,n){return Zn(this,"",e,!1,n||new ClipboardEvent("paste"))}pasteText(e,n){return Zn(this,e,null,!0,n||new ClipboardEvent("paste"))}serializeForClipboard(e){return Is(this,e)}destroy(){this.docView&&(Ym(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],ds(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,om())}get isDestroyed(){return this.docView==null}dispatchEvent(e){return Zm(this,e)}domSelectionRange(){let e=this.domSelection();return e?we&&this.root.nodeType===11&&cm(this.dom.ownerDocument)==this.dom&&kg(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}};tr.prototype.dispatch=function(t){let e=this._props.dispatchTransaction;e?e.call(this,t):this.updateState(this.state.apply(t))};function Kc(t){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(t.editable),t.someProp("attributes",n=>{if(typeof n=="function"&&(n=n(t.state)),n)for(let r in n)r=="class"?e.class+=" "+n[r]:r=="style"?e.style=(e.style?e.style+";":"")+n[r]:!e[r]&&r!="contenteditable"&&r!="nodeName"&&(e[r]=String(n[r]))}),e.translate||(e.translate="no"),[te.node(0,t.state.doc.content.size,e)]}function qc(t){if(t.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),t.cursorWrapper={dom:e,deco:te.widget(t.state.selection.from,e,{raw:!0,marks:t.markCursor})}}else t.cursorWrapper=null}function Jc(t){return!t.someProp("editable",e=>e(t.state)===!1)}function Og(t,e){let n=Math.min(t.$anchor.sharedDepth(t.head),e.$anchor.sharedDepth(e.head));return t.$anchor.start(n)!=e.$anchor.start(n)}function Gc(t){let e=Object.create(null);function n(r){for(let o in r)Object.prototype.hasOwnProperty.call(e,o)||(e[o]=r[o])}return t.someProp("nodeViews",n),t.someProp("markViews",n),e}function Rg(t,e){let n=0,r=0;for(let o in t){if(t[o]!=e[o])return!0;n++}for(let o in e)r++;return n!=r}function Xc(t){if(t.spec.state||t.spec.filterTransaction||t.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var yt={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},to={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Dg=typeof navigator<"u"&&/Mac/.test(navigator.platform),Ig=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(le=0;le<10;le++)yt[48+le]=yt[96+le]=String(le);var le;for(le=1;le<=24;le++)yt[le+111]="F"+le;var le;for(le=65;le<=90;le++)yt[le]=String.fromCharCode(le+32),to[le]=String.fromCharCode(le);var le;for(eo in yt)to.hasOwnProperty(eo)||(to[eo]=yt[eo]);var eo;function Ed(t){var e=Dg&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||Ig&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",n=!e&&t.key||(t.shiftKey?to:yt)[t.keyCode]||t.key||"Unidentified";return n=="Esc"&&(n="Escape"),n=="Del"&&(n="Delete"),n=="Left"&&(n="ArrowLeft"),n=="Up"&&(n="ArrowUp"),n=="Right"&&(n="ArrowRight"),n=="Down"&&(n="ArrowDown"),n}var Pg=typeof navigator<"u"&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),Lg=typeof navigator<"u"&&/Win/.test(navigator.platform);function Bg(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n=="Space"&&(n=" ");let r,o,i,s;for(let l=0;l{for(var n in e)Hg(t,n,{get:e[n],enumerable:!0})};function co(t){let{state:e,transaction:n}=t,{selection:r}=n,{doc:o}=n,{storedMarks:i}=n;return{...e,apply:e.apply.bind(e),applyTransaction:e.applyTransaction.bind(e),plugins:e.plugins,schema:e.schema,reconfigure:e.reconfigure.bind(e),toJSON:e.toJSON.bind(e),get storedMarks(){return i},get selection(){return r},get doc(){return o},get tr(){return r=n.selection,o=n.doc,i=n.storedMarks,n}}}var uo=class{constructor(t){this.editor=t.editor,this.rawCommands=this.editor.extensionManager.commands,this.customState=t.state}get hasCustomState(){return!!this.customState}get state(){return this.customState||this.editor.state}get commands(){let{rawCommands:t,editor:e,state:n}=this,{view:r}=e,{tr:o}=n,i=this.buildProps(o);return Object.fromEntries(Object.entries(t).map(([s,l])=>[s,(...c)=>{let d=l(...c)(i);return!o.getMeta("preventDispatch")&&!this.hasCustomState&&r.dispatch(o),d}]))}get chain(){return()=>this.createChain()}get can(){return()=>this.createCan()}createChain(t,e=!0){let{rawCommands:n,editor:r,state:o}=this,{view:i}=r,s=[],l=!!t,a=t||o.tr,c=()=>(!l&&e&&!a.getMeta("preventDispatch")&&!this.hasCustomState&&i.dispatch(a),s.every(u=>u===!0)),d={...Object.fromEntries(Object.entries(n).map(([u,f])=>[u,(...p)=>{let m=this.buildProps(a,e),g=f(...p)(m);return s.push(g),d}])),run:c};return d}createCan(t){let{rawCommands:e,state:n}=this,r=!1,o=t||n.tr,i=this.buildProps(o,r);return{...Object.fromEntries(Object.entries(e).map(([l,a])=>[l,(...c)=>a(...c)({...i,dispatch:void 0})])),chain:()=>this.createChain(o,r)}}buildProps(t,e=!0){let{rawCommands:n,editor:r,state:o}=this,{view:i}=r,s={tr:t,editor:r,view:i,state:co({state:o,transaction:t}),dispatch:e?()=>{}:void 0,chain:()=>this.createChain(t,e),can:()=>this.createCan(t),get commands(){return Object.fromEntries(Object.entries(n).map(([l,a])=>[l,(...c)=>a(...c)(s)]))}};return s}},Hd={};js(Hd,{blur:()=>$g,clearContent:()=>Fg,clearNodes:()=>Vg,command:()=>_g,createParagraphNear:()=>Wg,cut:()=>jg,deleteCurrentNode:()=>Ug,deleteNode:()=>Kg,deleteRange:()=>qg,deleteSelection:()=>Jg,enter:()=>Gg,exitCode:()=>Xg,extendMarkRange:()=>Yg,first:()=>Qg,focus:()=>ey,forEach:()=>ty,insertContent:()=>ny,insertContentAt:()=>iy,joinBackward:()=>ay,joinDown:()=>ly,joinForward:()=>cy,joinItemBackward:()=>dy,joinItemForward:()=>uy,joinTextblockBackward:()=>fy,joinTextblockForward:()=>hy,joinUp:()=>sy,keyboardShortcut:()=>my,lift:()=>gy,liftEmptyBlock:()=>yy,liftListItem:()=>by,newlineInCode:()=>wy,resetAttributes:()=>xy,scrollIntoView:()=>ky,selectAll:()=>Sy,selectNodeBackward:()=>Cy,selectNodeForward:()=>vy,selectParentNode:()=>My,selectTextblockEnd:()=>Ty,selectTextblockStart:()=>Ay,setContent:()=>Ey,setMark:()=>Vy,setMeta:()=>_y,setNode:()=>Wy,setNodeSelection:()=>jy,setTextDirection:()=>Uy,setTextSelection:()=>Ky,sinkListItem:()=>qy,splitBlock:()=>Jy,splitListItem:()=>Gy,toggleList:()=>Xy,toggleMark:()=>Yy,toggleNode:()=>Qy,toggleWrap:()=>Zy,undoInputRule:()=>eb,unsetAllMarks:()=>tb,unsetMark:()=>nb,unsetTextDirection:()=>rb,updateAttributes:()=>ob,wrapIn:()=>ib,wrapInList:()=>sb});var $g=()=>({editor:t,view:e})=>(requestAnimationFrame(()=>{var n;t.isDestroyed||(e.dom.blur(),(n=window?.getSelection())==null||n.removeAllRanges())}),!0),Fg=(t=!0)=>({commands:e})=>e.setContent("",{emitUpdate:t}),Vg=()=>({state:t,tr:e,dispatch:n})=>{let{selection:r}=e,{ranges:o}=r;return n&&o.forEach(({$from:i,$to:s})=>{t.doc.nodesBetween(i.pos,s.pos,(l,a)=>{if(l.type.isText)return;let{doc:c,mapping:d}=e,u=c.resolve(d.map(a)),f=c.resolve(d.map(a+l.nodeSize)),h=u.blockRange(f);if(!h)return;let p=ft(h);if(l.type.isTextblock){let{defaultType:m}=u.parent.contentMatchAt(u.index());e.setNodeMarkup(h.start,m)}(p||p===0)&&e.lift(h,p)})}),!0},_g=t=>e=>t(e),Wg=()=>({state:t,dispatch:e})=>es(t,e),jg=(t,e)=>({editor:n,tr:r})=>{let{state:o}=n,i=o.doc.slice(t.from,t.to);r.deleteRange(t.from,t.to);let s=r.mapping.map(e);return r.insert(s,i.content),r.setSelection(new D(r.doc.resolve(Math.max(s-1,0)))),!0},Ug=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,r=n.$anchor.node();if(r.content.size>0)return!1;let o=t.selection.$anchor;for(let i=o.depth;i>0;i-=1)if(o.node(i).type===r.type){if(e){let l=o.before(i),a=o.after(i);t.delete(l,a).scrollIntoView()}return!0}return!1};function ne(t,e){if(typeof t=="string"){if(!e.nodes[t])throw Error(`There is no node type named '${t}'. Maybe you forgot to add the extension?`);return e.nodes[t]}return t}var Kg=t=>({tr:e,state:n,dispatch:r})=>{let o=ne(t,n.schema),i=e.selection.$anchor;for(let s=i.depth;s>0;s-=1)if(i.node(s).type===o){if(r){let a=i.before(s),c=i.after(s);e.delete(a,c).scrollIntoView()}return!0}return!1},qg=t=>({tr:e,dispatch:n})=>{let{from:r,to:o}=t;return n&&e.delete(r,o),!0},Jg=()=>({state:t,dispatch:e})=>Vr(t,e),Gg=()=>({commands:t})=>t.keyboardShortcut("Enter"),Xg=()=>({state:t,dispatch:e})=>Zi(t,e);function Us(t){return Object.prototype.toString.call(t)==="[object RegExp]"}function lo(t,e,n={strict:!0}){let r=Object.keys(e);return r.length?r.every(o=>n.strict?e[o]===t[o]:Us(e[o])?e[o].test(t[o]):e[o]===t[o]):!0}function $d(t,e,n={}){return t.find(r=>r.type===e&&lo(Object.fromEntries(Object.keys(n).map(o=>[o,r.attrs[o]])),n))}function Od(t,e,n={}){return!!$d(t,e,n)}function Ks(t,e,n){var r;if(!t||!e)return;let o=t.parent.childAfter(t.parentOffset);if((!o.node||!o.node.marks.some(d=>d.type===e))&&(o=t.parent.childBefore(t.parentOffset)),!o.node||!o.node.marks.some(d=>d.type===e)||(n=n||((r=o.node.marks[0])==null?void 0:r.attrs),!$d([...o.node.marks],e,n)))return;let s=o.index,l=t.start()+o.offset,a=s+1,c=l+o.node.nodeSize;for(;s>0&&Od([...t.parent.child(s-1).marks],e,n);)s-=1,l-=t.parent.child(s).nodeSize;for(;a({tr:n,state:r,dispatch:o})=>{let i=wt(t,r.schema),{doc:s,selection:l}=n,{$from:a,from:c,to:d}=l;if(o){let u=Ks(a,i,e);if(u&&u.from<=c&&u.to>=d){let f=D.create(s,u.from,u.to);n.setSelection(f)}}return!0},Qg=t=>e=>{let n=typeof t=="function"?t(e):t;for(let r=0;r({editor:n,view:r,tr:o,dispatch:i})=>{e={scrollIntoView:!0,...e};let s=()=>{(qs()||Zg())&&r.dom.focus(),requestAnimationFrame(()=>{n.isDestroyed||(r.focus(),e?.scrollIntoView&&n.commands.scrollIntoView())})};if(r.hasFocus()&&t===null||t===!1)return!0;if(i&&t===null&&!fo(n.state.selection))return s(),!0;let l=Fd(o.doc,t)||n.state.selection,a=n.state.selection.eq(l);return i&&(a||o.setSelection(l),a&&o.storedMarks&&o.setStoredMarks(o.storedMarks),s()),!0},ty=(t,e)=>n=>t.every((r,o)=>e(r,{...n,index:o})),ny=(t,e)=>({tr:n,commands:r})=>r.insertContentAt({from:n.selection.from,to:n.selection.to},t,e),Vd=t=>{let e=t.childNodes;for(let n=e.length-1;n>=0;n-=1){let r=e[n];r.nodeType===3&&r.nodeValue&&/^(\n\s\s|\n)$/.test(r.nodeValue)?t.removeChild(r):r.nodeType===1&&Vd(r)}return t};function no(t){if(typeof window>"u")throw new Error("[tiptap error]: there is no window object available, so this function cannot be used");let e=`${t}`,n=new window.DOMParser().parseFromString(e,"text/html").body;return Vd(n)}function ir(t,e,n){if(t instanceof ie||t instanceof v)return t;n={slice:!0,parseOptions:{},...n};let r=typeof t=="object"&&t!==null,o=typeof t=="string";if(r)try{if(Array.isArray(t)&&t.length>0)return v.fromArray(t.map(l=>e.nodeFromJSON(l)));let s=e.nodeFromJSON(t);return n.errorOnInvalidContent&&s.check(),s}catch(i){if(n.errorOnInvalidContent)throw new Error("[tiptap error]: Invalid JSON content",{cause:i});return console.warn("[tiptap warn]: Invalid content.","Passed value:",t,"Error:",i),ir("",e,n)}if(o){if(n.errorOnInvalidContent){let s=!1,l="",a=new fn({topNode:e.spec.topNode,marks:e.spec.marks,nodes:e.spec.nodes.append({__tiptap__private__unknown__catch__all__node:{content:"inline*",group:"block",parseDOM:[{tag:"*",getAttrs:c=>(s=!0,l=typeof c=="string"?c:c.outerHTML,null)}]}})});if(n.slice?Xe.fromSchema(a).parseSlice(no(t),n.parseOptions):Xe.fromSchema(a).parse(no(t),n.parseOptions),n.errorOnInvalidContent&&s)throw new Error("[tiptap error]: Invalid HTML content",{cause:new Error(`Invalid element found: ${l}`)})}let i=Xe.fromSchema(e);return n.slice?i.parseSlice(no(t),n.parseOptions).content:i.parse(no(t),n.parseOptions)}return ir("",e,n)}function ry(t,e,n){let r=t.steps.length-1;if(r{s===0&&(s=d)}),t.setSelection(I.near(t.doc.resolve(s),n))}var oy=t=>!("type"in t),iy=(t,e,n)=>({tr:r,dispatch:o,editor:i})=>{var s;if(o){n={parseOptions:i.options.parseOptions,updateSelection:!0,applyInputRules:!1,applyPasteRules:!1,...n};let l,a=g=>{i.emit("contentError",{editor:i,error:g,disableCollaboration:()=>{"collaboration"in i.storage&&typeof i.storage.collaboration=="object"&&i.storage.collaboration&&(i.storage.collaboration.isDisabled=!0)}})},c={preserveWhitespace:"full",...n.parseOptions};if(!n.errorOnInvalidContent&&!i.options.enableContentCheck&&i.options.emitContentError)try{ir(e,i.schema,{parseOptions:c,errorOnInvalidContent:!0})}catch(g){a(g)}try{l=ir(e,i.schema,{parseOptions:c,errorOnInvalidContent:(s=n.errorOnInvalidContent)!=null?s:i.options.enableContentCheck})}catch(g){return a(g),!1}let{from:d,to:u}=typeof t=="number"?{from:t,to:t}:{from:t.from,to:t.to},f=!0,h=!0;if((oy(l)?l:[l]).forEach(g=>{g.check(),f=f?g.isText&&g.marks.length===0:!1,h=h?g.isBlock:!1}),d===u&&h){let{parent:g}=r.doc.resolve(d);g.isTextblock&&!g.type.spec.code&&!g.childCount&&(d-=1,u+=1)}let m;if(f){if(Array.isArray(e))m=e.map(g=>g.text||"").join("");else if(e instanceof v){let g="";e.forEach(y=>{y.text&&(g+=y.text)}),m=g}else typeof e=="object"&&e&&e.text?m=e.text:m=e;r.insertText(m,d,u)}else{m=l;let g=r.doc.resolve(d),y=g.node(),w=g.parentOffset===0,b=y.isText||y.isTextblock,C=y.content.size>0;w&&b&&C&&(d=Math.max(0,d-1)),r.replaceWith(d,u,m)}n.updateSelection&&ry(r,r.steps.length-1,-1),n.applyInputRules&&r.setMeta("applyInputRules",{from:d,text:m}),n.applyPasteRules&&r.setMeta("applyPasteRules",{from:d,text:m})}return!0},sy=()=>({state:t,dispatch:e})=>ac(t,e),ly=()=>({state:t,dispatch:e})=>cc(t,e),ay=()=>({state:t,dispatch:e})=>Ui(t,e),cy=()=>({state:t,dispatch:e})=>Ji(t,e),dy=()=>({state:t,dispatch:e,tr:n})=>{try{let r=Wt(t.doc,t.selection.$from.pos,-1);return r==null?!1:(n.join(r,2),e&&e(n),!0)}catch{return!1}},uy=()=>({state:t,dispatch:e,tr:n})=>{try{let r=Wt(t.doc,t.selection.$from.pos,1);return r==null?!1:(n.join(r,2),e&&e(n),!0)}catch{return!1}},fy=()=>({state:t,dispatch:e})=>oc(t,e),hy=()=>({state:t,dispatch:e})=>ic(t,e);function _d(){return typeof navigator<"u"?/Mac/.test(navigator.platform):!1}function py(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n==="Space"&&(n=" ");let r,o,i,s;for(let l=0;l({editor:e,view:n,tr:r,dispatch:o})=>{let i=py(t).split(/-(?!$)/),s=i.find(c=>!["Alt","Ctrl","Meta","Shift"].includes(c)),l=new KeyboardEvent("keydown",{key:s==="Space"?" ":s,altKey:i.includes("Alt"),ctrlKey:i.includes("Ctrl"),metaKey:i.includes("Meta"),shiftKey:i.includes("Shift"),bubbles:!0,cancelable:!0}),a=e.captureTransaction(()=>{n.someProp("handleKeyDown",c=>c(n,l))});return a?.steps.forEach(c=>{let d=c.map(r.mapping);d&&o&&r.maybeStep(d)}),!0};function Ze(t,e,n={}){let{from:r,to:o,empty:i}=t.selection,s=e?ne(e,t.schema):null,l=[];t.doc.nodesBetween(r,o,(u,f)=>{if(u.isText)return;let h=Math.max(r,f),p=Math.min(o,f+u.nodeSize);l.push({node:u,from:h,to:p})});let a=o-r,c=l.filter(u=>s?s.name===u.node.type.name:!0).filter(u=>lo(u.node.attrs,n,{strict:!1}));return i?!!c.length:c.reduce((u,f)=>u+f.to-f.from,0)>=a}var gy=(t,e={})=>({state:n,dispatch:r})=>{let o=ne(t,n.schema);return Ze(n,o,e)?dc(n,r):!1},yy=()=>({state:t,dispatch:e})=>ts(t,e),by=t=>({state:e,dispatch:n})=>{let r=ne(t,e.schema);return gc(r)(e,n)},wy=()=>({state:t,dispatch:e})=>Yi(t,e);function ho(t,e){return e.nodes[t]?"node":e.marks[t]?"mark":null}function Rd(t,e){let n=typeof e=="string"?[e]:e;return Object.keys(t).reduce((r,o)=>(n.includes(o)||(r[o]=t[o]),r),{})}var xy=(t,e)=>({tr:n,state:r,dispatch:o})=>{let i=null,s=null,l=ho(typeof t=="string"?t:t.name,r.schema);if(!l)return!1;l==="node"&&(i=ne(t,r.schema)),l==="mark"&&(s=wt(t,r.schema));let a=!1;return n.selection.ranges.forEach(c=>{r.doc.nodesBetween(c.$from.pos,c.$to.pos,(d,u)=>{i&&i===d.type&&(a=!0,o&&n.setNodeMarkup(u,void 0,Rd(d.attrs,e))),s&&d.marks.length&&d.marks.forEach(f=>{s===f.type&&(a=!0,o&&n.addMark(u,u+d.nodeSize,s.create(Rd(f.attrs,e))))})})}),a},ky=()=>({tr:t,dispatch:e})=>(e&&t.scrollIntoView(),!0),Sy=()=>({tr:t,dispatch:e})=>{if(e){let n=new ke(t.doc);t.setSelection(n)}return!0},Cy=()=>({state:t,dispatch:e})=>Ki(t,e),vy=()=>({state:t,dispatch:e})=>Gi(t,e),My=()=>({state:t,dispatch:e})=>uc(t,e),Ty=()=>({state:t,dispatch:e})=>rs(t,e),Ay=()=>({state:t,dispatch:e})=>ns(t,e);function _s(t,e,n={},r={}){return ir(t,e,{slice:!1,parseOptions:n,errorOnInvalidContent:r.errorOnInvalidContent})}var Ey=(t,{errorOnInvalidContent:e,emitUpdate:n=!0,parseOptions:r={}}={})=>({editor:o,tr:i,dispatch:s,commands:l})=>{let{doc:a}=i;if(r.preserveWhitespace!=="full"){let c=_s(t,o.schema,r,{errorOnInvalidContent:e??o.options.enableContentCheck});return s&&i.replaceWith(0,a.content.size,c).setMeta("preventUpdate",!n),!0}return s&&i.setMeta("preventUpdate",!n),l.insertContentAt({from:0,to:a.content.size},t,{parseOptions:r,errorOnInvalidContent:e??o.options.enableContentCheck})};function Wd(t,e){let n=wt(e,t.schema),{from:r,to:o,empty:i}=t.selection,s=[];i?(t.storedMarks&&s.push(...t.storedMarks),s.push(...t.selection.$head.marks())):t.doc.nodesBetween(r,o,a=>{s.push(...a.marks)});let l=s.find(a=>a.type.name===n.name);return l?{...l.attrs}:{}}function Js(t,e){let n=new Tt(t);return e.forEach(r=>{r.steps.forEach(o=>{n.step(o)})}),n}function sr(t){for(let e=0;e{e(r)&&n.push({node:r,pos:o})}),n}function jd(t,e,n){let r=[];return t.nodesBetween(e.from,e.to,(o,i)=>{n(o)&&r.push({node:o,pos:i})}),r}function Gs(t,e){for(let n=t.depth;n>0;n-=1){let r=t.node(n);if(e(r))return{pos:n>0?t.before(n):0,start:t.start(n),depth:n,node:r}}}function et(t){return e=>Gs(e.$from,t)}function B(t,e,n){return t.config[e]===void 0&&t.parent?B(t.parent,e,n):typeof t.config[e]=="function"?t.config[e].bind({...n,parent:t.parent?B(t.parent,e,n):null}):t.config[e]}function Xs(t){return t.map(e=>{let n={name:e.name,options:e.options,storage:e.storage},r=B(e,"addExtensions",n);return r?[e,...Xs(r())]:e}).flat(10)}function Ys(t,e){let n=ct.fromSchema(e).serializeFragment(t),o=document.implementation.createHTMLDocument().createElement("div");return o.appendChild(n),o.innerHTML}function Ud(t){return typeof t=="function"}function G(t,e=void 0,...n){return Ud(t)?e?t.bind(e)(...n):t(...n):t}function Ny(t={}){return Object.keys(t).length===0&&t.constructor===Object}function An(t){let e=t.filter(o=>o.type==="extension"),n=t.filter(o=>o.type==="node"),r=t.filter(o=>o.type==="mark");return{baseExtensions:e,nodeExtensions:n,markExtensions:r}}function Kd(t){let e=[],{nodeExtensions:n,markExtensions:r}=An(t),o=[...n,...r],i={default:null,validate:void 0,rendered:!0,renderHTML:null,parseHTML:null,keepOnSplit:!0,isRequired:!1};return t.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage,extensions:o},a=B(s,"addGlobalAttributes",l);if(!a)return;a().forEach(d=>{d.types.forEach(u=>{Object.entries(d.attributes).forEach(([f,h])=>{e.push({type:u,name:f,attribute:{...i,...h}})})})})}),o.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage},a=B(s,"addAttributes",l);if(!a)return;let c=a();Object.entries(c).forEach(([d,u])=>{let f={...i,...u};typeof f?.default=="function"&&(f.default=f.default()),f?.isRequired&&f?.default===void 0&&delete f.default,e.push({type:s.name,name:d,attribute:f})})}),e}function R(...t){return t.filter(e=>!!e).reduce((e,n)=>{let r={...e};return Object.entries(n).forEach(([o,i])=>{if(!r[o]){r[o]=i;return}if(o==="class"){let l=i?String(i).split(" "):[],a=r[o]?r[o].split(" "):[],c=l.filter(d=>!a.includes(d));r[o]=[...a,...c].join(" ")}else if(o==="style"){let l=i?i.split(";").map(d=>d.trim()).filter(Boolean):[],a=r[o]?r[o].split(";").map(d=>d.trim()).filter(Boolean):[],c=new Map;a.forEach(d=>{let[u,f]=d.split(":").map(h=>h.trim());c.set(u,f)}),l.forEach(d=>{let[u,f]=d.split(":").map(h=>h.trim());c.set(u,f)}),r[o]=Array.from(c.entries()).map(([d,u])=>`${d}: ${u}`).join("; ")}else r[o]=i}),r},{})}function ao(t,e){return e.filter(n=>n.type===t.type.name).filter(n=>n.attribute.rendered).map(n=>n.attribute.renderHTML?n.attribute.renderHTML(t.attrs)||{}:{[n.name]:t.attrs[n.name]}).reduce((n,r)=>R(n,r),{})}function Oy(t){return typeof t!="string"?t:t.match(/^[+-]?(?:\d*\.)?\d+$/)?Number(t):t==="true"?!0:t==="false"?!1:t}function Dd(t,e){return"style"in t?t:{...t,getAttrs:n=>{let r=t.getAttrs?t.getAttrs(n):t.attrs;if(r===!1)return!1;let o=e.reduce((i,s)=>{let l=s.attribute.parseHTML?s.attribute.parseHTML(n):Oy(n.getAttribute(s.name));return l==null?i:{...i,[s.name]:l}},{});return{...r,...o}}}}function Id(t){return Object.fromEntries(Object.entries(t).filter(([e,n])=>e==="attrs"&&Ny(n)?!1:n!=null))}function Pd(t){var e,n;let r={};return!((e=t?.attribute)!=null&&e.isRequired)&&"default"in(t?.attribute||{})&&(r.default=t.attribute.default),((n=t?.attribute)==null?void 0:n.validate)!==void 0&&(r.validate=t.attribute.validate),[t.name,r]}function Ry(t,e){var n;let r=Kd(t),{nodeExtensions:o,markExtensions:i}=An(t),s=(n=o.find(c=>B(c,"topNode")))==null?void 0:n.name,l=Object.fromEntries(o.map(c=>{let d=r.filter(y=>y.type===c.name),u={name:c.name,options:c.options,storage:c.storage,editor:e},f=t.reduce((y,w)=>{let b=B(w,"extendNodeSchema",u);return{...y,...b?b(c):{}}},{}),h=Id({...f,content:G(B(c,"content",u)),marks:G(B(c,"marks",u)),group:G(B(c,"group",u)),inline:G(B(c,"inline",u)),atom:G(B(c,"atom",u)),selectable:G(B(c,"selectable",u)),draggable:G(B(c,"draggable",u)),code:G(B(c,"code",u)),whitespace:G(B(c,"whitespace",u)),linebreakReplacement:G(B(c,"linebreakReplacement",u)),defining:G(B(c,"defining",u)),isolating:G(B(c,"isolating",u)),attrs:Object.fromEntries(d.map(Pd))}),p=G(B(c,"parseHTML",u));p&&(h.parseDOM=p.map(y=>Dd(y,d)));let m=B(c,"renderHTML",u);m&&(h.toDOM=y=>m({node:y,HTMLAttributes:ao(y,d)}));let g=B(c,"renderText",u);return g&&(h.toText=g),[c.name,h]})),a=Object.fromEntries(i.map(c=>{let d=r.filter(g=>g.type===c.name),u={name:c.name,options:c.options,storage:c.storage,editor:e},f=t.reduce((g,y)=>{let w=B(y,"extendMarkSchema",u);return{...g,...w?w(c):{}}},{}),h=Id({...f,inclusive:G(B(c,"inclusive",u)),excludes:G(B(c,"excludes",u)),group:G(B(c,"group",u)),spanning:G(B(c,"spanning",u)),code:G(B(c,"code",u)),attrs:Object.fromEntries(d.map(Pd))}),p=G(B(c,"parseHTML",u));p&&(h.parseDOM=p.map(g=>Dd(g,d)));let m=B(c,"renderHTML",u);return m&&(h.toDOM=g=>m({mark:g,HTMLAttributes:ao(g,d)})),[c.name,h]}));return new fn({topNode:s,nodes:l,marks:a})}function Dy(t){let e=t.filter((n,r)=>t.indexOf(n)!==r);return Array.from(new Set(e))}function Qs(t){return t.sort((n,r)=>{let o=B(n,"priority")||100,i=B(r,"priority")||100;return o>i?-1:or.name));return n.length&&console.warn(`[tiptap warn]: Duplicate extension names found: [${n.map(r=>`'${r}'`).join(", ")}]. This can lead to issues.`),e}function Jd(t,e,n){let{from:r,to:o}=e,{blockSeparator:i=` + +`,textSerializers:s={}}=n||{},l="";return t.nodesBetween(r,o,(a,c,d,u)=>{var f;a.isBlock&&c>r&&(l+=i);let h=s?.[a.type.name];if(h)return d&&(l+=h({node:a,pos:c,parent:d,index:u,range:e})),!1;a.isText&&(l+=(f=a?.text)==null?void 0:f.slice(Math.max(r,c)-c,o-c))}),l}function Iy(t,e){let n={from:0,to:t.content.size};return Jd(t,n,e)}function Gd(t){return Object.fromEntries(Object.entries(t.nodes).filter(([,e])=>e.spec.toText).map(([e,n])=>[e,n.spec.toText]))}function Py(t,e){let n=ne(e,t.schema),{from:r,to:o}=t.selection,i=[];t.doc.nodesBetween(r,o,l=>{i.push(l)});let s=i.reverse().find(l=>l.type.name===n.name);return s?{...s.attrs}:{}}function Zs(t,e){let n=ho(typeof e=="string"?e:e.name,t.schema);return n==="node"?Py(t,e):n==="mark"?Wd(t,e):{}}function Ly(t,e=JSON.stringify){let n={};return t.filter(r=>{let o=e(r);return Object.prototype.hasOwnProperty.call(n,o)?!1:n[o]=!0})}function By(t){let e=Ly(t);return e.length===1?e:e.filter((n,r)=>!e.filter((i,s)=>s!==r).some(i=>n.oldRange.from>=i.oldRange.from&&n.oldRange.to<=i.oldRange.to&&n.newRange.from>=i.newRange.from&&n.newRange.to<=i.newRange.to))}function el(t){let{mapping:e,steps:n}=t,r=[];return e.maps.forEach((o,i)=>{let s=[];if(o.ranges.length)o.forEach((l,a)=>{s.push({from:l,to:a})});else{let{from:l,to:a}=n[i];if(l===void 0||a===void 0)return;s.push({from:l,to:a})}s.forEach(({from:l,to:a})=>{let c=e.slice(i).map(l,-1),d=e.slice(i).map(a),u=e.invert().map(c,-1),f=e.invert().map(d);r.push({oldRange:{from:u,to:f},newRange:{from:c,to:d}})})}),By(r)}function po(t,e,n){let r=[];return t===e?n.resolve(t).marks().forEach(o=>{let i=n.resolve(t),s=Ks(i,o.type);s&&r.push({mark:o,...s})}):n.nodesBetween(t,e,(o,i)=>{!o||o?.nodeSize===void 0||r.push(...o.marks.map(s=>({from:i,to:i+o.nodeSize,mark:s})))}),r}var Xd=(t,e,n,r=20)=>{let o=t.doc.resolve(n),i=r,s=null;for(;i>0&&s===null;){let l=o.node(i);l?.type.name===e?s=l:i-=1}return[s,i]};function $s(t,e){return e.nodes[t]||e.marks[t]||null}function so(t,e,n){return Object.fromEntries(Object.entries(n).filter(([r])=>{let o=t.find(i=>i.type===e&&i.name===r);return o?o.attribute.keepOnSplit:!1}))}var zy=(t,e=500)=>{let n="",r=t.parentOffset;return t.parent.nodesBetween(Math.max(0,r-e),r,(o,i,s,l)=>{var a,c;let d=((c=(a=o.type.spec).toText)==null?void 0:c.call(a,{node:o,pos:i,parent:s,index:l}))||o.textContent||"%leaf%";n+=o.isAtom&&!o.isText?d:d.slice(0,Math.max(0,r-i))}),n};function Ws(t,e,n={}){let{empty:r,ranges:o}=t.selection,i=e?wt(e,t.schema):null;if(r)return!!(t.storedMarks||t.selection.$from.marks()).filter(u=>i?i.name===u.type.name:!0).find(u=>lo(u.attrs,n,{strict:!1}));let s=0,l=[];if(o.forEach(({$from:u,$to:f})=>{let h=u.pos,p=f.pos;t.doc.nodesBetween(h,p,(m,g)=>{if(!m.isText&&!m.marks.length)return;let y=Math.max(h,g),w=Math.min(p,g+m.nodeSize),b=w-y;s+=b,l.push(...m.marks.map(C=>({mark:C,from:y,to:w})))})}),s===0)return!1;let a=l.filter(u=>i?i.name===u.mark.type.name:!0).filter(u=>lo(u.mark.attrs,n,{strict:!1})).reduce((u,f)=>u+f.to-f.from,0),c=l.filter(u=>i?u.mark.type!==i&&u.mark.type.excludes(i):!0).reduce((u,f)=>u+f.to-f.from,0);return(a>0?a+c:a)>=s}function tl(t,e,n={}){if(!e)return Ze(t,null,n)||Ws(t,null,n);let r=ho(e,t.schema);return r==="node"?Ze(t,e,n):r==="mark"?Ws(t,e,n):!1}var Yd=(t,e)=>{let{$from:n,$to:r,$anchor:o}=t.selection;if(e){let i=et(l=>l.type.name===e)(t.selection);if(!i)return!1;let s=t.doc.resolve(i.pos+1);return o.pos+1===s.end()}return!(r.parentOffset{let{$from:e,$to:n}=t.selection;return!(e.parentOffset>0||e.pos!==n.pos)};function Ld(t,e){return Array.isArray(e)?e.some(n=>(typeof n=="string"?n:n.name)===t.name):e}function Bd(t,e){let{nodeExtensions:n}=An(e),r=n.find(s=>s.name===t);if(!r)return!1;let o={name:r.name,options:r.options,storage:r.storage},i=G(B(r,"group",o));return typeof i!="string"?!1:i.split(" ").includes("list")}function lr(t,{checkChildren:e=!0,ignoreWhitespace:n=!1}={}){var r;if(n){if(t.type.name==="hardBreak")return!0;if(t.isText)return/^\s*$/m.test((r=t.text)!=null?r:"")}if(t.isText)return!t.text;if(t.isAtom||t.isLeaf)return!1;if(t.content.childCount===0)return!0;if(e){let o=!0;return t.content.forEach(i=>{o!==!1&&(lr(i,{ignoreWhitespace:n,checkChildren:e})||(o=!1))}),o}return!1}function mo(t){return t instanceof L}var Zd=class eu{constructor(e){this.position=e}static fromJSON(e){return new eu(e.position)}toJSON(){return{position:this.position}}};function Hy(t,e){let n=e.mapping.mapResult(t.position);return{position:new Zd(n.pos),mapResult:n}}function $y(t){return new Zd(t)}function tu(t,e,n){let o=t.state.doc.content.size,i=bt(e,0,o),s=bt(n,0,o),l=t.coordsAtPos(i),a=t.coordsAtPos(s,-1),c=Math.min(l.top,a.top),d=Math.max(l.bottom,a.bottom),u=Math.min(l.left,a.left),f=Math.max(l.right,a.right),h=f-u,p=d-c,y={top:c,bottom:d,left:u,right:f,width:h,height:p,x:u,y:c};return{...y,toJSON:()=>y}}function Fy(t,e,n){var r;let{selection:o}=e,i=null;if(fo(o)&&(i=o.$cursor),i){let l=(r=t.storedMarks)!=null?r:i.marks();return i.parent.type.allowsMarkType(n)&&(!!n.isInSet(l)||!l.some(c=>c.type.excludes(n)))}let{ranges:s}=o;return s.some(({$from:l,$to:a})=>{let c=l.depth===0?t.doc.inlineContent&&t.doc.type.allowsMarkType(n):!1;return t.doc.nodesBetween(l.pos,a.pos,(d,u,f)=>{if(c)return!1;if(d.isInline){let h=!f||f.type.allowsMarkType(n),p=!!n.isInSet(d.marks)||!d.marks.some(m=>m.type.excludes(n));c=h&&p}return!c}),c})}var Vy=(t,e={})=>({tr:n,state:r,dispatch:o})=>{let{selection:i}=n,{empty:s,ranges:l}=i,a=wt(t,r.schema);if(o)if(s){let c=Wd(r,a);n.addStoredMark(a.create({...c,...e}))}else l.forEach(c=>{let d=c.$from.pos,u=c.$to.pos;r.doc.nodesBetween(d,u,(f,h)=>{let p=Math.max(h,d),m=Math.min(h+f.nodeSize,u);f.marks.find(y=>y.type===a)?f.marks.forEach(y=>{a===y.type&&n.addMark(p,m,a.create({...y.attrs,...e}))}):n.addMark(p,m,a.create(e))})});return Fy(r,n,a)},_y=(t,e)=>({tr:n})=>(n.setMeta(t,e),!0),Wy=(t,e={})=>({state:n,dispatch:r,chain:o})=>{let i=ne(t,n.schema),s;return n.selection.$anchor.sameParent(n.selection.$head)&&(s=n.selection.$anchor.parent.attrs),i.isTextblock?o().command(({commands:l})=>is(i,{...s,...e})(n)?!0:l.clearNodes()).command(({state:l})=>is(i,{...s,...e})(l,r)).run():(console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'),!1)},jy=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,o=bt(t,0,r.content.size),i=L.create(r,o);e.setSelection(i)}return!0},Uy=(t,e)=>({tr:n,state:r,dispatch:o})=>{let{selection:i}=r,s,l;return typeof e=="number"?(s=e,l=e):e&&"from"in e&&"to"in e?(s=e.from,l=e.to):(s=i.from,l=i.to),o&&n.doc.nodesBetween(s,l,(a,c)=>{a.isText||n.setNodeMarkup(c,void 0,{...a.attrs,dir:t})}),!0},Ky=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,{from:o,to:i}=typeof t=="number"?{from:t,to:t}:t,s=D.atStart(r).from,l=D.atEnd(r).to,a=bt(o,s,l),c=bt(i,s,l),d=D.create(r,a,c);e.setSelection(d)}return!0},qy=t=>({state:e,dispatch:n})=>{let r=ne(t,e.schema);return yc(r)(e,n)};function zd(t,e){let n=t.storedMarks||t.selection.$to.parentOffset&&t.selection.$from.marks();if(n){let r=n.filter(o=>e?.includes(o.type.name));t.tr.ensureMarks(r)}}var Jy=({keepMarks:t=!0}={})=>({tr:e,state:n,dispatch:r,editor:o})=>{let{selection:i,doc:s}=e,{$from:l,$to:a}=i,c=o.extensionManager.attributes,d=so(c,l.node().type.name,l.node().attrs);if(i instanceof L&&i.node.isBlock)return!l.parentOffset||!Ee(s,l.pos)?!1:(r&&(t&&zd(n,o.extensionManager.splittableMarks),e.split(l.pos).scrollIntoView()),!0);if(!l.parent.isBlock)return!1;let u=a.parentOffset===a.parent.content.size,f=l.depth===0?void 0:sr(l.node(-1).contentMatchAt(l.indexAfter(-1))),h=u&&f?[{type:f,attrs:d}]:void 0,p=Ee(e.doc,e.mapping.map(l.pos),1,h);if(!h&&!p&&Ee(e.doc,e.mapping.map(l.pos),1,f?[{type:f}]:void 0)&&(p=!0,h=f?[{type:f,attrs:d}]:void 0),r){if(p&&(i instanceof D&&e.deleteSelection(),e.split(e.mapping.map(l.pos),1,h),f&&!u&&!l.parentOffset&&l.parent.type!==f)){let m=e.mapping.map(l.before()),g=e.doc.resolve(m);l.node(-1).canReplaceWith(g.index(),g.index()+1,f)&&e.setNodeMarkup(e.mapping.map(l.before()),f)}t&&zd(n,o.extensionManager.splittableMarks),e.scrollIntoView()}return p},Gy=(t,e={})=>({tr:n,state:r,dispatch:o,editor:i})=>{var s;let l=ne(t,r.schema),{$from:a,$to:c}=r.selection,d=r.selection.node;if(d&&d.isBlock||a.depth<2||!a.sameParent(c))return!1;let u=a.node(-1);if(u.type!==l)return!1;let f=i.extensionManager.attributes;if(a.parent.content.size===0&&a.node(-1).childCount===a.indexAfter(-1)){if(a.depth===2||a.node(-3).type!==l||a.index(-2)!==a.node(-2).childCount-1)return!1;if(o){let y=v.empty,w=a.index(-1)?1:a.index(-2)?2:3;for(let O=a.depth-w;O>=a.depth-3;O-=1)y=v.from(a.node(O).copy(y));let b=a.indexAfter(-1){if(k>-1)return!1;O.isTextblock&&O.content.size===0&&(k=T+1)}),k>-1&&n.setSelection(D.near(n.doc.resolve(k))),n.scrollIntoView()}return!0}let h=c.pos===a.end()?u.contentMatchAt(0).defaultType:null,p={...so(f,u.type.name,u.attrs),...e},m={...so(f,a.node().type.name,a.node().attrs),...e};n.delete(a.pos,c.pos);let g=h?[{type:l,attrs:p},{type:h,attrs:m}]:[{type:l,attrs:p}];if(!Ee(n.doc,a.pos,2))return!1;if(o){let{selection:y,storedMarks:w}=r,{splittableMarks:b}=i.extensionManager,C=w||y.$to.parentOffset&&y.$from.marks();if(n.split(a.pos,2,g).scrollIntoView(),!C||!o)return!0;let x=C.filter(S=>b.includes(S.type.name));n.ensureMarks(x)}return!0},Fs=(t,e)=>{let n=et(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(Math.max(0,n.pos-1)).before(n.depth);if(r===void 0)return!0;let o=t.doc.nodeAt(r);return n.node.type===o?.type&&Re(t.doc,n.pos)&&t.join(n.pos),!0},Vs=(t,e)=>{let n=et(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(n.start).after(n.depth);if(r===void 0)return!0;let o=t.doc.nodeAt(r);return n.node.type===o?.type&&Re(t.doc,r)&&t.join(r),!0},Xy=(t,e,n,r={})=>({editor:o,tr:i,state:s,dispatch:l,chain:a,commands:c,can:d})=>{let{extensions:u,splittableMarks:f}=o.extensionManager,h=ne(t,s.schema),p=ne(e,s.schema),{selection:m,storedMarks:g}=s,{$from:y,$to:w}=m,b=y.blockRange(w),C=g||m.$to.parentOffset&&m.$from.marks();if(!b)return!1;let x=et(S=>Bd(S.type.name,u))(m);if(b.depth>=1&&x&&b.depth-x.depth<=1){if(x.node.type===h)return c.liftListItem(p);if(Bd(x.node.type.name,u)&&h.validContent(x.node.content)&&l)return a().command(()=>(i.setNodeMarkup(x.pos,h),!0)).command(()=>Fs(i,h)).command(()=>Vs(i,h)).run()}return!n||!C||!l?a().command(()=>d().wrapInList(h,r)?!0:c.clearNodes()).wrapInList(h,r).command(()=>Fs(i,h)).command(()=>Vs(i,h)).run():a().command(()=>{let S=d().wrapInList(h,r),k=C.filter(O=>f.includes(O.type.name));return i.ensureMarks(k),S?!0:c.clearNodes()}).wrapInList(h,r).command(()=>Fs(i,h)).command(()=>Vs(i,h)).run()},Yy=(t,e={},n={})=>({state:r,commands:o})=>{let{extendEmptyMarkRange:i=!1}=n,s=wt(t,r.schema);return Ws(r,s,e)?o.unsetMark(s,{extendEmptyMarkRange:i}):o.setMark(s,e)},Qy=(t,e,n={})=>({state:r,commands:o})=>{let i=ne(t,r.schema),s=ne(e,r.schema),l=Ze(r,i,n),a;return r.selection.$anchor.sameParent(r.selection.$head)&&(a=r.selection.$anchor.parent.attrs),l?o.setNode(s,a):o.setNode(i,{...a,...n})},Zy=(t,e={})=>({state:n,commands:r})=>{let o=ne(t,n.schema);return Ze(n,o,e)?r.lift(o):r.wrapIn(o,e)},eb=()=>({state:t,dispatch:e})=>{let n=t.plugins;for(let r=0;r=0;a-=1)s.step(l.steps[a].invert(l.docs[a]));if(i.text){let a=s.doc.resolve(i.from).marks();s.replaceWith(i.from,i.to,t.schema.text(i.text,a))}else s.delete(i.from,i.to)}return!0}}return!1},tb=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,{empty:r,ranges:o}=n;return r||e&&o.forEach(i=>{t.removeMark(i.$from.pos,i.$to.pos)}),!0},nb=(t,e={})=>({tr:n,state:r,dispatch:o})=>{var i;let{extendEmptyMarkRange:s=!1}=e,{selection:l}=n,a=wt(t,r.schema),{$from:c,empty:d,ranges:u}=l;if(!o)return!0;if(d&&s){let{from:f,to:h}=l,p=(i=c.marks().find(g=>g.type===a))==null?void 0:i.attrs,m=Ks(c,a,p);m&&(f=m.from,h=m.to),n.removeMark(f,h,a)}else u.forEach(f=>{n.removeMark(f.$from.pos,f.$to.pos,a)});return n.removeStoredMark(a),!0},rb=t=>({tr:e,state:n,dispatch:r})=>{let{selection:o}=n,i,s;return typeof t=="number"?(i=t,s=t):t&&"from"in t&&"to"in t?(i=t.from,s=t.to):(i=o.from,s=o.to),r&&e.doc.nodesBetween(i,s,(l,a)=>{if(l.isText)return;let c={...l.attrs};delete c.dir,e.setNodeMarkup(a,void 0,c)}),!0},ob=(t,e={})=>({tr:n,state:r,dispatch:o})=>{let i=null,s=null,l=ho(typeof t=="string"?t:t.name,r.schema);if(!l)return!1;l==="node"&&(i=ne(t,r.schema)),l==="mark"&&(s=wt(t,r.schema));let a=!1;return n.selection.ranges.forEach(c=>{let d=c.$from.pos,u=c.$to.pos,f,h,p,m;n.selection.empty?r.doc.nodesBetween(d,u,(g,y)=>{i&&i===g.type&&(a=!0,p=Math.max(y,d),m=Math.min(y+g.nodeSize,u),f=y,h=g)}):r.doc.nodesBetween(d,u,(g,y)=>{y=d&&y<=u&&(i&&i===g.type&&(a=!0,o&&n.setNodeMarkup(y,void 0,{...g.attrs,...e})),s&&g.marks.length&&g.marks.forEach(w=>{if(s===w.type&&(a=!0,o)){let b=Math.max(y,d),C=Math.min(y+g.nodeSize,u);n.addMark(b,C,s.create({...w.attrs,...e}))}}))}),h&&(f!==void 0&&o&&n.setNodeMarkup(f,void 0,{...h.attrs,...e}),s&&h.marks.length&&h.marks.forEach(g=>{s===g.type&&o&&n.addMark(p,m,s.create({...g.attrs,...e}))}))}),a},ib=(t,e={})=>({state:n,dispatch:r})=>{let o=ne(t,n.schema);return pc(o,e)(n,r)},sb=(t,e={})=>({state:n,dispatch:r})=>{let o=ne(t,n.schema);return mc(o,e)(n,r)},lb=class{constructor(){this.callbacks={}}on(t,e){return this.callbacks[t]||(this.callbacks[t]=[]),this.callbacks[t].push(e),this}emit(t,...e){let n=this.callbacks[t];return n&&n.forEach(r=>r.apply(this,e)),this}off(t,e){let n=this.callbacks[t];return n&&(e?this.callbacks[t]=n.filter(r=>r!==e):delete this.callbacks[t]),this}once(t,e){let n=(...r)=>{this.off(t,n),e.apply(this,r)};return this.on(t,n)}removeAllListeners(){this.callbacks={}}},go=class{constructor(t){var e;this.find=t.find,this.handler=t.handler,this.undoable=(e=t.undoable)!=null?e:!0}},ab=(t,e)=>{if(Us(e))return e.exec(t);let n=e(t);if(!n)return null;let r=[n.text];return r.index=n.index,r.input=t,r.data=n.data,n.replaceWith&&(n.text.includes(n.replaceWith)||console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'),r.push(n.replaceWith)),r};function ro(t){var e;let{editor:n,from:r,to:o,text:i,rules:s,plugin:l}=t,{view:a}=n;if(a.composing)return!1;let c=a.state.doc.resolve(r);if(c.parent.type.spec.code||(e=c.nodeBefore||c.nodeAfter)!=null&&e.marks.find(f=>f.type.spec.code))return!1;let d=!1,u=zy(c)+i;return s.forEach(f=>{if(d)return;let h=ab(u,f.find);if(!h)return;let p=a.state.tr,m=co({state:a.state,transaction:p}),g={from:r-(h[0].length-i.length),to:o},{commands:y,chain:w,can:b}=new uo({editor:n,state:m});f.handler({state:m,range:g,match:h,commands:y,chain:w,can:b})===null||!p.steps.length||(f.undoable&&p.setMeta(l,{transform:p,from:r,to:o,text:i}),a.dispatch(p),d=!0)}),d}function cb(t){let{editor:e,rules:n}=t,r=new P({state:{init(){return null},apply(o,i,s){let l=o.getMeta(r);if(l)return l;let a=o.getMeta("applyInputRules");return!!a&&setTimeout(()=>{let{text:d}=a;typeof d=="string"?d=d:d=Ys(v.from(d),s.schema);let{from:u}=a,f=u+d.length;ro({editor:e,from:u,to:f,text:d,rules:n,plugin:r})}),o.selectionSet||o.docChanged?null:i}},props:{handleTextInput(o,i,s,l){return ro({editor:e,from:i,to:s,text:l,rules:n,plugin:r})},handleDOMEvents:{compositionend:o=>(setTimeout(()=>{let{$cursor:i}=o.state.selection;i&&ro({editor:e,from:i.pos,to:i.pos,text:"",rules:n,plugin:r})}),!1)},handleKeyDown(o,i){if(i.key!=="Enter")return!1;let{$cursor:s}=o.state.selection;return s?ro({editor:e,from:s.pos,to:s.pos,text:` +`,rules:n,plugin:r}):!1}},isInputRules:!0});return r}function db(t){return Object.prototype.toString.call(t).slice(8,-1)}function oo(t){return db(t)!=="Object"?!1:t.constructor===Object&&Object.getPrototypeOf(t)===Object.prototype}function nu(t,e){let n={...t};return oo(t)&&oo(e)&&Object.keys(e).forEach(r=>{oo(e[r])&&oo(t[r])?n[r]=nu(t[r],e[r]):n[r]=e[r]}),n}var nl=class{constructor(t={}){this.type="extendable",this.parent=null,this.child=null,this.name="",this.config={name:this.name},this.config={...this.config,...t},this.name=this.config.name}get options(){return{...G(B(this,"addOptions",{name:this.name}))||{}}}get storage(){return{...G(B(this,"addStorage",{name:this.name,options:this.options}))||{}}}configure(t={}){let e=this.extend({...this.config,addOptions:()=>nu(this.options,t)});return e.name=this.name,e.parent=this.parent,e}extend(t={}){let e=new this.constructor({...this.config,...t});return e.parent=this,this.child=e,e.name="name"in t?t.name:e.parent.name,e}},ee=class ru extends nl{constructor(){super(...arguments),this.type="mark"}static create(e={}){let n=typeof e=="function"?e():e;return new ru(n)}static handleExit({editor:e,mark:n}){let{tr:r}=e.state,o=e.state.selection.$from;if(o.pos===o.end()){let s=o.marks();if(!!!s.find(c=>c?.type.name===n.name))return!1;let a=s.find(c=>c?.type.name===n.name);return a&&r.removeStoredMark(a),r.insertText(" ",o.pos),e.view.dispatch(r),!0}return!1}configure(e){return super.configure(e)}extend(e){let n=typeof e=="function"?e():e;return super.extend(n)}};function ub(t){return typeof t=="number"}var fb=class{constructor(t){this.find=t.find,this.handler=t.handler}},hb=(t,e,n)=>{if(Us(e))return[...t.matchAll(e)];let r=e(t,n);return r?r.map(o=>{let i=[o.text];return i.index=o.index,i.input=t,i.data=o.data,o.replaceWith&&(o.text.includes(o.replaceWith)||console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'),i.push(o.replaceWith)),i}):[]};function pb(t){let{editor:e,state:n,from:r,to:o,rule:i,pasteEvent:s,dropEvent:l}=t,{commands:a,chain:c,can:d}=new uo({editor:e,state:n}),u=[];return n.doc.nodesBetween(r,o,(h,p)=>{var m,g,y,w,b;if((g=(m=h.type)==null?void 0:m.spec)!=null&&g.code||!(h.isText||h.isTextblock||h.isInline))return;let C=(b=(w=(y=h.content)==null?void 0:y.size)!=null?w:h.nodeSize)!=null?b:0,x=Math.max(r,p),S=Math.min(o,p+C);if(x>=S)return;let k=h.isText?h.text||"":h.textBetween(x-p,S-p,void 0,"\uFFFC");hb(k,i.find,s).forEach(T=>{if(T.index===void 0)return;let A=x+T.index+1,$=A+T[0].length,z={from:n.tr.mapping.map(A),to:n.tr.mapping.map($)},K=i.handler({state:n,range:z,match:T,commands:a,chain:c,can:d,pasteEvent:s,dropEvent:l});u.push(K)})}),u.every(h=>h!==null)}var io=null,mb=t=>{var e;let n=new ClipboardEvent("paste",{clipboardData:new DataTransfer});return(e=n.clipboardData)==null||e.setData("text/html",t),n};function gb(t){let{editor:e,rules:n}=t,r=null,o=!1,i=!1,s=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,l;try{l=typeof DragEvent<"u"?new DragEvent("drop"):null}catch{l=null}let a=({state:d,from:u,to:f,rule:h,pasteEvt:p})=>{let m=d.tr,g=co({state:d,transaction:m});if(!(!pb({editor:e,state:g,from:Math.max(u-1,0),to:f.b-1,rule:h,pasteEvent:p,dropEvent:l})||!m.steps.length)){try{l=typeof DragEvent<"u"?new DragEvent("drop"):null}catch{l=null}return s=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,m}};return n.map(d=>new P({view(u){let f=p=>{var m;r=(m=u.dom.parentElement)!=null&&m.contains(p.target)?u.dom.parentElement:null,r&&(io=e)},h=()=>{io&&(io=null)};return window.addEventListener("dragstart",f),window.addEventListener("dragend",h),{destroy(){window.removeEventListener("dragstart",f),window.removeEventListener("dragend",h)}}},props:{handleDOMEvents:{drop:(u,f)=>{if(i=r===u.dom.parentElement,l=f,!i){let h=io;h?.isEditable&&setTimeout(()=>{let p=h.state.selection;p&&h.commands.deleteRange({from:p.from,to:p.to})},10)}return!1},paste:(u,f)=>{var h;let p=(h=f.clipboardData)==null?void 0:h.getData("text/html");return s=f,o=!!p?.includes("data-pm-slice"),!1}}},appendTransaction:(u,f,h)=>{let p=u[0],m=p.getMeta("uiEvent")==="paste"&&!o,g=p.getMeta("uiEvent")==="drop"&&!i,y=p.getMeta("applyPasteRules"),w=!!y;if(!m&&!g&&!w)return;if(w){let{text:x}=y;typeof x=="string"?x=x:x=Ys(v.from(x),h.schema);let{from:S}=y,k=S+x.length,O=mb(x);return a({rule:d,state:h,from:S,to:{b:k},pasteEvt:O})}let b=f.doc.content.findDiffStart(h.doc.content),C=f.doc.content.findDiffEnd(h.doc.content);if(!(!ub(b)||!C||b===C.b))return a({rule:d,state:h,from:b,to:C,pasteEvt:s})}}))}var yo=class{constructor(t,e){this.splittableMarks=[],this.editor=e,this.baseExtensions=t,this.extensions=qd(t),this.schema=Ry(this.extensions,e),this.setupExtensions()}get commands(){return this.extensions.reduce((t,e)=>{let n={name:e.name,options:e.options,storage:this.editor.extensionStorage[e.name],editor:this.editor,type:$s(e.name,this.schema)},r=B(e,"addCommands",n);return r?{...t,...r()}:t},{})}get plugins(){let{editor:t}=this;return Qs([...this.extensions].reverse()).flatMap(r=>{let o={name:r.name,options:r.options,storage:this.editor.extensionStorage[r.name],editor:t,type:$s(r.name,this.schema)},i=[],s=B(r,"addKeyboardShortcuts",o),l={};if(r.type==="mark"&&B(r,"exitable",o)&&(l.ArrowRight=()=>ee.handleExit({editor:t,mark:r})),s){let f=Object.fromEntries(Object.entries(s()).map(([h,p])=>[h,()=>p({editor:t})]));l={...l,...f}}let a=Nd(l);i.push(a);let c=B(r,"addInputRules",o);if(Ld(r,t.options.enableInputRules)&&c){let f=c();if(f&&f.length){let h=cb({editor:t,rules:f}),p=Array.isArray(h)?h:[h];i.push(...p)}}let d=B(r,"addPasteRules",o);if(Ld(r,t.options.enablePasteRules)&&d){let f=d();if(f&&f.length){let h=gb({editor:t,rules:f});i.push(...h)}}let u=B(r,"addProseMirrorPlugins",o);if(u){let f=u();i.push(...f)}return i})}get attributes(){return Kd(this.extensions)}get nodeViews(){let{editor:t}=this,{nodeExtensions:e}=An(this.extensions);return Object.fromEntries(e.filter(n=>!!B(n,"addNodeView")).map(n=>{let r=this.attributes.filter(a=>a.type===n.name),o={name:n.name,options:n.options,storage:this.editor.extensionStorage[n.name],editor:t,type:ne(n.name,this.schema)},i=B(n,"addNodeView",o);if(!i)return[];let s=i();if(!s)return[];let l=(a,c,d,u,f)=>{let h=ao(a,r);return s({node:a,view:c,getPos:d,decorations:u,innerDecorations:f,editor:t,extension:n,HTMLAttributes:h})};return[n.name,l]}))}get markViews(){let{editor:t}=this,{markExtensions:e}=An(this.extensions);return Object.fromEntries(e.filter(n=>!!B(n,"addMarkView")).map(n=>{let r=this.attributes.filter(l=>l.type===n.name),o={name:n.name,options:n.options,storage:this.editor.extensionStorage[n.name],editor:t,type:wt(n.name,this.schema)},i=B(n,"addMarkView",o);if(!i)return[];let s=(l,a,c)=>{let d=ao(l,r);return i()({mark:l,view:a,inline:c,editor:t,extension:n,HTMLAttributes:d,updateAttributes:u=>{Ab(l,t,u)}})};return[n.name,s]}))}setupExtensions(){let t=this.extensions;this.editor.extensionStorage=Object.fromEntries(t.map(e=>[e.name,e.storage])),t.forEach(e=>{var n;let r={name:e.name,options:e.options,storage:this.editor.extensionStorage[e.name],editor:this.editor,type:$s(e.name,this.schema)};e.type==="mark"&&((n=G(B(e,"keepOnSplit",r)))==null||n)&&this.splittableMarks.push(e.name);let o=B(e,"onBeforeCreate",r),i=B(e,"onCreate",r),s=B(e,"onUpdate",r),l=B(e,"onSelectionUpdate",r),a=B(e,"onTransaction",r),c=B(e,"onFocus",r),d=B(e,"onBlur",r),u=B(e,"onDestroy",r);o&&this.editor.on("beforeCreate",o),i&&this.editor.on("create",i),s&&this.editor.on("update",s),l&&this.editor.on("selectionUpdate",l),a&&this.editor.on("transaction",a),c&&this.editor.on("focus",c),d&&this.editor.on("blur",d),u&&this.editor.on("destroy",u)})}};yo.resolve=qd;yo.sort=Qs;yo.flatten=Xs;var yb={};js(yb,{ClipboardTextSerializer:()=>iu,Commands:()=>su,Delete:()=>lu,Drop:()=>au,Editable:()=>cu,FocusEvents:()=>uu,Keymap:()=>fu,Paste:()=>hu,Tabindex:()=>pu,TextDirection:()=>mu,focusEventsPluginKey:()=>du});var U=class ou extends nl{constructor(){super(...arguments),this.type="extension"}static create(e={}){let n=typeof e=="function"?e():e;return new ou(n)}configure(e){return super.configure(e)}extend(e){let n=typeof e=="function"?e():e;return super.extend(n)}},iu=U.create({name:"clipboardTextSerializer",addOptions(){return{blockSeparator:void 0}},addProseMirrorPlugins(){return[new P({key:new H("clipboardTextSerializer"),props:{clipboardTextSerializer:()=>{let{editor:t}=this,{state:e,schema:n}=t,{doc:r,selection:o}=e,{ranges:i}=o,s=Math.min(...i.map(d=>d.$from.pos)),l=Math.max(...i.map(d=>d.$to.pos)),a=Gd(n);return Jd(r,{from:s,to:l},{...this.options.blockSeparator!==void 0?{blockSeparator:this.options.blockSeparator}:{},textSerializers:a})}}})]}}),su=U.create({name:"commands",addCommands(){return{...Hd}}}),lu=U.create({name:"delete",onUpdate({transaction:t,appendedTransactions:e}){var n,r,o;let i=()=>{var s,l,a,c;if((c=(a=(l=(s=this.editor.options.coreExtensionOptions)==null?void 0:s.delete)==null?void 0:l.filterTransaction)==null?void 0:a.call(l,t))!=null?c:t.getMeta("y-sync$"))return;let d=Js(t.before,[t,...e]);el(d).forEach(h=>{d.mapping.mapResult(h.oldRange.from).deletedAfter&&d.mapping.mapResult(h.oldRange.to).deletedBefore&&d.before.nodesBetween(h.oldRange.from,h.oldRange.to,(p,m)=>{let g=m+p.nodeSize-2,y=h.oldRange.from<=m&&g<=h.oldRange.to;this.editor.emit("delete",{type:"node",node:p,from:m,to:g,newFrom:d.mapping.map(m),newTo:d.mapping.map(g),deletedRange:h.oldRange,newRange:h.newRange,partial:!y,editor:this.editor,transaction:t,combinedTransform:d})})});let f=d.mapping;d.steps.forEach((h,p)=>{var m,g;if(h instanceof ut){let y=f.slice(p).map(h.from,-1),w=f.slice(p).map(h.to),b=f.invert().map(y,-1),C=f.invert().map(w),x=(m=d.doc.nodeAt(y-1))==null?void 0:m.marks.some(k=>k.eq(h.mark)),S=(g=d.doc.nodeAt(w))==null?void 0:g.marks.some(k=>k.eq(h.mark));this.editor.emit("delete",{type:"mark",mark:h.mark,from:h.from,to:h.to,deletedRange:{from:b,to:C},newRange:{from:y,to:w},partial:!!(S||x),editor:this.editor,transaction:t,combinedTransform:d})}})};(o=(r=(n=this.editor.options.coreExtensionOptions)==null?void 0:n.delete)==null?void 0:r.async)==null||o?setTimeout(i,0):i()}}),au=U.create({name:"drop",addProseMirrorPlugins(){return[new P({key:new H("tiptapDrop"),props:{handleDrop:(t,e,n,r)=>{this.editor.emit("drop",{editor:this.editor,event:e,slice:n,moved:r})}}})]}}),cu=U.create({name:"editable",addProseMirrorPlugins(){return[new P({key:new H("editable"),props:{editable:()=>this.editor.options.editable}})]}}),du=new H("focusEvents"),uu=U.create({name:"focusEvents",addProseMirrorPlugins(){let{editor:t}=this;return[new P({key:du,props:{handleDOMEvents:{focus:(e,n)=>{t.isFocused=!0;let r=t.state.tr.setMeta("focus",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1},blur:(e,n)=>{t.isFocused=!1;let r=t.state.tr.setMeta("blur",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1}}}})]}}),fu=U.create({name:"keymap",addKeyboardShortcuts(){let t=()=>this.editor.commands.first(({commands:s})=>[()=>s.undoInputRule(),()=>s.command(({tr:l})=>{let{selection:a,doc:c}=l,{empty:d,$anchor:u}=a,{pos:f,parent:h}=u,p=u.parent.isTextblock&&f>0?l.doc.resolve(f-1):u,m=p.parent.type.spec.isolating,g=u.pos-u.parentOffset,y=m&&p.parent.childCount===1?g===u.pos:I.atStart(c).from===f;return!d||!h.type.isTextblock||h.textContent.length||!y||y&&u.parent.type.name==="paragraph"?!1:s.clearNodes()}),()=>s.deleteSelection(),()=>s.joinBackward(),()=>s.selectNodeBackward()]),e=()=>this.editor.commands.first(({commands:s})=>[()=>s.deleteSelection(),()=>s.deleteCurrentNode(),()=>s.joinForward(),()=>s.selectNodeForward()]),r={Enter:()=>this.editor.commands.first(({commands:s})=>[()=>s.newlineInCode(),()=>s.createParagraphNear(),()=>s.liftEmptyBlock(),()=>s.splitBlock()]),"Mod-Enter":()=>this.editor.commands.exitCode(),Backspace:t,"Mod-Backspace":t,"Shift-Backspace":t,Delete:e,"Mod-Delete":e,"Mod-a":()=>this.editor.commands.selectAll()},o={...r},i={...r,"Ctrl-h":t,"Alt-Backspace":t,"Ctrl-d":e,"Ctrl-Alt-Backspace":e,"Alt-Delete":e,"Alt-d":e,"Ctrl-a":()=>this.editor.commands.selectTextblockStart(),"Ctrl-e":()=>this.editor.commands.selectTextblockEnd()};return qs()||_d()?i:o},addProseMirrorPlugins(){return[new P({key:new H("clearDocument"),appendTransaction:(t,e,n)=>{if(t.some(m=>m.getMeta("composition")))return;let r=t.some(m=>m.docChanged)&&!e.doc.eq(n.doc),o=t.some(m=>m.getMeta("preventClearDocument"));if(!r||o)return;let{empty:i,from:s,to:l}=e.selection,a=I.atStart(e.doc).from,c=I.atEnd(e.doc).to;if(i||!(s===a&&l===c)||!lr(n.doc))return;let f=n.tr,h=co({state:n,transaction:f}),{commands:p}=new uo({editor:this.editor,state:h});if(p.clearNodes(),!!f.steps.length)return f}})]}}),hu=U.create({name:"paste",addProseMirrorPlugins(){return[new P({key:new H("tiptapPaste"),props:{handlePaste:(t,e,n)=>{this.editor.emit("paste",{editor:this.editor,event:e,slice:n})}}})]}}),pu=U.create({name:"tabindex",addProseMirrorPlugins(){return[new P({key:new H("tabindex"),props:{attributes:()=>this.editor.isEditable?{tabindex:"0"}:{}}})]}}),mu=U.create({name:"textDirection",addOptions(){return{direction:void 0}},addGlobalAttributes(){if(!this.options.direction)return[];let{nodeExtensions:t}=An(this.extensions);return[{types:t.filter(e=>e.name!=="text").map(e=>e.name),attributes:{dir:{default:this.options.direction,parseHTML:e=>{let n=e.getAttribute("dir");return n&&(n==="ltr"||n==="rtl"||n==="auto")?n:this.options.direction},renderHTML:e=>e.dir?{dir:e.dir}:{}}}}]},addProseMirrorPlugins(){return[new P({key:new H("textDirection"),props:{attributes:()=>{let t=this.options.direction;return t?{dir:t}:{}}}})]}}),bb=class Tn{constructor(e,n,r=!1,o=null){this.currentNode=null,this.actualDepth=null,this.isBlock=r,this.resolvedPos=e,this.editor=n,this.currentNode=o}get name(){return this.node.type.name}get node(){return this.currentNode||this.resolvedPos.node()}get element(){return this.editor.view.domAtPos(this.pos).node}get depth(){var e;return(e=this.actualDepth)!=null?e:this.resolvedPos.depth}get pos(){return this.resolvedPos.pos}get content(){return this.node.content}set content(e){let n=this.from,r=this.to;if(this.isBlock){if(this.content.size===0){console.error(`You can\u2019t set content on a block node. Tried to set content on ${this.name} at ${this.pos}`);return}n=this.from+1,r=this.to-1}this.editor.commands.insertContentAt({from:n,to:r},e)}get attributes(){return this.node.attrs}get textContent(){return this.node.textContent}get size(){return this.node.nodeSize}get from(){return this.isBlock?this.pos:this.resolvedPos.start(this.resolvedPos.depth)}get range(){return{from:this.from,to:this.to}}get to(){return this.isBlock?this.pos+this.size:this.resolvedPos.end(this.resolvedPos.depth)+(this.node.isText?0:1)}get parent(){if(this.depth===0)return null;let e=this.resolvedPos.start(this.resolvedPos.depth-1),n=this.resolvedPos.doc.resolve(e);return new Tn(n,this.editor)}get before(){let e=this.resolvedPos.doc.resolve(this.from-(this.isBlock?1:2));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.from-3)),new Tn(e,this.editor)}get after(){let e=this.resolvedPos.doc.resolve(this.to+(this.isBlock?2:1));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.to+3)),new Tn(e,this.editor)}get children(){let e=[];return this.node.content.forEach((n,r)=>{let o=n.isBlock&&!n.isTextblock,i=n.isAtom&&!n.isText,s=this.pos+r+(i?0:1);if(s<0||s>this.resolvedPos.doc.nodeSize-2)return;let l=this.resolvedPos.doc.resolve(s);if(!o&&l.depth<=this.depth)return;let a=new Tn(l,this.editor,o,o?n:null);o&&(a.actualDepth=this.depth+1),e.push(new Tn(l,this.editor,o,o?n:null))}),e}get firstChild(){return this.children[0]||null}get lastChild(){let e=this.children;return e[e.length-1]||null}closest(e,n={}){let r=null,o=this.parent;for(;o&&!r;){if(o.node.type.name===e)if(Object.keys(n).length>0){let i=o.node.attrs,s=Object.keys(n);for(let l=0;l{r&&o.length>0||(s.node.type.name===e&&i.every(a=>n[a]===s.node.attrs[a])&&o.push(s),!(r&&o.length>0)&&(o=o.concat(s.querySelectorAll(e,n,r))))}),o}setAttribute(e){let{tr:n}=this.editor.state;n.setNodeMarkup(this.from,void 0,{...this.node.attrs,...e}),this.editor.view.dispatch(n)}},wb=`.ProseMirror { + position: relative; } -%t [data-trix-dialog] { - display: none; +.ProseMirror { + word-wrap: break-word; + white-space: pre-wrap; + white-space: break-spaces; + -webkit-font-variant-ligatures: none; + font-variant-ligatures: none; + font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ } -%t [data-trix-dialog][data-trix-active] { - display: block; +.ProseMirror [contenteditable="false"] { + white-space: normal; } -%t [data-trix-dialog] [data-trix-validate]:invalid { - background-color: #ffdddd; -}`);var Zt=class extends HTMLElement{connectedCallback(){this.innerHTML===""&&(this.innerHTML=Ci.getDefaultHTML())}},ir=0,nr=function(n){if(!n.hasAttribute("contenteditable"))return n.setAttribute("contenteditable",""),function(t){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return e.times=1,p(t,e)}("focus",{onElement:n,withCallback:()=>rr(n)})},rr=function(n){return or(n),sr(n)},or=function(n){var t,e;if((t=(e=document).queryCommandSupported)!==null&&t!==void 0&&t.call(e,"enableObjectResizing"))return document.execCommand("enableObjectResizing",!1,!1),p("mscontrolselect",{onElement:n,preventDefault:!0})},sr=function(n){var t,e;if((t=(e=document).queryCommandSupported)!==null&&t!==void 0&&t.call(e,"DefaultParagraphSeparator")){let{tagName:i}=y.default;if(["div","p"].includes(i))return document.execCommand("DefaultParagraphSeparator",!1,i)}},bi=St.forcesObjectResizing?{display:"inline",width:"auto"}:{display:"inline-block",width:"1px"};ki("trix-editor",`%t { - display: block; +.ProseMirror [contenteditable="false"] [contenteditable="true"] { + white-space: pre-wrap; } -%t:empty::before { - content: attr(placeholder); - color: graytext; - cursor: text; - pointer-events: none; - white-space: pre-line; +.ProseMirror pre { + white-space: pre-wrap; } -%t a[contenteditable=false] { - cursor: text; +img.ProseMirror-separator { + display: inline !important; + border: none !important; + margin: 0 !important; + width: 0 !important; + height: 0 !important; } -%t img { - max-width: 100%; - height: auto; +.ProseMirror-gapcursor { + display: none; + pointer-events: none; + position: absolute; + margin: 0; } -%t `.concat(K,` figcaption textarea { - resize: none; +.ProseMirror-gapcursor:after { + content: ""; + display: block; + position: absolute; + top: -2px; + width: 20px; + border-top: 1px solid black; + animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; } -%t `).concat(K,` figcaption textarea.trix-autoresize-clone { - position: absolute; - left: -9999px; - max-height: 0px; +@keyframes ProseMirror-cursor-blink { + to { + visibility: hidden; + } } -%t `).concat(K,` figcaption[data-trix-placeholder]:empty::before { - content: attr(data-trix-placeholder); - color: graytext; +.ProseMirror-hideselection *::selection { + background: transparent; } -%t [data-trix-cursor-target] { - display: `).concat(bi.display,` !important; - width: `).concat(bi.width,` !important; - padding: 0 !important; - margin: 0 !important; - border: none !important; +.ProseMirror-hideselection *::-moz-selection { + background: transparent; } -%t [data-trix-cursor-target=left] { - vertical-align: top !important; - margin-left: -1px !important; +.ProseMirror-hideselection * { + caret-color: transparent; } -%t [data-trix-cursor-target=right] { - vertical-align: bottom !important; - margin-right: -1px !important; -}`));var Qt=class extends HTMLElement{get trixId(){return this.hasAttribute("trix-id")?this.getAttribute("trix-id"):(this.setAttribute("trix-id",++ir),this.trixId)}get labels(){let t=[];this.id&&this.ownerDocument&&t.push(...Array.from(this.ownerDocument.querySelectorAll("label[for='".concat(this.id,"']"))||[]));let e=q(this,{matchingSelector:"label"});return e&&[this,null].includes(e.control)&&t.push(e),t}get toolbarElement(){var t;if(this.hasAttribute("toolbar"))return(t=this.ownerDocument)===null||t===void 0?void 0:t.getElementById(this.getAttribute("toolbar"));if(this.parentNode){let e="trix-toolbar-".concat(this.trixId);this.setAttribute("toolbar",e);let i=d("trix-toolbar",{id:e});return this.parentNode.insertBefore(i,this),i}}get form(){var t;return(t=this.inputElement)===null||t===void 0?void 0:t.form}get inputElement(){var t;if(this.hasAttribute("input"))return(t=this.ownerDocument)===null||t===void 0?void 0:t.getElementById(this.getAttribute("input"));if(this.parentNode){let e="trix-input-".concat(this.trixId);this.setAttribute("input",e);let i=d("input",{type:"hidden",id:e});return this.parentNode.insertBefore(i,this.nextElementSibling),i}}get editor(){var t;return(t=this.editorController)===null||t===void 0?void 0:t.editor}get name(){var t;return(t=this.inputElement)===null||t===void 0?void 0:t.name}get value(){var t;return(t=this.inputElement)===null||t===void 0?void 0:t.value}set value(t){var e;this.defaultValue=t,(e=this.editor)===null||e===void 0||e.loadHTML(this.defaultValue)}notify(t,e){if(this.editorController)return vt("trix-".concat(t),{onElement:this,attributes:e})}setInputElementValue(t){this.inputElement&&(this.inputElement.value=t)}connectedCallback(){this.hasAttribute("data-trix-internal")||(nr(this),function(t){t.hasAttribute("role")||t.setAttribute("role","textbox")}(this),function(t){if(t.hasAttribute("aria-label")||t.hasAttribute("aria-labelledby"))return;let e=function(){let i=Array.from(t.labels).map(o=>{if(!o.contains(t))return o.textContent}).filter(o=>o),r=i.join(" ");return r?t.setAttribute("aria-label",r):t.removeAttribute("aria-label")};e(),p("focus",{onElement:t,withCallback:e})}(this),this.editorController||(vt("trix-before-initialize",{onElement:this}),this.editorController=new X({editorElement:this,html:this.defaultValue=this.value}),requestAnimationFrame(()=>vt("trix-initialize",{onElement:this}))),this.editorController.registerSelectionManager(),this.registerResetListener(),this.registerClickListener(),function(t){!document.querySelector(":focus")&&t.hasAttribute("autofocus")&&document.querySelector("[autofocus]")===t&&t.focus()}(this))}disconnectedCallback(){var t;return(t=this.editorController)===null||t===void 0||t.unregisterSelectionManager(),this.unregisterResetListener(),this.unregisterClickListener()}registerResetListener(){return this.resetListener=this.resetBubbled.bind(this),window.addEventListener("reset",this.resetListener,!1)}unregisterResetListener(){return window.removeEventListener("reset",this.resetListener,!1)}registerClickListener(){return this.clickListener=this.clickBubbled.bind(this),window.addEventListener("click",this.clickListener,!1)}unregisterClickListener(){return window.removeEventListener("click",this.clickListener,!1)}resetBubbled(t){if(!t.defaultPrevented&&t.target===this.form)return this.reset()}clickBubbled(t){if(t.defaultPrevented||this.contains(t.target))return;let e=q(t.target,{matchingSelector:"label"});return e&&Array.from(this.labels).includes(e)?this.focus():void 0}reset(){this.value=this.defaultValue}},T={VERSION:Mi,config:Lt,core:wn,models:Pi,views:In,controllers:Qn,observers:tr,operations:er,elements:Object.freeze({__proto__:null,TrixEditorElement:Qt,TrixToolbarElement:Zt}),filters:Object.freeze({__proto__:null,Filter:Vt,attachmentGalleryFilter:Bi})};Object.assign(T,Pi),window.Trix=T,setTimeout(function(){customElements.get("trix-toolbar")||customElements.define("trix-toolbar",Zt),customElements.get("trix-editor")||customElements.define("trix-editor",Qt)},0);T.config.blockAttributes.default.tagName="p";T.config.blockAttributes.default.breakOnReturn=!0;T.config.blockAttributes.heading={tagName:"h2",terminal:!0,breakOnReturn:!0,group:!1};T.config.blockAttributes.subHeading={tagName:"h3",terminal:!0,breakOnReturn:!0,group:!1};T.config.textAttributes.underline={style:{textDecoration:"underline"},inheritable:!0,parser:n=>window.getComputedStyle(n).textDecoration.includes("underline")};T.Block.prototype.breaksOnReturn=function(){let n=this.getLastAttribute();return T.config.blockAttributes[n||"default"]?.breakOnReturn??!1};T.LineBreakInsertion.prototype.shouldInsertBlockBreak=function(){return this.block.hasAttributes()&&this.block.isListItem()&&!this.block.isEmpty()?this.startLocation.offset>0:this.shouldBreakFormattedBlock()?!1:this.breaksOnReturn};function ar({state:n}){return{state:n,init:function(){this.$refs.trixValue.value=this.state,this.$refs.trix.editor?.loadHTML(this.state??""),this.$watch("state",()=>{document.activeElement!==this.$refs.trix&&(this.$refs.trixValue.value=this.state,this.$refs.trix.editor?.loadHTML(this.state??""))})}}}export{ar as default}; +.ProseMirror-focused .ProseMirror-gapcursor { + display: block; +}`;function xb(t,e,n){let r=document.querySelector(`style[data-tiptap-style${n?`-${n}`:""}]`);if(r!==null)return r;let o=document.createElement("style");return e&&o.setAttribute("nonce",e),o.setAttribute(`data-tiptap-style${n?`-${n}`:""}`,""),o.innerHTML=t,document.getElementsByTagName("head")[0].appendChild(o),o}var gu=class extends lb{constructor(t={}){super(),this.css=null,this.className="tiptap",this.editorView=null,this.isFocused=!1,this.isInitialized=!1,this.extensionStorage={},this.instanceId=Math.random().toString(36).slice(2,9),this.options={element:typeof document<"u"?document.createElement("div"):null,content:"",injectCSS:!0,injectNonce:void 0,extensions:[],autofocus:!1,editable:!0,textDirection:void 0,editorProps:{},parseOptions:{},coreExtensionOptions:{},enableInputRules:!0,enablePasteRules:!0,enableCoreExtensions:!0,enableContentCheck:!1,emitContentError:!1,onBeforeCreate:()=>null,onCreate:()=>null,onMount:()=>null,onUnmount:()=>null,onUpdate:()=>null,onSelectionUpdate:()=>null,onTransaction:()=>null,onFocus:()=>null,onBlur:()=>null,onDestroy:()=>null,onContentError:({error:r})=>{throw r},onPaste:()=>null,onDrop:()=>null,onDelete:()=>null},this.isCapturingTransaction=!1,this.capturedTransaction=null,this.utils={getUpdatedPosition:Hy,createMappablePosition:$y},this.setOptions(t),this.createExtensionManager(),this.createCommandManager(),this.createSchema(),this.on("beforeCreate",this.options.onBeforeCreate),this.emit("beforeCreate",{editor:this}),this.on("mount",this.options.onMount),this.on("unmount",this.options.onUnmount),this.on("contentError",this.options.onContentError),this.on("create",this.options.onCreate),this.on("update",this.options.onUpdate),this.on("selectionUpdate",this.options.onSelectionUpdate),this.on("transaction",this.options.onTransaction),this.on("focus",this.options.onFocus),this.on("blur",this.options.onBlur),this.on("destroy",this.options.onDestroy),this.on("drop",({event:r,slice:o,moved:i})=>this.options.onDrop(r,o,i)),this.on("paste",({event:r,slice:o})=>this.options.onPaste(r,o)),this.on("delete",this.options.onDelete);let e=this.createDoc(),n=Fd(e,this.options.autofocus);this.editorState=Fr.create({doc:e,schema:this.schema,selection:n||void 0}),this.options.element&&this.mount(this.options.element)}mount(t){if(typeof document>"u")throw new Error("[tiptap error]: The editor cannot be mounted because there is no 'document' defined in this environment.");this.createView(t),this.emit("mount",{editor:this}),this.css&&!document.head.contains(this.css)&&document.head.appendChild(this.css),window.setTimeout(()=>{this.isDestroyed||(this.options.autofocus!==!1&&this.options.autofocus!==null&&this.commands.focus(this.options.autofocus),this.emit("create",{editor:this}),this.isInitialized=!0)},0)}unmount(){if(this.editorView){let t=this.editorView.dom;t?.editor&&delete t.editor,this.editorView.destroy()}if(this.editorView=null,this.isInitialized=!1,this.css&&!document.querySelectorAll(`.${this.className}`).length)try{typeof this.css.remove=="function"?this.css.remove():this.css.parentNode&&this.css.parentNode.removeChild(this.css)}catch(t){console.warn("Failed to remove CSS element:",t)}this.css=null,this.emit("unmount",{editor:this})}get storage(){return this.extensionStorage}get commands(){return this.commandManager.commands}chain(){return this.commandManager.chain()}can(){return this.commandManager.can()}injectCSS(){this.options.injectCSS&&typeof document<"u"&&(this.css=xb(wb,this.options.injectNonce))}setOptions(t={}){this.options={...this.options,...t},!(!this.editorView||!this.state||this.isDestroyed)&&(this.options.editorProps&&this.view.setProps(this.options.editorProps),this.view.updateState(this.state))}setEditable(t,e=!0){this.setOptions({editable:t}),e&&this.emit("update",{editor:this,transaction:this.state.tr,appendedTransactions:[]})}get isEditable(){return this.options.editable&&this.view&&this.view.editable}get view(){return this.editorView?this.editorView:new Proxy({state:this.editorState,updateState:t=>{this.editorState=t},dispatch:t=>{this.dispatchTransaction(t)},composing:!1,dragging:null,editable:!0,isDestroyed:!1},{get:(t,e)=>{if(this.editorView)return this.editorView[e];if(e==="state")return this.editorState;if(e in t)return Reflect.get(t,e);throw new Error(`[tiptap error]: The editor view is not available. Cannot access view['${e}']. The editor may not be mounted yet.`)}})}get state(){return this.editorView&&(this.editorState=this.view.state),this.editorState}registerPlugin(t,e){let n=Ud(e)?e(t,[...this.state.plugins]):[...this.state.plugins,t],r=this.state.reconfigure({plugins:n});return this.view.updateState(r),r}unregisterPlugin(t){if(this.isDestroyed)return;let e=this.state.plugins,n=e;if([].concat(t).forEach(o=>{let i=typeof o=="string"?`${o}$`:o.key;n=n.filter(s=>!s.key.startsWith(i))}),e.length===n.length)return;let r=this.state.reconfigure({plugins:n});return this.view.updateState(r),r}createExtensionManager(){var t,e;let r=[...this.options.enableCoreExtensions?[cu,iu.configure({blockSeparator:(e=(t=this.options.coreExtensionOptions)==null?void 0:t.clipboardTextSerializer)==null?void 0:e.blockSeparator}),su,uu,fu,pu,au,hu,lu,mu.configure({direction:this.options.textDirection})].filter(o=>typeof this.options.enableCoreExtensions=="object"?this.options.enableCoreExtensions[o.name]!==!1:!0):[],...this.options.extensions].filter(o=>["extension","node","mark"].includes(o?.type));this.extensionManager=new yo(r,this)}createCommandManager(){this.commandManager=new uo({editor:this})}createSchema(){this.schema=this.extensionManager.schema}createDoc(){let t;try{t=_s(this.options.content,this.schema,this.options.parseOptions,{errorOnInvalidContent:this.options.enableContentCheck})}catch(e){if(!(e instanceof Error)||!["[tiptap error]: Invalid JSON content","[tiptap error]: Invalid HTML content"].includes(e.message))throw e;this.emit("contentError",{editor:this,error:e,disableCollaboration:()=>{"collaboration"in this.storage&&typeof this.storage.collaboration=="object"&&this.storage.collaboration&&(this.storage.collaboration.isDisabled=!0),this.options.extensions=this.options.extensions.filter(n=>n.name!=="collaboration"),this.createExtensionManager()}}),t=_s(this.options.content,this.schema,this.options.parseOptions,{errorOnInvalidContent:!1})}return t}createView(t){var e;this.editorView=new tr(t,{...this.options.editorProps,attributes:{role:"textbox",...(e=this.options.editorProps)==null?void 0:e.attributes},dispatchTransaction:this.dispatchTransaction.bind(this),state:this.editorState,markViews:this.extensionManager.markViews,nodeViews:this.extensionManager.nodeViews});let n=this.state.reconfigure({plugins:this.extensionManager.plugins});this.view.updateState(n),this.prependClass(),this.injectCSS();let r=this.view.dom;r.editor=this}createNodeViews(){this.view.isDestroyed||this.view.setProps({markViews:this.extensionManager.markViews,nodeViews:this.extensionManager.nodeViews})}prependClass(){this.view.dom.className=`${this.className} ${this.view.dom.className}`}captureTransaction(t){this.isCapturingTransaction=!0,t(),this.isCapturingTransaction=!1;let e=this.capturedTransaction;return this.capturedTransaction=null,e}dispatchTransaction(t){if(this.view.isDestroyed)return;if(this.isCapturingTransaction){if(!this.capturedTransaction){this.capturedTransaction=t;return}t.steps.forEach(c=>{var d;return(d=this.capturedTransaction)==null?void 0:d.step(c)});return}let{state:e,transactions:n}=this.state.applyTransaction(t),r=!this.state.selection.eq(e.selection),o=n.includes(t),i=this.state;if(this.emit("beforeTransaction",{editor:this,transaction:t,nextState:e}),!o)return;this.view.updateState(e),this.emit("transaction",{editor:this,transaction:t,appendedTransactions:n.slice(1)}),r&&this.emit("selectionUpdate",{editor:this,transaction:t});let s=n.findLast(c=>c.getMeta("focus")||c.getMeta("blur")),l=s?.getMeta("focus"),a=s?.getMeta("blur");l&&this.emit("focus",{editor:this,event:l.event,transaction:s}),a&&this.emit("blur",{editor:this,event:a.event,transaction:s}),!(t.getMeta("preventUpdate")||!n.some(c=>c.docChanged)||i.doc.eq(e.doc))&&this.emit("update",{editor:this,transaction:t,appendedTransactions:n.slice(1)})}getAttributes(t){return Zs(this.state,t)}isActive(t,e){let n=typeof t=="string"?t:null,r=typeof t=="string"?e:t;return tl(this.state,n,r)}getJSON(){return this.state.doc.toJSON()}getHTML(){return Ys(this.state.doc.content,this.schema)}getText(t){let{blockSeparator:e=` + +`,textSerializers:n={}}=t||{};return Iy(this.state.doc,{blockSeparator:e,textSerializers:{...Gd(this.schema),...n}})}get isEmpty(){return lr(this.state.doc)}destroy(){this.emit("destroy"),this.unmount(),this.removeAllListeners()}get isDestroyed(){var t,e;return(e=(t=this.editorView)==null?void 0:t.isDestroyed)!=null?e:!0}$node(t,e){var n;return((n=this.$doc)==null?void 0:n.querySelector(t,e))||null}$nodes(t,e){var n;return((n=this.$doc)==null?void 0:n.querySelectorAll(t,e))||null}$pos(t){let e=this.state.doc.resolve(t);return new bb(e,this)}get $doc(){return this.$pos(0)}};function Be(t){return new go({find:t.find,handler:({state:e,range:n,match:r})=>{let o=G(t.getAttributes,void 0,r);if(o===!1||o===null)return null;let{tr:i}=e,s=r[r.length-1],l=r[0];if(s){let a=l.search(/\S/),c=n.from+l.indexOf(s),d=c+s.length;if(po(n.from,n.to,e.doc).filter(h=>h.mark.type.excluded.find(m=>m===t.type&&m!==h.mark.type)).filter(h=>h.to>c).length)return null;dn.from&&i.delete(n.from+a,c);let f=n.from+a+s.length;i.addMark(n.from+a,f,t.type.create(o||{})),i.removeStoredMark(t.type)}},undoable:t.undoable})}function bo(t){return new go({find:t.find,handler:({state:e,range:n,match:r})=>{let o=G(t.getAttributes,void 0,r)||{},{tr:i}=e,s=n.from,l=n.to,a=t.type.create(o);if(r[1]){let c=r[0].lastIndexOf(r[1]),d=s+c;d>l?d=l:l=d+r[1].length;let u=r[0][r[0].length-1];i.insertText(u,s+r[0].length-1),i.replaceWith(d,l,a)}else if(r[0]){let c=t.type.isInline?s:s-1;i.insert(c,t.type.create(o)).delete(i.mapping.map(s),i.mapping.map(l))}i.scrollIntoView()},undoable:t.undoable})}function ar(t){return new go({find:t.find,handler:({state:e,range:n,match:r})=>{let o=e.doc.resolve(n.from),i=G(t.getAttributes,void 0,r)||{};if(!o.node(-1).canReplaceWith(o.index(-1),o.indexAfter(-1),t.type))return null;e.tr.delete(n.from,n.to).setBlockType(n.from,n.from,t.type,i)},undoable:t.undoable})}function tt(t){return new go({find:t.find,handler:({state:e,range:n,match:r,chain:o})=>{let i=G(t.getAttributes,void 0,r)||{},s=e.tr.delete(n.from,n.to),a=s.doc.resolve(n.from).blockRange(),c=a&&mn(a,t.type,i);if(!c)return null;if(s.wrap(a,c),t.keepMarks&&t.editor){let{selection:u,storedMarks:f}=e,{splittableMarks:h}=t.editor.extensionManager,p=f||u.$to.parentOffset&&u.$from.marks();if(p){let m=p.filter(g=>h.includes(g.type.name));s.ensureMarks(m)}}if(t.keepAttributes){let u=t.type.name==="bulletList"||t.type.name==="orderedList"?"listItem":"taskList";o().updateAttributes(u,i).run()}let d=s.doc.resolve(n.from-1).nodeBefore;d&&d.type===t.type&&Re(s.doc,n.from-1)&&(!t.joinPredicate||t.joinPredicate(r,d))&&s.join(n.from-1)},undoable:t.undoable})}var kb=t=>"touches"in t,yu=class{constructor(t){this.directions=["bottom-left","bottom-right","top-left","top-right"],this.minSize={height:8,width:8},this.preserveAspectRatio=!1,this.classNames={container:"",wrapper:"",handle:"",resizing:""},this.initialWidth=0,this.initialHeight=0,this.aspectRatio=1,this.isResizing=!1,this.activeHandle=null,this.startX=0,this.startY=0,this.startWidth=0,this.startHeight=0,this.isShiftKeyPressed=!1,this.lastEditableState=void 0,this.handleMap=new Map,this.handleMouseMove=l=>{if(!this.isResizing||!this.activeHandle)return;let a=l.clientX-this.startX,c=l.clientY-this.startY;this.handleResize(a,c)},this.handleTouchMove=l=>{if(!this.isResizing||!this.activeHandle)return;let a=l.touches[0];if(!a)return;let c=a.clientX-this.startX,d=a.clientY-this.startY;this.handleResize(c,d)},this.handleMouseUp=()=>{if(!this.isResizing)return;let l=this.element.offsetWidth,a=this.element.offsetHeight;this.onCommit(l,a),this.isResizing=!1,this.activeHandle=null,this.container.dataset.resizeState="false",this.classNames.resizing&&this.container.classList.remove(this.classNames.resizing),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),document.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("keyup",this.handleKeyUp)},this.handleKeyDown=l=>{l.key==="Shift"&&(this.isShiftKeyPressed=!0)},this.handleKeyUp=l=>{l.key==="Shift"&&(this.isShiftKeyPressed=!1)};var e,n,r,o,i,s;this.node=t.node,this.editor=t.editor,this.element=t.element,this.contentElement=t.contentElement,this.getPos=t.getPos,this.onResize=t.onResize,this.onCommit=t.onCommit,this.onUpdate=t.onUpdate,(e=t.options)!=null&&e.min&&(this.minSize={...this.minSize,...t.options.min}),(n=t.options)!=null&&n.max&&(this.maxSize=t.options.max),(r=t?.options)!=null&&r.directions&&(this.directions=t.options.directions),(o=t.options)!=null&&o.preserveAspectRatio&&(this.preserveAspectRatio=t.options.preserveAspectRatio),(i=t.options)!=null&&i.className&&(this.classNames={container:t.options.className.container||"",wrapper:t.options.className.wrapper||"",handle:t.options.className.handle||"",resizing:t.options.className.resizing||""}),(s=t.options)!=null&&s.createCustomHandle&&(this.createCustomHandle=t.options.createCustomHandle),this.wrapper=this.createWrapper(),this.container=this.createContainer(),this.applyInitialSize(),this.attachHandles(),this.editor.on("update",this.handleEditorUpdate.bind(this))}get dom(){return this.container}get contentDOM(){return this.contentElement}handleEditorUpdate(){let t=this.editor.isEditable;t!==this.lastEditableState&&(this.lastEditableState=t,t?t&&this.handleMap.size===0&&this.attachHandles():this.removeHandles())}update(t,e,n){return t.type!==this.node.type?!1:(this.node=t,this.onUpdate?this.onUpdate(t,e,n):!0)}destroy(){this.isResizing&&(this.container.dataset.resizeState="false",this.classNames.resizing&&this.container.classList.remove(this.classNames.resizing),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),document.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("keyup",this.handleKeyUp),this.isResizing=!1,this.activeHandle=null),this.editor.off("update",this.handleEditorUpdate.bind(this)),this.container.remove()}createContainer(){let t=document.createElement("div");return t.dataset.resizeContainer="",t.dataset.node=this.node.type.name,t.style.display="flex",this.classNames.container&&(t.className=this.classNames.container),t.appendChild(this.wrapper),t}createWrapper(){let t=document.createElement("div");return t.style.position="relative",t.style.display="block",t.dataset.resizeWrapper="",this.classNames.wrapper&&(t.className=this.classNames.wrapper),t.appendChild(this.element),t}createHandle(t){let e=document.createElement("div");return e.dataset.resizeHandle=t,e.style.position="absolute",this.classNames.handle&&(e.className=this.classNames.handle),e}positionHandle(t,e){let n=e.includes("top"),r=e.includes("bottom"),o=e.includes("left"),i=e.includes("right");n&&(t.style.top="0"),r&&(t.style.bottom="0"),o&&(t.style.left="0"),i&&(t.style.right="0"),(e==="top"||e==="bottom")&&(t.style.left="0",t.style.right="0"),(e==="left"||e==="right")&&(t.style.top="0",t.style.bottom="0")}attachHandles(){this.directions.forEach(t=>{let e;this.createCustomHandle?e=this.createCustomHandle(t):e=this.createHandle(t),e instanceof HTMLElement||(console.warn(`[ResizableNodeView] createCustomHandle("${t}") did not return an HTMLElement. Falling back to default handle.`),e=this.createHandle(t)),this.createCustomHandle||this.positionHandle(e,t),e.addEventListener("mousedown",n=>this.handleResizeStart(n,t)),e.addEventListener("touchstart",n=>this.handleResizeStart(n,t)),this.handleMap.set(t,e),this.wrapper.appendChild(e)})}removeHandles(){this.handleMap.forEach(t=>t.remove()),this.handleMap.clear()}applyInitialSize(){let t=this.node.attrs.width,e=this.node.attrs.height;t?(this.element.style.width=`${t}px`,this.initialWidth=t):this.initialWidth=this.element.offsetWidth,e?(this.element.style.height=`${e}px`,this.initialHeight=e):this.initialHeight=this.element.offsetHeight,this.initialWidth>0&&this.initialHeight>0&&(this.aspectRatio=this.initialWidth/this.initialHeight)}handleResizeStart(t,e){t.preventDefault(),t.stopPropagation(),this.isResizing=!0,this.activeHandle=e,kb(t)?(this.startX=t.touches[0].clientX,this.startY=t.touches[0].clientY):(this.startX=t.clientX,this.startY=t.clientY),this.startWidth=this.element.offsetWidth,this.startHeight=this.element.offsetHeight,this.startWidth>0&&this.startHeight>0&&(this.aspectRatio=this.startWidth/this.startHeight);let n=this.getPos();this.container.dataset.resizeState="true",this.classNames.resizing&&this.container.classList.add(this.classNames.resizing),document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("touchmove",this.handleTouchMove),document.addEventListener("mouseup",this.handleMouseUp),document.addEventListener("keydown",this.handleKeyDown),document.addEventListener("keyup",this.handleKeyUp)}handleResize(t,e){if(!this.activeHandle)return;let n=this.preserveAspectRatio||this.isShiftKeyPressed,{width:r,height:o}=this.calculateNewDimensions(this.activeHandle,t,e),i=this.applyConstraints(r,o,n);this.element.style.width=`${i.width}px`,this.element.style.height=`${i.height}px`,this.onResize&&this.onResize(i.width,i.height)}calculateNewDimensions(t,e,n){let r=this.startWidth,o=this.startHeight,i=t.includes("right"),s=t.includes("left"),l=t.includes("bottom"),a=t.includes("top");return i?r=this.startWidth+e:s&&(r=this.startWidth-e),l?o=this.startHeight+n:a&&(o=this.startHeight-n),(t==="right"||t==="left")&&(r=this.startWidth+(i?e:-e)),(t==="top"||t==="bottom")&&(o=this.startHeight+(l?n:-n)),this.preserveAspectRatio||this.isShiftKeyPressed?this.applyAspectRatio(r,o,t):{width:r,height:o}}applyConstraints(t,e,n){var r,o,i,s;if(!n){let c=Math.max(this.minSize.width,t),d=Math.max(this.minSize.height,e);return(r=this.maxSize)!=null&&r.width&&(c=Math.min(this.maxSize.width,c)),(o=this.maxSize)!=null&&o.height&&(d=Math.min(this.maxSize.height,d)),{width:c,height:d}}let l=t,a=e;return lthis.maxSize.width&&(l=this.maxSize.width,a=l/this.aspectRatio),(s=this.maxSize)!=null&&s.height&&a>this.maxSize.height&&(a=this.maxSize.height,l=a*this.aspectRatio),{width:l,height:a}}applyAspectRatio(t,e,n){let r=n==="left"||n==="right",o=n==="top"||n==="bottom";return r?{width:t,height:t/this.aspectRatio}:o?{width:e*this.aspectRatio,height:e}:{width:t,height:t/this.aspectRatio}}};function bu(t,e){let{selection:n}=t,{$from:r}=n;if(n instanceof L){let i=r.index();return r.parent.canReplaceWith(i,i+1,e)}let o=r.depth;for(;o>=0;){let i=r.index(o);if(r.node(o).contentMatchAt(i).matchType(e))return!0;o-=1}return!1}function wu(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}var Sb={};js(Sb,{createAtomBlockMarkdownSpec:()=>Cb,createBlockMarkdownSpec:()=>Zt,createInlineMarkdownSpec:()=>Tb,parseAttributes:()=>rl,parseIndentedBlocks:()=>wo,renderNestedMarkdownContent:()=>cr,serializeAttributes:()=>ol});function rl(t){if(!t?.trim())return{};let e={},n=[],r=t.replace(/["']([^"']*)["']/g,c=>(n.push(c),`__QUOTED_${n.length-1}__`)),o=r.match(/(?:^|\s)\.([a-zA-Z][\w-]*)/g);if(o){let c=o.map(d=>d.trim().slice(1));e.class=c.join(" ")}let i=r.match(/(?:^|\s)#([a-zA-Z][\w-]*)/);i&&(e.id=i[1]);let s=/([a-zA-Z][\w-]*)\s*=\s*(__QUOTED_\d+__)/g;Array.from(r.matchAll(s)).forEach(([,c,d])=>{var u;let f=parseInt(((u=d.match(/__QUOTED_(\d+)__/))==null?void 0:u[1])||"0",10),h=n[f];h&&(e[c]=h.slice(1,-1))});let a=r.replace(/(?:^|\s)\.([a-zA-Z][\w-]*)/g,"").replace(/(?:^|\s)#([a-zA-Z][\w-]*)/g,"").replace(/([a-zA-Z][\w-]*)\s*=\s*__QUOTED_\d+__/g,"").trim();return a&&a.split(/\s+/).filter(Boolean).forEach(d=>{d.match(/^[a-zA-Z][\w-]*$/)&&(e[d]=!0)}),e}function ol(t){if(!t||Object.keys(t).length===0)return"";let e=[];return t.class&&String(t.class).split(/\s+/).filter(Boolean).forEach(r=>e.push(`.${r}`)),t.id&&e.push(`#${t.id}`),Object.entries(t).forEach(([n,r])=>{n==="class"||n==="id"||(r===!0?e.push(n):r!==!1&&r!=null&&e.push(`${n}="${String(r)}"`))}),e.join(" ")}function Cb(t){let{nodeName:e,name:n,parseAttributes:r=rl,serializeAttributes:o=ol,defaultAttributes:i={},requiredAttributes:s=[],allowedAttributes:l}=t,a=n||e,c=d=>{if(!l)return d;let u={};return l.forEach(f=>{f in d&&(u[f]=d[f])}),u};return{parseMarkdown:(d,u)=>{let f={...i,...d.attributes};return u.createNode(e,f,[])},markdownTokenizer:{name:e,level:"block",start(d){var u;let f=new RegExp(`^:::${a}(?:\\s|$)`,"m"),h=(u=d.match(f))==null?void 0:u.index;return h!==void 0?h:-1},tokenize(d,u,f){let h=new RegExp(`^:::${a}(?:\\s+\\{([^}]*)\\})?\\s*:::(?:\\n|$)`),p=d.match(h);if(!p)return;let m=p[1]||"",g=r(m);if(!s.find(w=>!(w in g)))return{type:e,raw:p[0],attributes:g}}},renderMarkdown:d=>{let u=c(d.attrs||{}),f=o(u),h=f?` {${f}}`:"";return`:::${a}${h} :::`}}}function Zt(t){let{nodeName:e,name:n,getContent:r,parseAttributes:o=rl,serializeAttributes:i=ol,defaultAttributes:s={},content:l="block",allowedAttributes:a}=t,c=n||e,d=u=>{if(!a)return u;let f={};return a.forEach(h=>{h in u&&(f[h]=u[h])}),f};return{parseMarkdown:(u,f)=>{let h;if(r){let m=r(u);h=typeof m=="string"?[{type:"text",text:m}]:m}else l==="block"?h=f.parseChildren(u.tokens||[]):h=f.parseInline(u.tokens||[]);let p={...s,...u.attributes};return f.createNode(e,p,h)},markdownTokenizer:{name:e,level:"block",start(u){var f;let h=new RegExp(`^:::${c}`,"m"),p=(f=u.match(h))==null?void 0:f.index;return p!==void 0?p:-1},tokenize(u,f,h){var p;let m=new RegExp(`^:::${c}(?:\\s+\\{([^}]*)\\})?\\s*\\n`),g=u.match(m);if(!g)return;let[y,w=""]=g,b=o(w),C=1,x=y.length,S="",k=/^:::([\w-]*)(\s.*)?/gm,O=u.slice(x);for(k.lastIndex=0;;){let T=k.exec(O);if(T===null)break;let A=T.index,$=T[1];if(!((p=T[2])!=null&&p.endsWith(":::"))){if($)C+=1;else if(C-=1,C===0){let z=O.slice(0,A);S=z.trim();let K=u.slice(0,x+A+T[0].length),V=[];if(S)if(l==="block")for(V=h.blockTokens(z),V.forEach(N=>{N.text&&(!N.tokens||N.tokens.length===0)&&(N.tokens=h.inlineTokens(N.text))});V.length>0;){let N=V[V.length-1];if(N.type==="paragraph"&&(!N.text||N.text.trim()===""))V.pop();else break}else V=h.inlineTokens(S);return{type:e,raw:K,attributes:b,content:S,tokens:V}}}}}},renderMarkdown:(u,f)=>{let h=d(u.attrs||{}),p=i(h),m=p?` {${p}}`:"",g=f.renderChildren(u.content||[],` + +`);return`:::${c}${m} + +${g} + +:::`}}}function vb(t){if(!t.trim())return{};let e={},n=/(\w+)=(?:"([^"]*)"|'([^']*)')/g,r=n.exec(t);for(;r!==null;){let[,o,i,s]=r;e[o]=i||s,r=n.exec(t)}return e}function Mb(t){return Object.entries(t).filter(([,e])=>e!=null).map(([e,n])=>`${e}="${n}"`).join(" ")}function Tb(t){let{nodeName:e,name:n,getContent:r,parseAttributes:o=vb,serializeAttributes:i=Mb,defaultAttributes:s={},selfClosing:l=!1,allowedAttributes:a}=t,c=n||e,d=f=>{if(!a)return f;let h={};return a.forEach(p=>{let m=typeof p=="string"?p:p.name,g=typeof p=="string"?void 0:p.skipIfDefault;if(m in f){let y=f[m];if(g!==void 0&&y===g)return;h[m]=y}}),h},u=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return{parseMarkdown:(f,h)=>{let p={...s,...f.attributes};if(l)return h.createNode(e,p);let m=r?r(f):f.content||"";return m?h.createNode(e,p,[h.createTextNode(m)]):h.createNode(e,p,[])},markdownTokenizer:{name:e,level:"inline",start(f){let h=l?new RegExp(`\\[${u}\\s*[^\\]]*\\]`):new RegExp(`\\[${u}\\s*[^\\]]*\\][\\s\\S]*?\\[\\/${u}\\]`),p=f.match(h),m=p?.index;return m!==void 0?m:-1},tokenize(f,h,p){let m=l?new RegExp(`^\\[${u}\\s*([^\\]]*)\\]`):new RegExp(`^\\[${u}\\s*([^\\]]*)\\]([\\s\\S]*?)\\[\\/${u}\\]`),g=f.match(m);if(!g)return;let y="",w="";if(l){let[,C]=g;w=C}else{let[,C,x]=g;w=C,y=x||""}let b=o(w.trim());return{type:e,raw:g[0],content:y.trim(),attributes:b}}},renderMarkdown:f=>{let h="";r?h=r(f):f.content&&f.content.length>0&&(h=f.content.filter(y=>y.type==="text").map(y=>y.text).join(""));let p=d(f.attrs||{}),m=i(p),g=m?` ${m}`:"";return l?`[${c}${g}]`:`[${c}${g}]${h}[/${c}]`}}}function wo(t,e,n){var r,o,i,s;let l=t.split(` +`),a=[],c="",d=0,u=e.baseIndentSize||2;for(;d0)break;if(f.trim()===""){d+=1,c=`${c}${f} +`;continue}else return}let p=e.extractItemData(h),{indentLevel:m,mainContent:g}=p;c=`${c}${f} +`;let y=[g];for(d+=1;dA.trim()!=="");if(k===-1)break;if((((o=(r=l[d+1+k].match(/^(\s*)/))==null?void 0:r[1])==null?void 0:o.length)||0)>m){y.push(x),c=`${c}${x} +`,d+=1;continue}else break}if((((s=(i=x.match(/^(\s*)/))==null?void 0:i[1])==null?void 0:s.length)||0)>m)y.push(x),c=`${c}${x} +`,d+=1;else break}let w,b=y.slice(1);if(b.length>0){let x=b.map(S=>S.slice(m+u)).join(` +`);x.trim()&&(e.customNestedParser?w=e.customNestedParser(x):w=n.blockTokens(x))}let C=e.createToken(p,w);a.push(C)}if(a.length!==0)return{items:a,raw:c}}function cr(t,e,n,r){if(!t||!Array.isArray(t.content))return"";let o=typeof n=="function"?n(r):n,[i,...s]=t.content,l=e.renderChildren([i]),a=[`${o}${l}`];return s&&s.length>0&&s.forEach(c=>{let d=e.renderChildren([c]);if(d){let u=d.split(` +`).map(f=>f?e.indent(f):"").join(` +`);a.push(u)}}),a.join(` +`)}function Ab(t,e,n={}){let{state:r}=e,{doc:o,tr:i}=r,s=t;o.descendants((l,a)=>{let c=i.mapping.map(a),d=i.mapping.map(a)+l.nodeSize,u=null;if(l.marks.forEach(h=>{if(h!==s)return!1;u=h}),!u)return;let f=!1;if(Object.keys(n).forEach(h=>{n[h]!==u.attrs[h]&&(f=!0)}),f){let h=t.type.create({...t.attrs,...n});i.removeMark(c,d,t.type),i.addMark(c,d,h)}}),i.docChanged&&e.view.dispatch(i)}var F=class xu extends nl{constructor(){super(...arguments),this.type="node"}static create(e={}){let n=typeof e=="function"?e():e;return new xu(n)}configure(e){return super.configure(e)}extend(e){let n=typeof e=="function"?e():e;return super.extend(n)}};function Me(t){return new fb({find:t.find,handler:({state:e,range:n,match:r,pasteEvent:o})=>{let i=G(t.getAttributes,void 0,r,o);if(i===!1||i===null)return null;let{tr:s}=e,l=r[r.length-1],a=r[0],c=n.to;if(l){let d=a.search(/\S/),u=n.from+a.indexOf(l),f=u+l.length;if(po(n.from,n.to,e.doc).filter(p=>p.mark.type.excluded.find(g=>g===t.type&&g!==p.mark.type)).filter(p=>p.to>u).length)return null;fn.from&&s.delete(n.from+d,u),c=n.from+d+l.length,s.addMark(n.from+d,c,t.type.create(i||{})),s.removeStoredMark(t.type)}}})}function ku(t={}){return new P({view(e){return new il(e,t)}})}var il=class{constructor(e,n){var r;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.width=(r=n.width)!==null&&r!==void 0?r:1,this.color=n.color===!1?void 0:n.color||"black",this.class=n.class,this.handlers=["dragover","dragend","drop","dragleave"].map(o=>{let i=s=>{this[o](s)};return e.dom.addEventListener(o,i),{name:o,handler:i}})}destroy(){this.handlers.forEach(({name:e,handler:n})=>this.editorView.dom.removeEventListener(e,n))}update(e,n){this.cursorPos!=null&&n.doc!=e.state.doc&&(this.cursorPos>e.state.doc.content.size?this.setCursor(null):this.updateOverlay())}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),n=!e.parent.inlineContent,r,o=this.editorView.dom,i=o.getBoundingClientRect(),s=i.width/o.offsetWidth,l=i.height/o.offsetHeight;if(n){let u=e.nodeBefore,f=e.nodeAfter;if(u||f){let h=this.editorView.nodeDOM(this.cursorPos-(u?u.nodeSize:0));if(h){let p=h.getBoundingClientRect(),m=u?p.bottom:p.top;u&&f&&(m=(m+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let g=this.width/2*l;r={left:p.left,right:p.right,top:m-g,bottom:m+g}}}}if(!r){let u=this.editorView.coordsAtPos(this.cursorPos),f=this.width/2*s;r={left:u.left-f,right:u.left+f,top:u.top,bottom:u.bottom}}let a=this.editorView.dom.offsetParent;this.element||(this.element=a.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",n),this.element.classList.toggle("prosemirror-dropcursor-inline",!n);let c,d;if(!a||a==document.body&&getComputedStyle(a).position=="static")c=-pageXOffset,d=-pageYOffset;else{let u=a.getBoundingClientRect(),f=u.width/a.offsetWidth,h=u.height/a.offsetHeight;c=u.left-a.scrollLeft*f,d=u.top-a.scrollTop*h}this.element.style.left=(r.left-c)/s+"px",this.element.style.top=(r.top-d)/l+"px",this.element.style.width=(r.right-r.left)/s+"px",this.element.style.height=(r.bottom-r.top)/l+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}dragover(e){if(!this.editorView.editable)return;let n=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),r=n&&n.inside>=0&&this.editorView.state.doc.nodeAt(n.inside),o=r&&r.type.spec.disableDropCursor,i=typeof o=="function"?o(this.editorView,n,e):o;if(n&&!i){let s=n.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let l=zr(this.editorView.state.doc,s,this.editorView.dragging.slice);l!=null&&(s=l)}this.setCursor(s),this.scheduleRemoval(5e3)}}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}};var ae=class t extends I{constructor(e){super(e,e)}map(e,n){let r=e.resolve(n.map(this.head));return t.valid(r)?new t(r):I.near(r)}content(){return E.empty}eq(e){return e instanceof t&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,n){if(typeof n.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new t(e.resolve(n.pos))}getBookmark(){return new sl(this.anchor)}static valid(e){let n=e.parent;if(n.isTextblock||!Eb(e)||!Nb(e))return!1;let r=n.type.spec.allowGapCursor;if(r!=null)return r;let o=n.contentMatchAt(e.index()).defaultType;return o&&o.isTextblock}static findGapCursorFrom(e,n,r=!1){e:for(;;){if(!r&&t.valid(e))return e;let o=e.pos,i=null;for(let s=e.depth;;s--){let l=e.node(s);if(n>0?e.indexAfter(s)0){i=l.child(n>0?e.indexAfter(s):e.index(s)-1);break}else if(s==0)return null;o+=n;let a=e.doc.resolve(o);if(t.valid(a))return a}for(;;){let s=n>0?i.firstChild:i.lastChild;if(!s){if(i.isAtom&&!i.isText&&!L.isSelectable(i)){e=e.doc.resolve(o+i.nodeSize*n),r=!1;continue e}break}i=s,o+=n;let l=e.doc.resolve(o);if(t.valid(l))return l}return null}}};ae.prototype.visible=!1;ae.findFrom=ae.findGapCursorFrom;I.jsonID("gapcursor",ae);var sl=class t{constructor(e){this.pos=e}map(e){return new t(e.map(this.pos))}resolve(e){let n=e.resolve(this.pos);return ae.valid(n)?new ae(n):I.near(n)}};function Su(t){return t.isAtom||t.spec.isolating||t.spec.createGapCursor}function Eb(t){for(let e=t.depth;e>=0;e--){let n=t.index(e),r=t.node(e);if(n==0){if(r.type.spec.isolating)return!0;continue}for(let o=r.child(n-1);;o=o.lastChild){if(o.childCount==0&&!o.inlineContent||Su(o.type))return!0;if(o.inlineContent)return!1}}return!0}function Nb(t){for(let e=t.depth;e>=0;e--){let n=t.indexAfter(e),r=t.node(e);if(n==r.childCount){if(r.type.spec.isolating)return!0;continue}for(let o=r.child(n);;o=o.firstChild){if(o.childCount==0&&!o.inlineContent||Su(o.type))return!0;if(o.inlineContent)return!1}}return!0}function Cu(){return new P({props:{decorations:Ib,createSelectionBetween(t,e,n){return e.pos==n.pos&&ae.valid(n)?new ae(n):null},handleClick:Rb,handleKeyDown:Ob,handleDOMEvents:{beforeinput:Db}}})}var Ob=or({ArrowLeft:xo("horiz",-1),ArrowRight:xo("horiz",1),ArrowUp:xo("vert",-1),ArrowDown:xo("vert",1)});function xo(t,e){let n=t=="vert"?e>0?"down":"up":e>0?"right":"left";return function(r,o,i){let s=r.selection,l=e>0?s.$to:s.$from,a=s.empty;if(s instanceof D){if(!i.endOfTextblock(n)||l.depth==0)return!1;a=!1,l=r.doc.resolve(e>0?l.after():l.before())}let c=ae.findGapCursorFrom(l,e,a);return c?(o&&o(r.tr.setSelection(new ae(c))),!0):!1}}function Rb(t,e,n){if(!t||!t.editable)return!1;let r=t.state.doc.resolve(e);if(!ae.valid(r))return!1;let o=t.posAtCoords({left:n.clientX,top:n.clientY});return o&&o.inside>-1&&L.isSelectable(t.state.doc.nodeAt(o.inside))?!1:(t.dispatch(t.state.tr.setSelection(new ae(r))),!0)}function Db(t,e){if(e.inputType!="insertCompositionText"||!(t.state.selection instanceof ae))return!1;let{$from:n}=t.state.selection,r=n.parent.contentMatchAt(n.index()).findWrapping(t.state.schema.nodes.text);if(!r)return!1;let o=v.empty;for(let s=r.length-1;s>=0;s--)o=v.from(r[s].createAndFill(null,o));let i=t.state.tr.replace(n.pos,n.pos,new E(o,0,0));return i.setSelection(D.near(i.doc.resolve(n.pos+1))),t.dispatch(i),!1}function Ib(t){if(!(t.selection instanceof ae))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",Y.create(t.doc,[te.widget(t.selection.head,e,{key:"gapcursor"})])}var ko=200,he=function(){};he.prototype.append=function(e){return e.length?(e=he.from(e),!this.length&&e||e.length=n?he.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,n))};he.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};he.prototype.forEach=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length),n<=r?this.forEachInner(e,n,r,0):this.forEachInvertedInner(e,n,r,0)};he.prototype.map=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length);var o=[];return this.forEach(function(i,s){return o.push(e(i,s))},n,r),o};he.from=function(e){return e instanceof he?e:e&&e.length?new vu(e):he.empty};var vu=(function(t){function e(r){t.call(this),this.values=r}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(o,i){return o==0&&i==this.length?this:new e(this.values.slice(o,i))},e.prototype.getInner=function(o){return this.values[o]},e.prototype.forEachInner=function(o,i,s,l){for(var a=i;a=s;a--)if(o(this.values[a],l+a)===!1)return!1},e.prototype.leafAppend=function(o){if(this.length+o.length<=ko)return new e(this.values.concat(o.flatten()))},e.prototype.leafPrepend=function(o){if(this.length+o.length<=ko)return new e(o.flatten().concat(this.values))},n.length.get=function(){return this.values.length},n.depth.get=function(){return 0},Object.defineProperties(e.prototype,n),e})(he);he.empty=new vu([]);var Pb=(function(t){function e(n,r){t.call(this),this.left=n,this.right=r,this.length=n.length+r.length,this.depth=Math.max(n.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(r){return rl&&this.right.forEachInner(r,Math.max(o-l,0),Math.min(this.length,i)-l,s+l)===!1)return!1},e.prototype.forEachInvertedInner=function(r,o,i,s){var l=this.left.length;if(o>l&&this.right.forEachInvertedInner(r,o-l,Math.max(i,l)-l,s+l)===!1||i=i?this.right.slice(r-i,o-i):this.left.slice(r,i).append(this.right.slice(0,o-i))},e.prototype.leafAppend=function(r){var o=this.right.leafAppend(r);if(o)return new e(this.left,o)},e.prototype.leafPrepend=function(r){var o=this.left.leafPrepend(r);if(o)return new e(o,this.right)},e.prototype.appendInner=function(r){return this.left.depth>=Math.max(this.right.depth,r.depth)+1?new e(this.left,new e(this.right,r)):new e(this,r)},e})(he),ll=he;var Lb=500,tn=class t{constructor(e,n){this.items=e,this.eventCount=n}popEvent(e,n){if(this.eventCount==0)return null;let r=this.items.length;for(;;r--)if(this.items.get(r-1).selection){--r;break}let o,i;n&&(o=this.remapping(r,this.items.length),i=o.maps.length);let s=e.tr,l,a,c=[],d=[];return this.items.forEach((u,f)=>{if(!u.step){o||(o=this.remapping(r,f+1),i=o.maps.length),i--,d.push(u);return}if(o){d.push(new nt(u.map));let h=u.step.map(o.slice(i)),p;h&&s.maybeStep(h).doc&&(p=s.mapping.maps[s.mapping.maps.length-1],c.push(new nt(p,void 0,void 0,c.length+d.length))),i--,p&&o.appendMap(p,i)}else s.maybeStep(u.step);if(u.selection)return l=o?u.selection.map(o.slice(i)):u.selection,a=new t(this.items.slice(0,r).append(d.reverse().concat(c)),this.eventCount-1),!1},this.items.length,0),{remaining:a,transform:s,selection:l}}addTransform(e,n,r,o){let i=[],s=this.eventCount,l=this.items,a=!o&&l.length?l.get(l.length-1):null;for(let d=0;dzb&&(l=Bb(l,c),s-=c),new t(l.append(i),s)}remapping(e,n){let r=new jn;return this.items.forEach((o,i)=>{let s=o.mirrorOffset!=null&&i-o.mirrorOffset>=e?r.maps.length-o.mirrorOffset:void 0;r.appendMap(o.map,s)},e,n),r}addMaps(e){return this.eventCount==0?this:new t(this.items.append(e.map(n=>new nt(n))),this.eventCount)}rebased(e,n){if(!this.eventCount)return this;let r=[],o=Math.max(0,this.items.length-n),i=e.mapping,s=e.steps.length,l=this.eventCount;this.items.forEach(f=>{f.selection&&l--},o);let a=n;this.items.forEach(f=>{let h=i.getMirror(--a);if(h==null)return;s=Math.min(s,h);let p=i.maps[h];if(f.step){let m=e.steps[h].invert(e.docs[h]),g=f.selection&&f.selection.map(i.slice(a+1,h));g&&l++,r.push(new nt(p,m,g))}else r.push(new nt(p))},o);let c=[];for(let f=n;fLb&&(u=u.compress(this.items.length-r.length)),u}emptyItemCount(){let e=0;return this.items.forEach(n=>{n.step||e++}),e}compress(e=this.items.length){let n=this.remapping(0,e),r=n.maps.length,o=[],i=0;return this.items.forEach((s,l)=>{if(l>=e)o.push(s),s.selection&&i++;else if(s.step){let a=s.step.map(n.slice(r)),c=a&&a.getMap();if(r--,c&&n.appendMap(c,r),a){let d=s.selection&&s.selection.map(n.slice(r));d&&i++;let u=new nt(c.invert(),a,d),f,h=o.length-1;(f=o.length&&o[h].merge(u))?o[h]=f:o.push(u)}}else s.map&&r--},this.items.length,0),new t(ll.from(o.reverse()),i)}};tn.empty=new tn(ll.empty,0);function Bb(t,e){let n;return t.forEach((r,o)=>{if(r.selection&&e--==0)return n=o,!1}),t.slice(n)}var nt=class t{constructor(e,n,r,o){this.map=e,this.step=n,this.selection=r,this.mirrorOffset=o}merge(e){if(this.step&&e.step&&!e.selection){let n=e.step.merge(this.step);if(n)return new t(n.getMap().invert(),n,this.selection)}}},rt=class{constructor(e,n,r,o,i){this.done=e,this.undone=n,this.prevRanges=r,this.prevTime=o,this.prevComposition=i}},zb=20;function Hb(t,e,n,r){let o=n.getMeta(en),i;if(o)return o.historyState;n.getMeta(Vb)&&(t=new rt(t.done,t.undone,null,0,-1));let s=n.getMeta("appendedTransaction");if(n.steps.length==0)return t;if(s&&s.getMeta(en))return s.getMeta(en).redo?new rt(t.done.addTransform(n,void 0,r,So(e)),t.undone,Mu(n.mapping.maps),t.prevTime,t.prevComposition):new rt(t.done,t.undone.addTransform(n,void 0,r,So(e)),null,t.prevTime,t.prevComposition);if(n.getMeta("addToHistory")!==!1&&!(s&&s.getMeta("addToHistory")===!1)){let l=n.getMeta("composition"),a=t.prevTime==0||!s&&t.prevComposition!=l&&(t.prevTime<(n.time||0)-r.newGroupDelay||!$b(n,t.prevRanges)),c=s?al(t.prevRanges,n.mapping):Mu(n.mapping.maps);return new rt(t.done.addTransform(n,a?e.selection.getBookmark():void 0,r,So(e)),tn.empty,c,n.time,l??t.prevComposition)}else return(i=n.getMeta("rebased"))?new rt(t.done.rebased(n,i),t.undone.rebased(n,i),al(t.prevRanges,n.mapping),t.prevTime,t.prevComposition):new rt(t.done.addMaps(n.mapping.maps),t.undone.addMaps(n.mapping.maps),al(t.prevRanges,n.mapping),t.prevTime,t.prevComposition)}function $b(t,e){if(!e)return!1;if(!t.docChanged)return!0;let n=!1;return t.mapping.maps[0].forEach((r,o)=>{for(let i=0;i=e[i]&&(n=!0)}),n}function Mu(t){let e=[];for(let n=t.length-1;n>=0&&e.length==0;n--)t[n].forEach((r,o,i,s)=>e.push(i,s));return e}function al(t,e){if(!t)return null;let n=[];for(let r=0;r{let o=en.getState(n);if(!o||(t?o.undone:o.done).eventCount==0)return!1;if(r){let i=Fb(o,n,t);i&&r(e?i.scrollIntoView():i)}return!0}}var dl=Co(!1,!0),ul=Co(!0,!0),g1=Co(!1,!1),y1=Co(!0,!1);var C1=U.create({name:"characterCount",addOptions(){return{limit:null,mode:"textSize",textCounter:t=>t.length,wordCounter:t=>t.split(" ").filter(e=>e!=="").length}},addStorage(){return{characters:()=>0,words:()=>0}},onBeforeCreate(){this.storage.characters=t=>{let e=t?.node||this.editor.state.doc;if((t?.mode||this.options.mode)==="textSize"){let r=e.textBetween(0,e.content.size,void 0," ");return this.options.textCounter(r)}return e.nodeSize},this.storage.words=t=>{let e=t?.node||this.editor.state.doc,n=e.textBetween(0,e.content.size," "," ");return this.options.wordCounter(n)}},addProseMirrorPlugins(){let t=!1;return[new P({key:new H("characterCount"),appendTransaction:(e,n,r)=>{if(t)return;let o=this.options.limit;if(o==null||o===0){t=!0;return}let i=this.storage.characters({node:r.doc});if(i>o){let s=i-o,l=0,a=s;console.warn(`[CharacterCount] Initial content exceeded limit of ${o} characters. Content was automatically trimmed.`);let c=r.tr.deleteRange(l,a);return t=!0,c}t=!0},filterTransaction:(e,n)=>{let r=this.options.limit;if(!e.docChanged||r===0||r===null||r===void 0)return!0;let o=this.storage.characters({node:n.doc}),i=this.storage.characters({node:e.doc});if(i<=r||o>r&&i>r&&i<=o)return!0;if(o>r&&i>r&&i>o||!e.getMeta("paste"))return!1;let l=e.selection.$head.pos,a=i-r,c=l-a,d=l;return e.deleteRange(c,d),!(this.storage.characters({node:e.doc})>r)}})]}}),Nu=U.create({name:"dropCursor",addOptions(){return{color:"currentColor",width:1,class:void 0}},addProseMirrorPlugins(){return[ku(this.options)]}}),N1=U.create({name:"focus",addOptions(){return{className:"has-focus",mode:"all"}},addProseMirrorPlugins(){return[new P({key:new H("focus"),props:{decorations:({doc:t,selection:e})=>{let{isEditable:n,isFocused:r}=this.editor,{anchor:o}=e,i=[];if(!n||!r)return Y.create(t,[]);let s=0;this.options.mode==="deepest"&&t.descendants((a,c)=>{if(a.isText)return;if(!(o>=c&&o<=c+a.nodeSize-1))return!1;s+=1});let l=0;return t.descendants((a,c)=>{if(a.isText||!(o>=c&&o<=c+a.nodeSize-1))return!1;if(l+=1,this.options.mode==="deepest"&&s-l>0||this.options.mode==="shallowest"&&l>1)return this.options.mode==="deepest";i.push(te.node(c,c+a.nodeSize,{class:this.options.className}))}),Y.create(t,i)}}})]}}),Ou=U.create({name:"gapCursor",addProseMirrorPlugins(){return[Cu()]},extendNodeSchema(t){var e;let n={name:t.name,options:t.options,storage:t.storage};return{allowGapCursor:(e=G(B(t,"allowGapCursor",n)))!=null?e:null}}}),fl=U.create({name:"placeholder",addOptions(){return{emptyEditorClass:"is-editor-empty",emptyNodeClass:"is-empty",placeholder:"Write something \u2026",showOnlyWhenEditable:!0,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[new P({key:new H("placeholder"),props:{decorations:({doc:t,selection:e})=>{let n=this.editor.isEditable||!this.options.showOnlyWhenEditable,{anchor:r}=e,o=[];if(!n)return null;let i=this.editor.isEmpty;return t.descendants((s,l)=>{let a=r>=l&&r<=l+s.nodeSize,c=!s.isLeaf&&lr(s);if((a||!this.options.showOnlyCurrent)&&c){let d=[this.options.emptyNodeClass];i&&d.push(this.options.emptyEditorClass);let u=te.node(l,l+s.nodeSize,{class:d.join(" "),"data-placeholder":typeof this.options.placeholder=="function"?this.options.placeholder({editor:this.editor,node:s,pos:l,hasAnchor:a}):this.options.placeholder});o.push(u)}return this.options.includeChildren}),Y.create(t,o)}}})]}}),H1=U.create({name:"selection",addOptions(){return{className:"selection"}},addProseMirrorPlugins(){let{editor:t,options:e}=this;return[new P({key:new H("selection"),props:{decorations(n){return n.selection.empty||t.isFocused||!t.isEditable||mo(n.selection)||t.view.dragging?null:Y.create(n.doc,[te.inline(n.selection.from,n.selection.to,{class:e.className})])}}})]}});function Eu({types:t,node:e}){return e&&Array.isArray(t)&&t.includes(e.type)||e?.type===t}var V1=U.create({name:"trailingNode",addOptions(){return{node:void 0,notAfter:[]}},addProseMirrorPlugins(){var t;let e=new H(this.name),n=this.options.node||((t=this.editor.schema.topNodeType.contentMatch.defaultType)==null?void 0:t.name)||"paragraph",r=Object.entries(this.editor.schema.nodes).map(([,o])=>o).filter(o=>(this.options.notAfter||[]).concat(n).includes(o.name));return[new P({key:e,appendTransaction:(o,i,s)=>{let{doc:l,tr:a,schema:c}=s,d=e.getState(s),u=l.content.size,f=c.nodes[n];if(d)return a.insert(u,f.create())},state:{init:(o,i)=>{let s=i.tr.doc.lastChild;return!Eu({node:s,types:r})},apply:(o,i)=>{if(!o.docChanged||o.getMeta("__uniqueIDTransaction"))return i;let s=o.doc.lastChild;return!Eu({node:s,types:r})}}})]}}),Ru=U.create({name:"undoRedo",addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:t,dispatch:e})=>dl(t,e),redo:()=>({state:t,dispatch:e})=>ul(t,e)}},addProseMirrorPlugins(){return[Au(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-\u044F":()=>this.editor.commands.undo(),"Shift-Mod-\u044F":()=>this.editor.commands.redo()}}});var Nn=(t,e)=>{if(t==="slot")return 0;if(t instanceof Function)return t(e);let{children:n,...r}=e??{};if(t==="svg")throw new Error("SVG elements are not supported in the JSX syntax, use the array syntax instead");return[t,r,n]};var _b=/^\s*>\s$/,Wb=F.create({name:"blockquote",addOptions(){return{HTMLAttributes:{}}},content:"block+",group:"block",defining:!0,parseHTML(){return[{tag:"blockquote"}]},renderHTML({HTMLAttributes:t}){return Nn("blockquote",{...R(this.options.HTMLAttributes,t),children:Nn("slot",{})})},parseMarkdown:(t,e)=>e.createNode("blockquote",void 0,e.parseChildren(t.tokens||[])),renderMarkdown:(t,e)=>{if(!t.content)return"";let n=">",r=[];return t.content.forEach(o=>{let l=e.renderChildren([o]).split(` +`).map(a=>a.trim()===""?n:`${n} ${a}`);r.push(l.join(` +`))}),r.join(` +${n} +`)},addCommands(){return{setBlockquote:()=>({commands:t})=>t.wrapIn(this.name),toggleBlockquote:()=>({commands:t})=>t.toggleWrap(this.name),unsetBlockquote:()=>({commands:t})=>t.lift(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-b":()=>this.editor.commands.toggleBlockquote()}},addInputRules(){return[tt({find:_b,type:this.type})]}}),Du=Wb;var jb=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))$/,Ub=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))/g,Kb=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))$/,qb=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))/g,Jb=ee.create({name:"bold",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"strong"},{tag:"b",getAttrs:t=>t.style.fontWeight!=="normal"&&null},{style:"font-weight=400",clearMark:t=>t.type.name===this.name},{style:"font-weight",getAttrs:t=>/^(bold(er)?|[5-9]\d{2,})$/.test(t)&&null}]},renderHTML({HTMLAttributes:t}){return Nn("strong",{...R(this.options.HTMLAttributes,t),children:Nn("slot",{})})},markdownTokenName:"strong",parseMarkdown:(t,e)=>e.applyMark("bold",e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>`**${e.renderChildren(t)}**`,addCommands(){return{setBold:()=>({commands:t})=>t.setMark(this.name),toggleBold:()=>({commands:t})=>t.toggleMark(this.name),unsetBold:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-b":()=>this.editor.commands.toggleBold(),"Mod-B":()=>this.editor.commands.toggleBold()}},addInputRules(){return[Be({find:jb,type:this.type}),Be({find:Kb,type:this.type})]},addPasteRules(){return[Me({find:Ub,type:this.type}),Me({find:qb,type:this.type})]}}),Iu=Jb;var Gb=/(^|[^`])`([^`]+)`(?!`)$/,Xb=/(^|[^`])`([^`]+)`(?!`)/g,Yb=ee.create({name:"code",addOptions(){return{HTMLAttributes:{}}},excludes:"_",code:!0,exitable:!0,parseHTML(){return[{tag:"code"}]},renderHTML({HTMLAttributes:t}){return["code",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"codespan",parseMarkdown:(t,e)=>e.applyMark("code",[{type:"text",text:t.text||""}]),renderMarkdown:(t,e)=>t.content?`\`${e.renderChildren(t.content)}\``:"",addCommands(){return{setCode:()=>({commands:t})=>t.setMark(this.name),toggleCode:()=>({commands:t})=>t.toggleMark(this.name),unsetCode:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-e":()=>this.editor.commands.toggleCode()}},addInputRules(){return[Be({find:Gb,type:this.type})]},addPasteRules(){return[Me({find:Xb,type:this.type})]}}),Pu=Yb;var hl=4,Qb=/^```([a-z]+)?[\s\n]$/,Zb=/^~~~([a-z]+)?[\s\n]$/,e0=F.create({name:"codeBlock",addOptions(){return{languageClassPrefix:"language-",exitOnTripleEnter:!0,exitOnArrowDown:!0,defaultLanguage:null,enableTabIndentation:!1,tabSize:hl,HTMLAttributes:{}}},content:"text*",marks:"",group:"block",code:!0,defining:!0,addAttributes(){return{language:{default:this.options.defaultLanguage,parseHTML:t=>{var e;let{languageClassPrefix:n}=this.options;if(!n)return null;let i=[...((e=t.firstElementChild)==null?void 0:e.classList)||[]].filter(s=>s.startsWith(n)).map(s=>s.replace(n,""))[0];return i||null},rendered:!1}}},parseHTML(){return[{tag:"pre",preserveWhitespace:"full"}]},renderHTML({node:t,HTMLAttributes:e}){return["pre",R(this.options.HTMLAttributes,e),["code",{class:t.attrs.language?this.options.languageClassPrefix+t.attrs.language:null},0]]},markdownTokenName:"code",parseMarkdown:(t,e)=>{var n;return((n=t.raw)==null?void 0:n.startsWith("```"))===!1&&t.codeBlockStyle!=="indented"?[]:e.createNode("codeBlock",{language:t.lang||null},t.text?[e.createTextNode(t.text)]:[])},renderMarkdown:(t,e)=>{var n;let r="",o=((n=t.attrs)==null?void 0:n.language)||"";return t.content?r=[`\`\`\`${o}`,e.renderChildren(t.content),"```"].join(` +`):r=`\`\`\`${o} + +\`\`\``,r},addCommands(){return{setCodeBlock:t=>({commands:e})=>e.setNode(this.name,t),toggleCodeBlock:t=>({commands:e})=>e.toggleNode(this.name,"paragraph",t)}},addKeyboardShortcuts(){return{"Mod-Alt-c":()=>this.editor.commands.toggleCodeBlock(),Backspace:()=>{let{empty:t,$anchor:e}=this.editor.state.selection,n=e.pos===1;return!t||e.parent.type.name!==this.name?!1:n||!e.parent.textContent.length?this.editor.commands.clearNodes():!1},Tab:({editor:t})=>{var e;if(!this.options.enableTabIndentation)return!1;let n=(e=this.options.tabSize)!=null?e:hl,{state:r}=t,{selection:o}=r,{$from:i,empty:s}=o;if(i.parent.type!==this.type)return!1;let l=" ".repeat(n);return s?t.commands.insertContent(l):t.commands.command(({tr:a})=>{let{from:c,to:d}=o,h=r.doc.textBetween(c,d,` +`,` +`).split(` +`).map(p=>l+p).join(` +`);return a.replaceWith(c,d,r.schema.text(h)),!0})},"Shift-Tab":({editor:t})=>{var e;if(!this.options.enableTabIndentation)return!1;let n=(e=this.options.tabSize)!=null?e:hl,{state:r}=t,{selection:o}=r,{$from:i,empty:s}=o;return i.parent.type!==this.type?!1:s?t.commands.command(({tr:l})=>{var a;let{pos:c}=i,d=i.start(),u=i.end(),h=r.doc.textBetween(d,u,` +`,` +`).split(` +`),p=0,m=0,g=c-d;for(let S=0;S=g){p=S;break}m+=h[S].length+1}let w=((a=h[p].match(/^ */))==null?void 0:a[0])||"",b=Math.min(w.length,n);if(b===0)return!0;let C=d;for(let S=0;S{let{from:a,to:c}=o,f=r.doc.textBetween(a,c,` +`,` +`).split(` +`).map(h=>{var p;let m=((p=h.match(/^ */))==null?void 0:p[0])||"",g=Math.min(m.length,n);return h.slice(g)}).join(` +`);return l.replaceWith(a,c,r.schema.text(f)),!0})},Enter:({editor:t})=>{if(!this.options.exitOnTripleEnter)return!1;let{state:e}=t,{selection:n}=e,{$from:r,empty:o}=n;if(!o||r.parent.type!==this.type)return!1;let i=r.parentOffset===r.parent.nodeSize-2,s=r.parent.textContent.endsWith(` + +`);return!i||!s?!1:t.chain().command(({tr:l})=>(l.delete(r.pos-2,r.pos),!0)).exitCode().run()},ArrowDown:({editor:t})=>{if(!this.options.exitOnArrowDown)return!1;let{state:e}=t,{selection:n,doc:r}=e,{$from:o,empty:i}=n;if(!i||o.parent.type!==this.type||!(o.parentOffset===o.parent.nodeSize-2))return!1;let l=o.after();return l===void 0?!1:r.nodeAt(l)?t.commands.command(({tr:c})=>(c.setSelection(I.near(r.resolve(l))),!0)):t.commands.exitCode()}}},addInputRules(){return[ar({find:Qb,type:this.type,getAttributes:t=>({language:t[1]})}),ar({find:Zb,type:this.type,getAttributes:t=>({language:t[1]})})]},addProseMirrorPlugins(){return[new P({key:new H("codeBlockVSCodeHandler"),props:{handlePaste:(t,e)=>{if(!e.clipboardData||this.editor.isActive(this.type.name))return!1;let n=e.clipboardData.getData("text/plain"),r=e.clipboardData.getData("vscode-editor-data"),o=r?JSON.parse(r):void 0,i=o?.mode;if(!n||!i)return!1;let{tr:s,schema:l}=t.state,a=l.text(n.replace(/\r\n?/g,` +`));return s.replaceSelectionWith(this.type.create({language:i},a)),s.selection.$from.parent.type!==this.type&&s.setSelection(D.near(s.doc.resolve(Math.max(0,s.selection.from-2)))),s.setMeta("paste",!0),t.dispatch(s),!0}}})]}}),Lu=e0;var Bu=F.create({name:"customBlock",group:"block",atom:!0,defining:!0,draggable:!0,selectable:!0,isolating:!0,allowGapCursor:!0,inline:!1,addNodeView(){return({editor:t,node:e,getPos:n,HTMLAttributes:r,decorations:o,extension:i})=>{let s=document.createElement("div");s.setAttribute("data-config",e.attrs.config),s.setAttribute("data-id",e.attrs.id),s.setAttribute("data-type","customBlock");let l=document.createElement("div");if(l.className="fi-fo-rich-editor-custom-block-header fi-not-prose",s.appendChild(l),t.isEditable&&typeof e.attrs.config=="object"&&e.attrs.config!==null&&Object.keys(e.attrs.config).length>0){let c=document.createElement("div");c.className="fi-fo-rich-editor-custom-block-edit-btn-ctn",l.appendChild(c);let d=document.createElement("button");d.className="fi-icon-btn",d.type="button",d.innerHTML=i.options.editCustomBlockButtonIconHtml,d.addEventListener("click",()=>i.options.editCustomBlockUsing(e.attrs.id,e.attrs.config)),c.appendChild(d)}let a=document.createElement("p");if(a.className="fi-fo-rich-editor-custom-block-heading",a.textContent=e.attrs.label,l.appendChild(a),t.isEditable){let c=document.createElement("div");c.className="fi-fo-rich-editor-custom-block-delete-btn-ctn",l.appendChild(c);let d=document.createElement("button");d.className="fi-icon-btn",d.type="button",d.innerHTML=i.options.deleteCustomBlockButtonIconHtml,d.addEventListener("click",()=>t.chain().setNodeSelection(n()).deleteSelection().run()),c.appendChild(d)}if(e.attrs.preview){let c=document.createElement("div");c.className="fi-fo-rich-editor-custom-block-preview fi-not-prose",c.innerHTML=new TextDecoder().decode(Uint8Array.from(atob(e.attrs.preview),d=>d.charCodeAt(0))),s.appendChild(c)}return{dom:s}}},addOptions(){return{deleteCustomBlockButtonIconHtml:null,editCustomBlockButtonIconHtml:null,editCustomBlockUsing:()=>{},insertCustomBlockUsing:()=>{}}},addAttributes(){return{config:{default:null,parseHTML:t=>JSON.parse(t.getAttribute("data-config"))},id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}},label:{default:null,parseHTML:t=>t.getAttribute("data-label"),rendered:!1},preview:{default:null,parseHTML:t=>t.getAttribute("data-preview"),rendered:!1}}},parseHTML(){return[{tag:`div[data-type="${this.name}"]`}]},renderHTML({HTMLAttributes:t}){return["div",R(t)]},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:o,anchor:i}=r;if(!o)return!1;let s=new ie,l=0;return e.doc.nodesBetween(i-1,i,(a,c)=>{if(a.type.name===this.name)return n=!0,s=a,l=c,!1}),n})}},addProseMirrorPlugins(){let{insertCustomBlockUsing:t}=this.options;return[new P({props:{handleDrop(e,n){if(!n||(n.preventDefault(),!n.dataTransfer.getData("customBlock")))return!1;let r=n.dataTransfer.getData("customBlock");return t(r,e.posAtCoords({left:n.clientX,top:n.clientY}).pos),!1}}})]}});var vo=(t,e)=>e.view.domAtPos(t).node.offsetParent!==null,t0=(t,e,n)=>{for(let r=t.depth;r>0;r-=1){let o=t.node(r),i=e(o),s=vo(t.start(r),n);if(i&&s)return{pos:r>0?t.before(r):0,start:t.start(r),depth:r,node:o}}},zu=(t,e)=>{let{state:n,view:r,extensionManager:o}=t,{schema:i,selection:s}=n,{empty:l,$anchor:a}=s,c=!!o.extensions.find(y=>y.name==="gapCursor");if(!l||a.parent.type!==i.nodes.detailsSummary||!c||e==="right"&&a.parentOffset!==a.parent.nodeSize-2)return!1;let d=et(y=>y.type===i.nodes.details)(s);if(!d)return!1;let u=En(d.node,y=>y.type===i.nodes.detailsContent);if(!u.length||vo(d.start+u[0].pos+1,t))return!1;let h=n.doc.resolve(d.pos+d.node.nodeSize),p=ae.findFrom(h,1,!1);if(!p)return!1;let{tr:m}=n,g=new ae(p);return m.setSelection(g),m.scrollIntoView(),r.dispatch(m),!0},Hu=F.create({name:"details",content:"detailsSummary detailsContent",group:"block",defining:!0,isolating:!0,allowGapCursor:!1,addOptions(){return{persist:!1,openClassName:"is-open",HTMLAttributes:{}}},addAttributes(){return this.options.persist?{open:{default:!1,parseHTML:t=>t.hasAttribute("open"),renderHTML:({open:t})=>t?{open:""}:{}}}:[]},parseHTML(){return[{tag:"details"}]},renderHTML({HTMLAttributes:t}){return["details",R(this.options.HTMLAttributes,t),0]},...Zt({nodeName:"details",content:"block"}),addNodeView(){return({editor:t,getPos:e,node:n,HTMLAttributes:r})=>{let o=document.createElement("div"),i=R(this.options.HTMLAttributes,r,{"data-type":this.name});Object.entries(i).forEach(([c,d])=>o.setAttribute(c,d));let s=document.createElement("button");s.type="button",o.append(s);let l=document.createElement("div");o.append(l);let a=c=>{if(c!==void 0)if(c){if(o.classList.contains(this.options.openClassName))return;o.classList.add(this.options.openClassName)}else{if(!o.classList.contains(this.options.openClassName))return;o.classList.remove(this.options.openClassName)}else o.classList.toggle(this.options.openClassName);let d=new Event("toggleDetailsContent"),u=l.querySelector(':scope > div[data-type="detailsContent"]');u?.dispatchEvent(d)};return n.attrs.open&&setTimeout(()=>a()),s.addEventListener("click",()=>{if(a(),!this.options.persist){t.commands.focus(void 0,{scrollIntoView:!1});return}if(t.isEditable&&typeof e=="function"){let{from:c,to:d}=t.state.selection;t.chain().command(({tr:u})=>{let f=e();if(!f)return!1;let h=u.doc.nodeAt(f);return h?.type!==this.type?!1:(u.setNodeMarkup(f,void 0,{open:!h.attrs.open}),!0)}).setTextSelection({from:c,to:d}).focus(void 0,{scrollIntoView:!1}).run()}}),{dom:o,contentDOM:l,ignoreMutation(c){return c.type==="selection"?!1:!o.contains(c.target)||o===c.target},update:c=>c.type!==this.type?!1:(c.attrs.open!==void 0&&a(c.attrs.open),!0)}}},addCommands(){return{setDetails:()=>({state:t,chain:e})=>{var n;let{schema:r,selection:o}=t,{$from:i,$to:s}=o,l=i.blockRange(s);if(!l)return!1;let a=t.doc.slice(l.start,l.end);if(!r.nodes.detailsContent.contentMatch.matchFragment(a.content))return!1;let d=((n=a.toJSON())==null?void 0:n.content)||[];return e().insertContentAt({from:l.start,to:l.end},{type:this.name,content:[{type:"detailsSummary"},{type:"detailsContent",content:d}]}).setTextSelection(l.start+2).run()},unsetDetails:()=>({state:t,chain:e})=>{let{selection:n,schema:r}=t,o=et(y=>y.type===this.type)(n);if(!o)return!1;let i=En(o.node,y=>y.type===r.nodes.detailsSummary),s=En(o.node,y=>y.type===r.nodes.detailsContent);if(!i.length||!s.length)return!1;let l=i[0],a=s[0],c=o.pos,d=t.doc.resolve(c),u=c+o.node.nodeSize,f={from:c,to:u},h=a.node.content.toJSON()||[],p=d.parent.type.contentMatch.defaultType,g=[p?.create(null,l.node.content).toJSON(),...h];return e().insertContentAt(f,g).setTextSelection(c+1).run()}}},addKeyboardShortcuts(){return{Backspace:()=>{let{schema:t,selection:e}=this.editor.state,{empty:n,$anchor:r}=e;return!n||r.parent.type!==t.nodes.detailsSummary?!1:r.parentOffset!==0?this.editor.commands.command(({tr:o})=>{let i=r.pos-1,s=r.pos;return o.delete(i,s),!0}):this.editor.commands.unsetDetails()},Enter:({editor:t})=>{let{state:e,view:n}=t,{schema:r,selection:o}=e,{$head:i}=o;if(i.parent.type!==r.nodes.detailsSummary)return!1;let s=vo(i.after()+1,t),l=s?e.doc.nodeAt(i.after()):i.node(-2);if(!l)return!1;let a=s?0:i.indexAfter(-1),c=sr(l.contentMatchAt(a));if(!c||!l.canReplaceWith(a,a,c))return!1;let d=c.createAndFill();if(!d)return!1;let u=s?i.after()+1:i.after(-1),f=e.tr.replaceWith(u,u,d),h=f.doc.resolve(u),p=I.near(h,1);return f.setSelection(p),f.scrollIntoView(),n.dispatch(f),!0},ArrowRight:({editor:t})=>zu(t,"right"),ArrowDown:({editor:t})=>zu(t,"down")}},addProseMirrorPlugins(){return[new P({key:new H("detailsSelection"),appendTransaction:(t,e,n)=>{let{editor:r,type:o}=this;if(r.view.composing||!t.some(y=>y.selectionSet)||!e.selection.empty||!n.selection.empty||!tl(n,o.name))return;let{$from:a}=n.selection;if(vo(a.pos,r))return;let d=t0(a,y=>y.type===o,r);if(!d)return;let u=En(d.node,y=>y.type===n.schema.nodes.detailsSummary);if(!u.length)return;let f=u[0],p=(e.selection.from{let e=document.createElement("div"),n=R(this.options.HTMLAttributes,t,{"data-type":this.name,hidden:"hidden"});return Object.entries(n).forEach(([r,o])=>e.setAttribute(r,o)),e.addEventListener("toggleDetailsContent",()=>{e.toggleAttribute("hidden")}),{dom:e,contentDOM:e,ignoreMutation(r){return r.type==="selection"?!1:!e.contains(r.target)||e===r.target},update:r=>r.type===this.type}}},addKeyboardShortcuts(){return{Enter:({editor:t})=>{let{state:e,view:n}=t,{selection:r}=e,{$from:o,empty:i}=r,s=et($=>$.type===this.type)(r);if(!i||!s||!s.node.childCount)return!1;let l=o.index(s.depth),{childCount:a}=s.node;if(!(a===l+1))return!1;let d=s.node.type.contentMatch.defaultType,u=d?.createAndFill();if(!u)return!1;let f=e.doc.resolve(s.pos+1),h=a-1,p=s.node.child(h),m=f.posAtIndex(h,s.depth);if(!p.eq(u))return!1;let y=o.node(-3);if(!y)return!1;let w=o.indexAfter(-3),b=sr(y.contentMatchAt(w));if(!b||!y.canReplaceWith(w,w,b))return!1;let C=b.createAndFill();if(!C)return!1;let{tr:x}=e,S=o.after(-2);x.replaceWith(S,S,C);let k=x.doc.resolve(S),O=I.near(k,1);x.setSelection(O);let T=m,A=m+p.nodeSize;return x.delete(T,A),x.scrollIntoView(),n.dispatch(x),!0}}},...Zt({nodeName:"detailsContent"})}),Fu=F.create({name:"detailsSummary",content:"text*",defining:!0,selectable:!1,isolating:!0,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"summary"}]},renderHTML({HTMLAttributes:t}){return["summary",R(this.options.HTMLAttributes,t),0]},...Zt({nodeName:"detailsSummary",content:"inline"})});var n0=F.create({name:"doc",topNode:!0,content:"block+",renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` + +`):""}),Vu=n0;var _u=F.create({name:"grid",group:"block",defining:!0,isolating:!0,allowGapCursor:!1,content:"gridColumn+",addOptions(){return{HTMLAttributes:{class:"grid-layout"}}},addAttributes(){return{"data-cols":{default:2,parseHTML:t=>t.getAttribute("data-cols")},"data-from-breakpoint":{default:"md",parseHTML:t=>t.getAttribute("data-from-breakpoint")},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-template-columns: repeat(${t["data-cols"]}, 1fr)`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("grid-layout")&&null}]},renderHTML({HTMLAttributes:t}){return["div",R(this.options.HTMLAttributes,t),0]},addCommands(){return{insertGrid:({columns:t=[1,1],fromBreakpoint:e,coordinates:n=null}={})=>({tr:r,dispatch:o,editor:i})=>{let s=i.schema.nodes.gridColumn,l=Array.isArray(t)&&t.length?t:[1,1],a=[];for(let u=0;uNumber(u)||1).reduce((u,f)=>u+f,0),d=i.schema.nodes.grid.createChecked({"data-cols":c,"data-from-breakpoint":e},a);if(o){let u=r.selection.anchor+1;[null,void 0].includes(n?.from)?r.replaceSelectionWith(d).scrollIntoView().setSelection(D.near(r.doc.resolve(u))):r.replaceRangeWith(n.from,n.to,d).scrollIntoView().setSelection(D.near(r.doc.resolve(n.from)))}return!0}}}});var Wu=F.create({name:"gridColumn",content:"block+",isolating:!0,addOptions(){return{HTMLAttributes:{class:"grid-layout-col"}}},addAttributes(){return{"data-col-span":{default:1,parseHTML:t=>t.getAttribute("data-col-span"),renderHTML:t=>({"data-col-span":t["data-col-span"]??1})},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-column: span ${t["data-col-span"]??1};`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("grid-layout-col")&&null}]},renderHTML({HTMLAttributes:t}){return["div",R(this.options.HTMLAttributes,t),0]}});var r0=F.create({name:"hardBreak",markdownTokenName:"br",addOptions(){return{keepMarks:!0,HTMLAttributes:{}}},inline:!0,group:"inline",selectable:!1,linebreakReplacement:!0,parseHTML(){return[{tag:"br"}]},renderHTML({HTMLAttributes:t}){return["br",R(this.options.HTMLAttributes,t)]},renderText(){return` +`},renderMarkdown:()=>` +`,parseMarkdown:()=>({type:"hardBreak"}),addCommands(){return{setHardBreak:()=>({commands:t,chain:e,state:n,editor:r})=>t.first([()=>t.exitCode(),()=>t.command(()=>{let{selection:o,storedMarks:i}=n;if(o.$from.parent.type.spec.isolating)return!1;let{keepMarks:s}=this.options,{splittableMarks:l}=r.extensionManager,a=i||o.$to.parentOffset&&o.$from.marks();return e().insertContent({type:this.name}).command(({tr:c,dispatch:d})=>{if(d&&a&&s){let u=a.filter(f=>l.includes(f.type.name));c.ensureMarks(u)}return!0}).run()})])}},addKeyboardShortcuts(){return{"Mod-Enter":()=>this.editor.commands.setHardBreak(),"Shift-Enter":()=>this.editor.commands.setHardBreak()}}}),ju=r0;var o0=F.create({name:"heading",addOptions(){return{levels:[1,2,3,4,5,6],HTMLAttributes:{}}},content:"inline*",group:"block",defining:!0,addAttributes(){return{level:{default:1,rendered:!1}}},parseHTML(){return this.options.levels.map(t=>({tag:`h${t}`,attrs:{level:t}}))},renderHTML({node:t,HTMLAttributes:e}){return[`h${this.options.levels.includes(t.attrs.level)?t.attrs.level:this.options.levels[0]}`,R(this.options.HTMLAttributes,e),0]},parseMarkdown:(t,e)=>e.createNode("heading",{level:t.depth||1},e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>{var n;let r=(n=t.attrs)!=null&&n.level?parseInt(t.attrs.level,10):1,o="#".repeat(r);return t.content?`${o} ${e.renderChildren(t.content)}`:""},addCommands(){return{setHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.setNode(this.name,t):!1,toggleHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.toggleNode(this.name,"paragraph",t):!1}},addKeyboardShortcuts(){return this.options.levels.reduce((t,e)=>({...t,[`Mod-Alt-${e}`]:()=>this.editor.commands.toggleHeading({level:e})}),{})},addInputRules(){return this.options.levels.map(t=>ar({find:new RegExp(`^(#{${Math.min(...this.options.levels)},${t}})\\s$`),type:this.type,getAttributes:{level:t}}))}}),Uu=o0;var i0=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))$/,s0=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))/g,l0=ee.create({name:"highlight",addOptions(){return{multicolor:!1,HTMLAttributes:{}}},addAttributes(){return this.options.multicolor?{color:{default:null,parseHTML:t=>t.getAttribute("data-color")||t.style.backgroundColor,renderHTML:t=>t.color?{"data-color":t.color,style:`background-color: ${t.color}; color: inherit`}:{}}}:{}},parseHTML(){return[{tag:"mark"}]},renderHTML({HTMLAttributes:t}){return["mark",R(this.options.HTMLAttributes,t),0]},renderMarkdown:(t,e)=>`==${e.renderChildren(t)}==`,parseMarkdown:(t,e)=>e.applyMark("highlight",e.parseInline(t.tokens||[])),markdownTokenizer:{name:"highlight",level:"inline",start:t=>t.indexOf("=="),tokenize(t,e,n){let o=/^(==)([^=]+)(==)/.exec(t);if(o){let i=o[2].trim(),s=n.inlineTokens(i);return{type:"highlight",raw:o[0],text:i,tokens:s}}}},addCommands(){return{setHighlight:t=>({commands:e})=>e.setMark(this.name,t),toggleHighlight:t=>({commands:e})=>e.toggleMark(this.name,t),unsetHighlight:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-h":()=>this.editor.commands.toggleHighlight()}},addInputRules(){return[Be({find:i0,type:this.type})]},addPasteRules(){return[Me({find:s0,type:this.type})]}}),Ku=l0;var a0=F.create({name:"horizontalRule",addOptions(){return{HTMLAttributes:{},nextNodeType:"paragraph"}},group:"block",parseHTML(){return[{tag:"hr"}]},renderHTML({HTMLAttributes:t}){return["hr",R(this.options.HTMLAttributes,t)]},markdownTokenName:"hr",parseMarkdown:(t,e)=>e.createNode("horizontalRule"),renderMarkdown:()=>"---",addCommands(){return{setHorizontalRule:()=>({chain:t,state:e})=>{if(!bu(e,e.schema.nodes[this.name]))return!1;let{selection:n}=e,{$to:r}=n,o=t();return mo(n)?o.insertContentAt(r.pos,{type:this.name}):o.insertContent({type:this.name}),o.command(({state:i,tr:s,dispatch:l})=>{if(l){let{$to:a}=s.selection,c=a.end();if(a.nodeAfter)a.nodeAfter.isTextblock?s.setSelection(D.create(s.doc,a.pos+1)):a.nodeAfter.isBlock?s.setSelection(L.create(s.doc,a.pos)):s.setSelection(D.create(s.doc,a.pos));else{let d=i.schema.nodes[this.options.nextNodeType]||a.parent.type.contentMatch.defaultType,u=d?.create();u&&(s.insert(c,u),s.setSelection(D.create(s.doc,c+1)))}s.scrollIntoView()}return!0}).run()}}},addInputRules(){return[bo({find:/^(?:---|—-|___\s|\*\*\*\s)$/,type:this.type})]}}),qu=a0;var c0=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))$/,d0=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))/g,u0=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))$/,f0=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))/g,h0=ee.create({name:"italic",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"em"},{tag:"i",getAttrs:t=>t.style.fontStyle!=="normal"&&null},{style:"font-style=normal",clearMark:t=>t.type.name===this.name},{style:"font-style=italic"}]},renderHTML({HTMLAttributes:t}){return["em",R(this.options.HTMLAttributes,t),0]},addCommands(){return{setItalic:()=>({commands:t})=>t.setMark(this.name),toggleItalic:()=>({commands:t})=>t.toggleMark(this.name),unsetItalic:()=>({commands:t})=>t.unsetMark(this.name)}},markdownTokenName:"em",parseMarkdown:(t,e)=>e.applyMark("italic",e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>`*${e.renderChildren(t)}*`,addKeyboardShortcuts(){return{"Mod-i":()=>this.editor.commands.toggleItalic(),"Mod-I":()=>this.editor.commands.toggleItalic()}},addInputRules(){return[Be({find:c0,type:this.type}),Be({find:u0,type:this.type})]},addPasteRules(){return[Me({find:d0,type:this.type}),Me({find:f0,type:this.type})]}}),Ju=h0;var p0=/(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/,m0=F.create({name:"image",addOptions(){return{inline:!1,allowBase64:!1,HTMLAttributes:{},resize:!1}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},draggable:!0,addAttributes(){return{src:{default:null},alt:{default:null},title:{default:null},width:{default:null},height:{default:null}}},parseHTML(){return[{tag:this.options.allowBase64?"img[src]":'img[src]:not([src^="data:"])'}]},renderHTML({HTMLAttributes:t}){return["img",R(this.options.HTMLAttributes,t)]},parseMarkdown:(t,e)=>e.createNode("image",{src:t.href,title:t.title,alt:t.text}),renderMarkdown:t=>{var e,n,r,o,i,s;let l=(n=(e=t.attrs)==null?void 0:e.src)!=null?n:"",a=(o=(r=t.attrs)==null?void 0:r.alt)!=null?o:"",c=(s=(i=t.attrs)==null?void 0:i.title)!=null?s:"";return c?`![${a}](${l} "${c}")`:`![${a}](${l})`},addNodeView(){if(!this.options.resize||!this.options.resize.enabled||typeof document>"u")return null;let{directions:t,minWidth:e,minHeight:n,alwaysPreserveAspectRatio:r}=this.options.resize;return({node:o,getPos:i,HTMLAttributes:s,editor:l})=>{let a=document.createElement("img");Object.entries(s).forEach(([u,f])=>{if(f!=null)switch(u){case"width":case"height":break;default:a.setAttribute(u,f);break}}),a.src=s.src;let c=new yu({element:a,editor:l,node:o,getPos:i,onResize:(u,f)=>{a.style.width=`${u}px`,a.style.height=`${f}px`},onCommit:(u,f)=>{let h=i();h!==void 0&&this.editor.chain().setNodeSelection(h).updateAttributes(this.name,{width:u,height:f}).run()},onUpdate:(u,f,h)=>u.type===o.type,options:{directions:t,min:{width:e,height:n},preserveAspectRatio:r===!0}}),d=c.dom;return d.style.visibility="hidden",d.style.pointerEvents="none",a.onload=()=>{d.style.visibility="",d.style.pointerEvents=""},c}},addCommands(){return{setImage:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}},addInputRules(){return[bo({find:p0,type:this.type,getAttributes:t=>{let[,,e,n,r]=t;return{src:n,alt:e,title:r}}})]}}),Gu=m0;var Xu=Gu.extend({addAttributes(){return{...this.parent?.(),id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}},width:{default:null,parseHTML:t=>t.getAttribute("width")||t.style.width||null,renderHTML:t=>t.width?{width:t.width,style:`width: ${t.width}`}:{}},height:{default:null,parseHTML:t=>t.getAttribute("height")||t.style.height||null,renderHTML:t=>t.height?{height:t.height,style:`height: ${t.height}`}:{}}}}});var Yu=F.create({name:"lead",group:"block",content:"block+",addOptions(){return{HTMLAttributes:{class:"lead"}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("lead")}]},renderHTML({HTMLAttributes:t}){return["div",R(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleLead:()=>({commands:t})=>t.toggleWrap(this.name)}}});var g0="aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2",y0="\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2",xl="numeric",kl="ascii",Sl="alpha",fr="asciinumeric",ur="alphanumeric",Cl="domain",of="emoji",b0="scheme",w0="slashscheme",pl="whitespace";function x0(t,e){return t in e||(e[t]=[]),e[t]}function nn(t,e,n){e[xl]&&(e[fr]=!0,e[ur]=!0),e[kl]&&(e[fr]=!0,e[Sl]=!0),e[fr]&&(e[ur]=!0),e[Sl]&&(e[ur]=!0),e[ur]&&(e[Cl]=!0),e[of]&&(e[Cl]=!0);for(let r in e){let o=x0(r,n);o.indexOf(t)<0&&o.push(t)}}function k0(t,e){let n={};for(let r in e)e[r].indexOf(t)>=0&&(n[r]=!0);return n}function Te(t=null){this.j={},this.jr=[],this.jd=null,this.t=t}Te.groups={};Te.prototype={accepts(){return!!this.t},go(t){let e=this,n=e.j[t];if(n)return n;for(let r=0;rt.ta(e,n,r,o),re=(t,e,n,r,o)=>t.tr(e,n,r,o),Qu=(t,e,n,r,o)=>t.ts(e,n,r,o),M=(t,e,n,r,o)=>t.tt(e,n,r,o),St="WORD",vl="UWORD",sf="ASCIINUMERICAL",lf="ALPHANUMERICAL",br="LOCALHOST",Ml="TLD",Tl="UTLD",Eo="SCHEME",On="SLASH_SCHEME",El="NUM",Al="WS",Nl="NL",hr="OPENBRACE",pr="CLOSEBRACE",No="OPENBRACKET",Oo="CLOSEBRACKET",Ro="OPENPAREN",Do="CLOSEPAREN",Io="OPENANGLEBRACKET",Po="CLOSEANGLEBRACKET",Lo="FULLWIDTHLEFTPAREN",Bo="FULLWIDTHRIGHTPAREN",zo="LEFTCORNERBRACKET",Ho="RIGHTCORNERBRACKET",$o="LEFTWHITECORNERBRACKET",Fo="RIGHTWHITECORNERBRACKET",Vo="FULLWIDTHLESSTHAN",_o="FULLWIDTHGREATERTHAN",Wo="AMPERSAND",jo="APOSTROPHE",Uo="ASTERISK",Lt="AT",Ko="BACKSLASH",qo="BACKTICK",Jo="CARET",Bt="COLON",Ol="COMMA",Go="DOLLAR",ot="DOT",Xo="EQUALS",Rl="EXCLAMATION",He="HYPHEN",mr="PERCENT",Yo="PIPE",Qo="PLUS",Zo="POUND",gr="QUERY",Dl="QUOTE",af="FULLWIDTHMIDDLEDOT",Il="SEMI",it="SLASH",yr="TILDE",ei="UNDERSCORE",cf="EMOJI",ti="SYM",df=Object.freeze({__proto__:null,ALPHANUMERICAL:lf,AMPERSAND:Wo,APOSTROPHE:jo,ASCIINUMERICAL:sf,ASTERISK:Uo,AT:Lt,BACKSLASH:Ko,BACKTICK:qo,CARET:Jo,CLOSEANGLEBRACKET:Po,CLOSEBRACE:pr,CLOSEBRACKET:Oo,CLOSEPAREN:Do,COLON:Bt,COMMA:Ol,DOLLAR:Go,DOT:ot,EMOJI:cf,EQUALS:Xo,EXCLAMATION:Rl,FULLWIDTHGREATERTHAN:_o,FULLWIDTHLEFTPAREN:Lo,FULLWIDTHLESSTHAN:Vo,FULLWIDTHMIDDLEDOT:af,FULLWIDTHRIGHTPAREN:Bo,HYPHEN:He,LEFTCORNERBRACKET:zo,LEFTWHITECORNERBRACKET:$o,LOCALHOST:br,NL:Nl,NUM:El,OPENANGLEBRACKET:Io,OPENBRACE:hr,OPENBRACKET:No,OPENPAREN:Ro,PERCENT:mr,PIPE:Yo,PLUS:Qo,POUND:Zo,QUERY:gr,QUOTE:Dl,RIGHTCORNERBRACKET:Ho,RIGHTWHITECORNERBRACKET:Fo,SCHEME:Eo,SEMI:Il,SLASH:it,SLASH_SCHEME:On,SYM:ti,TILDE:yr,TLD:Ml,UNDERSCORE:ei,UTLD:Tl,UWORD:vl,WORD:St,WS:Al}),xt=/[a-z]/,dr=/\p{L}/u,ml=/\p{Emoji}/u;var kt=/\d/,gl=/\s/;var Zu="\r",yl=` +`,S0="\uFE0F",C0="\u200D",bl="\uFFFC",Mo=null,To=null;function v0(t=[]){let e={};Te.groups=e;let n=new Te;Mo==null&&(Mo=ef(g0)),To==null&&(To=ef(y0)),M(n,"'",jo),M(n,"{",hr),M(n,"}",pr),M(n,"[",No),M(n,"]",Oo),M(n,"(",Ro),M(n,")",Do),M(n,"<",Io),M(n,">",Po),M(n,"\uFF08",Lo),M(n,"\uFF09",Bo),M(n,"\u300C",zo),M(n,"\u300D",Ho),M(n,"\u300E",$o),M(n,"\u300F",Fo),M(n,"\uFF1C",Vo),M(n,"\uFF1E",_o),M(n,"&",Wo),M(n,"*",Uo),M(n,"@",Lt),M(n,"`",qo),M(n,"^",Jo),M(n,":",Bt),M(n,",",Ol),M(n,"$",Go),M(n,".",ot),M(n,"=",Xo),M(n,"!",Rl),M(n,"-",He),M(n,"%",mr),M(n,"|",Yo),M(n,"+",Qo),M(n,"#",Zo),M(n,"?",gr),M(n,'"',Dl),M(n,"/",it),M(n,";",Il),M(n,"~",yr),M(n,"_",ei),M(n,"\\",Ko),M(n,"\u30FB",af);let r=re(n,kt,El,{[xl]:!0});re(r,kt,r);let o=re(r,xt,sf,{[fr]:!0}),i=re(r,dr,lf,{[ur]:!0}),s=re(n,xt,St,{[kl]:!0});re(s,kt,o),re(s,xt,s),re(o,kt,o),re(o,xt,o);let l=re(n,dr,vl,{[Sl]:!0});re(l,xt),re(l,kt,i),re(l,dr,l),re(i,kt,i),re(i,xt),re(i,dr,i);let a=M(n,yl,Nl,{[pl]:!0}),c=M(n,Zu,Al,{[pl]:!0}),d=re(n,gl,Al,{[pl]:!0});M(n,bl,d),M(c,yl,a),M(c,bl,d),re(c,gl,d),M(d,Zu),M(d,yl),re(d,gl,d),M(d,bl,d);let u=re(n,ml,cf,{[of]:!0});M(u,"#"),re(u,ml,u),M(u,S0,u);let f=M(u,C0);M(f,"#"),re(f,ml,u);let h=[[xt,s],[kt,o]],p=[[xt,null],[dr,l],[kt,i]];for(let m=0;mm[0]>g[0]?1:-1);for(let m=0;m=0?w[Cl]=!0:xt.test(g)?kt.test(g)?w[fr]=!0:w[kl]=!0:w[xl]=!0,Qu(n,g,g,w)}return Qu(n,"localhost",br,{ascii:!0}),n.jd=new Te(ti),{start:n,tokens:Object.assign({groups:e},df)}}function uf(t,e){let n=M0(e.replace(/[A-Z]/g,l=>l.toLowerCase())),r=n.length,o=[],i=0,s=0;for(;s=0&&(u+=n[s].length,f++),c+=n[s].length,i+=n[s].length,s++;i-=u,s-=f,c-=u,o.push({t:d.t,v:e.slice(i-c,i),s:i-c,e:i})}return o}function M0(t){let e=[],n=t.length,r=0;for(;r56319||r+1===n||(i=t.charCodeAt(r+1))<56320||i>57343?t[r]:t.slice(r,r+2);e.push(s),r+=s.length}return e}function Pt(t,e,n,r,o){let i,s=e.length;for(let l=0;l=0;)i++;if(i>0){e.push(n.join(""));for(let s=parseInt(t.substring(r,r+i),10);s>0;s--)n.pop();r+=i}else n.push(t[r]),r++}return e}var wr={defaultProtocol:"http",events:null,format:tf,formatHref:tf,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function Pl(t,e=null){let n=Object.assign({},wr);t&&(n=Object.assign(n,t instanceof Pl?t.o:t));let r=n.ignoreTags,o=[];for(let i=0;in?r.substring(0,n)+"\u2026":r},toFormattedHref(t){return t.get("formatHref",this.toHref(t.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(t=wr.defaultProtocol){return{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(t),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(t){return{type:this.t,value:this.toFormattedString(t),isLink:this.isLink,href:this.toFormattedHref(t),start:this.startIndex(),end:this.endIndex()}},validate(t){return t.get("validate",this.toString(),this)},render(t){let e=this,n=this.toHref(t.get("defaultProtocol")),r=t.get("formatHref",n,this),o=t.get("tagName",n,e),i=this.toFormattedString(t),s={},l=t.get("className",n,e),a=t.get("target",n,e),c=t.get("rel",n,e),d=t.getObj("attributes",n,e),u=t.getObj("events",n,e);return s.href=r,l&&(s.class=l),a&&(s.target=a),c&&(s.rel=c),d&&Object.assign(s,d),{tagName:o,attributes:s,content:i,eventListeners:u}}};function ni(t,e){class n extends ff{constructor(o,i){super(o,i),this.t=t}}for(let r in e)n.prototype[r]=e[r];return n.t=t,n}var nf=ni("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),rf=ni("text"),T0=ni("nl"),Ao=ni("url",{isLink:!0,toHref(t=wr.defaultProtocol){return this.hasProtocol()?this.v:`${t}://${this.v}`},hasProtocol(){let t=this.tk;return t.length>=2&&t[0].t!==br&&t[1].t===Bt}});var ze=t=>new Te(t);function A0({groups:t}){let e=t.domain.concat([Wo,Uo,Lt,Ko,qo,Jo,Go,Xo,He,El,mr,Yo,Qo,Zo,it,ti,yr,ei]),n=[jo,Bt,Ol,ot,Rl,mr,gr,Dl,Il,Io,Po,hr,pr,Oo,No,Ro,Do,Lo,Bo,zo,Ho,$o,Fo,Vo,_o],r=[Wo,jo,Uo,Ko,qo,Jo,Go,Xo,He,hr,pr,mr,Yo,Qo,Zo,gr,it,ti,yr,ei],o=ze(),i=M(o,yr);j(i,r,i),j(i,t.domain,i);let s=ze(),l=ze(),a=ze();j(o,t.domain,s),j(o,t.scheme,l),j(o,t.slashscheme,a),j(s,r,i),j(s,t.domain,s);let c=M(s,Lt);M(i,Lt,c),M(l,Lt,c),M(a,Lt,c);let d=M(i,ot);j(d,r,i),j(d,t.domain,i);let u=ze();j(c,t.domain,u),j(u,t.domain,u);let f=M(u,ot);j(f,t.domain,u);let h=ze(nf);j(f,t.tld,h),j(f,t.utld,h),M(c,br,h);let p=M(u,He);M(p,He,p),j(p,t.domain,u),j(h,t.domain,u),M(h,ot,f),M(h,He,p);let m=M(h,Bt);j(m,t.numeric,nf);let g=M(s,He),y=M(s,ot);M(g,He,g),j(g,t.domain,s),j(y,r,i),j(y,t.domain,s);let w=ze(Ao);j(y,t.tld,w),j(y,t.utld,w),j(w,t.domain,s),j(w,r,i),M(w,ot,y),M(w,He,g),M(w,Lt,c);let b=M(w,Bt),C=ze(Ao);j(b,t.numeric,C);let x=ze(Ao),S=ze();j(x,e,x),j(x,n,S),j(S,e,x),j(S,n,S),M(w,it,x),M(C,it,x);let k=M(l,Bt),O=M(a,Bt),T=M(O,it),A=M(T,it);j(l,t.domain,s),M(l,ot,y),M(l,He,g),j(a,t.domain,s),M(a,ot,y),M(a,He,g),j(k,t.domain,x),M(k,it,x),M(k,gr,x),j(A,t.domain,x),j(A,e,x),M(A,it,x);let $=[[hr,pr],[No,Oo],[Ro,Do],[Io,Po],[Lo,Bo],[zo,Ho],[$o,Fo],[Vo,_o]];for(let z=0;z<$.length;z++){let[K,V]=$[z],N=M(x,K);M(S,K,N),M(N,V,x);let _=ze(Ao);j(N,e,_);let W=ze();j(N,n),j(_,e,_),j(_,n,W),j(W,e,_),j(W,n,W),M(_,V,x),M(W,V,x)}return M(o,br,w),M(o,Nl,T0),{start:o,tokens:df}}function E0(t,e,n){let r=n.length,o=0,i=[],s=[];for(;o=0&&f++,o++,d++;if(f<0)o-=d,o0&&(i.push(wl(rf,e,s)),s=[]),o-=f,d-=f;let h=u.t,p=n.slice(o-d,o);i.push(wl(h,e,p))}}return s.length>0&&i.push(wl(rf,e,s)),i}function wl(t,e,n){let r=n[0].s,o=n[n.length-1].e,i=e.slice(r,o);return new t(i,n)}var N0=typeof console<"u"&&console&&console.warn||(()=>{}),O0="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",Z={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function hf(){return Te.groups={},Z.scanner=null,Z.parser=null,Z.tokenQueue=[],Z.pluginQueue=[],Z.customSchemes=[],Z.initialized=!1,Z}function Ll(t,e=!1){if(Z.initialized&&N0(`linkifyjs: already initialized - will not register custom scheme "${t}" ${O0}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(t))throw new Error(`linkifyjs: incorrect scheme format. +1. Must only contain digits, lowercase ASCII letters or "-" +2. Cannot start or end with "-" +3. "-" cannot repeat`);Z.customSchemes.push([t,e])}function R0(){Z.scanner=v0(Z.customSchemes);for(let t=0;t{let o=e.some(c=>c.docChanged)&&!n.doc.eq(r.doc),i=e.some(c=>c.getMeta("preventAutolink"));if(!o||i)return;let{tr:s}=r,l=Js(n.doc,[...e]);if(el(l).forEach(({newRange:c})=>{let d=jd(r.doc,c,h=>h.isTextblock),u,f;if(d.length>1)u=d[0],f=r.doc.textBetween(u.pos,u.pos+u.node.nodeSize,void 0," ");else if(d.length){let h=r.doc.textBetween(c.from,c.to," "," ");if(!I0.test(h))return;u=d[0],f=r.doc.textBetween(u.pos,c.to,void 0," ")}if(u&&f){let h=f.split(D0).filter(Boolean);if(h.length<=0)return!1;let p=h[h.length-1],m=u.pos+f.lastIndexOf(p);if(!p)return!1;let g=ri(p).map(y=>y.toObject(t.defaultProtocol));if(!L0(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:m+y.start+1,to:m+y.end+1})).filter(y=>r.schema.marks.code?!r.doc.rangeHasMark(y.from,y.to,r.schema.marks.code):!0).filter(y=>t.validate(y.value)).filter(y=>t.shouldAutoLink(y.value)).forEach(y=>{po(y.from,y.to,r.doc).some(w=>w.mark.type===t.type)||s.addMark(y.from,y.to,t.type.create({href:y.href}))})}}),!!s.steps.length)return s}})}function z0(t){return new P({key:new H("handleClickLink"),props:{handleClick:(e,n,r)=>{var o,i;if(r.button!==0||!e.editable)return!1;let s=!1;if(t.enableClickSelection&&(s=t.editor.commands.extendMarkRange(t.type.name)),t.openOnClick){let l=null;if(r.target instanceof HTMLAnchorElement)l=r.target;else{let u=r.target,f=[];for(;u.nodeName!=="DIV";)f.push(u),u=u.parentNode;l=f.find(h=>h.nodeName==="A")}if(!l)return s;let a=Zs(e.state,t.type.name),c=(o=l?.href)!=null?o:a.href,d=(i=l?.target)!=null?i:a.target;l&&c&&(window.open(c,d),s=!0)}return s}}})}function H0(t){return new P({key:new H("handlePasteLink"),props:{handlePaste:(e,n,r)=>{let{shouldAutoLink:o}=t,{state:i}=e,{selection:s}=i,{empty:l}=s;if(l)return!1;let a="";r.content.forEach(d=>{a+=d.textContent});let c=oi(a,{defaultProtocol:t.defaultProtocol}).find(d=>d.isLink&&d.value===a);return!a||!c||o!==void 0&&!o(c.href)?!1:t.editor.commands.setMark(t.type,{href:c.href})}}})}function rn(t,e){let n=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(r=>{let o=typeof r=="string"?r:r.scheme;o&&n.push(o)}),!t||t.replace(P0,"").match(new RegExp(`^(?:(?:${n.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var $0=ee.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(t=>{if(typeof t=="string"){Ll(t);return}Ll(t.scheme,t.optionalSlashes)})},onDestroy(){hf()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,enableClickSelection:!1,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(t,e)=>!!rn(t,e.protocols),validate:t=>!!t,shouldAutoLink:t=>!!t}},addAttributes(){return{href:{default:null,parseHTML(t){return t.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:"a[href]",getAttrs:t=>{let e=t.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:n=>!!rn(n,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:t}){return this.options.isAllowedUri(t.href,{defaultValidate:e=>!!rn(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",R(this.options.HTMLAttributes,t),0]:["a",R(this.options.HTMLAttributes,{...t,href:""}),0]},markdownTokenName:"link",parseMarkdown:(t,e)=>e.applyMark("link",e.parseInline(t.tokens||[]),{href:t.href,title:t.title||null}),renderMarkdown:(t,e)=>{var n;let r=((n=t.attrs)==null?void 0:n.href)||"";return`[${e.renderChildren(t)}](${r})`},addCommands(){return{setLink:t=>({chain:e})=>{let{href:n}=t;return this.options.isAllowedUri(n,{defaultValidate:r=>!!rn(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,t).setMeta("preventAutolink",!0).run():!1},toggleLink:t=>({chain:e})=>{let{href:n}=t||{};return n&&!this.options.isAllowedUri(n,{defaultValidate:r=>!!rn(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:e().toggleMark(this.name,t,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()},unsetLink:()=>({chain:t})=>t().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[Me({find:t=>{let e=[];if(t){let{protocols:n,defaultProtocol:r}=this.options,o=oi(t).filter(i=>i.isLink&&this.options.isAllowedUri(i.value,{defaultValidate:s=>!!rn(s,n),protocols:n,defaultProtocol:r}));o.length&&o.forEach(i=>{this.options.shouldAutoLink(i.value)&&e.push({text:i.value,data:{href:i.href},index:i.start})})}return e},type:this.type,getAttributes:t=>{var e;return{href:(e=t.data)==null?void 0:e.href}}})]},addProseMirrorPlugins(){let t=[],{protocols:e,defaultProtocol:n}=this.options;return this.options.autolink&&t.push(B0({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:r=>this.options.isAllowedUri(r,{defaultValidate:o=>!!rn(o,e),protocols:e,defaultProtocol:n}),shouldAutoLink:this.options.shouldAutoLink})),t.push(z0({type:this.type,editor:this.editor,openOnClick:this.options.openOnClick==="whenNotEditable"?!0:this.options.openOnClick,enableClickSelection:this.options.enableClickSelection})),this.options.linkOnPaste&&t.push(H0({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type,shouldAutoLink:this.options.shouldAutoLink})),t}}),pf=$0;var F0=Object.defineProperty,V0=(t,e)=>{for(var n in e)F0(t,n,{get:e[n],enumerable:!0})},_0="listItem",mf="textStyle",gf=/^\s*([-+*])\s$/,$l=F.create({name:"bulletList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul"}]},renderHTML({HTMLAttributes:t}){return["ul",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"list",parseMarkdown:(t,e)=>t.type!=="list"||t.ordered?[]:{type:"bulletList",content:t.items?e.parseChildren(t.items):[]},renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` +`):"",markdownOptions:{indentsContent:!0},addCommands(){return{toggleBulletList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(_0,this.editor.getAttributes(mf)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-8":()=>this.editor.commands.toggleBulletList()}},addInputRules(){let t=tt({find:gf,type:this.type});return(this.options.keepMarks||this.options.keepAttributes)&&(t=tt({find:gf,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:()=>this.editor.getAttributes(mf),editor:this.editor})),[t]}}),Fl=F.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"list_item",parseMarkdown:(t,e)=>{if(t.type!=="list_item")return[];let n=[];if(t.tokens&&t.tokens.length>0)if(t.tokens.some(o=>o.type==="paragraph"))n=e.parseChildren(t.tokens);else{let o=t.tokens[0];if(o&&o.type==="text"&&o.tokens&&o.tokens.length>0){if(n=[{type:"paragraph",content:e.parseInline(o.tokens)}],t.tokens.length>1){let s=t.tokens.slice(1),l=e.parseChildren(s);n.push(...l)}}else n=e.parseChildren(t.tokens)}return n.length===0&&(n=[{type:"paragraph",content:[]}]),{type:"listItem",content:n}},renderMarkdown:(t,e,n)=>cr(t,e,r=>r.parentType==="bulletList"?"- ":r.parentType==="orderedList"?`${r.index+1}. `:"- ",n),addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),W0={};V0(W0,{findListItemPos:()=>xr,getNextListDepth:()=>Vl,handleBackspace:()=>zl,handleDelete:()=>Hl,hasListBefore:()=>xf,hasListItemAfter:()=>j0,hasListItemBefore:()=>kf,listItemHasSubList:()=>Sf,nextListIsDeeper:()=>Cf,nextListIsHigher:()=>vf});var xr=(t,e)=>{let{$from:n}=e.selection,r=ne(t,e.schema),o=null,i=n.depth,s=n.pos,l=null;for(;i>0&&l===null;)o=n.node(i),o.type===r?l=i:(i-=1,s-=1);return l===null?null:{$pos:e.doc.resolve(s),depth:l}},Vl=(t,e)=>{let n=xr(t,e);if(!n)return!1;let[,r]=Xd(e,t,n.$pos.pos+4);return r},xf=(t,e,n)=>{let{$anchor:r}=t.selection,o=Math.max(0,r.pos-2),i=t.doc.resolve(o).node();return!(!i||!n.includes(i.type.name))},kf=(t,e)=>{var n;let{$anchor:r}=e.selection,o=e.doc.resolve(r.pos-2);return!(o.index()===0||((n=o.nodeBefore)==null?void 0:n.type.name)!==t)},Sf=(t,e,n)=>{if(!n)return!1;let r=ne(t,e.schema),o=!1;return n.descendants(i=>{i.type===r&&(o=!0)}),o},zl=(t,e,n)=>{if(t.commands.undoInputRule())return!0;if(t.state.selection.from!==t.state.selection.to)return!1;if(!Ze(t.state,e)&&xf(t.state,e,n)){let{$anchor:l}=t.state.selection,a=t.state.doc.resolve(l.before()-1),c=[];a.node().descendants((f,h)=>{f.type.name===e&&c.push({node:f,pos:h})});let d=c.at(-1);if(!d)return!1;let u=t.state.doc.resolve(a.start()+d.pos+1);return t.chain().cut({from:l.start()-1,to:l.end()+1},u.end()).joinForward().run()}if(!Ze(t.state,e)||!Qd(t.state))return!1;let r=xr(e,t.state);if(!r)return!1;let i=t.state.doc.resolve(r.$pos.pos-2).node(r.depth),s=Sf(e,t.state,i);return kf(e,t.state)&&!s?t.commands.joinItemBackward():t.chain().liftListItem(e).run()},Cf=(t,e)=>{let n=Vl(t,e),r=xr(t,e);return!r||!n?!1:n>r.depth},vf=(t,e)=>{let n=Vl(t,e),r=xr(t,e);return!r||!n?!1:n{if(!Ze(t.state,e)||!Yd(t.state,e))return!1;let{selection:n}=t.state,{$from:r,$to:o}=n;return!n.empty&&r.sameParent(o)?!1:Cf(e,t.state)?t.chain().focus(t.state.selection.from+4).lift(e).joinBackward().run():vf(e,t.state)?t.chain().joinForward().joinBackward().run():t.commands.joinItemForward()},j0=(t,e)=>{var n;let{$anchor:r}=e.selection,o=e.doc.resolve(r.pos-r.parentOffset-2);return!(o.index()===o.parent.childCount-1||((n=o.nodeAfter)==null?void 0:n.type.name)!==t)},U0=U.create({name:"listKeymap",addOptions(){return{listTypes:[{itemName:"listItem",wrapperNames:["bulletList","orderedList"]},{itemName:"taskItem",wrapperNames:["taskList"]}]}},addKeyboardShortcuts(){return{Delete:({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n})=>{t.state.schema.nodes[n]!==void 0&&Hl(t,n)&&(e=!0)}),e},"Mod-Delete":({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n})=>{t.state.schema.nodes[n]!==void 0&&Hl(t,n)&&(e=!0)}),e},Backspace:({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n,wrapperNames:r})=>{t.state.schema.nodes[n]!==void 0&&zl(t,n,r)&&(e=!0)}),e},"Mod-Backspace":({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n,wrapperNames:r})=>{t.state.schema.nodes[n]!==void 0&&zl(t,n,r)&&(e=!0)}),e}}}}),yf=/^(\s*)(\d+)\.\s+(.*)$/,K0=/^\s/;function q0(t){let e=[],n=0,r=0;for(;ne;)f.push(t[u]),u+=1;if(f.length>0){let h=Math.min(...f.map(m=>m.indent)),p=Mf(f,h,n);c.push({type:"list",ordered:!0,start:f[0].number,items:p,raw:f.map(m=>m.raw).join(` +`)})}o.push({type:"list_item",raw:s.raw,tokens:c}),i=u}else i+=1}return o}function J0(t,e){return t.map(n=>{if(n.type!=="list_item")return e.parseChildren([n])[0];let r=[];return n.tokens&&n.tokens.length>0&&n.tokens.forEach(o=>{if(o.type==="paragraph"||o.type==="list"||o.type==="blockquote"||o.type==="code")r.push(...e.parseChildren([o]));else if(o.type==="text"&&o.tokens){let i=e.parseChildren([o]);r.push({type:"paragraph",content:i})}else{let i=e.parseChildren([o]);i.length>0&&r.push(...i)}}),{type:"listItem",content:r}})}var G0="listItem",bf="textStyle",wf=/^(\d+)\.\s$/,_l=F.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:t=>t.hasAttribute("start")?parseInt(t.getAttribute("start")||"",10):1},type:{default:null,parseHTML:t=>t.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:t}){let{start:e,...n}=t;return e===1?["ol",R(this.options.HTMLAttributes,n),0]:["ol",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"list",parseMarkdown:(t,e)=>{if(t.type!=="list"||!t.ordered)return[];let n=t.start||1,r=t.items?J0(t.items,e):[];return n!==1?{type:"orderedList",attrs:{start:n},content:r}:{type:"orderedList",content:r}},renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` +`):"",markdownTokenizer:{name:"orderedList",level:"block",start:t=>{let e=t.match(/^(\s*)(\d+)\.\s+/),n=e?.index;return n!==void 0?n:-1},tokenize:(t,e,n)=>{var r;let o=t.split(` +`),[i,s]=q0(o);if(i.length===0)return;let l=Mf(i,0,n);return l.length===0?void 0:{type:"list",ordered:!0,start:((r=i[0])==null?void 0:r.number)||1,items:l,raw:o.slice(0,s).join(` +`)}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleOrderedList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(G0,this.editor.getAttributes(bf)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let t=tt({find:wf,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(t=tt({find:wf,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(bf)}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1],editor:this.editor})),[t]}}),X0=/^\s*(\[([( |x])?\])\s$/,Y0=F.create({name:"taskItem",addOptions(){return{nested:!1,HTMLAttributes:{},taskListTypeName:"taskList",a11y:void 0}},content(){return this.options.nested?"paragraph block*":"paragraph+"},defining:!0,addAttributes(){return{checked:{default:!1,keepOnSplit:!1,parseHTML:t=>{let e=t.getAttribute("data-checked");return e===""||e==="true"},renderHTML:t=>({"data-checked":t.checked})}}},parseHTML(){return[{tag:`li[data-type="${this.name}"]`,priority:51}]},renderHTML({node:t,HTMLAttributes:e}){return["li",R(this.options.HTMLAttributes,e,{"data-type":this.name}),["label",["input",{type:"checkbox",checked:t.attrs.checked?"checked":null}],["span"]],["div",0]]},parseMarkdown:(t,e)=>{let n=[];if(t.tokens&&t.tokens.length>0?n.push(e.createNode("paragraph",{},e.parseInline(t.tokens))):t.text?n.push(e.createNode("paragraph",{},[e.createNode("text",{text:t.text})])):n.push(e.createNode("paragraph",{},[])),t.nestedTokens&&t.nestedTokens.length>0){let r=e.parseChildren(t.nestedTokens);n.push(...r)}return e.createNode("taskItem",{checked:t.checked||!1},n)},renderMarkdown:(t,e)=>{var n;let o=`- [${(n=t.attrs)!=null&&n.checked?"x":" "}] `;return cr(t,e,o)},addKeyboardShortcuts(){let t={Enter:()=>this.editor.commands.splitListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)};return this.options.nested?{...t,Tab:()=>this.editor.commands.sinkListItem(this.name)}:t},addNodeView(){return({node:t,HTMLAttributes:e,getPos:n,editor:r})=>{let o=document.createElement("li"),i=document.createElement("label"),s=document.createElement("span"),l=document.createElement("input"),a=document.createElement("div"),c=d=>{var u,f;l.ariaLabel=((f=(u=this.options.a11y)==null?void 0:u.checkboxLabel)==null?void 0:f.call(u,d,l.checked))||`Task item checkbox for ${d.textContent||"empty task item"}`};return c(t),i.contentEditable="false",l.type="checkbox",l.addEventListener("mousedown",d=>d.preventDefault()),l.addEventListener("change",d=>{if(!r.isEditable&&!this.options.onReadOnlyChecked){l.checked=!l.checked;return}let{checked:u}=d.target;r.isEditable&&typeof n=="function"&&r.chain().focus(void 0,{scrollIntoView:!1}).command(({tr:f})=>{let h=n();if(typeof h!="number")return!1;let p=f.doc.nodeAt(h);return f.setNodeMarkup(h,void 0,{...p?.attrs,checked:u}),!0}).run(),!r.isEditable&&this.options.onReadOnlyChecked&&(this.options.onReadOnlyChecked(t,u)||(l.checked=!l.checked))}),Object.entries(this.options.HTMLAttributes).forEach(([d,u])=>{o.setAttribute(d,u)}),o.dataset.checked=t.attrs.checked,l.checked=t.attrs.checked,i.append(l,s),o.append(i,a),Object.entries(e).forEach(([d,u])=>{o.setAttribute(d,u)}),{dom:o,contentDOM:a,update:d=>d.type!==this.type?!1:(o.dataset.checked=d.attrs.checked,l.checked=d.attrs.checked,c(d),!0)}}},addInputRules(){return[tt({find:X0,type:this.type,getAttributes:t=>({checked:t[t.length-1]==="x"})})]}}),Q0=F.create({name:"taskList",addOptions(){return{itemTypeName:"taskItem",HTMLAttributes:{}}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:`ul[data-type="${this.name}"]`,priority:51}]},renderHTML({HTMLAttributes:t}){return["ul",R(this.options.HTMLAttributes,t,{"data-type":this.name}),0]},parseMarkdown:(t,e)=>e.createNode("taskList",{},e.parseChildren(t.items||[])),renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` +`):"",markdownTokenizer:{name:"taskList",level:"block",start(t){var e;let n=(e=t.match(/^\s*[-+*]\s+\[([ xX])\]\s+/))==null?void 0:e.index;return n!==void 0?n:-1},tokenize(t,e,n){let r=i=>{let s=wo(i,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:l=>({indentLevel:l[1].length,mainContent:l[4],checked:l[3].toLowerCase()==="x"}),createToken:(l,a)=>({type:"taskItem",raw:"",mainContent:l.mainContent,indentLevel:l.indentLevel,checked:l.checked,text:l.mainContent,tokens:n.inlineTokens(l.mainContent),nestedTokens:a}),customNestedParser:r},n);return s?[{type:"taskList",raw:s.raw,items:s.items}]:n.blockTokens(i)},o=wo(t,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:i=>({indentLevel:i[1].length,mainContent:i[4],checked:i[3].toLowerCase()==="x"}),createToken:(i,s)=>({type:"taskItem",raw:"",mainContent:i.mainContent,indentLevel:i.indentLevel,checked:i.checked,text:i.mainContent,tokens:n.inlineTokens(i.mainContent),nestedTokens:s}),customNestedParser:r},n);if(o)return{type:"taskList",raw:o.raw,items:o.items}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleTaskList:()=>({commands:t})=>t.toggleList(this.name,this.options.itemTypeName)}},addKeyboardShortcuts(){return{"Mod-Shift-9":()=>this.editor.commands.toggleTaskList()}}}),dv=U.create({name:"listKit",addExtensions(){let t=[];return this.options.bulletList!==!1&&t.push($l.configure(this.options.bulletList)),this.options.listItem!==!1&&t.push(Fl.configure(this.options.listItem)),this.options.listKeymap!==!1&&t.push(U0.configure(this.options.listKeymap)),this.options.orderedList!==!1&&t.push(_l.configure(this.options.orderedList)),this.options.taskItem!==!1&&t.push(Y0.configure(this.options.taskItem)),this.options.taskList!==!1&&t.push(Q0.configure(this.options.taskList)),t}});var ii=(t,e,n={})=>{t.dom.closest("form")?.dispatchEvent(new CustomEvent(e,{composed:!0,cancelable:!0,detail:n}))},Tf=({files:t,acceptedTypes:e,acceptedTypesValidationMessage:n,maxSize:r,maxSizeValidationMessage:o})=>{for(let i of t){if(e&&!e.includes(i.type))return n;if(r&&i.size>+r*1024)return o}return null},Z0=({editor:t,acceptedTypes:e,acceptedTypesValidationMessage:n,get$WireUsing:r,key:o,maxSize:i,maxSizeValidationMessage:s,statePath:l,uploadingMessage:a})=>{let c=d=>r().callSchemaComponentMethod(o,"getUploadedFileAttachmentTemporaryUrl",{attachment:d});return new P({key:new H("localFiles"),props:{handleDrop(d,u){if(!u.dataTransfer?.files.length)return!1;let f=Array.from(u.dataTransfer.files),h=Tf({files:f,acceptedTypes:e,acceptedTypesValidationMessage:n,maxSize:i,maxSizeValidationMessage:s});if(h)return d.dom.dispatchEvent(new CustomEvent("rich-editor-file-validation-message",{bubbles:!0,detail:{key:o,livewireId:r().id,validationMessage:h}})),!1;if(!f.length)return!1;ii(d,"form-processing-started",{message:a}),u.preventDefault(),u.stopPropagation();let p=d.posAtCoords({left:u.clientX,top:u.clientY});return f.forEach((m,g)=>{t.setEditable(!1),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:o,livewireId:r().id}}));let y=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,w=>(w^crypto.getRandomValues(new Uint8Array(1))[0]&15>>w/4).toString(16));r().upload(`componentFileAttachments.${l}.${y}`,m,()=>{c(y).then(w=>{w&&(t.chain().insertContentAt(p?.pos??0,{type:"image",attrs:{id:y,src:w}}).run(),t.setEditable(!0),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:o,livewireId:r().id}})),g===f.length-1&&ii(d,"form-processing-finished"))})})}),!0},handlePaste(d,u){if(!u.clipboardData?.files.length||u.clipboardData?.getData("text").length)return!1;let f=Array.from(u.clipboardData.files),h=Tf({files:f,acceptedTypes:e,acceptedTypesValidationMessage:n,maxSize:i,maxSizeValidationMessage:s});return h?(d.dom.dispatchEvent(new CustomEvent("rich-editor-file-validation-message",{bubbles:!0,detail:{key:o,livewireId:r().id,validationMessage:h}})),!1):f.length?(u.preventDefault(),u.stopPropagation(),ii(d,"form-processing-started",{message:a}),f.forEach((p,m)=>{t.setEditable(!1),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:o,livewireId:r().id}}));let g=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,y=>(y^crypto.getRandomValues(new Uint8Array(1))[0]&15>>y/4).toString(16));r().upload(`componentFileAttachments.${l}.${g}`,p,()=>{c(g).then(y=>{y&&(t.chain().insertContentAt(t.state.selection.anchor,{type:"image",attrs:{id:g,src:y}}).run(),t.setEditable(!0),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:o,livewireId:r().id}})),m===f.length-1&&ii(d,"form-processing-finished"))})})}),!0):!1}}})},Af=U.create({name:"localFiles",addOptions(){return{acceptedTypes:[],acceptedTypesValidationMessage:null,key:null,maxSize:null,maxSizeValidationMessage:null,statePath:null,uploadingMessage:null,get$WireUsing:null}},addProseMirrorPlugins(){return[Z0({editor:this.editor,...this.options})]}});function ew(t){var e;let{char:n,allowSpaces:r,allowToIncludeChar:o,allowedPrefixes:i,startOfLine:s,$position:l}=t,a=r&&!o,c=wu(n),d=new RegExp(`\\s${c}$`),u=s?"^":"",f=o?"":c,h=a?new RegExp(`${u}${c}.*?(?=\\s${f}|$)`,"gm"):new RegExp(`${u}(?:^)?${c}[^\\s${f}]*`,"gm"),p=((e=l.nodeBefore)==null?void 0:e.isText)&&l.nodeBefore.text;if(!p)return null;let m=l.pos-p.length,g=Array.from(p.matchAll(h)).pop();if(!g||g.input===void 0||g.index===void 0)return null;let y=g.input.slice(Math.max(0,g.index-1),g.index),w=new RegExp(`^[${i?.join("")}\0]?$`).test(y);if(i!==null&&!w)return null;let b=m+g.index,C=b+g[0].length;return a&&d.test(p.slice(C-1,C+1))&&(g[0]+=" ",C+=1),b=l.pos?{range:{from:b,to:C},query:g[0].slice(n.length),text:g[0]}:null}var tw=new H("suggestion");function nw({pluginKey:t=tw,editor:e,char:n="@",allowSpaces:r=!1,allowToIncludeChar:o=!1,allowedPrefixes:i=[" "],startOfLine:s=!1,decorationTag:l="span",decorationClass:a="suggestion",decorationContent:c="",decorationEmptyClass:d="is-empty",command:u=()=>null,items:f=()=>[],render:h=()=>({}),allow:p=()=>!0,findSuggestionMatch:m=ew}){let g,y=h?.(),w=()=>{let S=e.state.selection.$anchor.pos,k=e.view.coordsAtPos(S),{top:O,right:T,bottom:A,left:$}=k;try{return new DOMRect($,O,T-$,A-O)}catch{return null}},b=(S,k)=>k?()=>{let O=t.getState(e.state),T=O?.decorationId,A=S.dom.querySelector(`[data-decoration-id="${T}"]`);return A?.getBoundingClientRect()||null}:w;function C(S,k){var O;try{let A=t.getState(S.state),$=A?.decorationId?S.dom.querySelector(`[data-decoration-id="${A.decorationId}"]`):null,z={editor:e,range:A?.range||{from:0,to:0},query:A?.query||null,text:A?.text||null,items:[],command:K=>u({editor:e,range:A?.range||{from:0,to:0},props:K}),decorationNode:$,clientRect:b(S,$)};(O=y?.onExit)==null||O.call(y,z)}catch{}let T=S.state.tr.setMeta(k,{exit:!0});S.dispatch(T)}let x=new P({key:t,view(){return{update:async(S,k)=>{var O,T,A,$,z,K,V;let N=(O=this.key)==null?void 0:O.getState(k),_=(T=this.key)==null?void 0:T.getState(S.state),W=N.active&&_.active&&N.range.from!==_.range.from,Q=!N.active&&_.active,me=N.active&&!_.active,Ge=!Q&&!me&&N.query!==_.query,q=Q||W&&Ge,We=Ge||W,je=me||W&&Ge;if(!q&&!We&&!je)return;let dn=je&&!q?N:_,aa=S.dom.querySelector(`[data-decoration-id="${dn.decorationId}"]`);g={editor:e,range:dn.range,query:dn.query,text:dn.text,items:[],command:ip=>u({editor:e,range:dn.range,props:ip}),decorationNode:aa,clientRect:b(S,aa)},q&&((A=y?.onBeforeStart)==null||A.call(y,g)),We&&(($=y?.onBeforeUpdate)==null||$.call(y,g)),(We||q)&&(g.items=await f({editor:e,query:dn.query})),je&&((z=y?.onExit)==null||z.call(y,g)),We&&((K=y?.onUpdate)==null||K.call(y,g)),q&&((V=y?.onStart)==null||V.call(y,g))},destroy:()=>{var S;g&&((S=y?.onExit)==null||S.call(y,g))}}},state:{init(){return{active:!1,range:{from:0,to:0},query:null,text:null,composing:!1}},apply(S,k,O,T){let{isEditable:A}=e,{composing:$}=e.view,{selection:z}=S,{empty:K,from:V}=z,N={...k},_=S.getMeta(t);if(_&&_.exit)return N.active=!1,N.decorationId=null,N.range={from:0,to:0},N.query=null,N.text=null,N;if(N.composing=$,A&&(K||e.view.composing)){(Vk.range.to)&&!$&&!k.composing&&(N.active=!1);let W=m({char:n,allowSpaces:r,allowToIncludeChar:o,allowedPrefixes:i,startOfLine:s,$position:z.$from}),Q=`id_${Math.floor(Math.random()*4294967295)}`;W&&p({editor:e,state:T,range:W.range,isActive:k.active})?(N.active=!0,N.decorationId=k.decorationId?k.decorationId:Q,N.range=W.range,N.query=W.query,N.text=W.text):N.active=!1}else N.active=!1;return N.active||(N.decorationId=null,N.range={from:0,to:0},N.query=null,N.text=null),N}},props:{handleKeyDown(S,k){var O,T,A,$;let{active:z,range:K}=x.getState(S.state);if(!z)return!1;if(k.key==="Escape"||k.key==="Esc"){let N=x.getState(S.state),_=(O=g?.decorationNode)!=null?O:null,W=_??(N?.decorationId?S.dom.querySelector(`[data-decoration-id="${N.decorationId}"]`):null);if(((T=y?.onKeyDown)==null?void 0:T.call(y,{view:S,event:k,range:N.range}))||!1)return!0;let me={editor:e,range:N.range,query:N.query,text:N.text,items:[],command:Ge=>u({editor:e,range:N.range,props:Ge}),decorationNode:W,clientRect:W?()=>W.getBoundingClientRect()||null:null};return(A=y?.onExit)==null||A.call(y,me),C(S,t),!0}return(($=y?.onKeyDown)==null?void 0:$.call(y,{view:S,event:k,range:K}))||!1},decorations(S){let{active:k,range:O,decorationId:T,query:A}=x.getState(S);if(!k)return null;let $=!A?.length,z=[a];return $&&z.push(d),Y.create(S.doc,[te.inline(O.from,O.to,{nodeName:l,class:z.join(" "),"data-decoration-id":T,"data-decoration-content":c})])}}});return x}var si=nw;var rw=function({editor:t,overrideSuggestionOptions:e,extensionName:n}){let r=new H;return{editor:t,char:"{{",pluginKey:r,command:({editor:o,range:i,props:s})=>{o.view.state.selection.$to.nodeAfter?.text?.startsWith(" ")&&(i.to+=1),o.chain().focus().insertContentAt(i,[{type:n,attrs:{...s}},{type:"text",text:" "}]).run(),o.view.dom.ownerDocument.defaultView?.getSelection()?.collapseToEnd()},allow:({state:o,range:i})=>{let s=o.doc.resolve(i.from),l=o.schema.nodes[n];return!!s.parent.type.contentMatch.matchType(l)},...e}},Ef=F.create({name:"mergeTag",priority:101,addStorage(){return{mergeTags:[],suggestions:[],getSuggestionFromChar:()=>null}},addOptions(){return{HTMLAttributes:{},renderText({node:t}){return`{{ ${this.mergeTags[t.attrs.id]} }}`},deleteTriggerWithBackspace:!1,renderHTML({options:t,node:e}){return["span",R(this.HTMLAttributes,t.HTMLAttributes),`${this.mergeTags[e.attrs.id]}`]},suggestions:[],suggestion:{}}},group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}}}},parseHTML(){return[{tag:`span[data-type="${this.name}"]`}]},renderHTML({node:t,HTMLAttributes:e}){let n=this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar("{{"),r={...this.options};r.HTMLAttributes=R({"data-type":this.name},this.options.HTMLAttributes,e);let o=this.options.renderHTML({options:r,node:t,suggestion:n});return typeof o=="string"?["span",R({"data-type":this.name},this.options.HTMLAttributes,e),o]:o},renderText({node:t}){let e={options:this.options,node:t,suggestion:this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar("{{")};return this.options.renderText(e)},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:o,anchor:i}=r;if(!o)return!1;let s=new ie,l=0;return e.doc.nodesBetween(i-1,i,(a,c)=>{if(a.type.name===this.name)return n=!0,s=a,l=c,!1}),n&&t.insertText(this.options.deleteTriggerWithBackspace?"":"{{",l,l+s.nodeSize),n})}},addProseMirrorPlugins(){return[...this.storage.suggestions.map(si),new P({props:{handleDrop(t,e){if(!e||(e.preventDefault(),!e.dataTransfer.getData("mergeTag")))return!1;let n=e.dataTransfer.getData("mergeTag");return t.dispatch(t.state.tr.insert(t.posAtCoords({left:e.clientX,top:e.clientY}).pos,t.state.schema.nodes.mergeTag.create({id:n}))),!1}}})]},onBeforeCreate(){this.storage.suggestions=(this.options.suggestions.length?this.options.suggestions:[this.options.suggestion]).map(t=>rw({editor:this.editor,overrideSuggestionOptions:t,extensionName:this.name})),this.storage.getSuggestionFromChar=t=>{let e=this.storage.suggestions.find(n=>n.char===t);return e||(this.storage.suggestions.length?this.storage.suggestions[0]:null)}}});var Wl=["top","right","bottom","left"],Nf=["start","end"],jl=Wl.reduce((t,e)=>t.concat(e,e+"-"+Nf[0],e+"-"+Nf[1]),[]),$e=Math.min,pe=Math.max,Cr=Math.round;var Ue=t=>({x:t,y:t}),ow={left:"right",right:"left",bottom:"top",top:"bottom"},iw={start:"end",end:"start"};function li(t,e,n){return pe(t,$e(e,n))}function st(t,e){return typeof t=="function"?t(e):t}function Ne(t){return t.split("-")[0]}function Fe(t){return t.split("-")[1]}function Ul(t){return t==="x"?"y":"x"}function ai(t){return t==="y"?"height":"width"}var sw=new Set(["top","bottom"]);function Ke(t){return sw.has(Ne(t))?"y":"x"}function ci(t){return Ul(Ke(t))}function Kl(t,e,n){n===void 0&&(n=!1);let r=Fe(t),o=ci(t),i=ai(o),s=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return e.reference[i]>e.floating[i]&&(s=Sr(s)),[s,Sr(s)]}function Df(t){let e=Sr(t);return[kr(t),e,kr(e)]}function kr(t){return t.replace(/start|end/g,e=>iw[e])}var Of=["left","right"],Rf=["right","left"],lw=["top","bottom"],aw=["bottom","top"];function cw(t,e,n){switch(t){case"top":case"bottom":return n?e?Rf:Of:e?Of:Rf;case"left":case"right":return e?lw:aw;default:return[]}}function If(t,e,n,r){let o=Fe(t),i=cw(Ne(t),n==="start",r);return o&&(i=i.map(s=>s+"-"+o),e&&(i=i.concat(i.map(kr)))),i}function Sr(t){return t.replace(/left|right|bottom|top/g,e=>ow[e])}function dw(t){return{top:0,right:0,bottom:0,left:0,...t}}function di(t){return typeof t!="number"?dw(t):{top:t,right:t,bottom:t,left:t}}function Ct(t){let{x:e,y:n,width:r,height:o}=t;return{width:r,height:o,top:n,left:e,right:e+r,bottom:n+o,x:e,y:n}}function Pf(t,e,n){let{reference:r,floating:o}=t,i=Ke(e),s=ci(e),l=ai(s),a=Ne(e),c=i==="y",d=r.x+r.width/2-o.width/2,u=r.y+r.height/2-o.height/2,f=r[l]/2-o[l]/2,h;switch(a){case"top":h={x:d,y:r.y-o.height};break;case"bottom":h={x:d,y:r.y+r.height};break;case"right":h={x:r.x+r.width,y:u};break;case"left":h={x:r.x-o.width,y:u};break;default:h={x:r.x,y:r.y}}switch(Fe(e)){case"start":h[s]-=f*(n&&c?-1:1);break;case"end":h[s]+=f*(n&&c?-1:1);break}return h}var zf=async(t,e,n)=>{let{placement:r="bottom",strategy:o="absolute",middleware:i=[],platform:s}=n,l=i.filter(Boolean),a=await(s.isRTL==null?void 0:s.isRTL(e)),c=await s.getElementRects({reference:t,floating:e,strategy:o}),{x:d,y:u}=Pf(c,r,a),f=r,h={},p=0;for(let m=0;m({name:"arrow",options:t,async fn(e){let{x:n,y:r,placement:o,rects:i,platform:s,elements:l,middlewareData:a}=e,{element:c,padding:d=0}=st(t,e)||{};if(c==null)return{};let u=di(d),f={x:n,y:r},h=ci(o),p=ai(h),m=await s.getDimensions(c),g=h==="y",y=g?"top":"left",w=g?"bottom":"right",b=g?"clientHeight":"clientWidth",C=i.reference[p]+i.reference[h]-f[h]-i.floating[p],x=f[h]-i.reference[h],S=await(s.getOffsetParent==null?void 0:s.getOffsetParent(c)),k=S?S[b]:0;(!k||!await(s.isElement==null?void 0:s.isElement(S)))&&(k=l.floating[b]||i.floating[p]);let O=C/2-x/2,T=k/2-m[p]/2-1,A=$e(u[y],T),$=$e(u[w],T),z=A,K=k-m[p]-$,V=k/2-m[p]/2+O,N=li(z,V,K),_=!a.arrow&&Fe(o)!=null&&V!==N&&i.reference[p]/2-(VFe(o)===t),...n.filter(o=>Fe(o)!==t)]:n.filter(o=>Ne(o)===o)).filter(o=>t?Fe(o)===t||(e?kr(o)!==o:!1):!0)}var $f=function(t){return t===void 0&&(t={}),{name:"autoPlacement",options:t,async fn(e){var n,r,o;let{rects:i,middlewareData:s,placement:l,platform:a,elements:c}=e,{crossAxis:d=!1,alignment:u,allowedPlacements:f=jl,autoAlignment:h=!0,...p}=st(t,e),m=u!==void 0||f===jl?uw(u||null,h,f):f,g=await on(e,p),y=((n=s.autoPlacement)==null?void 0:n.index)||0,w=m[y];if(w==null)return{};let b=Kl(w,i,await(a.isRTL==null?void 0:a.isRTL(c.floating)));if(l!==w)return{reset:{placement:m[0]}};let C=[g[Ne(w)],g[b[0]],g[b[1]]],x=[...((r=s.autoPlacement)==null?void 0:r.overflows)||[],{placement:w,overflows:C}],S=m[y+1];if(S)return{data:{index:y+1,overflows:x},reset:{placement:S}};let k=x.map(A=>{let $=Fe(A.placement);return[A.placement,$&&d?A.overflows.slice(0,2).reduce((z,K)=>z+K,0):A.overflows[0],A.overflows]}).sort((A,$)=>A[1]-$[1]),T=((o=k.filter(A=>A[2].slice(0,Fe(A[0])?2:3).every($=>$<=0))[0])==null?void 0:o[0])||k[0][0];return T!==l?{data:{index:y+1,overflows:x},reset:{placement:T}}:{}}}},Ff=function(t){return t===void 0&&(t={}),{name:"flip",options:t,async fn(e){var n,r;let{placement:o,middlewareData:i,rects:s,initialPlacement:l,platform:a,elements:c}=e,{mainAxis:d=!0,crossAxis:u=!0,fallbackPlacements:f,fallbackStrategy:h="bestFit",fallbackAxisSideDirection:p="none",flipAlignment:m=!0,...g}=st(t,e);if((n=i.arrow)!=null&&n.alignmentOffset)return{};let y=Ne(o),w=Ke(l),b=Ne(l)===l,C=await(a.isRTL==null?void 0:a.isRTL(c.floating)),x=f||(b||!m?[Sr(l)]:Df(l)),S=p!=="none";!f&&S&&x.push(...If(l,m,p,C));let k=[l,...x],O=await on(e,g),T=[],A=((r=i.flip)==null?void 0:r.overflows)||[];if(d&&T.push(O[y]),u){let V=Kl(o,s,C);T.push(O[V[0]],O[V[1]])}if(A=[...A,{placement:o,overflows:T}],!T.every(V=>V<=0)){var $,z;let V=((($=i.flip)==null?void 0:$.index)||0)+1,N=k[V];if(N&&(!(u==="alignment"?w!==Ke(N):!1)||A.every(Q=>Ke(Q.placement)===w?Q.overflows[0]>0:!0)))return{data:{index:V,overflows:A},reset:{placement:N}};let _=(z=A.filter(W=>W.overflows[0]<=0).sort((W,Q)=>W.overflows[1]-Q.overflows[1])[0])==null?void 0:z.placement;if(!_)switch(h){case"bestFit":{var K;let W=(K=A.filter(Q=>{if(S){let me=Ke(Q.placement);return me===w||me==="y"}return!0}).map(Q=>[Q.placement,Q.overflows.filter(me=>me>0).reduce((me,Ge)=>me+Ge,0)]).sort((Q,me)=>Q[1]-me[1])[0])==null?void 0:K[0];W&&(_=W);break}case"initialPlacement":_=l;break}if(o!==_)return{reset:{placement:_}}}return{}}}};function Lf(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function Bf(t){return Wl.some(e=>t[e]>=0)}var Vf=function(t){return t===void 0&&(t={}),{name:"hide",options:t,async fn(e){let{rects:n}=e,{strategy:r="referenceHidden",...o}=st(t,e);switch(r){case"referenceHidden":{let i=await on(e,{...o,elementContext:"reference"}),s=Lf(i,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:Bf(s)}}}case"escaped":{let i=await on(e,{...o,altBoundary:!0}),s=Lf(i,n.floating);return{data:{escapedOffsets:s,escaped:Bf(s)}}}default:return{}}}}};function _f(t){let e=$e(...t.map(i=>i.left)),n=$e(...t.map(i=>i.top)),r=pe(...t.map(i=>i.right)),o=pe(...t.map(i=>i.bottom));return{x:e,y:n,width:r-e,height:o-n}}function fw(t){let e=t.slice().sort((o,i)=>o.y-i.y),n=[],r=null;for(let o=0;or.height/2?n.push([i]):n[n.length-1].push(i),r=i}return n.map(o=>Ct(_f(o)))}var Wf=function(t){return t===void 0&&(t={}),{name:"inline",options:t,async fn(e){let{placement:n,elements:r,rects:o,platform:i,strategy:s}=e,{padding:l=2,x:a,y:c}=st(t,e),d=Array.from(await(i.getClientRects==null?void 0:i.getClientRects(r.reference))||[]),u=fw(d),f=Ct(_f(d)),h=di(l);function p(){if(u.length===2&&u[0].left>u[1].right&&a!=null&&c!=null)return u.find(g=>a>g.left-h.left&&ag.top-h.top&&c=2){if(Ke(n)==="y"){let A=u[0],$=u[u.length-1],z=Ne(n)==="top",K=A.top,V=$.bottom,N=z?A.left:$.left,_=z?A.right:$.right,W=_-N,Q=V-K;return{top:K,bottom:V,left:N,right:_,width:W,height:Q,x:N,y:K}}let g=Ne(n)==="left",y=pe(...u.map(A=>A.right)),w=$e(...u.map(A=>A.left)),b=u.filter(A=>g?A.left===w:A.right===y),C=b[0].top,x=b[b.length-1].bottom,S=w,k=y,O=k-S,T=x-C;return{top:C,bottom:x,left:S,right:k,width:O,height:T,x:S,y:C}}return f}let m=await i.getElementRects({reference:{getBoundingClientRect:p},floating:r.floating,strategy:s});return o.reference.x!==m.reference.x||o.reference.y!==m.reference.y||o.reference.width!==m.reference.width||o.reference.height!==m.reference.height?{reset:{rects:m}}:{}}}},hw=new Set(["left","top"]);async function pw(t,e){let{placement:n,platform:r,elements:o}=t,i=await(r.isRTL==null?void 0:r.isRTL(o.floating)),s=Ne(n),l=Fe(n),a=Ke(n)==="y",c=hw.has(s)?-1:1,d=i&&a?-1:1,u=st(e,t),{mainAxis:f,crossAxis:h,alignmentAxis:p}=typeof u=="number"?{mainAxis:u,crossAxis:0,alignmentAxis:null}:{mainAxis:u.mainAxis||0,crossAxis:u.crossAxis||0,alignmentAxis:u.alignmentAxis};return l&&typeof p=="number"&&(h=l==="end"?p*-1:p),a?{x:h*d,y:f*c}:{x:f*c,y:h*d}}var jf=function(t){return t===void 0&&(t=0),{name:"offset",options:t,async fn(e){var n,r;let{x:o,y:i,placement:s,middlewareData:l}=e,a=await pw(e,t);return s===((n=l.offset)==null?void 0:n.placement)&&(r=l.arrow)!=null&&r.alignmentOffset?{}:{x:o+a.x,y:i+a.y,data:{...a,placement:s}}}}},Uf=function(t){return t===void 0&&(t={}),{name:"shift",options:t,async fn(e){let{x:n,y:r,placement:o}=e,{mainAxis:i=!0,crossAxis:s=!1,limiter:l={fn:g=>{let{x:y,y:w}=g;return{x:y,y:w}}},...a}=st(t,e),c={x:n,y:r},d=await on(e,a),u=Ke(Ne(o)),f=Ul(u),h=c[f],p=c[u];if(i){let g=f==="y"?"top":"left",y=f==="y"?"bottom":"right",w=h+d[g],b=h-d[y];h=li(w,h,b)}if(s){let g=u==="y"?"top":"left",y=u==="y"?"bottom":"right",w=p+d[g],b=p-d[y];p=li(w,p,b)}let m=l.fn({...e,[f]:h,[u]:p});return{...m,data:{x:m.x-n,y:m.y-r,enabled:{[f]:i,[u]:s}}}}}};var Kf=function(t){return t===void 0&&(t={}),{name:"size",options:t,async fn(e){var n,r;let{placement:o,rects:i,platform:s,elements:l}=e,{apply:a=()=>{},...c}=st(t,e),d=await on(e,c),u=Ne(o),f=Fe(o),h=Ke(o)==="y",{width:p,height:m}=i.floating,g,y;u==="top"||u==="bottom"?(g=u,y=f===(await(s.isRTL==null?void 0:s.isRTL(l.floating))?"start":"end")?"left":"right"):(y=u,g=f==="end"?"top":"bottom");let w=m-d.top-d.bottom,b=p-d.left-d.right,C=$e(m-d[g],w),x=$e(p-d[y],b),S=!e.middlewareData.shift,k=C,O=x;if((n=e.middlewareData.shift)!=null&&n.enabled.x&&(O=b),(r=e.middlewareData.shift)!=null&&r.enabled.y&&(k=w),S&&!f){let A=pe(d.left,0),$=pe(d.right,0),z=pe(d.top,0),K=pe(d.bottom,0);h?O=p-2*(A!==0||$!==0?A+$:pe(d.left,d.right)):k=m-2*(z!==0||K!==0?z+K:pe(d.top,d.bottom))}await a({...e,availableWidth:O,availableHeight:k});let T=await s.getDimensions(l.floating);return p!==T.width||m!==T.height?{reset:{rects:!0}}:{}}}};function fi(){return typeof window<"u"}function sn(t){return Jf(t)?(t.nodeName||"").toLowerCase():"#document"}function Ae(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function lt(t){var e;return(e=(Jf(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function Jf(t){return fi()?t instanceof Node||t instanceof Ae(t).Node:!1}function Ve(t){return fi()?t instanceof Element||t instanceof Ae(t).Element:!1}function qe(t){return fi()?t instanceof HTMLElement||t instanceof Ae(t).HTMLElement:!1}function qf(t){return!fi()||typeof ShadowRoot>"u"?!1:t instanceof ShadowRoot||t instanceof Ae(t).ShadowRoot}var mw=new Set(["inline","contents"]);function Rn(t){let{overflow:e,overflowX:n,overflowY:r,display:o}=_e(t);return/auto|scroll|overlay|hidden|clip/.test(e+r+n)&&!mw.has(o)}var gw=new Set(["table","td","th"]);function Gf(t){return gw.has(sn(t))}var yw=[":popover-open",":modal"];function vr(t){return yw.some(e=>{try{return t.matches(e)}catch{return!1}})}var bw=["transform","translate","scale","rotate","perspective"],ww=["transform","translate","scale","rotate","perspective","filter"],xw=["paint","layout","strict","content"];function hi(t){let e=pi(),n=Ve(t)?_e(t):t;return bw.some(r=>n[r]?n[r]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!e&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!e&&(n.filter?n.filter!=="none":!1)||ww.some(r=>(n.willChange||"").includes(r))||xw.some(r=>(n.contain||"").includes(r))}function Xf(t){let e=vt(t);for(;qe(e)&&!ln(e);){if(hi(e))return e;if(vr(e))return null;e=vt(e)}return null}function pi(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var kw=new Set(["html","body","#document"]);function ln(t){return kw.has(sn(t))}function _e(t){return Ae(t).getComputedStyle(t)}function Mr(t){return Ve(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function vt(t){if(sn(t)==="html")return t;let e=t.assignedSlot||t.parentNode||qf(t)&&t.host||lt(t);return qf(e)?e.host:e}function Yf(t){let e=vt(t);return ln(e)?t.ownerDocument?t.ownerDocument.body:t.body:qe(e)&&Rn(e)?e:Yf(e)}function ui(t,e,n){var r;e===void 0&&(e=[]),n===void 0&&(n=!0);let o=Yf(t),i=o===((r=t.ownerDocument)==null?void 0:r.body),s=Ae(o);if(i){let l=mi(s);return e.concat(s,s.visualViewport||[],Rn(o)?o:[],l&&n?ui(l):[])}return e.concat(o,ui(o,[],n))}function mi(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function th(t){let e=_e(t),n=parseFloat(e.width)||0,r=parseFloat(e.height)||0,o=qe(t),i=o?t.offsetWidth:n,s=o?t.offsetHeight:r,l=Cr(n)!==i||Cr(r)!==s;return l&&(n=i,r=s),{width:n,height:r,$:l}}function nh(t){return Ve(t)?t:t.contextElement}function Dn(t){let e=nh(t);if(!qe(e))return Ue(1);let n=e.getBoundingClientRect(),{width:r,height:o,$:i}=th(e),s=(i?Cr(n.width):n.width)/r,l=(i?Cr(n.height):n.height)/o;return(!s||!Number.isFinite(s))&&(s=1),(!l||!Number.isFinite(l))&&(l=1),{x:s,y:l}}var Sw=Ue(0);function rh(t){let e=Ae(t);return!pi()||!e.visualViewport?Sw:{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}}function Cw(t,e,n){return e===void 0&&(e=!1),!n||e&&n!==Ae(t)?!1:e}function Tr(t,e,n,r){e===void 0&&(e=!1),n===void 0&&(n=!1);let o=t.getBoundingClientRect(),i=nh(t),s=Ue(1);e&&(r?Ve(r)&&(s=Dn(r)):s=Dn(t));let l=Cw(i,n,r)?rh(i):Ue(0),a=(o.left+l.x)/s.x,c=(o.top+l.y)/s.y,d=o.width/s.x,u=o.height/s.y;if(i){let f=Ae(i),h=r&&Ve(r)?Ae(r):r,p=f,m=mi(p);for(;m&&r&&h!==p;){let g=Dn(m),y=m.getBoundingClientRect(),w=_e(m),b=y.left+(m.clientLeft+parseFloat(w.paddingLeft))*g.x,C=y.top+(m.clientTop+parseFloat(w.paddingTop))*g.y;a*=g.x,c*=g.y,d*=g.x,u*=g.y,a+=b,c+=C,p=Ae(m),m=mi(p)}}return Ct({width:d,height:u,x:a,y:c})}function gi(t,e){let n=Mr(t).scrollLeft;return e?e.left+n:Tr(lt(t)).left+n}function oh(t,e){let n=t.getBoundingClientRect(),r=n.left+e.scrollLeft-gi(t,n),o=n.top+e.scrollTop;return{x:r,y:o}}function vw(t){let{elements:e,rect:n,offsetParent:r,strategy:o}=t,i=o==="fixed",s=lt(r),l=e?vr(e.floating):!1;if(r===s||l&&i)return n;let a={scrollLeft:0,scrollTop:0},c=Ue(1),d=Ue(0),u=qe(r);if((u||!u&&!i)&&((sn(r)!=="body"||Rn(s))&&(a=Mr(r)),qe(r))){let h=Tr(r);c=Dn(r),d.x=h.x+r.clientLeft,d.y=h.y+r.clientTop}let f=s&&!u&&!i?oh(s,a):Ue(0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-a.scrollLeft*c.x+d.x+f.x,y:n.y*c.y-a.scrollTop*c.y+d.y+f.y}}function Mw(t){return Array.from(t.getClientRects())}function Tw(t){let e=lt(t),n=Mr(t),r=t.ownerDocument.body,o=pe(e.scrollWidth,e.clientWidth,r.scrollWidth,r.clientWidth),i=pe(e.scrollHeight,e.clientHeight,r.scrollHeight,r.clientHeight),s=-n.scrollLeft+gi(t),l=-n.scrollTop;return _e(r).direction==="rtl"&&(s+=pe(e.clientWidth,r.clientWidth)-o),{width:o,height:i,x:s,y:l}}var Qf=25;function Aw(t,e){let n=Ae(t),r=lt(t),o=n.visualViewport,i=r.clientWidth,s=r.clientHeight,l=0,a=0;if(o){i=o.width,s=o.height;let d=pi();(!d||d&&e==="fixed")&&(l=o.offsetLeft,a=o.offsetTop)}let c=gi(r);if(c<=0){let d=r.ownerDocument,u=d.body,f=getComputedStyle(u),h=d.compatMode==="CSS1Compat"&&parseFloat(f.marginLeft)+parseFloat(f.marginRight)||0,p=Math.abs(r.clientWidth-u.clientWidth-h);p<=Qf&&(i-=p)}else c<=Qf&&(i+=c);return{width:i,height:s,x:l,y:a}}var Ew=new Set(["absolute","fixed"]);function Nw(t,e){let n=Tr(t,!0,e==="fixed"),r=n.top+t.clientTop,o=n.left+t.clientLeft,i=qe(t)?Dn(t):Ue(1),s=t.clientWidth*i.x,l=t.clientHeight*i.y,a=o*i.x,c=r*i.y;return{width:s,height:l,x:a,y:c}}function Zf(t,e,n){let r;if(e==="viewport")r=Aw(t,n);else if(e==="document")r=Tw(lt(t));else if(Ve(e))r=Nw(e,n);else{let o=rh(t);r={x:e.x-o.x,y:e.y-o.y,width:e.width,height:e.height}}return Ct(r)}function ih(t,e){let n=vt(t);return n===e||!Ve(n)||ln(n)?!1:_e(n).position==="fixed"||ih(n,e)}function Ow(t,e){let n=e.get(t);if(n)return n;let r=ui(t,[],!1).filter(l=>Ve(l)&&sn(l)!=="body"),o=null,i=_e(t).position==="fixed",s=i?vt(t):t;for(;Ve(s)&&!ln(s);){let l=_e(s),a=hi(s);!a&&l.position==="fixed"&&(o=null),(i?!a&&!o:!a&&l.position==="static"&&!!o&&Ew.has(o.position)||Rn(s)&&!a&&ih(t,s))?r=r.filter(d=>d!==s):o=l,s=vt(s)}return e.set(t,r),r}function Rw(t){let{element:e,boundary:n,rootBoundary:r,strategy:o}=t,s=[...n==="clippingAncestors"?vr(e)?[]:Ow(e,this._c):[].concat(n),r],l=s[0],a=s.reduce((c,d)=>{let u=Zf(e,d,o);return c.top=pe(u.top,c.top),c.right=$e(u.right,c.right),c.bottom=$e(u.bottom,c.bottom),c.left=pe(u.left,c.left),c},Zf(e,l,o));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}}function Dw(t){let{width:e,height:n}=th(t);return{width:e,height:n}}function Iw(t,e,n){let r=qe(e),o=lt(e),i=n==="fixed",s=Tr(t,!0,i,e),l={scrollLeft:0,scrollTop:0},a=Ue(0);function c(){a.x=gi(o)}if(r||!r&&!i)if((sn(e)!=="body"||Rn(o))&&(l=Mr(e)),r){let h=Tr(e,!0,i,e);a.x=h.x+e.clientLeft,a.y=h.y+e.clientTop}else o&&c();i&&!r&&o&&c();let d=o&&!r&&!i?oh(o,l):Ue(0),u=s.left+l.scrollLeft-a.x-d.x,f=s.top+l.scrollTop-a.y-d.y;return{x:u,y:f,width:s.width,height:s.height}}function ql(t){return _e(t).position==="static"}function eh(t,e){if(!qe(t)||_e(t).position==="fixed")return null;if(e)return e(t);let n=t.offsetParent;return lt(t)===n&&(n=n.ownerDocument.body),n}function sh(t,e){let n=Ae(t);if(vr(t))return n;if(!qe(t)){let o=vt(t);for(;o&&!ln(o);){if(Ve(o)&&!ql(o))return o;o=vt(o)}return n}let r=eh(t,e);for(;r&&Gf(r)&&ql(r);)r=eh(r,e);return r&&ln(r)&&ql(r)&&!hi(r)?n:r||Xf(t)||n}var Pw=async function(t){let e=this.getOffsetParent||sh,n=this.getDimensions,r=await n(t.floating);return{reference:Iw(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function Lw(t){return _e(t).direction==="rtl"}var Bw={convertOffsetParentRelativeRectToViewportRelativeRect:vw,getDocumentElement:lt,getClippingRect:Rw,getOffsetParent:sh,getElementRects:Pw,getClientRects:Mw,getDimensions:Dw,getScale:Dn,isElement:Ve,isRTL:Lw};var lh=jf,ah=$f,In=Uf,Pn=Ff,ch=Kf,dh=Vf,uh=Hf,fh=Wf;var Ln=(t,e,n)=>{let r=new Map,o={platform:Bw,...n},i={...o.platform,_c:r};return zf(t,e,{...o,platform:i})};var hh=(t,e)=>{Ln({getBoundingClientRect:()=>{let{from:r,to:o}=t.state.selection,i=t.view.coordsAtPos(r),s=t.view.coordsAtPos(o);return{top:Math.min(i.top,s.top),bottom:Math.max(i.bottom,s.bottom),left:Math.min(i.left,s.left),right:Math.max(i.right,s.right),width:Math.abs(s.right-i.left),height:Math.abs(s.bottom-i.top),x:Math.min(i.left,s.left),y:Math.min(i.top,s.top)}}},e,{placement:"bottom-start",strategy:"absolute",middleware:[In(),Pn()]}).then(({x:r,y:o,strategy:i})=>{e.style.width="max-content",e.style.position=i,e.style.left=`${r}px`,e.style.top=`${o}px`})},ph=({items:t=[],noOptionsMessage:e=null,noSearchResultsMessage:n=null,searchPrompt:r=null,searchingMessage:o=null,isSearchable:i=!1})=>{let s=null;return{items:async({query:l})=>{if(typeof t=="function"){s&&i&&s.setLoading(!0);try{let c=t({query:l}),d=Array.isArray(c)?c:await c;return s&&s.setLoading(!1),d}catch{return s&&s.setLoading(!1),[]}}if(!l)return t;let a=String(l).toLowerCase();return t.filter(c=>{let d=typeof c=="string"?c:c?.label??c?.name??"";return String(d).toLowerCase().includes(a)})},render:()=>{let l,a=0,c=null,d=!1;s={setLoading:b=>{d=b,f()}};let u=()=>{let b=document.createElement("div");return b.className="fi-dropdown-panel fi-dropdown-list fi-scrollable",b.style.maxHeight="15rem",b.style.minWidth="12rem",b},f=()=>{if(!l||!c)return;let b=Array.isArray(c.items)?c.items:[],C=c.query??"";if(l.innerHTML="",d){let x=o??"Searching...",S=document.createElement("div");S.className="fi-dropdown-header";let k=document.createElement("span");k.style.whiteSpace="normal",k.textContent=x,S.appendChild(k),l.appendChild(S);return}if(b.length)b.forEach((x,S)=>{let k=typeof x=="string"?x:x?.label??x?.name??String(x?.id??""),O=typeof x=="object"?x?.id??k:k,T=document.createElement("button");T.className=`fi-dropdown-list-item ${S===a?"fi-selected":""}`,T.type="button",T.addEventListener("click",()=>p(O,k));let A=document.createElement("span");A.className="fi-dropdown-list-item-label",A.textContent=k,T.appendChild(A),l.appendChild(T)});else{let x=h(C);if(x){let S=document.createElement("div");S.className="fi-dropdown-header";let k=document.createElement("span");k.style.whiteSpace="normal",k.textContent=x,S.appendChild(k),l.appendChild(S)}}},h=b=>b?n:i?r:e,p=(b,C)=>{c&&c.command({id:b,label:C})},m=()=>{if(!l||!c||(c.items||[]).length===0)return;let C=l.children[a];if(C){let x=C.getBoundingClientRect(),S=l.getBoundingClientRect();(x.topS.bottom)&&C.scrollIntoView({block:"nearest"})}},g=()=>{if(!c)return;let b=Array.isArray(c.items)?c.items:[];b.length!==0&&(a=(a+b.length-1)%b.length,f(),m())},y=()=>{if(!c)return;let b=c.items||[];b.length!==0&&(a=(a+1)%b.length,f(),m())},w=()=>{let b=c?.items||[];if(b.length===0)return;let C=b[a],x=typeof C=="string"?C:C?.label??C?.name??String(C?.id??""),S=typeof C=="object"?C?.id??x:x;p(S,x)};return{onStart:b=>{c=b,a=0,l=u(),l.style.position="absolute",l.style.zIndex="50",f(),document.body.appendChild(l),b.clientRect&&hh(b.editor,l)},onUpdate:b=>{c=b,a=0,f(),m(),b.clientRect&&hh(b.editor,l)},onKeyDown:b=>b.event.key==="Escape"?(l&&l.parentNode&&l.parentNode.removeChild(l),!0):b.event.key==="ArrowUp"?(g(),!0):b.event.key==="ArrowDown"?(y(),!0):b.event.key==="Enter"?(w(),!0):!1,onExit:()=>{l&&l.parentNode&&l.parentNode.removeChild(l),s=null}}}}};var zw=function({editor:t,overrideSuggestionOptions:e,extensionName:n}){let r=new H,o=e?.char??"@",i=e?.extraAttributes??{};return{editor:t,char:o,pluginKey:r,command:({editor:s,range:l,props:a})=>{s.view.state.selection.$to.nodeAfter?.text?.startsWith(" ")&&(l.to+=1);let u={...a,char:o,extra:i};s.chain().focus().insertContentAt(l,[{type:n,attrs:u},{type:"text",text:" "}]).run(),s.view.dom.ownerDocument.defaultView?.getSelection()?.collapseToEnd()},allow:({state:s,range:l})=>{let a=s.doc.resolve(l.from),c=s.schema.nodes[n];return!!a.parent.type.contentMatch.matchType(c)},...e}},mh=F.create({name:"mention",priority:101,addStorage(){return{suggestions:[],getSuggestionFromChar:()=>null}},addOptions(){return{HTMLAttributes:{},renderText({node:t}){return`${t.attrs.char??"@"}`},deleteTriggerWithBackspace:!0,renderHTML({options:t,node:e}){return["span",R(this.HTMLAttributes,t.HTMLAttributes),`${e.attrs.char??"@"}${e.attrs.label??""}`]},suggestions:[],suggestion:{},getMentionLabelsUsing:null}},group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}},label:{default:null,keepOnSplit:!1,parseHTML:t=>t.getAttribute("data-label"),renderHTML:t=>t.label?{"data-label":t.label}:{}},char:{default:"@",parseHTML:t=>t.getAttribute("data-char")??"@",renderHTML:t=>t.char?{"data-char":t.char}:{}},extra:{default:null,renderHTML:t=>{let e=t?.extra;return!e||typeof e!="object"?{}:e}}}},parseHTML(){return[{tag:`span[data-type="${this.name}"]`}]},renderHTML({node:t,HTMLAttributes:e}){let n=this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar(t?.attrs?.char??"@"),r={...this.options};r.HTMLAttributes=R({"data-type":this.name},this.options.HTMLAttributes,e);let o=this.options.renderHTML({options:r,node:t,suggestion:n});return typeof o=="string"?["span",R({"data-type":this.name},this.options.HTMLAttributes,e),o]:o},renderText({node:t}){let e={options:this.options,node:t,suggestion:this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar(t?.attrs?.char??"@")};return this.options.renderText(e)},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:o,anchor:i}=r;if(!o)return!1;let s=new ie,l=0;if(e.doc.nodesBetween(i-1,i,(a,c)=>{if(a.type.name===this.name)return n=!0,s=a,l=c,!1}),n){let a=s?.attrs?.char??"@";t.insertText(this.options.deleteTriggerWithBackspace?"":a,l,l+s.nodeSize)}return n})}},addProseMirrorPlugins(){let t=async e=>{let{state:n,dispatch:r}=e,o=[];if(n.doc.descendants((s,l)=>{if(s.type.name!==this.name||s.attrs?.label)return;let a=s.attrs?.id,c=s.attrs?.char??"@";a&&o.push({id:a,char:c,pos:l})}),o.length===0)return;let i=this.options.getMentionLabelsUsing;if(typeof i=="function")try{let s=o.map(({id:a,char:c})=>({id:a,char:c})),l=await i(s);o.forEach(({id:a,pos:c})=>{let d=l[a];if(!d)return;let u=e.state.doc.nodeAt(c);if(!u||u.type.name!==this.name)return;let f={...u.attrs,label:d},h=e.state.tr.setNodeMarkup(c,void 0,f);r(h)})}catch{}};return[...this.storage.suggestions.map(si),new P({view:e=>(setTimeout(()=>t(e),0),{update:n=>t(n)})})]},onBeforeCreate(){let t=n=>Array.isArray(n)?n:n&&typeof n=="object"?Object.entries(n).map(([r,o])=>({id:r,label:o})):[],e=this.options.suggestions.length?this.options.suggestions:[this.options.suggestion];this.storage.suggestions=e.map(n=>{let r=n?.char??"@",o=n?.items??[],i=n?.noOptionsMessage??null,s=n?.noSearchResultsMessage??null,l=n?.isSearchable??!1,a=this.options.getMentionSearchResultsUsing,c=n;if(typeof n?.items=="function"){let d=n.items;c={...n,items:async u=>{if(u?.query&&typeof a=="function")try{let f=await a(u?.query,r);return t(f)}catch{}return await d(u)}}}else{let d=n?.extraAttributes,u=n?.searchPrompt??null,f=n?.searchingMessage??null;c={...ph({items:async({query:h})=>{if(!(Array.isArray(o)?o.length>0:o&&typeof o=="object"&&Object.keys(o).length>0)&&!h)return[];let m=t(o);if(h&&typeof a=="function")try{let y=await a(h,r);return t(y)}catch{}if(!h)return m;let g=String(h).toLowerCase();return m.filter(y=>{let w=typeof y=="string"?y:y?.label??y?.name??"";return String(w).toLowerCase().includes(g)})},isSearchable:l,noOptionsMessage:i,noSearchResultsMessage:s,searchPrompt:u,searchingMessage:f}),char:r,...d?{extraAttributes:d}:{}}}return zw({editor:this.editor,overrideSuggestionOptions:c,extensionName:this.name})}),this.storage.getSuggestionFromChar=n=>this.storage.suggestions.find(r=>r.char===n)??this.storage.suggestions[0]??null}});var Hw=F.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:t}){return["p",R(this.options.HTMLAttributes,t),0]},parseMarkdown:(t,e)=>{let n=t.tokens||[];return n.length===1&&n[0].type==="image"?e.parseChildren([n[0]]):e.createNode("paragraph",void 0,e.parseInline(n))},renderMarkdown:(t,e)=>!t||!Array.isArray(t.content)?"":e.renderChildren(t.content),addCommands(){return{setParagraph:()=>({commands:t})=>t.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}}),gh=Hw;var Jl=fl;var yh=ee.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML({HTMLAttributes:t}){return["small",t,0]},addCommands(){return{setSmall:()=>({commands:t})=>t.setMark(this.name),toggleSmall:()=>({commands:t})=>t.toggleMark(this.name),unsetSmall:()=>({commands:t})=>t.unsetMark(this.name)}}});var bh=ee.create({name:"textColor",addOptions(){return{textColors:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.classList?.contains("color")}]},renderHTML({HTMLAttributes:t}){let e={...t},n=t.class;e.class=["color",n].filter(Boolean).join(" ");let r=t["data-color"],i=(this.options.textColors||{})[r],s=typeof r=="string"&&r.length>0,l=i?`--color: ${i.color}; --dark-color: ${i.darkColor}`:s?`--color: ${r}; --dark-color: ${r}`:null;if(l){let a=typeof t.style=="string"?t.style:"";e.style=a?`${l}; ${a}`:l}return["span",e,0]},addAttributes(){return{"data-color":{default:null,parseHTML:t=>t.getAttribute("data-color"),renderHTML:t=>t["data-color"]?{"data-color":t["data-color"]}:{}}}},addCommands(){return{setTextColor:({color:t})=>({commands:e})=>e.setMark(this.name,{"data-color":t}),unsetTextColor:()=>({commands:t})=>t.unsetMark(this.name)}}});var $w=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,Fw=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,Vw=ee.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["s",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"del",parseMarkdown:(t,e)=>e.applyMark("strike",e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>`~~${e.renderChildren(t)}~~`,addCommands(){return{setStrike:()=>({commands:t})=>t.setMark(this.name),toggleStrike:()=>({commands:t})=>t.toggleMark(this.name),unsetStrike:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Be({find:$w,type:this.type})]},addPasteRules(){return[Me({find:Fw,type:this.type})]}}),wh=Vw;var _w=ee.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(t){return t!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sub",R(this.options.HTMLAttributes,t),0]},addCommands(){return{setSubscript:()=>({commands:t})=>t.setMark(this.name),toggleSubscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSubscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}}),xh=_w;var Ww=ee.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(t){return t!=="super"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sup",R(this.options.HTMLAttributes,t),0]},addCommands(){return{setSuperscript:()=>({commands:t})=>t.setMark(this.name),toggleSuperscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSuperscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}}),kh=Ww;var Xl,Yl;if(typeof WeakMap<"u"){let t=new WeakMap;Xl=e=>t.get(e),Yl=(e,n)=>(t.set(e,n),n)}else{let t=[],n=0;Xl=r=>{for(let o=0;o(n==10&&(n=0),t[n++]=r,t[n++]=o)}var oe=class{constructor(t,e,n,r){this.width=t,this.height=e,this.map=n,this.problems=r}findCell(t){for(let e=0;e=n){(i||(i=[])).push({type:"overlong_rowspan",pos:d,n:y-b});break}let C=o+b*e;for(let x=0;xr&&(i+=c.attrs.colspan)}}for(let s=0;s1&&(n=!0)}e==-1?e=i:e!=i&&(e=Math.max(e,i))}return e}function Kw(t,e,n){t.problems||(t.problems=[]);let r={};for(let o=0;o0;e--)if(t.node(e).type.spec.tableRole=="row")return t.node(0).resolve(t.before(e+1));return null}function Jw(t){for(let e=t.depth;e>0;e--){let n=t.node(e).type.spec.tableRole;if(n==="cell"||n==="header_cell")return t.node(e)}return null}function Je(t){let e=t.selection.$head;for(let n=e.depth;n>0;n--)if(e.node(n).type.spec.tableRole=="row")return!0;return!1}function Si(t){let e=t.selection;if("$anchorCell"in e&&e.$anchorCell)return e.$anchorCell.pos>e.$headCell.pos?e.$anchorCell:e.$headCell;if("node"in e&&e.node&&e.node.type.spec.tableRole=="cell")return e.$anchor;let n=an(e.$head)||Gw(e.$head);if(n)return n;throw new RangeError(`No cell found around position ${e.head}`)}function Gw(t){for(let e=t.nodeAfter,n=t.pos;e;e=e.firstChild,n++){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n)}for(let e=t.nodeBefore,n=t.pos;e;e=e.lastChild,n--){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n-e.nodeSize)}}function Ql(t){return t.parent.type.spec.tableRole=="row"&&!!t.nodeAfter}function Xw(t){return t.node(0).resolve(t.pos+t.nodeAfter.nodeSize)}function ta(t,e){return t.depth==e.depth&&t.pos>=e.start(-1)&&t.pos<=e.end(-1)}function Rh(t,e,n){let r=t.node(-1),o=oe.get(r),i=t.start(-1),s=o.nextCell(t.pos-i,e,n);return s==null?null:t.node(0).resolve(i+s)}function cn(t,e,n=1){let r={...t,colspan:t.colspan-n};return r.colwidth&&(r.colwidth=r.colwidth.slice(),r.colwidth.splice(e,n),r.colwidth.some(o=>o>0)||(r.colwidth=null)),r}function Dh(t,e,n=1){let r={...t,colspan:t.colspan+n};if(r.colwidth){r.colwidth=r.colwidth.slice();for(let o=0;od!=n.pos-i);a.unshift(n.pos-i);let c=a.map(d=>{let u=r.nodeAt(d);if(!u)throw new RangeError(`No cell with offset ${d} found`);let f=i+d+1;return new yn(l.resolve(f),l.resolve(f+u.content.size))});super(c[0].$from,c[0].$to,c),this.$anchorCell=e,this.$headCell=n}map(e,n){let r=e.resolve(n.map(this.$anchorCell.pos)),o=e.resolve(n.map(this.$headCell.pos));if(Ql(r)&&Ql(o)&&ta(r,o)){let i=this.$anchorCell.node(-1)!=r.node(-1);return i&&this.isRowSelection()?Mt.rowSelection(r,o):i&&this.isColSelection()?Mt.colSelection(r,o):new Mt(r,o)}return D.between(r,o)}content(){let e=this.$anchorCell.node(-1),n=oe.get(e),r=this.$anchorCell.start(-1),o=n.rectBetween(this.$anchorCell.pos-r,this.$headCell.pos-r),i={},s=[];for(let a=o.top;a0||g>0){let y=p.attrs;if(m>0&&(y=cn(y,0,m)),g>0&&(y=cn(y,y.colspan-g,g)),h.lefto.bottom){let y={...p.attrs,rowspan:Math.min(h.bottom,o.bottom)-Math.max(h.top,o.top)};h.top0)return!1;let r=e+this.$anchorCell.nodeAfter.attrs.rowspan,o=n+this.$headCell.nodeAfter.attrs.rowspan;return Math.max(r,o)==this.$headCell.node(-1).childCount}static colSelection(e,n=e){let r=e.node(-1),o=oe.get(r),i=e.start(-1),s=o.findCell(e.pos-i),l=o.findCell(n.pos-i),a=e.node(0);return s.top<=l.top?(s.top>0&&(e=a.resolve(i+o.map[s.left])),l.bottom0&&(n=a.resolve(i+o.map[l.left])),s.bottom0)return!1;let s=o+this.$anchorCell.nodeAfter.attrs.colspan,l=i+this.$headCell.nodeAfter.attrs.colspan;return Math.max(s,l)==n.width}eq(e){return e instanceof Mt&&e.$anchorCell.pos==this.$anchorCell.pos&&e.$headCell.pos==this.$headCell.pos}static rowSelection(e,n=e){let r=e.node(-1),o=oe.get(r),i=e.start(-1),s=o.findCell(e.pos-i),l=o.findCell(n.pos-i),a=e.node(0);return s.left<=l.left?(s.left>0&&(e=a.resolve(i+o.map[s.top*o.width])),l.right0&&(n=a.resolve(i+o.map[l.top*o.width])),s.right{e.push(te.node(r,r+n.nodeSize,{class:"selectedCell"}))}),Y.create(t.doc,e)}function ex({$from:t,$to:e}){if(t.pos==e.pos||t.pos=0&&!(t.after(o+1)=0&&!(e.before(i+1)>e.start(i));i--,r--);return n==r&&/row|table/.test(t.node(o).type.spec.tableRole)}function tx({$from:t,$to:e}){let n,r;for(let o=t.depth;o>0;o--){let i=t.node(o);if(i.type.spec.tableRole==="cell"||i.type.spec.tableRole==="header_cell"){n=i;break}}for(let o=e.depth;o>0;o--){let i=e.node(o);if(i.type.spec.tableRole==="cell"||i.type.spec.tableRole==="header_cell"){r=i;break}}return n!==r&&e.parentOffset===0}function nx(t,e,n){let r=(e||t).selection,o=(e||t).doc,i,s;if(r instanceof L&&(s=r.node.type.spec.tableRole)){if(s=="cell"||s=="header_cell")i=X.create(o,r.from);else if(s=="row"){let l=o.resolve(r.from+1);i=X.rowSelection(l,l)}else if(!n){let l=oe.get(r.node),a=r.from+1,c=a+l.map[l.width*l.height-1];i=X.create(o,a+1,c)}}else r instanceof D&&ex(r)?i=D.create(o,r.from):r instanceof D&&tx(r)&&(i=D.create(o,r.$from.start(),r.$from.end()));return i&&(e||(e=t.tr)).setSelection(i),e}var rx=new H("fix-tables");function Ph(t,e,n,r){let o=t.childCount,i=e.childCount;e:for(let s=0,l=0;s{o.type.spec.tableRole=="table"&&(n=ox(t,o,i,n))};return e?e.doc!=t.doc&&Ph(e.doc,t.doc,0,r):t.doc.descendants(r),n}function ox(t,e,n,r){let o=oe.get(e);if(!o.problems)return r;r||(r=t.tr);let i=[];for(let a=0;a0){let h="cell";d.firstChild&&(h=d.firstChild.type.spec.tableRole);let p=[];for(let g=0;g0?-1:0;Yw(e,r,o+i)&&(i=o==0||o==e.width?null:0);for(let s=0;s0&&o0&&e.map[l-1]==a||o0?-1:0;sx(e,r,o+l)&&(l=o==0||o==e.height?null:0);for(let c=0,d=e.width*o;c0&&o0&&u==e.map[d-e.width]){let f=n.nodeAt(u).attrs;t.setNodeMarkup(t.mapping.slice(l).map(u+r),null,{...f,rowspan:f.rowspan-1}),c+=f.colspan-1}else if(o0&&n[i]==n[i-1]||r.right0&&n[o]==n[o-t]||r.bottom0){let d=a+1+c.content.size,u=Sh(c)?a+1:d;i.replaceWith(u+r.tableStart,d+r.tableStart,l)}i.setSelection(new X(i.doc.resolve(a+r.tableStart))),e(i)}return!0}function oa(t,e){let n=xe(t.schema);return cx(({node:r})=>n[r.type.spec.tableRole])(t,e)}function cx(t){return(e,n)=>{let r=e.selection,o,i;if(r instanceof X){if(r.$anchorCell.pos!=r.$headCell.pos)return!1;o=r.$anchorCell.nodeAfter,i=r.$anchorCell.pos}else{var s;if(o=Jw(r.$from),!o)return!1;i=(s=an(r.$from))===null||s===void 0?void 0:s.pos}if(o==null||i==null||o.attrs.colspan==1&&o.attrs.rowspan==1)return!1;if(n){let l=o.attrs,a=[],c=l.colwidth;l.rowspan>1&&(l={...l,rowspan:1}),l.colspan>1&&(l={...l,colspan:1});let d=at(e),u=e.tr;for(let h=0;h{s.attrs[t]!==e&&i.setNodeMarkup(l,null,{...s.attrs,[t]:e})}):i.setNodeMarkup(o.pos,null,{...o.nodeAfter.attrs,[t]:e}),r(i)}return!0}}function dx(t){return function(e,n){if(!Je(e))return!1;if(n){let r=xe(e.schema),o=at(e),i=e.tr,s=o.map.cellsInRect(t=="column"?{left:o.left,top:0,right:o.right,bottom:o.map.height}:t=="row"?{left:0,top:o.top,right:o.map.width,bottom:o.bottom}:o),l=s.map(a=>o.table.nodeAt(a));for(let a=0;a{let h=f+i.tableStart,p=s.doc.nodeAt(h);p&&s.setNodeMarkup(h,u,p.attrs)}),r(s)}return!0}}var cM=Bn("row",{useDeprecatedLogic:!0}),dM=Bn("column",{useDeprecatedLogic:!0}),jh=Bn("cell",{useDeprecatedLogic:!0});function ux(t,e){if(e<0){let n=t.nodeBefore;if(n)return t.pos-n.nodeSize;for(let r=t.index(-1)-1,o=t.before();r>=0;r--){let i=t.node(-1).child(r),s=i.lastChild;if(s)return o-1-s.nodeSize;o-=i.nodeSize}}else{if(t.index()0;r--)if(n.node(r).type.spec.tableRole=="table")return e&&e(t.tr.delete(n.before(r),n.after(r)).scrollIntoView()),!0;return!1}function yi(t,e){let n=t.selection;if(!(n instanceof X))return!1;if(e){let r=t.tr,o=xe(t.schema).cell.createAndFill().content;n.forEachCell((i,s)=>{i.content.eq(o)||r.replace(r.mapping.map(s+1),r.mapping.map(s+i.nodeSize-1),new E(o,0,0))}),r.docChanged&&e(r)}return!0}function fx(t){if(t.size===0)return null;let{content:e,openStart:n,openEnd:r}=t;for(;e.childCount==1&&(n>0&&r>0||e.child(0).type.spec.tableRole=="table");)n--,r--,e=e.child(0).content;let o=e.child(0),i=o.type.spec.tableRole,s=o.type.schema,l=[];if(i=="row")for(let a=0;a=0;s--){let{rowspan:l,colspan:a}=i.child(s).attrs;for(let c=o;c=e.length&&e.push(v.empty),n[o]r&&(f=f.type.createChecked(cn(f.attrs,f.attrs.colspan,d+f.attrs.colspan-r),f.content)),c.push(f),d+=f.attrs.colspan;for(let h=1;ho&&(u=u.type.create({...u.attrs,rowspan:Math.max(1,o-u.attrs.rowspan)},u.content)),a.push(u)}i.push(v.from(a))}n=i,e=o}return{width:t,height:e,rows:n}}function mx(t,e,n,r,o,i,s){let l=t.doc.type.schema,a=xe(l),c,d;if(o>e.width)for(let u=0,f=0;ue.height){let u=[];for(let p=0,m=(e.height-1)*e.width;p=e.width?!1:n.nodeAt(e.map[m+p]).type==a.header_cell;u.push(g?d||(d=a.header_cell.createAndFill()):c||(c=a.cell.createAndFill()))}let f=a.row.create(null,v.from(u)),h=[];for(let p=e.height;p{if(!o)return!1;let i=n.selection;if(i instanceof X)return xi(n,r,I.near(i.$headCell,e));if(t!="horiz"&&!i.empty)return!1;let s=Kh(o,t,e);if(s==null)return!1;if(t=="horiz")return xi(n,r,I.near(n.doc.resolve(i.head+e),e));{let l=n.doc.resolve(s),a=Rh(l,t,e),c;return a?c=I.near(a,1):e<0?c=I.near(n.doc.resolve(l.before(-1)),-1):c=I.near(n.doc.resolve(l.after(-1)),1),xi(n,r,c)}}}function wi(t,e){return(n,r,o)=>{if(!o)return!1;let i=n.selection,s;if(i instanceof X)s=i;else{let a=Kh(o,t,e);if(a==null)return!1;s=new X(n.doc.resolve(a))}let l=Rh(s.$headCell,t,e);return l?xi(n,r,new X(s.$anchorCell,l)):!1}}function yx(t,e){let n=t.state.doc,r=an(n.resolve(e));return r?(t.dispatch(t.state.tr.setSelection(new X(r))),!0):!1}function bx(t,e,n){if(!Je(t.state))return!1;let r=fx(n),o=t.state.selection;if(o instanceof X){r||(r={width:1,height:1,rows:[v.from(Zl(xe(t.state.schema).cell,n))]});let i=o.$anchorCell.node(-1),s=o.$anchorCell.start(-1),l=oe.get(i).rectBetween(o.$anchorCell.pos-s,o.$headCell.pos-s);return r=px(r,l.right-l.left,l.bottom-l.top),Th(t.state,t.dispatch,s,l,r),!0}else if(r){let i=Si(t.state),s=i.start(-1);return Th(t.state,t.dispatch,s,oe.get(i.node(-1)).findCell(i.pos-s),r),!0}else return!1}function wx(t,e){var n;if(e.button!=0||e.ctrlKey||e.metaKey)return;let r=Ah(t,e.target),o;if(e.shiftKey&&t.state.selection instanceof X)i(t.state.selection.$anchorCell,e),e.preventDefault();else if(e.shiftKey&&r&&(o=an(t.state.selection.$anchor))!=null&&((n=Gl(t,e))===null||n===void 0?void 0:n.pos)!=o.pos)i(o,e),e.preventDefault();else if(!r)return;function i(a,c){let d=Gl(t,c),u=zt.getState(t.state)==null;if(!d||!ta(a,d))if(u)d=a;else return;let f=new X(a,d);if(u||!t.state.selection.eq(f)){let h=t.state.tr.setSelection(f);u&&h.setMeta(zt,a.pos),t.dispatch(h)}}function s(){t.root.removeEventListener("mouseup",s),t.root.removeEventListener("dragstart",s),t.root.removeEventListener("mousemove",l),zt.getState(t.state)!=null&&t.dispatch(t.state.tr.setMeta(zt,-1))}function l(a){let c=a,d=zt.getState(t.state),u;if(d!=null)u=t.state.doc.resolve(d);else if(Ah(t,c.target)!=r&&(u=Gl(t,e),!u))return s();u&&i(u,c)}t.root.addEventListener("mouseup",s),t.root.addEventListener("dragstart",s),t.root.addEventListener("mousemove",l)}function Kh(t,e,n){if(!(t.state.selection instanceof D))return null;let{$head:r}=t.state.selection;for(let o=r.depth-1;o>=0;o--){let i=r.node(o);if((n<0?r.index(o):r.indexAfter(o))!=(n<0?0:i.childCount))return null;if(i.type.spec.tableRole=="cell"||i.type.spec.tableRole=="header_cell"){let s=r.before(o),l=e=="vert"?n>0?"down":"up":n>0?"right":"left";return t.endOfTextblock(l)?s:null}}return null}function Ah(t,e){for(;e&&e!=t.dom;e=e.parentNode)if(e.nodeName=="TD"||e.nodeName=="TH")return e;return null}function Gl(t,e){let n=t.posAtCoords({left:e.clientX,top:e.clientY});if(!n)return null;let{inside:r,pos:o}=n;return r>=0&&an(t.state.doc.resolve(r))||an(t.state.doc.resolve(o))}var xx=class{constructor(t,e){this.node=t,this.defaultCellMinWidth=e,this.dom=document.createElement("div"),this.dom.className="tableWrapper",this.table=this.dom.appendChild(document.createElement("table")),this.table.style.setProperty("--default-cell-min-width",`${e}px`),this.colgroup=this.table.appendChild(document.createElement("colgroup")),ea(t,this.colgroup,this.table,e),this.contentDOM=this.table.appendChild(document.createElement("tbody"))}update(t){return t.type!=this.node.type?!1:(this.node=t,ea(t,this.colgroup,this.table,this.defaultCellMinWidth),!0)}ignoreMutation(t){return t.type=="attributes"&&(t.target==this.table||this.colgroup.contains(t.target))}};function ea(t,e,n,r,o,i){let s=0,l=!0,a=e.firstChild,c=t.firstChild;if(c){for(let u=0,f=0;unew r(u,n,f)),new kx(-1,!1)},apply(s,l){return l.apply(s)}},props:{attributes:s=>{let l=Oe.getState(s);return l&&l.activeHandle>-1?{class:"resize-cursor"}:{}},handleDOMEvents:{mousemove:(s,l)=>{Sx(s,l,t,o)},mouseleave:s=>{Cx(s)},mousedown:(s,l)=>{vx(s,l,e,n)}},decorations:s=>{let l=Oe.getState(s);if(l&&l.activeHandle>-1)return Nx(s,l.activeHandle)},nodeViews:{}}});return i}var kx=class ki{constructor(e,n){this.activeHandle=e,this.dragging=n}apply(e){let n=this,r=e.getMeta(Oe);if(r&&r.setHandle!=null)return new ki(r.setHandle,!1);if(r&&r.setDragging!==void 0)return new ki(n.activeHandle,r.setDragging);if(n.activeHandle>-1&&e.docChanged){let o=e.mapping.map(n.activeHandle,-1);return Ql(e.doc.resolve(o))||(o=-1),new ki(o,n.dragging)}return n}};function Sx(t,e,n,r){if(!t.editable)return;let o=Oe.getState(t.state);if(o&&!o.dragging){let i=Tx(e.target),s=-1;if(i){let{left:l,right:a}=i.getBoundingClientRect();e.clientX-l<=n?s=Eh(t,e,"left",n):a-e.clientX<=n&&(s=Eh(t,e,"right",n))}if(s!=o.activeHandle){if(!r&&s!==-1){let l=t.state.doc.resolve(s),a=l.node(-1),c=oe.get(a),d=l.start(-1);if(c.colCount(l.pos-d)+l.nodeAfter.attrs.colspan-1==c.width-1)return}Jh(t,s)}}}function Cx(t){if(!t.editable)return;let e=Oe.getState(t.state);e&&e.activeHandle>-1&&!e.dragging&&Jh(t,-1)}function vx(t,e,n,r){var o;if(!t.editable)return!1;let i=(o=t.dom.ownerDocument.defaultView)!==null&&o!==void 0?o:window,s=Oe.getState(t.state);if(!s||s.activeHandle==-1||s.dragging)return!1;let l=t.state.doc.nodeAt(s.activeHandle),a=Mx(t,s.activeHandle,l.attrs);t.dispatch(t.state.tr.setMeta(Oe,{setDragging:{startX:e.clientX,startWidth:a}}));function c(u){i.removeEventListener("mouseup",c),i.removeEventListener("mousemove",d);let f=Oe.getState(t.state);f?.dragging&&(Ax(t,f.activeHandle,Nh(f.dragging,u,n)),t.dispatch(t.state.tr.setMeta(Oe,{setDragging:null})))}function d(u){if(!u.which)return c(u);let f=Oe.getState(t.state);if(f&&f.dragging){let h=Nh(f.dragging,u,n);Oh(t,f.activeHandle,h,r)}}return Oh(t,s.activeHandle,a,r),i.addEventListener("mouseup",c),i.addEventListener("mousemove",d),e.preventDefault(),!0}function Mx(t,e,{colspan:n,colwidth:r}){let o=r&&r[r.length-1];if(o)return o;let i=t.domAtPos(e),s=i.node.childNodes[i.offset].offsetWidth,l=n;if(r)for(let a=0;a{var e,n;let r=t.getAttribute("colwidth"),o=r?r.split(",").map(i=>parseInt(i,10)):null;if(!o){let i=(e=t.closest("table"))==null?void 0:e.querySelectorAll("colgroup > col"),s=Array.from(((n=t.parentElement)==null?void 0:n.children)||[]).indexOf(t);if(s&&s>-1&&i&&i[s]){let l=i[s].getAttribute("width");return l?[parseInt(l,10)]:null}}return o}}}},tableRole:"cell",isolating:!0,parseHTML(){return[{tag:"td"}]},renderHTML({HTMLAttributes:t}){return["td",R(this.options.HTMLAttributes,t),0]}}),Rx=F.create({name:"tableHeader",addOptions(){return{HTMLAttributes:{}}},content:"block+",addAttributes(){return{colspan:{default:1},rowspan:{default:1},colwidth:{default:null,parseHTML:t=>{let e=t.getAttribute("colwidth");return e?e.split(",").map(r=>parseInt(r,10)):null}}}},tableRole:"header_cell",isolating:!0,parseHTML(){return[{tag:"th"}]},renderHTML({HTMLAttributes:t}){return["th",R(this.options.HTMLAttributes,t),0]}}),Dx=F.create({name:"tableRow",addOptions(){return{HTMLAttributes:{}}},content:"(tableCell | tableHeader)*",tableRole:"row",parseHTML(){return[{tag:"tr"}]},renderHTML({HTMLAttributes:t}){return["tr",R(this.options.HTMLAttributes,t),0]}});function sa(t,e){return e?["width",`${Math.max(e,t)}px`]:["min-width",`${t}px`]}function Xh(t,e,n,r,o,i){var s;let l=0,a=!0,c=e.firstChild,d=t.firstChild;if(d!==null)for(let f=0,h=0;f{let r=t.nodes[n];r.spec.tableRole&&(e[r.spec.tableRole]=r)}),t.cached.tableNodeTypes=e,e}function Bx(t,e,n,r,o){let i=Lx(t),s=[],l=[];for(let c=0;c{let{selection:e}=t.state;if(!zx(e))return!1;let n=0,r=Gs(e.ranges[0].$from,i=>i.type.name==="table");return r?.node.descendants(i=>{if(i.type.name==="table")return!1;["tableCell","tableHeader"].includes(i.type.name)&&(n+=1)}),n===e.ranges.length?(t.commands.deleteTable(),!0):!1},Hx="";function $x(t){return(t||"").replace(/\s+/g," ").trim()}function Fx(t,e,n={}){var r;let o=(r=n.cellLineSeparator)!=null?r:Hx;if(!t||!t.content||t.content.length===0)return"";let i=[];t.content.forEach(p=>{let m=[];p.content&&p.content.forEach(g=>{let y="";g.content&&Array.isArray(g.content)&&g.content.length>1?y=g.content.map(x=>e.renderChildren(x)).join(o):y=g.content?e.renderChildren(g.content):"";let w=$x(y),b=g.type==="tableHeader";m.push({text:w,isHeader:b})}),i.push(m)});let s=i.reduce((p,m)=>Math.max(p,m.length),0);if(s===0)return"";let l=new Array(s).fill(0);i.forEach(p=>{var m;for(let g=0;gl[g]&&(l[g]=w),l[g]<3&&(l[g]=3)}});let a=(p,m)=>p+" ".repeat(Math.max(0,m-p.length)),c=i[0],d=c.some(p=>p.isHeader),u=` +`,f=new Array(s).fill(0).map((p,m)=>d&&c[m]&&c[m].text||"");return u+=`| ${f.map((p,m)=>a(p,l[m])).join(" | ")} | +`,u+=`| ${l.map(p=>"-".repeat(Math.max(3,p))).join(" | ")} | +`,(d?i.slice(1):i).forEach(p=>{u+=`| ${new Array(s).fill(0).map((m,g)=>a(p[g]&&p[g].text||"",l[g])).join(" | ")} | +`}),u}var Vx=Fx,_x=F.create({name:"table",addOptions(){return{HTMLAttributes:{},resizable:!1,renderWrapper:!1,handleWidth:5,cellMinWidth:25,View:Ix,lastColumnResizable:!0,allowTableNodeSelection:!1}},content:"tableRow+",tableRole:"table",isolating:!0,group:"block",parseHTML(){return[{tag:"table"}]},renderHTML({node:t,HTMLAttributes:e}){let{colgroup:n,tableWidth:r,tableMinWidth:o}=Px(t,this.options.cellMinWidth),i=e.style;function s(){return i||(r?`width: ${r}`:`min-width: ${o}`)}let l=["table",R(this.options.HTMLAttributes,e,{style:s()}),n,["tbody",0]];return this.options.renderWrapper?["div",{class:"tableWrapper"},l]:l},parseMarkdown:(t,e)=>{let n=[];if(t.header){let r=[];t.header.forEach(o=>{r.push(e.createNode("tableHeader",{},[{type:"paragraph",content:e.parseInline(o.tokens)}]))}),n.push(e.createNode("tableRow",{},r))}return t.rows&&t.rows.forEach(r=>{let o=[];r.forEach(i=>{o.push(e.createNode("tableCell",{},[{type:"paragraph",content:e.parseInline(i.tokens)}]))}),n.push(e.createNode("tableRow",{},o))}),e.createNode("table",void 0,n)},renderMarkdown:(t,e)=>Vx(t,e),addCommands(){return{insertTable:({rows:t=3,cols:e=3,withHeaderRow:n=!0}={})=>({tr:r,dispatch:o,editor:i})=>{let s=Bx(i.schema,t,e,n);if(o){let l=r.selection.from+1;r.replaceSelectionWith(s).scrollIntoView().setSelection(D.near(r.doc.resolve(l)))}return!0},addColumnBefore:()=>({state:t,dispatch:e})=>Bh(t,e),addColumnAfter:()=>({state:t,dispatch:e})=>zh(t,e),deleteColumn:()=>({state:t,dispatch:e})=>Hh(t,e),addRowBefore:()=>({state:t,dispatch:e})=>Fh(t,e),addRowAfter:()=>({state:t,dispatch:e})=>Vh(t,e),deleteRow:()=>({state:t,dispatch:e})=>_h(t,e),deleteTable:()=>({state:t,dispatch:e})=>Uh(t,e),mergeCells:()=>({state:t,dispatch:e})=>ra(t,e),splitCell:()=>({state:t,dispatch:e})=>oa(t,e),toggleHeaderColumn:()=>({state:t,dispatch:e})=>Bn("column")(t,e),toggleHeaderRow:()=>({state:t,dispatch:e})=>Bn("row")(t,e),toggleHeaderCell:()=>({state:t,dispatch:e})=>jh(t,e),mergeOrSplit:()=>({state:t,dispatch:e})=>ra(t,e)?!0:oa(t,e),setCellAttribute:(t,e)=>({state:n,dispatch:r})=>Wh(t,e)(n,r),goToNextCell:()=>({state:t,dispatch:e})=>ia(1)(t,e),goToPreviousCell:()=>({state:t,dispatch:e})=>ia(-1)(t,e),fixTables:()=>({state:t,dispatch:e})=>(e&&na(t),!0),setCellSelection:t=>({tr:e,dispatch:n})=>{if(n){let r=X.create(e.doc,t.anchorCell,t.headCell);e.setSelection(r)}return!0}}},addKeyboardShortcuts(){return{Tab:()=>this.editor.commands.goToNextCell()?!0:this.editor.can().addRowAfter()?this.editor.chain().addRowAfter().goToNextCell().run():!1,"Shift-Tab":()=>this.editor.commands.goToPreviousCell(),Backspace:Ci,"Mod-Backspace":Ci,Delete:Ci,"Mod-Delete":Ci}},addProseMirrorPlugins(){return[...this.options.resizable&&this.editor.isEditable?[qh({handleWidth:this.options.handleWidth,cellMinWidth:this.options.cellMinWidth,defaultCellMinWidth:this.options.cellMinWidth,View:this.options.View,lastColumnResizable:this.options.lastColumnResizable})]:[],Gh({allowTableNodeSelection:this.options.allowTableNodeSelection})]},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{tableRole:G(B(t,"tableRole",e))}}}),Qh=U.create({name:"tableKit",addExtensions(){let t=[];return this.options.table!==!1&&t.push(_x.configure(this.options.table)),this.options.tableCell!==!1&&t.push(Ox.configure(this.options.tableCell)),this.options.tableHeader!==!1&&t.push(Rx.configure(this.options.tableHeader)),this.options.tableRow!==!1&&t.push(Dx.configure(this.options.tableRow)),t}});var Wx=F.create({name:"text",group:"inline",parseMarkdown:t=>({type:"text",text:t.text||""}),renderMarkdown:t=>t.text||""}),Zh=Wx;var jx=U.create({name:"textAlign",addOptions(){return{types:[],alignments:["left","center","right","justify"],defaultAlignment:null}},addGlobalAttributes(){return[{types:this.options.types,attributes:{textAlign:{default:this.options.defaultAlignment,parseHTML:t=>{let e=t.style.textAlign;return this.options.alignments.includes(e)?e:this.options.defaultAlignment},renderHTML:t=>t.textAlign?{style:`text-align: ${t.textAlign}`}:{}}}}]},addCommands(){return{setTextAlign:t=>({commands:e})=>this.options.alignments.includes(t)?this.options.types.map(n=>e.updateAttributes(n,{textAlign:t})).some(n=>n):!1,unsetTextAlign:()=>({commands:t})=>this.options.types.map(e=>t.resetAttributes(e,"textAlign")).some(e=>e),toggleTextAlign:t=>({editor:e,commands:n})=>this.options.alignments.includes(t)?e.isActive({textAlign:t})?n.unsetTextAlign():n.setTextAlign(t):!1}},addKeyboardShortcuts(){return{"Mod-Shift-l":()=>this.editor.commands.setTextAlign("left"),"Mod-Shift-e":()=>this.editor.commands.setTextAlign("center"),"Mod-Shift-r":()=>this.editor.commands.setTextAlign("right"),"Mod-Shift-j":()=>this.editor.commands.setTextAlign("justify")}}}),ep=jx;var Ux=ee.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["u",R(this.options.HTMLAttributes,t),0]},parseMarkdown(t,e){return e.applyMark(this.name||"underline",e.parseInline(t.tokens||[]))},renderMarkdown(t,e){return`++${e.renderChildren(t)}++`},markdownTokenizer:{name:"underline",level:"inline",start(t){return t.indexOf("++")},tokenize(t,e,n){let o=/^(\+\+)([\s\S]+?)(\+\+)/.exec(t);if(!o)return;let i=o[2].trim();return{type:"underline",raw:o[0],text:i,tokens:n.inlineTokens(i)}}},addCommands(){return{setUnderline:()=>({commands:t})=>t.setMark(this.name),toggleUnderline:()=>({commands:t})=>t.toggleMark(this.name),unsetUnderline:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}}),tp=Ux;var np=(t,e)=>{Ln({getBoundingClientRect:()=>{let{from:r,to:o}=t.state.selection,i=t.view.coordsAtPos(r),s=t.view.coordsAtPos(o);return{top:Math.min(i.top,s.top),bottom:Math.max(i.bottom,s.bottom),left:Math.min(i.left,s.left),right:Math.max(i.right,s.right),width:Math.abs(s.right-i.left),height:Math.abs(s.bottom-i.top),x:Math.min(i.left,s.left),y:Math.min(i.top,s.top)}}},e,{placement:"bottom-start",strategy:"absolute",middleware:[In(),Pn()]}).then(({x:r,y:o,strategy:i})=>{e.style.width="max-content",e.style.position=i,e.style.left=`${r}px`,e.style.top=`${o}px`})},rp=({mergeTags:t,noMergeTagSearchResultsMessage:e})=>({items:({query:n})=>Object.entries(t).filter(([r,o])=>r.toLowerCase().replace(/\s/g,"").includes(n.toLowerCase())||o.toLowerCase().replace(/\s/g,"").includes(n.toLowerCase())).map(([r,o])=>({id:r,label:o})),render:()=>{let n,r=0,o=null,i=()=>{let f=document.createElement("div");return f.className="fi-dropdown-panel fi-dropdown-list",f.style.minWidth="12rem",f},s=()=>{if(!n||!o)return;let f=o.items||[];if(n.innerHTML="",f.length)f.forEach((h,p)=>{let m=document.createElement("button");m.className=`fi-dropdown-list-item fi-dropdown-list-item-label ${p===r?"fi-selected":""}`,m.textContent=h.label,m.type="button",m.addEventListener("click",()=>l(p)),n.appendChild(m)});else{let h=document.createElement("div");h.className="fi-dropdown-header";let p=document.createElement("span");p.style.whiteSpace="normal",p.textContent=e,h.appendChild(p),n.appendChild(h)}},l=f=>{if(!o)return;let p=(o.items||[])[f];p&&o.command({id:p.id})},a=()=>{if(!n||!o||o.items.length===0)return;let f=n.children[r];if(f){let h=f.getBoundingClientRect(),p=n.getBoundingClientRect();(h.topp.bottom)&&f.scrollIntoView({block:"nearest"})}},c=()=>{if(!o)return;let f=o.items||[];f.length!==0&&(r=(r+f.length-1)%f.length,s(),a())},d=()=>{if(!o)return;let f=o.items||[];f.length!==0&&(r=(r+1)%f.length,s(),a())},u=()=>{l(r)};return{onStart:f=>{o=f,r=0,n=i(),n.style.position="absolute",n.style.zIndex="50",s(),document.body.appendChild(n),f.clientRect&&np(f.editor,n)},onUpdate:f=>{o=f,r=0,s(),a(),f.clientRect&&np(f.editor,n)},onKeyDown:f=>f.event.key==="Escape"?(n&&n.parentNode&&n.parentNode.removeChild(n),!0):f.event.key==="ArrowUp"?(c(),!0):f.event.key==="ArrowDown"?(d(),!0):f.event.key==="Enter"?(u(),!0):!1,onExit:()=>{n&&n.parentNode&&n.parentNode.removeChild(n)}}}});var op=async({$wire:t,acceptedFileTypes:e,acceptedFileTypesValidationMessage:n,canAttachFiles:r,customExtensionUrls:o,deleteCustomBlockButtonIconHtml:i,editCustomBlockButtonIconHtml:s,editCustomBlockUsing:l,getMentionLabelsUsing:a,getMentionSearchResultsUsing:c,hasResizableImages:d,insertCustomBlockUsing:u,key:f,linkProtocols:h,maxFileSize:p,maxFileSizeValidationMessage:m,mentions:g,mergeTags:y,noMergeTagSearchResultsMessage:w,placeholder:b,statePath:C,textColors:x,uploadingFileMessage:S})=>{let k=[Du,Iu,$l,Pu,Lu,Bu.configure({deleteCustomBlockButtonIconHtml:i,editCustomBlockButtonIconHtml:s,editCustomBlockUsing:l,insertCustomBlockUsing:u}),Hu,Fu,$u,Vu,Nu.configure({class:"fi-not-prose"}),Ou,_u,Wu,ju,Uu,Ku,qu,Ju,Xu.configure({inline:!0,resize:{enabled:d,alwaysPreserveAspectRatio:!0,allowBase64:!0}}),Yu,pf.configure({autolink:!0,openOnClick:!1,protocols:h}),Fl,...r?[Af.configure({acceptedTypes:e,acceptedTypesValidationMessage:n,get$WireUsing:()=>t,key:f,maxSize:p,maxSizeValidationMessage:m,statePath:C,uploadingMessage:S})]:[],...Object.keys(y).length?[Ef.configure({deleteTriggerWithBackspace:!0,suggestion:rp({mergeTags:y,noMergeTagSearchResultsMessage:w}),mergeTags:y})]:[],...g.length?[mh.configure({HTMLAttributes:{class:"fi-fo-rich-editor-mention"},suggestions:g,getMentionSearchResultsUsing:c,getMentionLabelsUsing:a})]:[],_l,gh,Jl.configure({placeholder:b}),bh.configure({textColors:x}),yh,wh,xh,kh,Qh.configure({table:{resizable:!0}}),Zh,ep.configure({types:["heading","paragraph"],alignments:["start","center","end","justify"],defaultAlignment:"start"}),tp,Ru],O=await Promise.all(o.map(async T=>{new RegExp("^(?:[a-z+]+:)?//","i").test(T)||(T=new URL(T,document.baseURI).href);try{let $=(await import(T)).default;return typeof $=="function"?$():$}catch($){return console.error(`Failed to load rich editor custom extension from [${T}]:`,$),null}}));for(let T of O){if(!T||!T.name)continue;let A=k.findIndex($=>$.name===T.name);T.name==="placeholder"&&T.parent===null&&(T=Jl.configure(T.options)),A!==-1?k[A]=T:k.push(T)}return k};function Kx(t,e){let n=Math.min(t.top,e.top),r=Math.max(t.bottom,e.bottom),o=Math.min(t.left,e.left),s=Math.max(t.right,e.right)-o,l=r-n,a=o,c=n;return new DOMRect(a,c,s,l)}var qx=class{constructor({editor:t,element:e,view:n,updateDelay:r=250,resizeDelay:o=60,shouldShow:i,appendTo:s,getReferencedVirtualElement:l,options:a}){this.preventHide=!1,this.isVisible=!1,this.scrollTarget=window,this.floatingUIOptions={strategy:"absolute",placement:"top",offset:8,flip:{},shift:{},arrow:!1,size:!1,autoPlacement:!1,hide:!1,inline:!1,onShow:void 0,onHide:void 0,onUpdate:void 0,onDestroy:void 0},this.shouldShow=({view:d,state:u,from:f,to:h})=>{let{doc:p,selection:m}=u,{empty:g}=m,y=!p.textBetween(f,h).length&&fo(u.selection),w=this.element.contains(document.activeElement);return!(!(d.hasFocus()||w)||g||y||!this.editor.isEditable)},this.mousedownHandler=()=>{this.preventHide=!0},this.dragstartHandler=()=>{this.hide()},this.resizeHandler=()=>{this.resizeDebounceTimer&&clearTimeout(this.resizeDebounceTimer),this.resizeDebounceTimer=window.setTimeout(()=>{this.updatePosition()},this.resizeDelay)},this.focusHandler=()=>{setTimeout(()=>this.update(this.editor.view))},this.blurHandler=({event:d})=>{var u;if(this.editor.isDestroyed){this.destroy();return}if(this.preventHide){this.preventHide=!1;return}d?.relatedTarget&&((u=this.element.parentNode)!=null&&u.contains(d.relatedTarget))||d?.relatedTarget!==this.editor.view.dom&&this.hide()},this.handleDebouncedUpdate=(d,u)=>{let f=!u?.selection.eq(d.state.selection),h=!u?.doc.eq(d.state.doc);!f&&!h||(this.updateDebounceTimer&&clearTimeout(this.updateDebounceTimer),this.updateDebounceTimer=window.setTimeout(()=>{this.updateHandler(d,f,h,u)},this.updateDelay))},this.updateHandler=(d,u,f,h)=>{let{composing:p}=d;if(p||!u&&!f)return;if(!this.getShouldShow(h)){this.hide();return}this.updatePosition(),this.show()},this.transactionHandler=({transaction:d})=>{d.getMeta("bubbleMenu")==="updatePosition"&&this.updatePosition()};var c;this.editor=t,this.element=e,this.view=n,this.updateDelay=r,this.resizeDelay=o,this.appendTo=s,this.scrollTarget=(c=a?.scrollTarget)!=null?c:window,this.getReferencedVirtualElement=l,this.floatingUIOptions={...this.floatingUIOptions,...a},this.element.tabIndex=0,i&&(this.shouldShow=i),this.element.addEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.addEventListener("dragstart",this.dragstartHandler),this.editor.on("focus",this.focusHandler),this.editor.on("blur",this.blurHandler),this.editor.on("transaction",this.transactionHandler),window.addEventListener("resize",this.resizeHandler),this.scrollTarget.addEventListener("scroll",this.resizeHandler),this.update(n,n.state),this.getShouldShow()&&(this.show(),this.updatePosition())}get middlewares(){let t=[];return this.floatingUIOptions.flip&&t.push(Pn(typeof this.floatingUIOptions.flip!="boolean"?this.floatingUIOptions.flip:void 0)),this.floatingUIOptions.shift&&t.push(In(typeof this.floatingUIOptions.shift!="boolean"?this.floatingUIOptions.shift:void 0)),this.floatingUIOptions.offset&&t.push(lh(typeof this.floatingUIOptions.offset!="boolean"?this.floatingUIOptions.offset:void 0)),this.floatingUIOptions.arrow&&t.push(uh(this.floatingUIOptions.arrow)),this.floatingUIOptions.size&&t.push(ch(typeof this.floatingUIOptions.size!="boolean"?this.floatingUIOptions.size:void 0)),this.floatingUIOptions.autoPlacement&&t.push(ah(typeof this.floatingUIOptions.autoPlacement!="boolean"?this.floatingUIOptions.autoPlacement:void 0)),this.floatingUIOptions.hide&&t.push(dh(typeof this.floatingUIOptions.hide!="boolean"?this.floatingUIOptions.hide:void 0)),this.floatingUIOptions.inline&&t.push(fh(typeof this.floatingUIOptions.inline!="boolean"?this.floatingUIOptions.inline:void 0)),t}get virtualElement(){var t;let{selection:e}=this.editor.state,n=(t=this.getReferencedVirtualElement)==null?void 0:t.call(this);if(n)return n;let r=tu(this.view,e.from,e.to),o={getBoundingClientRect:()=>r,getClientRects:()=>[r]};if(e instanceof L){let i=this.view.nodeDOM(e.from),s=i.dataset.nodeViewWrapper?i:i.querySelector("[data-node-view-wrapper]");s&&(i=s),i&&(o={getBoundingClientRect:()=>i.getBoundingClientRect(),getClientRects:()=>[i.getBoundingClientRect()]})}if(e instanceof X){let{$anchorCell:i,$headCell:s}=e,l=i?i.pos:s.pos,a=s?s.pos:i.pos,c=this.view.nodeDOM(l),d=this.view.nodeDOM(a);if(!c||!d)return;let u=c===d?c.getBoundingClientRect():Kx(c.getBoundingClientRect(),d.getBoundingClientRect());o={getBoundingClientRect:()=>u,getClientRects:()=>[u]}}return o}updatePosition(){let t=this.virtualElement;t&&Ln(t,this.element,{placement:this.floatingUIOptions.placement,strategy:this.floatingUIOptions.strategy,middleware:this.middlewares}).then(({x:e,y:n,strategy:r})=>{this.element.style.width="max-content",this.element.style.position=r,this.element.style.left=`${e}px`,this.element.style.top=`${n}px`,this.isVisible&&this.floatingUIOptions.onUpdate&&this.floatingUIOptions.onUpdate()})}update(t,e){let{state:n}=t,r=n.selection.from!==n.selection.to;if(this.updateDelay>0&&r){this.handleDebouncedUpdate(t,e);return}let o=!e?.selection.eq(t.state.selection),i=!e?.doc.eq(t.state.doc);this.updateHandler(t,o,i,e)}getShouldShow(t){var e;let{state:n}=this.view,{selection:r}=n,{ranges:o}=r,i=Math.min(...o.map(a=>a.$from.pos)),s=Math.max(...o.map(a=>a.$to.pos));return((e=this.shouldShow)==null?void 0:e.call(this,{editor:this.editor,element:this.element,view:this.view,state:n,oldState:t,from:i,to:s}))||!1}show(){var t;if(this.isVisible)return;this.element.style.visibility="visible",this.element.style.opacity="1";let e=typeof this.appendTo=="function"?this.appendTo():this.appendTo;(t=e??this.view.dom.parentElement)==null||t.appendChild(this.element),this.floatingUIOptions.onShow&&this.floatingUIOptions.onShow(),this.isVisible=!0}hide(){this.isVisible&&(this.element.style.visibility="hidden",this.element.style.opacity="0",this.element.remove(),this.floatingUIOptions.onHide&&this.floatingUIOptions.onHide(),this.isVisible=!1)}destroy(){this.hide(),this.element.removeEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.removeEventListener("dragstart",this.dragstartHandler),window.removeEventListener("resize",this.resizeHandler),this.scrollTarget.removeEventListener("scroll",this.resizeHandler),this.editor.off("focus",this.focusHandler),this.editor.off("blur",this.blurHandler),this.editor.off("transaction",this.transactionHandler),this.floatingUIOptions.onDestroy&&this.floatingUIOptions.onDestroy()}},la=t=>new P({key:typeof t.pluginKey=="string"?new H(t.pluginKey):t.pluginKey,view:e=>new qx({view:e,...t})}),kT=U.create({name:"bubbleMenu",addOptions(){return{element:null,pluginKey:"bubbleMenu",updateDelay:void 0,appendTo:void 0,shouldShow:null}},addProseMirrorPlugins(){return this.options.element?[la({pluginKey:this.options.pluginKey,editor:this.editor,element:this.options.element,updateDelay:this.options.updateDelay,options:this.options.options,appendTo:this.options.appendTo,getReferencedVirtualElement:this.options.getReferencedVirtualElement,shouldShow:this.options.shouldShow})]:[]}});function Jx({acceptedFileTypes:t,acceptedFileTypesValidationMessage:e,activePanel:n,canAttachFiles:r,deleteCustomBlockButtonIconHtml:o,editCustomBlockButtonIconHtml:i,extensions:s,floatingToolbars:l,hasResizableImages:a,isDisabled:c,isLiveDebounced:d,isLiveOnBlur:u,key:f,linkProtocols:h,liveDebounce:p,livewireId:m,maxFileSize:g,maxFileSizeValidationMessage:y,mergeTags:w,mentions:b,getMentionSearchResultsUsing:C,getMentionLabelsUsing:x,noMergeTagSearchResultsMessage:S,placeholder:k,state:O,statePath:T,textColors:A,uploadingFileMessage:$}){let z,K=[],V=!1;return{state:O,activePanel:n,editorSelection:{type:"text",anchor:1,head:1},isUploadingFile:!1,fileValidationMessage:null,shouldUpdateState:!0,editorUpdatedAt:Date.now(),async init(){z=new gu({editable:!c,element:this.$refs.editor,extensions:await op({acceptedFileTypes:t,acceptedFileTypesValidationMessage:e,canAttachFiles:r,customExtensionUrls:s,deleteCustomBlockButtonIconHtml:o,editCustomBlockButtonIconHtml:i,editCustomBlockUsing:(q,We)=>this.$wire.mountAction("customBlock",{editorSelection:this.editorSelection,id:q,config:We,mode:"edit"},{schemaComponent:f}),floatingToolbars:l,hasResizableImages:a,insertCustomBlockUsing:(q,We=null)=>this.$wire.mountAction("customBlock",{id:q,dragPosition:We,mode:"insert"},{schemaComponent:f}),key:f,linkProtocols:h,maxFileSize:g,maxFileSizeValidationMessage:y,mergeTags:w,mentions:b,getMentionSearchResultsUsing:C,getMentionLabelsUsing:x,noMergeTagSearchResultsMessage:S,placeholder:k,statePath:T,textColors:A,uploadingFileMessage:$,$wire:this.$wire}),content:this.state});let N="paragraph"in l;Object.keys(l).forEach(q=>{let We=this.$refs[`floatingToolbar::${q}`];if(!We){console.warn(`Floating toolbar [${q}] not found.`);return}z.registerPlugin(la({editor:z,element:We,pluginKey:`floatingToolbar::${q}`,shouldShow:({editor:je})=>q==="paragraph"?je.isFocused&&je.isActive(q)&&!je.state.selection.empty:N&&!je.state.selection.empty&&je.isActive("paragraph")?!1:je.isFocused&&je.isActive(q),options:{placement:"bottom",offset:15}}))}),z.on("create",()=>{this.editorUpdatedAt=Date.now()});let _=Alpine.debounce(()=>{V||this.$wire.commit()},p??300);z.on("update",({editor:q})=>this.$nextTick(()=>{V||(this.editorUpdatedAt=Date.now(),this.state=q.getJSON(),this.shouldUpdateState=!1,this.fileValidationMessage=null,d&&_())})),z.on("selectionUpdate",({transaction:q})=>{V||(this.editorUpdatedAt=Date.now(),this.editorSelection=q.selection.toJSON())}),z.on("transaction",()=>{V||(this.editorUpdatedAt=Date.now())}),u&&z.on("blur",()=>{V||this.$wire.commit()}),this.$watch("state",()=>{if(!V){if(!this.shouldUpdateState){this.shouldUpdateState=!0;return}z.commands.setContent(this.state)}});let W=q=>{q.detail.livewireId===m&&q.detail.key===f&&this.runEditorCommands(q.detail)};window.addEventListener("run-rich-editor-commands",W),K.push(["run-rich-editor-commands",W]);let Q=q=>{q.detail.livewireId===m&&q.detail.key===f&&(this.isUploadingFile=!0,this.fileValidationMessage=null,q.stopPropagation())};window.addEventListener("rich-editor-uploading-file",Q),K.push(["rich-editor-uploading-file",Q]);let me=q=>{q.detail.livewireId===m&&q.detail.key===f&&(this.isUploadingFile=!1,q.stopPropagation())};window.addEventListener("rich-editor-uploaded-file",me),K.push(["rich-editor-uploaded-file",me]);let Ge=q=>{q.detail.livewireId===m&&q.detail.key===f&&(this.isUploadingFile=!1,this.fileValidationMessage=q.detail.validationMessage,q.stopPropagation())};window.addEventListener("rich-editor-file-validation-message",Ge),K.push(["rich-editor-file-validation-message",Ge]),window.dispatchEvent(new CustomEvent(`schema-component-${m}-${f}-loaded`))},getEditor(){return z},$getEditor(){return this.getEditor()},setEditorSelection(N){N&&(this.editorSelection=N,z.chain().command(({tr:_})=>(_.setSelection(I.fromJSON(z.state.doc,this.editorSelection)),!0)).run())},runEditorCommands({commands:N,editorSelection:_}){this.setEditorSelection(_);let W=z.chain();N.forEach(Q=>W=W[Q.name](...Q.arguments??[])),W.run()},togglePanel(N=null){if(this.isPanelActive(N)){this.activePanel=null;return}this.activePanel=N},isPanelActive(N=null){return N===null?this.activePanel!==null:this.activePanel===N},insertMergeTag(N){z.chain().focus().insertContent([{type:"mergeTag",attrs:{id:N}},{type:"text",text:" "}]).run()},destroy(){V=!0,K.forEach(([N,_])=>{window.removeEventListener(N,_)}),K=[],z&&(z.destroy(),z=null),this.shouldUpdateState=!0}}}export{Jx as default}; diff --git a/public/js/filament/forms/components/select.js b/public/js/filament/forms/components/select.js index 7b3c78f09c..261b734308 100644 --- a/public/js/filament/forms/components/select.js +++ b/public/js/filament/forms/components/select.js @@ -1,6 +1,11 @@ -var lt=Object.create;var Ge=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var ft=(se,ie)=>()=>(ie||se((ie={exports:{}}).exports,ie),ie.exports);var pt=(se,ie,X,me)=>{if(ie&&typeof ie=="object"||typeof ie=="function")for(let j of ut(ie))!dt.call(se,j)&&j!==X&&Ge(se,j,{get:()=>ie[j],enumerable:!(me=ct(ie,j))||me.enumerable});return se};var mt=(se,ie,X)=>(X=se!=null?lt(ht(se)):{},pt(ie||!se||!se.__esModule?Ge(X,"default",{value:se,enumerable:!0}):X,se));var $e=ft((Ae,Ye)=>{(function(ie,X){typeof Ae=="object"&&typeof Ye=="object"?Ye.exports=X():typeof define=="function"&&define.amd?define([],X):typeof Ae=="object"?Ae.Choices=X():ie.Choices=X()})(window,function(){return function(){"use strict";var se={282:function(j,i,b){Object.defineProperty(i,"__esModule",{value:!0}),i.clearChoices=i.activateChoices=i.filterChoices=i.addChoice=void 0;var _=b(883),h=function(c){var l=c.value,O=c.label,L=c.id,y=c.groupId,D=c.disabled,k=c.elementId,Q=c.customProperties,Z=c.placeholder,ne=c.keyCode;return{type:_.ACTION_TYPES.ADD_CHOICE,value:l,label:O,id:L,groupId:y,disabled:D,elementId:k,customProperties:Q,placeholder:Z,keyCode:ne}};i.addChoice=h;var d=function(c){return{type:_.ACTION_TYPES.FILTER_CHOICES,results:c}};i.filterChoices=d;var a=function(c){return c===void 0&&(c=!0),{type:_.ACTION_TYPES.ACTIVATE_CHOICES,active:c}};i.activateChoices=a;var r=function(){return{type:_.ACTION_TYPES.CLEAR_CHOICES}};i.clearChoices=r},783:function(j,i,b){Object.defineProperty(i,"__esModule",{value:!0}),i.addGroup=void 0;var _=b(883),h=function(d){var a=d.value,r=d.id,c=d.active,l=d.disabled;return{type:_.ACTION_TYPES.ADD_GROUP,value:a,id:r,active:c,disabled:l}};i.addGroup=h},464:function(j,i,b){Object.defineProperty(i,"__esModule",{value:!0}),i.highlightItem=i.removeItem=i.addItem=void 0;var _=b(883),h=function(r){var c=r.value,l=r.label,O=r.id,L=r.choiceId,y=r.groupId,D=r.customProperties,k=r.placeholder,Q=r.keyCode;return{type:_.ACTION_TYPES.ADD_ITEM,value:c,label:l,id:O,choiceId:L,groupId:y,customProperties:D,placeholder:k,keyCode:Q}};i.addItem=h;var d=function(r,c){return{type:_.ACTION_TYPES.REMOVE_ITEM,id:r,choiceId:c}};i.removeItem=d;var a=function(r,c){return{type:_.ACTION_TYPES.HIGHLIGHT_ITEM,id:r,highlighted:c}};i.highlightItem=a},137:function(j,i,b){Object.defineProperty(i,"__esModule",{value:!0}),i.setIsLoading=i.resetTo=i.clearAll=void 0;var _=b(883),h=function(){return{type:_.ACTION_TYPES.CLEAR_ALL}};i.clearAll=h;var d=function(r){return{type:_.ACTION_TYPES.RESET_TO,state:r}};i.resetTo=d;var a=function(r){return{type:_.ACTION_TYPES.SET_IS_LOADING,isLoading:r}};i.setIsLoading=a},373:function(j,i,b){var _=this&&this.__spreadArray||function(g,e,t){if(t||arguments.length===2)for(var n=0,s=e.length,v;n=0?this._store.getGroupById(v):null;return this._store.dispatch((0,l.highlightItem)(n,!0)),t&&this.passedElement.triggerEvent(y.EVENTS.highlightItem,{id:n,value:M,label:f,groupValue:u&&u.value?u.value:null}),this},g.prototype.unhighlightItem=function(e){if(!e||!e.id)return this;var t=e.id,n=e.groupId,s=n===void 0?-1:n,v=e.value,P=v===void 0?"":v,M=e.label,K=M===void 0?"":M,f=s>=0?this._store.getGroupById(s):null;return this._store.dispatch((0,l.highlightItem)(t,!1)),this.passedElement.triggerEvent(y.EVENTS.highlightItem,{id:t,value:P,label:K,groupValue:f&&f.value?f.value:null}),this},g.prototype.highlightAll=function(){var e=this;return this._store.items.forEach(function(t){return e.highlightItem(t)}),this},g.prototype.unhighlightAll=function(){var e=this;return this._store.items.forEach(function(t){return e.unhighlightItem(t)}),this},g.prototype.removeActiveItemsByValue=function(e){var t=this;return this._store.activeItems.filter(function(n){return n.value===e}).forEach(function(n){return t._removeItem(n)}),this},g.prototype.removeActiveItems=function(e){var t=this;return this._store.activeItems.filter(function(n){var s=n.id;return s!==e}).forEach(function(n){return t._removeItem(n)}),this},g.prototype.removeHighlightedItems=function(e){var t=this;return e===void 0&&(e=!1),this._store.highlightedActiveItems.forEach(function(n){t._removeItem(n),e&&t._triggerChange(n.value)}),this},g.prototype.showDropdown=function(e){var t=this;return this.dropdown.isActive?this:(requestAnimationFrame(function(){t.dropdown.show(),t.containerOuter.open(t.dropdown.distanceFromTopWindow),!e&&t._canSearch&&t.input.focus(),t.passedElement.triggerEvent(y.EVENTS.showDropdown,{})}),this)},g.prototype.hideDropdown=function(e){var t=this;return this.dropdown.isActive?(requestAnimationFrame(function(){t.dropdown.hide(),t.containerOuter.close(),!e&&t._canSearch&&(t.input.removeActiveDescendant(),t.input.blur()),t.passedElement.triggerEvent(y.EVENTS.hideDropdown,{})}),this):this},g.prototype.getValue=function(e){e===void 0&&(e=!1);var t=this._store.activeItems.reduce(function(n,s){var v=e?s.value:s;return n.push(v),n},[]);return this._isSelectOneElement?t[0]:t},g.prototype.setValue=function(e){var t=this;return this.initialised?(e.forEach(function(n){return t._setChoiceOrItem(n)}),this):this},g.prototype.setChoiceByValue=function(e){var t=this;if(!this.initialised||this._isTextElement)return this;var n=Array.isArray(e)?e:[e];return n.forEach(function(s){return t._findAndSelectChoiceByValue(s)}),this},g.prototype.setChoices=function(e,t,n,s){var v=this;if(e===void 0&&(e=[]),t===void 0&&(t="value"),n===void 0&&(n="label"),s===void 0&&(s=!1),!this.initialised)throw new ReferenceError("setChoices was called on a non-initialized instance of Choices");if(!this._isSelectElement)throw new TypeError("setChoices can't be used with INPUT based Choices");if(typeof t!="string"||!t)throw new TypeError("value parameter must be a name of 'value' field in passed objects");if(s&&this.clearChoices(),typeof e=="function"){var P=e(this);if(typeof Promise=="function"&&P instanceof Promise)return new Promise(function(M){return requestAnimationFrame(M)}).then(function(){return v._handleLoadingState(!0)}).then(function(){return P}).then(function(M){return v.setChoices(M,t,n,s)}).catch(function(M){v.config.silent||console.error(M)}).then(function(){return v._handleLoadingState(!1)}).then(function(){return v});if(!Array.isArray(P))throw new TypeError(".setChoices first argument function must return either array of choices or Promise, got: ".concat(typeof P));return this.setChoices(P,t,n,!1)}if(!Array.isArray(e))throw new TypeError(".setChoices must be called either with array of choices with a function resulting into Promise of array of choices");return this.containerOuter.removeLoadingState(),this._startLoading(),e.forEach(function(M){if(M.choices)v._addGroup({id:M.id?parseInt("".concat(M.id),10):null,group:M,valueKey:t,labelKey:n});else{var K=M;v._addChoice({value:K[t],label:K[n],isSelected:!!K.selected,isDisabled:!!K.disabled,placeholder:!!K.placeholder,customProperties:K.customProperties})}}),this._stopLoading(),this},g.prototype.clearChoices=function(){return this._store.dispatch((0,r.clearChoices)()),this},g.prototype.clearStore=function(){return this._store.dispatch((0,O.clearAll)()),this},g.prototype.clearInput=function(){var e=!this._isSelectOneElement;return this.input.clear(e),!this._isTextElement&&this._canSearch&&(this._isSearching=!1,this._store.dispatch((0,r.activateChoices)(!0))),this},g.prototype._render=function(){if(!this._store.isLoading()){this._currentState=this._store.state;var e=this._currentState.choices!==this._prevState.choices||this._currentState.groups!==this._prevState.groups||this._currentState.items!==this._prevState.items,t=this._isSelectElement,n=this._currentState.items!==this._prevState.items;e&&(t&&this._renderChoices(),n&&this._renderItems(),this._prevState=this._currentState)}},g.prototype._renderChoices=function(){var e=this,t=this._store,n=t.activeGroups,s=t.activeChoices,v=document.createDocumentFragment();if(this.choiceList.clear(),this.config.resetScrollPosition&&requestAnimationFrame(function(){return e.choiceList.scrollToTop()}),n.length>=1&&!this._isSearching){var P=s.filter(function(C){return C.placeholder===!0&&C.groupId===-1});P.length>=1&&(v=this._createChoicesFragment(P,v)),v=this._createGroupsFragment(n,s,v)}else s.length>=1&&(v=this._createChoicesFragment(s,v));if(v.childNodes&&v.childNodes.length>0){var M=this._store.activeItems,K=this._canAddItem(M,this.input.value);if(K.response)this.choiceList.append(v),this._highlightChoice();else{var f=this._getTemplate("notice",K.notice);this.choiceList.append(f)}}else{var u=void 0,f=void 0;this._isSearching?(f=typeof this.config.noResultsText=="function"?this.config.noResultsText():this.config.noResultsText,u=this._getTemplate("notice",f,"no-results")):(f=typeof this.config.noChoicesText=="function"?this.config.noChoicesText():this.config.noChoicesText,u=this._getTemplate("notice",f,"no-choices")),this.choiceList.append(u)}},g.prototype._renderItems=function(){var e=this._store.activeItems||[];this.itemList.clear();var t=this._createItemsFragment(e);t.childNodes&&this.itemList.append(t)},g.prototype._createGroupsFragment=function(e,t,n){var s=this;n===void 0&&(n=document.createDocumentFragment());var v=function(P){return t.filter(function(M){return s._isSelectOneElement?M.groupId===P.id:M.groupId===P.id&&(s.config.renderSelectedChoices==="always"||!M.selected)})};return this.config.shouldSort&&e.sort(this.config.sorter),e.forEach(function(P){var M=v(P);if(M.length>=1){var K=s._getTemplate("choiceGroup",P);n.appendChild(K),s._createChoicesFragment(M,n,!0)}}),n},g.prototype._createChoicesFragment=function(e,t,n){var s=this;t===void 0&&(t=document.createDocumentFragment()),n===void 0&&(n=!1);var v=this.config,P=v.renderSelectedChoices,M=v.searchResultLimit,K=v.renderChoiceLimit,f=this._isSearching?k.sortByScore:this.config.sorter,u=function(z){var ee=P==="auto"?s._isSelectOneElement||!z.selected:!0;if(ee){var ae=s._getTemplate("choice",z,s.config.itemSelectText);t.appendChild(ae)}},C=e;P==="auto"&&!this._isSelectOneElement&&(C=e.filter(function(z){return!z.selected}));var Y=C.reduce(function(z,ee){return ee.placeholder?z.placeholderChoices.push(ee):z.normalChoices.push(ee),z},{placeholderChoices:[],normalChoices:[]}),V=Y.placeholderChoices,U=Y.normalChoices;(this.config.shouldSort||this._isSearching)&&U.sort(f);var $=C.length,W=this._isSelectOneElement?_(_([],V,!0),U,!0):U;this._isSearching?$=M:K&&K>0&&!n&&($=K);for(var J=0;J<$;J+=1)W[J]&&u(W[J]);return t},g.prototype._createItemsFragment=function(e,t){var n=this;t===void 0&&(t=document.createDocumentFragment());var s=this.config,v=s.shouldSortItems,P=s.sorter,M=s.removeItemButton;v&&!this._isSelectOneElement&&e.sort(P),this._isTextElement?this.passedElement.value=e.map(function(f){var u=f.value;return u}).join(this.config.delimiter):this.passedElement.options=e;var K=function(f){var u=n._getTemplate("item",f,M);t.appendChild(u)};return e.forEach(K),t},g.prototype._triggerChange=function(e){e!=null&&this.passedElement.triggerEvent(y.EVENTS.change,{value:e})},g.prototype._selectPlaceholderChoice=function(e){this._addItem({value:e.value,label:e.label,choiceId:e.id,groupId:e.groupId,placeholder:e.placeholder}),this._triggerChange(e.value)},g.prototype._handleButtonAction=function(e,t){if(!(!e||!t||!this.config.removeItems||!this.config.removeItemButton)){var n=t.parentNode&&t.parentNode.dataset.id,s=n&&e.find(function(v){return v.id===parseInt(n,10)});s&&(this._removeItem(s),this._triggerChange(s.value),this._isSelectOneElement&&this._store.placeholderChoice&&this._selectPlaceholderChoice(this._store.placeholderChoice))}},g.prototype._handleItemAction=function(e,t,n){var s=this;if(n===void 0&&(n=!1),!(!e||!t||!this.config.removeItems||this._isSelectOneElement)){var v=t.dataset.id;e.forEach(function(P){P.id===parseInt("".concat(v),10)&&!P.highlighted?s.highlightItem(P):!n&&P.highlighted&&s.unhighlightItem(P)}),this.input.focus()}},g.prototype._handleChoiceAction=function(e,t){if(!(!e||!t)){var n=t.dataset.id,s=n&&this._store.getChoiceById(n);if(s){var v=e[0]&&e[0].keyCode?e[0].keyCode:void 0,P=this.dropdown.isActive;if(s.keyCode=v,this.passedElement.triggerEvent(y.EVENTS.choice,{choice:s}),!s.selected&&!s.disabled){var M=this._canAddItem(e,s.value);M.response&&(this._addItem({value:s.value,label:s.label,choiceId:s.id,groupId:s.groupId,customProperties:s.customProperties,placeholder:s.placeholder,keyCode:s.keyCode}),this._triggerChange(s.value))}this.clearInput(),P&&this._isSelectOneElement&&(this.hideDropdown(!0),this.containerOuter.focus())}}},g.prototype._handleBackspace=function(e){if(!(!this.config.removeItems||!e)){var t=e[e.length-1],n=e.some(function(s){return s.highlighted});this.config.editItems&&!n&&t?(this.input.value=t.value,this.input.setWidth(),this._removeItem(t),this._triggerChange(t.value)):(n||this.highlightItem(t,!1),this.removeHighlightedItems(!0))}},g.prototype._startLoading=function(){this._store.dispatch((0,O.setIsLoading)(!0))},g.prototype._stopLoading=function(){this._store.dispatch((0,O.setIsLoading)(!1))},g.prototype._handleLoadingState=function(e){e===void 0&&(e=!0);var t=this.itemList.getChild(".".concat(this.config.classNames.placeholder));e?(this.disable(),this.containerOuter.addLoadingState(),this._isSelectOneElement?t?t.innerHTML=this.config.loadingText:(t=this._getTemplate("placeholder",this.config.loadingText),t&&this.itemList.append(t)):this.input.placeholder=this.config.loadingText):(this.enable(),this.containerOuter.removeLoadingState(),this._isSelectOneElement?t&&(t.innerHTML=this._placeholderValue||""):this.input.placeholder=this._placeholderValue||"")},g.prototype._handleSearch=function(e){if(this.input.isFocussed){var t=this._store.choices,n=this.config,s=n.searchFloor,v=n.searchChoices,P=t.some(function(K){return!K.active});if(e!==null&&typeof e<"u"&&e.length>=s){var M=v?this._searchChoices(e):0;this.passedElement.triggerEvent(y.EVENTS.search,{value:e,resultCount:M})}else P&&(this._isSearching=!1,this._store.dispatch((0,r.activateChoices)(!0)))}},g.prototype._canAddItem=function(e,t){var n=!0,s=typeof this.config.addItemText=="function"?this.config.addItemText(t):this.config.addItemText;if(!this._isSelectOneElement){var v=(0,k.existsInArray)(e,t);this.config.maxItemCount>0&&this.config.maxItemCount<=e.length&&(n=!1,s=typeof this.config.maxItemText=="function"?this.config.maxItemText(this.config.maxItemCount):this.config.maxItemText),!this.config.duplicateItemsAllowed&&v&&n&&(n=!1,s=typeof this.config.uniqueItemText=="function"?this.config.uniqueItemText(t):this.config.uniqueItemText),this._isTextElement&&this.config.addItems&&n&&typeof this.config.addItemFilter=="function"&&!this.config.addItemFilter(t)&&(n=!1,s=typeof this.config.customAddItemText=="function"?this.config.customAddItemText(t):this.config.customAddItemText)}return{response:n,notice:s}},g.prototype._searchChoices=function(e){var t=typeof e=="string"?e.trim():e,n=typeof this._currentValue=="string"?this._currentValue.trim():this._currentValue;if(t.length<1&&t==="".concat(n," "))return 0;var s=this._store.searchableChoices,v=t,P=Object.assign(this.config.fuseOptions,{keys:_([],this.config.searchFields,!0),includeMatches:!0}),M=new a.default(s,P),K=M.search(v);return this._currentValue=t,this._highlightPosition=0,this._isSearching=!0,this._store.dispatch((0,r.filterChoices)(K)),K.length},g.prototype._addEventListeners=function(){var e=document.documentElement;e.addEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.addEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.addEventListener("mousedown",this._onMouseDown,!0),e.addEventListener("click",this._onClick,{passive:!0}),e.addEventListener("touchmove",this._onTouchMove,{passive:!0}),this.dropdown.element.addEventListener("mouseover",this._onMouseOver,{passive:!0}),this._isSelectOneElement&&(this.containerOuter.element.addEventListener("focus",this._onFocus,{passive:!0}),this.containerOuter.element.addEventListener("blur",this._onBlur,{passive:!0})),this.input.element.addEventListener("keyup",this._onKeyUp,{passive:!0}),this.input.element.addEventListener("focus",this._onFocus,{passive:!0}),this.input.element.addEventListener("blur",this._onBlur,{passive:!0}),this.input.element.form&&this.input.element.form.addEventListener("reset",this._onFormReset,{passive:!0}),this.input.addEventListeners()},g.prototype._removeEventListeners=function(){var e=document.documentElement;e.removeEventListener("touchend",this._onTouchEnd,!0),this.containerOuter.element.removeEventListener("keydown",this._onKeyDown,!0),this.containerOuter.element.removeEventListener("mousedown",this._onMouseDown,!0),e.removeEventListener("click",this._onClick),e.removeEventListener("touchmove",this._onTouchMove),this.dropdown.element.removeEventListener("mouseover",this._onMouseOver),this._isSelectOneElement&&(this.containerOuter.element.removeEventListener("focus",this._onFocus),this.containerOuter.element.removeEventListener("blur",this._onBlur)),this.input.element.removeEventListener("keyup",this._onKeyUp),this.input.element.removeEventListener("focus",this._onFocus),this.input.element.removeEventListener("blur",this._onBlur),this.input.element.form&&this.input.element.form.removeEventListener("reset",this._onFormReset),this.input.removeEventListeners()},g.prototype._onKeyDown=function(e){var t=e.keyCode,n=this._store.activeItems,s=this.input.isFocussed,v=this.dropdown.isActive,P=this.itemList.hasChildren(),M=String.fromCharCode(t),K=/[^\x00-\x1F]/.test(M),f=y.KEY_CODES.BACK_KEY,u=y.KEY_CODES.DELETE_KEY,C=y.KEY_CODES.ENTER_KEY,Y=y.KEY_CODES.A_KEY,V=y.KEY_CODES.ESC_KEY,U=y.KEY_CODES.UP_KEY,$=y.KEY_CODES.DOWN_KEY,W=y.KEY_CODES.PAGE_UP_KEY,J=y.KEY_CODES.PAGE_DOWN_KEY;switch(!this._isTextElement&&!v&&K&&(this.showDropdown(),this.input.isFocussed||(this.input.value+=e.key.toLowerCase())),t){case Y:return this._onSelectKey(e,P);case C:return this._onEnterKey(e,n,v);case V:return this._onEscapeKey(v);case U:case W:case $:case J:return this._onDirectionKey(e,v);case u:case f:return this._onDeleteKey(e,n,s);default:}},g.prototype._onKeyUp=function(e){var t=e.target,n=e.keyCode,s=this.input.value,v=this._store.activeItems,P=this._canAddItem(v,s),M=y.KEY_CODES.BACK_KEY,K=y.KEY_CODES.DELETE_KEY;if(this._isTextElement){var f=P.notice&&s;if(f){var u=this._getTemplate("notice",P.notice);this.dropdown.element.innerHTML=u.outerHTML,this.showDropdown(!0)}else this.hideDropdown(!0)}else{var C=n===M||n===K,Y=C&&t&&!t.value,V=!this._isTextElement&&this._isSearching,U=this._canSearch&&P.response;Y&&V?(this._isSearching=!1,this._store.dispatch((0,r.activateChoices)(!0))):U&&this._handleSearch(this.input.rawValue)}this._canSearch=this.config.searchEnabled},g.prototype._onSelectKey=function(e,t){var n=e.ctrlKey,s=e.metaKey,v=n||s;if(v&&t){this._canSearch=!1;var P=this.config.removeItems&&!this.input.value&&this.input.element===document.activeElement;P&&this.highlightAll()}},g.prototype._onEnterKey=function(e,t,n){var s=e.target,v=y.KEY_CODES.ENTER_KEY,P=s&&s.hasAttribute("data-button");if(this._isTextElement&&s&&s.value){var M=this.input.value,K=this._canAddItem(t,M);K.response&&(this.hideDropdown(!0),this._addItem({value:M}),this._triggerChange(M),this.clearInput())}if(P&&(this._handleButtonAction(t,s),e.preventDefault()),n){var f=this.dropdown.getChild(".".concat(this.config.classNames.highlightedState));f&&(t[0]&&(t[0].keyCode=v),this._handleChoiceAction(t,f)),e.preventDefault()}else this._isSelectOneElement&&(this.showDropdown(),e.preventDefault())},g.prototype._onEscapeKey=function(e){e&&(this.hideDropdown(!0),this.containerOuter.focus())},g.prototype._onDirectionKey=function(e,t){var n=e.keyCode,s=e.metaKey,v=y.KEY_CODES.DOWN_KEY,P=y.KEY_CODES.PAGE_UP_KEY,M=y.KEY_CODES.PAGE_DOWN_KEY;if(t||this._isSelectOneElement){this.showDropdown(),this._canSearch=!1;var K=n===v||n===M?1:-1,f=s||n===M||n===P,u="[data-choice-selectable]",C=void 0;if(f)K>0?C=this.dropdown.element.querySelector("".concat(u,":last-of-type")):C=this.dropdown.element.querySelector(u);else{var Y=this.dropdown.element.querySelector(".".concat(this.config.classNames.highlightedState));Y?C=(0,k.getAdjacentEl)(Y,u,K):C=this.dropdown.element.querySelector(u)}C&&((0,k.isScrolledIntoView)(C,this.choiceList.element,K)||this.choiceList.scrollToChildElement(C,K),this._highlightChoice(C)),e.preventDefault()}},g.prototype._onDeleteKey=function(e,t,n){var s=e.target;!this._isSelectOneElement&&!s.value&&n&&(this._handleBackspace(t),e.preventDefault())},g.prototype._onTouchMove=function(){this._wasTap&&(this._wasTap=!1)},g.prototype._onTouchEnd=function(e){var t=(e||e.touches[0]).target,n=this._wasTap&&this.containerOuter.element.contains(t);if(n){var s=t===this.containerOuter.element||t===this.containerInner.element;s&&(this._isTextElement?this.input.focus():this._isSelectMultipleElement&&this.showDropdown()),e.stopPropagation()}this._wasTap=!0},g.prototype._onMouseDown=function(e){var t=e.target;if(t instanceof HTMLElement){if(E&&this.choiceList.element.contains(t)){var n=this.choiceList.element.firstElementChild,s=this._direction==="ltr"?e.offsetX>=n.offsetWidth:e.offsetX0;s&&this.unhighlightAll(),this.containerOuter.removeFocusState(),this.hideDropdown(!0)}},g.prototype._onFocus=function(e){var t,n=this,s=e.target,v=s&&this.containerOuter.element.contains(s);if(v){var P=(t={},t[y.TEXT_TYPE]=function(){s===n.input.element&&n.containerOuter.addFocusState()},t[y.SELECT_ONE_TYPE]=function(){n.containerOuter.addFocusState(),s===n.input.element&&n.showDropdown(!0)},t[y.SELECT_MULTIPLE_TYPE]=function(){s===n.input.element&&(n.showDropdown(!0),n.containerOuter.addFocusState())},t);P[this.passedElement.element.type]()}},g.prototype._onBlur=function(e){var t,n=this,s=e.target,v=s&&this.containerOuter.element.contains(s);if(v&&!this._isScrollingOnIe){var P=this._store.activeItems,M=P.some(function(f){return f.highlighted}),K=(t={},t[y.TEXT_TYPE]=function(){s===n.input.element&&(n.containerOuter.removeFocusState(),M&&n.unhighlightAll(),n.hideDropdown(!0))},t[y.SELECT_ONE_TYPE]=function(){n.containerOuter.removeFocusState(),(s===n.input.element||s===n.containerOuter.element&&!n._canSearch)&&n.hideDropdown(!0)},t[y.SELECT_MULTIPLE_TYPE]=function(){s===n.input.element&&(n.containerOuter.removeFocusState(),n.hideDropdown(!0),M&&n.unhighlightAll())},t);K[this.passedElement.element.type]()}else this._isScrollingOnIe=!1,this.input.element.focus()},g.prototype._onFormReset=function(){this._store.dispatch((0,O.resetTo)(this._initialState))},g.prototype._highlightChoice=function(e){var t=this;e===void 0&&(e=null);var n=Array.from(this.dropdown.element.querySelectorAll("[data-choice-selectable]"));if(n.length){var s=e,v=Array.from(this.dropdown.element.querySelectorAll(".".concat(this.config.classNames.highlightedState)));v.forEach(function(P){P.classList.remove(t.config.classNames.highlightedState),P.setAttribute("aria-selected","false")}),s?this._highlightPosition=n.indexOf(s):(n.length>this._highlightPosition?s=n[this._highlightPosition]:s=n[n.length-1],s||(s=n[0])),s.classList.add(this.config.classNames.highlightedState),s.setAttribute("aria-selected","true"),this.passedElement.triggerEvent(y.EVENTS.highlightChoice,{el:s}),this.dropdown.isActive&&(this.input.setActiveDescendant(s.id),this.containerOuter.setActiveDescendant(s.id))}},g.prototype._addItem=function(e){var t=e.value,n=e.label,s=n===void 0?null:n,v=e.choiceId,P=v===void 0?-1:v,M=e.groupId,K=M===void 0?-1:M,f=e.customProperties,u=f===void 0?{}:f,C=e.placeholder,Y=C===void 0?!1:C,V=e.keyCode,U=V===void 0?-1:V,$=typeof t=="string"?t.trim():t,W=this._store.items,J=s||$,z=P||-1,ee=K>=0?this._store.getGroupById(K):null,ae=W?W.length+1:1;this.config.prependValue&&($=this.config.prependValue+$.toString()),this.config.appendValue&&($+=this.config.appendValue.toString()),this._store.dispatch((0,l.addItem)({value:$,label:J,id:ae,choiceId:z,groupId:K,customProperties:u,placeholder:Y,keyCode:U})),this._isSelectOneElement&&this.removeActiveItems(ae),this.passedElement.triggerEvent(y.EVENTS.addItem,{id:ae,value:$,label:J,customProperties:u,groupValue:ee&&ee.value?ee.value:null,keyCode:U})},g.prototype._removeItem=function(e){var t=e.id,n=e.value,s=e.label,v=e.customProperties,P=e.choiceId,M=e.groupId,K=M&&M>=0?this._store.getGroupById(M):null;!t||!P||(this._store.dispatch((0,l.removeItem)(t,P)),this.passedElement.triggerEvent(y.EVENTS.removeItem,{id:t,value:n,label:s,customProperties:v,groupValue:K&&K.value?K.value:null}))},g.prototype._addChoice=function(e){var t=e.value,n=e.label,s=n===void 0?null:n,v=e.isSelected,P=v===void 0?!1:v,M=e.isDisabled,K=M===void 0?!1:M,f=e.groupId,u=f===void 0?-1:f,C=e.customProperties,Y=C===void 0?{}:C,V=e.placeholder,U=V===void 0?!1:V,$=e.keyCode,W=$===void 0?-1:$;if(!(typeof t>"u"||t===null)){var J=this._store.choices,z=s||t,ee=J?J.length+1:1,ae="".concat(this._baseId,"-").concat(this._idNames.itemChoice,"-").concat(ee);this._store.dispatch((0,r.addChoice)({id:ee,groupId:u,elementId:ae,value:t,label:z,disabled:K,customProperties:Y,placeholder:U,keyCode:W})),P&&this._addItem({value:t,label:z,choiceId:ee,customProperties:Y,placeholder:U,keyCode:W})}},g.prototype._addGroup=function(e){var t=this,n=e.group,s=e.id,v=e.valueKey,P=v===void 0?"value":v,M=e.labelKey,K=M===void 0?"label":M,f=(0,k.isType)("Object",n)?n.choices:Array.from(n.getElementsByTagName("OPTION")),u=s||Math.floor(new Date().valueOf()*Math.random()),C=n.disabled?n.disabled:!1;if(f){this._store.dispatch((0,c.addGroup)({value:n.label,id:u,active:!0,disabled:C}));var Y=function(V){var U=V.disabled||V.parentNode&&V.parentNode.disabled;t._addChoice({value:V[P],label:(0,k.isType)("Object",V)?V[K]:V.innerHTML,isSelected:V.selected,isDisabled:U,groupId:u,customProperties:V.customProperties,placeholder:V.placeholder})};f.forEach(Y)}else this._store.dispatch((0,c.addGroup)({value:n.label,id:n.id,active:!1,disabled:n.disabled}))},g.prototype._getTemplate=function(e){for(var t,n=[],s=1;s0?this.element.scrollTop+y-O:a.offsetTop;requestAnimationFrame(function(){c._animateScroll(D,r)})}},d.prototype._scrollDown=function(a,r,c){var l=(c-a)/r,O=l>1?l:1;this.element.scrollTop=a+O},d.prototype._scrollUp=function(a,r,c){var l=(a-c)/r,O=l>1?l:1;this.element.scrollTop=a-O},d.prototype._animateScroll=function(a,r){var c=this,l=_.SCROLLING_SPEED,O=this.element.scrollTop,L=!1;r>0?(this._scrollDown(O,l,a),Oa&&(L=!0)),L&&requestAnimationFrame(function(){c._animateScroll(a,r)})},d}();i.default=h},730:function(j,i,b){Object.defineProperty(i,"__esModule",{value:!0});var _=b(799),h=function(){function d(a){var r=a.element,c=a.classNames;if(this.element=r,this.classNames=c,!(r instanceof HTMLInputElement)&&!(r instanceof HTMLSelectElement))throw new TypeError("Invalid element passed");this.isDisabled=!1}return Object.defineProperty(d.prototype,"isActive",{get:function(){return this.element.dataset.choice==="active"},enumerable:!1,configurable:!0}),Object.defineProperty(d.prototype,"dir",{get:function(){return this.element.dir},enumerable:!1,configurable:!0}),Object.defineProperty(d.prototype,"value",{get:function(){return this.element.value},set:function(a){this.element.value=a},enumerable:!1,configurable:!0}),d.prototype.conceal=function(){this.element.classList.add(this.classNames.input),this.element.hidden=!0,this.element.tabIndex=-1;var a=this.element.getAttribute("style");a&&this.element.setAttribute("data-choice-orig-style",a),this.element.setAttribute("data-choice","active")},d.prototype.reveal=function(){this.element.classList.remove(this.classNames.input),this.element.hidden=!1,this.element.removeAttribute("tabindex");var a=this.element.getAttribute("data-choice-orig-style");a?(this.element.removeAttribute("data-choice-orig-style"),this.element.setAttribute("style",a)):this.element.removeAttribute("style"),this.element.removeAttribute("data-choice"),this.element.value=this.element.value},d.prototype.enable=function(){this.element.removeAttribute("disabled"),this.element.disabled=!1,this.isDisabled=!1},d.prototype.disable=function(){this.element.setAttribute("disabled",""),this.element.disabled=!0,this.isDisabled=!0},d.prototype.triggerEvent=function(a,r){(0,_.dispatchEvent)(this.element,a,r)},d}();i.default=h},541:function(j,i,b){var _=this&&this.__extends||function(){var r=function(c,l){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(O,L){O.__proto__=L}||function(O,L){for(var y in L)Object.prototype.hasOwnProperty.call(L,y)&&(O[y]=L[y])},r(c,l)};return function(c,l){if(typeof l!="function"&&l!==null)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");r(c,l);function O(){this.constructor=c}c.prototype=l===null?Object.create(l):(O.prototype=l.prototype,new O)}}(),h=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(i,"__esModule",{value:!0});var d=h(b(730)),a=function(r){_(c,r);function c(l){var O=l.element,L=l.classNames,y=l.delimiter,D=r.call(this,{element:O,classNames:L})||this;return D.delimiter=y,D}return Object.defineProperty(c.prototype,"value",{get:function(){return this.element.value},set:function(l){this.element.setAttribute("value",l),this.element.value=l},enumerable:!1,configurable:!0}),c}(d.default);i.default=a},982:function(j,i,b){var _=this&&this.__extends||function(){var r=function(c,l){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(O,L){O.__proto__=L}||function(O,L){for(var y in L)Object.prototype.hasOwnProperty.call(L,y)&&(O[y]=L[y])},r(c,l)};return function(c,l){if(typeof l!="function"&&l!==null)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");r(c,l);function O(){this.constructor=c}c.prototype=l===null?Object.create(l):(O.prototype=l.prototype,new O)}}(),h=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(i,"__esModule",{value:!0});var d=h(b(730)),a=function(r){_(c,r);function c(l){var O=l.element,L=l.classNames,y=l.template,D=r.call(this,{element:O,classNames:L})||this;return D.template=y,D}return Object.defineProperty(c.prototype,"placeholderOption",{get:function(){return this.element.querySelector('option[value=""]')||this.element.querySelector("option[placeholder]")},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"optionGroups",{get:function(){return Array.from(this.element.getElementsByTagName("OPTGROUP"))},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"options",{get:function(){return Array.from(this.element.options)},set:function(l){var O=this,L=document.createDocumentFragment(),y=function(D){var k=O.template(D);L.appendChild(k)};l.forEach(function(D){return y(D)}),this.appendDocFragment(L)},enumerable:!1,configurable:!0}),c.prototype.appendDocFragment=function(l){this.element.innerHTML="",this.element.appendChild(l)},c}(d.default);i.default=a},883:function(j,i){Object.defineProperty(i,"__esModule",{value:!0}),i.SCROLLING_SPEED=i.SELECT_MULTIPLE_TYPE=i.SELECT_ONE_TYPE=i.TEXT_TYPE=i.KEY_CODES=i.ACTION_TYPES=i.EVENTS=void 0,i.EVENTS={showDropdown:"showDropdown",hideDropdown:"hideDropdown",change:"change",choice:"choice",search:"search",addItem:"addItem",removeItem:"removeItem",highlightItem:"highlightItem",highlightChoice:"highlightChoice",unhighlightItem:"unhighlightItem"},i.ACTION_TYPES={ADD_CHOICE:"ADD_CHOICE",FILTER_CHOICES:"FILTER_CHOICES",ACTIVATE_CHOICES:"ACTIVATE_CHOICES",CLEAR_CHOICES:"CLEAR_CHOICES",ADD_GROUP:"ADD_GROUP",ADD_ITEM:"ADD_ITEM",REMOVE_ITEM:"REMOVE_ITEM",HIGHLIGHT_ITEM:"HIGHLIGHT_ITEM",CLEAR_ALL:"CLEAR_ALL",RESET_TO:"RESET_TO",SET_IS_LOADING:"SET_IS_LOADING"},i.KEY_CODES={BACK_KEY:46,DELETE_KEY:8,ENTER_KEY:13,A_KEY:65,ESC_KEY:27,UP_KEY:38,DOWN_KEY:40,PAGE_UP_KEY:33,PAGE_DOWN_KEY:34},i.TEXT_TYPE="text",i.SELECT_ONE_TYPE="select-one",i.SELECT_MULTIPLE_TYPE="select-multiple",i.SCROLLING_SPEED=4},789:function(j,i,b){Object.defineProperty(i,"__esModule",{value:!0}),i.DEFAULT_CONFIG=i.DEFAULT_CLASSNAMES=void 0;var _=b(799);i.DEFAULT_CLASSNAMES={containerOuter:"choices",containerInner:"choices__inner",input:"choices__input",inputCloned:"choices__input--cloned",list:"choices__list",listItems:"choices__list--multiple",listSingle:"choices__list--single",listDropdown:"choices__list--dropdown",item:"choices__item",itemSelectable:"choices__item--selectable",itemDisabled:"choices__item--disabled",itemChoice:"choices__item--choice",placeholder:"choices__placeholder",group:"choices__group",groupHeading:"choices__heading",button:"choices__button",activeState:"is-active",focusState:"is-focused",openState:"is-open",disabledState:"is-disabled",highlightedState:"is-highlighted",selectedState:"is-selected",flippedState:"is-flipped",loadingState:"is-loading",noResults:"has-no-results",noChoices:"has-no-choices"},i.DEFAULT_CONFIG={items:[],choices:[],silent:!1,renderChoiceLimit:-1,maxItemCount:-1,addItems:!0,addItemFilter:null,removeItems:!0,removeItemButton:!1,editItems:!1,allowHTML:!0,duplicateItemsAllowed:!0,delimiter:",",paste:!0,searchEnabled:!0,searchChoices:!0,searchFloor:1,searchResultLimit:4,searchFields:["label","value"],position:"auto",resetScrollPosition:!0,shouldSort:!0,shouldSortItems:!1,sorter:_.sortByAlpha,placeholder:!0,placeholderValue:null,searchPlaceholderValue:null,prependValue:null,appendValue:null,renderSelectedChoices:"auto",loadingText:"Loading...",noResultsText:"No results found",noChoicesText:"No choices to choose from",itemSelectText:"Press to select",uniqueItemText:"Only unique values can be added",customAddItemText:"Only values matching specific conditions can be added",addItemText:function(h){return'Press Enter to add "'.concat((0,_.sanitise)(h),'"')},maxItemText:function(h){return"Only ".concat(h," values can be added")},valueComparer:function(h,d){return h===d},fuseOptions:{includeScore:!0},labelId:"",callbackOnInit:null,callbackOnCreateTemplates:null,classNames:i.DEFAULT_CLASSNAMES}},18:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},978:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},948:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},359:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},285:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},533:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},187:function(j,i,b){var _=this&&this.__createBinding||(Object.create?function(d,a,r,c){c===void 0&&(c=r);var l=Object.getOwnPropertyDescriptor(a,r);(!l||("get"in l?!a.__esModule:l.writable||l.configurable))&&(l={enumerable:!0,get:function(){return a[r]}}),Object.defineProperty(d,c,l)}:function(d,a,r,c){c===void 0&&(c=r),d[c]=a[r]}),h=this&&this.__exportStar||function(d,a){for(var r in d)r!=="default"&&!Object.prototype.hasOwnProperty.call(a,r)&&_(a,d,r)};Object.defineProperty(i,"__esModule",{value:!0}),h(b(18),i),h(b(978),i),h(b(948),i),h(b(359),i),h(b(285),i),h(b(533),i),h(b(287),i),h(b(132),i),h(b(837),i),h(b(598),i),h(b(369),i),h(b(37),i),h(b(47),i),h(b(923),i),h(b(876),i)},287:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},132:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},837:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},598:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},37:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},369:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},47:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},923:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},876:function(j,i){Object.defineProperty(i,"__esModule",{value:!0})},799:function(j,i){Object.defineProperty(i,"__esModule",{value:!0}),i.parseCustomProperties=i.diff=i.cloneObject=i.existsInArray=i.dispatchEvent=i.sortByScore=i.sortByAlpha=i.strToEl=i.sanitise=i.isScrolledIntoView=i.getAdjacentEl=i.wrap=i.isType=i.getType=i.generateId=i.generateChars=i.getRandomNumber=void 0;var b=function(E,w){return Math.floor(Math.random()*(w-E)+E)};i.getRandomNumber=b;var _=function(E){return Array.from({length:E},function(){return(0,i.getRandomNumber)(0,36).toString(36)}).join("")};i.generateChars=_;var h=function(E,w){var N=E.id||E.name&&"".concat(E.name,"-").concat((0,i.generateChars)(2))||(0,i.generateChars)(4);return N=N.replace(/(:|\.|\[|\]|,)/g,""),N="".concat(w,"-").concat(N),N};i.generateId=h;var d=function(E){return Object.prototype.toString.call(E).slice(8,-1)};i.getType=d;var a=function(E,w){return w!=null&&(0,i.getType)(w)===E};i.isType=a;var r=function(E,w){return w===void 0&&(w=document.createElement("div")),E.parentNode&&(E.nextSibling?E.parentNode.insertBefore(w,E.nextSibling):E.parentNode.appendChild(w)),w.appendChild(E)};i.wrap=r;var c=function(E,w,N){N===void 0&&(N=1);for(var g="".concat(N>0?"next":"previous","ElementSibling"),e=E[g];e;){if(e.matches(w))return e;e=e[g]}return e};i.getAdjacentEl=c;var l=function(E,w,N){if(N===void 0&&(N=1),!E)return!1;var g;return N>0?g=w.scrollTop+w.offsetHeight>=E.offsetTop+E.offsetHeight:g=E.offsetTop>=w.scrollTop,g};i.isScrolledIntoView=l;var O=function(E){return typeof E!="string"?E:E.replace(/&/g,"&").replace(/>/g,">").replace(/-1?h.map(function(y){var D=y;return D.id===parseInt("".concat(c.choiceId),10)&&(D.selected=!0),D}):h}case"REMOVE_ITEM":{var l=d;return l.choiceId&&l.choiceId>-1?h.map(function(y){var D=y;return D.id===parseInt("".concat(l.choiceId),10)&&(D.selected=!1),D}):h}case"FILTER_CHOICES":{var O=d;return h.map(function(y){var D=y;return D.active=O.results.some(function(k){var Q=k.item,Z=k.score;return Q.id===D.id?(D.score=Z,!0):!1}),D})}case"ACTIVATE_CHOICES":{var L=d;return h.map(function(y){var D=y;return D.active=L.active,D})}case"CLEAR_CHOICES":return i.defaultState;default:return h}}i.default=_},871:function(j,i){var b=this&&this.__spreadArray||function(h,d,a){if(a||arguments.length===2)for(var r=0,c=d.length,l;r0?"treeitem":"option"),Object.assign(t.dataset,{choice:"",id:Q,value:Z,selectText:d}),N?(t.classList.add(D),t.dataset.choiceDisabled="",t.setAttribute("aria-disabled","true")):(t.classList.add(L),t.dataset.choiceSelectable=""),t},input:function(_,h){var d=_.classNames,a=d.input,r=d.inputCloned,c=Object.assign(document.createElement("input"),{type:"search",name:"search_terms",className:"".concat(a," ").concat(r),autocomplete:"off",autocapitalize:"off",spellcheck:!1});return c.setAttribute("role","textbox"),c.setAttribute("aria-autocomplete","list"),c.setAttribute("aria-label",h),c},dropdown:function(_){var h=_.classNames,d=h.list,a=h.listDropdown,r=document.createElement("div");return r.classList.add(d,a),r.setAttribute("aria-expanded","false"),r},notice:function(_,h,d){var a,r=_.allowHTML,c=_.classNames,l=c.item,O=c.itemChoice,L=c.noResults,y=c.noChoices;d===void 0&&(d="");var D=[l,O];return d==="no-choices"?D.push(y):d==="no-results"&&D.push(L),Object.assign(document.createElement("div"),(a={},a[r?"innerHTML":"innerText"]=h,a.className=D.join(" "),a))},option:function(_){var h=_.label,d=_.value,a=_.customProperties,r=_.active,c=_.disabled,l=new Option(h,d,!1,r);return a&&(l.dataset.customProperties="".concat(a)),l.disabled=!!c,l}};i.default=b},996:function(j){var i=function(w){return b(w)&&!_(w)};function b(E){return!!E&&typeof E=="object"}function _(E){var w=Object.prototype.toString.call(E);return w==="[object RegExp]"||w==="[object Date]"||a(E)}var h=typeof Symbol=="function"&&Symbol.for,d=h?Symbol.for("react.element"):60103;function a(E){return E.$$typeof===d}function r(E){return Array.isArray(E)?[]:{}}function c(E,w){return w.clone!==!1&&w.isMergeableObject(E)?Z(r(E),E,w):E}function l(E,w,N){return E.concat(w).map(function(g){return c(g,N)})}function O(E,w){if(!w.customMerge)return Z;var N=w.customMerge(E);return typeof N=="function"?N:Z}function L(E){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(E).filter(function(w){return E.propertyIsEnumerable(w)}):[]}function y(E){return Object.keys(E).concat(L(E))}function D(E,w){try{return w in E}catch{return!1}}function k(E,w){return D(E,w)&&!(Object.hasOwnProperty.call(E,w)&&Object.propertyIsEnumerable.call(E,w))}function Q(E,w,N){var g={};return N.isMergeableObject(E)&&y(E).forEach(function(e){g[e]=c(E[e],N)}),y(w).forEach(function(e){k(E,e)||(D(E,e)&&N.isMergeableObject(w[e])?g[e]=O(e,N)(E[e],w[e],N):g[e]=c(w[e],N))}),g}function Z(E,w,N){N=N||{},N.arrayMerge=N.arrayMerge||l,N.isMergeableObject=N.isMergeableObject||i,N.cloneUnlessOtherwiseSpecified=c;var g=Array.isArray(w),e=Array.isArray(E),t=g===e;return t?g?N.arrayMerge(E,w,N):Q(E,w,N):c(w,N)}Z.all=function(w,N){if(!Array.isArray(w))throw new Error("first argument should be an array");return w.reduce(function(g,e){return Z(g,e,N)},{})};var ne=Z;j.exports=ne},221:function(j,i,b){b.r(i),b.d(i,{default:function(){return Se}});function _(p){return Array.isArray?Array.isArray(p):k(p)==="[object Array]"}let h=1/0;function d(p){if(typeof p=="string")return p;let o=p+"";return o=="0"&&1/p==-h?"-0":o}function a(p){return p==null?"":d(p)}function r(p){return typeof p=="string"}function c(p){return typeof p=="number"}function l(p){return p===!0||p===!1||L(p)&&k(p)=="[object Boolean]"}function O(p){return typeof p=="object"}function L(p){return O(p)&&p!==null}function y(p){return p!=null}function D(p){return!p.trim().length}function k(p){return p==null?p===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(p)}let Q="Extended search is not available",Z="Incorrect 'index' type",ne=p=>`Invalid value for key ${p}`,E=p=>`Pattern length exceeds max of ${p}.`,w=p=>`Missing ${p} property in key`,N=p=>`Property 'weight' in key '${p}' must be a positive integer`,g=Object.prototype.hasOwnProperty;class e{constructor(o){this._keys=[],this._keyMap={};let m=0;o.forEach(S=>{let I=t(S);m+=I.weight,this._keys.push(I),this._keyMap[I.id]=I,m+=I.weight}),this._keys.forEach(S=>{S.weight/=m})}get(o){return this._keyMap[o]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function t(p){let o=null,m=null,S=null,I=1,T=null;if(r(p)||_(p))S=p,o=n(p),m=s(p);else{if(!g.call(p,"name"))throw new Error(w("name"));let A=p.name;if(S=A,g.call(p,"weight")&&(I=p.weight,I<=0))throw new Error(N(A));o=n(A),m=s(A),T=p.getFn}return{path:o,id:m,weight:I,src:S,getFn:T}}function n(p){return _(p)?p:p.split(".")}function s(p){return _(p)?p.join("."):p}function v(p,o){let m=[],S=!1,I=(T,A,R)=>{if(y(T))if(!A[R])m.push(T);else{let F=A[R],H=T[F];if(!y(H))return;if(R===A.length-1&&(r(H)||c(H)||l(H)))m.push(a(H));else if(_(H)){S=!0;for(let B=0,x=H.length;Bp.score===o.score?p.idx{this._keysMap[m.id]=S})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,r(this.docs[0])?this.docs.forEach((o,m)=>{this._addString(o,m)}):this.docs.forEach((o,m)=>{this._addObject(o,m)}),this.norm.clear())}add(o){let m=this.size();r(o)?this._addString(o,m):this._addObject(o,m)}removeAt(o){this.records.splice(o,1);for(let m=o,S=this.size();m{let A=I.getFn?I.getFn(o):this.getFn(o,I.path);if(y(A)){if(_(A)){let R=[],F=[{nestedArrIndex:-1,value:A}];for(;F.length;){let{nestedArrIndex:H,value:B}=F.pop();if(y(B))if(r(B)&&!D(B)){let x={v:B,i:H,n:this.norm.get(B)};R.push(x)}else _(B)&&B.forEach((x,G)=>{F.push({nestedArrIndex:G,value:x})})}S.$[T]=R}else if(r(A)&&!D(A)){let R={v:A,n:this.norm.get(A)};S.$[T]=R}}}),this.records.push(S)}toJSON(){return{keys:this.keys,records:this.records}}}function U(p,o,{getFn:m=u.getFn,fieldNormWeight:S=u.fieldNormWeight}={}){let I=new V({getFn:m,fieldNormWeight:S});return I.setKeys(p.map(t)),I.setSources(o),I.create(),I}function $(p,{getFn:o=u.getFn,fieldNormWeight:m=u.fieldNormWeight}={}){let{keys:S,records:I}=p,T=new V({getFn:o,fieldNormWeight:m});return T.setKeys(S),T.setIndexRecords(I),T}function W(p,{errors:o=0,currentLocation:m=0,expectedLocation:S=0,distance:I=u.distance,ignoreLocation:T=u.ignoreLocation}={}){let A=o/p.length;if(T)return A;let R=Math.abs(S-m);return I?A+R/I:R?1:A}function J(p=[],o=u.minMatchCharLength){let m=[],S=-1,I=-1,T=0;for(let A=p.length;T=o&&m.push([S,I]),S=-1)}return p[T-1]&&T-S>=o&&m.push([S,T-1]),m}let z=32;function ee(p,o,m,{location:S=u.location,distance:I=u.distance,threshold:T=u.threshold,findAllMatches:A=u.findAllMatches,minMatchCharLength:R=u.minMatchCharLength,includeMatches:F=u.includeMatches,ignoreLocation:H=u.ignoreLocation}={}){if(o.length>z)throw new Error(E(z));let B=o.length,x=p.length,G=Math.max(0,Math.min(S,x)),q=T,re=G,ue=R>1||F,Ee=ue?Array(x):[],ve;for(;(ve=p.indexOf(o,re))>-1;){let he=W(o,{currentLocation:ve,expectedLocation:G,distance:I,ignoreLocation:H});if(q=Math.min(he,q),re=ve+B,ue){let ge=0;for(;ge=Ue;fe-=1){let Le=fe-1,We=m[p.charAt(Le)];if(ue&&(Ee[Le]=+!!We),Oe[fe]=(Oe[fe+1]<<1|1)&We,he&&(Oe[fe]|=(Ie[fe+1]|Ie[fe])<<1|1|Ie[fe+1]),Oe[fe]&at&&(be=W(o,{errors:he,currentLocation:Le,expectedLocation:G,distance:I,ignoreLocation:H}),be<=q)){if(q=be,re=Le,re<=G)break;Ue=Math.max(1,2*G-re)}}if(W(o,{errors:he+1,currentLocation:G,expectedLocation:G,distance:I,ignoreLocation:H})>q)break;Ie=Oe}let Ke={isMatch:re>=0,score:Math.max(.001,be)};if(ue){let he=J(Ee,R);he.length?F&&(Ke.indices=he):Ke.isMatch=!1}return Ke}function ae(p){let o={};for(let m=0,S=p.length;m{this.chunks.push({pattern:G,alphabet:ae(G),startIndex:q})},x=this.pattern.length;if(x>z){let G=0,q=x%z,re=x-q;for(;G{let{isMatch:ve,score:Ie,indices:be}=ee(o,re,ue,{location:I+Ee,distance:T,threshold:A,findAllMatches:R,minMatchCharLength:F,includeMatches:S,ignoreLocation:H});ve&&(G=!0),x+=Ie,ve&&be&&(B=[...B,...be])});let q={isMatch:G,score:G?x/this.chunks.length:1};return G&&S&&(q.indices=B),q}}class le{constructor(o){this.pattern=o}static isMultiMatch(o){return _e(o,this.multiRegex)}static isSingleMatch(o){return _e(o,this.singleRegex)}search(){}}function _e(p,o){let m=p.match(o);return m?m[1]:null}class te extends le{constructor(o){super(o)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(o){let m=o===this.pattern;return{isMatch:m,score:m?0:1,indices:[0,this.pattern.length-1]}}}class de extends le{constructor(o){super(o)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(o){let S=o.indexOf(this.pattern)===-1;return{isMatch:S,score:S?0:1,indices:[0,o.length-1]}}}class pe extends le{constructor(o){super(o)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(o){let m=o.startsWith(this.pattern);return{isMatch:m,score:m?0:1,indices:[0,this.pattern.length-1]}}}class oe extends le{constructor(o){super(o)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(o){let m=!o.startsWith(this.pattern);return{isMatch:m,score:m?0:1,indices:[0,o.length-1]}}}class Te extends le{constructor(o){super(o)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(o){let m=o.endsWith(this.pattern);return{isMatch:m,score:m?0:1,indices:[o.length-this.pattern.length,o.length-1]}}}class Pe extends le{constructor(o){super(o)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(o){let m=!o.endsWith(this.pattern);return{isMatch:m,score:m?0:1,indices:[0,o.length-1]}}}class He extends le{constructor(o,{location:m=u.location,threshold:S=u.threshold,distance:I=u.distance,includeMatches:T=u.includeMatches,findAllMatches:A=u.findAllMatches,minMatchCharLength:R=u.minMatchCharLength,isCaseSensitive:F=u.isCaseSensitive,ignoreLocation:H=u.ignoreLocation}={}){super(o),this._bitapSearch=new ce(o,{location:m,threshold:S,distance:I,includeMatches:T,findAllMatches:A,minMatchCharLength:R,isCaseSensitive:F,ignoreLocation:H})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(o){return this._bitapSearch.searchIn(o)}}class Be extends le{constructor(o){super(o)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(o){let m=0,S,I=[],T=this.pattern.length;for(;(S=o.indexOf(this.pattern,m))>-1;)m=S+T,I.push([S,m-1]);let A=!!I.length;return{isMatch:A,score:A?0:1,indices:I}}}let Me=[te,Be,pe,oe,Pe,Te,de,He],Ve=Me.length,Xe=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,Je="|";function Qe(p,o={}){return p.split(Je).map(m=>{let S=m.trim().split(Xe).filter(T=>T&&!!T.trim()),I=[];for(let T=0,A=S.length;T!!(p[Ce.AND]||p[Ce.OR]),tt=p=>!!p[je.PATH],it=p=>!_(p)&&O(p)&&!Re(p),ke=p=>({[Ce.AND]:Object.keys(p).map(o=>({[o]:p[o]}))});function xe(p,o,{auto:m=!0}={}){let S=I=>{let T=Object.keys(I),A=tt(I);if(!A&&T.length>1&&!Re(I))return S(ke(I));if(it(I)){let F=A?I[je.PATH]:T[0],H=A?I[je.PATTERN]:I[F];if(!r(H))throw new Error(ne(F));let B={keyId:s(F),pattern:H};return m&&(B.searcher=Ne(H,o)),B}let R={children:[],operator:T[0]};return T.forEach(F=>{let H=I[F];_(H)&&H.forEach(B=>{R.children.push(S(B))})}),R};return Re(p)||(p=ke(p)),S(p)}function nt(p,{ignoreFieldNorm:o=u.ignoreFieldNorm}){p.forEach(m=>{let S=1;m.matches.forEach(({key:I,norm:T,score:A})=>{let R=I?I.weight:null;S*=Math.pow(A===0&&R?Number.EPSILON:A,(R||1)*(o?1:T))}),m.score=S})}function rt(p,o){let m=p.matches;o.matches=[],y(m)&&m.forEach(S=>{if(!y(S.indices)||!S.indices.length)return;let{indices:I,value:T}=S,A={indices:I,value:T};S.key&&(A.key=S.key.src),S.idx>-1&&(A.refIndex=S.idx),o.matches.push(A)})}function st(p,o){o.score=p.score}function ot(p,o,{includeMatches:m=u.includeMatches,includeScore:S=u.includeScore}={}){let I=[];return m&&I.push(rt),S&&I.push(st),p.map(T=>{let{idx:A}=T,R={item:o[A],refIndex:A};return I.length&&I.forEach(F=>{F(T,R)}),R})}class Se{constructor(o,m={},S){this.options={...u,...m},this.options.useExtendedSearch,this._keyStore=new e(this.options.keys),this.setCollection(o,S)}setCollection(o,m){if(this._docs=o,m&&!(m instanceof V))throw new Error(Z);this._myIndex=m||U(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(o){y(o)&&(this._docs.push(o),this._myIndex.add(o))}remove(o=()=>!1){let m=[];for(let S=0,I=this._docs.length;S-1&&(F=F.slice(0,m)),ot(F,this._docs,{includeMatches:S,includeScore:I})}_searchStringList(o){let m=Ne(o,this.options),{records:S}=this._myIndex,I=[];return S.forEach(({v:T,i:A,n:R})=>{if(!y(T))return;let{isMatch:F,score:H,indices:B}=m.searchIn(T);F&&I.push({item:T,idx:A,matches:[{score:H,value:T,norm:R,indices:B}]})}),I}_searchLogical(o){let m=xe(o,this.options),S=(R,F,H)=>{if(!R.children){let{keyId:x,searcher:G}=R,q=this._findMatches({key:this._keyStore.get(x),value:this._myIndex.getValueForItemAtKeyId(F,x),searcher:G});return q&&q.length?[{idx:H,item:F,matches:q}]:[]}let B=[];for(let x=0,G=R.children.length;x{if(y(R)){let H=S(m,R,F);H.length&&(T[F]||(T[F]={idx:F,item:R,matches:[]},A.push(T[F])),H.forEach(({matches:B})=>{T[F].matches.push(...B)}))}}),A}_searchObjectList(o){let m=Ne(o,this.options),{keys:S,records:I}=this._myIndex,T=[];return I.forEach(({$:A,i:R})=>{if(!y(A))return;let F=[];S.forEach((H,B)=>{F.push(...this._findMatches({key:H,value:A[B],searcher:m}))}),F.length&&T.push({idx:R,item:A,matches:F})}),T}_findMatches({key:o,value:m,searcher:S}){if(!y(m))return[];let I=[];if(_(m))m.forEach(({v:T,i:A,n:R})=>{if(!y(T))return;let{isMatch:F,score:H,indices:B}=S.searchIn(T);F&&I.push({score:H,key:o,value:T,idx:A,norm:R,indices:B})});else{let{v:T,n:A}=m,{isMatch:R,score:F,indices:H}=S.searchIn(T);R&&I.push({score:F,key:o,value:T,norm:A,indices:H})}return I}}Se.version="6.6.2",Se.createIndex=U,Se.parseIndex=$,Se.config=u,Se.parseQuery=xe,et(qe)},791:function(j,i,b){b.r(i),b.d(i,{__DO_NOT_USE__ActionTypes:function(){return y},applyMiddleware:function(){return M},bindActionCreators:function(){return v},combineReducers:function(){return n},compose:function(){return P},createStore:function(){return w},legacy_createStore:function(){return N}});function _(f){"@babel/helpers - typeof";return _=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(u){return typeof u}:function(u){return u&&typeof Symbol=="function"&&u.constructor===Symbol&&u!==Symbol.prototype?"symbol":typeof u},_(f)}function h(f,u){if(_(f)!=="object"||f===null)return f;var C=f[Symbol.toPrimitive];if(C!==void 0){var Y=C.call(f,u||"default");if(_(Y)!=="object")return Y;throw new TypeError("@@toPrimitive must return a primitive value.")}return(u==="string"?String:Number)(f)}function d(f){var u=h(f,"string");return _(u)==="symbol"?u:String(u)}function a(f,u,C){return u=d(u),u in f?Object.defineProperty(f,u,{value:C,enumerable:!0,configurable:!0,writable:!0}):f[u]=C,f}function r(f,u){var C=Object.keys(f);if(Object.getOwnPropertySymbols){var Y=Object.getOwnPropertySymbols(f);u&&(Y=Y.filter(function(V){return Object.getOwnPropertyDescriptor(f,V).enumerable})),C.push.apply(C,Y)}return C}function c(f){for(var u=1;u"u"&&(C=u,u=void 0),typeof C<"u"){if(typeof C!="function")throw new Error(l(1));return C(w)(f,u)}if(typeof f!="function")throw new Error(l(2));var V=f,U=u,$=[],W=$,J=!1;function z(){W===$&&(W=$.slice())}function ee(){if(J)throw new Error(l(3));return U}function ae(te){if(typeof te!="function")throw new Error(l(4));if(J)throw new Error(l(5));var de=!0;return z(),W.push(te),function(){if(de){if(J)throw new Error(l(6));de=!1,z();var oe=W.indexOf(te);W.splice(oe,1),$=null}}}function ce(te){if(!D(te))throw new Error(l(7));if(typeof te.type>"u")throw new Error(l(8));if(J)throw new Error(l(9));try{J=!0,U=V(U,te)}finally{J=!1}for(var de=$=W,pe=0;pe0)return"Unexpected "+($.length>1?"keys":"key")+" "+('"'+$.join('", "')+'" found in '+U+". ")+"Expected to find one of the known reducer keys instead: "+('"'+V.join('", "')+'". Unexpected keys will be ignored.')}function t(f){Object.keys(f).forEach(function(u){var C=f[u],Y=C(void 0,{type:y.INIT});if(typeof Y>"u")throw new Error(l(12));if(typeof C(void 0,{type:y.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(l(13))})}function n(f){for(var u=Object.keys(f),C={},Y=0;Y"u"){var Te=ee&&ee.type;throw new Error(l(14))}le[te]=oe,ce=ce||oe!==pe}return ce=ce||U.length!==Object.keys(z).length,ce?le:z}}function s(f,u){return function(){return u(f.apply(this,arguments))}}function v(f,u){if(typeof f=="function")return s(f,u);if(typeof f!="object"||f===null)throw new Error(l(16));var C={};for(var Y in f){var V=f[Y];typeof V=="function"&&(C[Y]=s(V,u))}return C}function P(){for(var f=arguments.length,u=new Array(f),C=0;Cwindow.pluralize(O,e,{count:e}),noChoicesText:E,noResultsText:L,placeholderValue:k,position:Q??"auto",removeItemButton:se,renderChoiceLimit:D,searchEnabled:h,searchFields:w??["label"],searchPlaceholderValue:E,searchResultLimit:D,shouldSort:!1,searchFloor:a?0:1}),await this.refreshChoices({withInitialOptions:!0}),[null,void 0,""].includes(this.state)||this.select.setChoiceByValue(this.formatState(this.state)),this.refreshPlaceholder(),b&&this.select.showDropdown(),this.$refs.input.addEventListener("change",()=>{this.refreshPlaceholder(),!this.isStateBeingUpdated&&(this.isStateBeingUpdated=!0,this.state=this.select.getValue(!0)??null,this.$nextTick(()=>this.isStateBeingUpdated=!1))}),d&&this.$refs.input.addEventListener("showDropdown",async()=>{this.select.clearChoices(),await this.select.setChoices([{label:c,value:"",disabled:!0}]),await this.refreshChoices()}),a&&(this.$refs.input.addEventListener("search",async e=>{let t=e.detail.value?.trim();this.isSearching=!0,this.select.clearChoices(),await this.select.setChoices([{label:[null,void 0,""].includes(t)?c:ne,value:"",disabled:!0}])}),this.$refs.input.addEventListener("search",Alpine.debounce(async e=>{await this.refreshChoices({search:e.detail.value?.trim()}),this.isSearching=!1},Z))),_||window.addEventListener("filament-forms::select.refreshSelectedOptionLabel",async e=>{e.detail.livewireId===r&&e.detail.statePath===g&&await this.refreshChoices({withInitialOptions:!1})}),this.$watch("state",async()=>{this.select&&(this.refreshPlaceholder(),!this.isStateBeingUpdated&&await this.refreshChoices({withInitialOptions:!d}))})},destroy:function(){this.select.destroy(),this.select=null},refreshChoices:async function(e={}){let t=await this.getChoices(e);this.select&&(this.select.clearStore(),this.refreshPlaceholder(),this.setChoices(t),[null,void 0,""].includes(this.state)||this.select.setChoiceByValue(this.formatState(this.state)))},setChoices:function(e){this.select.setChoices(e,"value","label",!0)},getChoices:async function(e={}){let t=await this.getExistingOptions(e);return t.concat(await this.getMissingOptions(t))},getExistingOptions:async function({search:e,withInitialOptions:t}){if(t)return y;let n=[];return e!==""&&e!==null&&e!==void 0?n=await i(e):n=await j(),n.map(s=>s.choices?(s.choices=s.choices.map(v=>(v.selected=Array.isArray(this.state)?this.state.includes(v.value):this.state===v.value,v)),s):(s.selected=Array.isArray(this.state)?this.state.includes(s.value):this.state===s.value,s))},refreshPlaceholder:function(){_||(this.select._renderItems(),[null,void 0,""].includes(this.state)&&(this.$el.querySelector(".choices__list--single").innerHTML=`
${k??""}
`))},formatState:function(e){return _?(e??[]).map(t=>t?.toString()):e?.toString()},getMissingOptions:async function(e){let t=this.formatState(this.state);if([null,void 0,"",[],{}].includes(t))return{};let n=new Set;return e.forEach(s=>{if(s.choices){s.choices.forEach(v=>n.add(v.value));return}n.add(s.value)}),_?t.every(s=>n.has(s))?{}:(await me()).filter(s=>!n.has(s.value)).map(s=>(s.selected=!0,s)):n.has(t)?n:[{label:await X(),value:t,selected:!0}]}}}export{vt as default}; +var Ft=Math.min,vt=Math.max,Ht=Math.round;var st=n=>({x:n,y:n}),ji={left:"right",right:"left",bottom:"top",top:"bottom"},qi={start:"end",end:"start"};function De(n,t,e){return vt(n,Ft(t,e))}function Vt(n,t){return typeof n=="function"?n(t):n}function yt(n){return n.split("-")[0]}function Wt(n){return n.split("-")[1]}function Ae(n){return n==="x"?"y":"x"}function Ce(n){return n==="y"?"height":"width"}var Ji=new Set(["top","bottom"]);function ht(n){return Ji.has(yt(n))?"y":"x"}function Le(n){return Ae(ht(n))}function Je(n,t,e){e===void 0&&(e=!1);let i=Wt(n),o=Le(n),s=Ce(o),r=o==="x"?i===(e?"end":"start")?"right":"left":i==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(r=Bt(r)),[r,Bt(r)]}function Qe(n){let t=Bt(n);return[ie(n),t,ie(t)]}function ie(n){return n.replace(/start|end/g,t=>qi[t])}var je=["left","right"],qe=["right","left"],Qi=["top","bottom"],Zi=["bottom","top"];function tn(n,t,e){switch(n){case"top":case"bottom":return e?t?qe:je:t?je:qe;case"left":case"right":return t?Qi:Zi;default:return[]}}function Ze(n,t,e,i){let o=Wt(n),s=tn(yt(n),e==="start",i);return o&&(s=s.map(r=>r+"-"+o),t&&(s=s.concat(s.map(ie)))),s}function Bt(n){return n.replace(/left|right|bottom|top/g,t=>ji[t])}function en(n){return{top:0,right:0,bottom:0,left:0,...n}}function ti(n){return typeof n!="number"?en(n):{top:n,right:n,bottom:n,left:n}}function Et(n){let{x:t,y:e,width:i,height:o}=n;return{width:i,height:o,top:e,left:t,right:t+i,bottom:e+o,x:t,y:e}}function ei(n,t,e){let{reference:i,floating:o}=n,s=ht(t),r=Le(t),a=Ce(r),l=yt(t),c=s==="y",f=i.x+i.width/2-o.width/2,d=i.y+i.height/2-o.height/2,p=i[a]/2-o[a]/2,u;switch(l){case"top":u={x:f,y:i.y-o.height};break;case"bottom":u={x:f,y:i.y+i.height};break;case"right":u={x:i.x+i.width,y:d};break;case"left":u={x:i.x-o.width,y:d};break;default:u={x:i.x,y:i.y}}switch(Wt(t)){case"start":u[r]-=p*(e&&c?-1:1);break;case"end":u[r]+=p*(e&&c?-1:1);break}return u}var ii=async(n,t,e)=>{let{placement:i="bottom",strategy:o="absolute",middleware:s=[],platform:r}=e,a=s.filter(Boolean),l=await(r.isRTL==null?void 0:r.isRTL(t)),c=await r.getElementRects({reference:n,floating:t,strategy:o}),{x:f,y:d}=ei(c,i,l),p=i,u={},g=0;for(let m=0;mk<=0)){var W,tt;let k=(((W=s.flip)==null?void 0:W.index)||0)+1,Y=q[k];if(Y&&(!(d==="alignment"?w!==ht(Y):!1)||V.every(L=>ht(L.placement)===w?L.overflows[0]>0:!0)))return{data:{index:k,overflows:V},reset:{placement:Y}};let B=(tt=V.filter(X=>X.overflows[0]<=0).sort((X,L)=>X.overflows[1]-L.overflows[1])[0])==null?void 0:tt.placement;if(!B)switch(u){case"bestFit":{var z;let X=(z=V.filter(L=>{if(F){let et=ht(L.placement);return et===w||et==="y"}return!0}).map(L=>[L.placement,L.overflows.filter(et=>et>0).reduce((et,ee)=>et+ee,0)]).sort((L,et)=>L[1]-et[1])[0])==null?void 0:z[0];X&&(B=X);break}case"initialPlacement":B=a;break}if(o!==B)return{reset:{placement:B}}}return{}}}};var nn=new Set(["left","top"]);async function on(n,t){let{placement:e,platform:i,elements:o}=n,s=await(i.isRTL==null?void 0:i.isRTL(o.floating)),r=yt(e),a=Wt(e),l=ht(e)==="y",c=nn.has(r)?-1:1,f=s&&l?-1:1,d=Vt(t,n),{mainAxis:p,crossAxis:u,alignmentAxis:g}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return a&&typeof g=="number"&&(u=a==="end"?g*-1:g),l?{x:u*f,y:p*c}:{x:p*c,y:u*f}}var oi=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(t){var e,i;let{x:o,y:s,placement:r,middlewareData:a}=t,l=await on(t,n);return r===((e=a.offset)==null?void 0:e.placement)&&(i=a.arrow)!=null&&i.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:r}}}}},si=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(t){let{x:e,y:i,placement:o}=t,{mainAxis:s=!0,crossAxis:r=!1,limiter:a={fn:S=>{let{x:O,y:w}=S;return{x:O,y:w}}},...l}=Vt(n,t),c={x:e,y:i},f=await Ie(t,l),d=ht(yt(o)),p=Ae(d),u=c[p],g=c[d];if(s){let S=p==="y"?"top":"left",O=p==="y"?"bottom":"right",w=u+f[S],D=u-f[O];u=De(w,u,D)}if(r){let S=d==="y"?"top":"left",O=d==="y"?"bottom":"right",w=g+f[S],D=g-f[O];g=De(w,g,D)}let m=a.fn({...t,[p]:u,[d]:g});return{...m,data:{x:m.x-e,y:m.y-i,enabled:{[p]:s,[d]:r}}}}}};function oe(){return typeof window<"u"}function Ot(n){return ai(n)?(n.nodeName||"").toLowerCase():"#document"}function U(n){var t;return(n==null||(t=n.ownerDocument)==null?void 0:t.defaultView)||window}function ct(n){var t;return(t=(ai(n)?n.ownerDocument:n.document)||window.document)==null?void 0:t.documentElement}function ai(n){return oe()?n instanceof Node||n instanceof U(n).Node:!1}function it(n){return oe()?n instanceof Element||n instanceof U(n).Element:!1}function rt(n){return oe()?n instanceof HTMLElement||n instanceof U(n).HTMLElement:!1}function ri(n){return!oe()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof U(n).ShadowRoot}var sn=new Set(["inline","contents"]);function It(n){let{overflow:t,overflowX:e,overflowY:i,display:o}=nt(n);return/auto|scroll|overlay|hidden|clip/.test(t+i+e)&&!sn.has(o)}var rn=new Set(["table","td","th"]);function li(n){return rn.has(Ot(n))}var an=[":popover-open",":modal"];function zt(n){return an.some(t=>{try{return n.matches(t)}catch{return!1}})}var ln=["transform","translate","scale","rotate","perspective"],cn=["transform","translate","scale","rotate","perspective","filter"],dn=["paint","layout","strict","content"];function se(n){let t=re(),e=it(n)?nt(n):n;return ln.some(i=>e[i]?e[i]!=="none":!1)||(e.containerType?e.containerType!=="normal":!1)||!t&&(e.backdropFilter?e.backdropFilter!=="none":!1)||!t&&(e.filter?e.filter!=="none":!1)||cn.some(i=>(e.willChange||"").includes(i))||dn.some(i=>(e.contain||"").includes(i))}function ci(n){let t=ut(n);for(;rt(t)&&!Dt(t);){if(se(t))return t;if(zt(t))return null;t=ut(t)}return null}function re(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var fn=new Set(["html","body","#document"]);function Dt(n){return fn.has(Ot(n))}function nt(n){return U(n).getComputedStyle(n)}function Xt(n){return it(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function ut(n){if(Ot(n)==="html")return n;let t=n.assignedSlot||n.parentNode||ri(n)&&n.host||ct(n);return ri(t)?t.host:t}function di(n){let t=ut(n);return Dt(t)?n.ownerDocument?n.ownerDocument.body:n.body:rt(t)&&It(t)?t:di(t)}function ne(n,t,e){var i;t===void 0&&(t=[]),e===void 0&&(e=!0);let o=di(n),s=o===((i=n.ownerDocument)==null?void 0:i.body),r=U(o);if(s){let a=ae(r);return t.concat(r,r.visualViewport||[],It(o)?o:[],a&&e?ne(a):[])}return t.concat(o,ne(o,[],e))}function ae(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function pi(n){let t=nt(n),e=parseFloat(t.width)||0,i=parseFloat(t.height)||0,o=rt(n),s=o?n.offsetWidth:e,r=o?n.offsetHeight:i,a=Ht(e)!==s||Ht(i)!==r;return a&&(e=s,i=r),{width:e,height:i,$:a}}function gi(n){return it(n)?n:n.contextElement}function Tt(n){let t=gi(n);if(!rt(t))return st(1);let e=t.getBoundingClientRect(),{width:i,height:o,$:s}=pi(t),r=(s?Ht(e.width):e.width)/i,a=(s?Ht(e.height):e.height)/o;return(!r||!Number.isFinite(r))&&(r=1),(!a||!Number.isFinite(a))&&(a=1),{x:r,y:a}}var hn=st(0);function mi(n){let t=U(n);return!re()||!t.visualViewport?hn:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function un(n,t,e){return t===void 0&&(t=!1),!e||t&&e!==U(n)?!1:t}function $t(n,t,e,i){t===void 0&&(t=!1),e===void 0&&(e=!1);let o=n.getBoundingClientRect(),s=gi(n),r=st(1);t&&(i?it(i)&&(r=Tt(i)):r=Tt(n));let a=un(s,e,i)?mi(s):st(0),l=(o.left+a.x)/r.x,c=(o.top+a.y)/r.y,f=o.width/r.x,d=o.height/r.y;if(s){let p=U(s),u=i&&it(i)?U(i):i,g=p,m=ae(g);for(;m&&i&&u!==g;){let S=Tt(m),O=m.getBoundingClientRect(),w=nt(m),D=O.left+(m.clientLeft+parseFloat(w.paddingLeft))*S.x,A=O.top+(m.clientTop+parseFloat(w.paddingTop))*S.y;l*=S.x,c*=S.y,f*=S.x,d*=S.y,l+=D,c+=A,g=U(m),m=ae(g)}}return Et({width:f,height:d,x:l,y:c})}function le(n,t){let e=Xt(n).scrollLeft;return t?t.left+e:$t(ct(n)).left+e}function bi(n,t){let e=n.getBoundingClientRect(),i=e.left+t.scrollLeft-le(n,e),o=e.top+t.scrollTop;return{x:i,y:o}}function pn(n){let{elements:t,rect:e,offsetParent:i,strategy:o}=n,s=o==="fixed",r=ct(i),a=t?zt(t.floating):!1;if(i===r||a&&s)return e;let l={scrollLeft:0,scrollTop:0},c=st(1),f=st(0),d=rt(i);if((d||!d&&!s)&&((Ot(i)!=="body"||It(r))&&(l=Xt(i)),rt(i))){let u=$t(i);c=Tt(i),f.x=u.x+i.clientLeft,f.y=u.y+i.clientTop}let p=r&&!d&&!s?bi(r,l):st(0);return{width:e.width*c.x,height:e.height*c.y,x:e.x*c.x-l.scrollLeft*c.x+f.x+p.x,y:e.y*c.y-l.scrollTop*c.y+f.y+p.y}}function gn(n){return Array.from(n.getClientRects())}function mn(n){let t=ct(n),e=Xt(n),i=n.ownerDocument.body,o=vt(t.scrollWidth,t.clientWidth,i.scrollWidth,i.clientWidth),s=vt(t.scrollHeight,t.clientHeight,i.scrollHeight,i.clientHeight),r=-e.scrollLeft+le(n),a=-e.scrollTop;return nt(i).direction==="rtl"&&(r+=vt(t.clientWidth,i.clientWidth)-o),{width:o,height:s,x:r,y:a}}var fi=25;function bn(n,t){let e=U(n),i=ct(n),o=e.visualViewport,s=i.clientWidth,r=i.clientHeight,a=0,l=0;if(o){s=o.width,r=o.height;let f=re();(!f||f&&t==="fixed")&&(a=o.offsetLeft,l=o.offsetTop)}let c=le(i);if(c<=0){let f=i.ownerDocument,d=f.body,p=getComputedStyle(d),u=f.compatMode==="CSS1Compat"&&parseFloat(p.marginLeft)+parseFloat(p.marginRight)||0,g=Math.abs(i.clientWidth-d.clientWidth-u);g<=fi&&(s-=g)}else c<=fi&&(s+=c);return{width:s,height:r,x:a,y:l}}var vn=new Set(["absolute","fixed"]);function yn(n,t){let e=$t(n,!0,t==="fixed"),i=e.top+n.clientTop,o=e.left+n.clientLeft,s=rt(n)?Tt(n):st(1),r=n.clientWidth*s.x,a=n.clientHeight*s.y,l=o*s.x,c=i*s.y;return{width:r,height:a,x:l,y:c}}function hi(n,t,e){let i;if(t==="viewport")i=bn(n,e);else if(t==="document")i=mn(ct(n));else if(it(t))i=yn(t,e);else{let o=mi(n);i={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return Et(i)}function vi(n,t){let e=ut(n);return e===t||!it(e)||Dt(e)?!1:nt(e).position==="fixed"||vi(e,t)}function wn(n,t){let e=t.get(n);if(e)return e;let i=ne(n,[],!1).filter(a=>it(a)&&Ot(a)!=="body"),o=null,s=nt(n).position==="fixed",r=s?ut(n):n;for(;it(r)&&!Dt(r);){let a=nt(r),l=se(r);!l&&a.position==="fixed"&&(o=null),(s?!l&&!o:!l&&a.position==="static"&&!!o&&vn.has(o.position)||It(r)&&!l&&vi(n,r))?i=i.filter(f=>f!==r):o=a,r=ut(r)}return t.set(n,i),i}function Sn(n){let{element:t,boundary:e,rootBoundary:i,strategy:o}=n,r=[...e==="clippingAncestors"?zt(t)?[]:wn(t,this._c):[].concat(e),i],a=r[0],l=r.reduce((c,f)=>{let d=hi(t,f,o);return c.top=vt(d.top,c.top),c.right=Ft(d.right,c.right),c.bottom=Ft(d.bottom,c.bottom),c.left=vt(d.left,c.left),c},hi(t,a,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function xn(n){let{width:t,height:e}=pi(n);return{width:t,height:e}}function En(n,t,e){let i=rt(t),o=ct(t),s=e==="fixed",r=$t(n,!0,s,t),a={scrollLeft:0,scrollTop:0},l=st(0);function c(){l.x=le(o)}if(i||!i&&!s)if((Ot(t)!=="body"||It(o))&&(a=Xt(t)),i){let u=$t(t,!0,s,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else o&&c();s&&!i&&o&&c();let f=o&&!i&&!s?bi(o,a):st(0),d=r.left+a.scrollLeft-l.x-f.x,p=r.top+a.scrollTop-l.y-f.y;return{x:d,y:p,width:r.width,height:r.height}}function Te(n){return nt(n).position==="static"}function ui(n,t){if(!rt(n)||nt(n).position==="fixed")return null;if(t)return t(n);let e=n.offsetParent;return ct(n)===e&&(e=e.ownerDocument.body),e}function yi(n,t){let e=U(n);if(zt(n))return e;if(!rt(n)){let o=ut(n);for(;o&&!Dt(o);){if(it(o)&&!Te(o))return o;o=ut(o)}return e}let i=ui(n,t);for(;i&&li(i)&&Te(i);)i=ui(i,t);return i&&Dt(i)&&Te(i)&&!se(i)?e:i||ci(n)||e}var On=async function(n){let t=this.getOffsetParent||yi,e=this.getDimensions,i=await e(n.floating);return{reference:En(n.reference,await t(n.floating),n.strategy),floating:{x:0,y:0,width:i.width,height:i.height}}};function Dn(n){return nt(n).direction==="rtl"}var An={convertOffsetParentRelativeRectToViewportRelativeRect:pn,getDocumentElement:ct,getClippingRect:Sn,getOffsetParent:yi,getElementRects:On,getClientRects:gn,getDimensions:xn,getScale:Tt,isElement:it,isRTL:Dn};var wi=oi;var Si=si,xi=ni;var Ei=(n,t,e)=>{let i=new Map,o={platform:An,...e},s={...o.platform,_c:i};return ii(n,t,{...o,platform:s})};function Oi(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter(function(o){return Object.getOwnPropertyDescriptor(n,o).enumerable})),e.push.apply(e,i)}return e}function ft(n){for(var t=1;t=0)&&(e[o]=n[o]);return e}function In(n,t){if(n==null)return{};var e=Ln(n,t),i,o;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(n);for(o=0;o=0)&&Object.prototype.propertyIsEnumerable.call(n,i)&&(e[i]=n[i])}return e}var Tn="1.15.6";function pt(n){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(n)}var mt=pt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Zt=pt(/Edge/i),Di=pt(/firefox/i),Gt=pt(/safari/i)&&!pt(/chrome/i)&&!pt(/android/i),$e=pt(/iP(ad|od|hone)/i),Mi=pt(/chrome/i)&&pt(/android/i),Pi={capture:!1,passive:!1};function E(n,t,e){n.addEventListener(t,e,!mt&&Pi)}function x(n,t,e){n.removeEventListener(t,e,!mt&&Pi)}function ve(n,t){if(t){if(t[0]===">"&&(t=t.substring(1)),n)try{if(n.matches)return n.matches(t);if(n.msMatchesSelector)return n.msMatchesSelector(t);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(t)}catch{return!1}return!1}}function Ni(n){return n.host&&n!==document&&n.host.nodeType?n.host:n.parentNode}function lt(n,t,e,i){if(n){e=e||document;do{if(t!=null&&(t[0]===">"?n.parentNode===e&&ve(n,t):ve(n,t))||i&&n===e)return n;if(n===e)break}while(n=Ni(n))}return null}var Ai=/\s+/g;function Q(n,t,e){if(n&&t)if(n.classList)n.classList[e?"add":"remove"](t);else{var i=(" "+n.className+" ").replace(Ai," ").replace(" "+t+" "," ");n.className=(i+(e?" "+t:"")).replace(Ai," ")}}function b(n,t,e){var i=n&&n.style;if(i){if(e===void 0)return document.defaultView&&document.defaultView.getComputedStyle?e=document.defaultView.getComputedStyle(n,""):n.currentStyle&&(e=n.currentStyle),t===void 0?e:e[t];!(t in i)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),i[t]=e+(typeof e=="string"?"":"px")}}function Nt(n,t){var e="";if(typeof n=="string")e=n;else do{var i=b(n,"transform");i&&i!=="none"&&(e=i+" "+e)}while(!t&&(n=n.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(e)}function ki(n,t,e){if(n){var i=n.getElementsByTagName(t),o=0,s=i.length;if(e)for(;o=s:r=o<=s,!r)return i;if(i===dt())break;i=xt(i,!1)}return!1}function kt(n,t,e,i){for(var o=0,s=0,r=n.children;s2&&arguments[2]!==void 0?arguments[2]:{},o=i.evt,s=In(i,Fn);te.pluginEvent.bind(v)(t,e,ft({dragEl:h,parentEl:R,ghostEl:y,rootEl:I,nextEl:Lt,lastDownEl:pe,cloneEl:T,cloneHidden:St,dragStarted:Kt,putSortable:H,activeSortable:v.active,originalEvent:o,oldIndex:Pt,oldDraggableIndex:qt,newIndex:Z,newDraggableIndex:wt,hideGhostForTarget:$i,unhideGhostForTarget:Ki,cloneNowHidden:function(){St=!0},cloneNowShown:function(){St=!1},dispatchSortableEvent:function(a){K({sortable:e,name:a,originalEvent:o})}},s))};function K(n){Bn(ft({putSortable:H,cloneEl:T,targetEl:h,rootEl:I,oldIndex:Pt,oldDraggableIndex:qt,newIndex:Z,newDraggableIndex:wt},n))}var h,R,y,I,Lt,pe,T,St,Pt,Z,qt,wt,ce,H,Mt=!1,ye=!1,we=[],At,at,Me,Pe,Ii,Ti,Kt,Rt,Jt,Qt=!1,de=!1,ge,$,Ne=[],Ve=!1,Se=[],Ee=typeof document<"u",fe=$e,_i=Zt||mt?"cssFloat":"float",Hn=Ee&&!Mi&&!$e&&"draggable"in document.createElement("div"),Wi=(function(){if(Ee){if(mt)return!1;var n=document.createElement("x");return n.style.cssText="pointer-events:auto",n.style.pointerEvents==="auto"}})(),zi=function(t,e){var i=b(t),o=parseInt(i.width)-parseInt(i.paddingLeft)-parseInt(i.paddingRight)-parseInt(i.borderLeftWidth)-parseInt(i.borderRightWidth),s=kt(t,0,e),r=kt(t,1,e),a=s&&b(s),l=r&&b(r),c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+N(s).width,f=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+N(r).width;if(i.display==="flex")return i.flexDirection==="column"||i.flexDirection==="column-reverse"?"vertical":"horizontal";if(i.display==="grid")return i.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(s&&a.float&&a.float!=="none"){var d=a.float==="left"?"left":"right";return r&&(l.clear==="both"||l.clear===d)?"vertical":"horizontal"}return s&&(a.display==="block"||a.display==="flex"||a.display==="table"||a.display==="grid"||c>=o&&i[_i]==="none"||r&&i[_i]==="none"&&c+f>o)?"vertical":"horizontal"},Vn=function(t,e,i){var o=i?t.left:t.top,s=i?t.right:t.bottom,r=i?t.width:t.height,a=i?e.left:e.top,l=i?e.right:e.bottom,c=i?e.width:e.height;return o===a||s===l||o+r/2===a+c/2},Wn=function(t,e){var i;return we.some(function(o){var s=o[j].options.emptyInsertThreshold;if(!(!s||Ke(o))){var r=N(o),a=t>=r.left-s&&t<=r.right+s,l=e>=r.top-s&&e<=r.bottom+s;if(a&&l)return i=o}}),i},Xi=function(t){function e(s,r){return function(a,l,c,f){var d=a.options.group.name&&l.options.group.name&&a.options.group.name===l.options.group.name;if(s==null&&(r||d))return!0;if(s==null||s===!1)return!1;if(r&&s==="clone")return s;if(typeof s=="function")return e(s(a,l,c,f),r)(a,l,c,f);var p=(r?a:l).options.group.name;return s===!0||typeof s=="string"&&s===p||s.join&&s.indexOf(p)>-1}}var i={},o=t.group;(!o||ue(o)!="object")&&(o={name:o}),i.name=o.name,i.checkPull=e(o.pull,!0),i.checkPut=e(o.put),i.revertClone=o.revertClone,t.group=i},$i=function(){!Wi&&y&&b(y,"display","none")},Ki=function(){!Wi&&y&&b(y,"display","")};Ee&&!Mi&&document.addEventListener("click",function(n){if(ye)return n.preventDefault(),n.stopPropagation&&n.stopPropagation(),n.stopImmediatePropagation&&n.stopImmediatePropagation(),ye=!1,!1},!0);var Ct=function(t){if(h){t=t.touches?t.touches[0]:t;var e=Wn(t.clientX,t.clientY);if(e){var i={};for(var o in t)t.hasOwnProperty(o)&&(i[o]=t[o]);i.target=i.rootEl=e,i.preventDefault=void 0,i.stopPropagation=void 0,e[j]._onDragOver(i)}}},zn=function(t){h&&h.parentNode[j]._isOutsideThisEl(t.target)};function v(n,t){if(!(n&&n.nodeType&&n.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(n));this.el=n,this.options=t=gt({},t),n[j]=this;var e={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(n.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return zi(n,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(r,a){r.setData("Text",a.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:v.supportPointer!==!1&&"PointerEvent"in window&&(!Gt||$e),emptyInsertThreshold:5};te.initializePlugins(this,n,e);for(var i in e)!(i in t)&&(t[i]=e[i]);Xi(t);for(var o in this)o.charAt(0)==="_"&&typeof this[o]=="function"&&(this[o]=this[o].bind(this));this.nativeDraggable=t.forceFallback?!1:Hn,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?E(n,"pointerdown",this._onTapStart):(E(n,"mousedown",this._onTapStart),E(n,"touchstart",this._onTapStart)),this.nativeDraggable&&(E(n,"dragover",this),E(n,"dragenter",this)),we.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),gt(this,Pn())}v.prototype={constructor:v,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Rt=null)},_getDirection:function(t,e){return typeof this.options.direction=="function"?this.options.direction.call(this,t,e,h):this.options.direction},_onTapStart:function(t){if(t.cancelable){var e=this,i=this.el,o=this.options,s=o.preventOnFilter,r=t.type,a=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,l=(a||t).target,c=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||l,f=o.filter;if(qn(i),!h&&!(/mousedown|pointerdown/.test(r)&&t.button!==0||o.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&Gt&&l&&l.tagName.toUpperCase()==="SELECT")&&(l=lt(l,o.draggable,i,!1),!(l&&l.animated)&&pe!==l)){if(Pt=ot(l),qt=ot(l,o.draggable),typeof f=="function"){if(f.call(this,t,l,this)){K({sortable:e,rootEl:c,name:"filter",targetEl:l,toEl:i,fromEl:i}),G("filter",e,{evt:t}),s&&t.preventDefault();return}}else if(f&&(f=f.split(",").some(function(d){if(d=lt(c,d.trim(),i,!1),d)return K({sortable:e,rootEl:d,name:"filter",targetEl:l,fromEl:i,toEl:i}),G("filter",e,{evt:t}),!0}),f)){s&&t.preventDefault();return}o.handle&&!lt(c,o.handle,i,!1)||this._prepareDragStart(t,a,l)}}},_prepareDragStart:function(t,e,i){var o=this,s=o.el,r=o.options,a=s.ownerDocument,l;if(i&&!h&&i.parentNode===s){var c=N(i);if(I=s,h=i,R=h.parentNode,Lt=h.nextSibling,pe=i,ce=r.group,v.dragged=h,At={target:h,clientX:(e||t).clientX,clientY:(e||t).clientY},Ii=At.clientX-c.left,Ti=At.clientY-c.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,h.style["will-change"]="all",l=function(){if(G("delayEnded",o,{evt:t}),v.eventCanceled){o._onDrop();return}o._disableDelayedDragEvents(),!Di&&o.nativeDraggable&&(h.draggable=!0),o._triggerDragStart(t,e),K({sortable:o,name:"choose",originalEvent:t}),Q(h,r.chosenClass,!0)},r.ignore.split(",").forEach(function(f){ki(h,f.trim(),ke)}),E(a,"dragover",Ct),E(a,"mousemove",Ct),E(a,"touchmove",Ct),r.supportPointer?(E(a,"pointerup",o._onDrop),!this.nativeDraggable&&E(a,"pointercancel",o._onDrop)):(E(a,"mouseup",o._onDrop),E(a,"touchend",o._onDrop),E(a,"touchcancel",o._onDrop)),Di&&this.nativeDraggable&&(this.options.touchStartThreshold=4,h.draggable=!0),G("delayStart",this,{evt:t}),r.delay&&(!r.delayOnTouchOnly||e)&&(!this.nativeDraggable||!(Zt||mt))){if(v.eventCanceled){this._onDrop();return}r.supportPointer?(E(a,"pointerup",o._disableDelayedDrag),E(a,"pointercancel",o._disableDelayedDrag)):(E(a,"mouseup",o._disableDelayedDrag),E(a,"touchend",o._disableDelayedDrag),E(a,"touchcancel",o._disableDelayedDrag)),E(a,"mousemove",o._delayedDragTouchMoveHandler),E(a,"touchmove",o._delayedDragTouchMoveHandler),r.supportPointer&&E(a,"pointermove",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(l,r.delay)}else l()}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){h&&ke(h),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;x(t,"mouseup",this._disableDelayedDrag),x(t,"touchend",this._disableDelayedDrag),x(t,"touchcancel",this._disableDelayedDrag),x(t,"pointerup",this._disableDelayedDrag),x(t,"pointercancel",this._disableDelayedDrag),x(t,"mousemove",this._delayedDragTouchMoveHandler),x(t,"touchmove",this._delayedDragTouchMoveHandler),x(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||t.pointerType=="touch"&&t,!this.nativeDraggable||e?this.options.supportPointer?E(document,"pointermove",this._onTouchMove):e?E(document,"touchmove",this._onTouchMove):E(document,"mousemove",this._onTouchMove):(E(h,"dragend",this),E(I,"dragstart",this._onDragStart));try{document.selection?me(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,e){if(Mt=!1,I&&h){G("dragStarted",this,{evt:e}),this.nativeDraggable&&E(document,"dragover",zn);var i=this.options;!t&&Q(h,i.dragClass,!1),Q(h,i.ghostClass,!0),v.active=this,t&&this._appendGhost(),K({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,$i();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY),t!==e);)e=t;if(h.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){var i=void 0;if(i=e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e}),i&&!this.options.dragoverBubble)break}t=e}while(e=Ni(e));Ki()}},_onTouchMove:function(t){if(At){var e=this.options,i=e.fallbackTolerance,o=e.fallbackOffset,s=t.touches?t.touches[0]:t,r=y&&Nt(y,!0),a=y&&r&&r.a,l=y&&r&&r.d,c=fe&&$&&Li($),f=(s.clientX-At.clientX+o.x)/(a||1)+(c?c[0]-Ne[0]:0)/(a||1),d=(s.clientY-At.clientY+o.y)/(l||1)+(c?c[1]-Ne[1]:0)/(l||1);if(!v.active&&!Mt){if(i&&Math.max(Math.abs(s.clientX-this._lastX),Math.abs(s.clientY-this._lastY))=0&&(K({rootEl:R,name:"add",toEl:R,fromEl:I,originalEvent:t}),K({sortable:this,name:"remove",toEl:R,originalEvent:t}),K({rootEl:R,name:"sort",toEl:R,fromEl:I,originalEvent:t}),K({sortable:this,name:"sort",toEl:R,originalEvent:t})),H&&H.save()):Z!==Pt&&Z>=0&&(K({sortable:this,name:"update",toEl:R,originalEvent:t}),K({sortable:this,name:"sort",toEl:R,originalEvent:t})),v.active&&((Z==null||Z===-1)&&(Z=Pt,wt=qt),K({sortable:this,name:"end",toEl:R,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){G("nulling",this),I=h=R=y=Lt=T=pe=St=At=at=Kt=Z=wt=Pt=qt=Rt=Jt=H=ce=v.dragged=v.ghost=v.clone=v.active=null,Se.forEach(function(t){t.checked=!0}),Se.length=Me=Pe=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":h&&(this._onDragOver(t),Xn(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],e,i=this.el.children,o=0,s=i.length,r=this.options;oo.right+s||n.clientY>i.bottom&&n.clientX>i.left:n.clientY>o.bottom+s||n.clientX>i.right&&n.clientY>i.top}function Un(n,t,e,i,o,s,r,a){var l=i?n.clientY:n.clientX,c=i?e.height:e.width,f=i?e.top:e.left,d=i?e.bottom:e.right,p=!1;if(!r){if(a&&gef+c*s/2:ld-ge)return-Jt}else if(l>f+c*(1-o)/2&&ld-c*s/2)?l>f+c/2?1:-1:0}function Gn(n){return ot(h){},options:W,optionsLimit:tt=null,placeholder:z,position:k=null,searchableOptionFields:Y=["label"],searchDebounce:B=1e3,searchingMessage:X="Searching...",searchPrompt:L="Search...",state:et,statePath:ee=null}){this.canOptionLabelsWrap=t,this.canSelectPlaceholder=e,this.element=i,this.getOptionLabelUsing=o,this.getOptionLabelsUsing=s,this.getOptionsUsing=r,this.getSearchResultsUsing=a,this.hasDynamicOptions=l,this.hasDynamicSearchResults=c,this.hasInitialNoOptionsMessage=f,this.initialOptionLabel=d,this.initialOptionLabels=p,this.initialState=u,this.isAutofocused=g,this.isDisabled=m,this.isHtmlAllowed=S,this.isMultiple=O,this.isReorderable=w,this.isSearchable=D,this.livewireId=A,this.loadingMessage=C,this.maxItems=F,this.maxItemsMessage=q,this.noOptionsMessage=J,this.noSearchResultsMessage=_,this.onStateChange=V,this.options=W,this.optionsLimit=tt,this.originalOptions=JSON.parse(JSON.stringify(W)),this.placeholder=z,this.position=k,this.searchableOptionFields=Array.isArray(Y)?Y:["label"],this.searchDebounce=B,this.searchingMessage=X,this.searchPrompt=L,this.state=et,this.statePath=ee,this.activeSearchId=0,this.labelRepository={},this.isOpen=!1,this.selectedIndex=-1,this.searchQuery="",this.searchTimeout=null,this.isSearching=!1,this.selectedDisplayVersion=0,this.render(),this.setUpEventListeners(),this.isAutofocused&&this.selectButton.focus()}populateLabelRepositoryFromOptions(t){if(!(!t||!Array.isArray(t)))for(let e of t)e.options&&Array.isArray(e.options)?this.populateLabelRepositoryFromOptions(e.options):e.value!==void 0&&e.label!==void 0&&(this.labelRepository[e.value]=e.label)}render(){this.populateLabelRepositoryFromOptions(this.options),this.container=document.createElement("div"),this.container.className="fi-select-input-ctn",this.canOptionLabelsWrap||this.container.classList.add("fi-select-input-ctn-option-labels-not-wrapped"),this.container.setAttribute("aria-haspopup","listbox"),this.selectButton=document.createElement("button"),this.selectButton.className="fi-select-input-btn",this.selectButton.type="button",this.selectButton.setAttribute("aria-expanded","false"),this.selectedDisplay=document.createElement("div"),this.selectedDisplay.className="fi-select-input-value-ctn",this.updateSelectedDisplay(),this.selectButton.appendChild(this.selectedDisplay),this.dropdown=document.createElement("div"),this.dropdown.className="fi-dropdown-panel fi-scrollable",this.dropdown.setAttribute("role","listbox"),this.dropdown.setAttribute("tabindex","-1"),this.dropdown.style.display="none",this.dropdownId=`fi-select-input-dropdown-${Math.random().toString(36).substring(2,11)}`,this.dropdown.id=this.dropdownId,this.isMultiple&&this.dropdown.setAttribute("aria-multiselectable","true"),this.isSearchable&&(this.searchContainer=document.createElement("div"),this.searchContainer.className="fi-select-input-search-ctn",this.searchInput=document.createElement("input"),this.searchInput.className="fi-input",this.searchInput.type="text",this.searchInput.placeholder=this.searchPrompt,this.searchInput.setAttribute("aria-label","Search"),this.searchContainer.appendChild(this.searchInput),this.dropdown.appendChild(this.searchContainer),this.searchInput.addEventListener("input",t=>{this.isDisabled||this.handleSearch(t)}),this.searchInput.addEventListener("keydown",t=>{if(!this.isDisabled){if(t.key==="Tab"){t.preventDefault();let e=this.getVisibleOptions();if(e.length===0)return;t.shiftKey?this.selectedIndex=e.length-1:this.selectedIndex=0,e.forEach(i=>{i.classList.remove("fi-selected")}),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus()}else if(t.key==="ArrowDown"){if(t.preventDefault(),t.stopPropagation(),this.getVisibleOptions().length===0)return;this.selectedIndex=-1,this.searchInput.blur(),this.focusNextOption()}else if(t.key==="ArrowUp"){t.preventDefault(),t.stopPropagation();let e=this.getVisibleOptions();if(e.length===0)return;this.selectedIndex=e.length-1,this.searchInput.blur(),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus(),e[this.selectedIndex].id&&this.dropdown.setAttribute("aria-activedescendant",e[this.selectedIndex].id),this.scrollOptionIntoView(e[this.selectedIndex])}else if(t.key==="Enter"){if(t.preventDefault(),t.stopPropagation(),this.isSearching)return;let e=this.getVisibleOptions();if(e.length===0)return;let i=e.find(s=>{let r=s.getAttribute("aria-disabled")==="true",a=s.classList.contains("fi-disabled"),l=s.offsetParent===null;return!(r||a||l)});if(!i)return;let o=i.getAttribute("data-value");if(o===null)return;this.selectOption(o)}}})),this.optionsList=document.createElement("ul"),this.renderOptions(),this.container.appendChild(this.selectButton),this.container.appendChild(this.dropdown),this.element.appendChild(this.container),this.applyDisabledState()}renderOptions(){this.optionsList.innerHTML="";let t=0,e=this.options,i=0,o=!1;this.options.forEach(a=>{a.options&&Array.isArray(a.options)?(i+=a.options.length,o=!0):i++}),o?this.optionsList.className="fi-select-input-options-ctn":i>0&&(this.optionsList.className="fi-dropdown-list");let s=o?null:this.optionsList,r=0;for(let a of e){if(this.optionsLimit&&r>=this.optionsLimit)break;if(a.options&&Array.isArray(a.options)){let l=a.options;if(this.isMultiple&&Array.isArray(this.state)&&this.state.length>0&&(l=a.options.filter(c=>!this.state.includes(c.value))),l.length>0){if(this.optionsLimit){let c=this.optionsLimit-r;c{let a=this.createOptionElement(r.value,r);s.appendChild(a)}),i.appendChild(o),i.appendChild(s),this.optionsList.appendChild(i)}createOptionElement(t,e){let i=t,o=e,s=!1;typeof e=="object"&&e!==null&&"label"in e&&"value"in e&&(i=e.value,o=e.label,s=e.isDisabled||!1);let r=document.createElement("li");r.className="fi-dropdown-list-item fi-select-input-option",s&&r.classList.add("fi-disabled");let a=`fi-select-input-option-${Math.random().toString(36).substring(2,11)}`;if(r.id=a,r.setAttribute("role","option"),r.setAttribute("data-value",i),r.setAttribute("tabindex","0"),s&&r.setAttribute("aria-disabled","true"),this.isHtmlAllowed&&typeof o=="string"){let f=document.createElement("div");f.innerHTML=o;let d=f.textContent||f.innerText||o;r.setAttribute("aria-label",d)}let l=this.isMultiple?Array.isArray(this.state)&&this.state.includes(i):this.state===i;r.setAttribute("aria-selected",l?"true":"false"),l&&r.classList.add("fi-selected");let c=document.createElement("span");return this.isHtmlAllowed?c.innerHTML=o:c.textContent=o,r.appendChild(c),s||r.addEventListener("click",f=>{f.preventDefault(),f.stopPropagation(),this.selectOption(i),this.isMultiple&&(this.isSearchable&&this.searchInput?setTimeout(()=>{this.searchInput.focus()},0):setTimeout(()=>{r.focus()},0))}),r}async updateSelectedDisplay(){this.selectedDisplayVersion=this.selectedDisplayVersion+1;let t=this.selectedDisplayVersion,e=document.createDocumentFragment();if(this.isMultiple){if(!Array.isArray(this.state)||this.state.length===0){let o=document.createElement("span");o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o)}else{let o=await this.getLabelsForMultipleSelection();if(t!==this.selectedDisplayVersion)return;this.addBadgesForSelectedOptions(o,e)}t===this.selectedDisplayVersion&&(this.selectedDisplay.replaceChildren(e),this.isOpen&&this.positionDropdown());return}if(this.state===null||this.state===""){let o=document.createElement("span");if(o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o),t===this.selectedDisplayVersion){this.selectedDisplay.replaceChildren(e);let s=this.container.querySelector(".fi-select-input-value-remove-btn");s&&s.remove(),this.container.classList.remove("fi-select-input-ctn-clearable")}return}let i=await this.getLabelForSingleSelection();t===this.selectedDisplayVersion&&(this.addSingleSelectionDisplay(i,e),t===this.selectedDisplayVersion&&this.selectedDisplay.replaceChildren(e))}async getLabelsForMultipleSelection(){let t=this.getSelectedOptionLabels(),e=[];if(Array.isArray(this.state)){for(let o of this.state)if(!M(this.labelRepository[o])){if(M(t[o])){this.labelRepository[o]=t[o];continue}e.push(o.toString())}}if(e.length>0&&M(this.initialOptionLabels)&&JSON.stringify(this.state)===JSON.stringify(this.initialState)){if(Array.isArray(this.initialOptionLabels))for(let o of this.initialOptionLabels)M(o)&&o.value!==void 0&&o.label!==void 0&&e.includes(o.value)&&(this.labelRepository[o.value]=o.label)}else if(e.length>0&&this.getOptionLabelsUsing)try{let o=await this.getOptionLabelsUsing();for(let s of o)M(s)&&s.value!==void 0&&s.label!==void 0&&(this.labelRepository[s.value]=s.label)}catch(o){console.error("Error fetching option labels:",o)}let i=[];if(Array.isArray(this.state))for(let o of this.state)M(this.labelRepository[o])?i.push(this.labelRepository[o]):M(t[o])?i.push(t[o]):i.push(o);return i}createBadgeElement(t,e){let i=document.createElement("span");i.className="fi-badge fi-size-md fi-color fi-color-primary fi-text-color-600 dark:fi-text-color-200",M(t)&&i.setAttribute("data-value",t);let o=document.createElement("span");o.className="fi-badge-label-ctn";let s=document.createElement("span");s.className="fi-badge-label",this.canOptionLabelsWrap&&s.classList.add("fi-wrapped"),this.isHtmlAllowed?s.innerHTML=e:s.textContent=e,o.appendChild(s),i.appendChild(o);let r=this.createRemoveButton(t,e);return i.appendChild(r),i}createRemoveButton(t,e){let i=document.createElement("button");return i.type="button",i.className="fi-badge-delete-btn",i.innerHTML='',i.setAttribute("aria-label","Remove "+(this.isHtmlAllowed?e.replace(/<[^>]*>/g,""):e)),i.addEventListener("click",o=>{o.stopPropagation(),M(t)&&this.selectOption(t)}),i.addEventListener("keydown",o=>{(o.key===" "||o.key==="Enter")&&(o.preventDefault(),o.stopPropagation(),M(t)&&this.selectOption(t))}),i}addBadgesForSelectedOptions(t,e=this.selectedDisplay){let i=document.createElement("div");i.className="fi-select-input-value-badges-ctn",t.forEach((o,s)=>{let r=Array.isArray(this.state)?this.state[s]:null,a=this.createBadgeElement(r,o);i.appendChild(a)}),e.appendChild(i),this.isReorderable&&(i.addEventListener("click",o=>{o.stopPropagation()}),i.addEventListener("mousedown",o=>{o.stopPropagation()}),new Ui(i,{animation:150,onEnd:()=>{let o=[];i.querySelectorAll("[data-value]").forEach(s=>{o.push(s.getAttribute("data-value"))}),this.state=o,this.onStateChange(this.state)}}))}async getLabelForSingleSelection(){let t=this.labelRepository[this.state];if(bt(t)&&(t=this.getSelectedOptionLabel(this.state)),bt(t)&&M(this.initialOptionLabel)&&this.state===this.initialState)t=this.initialOptionLabel,M(this.state)&&(this.labelRepository[this.state]=t);else if(bt(t)&&this.getOptionLabelUsing)try{t=await this.getOptionLabelUsing(),M(t)&&M(this.state)&&(this.labelRepository[this.state]=t)}catch(e){console.error("Error fetching option label:",e),t=this.state}else bt(t)&&(t=this.state);return t}addSingleSelectionDisplay(t,e=this.selectedDisplay){let i=document.createElement("span");if(i.className="fi-select-input-value-label",this.isHtmlAllowed?i.innerHTML=t:i.textContent=t,e.appendChild(i),!this.canSelectPlaceholder||this.container.querySelector(".fi-select-input-value-remove-btn"))return;let o=document.createElement("button");o.type="button",o.className="fi-select-input-value-remove-btn",o.innerHTML='',o.setAttribute("aria-label","Clear selection"),o.addEventListener("click",s=>{s.stopPropagation(),this.selectOption("")}),o.addEventListener("keydown",s=>{(s.key===" "||s.key==="Enter")&&(s.preventDefault(),s.stopPropagation(),this.selectOption(""))}),this.container.appendChild(o),this.container.classList.add("fi-select-input-ctn-clearable")}getSelectedOptionLabel(t){if(M(this.labelRepository[t]))return this.labelRepository[t];let e="";for(let i of this.options)if(i.options&&Array.isArray(i.options)){for(let o of i.options)if(o.value===t){e=o.label,this.labelRepository[t]=e;break}}else if(i.value===t){e=i.label,this.labelRepository[t]=e;break}return e}setUpEventListeners(){this.buttonClickListener=()=>{this.toggleDropdown()},this.documentClickListener=t=>{!this.container.contains(t.target)&&this.isOpen&&this.closeDropdown()},this.buttonKeydownListener=t=>{this.isDisabled||this.handleSelectButtonKeydown(t)},this.dropdownKeydownListener=t=>{this.isDisabled||this.isSearchable&&document.activeElement===this.searchInput&&!["Tab","Escape"].includes(t.key)||this.handleDropdownKeydown(t)},this.selectButton.addEventListener("click",this.buttonClickListener),document.addEventListener("click",this.documentClickListener),this.selectButton.addEventListener("keydown",this.buttonKeydownListener),this.dropdown.addEventListener("keydown",this.dropdownKeydownListener),!this.isMultiple&&this.livewireId&&this.statePath&&this.getOptionLabelUsing&&(this.refreshOptionLabelListener=async t=>{if(t.detail.livewireId===this.livewireId&&t.detail.statePath===this.statePath&&M(this.state))try{delete this.labelRepository[this.state];let e=await this.getOptionLabelUsing();M(e)&&(this.labelRepository[this.state]=e);let i=this.selectedDisplay.querySelector(".fi-select-input-value-label");M(i)&&(this.isHtmlAllowed?i.innerHTML=e:i.textContent=e),this.updateOptionLabelInList(this.state,e)}catch(e){console.error("Error refreshing option label:",e)}},window.addEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener))}updateOptionLabelInList(t,e){this.labelRepository[t]=e;let i=this.getVisibleOptions();for(let o of i)if(o.getAttribute("data-value")===String(t)){if(o.innerHTML="",this.isHtmlAllowed){let s=document.createElement("span");s.innerHTML=e,o.appendChild(s)}else o.appendChild(document.createTextNode(e));break}for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}for(let o of this.originalOptions)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}}handleSelectButtonKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusNextOption():this.openDropdown();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusPreviousOption():this.openDropdown();break;case" ":if(t.preventDefault(),this.isOpen){if(this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}}else this.openDropdown();break;case"Enter":break;case"Escape":this.isOpen&&(t.preventDefault(),this.closeDropdown());break;case"Tab":this.isOpen&&this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.isOpen||this.openDropdown(),this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}handleDropdownKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.focusNextOption();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.focusPreviousOption();break;case" ":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}break;case"Enter":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}else{let e=this.element.closest("form");e&&e.submit()}break;case"Escape":t.preventDefault(),this.closeDropdown(),this.selectButton.focus();break;case"Tab":this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}toggleDropdown(){if(!this.isDisabled){if(this.isOpen){this.closeDropdown();return}this.isMultiple&&!this.isSearchable&&!this.hasAvailableOptions()||this.openDropdown()}}hasAvailableOptions(){for(let t of this.options)if(t.options&&Array.isArray(t.options)){for(let e of t.options)if(!Array.isArray(this.state)||!this.state.includes(e.value))return!0}else if(!Array.isArray(this.state)||!this.state.includes(t.value))return!0;return!1}async openDropdown(){this.dropdown.style.display="block",this.dropdown.style.opacity="0";let t=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;if(this.dropdown.style.position=t?"fixed":"absolute",this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.selectButton.setAttribute("aria-expanded","true"),this.isOpen=!0,this.positionDropdown(),this.resizeListener||(this.resizeListener=()=>{this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.positionDropdown()},window.addEventListener("resize",this.resizeListener)),this.scrollListener||(this.scrollListener=()=>this.positionDropdown(),window.addEventListener("scroll",this.scrollListener,!0)),this.dropdown.style.opacity="1",this.isSearchable&&this.searchInput&&(this.searchInput.value="",this.searchQuery="",this.hasDynamicOptions||(this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())),this.hasDynamicOptions&&this.getOptionsUsing){this.showLoadingState(!1);try{let e=await this.getOptionsUsing(),i=Array.isArray(e)?e:e&&Array.isArray(e.options)?e.options:[];if(this.options=i,this.originalOptions=JSON.parse(JSON.stringify(i)),this.populateLabelRepositoryFromOptions(i),this.isSearchable&&this.searchInput&&(this.searchInput.value&&this.searchInput.value.trim()!==""||this.searchQuery&&this.searchQuery.trim()!=="")){let o=(this.searchInput.value||this.searchQuery||"").trim().toLowerCase();this.hideLoadingState(),this.filterOptions(o)}else this.renderOptions()}catch(e){console.error("Error fetching options:",e),this.hideLoadingState()}}else(!this.hasInitialNoOptionsMessage||this.searchQuery)&&this.hideLoadingState();if(this.isSearchable&&this.searchInput)this.searchInput.focus();else{this.selectedIndex=-1;let e=this.getVisibleOptions();if(this.isMultiple){if(Array.isArray(this.state)&&this.state.length>0){for(let i=0;i0&&(this.selectedIndex=0),this.selectedIndex>=0&&(e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus())}}positionDropdown(){let t=this.position==="top"?"top-start":"bottom-start",e=[wi(4),Si({padding:5})];this.position!=="top"&&this.position!=="bottom"&&e.push(xi());let i=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;Ei(this.selectButton,this.dropdown,{placement:t,middleware:e,strategy:i?"fixed":"absolute"}).then(({x:o,y:s})=>{Object.assign(this.dropdown.style,{left:`${o}px`,top:`${s}px`})})}closeDropdown(){this.dropdown.style.display="none",this.selectButton.setAttribute("aria-expanded","false"),this.isOpen=!1,this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.activeSearchId++,this.isSearching=!1,this.hideLoadingState(),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.getVisibleOptions().forEach(e=>{e.classList.remove("fi-selected")}),this.dropdown.removeAttribute("aria-activedescendant")}focusNextOption(){let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex>=0&&this.selectedIndex=0&&this.selectedIndexe.bottom?this.dropdown.scrollTop+=i.bottom-e.bottom:i.top li[role="option"]')):t=Array.from(this.optionsList.querySelectorAll(':scope > ul.fi-dropdown-list > li[role="option"]'));let e=Array.from(this.optionsList.querySelectorAll('li.fi-select-input-option-group > ul > li[role="option"]'));return[...t,...e]}getSelectedOptionLabels(){if(!Array.isArray(this.state)||this.state.length===0)return{};let t={};for(let e of this.state){let i=!1;for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===e){t[e]=s.label,i=!0;break}if(i)break}else if(o.value===e){t[e]=o.label,i=!0;break}}return t}handleSearch(t){let e=t.target.value.trim();if(this.searchQuery=e,this.searchTimeout&&clearTimeout(this.searchTimeout),e===""){this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions();return}if(!this.getSearchResultsUsing||typeof this.getSearchResultsUsing!="function"||!this.hasDynamicSearchResults){this.filterOptions(e);return}this.searchTimeout=setTimeout(async()=>{this.searchTimeout=null;let i=++this.activeSearchId;this.isSearching=!0;try{this.showLoadingState(!0);let o=await this.getSearchResultsUsing(e);if(i!==this.activeSearchId||!this.isOpen)return;let s=Array.isArray(o)?o:o&&Array.isArray(o.options)?o.options:[];this.options=s,this.populateLabelRepositoryFromOptions(s),this.hideLoadingState(),this.renderOptions(),this.isOpen&&this.positionDropdown(),this.options.length===0&&this.showNoResultsMessage()}catch(o){i===this.activeSearchId&&(console.error("Error fetching search results:",o),this.hideLoadingState(),this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())}finally{i===this.activeSearchId&&(this.isSearching=!1)}},this.searchDebounce)}showLoadingState(t=!1){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let e=document.createElement("div");e.className="fi-select-input-message",e.textContent=t?this.searchingMessage:this.loadingMessage,this.dropdown.appendChild(e)}hideLoadingState(){let t=this.dropdown.querySelector(".fi-select-input-message");t&&t.remove()}showNoOptionsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noOptionsMessage,this.dropdown.appendChild(t)}showNoResultsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noSearchResultsMessage,this.dropdown.appendChild(t)}filterOptions(t){let e=this.searchableOptionFields.includes("label"),i=this.searchableOptionFields.includes("value");t=t.toLowerCase();let o=[];for(let s of this.originalOptions)if(s.options&&Array.isArray(s.options)){let r=s.options.filter(a=>e&&a.label.toLowerCase().includes(t)||i&&String(a.value).toLowerCase().includes(t));r.length>0&&o.push({label:s.label,options:r})}else(e&&s.label.toLowerCase().includes(t)||i&&String(s.value).toLowerCase().includes(t))&&o.push(s);this.options=o,this.renderOptions(),this.options.length===0&&this.showNoResultsMessage(),this.isOpen&&this.positionDropdown()}selectOption(t){if(this.isDisabled)return;if(!this.isMultiple){this.state=t,this.updateSelectedDisplay(),this.renderOptions(),this.closeDropdown(),this.selectButton.focus(),this.onStateChange(this.state);return}let e=Array.isArray(this.state)?[...this.state]:[];if(e.includes(t)){let o=this.selectedDisplay.querySelector(`[data-value="${t}"]`);if(M(o)){let s=o.parentElement;M(s)&&s.children.length===1?(e=e.filter(r=>r!==t),this.state=e,this.updateSelectedDisplay()):(o.remove(),e=e.filter(r=>r!==t),this.state=e)}else e=e.filter(s=>s!==t),this.state=e,this.updateSelectedDisplay();this.renderOptions(),this.isOpen&&this.positionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state);return}if(this.maxItems&&e.length>=this.maxItems){this.maxItemsMessage&&alert(this.maxItemsMessage);return}e.push(t),this.state=e;let i=this.selectedDisplay.querySelector(".fi-select-input-value-badges-ctn");bt(i)?this.updateSelectedDisplay():this.addSingleBadge(t,i),this.renderOptions(),this.isOpen&&this.positionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state)}async addSingleBadge(t,e){let i=this.labelRepository[t];if(bt(i)&&(i=this.getSelectedOptionLabel(t),M(i)&&(this.labelRepository[t]=i)),bt(i)&&this.getOptionLabelsUsing)try{let s=await this.getOptionLabelsUsing();for(let r of s)if(M(r)&&r.value===t&&r.label!==void 0){i=r.label,this.labelRepository[t]=i;break}}catch(s){console.error("Error fetching option label:",s)}bt(i)&&(i=t);let o=this.createBadgeElement(t,i);e.appendChild(o)}maintainFocusInMultipleMode(){if(this.isSearchable&&this.searchInput){this.searchInput.focus();return}let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex=-1,Array.isArray(this.state)&&this.state.length>0){for(let e=0;e{e.setAttribute("disabled","disabled"),e.classList.add("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.setAttribute("disabled","disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.setAttribute("disabled","disabled"),this.searchInput.classList.add("fi-disabled"))}else{if(this.selectButton.removeAttribute("disabled"),this.selectButton.removeAttribute("aria-disabled"),this.selectButton.classList.remove("fi-disabled"),this.isMultiple&&this.container.querySelectorAll(".fi-select-input-badge-remove").forEach(e=>{e.removeAttribute("disabled"),e.classList.remove("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.removeAttribute("disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.removeAttribute("disabled"),this.searchInput.classList.remove("fi-disabled"))}}destroy(){this.selectButton&&this.buttonClickListener&&this.selectButton.removeEventListener("click",this.buttonClickListener),this.documentClickListener&&document.removeEventListener("click",this.documentClickListener),this.selectButton&&this.buttonKeydownListener&&this.selectButton.removeEventListener("keydown",this.buttonKeydownListener),this.dropdown&&this.dropdownKeydownListener&&this.dropdown.removeEventListener("keydown",this.dropdownKeydownListener),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.refreshOptionLabelListener&&window.removeEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener),this.isOpen&&this.closeDropdown(),this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.container&&this.container.remove()}};function Qn({canOptionLabelsWrap:n,canSelectPlaceholder:t,getOptionLabelUsing:e,getOptionLabelsUsing:i,getOptionsUsing:o,getSearchResultsUsing:s,hasDynamicOptions:r,hasDynamicSearchResults:a,hasInitialNoOptionsMessage:l,initialOptionLabel:c,initialOptionLabels:f,initialState:d,isAutofocused:p,isDisabled:u,isHtmlAllowed:g,isMultiple:m,isReorderable:S,isSearchable:O,livewireId:w,loadingMessage:D,maxItems:A,maxItemsMessage:C,noOptionsMessage:F,noSearchResultsMessage:q,options:J,optionsLimit:_,placeholder:V,position:W,searchDebounce:tt,searchingMessage:z,searchPrompt:k,searchableOptionFields:Y,state:B,statePath:X}){return{select:null,state:B,init(){this.select=new Oe({canOptionLabelsWrap:n,canSelectPlaceholder:t,element:this.$refs.select,getOptionLabelUsing:e,getOptionLabelsUsing:i,getOptionsUsing:o,getSearchResultsUsing:s,hasDynamicOptions:r,hasDynamicSearchResults:a,hasInitialNoOptionsMessage:l,initialOptionLabel:c,initialOptionLabels:f,initialState:d,isAutofocused:p,isDisabled:u,isHtmlAllowed:g,isMultiple:m,isReorderable:S,isSearchable:O,livewireId:w,loadingMessage:D,maxItems:A,maxItemsMessage:C,noOptionsMessage:F,noSearchResultsMessage:q,onStateChange:L=>{this.state=L},options:J,optionsLimit:_,placeholder:V,position:W,searchableOptionFields:Y,searchDebounce:tt,searchingMessage:z,searchPrompt:k,state:this.state,statePath:X}),this.$watch("state",L=>{this.$nextTick(()=>{this.select&&this.select.state!==L&&(this.select.state=L,this.select.updateSelectedDisplay(),this.select.renderOptions())})})},destroy(){this.select&&(this.select.destroy(),this.select=null)}}}export{Qn as default}; /*! Bundled license information: -choices.js/public/assets/scripts/choices.js: - (*! choices.js v10.2.0 | © 2022 Josh Johnson | https://github.com/jshjohnson/Choices#readme *) +sortablejs/modular/sortable.esm.js: + (**! + * Sortable 1.15.6 + * @author RubaXa + * @author owenm + * @license MIT + *) */ diff --git a/public/js/filament/forms/components/slider.js b/public/js/filament/forms/components/slider.js new file mode 100644 index 0000000000..c79171c2d0 --- /dev/null +++ b/public/js/filament/forms/components/slider.js @@ -0,0 +1 @@ +var I;(function(r){r.Range="range",r.Steps="steps",r.Positions="positions",r.Count="count",r.Values="values"})(I||(I={}));var O;(function(r){r[r.None=-1]="None",r[r.NoValue=0]="NoValue",r[r.LargeValue=1]="LargeValue",r[r.SmallValue=2]="SmallValue"})(O||(O={}));function we(r){return rt(r)&&typeof r.from=="function"}function rt(r){return typeof r=="object"&&typeof r.to=="function"}function zt(r){r.parentElement.removeChild(r)}function St(r){return r!=null}function Ft(r){r.preventDefault()}function Ce(r){return r.filter(function(t){return this[t]?!1:this[t]=!0},{})}function Ee(r,t){return Math.round(r/t)*t}function Ae(r,t){var s=r.getBoundingClientRect(),f=r.ownerDocument,u=f.documentElement,d=Bt(f);return/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)&&(d.x=0),t?s.top+d.y-u.clientTop:s.left+d.x-u.clientLeft}function R(r){return typeof r=="number"&&!isNaN(r)&&isFinite(r)}function Rt(r,t,s){s>0&&(L(r,t),setTimeout(function(){et(r,t)},s))}function jt(r){return Math.max(Math.min(r,100),0)}function it(r){return Array.isArray(r)?r:[r]}function Pe(r){r=String(r);var t=r.split(".");return t.length>1?t[1].length:0}function L(r,t){r.classList&&!/\s/.test(t)?r.classList.add(t):r.className+=" "+t}function et(r,t){r.classList&&!/\s/.test(t)?r.classList.remove(t):r.className=r.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")}function Ve(r,t){return r.classList?r.classList.contains(t):new RegExp("\\b"+t+"\\b").test(r.className)}function Bt(r){var t=window.pageXOffset!==void 0,s=(r.compatMode||"")==="CSS1Compat",f=t?window.pageXOffset:s?r.documentElement.scrollLeft:r.body.scrollLeft,u=t?window.pageYOffset:s?r.documentElement.scrollTop:r.body.scrollTop;return{x:f,y:u}}function De(){return window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"}}function ye(){var r=!1;try{var t=Object.defineProperty({},"passive",{get:function(){r=!0}});window.addEventListener("test",null,t)}catch{}return r}function ke(){return window.CSS&&CSS.supports&&CSS.supports("touch-action","none")}function bt(r,t){return 100/(t-r)}function xt(r,t,s){return t*100/(r[s+1]-r[s])}function Ue(r,t){return xt(r,r[0]<0?t+Math.abs(r[0]):t-r[0],0)}function Me(r,t){return t*(r[1]-r[0])/100+r[0]}function G(r,t){for(var s=1;r>=t[s];)s+=1;return s}function _e(r,t,s){if(s>=r.slice(-1)[0])return 100;var f=G(s,r),u=r[f-1],d=r[f],v=t[f-1],w=t[f];return v+Ue([u,d],s)/bt(v,w)}function Le(r,t,s){if(s>=100)return r.slice(-1)[0];var f=G(s,t),u=r[f-1],d=r[f],v=t[f-1],w=t[f];return Me([u,d],(s-v)*bt(v,w))}function Oe(r,t,s,f){if(f===100)return f;var u=G(f,r),d=r[u-1],v=r[u];return s?f-d>(v-d)/2?v:d:t[u-1]?r[u-1]+Ee(f-r[u-1],t[u-1]):f}var Kt=(function(){function r(t,s,f){this.xPct=[],this.xVal=[],this.xSteps=[],this.xNumSteps=[],this.xHighestCompleteStep=[],this.xSteps=[f||!1],this.xNumSteps=[!1],this.snap=s;var u,d=[];for(Object.keys(t).forEach(function(v){d.push([it(t[v]),v])}),d.sort(function(v,w){return v[0][0]-w[0][0]}),u=0;uthis.xPct[u+1];)u++;else t===this.xPct[this.xPct.length-1]&&(u=this.xPct.length-2);!f&&t===this.xPct[u+1]&&u++,s===null&&(s=[]);var d,v=1,w=s[u],C=0,p=0,D=0,y=0;for(f?d=(t-this.xPct[u])/(this.xPct[u+1]-this.xPct[u]):d=(this.xPct[u+1]-t)/(this.xPct[u+1]-this.xPct[u]);w>0;)C=this.xPct[u+1+y]-this.xPct[u+y],s[u+y]*v+100-d*100>100?(p=C*d,v=(w-100*d)/s[u+y],d=1):(p=s[u+y]*C/100*v,v=0),f?(D=D-p,this.xPct.length+y>=1&&y--):(D=D+p,this.xPct.length-y>=1&&y++),w=s[u+y]*v;return t+D},r.prototype.toStepping=function(t){return t=_e(this.xVal,this.xPct,t),t},r.prototype.fromStepping=function(t){return Le(this.xVal,this.xPct,t)},r.prototype.getStep=function(t){return t=Oe(this.xPct,this.xSteps,this.snap,t),t},r.prototype.getDefaultStep=function(t,s,f){var u=G(t,this.xPct);return(t===100||s&&t===this.xPct[u-1])&&(u=Math.max(u-1,1)),(this.xVal[u]-this.xVal[u-1])/f},r.prototype.getNearbySteps=function(t){var s=G(t,this.xPct);return{stepBefore:{startValue:this.xVal[s-2],step:this.xNumSteps[s-2],highestStep:this.xHighestCompleteStep[s-2]},thisStep:{startValue:this.xVal[s-1],step:this.xNumSteps[s-1],highestStep:this.xHighestCompleteStep[s-1]},stepAfter:{startValue:this.xVal[s],step:this.xNumSteps[s],highestStep:this.xHighestCompleteStep[s]}}},r.prototype.countStepDecimals=function(){var t=this.xNumSteps.map(Pe);return Math.max.apply(null,t)},r.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]},r.prototype.convert=function(t){return this.getStep(this.toStepping(t))},r.prototype.handleEntryPoint=function(t,s){var f;if(t==="min"?f=0:t==="max"?f=100:f=parseFloat(t),!R(f)||!R(s[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");this.xPct.push(f),this.xVal.push(s[0]);var u=Number(s[1]);f?this.xSteps.push(isNaN(u)?!1:u):isNaN(u)||(this.xSteps[0]=u),this.xHighestCompleteStep.push(0)},r.prototype.handleStepPoint=function(t,s){if(s){if(this.xVal[t]===this.xVal[t+1]){this.xSteps[t]=this.xHighestCompleteStep[t]=this.xVal[t];return}this.xSteps[t]=xt([this.xVal[t],this.xVal[t+1]],s,0)/bt(this.xPct[t],this.xPct[t+1]);var f=(this.xVal[t+1]-this.xVal[t])/this.xNumSteps[t],u=Math.ceil(Number(f.toFixed(3))-1),d=this.xVal[t]+this.xNumSteps[t]*u;this.xHighestCompleteStep[t]=d}},r})(),Nt={to:function(r){return r===void 0?"":r.toFixed(2)},from:Number},It={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"},K={tooltips:".__tooltips",aria:".__aria"};function He(r,t){if(!R(t))throw new Error("noUiSlider: 'step' is not numeric.");r.singleStep=t}function ze(r,t){if(!R(t))throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");r.keyboardPageMultiplier=t}function Fe(r,t){if(!R(t))throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");r.keyboardMultiplier=t}function Re(r,t){if(!R(t))throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");r.keyboardDefaultStep=t}function je(r,t){if(typeof t!="object"||Array.isArray(t))throw new Error("noUiSlider: 'range' is not an object.");if(t.min===void 0||t.max===void 0)throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");r.spectrum=new Kt(t,r.snap||!1,r.singleStep)}function Ne(r,t){if(t=it(t),!Array.isArray(t)||!t.length)throw new Error("noUiSlider: 'start' option is incorrect.");r.handles=t.length,r.start=t}function Be(r,t){if(typeof t!="boolean")throw new Error("noUiSlider: 'snap' option must be a boolean.");r.snap=t}function Ke(r,t){if(typeof t!="boolean")throw new Error("noUiSlider: 'animate' option must be a boolean.");r.animate=t}function Ie(r,t){if(typeof t!="number")throw new Error("noUiSlider: 'animationDuration' option must be a number.");r.animationDuration=t}function qt(r,t){var s=[!1],f;if(t==="lower"?t=[!0,!1]:t==="upper"&&(t=[!1,!0]),t===!0||t===!1){for(f=1;f1)throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.")}}function Ye(r,t){switch(t){case"ltr":r.dir=0;break;case"rtl":r.dir=1;break;default:throw new Error("noUiSlider: 'direction' option was not recognized.")}}function We(r,t){if(typeof t!="string")throw new Error("noUiSlider: 'behaviour' must be a string containing options.");var s=t.indexOf("tap")>=0,f=t.indexOf("drag")>=0,u=t.indexOf("fixed")>=0,d=t.indexOf("snap")>=0,v=t.indexOf("hover")>=0,w=t.indexOf("unconstrained")>=0,C=t.indexOf("invert-connects")>=0,p=t.indexOf("drag-all")>=0,D=t.indexOf("smooth-steps")>=0;if(u){if(r.handles!==2)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");Tt(r,r.start[1]-r.start[0])}if(C&&r.handles!==2)throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles");if(w&&(r.margin||r.limit))throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");r.events={tap:s||d,drag:f,dragAll:p,smoothSteps:D,fixed:u,snap:d,hover:v,unconstrained:w,invertConnects:C}}function $e(r,t){if(t!==!1)if(t===!0||rt(t)){r.tooltips=[];for(var s=0;s= 2) required for mode 'count'.");for(var i=e.values-1,a=100/i,n=[];i--;)n[i]=i*a;return n.push(100),Et(n,e.stepped)}return e.mode===I.Positions?Et(e.values,e.stepped):e.mode===I.Values?e.stepped?e.values.map(function(o){return m.fromStepping(m.getStep(m.toStepping(o)))}):e.values:[]}function Et(e,i){return e.map(function(a){return m.fromStepping(i?m.getStep(a):a)})}function ie(e){function i(x,E){return Number((x+E).toFixed(7))}var a=re(e),n={},o=m.xVal[0],l=m.xVal[m.xVal.length-1],h=!1,c=!1,S=0;return a=Ce(a.slice().sort(function(x,E){return x-E})),a[0]!==o&&(a.unshift(o),h=!0),a[a.length-1]!==l&&(a.push(l),c=!0),a.forEach(function(x,E){var A,g,V,_=x,k=a[E+1],U,dt,pt,mt,Lt,gt,Ot,Ht=e.mode===I.Steps;for(Ht&&(A=m.xNumSteps[E]),A||(A=k-_),k===void 0&&(k=_),A=Math.max(A,1e-7),g=_;g<=k;g=i(g,A)){for(U=m.toStepping(g),dt=U-S,Lt=dt/(e.density||1),gt=Math.round(Lt),Ot=dt/gt,V=1;V<=gt;V+=1)pt=S+V*Ot,n[pt.toFixed(5)]=[m.fromStepping(pt),0];mt=a.indexOf(g)>-1?O.LargeValue:Ht?O.SmallValue:O.NoValue,!E&&h&&g!==k&&(mt=0),g===k&&c||(n[U.toFixed(5)]=[g,mt]),S=U}}),n}function ae(e,i,a){var n,o,l=B.createElement("div"),h=(n={},n[O.None]="",n[O.NoValue]=t.cssClasses.valueNormal,n[O.LargeValue]=t.cssClasses.valueLarge,n[O.SmallValue]=t.cssClasses.valueSub,n),c=(o={},o[O.None]="",o[O.NoValue]=t.cssClasses.markerNormal,o[O.LargeValue]=t.cssClasses.markerLarge,o[O.SmallValue]=t.cssClasses.markerSub,o),S=[t.cssClasses.valueHorizontal,t.cssClasses.valueVertical],x=[t.cssClasses.markerHorizontal,t.cssClasses.markerVertical];L(l,t.cssClasses.pips),L(l,t.ort===0?t.cssClasses.pipsHorizontal:t.cssClasses.pipsVertical);function E(g,V){var _=V===t.cssClasses.value,k=_?S:x,U=_?h:c;return V+" "+k[t.ort]+" "+U[g]}function A(g,V,_){if(_=i?i(V,_):_,_!==O.None){var k=N(l,!1);k.className=E(_,t.cssClasses.marker),k.style[t.style]=g+"%",_>O.NoValue&&(k=N(l,!1),k.className=E(_,t.cssClasses.value),k.setAttribute("data-value",String(V)),k.style[t.style]=g+"%",k.innerHTML=String(a.to(V)))}}return Object.keys(e).forEach(function(g){A(g,e[g][0],e[g][1])}),l}function ot(){y&&(zt(y),y=null)}function lt(e){ot();var i=ie(e),a=e.filter,n=e.format||{to:function(o){return String(Math.round(o))}};return y=v.appendChild(ae(i,a,n)),y}function At(){var e=w.getBoundingClientRect(),i="offset"+["Width","Height"][t.ort];return t.ort===0?e.width||w[i]:e.height||w[i]}function T(e,i,a,n){var o=function(h){var c=ne(h,n.pageOffset,n.target||i);if(!c||wt()&&!n.doNotReject||Ve(v,t.cssClasses.tap)&&!n.doNotReject||e===f.start&&c.buttons!==void 0&&c.buttons>1||n.hover&&c.buttons)return!1;d||c.preventDefault(),c.calcPoint=c.points[t.ort],a(c,n)},l=[];return e.split(" ").forEach(function(h){i.addEventListener(h,o,d?{passive:!0}:!1),l.push([h,o])}),l}function ne(e,i,a){var n=e.type.indexOf("touch")===0,o=e.type.indexOf("mouse")===0,l=e.type.indexOf("pointer")===0,h=0,c=0;if(e.type.indexOf("MSPointer")===0&&(l=!0),e.type==="mousedown"&&!e.buttons&&!e.touches)return!1;if(n){var S=function(A){var g=A.target;return g===a||a.contains(g)||e.composed&&e.composedPath().shift()===a};if(e.type==="touchstart"){var x=Array.prototype.filter.call(e.touches,S);if(x.length>1)return!1;h=x[0].pageX,c=x[0].pageY}else{var E=Array.prototype.find.call(e.changedTouches,S);if(!E)return!1;h=E.pageX,c=E.pageY}}return i=i||Bt(B),(o||l)&&(h=e.clientX+i.x,c=e.clientY+i.y),e.pageOffset=i,e.points=[h,c],e.cursor=o||l,e}function Pt(e){var i=e-Ae(w,t.ort),a=i*100/At();return a=jt(a),t.dir?100-a:a}function se(e){var i=100,a=!1;return p.forEach(function(n,o){if(!nt(o)){var l=b[o],h=Math.abs(l-e),c=h===100&&i===100,S=hl;(S||x||c)&&(a=o,i=h)}}),a}function oe(e,i){e.type==="mouseout"&&e.target.nodeName==="HTML"&&e.relatedTarget===null&&ft(e,i)}function le(e,i){if(navigator.appVersion.indexOf("MSIE 9")===-1&&e.buttons===0&&i.buttonsProperty!==0)return ft(e,i);var a=(t.dir?-1:1)*(e.calcPoint-i.startCalcPoint),n=a*100/i.baseSize;Dt(a>0,n,i.locations,i.handleNumbers,i.connect)}function ft(e,i){i.handle&&(et(i.handle,t.cssClasses.active),Y-=1),i.listeners.forEach(function(a){H.removeEventListener(a[0],a[1])}),Y===0&&(et(v,t.cssClasses.drag),vt(),e.cursor&&(J.style.cursor="",J.removeEventListener("selectstart",Ft))),t.events.smoothSteps&&(i.handleNumbers.forEach(function(a){X(a,b[a],!0,!0,!1,!1)}),i.handleNumbers.forEach(function(a){P("update",a)})),i.handleNumbers.forEach(function(a){P("change",a),P("set",a),P("end",a)})}function ut(e,i){if(!i.handleNumbers.some(nt)){var a;if(i.handleNumbers.length===1){var n=p[i.handleNumbers[0]];a=n.children[0],Y+=1,L(a,t.cssClasses.active)}e.stopPropagation();var o=[],l=T(f.move,H,le,{target:e.target,handle:a,connect:i.connect,listeners:o,startCalcPoint:e.calcPoint,baseSize:At(),pageOffset:e.pageOffset,handleNumbers:i.handleNumbers,buttonsProperty:e.buttons,locations:b.slice()}),h=T(f.end,H,ft,{target:e.target,handle:a,listeners:o,doNotReject:!0,handleNumbers:i.handleNumbers}),c=T("mouseout",H,oe,{target:e.target,handle:a,listeners:o,doNotReject:!0,handleNumbers:i.handleNumbers});o.push.apply(o,l.concat(h,c)),e.cursor&&(J.style.cursor=getComputedStyle(e.target).cursor,p.length>1&&L(v,t.cssClasses.drag),J.addEventListener("selectstart",Ft,!1)),i.handleNumbers.forEach(function(S){P("start",S)})}}function fe(e){e.stopPropagation();var i=Pt(e.calcPoint),a=se(i);a!==!1&&(t.events.snap||Rt(v,t.cssClasses.tap,t.animationDuration),X(a,i,!0,!0),vt(),P("slide",a,!0),P("update",a,!0),t.events.snap?ut(e,{handleNumbers:[a]}):(P("change",a,!0),P("set",a,!0)))}function ue(e){var i=Pt(e.calcPoint),a=m.getStep(i),n=m.fromStepping(a);Object.keys(F).forEach(function(o){o.split(".")[0]==="hover"&&F[o].forEach(function(l){l.call(tt,n)})})}function ce(e,i){if(wt()||nt(i))return!1;var a=["Left","Right"],n=["Down","Up"],o=["PageDown","PageUp"],l=["Home","End"];t.dir&&!t.ort?a.reverse():t.ort&&!t.dir&&(n.reverse(),o.reverse());var h=e.key.replace("Arrow",""),c=h===o[0],S=h===o[1],x=h===n[0]||h===a[0]||c,E=h===n[1]||h===a[1]||S,A=h===l[0],g=h===l[1];if(!x&&!E&&!A&&!g)return!0;e.preventDefault();var V;if(E||x){var _=x?0:1,k=Mt(i),U=k[_];if(U===null)return!1;U===!1&&(U=m.getDefaultStep(b[i],x,t.keyboardDefaultStep)),S||c?U*=t.keyboardPageMultiplier:U*=t.keyboardMultiplier,U=Math.max(U,1e-7),U=(x?-1:1)*U,V=z[i]+U}else g?V=t.spectrum.xVal[t.spectrum.xVal.length-1]:V=t.spectrum.xVal[0];return X(i,m.toStepping(V),!0,!0),P("slide",i),P("update",i),P("change",i),P("set",i),!1}function Vt(e){e.fixed||p.forEach(function(i,a){T(f.start,i.children[0],ut,{handleNumbers:[a]})}),e.tap&&T(f.start,w,fe,{}),e.hover&&T(f.move,w,ue,{hover:!0}),e.drag&&D.forEach(function(i,a){if(!(i===!1||a===0||a===D.length-1)){var n=p[a-1],o=p[a],l=[i],h=[n,o],c=[a-1,a];L(i,t.cssClasses.draggable),e.fixed&&(l.push(n.children[0]),l.push(o.children[0])),e.dragAll&&(h=p,c=M),l.forEach(function(S){T(f.start,S,ut,{handles:h,handleNumbers:c,connect:i})})}})}function ct(e,i){F[e]=F[e]||[],F[e].push(i),e.split(".")[0]==="update"&&p.forEach(function(a,n){P("update",n)})}function he(e){return e===K.aria||e===K.tooltips}function W(e){var i=e&&e.split(".")[0],a=i?e.substring(i.length):e;Object.keys(F).forEach(function(n){var o=n.split(".")[0],l=n.substring(o.length);(!i||i===o)&&(!a||a===l)&&(!he(l)||a===l)&&delete F[n]})}function P(e,i,a){Object.keys(F).forEach(function(n){var o=n.split(".")[0];e===o&&F[n].forEach(function(l){l.call(tt,z.map(t.format.to),i,z.slice(),a||!1,b.slice(),tt)})})}function Z(e,i,a,n,o,l,h){var c;return p.length>1&&!t.events.unconstrained&&(n&&i>0&&(c=m.getAbsoluteDistance(e[i-1],t.margin,!1),a=Math.max(a,c)),o&&i1&&t.limit&&(n&&i>0&&(c=m.getAbsoluteDistance(e[i-1],t.limit,!1),a=Math.min(a,c)),o&&i1?n.forEach(function(A,g){var V=Z(l,A,l[A]+i,S[g],x[g],!1,c);V===!1?i=0:(i=V-l[A],l[A]=V)}):S=x=[!0];var E=!1;n.forEach(function(A,g){E=X(A,a[A]+i,S[g],x[g],!1,c)||E}),E&&(n.forEach(function(A){P("update",A),P("slide",A)}),o!=null&&P("drag",h))}function yt(e,i){return t.dir?100-e-i:e}function ve(e,i){b[e]=i,z[e]=m.fromStepping(i);var a=yt(i,0)-Wt,n="translate("+ht(a+"%","0")+")";if(p[e].style[t.transformRule]=n,t.events.invertConnects&&b.length>1){var o=b.every(function(l,h,c){return h===0||l>=c[h-1]});if(q!==!o){xe();return}}$(e),$(e+1),q&&($(e-1),$(e+2))}function vt(){M.forEach(function(e){var i=b[e]>50?-1:1,a=3+(p.length+i*e);p[e].style.zIndex=String(a)})}function X(e,i,a,n,o,l){return o||(i=Z(b,e,i,a,n,!1,l)),i===!1?!1:(ve(e,i),!0)}function $(e){if(D[e]){var i=b.slice();q&&i.sort(function(c,S){return c-S});var a=0,n=100;e!==0&&(a=i[e-1]),e!==D.length-1&&(n=i[e]);var o=n-a,l="translate("+ht(yt(a,o)+"%","0")+")",h="scale("+ht(o/100,"1")+")";D[e].style[t.transformRule]=l+" "+h}}function kt(e,i){return e===null||e===!1||e===void 0||(typeof e=="number"&&(e=String(e)),e=t.format.from(e),e!==!1&&(e=m.toStepping(e)),e===!1||isNaN(e))?b[i]:e}function Q(e,i,a){var n=it(e),o=b[0]===void 0;i=i===void 0?!0:i,t.animate&&!o&&Rt(v,t.cssClasses.tap,t.animationDuration),M.forEach(function(c){X(c,kt(n[c],c),!0,!1,a)});var l=M.length===1?0:1;if(o&&m.hasNoSize()&&(a=!0,b[0]=0,M.length>1)){var h=100/(M.length-1);M.forEach(function(c){b[c]=c*h})}for(;l=0&&ea.stepAfter.startValue&&(o=a.stepAfter.startValue-n),n>a.thisStep.startValue?l=a.thisStep.step:a.stepBefore.step===!1?l=!1:l=n-a.stepBefore.highestStep,i===100?o=null:i===0&&(l=null);var h=m.countStepDecimals();return o!==null&&o!==!1&&(o=Number(o.toFixed(h))),l!==null&&l!==!1&&(l=Number(l.toFixed(h))),[l,o]}function ge(){return M.map(Mt)}function Se(e,i){var a=Ut(),n=["margin","limit","padding","range","animate","snap","step","format","pips","tooltips","connect"];n.forEach(function(l){e[l]!==void 0&&(s[l]=e[l])});var o=Xt(s);n.forEach(function(l){e[l]!==void 0&&(t[l]=o[l])}),m=o.spectrum,t.margin=o.margin,t.limit=o.limit,t.padding=o.padding,t.pips?lt(t.pips):ot(),t.tooltips?Ct():st(),b=[],Q(St(e.start)?e.start:a,i),e.connect&&_t()}function _t(){for(;C.firstChild;)C.removeChild(C.firstChild);for(var e=0;e<=t.handles;e++)D[e]=at(C,t.connect[e]),$(e);Vt({drag:t.events.drag,fixed:!0})}function xe(){q=!q,qt(t,t.connect.map(function(e){return!e})),_t()}function be(){w=Jt(v),Gt(t.connect,w),Vt(t.events),Q(t.start),t.pips&<(t.pips),t.tooltips&&Ct(),ee()}be();var tt={destroy:me,steps:ge,on:ct,off:W,get:Ut,set:Q,setHandle:pe,reset:de,disable:Qt,enable:te,__moveHandles:function(e,i,a){Dt(e,i,b,a)},options:s,updateOptions:Se,target:v,removePips:ot,removeTooltips:st,getPositions:function(){return b.slice()},getTooltips:function(){return j},getOrigins:function(){return p},pips:lt};return tt}function ar(r,t){if(!r||!r.nodeName)throw new Error("noUiSlider: create requires a single element, got: "+r);if(r.noUiSlider)throw new Error("noUiSlider: Slider was already initialized.");var s=Xt(t),f=ir(r,s,t);return r.noUiSlider=f,f}var Yt={__spectrum:Kt,cssClasses:It,create:ar};function nr({arePipsStepped:r,behavior:t,decimalPlaces:s,fillTrack:f,isDisabled:u,isRtl:d,isVertical:v,maxDifference:w,minDifference:C,maxValue:p,minValue:D,nonLinearPoints:y,pipsDensity:j,pipsFilter:m,pipsFormatter:z,pipsMode:b,pipsValues:M,rangePadding:Y,state:F,step:q,tooltips:B}){return{state:F,slider:null,init(){this.slider=Yt.create(this.$el,{behaviour:t,direction:d?"rtl":"ltr",connect:f,format:{from:H=>+H,to:H=>s!==null?+H.toFixed(s):H},limit:w,margin:C,orientation:v?"vertical":"horizontal",padding:Y,pips:b?{density:j??10,filter:m,format:z,mode:b,stepped:r,values:M}:null,range:{min:D,...y??{},max:p},start:Alpine.raw(this.state),step:q,tooltips:B}),u&&this.slider.disable(),this.slider.on("change",H=>{this.state=H.length>1?H:H[0]}),this.$watch("state",()=>{this.slider.set(Alpine.raw(this.state))})},destroy(){this.slider.destroy(),this.slider=null}}}export{nr as default}; diff --git a/public/js/filament/forms/components/tags-input.js b/public/js/filament/forms/components/tags-input.js index c19c04a13f..2266d496c6 100644 --- a/public/js/filament/forms/components/tags-input.js +++ b/public/js/filament/forms/components/tags-input.js @@ -1 +1 @@ -function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{["x-on:blur"]:"createTag()",["x-model"]:"newTag",["x-on:keydown"](t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},["x-on:paste"](){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default}; +function s({state:n,splitKeys:a}){return{newTag:"",state:n,createTag(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag(t){this.state=this.state.filter(e=>e!==t)},reorderTags(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{"x-on:blur":"createTag()","x-model":"newTag","x-on:keydown"(t){["Enter",...a].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},"x-on:paste"(){this.$nextTick(()=>{if(a.length===0){this.createTag();return}let t=a.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{s as default}; diff --git a/public/js/filament/forms/components/textarea.js b/public/js/filament/forms/components/textarea.js index 4fda241af0..d3491c3ca9 100644 --- a/public/js/filament/forms/components/textarea.js +++ b/public/js/filament/forms/components/textarea.js @@ -1 +1 @@ -function r({initialHeight:t,shouldAutosize:i,state:s}){return{state:s,wrapperEl:null,init:function(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight:function(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=t+"rem")},resize:function(){if(this.setInitialHeight(),this.$el.scrollHeight<=0)return;let e=this.$el.scrollHeight+"px";this.wrapperEl.style.height!==e&&(this.wrapperEl.style.height=e)},setUpResizeObserver:function(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{r as default}; +function n({initialHeight:e,shouldAutosize:i,state:h}){return{state:h,wrapperEl:null,init(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=e+"rem")},resize(){if(this.$el.scrollHeight<=0)return;let t=this.$el.style.height;this.$el.style.height="0px";let r=this.$el.scrollHeight;this.$el.style.height=t;let l=parseFloat(e)*parseFloat(getComputedStyle(document.documentElement).fontSize),s=Math.max(r,l)+"px";this.wrapperEl.style.height!==s&&(this.wrapperEl.style.height=s)},setUpResizeObserver(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{n as default}; diff --git a/public/js/filament/notifications/notifications.js b/public/js/filament/notifications/notifications.js index 3c6d3ee472..4c79096936 100644 --- a/public/js/filament/notifications/notifications.js +++ b/public/js/filament/notifications/notifications.js @@ -1 +1 @@ -(()=>{var O=Object.create;var N=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var d=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports);var j=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Y(t))!W.call(i,n)&&n!==e&&N(i,n,{get:()=>t[n],enumerable:!(s=V(t,n))||s.enumerable});return i};var J=(i,t,e)=>(e=i!=null?O(H(i)):{},j(t||!i||!i.__esModule?N(e,"default",{value:i,enumerable:!0}):e,i));var S=d((ut,_)=>{var v,g=typeof global<"u"&&(global.crypto||global.msCrypto);g&&g.getRandomValues&&(y=new Uint8Array(16),v=function(){return g.getRandomValues(y),y});var y;v||(T=new Array(16),v=function(){for(var i=0,t;i<16;i++)i&3||(t=Math.random()*4294967296),T[i]=t>>>((i&3)<<3)&255;return T});var T;_.exports=v});var C=d((ct,U)=>{var P=[];for(f=0;f<256;++f)P[f]=(f+256).toString(16).substr(1);var f;function K(i,t){var e=t||0,s=P;return s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]}U.exports=K});var R=d((lt,F)=>{var Q=S(),X=C(),a=Q(),Z=[a[0]|1,a[1],a[2],a[3],a[4],a[5]],b=(a[6]<<8|a[7])&16383,D=0,A=0;function tt(i,t,e){var s=t&&e||0,n=t||[];i=i||{};var r=i.clockseq!==void 0?i.clockseq:b,o=i.msecs!==void 0?i.msecs:new Date().getTime(),h=i.nsecs!==void 0?i.nsecs:A+1,l=o-D+(h-A)/1e4;if(l<0&&i.clockseq===void 0&&(r=r+1&16383),(l<0||o>D)&&i.nsecs===void 0&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");D=o,A=h,b=r,o+=122192928e5;var c=((o&268435455)*1e4+h)%4294967296;n[s++]=c>>>24&255,n[s++]=c>>>16&255,n[s++]=c>>>8&255,n[s++]=c&255;var u=o/4294967296*1e4&268435455;n[s++]=u>>>8&255,n[s++]=u&255,n[s++]=u>>>24&15|16,n[s++]=u>>>16&255,n[s++]=r>>>8|128,n[s++]=r&255;for(var $=i.node||Z,m=0;m<6;++m)n[s+m]=$[m];return t||X(n)}F.exports=tt});var I=d((dt,G)=>{var it=S(),et=C();function st(i,t,e){var s=t&&e||0;typeof i=="string"&&(t=i=="binary"?new Array(16):null,i=null),i=i||{};var n=i.random||(i.rng||it)();if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t)for(var r=0;r<16;++r)t[s+r]=n[r];return t||et(n)}G.exports=st});var z=d((ft,M)=>{var nt=R(),L=I(),E=L;E.v1=nt;E.v4=L;M.exports=E});function k(i,t=()=>{}){let e=!1;return function(){e?t.apply(this,arguments):(e=!0,i.apply(this,arguments))}}var q=i=>{i.data("notificationComponent",({notification:t})=>({isShown:!1,computedStyle:null,transitionDuration:null,transitionEasing:null,init:function(){this.computedStyle=window.getComputedStyle(this.$el),this.transitionDuration=parseFloat(this.computedStyle.transitionDuration)*1e3,this.transitionEasing=this.computedStyle.transitionTimingFunction,this.configureTransitions(),this.configureAnimations(),t.duration&&t.duration!=="persistent"&&setTimeout(()=>{if(!this.$el.matches(":hover")){this.close();return}this.$el.addEventListener("mouseleave",()=>this.close())},t.duration),this.isShown=!0},configureTransitions:function(){let e=this.computedStyle.display,s=()=>{i.mutateDom(()=>{this.$el.style.setProperty("display",e),this.$el.style.setProperty("visibility","visible")}),this.$el._x_isShown=!0},n=()=>{i.mutateDom(()=>{this.$el._x_isShown?this.$el.style.setProperty("visibility","hidden"):this.$el.style.setProperty("display","none")})},r=k(o=>o?s():n(),o=>{this.$el._x_toggleAndCascadeWithTransitions(this.$el,o,s,n)});i.effect(()=>r(this.isShown))},configureAnimations:function(){let e;Livewire.hook("commit",({component:s,commit:n,succeed:r,fail:o,respond:h})=>{if(!s.snapshot.data.isFilamentNotificationsComponent)return;let l=()=>this.$el.getBoundingClientRect().top,c=l();h(()=>{e=()=>{this.isShown&&this.$el.animate([{transform:`translateY(${c-l()}px)`},{transform:"translateY(0px)"}],{duration:this.transitionDuration,easing:this.transitionEasing})},this.$el.getAnimations().forEach(u=>u.finish())}),r(({snapshot:u,effect:$})=>{e()})})},close:function(){this.isShown=!1,setTimeout(()=>window.dispatchEvent(new CustomEvent("notificationClosed",{detail:{id:t.id}})),this.transitionDuration)},markAsRead:function(){window.dispatchEvent(new CustomEvent("markedNotificationAsRead",{detail:{id:t.id}}))},markAsUnread:function(){window.dispatchEvent(new CustomEvent("markedNotificationAsUnread",{detail:{id:t.id}}))}}))};var B=J(z(),1),p=class{constructor(){return this.id((0,B.v4)()),this}id(t){return this.id=t,this}title(t){return this.title=t,this}body(t){return this.body=t,this}actions(t){return this.actions=t,this}status(t){return this.status=t,this}color(t){return this.color=t,this}icon(t){return this.icon=t,this}iconColor(t){return this.iconColor=t,this}duration(t){return this.duration=t,this}seconds(t){return this.duration(t*1e3),this}persistent(){return this.duration("persistent"),this}danger(){return this.status("danger"),this}info(){return this.status("info"),this}success(){return this.status("success"),this}warning(){return this.status("warning"),this}view(t){return this.view=t,this}viewData(t){return this.viewData=t,this}send(){return window.dispatchEvent(new CustomEvent("notificationSent",{detail:{notification:this}})),this}},w=class{constructor(t){return this.name(t),this}name(t){return this.name=t,this}color(t){return this.color=t,this}dispatch(t,e){return this.event(t),this.eventData(e),this}dispatchSelf(t,e){return this.dispatch(t,e),this.dispatchDirection="self",this}dispatchTo(t,e,s){return this.dispatch(e,s),this.dispatchDirection="to",this.dispatchToComponent=t,this}emit(t,e){return this.dispatch(t,e),this}emitSelf(t,e){return this.dispatchSelf(t,e),this}emitTo(t,e,s){return this.dispatchTo(t,e,s),this}dispatchDirection(t){return this.dispatchDirection=t,this}dispatchToComponent(t){return this.dispatchToComponent=t,this}event(t){return this.event=t,this}eventData(t){return this.eventData=t,this}extraAttributes(t){return this.extraAttributes=t,this}icon(t){return this.icon=t,this}iconPosition(t){return this.iconPosition=t,this}outlined(t=!0){return this.isOutlined=t,this}disabled(t=!0){return this.isDisabled=t,this}label(t){return this.label=t,this}close(t=!0){return this.shouldClose=t,this}openUrlInNewTab(t=!0){return this.shouldOpenUrlInNewTab=t,this}size(t){return this.size=t,this}url(t){return this.url=t,this}view(t){return this.view=t,this}button(){return this.view("filament-actions::button-action"),this}grouped(){return this.view("filament-actions::grouped-action"),this}link(){return this.view("filament-actions::link-action"),this}},x=class{constructor(t){return this.actions(t),this}actions(t){return this.actions=t.map(e=>e.grouped()),this}color(t){return this.color=t,this}icon(t){return this.icon=t,this}iconPosition(t){return this.iconPosition=t,this}label(t){return this.label=t,this}tooltip(t){return this.tooltip=t,this}};window.FilamentNotificationAction=w;window.FilamentNotificationActionGroup=x;window.FilamentNotification=p;document.addEventListener("alpine:init",()=>{window.Alpine.plugin(q)});})(); +(()=>{var z=Object.create;var $=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var d=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports);var j=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of V(t))!W.call(i,n)&&n!==e&&$(i,n,{get:()=>t[n],enumerable:!(s=O(t,n))||s.enumerable});return i};var J=(i,t,e)=>(e=i!=null?z(Y(i)):{},j(t||!i||!i.__esModule?$(e,"default",{value:i,enumerable:!0}):e,i));var S=d((ut,q)=>{var v,g=typeof global<"u"&&(global.crypto||global.msCrypto);g&&g.getRandomValues&&(y=new Uint8Array(16),v=function(){return g.getRandomValues(y),y});var y;v||(T=new Array(16),v=function(){for(var i=0,t;i<16;i++)(i&3)===0&&(t=Math.random()*4294967296),T[i]=t>>>((i&3)<<3)&255;return T});var T;q.exports=v});var C=d((ct,P)=>{var _=[];for(f=0;f<256;++f)_[f]=(f+256).toString(16).substr(1);var f;function K(i,t){var e=t||0,s=_;return s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+"-"+s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]+s[i[e++]]}P.exports=K});var L=d((lt,F)=>{var Q=S(),X=C(),a=Q(),Z=[a[0]|1,a[1],a[2],a[3],a[4],a[5]],U=(a[6]<<8|a[7])&16383,D=0,A=0;function tt(i,t,e){var s=t&&e||0,n=t||[];i=i||{};var r=i.clockseq!==void 0?i.clockseq:U,o=i.msecs!==void 0?i.msecs:new Date().getTime(),h=i.nsecs!==void 0?i.nsecs:A+1,l=o-D+(h-A)/1e4;if(l<0&&i.clockseq===void 0&&(r=r+1&16383),(l<0||o>D)&&i.nsecs===void 0&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");D=o,A=h,U=r,o+=122192928e5;var c=((o&268435455)*1e4+h)%4294967296;n[s++]=c>>>24&255,n[s++]=c>>>16&255,n[s++]=c>>>8&255,n[s++]=c&255;var u=o/4294967296*1e4&268435455;n[s++]=u>>>8&255,n[s++]=u&255,n[s++]=u>>>24&15|16,n[s++]=u>>>16&255,n[s++]=r>>>8|128,n[s++]=r&255;for(var E=i.node||Z,m=0;m<6;++m)n[s+m]=E[m];return t||X(n)}F.exports=tt});var H=d((dt,R)=>{var it=S(),et=C();function st(i,t,e){var s=t&&e||0;typeof i=="string"&&(t=i=="binary"?new Array(16):null,i=null),i=i||{};var n=i.random||(i.rng||it)();if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t)for(var r=0;r<16;++r)t[s+r]=n[r];return t||et(n)}R.exports=st});var I=d((ft,G)=>{var nt=L(),B=H(),k=B;k.v1=nt;k.v4=B;G.exports=k});function b(i,t=()=>{}){let e=!1;return function(){e?t.apply(this,arguments):(e=!0,i.apply(this,arguments))}}var N=i=>{i.data("notificationComponent",({notification:t})=>({isShown:!1,computedStyle:null,transitionDuration:null,transitionEasing:null,unsubscribeLivewireHook:null,init(){this.computedStyle=window.getComputedStyle(this.$el),this.transitionDuration=parseFloat(this.computedStyle.transitionDuration)*1e3,this.transitionEasing=this.computedStyle.transitionTimingFunction,this.configureTransitions(),this.configureAnimations(),t.duration&&t.duration!=="persistent"&&setTimeout(()=>{if(!this.$el.matches(":hover")){this.close();return}this.$el.addEventListener("mouseleave",()=>this.close())},t.duration),this.isShown=!0},configureTransitions(){let e=this.computedStyle.display,s=()=>{i.mutateDom(()=>{this.$el.style.setProperty("display",e),this.$el.style.setProperty("visibility","visible")}),this.$el._x_isShown=!0},n=()=>{i.mutateDom(()=>{this.$el._x_isShown?this.$el.style.setProperty("visibility","hidden"):this.$el.style.setProperty("display","none")})},r=b(o=>o?s():n(),o=>{this.$el._x_toggleAndCascadeWithTransitions(this.$el,o,s,n)});i.effect(()=>r(this.isShown))},configureAnimations(){let e;this.unsubscribeLivewireHook=Livewire.hook("commit",({component:s,commit:n,succeed:r,fail:o,respond:h})=>{s.snapshot.data.isFilamentNotificationsComponent&&requestAnimationFrame(()=>{let l=()=>this.$el.getBoundingClientRect().top,c=l();h(()=>{e=()=>{this.isShown&&this.$el.animate([{transform:`translateY(${c-l()}px)`},{transform:"translateY(0px)"}],{duration:this.transitionDuration,easing:this.transitionEasing})},this.$el.getAnimations().forEach(u=>u.finish())}),r(({snapshot:u,effect:E})=>{e()})})})},close(){this.isShown=!1,setTimeout(()=>window.dispatchEvent(new CustomEvent("notificationClosed",{detail:{id:t.id}})),this.transitionDuration)},markAsRead(){window.dispatchEvent(new CustomEvent("markedNotificationAsRead",{detail:{id:t.id}}))},markAsUnread(){window.dispatchEvent(new CustomEvent("markedNotificationAsUnread",{detail:{id:t.id}}))},destroy(){this.unsubscribeLivewireHook?.()}}))};var M=J(I(),1),p=class{constructor(){return this.id((0,M.v4)()),this}id(t){return this.id=t,this}title(t){return this.title=t,this}body(t){return this.body=t,this}actions(t){return this.actions=t,this}status(t){return this.status=t,this}color(t){return this.color=t,this}icon(t){return this.icon=t,this}iconColor(t){return this.iconColor=t,this}duration(t){return this.duration=t,this}seconds(t){return this.duration(t*1e3),this}persistent(){return this.duration("persistent"),this}danger(){return this.status("danger"),this}info(){return this.status("info"),this}success(){return this.status("success"),this}warning(){return this.status("warning"),this}view(t){return this.view=t,this}viewData(t){return this.viewData=t,this}send(){return window.dispatchEvent(new CustomEvent("notificationSent",{detail:{notification:this}})),this}},w=class{constructor(t){return this.name(t),this}name(t){return this.name=t,this}color(t){return this.color=t,this}dispatch(t,e){return this.event(t),this.eventData(e),this}dispatchSelf(t,e){return this.dispatch(t,e),this.dispatchDirection="self",this}dispatchTo(t,e,s){return this.dispatch(e,s),this.dispatchDirection="to",this.dispatchToComponent=t,this}emit(t,e){return this.dispatch(t,e),this}emitSelf(t,e){return this.dispatchSelf(t,e),this}emitTo(t,e,s){return this.dispatchTo(t,e,s),this}dispatchDirection(t){return this.dispatchDirection=t,this}dispatchToComponent(t){return this.dispatchToComponent=t,this}event(t){return this.event=t,this}eventData(t){return this.eventData=t,this}extraAttributes(t){return this.extraAttributes=t,this}icon(t){return this.icon=t,this}iconPosition(t){return this.iconPosition=t,this}outlined(t=!0){return this.isOutlined=t,this}disabled(t=!0){return this.isDisabled=t,this}label(t){return this.label=t,this}close(t=!0){return this.shouldClose=t,this}openUrlInNewTab(t=!0){return this.shouldOpenUrlInNewTab=t,this}size(t){return this.size=t,this}url(t){return this.url=t,this}view(t){return this.view=t,this}button(){return this.view("filament::components.button.index"),this}grouped(){return this.view("filament::components.dropdown.list.item"),this}iconButton(){return this.view("filament::components.icon-button"),this}link(){return this.view("filament::components.link"),this}},x=class{constructor(t){return this.actions(t),this}actions(t){return this.actions=t.map(e=>e.grouped()),this}color(t){return this.color=t,this}icon(t){return this.icon=t,this}iconPosition(t){return this.iconPosition=t,this}label(t){return this.label=t,this}tooltip(t){return this.tooltip=t,this}};window.FilamentNotificationAction=w;window.FilamentNotificationActionGroup=x;window.FilamentNotification=p;document.addEventListener("alpine:init",()=>{window.Alpine.plugin(N)});})(); diff --git a/public/js/filament/schemas/components/actions.js b/public/js/filament/schemas/components/actions.js new file mode 100644 index 0000000000..703b92d653 --- /dev/null +++ b/public/js/filament/schemas/components/actions.js @@ -0,0 +1 @@ +var i=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let e=this.$el.parentElement;e&&(this.updateWidth(),this.resizeObserver=new ResizeObserver(()=>this.updateWidth()),this.resizeObserver.observe(e),this.boundUpdateWidth=this.updateWidth.bind(this),window.addEventListener("resize",this.boundUpdateWidth))},enableSticky(){this.isSticky=this.$el.getBoundingClientRect().top>0},disableSticky(){this.isSticky=!1},updateWidth(){let e=this.$el.parentElement;if(!e)return;let t=getComputedStyle(this.$root.querySelector(".fi-ac"));this.width=e.offsetWidth+parseInt(t.marginInlineStart,10)*-1+parseInt(t.marginInlineEnd,10)*-1},destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.boundUpdateWidth&&(window.removeEventListener("resize",this.boundUpdateWidth),this.boundUpdateWidth=null)}});export{i as default}; diff --git a/public/js/filament/schemas/components/tabs.js b/public/js/filament/schemas/components/tabs.js new file mode 100644 index 0000000000..f77e80b08c --- /dev/null +++ b/public/js/filament/schemas/components/tabs.js @@ -0,0 +1 @@ +function I({activeTab:w,isScrollable:f,isTabPersistedInQueryString:m,livewireId:g,tab:T,tabQueryStringKey:c}){return{boundResizeHandler:null,isScrollable:f,resizeDebounceTimer:null,tab:T,unsubscribeLivewireHook:null,withinDropdownIndex:null,withinDropdownMounted:!1,init(){let t=this.getTabs(),e=new URLSearchParams(window.location.search);m&&e.has(c)&&t.includes(e.get(c))&&(this.tab=e.get(c)),this.$watch("tab",()=>this.updateQueryString()),(!this.tab||!t.includes(this.tab))&&(this.tab=t[w-1]),this.unsubscribeLivewireHook=Livewire.hook("commit",({component:n,commit:d,succeed:r,fail:h,respond:u})=>{r(({snapshot:b,effect:i})=>{this.$nextTick(()=>{if(n.id!==g)return;let a=this.getTabs();a.includes(this.tab)||(this.tab=a[w-1]??this.tab)})})}),f||(this.boundResizeHandler=this.debouncedUpdateTabsWithinDropdown.bind(this),window.addEventListener("resize",this.boundResizeHandler),this.updateTabsWithinDropdown())},calculateAvailableWidth(t){let e=window.getComputedStyle(t);return Math.floor(t.clientWidth)-Math.ceil(parseFloat(e.paddingLeft))*2},calculateContainerGap(t){let e=window.getComputedStyle(t);return Math.ceil(parseFloat(e.columnGap))},calculateDropdownIconWidth(t){let e=t.querySelector(".fi-icon");return Math.ceil(e.clientWidth)},calculateTabItemGap(t){let e=window.getComputedStyle(t);return Math.ceil(parseFloat(e.columnGap)||8)},calculateTabItemPadding(t){let e=window.getComputedStyle(t);return Math.ceil(parseFloat(e.paddingLeft))+Math.ceil(parseFloat(e.paddingRight))},findOverflowIndex(t,e,n,d,r,h){let u=t.map(i=>Math.ceil(i.clientWidth)),b=t.map(i=>{let a=i.querySelector(".fi-tabs-item-label"),s=i.querySelector(".fi-badge"),o=Math.ceil(a.clientWidth),l=s?Math.ceil(s.clientWidth):0;return{label:o,badge:l,total:o+(l>0?d+l:0)}});for(let i=0;ip+y,0),s=i*n,o=b.slice(i+1),l=o.length>0,W=l?Math.max(...o.map(p=>p.total)):0,D=l?r+W+d+h+n:0;if(a+s+D>e)return i}return-1},get isDropdownButtonVisible(){return this.withinDropdownMounted?this.withinDropdownIndex===null?!1:this.getTabs().findIndex(e=>e===this.tab)this.updateTabsWithinDropdown(),150)},async updateTabsWithinDropdown(){this.withinDropdownIndex=null,this.withinDropdownMounted=!1,await this.$nextTick();let t=this.$el.querySelector(".fi-tabs"),e=t.querySelector(".fi-tabs-item:last-child"),n=Array.from(t.children).slice(0,-1),d=n.map(s=>s.style.display);n.forEach(s=>s.style.display=""),t.offsetHeight;let r=this.calculateAvailableWidth(t),h=this.calculateContainerGap(t),u=this.calculateDropdownIconWidth(e),b=this.calculateTabItemGap(n[0]),i=this.calculateTabItemPadding(n[0]),a=this.findOverflowIndex(n,r,h,b,i,u);n.forEach((s,o)=>s.style.display=d[o]),a!==-1&&(this.withinDropdownIndex=a),this.withinDropdownMounted=!0},destroy(){this.unsubscribeLivewireHook?.(),this.boundResizeHandler&&window.removeEventListener("resize",this.boundResizeHandler),clearTimeout(this.resizeDebounceTimer)}}}export{I as default}; diff --git a/public/js/filament/schemas/components/wizard.js b/public/js/filament/schemas/components/wizard.js new file mode 100644 index 0000000000..2572f4784e --- /dev/null +++ b/public/js/filament/schemas/components/wizard.js @@ -0,0 +1 @@ +function o({isSkippable:s,isStepPersistedInQueryString:i,key:r,startStep:h,stepQueryStringKey:n}){return{step:null,init(){this.$watch("step",()=>this.updateQueryString()),this.step=this.getSteps().at(h-1),this.autofocusFields()},async requestNextStep(){await this.$wire.callSchemaComponentMethod(r,"nextStep",{currentStepIndex:this.getStepIndex(this.step)})},goToNextStep(){let t=this.getStepIndex(this.step)+1;t>=this.getSteps().length||(this.step=this.getSteps()[t],this.autofocusFields(),this.scroll())},goToPreviousStep(){let t=this.getStepIndex(this.step)-1;t<0||(this.step=this.getSteps()[t],this.autofocusFields(),this.scroll())},goToStep(t){let e=this.getStepIndex(t);e<=-1||!s&&e>this.getStepIndex(this.step)||(this.step=t,this.autofocusFields(),this.scroll())},scroll(){this.$nextTick(()=>{this.$refs.header?.children[this.getStepIndex(this.step)].scrollIntoView({behavior:"smooth",block:"start"})})},autofocusFields(){this.$nextTick(()=>this.$refs[`step-${this.step}`].querySelector("[autofocus]")?.focus())},getStepIndex(t){let e=this.getSteps().findIndex(p=>p===t);return e===-1?0:e},getSteps(){return JSON.parse(this.$refs.stepsData.value)},isFirstStep(){return this.getStepIndex(this.step)<=0},isLastStep(){return this.getStepIndex(this.step)+1>=this.getSteps().length},isStepAccessible(t){return s||this.getStepIndex(this.step)>this.getStepIndex(t)},updateQueryString(){if(!i)return;let t=new URL(window.location.href);t.searchParams.set(n,this.step),history.replaceState(null,document.title,t.toString())}}}export{o as default}; diff --git a/public/js/filament/schemas/schemas.js b/public/js/filament/schemas/schemas.js new file mode 100644 index 0000000000..892ac1097c --- /dev/null +++ b/public/js/filament/schemas/schemas.js @@ -0,0 +1 @@ +(()=>{var d=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let t=this.$el.parentElement;t&&(this.updateWidth(),this.resizeObserver=new ResizeObserver(()=>this.updateWidth()),this.resizeObserver.observe(t),this.boundUpdateWidth=this.updateWidth.bind(this),window.addEventListener("resize",this.boundUpdateWidth))},enableSticky(){this.isSticky=this.$el.getBoundingClientRect().top>0},disableSticky(){this.isSticky=!1},updateWidth(){let t=this.$el.parentElement;if(!t)return;let e=getComputedStyle(this.$root.querySelector(".fi-ac"));this.width=t.offsetWidth+parseInt(e.marginInlineStart,10)*-1+parseInt(e.marginInlineEnd,10)*-1},destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.boundUpdateWidth&&(window.removeEventListener("resize",this.boundUpdateWidth),this.boundUpdateWidth=null)}});var u=function(t,e,n){let i=t;if(e.startsWith("/")&&(n=!0,e=e.slice(1)),n)return e;for(;e.startsWith("../");)i=i.includes(".")?i.slice(0,i.lastIndexOf(".")):null,e=e.slice(3);return["",null,void 0].includes(i)?e:["",null,void 0].includes(e)?i:`${i}.${e}`},c=t=>{let e=Alpine.findClosest(t,n=>n.__livewire);if(!e)throw"Could not find Livewire component in DOM tree.";return e.__livewire};document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentSchema",({livewireId:t})=>({handleFormValidationError(e){e.detail.livewireId===t&&this.$nextTick(()=>{let n=this.$el.querySelector("[data-validation-error]");if(!n)return;let i=n;for(;i;)i.dispatchEvent(new CustomEvent("expand")),i=i.parentNode;setTimeout(()=>n.closest("[data-field-wrapper]").scrollIntoView({behavior:"smooth",block:"start",inline:"start"}),200)})},isStateChanged(e,n){if(e===void 0)return!1;try{return JSON.stringify(e)!==JSON.stringify(n)}catch{return e!==n}}})),window.Alpine.data("filamentSchemaComponent",({path:t,containerPath:e,$wire:n})=>({$statePath:t,$get:(i,s)=>n.$get(u(e,i,s)),$set:(i,s,a,o=!1)=>n.$set(u(e,i,a),s,o),get $state(){return n.$get(t)}})),window.Alpine.data("filamentActionsSchemaComponent",d),Livewire.hook("commit",({component:t,commit:e,respond:n,succeed:i,fail:s})=>{i(({snapshot:a,effects:o})=>{o.dispatches?.forEach(r=>{if(!r.params?.awaitSchemaComponent)return;let l=Array.from(t.el.querySelectorAll(`[wire\\:partial="schema-component::${r.params.awaitSchemaComponent}"]`)).filter(h=>c(h)===t);if(l.length!==1){if(l.length>1)throw`Multiple schema components found with key [${r.params.awaitSchemaComponent}].`;window.addEventListener(`schema-component-${t.id}-${r.params.awaitSchemaComponent}-loaded`,()=>{window.dispatchEvent(new CustomEvent(r.name,{detail:r.params}))},{once:!0})}})})})});})(); diff --git a/public/js/filament/support/support.js b/public/js/filament/support/support.js index 9616ced7f0..ec6b141f02 100644 --- a/public/js/filament/support/support.js +++ b/public/js/filament/support/support.js @@ -1,28 +1,28 @@ -(()=>{var Bo=Object.create;var Di=Object.defineProperty;var Ho=Object.getOwnPropertyDescriptor;var $o=Object.getOwnPropertyNames;var Wo=Object.getPrototypeOf,Vo=Object.prototype.hasOwnProperty;var Kr=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var zo=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of $o(e))!Vo.call(t,i)&&i!==r&&Di(t,i,{get:()=>e[i],enumerable:!(n=Ho(e,i))||n.enumerable});return t};var Uo=(t,e,r)=>(r=t!=null?Bo(Wo(t)):{},zo(e||!t||!t.__esModule?Di(r,"default",{value:t,enumerable:!0}):r,t));var oo=Kr(()=>{});var ao=Kr(()=>{});var so=Kr((Os,yr)=>{(function(){"use strict";var t="input is invalid type",e="finalize already called",r=typeof window=="object",n=r?window:{};n.JS_MD5_NO_WINDOW&&(r=!1);var i=!r&&typeof self=="object",o=!n.JS_MD5_NO_NODE_JS&&typeof process=="object"&&process.versions&&process.versions.node;o?n=global:i&&(n=self);var s=!n.JS_MD5_NO_COMMON_JS&&typeof yr=="object"&&yr.exports,h=typeof define=="function"&&define.amd,u=!n.JS_MD5_NO_ARRAY_BUFFER&&typeof ArrayBuffer<"u",f="0123456789abcdef".split(""),w=[128,32768,8388608,-2147483648],m=[0,8,16,24],E=["hex","array","digest","buffer","arrayBuffer","base64"],O="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),S=[],P;if(u){var R=new ArrayBuffer(68);P=new Uint8Array(R),S=new Uint32Array(R)}var $=Array.isArray;(n.JS_MD5_NO_NODE_JS||!$)&&($=function(l){return Object.prototype.toString.call(l)==="[object Array]"});var B=ArrayBuffer.isView;u&&(n.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW||!B)&&(B=function(l){return typeof l=="object"&&l.buffer&&l.buffer.constructor===ArrayBuffer});var K=function(l){var p=typeof l;if(p==="string")return[l,!0];if(p!=="object"||l===null)throw new Error(t);if(u&&l.constructor===ArrayBuffer)return[new Uint8Array(l),!1];if(!$(l)&&!B(l))throw new Error(t);return[l,!1]},X=function(l){return function(p){return new U(!0).update(p)[l]()}},ne=function(){var l=X("hex");o&&(l=J(l)),l.create=function(){return new U},l.update=function(d){return l.create().update(d)};for(var p=0;p>>6,Ue[_++]=128|d&63):d<55296||d>=57344?(Ue[_++]=224|d>>>12,Ue[_++]=128|d>>>6&63,Ue[_++]=128|d&63):(d=65536+((d&1023)<<10|l.charCodeAt(++N)&1023),Ue[_++]=240|d>>>18,Ue[_++]=128|d>>>12&63,Ue[_++]=128|d>>>6&63,Ue[_++]=128|d&63);else for(_=this.start;N>>2]|=d<>>2]|=(192|d>>>6)<>>2]|=(128|d&63)<=57344?(Q[_>>>2]|=(224|d>>>12)<>>2]|=(128|d>>>6&63)<>>2]|=(128|d&63)<>>2]|=(240|d>>>18)<>>2]|=(128|d>>>12&63)<>>2]|=(128|d>>>6&63)<>>2]|=(128|d&63)<>>2]|=l[N]<=64?(this.start=_-64,this.hash(),this.hashed=!0):this.start=_}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this},U.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var l=this.blocks,p=this.lastByteIndex;l[p>>>2]|=w[p&3],p>=56&&(this.hashed||this.hash(),l[0]=l[16],l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0),l[14]=this.bytes<<3,l[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},U.prototype.hash=function(){var l,p,v,d,N,_,M=this.blocks;this.first?(l=M[0]-680876937,l=(l<<7|l>>>25)-271733879<<0,d=(-1732584194^l&2004318071)+M[1]-117830708,d=(d<<12|d>>>20)+l<<0,v=(-271733879^d&(l^-271733879))+M[2]-1126478375,v=(v<<17|v>>>15)+d<<0,p=(l^v&(d^l))+M[3]-1316259209,p=(p<<22|p>>>10)+v<<0):(l=this.h0,p=this.h1,v=this.h2,d=this.h3,l+=(d^p&(v^d))+M[0]-680876936,l=(l<<7|l>>>25)+p<<0,d+=(v^l&(p^v))+M[1]-389564586,d=(d<<12|d>>>20)+l<<0,v+=(p^d&(l^p))+M[2]+606105819,v=(v<<17|v>>>15)+d<<0,p+=(l^v&(d^l))+M[3]-1044525330,p=(p<<22|p>>>10)+v<<0),l+=(d^p&(v^d))+M[4]-176418897,l=(l<<7|l>>>25)+p<<0,d+=(v^l&(p^v))+M[5]+1200080426,d=(d<<12|d>>>20)+l<<0,v+=(p^d&(l^p))+M[6]-1473231341,v=(v<<17|v>>>15)+d<<0,p+=(l^v&(d^l))+M[7]-45705983,p=(p<<22|p>>>10)+v<<0,l+=(d^p&(v^d))+M[8]+1770035416,l=(l<<7|l>>>25)+p<<0,d+=(v^l&(p^v))+M[9]-1958414417,d=(d<<12|d>>>20)+l<<0,v+=(p^d&(l^p))+M[10]-42063,v=(v<<17|v>>>15)+d<<0,p+=(l^v&(d^l))+M[11]-1990404162,p=(p<<22|p>>>10)+v<<0,l+=(d^p&(v^d))+M[12]+1804603682,l=(l<<7|l>>>25)+p<<0,d+=(v^l&(p^v))+M[13]-40341101,d=(d<<12|d>>>20)+l<<0,v+=(p^d&(l^p))+M[14]-1502002290,v=(v<<17|v>>>15)+d<<0,p+=(l^v&(d^l))+M[15]+1236535329,p=(p<<22|p>>>10)+v<<0,l+=(v^d&(p^v))+M[1]-165796510,l=(l<<5|l>>>27)+p<<0,d+=(p^v&(l^p))+M[6]-1069501632,d=(d<<9|d>>>23)+l<<0,v+=(l^p&(d^l))+M[11]+643717713,v=(v<<14|v>>>18)+d<<0,p+=(d^l&(v^d))+M[0]-373897302,p=(p<<20|p>>>12)+v<<0,l+=(v^d&(p^v))+M[5]-701558691,l=(l<<5|l>>>27)+p<<0,d+=(p^v&(l^p))+M[10]+38016083,d=(d<<9|d>>>23)+l<<0,v+=(l^p&(d^l))+M[15]-660478335,v=(v<<14|v>>>18)+d<<0,p+=(d^l&(v^d))+M[4]-405537848,p=(p<<20|p>>>12)+v<<0,l+=(v^d&(p^v))+M[9]+568446438,l=(l<<5|l>>>27)+p<<0,d+=(p^v&(l^p))+M[14]-1019803690,d=(d<<9|d>>>23)+l<<0,v+=(l^p&(d^l))+M[3]-187363961,v=(v<<14|v>>>18)+d<<0,p+=(d^l&(v^d))+M[8]+1163531501,p=(p<<20|p>>>12)+v<<0,l+=(v^d&(p^v))+M[13]-1444681467,l=(l<<5|l>>>27)+p<<0,d+=(p^v&(l^p))+M[2]-51403784,d=(d<<9|d>>>23)+l<<0,v+=(l^p&(d^l))+M[7]+1735328473,v=(v<<14|v>>>18)+d<<0,p+=(d^l&(v^d))+M[12]-1926607734,p=(p<<20|p>>>12)+v<<0,N=p^v,l+=(N^d)+M[5]-378558,l=(l<<4|l>>>28)+p<<0,d+=(N^l)+M[8]-2022574463,d=(d<<11|d>>>21)+l<<0,_=d^l,v+=(_^p)+M[11]+1839030562,v=(v<<16|v>>>16)+d<<0,p+=(_^v)+M[14]-35309556,p=(p<<23|p>>>9)+v<<0,N=p^v,l+=(N^d)+M[1]-1530992060,l=(l<<4|l>>>28)+p<<0,d+=(N^l)+M[4]+1272893353,d=(d<<11|d>>>21)+l<<0,_=d^l,v+=(_^p)+M[7]-155497632,v=(v<<16|v>>>16)+d<<0,p+=(_^v)+M[10]-1094730640,p=(p<<23|p>>>9)+v<<0,N=p^v,l+=(N^d)+M[13]+681279174,l=(l<<4|l>>>28)+p<<0,d+=(N^l)+M[0]-358537222,d=(d<<11|d>>>21)+l<<0,_=d^l,v+=(_^p)+M[3]-722521979,v=(v<<16|v>>>16)+d<<0,p+=(_^v)+M[6]+76029189,p=(p<<23|p>>>9)+v<<0,N=p^v,l+=(N^d)+M[9]-640364487,l=(l<<4|l>>>28)+p<<0,d+=(N^l)+M[12]-421815835,d=(d<<11|d>>>21)+l<<0,_=d^l,v+=(_^p)+M[15]+530742520,v=(v<<16|v>>>16)+d<<0,p+=(_^v)+M[2]-995338651,p=(p<<23|p>>>9)+v<<0,l+=(v^(p|~d))+M[0]-198630844,l=(l<<6|l>>>26)+p<<0,d+=(p^(l|~v))+M[7]+1126891415,d=(d<<10|d>>>22)+l<<0,v+=(l^(d|~p))+M[14]-1416354905,v=(v<<15|v>>>17)+d<<0,p+=(d^(v|~l))+M[5]-57434055,p=(p<<21|p>>>11)+v<<0,l+=(v^(p|~d))+M[12]+1700485571,l=(l<<6|l>>>26)+p<<0,d+=(p^(l|~v))+M[3]-1894986606,d=(d<<10|d>>>22)+l<<0,v+=(l^(d|~p))+M[10]-1051523,v=(v<<15|v>>>17)+d<<0,p+=(d^(v|~l))+M[1]-2054922799,p=(p<<21|p>>>11)+v<<0,l+=(v^(p|~d))+M[8]+1873313359,l=(l<<6|l>>>26)+p<<0,d+=(p^(l|~v))+M[15]-30611744,d=(d<<10|d>>>22)+l<<0,v+=(l^(d|~p))+M[6]-1560198380,v=(v<<15|v>>>17)+d<<0,p+=(d^(v|~l))+M[13]+1309151649,p=(p<<21|p>>>11)+v<<0,l+=(v^(p|~d))+M[4]-145523070,l=(l<<6|l>>>26)+p<<0,d+=(p^(l|~v))+M[11]-1120210379,d=(d<<10|d>>>22)+l<<0,v+=(l^(d|~p))+M[2]+718787259,v=(v<<15|v>>>17)+d<<0,p+=(d^(v|~l))+M[9]-343485551,p=(p<<21|p>>>11)+v<<0,this.first?(this.h0=l+1732584193<<0,this.h1=p-271733879<<0,this.h2=v-1732584194<<0,this.h3=d+271733878<<0,this.first=!1):(this.h0=this.h0+l<<0,this.h1=this.h1+p<<0,this.h2=this.h2+v<<0,this.h3=this.h3+d<<0)},U.prototype.hex=function(){this.finalize();var l=this.h0,p=this.h1,v=this.h2,d=this.h3;return f[l>>>4&15]+f[l&15]+f[l>>>12&15]+f[l>>>8&15]+f[l>>>20&15]+f[l>>>16&15]+f[l>>>28&15]+f[l>>>24&15]+f[p>>>4&15]+f[p&15]+f[p>>>12&15]+f[p>>>8&15]+f[p>>>20&15]+f[p>>>16&15]+f[p>>>28&15]+f[p>>>24&15]+f[v>>>4&15]+f[v&15]+f[v>>>12&15]+f[v>>>8&15]+f[v>>>20&15]+f[v>>>16&15]+f[v>>>28&15]+f[v>>>24&15]+f[d>>>4&15]+f[d&15]+f[d>>>12&15]+f[d>>>8&15]+f[d>>>20&15]+f[d>>>16&15]+f[d>>>28&15]+f[d>>>24&15]},U.prototype.toString=U.prototype.hex,U.prototype.digest=function(){this.finalize();var l=this.h0,p=this.h1,v=this.h2,d=this.h3;return[l&255,l>>>8&255,l>>>16&255,l>>>24&255,p&255,p>>>8&255,p>>>16&255,p>>>24&255,v&255,v>>>8&255,v>>>16&255,v>>>24&255,d&255,d>>>8&255,d>>>16&255,d>>>24&255]},U.prototype.array=U.prototype.digest,U.prototype.arrayBuffer=function(){this.finalize();var l=new ArrayBuffer(16),p=new Uint32Array(l);return p[0]=this.h0,p[1]=this.h1,p[2]=this.h2,p[3]=this.h3,l},U.prototype.buffer=U.prototype.arrayBuffer,U.prototype.base64=function(){for(var l,p,v,d="",N=this.array(),_=0;_<15;)l=N[_++],p=N[_++],v=N[_++],d+=O[l>>>2]+O[(l<<4|p>>>4)&63]+O[(p<<2|v>>>6)&63]+O[v&63];return l=N[_],d+=O[l>>>2]+O[l<<4&63]+"==",d};function Z(l,p){var v,d=K(l);if(l=d[0],d[1]){var N=[],_=l.length,M=0,Q;for(v=0;v<_;++v)Q=l.charCodeAt(v),Q<128?N[M++]=Q:Q<2048?(N[M++]=192|Q>>>6,N[M++]=128|Q&63):Q<55296||Q>=57344?(N[M++]=224|Q>>>12,N[M++]=128|Q>>>6&63,N[M++]=128|Q&63):(Q=65536+((Q&1023)<<10|l.charCodeAt(++v)&1023),N[M++]=240|Q>>>18,N[M++]=128|Q>>>12&63,N[M++]=128|Q>>>6&63,N[M++]=128|Q&63);l=N}l.length>64&&(l=new U(!0).update(l).array());var Ue=[],Rt=[];for(v=0;v<64;++v){var Vt=l[v]||0;Ue[v]=92^Vt,Rt[v]=54^Vt}U.call(this,p),this.update(Rt),this.oKeyPad=Ue,this.inner=!0,this.sharedMemory=p}Z.prototype=new U,Z.prototype.finalize=function(){if(U.prototype.finalize.call(this),this.inner){this.inner=!1;var l=this.array();U.call(this,this.sharedMemory),this.update(this.oKeyPad),this.update(l),U.prototype.finalize.call(this)}};var me=ne();me.md5=me,me.md5.hmac=de(),s?yr.exports=me:(n.md5=me,h&&define(function(){return me}))})()});var ji=["top","right","bottom","left"],Ti=["start","end"],_i=ji.reduce((t,e)=>t.concat(e,e+"-"+Ti[0],e+"-"+Ti[1]),[]),Et=Math.min,tt=Math.max,hr=Math.round,pr=Math.floor,nn=t=>({x:t,y:t}),Yo={left:"right",right:"left",bottom:"top",top:"bottom"},Xo={start:"end",end:"start"};function Jr(t,e,r){return tt(t,Et(e,r))}function jt(t,e){return typeof t=="function"?t(e):t}function pt(t){return t.split("-")[0]}function xt(t){return t.split("-")[1]}function Bi(t){return t==="x"?"y":"x"}function Zr(t){return t==="y"?"height":"width"}function Pn(t){return["top","bottom"].includes(pt(t))?"y":"x"}function Qr(t){return Bi(Pn(t))}function Hi(t,e,r){r===void 0&&(r=!1);let n=xt(t),i=Qr(t),o=Zr(i),s=i==="x"?n===(r?"end":"start")?"right":"left":n==="start"?"bottom":"top";return e.reference[o]>e.floating[o]&&(s=mr(s)),[s,mr(s)]}function qo(t){let e=mr(t);return[vr(t),e,vr(e)]}function vr(t){return t.replace(/start|end/g,e=>Xo[e])}function Go(t,e,r){let n=["left","right"],i=["right","left"],o=["top","bottom"],s=["bottom","top"];switch(t){case"top":case"bottom":return r?e?i:n:e?n:i;case"left":case"right":return e?o:s;default:return[]}}function Ko(t,e,r,n){let i=xt(t),o=Go(pt(t),r==="start",n);return i&&(o=o.map(s=>s+"-"+i),e&&(o=o.concat(o.map(vr)))),o}function mr(t){return t.replace(/left|right|bottom|top/g,e=>Yo[e])}function Jo(t){return{top:0,right:0,bottom:0,left:0,...t}}function ei(t){return typeof t!="number"?Jo(t):{top:t,right:t,bottom:t,left:t}}function Dn(t){return{...t,top:t.y,left:t.x,right:t.x+t.width,bottom:t.y+t.height}}function Pi(t,e,r){let{reference:n,floating:i}=t,o=Pn(e),s=Qr(e),h=Zr(s),u=pt(e),f=o==="y",w=n.x+n.width/2-i.width/2,m=n.y+n.height/2-i.height/2,E=n[h]/2-i[h]/2,O;switch(u){case"top":O={x:w,y:n.y-i.height};break;case"bottom":O={x:w,y:n.y+n.height};break;case"right":O={x:n.x+n.width,y:m};break;case"left":O={x:n.x-i.width,y:m};break;default:O={x:n.x,y:n.y}}switch(xt(e)){case"start":O[s]-=E*(r&&f?-1:1);break;case"end":O[s]+=E*(r&&f?-1:1);break}return O}var Zo=async(t,e,r)=>{let{placement:n="bottom",strategy:i="absolute",middleware:o=[],platform:s}=r,h=o.filter(Boolean),u=await(s.isRTL==null?void 0:s.isRTL(e)),f=await s.getElementRects({reference:t,floating:e,strategy:i}),{x:w,y:m}=Pi(f,n,u),E=n,O={},S=0;for(let P=0;P({name:"arrow",options:t,async fn(e){let{x:r,y:n,placement:i,rects:o,platform:s,elements:h,middlewareData:u}=e,{element:f,padding:w=0}=jt(t,e)||{};if(f==null)return{};let m=ei(w),E={x:r,y:n},O=Qr(i),S=Zr(O),P=await s.getDimensions(f),R=O==="y",$=R?"top":"left",B=R?"bottom":"right",K=R?"clientHeight":"clientWidth",X=o.reference[S]+o.reference[O]-E[O]-o.floating[S],ne=E[O]-o.reference[O],J=await(s.getOffsetParent==null?void 0:s.getOffsetParent(f)),V=J?J[K]:0;(!V||!await(s.isElement==null?void 0:s.isElement(J)))&&(V=h.floating[K]||o.floating[S]);let de=X/2-ne/2,U=V/2-P[S]/2-1,Z=Et(m[$],U),me=Et(m[B],U),l=Z,p=V-P[S]-me,v=V/2-P[S]/2+de,d=Jr(l,v,p),N=!u.arrow&&xt(i)!=null&&v!==d&&o.reference[S]/2-(vxt(i)===t),...r.filter(i=>xt(i)!==t)]:r.filter(i=>pt(i)===i)).filter(i=>t?xt(i)===t||(e?vr(i)!==i:!1):!0)}var ta=function(t){return t===void 0&&(t={}),{name:"autoPlacement",options:t,async fn(e){var r,n,i;let{rects:o,middlewareData:s,placement:h,platform:u,elements:f}=e,{crossAxis:w=!1,alignment:m,allowedPlacements:E=_i,autoAlignment:O=!0,...S}=jt(t,e),P=m!==void 0||E===_i?ea(m||null,O,E):E,R=await Tn(e,S),$=((r=s.autoPlacement)==null?void 0:r.index)||0,B=P[$];if(B==null)return{};let K=Hi(B,o,await(u.isRTL==null?void 0:u.isRTL(f.floating)));if(h!==B)return{reset:{placement:P[0]}};let X=[R[pt(B)],R[K[0]],R[K[1]]],ne=[...((n=s.autoPlacement)==null?void 0:n.overflows)||[],{placement:B,overflows:X}],J=P[$+1];if(J)return{data:{index:$+1,overflows:ne},reset:{placement:J}};let V=ne.map(Z=>{let me=xt(Z.placement);return[Z.placement,me&&w?Z.overflows.slice(0,2).reduce((l,p)=>l+p,0):Z.overflows[0],Z.overflows]}).sort((Z,me)=>Z[1]-me[1]),U=((i=V.filter(Z=>Z[2].slice(0,xt(Z[0])?2:3).every(me=>me<=0))[0])==null?void 0:i[0])||V[0][0];return U!==h?{data:{index:$+1,overflows:ne},reset:{placement:U}}:{}}}},na=function(t){return t===void 0&&(t={}),{name:"flip",options:t,async fn(e){var r,n;let{placement:i,middlewareData:o,rects:s,initialPlacement:h,platform:u,elements:f}=e,{mainAxis:w=!0,crossAxis:m=!0,fallbackPlacements:E,fallbackStrategy:O="bestFit",fallbackAxisSideDirection:S="none",flipAlignment:P=!0,...R}=jt(t,e);if((r=o.arrow)!=null&&r.alignmentOffset)return{};let $=pt(i),B=pt(h)===h,K=await(u.isRTL==null?void 0:u.isRTL(f.floating)),X=E||(B||!P?[mr(h)]:qo(h));!E&&S!=="none"&&X.push(...Ko(h,P,S,K));let ne=[h,...X],J=await Tn(e,R),V=[],de=((n=o.flip)==null?void 0:n.overflows)||[];if(w&&V.push(J[$]),m){let l=Hi(i,s,K);V.push(J[l[0]],J[l[1]])}if(de=[...de,{placement:i,overflows:V}],!V.every(l=>l<=0)){var U,Z;let l=(((U=o.flip)==null?void 0:U.index)||0)+1,p=ne[l];if(p)return{data:{index:l,overflows:de},reset:{placement:p}};let v=(Z=de.filter(d=>d.overflows[0]<=0).sort((d,N)=>d.overflows[1]-N.overflows[1])[0])==null?void 0:Z.placement;if(!v)switch(O){case"bestFit":{var me;let d=(me=de.map(N=>[N.placement,N.overflows.filter(_=>_>0).reduce((_,M)=>_+M,0)]).sort((N,_)=>N[1]-_[1])[0])==null?void 0:me[0];d&&(v=d);break}case"initialPlacement":v=h;break}if(i!==v)return{reset:{placement:v}}}return{}}}};function Mi(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function Ri(t){return ji.some(e=>t[e]>=0)}var ra=function(t){return t===void 0&&(t={}),{name:"hide",options:t,async fn(e){let{rects:r}=e,{strategy:n="referenceHidden",...i}=jt(t,e);switch(n){case"referenceHidden":{let o=await Tn(e,{...i,elementContext:"reference"}),s=Mi(o,r.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:Ri(s)}}}case"escaped":{let o=await Tn(e,{...i,altBoundary:!0}),s=Mi(o,r.floating);return{data:{escapedOffsets:s,escaped:Ri(s)}}}default:return{}}}}};function $i(t){let e=Et(...t.map(o=>o.left)),r=Et(...t.map(o=>o.top)),n=tt(...t.map(o=>o.right)),i=tt(...t.map(o=>o.bottom));return{x:e,y:r,width:n-e,height:i-r}}function ia(t){let e=t.slice().sort((i,o)=>i.y-o.y),r=[],n=null;for(let i=0;in.height/2?r.push([o]):r[r.length-1].push(o),n=o}return r.map(i=>Dn($i(i)))}var oa=function(t){return t===void 0&&(t={}),{name:"inline",options:t,async fn(e){let{placement:r,elements:n,rects:i,platform:o,strategy:s}=e,{padding:h=2,x:u,y:f}=jt(t,e),w=Array.from(await(o.getClientRects==null?void 0:o.getClientRects(n.reference))||[]),m=ia(w),E=Dn($i(w)),O=ei(h);function S(){if(m.length===2&&m[0].left>m[1].right&&u!=null&&f!=null)return m.find(R=>u>R.left-O.left&&uR.top-O.top&&f=2){if(Pn(r)==="y"){let Z=m[0],me=m[m.length-1],l=pt(r)==="top",p=Z.top,v=me.bottom,d=l?Z.left:me.left,N=l?Z.right:me.right,_=N-d,M=v-p;return{top:p,bottom:v,left:d,right:N,width:_,height:M,x:d,y:p}}let R=pt(r)==="left",$=tt(...m.map(Z=>Z.right)),B=Et(...m.map(Z=>Z.left)),K=m.filter(Z=>R?Z.left===B:Z.right===$),X=K[0].top,ne=K[K.length-1].bottom,J=B,V=$,de=V-J,U=ne-X;return{top:X,bottom:ne,left:J,right:V,width:de,height:U,x:J,y:X}}return E}let P=await o.getElementRects({reference:{getBoundingClientRect:S},floating:n.floating,strategy:s});return i.reference.x!==P.reference.x||i.reference.y!==P.reference.y||i.reference.width!==P.reference.width||i.reference.height!==P.reference.height?{reset:{rects:P}}:{}}}};async function aa(t,e){let{placement:r,platform:n,elements:i}=t,o=await(n.isRTL==null?void 0:n.isRTL(i.floating)),s=pt(r),h=xt(r),u=Pn(r)==="y",f=["left","top"].includes(s)?-1:1,w=o&&u?-1:1,m=jt(e,t),{mainAxis:E,crossAxis:O,alignmentAxis:S}=typeof m=="number"?{mainAxis:m,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...m};return h&&typeof S=="number"&&(O=h==="end"?S*-1:S),u?{x:O*w,y:E*f}:{x:E*f,y:O*w}}var Wi=function(t){return t===void 0&&(t=0),{name:"offset",options:t,async fn(e){var r,n;let{x:i,y:o,placement:s,middlewareData:h}=e,u=await aa(e,t);return s===((r=h.offset)==null?void 0:r.placement)&&(n=h.arrow)!=null&&n.alignmentOffset?{}:{x:i+u.x,y:o+u.y,data:{...u,placement:s}}}}},sa=function(t){return t===void 0&&(t={}),{name:"shift",options:t,async fn(e){let{x:r,y:n,placement:i}=e,{mainAxis:o=!0,crossAxis:s=!1,limiter:h={fn:R=>{let{x:$,y:B}=R;return{x:$,y:B}}},...u}=jt(t,e),f={x:r,y:n},w=await Tn(e,u),m=Pn(pt(i)),E=Bi(m),O=f[E],S=f[m];if(o){let R=E==="y"?"top":"left",$=E==="y"?"bottom":"right",B=O+w[R],K=O-w[$];O=Jr(B,O,K)}if(s){let R=m==="y"?"top":"left",$=m==="y"?"bottom":"right",B=S+w[R],K=S-w[$];S=Jr(B,S,K)}let P=h.fn({...e,[E]:O,[m]:S});return{...P,data:{x:P.x-r,y:P.y-n}}}}},la=function(t){return t===void 0&&(t={}),{name:"size",options:t,async fn(e){let{placement:r,rects:n,platform:i,elements:o}=e,{apply:s=()=>{},...h}=jt(t,e),u=await Tn(e,h),f=pt(r),w=xt(r),m=Pn(r)==="y",{width:E,height:O}=n.floating,S,P;f==="top"||f==="bottom"?(S=f,P=w===(await(i.isRTL==null?void 0:i.isRTL(o.floating))?"start":"end")?"left":"right"):(P=f,S=w==="end"?"top":"bottom");let R=O-u[S],$=E-u[P],B=!e.middlewareData.shift,K=R,X=$;if(m){let J=E-u.left-u.right;X=w||B?Et($,J):J}else{let J=O-u.top-u.bottom;K=w||B?Et(R,J):J}if(B&&!w){let J=tt(u.left,0),V=tt(u.right,0),de=tt(u.top,0),U=tt(u.bottom,0);m?X=E-2*(J!==0||V!==0?J+V:tt(u.left,u.right)):K=O-2*(de!==0||U!==0?de+U:tt(u.top,u.bottom))}await s({...e,availableWidth:X,availableHeight:K});let ne=await i.getDimensions(o.floating);return E!==ne.width||O!==ne.height?{reset:{rects:!0}}:{}}}};function rn(t){return Vi(t)?(t.nodeName||"").toLowerCase():"#document"}function ct(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function Bt(t){var e;return(e=(Vi(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function Vi(t){return t instanceof Node||t instanceof ct(t).Node}function kt(t){return t instanceof Element||t instanceof ct(t).Element}function _t(t){return t instanceof HTMLElement||t instanceof ct(t).HTMLElement}function Ii(t){return typeof ShadowRoot>"u"?!1:t instanceof ShadowRoot||t instanceof ct(t).ShadowRoot}function Un(t){let{overflow:e,overflowX:r,overflowY:n,display:i}=ht(t);return/auto|scroll|overlay|hidden|clip/.test(e+n+r)&&!["inline","contents"].includes(i)}function ca(t){return["table","td","th"].includes(rn(t))}function ti(t){let e=ni(),r=ht(t);return r.transform!=="none"||r.perspective!=="none"||(r.containerType?r.containerType!=="normal":!1)||!e&&(r.backdropFilter?r.backdropFilter!=="none":!1)||!e&&(r.filter?r.filter!=="none":!1)||["transform","perspective","filter"].some(n=>(r.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(r.contain||"").includes(n))}function fa(t){let e=_n(t);for(;_t(e)&&!gr(e);){if(ti(e))return e;e=_n(e)}return null}function ni(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function gr(t){return["html","body","#document"].includes(rn(t))}function ht(t){return ct(t).getComputedStyle(t)}function br(t){return kt(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function _n(t){if(rn(t)==="html")return t;let e=t.assignedSlot||t.parentNode||Ii(t)&&t.host||Bt(t);return Ii(e)?e.host:e}function zi(t){let e=_n(t);return gr(e)?t.ownerDocument?t.ownerDocument.body:t.body:_t(e)&&Un(e)?e:zi(e)}function zn(t,e,r){var n;e===void 0&&(e=[]),r===void 0&&(r=!0);let i=zi(t),o=i===((n=t.ownerDocument)==null?void 0:n.body),s=ct(i);return o?e.concat(s,s.visualViewport||[],Un(i)?i:[],s.frameElement&&r?zn(s.frameElement):[]):e.concat(i,zn(i,[],r))}function Ui(t){let e=ht(t),r=parseFloat(e.width)||0,n=parseFloat(e.height)||0,i=_t(t),o=i?t.offsetWidth:r,s=i?t.offsetHeight:n,h=hr(r)!==o||hr(n)!==s;return h&&(r=o,n=s),{width:r,height:n,$:h}}function ri(t){return kt(t)?t:t.contextElement}function Cn(t){let e=ri(t);if(!_t(e))return nn(1);let r=e.getBoundingClientRect(),{width:n,height:i,$:o}=Ui(e),s=(o?hr(r.width):r.width)/n,h=(o?hr(r.height):r.height)/i;return(!s||!Number.isFinite(s))&&(s=1),(!h||!Number.isFinite(h))&&(h=1),{x:s,y:h}}var ua=nn(0);function Yi(t){let e=ct(t);return!ni()||!e.visualViewport?ua:{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}}function da(t,e,r){return e===void 0&&(e=!1),!r||e&&r!==ct(t)?!1:e}function vn(t,e,r,n){e===void 0&&(e=!1),r===void 0&&(r=!1);let i=t.getBoundingClientRect(),o=ri(t),s=nn(1);e&&(n?kt(n)&&(s=Cn(n)):s=Cn(t));let h=da(o,r,n)?Yi(o):nn(0),u=(i.left+h.x)/s.x,f=(i.top+h.y)/s.y,w=i.width/s.x,m=i.height/s.y;if(o){let E=ct(o),O=n&&kt(n)?ct(n):n,S=E,P=S.frameElement;for(;P&&n&&O!==S;){let R=Cn(P),$=P.getBoundingClientRect(),B=ht(P),K=$.left+(P.clientLeft+parseFloat(B.paddingLeft))*R.x,X=$.top+(P.clientTop+parseFloat(B.paddingTop))*R.y;u*=R.x,f*=R.y,w*=R.x,m*=R.y,u+=K,f+=X,S=ct(P),P=S.frameElement}}return Dn({width:w,height:m,x:u,y:f})}var pa=[":popover-open",":modal"];function Xi(t){return pa.some(e=>{try{return t.matches(e)}catch{return!1}})}function ha(t){let{elements:e,rect:r,offsetParent:n,strategy:i}=t,o=i==="fixed",s=Bt(n),h=e?Xi(e.floating):!1;if(n===s||h&&o)return r;let u={scrollLeft:0,scrollTop:0},f=nn(1),w=nn(0),m=_t(n);if((m||!m&&!o)&&((rn(n)!=="body"||Un(s))&&(u=br(n)),_t(n))){let E=vn(n);f=Cn(n),w.x=E.x+n.clientLeft,w.y=E.y+n.clientTop}return{width:r.width*f.x,height:r.height*f.y,x:r.x*f.x-u.scrollLeft*f.x+w.x,y:r.y*f.y-u.scrollTop*f.y+w.y}}function va(t){return Array.from(t.getClientRects())}function qi(t){return vn(Bt(t)).left+br(t).scrollLeft}function ma(t){let e=Bt(t),r=br(t),n=t.ownerDocument.body,i=tt(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),o=tt(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight),s=-r.scrollLeft+qi(t),h=-r.scrollTop;return ht(n).direction==="rtl"&&(s+=tt(e.clientWidth,n.clientWidth)-i),{width:i,height:o,x:s,y:h}}function ga(t,e){let r=ct(t),n=Bt(t),i=r.visualViewport,o=n.clientWidth,s=n.clientHeight,h=0,u=0;if(i){o=i.width,s=i.height;let f=ni();(!f||f&&e==="fixed")&&(h=i.offsetLeft,u=i.offsetTop)}return{width:o,height:s,x:h,y:u}}function ba(t,e){let r=vn(t,!0,e==="fixed"),n=r.top+t.clientTop,i=r.left+t.clientLeft,o=_t(t)?Cn(t):nn(1),s=t.clientWidth*o.x,h=t.clientHeight*o.y,u=i*o.x,f=n*o.y;return{width:s,height:h,x:u,y:f}}function Fi(t,e,r){let n;if(e==="viewport")n=ga(t,r);else if(e==="document")n=ma(Bt(t));else if(kt(e))n=ba(e,r);else{let i=Yi(t);n={...e,x:e.x-i.x,y:e.y-i.y}}return Dn(n)}function Gi(t,e){let r=_n(t);return r===e||!kt(r)||gr(r)?!1:ht(r).position==="fixed"||Gi(r,e)}function ya(t,e){let r=e.get(t);if(r)return r;let n=zn(t,[],!1).filter(h=>kt(h)&&rn(h)!=="body"),i=null,o=ht(t).position==="fixed",s=o?_n(t):t;for(;kt(s)&&!gr(s);){let h=ht(s),u=ti(s);!u&&h.position==="fixed"&&(i=null),(o?!u&&!i:!u&&h.position==="static"&&!!i&&["absolute","fixed"].includes(i.position)||Un(s)&&!u&&Gi(t,s))?n=n.filter(w=>w!==s):i=h,s=_n(s)}return e.set(t,n),n}function wa(t){let{element:e,boundary:r,rootBoundary:n,strategy:i}=t,s=[...r==="clippingAncestors"?ya(e,this._c):[].concat(r),n],h=s[0],u=s.reduce((f,w)=>{let m=Fi(e,w,i);return f.top=tt(m.top,f.top),f.right=Et(m.right,f.right),f.bottom=Et(m.bottom,f.bottom),f.left=tt(m.left,f.left),f},Fi(e,h,i));return{width:u.right-u.left,height:u.bottom-u.top,x:u.left,y:u.top}}function xa(t){let{width:e,height:r}=Ui(t);return{width:e,height:r}}function Ea(t,e,r){let n=_t(e),i=Bt(e),o=r==="fixed",s=vn(t,!0,o,e),h={scrollLeft:0,scrollTop:0},u=nn(0);if(n||!n&&!o)if((rn(e)!=="body"||Un(i))&&(h=br(e)),n){let m=vn(e,!0,o,e);u.x=m.x+e.clientLeft,u.y=m.y+e.clientTop}else i&&(u.x=qi(i));let f=s.left+h.scrollLeft-u.x,w=s.top+h.scrollTop-u.y;return{x:f,y:w,width:s.width,height:s.height}}function Li(t,e){return!_t(t)||ht(t).position==="fixed"?null:e?e(t):t.offsetParent}function Ki(t,e){let r=ct(t);if(!_t(t)||Xi(t))return r;let n=Li(t,e);for(;n&&ca(n)&&ht(n).position==="static";)n=Li(n,e);return n&&(rn(n)==="html"||rn(n)==="body"&&ht(n).position==="static"&&!ti(n))?r:n||fa(t)||r}var Oa=async function(t){let e=this.getOffsetParent||Ki,r=this.getDimensions;return{reference:Ea(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,...await r(t.floating)}}};function Sa(t){return ht(t).direction==="rtl"}var Aa={convertOffsetParentRelativeRectToViewportRelativeRect:ha,getDocumentElement:Bt,getClippingRect:wa,getOffsetParent:Ki,getElementRects:Oa,getClientRects:va,getDimensions:xa,getScale:Cn,isElement:kt,isRTL:Sa};function Ca(t,e){let r=null,n,i=Bt(t);function o(){var h;clearTimeout(n),(h=r)==null||h.disconnect(),r=null}function s(h,u){h===void 0&&(h=!1),u===void 0&&(u=1),o();let{left:f,top:w,width:m,height:E}=t.getBoundingClientRect();if(h||e(),!m||!E)return;let O=pr(w),S=pr(i.clientWidth-(f+m)),P=pr(i.clientHeight-(w+E)),R=pr(f),B={rootMargin:-O+"px "+-S+"px "+-P+"px "+-R+"px",threshold:tt(0,Et(1,u))||1},K=!0;function X(ne){let J=ne[0].intersectionRatio;if(J!==u){if(!K)return s();J?s(!1,J):n=setTimeout(()=>{s(!1,1e-7)},100)}K=!1}try{r=new IntersectionObserver(X,{...B,root:i.ownerDocument})}catch{r=new IntersectionObserver(X,B)}r.observe(t)}return s(!0),o}function Ni(t,e,r,n){n===void 0&&(n={});let{ancestorScroll:i=!0,ancestorResize:o=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:h=typeof IntersectionObserver=="function",animationFrame:u=!1}=n,f=ri(t),w=i||o?[...f?zn(f):[],...zn(e)]:[];w.forEach($=>{i&&$.addEventListener("scroll",r,{passive:!0}),o&&$.addEventListener("resize",r)});let m=f&&h?Ca(f,r):null,E=-1,O=null;s&&(O=new ResizeObserver($=>{let[B]=$;B&&B.target===f&&O&&(O.unobserve(e),cancelAnimationFrame(E),E=requestAnimationFrame(()=>{var K;(K=O)==null||K.observe(e)})),r()}),f&&!u&&O.observe(f),O.observe(e));let S,P=u?vn(t):null;u&&R();function R(){let $=vn(t);P&&($.x!==P.x||$.y!==P.y||$.width!==P.width||$.height!==P.height)&&r(),P=$,S=requestAnimationFrame(R)}return r(),()=>{var $;w.forEach(B=>{i&&B.removeEventListener("scroll",r),o&&B.removeEventListener("resize",r)}),m?.(),($=O)==null||$.disconnect(),O=null,u&&cancelAnimationFrame(S)}}var ii=ta,Ji=sa,Zi=na,Qi=la,eo=ra,to=Qo,no=oa,ki=(t,e,r)=>{let n=new Map,i={platform:Aa,...r},o={...i.platform,_c:n};return Zo(t,e,{...i,platform:o})},Da=t=>{let e={placement:"bottom",strategy:"absolute",middleware:[]},r=Object.keys(t),n=i=>t[i];return r.includes("offset")&&e.middleware.push(Wi(n("offset"))),r.includes("teleport")&&(e.strategy="fixed"),r.includes("placement")&&(e.placement=n("placement")),r.includes("autoPlacement")&&!r.includes("flip")&&e.middleware.push(ii(n("autoPlacement"))),r.includes("flip")&&e.middleware.push(Zi(n("flip"))),r.includes("shift")&&e.middleware.push(Ji(n("shift"))),r.includes("inline")&&e.middleware.push(no(n("inline"))),r.includes("arrow")&&e.middleware.push(to(n("arrow"))),r.includes("hide")&&e.middleware.push(eo(n("hide"))),r.includes("size")&&e.middleware.push(Qi(n("size"))),e},Ta=(t,e)=>{let r={component:{trap:!1},float:{placement:"bottom",strategy:"absolute",middleware:[]}},n=i=>t[t.indexOf(i)+1];if(t.includes("trap")&&(r.component.trap=!0),t.includes("teleport")&&(r.float.strategy="fixed"),t.includes("offset")&&r.float.middleware.push(Wi(e.offset||10)),t.includes("placement")&&(r.float.placement=n("placement")),t.includes("autoPlacement")&&!t.includes("flip")&&r.float.middleware.push(ii(e.autoPlacement)),t.includes("flip")&&r.float.middleware.push(Zi(e.flip)),t.includes("shift")&&r.float.middleware.push(Ji(e.shift)),t.includes("inline")&&r.float.middleware.push(no(e.inline)),t.includes("arrow")&&r.float.middleware.push(to(e.arrow)),t.includes("hide")&&r.float.middleware.push(eo(e.hide)),t.includes("size")){let i=e.size?.availableWidth??null,o=e.size?.availableHeight??null;i&&delete e.size.availableWidth,o&&delete e.size.availableHeight,r.float.middleware.push(Qi({...e.size,apply({availableWidth:s,availableHeight:h,elements:u}){Object.assign(u.floating.style,{maxWidth:`${i??s}px`,maxHeight:`${o??h}px`})}}))}return r},_a=t=>{var e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".split(""),r="";t||(t=Math.floor(Math.random()*e.length));for(var n=0;n{}){let r=!1;return function(){r?e.apply(this,arguments):(r=!0,t.apply(this,arguments))}}function Ma(t){let e={dismissable:!0,trap:!1};function r(n,i=null){if(n){if(n.hasAttribute("aria-expanded")||n.setAttribute("aria-expanded",!1),i.hasAttribute("id"))n.setAttribute("aria-controls",i.getAttribute("id"));else{let o=`panel-${_a(8)}`;n.setAttribute("aria-controls",o),i.setAttribute("id",o)}i.setAttribute("aria-modal",!0),i.setAttribute("role","dialog")}}t.magic("float",n=>(i={},o={})=>{let s={...e,...o},h=Object.keys(i).length>0?Da(i):{middleware:[ii()]},u=n,f=n.parentElement.closest("[x-data]"),w=f.querySelector('[x-ref="panel"]');r(u,w);function m(){return w.style.display=="block"}function E(){w.style.display="none",u.setAttribute("aria-expanded","false"),s.trap&&w.setAttribute("x-trap","false"),Ni(n,w,P)}function O(){w.style.display="block",u.setAttribute("aria-expanded","true"),s.trap&&w.setAttribute("x-trap","true"),P()}function S(){m()?E():O()}async function P(){return await ki(n,w,h).then(({middlewareData:R,placement:$,x:B,y:K})=>{if(R.arrow){let X=R.arrow?.x,ne=R.arrow?.y,J=h.middleware.filter(de=>de.name=="arrow")[0].options.element,V={top:"bottom",right:"left",bottom:"top",left:"right"}[$.split("-")[0]];Object.assign(J.style,{left:X!=null?`${X}px`:"",top:ne!=null?`${ne}px`:"",right:"",bottom:"",[V]:"-4px"})}if(R.hide){let{referenceHidden:X}=R.hide;Object.assign(w.style,{visibility:X?"hidden":"visible"})}Object.assign(w.style,{left:`${B}px`,top:`${K}px`})})}s.dismissable&&(window.addEventListener("click",R=>{!f.contains(R.target)&&m()&&S()}),window.addEventListener("keydown",R=>{R.key==="Escape"&&m()&&S()},!0)),S()}),t.directive("float",(n,{modifiers:i,expression:o},{evaluate:s,effect:h})=>{let u=o?s(o):{},f=i.length>0?Ta(i,u):{},w=null;f.float.strategy=="fixed"&&(n.style.position="fixed");let m=V=>n.parentElement&&!n.parentElement.closest("[x-data]").contains(V.target)?n.close():null,E=V=>V.key==="Escape"?n.close():null,O=n.getAttribute("x-ref"),S=n.parentElement.closest("[x-data]"),P=S.querySelectorAll(`[\\@click^="$refs.${O}"]`),R=S.querySelectorAll(`[x-on\\:click^="$refs.${O}"]`);n.style.setProperty("display","none"),r([...P,...R][0],n),n._x_isShown=!1,n.trigger=null,n._x_doHide||(n._x_doHide=()=>{n.style.setProperty("display","none",i.includes("important")?"important":void 0)}),n._x_doShow||(n._x_doShow=()=>{n.style.setProperty("display","block",i.includes("important")?"important":void 0)});let $=()=>{n._x_doHide(),n._x_isShown=!1},B=()=>{n._x_doShow(),n._x_isShown=!0},K=()=>setTimeout(B),X=Pa(V=>V?B():$(),V=>{typeof n._x_toggleAndCascadeWithTransitions=="function"?n._x_toggleAndCascadeWithTransitions(n,V,B,$):V?K():$()}),ne,J=!0;h(()=>s(V=>{!J&&V===ne||(i.includes("immediate")&&(V?K():$()),X(V),ne=V,J=!1)})),n.open=async function(V){n.trigger=V.currentTarget?V.currentTarget:V,X(!0),n.trigger.setAttribute("aria-expanded","true"),f.component.trap&&n.setAttribute("x-trap","true"),w=Ni(n.trigger,n,()=>{ki(n.trigger,n,f.float).then(({middlewareData:de,placement:U,x:Z,y:me})=>{if(de.arrow){let l=de.arrow?.x,p=de.arrow?.y,v=f.float.middleware.filter(N=>N.name=="arrow")[0].options.element,d={top:"bottom",right:"left",bottom:"top",left:"right"}[U.split("-")[0]];Object.assign(v.style,{left:l!=null?`${l}px`:"",top:p!=null?`${p}px`:"",right:"",bottom:"",[d]:"-4px"})}if(de.hide){let{referenceHidden:l}=de.hide;Object.assign(n.style,{visibility:l?"hidden":"visible"})}Object.assign(n.style,{left:`${Z}px`,top:`${me}px`})})}),window.addEventListener("click",m),window.addEventListener("keydown",E,!0)},n.close=function(){if(!n._x_isShown)return!1;X(!1),n.trigger.setAttribute("aria-expanded","false"),f.component.trap&&n.setAttribute("x-trap","false"),w(),window.removeEventListener("click",m),window.removeEventListener("keydown",E,!1)},n.toggle=function(V){n._x_isShown?n.close():n.open(V)}})}var ro=Ma;function Ra(t){t.store("lazyLoadedAssets",{loaded:new Set,check(s){return Array.isArray(s)?s.every(h=>this.loaded.has(h)):this.loaded.has(s)},markLoaded(s){Array.isArray(s)?s.forEach(h=>this.loaded.add(h)):this.loaded.add(s)}});let e=s=>new CustomEvent(s,{bubbles:!0,composed:!0,cancelable:!0}),r=(s,h={},u,f)=>{let w=document.createElement(s);return Object.entries(h).forEach(([m,E])=>w[m]=E),u&&(f?u.insertBefore(w,f):u.appendChild(w)),w},n=(s,h,u={},f=null,w=null)=>{let m=s==="link"?`link[href="${h}"]`:`script[src="${h}"]`;if(document.querySelector(m)||t.store("lazyLoadedAssets").check(h))return Promise.resolve();let E=s==="link"?{...u,href:h}:{...u,src:h},O=r(s,E,f,w);return new Promise((S,P)=>{O.onload=()=>{t.store("lazyLoadedAssets").markLoaded(h),S()},O.onerror=()=>{P(new Error(`Failed to load ${s}: ${h}`))}})},i=async(s,h,u=null,f=null)=>{let w={type:"text/css",rel:"stylesheet"};h&&(w.media=h);let m=document.head,E=null;if(u&&f){let O=document.querySelector(`link[href*="${f}"]`);O?(m=O.parentElement,E=u==="before"?O:O.nextSibling):(console.warn(`Target (${f}) not found for ${s}. Appending to head.`),m=document.head,E=null)}await n("link",s,w,m,E)},o=async(s,h,u=null,f=null,w=null)=>{let m=document.head,E=null;if(u&&f){let S=document.querySelector(`script[src*="${f}"]`);S?(m=S.parentElement,E=u==="before"?S:S.nextSibling):(console.warn(`Target (${f}) not found for ${s}. Falling back to head or body.`),m=document.head,E=null)}else(h.has("body-start")||h.has("body-end"))&&(m=document.body,h.has("body-start")&&(E=document.body.firstChild));let O={};w&&(O.type="module"),await n("script",s,O,m,E)};t.directive("load-css",(s,{expression:h},{evaluate:u})=>{let f=u(h),w=s.media,m=s.getAttribute("data-dispatch"),E=s.getAttribute("data-css-before")?"before":s.getAttribute("data-css-after")?"after":null,O=s.getAttribute("data-css-before")||s.getAttribute("data-css-after")||null;Promise.all(f.map(S=>i(S,w,E,O))).then(()=>{m&&window.dispatchEvent(e(`${m}-css`))}).catch(console.error)}),t.directive("load-js",(s,{expression:h,modifiers:u},{evaluate:f})=>{let w=f(h),m=new Set(u),E=s.getAttribute("data-js-before")?"before":s.getAttribute("data-js-after")?"after":null,O=s.getAttribute("data-js-before")||s.getAttribute("data-js-after")||null,S=s.getAttribute("data-js-as-module")||s.getAttribute("data-as-module")||!1,P=s.getAttribute("data-dispatch");Promise.all(w.map(R=>o(R,m,E,O,S))).then(()=>{P&&window.dispatchEvent(e(`${P}-js`))}).catch(console.error)})}var io=Ra;var jo=Uo(so(),1);function lo(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),r.push.apply(r,n)}return r}function Mt(t){for(var e=1;e=0)&&(r[i]=t[i]);return r}function La(t,e){if(t==null)return{};var r=Fa(t,e),n,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var Na="1.15.3";function Ht(t){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(t)}var Wt=Ht(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),er=Ht(/Edge/i),co=Ht(/firefox/i),Gn=Ht(/safari/i)&&!Ht(/chrome/i)&&!Ht(/android/i),bo=Ht(/iP(ad|od|hone)/i),yo=Ht(/chrome/i)&&Ht(/android/i),wo={capture:!1,passive:!1};function Ce(t,e,r){t.addEventListener(e,r,!Wt&&wo)}function Oe(t,e,r){t.removeEventListener(e,r,!Wt&&wo)}function _r(t,e){if(e){if(e[0]===">"&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch{return!1}return!1}}function xo(t){return t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode}function St(t,e,r,n){if(t){r=r||document;do{if(e!=null&&(e[0]===">"?t.parentNode===r&&_r(t,e):_r(t,e))||n&&t===r)return t;if(t===r)break}while(t=xo(t))}return null}var fo=/\s+/g;function ft(t,e,r){if(t&&e)if(t.classList)t.classList[r?"add":"remove"](e);else{var n=(" "+t.className+" ").replace(fo," ").replace(" "+e+" "," ");t.className=(n+(r?" "+e:"")).replace(fo," ")}}function ae(t,e,r){var n=t&&t.style;if(n){if(r===void 0)return document.defaultView&&document.defaultView.getComputedStyle?r=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(r=t.currentStyle),e===void 0?r:r[e];!(e in n)&&e.indexOf("webkit")===-1&&(e="-webkit-"+e),n[e]=r+(typeof r=="string"?"":"px")}}function Ln(t,e){var r="";if(typeof t=="string")r=t;else do{var n=ae(t,"transform");n&&n!=="none"&&(r=n+" "+r)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(r)}function Eo(t,e,r){if(t){var n=t.getElementsByTagName(e),i=0,o=n.length;if(r)for(;i=o:s=i<=o,!s)return n;if(n===Pt())break;n=sn(n,!1)}return!1}function Nn(t,e,r,n){for(var i=0,o=0,s=t.children;o2&&arguments[2]!==void 0?arguments[2]:{},i=n.evt,o=La(n,za);tr.pluginEvent.bind(se)(e,r,Mt({dragEl:L,parentEl:ze,ghostEl:ue,rootEl:ke,nextEl:bn,lastDownEl:Ar,cloneEl:We,cloneHidden:an,dragStarted:Yn,putSortable:Ze,activeSortable:se.active,originalEvent:i,oldIndex:Fn,oldDraggableIndex:Jn,newIndex:ut,newDraggableIndex:on,hideGhostForTarget:Po,unhideGhostForTarget:Mo,cloneNowHidden:function(){an=!0},cloneNowShown:function(){an=!1},dispatchSortableEvent:function(h){it({sortable:r,name:h,originalEvent:i})}},o))};function it(t){Va(Mt({putSortable:Ze,cloneEl:We,targetEl:L,rootEl:ke,oldIndex:Fn,oldDraggableIndex:Jn,newIndex:ut,newDraggableIndex:on},t))}var L,ze,ue,ke,bn,Ar,We,an,Fn,ut,Jn,on,wr,Ze,In=!1,Pr=!1,Mr=[],mn,Ot,si,li,ho,vo,Yn,Rn,Zn,Qn=!1,xr=!1,Cr,nt,ci=[],hi=!1,Rr=[],Fr=typeof document<"u",Er=bo,mo=er||Wt?"cssFloat":"float",Ua=Fr&&!yo&&!bo&&"draggable"in document.createElement("div"),Do=function(){if(Fr){if(Wt)return!1;var t=document.createElement("x");return t.style.cssText="pointer-events:auto",t.style.pointerEvents==="auto"}}(),To=function(e,r){var n=ae(e),i=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),o=Nn(e,0,r),s=Nn(e,1,r),h=o&&ae(o),u=s&&ae(s),f=h&&parseInt(h.marginLeft)+parseInt(h.marginRight)+qe(o).width,w=u&&parseInt(u.marginLeft)+parseInt(u.marginRight)+qe(s).width;if(n.display==="flex")return n.flexDirection==="column"||n.flexDirection==="column-reverse"?"vertical":"horizontal";if(n.display==="grid")return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(o&&h.float&&h.float!=="none"){var m=h.float==="left"?"left":"right";return s&&(u.clear==="both"||u.clear===m)?"vertical":"horizontal"}return o&&(h.display==="block"||h.display==="flex"||h.display==="table"||h.display==="grid"||f>=i&&n[mo]==="none"||s&&n[mo]==="none"&&f+w>i)?"vertical":"horizontal"},Ya=function(e,r,n){var i=n?e.left:e.top,o=n?e.right:e.bottom,s=n?e.width:e.height,h=n?r.left:r.top,u=n?r.right:r.bottom,f=n?r.width:r.height;return i===h||o===u||i+s/2===h+f/2},Xa=function(e,r){var n;return Mr.some(function(i){var o=i[st].options.emptyInsertThreshold;if(!(!o||bi(i))){var s=qe(i),h=e>=s.left-o&&e<=s.right+o,u=r>=s.top-o&&r<=s.bottom+o;if(h&&u)return n=i}}),n},_o=function(e){function r(o,s){return function(h,u,f,w){var m=h.options.group.name&&u.options.group.name&&h.options.group.name===u.options.group.name;if(o==null&&(s||m))return!0;if(o==null||o===!1)return!1;if(s&&o==="clone")return o;if(typeof o=="function")return r(o(h,u,f,w),s)(h,u,f,w);var E=(s?h:u).options.group.name;return o===!0||typeof o=="string"&&o===E||o.join&&o.indexOf(E)>-1}}var n={},i=e.group;(!i||Sr(i)!="object")&&(i={name:i}),n.name=i.name,n.checkPull=r(i.pull,!0),n.checkPut=r(i.put),n.revertClone=i.revertClone,e.group=n},Po=function(){!Do&&ue&&ae(ue,"display","none")},Mo=function(){!Do&&ue&&ae(ue,"display","")};Fr&&!yo&&document.addEventListener("click",function(t){if(Pr)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),Pr=!1,!1},!0);var gn=function(e){if(L){e=e.touches?e.touches[0]:e;var r=Xa(e.clientX,e.clientY);if(r){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i]);n.target=n.rootEl=r,n.preventDefault=void 0,n.stopPropagation=void 0,r[st]._onDragOver(n)}}},qa=function(e){L&&L.parentNode[st]._isOutsideThisEl(e.target)};function se(t,e){if(!(t&&t.nodeType&&t.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=$t({},e),t[st]=this;var r={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return To(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(s,h){s.setData("Text",h.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:se.supportPointer!==!1&&"PointerEvent"in window&&!Gn,emptyInsertThreshold:5};tr.initializePlugins(this,t,r);for(var n in r)!(n in e)&&(e[n]=r[n]);_o(e);for(var i in this)i.charAt(0)==="_"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this));this.nativeDraggable=e.forceFallback?!1:Ua,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?Ce(t,"pointerdown",this._onTapStart):(Ce(t,"mousedown",this._onTapStart),Ce(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(Ce(t,"dragover",this),Ce(t,"dragenter",this)),Mr.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),$t(this,Ha())}se.prototype={constructor:se,_isOutsideThisEl:function(e){!this.el.contains(e)&&e!==this.el&&(Rn=null)},_getDirection:function(e,r){return typeof this.options.direction=="function"?this.options.direction.call(this,e,r,L):this.options.direction},_onTapStart:function(e){if(e.cancelable){var r=this,n=this.el,i=this.options,o=i.preventOnFilter,s=e.type,h=e.touches&&e.touches[0]||e.pointerType&&e.pointerType==="touch"&&e,u=(h||e).target,f=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||u,w=i.filter;if(ns(n),!L&&!(/mousedown|pointerdown/.test(s)&&e.button!==0||i.disabled)&&!f.isContentEditable&&!(!this.nativeDraggable&&Gn&&u&&u.tagName.toUpperCase()==="SELECT")&&(u=St(u,i.draggable,n,!1),!(u&&u.animated)&&Ar!==u)){if(Fn=vt(u),Jn=vt(u,i.draggable),typeof w=="function"){if(w.call(this,e,u,this)){it({sortable:r,rootEl:f,name:"filter",targetEl:u,toEl:n,fromEl:n}),at("filter",r,{evt:e}),o&&e.cancelable&&e.preventDefault();return}}else if(w&&(w=w.split(",").some(function(m){if(m=St(f,m.trim(),n,!1),m)return it({sortable:r,rootEl:m,name:"filter",targetEl:u,fromEl:n,toEl:n}),at("filter",r,{evt:e}),!0}),w)){o&&e.cancelable&&e.preventDefault();return}i.handle&&!St(f,i.handle,n,!1)||this._prepareDragStart(e,h,u)}}},_prepareDragStart:function(e,r,n){var i=this,o=i.el,s=i.options,h=o.ownerDocument,u;if(n&&!L&&n.parentNode===o){var f=qe(n);if(ke=o,L=n,ze=L.parentNode,bn=L.nextSibling,Ar=n,wr=s.group,se.dragged=L,mn={target:L,clientX:(r||e).clientX,clientY:(r||e).clientY},ho=mn.clientX-f.left,vo=mn.clientY-f.top,this._lastX=(r||e).clientX,this._lastY=(r||e).clientY,L.style["will-change"]="all",u=function(){if(at("delayEnded",i,{evt:e}),se.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!co&&i.nativeDraggable&&(L.draggable=!0),i._triggerDragStart(e,r),it({sortable:i,name:"choose",originalEvent:e}),ft(L,s.chosenClass,!0)},s.ignore.split(",").forEach(function(w){Eo(L,w.trim(),fi)}),Ce(h,"dragover",gn),Ce(h,"mousemove",gn),Ce(h,"touchmove",gn),Ce(h,"mouseup",i._onDrop),Ce(h,"touchend",i._onDrop),Ce(h,"touchcancel",i._onDrop),co&&this.nativeDraggable&&(this.options.touchStartThreshold=4,L.draggable=!0),at("delayStart",this,{evt:e}),s.delay&&(!s.delayOnTouchOnly||r)&&(!this.nativeDraggable||!(er||Wt))){if(se.eventCanceled){this._onDrop();return}Ce(h,"mouseup",i._disableDelayedDrag),Ce(h,"touchend",i._disableDelayedDrag),Ce(h,"touchcancel",i._disableDelayedDrag),Ce(h,"mousemove",i._delayedDragTouchMoveHandler),Ce(h,"touchmove",i._delayedDragTouchMoveHandler),s.supportPointer&&Ce(h,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(u,s.delay)}else u()}},_delayedDragTouchMoveHandler:function(e){var r=e.touches?e.touches[0]:e;Math.max(Math.abs(r.clientX-this._lastX),Math.abs(r.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){L&&fi(L),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;Oe(e,"mouseup",this._disableDelayedDrag),Oe(e,"touchend",this._disableDelayedDrag),Oe(e,"touchcancel",this._disableDelayedDrag),Oe(e,"mousemove",this._delayedDragTouchMoveHandler),Oe(e,"touchmove",this._delayedDragTouchMoveHandler),Oe(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,r){r=r||e.pointerType=="touch"&&e,!this.nativeDraggable||r?this.options.supportPointer?Ce(document,"pointermove",this._onTouchMove):r?Ce(document,"touchmove",this._onTouchMove):Ce(document,"mousemove",this._onTouchMove):(Ce(L,"dragend",this),Ce(ke,"dragstart",this._onDragStart));try{document.selection?Dr(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(e,r){if(In=!1,ke&&L){at("dragStarted",this,{evt:r}),this.nativeDraggable&&Ce(document,"dragover",qa);var n=this.options;!e&&ft(L,n.dragClass,!1),ft(L,n.ghostClass,!0),se.active=this,e&&this._appendGhost(),it({sortable:this,name:"start",originalEvent:r})}else this._nulling()},_emulateDragOver:function(){if(Ot){this._lastX=Ot.clientX,this._lastY=Ot.clientY,Po();for(var e=document.elementFromPoint(Ot.clientX,Ot.clientY),r=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(Ot.clientX,Ot.clientY),e!==r);)r=e;if(L.parentNode[st]._isOutsideThisEl(e),r)do{if(r[st]){var n=void 0;if(n=r[st]._onDragOver({clientX:Ot.clientX,clientY:Ot.clientY,target:e,rootEl:r}),n&&!this.options.dragoverBubble)break}e=r}while(r=xo(r));Mo()}},_onTouchMove:function(e){if(mn){var r=this.options,n=r.fallbackTolerance,i=r.fallbackOffset,o=e.touches?e.touches[0]:e,s=ue&&Ln(ue,!0),h=ue&&s&&s.a,u=ue&&s&&s.d,f=Er&&nt&&po(nt),w=(o.clientX-mn.clientX+i.x)/(h||1)+(f?f[0]-ci[0]:0)/(h||1),m=(o.clientY-mn.clientY+i.y)/(u||1)+(f?f[1]-ci[1]:0)/(u||1);if(!se.active&&!In){if(n&&Math.max(Math.abs(o.clientX-this._lastX),Math.abs(o.clientY-this._lastY))=0&&(it({rootEl:ze,name:"add",toEl:ze,fromEl:ke,originalEvent:e}),it({sortable:this,name:"remove",toEl:ze,originalEvent:e}),it({rootEl:ze,name:"sort",toEl:ze,fromEl:ke,originalEvent:e}),it({sortable:this,name:"sort",toEl:ze,originalEvent:e})),Ze&&Ze.save()):ut!==Fn&&ut>=0&&(it({sortable:this,name:"update",toEl:ze,originalEvent:e}),it({sortable:this,name:"sort",toEl:ze,originalEvent:e})),se.active&&((ut==null||ut===-1)&&(ut=Fn,on=Jn),it({sortable:this,name:"end",toEl:ze,originalEvent:e}),this.save()))),this._nulling()},_nulling:function(){at("nulling",this),ke=L=ze=ue=bn=We=Ar=an=mn=Ot=Yn=ut=on=Fn=Jn=Rn=Zn=Ze=wr=se.dragged=se.ghost=se.clone=se.active=null,Rr.forEach(function(e){e.checked=!0}),Rr.length=si=li=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":L&&(this._onDragOver(e),Ga(e));break;case"selectstart":e.preventDefault();break}},toArray:function(){for(var e=[],r,n=this.el.children,i=0,o=n.length,s=this.options;ii.right+o||t.clientY>n.bottom&&t.clientX>n.left:t.clientY>i.bottom+o||t.clientX>n.right&&t.clientY>n.top}function Qa(t,e,r,n,i,o,s,h){var u=n?t.clientY:t.clientX,f=n?r.height:r.width,w=n?r.top:r.left,m=n?r.bottom:r.right,E=!1;if(!s){if(h&&Crw+f*o/2:um-Cr)return-Zn}else if(u>w+f*(1-i)/2&&um-f*o/2)?u>w+f/2?1:-1:0}function es(t){return vt(L){t.directive("sortable",e=>{let r=parseInt(e.dataset?.sortableAnimationDuration);r!==0&&!r&&(r=300),e.sortable=xi.create(e,{group:e.getAttribute("x-sortable-group"),draggable:"[x-sortable-item]",handle:"[x-sortable-handle]",dataIdAttr:"x-sortable-item",animation:r,ghostClass:"fi-sortable-ghost"})})};var is=Object.create,Si=Object.defineProperty,os=Object.getPrototypeOf,as=Object.prototype.hasOwnProperty,ss=Object.getOwnPropertyNames,ls=Object.getOwnPropertyDescriptor,cs=t=>Si(t,"__esModule",{value:!0}),Fo=(t,e)=>()=>(e||(e={exports:{}},t(e.exports,e)),e.exports),fs=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ss(e))!as.call(t,n)&&n!=="default"&&Si(t,n,{get:()=>e[n],enumerable:!(r=ls(e,n))||r.enumerable});return t},Lo=t=>fs(cs(Si(t!=null?is(os(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t),us=Fo(t=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});function e(c){var a=c.getBoundingClientRect();return{width:a.width,height:a.height,top:a.top,right:a.right,bottom:a.bottom,left:a.left,x:a.left,y:a.top}}function r(c){if(c==null)return window;if(c.toString()!=="[object Window]"){var a=c.ownerDocument;return a&&a.defaultView||window}return c}function n(c){var a=r(c),b=a.pageXOffset,D=a.pageYOffset;return{scrollLeft:b,scrollTop:D}}function i(c){var a=r(c).Element;return c instanceof a||c instanceof Element}function o(c){var a=r(c).HTMLElement;return c instanceof a||c instanceof HTMLElement}function s(c){if(typeof ShadowRoot>"u")return!1;var a=r(c).ShadowRoot;return c instanceof a||c instanceof ShadowRoot}function h(c){return{scrollLeft:c.scrollLeft,scrollTop:c.scrollTop}}function u(c){return c===r(c)||!o(c)?n(c):h(c)}function f(c){return c?(c.nodeName||"").toLowerCase():null}function w(c){return((i(c)?c.ownerDocument:c.document)||window.document).documentElement}function m(c){return e(w(c)).left+n(c).scrollLeft}function E(c){return r(c).getComputedStyle(c)}function O(c){var a=E(c),b=a.overflow,D=a.overflowX,T=a.overflowY;return/auto|scroll|overlay|hidden/.test(b+T+D)}function S(c,a,b){b===void 0&&(b=!1);var D=w(a),T=e(c),F=o(a),W={scrollLeft:0,scrollTop:0},j={x:0,y:0};return(F||!F&&!b)&&((f(a)!=="body"||O(D))&&(W=u(a)),o(a)?(j=e(a),j.x+=a.clientLeft,j.y+=a.clientTop):D&&(j.x=m(D))),{x:T.left+W.scrollLeft-j.x,y:T.top+W.scrollTop-j.y,width:T.width,height:T.height}}function P(c){var a=e(c),b=c.offsetWidth,D=c.offsetHeight;return Math.abs(a.width-b)<=1&&(b=a.width),Math.abs(a.height-D)<=1&&(D=a.height),{x:c.offsetLeft,y:c.offsetTop,width:b,height:D}}function R(c){return f(c)==="html"?c:c.assignedSlot||c.parentNode||(s(c)?c.host:null)||w(c)}function $(c){return["html","body","#document"].indexOf(f(c))>=0?c.ownerDocument.body:o(c)&&O(c)?c:$(R(c))}function B(c,a){var b;a===void 0&&(a=[]);var D=$(c),T=D===((b=c.ownerDocument)==null?void 0:b.body),F=r(D),W=T?[F].concat(F.visualViewport||[],O(D)?D:[]):D,j=a.concat(W);return T?j:j.concat(B(R(W)))}function K(c){return["table","td","th"].indexOf(f(c))>=0}function X(c){return!o(c)||E(c).position==="fixed"?null:c.offsetParent}function ne(c){var a=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,b=navigator.userAgent.indexOf("Trident")!==-1;if(b&&o(c)){var D=E(c);if(D.position==="fixed")return null}for(var T=R(c);o(T)&&["html","body"].indexOf(f(T))<0;){var F=E(T);if(F.transform!=="none"||F.perspective!=="none"||F.contain==="paint"||["transform","perspective"].indexOf(F.willChange)!==-1||a&&F.willChange==="filter"||a&&F.filter&&F.filter!=="none")return T;T=T.parentNode}return null}function J(c){for(var a=r(c),b=X(c);b&&K(b)&&E(b).position==="static";)b=X(b);return b&&(f(b)==="html"||f(b)==="body"&&E(b).position==="static")?a:b||ne(c)||a}var V="top",de="bottom",U="right",Z="left",me="auto",l=[V,de,U,Z],p="start",v="end",d="clippingParents",N="viewport",_="popper",M="reference",Q=l.reduce(function(c,a){return c.concat([a+"-"+p,a+"-"+v])},[]),Ue=[].concat(l,[me]).reduce(function(c,a){return c.concat([a,a+"-"+p,a+"-"+v])},[]),Rt="beforeRead",Vt="read",Lr="afterRead",Nr="beforeMain",kr="main",zt="afterMain",nr="beforeWrite",jr="write",rr="afterWrite",It=[Rt,Vt,Lr,Nr,kr,zt,nr,jr,rr];function Br(c){var a=new Map,b=new Set,D=[];c.forEach(function(F){a.set(F.name,F)});function T(F){b.add(F.name);var W=[].concat(F.requires||[],F.requiresIfExists||[]);W.forEach(function(j){if(!b.has(j)){var q=a.get(j);q&&T(q)}}),D.push(F)}return c.forEach(function(F){b.has(F.name)||T(F)}),D}function mt(c){var a=Br(c);return It.reduce(function(b,D){return b.concat(a.filter(function(T){return T.phase===D}))},[])}function Ut(c){var a;return function(){return a||(a=new Promise(function(b){Promise.resolve().then(function(){a=void 0,b(c())})})),a}}function At(c){for(var a=arguments.length,b=new Array(a>1?a-1:0),D=1;D=0,D=b&&o(c)?J(c):c;return i(D)?a.filter(function(T){return i(T)&&kn(T,D)&&f(T)!=="body"}):[]}function wn(c,a,b){var D=a==="clippingParents"?yn(c):[].concat(a),T=[].concat(D,[b]),F=T[0],W=T.reduce(function(j,q){var oe=sr(c,q);return j.top=gt(oe.top,j.top),j.right=ln(oe.right,j.right),j.bottom=ln(oe.bottom,j.bottom),j.left=gt(oe.left,j.left),j},sr(c,F));return W.width=W.right-W.left,W.height=W.bottom-W.top,W.x=W.left,W.y=W.top,W}function cn(c){return c.split("-")[1]}function dt(c){return["top","bottom"].indexOf(c)>=0?"x":"y"}function lr(c){var a=c.reference,b=c.element,D=c.placement,T=D?ot(D):null,F=D?cn(D):null,W=a.x+a.width/2-b.width/2,j=a.y+a.height/2-b.height/2,q;switch(T){case V:q={x:W,y:a.y-b.height};break;case de:q={x:W,y:a.y+a.height};break;case U:q={x:a.x+a.width,y:j};break;case Z:q={x:a.x-b.width,y:j};break;default:q={x:a.x,y:a.y}}var oe=T?dt(T):null;if(oe!=null){var z=oe==="y"?"height":"width";switch(F){case p:q[oe]=q[oe]-(a[z]/2-b[z]/2);break;case v:q[oe]=q[oe]+(a[z]/2-b[z]/2);break}}return q}function cr(){return{top:0,right:0,bottom:0,left:0}}function fr(c){return Object.assign({},cr(),c)}function ur(c,a){return a.reduce(function(b,D){return b[D]=c,b},{})}function qt(c,a){a===void 0&&(a={});var b=a,D=b.placement,T=D===void 0?c.placement:D,F=b.boundary,W=F===void 0?d:F,j=b.rootBoundary,q=j===void 0?N:j,oe=b.elementContext,z=oe===void 0?_:oe,De=b.altBoundary,Le=De===void 0?!1:De,Ae=b.padding,xe=Ae===void 0?0:Ae,Me=fr(typeof xe!="number"?xe:ur(xe,l)),Ee=z===_?M:_,Be=c.elements.reference,Re=c.rects.popper,He=c.elements[Le?Ee:z],ce=wn(i(He)?He:He.contextElement||w(c.elements.popper),W,q),Pe=e(Be),Te=lr({reference:Pe,element:Re,strategy:"absolute",placement:T}),Ne=Xt(Object.assign({},Re,Te)),Fe=z===_?Ne:Pe,Ye={top:ce.top-Fe.top+Me.top,bottom:Fe.bottom-ce.bottom+Me.bottom,left:ce.left-Fe.left+Me.left,right:Fe.right-ce.right+Me.right},$e=c.modifiersData.offset;if(z===_&&$e){var Ve=$e[T];Object.keys(Ye).forEach(function(wt){var et=[U,de].indexOf(wt)>=0?1:-1,Lt=[V,de].indexOf(wt)>=0?"y":"x";Ye[wt]+=Ve[Lt]*et})}return Ye}var dr="Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.",zr="Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.",xn={placement:"bottom",modifiers:[],strategy:"absolute"};function fn(){for(var c=arguments.length,a=new Array(c),b=0;b100){console.error(zr);break}if(z.reset===!0){z.reset=!1,Pe=-1;continue}var Te=z.orderedModifiers[Pe],Ne=Te.fn,Fe=Te.options,Ye=Fe===void 0?{}:Fe,$e=Te.name;typeof Ne=="function"&&(z=Ne({state:z,options:Ye,name:$e,instance:Ae})||z)}}},update:Ut(function(){return new Promise(function(Ee){Ae.forceUpdate(),Ee(z)})}),destroy:function(){Me(),Le=!0}};if(!fn(j,q))return console.error(dr),Ae;Ae.setOptions(oe).then(function(Ee){!Le&&oe.onFirstUpdate&&oe.onFirstUpdate(Ee)});function xe(){z.orderedModifiers.forEach(function(Ee){var Be=Ee.name,Re=Ee.options,He=Re===void 0?{}:Re,ce=Ee.effect;if(typeof ce=="function"){var Pe=ce({state:z,name:Be,instance:Ae,options:He}),Te=function(){};De.push(Pe||Te)}})}function Me(){De.forEach(function(Ee){return Ee()}),De=[]}return Ae}}var On={passive:!0};function Ur(c){var a=c.state,b=c.instance,D=c.options,T=D.scroll,F=T===void 0?!0:T,W=D.resize,j=W===void 0?!0:W,q=r(a.elements.popper),oe=[].concat(a.scrollParents.reference,a.scrollParents.popper);return F&&oe.forEach(function(z){z.addEventListener("scroll",b.update,On)}),j&&q.addEventListener("resize",b.update,On),function(){F&&oe.forEach(function(z){z.removeEventListener("scroll",b.update,On)}),j&&q.removeEventListener("resize",b.update,On)}}var jn={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Ur,data:{}};function Yr(c){var a=c.state,b=c.name;a.modifiersData[b]=lr({reference:a.rects.reference,element:a.rects.popper,strategy:"absolute",placement:a.placement})}var Bn={name:"popperOffsets",enabled:!0,phase:"read",fn:Yr,data:{}},Xr={top:"auto",right:"auto",bottom:"auto",left:"auto"};function qr(c){var a=c.x,b=c.y,D=window,T=D.devicePixelRatio||1;return{x:Yt(Yt(a*T)/T)||0,y:Yt(Yt(b*T)/T)||0}}function Hn(c){var a,b=c.popper,D=c.popperRect,T=c.placement,F=c.offsets,W=c.position,j=c.gpuAcceleration,q=c.adaptive,oe=c.roundOffsets,z=oe===!0?qr(F):typeof oe=="function"?oe(F):F,De=z.x,Le=De===void 0?0:De,Ae=z.y,xe=Ae===void 0?0:Ae,Me=F.hasOwnProperty("x"),Ee=F.hasOwnProperty("y"),Be=Z,Re=V,He=window;if(q){var ce=J(b),Pe="clientHeight",Te="clientWidth";ce===r(b)&&(ce=w(b),E(ce).position!=="static"&&(Pe="scrollHeight",Te="scrollWidth")),ce=ce,T===V&&(Re=de,xe-=ce[Pe]-D.height,xe*=j?1:-1),T===Z&&(Be=U,Le-=ce[Te]-D.width,Le*=j?1:-1)}var Ne=Object.assign({position:W},q&&Xr);if(j){var Fe;return Object.assign({},Ne,(Fe={},Fe[Re]=Ee?"0":"",Fe[Be]=Me?"0":"",Fe.transform=(He.devicePixelRatio||1)<2?"translate("+Le+"px, "+xe+"px)":"translate3d("+Le+"px, "+xe+"px, 0)",Fe))}return Object.assign({},Ne,(a={},a[Re]=Ee?xe+"px":"",a[Be]=Me?Le+"px":"",a.transform="",a))}function g(c){var a=c.state,b=c.options,D=b.gpuAcceleration,T=D===void 0?!0:D,F=b.adaptive,W=F===void 0?!0:F,j=b.roundOffsets,q=j===void 0?!0:j,oe=E(a.elements.popper).transitionProperty||"";W&&["transform","top","right","bottom","left"].some(function(De){return oe.indexOf(De)>=0})&&console.warn(["Popper: Detected CSS transitions on at least one of the following",'CSS properties: "transform", "top", "right", "bottom", "left".',` +(()=>{var qo=Object.create;var Ti=Object.defineProperty;var Go=Object.getOwnPropertyDescriptor;var Ko=Object.getOwnPropertyNames;var Jo=Object.getPrototypeOf,Qo=Object.prototype.hasOwnProperty;var Kr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Zo=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ko(t))!Qo.call(e,i)&&i!==r&&Ti(e,i,{get:()=>t[i],enumerable:!(n=Go(t,i))||n.enumerable});return e};var ea=(e,t,r)=>(r=e!=null?qo(Jo(e)):{},Zo(t||!e||!e.__esModule?Ti(r,"default",{value:e,enumerable:!0}):r,e));var uo=Kr(()=>{});var po=Kr(()=>{});var ho=Kr((Hs,yr)=>{(function(){"use strict";var e="input is invalid type",t="finalize already called",r=typeof window=="object",n=r?window:{};n.JS_MD5_NO_WINDOW&&(r=!1);var i=!r&&typeof self=="object",o=!n.JS_MD5_NO_NODE_JS&&typeof process=="object"&&process.versions&&process.versions.node;o?n=global:i&&(n=self);var a=!n.JS_MD5_NO_COMMON_JS&&typeof yr=="object"&&yr.exports,c=typeof define=="function"&&define.amd,f=!n.JS_MD5_NO_ARRAY_BUFFER&&typeof ArrayBuffer<"u",d="0123456789abcdef".split(""),y=[128,32768,8388608,-2147483648],m=[0,8,16,24],O=["hex","array","digest","buffer","arrayBuffer","base64"],E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),S=[],R;if(f){var T=new ArrayBuffer(68);R=new Uint8Array(T),S=new Uint32Array(T)}var j=Array.isArray;(n.JS_MD5_NO_NODE_JS||!j)&&(j=function(l){return Object.prototype.toString.call(l)==="[object Array]"});var A=ArrayBuffer.isView;f&&(n.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW||!A)&&(A=function(l){return typeof l=="object"&&l.buffer&&l.buffer.constructor===ArrayBuffer});var L=function(l){var h=typeof l;if(h==="string")return[l,!0];if(h!=="object"||l===null)throw new Error(e);if(f&&l.constructor===ArrayBuffer)return[new Uint8Array(l),!1];if(!j(l)&&!A(l))throw new Error(e);return[l,!1]},Y=function(l){return function(h){return new X(!0).update(h)[l]()}},ne=function(){var l=Y("hex");o&&(l=J(l)),l.create=function(){return new X},l.update=function(p){return l.create().update(p)};for(var h=0;h>>6,ze[M++]=128|p&63):p<55296||p>=57344?(ze[M++]=224|p>>>12,ze[M++]=128|p>>>6&63,ze[M++]=128|p&63):(p=65536+((p&1023)<<10|l.charCodeAt(++B)&1023),ze[M++]=240|p>>>18,ze[M++]=128|p>>>12&63,ze[M++]=128|p>>>6&63,ze[M++]=128|p&63);else for(M=this.start;B>>2]|=p<>>2]|=(192|p>>>6)<>>2]|=(128|p&63)<=57344?(Z[M>>>2]|=(224|p>>>12)<>>2]|=(128|p>>>6&63)<>>2]|=(128|p&63)<>>2]|=(240|p>>>18)<>>2]|=(128|p>>>12&63)<>>2]|=(128|p>>>6&63)<>>2]|=(128|p&63)<>>2]|=l[B]<=64?(this.start=M-64,this.hash(),this.hashed=!0):this.start=M}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this},X.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var l=this.blocks,h=this.lastByteIndex;l[h>>>2]|=y[h&3],h>=56&&(this.hashed||this.hash(),l[0]=l[16],l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0),l[14]=this.bytes<<3,l[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},X.prototype.hash=function(){var l,h,v,p,B,M,I=this.blocks;this.first?(l=I[0]-680876937,l=(l<<7|l>>>25)-271733879<<0,p=(-1732584194^l&2004318071)+I[1]-117830708,p=(p<<12|p>>>20)+l<<0,v=(-271733879^p&(l^-271733879))+I[2]-1126478375,v=(v<<17|v>>>15)+p<<0,h=(l^v&(p^l))+I[3]-1316259209,h=(h<<22|h>>>10)+v<<0):(l=this.h0,h=this.h1,v=this.h2,p=this.h3,l+=(p^h&(v^p))+I[0]-680876936,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+I[1]-389564586,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+I[2]+606105819,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+I[3]-1044525330,h=(h<<22|h>>>10)+v<<0),l+=(p^h&(v^p))+I[4]-176418897,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+I[5]+1200080426,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+I[6]-1473231341,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+I[7]-45705983,h=(h<<22|h>>>10)+v<<0,l+=(p^h&(v^p))+I[8]+1770035416,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+I[9]-1958414417,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+I[10]-42063,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+I[11]-1990404162,h=(h<<22|h>>>10)+v<<0,l+=(p^h&(v^p))+I[12]+1804603682,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+I[13]-40341101,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+I[14]-1502002290,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+I[15]+1236535329,h=(h<<22|h>>>10)+v<<0,l+=(v^p&(h^v))+I[1]-165796510,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+I[6]-1069501632,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+I[11]+643717713,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+I[0]-373897302,h=(h<<20|h>>>12)+v<<0,l+=(v^p&(h^v))+I[5]-701558691,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+I[10]+38016083,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+I[15]-660478335,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+I[4]-405537848,h=(h<<20|h>>>12)+v<<0,l+=(v^p&(h^v))+I[9]+568446438,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+I[14]-1019803690,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+I[3]-187363961,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+I[8]+1163531501,h=(h<<20|h>>>12)+v<<0,l+=(v^p&(h^v))+I[13]-1444681467,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+I[2]-51403784,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+I[7]+1735328473,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+I[12]-1926607734,h=(h<<20|h>>>12)+v<<0,B=h^v,l+=(B^p)+I[5]-378558,l=(l<<4|l>>>28)+h<<0,p+=(B^l)+I[8]-2022574463,p=(p<<11|p>>>21)+l<<0,M=p^l,v+=(M^h)+I[11]+1839030562,v=(v<<16|v>>>16)+p<<0,h+=(M^v)+I[14]-35309556,h=(h<<23|h>>>9)+v<<0,B=h^v,l+=(B^p)+I[1]-1530992060,l=(l<<4|l>>>28)+h<<0,p+=(B^l)+I[4]+1272893353,p=(p<<11|p>>>21)+l<<0,M=p^l,v+=(M^h)+I[7]-155497632,v=(v<<16|v>>>16)+p<<0,h+=(M^v)+I[10]-1094730640,h=(h<<23|h>>>9)+v<<0,B=h^v,l+=(B^p)+I[13]+681279174,l=(l<<4|l>>>28)+h<<0,p+=(B^l)+I[0]-358537222,p=(p<<11|p>>>21)+l<<0,M=p^l,v+=(M^h)+I[3]-722521979,v=(v<<16|v>>>16)+p<<0,h+=(M^v)+I[6]+76029189,h=(h<<23|h>>>9)+v<<0,B=h^v,l+=(B^p)+I[9]-640364487,l=(l<<4|l>>>28)+h<<0,p+=(B^l)+I[12]-421815835,p=(p<<11|p>>>21)+l<<0,M=p^l,v+=(M^h)+I[15]+530742520,v=(v<<16|v>>>16)+p<<0,h+=(M^v)+I[2]-995338651,h=(h<<23|h>>>9)+v<<0,l+=(v^(h|~p))+I[0]-198630844,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+I[7]+1126891415,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+I[14]-1416354905,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+I[5]-57434055,h=(h<<21|h>>>11)+v<<0,l+=(v^(h|~p))+I[12]+1700485571,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+I[3]-1894986606,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+I[10]-1051523,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+I[1]-2054922799,h=(h<<21|h>>>11)+v<<0,l+=(v^(h|~p))+I[8]+1873313359,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+I[15]-30611744,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+I[6]-1560198380,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+I[13]+1309151649,h=(h<<21|h>>>11)+v<<0,l+=(v^(h|~p))+I[4]-145523070,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+I[11]-1120210379,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+I[2]+718787259,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+I[9]-343485551,h=(h<<21|h>>>11)+v<<0,this.first?(this.h0=l+1732584193<<0,this.h1=h-271733879<<0,this.h2=v-1732584194<<0,this.h3=p+271733878<<0,this.first=!1):(this.h0=this.h0+l<<0,this.h1=this.h1+h<<0,this.h2=this.h2+v<<0,this.h3=this.h3+p<<0)},X.prototype.hex=function(){this.finalize();var l=this.h0,h=this.h1,v=this.h2,p=this.h3;return d[l>>>4&15]+d[l&15]+d[l>>>12&15]+d[l>>>8&15]+d[l>>>20&15]+d[l>>>16&15]+d[l>>>28&15]+d[l>>>24&15]+d[h>>>4&15]+d[h&15]+d[h>>>12&15]+d[h>>>8&15]+d[h>>>20&15]+d[h>>>16&15]+d[h>>>28&15]+d[h>>>24&15]+d[v>>>4&15]+d[v&15]+d[v>>>12&15]+d[v>>>8&15]+d[v>>>20&15]+d[v>>>16&15]+d[v>>>28&15]+d[v>>>24&15]+d[p>>>4&15]+d[p&15]+d[p>>>12&15]+d[p>>>8&15]+d[p>>>20&15]+d[p>>>16&15]+d[p>>>28&15]+d[p>>>24&15]},X.prototype.toString=X.prototype.hex,X.prototype.digest=function(){this.finalize();var l=this.h0,h=this.h1,v=this.h2,p=this.h3;return[l&255,l>>>8&255,l>>>16&255,l>>>24&255,h&255,h>>>8&255,h>>>16&255,h>>>24&255,v&255,v>>>8&255,v>>>16&255,v>>>24&255,p&255,p>>>8&255,p>>>16&255,p>>>24&255]},X.prototype.array=X.prototype.digest,X.prototype.arrayBuffer=function(){this.finalize();var l=new ArrayBuffer(16),h=new Uint32Array(l);return h[0]=this.h0,h[1]=this.h1,h[2]=this.h2,h[3]=this.h3,l},X.prototype.buffer=X.prototype.arrayBuffer,X.prototype.base64=function(){for(var l,h,v,p="",B=this.array(),M=0;M<15;)l=B[M++],h=B[M++],v=B[M++],p+=E[l>>>2]+E[(l<<4|h>>>4)&63]+E[(h<<2|v>>>6)&63]+E[v&63];return l=B[M],p+=E[l>>>2]+E[l<<4&63]+"==",p};function Q(l,h){var v,p=L(l);if(l=p[0],p[1]){var B=[],M=l.length,I=0,Z;for(v=0;v>>6,B[I++]=128|Z&63):Z<55296||Z>=57344?(B[I++]=224|Z>>>12,B[I++]=128|Z>>>6&63,B[I++]=128|Z&63):(Z=65536+((Z&1023)<<10|l.charCodeAt(++v)&1023),B[I++]=240|Z>>>18,B[I++]=128|Z>>>12&63,B[I++]=128|Z>>>6&63,B[I++]=128|Z&63);l=B}l.length>64&&(l=new X(!0).update(l).array());var ze=[],Rt=[];for(v=0;v<64;++v){var Ut=l[v]||0;ze[v]=92^Ut,Rt[v]=54^Ut}X.call(this,h),this.update(Rt),this.oKeyPad=ze,this.inner=!0,this.sharedMemory=h}Q.prototype=new X,Q.prototype.finalize=function(){if(X.prototype.finalize.call(this),this.inner){this.inner=!1;var l=this.array();X.call(this,this.sharedMemory),this.update(this.oKeyPad),this.update(l),X.prototype.finalize.call(this)}};var me=ne();me.md5=me,me.md5.hmac=de(),a?yr.exports=me:(n.md5=me,c&&define(function(){return me}))})()});var Hi=["top","right","bottom","left"],Pi=["start","end"],Mi=Hi.reduce((e,t)=>e.concat(t,t+"-"+Pi[0],t+"-"+Pi[1]),[]),Et=Math.min,tt=Math.max,hr=Math.round,pr=Math.floor,nn=e=>({x:e,y:e}),ta={left:"right",right:"left",bottom:"top",top:"bottom"},na={start:"end",end:"start"};function Jr(e,t,r){return tt(e,Et(t,r))}function jt(e,t){return typeof e=="function"?e(t):e}function pt(e){return e.split("-")[0]}function xt(e){return e.split("-")[1]}function $i(e){return e==="x"?"y":"x"}function Qr(e){return e==="y"?"height":"width"}function Pn(e){return["top","bottom"].includes(pt(e))?"y":"x"}function Zr(e){return $i(Pn(e))}function Wi(e,t,r){r===void 0&&(r=!1);let n=xt(e),i=Zr(e),o=Qr(i),a=i==="x"?n===(r?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(a=mr(a)),[a,mr(a)]}function ra(e){let t=mr(e);return[vr(e),t,vr(t)]}function vr(e){return e.replace(/start|end/g,t=>na[t])}function ia(e,t,r){let n=["left","right"],i=["right","left"],o=["top","bottom"],a=["bottom","top"];switch(e){case"top":case"bottom":return r?t?i:n:t?n:i;case"left":case"right":return t?o:a;default:return[]}}function oa(e,t,r,n){let i=xt(e),o=ia(pt(e),r==="start",n);return i&&(o=o.map(a=>a+"-"+i),t&&(o=o.concat(o.map(vr)))),o}function mr(e){return e.replace(/left|right|bottom|top/g,t=>ta[t])}function aa(e){return{top:0,right:0,bottom:0,left:0,...e}}function ei(e){return typeof e!="number"?aa(e):{top:e,right:e,bottom:e,left:e}}function Dn(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}function Ri(e,t,r){let{reference:n,floating:i}=e,o=Pn(t),a=Zr(t),c=Qr(a),f=pt(t),d=o==="y",y=n.x+n.width/2-i.width/2,m=n.y+n.height/2-i.height/2,O=n[c]/2-i[c]/2,E;switch(f){case"top":E={x:y,y:n.y-i.height};break;case"bottom":E={x:y,y:n.y+n.height};break;case"right":E={x:n.x+n.width,y:m};break;case"left":E={x:n.x-i.width,y:m};break;default:E={x:n.x,y:n.y}}switch(xt(t)){case"start":E[a]-=O*(r&&d?-1:1);break;case"end":E[a]+=O*(r&&d?-1:1);break}return E}var sa=async(e,t,r)=>{let{placement:n="bottom",strategy:i="absolute",middleware:o=[],platform:a}=r,c=o.filter(Boolean),f=await(a.isRTL==null?void 0:a.isRTL(t)),d=await a.getElementRects({reference:e,floating:t,strategy:i}),{x:y,y:m}=Ri(d,n,f),O=n,E={},S=0;for(let R=0;R({name:"arrow",options:e,async fn(t){let{x:r,y:n,placement:i,rects:o,platform:a,elements:c,middlewareData:f}=t,{element:d,padding:y=0}=jt(e,t)||{};if(d==null)return{};let m=ei(y),O={x:r,y:n},E=Zr(i),S=Qr(E),R=await a.getDimensions(d),T=E==="y",j=T?"top":"left",A=T?"bottom":"right",L=T?"clientHeight":"clientWidth",Y=o.reference[S]+o.reference[E]-O[E]-o.floating[S],ne=O[E]-o.reference[E],J=await(a.getOffsetParent==null?void 0:a.getOffsetParent(d)),V=J?J[L]:0;(!V||!await(a.isElement==null?void 0:a.isElement(J)))&&(V=c.floating[L]||o.floating[S]);let de=Y/2-ne/2,X=V/2-R[S]/2-1,Q=Et(m[j],X),me=Et(m[A],X),l=Q,h=V-R[S]-me,v=V/2-R[S]/2+de,p=Jr(l,v,h),B=!f.arrow&&xt(i)!=null&&v!==p&&o.reference[S]/2-(vxt(i)===e),...r.filter(i=>xt(i)!==e)]:r.filter(i=>pt(i)===i)).filter(i=>e?xt(i)===e||(t?vr(i)!==i:!1):!0)}var fa=function(e){return e===void 0&&(e={}),{name:"autoPlacement",options:e,async fn(t){var r,n,i;let{rects:o,middlewareData:a,placement:c,platform:f,elements:d}=t,{crossAxis:y=!1,alignment:m,allowedPlacements:O=Mi,autoAlignment:E=!0,...S}=jt(e,t),R=m!==void 0||O===Mi?ca(m||null,E,O):O,T=await _n(t,S),j=((r=a.autoPlacement)==null?void 0:r.index)||0,A=R[j];if(A==null)return{};let L=Wi(A,o,await(f.isRTL==null?void 0:f.isRTL(d.floating)));if(c!==A)return{reset:{placement:R[0]}};let Y=[T[pt(A)],T[L[0]],T[L[1]]],ne=[...((n=a.autoPlacement)==null?void 0:n.overflows)||[],{placement:A,overflows:Y}],J=R[j+1];if(J)return{data:{index:j+1,overflows:ne},reset:{placement:J}};let V=ne.map(Q=>{let me=xt(Q.placement);return[Q.placement,me&&y?Q.overflows.slice(0,2).reduce((l,h)=>l+h,0):Q.overflows[0],Q.overflows]}).sort((Q,me)=>Q[1]-me[1]),X=((i=V.filter(Q=>Q[2].slice(0,xt(Q[0])?2:3).every(me=>me<=0))[0])==null?void 0:i[0])||V[0][0];return X!==c?{data:{index:j+1,overflows:ne},reset:{placement:X}}:{}}}},ua=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var r,n;let{placement:i,middlewareData:o,rects:a,initialPlacement:c,platform:f,elements:d}=t,{mainAxis:y=!0,crossAxis:m=!0,fallbackPlacements:O,fallbackStrategy:E="bestFit",fallbackAxisSideDirection:S="none",flipAlignment:R=!0,...T}=jt(e,t);if((r=o.arrow)!=null&&r.alignmentOffset)return{};let j=pt(i),A=pt(c)===c,L=await(f.isRTL==null?void 0:f.isRTL(d.floating)),Y=O||(A||!R?[mr(c)]:ra(c));!O&&S!=="none"&&Y.push(...oa(c,R,S,L));let ne=[c,...Y],J=await _n(t,T),V=[],de=((n=o.flip)==null?void 0:n.overflows)||[];if(y&&V.push(J[j]),m){let l=Wi(i,a,L);V.push(J[l[0]],J[l[1]])}if(de=[...de,{placement:i,overflows:V}],!V.every(l=>l<=0)){var X,Q;let l=(((X=o.flip)==null?void 0:X.index)||0)+1,h=ne[l];if(h)return{data:{index:l,overflows:de},reset:{placement:h}};let v=(Q=de.filter(p=>p.overflows[0]<=0).sort((p,B)=>p.overflows[1]-B.overflows[1])[0])==null?void 0:Q.placement;if(!v)switch(E){case"bestFit":{var me;let p=(me=de.map(B=>[B.placement,B.overflows.filter(M=>M>0).reduce((M,I)=>M+I,0)]).sort((B,M)=>B[1]-M[1])[0])==null?void 0:me[0];p&&(v=p);break}case"initialPlacement":v=c;break}if(i!==v)return{reset:{placement:v}}}return{}}}};function Ii(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Li(e){return Hi.some(t=>e[t]>=0)}var da=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){let{rects:r}=t,{strategy:n="referenceHidden",...i}=jt(e,t);switch(n){case"referenceHidden":{let o=await _n(t,{...i,elementContext:"reference"}),a=Ii(o,r.reference);return{data:{referenceHiddenOffsets:a,referenceHidden:Li(a)}}}case"escaped":{let o=await _n(t,{...i,altBoundary:!0}),a=Ii(o,r.floating);return{data:{escapedOffsets:a,escaped:Li(a)}}}default:return{}}}}};function Ui(e){let t=Et(...e.map(o=>o.left)),r=Et(...e.map(o=>o.top)),n=tt(...e.map(o=>o.right)),i=tt(...e.map(o=>o.bottom));return{x:t,y:r,width:n-t,height:i-r}}function pa(e){let t=e.slice().sort((i,o)=>i.y-o.y),r=[],n=null;for(let i=0;in.height/2?r.push([o]):r[r.length-1].push(o),n=o}return r.map(i=>Dn(Ui(i)))}var ha=function(e){return e===void 0&&(e={}),{name:"inline",options:e,async fn(t){let{placement:r,elements:n,rects:i,platform:o,strategy:a}=t,{padding:c=2,x:f,y:d}=jt(e,t),y=Array.from(await(o.getClientRects==null?void 0:o.getClientRects(n.reference))||[]),m=pa(y),O=Dn(Ui(y)),E=ei(c);function S(){if(m.length===2&&m[0].left>m[1].right&&f!=null&&d!=null)return m.find(T=>f>T.left-E.left&&fT.top-E.top&&d=2){if(Pn(r)==="y"){let Q=m[0],me=m[m.length-1],l=pt(r)==="top",h=Q.top,v=me.bottom,p=l?Q.left:me.left,B=l?Q.right:me.right,M=B-p,I=v-h;return{top:h,bottom:v,left:p,right:B,width:M,height:I,x:p,y:h}}let T=pt(r)==="left",j=tt(...m.map(Q=>Q.right)),A=Et(...m.map(Q=>Q.left)),L=m.filter(Q=>T?Q.left===A:Q.right===j),Y=L[0].top,ne=L[L.length-1].bottom,J=A,V=j,de=V-J,X=ne-Y;return{top:Y,bottom:ne,left:J,right:V,width:de,height:X,x:J,y:Y}}return O}let R=await o.getElementRects({reference:{getBoundingClientRect:S},floating:n.floating,strategy:a});return i.reference.x!==R.reference.x||i.reference.y!==R.reference.y||i.reference.width!==R.reference.width||i.reference.height!==R.reference.height?{reset:{rects:R}}:{}}}};async function va(e,t){let{placement:r,platform:n,elements:i}=e,o=await(n.isRTL==null?void 0:n.isRTL(i.floating)),a=pt(r),c=xt(r),f=Pn(r)==="y",d=["left","top"].includes(a)?-1:1,y=o&&f?-1:1,m=jt(t,e),{mainAxis:O,crossAxis:E,alignmentAxis:S}=typeof m=="number"?{mainAxis:m,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...m};return c&&typeof S=="number"&&(E=c==="end"?S*-1:S),f?{x:E*y,y:O*d}:{x:O*d,y:E*y}}var Vi=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var r,n;let{x:i,y:o,placement:a,middlewareData:c}=t,f=await va(t,e);return a===((r=c.offset)==null?void 0:r.placement)&&(n=c.arrow)!=null&&n.alignmentOffset?{}:{x:i+f.x,y:o+f.y,data:{...f,placement:a}}}}},ma=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){let{x:r,y:n,placement:i}=t,{mainAxis:o=!0,crossAxis:a=!1,limiter:c={fn:T=>{let{x:j,y:A}=T;return{x:j,y:A}}},...f}=jt(e,t),d={x:r,y:n},y=await _n(t,f),m=Pn(pt(i)),O=$i(m),E=d[O],S=d[m];if(o){let T=O==="y"?"top":"left",j=O==="y"?"bottom":"right",A=E+y[T],L=E-y[j];E=Jr(A,E,L)}if(a){let T=m==="y"?"top":"left",j=m==="y"?"bottom":"right",A=S+y[T],L=S-y[j];S=Jr(A,S,L)}let R=c.fn({...t,[O]:E,[m]:S});return{...R,data:{x:R.x-r,y:R.y-n}}}}},ga=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){let{placement:r,rects:n,platform:i,elements:o}=t,{apply:a=()=>{},...c}=jt(e,t),f=await _n(t,c),d=pt(r),y=xt(r),m=Pn(r)==="y",{width:O,height:E}=n.floating,S,R;d==="top"||d==="bottom"?(S=d,R=y===(await(i.isRTL==null?void 0:i.isRTL(o.floating))?"start":"end")?"left":"right"):(R=d,S=y==="end"?"top":"bottom");let T=E-f[S],j=O-f[R],A=!t.middlewareData.shift,L=T,Y=j;if(m){let J=O-f.left-f.right;Y=y||A?Et(j,J):J}else{let J=E-f.top-f.bottom;L=y||A?Et(T,J):J}if(A&&!y){let J=tt(f.left,0),V=tt(f.right,0),de=tt(f.top,0),X=tt(f.bottom,0);m?Y=O-2*(J!==0||V!==0?J+V:tt(f.left,f.right)):L=E-2*(de!==0||X!==0?de+X:tt(f.top,f.bottom))}await a({...t,availableWidth:Y,availableHeight:L});let ne=await i.getDimensions(o.floating);return O!==ne.width||E!==ne.height?{reset:{rects:!0}}:{}}}};function rn(e){return zi(e)?(e.nodeName||"").toLowerCase():"#document"}function ct(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Bt(e){var t;return(t=(zi(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function zi(e){return e instanceof Node||e instanceof ct(e).Node}function Nt(e){return e instanceof Element||e instanceof ct(e).Element}function Tt(e){return e instanceof HTMLElement||e instanceof ct(e).HTMLElement}function Fi(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof ct(e).ShadowRoot}function zn(e){let{overflow:t,overflowX:r,overflowY:n,display:i}=ht(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+r)&&!["inline","contents"].includes(i)}function ba(e){return["table","td","th"].includes(rn(e))}function ti(e){let t=ni(),r=ht(e);return r.transform!=="none"||r.perspective!=="none"||(r.containerType?r.containerType!=="normal":!1)||!t&&(r.backdropFilter?r.backdropFilter!=="none":!1)||!t&&(r.filter?r.filter!=="none":!1)||["transform","perspective","filter"].some(n=>(r.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(r.contain||"").includes(n))}function ya(e){let t=Tn(e);for(;Tt(t)&&!gr(t);){if(ti(t))return t;t=Tn(t)}return null}function ni(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function gr(e){return["html","body","#document"].includes(rn(e))}function ht(e){return ct(e).getComputedStyle(e)}function br(e){return Nt(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Tn(e){if(rn(e)==="html")return e;let t=e.assignedSlot||e.parentNode||Fi(e)&&e.host||Bt(e);return Fi(t)?t.host:t}function Yi(e){let t=Tn(e);return gr(t)?e.ownerDocument?e.ownerDocument.body:e.body:Tt(t)&&zn(t)?t:Yi(t)}function Vn(e,t,r){var n;t===void 0&&(t=[]),r===void 0&&(r=!0);let i=Yi(e),o=i===((n=e.ownerDocument)==null?void 0:n.body),a=ct(i);return o?t.concat(a,a.visualViewport||[],zn(i)?i:[],a.frameElement&&r?Vn(a.frameElement):[]):t.concat(i,Vn(i,[],r))}function Xi(e){let t=ht(e),r=parseFloat(t.width)||0,n=parseFloat(t.height)||0,i=Tt(e),o=i?e.offsetWidth:r,a=i?e.offsetHeight:n,c=hr(r)!==o||hr(n)!==a;return c&&(r=o,n=a),{width:r,height:n,$:c}}function ri(e){return Nt(e)?e:e.contextElement}function Cn(e){let t=ri(e);if(!Tt(t))return nn(1);let r=t.getBoundingClientRect(),{width:n,height:i,$:o}=Xi(t),a=(o?hr(r.width):r.width)/n,c=(o?hr(r.height):r.height)/i;return(!a||!Number.isFinite(a))&&(a=1),(!c||!Number.isFinite(c))&&(c=1),{x:a,y:c}}var wa=nn(0);function qi(e){let t=ct(e);return!ni()||!t.visualViewport?wa:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function xa(e,t,r){return t===void 0&&(t=!1),!r||t&&r!==ct(e)?!1:t}function vn(e,t,r,n){t===void 0&&(t=!1),r===void 0&&(r=!1);let i=e.getBoundingClientRect(),o=ri(e),a=nn(1);t&&(n?Nt(n)&&(a=Cn(n)):a=Cn(e));let c=xa(o,r,n)?qi(o):nn(0),f=(i.left+c.x)/a.x,d=(i.top+c.y)/a.y,y=i.width/a.x,m=i.height/a.y;if(o){let O=ct(o),E=n&&Nt(n)?ct(n):n,S=O,R=S.frameElement;for(;R&&n&&E!==S;){let T=Cn(R),j=R.getBoundingClientRect(),A=ht(R),L=j.left+(R.clientLeft+parseFloat(A.paddingLeft))*T.x,Y=j.top+(R.clientTop+parseFloat(A.paddingTop))*T.y;f*=T.x,d*=T.y,y*=T.x,m*=T.y,f+=L,d+=Y,S=ct(R),R=S.frameElement}}return Dn({width:y,height:m,x:f,y:d})}var Ea=[":popover-open",":modal"];function Gi(e){return Ea.some(t=>{try{return e.matches(t)}catch{return!1}})}function Oa(e){let{elements:t,rect:r,offsetParent:n,strategy:i}=e,o=i==="fixed",a=Bt(n),c=t?Gi(t.floating):!1;if(n===a||c&&o)return r;let f={scrollLeft:0,scrollTop:0},d=nn(1),y=nn(0),m=Tt(n);if((m||!m&&!o)&&((rn(n)!=="body"||zn(a))&&(f=br(n)),Tt(n))){let O=vn(n);d=Cn(n),y.x=O.x+n.clientLeft,y.y=O.y+n.clientTop}return{width:r.width*d.x,height:r.height*d.y,x:r.x*d.x-f.scrollLeft*d.x+y.x,y:r.y*d.y-f.scrollTop*d.y+y.y}}function Sa(e){return Array.from(e.getClientRects())}function Ki(e){return vn(Bt(e)).left+br(e).scrollLeft}function Aa(e){let t=Bt(e),r=br(e),n=e.ownerDocument.body,i=tt(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),o=tt(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight),a=-r.scrollLeft+Ki(e),c=-r.scrollTop;return ht(n).direction==="rtl"&&(a+=tt(t.clientWidth,n.clientWidth)-i),{width:i,height:o,x:a,y:c}}function Ca(e,t){let r=ct(e),n=Bt(e),i=r.visualViewport,o=n.clientWidth,a=n.clientHeight,c=0,f=0;if(i){o=i.width,a=i.height;let d=ni();(!d||d&&t==="fixed")&&(c=i.offsetLeft,f=i.offsetTop)}return{width:o,height:a,x:c,y:f}}function Da(e,t){let r=vn(e,!0,t==="fixed"),n=r.top+e.clientTop,i=r.left+e.clientLeft,o=Tt(e)?Cn(e):nn(1),a=e.clientWidth*o.x,c=e.clientHeight*o.y,f=i*o.x,d=n*o.y;return{width:a,height:c,x:f,y:d}}function ki(e,t,r){let n;if(t==="viewport")n=Ca(e,r);else if(t==="document")n=Aa(Bt(e));else if(Nt(t))n=Da(t,r);else{let i=qi(e);n={...t,x:t.x-i.x,y:t.y-i.y}}return Dn(n)}function Ji(e,t){let r=Tn(e);return r===t||!Nt(r)||gr(r)?!1:ht(r).position==="fixed"||Ji(r,t)}function _a(e,t){let r=t.get(e);if(r)return r;let n=Vn(e,[],!1).filter(c=>Nt(c)&&rn(c)!=="body"),i=null,o=ht(e).position==="fixed",a=o?Tn(e):e;for(;Nt(a)&&!gr(a);){let c=ht(a),f=ti(a);!f&&c.position==="fixed"&&(i=null),(o?!f&&!i:!f&&c.position==="static"&&!!i&&["absolute","fixed"].includes(i.position)||zn(a)&&!f&&Ji(e,a))?n=n.filter(y=>y!==a):i=c,a=Tn(a)}return t.set(e,n),n}function Ta(e){let{element:t,boundary:r,rootBoundary:n,strategy:i}=e,a=[...r==="clippingAncestors"?_a(t,this._c):[].concat(r),n],c=a[0],f=a.reduce((d,y)=>{let m=ki(t,y,i);return d.top=tt(m.top,d.top),d.right=Et(m.right,d.right),d.bottom=Et(m.bottom,d.bottom),d.left=tt(m.left,d.left),d},ki(t,c,i));return{width:f.right-f.left,height:f.bottom-f.top,x:f.left,y:f.top}}function Pa(e){let{width:t,height:r}=Xi(e);return{width:t,height:r}}function Ma(e,t,r){let n=Tt(t),i=Bt(t),o=r==="fixed",a=vn(e,!0,o,t),c={scrollLeft:0,scrollTop:0},f=nn(0);if(n||!n&&!o)if((rn(t)!=="body"||zn(i))&&(c=br(t)),n){let m=vn(t,!0,o,t);f.x=m.x+t.clientLeft,f.y=m.y+t.clientTop}else i&&(f.x=Ki(i));let d=a.left+c.scrollLeft-f.x,y=a.top+c.scrollTop-f.y;return{x:d,y,width:a.width,height:a.height}}function Ni(e,t){return!Tt(e)||ht(e).position==="fixed"?null:t?t(e):e.offsetParent}function Qi(e,t){let r=ct(e);if(!Tt(e)||Gi(e))return r;let n=Ni(e,t);for(;n&&ba(n)&&ht(n).position==="static";)n=Ni(n,t);return n&&(rn(n)==="html"||rn(n)==="body"&&ht(n).position==="static"&&!ti(n))?r:n||ya(e)||r}var Ra=async function(e){let t=this.getOffsetParent||Qi,r=this.getDimensions;return{reference:Ma(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,...await r(e.floating)}}};function Ia(e){return ht(e).direction==="rtl"}var La={convertOffsetParentRelativeRectToViewportRelativeRect:Oa,getDocumentElement:Bt,getClippingRect:Ta,getOffsetParent:Qi,getElementRects:Ra,getClientRects:Sa,getDimensions:Pa,getScale:Cn,isElement:Nt,isRTL:Ia};function Fa(e,t){let r=null,n,i=Bt(e);function o(){var c;clearTimeout(n),(c=r)==null||c.disconnect(),r=null}function a(c,f){c===void 0&&(c=!1),f===void 0&&(f=1),o();let{left:d,top:y,width:m,height:O}=e.getBoundingClientRect();if(c||t(),!m||!O)return;let E=pr(y),S=pr(i.clientWidth-(d+m)),R=pr(i.clientHeight-(y+O)),T=pr(d),A={rootMargin:-E+"px "+-S+"px "+-R+"px "+-T+"px",threshold:tt(0,Et(1,f))||1},L=!0;function Y(ne){let J=ne[0].intersectionRatio;if(J!==f){if(!L)return a();J?a(!1,J):n=setTimeout(()=>{a(!1,1e-7)},100)}L=!1}try{r=new IntersectionObserver(Y,{...A,root:i.ownerDocument})}catch{r=new IntersectionObserver(Y,A)}r.observe(e)}return a(!0),o}function ji(e,t,r,n){n===void 0&&(n={});let{ancestorScroll:i=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:c=typeof IntersectionObserver=="function",animationFrame:f=!1}=n,d=ri(e),y=i||o?[...d?Vn(d):[],...Vn(t)]:[];y.forEach(j=>{i&&j.addEventListener("scroll",r,{passive:!0}),o&&j.addEventListener("resize",r)});let m=d&&c?Fa(d,r):null,O=-1,E=null;a&&(E=new ResizeObserver(j=>{let[A]=j;A&&A.target===d&&E&&(E.unobserve(t),cancelAnimationFrame(O),O=requestAnimationFrame(()=>{var L;(L=E)==null||L.observe(t)})),r()}),d&&!f&&E.observe(d),E.observe(t));let S,R=f?vn(e):null;f&&T();function T(){let j=vn(e);R&&(j.x!==R.x||j.y!==R.y||j.width!==R.width||j.height!==R.height)&&r(),R=j,S=requestAnimationFrame(T)}return r(),()=>{var j;y.forEach(A=>{i&&A.removeEventListener("scroll",r),o&&A.removeEventListener("resize",r)}),m?.(),(j=E)==null||j.disconnect(),E=null,f&&cancelAnimationFrame(S)}}var ii=fa,Zi=ma,eo=ua,to=ga,no=da,ro=la,io=ha,Bi=(e,t,r)=>{let n=new Map,i={platform:La,...r},o={...i.platform,_c:n};return sa(e,t,{...i,platform:o})},ka=e=>{let t={placement:"bottom",strategy:"absolute",middleware:[]},r=Object.keys(e),n=i=>e[i];return r.includes("offset")&&t.middleware.push(Vi(n("offset"))),r.includes("teleport")&&(t.strategy="fixed"),r.includes("placement")&&(t.placement=n("placement")),r.some(i=>/^auto-?placement$/i.test(i))&&!r.includes("flip")&&t.middleware.push(ii(n("autoPlacement"))),r.includes("flip")&&t.middleware.push(eo(n("flip"))),r.includes("shift")&&t.middleware.push(Zi(n("shift"))),r.includes("inline")&&t.middleware.push(io(n("inline"))),r.includes("arrow")&&t.middleware.push(ro(n("arrow"))),r.includes("hide")&&t.middleware.push(no(n("hide"))),r.includes("size")&&t.middleware.push(to(n("size"))),t},Na=(e,t)=>{let r={component:{trap:!1},float:{placement:"bottom",strategy:"absolute",middleware:[]}},n=i=>e[e.indexOf(i)+1];if(e.includes("trap")&&(r.component.trap=!0),e.includes("teleport")&&(r.float.strategy="fixed"),e.includes("offset")&&r.float.middleware.push(Vi(t.offset||10)),e.includes("placement")&&(r.float.placement=n("placement")),e.some(i=>/^auto-?placement$/i.test(i))&&!e.includes("flip")&&r.float.middleware.push(ii(t.autoPlacement)),e.includes("flip")&&r.float.middleware.push(eo(t.flip)),e.includes("shift")&&r.float.middleware.push(Zi(t.shift)),e.includes("inline")&&r.float.middleware.push(io(t.inline)),e.includes("arrow")&&r.float.middleware.push(ro(t.arrow)),e.includes("hide")&&r.float.middleware.push(no(t.hide)),e.includes("size")){let i=t.size?.availableWidth??null,o=t.size?.availableHeight??null;i&&delete t.size.availableWidth,o&&delete t.size.availableHeight,r.float.middleware.push(to({...t.size,apply({availableWidth:a,availableHeight:c,elements:f}){Object.assign(f.floating.style,{maxWidth:`${i??a}px`,maxHeight:`${o??c}px`})}}))}return r},ja=e=>{var t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".split(""),r="";e||(e=Math.floor(Math.random()*t.length));for(var n=0;n{}){let r=!1;return function(){r?t.apply(this,arguments):(r=!0,e.apply(this,arguments))}}function Ha(e){let t={dismissable:!0,trap:!1};function r(n,i=null){if(n){if(n.hasAttribute("aria-expanded")||n.setAttribute("aria-expanded",!1),i.hasAttribute("id"))n.setAttribute("aria-controls",i.getAttribute("id"));else{let o=`panel-${ja(8)}`;n.setAttribute("aria-controls",o),i.setAttribute("id",o)}i.setAttribute("aria-modal",!0),i.setAttribute("role","dialog")}}e.magic("float",n=>(i={},o={})=>{let a={...t,...o},c=Object.keys(i).length>0?ka(i):{middleware:[ii()]},f=n,d=n.parentElement.closest("[x-data]"),y=d.querySelector('[x-ref="panel"]');r(f,y);function m(){return y.style.display=="block"}function O(){y.style.display="none",f.setAttribute("aria-expanded","false"),a.trap&&y.setAttribute("x-trap","false"),ji(n,y,R)}function E(){y.style.display="block",f.setAttribute("aria-expanded","true"),a.trap&&y.setAttribute("x-trap","true"),R()}function S(){m()?O():E()}async function R(){return await Bi(n,y,c).then(({middlewareData:T,placement:j,x:A,y:L})=>{if(T.arrow){let Y=T.arrow?.x,ne=T.arrow?.y,J=c.middleware.filter(de=>de.name=="arrow")[0].options.element,V={top:"bottom",right:"left",bottom:"top",left:"right"}[j.split("-")[0]];Object.assign(J.style,{left:Y!=null?`${Y}px`:"",top:ne!=null?`${ne}px`:"",right:"",bottom:"",[V]:"-4px"})}if(T.hide){let{referenceHidden:Y}=T.hide;Object.assign(y.style,{visibility:Y?"hidden":"visible"})}Object.assign(y.style,{left:`${A}px`,top:`${L}px`})})}a.dismissable&&(window.addEventListener("click",T=>{!d.contains(T.target)&&m()&&S()}),window.addEventListener("keydown",T=>{T.key==="Escape"&&m()&&S()},!0)),S()}),e.directive("float",(n,{modifiers:i,expression:o},{evaluate:a,effect:c})=>{let f=o?a(o):{},d=i.length>0?Na(i,f):{},y=null;d.float.strategy=="fixed"&&(n.style.position="fixed");let m=V=>n.parentElement&&!n.parentElement.closest("[x-data]").contains(V.target)?n.close():null,O=V=>V.key==="Escape"?n.close():null,E=n.getAttribute("x-ref"),S=n.parentElement.closest("[x-data]"),R=S.querySelectorAll(`[\\@click^="$refs.${E}"]`),T=S.querySelectorAll(`[x-on\\:click^="$refs.${E}"]`);n.style.setProperty("display","none"),r([...R,...T][0],n),n._x_isShown=!1,n.trigger=null,n._x_doHide||(n._x_doHide=()=>{n.style.setProperty("display","none",i.includes("important")?"important":void 0)}),n._x_doShow||(n._x_doShow=()=>{n.style.setProperty("display","block",i.includes("important")?"important":void 0)});let j=()=>{n._x_doHide(),n._x_isShown=!1},A=()=>{n._x_doShow(),n._x_isShown=!0},L=()=>setTimeout(A),Y=Ba(V=>V?A():j(),V=>{typeof n._x_toggleAndCascadeWithTransitions=="function"?n._x_toggleAndCascadeWithTransitions(n,V,A,j):V?L():j()}),ne,J=!0;c(()=>a(V=>{!J&&V===ne||(i.includes("immediate")&&(V?L():j()),Y(V),ne=V,J=!1)})),n.open=async function(V){n.trigger=V.currentTarget?V.currentTarget:V,Y(!0),n.trigger.setAttribute("aria-expanded","true"),d.component.trap&&n.setAttribute("x-trap","true"),y=ji(n.trigger,n,()=>{Bi(n.trigger,n,d.float).then(({middlewareData:de,placement:X,x:Q,y:me})=>{if(de.arrow){let l=de.arrow?.x,h=de.arrow?.y,v=d.float.middleware.filter(B=>B.name=="arrow")[0].options.element,p={top:"bottom",right:"left",bottom:"top",left:"right"}[X.split("-")[0]];Object.assign(v.style,{left:l!=null?`${l}px`:"",top:h!=null?`${h}px`:"",right:"",bottom:"",[p]:"-4px"})}if(de.hide){let{referenceHidden:l}=de.hide;Object.assign(n.style,{visibility:l?"hidden":"visible"})}Object.assign(n.style,{left:`${Q}px`,top:`${me}px`})})}),window.addEventListener("click",m),window.addEventListener("keydown",O,!0)},n.close=function(){if(!n._x_isShown)return!1;Y(!1),n.trigger.setAttribute("aria-expanded","false"),d.component.trap&&n.setAttribute("x-trap","false"),y(),window.removeEventListener("click",m),window.removeEventListener("keydown",O,!1)},n.toggle=function(V){n._x_isShown?n.close():n.open(V)}})}var oo=Ha;function $a(e){e.store("lazyLoadedAssets",{loaded:new Set,check(a){return Array.isArray(a)?a.every(c=>this.loaded.has(c)):this.loaded.has(a)},markLoaded(a){Array.isArray(a)?a.forEach(c=>this.loaded.add(c)):this.loaded.add(a)}});let t=a=>new CustomEvent(a,{bubbles:!0,composed:!0,cancelable:!0}),r=(a,c={},f,d)=>{let y=document.createElement(a);return Object.entries(c).forEach(([m,O])=>y[m]=O),f&&(d?f.insertBefore(y,d):f.appendChild(y)),y},n=(a,c,f={},d=null,y=null)=>{let m=a==="link"?`link[href="${c}"]`:`script[src="${c}"]`;if(document.querySelector(m)||e.store("lazyLoadedAssets").check(c))return Promise.resolve();let O=a==="link"?{...f,href:c}:{...f,src:c},E=r(a,O,d,y);return new Promise((S,R)=>{E.onload=()=>{e.store("lazyLoadedAssets").markLoaded(c),S()},E.onerror=()=>{R(new Error(`Failed to load ${a}: ${c}`))}})},i=async(a,c,f=null,d=null)=>{let y={type:"text/css",rel:"stylesheet"};c&&(y.media=c);let m=document.head,O=null;if(f&&d){let E=document.querySelector(`link[href*="${d}"]`);E?(m=E.parentElement,O=f==="before"?E:E.nextSibling):(console.warn(`Target (${d}) not found for ${a}. Appending to head.`),m=document.head,O=null)}await n("link",a,y,m,O)},o=async(a,c,f=null,d=null,y=null)=>{let m=document.head,O=null;if(f&&d){let S=document.querySelector(`script[src*="${d}"]`);S?(m=S.parentElement,O=f==="before"?S:S.nextSibling):(console.warn(`Target (${d}) not found for ${a}. Falling back to head or body.`),m=document.head,O=null)}else(c.has("body-start")||c.has("body-end"))&&(m=document.body,c.has("body-start")&&(O=document.body.firstChild));let E={};y&&(E.type="module"),await n("script",a,E,m,O)};e.directive("load-css",(a,{expression:c},{evaluate:f})=>{let d=f(c),y=a.media,m=a.getAttribute("data-dispatch"),O=a.getAttribute("data-css-before")?"before":a.getAttribute("data-css-after")?"after":null,E=a.getAttribute("data-css-before")||a.getAttribute("data-css-after")||null;Promise.all(d.map(S=>i(S,y,O,E))).then(()=>{m&&window.dispatchEvent(t(`${m}-css`))}).catch(console.error)}),e.directive("load-js",(a,{expression:c,modifiers:f},{evaluate:d})=>{let y=d(c),m=new Set(f),O=a.getAttribute("data-js-before")?"before":a.getAttribute("data-js-after")?"after":null,E=a.getAttribute("data-js-before")||a.getAttribute("data-js-after")||null,S=a.getAttribute("data-js-as-module")||a.getAttribute("data-as-module")||!1,R=a.getAttribute("data-dispatch");Promise.all(y.map(T=>o(T,m,O,E,S))).then(()=>{R&&window.dispatchEvent(t(`${R}-js`))}).catch(console.error)})}var ao=$a;function Wa(){return!0}function Ua({component:e,argument:t}){return new Promise(r=>{if(t)window.addEventListener(t,()=>r(),{once:!0});else{let n=i=>{i.detail.id===e.id&&(window.removeEventListener("async-alpine:load",n),r())};window.addEventListener("async-alpine:load",n)}})}function Va(){return new Promise(e=>{"requestIdleCallback"in window?window.requestIdleCallback(e):setTimeout(e,200)})}function za({argument:e}){return new Promise(t=>{if(!e)return console.log("Async Alpine: media strategy requires a media query. Treating as 'eager'"),t();let r=window.matchMedia(`(${e})`);r.matches?t():r.addEventListener("change",t,{once:!0})})}function Ya({component:e,argument:t}){return new Promise(r=>{let n=t||"0px 0px 0px 0px",i=new IntersectionObserver(o=>{o[0].isIntersecting&&(i.disconnect(),r())},{rootMargin:n});i.observe(e.el)})}var so={eager:Wa,event:Ua,idle:Va,media:za,visible:Ya};async function Xa(e){let t=qa(e.strategy);await oi(e,t)}async function oi(e,t){if(t.type==="expression"){if(t.operator==="&&")return Promise.all(t.parameters.map(r=>oi(e,r)));if(t.operator==="||")return Promise.any(t.parameters.map(r=>oi(e,r)))}return so[t.method]?so[t.method]({component:e,argument:t.argument}):!1}function qa(e){let t=Ga(e),r=co(t);return r.type==="method"?{type:"expression",operator:"&&",parameters:[r]}:r}function Ga(e){let t=/\s*([()])\s*|\s*(\|\||&&|\|)\s*|\s*((?:[^()&|]+\([^()]+\))|[^()&|]+)\s*/g,r=[],n;for(;(n=t.exec(e))!==null;){let[i,o,a,c]=n;if(o!==void 0)r.push({type:"parenthesis",value:o});else if(a!==void 0)r.push({type:"operator",value:a==="|"?"&&":a});else{let f={type:"method",method:c.trim()};c.includes("(")&&(f.method=c.substring(0,c.indexOf("(")).trim(),f.argument=c.substring(c.indexOf("(")+1,c.indexOf(")"))),c.method==="immediate"&&(c.method="eager"),r.push(f)}}return r}function co(e){let t=lo(e);for(;e.length>0&&(e[0].value==="&&"||e[0].value==="|"||e[0].value==="||");){let r=e.shift().value,n=lo(e);t.type==="expression"&&t.operator===r?t.parameters.push(n):t={type:"expression",operator:r,parameters:[t,n]}}return t}function lo(e){if(e[0].value==="("){e.shift();let t=co(e);return e[0].value===")"&&e.shift(),t}else return e.shift()}function fo(e){let t="load",r=e.prefixed("load-src"),n=e.prefixed("ignore"),i={defaultStrategy:"eager",keepRelativeURLs:!1},o=!1,a={},c=0;function f(){return c++}e.asyncOptions=A=>{i={...i,...A}},e.asyncData=(A,L=!1)=>{a[A]={loaded:!1,download:L}},e.asyncUrl=(A,L)=>{!A||!L||a[A]||(a[A]={loaded:!1,download:()=>import(j(L))})},e.asyncAlias=A=>{o=A};let d=A=>{e.skipDuringClone(()=>{A._x_async||(A._x_async="init",A._x_ignore=!0,A.setAttribute(n,""))})()},y=async A=>{e.skipDuringClone(async()=>{if(A._x_async!=="init")return;A._x_async="await";let{name:L,strategy:Y}=m(A);await Xa({name:L,strategy:Y,el:A,id:A.id||f()}),A.isConnected&&(await O(L),A.isConnected&&(S(A),A._x_async="loaded"))})()};y.inline=d,e.directive(t,y).before("ignore");function m(A){let L=T(A.getAttribute(e.prefixed("data"))),Y=A.getAttribute(e.prefixed(t))||i.defaultStrategy,ne=A.getAttribute(r);return ne&&e.asyncUrl(L,ne),{name:L,strategy:Y}}async function O(A){if(A.startsWith("_x_async_")||(R(A),!a[A]||a[A].loaded))return;let L=await E(A);e.data(A,L),a[A].loaded=!0}async function E(A){if(!a[A])return;let L=await a[A].download(A);return typeof L=="function"?L:L[A]||L.default||Object.values(L)[0]||!1}function S(A){e.destroyTree(A),A._x_ignore=!1,A.removeAttribute(n),!A.closest(`[${n}]`)&&e.initTree(A)}function R(A){if(!(!o||a[A])){if(typeof o=="function"){e.asyncData(A,o);return}e.asyncUrl(A,o.replaceAll("[name]",A))}}function T(A){return(A||"").trim().split(/[({]/g)[0]||`_x_async_${f()}`}function j(A){return i.keepRelativeURLs||new RegExp("^(?:[a-z+]+:)?//","i").test(A)?A:new URL(A,document.baseURI).href}}var Xo=ea(ho(),1);function vo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Mt(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function Qa(e,t){if(e==null)return{};var r=Ja(e,t),n,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var Za="1.15.6";function Ht(e){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(e)}var Wt=Ht(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),er=Ht(/Edge/i),mo=Ht(/firefox/i),Gn=Ht(/safari/i)&&!Ht(/chrome/i)&&!Ht(/android/i),yi=Ht(/iP(ad|od|hone)/i),So=Ht(/chrome/i)&&Ht(/android/i),Ao={capture:!1,passive:!1};function Oe(e,t,r){e.addEventListener(t,r,!Wt&&Ao)}function Ee(e,t,r){e.removeEventListener(t,r,!Wt&&Ao)}function Tr(e,t){if(t){if(t[0]===">"&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function Co(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function St(e,t,r,n){if(e){r=r||document;do{if(t!=null&&(t[0]===">"?e.parentNode===r&&Tr(e,t):Tr(e,t))||n&&e===r)return e;if(e===r)break}while(e=Co(e))}return null}var go=/\s+/g;function ft(e,t,r){if(e&&t)if(e.classList)e.classList[r?"add":"remove"](t);else{var n=(" "+e.className+" ").replace(go," ").replace(" "+t+" "," ");e.className=(n+(r?" "+t:"")).replace(go," ")}}function ae(e,t,r){var n=e&&e.style;if(n){if(r===void 0)return document.defaultView&&document.defaultView.getComputedStyle?r=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(r=e.currentStyle),t===void 0?r:r[t];!(t in n)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),n[t]=r+(typeof r=="string"?"":"px")}}function Fn(e,t){var r="";if(typeof e=="string")r=e;else do{var n=ae(e,"transform");n&&n!=="none"&&(r=n+" "+r)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(r)}function Do(e,t,r){if(e){var n=e.getElementsByTagName(t),i=0,o=n.length;if(r)for(;i=o:a=i<=o,!a)return n;if(n===Pt())break;n=sn(n,!1)}return!1}function kn(e,t,r,n){for(var i=0,o=0,a=e.children;o2&&arguments[2]!==void 0?arguments[2]:{},i=n.evt,o=Qa(n,ss);tr.pluginEvent.bind(se)(t,r,Mt({dragEl:N,parentEl:Ve,ghostEl:ue,rootEl:Ne,nextEl:bn,lastDownEl:Ar,cloneEl:We,cloneHidden:an,dragStarted:Yn,putSortable:Qe,activeSortable:se.active,originalEvent:i,oldIndex:Ln,oldDraggableIndex:Jn,newIndex:ut,newDraggableIndex:on,hideGhostForTarget:Fo,unhideGhostForTarget:ko,cloneNowHidden:function(){an=!0},cloneNowShown:function(){an=!1},dispatchSortableEvent:function(c){it({sortable:r,name:c,originalEvent:i})}},o))};function it(e){as(Mt({putSortable:Qe,cloneEl:We,targetEl:N,rootEl:Ne,oldIndex:Ln,oldDraggableIndex:Jn,newIndex:ut,newDraggableIndex:on},e))}var N,Ve,ue,Ne,bn,Ar,We,an,Ln,ut,Jn,on,wr,Qe,In=!1,Pr=!1,Mr=[],mn,Ot,li,ci,wo,xo,Yn,Rn,Qn,Zn=!1,xr=!1,Cr,nt,fi=[],vi=!1,Rr=[],Lr=typeof document<"u",Er=yi,Eo=er||Wt?"cssFloat":"float",ls=Lr&&!So&&!yi&&"draggable"in document.createElement("div"),Ro=(function(){if(Lr){if(Wt)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto",e.style.pointerEvents==="auto"}})(),Io=function(t,r){var n=ae(t),i=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),o=kn(t,0,r),a=kn(t,1,r),c=o&&ae(o),f=a&&ae(a),d=c&&parseInt(c.marginLeft)+parseInt(c.marginRight)+qe(o).width,y=f&&parseInt(f.marginLeft)+parseInt(f.marginRight)+qe(a).width;if(n.display==="flex")return n.flexDirection==="column"||n.flexDirection==="column-reverse"?"vertical":"horizontal";if(n.display==="grid")return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(o&&c.float&&c.float!=="none"){var m=c.float==="left"?"left":"right";return a&&(f.clear==="both"||f.clear===m)?"vertical":"horizontal"}return o&&(c.display==="block"||c.display==="flex"||c.display==="table"||c.display==="grid"||d>=i&&n[Eo]==="none"||a&&n[Eo]==="none"&&d+y>i)?"vertical":"horizontal"},cs=function(t,r,n){var i=n?t.left:t.top,o=n?t.right:t.bottom,a=n?t.width:t.height,c=n?r.left:r.top,f=n?r.right:r.bottom,d=n?r.width:r.height;return i===c||o===f||i+a/2===c+d/2},fs=function(t,r){var n;return Mr.some(function(i){var o=i[st].options.emptyInsertThreshold;if(!(!o||wi(i))){var a=qe(i),c=t>=a.left-o&&t<=a.right+o,f=r>=a.top-o&&r<=a.bottom+o;if(c&&f)return n=i}}),n},Lo=function(t){function r(o,a){return function(c,f,d,y){var m=c.options.group.name&&f.options.group.name&&c.options.group.name===f.options.group.name;if(o==null&&(a||m))return!0;if(o==null||o===!1)return!1;if(a&&o==="clone")return o;if(typeof o=="function")return r(o(c,f,d,y),a)(c,f,d,y);var O=(a?c:f).options.group.name;return o===!0||typeof o=="string"&&o===O||o.join&&o.indexOf(O)>-1}}var n={},i=t.group;(!i||Sr(i)!="object")&&(i={name:i}),n.name=i.name,n.checkPull=r(i.pull,!0),n.checkPut=r(i.put),n.revertClone=i.revertClone,t.group=n},Fo=function(){!Ro&&ue&&ae(ue,"display","none")},ko=function(){!Ro&&ue&&ae(ue,"display","")};Lr&&!So&&document.addEventListener("click",function(e){if(Pr)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),Pr=!1,!1},!0);var gn=function(t){if(N){t=t.touches?t.touches[0]:t;var r=fs(t.clientX,t.clientY);if(r){var n={};for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);n.target=n.rootEl=r,n.preventDefault=void 0,n.stopPropagation=void 0,r[st]._onDragOver(n)}}},us=function(t){N&&N.parentNode[st]._isOutsideThisEl(t.target)};function se(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=$t({},t),e[st]=this;var r={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Io(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(a,c){a.setData("Text",c.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:se.supportPointer!==!1&&"PointerEvent"in window&&(!Gn||yi),emptyInsertThreshold:5};tr.initializePlugins(this,e,r);for(var n in r)!(n in t)&&(t[n]=r[n]);Lo(t);for(var i in this)i.charAt(0)==="_"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this));this.nativeDraggable=t.forceFallback?!1:ls,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?Oe(e,"pointerdown",this._onTapStart):(Oe(e,"mousedown",this._onTapStart),Oe(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(Oe(e,"dragover",this),Oe(e,"dragenter",this)),Mr.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),$t(this,rs())}se.prototype={constructor:se,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Rn=null)},_getDirection:function(t,r){return typeof this.options.direction=="function"?this.options.direction.call(this,t,r,N):this.options.direction},_onTapStart:function(t){if(t.cancelable){var r=this,n=this.el,i=this.options,o=i.preventOnFilter,a=t.type,c=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,f=(c||t).target,d=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||f,y=i.filter;if(ys(n),!N&&!(/mousedown|pointerdown/.test(a)&&t.button!==0||i.disabled)&&!d.isContentEditable&&!(!this.nativeDraggable&&Gn&&f&&f.tagName.toUpperCase()==="SELECT")&&(f=St(f,i.draggable,n,!1),!(f&&f.animated)&&Ar!==f)){if(Ln=vt(f),Jn=vt(f,i.draggable),typeof y=="function"){if(y.call(this,t,f,this)){it({sortable:r,rootEl:d,name:"filter",targetEl:f,toEl:n,fromEl:n}),at("filter",r,{evt:t}),o&&t.preventDefault();return}}else if(y&&(y=y.split(",").some(function(m){if(m=St(d,m.trim(),n,!1),m)return it({sortable:r,rootEl:m,name:"filter",targetEl:f,fromEl:n,toEl:n}),at("filter",r,{evt:t}),!0}),y)){o&&t.preventDefault();return}i.handle&&!St(d,i.handle,n,!1)||this._prepareDragStart(t,c,f)}}},_prepareDragStart:function(t,r,n){var i=this,o=i.el,a=i.options,c=o.ownerDocument,f;if(n&&!N&&n.parentNode===o){var d=qe(n);if(Ne=o,N=n,Ve=N.parentNode,bn=N.nextSibling,Ar=n,wr=a.group,se.dragged=N,mn={target:N,clientX:(r||t).clientX,clientY:(r||t).clientY},wo=mn.clientX-d.left,xo=mn.clientY-d.top,this._lastX=(r||t).clientX,this._lastY=(r||t).clientY,N.style["will-change"]="all",f=function(){if(at("delayEnded",i,{evt:t}),se.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!mo&&i.nativeDraggable&&(N.draggable=!0),i._triggerDragStart(t,r),it({sortable:i,name:"choose",originalEvent:t}),ft(N,a.chosenClass,!0)},a.ignore.split(",").forEach(function(y){Do(N,y.trim(),ui)}),Oe(c,"dragover",gn),Oe(c,"mousemove",gn),Oe(c,"touchmove",gn),a.supportPointer?(Oe(c,"pointerup",i._onDrop),!this.nativeDraggable&&Oe(c,"pointercancel",i._onDrop)):(Oe(c,"mouseup",i._onDrop),Oe(c,"touchend",i._onDrop),Oe(c,"touchcancel",i._onDrop)),mo&&this.nativeDraggable&&(this.options.touchStartThreshold=4,N.draggable=!0),at("delayStart",this,{evt:t}),a.delay&&(!a.delayOnTouchOnly||r)&&(!this.nativeDraggable||!(er||Wt))){if(se.eventCanceled){this._onDrop();return}a.supportPointer?(Oe(c,"pointerup",i._disableDelayedDrag),Oe(c,"pointercancel",i._disableDelayedDrag)):(Oe(c,"mouseup",i._disableDelayedDrag),Oe(c,"touchend",i._disableDelayedDrag),Oe(c,"touchcancel",i._disableDelayedDrag)),Oe(c,"mousemove",i._delayedDragTouchMoveHandler),Oe(c,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&Oe(c,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(f,a.delay)}else f()}},_delayedDragTouchMoveHandler:function(t){var r=t.touches?t.touches[0]:t;Math.max(Math.abs(r.clientX-this._lastX),Math.abs(r.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){N&&ui(N),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;Ee(t,"mouseup",this._disableDelayedDrag),Ee(t,"touchend",this._disableDelayedDrag),Ee(t,"touchcancel",this._disableDelayedDrag),Ee(t,"pointerup",this._disableDelayedDrag),Ee(t,"pointercancel",this._disableDelayedDrag),Ee(t,"mousemove",this._delayedDragTouchMoveHandler),Ee(t,"touchmove",this._delayedDragTouchMoveHandler),Ee(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,r){r=r||t.pointerType=="touch"&&t,!this.nativeDraggable||r?this.options.supportPointer?Oe(document,"pointermove",this._onTouchMove):r?Oe(document,"touchmove",this._onTouchMove):Oe(document,"mousemove",this._onTouchMove):(Oe(N,"dragend",this),Oe(Ne,"dragstart",this._onDragStart));try{document.selection?Dr(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,r){if(In=!1,Ne&&N){at("dragStarted",this,{evt:r}),this.nativeDraggable&&Oe(document,"dragover",us);var n=this.options;!t&&ft(N,n.dragClass,!1),ft(N,n.ghostClass,!0),se.active=this,t&&this._appendGhost(),it({sortable:this,name:"start",originalEvent:r})}else this._nulling()},_emulateDragOver:function(){if(Ot){this._lastX=Ot.clientX,this._lastY=Ot.clientY,Fo();for(var t=document.elementFromPoint(Ot.clientX,Ot.clientY),r=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(Ot.clientX,Ot.clientY),t!==r);)r=t;if(N.parentNode[st]._isOutsideThisEl(t),r)do{if(r[st]){var n=void 0;if(n=r[st]._onDragOver({clientX:Ot.clientX,clientY:Ot.clientY,target:t,rootEl:r}),n&&!this.options.dragoverBubble)break}t=r}while(r=Co(r));ko()}},_onTouchMove:function(t){if(mn){var r=this.options,n=r.fallbackTolerance,i=r.fallbackOffset,o=t.touches?t.touches[0]:t,a=ue&&Fn(ue,!0),c=ue&&a&&a.a,f=ue&&a&&a.d,d=Er&&nt&&yo(nt),y=(o.clientX-mn.clientX+i.x)/(c||1)+(d?d[0]-fi[0]:0)/(c||1),m=(o.clientY-mn.clientY+i.y)/(f||1)+(d?d[1]-fi[1]:0)/(f||1);if(!se.active&&!In){if(n&&Math.max(Math.abs(o.clientX-this._lastX),Math.abs(o.clientY-this._lastY))=0&&(it({rootEl:Ve,name:"add",toEl:Ve,fromEl:Ne,originalEvent:t}),it({sortable:this,name:"remove",toEl:Ve,originalEvent:t}),it({rootEl:Ve,name:"sort",toEl:Ve,fromEl:Ne,originalEvent:t}),it({sortable:this,name:"sort",toEl:Ve,originalEvent:t})),Qe&&Qe.save()):ut!==Ln&&ut>=0&&(it({sortable:this,name:"update",toEl:Ve,originalEvent:t}),it({sortable:this,name:"sort",toEl:Ve,originalEvent:t})),se.active&&((ut==null||ut===-1)&&(ut=Ln,on=Jn),it({sortable:this,name:"end",toEl:Ve,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){at("nulling",this),Ne=N=Ve=ue=bn=We=Ar=an=mn=Ot=Yn=ut=on=Ln=Jn=Rn=Qn=Qe=wr=se.dragged=se.ghost=se.clone=se.active=null,Rr.forEach(function(t){t.checked=!0}),Rr.length=li=ci=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":N&&(this._onDragOver(t),ds(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],r,n=this.el.children,i=0,o=n.length,a=this.options;ii.right+o||e.clientY>n.bottom&&e.clientX>n.left:e.clientY>i.bottom+o||e.clientX>n.right&&e.clientY>n.top}function ms(e,t,r,n,i,o,a,c){var f=n?e.clientY:e.clientX,d=n?r.height:r.width,y=n?r.top:r.left,m=n?r.bottom:r.right,O=!1;if(!a){if(c&&Cry+d*o/2:fm-Cr)return-Qn}else if(f>y+d*(1-i)/2&&fm-d*o/2)?f>y+d/2?1:-1:0}function gs(e){return vt(N){e.directive("sortable",t=>{let r=parseInt(t.dataset?.sortableAnimationDuration);r!==0&&!r&&(r=300),t.sortable=Oi.create(t,{group:t.getAttribute("x-sortable-group"),draggable:"[x-sortable-item]",handle:"[x-sortable-handle]",dataIdAttr:"x-sortable-item",animation:r,ghostClass:"fi-sortable-ghost",onEnd(n){let{item:i,to:o,oldDraggableIndex:a,newDraggableIndex:c}=n;if(a===c)return;let f=this.options.draggable,d=o.querySelectorAll(`:scope > ${f}`)[c-1];d&&o.insertBefore(i,d.nextSibling)}})})};var xs=Object.create,Ci=Object.defineProperty,Es=Object.getPrototypeOf,Os=Object.prototype.hasOwnProperty,Ss=Object.getOwnPropertyNames,As=Object.getOwnPropertyDescriptor,Cs=e=>Ci(e,"__esModule",{value:!0}),Bo=(e,t)=>()=>(t||(t={exports:{}},e(t.exports,t)),t.exports),Ds=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ss(t))!Os.call(e,n)&&n!=="default"&&Ci(e,n,{get:()=>t[n],enumerable:!(r=As(t,n))||r.enumerable});return e},Ho=e=>Ds(Cs(Ci(e!=null?xs(Es(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),_s=Bo(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});function t(u){var s=u.getBoundingClientRect();return{width:s.width,height:s.height,top:s.top,right:s.right,bottom:s.bottom,left:s.left,x:s.left,y:s.top}}function r(u){if(u==null)return window;if(u.toString()!=="[object Window]"){var s=u.ownerDocument;return s&&s.defaultView||window}return u}function n(u){var s=r(u),b=s.pageXOffset,_=s.pageYOffset;return{scrollLeft:b,scrollTop:_}}function i(u){var s=r(u).Element;return u instanceof s||u instanceof Element}function o(u){var s=r(u).HTMLElement;return u instanceof s||u instanceof HTMLElement}function a(u){if(typeof ShadowRoot>"u")return!1;var s=r(u).ShadowRoot;return u instanceof s||u instanceof ShadowRoot}function c(u){return{scrollLeft:u.scrollLeft,scrollTop:u.scrollTop}}function f(u){return u===r(u)||!o(u)?n(u):c(u)}function d(u){return u?(u.nodeName||"").toLowerCase():null}function y(u){return((i(u)?u.ownerDocument:u.document)||window.document).documentElement}function m(u){return t(y(u)).left+n(u).scrollLeft}function O(u){return r(u).getComputedStyle(u)}function E(u){var s=O(u),b=s.overflow,_=s.overflowX,P=s.overflowY;return/auto|scroll|overlay|hidden/.test(b+P+_)}function S(u,s,b){b===void 0&&(b=!1);var _=y(s),P=t(u),k=o(s),U={scrollLeft:0,scrollTop:0},$={x:0,y:0};return(k||!k&&!b)&&((d(s)!=="body"||E(_))&&(U=f(s)),o(s)?($=t(s),$.x+=s.clientLeft,$.y+=s.clientTop):_&&($.x=m(_))),{x:P.left+U.scrollLeft-$.x,y:P.top+U.scrollTop-$.y,width:P.width,height:P.height}}function R(u){var s=t(u),b=u.offsetWidth,_=u.offsetHeight;return Math.abs(s.width-b)<=1&&(b=s.width),Math.abs(s.height-_)<=1&&(_=s.height),{x:u.offsetLeft,y:u.offsetTop,width:b,height:_}}function T(u){return d(u)==="html"?u:u.assignedSlot||u.parentNode||(a(u)?u.host:null)||y(u)}function j(u){return["html","body","#document"].indexOf(d(u))>=0?u.ownerDocument.body:o(u)&&E(u)?u:j(T(u))}function A(u,s){var b;s===void 0&&(s=[]);var _=j(u),P=_===((b=u.ownerDocument)==null?void 0:b.body),k=r(_),U=P?[k].concat(k.visualViewport||[],E(_)?_:[]):_,$=s.concat(U);return P?$:$.concat(A(T(U)))}function L(u){return["table","td","th"].indexOf(d(u))>=0}function Y(u){return!o(u)||O(u).position==="fixed"?null:u.offsetParent}function ne(u){var s=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,b=navigator.userAgent.indexOf("Trident")!==-1;if(b&&o(u)){var _=O(u);if(_.position==="fixed")return null}for(var P=T(u);o(P)&&["html","body"].indexOf(d(P))<0;){var k=O(P);if(k.transform!=="none"||k.perspective!=="none"||k.contain==="paint"||["transform","perspective"].indexOf(k.willChange)!==-1||s&&k.willChange==="filter"||s&&k.filter&&k.filter!=="none")return P;P=P.parentNode}return null}function J(u){for(var s=r(u),b=Y(u);b&&L(b)&&O(b).position==="static";)b=Y(b);return b&&(d(b)==="html"||d(b)==="body"&&O(b).position==="static")?s:b||ne(u)||s}var V="top",de="bottom",X="right",Q="left",me="auto",l=[V,de,X,Q],h="start",v="end",p="clippingParents",B="viewport",M="popper",I="reference",Z=l.reduce(function(u,s){return u.concat([s+"-"+h,s+"-"+v])},[]),ze=[].concat(l,[me]).reduce(function(u,s){return u.concat([s,s+"-"+h,s+"-"+v])},[]),Rt="beforeRead",Ut="read",Fr="afterRead",kr="beforeMain",Nr="main",Vt="afterMain",nr="beforeWrite",jr="write",rr="afterWrite",It=[Rt,Ut,Fr,kr,Nr,Vt,nr,jr,rr];function Br(u){var s=new Map,b=new Set,_=[];u.forEach(function(k){s.set(k.name,k)});function P(k){b.add(k.name);var U=[].concat(k.requires||[],k.requiresIfExists||[]);U.forEach(function($){if(!b.has($)){var G=s.get($);G&&P(G)}}),_.push(k)}return u.forEach(function(k){b.has(k.name)||P(k)}),_}function mt(u){var s=Br(u);return It.reduce(function(b,_){return b.concat(s.filter(function(P){return P.phase===_}))},[])}function zt(u){var s;return function(){return s||(s=new Promise(function(b){Promise.resolve().then(function(){s=void 0,b(u())})})),s}}function At(u){for(var s=arguments.length,b=new Array(s>1?s-1:0),_=1;_=0,_=b&&o(u)?J(u):u;return i(_)?s.filter(function(P){return i(P)&&Nn(P,_)&&d(P)!=="body"}):[]}function wn(u,s,b){var _=s==="clippingParents"?yn(u):[].concat(s),P=[].concat(_,[b]),k=P[0],U=P.reduce(function($,G){var oe=sr(u,G);return $.top=gt(oe.top,$.top),$.right=ln(oe.right,$.right),$.bottom=ln(oe.bottom,$.bottom),$.left=gt(oe.left,$.left),$},sr(u,k));return U.width=U.right-U.left,U.height=U.bottom-U.top,U.x=U.left,U.y=U.top,U}function cn(u){return u.split("-")[1]}function dt(u){return["top","bottom"].indexOf(u)>=0?"x":"y"}function lr(u){var s=u.reference,b=u.element,_=u.placement,P=_?ot(_):null,k=_?cn(_):null,U=s.x+s.width/2-b.width/2,$=s.y+s.height/2-b.height/2,G;switch(P){case V:G={x:U,y:s.y-b.height};break;case de:G={x:U,y:s.y+s.height};break;case X:G={x:s.x+s.width,y:$};break;case Q:G={x:s.x-b.width,y:$};break;default:G={x:s.x,y:s.y}}var oe=P?dt(P):null;if(oe!=null){var z=oe==="y"?"height":"width";switch(k){case h:G[oe]=G[oe]-(s[z]/2-b[z]/2);break;case v:G[oe]=G[oe]+(s[z]/2-b[z]/2);break}}return G}function cr(){return{top:0,right:0,bottom:0,left:0}}function fr(u){return Object.assign({},cr(),u)}function ur(u,s){return s.reduce(function(b,_){return b[_]=u,b},{})}function qt(u,s){s===void 0&&(s={});var b=s,_=b.placement,P=_===void 0?u.placement:_,k=b.boundary,U=k===void 0?p:k,$=b.rootBoundary,G=$===void 0?B:$,oe=b.elementContext,z=oe===void 0?M:oe,De=b.altBoundary,Fe=De===void 0?!1:De,Ce=b.padding,xe=Ce===void 0?0:Ce,Me=fr(typeof xe!="number"?xe:ur(xe,l)),Se=z===M?I:M,Be=u.elements.reference,Re=u.rects.popper,He=u.elements[Fe?Se:z],ce=wn(i(He)?He:He.contextElement||y(u.elements.popper),U,G),Pe=t(Be),_e=lr({reference:Pe,element:Re,strategy:"absolute",placement:P}),ke=Xt(Object.assign({},Re,_e)),Le=z===M?ke:Pe,Ye={top:ce.top-Le.top+Me.top,bottom:Le.bottom-ce.bottom+Me.bottom,left:ce.left-Le.left+Me.left,right:Le.right-ce.right+Me.right},$e=u.modifiersData.offset;if(z===M&&$e){var Ue=$e[P];Object.keys(Ye).forEach(function(wt){var et=[X,de].indexOf(wt)>=0?1:-1,Ft=[V,de].indexOf(wt)>=0?"y":"x";Ye[wt]+=Ue[Ft]*et})}return Ye}var dr="Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.",Vr="Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.",xn={placement:"bottom",modifiers:[],strategy:"absolute"};function fn(){for(var u=arguments.length,s=new Array(u),b=0;b100){console.error(Vr);break}if(z.reset===!0){z.reset=!1,Pe=-1;continue}var _e=z.orderedModifiers[Pe],ke=_e.fn,Le=_e.options,Ye=Le===void 0?{}:Le,$e=_e.name;typeof ke=="function"&&(z=ke({state:z,options:Ye,name:$e,instance:Ce})||z)}}},update:zt(function(){return new Promise(function(Se){Ce.forceUpdate(),Se(z)})}),destroy:function(){Me(),Fe=!0}};if(!fn($,G))return console.error(dr),Ce;Ce.setOptions(oe).then(function(Se){!Fe&&oe.onFirstUpdate&&oe.onFirstUpdate(Se)});function xe(){z.orderedModifiers.forEach(function(Se){var Be=Se.name,Re=Se.options,He=Re===void 0?{}:Re,ce=Se.effect;if(typeof ce=="function"){var Pe=ce({state:z,name:Be,instance:Ce,options:He}),_e=function(){};De.push(Pe||_e)}})}function Me(){De.forEach(function(Se){return Se()}),De=[]}return Ce}}var On={passive:!0};function zr(u){var s=u.state,b=u.instance,_=u.options,P=_.scroll,k=P===void 0?!0:P,U=_.resize,$=U===void 0?!0:U,G=r(s.elements.popper),oe=[].concat(s.scrollParents.reference,s.scrollParents.popper);return k&&oe.forEach(function(z){z.addEventListener("scroll",b.update,On)}),$&&G.addEventListener("resize",b.update,On),function(){k&&oe.forEach(function(z){z.removeEventListener("scroll",b.update,On)}),$&&G.removeEventListener("resize",b.update,On)}}var jn={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:zr,data:{}};function Yr(u){var s=u.state,b=u.name;s.modifiersData[b]=lr({reference:s.rects.reference,element:s.rects.popper,strategy:"absolute",placement:s.placement})}var Bn={name:"popperOffsets",enabled:!0,phase:"read",fn:Yr,data:{}},Xr={top:"auto",right:"auto",bottom:"auto",left:"auto"};function qr(u){var s=u.x,b=u.y,_=window,P=_.devicePixelRatio||1;return{x:Yt(Yt(s*P)/P)||0,y:Yt(Yt(b*P)/P)||0}}function Hn(u){var s,b=u.popper,_=u.popperRect,P=u.placement,k=u.offsets,U=u.position,$=u.gpuAcceleration,G=u.adaptive,oe=u.roundOffsets,z=oe===!0?qr(k):typeof oe=="function"?oe(k):k,De=z.x,Fe=De===void 0?0:De,Ce=z.y,xe=Ce===void 0?0:Ce,Me=k.hasOwnProperty("x"),Se=k.hasOwnProperty("y"),Be=Q,Re=V,He=window;if(G){var ce=J(b),Pe="clientHeight",_e="clientWidth";ce===r(b)&&(ce=y(b),O(ce).position!=="static"&&(Pe="scrollHeight",_e="scrollWidth")),ce=ce,P===V&&(Re=de,xe-=ce[Pe]-_.height,xe*=$?1:-1),P===Q&&(Be=X,Fe-=ce[_e]-_.width,Fe*=$?1:-1)}var ke=Object.assign({position:U},G&&Xr);if($){var Le;return Object.assign({},ke,(Le={},Le[Re]=Se?"0":"",Le[Be]=Me?"0":"",Le.transform=(He.devicePixelRatio||1)<2?"translate("+Fe+"px, "+xe+"px)":"translate3d("+Fe+"px, "+xe+"px, 0)",Le))}return Object.assign({},ke,(s={},s[Re]=Se?xe+"px":"",s[Be]=Me?Fe+"px":"",s.transform="",s))}function g(u){var s=u.state,b=u.options,_=b.gpuAcceleration,P=_===void 0?!0:_,k=b.adaptive,U=k===void 0?!0:k,$=b.roundOffsets,G=$===void 0?!0:$,oe=O(s.elements.popper).transitionProperty||"";U&&["transform","top","right","bottom","left"].some(function(De){return oe.indexOf(De)>=0})&&console.warn(["Popper: Detected CSS transitions on at least one of the following",'CSS properties: "transform", "top", "right", "bottom", "left".',` `,'Disable the "computeStyles" modifier\'s `adaptive` option to allow',"for smooth transitions, or remove these properties from the CSS","transition declaration on the popper element if only transitioning","opacity or background-color for example.",` -`,"We recommend using the popper element as a wrapper around an inner","element that can have any CSS property transitioned for animations."].join(" "));var z={placement:ot(a.placement),popper:a.elements.popper,popperRect:a.rects.popper,gpuAcceleration:T};a.modifiersData.popperOffsets!=null&&(a.styles.popper=Object.assign({},a.styles.popper,Hn(Object.assign({},z,{offsets:a.modifiersData.popperOffsets,position:a.options.strategy,adaptive:W,roundOffsets:q})))),a.modifiersData.arrow!=null&&(a.styles.arrow=Object.assign({},a.styles.arrow,Hn(Object.assign({},z,{offsets:a.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:q})))),a.attributes.popper=Object.assign({},a.attributes.popper,{"data-popper-placement":a.placement})}var y={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:g,data:{}};function A(c){var a=c.state;Object.keys(a.elements).forEach(function(b){var D=a.styles[b]||{},T=a.attributes[b]||{},F=a.elements[b];!o(F)||!f(F)||(Object.assign(F.style,D),Object.keys(T).forEach(function(W){var j=T[W];j===!1?F.removeAttribute(W):F.setAttribute(W,j===!0?"":j)}))})}function I(c){var a=c.state,b={popper:{position:a.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(a.elements.popper.style,b.popper),a.styles=b,a.elements.arrow&&Object.assign(a.elements.arrow.style,b.arrow),function(){Object.keys(a.elements).forEach(function(D){var T=a.elements[D],F=a.attributes[D]||{},W=Object.keys(a.styles.hasOwnProperty(D)?a.styles[D]:b[D]),j=W.reduce(function(q,oe){return q[oe]="",q},{});!o(T)||!f(T)||(Object.assign(T.style,j),Object.keys(F).forEach(function(q){T.removeAttribute(q)}))})}}var Y={name:"applyStyles",enabled:!0,phase:"write",fn:A,effect:I,requires:["computeStyles"]};function H(c,a,b){var D=ot(c),T=[Z,V].indexOf(D)>=0?-1:1,F=typeof b=="function"?b(Object.assign({},a,{placement:c})):b,W=F[0],j=F[1];return W=W||0,j=(j||0)*T,[Z,U].indexOf(D)>=0?{x:j,y:W}:{x:W,y:j}}function k(c){var a=c.state,b=c.options,D=c.name,T=b.offset,F=T===void 0?[0,0]:T,W=Ue.reduce(function(z,De){return z[De]=H(De,a.rects,F),z},{}),j=W[a.placement],q=j.x,oe=j.y;a.modifiersData.popperOffsets!=null&&(a.modifiersData.popperOffsets.x+=q,a.modifiersData.popperOffsets.y+=oe),a.modifiersData[D]=W}var be={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:k},le={left:"right",right:"left",bottom:"top",top:"bottom"};function pe(c){return c.replace(/left|right|bottom|top/g,function(a){return le[a]})}var ye={start:"end",end:"start"};function _e(c){return c.replace(/start|end/g,function(a){return ye[a]})}function je(c,a){a===void 0&&(a={});var b=a,D=b.placement,T=b.boundary,F=b.rootBoundary,W=b.padding,j=b.flipVariations,q=b.allowedAutoPlacements,oe=q===void 0?Ue:q,z=cn(D),De=z?j?Q:Q.filter(function(xe){return cn(xe)===z}):l,Le=De.filter(function(xe){return oe.indexOf(xe)>=0});Le.length===0&&(Le=De,console.error(["Popper: The `allowedAutoPlacements` option did not allow any","placements. Ensure the `placement` option matches the variation","of the allowed placements.",'For example, "auto" cannot be used to allow "bottom-start".','Use "auto-start" instead.'].join(" ")));var Ae=Le.reduce(function(xe,Me){return xe[Me]=qt(c,{placement:Me,boundary:T,rootBoundary:F,padding:W})[ot(Me)],xe},{});return Object.keys(Ae).sort(function(xe,Me){return Ae[xe]-Ae[Me]})}function Se(c){if(ot(c)===me)return[];var a=pe(c);return[_e(c),a,_e(a)]}function Ie(c){var a=c.state,b=c.options,D=c.name;if(!a.modifiersData[D]._skip){for(var T=b.mainAxis,F=T===void 0?!0:T,W=b.altAxis,j=W===void 0?!0:W,q=b.fallbackPlacements,oe=b.padding,z=b.boundary,De=b.rootBoundary,Le=b.altBoundary,Ae=b.flipVariations,xe=Ae===void 0?!0:Ae,Me=b.allowedAutoPlacements,Ee=a.options.placement,Be=ot(Ee),Re=Be===Ee,He=q||(Re||!xe?[pe(Ee)]:Se(Ee)),ce=[Ee].concat(He).reduce(function(te,ge){return te.concat(ot(ge)===me?je(a,{placement:ge,boundary:z,rootBoundary:De,padding:oe,flipVariations:xe,allowedAutoPlacements:Me}):ge)},[]),Pe=a.rects.reference,Te=a.rects.popper,Ne=new Map,Fe=!0,Ye=ce[0],$e=0;$e=0,dn=Lt?"width":"height",Zt=qt(a,{placement:Ve,boundary:z,rootBoundary:De,altBoundary:Le,padding:oe}),Nt=Lt?et?U:Z:et?de:V;Pe[dn]>Te[dn]&&(Nt=pe(Nt));var $n=pe(Nt),Qt=[];if(F&&Qt.push(Zt[wt]<=0),j&&Qt.push(Zt[Nt]<=0,Zt[$n]<=0),Qt.every(function(te){return te})){Ye=Ve,Fe=!1;break}Ne.set(Ve,Qt)}if(Fe)for(var Sn=xe?3:1,Wn=function(ge){var we=ce.find(function(Ke){var Je=Ne.get(Ke);if(Je)return Je.slice(0,ge).every(function(Dt){return Dt})});if(we)return Ye=we,"break"},C=Sn;C>0;C--){var G=Wn(C);if(G==="break")break}a.placement!==Ye&&(a.modifiersData[D]._skip=!0,a.placement=Ye,a.reset=!0)}}var re={name:"flip",enabled:!0,phase:"main",fn:Ie,requiresIfExists:["offset"],data:{_skip:!1}};function he(c){return c==="x"?"y":"x"}function ve(c,a,b){return gt(c,ln(a,b))}function ee(c){var a=c.state,b=c.options,D=c.name,T=b.mainAxis,F=T===void 0?!0:T,W=b.altAxis,j=W===void 0?!1:W,q=b.boundary,oe=b.rootBoundary,z=b.altBoundary,De=b.padding,Le=b.tether,Ae=Le===void 0?!0:Le,xe=b.tetherOffset,Me=xe===void 0?0:xe,Ee=qt(a,{boundary:q,rootBoundary:oe,padding:De,altBoundary:z}),Be=ot(a.placement),Re=cn(a.placement),He=!Re,ce=dt(Be),Pe=he(ce),Te=a.modifiersData.popperOffsets,Ne=a.rects.reference,Fe=a.rects.popper,Ye=typeof Me=="function"?Me(Object.assign({},a.rects,{placement:a.placement})):Me,$e={x:0,y:0};if(Te){if(F||j){var Ve=ce==="y"?V:Z,wt=ce==="y"?de:U,et=ce==="y"?"height":"width",Lt=Te[ce],dn=Te[ce]+Ee[Ve],Zt=Te[ce]-Ee[wt],Nt=Ae?-Fe[et]/2:0,$n=Re===p?Ne[et]:Fe[et],Qt=Re===p?-Fe[et]:-Ne[et],Sn=a.elements.arrow,Wn=Ae&&Sn?P(Sn):{width:0,height:0},C=a.modifiersData["arrow#persistent"]?a.modifiersData["arrow#persistent"].padding:cr(),G=C[Ve],te=C[wt],ge=ve(0,Ne[et],Wn[et]),we=He?Ne[et]/2-Nt-ge-G-Ye:$n-ge-G-Ye,Ke=He?-Ne[et]/2+Nt+ge+te+Ye:Qt+ge+te+Ye,Je=a.elements.arrow&&J(a.elements.arrow),Dt=Je?ce==="y"?Je.clientTop||0:Je.clientLeft||0:0,Vn=a.modifiersData.offset?a.modifiersData.offset[a.placement][ce]:0,Tt=Te[ce]+we-Vn-Dt,An=Te[ce]+Ke-Vn;if(F){var pn=ve(Ae?ln(dn,Tt):dn,Lt,Ae?gt(Zt,An):Zt);Te[ce]=pn,$e[ce]=pn-Lt}if(j){var en=ce==="x"?V:Z,Gr=ce==="x"?de:U,tn=Te[Pe],hn=tn+Ee[en],Ai=tn-Ee[Gr],Ci=ve(Ae?ln(hn,Tt):hn,tn,Ae?gt(Ai,An):Ai);Te[Pe]=Ci,$e[Pe]=Ci-tn}}a.modifiersData[D]=$e}}var ie={name:"preventOverflow",enabled:!0,phase:"main",fn:ee,requiresIfExists:["offset"]},x=function(a,b){return a=typeof a=="function"?a(Object.assign({},b.rects,{placement:b.placement})):a,fr(typeof a!="number"?a:ur(a,l))};function Ge(c){var a,b=c.state,D=c.name,T=c.options,F=b.elements.arrow,W=b.modifiersData.popperOffsets,j=ot(b.placement),q=dt(j),oe=[Z,U].indexOf(j)>=0,z=oe?"height":"width";if(!(!F||!W)){var De=x(T.padding,b),Le=P(F),Ae=q==="y"?V:Z,xe=q==="y"?de:U,Me=b.rects.reference[z]+b.rects.reference[q]-W[q]-b.rects.popper[z],Ee=W[q]-b.rects.reference[q],Be=J(F),Re=Be?q==="y"?Be.clientHeight||0:Be.clientWidth||0:0,He=Me/2-Ee/2,ce=De[Ae],Pe=Re-Le[z]-De[xe],Te=Re/2-Le[z]/2+He,Ne=ve(ce,Te,Pe),Fe=q;b.modifiersData[D]=(a={},a[Fe]=Ne,a.centerOffset=Ne-Te,a)}}function fe(c){var a=c.state,b=c.options,D=b.element,T=D===void 0?"[data-popper-arrow]":D;if(T!=null&&!(typeof T=="string"&&(T=a.elements.popper.querySelector(T),!T))){if(o(T)||console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).',"To use an SVG arrow, wrap it in an HTMLElement that will be used as","the arrow."].join(" ")),!kn(a.elements.popper,T)){console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper',"element."].join(" "));return}a.elements.arrow=T}}var Ft={name:"arrow",enabled:!0,phase:"main",fn:Ge,effect:fe,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function bt(c,a,b){return b===void 0&&(b={x:0,y:0}),{top:c.top-a.height-b.y,right:c.right-a.width+b.x,bottom:c.bottom-a.height+b.y,left:c.left-a.width-b.x}}function Gt(c){return[V,U,de,Z].some(function(a){return c[a]>=0})}function Kt(c){var a=c.state,b=c.name,D=a.rects.reference,T=a.rects.popper,F=a.modifiersData.preventOverflow,W=qt(a,{elementContext:"reference"}),j=qt(a,{altBoundary:!0}),q=bt(W,D),oe=bt(j,T,F),z=Gt(q),De=Gt(oe);a.modifiersData[b]={referenceClippingOffsets:q,popperEscapeOffsets:oe,isReferenceHidden:z,hasPopperEscaped:De},a.attributes.popper=Object.assign({},a.attributes.popper,{"data-popper-reference-hidden":z,"data-popper-escaped":De})}var Jt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Kt},rt=[jn,Bn,y,Y],lt=En({defaultModifiers:rt}),yt=[jn,Bn,y,Y,be,re,ie,Ft,Jt],un=En({defaultModifiers:yt});t.applyStyles=Y,t.arrow=Ft,t.computeStyles=y,t.createPopper=un,t.createPopperLite=lt,t.defaultModifiers=yt,t.detectOverflow=qt,t.eventListeners=jn,t.flip=re,t.hide=Jt,t.offset=be,t.popperGenerator=En,t.popperOffsets=Bn,t.preventOverflow=ie}),No=Fo(t=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var e=us(),r='',n="tippy-box",i="tippy-content",o="tippy-backdrop",s="tippy-arrow",h="tippy-svg-arrow",u={passive:!0,capture:!0};function f(g,y){return{}.hasOwnProperty.call(g,y)}function w(g,y,A){if(Array.isArray(g)){var I=g[y];return I??(Array.isArray(A)?A[y]:A)}return g}function m(g,y){var A={}.toString.call(g);return A.indexOf("[object")===0&&A.indexOf(y+"]")>-1}function E(g,y){return typeof g=="function"?g.apply(void 0,y):g}function O(g,y){if(y===0)return g;var A;return function(I){clearTimeout(A),A=setTimeout(function(){g(I)},y)}}function S(g,y){var A=Object.assign({},g);return y.forEach(function(I){delete A[I]}),A}function P(g){return g.split(/\s+/).filter(Boolean)}function R(g){return[].concat(g)}function $(g,y){g.indexOf(y)===-1&&g.push(y)}function B(g){return g.filter(function(y,A){return g.indexOf(y)===A})}function K(g){return g.split("-")[0]}function X(g){return[].slice.call(g)}function ne(g){return Object.keys(g).reduce(function(y,A){return g[A]!==void 0&&(y[A]=g[A]),y},{})}function J(){return document.createElement("div")}function V(g){return["Element","Fragment"].some(function(y){return m(g,y)})}function de(g){return m(g,"NodeList")}function U(g){return m(g,"MouseEvent")}function Z(g){return!!(g&&g._tippy&&g._tippy.reference===g)}function me(g){return V(g)?[g]:de(g)?X(g):Array.isArray(g)?g:X(document.querySelectorAll(g))}function l(g,y){g.forEach(function(A){A&&(A.style.transitionDuration=y+"ms")})}function p(g,y){g.forEach(function(A){A&&A.setAttribute("data-state",y)})}function v(g){var y,A=R(g),I=A[0];return!(I==null||(y=I.ownerDocument)==null)&&y.body?I.ownerDocument:document}function d(g,y){var A=y.clientX,I=y.clientY;return g.every(function(Y){var H=Y.popperRect,k=Y.popperState,be=Y.props,le=be.interactiveBorder,pe=K(k.placement),ye=k.modifiersData.offset;if(!ye)return!0;var _e=pe==="bottom"?ye.top.y:0,je=pe==="top"?ye.bottom.y:0,Se=pe==="right"?ye.left.x:0,Ie=pe==="left"?ye.right.x:0,re=H.top-I+_e>le,he=I-H.bottom-je>le,ve=H.left-A+Se>le,ee=A-H.right-Ie>le;return re||he||ve||ee})}function N(g,y,A){var I=y+"EventListener";["transitionend","webkitTransitionEnd"].forEach(function(Y){g[I](Y,A)})}var _={isTouch:!1},M=0;function Q(){_.isTouch||(_.isTouch=!0,window.performance&&document.addEventListener("mousemove",Ue))}function Ue(){var g=performance.now();g-M<20&&(_.isTouch=!1,document.removeEventListener("mousemove",Ue)),M=g}function Rt(){var g=document.activeElement;if(Z(g)){var y=g._tippy;g.blur&&!y.state.isVisible&&g.blur()}}function Vt(){document.addEventListener("touchstart",Q,u),window.addEventListener("blur",Rt)}var Lr=typeof window<"u"&&typeof document<"u",Nr=Lr?navigator.userAgent:"",kr=/MSIE |Trident\//.test(Nr);function zt(g){var y=g==="destroy"?"n already-":" ";return[g+"() was called on a"+y+"destroyed instance. This is a no-op but","indicates a potential memory leak."].join(" ")}function nr(g){var y=/[ \t]{2,}/g,A=/^[ \t]*/gm;return g.replace(y," ").replace(A,"").trim()}function jr(g){return nr(` +`,"We recommend using the popper element as a wrapper around an inner","element that can have any CSS property transitioned for animations."].join(" "));var z={placement:ot(s.placement),popper:s.elements.popper,popperRect:s.rects.popper,gpuAcceleration:P};s.modifiersData.popperOffsets!=null&&(s.styles.popper=Object.assign({},s.styles.popper,Hn(Object.assign({},z,{offsets:s.modifiersData.popperOffsets,position:s.options.strategy,adaptive:U,roundOffsets:G})))),s.modifiersData.arrow!=null&&(s.styles.arrow=Object.assign({},s.styles.arrow,Hn(Object.assign({},z,{offsets:s.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:G})))),s.attributes.popper=Object.assign({},s.attributes.popper,{"data-popper-placement":s.placement})}var w={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:g,data:{}};function C(u){var s=u.state;Object.keys(s.elements).forEach(function(b){var _=s.styles[b]||{},P=s.attributes[b]||{},k=s.elements[b];!o(k)||!d(k)||(Object.assign(k.style,_),Object.keys(P).forEach(function(U){var $=P[U];$===!1?k.removeAttribute(U):k.setAttribute(U,$===!0?"":$)}))})}function F(u){var s=u.state,b={popper:{position:s.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(s.elements.popper.style,b.popper),s.styles=b,s.elements.arrow&&Object.assign(s.elements.arrow.style,b.arrow),function(){Object.keys(s.elements).forEach(function(_){var P=s.elements[_],k=s.attributes[_]||{},U=Object.keys(s.styles.hasOwnProperty(_)?s.styles[_]:b[_]),$=U.reduce(function(G,oe){return G[oe]="",G},{});!o(P)||!d(P)||(Object.assign(P.style,$),Object.keys(k).forEach(function(G){P.removeAttribute(G)}))})}}var q={name:"applyStyles",enabled:!0,phase:"write",fn:C,effect:F,requires:["computeStyles"]};function W(u,s,b){var _=ot(u),P=[Q,V].indexOf(_)>=0?-1:1,k=typeof b=="function"?b(Object.assign({},s,{placement:u})):b,U=k[0],$=k[1];return U=U||0,$=($||0)*P,[Q,X].indexOf(_)>=0?{x:$,y:U}:{x:U,y:$}}function H(u){var s=u.state,b=u.options,_=u.name,P=b.offset,k=P===void 0?[0,0]:P,U=ze.reduce(function(z,De){return z[De]=W(De,s.rects,k),z},{}),$=U[s.placement],G=$.x,oe=$.y;s.modifiersData.popperOffsets!=null&&(s.modifiersData.popperOffsets.x+=G,s.modifiersData.popperOffsets.y+=oe),s.modifiersData[_]=U}var be={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:H},le={left:"right",right:"left",bottom:"top",top:"bottom"};function pe(u){return u.replace(/left|right|bottom|top/g,function(s){return le[s]})}var ye={start:"end",end:"start"};function Te(u){return u.replace(/start|end/g,function(s){return ye[s]})}function je(u,s){s===void 0&&(s={});var b=s,_=b.placement,P=b.boundary,k=b.rootBoundary,U=b.padding,$=b.flipVariations,G=b.allowedAutoPlacements,oe=G===void 0?ze:G,z=cn(_),De=z?$?Z:Z.filter(function(xe){return cn(xe)===z}):l,Fe=De.filter(function(xe){return oe.indexOf(xe)>=0});Fe.length===0&&(Fe=De,console.error(["Popper: The `allowedAutoPlacements` option did not allow any","placements. Ensure the `placement` option matches the variation","of the allowed placements.",'For example, "auto" cannot be used to allow "bottom-start".','Use "auto-start" instead.'].join(" ")));var Ce=Fe.reduce(function(xe,Me){return xe[Me]=qt(u,{placement:Me,boundary:P,rootBoundary:k,padding:U})[ot(Me)],xe},{});return Object.keys(Ce).sort(function(xe,Me){return Ce[xe]-Ce[Me]})}function Ae(u){if(ot(u)===me)return[];var s=pe(u);return[Te(u),s,Te(s)]}function Ie(u){var s=u.state,b=u.options,_=u.name;if(!s.modifiersData[_]._skip){for(var P=b.mainAxis,k=P===void 0?!0:P,U=b.altAxis,$=U===void 0?!0:U,G=b.fallbackPlacements,oe=b.padding,z=b.boundary,De=b.rootBoundary,Fe=b.altBoundary,Ce=b.flipVariations,xe=Ce===void 0?!0:Ce,Me=b.allowedAutoPlacements,Se=s.options.placement,Be=ot(Se),Re=Be===Se,He=G||(Re||!xe?[pe(Se)]:Ae(Se)),ce=[Se].concat(He).reduce(function(te,ge){return te.concat(ot(ge)===me?je(s,{placement:ge,boundary:z,rootBoundary:De,padding:oe,flipVariations:xe,allowedAutoPlacements:Me}):ge)},[]),Pe=s.rects.reference,_e=s.rects.popper,ke=new Map,Le=!0,Ye=ce[0],$e=0;$e=0,dn=Ft?"width":"height",Qt=qt(s,{placement:Ue,boundary:z,rootBoundary:De,altBoundary:Fe,padding:oe}),kt=Ft?et?X:Q:et?de:V;Pe[dn]>_e[dn]&&(kt=pe(kt));var $n=pe(kt),Zt=[];if(k&&Zt.push(Qt[wt]<=0),$&&Zt.push(Qt[kt]<=0,Qt[$n]<=0),Zt.every(function(te){return te})){Ye=Ue,Le=!1;break}ke.set(Ue,Zt)}if(Le)for(var Sn=xe?3:1,Wn=function(ge){var we=ce.find(function(Ke){var Je=ke.get(Ke);if(Je)return Je.slice(0,ge).every(function(Dt){return Dt})});if(we)return Ye=we,"break"},D=Sn;D>0;D--){var K=Wn(D);if(K==="break")break}s.placement!==Ye&&(s.modifiersData[_]._skip=!0,s.placement=Ye,s.reset=!0)}}var re={name:"flip",enabled:!0,phase:"main",fn:Ie,requiresIfExists:["offset"],data:{_skip:!1}};function he(u){return u==="x"?"y":"x"}function ve(u,s,b){return gt(u,ln(s,b))}function ee(u){var s=u.state,b=u.options,_=u.name,P=b.mainAxis,k=P===void 0?!0:P,U=b.altAxis,$=U===void 0?!1:U,G=b.boundary,oe=b.rootBoundary,z=b.altBoundary,De=b.padding,Fe=b.tether,Ce=Fe===void 0?!0:Fe,xe=b.tetherOffset,Me=xe===void 0?0:xe,Se=qt(s,{boundary:G,rootBoundary:oe,padding:De,altBoundary:z}),Be=ot(s.placement),Re=cn(s.placement),He=!Re,ce=dt(Be),Pe=he(ce),_e=s.modifiersData.popperOffsets,ke=s.rects.reference,Le=s.rects.popper,Ye=typeof Me=="function"?Me(Object.assign({},s.rects,{placement:s.placement})):Me,$e={x:0,y:0};if(_e){if(k||$){var Ue=ce==="y"?V:Q,wt=ce==="y"?de:X,et=ce==="y"?"height":"width",Ft=_e[ce],dn=_e[ce]+Se[Ue],Qt=_e[ce]-Se[wt],kt=Ce?-Le[et]/2:0,$n=Re===h?ke[et]:Le[et],Zt=Re===h?-Le[et]:-ke[et],Sn=s.elements.arrow,Wn=Ce&&Sn?R(Sn):{width:0,height:0},D=s.modifiersData["arrow#persistent"]?s.modifiersData["arrow#persistent"].padding:cr(),K=D[Ue],te=D[wt],ge=ve(0,ke[et],Wn[et]),we=He?ke[et]/2-kt-ge-K-Ye:$n-ge-K-Ye,Ke=He?-ke[et]/2+kt+ge+te+Ye:Zt+ge+te+Ye,Je=s.elements.arrow&&J(s.elements.arrow),Dt=Je?ce==="y"?Je.clientTop||0:Je.clientLeft||0:0,Un=s.modifiersData.offset?s.modifiersData.offset[s.placement][ce]:0,_t=_e[ce]+we-Un-Dt,An=_e[ce]+Ke-Un;if(k){var pn=ve(Ce?ln(dn,_t):dn,Ft,Ce?gt(Qt,An):Qt);_e[ce]=pn,$e[ce]=pn-Ft}if($){var en=ce==="x"?V:Q,Gr=ce==="x"?de:X,tn=_e[Pe],hn=tn+Se[en],Di=tn-Se[Gr],_i=ve(Ce?ln(hn,_t):hn,tn,Ce?gt(Di,An):Di);_e[Pe]=_i,$e[Pe]=_i-tn}}s.modifiersData[_]=$e}}var ie={name:"preventOverflow",enabled:!0,phase:"main",fn:ee,requiresIfExists:["offset"]},x=function(s,b){return s=typeof s=="function"?s(Object.assign({},b.rects,{placement:b.placement})):s,fr(typeof s!="number"?s:ur(s,l))};function Ge(u){var s,b=u.state,_=u.name,P=u.options,k=b.elements.arrow,U=b.modifiersData.popperOffsets,$=ot(b.placement),G=dt($),oe=[Q,X].indexOf($)>=0,z=oe?"height":"width";if(!(!k||!U)){var De=x(P.padding,b),Fe=R(k),Ce=G==="y"?V:Q,xe=G==="y"?de:X,Me=b.rects.reference[z]+b.rects.reference[G]-U[G]-b.rects.popper[z],Se=U[G]-b.rects.reference[G],Be=J(k),Re=Be?G==="y"?Be.clientHeight||0:Be.clientWidth||0:0,He=Me/2-Se/2,ce=De[Ce],Pe=Re-Fe[z]-De[xe],_e=Re/2-Fe[z]/2+He,ke=ve(ce,_e,Pe),Le=G;b.modifiersData[_]=(s={},s[Le]=ke,s.centerOffset=ke-_e,s)}}function fe(u){var s=u.state,b=u.options,_=b.element,P=_===void 0?"[data-popper-arrow]":_;if(P!=null&&!(typeof P=="string"&&(P=s.elements.popper.querySelector(P),!P))){if(o(P)||console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).',"To use an SVG arrow, wrap it in an HTMLElement that will be used as","the arrow."].join(" ")),!Nn(s.elements.popper,P)){console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper',"element."].join(" "));return}s.elements.arrow=P}}var Lt={name:"arrow",enabled:!0,phase:"main",fn:Ge,effect:fe,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function bt(u,s,b){return b===void 0&&(b={x:0,y:0}),{top:u.top-s.height-b.y,right:u.right-s.width+b.x,bottom:u.bottom-s.height+b.y,left:u.left-s.width-b.x}}function Gt(u){return[V,X,de,Q].some(function(s){return u[s]>=0})}function Kt(u){var s=u.state,b=u.name,_=s.rects.reference,P=s.rects.popper,k=s.modifiersData.preventOverflow,U=qt(s,{elementContext:"reference"}),$=qt(s,{altBoundary:!0}),G=bt(U,_),oe=bt($,P,k),z=Gt(G),De=Gt(oe);s.modifiersData[b]={referenceClippingOffsets:G,popperEscapeOffsets:oe,isReferenceHidden:z,hasPopperEscaped:De},s.attributes.popper=Object.assign({},s.attributes.popper,{"data-popper-reference-hidden":z,"data-popper-escaped":De})}var Jt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Kt},rt=[jn,Bn,w,q],lt=En({defaultModifiers:rt}),yt=[jn,Bn,w,q,be,re,ie,Lt,Jt],un=En({defaultModifiers:yt});e.applyStyles=q,e.arrow=Lt,e.computeStyles=w,e.createPopper=un,e.createPopperLite=lt,e.defaultModifiers=yt,e.detectOverflow=qt,e.eventListeners=jn,e.flip=re,e.hide=Jt,e.offset=be,e.popperGenerator=En,e.popperOffsets=Bn,e.preventOverflow=ie}),$o=Bo(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});var t=_s(),r='',n="tippy-box",i="tippy-content",o="tippy-backdrop",a="tippy-arrow",c="tippy-svg-arrow",f={passive:!0,capture:!0};function d(g,w){return{}.hasOwnProperty.call(g,w)}function y(g,w,C){if(Array.isArray(g)){var F=g[w];return F??(Array.isArray(C)?C[w]:C)}return g}function m(g,w){var C={}.toString.call(g);return C.indexOf("[object")===0&&C.indexOf(w+"]")>-1}function O(g,w){return typeof g=="function"?g.apply(void 0,w):g}function E(g,w){if(w===0)return g;var C;return function(F){clearTimeout(C),C=setTimeout(function(){g(F)},w)}}function S(g,w){var C=Object.assign({},g);return w.forEach(function(F){delete C[F]}),C}function R(g){return g.split(/\s+/).filter(Boolean)}function T(g){return[].concat(g)}function j(g,w){g.indexOf(w)===-1&&g.push(w)}function A(g){return g.filter(function(w,C){return g.indexOf(w)===C})}function L(g){return g.split("-")[0]}function Y(g){return[].slice.call(g)}function ne(g){return Object.keys(g).reduce(function(w,C){return g[C]!==void 0&&(w[C]=g[C]),w},{})}function J(){return document.createElement("div")}function V(g){return["Element","Fragment"].some(function(w){return m(g,w)})}function de(g){return m(g,"NodeList")}function X(g){return m(g,"MouseEvent")}function Q(g){return!!(g&&g._tippy&&g._tippy.reference===g)}function me(g){return V(g)?[g]:de(g)?Y(g):Array.isArray(g)?g:Y(document.querySelectorAll(g))}function l(g,w){g.forEach(function(C){C&&(C.style.transitionDuration=w+"ms")})}function h(g,w){g.forEach(function(C){C&&C.setAttribute("data-state",w)})}function v(g){var w,C=T(g),F=C[0];return!(F==null||(w=F.ownerDocument)==null)&&w.body?F.ownerDocument:document}function p(g,w){var C=w.clientX,F=w.clientY;return g.every(function(q){var W=q.popperRect,H=q.popperState,be=q.props,le=be.interactiveBorder,pe=L(H.placement),ye=H.modifiersData.offset;if(!ye)return!0;var Te=pe==="bottom"?ye.top.y:0,je=pe==="top"?ye.bottom.y:0,Ae=pe==="right"?ye.left.x:0,Ie=pe==="left"?ye.right.x:0,re=W.top-F+Te>le,he=F-W.bottom-je>le,ve=W.left-C+Ae>le,ee=C-W.right-Ie>le;return re||he||ve||ee})}function B(g,w,C){var F=w+"EventListener";["transitionend","webkitTransitionEnd"].forEach(function(q){g[F](q,C)})}var M={isTouch:!1},I=0;function Z(){M.isTouch||(M.isTouch=!0,window.performance&&document.addEventListener("mousemove",ze))}function ze(){var g=performance.now();g-I<20&&(M.isTouch=!1,document.removeEventListener("mousemove",ze)),I=g}function Rt(){var g=document.activeElement;if(Q(g)){var w=g._tippy;g.blur&&!w.state.isVisible&&g.blur()}}function Ut(){document.addEventListener("touchstart",Z,f),window.addEventListener("blur",Rt)}var Fr=typeof window<"u"&&typeof document<"u",kr=Fr?navigator.userAgent:"",Nr=/MSIE |Trident\//.test(kr);function Vt(g){var w=g==="destroy"?"n already-":" ";return[g+"() was called on a"+w+"destroyed instance. This is a no-op but","indicates a potential memory leak."].join(" ")}function nr(g){var w=/[ \t]{2,}/g,C=/^[ \t]*/gm;return g.replace(w," ").replace(C,"").trim()}function jr(g){return nr(` %ctippy.js %c`+nr(g)+` %c\u{1F477}\u200D This is a development-only message. It will be removed in production. - `)}function rr(g){return[jr(g),"color: #00C584; font-size: 1.3em; font-weight: bold;","line-height: 1.5","color: #a6a095;"]}var It;Br();function Br(){It=new Set}function mt(g,y){if(g&&!It.has(y)){var A;It.add(y),(A=console).warn.apply(A,rr(y))}}function Ut(g,y){if(g&&!It.has(y)){var A;It.add(y),(A=console).error.apply(A,rr(y))}}function At(g){var y=!g,A=Object.prototype.toString.call(g)==="[object Object]"&&!g.addEventListener;Ut(y,["tippy() was passed","`"+String(g)+"`","as its targets (first) argument. Valid types are: String, Element,","Element[], or NodeList."].join(" ")),Ut(A,["tippy() was passed a plain object which is not supported as an argument","for virtual positioning. Use props.getReferenceClientRect instead."].join(" "))}var Ct={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},Hr={allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999},Qe=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},Ct,{},Hr),$r=Object.keys(Qe),Wr=function(y){gt(y,[]);var A=Object.keys(y);A.forEach(function(I){Qe[I]=y[I]})};function ot(g){var y=g.plugins||[],A=y.reduce(function(I,Y){var H=Y.name,k=Y.defaultValue;return H&&(I[H]=g[H]!==void 0?g[H]:k),I},{});return Object.assign({},g,{},A)}function Vr(g,y){var A=y?Object.keys(ot(Object.assign({},Qe,{plugins:y}))):$r,I=A.reduce(function(Y,H){var k=(g.getAttribute("data-tippy-"+H)||"").trim();if(!k)return Y;if(H==="content")Y[H]=k;else try{Y[H]=JSON.parse(k)}catch{Y[H]=k}return Y},{});return I}function ir(g,y){var A=Object.assign({},y,{content:E(y.content,[g])},y.ignoreAttributes?{}:Vr(g,y.plugins));return A.aria=Object.assign({},Qe.aria,{},A.aria),A.aria={expanded:A.aria.expanded==="auto"?y.interactive:A.aria.expanded,content:A.aria.content==="auto"?y.interactive?null:"describedby":A.aria.content},A}function gt(g,y){g===void 0&&(g={}),y===void 0&&(y=[]);var A=Object.keys(g);A.forEach(function(I){var Y=S(Qe,Object.keys(Ct)),H=!f(Y,I);H&&(H=y.filter(function(k){return k.name===I}).length===0),mt(H,["`"+I+"`","is not a valid prop. You may have spelled it incorrectly, or if it's","a plugin, forgot to pass it in an array as props.plugins.",` + `)}function rr(g){return[jr(g),"color: #00C584; font-size: 1.3em; font-weight: bold;","line-height: 1.5","color: #a6a095;"]}var It;Br();function Br(){It=new Set}function mt(g,w){if(g&&!It.has(w)){var C;It.add(w),(C=console).warn.apply(C,rr(w))}}function zt(g,w){if(g&&!It.has(w)){var C;It.add(w),(C=console).error.apply(C,rr(w))}}function At(g){var w=!g,C=Object.prototype.toString.call(g)==="[object Object]"&&!g.addEventListener;zt(w,["tippy() was passed","`"+String(g)+"`","as its targets (first) argument. Valid types are: String, Element,","Element[], or NodeList."].join(" ")),zt(C,["tippy() was passed a plain object which is not supported as an argument","for virtual positioning. Use props.getReferenceClientRect instead."].join(" "))}var Ct={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},Hr={allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999},Ze=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},Ct,{},Hr),$r=Object.keys(Ze),Wr=function(w){gt(w,[]);var C=Object.keys(w);C.forEach(function(F){Ze[F]=w[F]})};function ot(g){var w=g.plugins||[],C=w.reduce(function(F,q){var W=q.name,H=q.defaultValue;return W&&(F[W]=g[W]!==void 0?g[W]:H),F},{});return Object.assign({},g,{},C)}function Ur(g,w){var C=w?Object.keys(ot(Object.assign({},Ze,{plugins:w}))):$r,F=C.reduce(function(q,W){var H=(g.getAttribute("data-tippy-"+W)||"").trim();if(!H)return q;if(W==="content")q[W]=H;else try{q[W]=JSON.parse(H)}catch{q[W]=H}return q},{});return F}function ir(g,w){var C=Object.assign({},w,{content:O(w.content,[g])},w.ignoreAttributes?{}:Ur(g,w.plugins));return C.aria=Object.assign({},Ze.aria,{},C.aria),C.aria={expanded:C.aria.expanded==="auto"?w.interactive:C.aria.expanded,content:C.aria.content==="auto"?w.interactive?null:"describedby":C.aria.content},C}function gt(g,w){g===void 0&&(g={}),w===void 0&&(w=[]);var C=Object.keys(g);C.forEach(function(F){var q=S(Ze,Object.keys(Ct)),W=!d(q,F);W&&(W=w.filter(function(H){return H.name===F}).length===0),mt(W,["`"+F+"`","is not a valid prop. You may have spelled it incorrectly, or if it's","a plugin, forgot to pass it in an array as props.plugins.",` `,`All props: https://atomiks.github.io/tippyjs/v6/all-props/ -`,"Plugins: https://atomiks.github.io/tippyjs/v6/plugins/"].join(" "))})}var ln=function(){return"innerHTML"};function Yt(g,y){g[ln()]=y}function or(g){var y=J();return g===!0?y.className=s:(y.className=h,V(g)?y.appendChild(g):Yt(y,g)),y}function kn(g,y){V(y.content)?(Yt(g,""),g.appendChild(y.content)):typeof y.content!="function"&&(y.allowHTML?Yt(g,y.content):g.textContent=y.content)}function Xt(g){var y=g.firstElementChild,A=X(y.children);return{box:y,content:A.find(function(I){return I.classList.contains(i)}),arrow:A.find(function(I){return I.classList.contains(s)||I.classList.contains(h)}),backdrop:A.find(function(I){return I.classList.contains(o)})}}function ar(g){var y=J(),A=J();A.className=n,A.setAttribute("data-state","hidden"),A.setAttribute("tabindex","-1");var I=J();I.className=i,I.setAttribute("data-state","hidden"),kn(I,g.props),y.appendChild(A),A.appendChild(I),Y(g.props,g.props);function Y(H,k){var be=Xt(y),le=be.box,pe=be.content,ye=be.arrow;k.theme?le.setAttribute("data-theme",k.theme):le.removeAttribute("data-theme"),typeof k.animation=="string"?le.setAttribute("data-animation",k.animation):le.removeAttribute("data-animation"),k.inertia?le.setAttribute("data-inertia",""):le.removeAttribute("data-inertia"),le.style.maxWidth=typeof k.maxWidth=="number"?k.maxWidth+"px":k.maxWidth,k.role?le.setAttribute("role",k.role):le.removeAttribute("role"),(H.content!==k.content||H.allowHTML!==k.allowHTML)&&kn(pe,g.props),k.arrow?ye?H.arrow!==k.arrow&&(le.removeChild(ye),le.appendChild(or(k.arrow))):le.appendChild(or(k.arrow)):ye&&le.removeChild(ye)}return{popper:y,onUpdate:Y}}ar.$$tippy=!0;var sr=1,yn=[],wn=[];function cn(g,y){var A=ir(g,Object.assign({},Qe,{},ot(ne(y)))),I,Y,H,k=!1,be=!1,le=!1,pe=!1,ye,_e,je,Se=[],Ie=O(Re,A.interactiveDebounce),re,he=sr++,ve=null,ee=B(A.plugins),ie={isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},x={id:he,reference:g,popper:J(),popperInstance:ve,props:A,state:ie,plugins:ee,clearDelayTimeouts:Lt,setProps:dn,setContent:Zt,show:Nt,hide:$n,hideWithInteractivity:Qt,enable:wt,disable:et,unmount:Sn,destroy:Wn};if(!A.render)return Ut(!0,"render() function has not been supplied."),x;var Ge=A.render(x),fe=Ge.popper,Ft=Ge.onUpdate;fe.setAttribute("data-tippy-root",""),fe.id="tippy-"+x.id,x.popper=fe,g._tippy=x,fe._tippy=x;var bt=ee.map(function(C){return C.fn(x)}),Gt=g.hasAttribute("aria-expanded");return Me(),T(),a(),b("onCreate",[x]),A.showOnCreate&&$e(),fe.addEventListener("mouseenter",function(){x.props.interactive&&x.state.isVisible&&x.clearDelayTimeouts()}),fe.addEventListener("mouseleave",function(C){x.props.interactive&&x.props.trigger.indexOf("mouseenter")>=0&&(yt().addEventListener("mousemove",Ie),Ie(C))}),x;function Kt(){var C=x.props.touch;return Array.isArray(C)?C:[C,0]}function Jt(){return Kt()[0]==="hold"}function rt(){var C;return!!((C=x.props.render)!=null&&C.$$tippy)}function lt(){return re||g}function yt(){var C=lt().parentNode;return C?v(C):document}function un(){return Xt(fe)}function c(C){return x.state.isMounted&&!x.state.isVisible||_.isTouch||ye&&ye.type==="focus"?0:w(x.props.delay,C?0:1,Qe.delay)}function a(){fe.style.pointerEvents=x.props.interactive&&x.state.isVisible?"":"none",fe.style.zIndex=""+x.props.zIndex}function b(C,G,te){if(te===void 0&&(te=!0),bt.forEach(function(we){we[C]&&we[C].apply(void 0,G)}),te){var ge;(ge=x.props)[C].apply(ge,G)}}function D(){var C=x.props.aria;if(C.content){var G="aria-"+C.content,te=fe.id,ge=R(x.props.triggerTarget||g);ge.forEach(function(we){var Ke=we.getAttribute(G);if(x.state.isVisible)we.setAttribute(G,Ke?Ke+" "+te:te);else{var Je=Ke&&Ke.replace(te,"").trim();Je?we.setAttribute(G,Je):we.removeAttribute(G)}})}}function T(){if(!(Gt||!x.props.aria.expanded)){var C=R(x.props.triggerTarget||g);C.forEach(function(G){x.props.interactive?G.setAttribute("aria-expanded",x.state.isVisible&&G===lt()?"true":"false"):G.removeAttribute("aria-expanded")})}}function F(){yt().removeEventListener("mousemove",Ie),yn=yn.filter(function(C){return C!==Ie})}function W(C){if(!(_.isTouch&&(le||C.type==="mousedown"))&&!(x.props.interactive&&fe.contains(C.target))){if(lt().contains(C.target)){if(_.isTouch||x.state.isVisible&&x.props.trigger.indexOf("click")>=0)return}else b("onClickOutside",[x,C]);x.props.hideOnClick===!0&&(x.clearDelayTimeouts(),x.hide(),be=!0,setTimeout(function(){be=!1}),x.state.isMounted||z())}}function j(){le=!0}function q(){le=!1}function oe(){var C=yt();C.addEventListener("mousedown",W,!0),C.addEventListener("touchend",W,u),C.addEventListener("touchstart",q,u),C.addEventListener("touchmove",j,u)}function z(){var C=yt();C.removeEventListener("mousedown",W,!0),C.removeEventListener("touchend",W,u),C.removeEventListener("touchstart",q,u),C.removeEventListener("touchmove",j,u)}function De(C,G){Ae(C,function(){!x.state.isVisible&&fe.parentNode&&fe.parentNode.contains(fe)&&G()})}function Le(C,G){Ae(C,G)}function Ae(C,G){var te=un().box;function ge(we){we.target===te&&(N(te,"remove",ge),G())}if(C===0)return G();N(te,"remove",_e),N(te,"add",ge),_e=ge}function xe(C,G,te){te===void 0&&(te=!1);var ge=R(x.props.triggerTarget||g);ge.forEach(function(we){we.addEventListener(C,G,te),Se.push({node:we,eventType:C,handler:G,options:te})})}function Me(){Jt()&&(xe("touchstart",Be,{passive:!0}),xe("touchend",He,{passive:!0})),P(x.props.trigger).forEach(function(C){if(C!=="manual")switch(xe(C,Be),C){case"mouseenter":xe("mouseleave",He);break;case"focus":xe(kr?"focusout":"blur",ce);break;case"focusin":xe("focusout",ce);break}})}function Ee(){Se.forEach(function(C){var G=C.node,te=C.eventType,ge=C.handler,we=C.options;G.removeEventListener(te,ge,we)}),Se=[]}function Be(C){var G,te=!1;if(!(!x.state.isEnabled||Pe(C)||be)){var ge=((G=ye)==null?void 0:G.type)==="focus";ye=C,re=C.currentTarget,T(),!x.state.isVisible&&U(C)&&yn.forEach(function(we){return we(C)}),C.type==="click"&&(x.props.trigger.indexOf("mouseenter")<0||k)&&x.props.hideOnClick!==!1&&x.state.isVisible?te=!0:$e(C),C.type==="click"&&(k=!te),te&&!ge&&Ve(C)}}function Re(C){var G=C.target,te=lt().contains(G)||fe.contains(G);if(!(C.type==="mousemove"&&te)){var ge=Ye().concat(fe).map(function(we){var Ke,Je=we._tippy,Dt=(Ke=Je.popperInstance)==null?void 0:Ke.state;return Dt?{popperRect:we.getBoundingClientRect(),popperState:Dt,props:A}:null}).filter(Boolean);d(ge,C)&&(F(),Ve(C))}}function He(C){var G=Pe(C)||x.props.trigger.indexOf("click")>=0&&k;if(!G){if(x.props.interactive){x.hideWithInteractivity(C);return}Ve(C)}}function ce(C){x.props.trigger.indexOf("focusin")<0&&C.target!==lt()||x.props.interactive&&C.relatedTarget&&fe.contains(C.relatedTarget)||Ve(C)}function Pe(C){return _.isTouch?Jt()!==C.type.indexOf("touch")>=0:!1}function Te(){Ne();var C=x.props,G=C.popperOptions,te=C.placement,ge=C.offset,we=C.getReferenceClientRect,Ke=C.moveTransition,Je=rt()?Xt(fe).arrow:null,Dt=we?{getBoundingClientRect:we,contextElement:we.contextElement||lt()}:g,Vn={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(pn){var en=pn.state;if(rt()){var Gr=un(),tn=Gr.box;["placement","reference-hidden","escaped"].forEach(function(hn){hn==="placement"?tn.setAttribute("data-placement",en.placement):en.attributes.popper["data-popper-"+hn]?tn.setAttribute("data-"+hn,""):tn.removeAttribute("data-"+hn)}),en.attributes.popper={}}}},Tt=[{name:"offset",options:{offset:ge}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!Ke}},Vn];rt()&&Je&&Tt.push({name:"arrow",options:{element:Je,padding:3}}),Tt.push.apply(Tt,G?.modifiers||[]),x.popperInstance=e.createPopper(Dt,fe,Object.assign({},G,{placement:te,onFirstUpdate:je,modifiers:Tt}))}function Ne(){x.popperInstance&&(x.popperInstance.destroy(),x.popperInstance=null)}function Fe(){var C=x.props.appendTo,G,te=lt();x.props.interactive&&C===Qe.appendTo||C==="parent"?G=te.parentNode:G=E(C,[te]),G.contains(fe)||G.appendChild(fe),Te(),mt(x.props.interactive&&C===Qe.appendTo&&te.nextElementSibling!==fe,["Interactive tippy element may not be accessible via keyboard","navigation because it is not directly after the reference element","in the DOM source order.",` +`,"Plugins: https://atomiks.github.io/tippyjs/v6/plugins/"].join(" "))})}var ln=function(){return"innerHTML"};function Yt(g,w){g[ln()]=w}function or(g){var w=J();return g===!0?w.className=a:(w.className=c,V(g)?w.appendChild(g):Yt(w,g)),w}function Nn(g,w){V(w.content)?(Yt(g,""),g.appendChild(w.content)):typeof w.content!="function"&&(w.allowHTML?Yt(g,w.content):g.textContent=w.content)}function Xt(g){var w=g.firstElementChild,C=Y(w.children);return{box:w,content:C.find(function(F){return F.classList.contains(i)}),arrow:C.find(function(F){return F.classList.contains(a)||F.classList.contains(c)}),backdrop:C.find(function(F){return F.classList.contains(o)})}}function ar(g){var w=J(),C=J();C.className=n,C.setAttribute("data-state","hidden"),C.setAttribute("tabindex","-1");var F=J();F.className=i,F.setAttribute("data-state","hidden"),Nn(F,g.props),w.appendChild(C),C.appendChild(F),q(g.props,g.props);function q(W,H){var be=Xt(w),le=be.box,pe=be.content,ye=be.arrow;H.theme?le.setAttribute("data-theme",H.theme):le.removeAttribute("data-theme"),typeof H.animation=="string"?le.setAttribute("data-animation",H.animation):le.removeAttribute("data-animation"),H.inertia?le.setAttribute("data-inertia",""):le.removeAttribute("data-inertia"),le.style.maxWidth=typeof H.maxWidth=="number"?H.maxWidth+"px":H.maxWidth,H.role?le.setAttribute("role",H.role):le.removeAttribute("role"),(W.content!==H.content||W.allowHTML!==H.allowHTML)&&Nn(pe,g.props),H.arrow?ye?W.arrow!==H.arrow&&(le.removeChild(ye),le.appendChild(or(H.arrow))):le.appendChild(or(H.arrow)):ye&&le.removeChild(ye)}return{popper:w,onUpdate:q}}ar.$$tippy=!0;var sr=1,yn=[],wn=[];function cn(g,w){var C=ir(g,Object.assign({},Ze,{},ot(ne(w)))),F,q,W,H=!1,be=!1,le=!1,pe=!1,ye,Te,je,Ae=[],Ie=E(Re,C.interactiveDebounce),re,he=sr++,ve=null,ee=A(C.plugins),ie={isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},x={id:he,reference:g,popper:J(),popperInstance:ve,props:C,state:ie,plugins:ee,clearDelayTimeouts:Ft,setProps:dn,setContent:Qt,show:kt,hide:$n,hideWithInteractivity:Zt,enable:wt,disable:et,unmount:Sn,destroy:Wn};if(!C.render)return zt(!0,"render() function has not been supplied."),x;var Ge=C.render(x),fe=Ge.popper,Lt=Ge.onUpdate;fe.setAttribute("data-tippy-root",""),fe.id="tippy-"+x.id,x.popper=fe,g._tippy=x,fe._tippy=x;var bt=ee.map(function(D){return D.fn(x)}),Gt=g.hasAttribute("aria-expanded");return Me(),P(),s(),b("onCreate",[x]),C.showOnCreate&&$e(),fe.addEventListener("mouseenter",function(){x.props.interactive&&x.state.isVisible&&x.clearDelayTimeouts()}),fe.addEventListener("mouseleave",function(D){x.props.interactive&&x.props.trigger.indexOf("mouseenter")>=0&&(yt().addEventListener("mousemove",Ie),Ie(D))}),x;function Kt(){var D=x.props.touch;return Array.isArray(D)?D:[D,0]}function Jt(){return Kt()[0]==="hold"}function rt(){var D;return!!((D=x.props.render)!=null&&D.$$tippy)}function lt(){return re||g}function yt(){var D=lt().parentNode;return D?v(D):document}function un(){return Xt(fe)}function u(D){return x.state.isMounted&&!x.state.isVisible||M.isTouch||ye&&ye.type==="focus"?0:y(x.props.delay,D?0:1,Ze.delay)}function s(){fe.style.pointerEvents=x.props.interactive&&x.state.isVisible?"":"none",fe.style.zIndex=""+x.props.zIndex}function b(D,K,te){if(te===void 0&&(te=!0),bt.forEach(function(we){we[D]&&we[D].apply(void 0,K)}),te){var ge;(ge=x.props)[D].apply(ge,K)}}function _(){var D=x.props.aria;if(D.content){var K="aria-"+D.content,te=fe.id,ge=T(x.props.triggerTarget||g);ge.forEach(function(we){var Ke=we.getAttribute(K);if(x.state.isVisible)we.setAttribute(K,Ke?Ke+" "+te:te);else{var Je=Ke&&Ke.replace(te,"").trim();Je?we.setAttribute(K,Je):we.removeAttribute(K)}})}}function P(){if(!(Gt||!x.props.aria.expanded)){var D=T(x.props.triggerTarget||g);D.forEach(function(K){x.props.interactive?K.setAttribute("aria-expanded",x.state.isVisible&&K===lt()?"true":"false"):K.removeAttribute("aria-expanded")})}}function k(){yt().removeEventListener("mousemove",Ie),yn=yn.filter(function(D){return D!==Ie})}function U(D){if(!(M.isTouch&&(le||D.type==="mousedown"))&&!(x.props.interactive&&fe.contains(D.target))){if(lt().contains(D.target)){if(M.isTouch||x.state.isVisible&&x.props.trigger.indexOf("click")>=0)return}else b("onClickOutside",[x,D]);x.props.hideOnClick===!0&&(x.clearDelayTimeouts(),x.hide(),be=!0,setTimeout(function(){be=!1}),x.state.isMounted||z())}}function $(){le=!0}function G(){le=!1}function oe(){var D=yt();D.addEventListener("mousedown",U,!0),D.addEventListener("touchend",U,f),D.addEventListener("touchstart",G,f),D.addEventListener("touchmove",$,f)}function z(){var D=yt();D.removeEventListener("mousedown",U,!0),D.removeEventListener("touchend",U,f),D.removeEventListener("touchstart",G,f),D.removeEventListener("touchmove",$,f)}function De(D,K){Ce(D,function(){!x.state.isVisible&&fe.parentNode&&fe.parentNode.contains(fe)&&K()})}function Fe(D,K){Ce(D,K)}function Ce(D,K){var te=un().box;function ge(we){we.target===te&&(B(te,"remove",ge),K())}if(D===0)return K();B(te,"remove",Te),B(te,"add",ge),Te=ge}function xe(D,K,te){te===void 0&&(te=!1);var ge=T(x.props.triggerTarget||g);ge.forEach(function(we){we.addEventListener(D,K,te),Ae.push({node:we,eventType:D,handler:K,options:te})})}function Me(){Jt()&&(xe("touchstart",Be,{passive:!0}),xe("touchend",He,{passive:!0})),R(x.props.trigger).forEach(function(D){if(D!=="manual")switch(xe(D,Be),D){case"mouseenter":xe("mouseleave",He);break;case"focus":xe(Nr?"focusout":"blur",ce);break;case"focusin":xe("focusout",ce);break}})}function Se(){Ae.forEach(function(D){var K=D.node,te=D.eventType,ge=D.handler,we=D.options;K.removeEventListener(te,ge,we)}),Ae=[]}function Be(D){var K,te=!1;if(!(!x.state.isEnabled||Pe(D)||be)){var ge=((K=ye)==null?void 0:K.type)==="focus";ye=D,re=D.currentTarget,P(),!x.state.isVisible&&X(D)&&yn.forEach(function(we){return we(D)}),D.type==="click"&&(x.props.trigger.indexOf("mouseenter")<0||H)&&x.props.hideOnClick!==!1&&x.state.isVisible?te=!0:$e(D),D.type==="click"&&(H=!te),te&&!ge&&Ue(D)}}function Re(D){var K=D.target,te=lt().contains(K)||fe.contains(K);if(!(D.type==="mousemove"&&te)){var ge=Ye().concat(fe).map(function(we){var Ke,Je=we._tippy,Dt=(Ke=Je.popperInstance)==null?void 0:Ke.state;return Dt?{popperRect:we.getBoundingClientRect(),popperState:Dt,props:C}:null}).filter(Boolean);p(ge,D)&&(k(),Ue(D))}}function He(D){var K=Pe(D)||x.props.trigger.indexOf("click")>=0&&H;if(!K){if(x.props.interactive){x.hideWithInteractivity(D);return}Ue(D)}}function ce(D){x.props.trigger.indexOf("focusin")<0&&D.target!==lt()||x.props.interactive&&D.relatedTarget&&fe.contains(D.relatedTarget)||Ue(D)}function Pe(D){return M.isTouch?Jt()!==D.type.indexOf("touch")>=0:!1}function _e(){ke();var D=x.props,K=D.popperOptions,te=D.placement,ge=D.offset,we=D.getReferenceClientRect,Ke=D.moveTransition,Je=rt()?Xt(fe).arrow:null,Dt=we?{getBoundingClientRect:we,contextElement:we.contextElement||lt()}:g,Un={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(pn){var en=pn.state;if(rt()){var Gr=un(),tn=Gr.box;["placement","reference-hidden","escaped"].forEach(function(hn){hn==="placement"?tn.setAttribute("data-placement",en.placement):en.attributes.popper["data-popper-"+hn]?tn.setAttribute("data-"+hn,""):tn.removeAttribute("data-"+hn)}),en.attributes.popper={}}}},_t=[{name:"offset",options:{offset:ge}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!Ke}},Un];rt()&&Je&&_t.push({name:"arrow",options:{element:Je,padding:3}}),_t.push.apply(_t,K?.modifiers||[]),x.popperInstance=t.createPopper(Dt,fe,Object.assign({},K,{placement:te,onFirstUpdate:je,modifiers:_t}))}function ke(){x.popperInstance&&(x.popperInstance.destroy(),x.popperInstance=null)}function Le(){var D=x.props.appendTo,K,te=lt();x.props.interactive&&D===Ze.appendTo||D==="parent"?K=te.parentNode:K=O(D,[te]),K.contains(fe)||K.appendChild(fe),_e(),mt(x.props.interactive&&D===Ze.appendTo&&te.nextElementSibling!==fe,["Interactive tippy element may not be accessible via keyboard","navigation because it is not directly after the reference element","in the DOM source order.",` `,"Using a wrapper
or tag around the reference element","solves this by creating a new parentNode context.",` `,"Specifying `appendTo: document.body` silences this warning, but it","assumes you are using a focus management solution to handle","keyboard navigation.",` -`,"See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity"].join(" "))}function Ye(){return X(fe.querySelectorAll("[data-tippy-root]"))}function $e(C){x.clearDelayTimeouts(),C&&b("onTrigger",[x,C]),oe();var G=c(!0),te=Kt(),ge=te[0],we=te[1];_.isTouch&&ge==="hold"&&we&&(G=we),G?I=setTimeout(function(){x.show()},G):x.show()}function Ve(C){if(x.clearDelayTimeouts(),b("onUntrigger",[x,C]),!x.state.isVisible){z();return}if(!(x.props.trigger.indexOf("mouseenter")>=0&&x.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(C.type)>=0&&k)){var G=c(!1);G?Y=setTimeout(function(){x.state.isVisible&&x.hide()},G):H=requestAnimationFrame(function(){x.hide()})}}function wt(){x.state.isEnabled=!0}function et(){x.hide(),x.state.isEnabled=!1}function Lt(){clearTimeout(I),clearTimeout(Y),cancelAnimationFrame(H)}function dn(C){if(mt(x.state.isDestroyed,zt("setProps")),!x.state.isDestroyed){b("onBeforeUpdate",[x,C]),Ee();var G=x.props,te=ir(g,Object.assign({},x.props,{},C,{ignoreAttributes:!0}));x.props=te,Me(),G.interactiveDebounce!==te.interactiveDebounce&&(F(),Ie=O(Re,te.interactiveDebounce)),G.triggerTarget&&!te.triggerTarget?R(G.triggerTarget).forEach(function(ge){ge.removeAttribute("aria-expanded")}):te.triggerTarget&&g.removeAttribute("aria-expanded"),T(),a(),Ft&&Ft(G,te),x.popperInstance&&(Te(),Ye().forEach(function(ge){requestAnimationFrame(ge._tippy.popperInstance.forceUpdate)})),b("onAfterUpdate",[x,C])}}function Zt(C){x.setProps({content:C})}function Nt(){mt(x.state.isDestroyed,zt("show"));var C=x.state.isVisible,G=x.state.isDestroyed,te=!x.state.isEnabled,ge=_.isTouch&&!x.props.touch,we=w(x.props.duration,0,Qe.duration);if(!(C||G||te||ge)&&!lt().hasAttribute("disabled")&&(b("onShow",[x],!1),x.props.onShow(x)!==!1)){if(x.state.isVisible=!0,rt()&&(fe.style.visibility="visible"),a(),oe(),x.state.isMounted||(fe.style.transition="none"),rt()){var Ke=un(),Je=Ke.box,Dt=Ke.content;l([Je,Dt],0)}je=function(){var Tt;if(!(!x.state.isVisible||pe)){if(pe=!0,fe.offsetHeight,fe.style.transition=x.props.moveTransition,rt()&&x.props.animation){var An=un(),pn=An.box,en=An.content;l([pn,en],we),p([pn,en],"visible")}D(),T(),$(wn,x),(Tt=x.popperInstance)==null||Tt.forceUpdate(),x.state.isMounted=!0,b("onMount",[x]),x.props.animation&&rt()&&Le(we,function(){x.state.isShown=!0,b("onShown",[x])})}},Fe()}}function $n(){mt(x.state.isDestroyed,zt("hide"));var C=!x.state.isVisible,G=x.state.isDestroyed,te=!x.state.isEnabled,ge=w(x.props.duration,1,Qe.duration);if(!(C||G||te)&&(b("onHide",[x],!1),x.props.onHide(x)!==!1)){if(x.state.isVisible=!1,x.state.isShown=!1,pe=!1,k=!1,rt()&&(fe.style.visibility="hidden"),F(),z(),a(),rt()){var we=un(),Ke=we.box,Je=we.content;x.props.animation&&(l([Ke,Je],ge),p([Ke,Je],"hidden"))}D(),T(),x.props.animation?rt()&&De(ge,x.unmount):x.unmount()}}function Qt(C){mt(x.state.isDestroyed,zt("hideWithInteractivity")),yt().addEventListener("mousemove",Ie),$(yn,Ie),Ie(C)}function Sn(){mt(x.state.isDestroyed,zt("unmount")),x.state.isVisible&&x.hide(),x.state.isMounted&&(Ne(),Ye().forEach(function(C){C._tippy.unmount()}),fe.parentNode&&fe.parentNode.removeChild(fe),wn=wn.filter(function(C){return C!==x}),x.state.isMounted=!1,b("onHidden",[x]))}function Wn(){mt(x.state.isDestroyed,zt("destroy")),!x.state.isDestroyed&&(x.clearDelayTimeouts(),x.unmount(),Ee(),delete g._tippy,x.state.isDestroyed=!0,b("onDestroy",[x]))}}function dt(g,y){y===void 0&&(y={});var A=Qe.plugins.concat(y.plugins||[]);At(g),gt(y,A),Vt();var I=Object.assign({},y,{plugins:A}),Y=me(g),H=V(I.content),k=Y.length>1;mt(H&&k,["tippy() was passed an Element as the `content` prop, but more than","one tippy instance was created by this invocation. This means the","content element will only be appended to the last tippy instance.",` +`,"See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity"].join(" "))}function Ye(){return Y(fe.querySelectorAll("[data-tippy-root]"))}function $e(D){x.clearDelayTimeouts(),D&&b("onTrigger",[x,D]),oe();var K=u(!0),te=Kt(),ge=te[0],we=te[1];M.isTouch&&ge==="hold"&&we&&(K=we),K?F=setTimeout(function(){x.show()},K):x.show()}function Ue(D){if(x.clearDelayTimeouts(),b("onUntrigger",[x,D]),!x.state.isVisible){z();return}if(!(x.props.trigger.indexOf("mouseenter")>=0&&x.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(D.type)>=0&&H)){var K=u(!1);K?q=setTimeout(function(){x.state.isVisible&&x.hide()},K):W=requestAnimationFrame(function(){x.hide()})}}function wt(){x.state.isEnabled=!0}function et(){x.hide(),x.state.isEnabled=!1}function Ft(){clearTimeout(F),clearTimeout(q),cancelAnimationFrame(W)}function dn(D){if(mt(x.state.isDestroyed,Vt("setProps")),!x.state.isDestroyed){b("onBeforeUpdate",[x,D]),Se();var K=x.props,te=ir(g,Object.assign({},x.props,{},D,{ignoreAttributes:!0}));x.props=te,Me(),K.interactiveDebounce!==te.interactiveDebounce&&(k(),Ie=E(Re,te.interactiveDebounce)),K.triggerTarget&&!te.triggerTarget?T(K.triggerTarget).forEach(function(ge){ge.removeAttribute("aria-expanded")}):te.triggerTarget&&g.removeAttribute("aria-expanded"),P(),s(),Lt&&Lt(K,te),x.popperInstance&&(_e(),Ye().forEach(function(ge){requestAnimationFrame(ge._tippy.popperInstance.forceUpdate)})),b("onAfterUpdate",[x,D])}}function Qt(D){x.setProps({content:D})}function kt(){mt(x.state.isDestroyed,Vt("show"));var D=x.state.isVisible,K=x.state.isDestroyed,te=!x.state.isEnabled,ge=M.isTouch&&!x.props.touch,we=y(x.props.duration,0,Ze.duration);if(!(D||K||te||ge)&&!lt().hasAttribute("disabled")&&(b("onShow",[x],!1),x.props.onShow(x)!==!1)){if(x.state.isVisible=!0,rt()&&(fe.style.visibility="visible"),s(),oe(),x.state.isMounted||(fe.style.transition="none"),rt()){var Ke=un(),Je=Ke.box,Dt=Ke.content;l([Je,Dt],0)}je=function(){var _t;if(!(!x.state.isVisible||pe)){if(pe=!0,fe.offsetHeight,fe.style.transition=x.props.moveTransition,rt()&&x.props.animation){var An=un(),pn=An.box,en=An.content;l([pn,en],we),h([pn,en],"visible")}_(),P(),j(wn,x),(_t=x.popperInstance)==null||_t.forceUpdate(),x.state.isMounted=!0,b("onMount",[x]),x.props.animation&&rt()&&Fe(we,function(){x.state.isShown=!0,b("onShown",[x])})}},Le()}}function $n(){mt(x.state.isDestroyed,Vt("hide"));var D=!x.state.isVisible,K=x.state.isDestroyed,te=!x.state.isEnabled,ge=y(x.props.duration,1,Ze.duration);if(!(D||K||te)&&(b("onHide",[x],!1),x.props.onHide(x)!==!1)){if(x.state.isVisible=!1,x.state.isShown=!1,pe=!1,H=!1,rt()&&(fe.style.visibility="hidden"),k(),z(),s(),rt()){var we=un(),Ke=we.box,Je=we.content;x.props.animation&&(l([Ke,Je],ge),h([Ke,Je],"hidden"))}_(),P(),x.props.animation?rt()&&De(ge,x.unmount):x.unmount()}}function Zt(D){mt(x.state.isDestroyed,Vt("hideWithInteractivity")),yt().addEventListener("mousemove",Ie),j(yn,Ie),Ie(D)}function Sn(){mt(x.state.isDestroyed,Vt("unmount")),x.state.isVisible&&x.hide(),x.state.isMounted&&(ke(),Ye().forEach(function(D){D._tippy.unmount()}),fe.parentNode&&fe.parentNode.removeChild(fe),wn=wn.filter(function(D){return D!==x}),x.state.isMounted=!1,b("onHidden",[x]))}function Wn(){mt(x.state.isDestroyed,Vt("destroy")),!x.state.isDestroyed&&(x.clearDelayTimeouts(),x.unmount(),Se(),delete g._tippy,x.state.isDestroyed=!0,b("onDestroy",[x]))}}function dt(g,w){w===void 0&&(w={});var C=Ze.plugins.concat(w.plugins||[]);At(g),gt(w,C),Ut();var F=Object.assign({},w,{plugins:C}),q=me(g),W=V(F.content),H=q.length>1;mt(W&&H,["tippy() was passed an Element as the `content` prop, but more than","one tippy instance was created by this invocation. This means the","content element will only be appended to the last tippy instance.",` `,"Instead, pass the .innerHTML of the element, or use a function that","returns a cloned version of the element instead.",` `,`1) content: element.innerHTML -`,"2) content: () => element.cloneNode(true)"].join(" "));var be=Y.reduce(function(le,pe){var ye=pe&&cn(pe,I);return ye&&le.push(ye),le},[]);return V(g)?be[0]:be}dt.defaultProps=Qe,dt.setDefaultProps=Wr,dt.currentInput=_;var lr=function(y){var A=y===void 0?{}:y,I=A.exclude,Y=A.duration;wn.forEach(function(H){var k=!1;if(I&&(k=Z(I)?H.reference===I:H.popper===I.popper),!k){var be=H.props.duration;H.setProps({duration:Y}),H.hide(),H.state.isDestroyed||H.setProps({duration:be})}})},cr=Object.assign({},e.applyStyles,{effect:function(y){var A=y.state,I={popper:{position:A.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(A.elements.popper.style,I.popper),A.styles=I,A.elements.arrow&&Object.assign(A.elements.arrow.style,I.arrow)}}),fr=function(y,A){var I;A===void 0&&(A={}),Ut(!Array.isArray(y),["The first argument passed to createSingleton() must be an array of","tippy instances. The passed value was",String(y)].join(" "));var Y=y,H=[],k,be=A.overrides,le=[],pe=!1;function ye(){H=Y.map(function(ee){return ee.reference})}function _e(ee){Y.forEach(function(ie){ee?ie.enable():ie.disable()})}function je(ee){return Y.map(function(ie){var x=ie.setProps;return ie.setProps=function(Ge){x(Ge),ie.reference===k&&ee.setProps(Ge)},function(){ie.setProps=x}})}function Se(ee,ie){var x=H.indexOf(ie);if(ie!==k){k=ie;var Ge=(be||[]).concat("content").reduce(function(fe,Ft){return fe[Ft]=Y[x].props[Ft],fe},{});ee.setProps(Object.assign({},Ge,{getReferenceClientRect:typeof Ge.getReferenceClientRect=="function"?Ge.getReferenceClientRect:function(){return ie.getBoundingClientRect()}}))}}_e(!1),ye();var Ie={fn:function(){return{onDestroy:function(){_e(!0)},onHidden:function(){k=null},onClickOutside:function(x){x.props.showOnCreate&&!pe&&(pe=!0,k=null)},onShow:function(x){x.props.showOnCreate&&!pe&&(pe=!0,Se(x,H[0]))},onTrigger:function(x,Ge){Se(x,Ge.currentTarget)}}}},re=dt(J(),Object.assign({},S(A,["overrides"]),{plugins:[Ie].concat(A.plugins||[]),triggerTarget:H,popperOptions:Object.assign({},A.popperOptions,{modifiers:[].concat(((I=A.popperOptions)==null?void 0:I.modifiers)||[],[cr])})})),he=re.show;re.show=function(ee){if(he(),!k&&ee==null)return Se(re,H[0]);if(!(k&&ee==null)){if(typeof ee=="number")return H[ee]&&Se(re,H[ee]);if(Y.includes(ee)){var ie=ee.reference;return Se(re,ie)}if(H.includes(ee))return Se(re,ee)}},re.showNext=function(){var ee=H[0];if(!k)return re.show(0);var ie=H.indexOf(k);re.show(H[ie+1]||ee)},re.showPrevious=function(){var ee=H[H.length-1];if(!k)return re.show(ee);var ie=H.indexOf(k),x=H[ie-1]||ee;re.show(x)};var ve=re.setProps;return re.setProps=function(ee){be=ee.overrides||be,ve(ee)},re.setInstances=function(ee){_e(!0),le.forEach(function(ie){return ie()}),Y=ee,_e(!1),ye(),je(re),re.setProps({triggerTarget:H})},le=je(re),re},ur={mouseover:"mouseenter",focusin:"focus",click:"click"};function qt(g,y){Ut(!(y&&y.target),["You must specity a `target` prop indicating a CSS selector string matching","the target elements that should receive a tippy."].join(" "));var A=[],I=[],Y=!1,H=y.target,k=S(y,["target"]),be=Object.assign({},k,{trigger:"manual",touch:!1}),le=Object.assign({},k,{showOnCreate:!0}),pe=dt(g,be),ye=R(pe);function _e(he){if(!(!he.target||Y)){var ve=he.target.closest(H);if(ve){var ee=ve.getAttribute("data-tippy-trigger")||y.trigger||Qe.trigger;if(!ve._tippy&&!(he.type==="touchstart"&&typeof le.touch=="boolean")&&!(he.type!=="touchstart"&&ee.indexOf(ur[he.type])<0)){var ie=dt(ve,le);ie&&(I=I.concat(ie))}}}}function je(he,ve,ee,ie){ie===void 0&&(ie=!1),he.addEventListener(ve,ee,ie),A.push({node:he,eventType:ve,handler:ee,options:ie})}function Se(he){var ve=he.reference;je(ve,"touchstart",_e,u),je(ve,"mouseover",_e),je(ve,"focusin",_e),je(ve,"click",_e)}function Ie(){A.forEach(function(he){var ve=he.node,ee=he.eventType,ie=he.handler,x=he.options;ve.removeEventListener(ee,ie,x)}),A=[]}function re(he){var ve=he.destroy,ee=he.enable,ie=he.disable;he.destroy=function(x){x===void 0&&(x=!0),x&&I.forEach(function(Ge){Ge.destroy()}),I=[],Ie(),ve()},he.enable=function(){ee(),I.forEach(function(x){return x.enable()}),Y=!1},he.disable=function(){ie(),I.forEach(function(x){return x.disable()}),Y=!0},Se(he)}return ye.forEach(re),pe}var dr={name:"animateFill",defaultValue:!1,fn:function(y){var A;if(!((A=y.props.render)!=null&&A.$$tippy))return Ut(y.props.animateFill,"The `animateFill` plugin requires the default render function."),{};var I=Xt(y.popper),Y=I.box,H=I.content,k=y.props.animateFill?zr():null;return{onCreate:function(){k&&(Y.insertBefore(k,Y.firstElementChild),Y.setAttribute("data-animatefill",""),Y.style.overflow="hidden",y.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(k){var le=Y.style.transitionDuration,pe=Number(le.replace("ms",""));H.style.transitionDelay=Math.round(pe/10)+"ms",k.style.transitionDuration=le,p([k],"visible")}},onShow:function(){k&&(k.style.transitionDuration="0ms")},onHide:function(){k&&p([k],"hidden")}}}};function zr(){var g=J();return g.className=o,p([g],"hidden"),g}var xn={clientX:0,clientY:0},fn=[];function En(g){var y=g.clientX,A=g.clientY;xn={clientX:y,clientY:A}}function On(g){g.addEventListener("mousemove",En)}function Ur(g){g.removeEventListener("mousemove",En)}var jn={name:"followCursor",defaultValue:!1,fn:function(y){var A=y.reference,I=v(y.props.triggerTarget||A),Y=!1,H=!1,k=!0,be=y.props;function le(){return y.props.followCursor==="initial"&&y.state.isVisible}function pe(){I.addEventListener("mousemove",je)}function ye(){I.removeEventListener("mousemove",je)}function _e(){Y=!0,y.setProps({getReferenceClientRect:null}),Y=!1}function je(re){var he=re.target?A.contains(re.target):!0,ve=y.props.followCursor,ee=re.clientX,ie=re.clientY,x=A.getBoundingClientRect(),Ge=ee-x.left,fe=ie-x.top;(he||!y.props.interactive)&&y.setProps({getReferenceClientRect:function(){var bt=A.getBoundingClientRect(),Gt=ee,Kt=ie;ve==="initial"&&(Gt=bt.left+Ge,Kt=bt.top+fe);var Jt=ve==="horizontal"?bt.top:Kt,rt=ve==="vertical"?bt.right:Gt,lt=ve==="horizontal"?bt.bottom:Kt,yt=ve==="vertical"?bt.left:Gt;return{width:rt-yt,height:lt-Jt,top:Jt,right:rt,bottom:lt,left:yt}}})}function Se(){y.props.followCursor&&(fn.push({instance:y,doc:I}),On(I))}function Ie(){fn=fn.filter(function(re){return re.instance!==y}),fn.filter(function(re){return re.doc===I}).length===0&&Ur(I)}return{onCreate:Se,onDestroy:Ie,onBeforeUpdate:function(){be=y.props},onAfterUpdate:function(he,ve){var ee=ve.followCursor;Y||ee!==void 0&&be.followCursor!==ee&&(Ie(),ee?(Se(),y.state.isMounted&&!H&&!le()&&pe()):(ye(),_e()))},onMount:function(){y.props.followCursor&&!H&&(k&&(je(xn),k=!1),le()||pe())},onTrigger:function(he,ve){U(ve)&&(xn={clientX:ve.clientX,clientY:ve.clientY}),H=ve.type==="focus"},onHidden:function(){y.props.followCursor&&(_e(),ye(),k=!0)}}}};function Yr(g,y){var A;return{popperOptions:Object.assign({},g.popperOptions,{modifiers:[].concat((((A=g.popperOptions)==null?void 0:A.modifiers)||[]).filter(function(I){var Y=I.name;return Y!==y.name}),[y])})}}var Bn={name:"inlinePositioning",defaultValue:!1,fn:function(y){var A=y.reference;function I(){return!!y.props.inlinePositioning}var Y,H=-1,k=!1,be={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(je){var Se=je.state;I()&&(Y!==Se.placement&&y.setProps({getReferenceClientRect:function(){return le(Se.placement)}}),Y=Se.placement)}};function le(_e){return Xr(K(_e),A.getBoundingClientRect(),X(A.getClientRects()),H)}function pe(_e){k=!0,y.setProps(_e),k=!1}function ye(){k||pe(Yr(y.props,be))}return{onCreate:ye,onAfterUpdate:ye,onTrigger:function(je,Se){if(U(Se)){var Ie=X(y.reference.getClientRects()),re=Ie.find(function(he){return he.left-2<=Se.clientX&&he.right+2>=Se.clientX&&he.top-2<=Se.clientY&&he.bottom+2>=Se.clientY});H=Ie.indexOf(re)}},onUntrigger:function(){H=-1}}}};function Xr(g,y,A,I){if(A.length<2||g===null)return y;if(A.length===2&&I>=0&&A[0].left>A[1].right)return A[I]||y;switch(g){case"top":case"bottom":{var Y=A[0],H=A[A.length-1],k=g==="top",be=Y.top,le=H.bottom,pe=k?Y.left:H.left,ye=k?Y.right:H.right,_e=ye-pe,je=le-be;return{top:be,bottom:le,left:pe,right:ye,width:_e,height:je}}case"left":case"right":{var Se=Math.min.apply(Math,A.map(function(fe){return fe.left})),Ie=Math.max.apply(Math,A.map(function(fe){return fe.right})),re=A.filter(function(fe){return g==="left"?fe.left===Se:fe.right===Ie}),he=re[0].top,ve=re[re.length-1].bottom,ee=Se,ie=Ie,x=ie-ee,Ge=ve-he;return{top:he,bottom:ve,left:ee,right:ie,width:x,height:Ge}}default:return y}}var qr={name:"sticky",defaultValue:!1,fn:function(y){var A=y.reference,I=y.popper;function Y(){return y.popperInstance?y.popperInstance.state.elements.reference:A}function H(pe){return y.props.sticky===!0||y.props.sticky===pe}var k=null,be=null;function le(){var pe=H("reference")?Y().getBoundingClientRect():null,ye=H("popper")?I.getBoundingClientRect():null;(pe&&Hn(k,pe)||ye&&Hn(be,ye))&&y.popperInstance&&y.popperInstance.update(),k=pe,be=ye,y.state.isMounted&&requestAnimationFrame(le)}return{onMount:function(){y.props.sticky&&le()}}}};function Hn(g,y){return g&&y?g.top!==y.top||g.right!==y.right||g.bottom!==y.bottom||g.left!==y.left:!0}dt.setDefaultProps({render:ar}),t.animateFill=dr,t.createSingleton=fr,t.default=dt,t.delegate=qt,t.followCursor=jn,t.hideAll=lr,t.inlinePositioning=Bn,t.roundArrow=r,t.sticky=qr}),Ei=Lo(No()),ds=Lo(No()),ps=t=>{let e={plugins:[]},r=i=>t[t.indexOf(i)+1];if(t.includes("animation")&&(e.animation=r("animation")),t.includes("duration")&&(e.duration=parseInt(r("duration"))),t.includes("delay")){let i=r("delay");e.delay=i.includes("-")?i.split("-").map(o=>parseInt(o)):parseInt(i)}if(t.includes("cursor")){e.plugins.push(ds.followCursor);let i=r("cursor");["x","initial"].includes(i)?e.followCursor=i==="x"?"horizontal":"initial":e.followCursor=!0}t.includes("on")&&(e.trigger=r("on")),t.includes("arrowless")&&(e.arrow=!1),t.includes("html")&&(e.allowHTML=!0),t.includes("interactive")&&(e.interactive=!0),t.includes("border")&&e.interactive&&(e.interactiveBorder=parseInt(r("border"))),t.includes("debounce")&&e.interactive&&(e.interactiveDebounce=parseInt(r("debounce"))),t.includes("max-width")&&(e.maxWidth=parseInt(r("max-width"))),t.includes("theme")&&(e.theme=r("theme")),t.includes("placement")&&(e.placement=r("placement"));let n={};return t.includes("no-flip")&&(n.modifiers||(n.modifiers=[]),n.modifiers.push({name:"flip",enabled:!1})),e.popperOptions=n,e};function Oi(t){t.magic("tooltip",e=>(r,n={})=>{let i=n.timeout;delete n.timeout;let o=(0,Ei.default)(e,{content:r,trigger:"manual",...n});o.show(),setTimeout(()=>{o.hide(),setTimeout(()=>o.destroy(),n.duration||300)},i||2e3)}),t.directive("tooltip",(e,{modifiers:r,expression:n},{evaluateLater:i,effect:o,cleanup:s})=>{let h=r.length>0?ps(r):{};e.__x_tippy||(e.__x_tippy=(0,Ei.default)(e,h)),s(()=>{e.__x_tippy&&(e.__x_tippy.destroy(),delete e.__x_tippy)});let u=()=>e.__x_tippy.enable(),f=()=>e.__x_tippy.disable(),w=m=>{m?(u(),e.__x_tippy.setContent(m)):f()};if(r.includes("raw"))w(n);else{let m=i(n);o(()=>{m(E=>{typeof E=="object"?(e.__x_tippy.setProps(E),u()):w(E)})})}})}Oi.defaultProps=t=>(Ei.default.setDefaultProps(t),Oi);var hs=Oi,ko=hs;document.addEventListener("alpine:init",()=>{window.Alpine.plugin(ro),window.Alpine.plugin(io),window.Alpine.plugin(Io),window.Alpine.plugin(ko)});var vs=function(t,e,r){function n(w,m){for(let E of w){let O=i(E,m);if(O!==null)return O}}function i(w,m){let E=w.match(/^[\{\[]([^\[\]\{\}]*)[\}\]](.*)/s);if(E===null||E.length!==3)return null;let O=E[1],S=E[2];if(O.includes(",")){let[P,R]=O.split(",",2);if(R==="*"&&m>=P)return S;if(P==="*"&&m<=R)return S;if(m>=P&&m<=R)return S}return O==m?S:null}function o(w){return w.toString().charAt(0).toUpperCase()+w.toString().slice(1)}function s(w,m){if(m.length===0)return w;let E={};for(let[O,S]of Object.entries(m))E[":"+o(O??"")]=o(S??""),E[":"+O.toUpperCase()]=S.toString().toUpperCase(),E[":"+O]=S;return Object.entries(E).forEach(([O,S])=>{w=w.replaceAll(O,S)}),w}function h(w){return w.map(m=>m.replace(/^[\{\[]([^\[\]\{\}]*)[\}\]]/,""))}let u=t.split("|"),f=n(u,e);return f!=null?s(f.trim(),r):(u=h(u),s(u.length>1&&e>1?u[1]:u[0],r))};window.jsMd5=jo.md5;window.pluralize=vs;})(); +`,"2) content: () => element.cloneNode(true)"].join(" "));var be=q.reduce(function(le,pe){var ye=pe&&cn(pe,F);return ye&&le.push(ye),le},[]);return V(g)?be[0]:be}dt.defaultProps=Ze,dt.setDefaultProps=Wr,dt.currentInput=M;var lr=function(w){var C=w===void 0?{}:w,F=C.exclude,q=C.duration;wn.forEach(function(W){var H=!1;if(F&&(H=Q(F)?W.reference===F:W.popper===F.popper),!H){var be=W.props.duration;W.setProps({duration:q}),W.hide(),W.state.isDestroyed||W.setProps({duration:be})}})},cr=Object.assign({},t.applyStyles,{effect:function(w){var C=w.state,F={popper:{position:C.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(C.elements.popper.style,F.popper),C.styles=F,C.elements.arrow&&Object.assign(C.elements.arrow.style,F.arrow)}}),fr=function(w,C){var F;C===void 0&&(C={}),zt(!Array.isArray(w),["The first argument passed to createSingleton() must be an array of","tippy instances. The passed value was",String(w)].join(" "));var q=w,W=[],H,be=C.overrides,le=[],pe=!1;function ye(){W=q.map(function(ee){return ee.reference})}function Te(ee){q.forEach(function(ie){ee?ie.enable():ie.disable()})}function je(ee){return q.map(function(ie){var x=ie.setProps;return ie.setProps=function(Ge){x(Ge),ie.reference===H&&ee.setProps(Ge)},function(){ie.setProps=x}})}function Ae(ee,ie){var x=W.indexOf(ie);if(ie!==H){H=ie;var Ge=(be||[]).concat("content").reduce(function(fe,Lt){return fe[Lt]=q[x].props[Lt],fe},{});ee.setProps(Object.assign({},Ge,{getReferenceClientRect:typeof Ge.getReferenceClientRect=="function"?Ge.getReferenceClientRect:function(){return ie.getBoundingClientRect()}}))}}Te(!1),ye();var Ie={fn:function(){return{onDestroy:function(){Te(!0)},onHidden:function(){H=null},onClickOutside:function(x){x.props.showOnCreate&&!pe&&(pe=!0,H=null)},onShow:function(x){x.props.showOnCreate&&!pe&&(pe=!0,Ae(x,W[0]))},onTrigger:function(x,Ge){Ae(x,Ge.currentTarget)}}}},re=dt(J(),Object.assign({},S(C,["overrides"]),{plugins:[Ie].concat(C.plugins||[]),triggerTarget:W,popperOptions:Object.assign({},C.popperOptions,{modifiers:[].concat(((F=C.popperOptions)==null?void 0:F.modifiers)||[],[cr])})})),he=re.show;re.show=function(ee){if(he(),!H&&ee==null)return Ae(re,W[0]);if(!(H&&ee==null)){if(typeof ee=="number")return W[ee]&&Ae(re,W[ee]);if(q.includes(ee)){var ie=ee.reference;return Ae(re,ie)}if(W.includes(ee))return Ae(re,ee)}},re.showNext=function(){var ee=W[0];if(!H)return re.show(0);var ie=W.indexOf(H);re.show(W[ie+1]||ee)},re.showPrevious=function(){var ee=W[W.length-1];if(!H)return re.show(ee);var ie=W.indexOf(H),x=W[ie-1]||ee;re.show(x)};var ve=re.setProps;return re.setProps=function(ee){be=ee.overrides||be,ve(ee)},re.setInstances=function(ee){Te(!0),le.forEach(function(ie){return ie()}),q=ee,Te(!1),ye(),je(re),re.setProps({triggerTarget:W})},le=je(re),re},ur={mouseover:"mouseenter",focusin:"focus",click:"click"};function qt(g,w){zt(!(w&&w.target),["You must specity a `target` prop indicating a CSS selector string matching","the target elements that should receive a tippy."].join(" "));var C=[],F=[],q=!1,W=w.target,H=S(w,["target"]),be=Object.assign({},H,{trigger:"manual",touch:!1}),le=Object.assign({},H,{showOnCreate:!0}),pe=dt(g,be),ye=T(pe);function Te(he){if(!(!he.target||q)){var ve=he.target.closest(W);if(ve){var ee=ve.getAttribute("data-tippy-trigger")||w.trigger||Ze.trigger;if(!ve._tippy&&!(he.type==="touchstart"&&typeof le.touch=="boolean")&&!(he.type!=="touchstart"&&ee.indexOf(ur[he.type])<0)){var ie=dt(ve,le);ie&&(F=F.concat(ie))}}}}function je(he,ve,ee,ie){ie===void 0&&(ie=!1),he.addEventListener(ve,ee,ie),C.push({node:he,eventType:ve,handler:ee,options:ie})}function Ae(he){var ve=he.reference;je(ve,"touchstart",Te,f),je(ve,"mouseover",Te),je(ve,"focusin",Te),je(ve,"click",Te)}function Ie(){C.forEach(function(he){var ve=he.node,ee=he.eventType,ie=he.handler,x=he.options;ve.removeEventListener(ee,ie,x)}),C=[]}function re(he){var ve=he.destroy,ee=he.enable,ie=he.disable;he.destroy=function(x){x===void 0&&(x=!0),x&&F.forEach(function(Ge){Ge.destroy()}),F=[],Ie(),ve()},he.enable=function(){ee(),F.forEach(function(x){return x.enable()}),q=!1},he.disable=function(){ie(),F.forEach(function(x){return x.disable()}),q=!0},Ae(he)}return ye.forEach(re),pe}var dr={name:"animateFill",defaultValue:!1,fn:function(w){var C;if(!((C=w.props.render)!=null&&C.$$tippy))return zt(w.props.animateFill,"The `animateFill` plugin requires the default render function."),{};var F=Xt(w.popper),q=F.box,W=F.content,H=w.props.animateFill?Vr():null;return{onCreate:function(){H&&(q.insertBefore(H,q.firstElementChild),q.setAttribute("data-animatefill",""),q.style.overflow="hidden",w.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(H){var le=q.style.transitionDuration,pe=Number(le.replace("ms",""));W.style.transitionDelay=Math.round(pe/10)+"ms",H.style.transitionDuration=le,h([H],"visible")}},onShow:function(){H&&(H.style.transitionDuration="0ms")},onHide:function(){H&&h([H],"hidden")}}}};function Vr(){var g=J();return g.className=o,h([g],"hidden"),g}var xn={clientX:0,clientY:0},fn=[];function En(g){var w=g.clientX,C=g.clientY;xn={clientX:w,clientY:C}}function On(g){g.addEventListener("mousemove",En)}function zr(g){g.removeEventListener("mousemove",En)}var jn={name:"followCursor",defaultValue:!1,fn:function(w){var C=w.reference,F=v(w.props.triggerTarget||C),q=!1,W=!1,H=!0,be=w.props;function le(){return w.props.followCursor==="initial"&&w.state.isVisible}function pe(){F.addEventListener("mousemove",je)}function ye(){F.removeEventListener("mousemove",je)}function Te(){q=!0,w.setProps({getReferenceClientRect:null}),q=!1}function je(re){var he=re.target?C.contains(re.target):!0,ve=w.props.followCursor,ee=re.clientX,ie=re.clientY,x=C.getBoundingClientRect(),Ge=ee-x.left,fe=ie-x.top;(he||!w.props.interactive)&&w.setProps({getReferenceClientRect:function(){var bt=C.getBoundingClientRect(),Gt=ee,Kt=ie;ve==="initial"&&(Gt=bt.left+Ge,Kt=bt.top+fe);var Jt=ve==="horizontal"?bt.top:Kt,rt=ve==="vertical"?bt.right:Gt,lt=ve==="horizontal"?bt.bottom:Kt,yt=ve==="vertical"?bt.left:Gt;return{width:rt-yt,height:lt-Jt,top:Jt,right:rt,bottom:lt,left:yt}}})}function Ae(){w.props.followCursor&&(fn.push({instance:w,doc:F}),On(F))}function Ie(){fn=fn.filter(function(re){return re.instance!==w}),fn.filter(function(re){return re.doc===F}).length===0&&zr(F)}return{onCreate:Ae,onDestroy:Ie,onBeforeUpdate:function(){be=w.props},onAfterUpdate:function(he,ve){var ee=ve.followCursor;q||ee!==void 0&&be.followCursor!==ee&&(Ie(),ee?(Ae(),w.state.isMounted&&!W&&!le()&&pe()):(ye(),Te()))},onMount:function(){w.props.followCursor&&!W&&(H&&(je(xn),H=!1),le()||pe())},onTrigger:function(he,ve){X(ve)&&(xn={clientX:ve.clientX,clientY:ve.clientY}),W=ve.type==="focus"},onHidden:function(){w.props.followCursor&&(Te(),ye(),H=!0)}}}};function Yr(g,w){var C;return{popperOptions:Object.assign({},g.popperOptions,{modifiers:[].concat((((C=g.popperOptions)==null?void 0:C.modifiers)||[]).filter(function(F){var q=F.name;return q!==w.name}),[w])})}}var Bn={name:"inlinePositioning",defaultValue:!1,fn:function(w){var C=w.reference;function F(){return!!w.props.inlinePositioning}var q,W=-1,H=!1,be={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(je){var Ae=je.state;F()&&(q!==Ae.placement&&w.setProps({getReferenceClientRect:function(){return le(Ae.placement)}}),q=Ae.placement)}};function le(Te){return Xr(L(Te),C.getBoundingClientRect(),Y(C.getClientRects()),W)}function pe(Te){H=!0,w.setProps(Te),H=!1}function ye(){H||pe(Yr(w.props,be))}return{onCreate:ye,onAfterUpdate:ye,onTrigger:function(je,Ae){if(X(Ae)){var Ie=Y(w.reference.getClientRects()),re=Ie.find(function(he){return he.left-2<=Ae.clientX&&he.right+2>=Ae.clientX&&he.top-2<=Ae.clientY&&he.bottom+2>=Ae.clientY});W=Ie.indexOf(re)}},onUntrigger:function(){W=-1}}}};function Xr(g,w,C,F){if(C.length<2||g===null)return w;if(C.length===2&&F>=0&&C[0].left>C[1].right)return C[F]||w;switch(g){case"top":case"bottom":{var q=C[0],W=C[C.length-1],H=g==="top",be=q.top,le=W.bottom,pe=H?q.left:W.left,ye=H?q.right:W.right,Te=ye-pe,je=le-be;return{top:be,bottom:le,left:pe,right:ye,width:Te,height:je}}case"left":case"right":{var Ae=Math.min.apply(Math,C.map(function(fe){return fe.left})),Ie=Math.max.apply(Math,C.map(function(fe){return fe.right})),re=C.filter(function(fe){return g==="left"?fe.left===Ae:fe.right===Ie}),he=re[0].top,ve=re[re.length-1].bottom,ee=Ae,ie=Ie,x=ie-ee,Ge=ve-he;return{top:he,bottom:ve,left:ee,right:ie,width:x,height:Ge}}default:return w}}var qr={name:"sticky",defaultValue:!1,fn:function(w){var C=w.reference,F=w.popper;function q(){return w.popperInstance?w.popperInstance.state.elements.reference:C}function W(pe){return w.props.sticky===!0||w.props.sticky===pe}var H=null,be=null;function le(){var pe=W("reference")?q().getBoundingClientRect():null,ye=W("popper")?F.getBoundingClientRect():null;(pe&&Hn(H,pe)||ye&&Hn(be,ye))&&w.popperInstance&&w.popperInstance.update(),H=pe,be=ye,w.state.isMounted&&requestAnimationFrame(le)}return{onMount:function(){w.props.sticky&&le()}}}};function Hn(g,w){return g&&w?g.top!==w.top||g.right!==w.right||g.bottom!==w.bottom||g.left!==w.left:!0}dt.setDefaultProps({render:ar}),e.animateFill=dr,e.createSingleton=fr,e.default=dt,e.delegate=qt,e.followCursor=jn,e.hideAll=lr,e.inlinePositioning=Bn,e.roundArrow=r,e.sticky=qr}),Si=Ho($o()),Ts=Ho($o()),Ps=e=>{let t={plugins:[]},r=i=>e[e.indexOf(i)+1];if(e.includes("animation")&&(t.animation=r("animation")),e.includes("duration")&&(t.duration=parseInt(r("duration"))),e.includes("delay")){let i=r("delay");t.delay=i.includes("-")?i.split("-").map(o=>parseInt(o)):parseInt(i)}if(e.includes("cursor")){t.plugins.push(Ts.followCursor);let i=r("cursor");["x","initial"].includes(i)?t.followCursor=i==="x"?"horizontal":"initial":t.followCursor=!0}e.includes("on")&&(t.trigger=r("on")),e.includes("arrowless")&&(t.arrow=!1),e.includes("html")&&(t.allowHTML=!0),e.includes("interactive")&&(t.interactive=!0),e.includes("border")&&t.interactive&&(t.interactiveBorder=parseInt(r("border"))),e.includes("debounce")&&t.interactive&&(t.interactiveDebounce=parseInt(r("debounce"))),e.includes("max-width")&&(t.maxWidth=parseInt(r("max-width"))),e.includes("theme")&&(t.theme=r("theme")),e.includes("placement")&&(t.placement=r("placement"));let n={};return e.includes("no-flip")&&(n.modifiers||(n.modifiers=[]),n.modifiers.push({name:"flip",enabled:!1})),t.popperOptions=n,t};function Ai(e){e.magic("tooltip",t=>(r,n={})=>{let i=n.timeout;delete n.timeout;let o=(0,Si.default)(t,{content:r,trigger:"manual",...n});o.show(),setTimeout(()=>{o.hide(),setTimeout(()=>o.destroy(),n.duration||300)},i||2e3)}),e.directive("tooltip",(t,{modifiers:r,expression:n},{evaluateLater:i,effect:o,cleanup:a})=>{let c=r.length>0?Ps(r):{};t.__x_tippy||(t.__x_tippy=(0,Si.default)(t,c)),a(()=>{t.__x_tippy&&(t.__x_tippy.destroy(),delete t.__x_tippy)});let f=()=>t.__x_tippy.enable(),d=()=>t.__x_tippy.disable(),y=m=>{m?(f(),t.__x_tippy.setContent(m)):d()};if(r.includes("raw"))y(n);else{let m=i(n);o(()=>{m(O=>{typeof O=="object"?(t.__x_tippy.setProps(O),f()):y(O)})})}})}Ai.defaultProps=e=>(Si.default.setDefaultProps(e),Ai);var Ms=Ai,Wo=Ms;var Uo=()=>({toggle(e){this.$refs.panel?.toggle(e)},open(e){this.$refs.panel?.open(e)},close(e){this.$refs.panel?.close(e)}});var Vo=()=>({form:null,isProcessing:!1,processingMessage:null,init(){let e=this.$el.closest("form");e?.addEventListener("form-processing-started",t=>{this.isProcessing=!0,this.processingMessage=t.detail.message}),e?.addEventListener("form-processing-finished",()=>{this.isProcessing=!1})}});var zo=({id:e})=>({isOpen:!1,isWindowVisible:!1,livewire:null,textSelectionClosePreventionMouseDownHandler:null,textSelectionClosePreventionMouseUpHandler:null,textSelectionClosePreventionClickHandler:null,init(){this.$nextTick(()=>{this.isWindowVisible=this.isOpen,this.setUpTextSelectionClosePrevention(),this.$watch("isOpen",()=>this.isWindowVisible=this.isOpen)})},setUpTextSelectionClosePrevention(){let t=".fi-modal-window",r=".fi-modal-close-overlay",i=!1,o=0;this.textSelectionClosePreventionClickHandler=c=>{c.stopPropagation(),c.preventDefault(),document.removeEventListener("click",this.textSelectionClosePreventionClickHandler,!0)};let a=c=>!c.target.closest(t)&&(c.target.closest(r)||c.target.closest("body"));this.textSelectionClosePreventionMouseDownHandler=c=>{o=Date.now(),i=!!c.target.closest(t)},this.textSelectionClosePreventionMouseUpHandler=c=>{let f=Date.now()-o<75;i&&a(c)&&!f?document.addEventListener("click",this.textSelectionClosePreventionClickHandler,!0):document.removeEventListener("click",this.textSelectionClosePreventionClickHandler,!0),i=!1},document.addEventListener("mousedown",this.textSelectionClosePreventionMouseDownHandler,!0),document.addEventListener("mouseup",this.textSelectionClosePreventionMouseUpHandler,!0)},close(){this.closeQuietly(),this.$dispatch("modal-closed",{id:e})},closeQuietly(){this.isOpen=!1},open(){this.$nextTick(()=>{this.isOpen=!0,document.dispatchEvent(new CustomEvent("x-modal-opened",{bubbles:!0,composed:!0,detail:{id:e}}))})},destroy(){this.textSelectionClosePreventionMouseDownHandler&&(document.removeEventListener("mousedown",this.textSelectionClosePreventionMouseDownHandler,!0),this.textSelectionClosePreventionMouseDownHandler=null),this.textSelectionClosePreventionMouseUpHandler&&(document.removeEventListener("mouseup",this.textSelectionClosePreventionMouseUpHandler,!0),this.textSelectionClosePreventionMouseUpHandler=null),this.textSelectionClosePreventionClickHandler&&(document.removeEventListener("click",this.textSelectionClosePreventionClickHandler,!0),this.textSelectionClosePreventionClickHandler=null)}});document.addEventListener("livewire:init",()=>{let e=t=>{let r=Alpine.findClosest(t,n=>n.__livewire);if(!r)throw"Could not find Livewire component in DOM tree.";return r.__livewire};Livewire.hook("commit",({component:t,commit:r,respond:n,succeed:i,fail:o})=>{n(()=>{queueMicrotask(()=>{if(!t.effects.html)for(let[f,d]of Object.entries(t.effects.partials??{})){let y=Array.from(t.el.querySelectorAll(`[wire\\:partial="${f}"]`)).filter(T=>e(T)===t);if(!y.length)continue;if(y.length>1)throw`Multiple elements found for partial [${f}].`;let m=y[0],O=m.parentElement?m.parentElement.tagName.toLowerCase():"div",E=document.createElement(O);E.innerHTML=d,E.__livewire=t;let S=E.firstElementChild;S.__livewire=t;let R={};m.querySelectorAll("[wire\\:id]").forEach(T=>{R[T.getAttribute("wire:id")]=T}),S.querySelectorAll("[wire\\:id]").forEach(T=>{if(T.hasAttribute("wire:snapshot"))return;let j=T.getAttribute("wire:id"),A=R[j];A&&T.replaceWith(A.cloneNode(!0))}),window.Alpine.morph(m,S,{updating:(T,j,A,L)=>{if(!a(T)){if(T.__livewire_replace===!0&&(T.innerHTML=j.innerHTML),T.__livewire_replace_self===!0)return T.outerHTML=j.outerHTML,L();if(T.__livewire_ignore===!0||(T.__livewire_ignore_self===!0&&A(),c(T)&&T.getAttribute("wire:id")!==t.id))return L();c(T)&&(j.__livewire=t)}},key:T=>{if(!a(T))return T.hasAttribute("wire:key")?T.getAttribute("wire:key"):T.hasAttribute("wire:id")?T.getAttribute("wire:id"):T.id},lookahead:!1})}})});function a(f){return typeof f.hasAttribute!="function"}function c(f){return f.hasAttribute("wire:id")}})});var Yo=(e,t,r)=>{let n=(y,m)=>{for(let O of y){let E=i(O,m);if(E!==null)return E}},i=(y,m)=>{let O=y.match(/^[\{\[]([^\[\]\{\}]*)[\}\]](.*)/s);if(O===null||O.length!==3)return null;let E=O[1],S=O[2];if(E.includes(",")){let[R,T]=E.split(",",2);if(T==="*"&&m>=R)return S;if(R==="*"&&m<=T)return S;if(m>=R&&m<=T)return S}return E==m?S:null},o=y=>y.toString().charAt(0).toUpperCase()+y.toString().slice(1),a=(y,m)=>{if(m.length===0)return y;let O={};for(let[E,S]of Object.entries(m))O[":"+o(E??"")]=o(S??""),O[":"+E.toUpperCase()]=S.toString().toUpperCase(),O[":"+E]=S;return Object.entries(O).forEach(([E,S])=>{y=y.replaceAll(E,S)}),y},c=y=>y.map(m=>m.replace(/^[\{\[]([^\[\]\{\}]*)[\}\]]/,"")),f=e.split("|"),d=n(f,t);return d!=null?a(d.trim(),r):(f=c(f),a(f.length>1&&t>1?f[1]:f[0],r))};document.addEventListener("alpine:init",()=>{window.Alpine.plugin(oo),window.Alpine.plugin(ao),window.Alpine.plugin(fo),window.Alpine.plugin(jo),window.Alpine.plugin(Wo),window.Alpine.data("filamentDropdown",Uo),window.Alpine.data("filamentFormButton",Vo),window.Alpine.data("filamentModal",zo)});window.jsMd5=Xo.md5;window.pluralize=Yo;})(); /*! Bundled license information: js-md5/src/md5.js: @@ -38,7 +38,7 @@ js-md5/src/md5.js: sortablejs/modular/sortable.esm.js: (**! - * Sortable 1.15.3 + * Sortable 1.15.6 * @author RubaXa * @author owenm * @license MIT diff --git a/public/js/filament/tables/components/columns/checkbox.js b/public/js/filament/tables/components/columns/checkbox.js new file mode 100644 index 0000000000..d6bb6e5dad --- /dev/null +++ b/public/js/filament/tables/components/columns/checkbox.js @@ -0,0 +1 @@ +function o({name:r,recordKey:s,state:n}){return{error:void 0,isLoading:!1,state:n,unsubscribeLivewireHook:null,init(){this.unsubscribeLivewireHook=Livewire.hook("commit",({component:e,commit:i,succeed:a,fail:u,respond:h})=>{a(({snapshot:d,effect:f})=>{this.$nextTick(()=>{if(this.isLoading||e.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let t=this.getServerState();t===void 0||Alpine.raw(this.state)===t||(this.state=t)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||Alpine.raw(this.state)===e)return;this.isLoading=!0;let i=await this.$wire.updateTableColumnState(r,s,this.state);this.error=i?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.state?"1":"0"),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[1,"1"].includes(this.$refs.serverState.value)},destroy(){this.unsubscribeLivewireHook?.()}}}export{o as default}; diff --git a/public/js/filament/tables/components/columns/select.js b/public/js/filament/tables/components/columns/select.js new file mode 100644 index 0000000000..de559eae01 --- /dev/null +++ b/public/js/filament/tables/components/columns/select.js @@ -0,0 +1,11 @@ +var Ft=Math.min,vt=Math.max,Ht=Math.round;var st=n=>({x:n,y:n}),ji={left:"right",right:"left",bottom:"top",top:"bottom"},qi={start:"end",end:"start"};function De(n,t,e){return vt(n,Ft(t,e))}function Vt(n,t){return typeof n=="function"?n(t):n}function yt(n){return n.split("-")[0]}function Wt(n){return n.split("-")[1]}function Ae(n){return n==="x"?"y":"x"}function Ce(n){return n==="y"?"height":"width"}var Ji=new Set(["top","bottom"]);function ht(n){return Ji.has(yt(n))?"y":"x"}function Le(n){return Ae(ht(n))}function Je(n,t,e){e===void 0&&(e=!1);let i=Wt(n),o=Le(n),s=Ce(o),r=o==="x"?i===(e?"end":"start")?"right":"left":i==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(r=Bt(r)),[r,Bt(r)]}function Qe(n){let t=Bt(n);return[ie(n),t,ie(t)]}function ie(n){return n.replace(/start|end/g,t=>qi[t])}var je=["left","right"],qe=["right","left"],Qi=["top","bottom"],Zi=["bottom","top"];function tn(n,t,e){switch(n){case"top":case"bottom":return e?t?qe:je:t?je:qe;case"left":case"right":return t?Qi:Zi;default:return[]}}function Ze(n,t,e,i){let o=Wt(n),s=tn(yt(n),e==="start",i);return o&&(s=s.map(r=>r+"-"+o),t&&(s=s.concat(s.map(ie)))),s}function Bt(n){return n.replace(/left|right|bottom|top/g,t=>ji[t])}function en(n){return{top:0,right:0,bottom:0,left:0,...n}}function ti(n){return typeof n!="number"?en(n):{top:n,right:n,bottom:n,left:n}}function Et(n){let{x:t,y:e,width:i,height:o}=n;return{width:i,height:o,top:e,left:t,right:t+i,bottom:e+o,x:t,y:e}}function ei(n,t,e){let{reference:i,floating:o}=n,s=ht(t),r=Le(t),a=Ce(r),l=yt(t),c=s==="y",f=i.x+i.width/2-o.width/2,d=i.y+i.height/2-o.height/2,p=i[a]/2-o[a]/2,u;switch(l){case"top":u={x:f,y:i.y-o.height};break;case"bottom":u={x:f,y:i.y+i.height};break;case"right":u={x:i.x+i.width,y:d};break;case"left":u={x:i.x-o.width,y:d};break;default:u={x:i.x,y:i.y}}switch(Wt(t)){case"start":u[r]-=p*(e&&c?-1:1);break;case"end":u[r]+=p*(e&&c?-1:1);break}return u}var ii=async(n,t,e)=>{let{placement:i="bottom",strategy:o="absolute",middleware:s=[],platform:r}=e,a=s.filter(Boolean),l=await(r.isRTL==null?void 0:r.isRTL(t)),c=await r.getElementRects({reference:n,floating:t,strategy:o}),{x:f,y:d}=ei(c,i,l),p=i,u={},g=0;for(let m=0;mF<=0)){var L,Y;let F=(((L=s.flip)==null?void 0:L.index)||0)+1,Q=q[F];if(Q&&(!(d==="alignment"?w!==ht(Q):!1)||z.every(T=>ht(T.placement)===w?T.overflows[0]>0:!0)))return{data:{index:F,overflows:z},reset:{placement:Q}};let V=(Y=z.filter(X=>X.overflows[0]<=0).sort((X,T)=>X.overflows[1]-T.overflows[1])[0])==null?void 0:Y.placement;if(!V)switch(u){case"bestFit":{var B;let X=(B=z.filter(T=>{if(H){let et=ht(T.placement);return et===w||et==="y"}return!0}).map(T=>[T.placement,T.overflows.filter(et=>et>0).reduce((et,ee)=>et+ee,0)]).sort((T,et)=>T[1]-et[1])[0])==null?void 0:B[0];X&&(V=X);break}case"initialPlacement":V=a;break}if(o!==V)return{reset:{placement:V}}}return{}}}};var nn=new Set(["left","top"]);async function on(n,t){let{placement:e,platform:i,elements:o}=n,s=await(i.isRTL==null?void 0:i.isRTL(o.floating)),r=yt(e),a=Wt(e),l=ht(e)==="y",c=nn.has(r)?-1:1,f=s&&l?-1:1,d=Vt(t,n),{mainAxis:p,crossAxis:u,alignmentAxis:g}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return a&&typeof g=="number"&&(u=a==="end"?g*-1:g),l?{x:u*f,y:p*c}:{x:p*c,y:u*f}}var oi=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(t){var e,i;let{x:o,y:s,placement:r,middlewareData:a}=t,l=await on(t,n);return r===((e=a.offset)==null?void 0:e.placement)&&(i=a.arrow)!=null&&i.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:r}}}}},si=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(t){let{x:e,y:i,placement:o}=t,{mainAxis:s=!0,crossAxis:r=!1,limiter:a={fn:S=>{let{x:O,y:w}=S;return{x:O,y:w}}},...l}=Vt(n,t),c={x:e,y:i},f=await Ie(t,l),d=ht(yt(o)),p=Ae(d),u=c[p],g=c[d];if(s){let S=p==="y"?"top":"left",O=p==="y"?"bottom":"right",w=u+f[S],D=u-f[O];u=De(w,u,D)}if(r){let S=d==="y"?"top":"left",O=d==="y"?"bottom":"right",w=g+f[S],D=g-f[O];g=De(w,g,D)}let m=a.fn({...t,[p]:u,[d]:g});return{...m,data:{x:m.x-e,y:m.y-i,enabled:{[p]:s,[d]:r}}}}}};function oe(){return typeof window<"u"}function Ot(n){return ai(n)?(n.nodeName||"").toLowerCase():"#document"}function U(n){var t;return(n==null||(t=n.ownerDocument)==null?void 0:t.defaultView)||window}function ct(n){var t;return(t=(ai(n)?n.ownerDocument:n.document)||window.document)==null?void 0:t.documentElement}function ai(n){return oe()?n instanceof Node||n instanceof U(n).Node:!1}function it(n){return oe()?n instanceof Element||n instanceof U(n).Element:!1}function rt(n){return oe()?n instanceof HTMLElement||n instanceof U(n).HTMLElement:!1}function ri(n){return!oe()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof U(n).ShadowRoot}var sn=new Set(["inline","contents"]);function It(n){let{overflow:t,overflowX:e,overflowY:i,display:o}=nt(n);return/auto|scroll|overlay|hidden|clip/.test(t+i+e)&&!sn.has(o)}var rn=new Set(["table","td","th"]);function li(n){return rn.has(Ot(n))}var an=[":popover-open",":modal"];function zt(n){return an.some(t=>{try{return n.matches(t)}catch{return!1}})}var ln=["transform","translate","scale","rotate","perspective"],cn=["transform","translate","scale","rotate","perspective","filter"],dn=["paint","layout","strict","content"];function se(n){let t=re(),e=it(n)?nt(n):n;return ln.some(i=>e[i]?e[i]!=="none":!1)||(e.containerType?e.containerType!=="normal":!1)||!t&&(e.backdropFilter?e.backdropFilter!=="none":!1)||!t&&(e.filter?e.filter!=="none":!1)||cn.some(i=>(e.willChange||"").includes(i))||dn.some(i=>(e.contain||"").includes(i))}function ci(n){let t=ut(n);for(;rt(t)&&!Dt(t);){if(se(t))return t;if(zt(t))return null;t=ut(t)}return null}function re(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var fn=new Set(["html","body","#document"]);function Dt(n){return fn.has(Ot(n))}function nt(n){return U(n).getComputedStyle(n)}function $t(n){return it(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function ut(n){if(Ot(n)==="html")return n;let t=n.assignedSlot||n.parentNode||ri(n)&&n.host||ct(n);return ri(t)?t.host:t}function di(n){let t=ut(n);return Dt(t)?n.ownerDocument?n.ownerDocument.body:n.body:rt(t)&&It(t)?t:di(t)}function ne(n,t,e){var i;t===void 0&&(t=[]),e===void 0&&(e=!0);let o=di(n),s=o===((i=n.ownerDocument)==null?void 0:i.body),r=U(o);if(s){let a=ae(r);return t.concat(r,r.visualViewport||[],It(o)?o:[],a&&e?ne(a):[])}return t.concat(o,ne(o,[],e))}function ae(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function pi(n){let t=nt(n),e=parseFloat(t.width)||0,i=parseFloat(t.height)||0,o=rt(n),s=o?n.offsetWidth:e,r=o?n.offsetHeight:i,a=Ht(e)!==s||Ht(i)!==r;return a&&(e=s,i=r),{width:e,height:i,$:a}}function gi(n){return it(n)?n:n.contextElement}function Tt(n){let t=gi(n);if(!rt(t))return st(1);let e=t.getBoundingClientRect(),{width:i,height:o,$:s}=pi(t),r=(s?Ht(e.width):e.width)/i,a=(s?Ht(e.height):e.height)/o;return(!r||!Number.isFinite(r))&&(r=1),(!a||!Number.isFinite(a))&&(a=1),{x:r,y:a}}var hn=st(0);function mi(n){let t=U(n);return!re()||!t.visualViewport?hn:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function un(n,t,e){return t===void 0&&(t=!1),!e||t&&e!==U(n)?!1:t}function Xt(n,t,e,i){t===void 0&&(t=!1),e===void 0&&(e=!1);let o=n.getBoundingClientRect(),s=gi(n),r=st(1);t&&(i?it(i)&&(r=Tt(i)):r=Tt(n));let a=un(s,e,i)?mi(s):st(0),l=(o.left+a.x)/r.x,c=(o.top+a.y)/r.y,f=o.width/r.x,d=o.height/r.y;if(s){let p=U(s),u=i&&it(i)?U(i):i,g=p,m=ae(g);for(;m&&i&&u!==g;){let S=Tt(m),O=m.getBoundingClientRect(),w=nt(m),D=O.left+(m.clientLeft+parseFloat(w.paddingLeft))*S.x,A=O.top+(m.clientTop+parseFloat(w.paddingTop))*S.y;l*=S.x,c*=S.y,f*=S.x,d*=S.y,l+=D,c+=A,g=U(m),m=ae(g)}}return Et({width:f,height:d,x:l,y:c})}function le(n,t){let e=$t(n).scrollLeft;return t?t.left+e:Xt(ct(n)).left+e}function bi(n,t){let e=n.getBoundingClientRect(),i=e.left+t.scrollLeft-le(n,e),o=e.top+t.scrollTop;return{x:i,y:o}}function pn(n){let{elements:t,rect:e,offsetParent:i,strategy:o}=n,s=o==="fixed",r=ct(i),a=t?zt(t.floating):!1;if(i===r||a&&s)return e;let l={scrollLeft:0,scrollTop:0},c=st(1),f=st(0),d=rt(i);if((d||!d&&!s)&&((Ot(i)!=="body"||It(r))&&(l=$t(i)),rt(i))){let u=Xt(i);c=Tt(i),f.x=u.x+i.clientLeft,f.y=u.y+i.clientTop}let p=r&&!d&&!s?bi(r,l):st(0);return{width:e.width*c.x,height:e.height*c.y,x:e.x*c.x-l.scrollLeft*c.x+f.x+p.x,y:e.y*c.y-l.scrollTop*c.y+f.y+p.y}}function gn(n){return Array.from(n.getClientRects())}function mn(n){let t=ct(n),e=$t(n),i=n.ownerDocument.body,o=vt(t.scrollWidth,t.clientWidth,i.scrollWidth,i.clientWidth),s=vt(t.scrollHeight,t.clientHeight,i.scrollHeight,i.clientHeight),r=-e.scrollLeft+le(n),a=-e.scrollTop;return nt(i).direction==="rtl"&&(r+=vt(t.clientWidth,i.clientWidth)-o),{width:o,height:s,x:r,y:a}}var fi=25;function bn(n,t){let e=U(n),i=ct(n),o=e.visualViewport,s=i.clientWidth,r=i.clientHeight,a=0,l=0;if(o){s=o.width,r=o.height;let f=re();(!f||f&&t==="fixed")&&(a=o.offsetLeft,l=o.offsetTop)}let c=le(i);if(c<=0){let f=i.ownerDocument,d=f.body,p=getComputedStyle(d),u=f.compatMode==="CSS1Compat"&&parseFloat(p.marginLeft)+parseFloat(p.marginRight)||0,g=Math.abs(i.clientWidth-d.clientWidth-u);g<=fi&&(s-=g)}else c<=fi&&(s+=c);return{width:s,height:r,x:a,y:l}}var vn=new Set(["absolute","fixed"]);function yn(n,t){let e=Xt(n,!0,t==="fixed"),i=e.top+n.clientTop,o=e.left+n.clientLeft,s=rt(n)?Tt(n):st(1),r=n.clientWidth*s.x,a=n.clientHeight*s.y,l=o*s.x,c=i*s.y;return{width:r,height:a,x:l,y:c}}function hi(n,t,e){let i;if(t==="viewport")i=bn(n,e);else if(t==="document")i=mn(ct(n));else if(it(t))i=yn(t,e);else{let o=mi(n);i={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return Et(i)}function vi(n,t){let e=ut(n);return e===t||!it(e)||Dt(e)?!1:nt(e).position==="fixed"||vi(e,t)}function wn(n,t){let e=t.get(n);if(e)return e;let i=ne(n,[],!1).filter(a=>it(a)&&Ot(a)!=="body"),o=null,s=nt(n).position==="fixed",r=s?ut(n):n;for(;it(r)&&!Dt(r);){let a=nt(r),l=se(r);!l&&a.position==="fixed"&&(o=null),(s?!l&&!o:!l&&a.position==="static"&&!!o&&vn.has(o.position)||It(r)&&!l&&vi(n,r))?i=i.filter(f=>f!==r):o=a,r=ut(r)}return t.set(n,i),i}function Sn(n){let{element:t,boundary:e,rootBoundary:i,strategy:o}=n,r=[...e==="clippingAncestors"?zt(t)?[]:wn(t,this._c):[].concat(e),i],a=r[0],l=r.reduce((c,f)=>{let d=hi(t,f,o);return c.top=vt(d.top,c.top),c.right=Ft(d.right,c.right),c.bottom=Ft(d.bottom,c.bottom),c.left=vt(d.left,c.left),c},hi(t,a,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function xn(n){let{width:t,height:e}=pi(n);return{width:t,height:e}}function En(n,t,e){let i=rt(t),o=ct(t),s=e==="fixed",r=Xt(n,!0,s,t),a={scrollLeft:0,scrollTop:0},l=st(0);function c(){l.x=le(o)}if(i||!i&&!s)if((Ot(t)!=="body"||It(o))&&(a=$t(t)),i){let u=Xt(t,!0,s,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else o&&c();s&&!i&&o&&c();let f=o&&!i&&!s?bi(o,a):st(0),d=r.left+a.scrollLeft-l.x-f.x,p=r.top+a.scrollTop-l.y-f.y;return{x:d,y:p,width:r.width,height:r.height}}function Te(n){return nt(n).position==="static"}function ui(n,t){if(!rt(n)||nt(n).position==="fixed")return null;if(t)return t(n);let e=n.offsetParent;return ct(n)===e&&(e=e.ownerDocument.body),e}function yi(n,t){let e=U(n);if(zt(n))return e;if(!rt(n)){let o=ut(n);for(;o&&!Dt(o);){if(it(o)&&!Te(o))return o;o=ut(o)}return e}let i=ui(n,t);for(;i&&li(i)&&Te(i);)i=ui(i,t);return i&&Dt(i)&&Te(i)&&!se(i)?e:i||ci(n)||e}var On=async function(n){let t=this.getOffsetParent||yi,e=this.getDimensions,i=await e(n.floating);return{reference:En(n.reference,await t(n.floating),n.strategy),floating:{x:0,y:0,width:i.width,height:i.height}}};function Dn(n){return nt(n).direction==="rtl"}var An={convertOffsetParentRelativeRectToViewportRelativeRect:pn,getDocumentElement:ct,getClippingRect:Sn,getOffsetParent:yi,getElementRects:On,getClientRects:gn,getDimensions:xn,getScale:Tt,isElement:it,isRTL:Dn};var wi=oi;var Si=si,xi=ni;var Ei=(n,t,e)=>{let i=new Map,o={platform:An,...e},s={...o.platform,_c:i};return ii(n,t,{...o,platform:s})};function Oi(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter(function(o){return Object.getOwnPropertyDescriptor(n,o).enumerable})),e.push.apply(e,i)}return e}function ft(n){for(var t=1;t=0)&&(e[o]=n[o]);return e}function In(n,t){if(n==null)return{};var e=Ln(n,t),i,o;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(n);for(o=0;o=0)&&Object.prototype.propertyIsEnumerable.call(n,i)&&(e[i]=n[i])}return e}var Tn="1.15.6";function pt(n){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(n)}var mt=pt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Zt=pt(/Edge/i),Di=pt(/firefox/i),Gt=pt(/safari/i)&&!pt(/chrome/i)&&!pt(/android/i),Xe=pt(/iP(ad|od|hone)/i),Mi=pt(/chrome/i)&&pt(/android/i),Pi={capture:!1,passive:!1};function E(n,t,e){n.addEventListener(t,e,!mt&&Pi)}function x(n,t,e){n.removeEventListener(t,e,!mt&&Pi)}function ve(n,t){if(t){if(t[0]===">"&&(t=t.substring(1)),n)try{if(n.matches)return n.matches(t);if(n.msMatchesSelector)return n.msMatchesSelector(t);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(t)}catch{return!1}return!1}}function Ni(n){return n.host&&n!==document&&n.host.nodeType?n.host:n.parentNode}function lt(n,t,e,i){if(n){e=e||document;do{if(t!=null&&(t[0]===">"?n.parentNode===e&&ve(n,t):ve(n,t))||i&&n===e)return n;if(n===e)break}while(n=Ni(n))}return null}var Ai=/\s+/g;function Z(n,t,e){if(n&&t)if(n.classList)n.classList[e?"add":"remove"](t);else{var i=(" "+n.className+" ").replace(Ai," ").replace(" "+t+" "," ");n.className=(i+(e?" "+t:"")).replace(Ai," ")}}function b(n,t,e){var i=n&&n.style;if(i){if(e===void 0)return document.defaultView&&document.defaultView.getComputedStyle?e=document.defaultView.getComputedStyle(n,""):n.currentStyle&&(e=n.currentStyle),t===void 0?e:e[t];!(t in i)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),i[t]=e+(typeof e=="string"?"":"px")}}function Nt(n,t){var e="";if(typeof n=="string")e=n;else do{var i=b(n,"transform");i&&i!=="none"&&(e=i+" "+e)}while(!t&&(n=n.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(e)}function ki(n,t,e){if(n){var i=n.getElementsByTagName(t),o=0,s=i.length;if(e)for(;o=s:r=o<=s,!r)return i;if(i===dt())break;i=xt(i,!1)}return!1}function kt(n,t,e,i){for(var o=0,s=0,r=n.children;s2&&arguments[2]!==void 0?arguments[2]:{},o=i.evt,s=In(i,Fn);te.pluginEvent.bind(v)(t,e,ft({dragEl:h,parentEl:M,ghostEl:y,rootEl:I,nextEl:Lt,lastDownEl:pe,cloneEl:_,cloneHidden:St,dragStarted:Kt,putSortable:W,activeSortable:v.active,originalEvent:o,oldIndex:Pt,oldDraggableIndex:qt,newIndex:tt,newDraggableIndex:wt,hideGhostForTarget:Xi,unhideGhostForTarget:Ki,cloneNowHidden:function(){St=!0},cloneNowShown:function(){St=!1},dispatchSortableEvent:function(a){K({sortable:e,name:a,originalEvent:o})}},s))};function K(n){Bn(ft({putSortable:W,cloneEl:_,targetEl:h,rootEl:I,oldIndex:Pt,oldDraggableIndex:qt,newIndex:tt,newDraggableIndex:wt},n))}var h,M,y,I,Lt,pe,_,St,Pt,tt,qt,wt,ce,W,Mt=!1,ye=!1,we=[],At,at,Me,Pe,Ii,Ti,Kt,Rt,Jt,Qt=!1,de=!1,ge,$,Ne=[],Ve=!1,Se=[],Ee=typeof document<"u",fe=Xe,_i=Zt||mt?"cssFloat":"float",Hn=Ee&&!Mi&&!Xe&&"draggable"in document.createElement("div"),Wi=(function(){if(Ee){if(mt)return!1;var n=document.createElement("x");return n.style.cssText="pointer-events:auto",n.style.pointerEvents==="auto"}})(),zi=function(t,e){var i=b(t),o=parseInt(i.width)-parseInt(i.paddingLeft)-parseInt(i.paddingRight)-parseInt(i.borderLeftWidth)-parseInt(i.borderRightWidth),s=kt(t,0,e),r=kt(t,1,e),a=s&&b(s),l=r&&b(r),c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+k(s).width,f=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+k(r).width;if(i.display==="flex")return i.flexDirection==="column"||i.flexDirection==="column-reverse"?"vertical":"horizontal";if(i.display==="grid")return i.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(s&&a.float&&a.float!=="none"){var d=a.float==="left"?"left":"right";return r&&(l.clear==="both"||l.clear===d)?"vertical":"horizontal"}return s&&(a.display==="block"||a.display==="flex"||a.display==="table"||a.display==="grid"||c>=o&&i[_i]==="none"||r&&i[_i]==="none"&&c+f>o)?"vertical":"horizontal"},Vn=function(t,e,i){var o=i?t.left:t.top,s=i?t.right:t.bottom,r=i?t.width:t.height,a=i?e.left:e.top,l=i?e.right:e.bottom,c=i?e.width:e.height;return o===a||s===l||o+r/2===a+c/2},Wn=function(t,e){var i;return we.some(function(o){var s=o[j].options.emptyInsertThreshold;if(!(!s||Ke(o))){var r=k(o),a=t>=r.left-s&&t<=r.right+s,l=e>=r.top-s&&e<=r.bottom+s;if(a&&l)return i=o}}),i},$i=function(t){function e(s,r){return function(a,l,c,f){var d=a.options.group.name&&l.options.group.name&&a.options.group.name===l.options.group.name;if(s==null&&(r||d))return!0;if(s==null||s===!1)return!1;if(r&&s==="clone")return s;if(typeof s=="function")return e(s(a,l,c,f),r)(a,l,c,f);var p=(r?a:l).options.group.name;return s===!0||typeof s=="string"&&s===p||s.join&&s.indexOf(p)>-1}}var i={},o=t.group;(!o||ue(o)!="object")&&(o={name:o}),i.name=o.name,i.checkPull=e(o.pull,!0),i.checkPut=e(o.put),i.revertClone=o.revertClone,t.group=i},Xi=function(){!Wi&&y&&b(y,"display","none")},Ki=function(){!Wi&&y&&b(y,"display","")};Ee&&!Mi&&document.addEventListener("click",function(n){if(ye)return n.preventDefault(),n.stopPropagation&&n.stopPropagation(),n.stopImmediatePropagation&&n.stopImmediatePropagation(),ye=!1,!1},!0);var Ct=function(t){if(h){t=t.touches?t.touches[0]:t;var e=Wn(t.clientX,t.clientY);if(e){var i={};for(var o in t)t.hasOwnProperty(o)&&(i[o]=t[o]);i.target=i.rootEl=e,i.preventDefault=void 0,i.stopPropagation=void 0,e[j]._onDragOver(i)}}},zn=function(t){h&&h.parentNode[j]._isOutsideThisEl(t.target)};function v(n,t){if(!(n&&n.nodeType&&n.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(n));this.el=n,this.options=t=gt({},t),n[j]=this;var e={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(n.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return zi(n,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(r,a){r.setData("Text",a.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:v.supportPointer!==!1&&"PointerEvent"in window&&(!Gt||Xe),emptyInsertThreshold:5};te.initializePlugins(this,n,e);for(var i in e)!(i in t)&&(t[i]=e[i]);$i(t);for(var o in this)o.charAt(0)==="_"&&typeof this[o]=="function"&&(this[o]=this[o].bind(this));this.nativeDraggable=t.forceFallback?!1:Hn,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?E(n,"pointerdown",this._onTapStart):(E(n,"mousedown",this._onTapStart),E(n,"touchstart",this._onTapStart)),this.nativeDraggable&&(E(n,"dragover",this),E(n,"dragenter",this)),we.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),gt(this,Pn())}v.prototype={constructor:v,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Rt=null)},_getDirection:function(t,e){return typeof this.options.direction=="function"?this.options.direction.call(this,t,e,h):this.options.direction},_onTapStart:function(t){if(t.cancelable){var e=this,i=this.el,o=this.options,s=o.preventOnFilter,r=t.type,a=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,l=(a||t).target,c=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||l,f=o.filter;if(qn(i),!h&&!(/mousedown|pointerdown/.test(r)&&t.button!==0||o.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&Gt&&l&&l.tagName.toUpperCase()==="SELECT")&&(l=lt(l,o.draggable,i,!1),!(l&&l.animated)&&pe!==l)){if(Pt=ot(l),qt=ot(l,o.draggable),typeof f=="function"){if(f.call(this,t,l,this)){K({sortable:e,rootEl:c,name:"filter",targetEl:l,toEl:i,fromEl:i}),G("filter",e,{evt:t}),s&&t.preventDefault();return}}else if(f&&(f=f.split(",").some(function(d){if(d=lt(c,d.trim(),i,!1),d)return K({sortable:e,rootEl:d,name:"filter",targetEl:l,fromEl:i,toEl:i}),G("filter",e,{evt:t}),!0}),f)){s&&t.preventDefault();return}o.handle&&!lt(c,o.handle,i,!1)||this._prepareDragStart(t,a,l)}}},_prepareDragStart:function(t,e,i){var o=this,s=o.el,r=o.options,a=s.ownerDocument,l;if(i&&!h&&i.parentNode===s){var c=k(i);if(I=s,h=i,M=h.parentNode,Lt=h.nextSibling,pe=i,ce=r.group,v.dragged=h,At={target:h,clientX:(e||t).clientX,clientY:(e||t).clientY},Ii=At.clientX-c.left,Ti=At.clientY-c.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,h.style["will-change"]="all",l=function(){if(G("delayEnded",o,{evt:t}),v.eventCanceled){o._onDrop();return}o._disableDelayedDragEvents(),!Di&&o.nativeDraggable&&(h.draggable=!0),o._triggerDragStart(t,e),K({sortable:o,name:"choose",originalEvent:t}),Z(h,r.chosenClass,!0)},r.ignore.split(",").forEach(function(f){ki(h,f.trim(),ke)}),E(a,"dragover",Ct),E(a,"mousemove",Ct),E(a,"touchmove",Ct),r.supportPointer?(E(a,"pointerup",o._onDrop),!this.nativeDraggable&&E(a,"pointercancel",o._onDrop)):(E(a,"mouseup",o._onDrop),E(a,"touchend",o._onDrop),E(a,"touchcancel",o._onDrop)),Di&&this.nativeDraggable&&(this.options.touchStartThreshold=4,h.draggable=!0),G("delayStart",this,{evt:t}),r.delay&&(!r.delayOnTouchOnly||e)&&(!this.nativeDraggable||!(Zt||mt))){if(v.eventCanceled){this._onDrop();return}r.supportPointer?(E(a,"pointerup",o._disableDelayedDrag),E(a,"pointercancel",o._disableDelayedDrag)):(E(a,"mouseup",o._disableDelayedDrag),E(a,"touchend",o._disableDelayedDrag),E(a,"touchcancel",o._disableDelayedDrag)),E(a,"mousemove",o._delayedDragTouchMoveHandler),E(a,"touchmove",o._delayedDragTouchMoveHandler),r.supportPointer&&E(a,"pointermove",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(l,r.delay)}else l()}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){h&&ke(h),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;x(t,"mouseup",this._disableDelayedDrag),x(t,"touchend",this._disableDelayedDrag),x(t,"touchcancel",this._disableDelayedDrag),x(t,"pointerup",this._disableDelayedDrag),x(t,"pointercancel",this._disableDelayedDrag),x(t,"mousemove",this._delayedDragTouchMoveHandler),x(t,"touchmove",this._delayedDragTouchMoveHandler),x(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||t.pointerType=="touch"&&t,!this.nativeDraggable||e?this.options.supportPointer?E(document,"pointermove",this._onTouchMove):e?E(document,"touchmove",this._onTouchMove):E(document,"mousemove",this._onTouchMove):(E(h,"dragend",this),E(I,"dragstart",this._onDragStart));try{document.selection?me(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,e){if(Mt=!1,I&&h){G("dragStarted",this,{evt:e}),this.nativeDraggable&&E(document,"dragover",zn);var i=this.options;!t&&Z(h,i.dragClass,!1),Z(h,i.ghostClass,!0),v.active=this,t&&this._appendGhost(),K({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Xi();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY),t!==e);)e=t;if(h.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){var i=void 0;if(i=e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e}),i&&!this.options.dragoverBubble)break}t=e}while(e=Ni(e));Ki()}},_onTouchMove:function(t){if(At){var e=this.options,i=e.fallbackTolerance,o=e.fallbackOffset,s=t.touches?t.touches[0]:t,r=y&&Nt(y,!0),a=y&&r&&r.a,l=y&&r&&r.d,c=fe&&$&&Li($),f=(s.clientX-At.clientX+o.x)/(a||1)+(c?c[0]-Ne[0]:0)/(a||1),d=(s.clientY-At.clientY+o.y)/(l||1)+(c?c[1]-Ne[1]:0)/(l||1);if(!v.active&&!Mt){if(i&&Math.max(Math.abs(s.clientX-this._lastX),Math.abs(s.clientY-this._lastY))=0&&(K({rootEl:M,name:"add",toEl:M,fromEl:I,originalEvent:t}),K({sortable:this,name:"remove",toEl:M,originalEvent:t}),K({rootEl:M,name:"sort",toEl:M,fromEl:I,originalEvent:t}),K({sortable:this,name:"sort",toEl:M,originalEvent:t})),W&&W.save()):tt!==Pt&&tt>=0&&(K({sortable:this,name:"update",toEl:M,originalEvent:t}),K({sortable:this,name:"sort",toEl:M,originalEvent:t})),v.active&&((tt==null||tt===-1)&&(tt=Pt,wt=qt),K({sortable:this,name:"end",toEl:M,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){G("nulling",this),I=h=M=y=Lt=_=pe=St=At=at=Kt=tt=wt=Pt=qt=Rt=Jt=W=ce=v.dragged=v.ghost=v.clone=v.active=null,Se.forEach(function(t){t.checked=!0}),Se.length=Me=Pe=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":h&&(this._onDragOver(t),$n(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],e,i=this.el.children,o=0,s=i.length,r=this.options;oo.right+s||n.clientY>i.bottom&&n.clientX>i.left:n.clientY>o.bottom+s||n.clientX>i.right&&n.clientY>i.top}function Un(n,t,e,i,o,s,r,a){var l=i?n.clientY:n.clientX,c=i?e.height:e.width,f=i?e.top:e.left,d=i?e.bottom:e.right,p=!1;if(!r){if(a&&gef+c*s/2:ld-ge)return-Jt}else if(l>f+c*(1-o)/2&&ld-c*s/2)?l>f+c/2?1:-1:0}function Gn(n){return ot(h){},options:L,optionsLimit:Y=null,placeholder:B,position:F=null,searchableOptionFields:Q=["label"],searchDebounce:V=1e3,searchingMessage:X="Searching...",searchPrompt:T="Search...",state:et,statePath:ee=null}){this.canOptionLabelsWrap=t,this.canSelectPlaceholder=e,this.element=i,this.getOptionLabelUsing=o,this.getOptionLabelsUsing=s,this.getOptionsUsing=r,this.getSearchResultsUsing=a,this.hasDynamicOptions=l,this.hasDynamicSearchResults=c,this.hasInitialNoOptionsMessage=f,this.initialOptionLabel=d,this.initialOptionLabels=p,this.initialState=u,this.isAutofocused=g,this.isDisabled=m,this.isHtmlAllowed=S,this.isMultiple=O,this.isReorderable=w,this.isSearchable=D,this.livewireId=A,this.loadingMessage=C,this.maxItems=H,this.maxItemsMessage=q,this.noOptionsMessage=J,this.noSearchResultsMessage=R,this.onStateChange=z,this.options=L,this.optionsLimit=Y,this.originalOptions=JSON.parse(JSON.stringify(L)),this.placeholder=B,this.position=F,this.searchableOptionFields=Array.isArray(Q)?Q:["label"],this.searchDebounce=V,this.searchingMessage=X,this.searchPrompt=T,this.state=et,this.statePath=ee,this.activeSearchId=0,this.labelRepository={},this.isOpen=!1,this.selectedIndex=-1,this.searchQuery="",this.searchTimeout=null,this.isSearching=!1,this.selectedDisplayVersion=0,this.render(),this.setUpEventListeners(),this.isAutofocused&&this.selectButton.focus()}populateLabelRepositoryFromOptions(t){if(!(!t||!Array.isArray(t)))for(let e of t)e.options&&Array.isArray(e.options)?this.populateLabelRepositoryFromOptions(e.options):e.value!==void 0&&e.label!==void 0&&(this.labelRepository[e.value]=e.label)}render(){this.populateLabelRepositoryFromOptions(this.options),this.container=document.createElement("div"),this.container.className="fi-select-input-ctn",this.canOptionLabelsWrap||this.container.classList.add("fi-select-input-ctn-option-labels-not-wrapped"),this.container.setAttribute("aria-haspopup","listbox"),this.selectButton=document.createElement("button"),this.selectButton.className="fi-select-input-btn",this.selectButton.type="button",this.selectButton.setAttribute("aria-expanded","false"),this.selectedDisplay=document.createElement("div"),this.selectedDisplay.className="fi-select-input-value-ctn",this.updateSelectedDisplay(),this.selectButton.appendChild(this.selectedDisplay),this.dropdown=document.createElement("div"),this.dropdown.className="fi-dropdown-panel fi-scrollable",this.dropdown.setAttribute("role","listbox"),this.dropdown.setAttribute("tabindex","-1"),this.dropdown.style.display="none",this.dropdownId=`fi-select-input-dropdown-${Math.random().toString(36).substring(2,11)}`,this.dropdown.id=this.dropdownId,this.isMultiple&&this.dropdown.setAttribute("aria-multiselectable","true"),this.isSearchable&&(this.searchContainer=document.createElement("div"),this.searchContainer.className="fi-select-input-search-ctn",this.searchInput=document.createElement("input"),this.searchInput.className="fi-input",this.searchInput.type="text",this.searchInput.placeholder=this.searchPrompt,this.searchInput.setAttribute("aria-label","Search"),this.searchContainer.appendChild(this.searchInput),this.dropdown.appendChild(this.searchContainer),this.searchInput.addEventListener("input",t=>{this.isDisabled||this.handleSearch(t)}),this.searchInput.addEventListener("keydown",t=>{if(!this.isDisabled){if(t.key==="Tab"){t.preventDefault();let e=this.getVisibleOptions();if(e.length===0)return;t.shiftKey?this.selectedIndex=e.length-1:this.selectedIndex=0,e.forEach(i=>{i.classList.remove("fi-selected")}),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus()}else if(t.key==="ArrowDown"){if(t.preventDefault(),t.stopPropagation(),this.getVisibleOptions().length===0)return;this.selectedIndex=-1,this.searchInput.blur(),this.focusNextOption()}else if(t.key==="ArrowUp"){t.preventDefault(),t.stopPropagation();let e=this.getVisibleOptions();if(e.length===0)return;this.selectedIndex=e.length-1,this.searchInput.blur(),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus(),e[this.selectedIndex].id&&this.dropdown.setAttribute("aria-activedescendant",e[this.selectedIndex].id),this.scrollOptionIntoView(e[this.selectedIndex])}else if(t.key==="Enter"){if(t.preventDefault(),t.stopPropagation(),this.isSearching)return;let e=this.getVisibleOptions();if(e.length===0)return;let i=e.find(s=>{let r=s.getAttribute("aria-disabled")==="true",a=s.classList.contains("fi-disabled"),l=s.offsetParent===null;return!(r||a||l)});if(!i)return;let o=i.getAttribute("data-value");if(o===null)return;this.selectOption(o)}}})),this.optionsList=document.createElement("ul"),this.renderOptions(),this.container.appendChild(this.selectButton),this.container.appendChild(this.dropdown),this.element.appendChild(this.container),this.applyDisabledState()}renderOptions(){this.optionsList.innerHTML="";let t=0,e=this.options,i=0,o=!1;this.options.forEach(a=>{a.options&&Array.isArray(a.options)?(i+=a.options.length,o=!0):i++}),o?this.optionsList.className="fi-select-input-options-ctn":i>0&&(this.optionsList.className="fi-dropdown-list");let s=o?null:this.optionsList,r=0;for(let a of e){if(this.optionsLimit&&r>=this.optionsLimit)break;if(a.options&&Array.isArray(a.options)){let l=a.options;if(this.isMultiple&&Array.isArray(this.state)&&this.state.length>0&&(l=a.options.filter(c=>!this.state.includes(c.value))),l.length>0){if(this.optionsLimit){let c=this.optionsLimit-r;c{let a=this.createOptionElement(r.value,r);s.appendChild(a)}),i.appendChild(o),i.appendChild(s),this.optionsList.appendChild(i)}createOptionElement(t,e){let i=t,o=e,s=!1;typeof e=="object"&&e!==null&&"label"in e&&"value"in e&&(i=e.value,o=e.label,s=e.isDisabled||!1);let r=document.createElement("li");r.className="fi-dropdown-list-item fi-select-input-option",s&&r.classList.add("fi-disabled");let a=`fi-select-input-option-${Math.random().toString(36).substring(2,11)}`;if(r.id=a,r.setAttribute("role","option"),r.setAttribute("data-value",i),r.setAttribute("tabindex","0"),s&&r.setAttribute("aria-disabled","true"),this.isHtmlAllowed&&typeof o=="string"){let f=document.createElement("div");f.innerHTML=o;let d=f.textContent||f.innerText||o;r.setAttribute("aria-label",d)}let l=this.isMultiple?Array.isArray(this.state)&&this.state.includes(i):this.state===i;r.setAttribute("aria-selected",l?"true":"false"),l&&r.classList.add("fi-selected");let c=document.createElement("span");return this.isHtmlAllowed?c.innerHTML=o:c.textContent=o,r.appendChild(c),s||r.addEventListener("click",f=>{f.preventDefault(),f.stopPropagation(),this.selectOption(i),this.isMultiple&&(this.isSearchable&&this.searchInput?setTimeout(()=>{this.searchInput.focus()},0):setTimeout(()=>{r.focus()},0))}),r}async updateSelectedDisplay(){this.selectedDisplayVersion=this.selectedDisplayVersion+1;let t=this.selectedDisplayVersion,e=document.createDocumentFragment();if(this.isMultiple){if(!Array.isArray(this.state)||this.state.length===0){let o=document.createElement("span");o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o)}else{let o=await this.getLabelsForMultipleSelection();if(t!==this.selectedDisplayVersion)return;this.addBadgesForSelectedOptions(o,e)}t===this.selectedDisplayVersion&&(this.selectedDisplay.replaceChildren(e),this.isOpen&&this.positionDropdown());return}if(this.state===null||this.state===""){let o=document.createElement("span");if(o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o),t===this.selectedDisplayVersion){this.selectedDisplay.replaceChildren(e);let s=this.container.querySelector(".fi-select-input-value-remove-btn");s&&s.remove(),this.container.classList.remove("fi-select-input-ctn-clearable")}return}let i=await this.getLabelForSingleSelection();t===this.selectedDisplayVersion&&(this.addSingleSelectionDisplay(i,e),t===this.selectedDisplayVersion&&this.selectedDisplay.replaceChildren(e))}async getLabelsForMultipleSelection(){let t=this.getSelectedOptionLabels(),e=[];if(Array.isArray(this.state)){for(let o of this.state)if(!P(this.labelRepository[o])){if(P(t[o])){this.labelRepository[o]=t[o];continue}e.push(o.toString())}}if(e.length>0&&P(this.initialOptionLabels)&&JSON.stringify(this.state)===JSON.stringify(this.initialState)){if(Array.isArray(this.initialOptionLabels))for(let o of this.initialOptionLabels)P(o)&&o.value!==void 0&&o.label!==void 0&&e.includes(o.value)&&(this.labelRepository[o.value]=o.label)}else if(e.length>0&&this.getOptionLabelsUsing)try{let o=await this.getOptionLabelsUsing();for(let s of o)P(s)&&s.value!==void 0&&s.label!==void 0&&(this.labelRepository[s.value]=s.label)}catch(o){console.error("Error fetching option labels:",o)}let i=[];if(Array.isArray(this.state))for(let o of this.state)P(this.labelRepository[o])?i.push(this.labelRepository[o]):P(t[o])?i.push(t[o]):i.push(o);return i}createBadgeElement(t,e){let i=document.createElement("span");i.className="fi-badge fi-size-md fi-color fi-color-primary fi-text-color-600 dark:fi-text-color-200",P(t)&&i.setAttribute("data-value",t);let o=document.createElement("span");o.className="fi-badge-label-ctn";let s=document.createElement("span");s.className="fi-badge-label",this.canOptionLabelsWrap&&s.classList.add("fi-wrapped"),this.isHtmlAllowed?s.innerHTML=e:s.textContent=e,o.appendChild(s),i.appendChild(o);let r=this.createRemoveButton(t,e);return i.appendChild(r),i}createRemoveButton(t,e){let i=document.createElement("button");return i.type="button",i.className="fi-badge-delete-btn",i.innerHTML='',i.setAttribute("aria-label","Remove "+(this.isHtmlAllowed?e.replace(/<[^>]*>/g,""):e)),i.addEventListener("click",o=>{o.stopPropagation(),P(t)&&this.selectOption(t)}),i.addEventListener("keydown",o=>{(o.key===" "||o.key==="Enter")&&(o.preventDefault(),o.stopPropagation(),P(t)&&this.selectOption(t))}),i}addBadgesForSelectedOptions(t,e=this.selectedDisplay){let i=document.createElement("div");i.className="fi-select-input-value-badges-ctn",t.forEach((o,s)=>{let r=Array.isArray(this.state)?this.state[s]:null,a=this.createBadgeElement(r,o);i.appendChild(a)}),e.appendChild(i),this.isReorderable&&(i.addEventListener("click",o=>{o.stopPropagation()}),i.addEventListener("mousedown",o=>{o.stopPropagation()}),new Ui(i,{animation:150,onEnd:()=>{let o=[];i.querySelectorAll("[data-value]").forEach(s=>{o.push(s.getAttribute("data-value"))}),this.state=o,this.onStateChange(this.state)}}))}async getLabelForSingleSelection(){let t=this.labelRepository[this.state];if(bt(t)&&(t=this.getSelectedOptionLabel(this.state)),bt(t)&&P(this.initialOptionLabel)&&this.state===this.initialState)t=this.initialOptionLabel,P(this.state)&&(this.labelRepository[this.state]=t);else if(bt(t)&&this.getOptionLabelUsing)try{t=await this.getOptionLabelUsing(),P(t)&&P(this.state)&&(this.labelRepository[this.state]=t)}catch(e){console.error("Error fetching option label:",e),t=this.state}else bt(t)&&(t=this.state);return t}addSingleSelectionDisplay(t,e=this.selectedDisplay){let i=document.createElement("span");if(i.className="fi-select-input-value-label",this.isHtmlAllowed?i.innerHTML=t:i.textContent=t,e.appendChild(i),!this.canSelectPlaceholder||this.container.querySelector(".fi-select-input-value-remove-btn"))return;let o=document.createElement("button");o.type="button",o.className="fi-select-input-value-remove-btn",o.innerHTML='',o.setAttribute("aria-label","Clear selection"),o.addEventListener("click",s=>{s.stopPropagation(),this.selectOption("")}),o.addEventListener("keydown",s=>{(s.key===" "||s.key==="Enter")&&(s.preventDefault(),s.stopPropagation(),this.selectOption(""))}),this.container.appendChild(o),this.container.classList.add("fi-select-input-ctn-clearable")}getSelectedOptionLabel(t){if(P(this.labelRepository[t]))return this.labelRepository[t];let e="";for(let i of this.options)if(i.options&&Array.isArray(i.options)){for(let o of i.options)if(o.value===t){e=o.label,this.labelRepository[t]=e;break}}else if(i.value===t){e=i.label,this.labelRepository[t]=e;break}return e}setUpEventListeners(){this.buttonClickListener=()=>{this.toggleDropdown()},this.documentClickListener=t=>{!this.container.contains(t.target)&&this.isOpen&&this.closeDropdown()},this.buttonKeydownListener=t=>{this.isDisabled||this.handleSelectButtonKeydown(t)},this.dropdownKeydownListener=t=>{this.isDisabled||this.isSearchable&&document.activeElement===this.searchInput&&!["Tab","Escape"].includes(t.key)||this.handleDropdownKeydown(t)},this.selectButton.addEventListener("click",this.buttonClickListener),document.addEventListener("click",this.documentClickListener),this.selectButton.addEventListener("keydown",this.buttonKeydownListener),this.dropdown.addEventListener("keydown",this.dropdownKeydownListener),!this.isMultiple&&this.livewireId&&this.statePath&&this.getOptionLabelUsing&&(this.refreshOptionLabelListener=async t=>{if(t.detail.livewireId===this.livewireId&&t.detail.statePath===this.statePath&&P(this.state))try{delete this.labelRepository[this.state];let e=await this.getOptionLabelUsing();P(e)&&(this.labelRepository[this.state]=e);let i=this.selectedDisplay.querySelector(".fi-select-input-value-label");P(i)&&(this.isHtmlAllowed?i.innerHTML=e:i.textContent=e),this.updateOptionLabelInList(this.state,e)}catch(e){console.error("Error refreshing option label:",e)}},window.addEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener))}updateOptionLabelInList(t,e){this.labelRepository[t]=e;let i=this.getVisibleOptions();for(let o of i)if(o.getAttribute("data-value")===String(t)){if(o.innerHTML="",this.isHtmlAllowed){let s=document.createElement("span");s.innerHTML=e,o.appendChild(s)}else o.appendChild(document.createTextNode(e));break}for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}for(let o of this.originalOptions)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}}handleSelectButtonKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusNextOption():this.openDropdown();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusPreviousOption():this.openDropdown();break;case" ":if(t.preventDefault(),this.isOpen){if(this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}}else this.openDropdown();break;case"Enter":break;case"Escape":this.isOpen&&(t.preventDefault(),this.closeDropdown());break;case"Tab":this.isOpen&&this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.isOpen||this.openDropdown(),this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}handleDropdownKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.focusNextOption();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.focusPreviousOption();break;case" ":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}break;case"Enter":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}else{let e=this.element.closest("form");e&&e.submit()}break;case"Escape":t.preventDefault(),this.closeDropdown(),this.selectButton.focus();break;case"Tab":this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}toggleDropdown(){if(!this.isDisabled){if(this.isOpen){this.closeDropdown();return}this.isMultiple&&!this.isSearchable&&!this.hasAvailableOptions()||this.openDropdown()}}hasAvailableOptions(){for(let t of this.options)if(t.options&&Array.isArray(t.options)){for(let e of t.options)if(!Array.isArray(this.state)||!this.state.includes(e.value))return!0}else if(!Array.isArray(this.state)||!this.state.includes(t.value))return!0;return!1}async openDropdown(){this.dropdown.style.display="block",this.dropdown.style.opacity="0";let t=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;if(this.dropdown.style.position=t?"fixed":"absolute",this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.selectButton.setAttribute("aria-expanded","true"),this.isOpen=!0,this.positionDropdown(),this.resizeListener||(this.resizeListener=()=>{this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.positionDropdown()},window.addEventListener("resize",this.resizeListener)),this.scrollListener||(this.scrollListener=()=>this.positionDropdown(),window.addEventListener("scroll",this.scrollListener,!0)),this.dropdown.style.opacity="1",this.isSearchable&&this.searchInput&&(this.searchInput.value="",this.searchQuery="",this.hasDynamicOptions||(this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())),this.hasDynamicOptions&&this.getOptionsUsing){this.showLoadingState(!1);try{let e=await this.getOptionsUsing(),i=Array.isArray(e)?e:e&&Array.isArray(e.options)?e.options:[];if(this.options=i,this.originalOptions=JSON.parse(JSON.stringify(i)),this.populateLabelRepositoryFromOptions(i),this.isSearchable&&this.searchInput&&(this.searchInput.value&&this.searchInput.value.trim()!==""||this.searchQuery&&this.searchQuery.trim()!=="")){let o=(this.searchInput.value||this.searchQuery||"").trim().toLowerCase();this.hideLoadingState(),this.filterOptions(o)}else this.renderOptions()}catch(e){console.error("Error fetching options:",e),this.hideLoadingState()}}else(!this.hasInitialNoOptionsMessage||this.searchQuery)&&this.hideLoadingState();if(this.isSearchable&&this.searchInput)this.searchInput.focus();else{this.selectedIndex=-1;let e=this.getVisibleOptions();if(this.isMultiple){if(Array.isArray(this.state)&&this.state.length>0){for(let i=0;i0&&(this.selectedIndex=0),this.selectedIndex>=0&&(e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus())}}positionDropdown(){let t=this.position==="top"?"top-start":"bottom-start",e=[wi(4),Si({padding:5})];this.position!=="top"&&this.position!=="bottom"&&e.push(xi());let i=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;Ei(this.selectButton,this.dropdown,{placement:t,middleware:e,strategy:i?"fixed":"absolute"}).then(({x:o,y:s})=>{Object.assign(this.dropdown.style,{left:`${o}px`,top:`${s}px`})})}closeDropdown(){this.dropdown.style.display="none",this.selectButton.setAttribute("aria-expanded","false"),this.isOpen=!1,this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.activeSearchId++,this.isSearching=!1,this.hideLoadingState(),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.getVisibleOptions().forEach(e=>{e.classList.remove("fi-selected")}),this.dropdown.removeAttribute("aria-activedescendant")}focusNextOption(){let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex>=0&&this.selectedIndex=0&&this.selectedIndexe.bottom?this.dropdown.scrollTop+=i.bottom-e.bottom:i.top li[role="option"]')):t=Array.from(this.optionsList.querySelectorAll(':scope > ul.fi-dropdown-list > li[role="option"]'));let e=Array.from(this.optionsList.querySelectorAll('li.fi-select-input-option-group > ul > li[role="option"]'));return[...t,...e]}getSelectedOptionLabels(){if(!Array.isArray(this.state)||this.state.length===0)return{};let t={};for(let e of this.state){let i=!1;for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===e){t[e]=s.label,i=!0;break}if(i)break}else if(o.value===e){t[e]=o.label,i=!0;break}}return t}handleSearch(t){let e=t.target.value.trim();if(this.searchQuery=e,this.searchTimeout&&clearTimeout(this.searchTimeout),e===""){this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions();return}if(!this.getSearchResultsUsing||typeof this.getSearchResultsUsing!="function"||!this.hasDynamicSearchResults){this.filterOptions(e);return}this.searchTimeout=setTimeout(async()=>{this.searchTimeout=null;let i=++this.activeSearchId;this.isSearching=!0;try{this.showLoadingState(!0);let o=await this.getSearchResultsUsing(e);if(i!==this.activeSearchId||!this.isOpen)return;let s=Array.isArray(o)?o:o&&Array.isArray(o.options)?o.options:[];this.options=s,this.populateLabelRepositoryFromOptions(s),this.hideLoadingState(),this.renderOptions(),this.isOpen&&this.positionDropdown(),this.options.length===0&&this.showNoResultsMessage()}catch(o){i===this.activeSearchId&&(console.error("Error fetching search results:",o),this.hideLoadingState(),this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())}finally{i===this.activeSearchId&&(this.isSearching=!1)}},this.searchDebounce)}showLoadingState(t=!1){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let e=document.createElement("div");e.className="fi-select-input-message",e.textContent=t?this.searchingMessage:this.loadingMessage,this.dropdown.appendChild(e)}hideLoadingState(){let t=this.dropdown.querySelector(".fi-select-input-message");t&&t.remove()}showNoOptionsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noOptionsMessage,this.dropdown.appendChild(t)}showNoResultsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noSearchResultsMessage,this.dropdown.appendChild(t)}filterOptions(t){let e=this.searchableOptionFields.includes("label"),i=this.searchableOptionFields.includes("value");t=t.toLowerCase();let o=[];for(let s of this.originalOptions)if(s.options&&Array.isArray(s.options)){let r=s.options.filter(a=>e&&a.label.toLowerCase().includes(t)||i&&String(a.value).toLowerCase().includes(t));r.length>0&&o.push({label:s.label,options:r})}else(e&&s.label.toLowerCase().includes(t)||i&&String(s.value).toLowerCase().includes(t))&&o.push(s);this.options=o,this.renderOptions(),this.options.length===0&&this.showNoResultsMessage(),this.isOpen&&this.positionDropdown()}selectOption(t){if(this.isDisabled)return;if(!this.isMultiple){this.state=t,this.updateSelectedDisplay(),this.renderOptions(),this.closeDropdown(),this.selectButton.focus(),this.onStateChange(this.state);return}let e=Array.isArray(this.state)?[...this.state]:[];if(e.includes(t)){let o=this.selectedDisplay.querySelector(`[data-value="${t}"]`);if(P(o)){let s=o.parentElement;P(s)&&s.children.length===1?(e=e.filter(r=>r!==t),this.state=e,this.updateSelectedDisplay()):(o.remove(),e=e.filter(r=>r!==t),this.state=e)}else e=e.filter(s=>s!==t),this.state=e,this.updateSelectedDisplay();this.renderOptions(),this.isOpen&&this.positionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state);return}if(this.maxItems&&e.length>=this.maxItems){this.maxItemsMessage&&alert(this.maxItemsMessage);return}e.push(t),this.state=e;let i=this.selectedDisplay.querySelector(".fi-select-input-value-badges-ctn");bt(i)?this.updateSelectedDisplay():this.addSingleBadge(t,i),this.renderOptions(),this.isOpen&&this.positionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state)}async addSingleBadge(t,e){let i=this.labelRepository[t];if(bt(i)&&(i=this.getSelectedOptionLabel(t),P(i)&&(this.labelRepository[t]=i)),bt(i)&&this.getOptionLabelsUsing)try{let s=await this.getOptionLabelsUsing();for(let r of s)if(P(r)&&r.value===t&&r.label!==void 0){i=r.label,this.labelRepository[t]=i;break}}catch(s){console.error("Error fetching option label:",s)}bt(i)&&(i=t);let o=this.createBadgeElement(t,i);e.appendChild(o)}maintainFocusInMultipleMode(){if(this.isSearchable&&this.searchInput){this.searchInput.focus();return}let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex=-1,Array.isArray(this.state)&&this.state.length>0){for(let e=0;e{e.setAttribute("disabled","disabled"),e.classList.add("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.setAttribute("disabled","disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.setAttribute("disabled","disabled"),this.searchInput.classList.add("fi-disabled"))}else{if(this.selectButton.removeAttribute("disabled"),this.selectButton.removeAttribute("aria-disabled"),this.selectButton.classList.remove("fi-disabled"),this.isMultiple&&this.container.querySelectorAll(".fi-select-input-badge-remove").forEach(e=>{e.removeAttribute("disabled"),e.classList.remove("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.removeAttribute("disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.removeAttribute("disabled"),this.searchInput.classList.remove("fi-disabled"))}}destroy(){this.selectButton&&this.buttonClickListener&&this.selectButton.removeEventListener("click",this.buttonClickListener),this.documentClickListener&&document.removeEventListener("click",this.documentClickListener),this.selectButton&&this.buttonKeydownListener&&this.selectButton.removeEventListener("keydown",this.buttonKeydownListener),this.dropdown&&this.dropdownKeydownListener&&this.dropdown.removeEventListener("keydown",this.dropdownKeydownListener),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.refreshOptionLabelListener&&window.removeEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener),this.isOpen&&this.closeDropdown(),this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.container&&this.container.remove()}};function Qn({canOptionLabelsWrap:n,canSelectPlaceholder:t,getOptionLabelUsing:e,getOptionsUsing:i,getSearchResultsUsing:o,hasDynamicOptions:s,hasDynamicSearchResults:r,hasInitialNoOptionsMessage:a,initialOptionLabel:l,isDisabled:c,isHtmlAllowed:f,isNative:d,isSearchable:p,loadingMessage:u,name:g,noOptionsMessage:m,noSearchResultsMessage:S,options:O,optionsLimit:w,placeholder:D,position:A,recordKey:C,searchableOptionFields:H,searchDebounce:q,searchingMessage:J,searchPrompt:R,state:z}){return{error:void 0,isLoading:!1,select:null,state:z,unsubscribeLivewireHook:null,init(){d||(this.select=new Oe({canOptionLabelsWrap:n,canSelectPlaceholder:t,element:this.$refs.select,getOptionLabelUsing:e,getOptionsUsing:i,getSearchResultsUsing:o,hasDynamicOptions:s,hasDynamicSearchResults:r,hasInitialNoOptionsMessage:a,initialOptionLabel:l,isDisabled:c,isHtmlAllowed:f,isSearchable:p,loadingMessage:u,noOptionsMessage:m,noSearchResultsMessage:S,onStateChange:L=>{this.state=L},options:O,optionsLimit:w,placeholder:D,position:A,searchableOptionFields:H,searchDebounce:q,searchingMessage:J,searchPrompt:R,state:this.state})),this.unsubscribeLivewireHook=Livewire.hook("commit",({component:L,commit:Y,succeed:B,fail:F,respond:Q})=>{B(({snapshot:V,effect:X})=>{this.$nextTick(()=>{if(this.isLoading||L.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let T=this.getServerState();T===void 0||this.getNormalizedState()===T||(this.state=T)})})}),this.$watch("state",async L=>{!d&&this.select&&this.select.state!==L&&(this.select.state=L,this.select.updateSelectedDisplay(),this.select.renderOptions());let Y=this.getServerState();if(Y===void 0||this.getNormalizedState()===Y)return;this.isLoading=!0;let B=await this.$wire.updateTableColumnState(g,C,this.state);this.error=B?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.getNormalizedState()),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[null,void 0].includes(this.$refs.serverState.value)?"":this.$refs.serverState.value.replaceAll('\\"','"')},getNormalizedState(){let L=Alpine.raw(this.state);return[null,void 0].includes(L)?"":L},destroy(){this.unsubscribeLivewireHook?.(),this.select&&(this.select.destroy(),this.select=null)}}}export{Qn as default}; +/*! Bundled license information: + +sortablejs/modular/sortable.esm.js: + (**! + * Sortable 1.15.6 + * @author RubaXa + * @author owenm + * @license MIT + *) +*/ diff --git a/public/js/filament/tables/components/columns/text-input.js b/public/js/filament/tables/components/columns/text-input.js new file mode 100644 index 0000000000..4e25807200 --- /dev/null +++ b/public/js/filament/tables/components/columns/text-input.js @@ -0,0 +1 @@ +function o({name:i,recordKey:s,state:n}){return{error:void 0,isLoading:!1,state:n,unsubscribeLivewireHook:null,init(){this.unsubscribeLivewireHook=Livewire.hook("commit",({component:e,commit:r,succeed:a,fail:u,respond:d})=>{a(({snapshot:h,effect:l})=>{this.$nextTick(()=>{if(this.isLoading||e.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let t=this.getServerState();t===void 0||this.getNormalizedState()===t||(this.state=t)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||this.getNormalizedState()===e)return;this.isLoading=!0;let r=await this.$wire.updateTableColumnState(i,s,this.state);this.error=r?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.getNormalizedState()),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[null,void 0].includes(this.$refs.serverState.value)?"":this.$refs.serverState.value.replaceAll('\\"','"')},getNormalizedState(){let e=Alpine.raw(this.state);return[null,void 0].includes(e)?"":e},destroy(){this.unsubscribeLivewireHook?.()}}}export{o as default}; diff --git a/public/js/filament/tables/components/columns/toggle.js b/public/js/filament/tables/components/columns/toggle.js new file mode 100644 index 0000000000..d6bb6e5dad --- /dev/null +++ b/public/js/filament/tables/components/columns/toggle.js @@ -0,0 +1 @@ +function o({name:r,recordKey:s,state:n}){return{error:void 0,isLoading:!1,state:n,unsubscribeLivewireHook:null,init(){this.unsubscribeLivewireHook=Livewire.hook("commit",({component:e,commit:i,succeed:a,fail:u,respond:h})=>{a(({snapshot:d,effect:f})=>{this.$nextTick(()=>{if(this.isLoading||e.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let t=this.getServerState();t===void 0||Alpine.raw(this.state)===t||(this.state=t)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||Alpine.raw(this.state)===e)return;this.isLoading=!0;let i=await this.$wire.updateTableColumnState(r,s,this.state);this.error=i?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.state?"1":"0"),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[1,"1"].includes(this.$refs.serverState.value)},destroy(){this.unsubscribeLivewireHook?.()}}}export{o as default}; diff --git a/public/js/filament/tables/components/table.js b/public/js/filament/tables/components/table.js index ea16d85610..636a47825e 100644 --- a/public/js/filament/tables/components/table.js +++ b/public/js/filament/tables/components/table.js @@ -1 +1 @@ -function n(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(e,t=null){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableAction(e,t)},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){if(this.isLoading=!0,this.areRecordsSelected(this.getRecordsInGroupOnPage(e))){this.deselectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e));return}this.selectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e)),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)this.isRecordSelected(t)||this.selectedRecords.push(t)},deselectRecords:function(e){for(let t of e){let s=this.selectedRecords.indexOf(t);s!==-1&&this.selectedRecords.splice(s,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let o=s.indexOf(this.lastChecked),r=s.indexOf(t),l=[o,r].sort((i,d)=>i-d),c=[];for(let i=l[0];i<=l[1];i++)s[i].checked=t.checked,c.push(s[i].value);t.checked?this.selectRecords(c):this.deselectRecords(c)}this.lastChecked=t}}}export{n as default}; +function n(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:new Set,deselectedRecords:new Set,isTrackingDeselectedRecords:!1,shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(...e){this.$wire.set("isTrackingDeselectedTableRecords",this.isTrackingDeselectedRecords,!1),this.$wire.set("selectedTableRecords",[...this.selectedRecords],!1),this.$wire.set("deselectedTableRecords",[...this.deselectedRecords],!1),this.$wire.mountAction(...e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){if(this.isLoading=!0,this.areRecordsSelected(this.getRecordsInGroupOnPage(e))){this.deselectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e));return}this.selectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e)),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getSelectedRecordsCount:function(){return this.isTrackingDeselectedRecords?(this.$refs.allSelectableRecordsCount?.value??this.deselectedRecords.size)-this.deselectedRecords.size:this.selectedRecords.size},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)if(!this.isRecordSelected(t)){if(this.isTrackingDeselectedRecords){this.deselectedRecords.delete(t);continue}this.selectedRecords.add(t)}},deselectRecords:function(e){for(let t of e){if(this.isTrackingDeselectedRecords){this.deselectedRecords.add(t);continue}this.selectedRecords.delete(t)}},toggleSelectedRecord:function(e){if(this.isRecordSelected(e)){this.deselectRecords([e]);return}this.selectRecords([e])},selectAllRecords:async function(){this.isTrackingDeselectedRecords=!0,this.selectedRecords=new Set,this.deselectedRecords=new Set},deselectAllRecords:function(){this.isTrackingDeselectedRecords=!1,this.selectedRecords=new Set,this.deselectedRecords=new Set},isRecordSelected:function(e){return this.isTrackingDeselectedRecords?!this.deselectedRecords.has(e):this.selectedRecords.has(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let l=s.indexOf(this.lastChecked),r=s.indexOf(t),o=[l,r].sort((c,d)=>c-d),i=[];for(let c=o[0];c<=o[1];c++)s[c].checked=t.checked,i.push(s[c].value);t.checked?this.selectRecords(i):this.deselectRecords(i)}this.lastChecked=t}}}export{n as default}; diff --git a/public/js/filament/tables/tables.js b/public/js/filament/tables/tables.js new file mode 100644 index 0000000000..ed077fa76a --- /dev/null +++ b/public/js/filament/tables/tables.js @@ -0,0 +1 @@ +(()=>{var M=Math.min,L=Math.max,B=Math.round,H=Math.floor,S=e=>({x:e,y:e});function q(e,t,i){return L(e,M(t,i))}function j(e,t){return typeof e=="function"?e(t):e}function W(e){return e.split("-")[0]}function Q(e){return e.split("-")[1]}function Z(e){return e==="x"?"y":"x"}function oe(e){return e==="y"?"height":"width"}var Pe=new Set(["top","bottom"]);function z(e){return Pe.has(W(e))?"y":"x"}function se(e){return Z(z(e))}function De(e){return{top:0,right:0,bottom:0,left:0,...e}}function re(e){return typeof e!="number"?De(e):{top:e,right:e,bottom:e,left:e}}function E(e){let{x:t,y:i,width:n,height:s}=e;return{width:n,height:s,top:i,left:t,right:t+n,bottom:i+s,x:t,y:i}}function le(e,t,i){let{reference:n,floating:s}=e,l=z(t),o=se(t),r=oe(o),c=W(t),a=l==="y",f=n.x+n.width/2-s.width/2,d=n.y+n.height/2-s.height/2,h=n[r]/2-s[r]/2,u;switch(c){case"top":u={x:f,y:n.y-s.height};break;case"bottom":u={x:f,y:n.y+n.height};break;case"right":u={x:n.x+n.width,y:d};break;case"left":u={x:n.x-s.width,y:d};break;default:u={x:n.x,y:n.y}}switch(Q(t)){case"start":u[o]-=h*(i&&a?-1:1);break;case"end":u[o]+=h*(i&&a?-1:1);break}return u}var ce=async(e,t,i)=>{let{placement:n="bottom",strategy:s="absolute",middleware:l=[],platform:o}=i,r=l.filter(Boolean),c=await(o.isRTL==null?void 0:o.isRTL(t)),a=await o.getElementRects({reference:e,floating:t,strategy:s}),{x:f,y:d}=le(a,n,c),h=n,u={},m=0;for(let p=0;p{let{x:g,y:x}=w;return{x:g,y:x}}},...c}=j(e,t),a={x:i,y:n},f=await ae(t,c),d=z(W(s)),h=Z(d),u=a[h],m=a[d];if(l){let w=h==="y"?"top":"left",g=h==="y"?"bottom":"right",x=u+f[w],y=u-f[g];u=q(x,u,y)}if(o){let w=d==="y"?"top":"left",g=d==="y"?"bottom":"right",x=m+f[w],y=m-f[g];m=q(x,m,y)}let p=r.fn({...t,[h]:u,[d]:m});return{...p,data:{x:p.x-i,y:p.y-n,enabled:{[h]:l,[d]:o}}}}}};function X(){return typeof window<"u"}function P(e){return he(e)?(e.nodeName||"").toLowerCase():"#document"}function v(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function O(e){var t;return(t=(he(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function he(e){return X()?e instanceof Node||e instanceof v(e).Node:!1}function R(e){return X()?e instanceof Element||e instanceof v(e).Element:!1}function T(e){return X()?e instanceof HTMLElement||e instanceof v(e).HTMLElement:!1}function ue(e){return!X()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof v(e).ShadowRoot}var $e=new Set(["inline","contents"]);function N(e){let{overflow:t,overflowX:i,overflowY:n,display:s}=C(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+i)&&!$e.has(s)}var Ne=new Set(["table","td","th"]);function me(e){return Ne.has(P(e))}var Ve=[":popover-open",":modal"];function _(e){return Ve.some(t=>{try{return e.matches(t)}catch{return!1}})}var Be=["transform","translate","scale","rotate","perspective"],He=["transform","translate","scale","rotate","perspective","filter"],We=["paint","layout","strict","content"];function Y(e){let t=G(),i=R(e)?C(e):e;return Be.some(n=>i[n]?i[n]!=="none":!1)||(i.containerType?i.containerType!=="normal":!1)||!t&&(i.backdropFilter?i.backdropFilter!=="none":!1)||!t&&(i.filter?i.filter!=="none":!1)||He.some(n=>(i.willChange||"").includes(n))||We.some(n=>(i.contain||"").includes(n))}function ge(e){let t=k(e);for(;T(t)&&!D(t);){if(Y(t))return t;if(_(t))return null;t=k(t)}return null}function G(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var ze=new Set(["html","body","#document"]);function D(e){return ze.has(P(e))}function C(e){return v(e).getComputedStyle(e)}function I(e){return R(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function k(e){if(P(e)==="html")return e;let t=e.assignedSlot||e.parentNode||ue(e)&&e.host||O(e);return ue(t)?t.host:t}function pe(e){let t=k(e);return D(t)?e.ownerDocument?e.ownerDocument.body:e.body:T(t)&&N(t)?t:pe(t)}function $(e,t,i){var n;t===void 0&&(t=[]),i===void 0&&(i=!0);let s=pe(e),l=s===((n=e.ownerDocument)==null?void 0:n.body),o=v(s);if(l){let r=J(o);return t.concat(o,o.visualViewport||[],N(s)?s:[],r&&i?$(r):[])}return t.concat(s,$(s,[],i))}function J(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function be(e){let t=C(e),i=parseFloat(t.width)||0,n=parseFloat(t.height)||0,s=T(e),l=s?e.offsetWidth:i,o=s?e.offsetHeight:n,r=B(i)!==l||B(n)!==o;return r&&(i=l,n=o),{width:i,height:n,$:r}}function te(e){return R(e)?e:e.contextElement}function V(e){let t=te(e);if(!T(t))return S(1);let i=t.getBoundingClientRect(),{width:n,height:s,$:l}=be(t),o=(l?B(i.width):i.width)/n,r=(l?B(i.height):i.height)/s;return(!o||!Number.isFinite(o))&&(o=1),(!r||!Number.isFinite(r))&&(r=1),{x:o,y:r}}var _e=S(0);function ve(e){let t=v(e);return!G()||!t.visualViewport?_e:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Ie(e,t,i){return t===void 0&&(t=!1),!i||t&&i!==v(e)?!1:t}function F(e,t,i,n){t===void 0&&(t=!1),i===void 0&&(i=!1);let s=e.getBoundingClientRect(),l=te(e),o=S(1);t&&(n?R(n)&&(o=V(n)):o=V(e));let r=Ie(l,i,n)?ve(l):S(0),c=(s.left+r.x)/o.x,a=(s.top+r.y)/o.y,f=s.width/o.x,d=s.height/o.y;if(l){let h=v(l),u=n&&R(n)?v(n):n,m=h,p=J(m);for(;p&&n&&u!==m;){let w=V(p),g=p.getBoundingClientRect(),x=C(p),y=g.left+(p.clientLeft+parseFloat(x.paddingLeft))*w.x,A=g.top+(p.clientTop+parseFloat(x.paddingTop))*w.y;c*=w.x,a*=w.y,f*=w.x,d*=w.y,c+=y,a+=A,m=v(p),p=J(m)}}return E({width:f,height:d,x:c,y:a})}function K(e,t){let i=I(e).scrollLeft;return t?t.left+i:F(O(e)).left+i}function Re(e,t){let i=e.getBoundingClientRect(),n=i.left+t.scrollLeft-K(e,i),s=i.top+t.scrollTop;return{x:n,y:s}}function Ue(e){let{elements:t,rect:i,offsetParent:n,strategy:s}=e,l=s==="fixed",o=O(n),r=t?_(t.floating):!1;if(n===o||r&&l)return i;let c={scrollLeft:0,scrollTop:0},a=S(1),f=S(0),d=T(n);if((d||!d&&!l)&&((P(n)!=="body"||N(o))&&(c=I(n)),T(n))){let u=F(n);a=V(n),f.x=u.x+n.clientLeft,f.y=u.y+n.clientTop}let h=o&&!d&&!l?Re(o,c):S(0);return{width:i.width*a.x,height:i.height*a.y,x:i.x*a.x-c.scrollLeft*a.x+f.x+h.x,y:i.y*a.y-c.scrollTop*a.y+f.y+h.y}}function je(e){return Array.from(e.getClientRects())}function Xe(e){let t=O(e),i=I(e),n=e.ownerDocument.body,s=L(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),l=L(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight),o=-i.scrollLeft+K(e),r=-i.scrollTop;return C(n).direction==="rtl"&&(o+=L(t.clientWidth,n.clientWidth)-s),{width:s,height:l,x:o,y:r}}var we=25;function Ye(e,t){let i=v(e),n=O(e),s=i.visualViewport,l=n.clientWidth,o=n.clientHeight,r=0,c=0;if(s){l=s.width,o=s.height;let f=G();(!f||f&&t==="fixed")&&(r=s.offsetLeft,c=s.offsetTop)}let a=K(n);if(a<=0){let f=n.ownerDocument,d=f.body,h=getComputedStyle(d),u=f.compatMode==="CSS1Compat"&&parseFloat(h.marginLeft)+parseFloat(h.marginRight)||0,m=Math.abs(n.clientWidth-d.clientWidth-u);m<=we&&(l-=m)}else a<=we&&(l+=a);return{width:l,height:o,x:r,y:c}}var Ge=new Set(["absolute","fixed"]);function Je(e,t){let i=F(e,!0,t==="fixed"),n=i.top+e.clientTop,s=i.left+e.clientLeft,l=T(e)?V(e):S(1),o=e.clientWidth*l.x,r=e.clientHeight*l.y,c=s*l.x,a=n*l.y;return{width:o,height:r,x:c,y:a}}function xe(e,t,i){let n;if(t==="viewport")n=Ye(e,i);else if(t==="document")n=Xe(O(e));else if(R(t))n=Je(t,i);else{let s=ve(e);n={x:t.x-s.x,y:t.y-s.y,width:t.width,height:t.height}}return E(n)}function Ce(e,t){let i=k(e);return i===t||!R(i)||D(i)?!1:C(i).position==="fixed"||Ce(i,t)}function Ke(e,t){let i=t.get(e);if(i)return i;let n=$(e,[],!1).filter(r=>R(r)&&P(r)!=="body"),s=null,l=C(e).position==="fixed",o=l?k(e):e;for(;R(o)&&!D(o);){let r=C(o),c=Y(o);!c&&r.position==="fixed"&&(s=null),(l?!c&&!s:!c&&r.position==="static"&&!!s&&Ge.has(s.position)||N(o)&&!c&&Ce(e,o))?n=n.filter(f=>f!==o):s=r,o=k(o)}return t.set(e,n),n}function qe(e){let{element:t,boundary:i,rootBoundary:n,strategy:s}=e,o=[...i==="clippingAncestors"?_(t)?[]:Ke(t,this._c):[].concat(i),n],r=o[0],c=o.reduce((a,f)=>{let d=xe(t,f,s);return a.top=L(d.top,a.top),a.right=M(d.right,a.right),a.bottom=M(d.bottom,a.bottom),a.left=L(d.left,a.left),a},xe(t,r,s));return{width:c.right-c.left,height:c.bottom-c.top,x:c.left,y:c.top}}function Qe(e){let{width:t,height:i}=be(e);return{width:t,height:i}}function Ze(e,t,i){let n=T(t),s=O(t),l=i==="fixed",o=F(e,!0,l,t),r={scrollLeft:0,scrollTop:0},c=S(0);function a(){c.x=K(s)}if(n||!n&&!l)if((P(t)!=="body"||N(s))&&(r=I(t)),n){let u=F(t,!0,l,t);c.x=u.x+t.clientLeft,c.y=u.y+t.clientTop}else s&&a();l&&!n&&s&&a();let f=s&&!n&&!l?Re(s,r):S(0),d=o.left+r.scrollLeft-c.x-f.x,h=o.top+r.scrollTop-c.y-f.y;return{x:d,y:h,width:o.width,height:o.height}}function ee(e){return C(e).position==="static"}function ye(e,t){if(!T(e)||C(e).position==="fixed")return null;if(t)return t(e);let i=e.offsetParent;return O(e)===i&&(i=i.ownerDocument.body),i}function Ae(e,t){let i=v(e);if(_(e))return i;if(!T(e)){let s=k(e);for(;s&&!D(s);){if(R(s)&&!ee(s))return s;s=k(s)}return i}let n=ye(e,t);for(;n&&me(n)&&ee(n);)n=ye(n,t);return n&&D(n)&&ee(n)&&!Y(n)?i:n||ge(e)||i}var et=async function(e){let t=this.getOffsetParent||Ae,i=this.getDimensions,n=await i(e.floating);return{reference:Ze(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function tt(e){return C(e).direction==="rtl"}var nt={convertOffsetParentRelativeRectToViewportRelativeRect:Ue,getDocumentElement:O,getClippingRect:qe,getOffsetParent:Ae,getElementRects:et,getClientRects:je,getDimensions:Qe,getScale:V,isElement:R,isRTL:tt};function Se(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function it(e,t){let i=null,n,s=O(e);function l(){var r;clearTimeout(n),(r=i)==null||r.disconnect(),i=null}function o(r,c){r===void 0&&(r=!1),c===void 0&&(c=1),l();let a=e.getBoundingClientRect(),{left:f,top:d,width:h,height:u}=a;if(r||t(),!h||!u)return;let m=H(d),p=H(s.clientWidth-(f+h)),w=H(s.clientHeight-(d+u)),g=H(f),y={rootMargin:-m+"px "+-p+"px "+-w+"px "+-g+"px",threshold:L(0,M(1,c))||1},A=!0;function b(ie){let U=ie[0].intersectionRatio;if(U!==c){if(!A)return o();U?o(!1,U):n=setTimeout(()=>{o(!1,1e-7)},1e3)}U===1&&!Se(a,e.getBoundingClientRect())&&o(),A=!1}try{i=new IntersectionObserver(b,{...y,root:s.ownerDocument})}catch{i=new IntersectionObserver(b,y)}i.observe(e)}return o(!0),l}function Oe(e,t,i,n){n===void 0&&(n={});let{ancestorScroll:s=!0,ancestorResize:l=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:c=!1}=n,a=te(e),f=s||l?[...a?$(a):[],...$(t)]:[];f.forEach(g=>{s&&g.addEventListener("scroll",i,{passive:!0}),l&&g.addEventListener("resize",i)});let d=a&&r?it(a,i):null,h=-1,u=null;o&&(u=new ResizeObserver(g=>{let[x]=g;x&&x.target===a&&u&&(u.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame(()=>{var y;(y=u)==null||y.observe(t)})),i()}),a&&!c&&u.observe(a),u.observe(t));let m,p=c?F(e):null;c&&w();function w(){let g=F(e);p&&!Se(p,g)&&i(),p=g,m=requestAnimationFrame(w)}return i(),()=>{var g;f.forEach(x=>{s&&x.removeEventListener("scroll",i),l&&x.removeEventListener("resize",i)}),d?.(),(g=u)==null||g.disconnect(),u=null,c&&cancelAnimationFrame(m)}}var Te=fe;var Le=de;var ke=(e,t,i)=>{let n=new Map,s={platform:nt,...i},l={...s.platform,_c:n};return ce(e,t,{...s,platform:l})};var Ee=({areGroupsCollapsedByDefault:e,canTrackDeselectedRecords:t,currentSelectionLivewireProperty:i,maxSelectableRecords:n,selectsCurrentPageOnly:s,$wire:l})=>({areFiltersOpen:!1,checkboxClickController:null,groupVisibility:[],isLoading:!1,selectedRecords:new Set,deselectedRecords:new Set,isTrackingDeselectedRecords:!1,shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,entangledSelectedRecords:i?l.$entangle(i):null,cleanUpFiltersDropdown:null,unsubscribeLivewireHook:null,init(){this.livewireId=this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value,l.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),l.$on("scrollToTopOfTable",()=>this.$root.scrollIntoView({block:"start",inline:"nearest"})),i&&(n!==1?this.selectedRecords=new Set(this.entangledSelectedRecords):this.selectedRecords=new Set(this.entangledSelectedRecords?[this.entangledSelectedRecords]:[])),this.$nextTick(()=>this.watchForCheckboxClicks()),this.unsubscribeLivewireHook=Livewire.hook("element.init",({component:o})=>{o.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction(...o){l.set("isTrackingDeselectedTableRecords",this.isTrackingDeselectedRecords,!1),l.set("selectedTableRecords",[...this.selectedRecords],!1),l.set("deselectedTableRecords",[...this.deselectedRecords],!1),l.mountAction(...o)},toggleSelectRecordsOnPage(){let o=this.getRecordsOnPage();if(this.areRecordsSelected(o)){this.deselectRecords(o);return}this.selectRecords(o)},toggleSelectRecords(o){this.areRecordsSelected(o)?this.deselectRecords(o):this.selectRecords(o)},getSelectedRecordsCount(){return this.isTrackingDeselectedRecords?(this.$refs.allSelectableRecordsCount?.value??this.deselectedRecords.size)-this.deselectedRecords.size:this.selectedRecords.size},getRecordsOnPage(){let o=[];for(let r of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])o.push(r.value);return o},selectRecords(o){n===1&&(this.deselectAllRecords(),o=o.slice(0,1));for(let r of o)if(!this.isRecordSelected(r)){if(this.isTrackingDeselectedRecords){this.deselectedRecords.delete(r);continue}this.selectedRecords.add(r)}this.updatedSelectedRecords()},deselectRecords(o){for(let r of o){if(this.isTrackingDeselectedRecords){this.deselectedRecords.add(r);continue}this.selectedRecords.delete(r)}this.updatedSelectedRecords()},updatedSelectedRecords(){if(n!==1){this.entangledSelectedRecords=[...this.selectedRecords];return}this.entangledSelectedRecords=[...this.selectedRecords][0]??null},toggleSelectedRecord(o){if(this.isRecordSelected(o)){this.deselectRecords([o]);return}this.selectRecords([o])},async selectAllRecords(){if(!t||s){this.isLoading=!0,this.selectedRecords=new Set(await l.getAllSelectableTableRecordKeys()),this.updatedSelectedRecords(),this.isLoading=!1;return}this.isTrackingDeselectedRecords=!0,this.selectedRecords=new Set,this.deselectedRecords=new Set,this.updatedSelectedRecords()},canSelectAllRecords(){if(s){let c=this.getRecordsOnPage();return!this.areRecordsSelected(c)&&this.areRecordsToggleable(c)}let o=parseInt(this.$refs.allSelectableRecordsCount?.value);if(!o)return!1;let r=this.getSelectedRecordsCount();return o===r?!1:n===null||o<=n},deselectAllRecords(){this.isTrackingDeselectedRecords=!1,this.selectedRecords=new Set,this.deselectedRecords=new Set,this.updatedSelectedRecords()},isRecordSelected(o){return this.isTrackingDeselectedRecords?!this.deselectedRecords.has(o):this.selectedRecords.has(o)},areRecordsSelected(o){return o.every(r=>this.isRecordSelected(r))},areRecordsToggleable(o){if(n===null||n===1)return!0;let r=o.filter(c=>this.isRecordSelected(c));return r.length===o.length?!0:this.getSelectedRecordsCount()+(o.length-r.length)<=n},toggleCollapseGroup(o){this.isGroupCollapsed(o)?e?this.groupVisibility.push(o):this.groupVisibility.splice(this.groupVisibility.indexOf(o),1):e?this.groupVisibility.splice(this.groupVisibility.indexOf(o),1):this.groupVisibility.push(o)},isGroupCollapsed(o){return e?!this.groupVisibility.includes(o):this.groupVisibility.includes(o)},resetCollapsedGroups(){this.groupVisibility=[]},watchForCheckboxClicks(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:o}=this.checkboxClickController;this.$root?.addEventListener("click",r=>r.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(r,r.target),{signal:o})},handleCheckboxClick(o,r){if(!this.lastChecked){this.lastChecked=r;return}if(o.shiftKey){let c=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!c.includes(this.lastChecked)){this.lastChecked=r;return}let a=c.indexOf(this.lastChecked),f=c.indexOf(r),d=[a,f].sort((u,m)=>u-m),h=[];for(let u=d[0];u<=d[1];u++)h.push(c[u].value);if(r.checked){if(!this.areRecordsToggleable(h)){r.checked=!1,this.deselectRecords([r.value]);return}this.selectRecords(h)}else this.deselectRecords(h)}this.lastChecked=r},toggleFiltersDropdown(){if(this.areFiltersOpen=!this.areFiltersOpen,this.areFiltersOpen){let o=Oe(this.$refs.filtersTriggerActionContainer,this.$refs.filtersContentContainer,async()=>{let{x:a,y:f}=await ke(this.$refs.filtersTriggerActionContainer,this.$refs.filtersContentContainer,{placement:"bottom-end",middleware:[Te(8),Le({padding:8})]});Object.assign(this.$refs.filtersContentContainer.style,{left:`${a}px`,top:`${f}px`})}),r=a=>{let f=this.$refs.filtersTriggerActionContainer,d=this.$refs.filtersContentContainer;d&&d.contains(a.target)||f&&f.contains(a.target)||(this.areFiltersOpen=!1,this.cleanUpFiltersDropdown&&(this.cleanUpFiltersDropdown(),this.cleanUpFiltersDropdown=null))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r,{passive:!0});let c=a=>{a.key==="Escape"&&r(a)};document.addEventListener("keydown",c),this.cleanUpFiltersDropdown=()=>{o(),document.removeEventListener("mousedown",r),document.removeEventListener("touchstart",r,{passive:!0}),document.removeEventListener("keydown",c)}}else this.cleanUpFiltersDropdown&&(this.cleanUpFiltersDropdown(),this.cleanUpFiltersDropdown=null)},destroy(){this.unsubscribeLivewireHook?.()}});function ne({columns:e,isLive:t}){return{error:void 0,isLoading:!1,deferredColumns:[],columns:e,isLive:t,hasReordered:!1,init(){if(!this.columns||this.columns.length===0){this.columns=[];return}this.deferredColumns=JSON.parse(JSON.stringify(this.columns)),this.$watch("columns",()=>{this.resetDeferredColumns()})},get groupedColumns(){let i={};return this.deferredColumns.filter(n=>n.type==="group").forEach(n=>{i[n.name]=this.calculateGroupedColumns(n)}),i},calculateGroupedColumns(i){if((i?.columns?.filter(r=>!r.isHidden)??[]).length===0)return{hidden:!0,checked:!1,disabled:!1,indeterminate:!1};let s=i.columns.filter(r=>!r.isHidden&&r.isToggleable!==!1);if(s.length===0)return{checked:!0,disabled:!0,indeterminate:!1};let l=s.filter(r=>r.isToggled).length,o=i.columns.filter(r=>!r.isHidden&&r.isToggleable===!1);return l===0&&o.length>0?{checked:!0,disabled:!1,indeterminate:!0}:l===0?{checked:!1,disabled:!1,indeterminate:!1}:l===s.length?{checked:!0,disabled:!1,indeterminate:!1}:{checked:!0,disabled:!1,indeterminate:!0}},getColumn(i,n=null){return n?this.deferredColumns.find(l=>l.type==="group"&&l.name===n)?.columns?.find(l=>l.name===i):this.deferredColumns.find(s=>s.name===i)},toggleGroup(i){let n=this.deferredColumns.find(c=>c.type==="group"&&c.name===i);if(!n?.columns)return;let s=this.calculateGroupedColumns(n);if(s.disabled)return;let o=n.columns.filter(c=>c.isToggleable!==!1).some(c=>c.isToggled),r=s.indeterminate?!0:!o;n.columns.filter(c=>c.isToggleable!==!1).forEach(c=>{c.isToggled=r}),this.deferredColumns=[...this.deferredColumns],this.isLive&&this.applyTableColumnManager()},toggleColumn(i,n=null){let s=this.getColumn(i,n);!s||s.isToggleable===!1||(s.isToggled=!s.isToggled,this.deferredColumns=[...this.deferredColumns],this.isLive&&this.applyTableColumnManager())},reorderColumns(i){let n=i.map(s=>s.split("::"));this.reorderTopLevel(n),this.hasReordered=!0,this.isLive&&this.applyTableColumnManager()},reorderGroupColumns(i,n){let s=this.deferredColumns.find(r=>r.type==="group"&&r.name===n);if(!s)return;let l=i.map(r=>r.split("::")),o=[];l.forEach(([r,c])=>{let a=s.columns.find(f=>f.name===c);a&&o.push(a)}),s.columns=o,this.deferredColumns=[...this.deferredColumns],this.hasReordered=!0,this.isLive&&this.applyTableColumnManager()},reorderTopLevel(i){let n=this.deferredColumns,s=[];i.forEach(([l,o])=>{let r=n.find(c=>l==="group"?c.type==="group"&&c.name===o:l==="column"?c.type!=="group"&&c.name===o:!1);r&&s.push(r)}),this.deferredColumns=s},async applyTableColumnManager(){this.isLoading=!0;try{this.columns=JSON.parse(JSON.stringify(this.deferredColumns)),await this.$wire.call("applyTableColumnManager",this.columns,this.hasReordered),this.hasReordered=!1,this.error=void 0}catch(i){this.error="Failed to update column visibility",console.error("Table toggle columns error:",i)}finally{this.isLoading=!1}},resetDeferredColumns(){this.deferredColumns=JSON.parse(JSON.stringify(this.columns)),this.hasReordered=!1}}}document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentTable",Ee),window.Alpine.data("filamentTableColumnManager",ne)});})(); diff --git a/public/js/filament/widgets/components/chart.js b/public/js/filament/widgets/components/chart.js index e7dd5bba9e..59b8a44eeb 100644 --- a/public/js/filament/widgets/components/chart.js +++ b/public/js/filament/widgets/components/chart.js @@ -1,29 +1,22 @@ -function At(){}var Do=function(){let s=0;return function(){return s++}}();function N(s){return s===null||typeof s>"u"}function $(s){if(Array.isArray&&Array.isArray(s))return!0;let t=Object.prototype.toString.call(s);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function A(s){return s!==null&&Object.prototype.toString.call(s)==="[object Object]"}var K=s=>(typeof s=="number"||s instanceof Number)&&isFinite(+s);function mt(s,t){return K(s)?s:t}function C(s,t){return typeof s>"u"?t:s}var Eo=(s,t)=>typeof s=="string"&&s.endsWith("%")?parseFloat(s)/100:s/t,En=(s,t)=>typeof s=="string"&&s.endsWith("%")?parseFloat(s)/100*t:+s;function j(s,t,e){if(s&&typeof s.call=="function")return s.apply(e,t)}function H(s,t,e,i){let n,r,o;if($(s))if(r=s.length,i)for(n=r-1;n>=0;n--)t.call(e,s[n],n);else for(n=0;ns,x:s=>s.x,y:s=>s.y};function Bt(s,t){return(mo[t]||(mo[t]=Cc(t)))(s)}function Cc(s){let t=Ic(s);return e=>{for(let i of t){if(i==="")break;e=e&&e[i]}return e}}function Ic(s){let t=s.split("."),e=[],i="";for(let n of t)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(e.push(i),i="");return e}function Oi(s){return s.charAt(0).toUpperCase()+s.slice(1)}var ft=s=>typeof s<"u",Ht=s=>typeof s=="function",Cn=(s,t)=>{if(s.size!==t.size)return!1;for(let e of s)if(!t.has(e))return!1;return!0};function Io(s){return s.type==="mouseup"||s.type==="click"||s.type==="contextmenu"}var Y=Math.PI,B=2*Y,Fc=B+Y,Mi=Number.POSITIVE_INFINITY,Ac=Y/180,Z=Y/2,ys=Y/4,go=Y*2/3,gt=Math.log10,Tt=Math.sign;function In(s){let t=Math.round(s);s=Re(s,t,s/1e3)?t:s;let e=Math.pow(10,Math.floor(gt(s))),i=s/e;return(i<=1?1:i<=2?2:i<=5?5:10)*e}function Fo(s){let t=[],e=Math.sqrt(s),i;for(i=1;in-r).pop(),t}function pe(s){return!isNaN(parseFloat(s))&&isFinite(s)}function Re(s,t,e){return Math.abs(s-t)=s}function Fn(s,t,e){let i,n,r;for(i=0,n=s.length;il&&c=Math.min(t,e)-i&&s<=Math.max(t,e)+i}function Ei(s,t,e){e=e||(o=>s[o]1;)r=n+i>>1,e(r)?n=r:i=r;return{lo:n,hi:i}}var Ft=(s,t,e,i)=>Ei(s,e,i?n=>s[n][t]<=e:n=>s[n][t]Ei(s,e,i=>s[i][t]>=e);function Ro(s,t,e){let i=0,n=s.length;for(;ii&&s[n-1]>e;)n--;return i>0||n{let i="_onData"+Oi(e),n=s[e];Object.defineProperty(s,e,{configurable:!0,enumerable:!1,value(...r){let o=n.apply(this,r);return s._chartjs.listeners.forEach(a=>{typeof a[i]=="function"&&a[i](...r)}),o}})})}function Pn(s,t){let e=s._chartjs;if(!e)return;let i=e.listeners,n=i.indexOf(t);n!==-1&&i.splice(n,1),!(i.length>0)&&(No.forEach(r=>{delete s[r]}),delete s._chartjs)}function Rn(s){let t=new Set,e,i;for(e=0,i=s.length;e"u"?function(s){return s()}:window.requestAnimationFrame}();function Wn(s,t,e){let i=e||(o=>Array.prototype.slice.call(o)),n=!1,r=[];return function(...o){r=i(o),n||(n=!0,Nn.call(window,()=>{n=!1,s.apply(t,r)}))}}function zo(s,t){let e;return function(...i){return t?(clearTimeout(e),e=setTimeout(s,t,i)):s.apply(this,i),t}}var Ci=s=>s==="start"?"left":s==="end"?"right":"center",ot=(s,t,e)=>s==="start"?t:s==="end"?e:(t+e)/2,Vo=(s,t,e,i)=>s===(i?"left":"right")?e:s==="center"?(t+e)/2:t;function zn(s,t,e){let i=t.length,n=0,r=i;if(s._sorted){let{iScale:o,_parsed:a}=s,l=o.axis,{min:c,max:h,minDefined:u,maxDefined:d}=o.getUserBounds();u&&(n=it(Math.min(Ft(a,o.axis,c).lo,e?i:Ft(t,l,o.getPixelForValue(c)).lo),0,i-1)),d?r=it(Math.max(Ft(a,o.axis,h,!0).hi+1,e?0:Ft(t,l,o.getPixelForValue(h),!0).hi+1),n,i)-n:r=i-n}return{start:n,count:r}}function Vn(s){let{xScale:t,yScale:e,_scaleRanges:i}=s,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!i)return s._scaleRanges=n,!0;let r=i.xmin!==t.min||i.xmax!==t.max||i.ymin!==e.min||i.ymax!==e.max;return Object.assign(i,n),r}var bi=s=>s===0||s===1,po=(s,t,e)=>-(Math.pow(2,10*(s-=1))*Math.sin((s-t)*B/e)),yo=(s,t,e)=>Math.pow(2,-10*s)*Math.sin((s-t)*B/e)+1,Ce={linear:s=>s,easeInQuad:s=>s*s,easeOutQuad:s=>-s*(s-2),easeInOutQuad:s=>(s/=.5)<1?.5*s*s:-.5*(--s*(s-2)-1),easeInCubic:s=>s*s*s,easeOutCubic:s=>(s-=1)*s*s+1,easeInOutCubic:s=>(s/=.5)<1?.5*s*s*s:.5*((s-=2)*s*s+2),easeInQuart:s=>s*s*s*s,easeOutQuart:s=>-((s-=1)*s*s*s-1),easeInOutQuart:s=>(s/=.5)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2),easeInQuint:s=>s*s*s*s*s,easeOutQuint:s=>(s-=1)*s*s*s*s+1,easeInOutQuint:s=>(s/=.5)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2),easeInSine:s=>-Math.cos(s*Z)+1,easeOutSine:s=>Math.sin(s*Z),easeInOutSine:s=>-.5*(Math.cos(Y*s)-1),easeInExpo:s=>s===0?0:Math.pow(2,10*(s-1)),easeOutExpo:s=>s===1?1:-Math.pow(2,-10*s)+1,easeInOutExpo:s=>bi(s)?s:s<.5?.5*Math.pow(2,10*(s*2-1)):.5*(-Math.pow(2,-10*(s*2-1))+2),easeInCirc:s=>s>=1?s:-(Math.sqrt(1-s*s)-1),easeOutCirc:s=>Math.sqrt(1-(s-=1)*s),easeInOutCirc:s=>(s/=.5)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1),easeInElastic:s=>bi(s)?s:po(s,.075,.3),easeOutElastic:s=>bi(s)?s:yo(s,.075,.3),easeInOutElastic(s){return bi(s)?s:s<.5?.5*po(s*2,.1125,.45):.5+.5*yo(s*2-1,.1125,.45)},easeInBack(s){return s*s*((1.70158+1)*s-1.70158)},easeOutBack(s){return(s-=1)*s*((1.70158+1)*s+1.70158)+1},easeInOutBack(s){let t=1.70158;return(s/=.5)<1?.5*(s*s*(((t*=1.525)+1)*s-t)):.5*((s-=2)*s*(((t*=1.525)+1)*s+t)+2)},easeInBounce:s=>1-Ce.easeOutBounce(1-s),easeOutBounce(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},easeInOutBounce:s=>s<.5?Ce.easeInBounce(s*2)*.5:Ce.easeOutBounce(s*2-1)*.5+.5};function Ss(s){return s+.5|0}var Kt=(s,t,e)=>Math.max(Math.min(s,e),t);function bs(s){return Kt(Ss(s*2.55),0,255)}function Jt(s){return Kt(Ss(s*255),0,255)}function Vt(s){return Kt(Ss(s/2.55)/100,0,1)}function bo(s){return Kt(Ss(s*100),0,100)}var _t={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},On=[..."0123456789ABCDEF"],Pc=s=>On[s&15],Rc=s=>On[(s&240)>>4]+On[s&15],xi=s=>(s&240)>>4===(s&15),Nc=s=>xi(s.r)&&xi(s.g)&&xi(s.b)&&xi(s.a);function Wc(s){var t=s.length,e;return s[0]==="#"&&(t===4||t===5?e={r:255&_t[s[1]]*17,g:255&_t[s[2]]*17,b:255&_t[s[3]]*17,a:t===5?_t[s[4]]*17:255}:(t===7||t===9)&&(e={r:_t[s[1]]<<4|_t[s[2]],g:_t[s[3]]<<4|_t[s[4]],b:_t[s[5]]<<4|_t[s[6]],a:t===9?_t[s[7]]<<4|_t[s[8]]:255})),e}var zc=(s,t)=>s<255?t(s):"";function Vc(s){var t=Nc(s)?Pc:Rc;return s?"#"+t(s.r)+t(s.g)+t(s.b)+zc(s.a,t):void 0}var Hc=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Ho(s,t,e){let i=t*Math.min(e,1-e),n=(r,o=(r+s/30)%12)=>e-i*Math.max(Math.min(o-3,9-o,1),-1);return[n(0),n(8),n(4)]}function Bc(s,t,e){let i=(n,r=(n+s/60)%6)=>e-e*t*Math.max(Math.min(r,4-r,1),0);return[i(5),i(3),i(1)]}function $c(s,t,e){let i=Ho(s,1,.5),n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)i[n]*=1-t-e,i[n]+=t;return i}function jc(s,t,e,i,n){return s===n?(t-e)/i+(t.5?h/(2-r-o):h/(r+o),l=jc(e,i,n,h,r),l=l*60+.5),[l|0,c||0,a]}function Bn(s,t,e,i){return(Array.isArray(t)?s(t[0],t[1],t[2]):s(t,e,i)).map(Jt)}function $n(s,t,e){return Bn(Ho,s,t,e)}function Uc(s,t,e){return Bn($c,s,t,e)}function Yc(s,t,e){return Bn(Bc,s,t,e)}function Bo(s){return(s%360+360)%360}function Zc(s){let t=Hc.exec(s),e=255,i;if(!t)return;t[5]!==i&&(e=t[6]?bs(+t[5]):Jt(+t[5]));let n=Bo(+t[2]),r=+t[3]/100,o=+t[4]/100;return t[1]==="hwb"?i=Uc(n,r,o):t[1]==="hsv"?i=Yc(n,r,o):i=$n(n,r,o),{r:i[0],g:i[1],b:i[2],a:e}}function qc(s,t){var e=Hn(s);e[0]=Bo(e[0]+t),e=$n(e),s.r=e[0],s.g=e[1],s.b=e[2]}function Gc(s){if(!s)return;let t=Hn(s),e=t[0],i=bo(t[1]),n=bo(t[2]);return s.a<255?`hsla(${e}, ${i}%, ${n}%, ${Vt(s.a)})`:`hsl(${e}, ${i}%, ${n}%)`}var xo={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},_o={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function Xc(){let s={},t=Object.keys(_o),e=Object.keys(xo),i,n,r,o,a;for(i=0;i>16&255,r>>8&255,r&255]}return s}var _i;function Kc(s){_i||(_i=Xc(),_i.transparent=[0,0,0,0]);let t=_i[s.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var Jc=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Qc(s){let t=Jc.exec(s),e=255,i,n,r;if(t){if(t[7]!==i){let o=+t[7];e=t[8]?bs(o):Kt(o*255,0,255)}return i=+t[1],n=+t[3],r=+t[5],i=255&(t[2]?bs(i):Kt(i,0,255)),n=255&(t[4]?bs(n):Kt(n,0,255)),r=255&(t[6]?bs(r):Kt(r,0,255)),{r:i,g:n,b:r,a:e}}}function th(s){return s&&(s.a<255?`rgba(${s.r}, ${s.g}, ${s.b}, ${Vt(s.a)})`:`rgb(${s.r}, ${s.g}, ${s.b})`)}var kn=s=>s<=.0031308?s*12.92:Math.pow(s,1/2.4)*1.055-.055,Ee=s=>s<=.04045?s/12.92:Math.pow((s+.055)/1.055,2.4);function eh(s,t,e){let i=Ee(Vt(s.r)),n=Ee(Vt(s.g)),r=Ee(Vt(s.b));return{r:Jt(kn(i+e*(Ee(Vt(t.r))-i))),g:Jt(kn(n+e*(Ee(Vt(t.g))-n))),b:Jt(kn(r+e*(Ee(Vt(t.b))-r))),a:s.a+e*(t.a-s.a)}}function wi(s,t,e){if(s){let i=Hn(s);i[t]=Math.max(0,Math.min(i[t]+i[t]*e,t===0?360:1)),i=$n(i),s.r=i[0],s.g=i[1],s.b=i[2]}}function $o(s,t){return s&&Object.assign(t||{},s)}function wo(s){var t={r:0,g:0,b:0,a:255};return Array.isArray(s)?s.length>=3&&(t={r:s[0],g:s[1],b:s[2],a:255},s.length>3&&(t.a=Jt(s[3]))):(t=$o(s,{r:0,g:0,b:0,a:1}),t.a=Jt(t.a)),t}function sh(s){return s.charAt(0)==="r"?Qc(s):Zc(s)}var Fe=class{constructor(t){if(t instanceof Fe)return t;let e=typeof t,i;e==="object"?i=wo(t):e==="string"&&(i=Wc(t)||Kc(t)||sh(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=$o(this._rgb);return t&&(t.a=Vt(t.a)),t}set rgb(t){this._rgb=wo(t)}rgbString(){return this._valid?th(this._rgb):void 0}hexString(){return this._valid?Vc(this._rgb):void 0}hslString(){return this._valid?Gc(this._rgb):void 0}mix(t,e){if(t){let i=this.rgb,n=t.rgb,r,o=e===r?.5:e,a=2*o-1,l=i.a-n.a,c=((a*l===-1?a:(a+l)/(1+a*l))+1)/2;r=1-c,i.r=255&c*i.r+r*n.r+.5,i.g=255&c*i.g+r*n.g+.5,i.b=255&c*i.b+r*n.b+.5,i.a=o*i.a+(1-o)*n.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=eh(this._rgb,t._rgb,e)),this}clone(){return new Fe(this.rgb)}alpha(t){return this._rgb.a=Jt(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=Ss(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return wi(this._rgb,2,t),this}darken(t){return wi(this._rgb,2,-t),this}saturate(t){return wi(this._rgb,1,t),this}desaturate(t){return wi(this._rgb,1,-t),this}rotate(t){return qc(this._rgb,t),this}};function jo(s){return new Fe(s)}function Uo(s){if(s&&typeof s=="object"){let t=s.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function jn(s){return Uo(s)?s:jo(s)}function Mn(s){return Uo(s)?s:jo(s).saturate(.5).darken(.1).hexString()}var Qt=Object.create(null),Ii=Object.create(null);function xs(s,t){if(!t)return s;let e=t.split(".");for(let i=0,n=e.length;ie.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,i)=>Mn(i.backgroundColor),this.hoverBorderColor=(e,i)=>Mn(i.borderColor),this.hoverColor=(e,i)=>Mn(i.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return Tn(this,t,e)}get(t){return xs(this,t)}describe(t,e){return Tn(Ii,t,e)}override(t,e){return Tn(Qt,t,e)}route(t,e,i,n){let r=xs(this,t),o=xs(this,i),a="_"+e;Object.defineProperties(r,{[a]:{value:r[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[a],c=o[n];return A(l)?Object.assign({},c,l):C(l,c)},set(l){this[a]=l}}})}},L=new Dn({_scriptable:s=>!s.startsWith("on"),_indexable:s=>s!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});function ih(s){return!s||N(s.size)||N(s.family)?null:(s.style?s.style+" ":"")+(s.weight?s.weight+" ":"")+s.size+"px "+s.family}function _s(s,t,e,i,n){let r=t[n];return r||(r=t[n]=s.measureText(n).width,e.push(n)),r>i&&(i=r),i}function Yo(s,t,e,i){i=i||{};let n=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==t&&(n=i.data={},r=i.garbageCollect=[],i.font=t),s.save(),s.font=t;let o=0,a=e.length,l,c,h,u,d;for(l=0;le.length){for(l=0;l0&&s.stroke()}}function Ae(s,t,e){return e=e||.5,!t||s&&s.x>t.left-e&&s.xt.top-e&&s.y0&&r.strokeColor!=="",l,c;for(s.save(),s.font=n.string,nh(s,r),l=0;l+s||0;function Ai(s,t){let e={},i=A(t),n=i?Object.keys(t):t,r=A(s)?i?o=>C(s[o],s[t[o]]):o=>s[o]:()=>s;for(let o of n)e[o]=ch(r(o));return e}function Zn(s){return Ai(s,{top:"y",right:"x",bottom:"y",left:"x"})}function se(s){return Ai(s,["topLeft","topRight","bottomLeft","bottomRight"])}function at(s){let t=Zn(s);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function st(s,t){s=s||{},t=t||L.font;let e=C(s.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let i=C(s.style,t.style);i&&!(""+i).match(ah)&&(console.warn('Invalid font style specified: "'+i+'"'),i="");let n={family:C(s.family,t.family),lineHeight:lh(C(s.lineHeight,t.lineHeight),e),size:e,style:i,weight:C(s.weight,t.weight),string:""};return n.string=ih(n),n}function ze(s,t,e,i){let n=!0,r,o,a;for(r=0,o=s.length;re&&a===0?0:a+l;return{min:o(i,-Math.abs(r)),max:o(n,r)}}function $t(s,t){return Object.assign(Object.create(s),t)}function Li(s,t=[""],e=s,i,n=()=>s[0]){ft(i)||(i=Jo("_fallback",s));let r={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:s,_rootScopes:e,_fallback:i,_getTarget:n,override:o=>Li([o,...s],t,e,i)};return new Proxy(r,{deleteProperty(o,a){return delete o[a],delete o._keys,delete s[0][a],!0},get(o,a){return Xo(o,a,()=>yh(a,t,s,o))},getOwnPropertyDescriptor(o,a){return Reflect.getOwnPropertyDescriptor(o._scopes[0],a)},getPrototypeOf(){return Reflect.getPrototypeOf(s[0])},has(o,a){return ko(o).includes(a)},ownKeys(o){return ko(o)},set(o,a,l){let c=o._storage||(o._storage=n());return o[a]=c[a]=l,delete o._keys,!0}})}function ge(s,t,e,i){let n={_cacheable:!1,_proxy:s,_context:t,_subProxy:e,_stack:new Set,_descriptors:qn(s,i),setContext:r=>ge(s,r,e,i),override:r=>ge(s.override(r),t,e,i)};return new Proxy(n,{deleteProperty(r,o){return delete r[o],delete s[o],!0},get(r,o,a){return Xo(r,o,()=>uh(r,o,a))},getOwnPropertyDescriptor(r,o){return r._descriptors.allKeys?Reflect.has(s,o)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(s,o)},getPrototypeOf(){return Reflect.getPrototypeOf(s)},has(r,o){return Reflect.has(s,o)},ownKeys(){return Reflect.ownKeys(s)},set(r,o,a){return s[o]=a,delete r[o],!0}})}function qn(s,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:i=t.indexable,_allKeys:n=t.allKeys}=s;return{allKeys:n,scriptable:e,indexable:i,isScriptable:Ht(e)?e:()=>e,isIndexable:Ht(i)?i:()=>i}}var hh=(s,t)=>s?s+Oi(t):t,Gn=(s,t)=>A(t)&&s!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Xo(s,t,e){if(Object.prototype.hasOwnProperty.call(s,t))return s[t];let i=e();return s[t]=i,i}function uh(s,t,e){let{_proxy:i,_context:n,_subProxy:r,_descriptors:o}=s,a=i[t];return Ht(a)&&o.isScriptable(t)&&(a=dh(t,a,s,e)),$(a)&&a.length&&(a=fh(t,a,s,o.isIndexable)),Gn(t,a)&&(a=ge(a,n,r&&r[t],o)),a}function dh(s,t,e,i){let{_proxy:n,_context:r,_subProxy:o,_stack:a}=e;if(a.has(s))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+s);return a.add(s),t=t(r,o||i),a.delete(s),Gn(s,t)&&(t=Xn(n._scopes,n,s,t)),t}function fh(s,t,e,i){let{_proxy:n,_context:r,_subProxy:o,_descriptors:a}=e;if(ft(r.index)&&i(s))t=t[r.index%t.length];else if(A(t[0])){let l=t,c=n._scopes.filter(h=>h!==l);t=[];for(let h of l){let u=Xn(c,n,s,h);t.push(ge(u,r,o&&o[s],a))}}return t}function Ko(s,t,e){return Ht(s)?s(t,e):s}var mh=(s,t)=>s===!0?t:typeof s=="string"?Bt(t,s):void 0;function gh(s,t,e,i,n){for(let r of t){let o=mh(e,r);if(o){s.add(o);let a=Ko(o._fallback,e,n);if(ft(a)&&a!==e&&a!==i)return a}else if(o===!1&&ft(i)&&e!==i)return null}return!1}function Xn(s,t,e,i){let n=t._rootScopes,r=Ko(t._fallback,e,i),o=[...s,...n],a=new Set;a.add(i);let l=So(a,o,e,r||e,i);return l===null||ft(r)&&r!==e&&(l=So(a,o,r,l,i),l===null)?!1:Li(Array.from(a),[""],n,r,()=>ph(t,e,i))}function So(s,t,e,i,n){for(;e;)e=gh(s,t,e,i,n);return e}function ph(s,t,e){let i=s._getTarget();t in i||(i[t]={});let n=i[t];return $(n)&&A(e)?e:n}function yh(s,t,e,i){let n;for(let r of t)if(n=Jo(hh(r,s),e),ft(n))return Gn(s,n)?Xn(e,i,s,n):n}function Jo(s,t){for(let e of t){if(!e)continue;let i=e[s];if(ft(i))return i}}function ko(s){let t=s._keys;return t||(t=s._keys=bh(s._scopes)),t}function bh(s){let t=new Set;for(let e of s)for(let i of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(i);return Array.from(t)}function Kn(s,t,e,i){let{iScale:n}=s,{key:r="r"}=this._parsing,o=new Array(i),a,l,c,h;for(a=0,l=i;ats==="x"?"y":"x";function _h(s,t,e,i){let n=s.skip?t:s,r=t,o=e.skip?t:e,a=Ti(r,n),l=Ti(o,r),c=a/(a+l),h=l/(a+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let u=i*c,d=i*h;return{previous:{x:r.x-u*(o.x-n.x),y:r.y-u*(o.y-n.y)},next:{x:r.x+d*(o.x-n.x),y:r.y+d*(o.y-n.y)}}}function wh(s,t,e){let i=s.length,n,r,o,a,l,c=Le(s,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")kh(s,n);else{let c=i?s[s.length-1]:s[0];for(r=0,o=s.length;rwindow.getComputedStyle(s,null);function Th(s,t){return Ri(s).getPropertyValue(t)}var vh=["top","right","bottom","left"];function me(s,t,e){let i={};e=e?"-"+e:"";for(let n=0;n<4;n++){let r=vh[n];i[r]=parseFloat(s[t+"-"+r+e])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}var Oh=(s,t,e)=>(s>0||t>0)&&(!e||!e.shadowRoot);function Dh(s,t){let e=s.touches,i=e&&e.length?e[0]:s,{offsetX:n,offsetY:r}=i,o=!1,a,l;if(Oh(n,r,s.target))a=n,l=r;else{let c=t.getBoundingClientRect();a=i.clientX-c.left,l=i.clientY-c.top,o=!0}return{x:a,y:l,box:o}}function ie(s,t){if("native"in s)return s;let{canvas:e,currentDevicePixelRatio:i}=t,n=Ri(e),r=n.boxSizing==="border-box",o=me(n,"padding"),a=me(n,"border","width"),{x:l,y:c,box:h}=Dh(s,e),u=o.left+(h&&a.left),d=o.top+(h&&a.top),{width:f,height:m}=t;return r&&(f-=o.width+a.width,m-=o.height+a.height),{x:Math.round((l-u)/f*e.width/i),y:Math.round((c-d)/m*e.height/i)}}function Eh(s,t,e){let i,n;if(t===void 0||e===void 0){let r=Pi(s);if(!r)t=s.clientWidth,e=s.clientHeight;else{let o=r.getBoundingClientRect(),a=Ri(r),l=me(a,"border","width"),c=me(a,"padding");t=o.width-c.width-l.width,e=o.height-c.height-l.height,i=vi(a.maxWidth,r,"clientWidth"),n=vi(a.maxHeight,r,"clientHeight")}}return{width:t,height:e,maxWidth:i||Mi,maxHeight:n||Mi}}var vn=s=>Math.round(s*10)/10;function ea(s,t,e,i){let n=Ri(s),r=me(n,"margin"),o=vi(n.maxWidth,s,"clientWidth")||Mi,a=vi(n.maxHeight,s,"clientHeight")||Mi,l=Eh(s,t,e),{width:c,height:h}=l;if(n.boxSizing==="content-box"){let u=me(n,"border","width"),d=me(n,"padding");c-=d.width+u.width,h-=d.height+u.height}return c=Math.max(0,c-r.width),h=Math.max(0,i?Math.floor(c/i):h-r.height),c=vn(Math.min(c,o,l.maxWidth)),h=vn(Math.min(h,a,l.maxHeight)),c&&!h&&(h=vn(c/2)),{width:c,height:h}}function Qn(s,t,e){let i=t||1,n=Math.floor(s.height*i),r=Math.floor(s.width*i);s.height=n/i,s.width=r/i;let o=s.canvas;return o.style&&(e||!o.style.height&&!o.style.width)&&(o.style.height=`${s.height}px`,o.style.width=`${s.width}px`),s.currentDevicePixelRatio!==i||o.height!==n||o.width!==r?(s.currentDevicePixelRatio=i,o.height=n,o.width=r,s.ctx.setTransform(i,0,0,i,0,0),!0):!1}var sa=function(){let s=!1;try{let t={get passive(){return s=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch{}return s}();function tr(s,t){let e=Th(s,t),i=e&&e.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function Xt(s,t,e,i){return{x:s.x+e*(t.x-s.x),y:s.y+e*(t.y-s.y)}}function ia(s,t,e,i){return{x:s.x+e*(t.x-s.x),y:i==="middle"?e<.5?s.y:t.y:i==="after"?e<1?s.y:t.y:e>0?t.y:s.y}}function na(s,t,e,i){let n={x:s.cp2x,y:s.cp2y},r={x:t.cp1x,y:t.cp1y},o=Xt(s,n,e),a=Xt(n,r,e),l=Xt(r,t,e),c=Xt(o,a,e),h=Xt(a,l,e);return Xt(c,h,e)}var Mo=new Map;function Ch(s,t){t=t||{};let e=s+JSON.stringify(t),i=Mo.get(e);return i||(i=new Intl.NumberFormat(s,t),Mo.set(e,i)),i}function Ve(s,t,e){return Ch(t,e).format(s)}var Ih=function(s,t){return{x(e){return s+s+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,i){return e-i},leftForLtr(e,i){return e-i}}},Fh=function(){return{x(s){return s},setWidth(s){},textAlign(s){return s},xPlus(s,t){return s+t},leftForLtr(s,t){return s}}};function ye(s,t,e){return s?Ih(t,e):Fh()}function er(s,t){let e,i;(t==="ltr"||t==="rtl")&&(e=s.canvas.style,i=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),s.prevTextDirection=i)}function sr(s,t){t!==void 0&&(delete s.prevTextDirection,s.canvas.style.setProperty("direction",t[0],t[1]))}function ra(s){return s==="angle"?{between:Ne,compare:Lc,normalize:ht}:{between:Lt,compare:(t,e)=>t-e,normalize:t=>t}}function To({start:s,end:t,count:e,loop:i,style:n}){return{start:s%e,end:t%e,loop:i&&(t-s+1)%e===0,style:n}}function Ah(s,t,e){let{property:i,start:n,end:r}=e,{between:o,normalize:a}=ra(i),l=t.length,{start:c,end:h,loop:u}=s,d,f;if(u){for(c+=l,h+=l,d=0,f=l;dl(n,_,y)&&a(n,_)!==0,x=()=>a(r,y)===0||l(r,_,y),S=()=>g||w(),k=()=>!g||x();for(let O=h,v=h;O<=u;++O)b=t[O%o],!b.skip&&(y=c(b[i]),y!==_&&(g=l(y,n,r),p===null&&S()&&(p=a(y,n)===0?O:v),p!==null&&k()&&(m.push(To({start:p,end:O,loop:d,count:o,style:f})),p=null),v=O,_=y));return p!==null&&m.push(To({start:p,end:u,loop:d,count:o,style:f})),m}function nr(s,t){let e=[],i=s.segments;for(let n=0;nn&&s[r%t].skip;)r--;return r%=t,{start:n,end:r}}function Ph(s,t,e,i){let n=s.length,r=[],o=t,a=s[t],l;for(l=t+1;l<=e;++l){let c=s[l%n];c.skip||c.stop?a.skip||(i=!1,r.push({start:t%n,end:(l-1)%n,loop:i}),t=o=c.stop?l:null):(o=l,a.skip&&(t=l)),a=c}return o!==null&&r.push({start:t%n,end:o%n,loop:i}),r}function oa(s,t){let e=s.points,i=s.options.spanGaps,n=e.length;if(!n)return[];let r=!!s._loop,{start:o,end:a}=Lh(e,n,r,i);if(i===!0)return vo(s,[{start:o,end:a,loop:r}],e,t);let l=aa({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)}))}_refresh(){this._request||(this._running=!0,this._request=Nn.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((i,n)=>{if(!i.running||!i.items.length)return;let r=i.items,o=r.length-1,a=!1,l;for(;o>=0;--o)l=r[o],l._active?(l._total>i.duration&&(i.duration=l._total),l.tick(t),a=!0):(r[o]=r[r.length-1],r.pop());a&&(n.draw(),this._notify(n,i,t,"progress")),r.length||(i.running=!1,this._notify(n,i,t,"complete"),i.initial=!1),e+=r.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((i,n)=>Math.max(i,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let i=e.items,n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},jt=new mr,aa="transparent",Wh={boolean(s,t,e){return e>.5?t:s},color(s,t,e){let i=jn(s||aa),n=i.valid&&jn(t||aa);return n&&n.valid?n.mix(i,e).hexString():t},number(s,t,e){return s+(t-s)*e}},gr=class{constructor(t,e,i,n){let r=e[i];n=ze([t.to,n,r,t.from]);let o=ze([t.from,r,n]);this._active=!0,this._fn=t.fn||Wh[t.type||typeof o],this._easing=Ce[t.easing]||Ce.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);let n=this._target[this._prop],r=i-this._start,o=this._duration-r;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=r,this._loop=!!t.loop,this._to=ze([t.to,e,n,t.from]),this._from=ze([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,i=this._duration,n=this._prop,r=this._from,o=this._loop,a=this._to,l;if(this._active=r!==a&&(o||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(r,a,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,i)=>{t.push({res:e,rej:i})})}_notify(t){let e=t?"res":"rej",i=this._promises||[];for(let n=0;ns!=="onProgress"&&s!=="onComplete"&&s!=="fn"});L.set("animations",{colors:{type:"color",properties:Vh},numbers:{type:"number",properties:zh}});L.describe("animations",{_fallback:"animation"});L.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:s=>s|0}}}});var ji=class{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!A(t))return;let e=this._properties;Object.getOwnPropertyNames(t).forEach(i=>{let n=t[i];if(!A(n))return;let r={};for(let o of Hh)r[o]=n[o];($(n.properties)&&n.properties||[i]).forEach(o=>{(o===i||!e.has(o))&&e.set(o,r)})})}_animateOptions(t,e){let i=e.options,n=$h(t,i);if(!n)return[];let r=this._createAnimations(n,i);return i.$shared&&Bh(t.options.$animations,i).then(()=>{t.options=i},()=>{}),r}_createAnimations(t,e){let i=this._properties,n=[],r=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now(),l;for(l=o.length-1;l>=0;--l){let c=o[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}let h=e[c],u=r[c],d=i.get(c);if(u)if(d&&u.active()){u.update(d,h,a);continue}else u.cancel();if(!d||!d.duration){t[c]=h;continue}r[c]=u=new gr(d,t,c,h),n.push(u)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let i=this._createAnimations(t,e);if(i.length)return jt.add(this._chart,i),!0}};function Bh(s,t){let e=[],i=Object.keys(t);for(let n=0;n0||!e&&r<0)return n.index}return null}function da(s,t){let{chart:e,_cachedMeta:i}=s,n=e._stacks||(e._stacks={}),{iScale:r,vScale:o,index:a}=i,l=r.axis,c=o.axis,h=Zh(r,o,i),u=t.length,d;for(let f=0;fe[i].axis===t).shift()}function Xh(s,t){return $t(s,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function Kh(s,t,e){return $t(s,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function Ts(s,t){let e=s.controller.index,i=s.vScale&&s.vScale.axis;if(i){t=t||s._parsed;for(let n of t){let r=n._stacks;if(!r||r[i]===void 0||r[i][e]===void 0)return;delete r[i][e]}}}var or=s=>s==="reset"||s==="none",fa=(s,t)=>t?s:Object.assign({},s),Jh=(s,t,e)=>s&&!t.hidden&&t._stacked&&{keys:Ja(e,!0),values:null},pt=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=ha(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&Ts(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,i=this.getDataset(),n=(u,d,f,m)=>u==="x"?d:u==="r"?m:f,r=e.xAxisID=C(i.xAxisID,rr(t,"x")),o=e.yAxisID=C(i.yAxisID,rr(t,"y")),a=e.rAxisID=C(i.rAxisID,rr(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,r,o,a),h=e.vAxisID=n(l,o,r,a);e.xScale=this.getScaleForId(r),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&Pn(this._data,this),t._stacked&&Ts(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(A(e))this._data=Yh(e);else if(i!==e){if(i){Pn(i,this);let n=this._cachedMeta;Ts(n),n._parsed=[]}e&&Object.isExtensible(e)&&Wo(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,i=this.getDataset(),n=!1;this._dataCheck();let r=e._stacked;e._stacked=ha(e.vScale,e),e.stack!==i.stack&&(n=!0,Ts(e),e.stack=i.stack),this._resyncElements(t),(n||r!==e._stacked)&&da(this,e._parsed)}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:i,_data:n}=this,{iScale:r,_stacked:o}=i,a=r.axis,l=t===0&&e===n.length?!0:i._sorted,c=t>0&&i._parsed[t-1],h,u,d;if(this._parsing===!1)i._parsed=n,i._sorted=!0,d=n;else{$(n[t])?d=this.parseArrayData(i,n,t,e):A(n[t])?d=this.parseObjectData(i,n,t,e):d=this.parsePrimitiveData(i,n,t,e);let f=()=>u[a]===null||c&&u[a]g||u=0;--d)if(!m()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,i=[],n,r,o;for(n=0,r=e.length;n=0&&tthis.getContext(i,n),g=c.resolveNamedOptions(d,f,m,u);return g.$shared&&(g.$shared=l,r[o]=Object.freeze(fa(g,l))),g}_resolveAnimations(t,e,i){let n=this.chart,r=this._cachedDataOpts,o=`animation-${e}`,a=r[o];if(a)return a;let l;if(n.options.animation!==!1){let h=this.chart.config,u=h.datasetAnimationScopeKeys(this._type,e),d=h.getOptionScopes(this.getDataset(),u);l=h.createResolver(d,this.getContext(t,i,e))}let c=new ji(n,l&&l.animations);return l&&l._cacheable&&(r[o]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||or(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,r=this.getSharedOptions(i),o=this.includeOptions(e,r)||r!==n;return this.updateSharedOptions(r,e,i),{sharedOptions:r,includeOptions:o}}updateElement(t,e,i,n){or(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!or(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;let r=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(r)||r})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,i=this._cachedMeta.data;for(let[a,l,c]of this._syncList)this[a](l,c);this._syncList=[];let n=i.length,r=e.length,o=Math.min(r,n);o&&this.parse(0,o),r>n?this._insertElements(n,r-n,t):r{for(c.length+=e,a=c.length-1;a>=o;a--)c[a]=c[a-e]};for(l(r),a=t;an-r))}return s._cache.$bar}function tu(s){let t=s.iScale,e=Qh(t,s.type),i=t._length,n,r,o,a,l=()=>{o===32767||o===-32768||(ft(a)&&(i=Math.min(i,Math.abs(o-a)||i)),a=o)};for(n=0,r=e.length;n0?n[s-1]:null,a=sMath.abs(a)&&(l=a,c=o),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:r,min:o,max:a}}function Qa(s,t,e,i){return $(s)?iu(s,t,e,i):t[e.axis]=e.parse(s,i),t}function ma(s,t,e,i){let n=s.iScale,r=s.vScale,o=n.getLabels(),a=n===r,l=[],c,h,u,d;for(c=e,h=e+i;c=e?1:-1)}function ru(s){let t,e,i,n,r;return s.horizontal?(t=s.base>s.x,e="left",i="right"):(t=s.basel.controller.options.grouped),r=i.options.stacked,o=[],a=l=>{let c=l.controller.getParsed(e),h=c&&c[l.vScale.axis];if(N(h)||isNaN(h))return!0};for(let l of n)if(!(e!==void 0&&a(l))&&((r===!1||o.indexOf(l.stack)===-1||r===void 0&&l.stack===void 0)&&o.push(l.stack),l.index===t))break;return o.length||o.push(void 0),o}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){let n=this._getStacks(t,i),r=e!==void 0?n.indexOf(e):-1;return r===-1?n.length-1:r}_getRuler(){let t=this.options,e=this._cachedMeta,i=e.iScale,n=[],r,o;for(r=0,o=e.data.length;r=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,{xScale:i,yScale:n}=e,r=this.getParsed(t),o=i.getLabelForValue(r.x),a=n.getLabelForValue(r.y),l=r._custom;return{label:e.label,value:"("+o+", "+a+(l?", "+l:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){let r=n==="reset",{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=o.axis,u=a.axis;for(let d=e;dNe(_,a,l,!0)?1:Math.max(w,w*e,x,x*e),m=(_,w,x)=>Ne(_,a,l,!0)?-1:Math.min(w,w*e,x,x*e),g=f(0,c,u),p=f(Z,h,d),y=m(Y,c,u),b=m(Y+Z,h,d);i=(g-y)/2,n=(p-b)/2,r=-(g+y)/2,o=-(p+b)/2}return{ratioX:i,ratioY:n,offsetX:r,offsetY:o}}var oe=class extends pt{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let i=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=i;else{let r=l=>+i[l];if(A(i[t])){let{key:l="value"}=this._parsing;r=c=>+Bt(i[c],l)}let o,a;for(o=t,a=t+e;o0&&!isNaN(t)?B*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=Ve(e._parsed[t],i.options.locale);return{label:n[t]||"",value:r}}getMaxBorderWidth(t){let e=0,i=this.chart,n,r,o,a,l;if(!t){for(n=0,r=i.data.datasets.length;ns!=="spacing",_indexable:s=>s!=="spacing"};oe.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(s){let t=s.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:e}}=s.legend.options;return t.labels.map((i,n)=>{let o=s.getDatasetMeta(0).controller.getStyle(n);return{text:i,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:e,hidden:!s.getDataVisibility(n),index:n}})}return[]}},onClick(s,t,e){e.chart.toggleDataVisibility(t.index),e.chart.update()}},tooltip:{callbacks:{title(){return""},label(s){let t=s.label,e=": "+s.formattedValue;return $(t)?(t=t.slice(),t[0]+=e):t+=e,t}}}}};var Ue=class extends pt{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:i,data:n=[],_dataset:r}=e,o=this.chart._animationsDisabled,{start:a,count:l}=zn(e,n,o);this._drawStart=a,this._drawCount=l,Vn(e)&&(a=0,l=n.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!r._decimated,i.points=n;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:c},t),this.updateElements(n,a,l,t)}updateElements(t,e,i,n){let r=n==="reset",{iScale:o,vScale:a,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:u}=this._getSharedOptions(e,n),d=o.axis,f=a.axis,{spanGaps:m,segment:g}=this.options,p=pe(m)?m:Number.POSITIVE_INFINITY,y=this.chart._animationsDisabled||r||n==="none",b=e>0&&this.getParsed(e-1);for(let _=e;_0&&Math.abs(x[d]-b[d])>p,g&&(S.parsed=x,S.raw=c.data[_]),u&&(S.options=h||this.resolveDataElementOptions(_,w.active?"active":n)),y||this.updateElement(w,_,S,n),b=x}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;let r=n[0].size(this.resolveDataElementOptions(0)),o=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,r,o)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};Ue.id="line";Ue.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1};Ue.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};var Ye=class extends pt{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=Ve(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:r}}parseObjectData(t,e,i,n){return Kn.bind(this)(t,e,i,n)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((i,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(re.max&&(e.max=r))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),r=Math.max(n/2,0),o=Math.max(i.cutoutPercentage?r/100*i.cutoutPercentage:1,0),a=(r-o)/t.getVisibleDatasetCount();this.outerRadius=r-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,e,i,n){let r=n==="reset",o=this.chart,l=o.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,u=c.yCenter,d=c.getIndexAngle(0)-.5*Y,f=d,m,g=360/this.countVisibleElements();for(m=0;m{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?wt(this.resolveDataElementOptions(t,e).angle||i):0}};Ye.id="polarArea";Ye.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0};Ye.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(s){let t=s.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:e}}=s.legend.options;return t.labels.map((i,n)=>{let o=s.getDatasetMeta(0).controller.getStyle(n);return{text:i,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,pointStyle:e,hidden:!s.getDataVisibility(n),index:n}})}return[]}},onClick(s,t,e){e.chart.toggleDataVisibility(t.index),e.chart.update()}},tooltip:{callbacks:{title(){return""},label(s){return s.chart.data.labels[s.dataIndex]+": "+s.formattedValue}}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};var Fs=class extends oe{};Fs.id="pie";Fs.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};var Ze=class extends pt{getLabelAndValue(t){let e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,n){return Kn.bind(this)(t,e,i,n)}update(t){let e=this._cachedMeta,i=e.dataset,n=e.data||[],r=e.iScale.getLabels();if(i.points=n,t!=="resize"){let o=this.resolveDatasetElementOptions(t);this.options.showLine||(o.borderWidth=0);let a={_loop:!0,_fullLoop:r.length===n.length,options:o};this.updateElement(i,void 0,a,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,i,n){let r=this._cachedMeta.rScale,o=n==="reset";for(let a=e;a{n[r]=i[r]&&i[r].active()?i[r]._to:this[r]}),n}};yt.defaults={};yt.defaultRoutes=void 0;var tl={values(s){return $(s)?s:""+s},numeric(s,t,e){if(s===0)return"0";let i=this.chart.options.locale,n,r=s;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),r=hu(s,e)}let o=gt(Math.abs(r)),a=Math.max(Math.min(-1*Math.floor(o),20),0),l={notation:n,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),Ve(s,i,l)},logarithmic(s,t,e){if(s===0)return"0";let i=s/Math.pow(10,Math.floor(gt(s)));return i===1||i===2||i===5?tl.numeric.call(this,s,t,e):""}};function hu(s,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&s!==Math.floor(s)&&(e=s-Math.floor(s)),e}var Xi={formatters:tl};L.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(s,t)=>t.lineWidth,tickColor:(s,t)=>t.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Xi.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}});L.route("scale.ticks","color","","color");L.route("scale.grid","color","","borderColor");L.route("scale.grid","borderColor","","borderColor");L.route("scale.title","color","","color");L.describe("scale",{_fallback:!1,_scriptable:s=>!s.startsWith("before")&&!s.startsWith("after")&&s!=="callback"&&s!=="parser",_indexable:s=>s!=="borderDash"&&s!=="tickBorderDash"});L.describe("scales",{_fallback:"scale"});L.describe("scale.ticks",{_scriptable:s=>s!=="backdropPadding"&&s!=="callback",_indexable:s=>s!=="backdropPadding"});function uu(s,t){let e=s.options.ticks,i=e.maxTicksLimit||du(s),n=e.major.enabled?mu(t):[],r=n.length,o=n[0],a=n[r-1],l=[];if(r>i)return gu(t,l,n,r/i),l;let c=fu(n,t,i);if(r>0){let h,u,d=r>1?Math.round((a-o)/(r-1)):null;for(Ni(t,l,c,N(d)?0:o-d,o),h=0,u=r-1;hn)return l}return Math.max(n,1)}function mu(s){let t=[],e,i;for(e=0,i=s.length;es==="left"?"right":s==="right"?"left":s,ya=(s,t,e)=>t==="top"||t==="left"?s[t]+e:s[t]-e;function ba(s,t){let e=[],i=s.length/t,n=s.length,r=0;for(;ro+a)))return l}function xu(s,t){H(s,e=>{let i=e.gc,n=i.length/2,r;if(n>t){for(r=0;ri?i:e,i=n&&e>i?e:i,{min:mt(e,mt(i,e)),max:mt(i,mt(e,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){j(this.options.beforeUpdate,[this])}update(t,e,i){let{beginAtZero:n,grace:r,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Go(this,r,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=a=r||i<=1||!this.isHorizontal()){this.labelRotation=n;return}let h=this._getLabelSizes(),u=h.widest.width,d=h.highest.height,f=it(this.chart.width-u,0,this.maxWidth);a=t.offset?this.maxWidth/i:f/(i-1),u+6>a&&(a=f/(i-(t.offset?.5:1)),l=this.maxHeight-vs(t.grid)-e.padding-xa(t.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),o=Di(Math.min(Math.asin(it((h.highest.height+6)/a,-1,1)),Math.asin(it(l/c,-1,1))-Math.asin(it(d/c,-1,1)))),o=Math.max(n,Math.min(r,o))),this.labelRotation=o}afterCalculateLabelRotation(){j(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){j(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:i,title:n,grid:r}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){let l=xa(n,e.options.font);if(a?(t.width=this.maxWidth,t.height=vs(r)+l):(t.height=this.maxHeight,t.width=vs(r)+l),i.display&&this.ticks.length){let{first:c,last:h,widest:u,highest:d}=this._getLabelSizes(),f=i.padding*2,m=wt(this.labelRotation),g=Math.cos(m),p=Math.sin(m);if(a){let y=i.mirror?0:p*u.width+g*d.height;t.height=Math.min(this.maxHeight,t.height+y+f)}else{let y=i.mirror?0:g*u.width+p*d.height;t.width=Math.min(this.maxWidth,t.width+y+f)}this._calculatePadding(c,h,p,g)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,n){let{ticks:{align:r,padding:o},position:a}=this.options,l=this.labelRotation!==0,c=a!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,u=this.right-this.getPixelForTick(this.ticks.length-1),d=0,f=0;l?c?(d=n*t.width,f=i*e.height):(d=i*t.height,f=n*e.width):r==="start"?f=e.width:r==="end"?d=t.width:r!=="inner"&&(d=t.width/2,f=e.width/2),this.paddingLeft=Math.max((d-h+o)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-u+o)*this.width/(this.width-u),0)}else{let h=e.height/2,u=t.height/2;r==="start"?(h=0,u=t.height):r==="end"&&(h=e.height,u=0),this.paddingTop=h+o,this.paddingBottom=u+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){j(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,i;for(e=0,i=t.length;e({width:r[k]||0,height:o[k]||0});return{first:S(0),last:S(e-1),widest:S(w),highest:S(x),widths:r,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return Lo(this._alignToPixels?te(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&ta*n?a/i:l/n:l*n0}_computeGridLineItems(t){let e=this.axis,i=this.chart,n=this.options,{grid:r,position:o}=n,a=r.offset,l=this.isHorizontal(),h=this.ticks.length+(a?1:0),u=vs(r),d=[],f=r.setContext(this.getContext()),m=f.drawBorder?f.borderWidth:0,g=m/2,p=function(E){return te(i,E,m)},y,b,_,w,x,S,k,O,v,F,W,R;if(o==="top")y=p(this.bottom),S=this.bottom-u,O=y-g,F=p(t.top)+g,R=t.bottom;else if(o==="bottom")y=p(this.top),F=t.top,R=p(t.bottom)-g,S=y+g,O=this.top+u;else if(o==="left")y=p(this.right),x=this.right-u,k=y-g,v=p(t.left)+g,W=t.right;else if(o==="right")y=p(this.left),v=t.left,W=p(t.right)-g,x=y+g,k=this.left+u;else if(e==="x"){if(o==="center")y=p((t.top+t.bottom)/2+.5);else if(A(o)){let E=Object.keys(o)[0],et=o[E];y=p(this.chart.scales[E].getPixelForValue(et))}F=t.top,R=t.bottom,S=y+g,O=S+u}else if(e==="y"){if(o==="center")y=p((t.left+t.right)/2);else if(A(o)){let E=Object.keys(o)[0],et=o[E];y=p(this.chart.scales[E].getPixelForValue(et))}x=y-g,k=x-u,v=t.left,W=t.right}let tt=C(n.ticks.maxTicksLimit,h),ct=Math.max(1,Math.ceil(h/tt));for(b=0;br.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){let e=this.options.grid,i=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),r,o,a=(l,c,h)=>{!h.width||!h.color||(i.save(),i.lineWidth=h.width,i.strokeStyle=h.color,i.setLineDash(h.borderDash||[]),i.lineDashOffset=h.borderDashOffset,i.beginPath(),i.moveTo(l.x,l.y),i.lineTo(c.x,c.y),i.stroke(),i.restore())};if(e.display)for(r=0,o=n.length;r{this.draw(n)}}]:[{z:i,draw:n=>{this.drawBackground(),this.drawGrid(n),this.drawTitle()}},{z:i+1,draw:()=>{this.drawBorder()}},{z:e,draw:n=>{this.drawLabels(n)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",n=[],r,o;for(r=0,o=e.length;r{let i=e.split("."),n=i.pop(),r=[s].concat(i).join("."),o=t[e].split("."),a=o.pop(),l=o.join(".");L.route(r,n,l,a)})}function vu(s){return"id"in s&&"defaults"in s}var pr=class{constructor(){this.controllers=new Be(pt,"datasets",!0),this.elements=new Be(yt,"elements"),this.plugins=new Be(Object,"plugins"),this.scales=new Be(Yt,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(n=>{let r=i||this._getRegistryForType(n);i||r.isForType(n)||r===this.plugins&&n.id?this._exec(t,r,n):H(n,o=>{let a=i||this._getRegistryForType(o);this._exec(t,a,o)})})}_exec(t,e,i){let n=Oi(t);j(i["before"+n],[],i),e[t](i),j(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;e0&&this.getParsed(e-1);for(let w=e;w0&&Math.abs(S[f]-_[f])>y,p&&(k.parsed=S,k.raw=c.data[w]),d&&(k.options=u||this.resolveDataElementOptions(w,x.active?"active":n)),b||this.updateElement(x,w,k,n),_=S}this.updateSharedOptions(u,n,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let a=0;for(let l=e.length-1;l>=0;--l)a=Math.max(a,e[l].size(this.resolveDataElementOptions(l))/2);return a>0&&a}let i=t.dataset,n=i.options&&i.options.borderWidth||0;if(!e.length)return n;let r=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,r,o)/2}};qe.id="scatter";qe.defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1};qe.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title(){return""},label(s){return"("+s.label+", "+s.formattedValue+")"}}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Ou=Object.freeze({__proto__:null,BarController:$e,BubbleController:je,DoughnutController:oe,LineController:Ue,PolarAreaController:Ye,PieController:Fs,RadarController:Ze,ScatterController:qe});function be(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var As=class{constructor(t){this.options=t||{}}init(t){}formats(){return be()}parse(t,e){return be()}format(t,e){return be()}add(t,e,i){return be()}diff(t,e,i){return be()}startOf(t,e,i){return be()}endOf(t,e){return be()}};As.override=function(s){Object.assign(As.prototype,s)};var Or={_date:As};function Du(s,t,e,i){let{controller:n,data:r,_sorted:o}=s,a=n._cachedMeta.iScale;if(a&&t===a.axis&&t!=="r"&&o&&r.length){let l=a._reversePixels?Po:Ft;if(i){if(n._sharedOptions){let c=r[0],h=typeof c.getRange=="function"&&c.getRange(t);if(h){let u=l(r,t,e-h),d=l(r,t,e+h);return{lo:u.lo,hi:d.hi}}}}else return l(r,t,e)}return{lo:0,hi:r.length-1}}function Vs(s,t,e,i,n){let r=s.getSortedVisibleDatasetMetas(),o=e[t];for(let a=0,l=r.length;a{l[o](t[e],n)&&(r.push({element:l,datasetIndex:c,index:h}),a=a||l.inRange(t.x,t.y,n))}),i&&!a?[]:r}var Fu={evaluateInteractionItems:Vs,modes:{index(s,t,e,i){let n=ie(t,s),r=e.axis||"x",o=e.includeInvisible||!1,a=e.intersect?lr(s,n,r,i,o):cr(s,n,r,!1,i,o),l=[];return a.length?(s.getSortedVisibleDatasetMetas().forEach(c=>{let h=a[0].index,u=c.data[h];u&&!u.skip&&l.push({element:u,datasetIndex:c.index,index:h})}),l):[]},dataset(s,t,e,i){let n=ie(t,s),r=e.axis||"xy",o=e.includeInvisible||!1,a=e.intersect?lr(s,n,r,i,o):cr(s,n,r,!1,i,o);if(a.length>0){let l=a[0].datasetIndex,c=s.getDatasetMeta(l).data;a=[];for(let h=0;he.pos===t)}function wa(s,t){return s.filter(e=>el.indexOf(e.pos)===-1&&e.box.axis===t)}function Ds(s,t){return s.sort((e,i)=>{let n=t?i:e,r=t?e:i;return n.weight===r.weight?n.index-r.index:n.weight-r.weight})}function Au(s){let t=[],e,i,n,r,o,a;for(e=0,i=(s||[]).length;ec.box.fullSize),!0),i=Ds(Os(t,"left"),!0),n=Ds(Os(t,"right")),r=Ds(Os(t,"top"),!0),o=Ds(Os(t,"bottom")),a=wa(t,"x"),l=wa(t,"y");return{fullSize:e,leftAndTop:i.concat(r),rightAndBottom:n.concat(l).concat(o).concat(a),chartArea:Os(t,"chartArea"),vertical:i.concat(n).concat(l),horizontal:r.concat(o).concat(a)}}function Sa(s,t,e,i){return Math.max(s[e],t[e])+Math.max(s[i],t[i])}function sl(s,t){s.top=Math.max(s.top,t.top),s.left=Math.max(s.left,t.left),s.bottom=Math.max(s.bottom,t.bottom),s.right=Math.max(s.right,t.right)}function Nu(s,t,e,i){let{pos:n,box:r}=e,o=s.maxPadding;if(!A(n)){e.size&&(s[n]-=e.size);let u=i[e.stack]||{size:0,count:1};u.size=Math.max(u.size,e.horizontal?r.height:r.width),e.size=u.size/u.count,s[n]+=e.size}r.getPadding&&sl(o,r.getPadding());let a=Math.max(0,t.outerWidth-Sa(o,s,"left","right")),l=Math.max(0,t.outerHeight-Sa(o,s,"top","bottom")),c=a!==s.w,h=l!==s.h;return s.w=a,s.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Wu(s){let t=s.maxPadding;function e(i){let n=Math.max(t[i]-s[i],0);return s[i]+=n,n}s.y+=e("top"),s.x+=e("left"),e("right"),e("bottom")}function zu(s,t){let e=t.maxPadding;function i(n){let r={left:0,top:0,right:0,bottom:0};return n.forEach(o=>{r[o]=Math.max(t[o],e[o])}),r}return i(s?["left","right"]:["top","bottom"])}function Cs(s,t,e,i){let n=[],r,o,a,l,c,h;for(r=0,o=s.length,c=0;r{typeof g.beforeLayout=="function"&&g.beforeLayout()});let h=l.reduce((g,p)=>p.box.options&&p.box.options.display===!1?g:g+1,0)||1,u=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:r,availableHeight:o,vBoxMaxWidth:r/2/h,hBoxMaxHeight:o/2}),d=Object.assign({},n);sl(d,at(i));let f=Object.assign({maxPadding:d,w:r,h:o,x:n.left,y:n.top},n),m=Pu(l.concat(c),u);Cs(a.fullSize,f,u,m),Cs(l,f,u,m),Cs(c,f,u,m)&&Cs(l,f,u,m),Wu(f),ka(a.leftAndTop,f,u,m),f.x+=f.w,f.y+=f.h,ka(a.rightAndBottom,f,u,m),s.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},H(a.chartArea,g=>{let p=g.box;Object.assign(p,s.chartArea),p.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}},Ui=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}updateConfig(t){}},yr=class extends Ui{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},$i="$chartjs",Vu={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Ma=s=>s===null||s==="";function Hu(s,t){let e=s.style,i=s.getAttribute("height"),n=s.getAttribute("width");if(s[$i]={initial:{height:i,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",Ma(n)){let r=tr(s,"width");r!==void 0&&(s.width=r)}if(Ma(i))if(s.style.height==="")s.height=s.width/(t||2);else{let r=tr(s,"height");r!==void 0&&(s.height=r)}return s}var il=sa?{passive:!0}:!1;function Bu(s,t,e){s.addEventListener(t,e,il)}function $u(s,t,e){s.canvas.removeEventListener(t,e,il)}function ju(s,t){let e=Vu[s.type]||s.type,{x:i,y:n}=ie(s,t);return{type:e,chart:t,native:s,x:i!==void 0?i:null,y:n!==void 0?n:null}}function Yi(s,t){for(let e of s)if(e===t||e.contains(t))return!0}function Uu(s,t,e){let i=s.canvas,n=new MutationObserver(r=>{let o=!1;for(let a of r)o=o||Yi(a.addedNodes,i),o=o&&!Yi(a.removedNodes,i);o&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function Yu(s,t,e){let i=s.canvas,n=new MutationObserver(r=>{let o=!1;for(let a of r)o=o||Yi(a.removedNodes,i),o=o&&!Yi(a.addedNodes,i);o&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}var Ls=new Map,Ta=0;function nl(){let s=window.devicePixelRatio;s!==Ta&&(Ta=s,Ls.forEach((t,e)=>{e.currentDevicePixelRatio!==s&&t()}))}function Zu(s,t){Ls.size||window.addEventListener("resize",nl),Ls.set(s,t)}function qu(s){Ls.delete(s),Ls.size||window.removeEventListener("resize",nl)}function Gu(s,t,e){let i=s.canvas,n=i&&Pi(i);if(!n)return;let r=Wn((a,l)=>{let c=n.clientWidth;e(a,l),c{let l=a[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||r(c,h)});return o.observe(n),Zu(s,r),o}function hr(s,t,e){e&&e.disconnect(),t==="resize"&&qu(s)}function Xu(s,t,e){let i=s.canvas,n=Wn(r=>{s.ctx!==null&&e(ju(r,s))},s,r=>{let o=r[0];return[o,o.offsetX,o.offsetY]});return Bu(i,t,n),n}var br=class extends Ui{acquireContext(t,e){let i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(Hu(t,e),i):null}releaseContext(t){let e=t.canvas;if(!e[$i])return!1;let i=e[$i].initial;["height","width"].forEach(r=>{let o=i[r];N(o)?e.removeAttribute(r):e.setAttribute(r,o)});let n=i.style||{};return Object.keys(n).forEach(r=>{e.style[r]=n[r]}),e.width=e.width,delete e[$i],!0}addEventListener(t,e,i){this.removeEventListener(t,e);let n=t.$proxies||(t.$proxies={}),o={attach:Uu,detach:Yu,resize:Gu}[e]||Xu;n[e]=o(t,e,i)}removeEventListener(t,e){let i=t.$proxies||(t.$proxies={}),n=i[e];if(!n)return;({attach:hr,detach:hr,resize:hr}[e]||$u)(t,e,n),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return ea(t,e,i,n)}isAttached(t){let e=Pi(t);return!!(e&&e.isConnected)}};function Ku(s){return!Jn()||typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas?yr:br}var xr=class{constructor(){this._init=[]}notify(t,e,i,n){e==="beforeInit"&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));let r=n?this._descriptors(t).filter(n):this._descriptors(t),o=this._notify(r,t,e,i);return e==="afterDestroy"&&(this._notify(r,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,n){n=n||{};for(let r of t){let o=r.plugin,a=o[i],l=[e,n,r.options];if(j(a,l,o)===!1&&n.cancelable)return!1}return!0}invalidate(){N(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;let e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){let i=t&&t.config,n=C(i.options&&i.options.plugins,{}),r=Ju(i);return n===!1&&!e?[]:td(t,r,n,e)}_notifyStateChanges(t){let e=this._oldCache||[],i=this._cache,n=(r,o)=>r.filter(a=>!o.some(l=>a.plugin.id===l.plugin.id));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}};function Ju(s){let t={},e=[],i=Object.keys(Rt.plugins.items);for(let r=0;r{let l=i[a];if(!A(l))return console.error(`Invalid scale configuration for scale: ${a}`);if(l._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${a}`);let c=wr(a,l),h=id(c,n),u=e.scales||{};r[c]=r[c]||a,o[a]=Pe(Object.create(null),[{axis:c},l,u[c],u[h]])}),s.data.datasets.forEach(a=>{let l=a.type||s.type,c=a.indexAxis||_r(l,t),u=(Qt[l]||{}).scales||{};Object.keys(u).forEach(d=>{let f=sd(d,c),m=a[f+"AxisID"]||r[f]||f;o[m]=o[m]||Object.create(null),Pe(o[m],[{axis:f},i[m],u[d]])})}),Object.keys(o).forEach(a=>{let l=o[a];Pe(l,[L.scales[l.type],L.scale])}),o}function rl(s){let t=s.options||(s.options={});t.plugins=C(t.plugins,{}),t.scales=rd(s,t)}function ol(s){return s=s||{},s.datasets=s.datasets||[],s.labels=s.labels||[],s}function od(s){return s=s||{},s.data=ol(s.data),rl(s),s}var va=new Map,al=new Set;function zi(s,t){let e=va.get(s);return e||(e=t(),va.set(s,e),al.add(e)),e}var Es=(s,t,e)=>{let i=Bt(t,e);i!==void 0&&s.add(i)},Sr=class{constructor(t){this._config=od(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=ol(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),rl(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return zi(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return zi(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return zi(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,i=this.type;return zi(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let i=this._scopeCache,n=i.get(t);return(!n||e)&&(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){let{options:n,type:r}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(u=>Es(l,t,u))),h.forEach(u=>Es(l,n,u)),h.forEach(u=>Es(l,Qt[r]||{},u)),h.forEach(u=>Es(l,L,u)),h.forEach(u=>Es(l,Ii,u))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),al.has(e)&&o.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,Qt[e]||{},L.datasets[e]||{},{type:e},L,Ii]}resolveNamedOptions(t,e,i,n=[""]){let r={$shared:!0},{resolver:o,subPrefixes:a}=Oa(this._resolverCache,t,n),l=o;if(ld(o,e)){r.$shared=!1,i=Ht(i)?i():i;let c=this.createResolver(t,i,a);l=ge(o,i,c)}for(let c of e)r[c]=l[c];return r}createResolver(t,e,i=[""],n){let{resolver:r}=Oa(this._resolverCache,t,i);return A(e)?ge(r,e,void 0,n):r}};function Oa(s,t,e){let i=s.get(t);i||(i=new Map,s.set(t,i));let n=e.join(),r=i.get(n);return r||(r={resolver:Li(t,e),subPrefixes:e.filter(a=>!a.toLowerCase().includes("hover"))},i.set(n,r)),r}var ad=s=>A(s)&&Object.getOwnPropertyNames(s).reduce((t,e)=>t||Ht(s[e]),!1);function ld(s,t){let{isScriptable:e,isIndexable:i}=qn(s);for(let n of t){let r=e(n),o=i(n),a=(o||r)&&s[n];if(r&&(Ht(a)||ad(a))||o&&$(a))return!0}return!1}var cd="3.9.1",hd=["top","bottom","left","right","chartArea"];function Da(s,t){return s==="top"||s==="bottom"||hd.indexOf(s)===-1&&t==="x"}function Ea(s,t){return function(e,i){return e[s]===i[s]?e[t]-i[t]:e[s]-i[s]}}function Ca(s){let t=s.chart,e=t.options.animation;t.notifyPlugins("afterRender"),j(e&&e.onComplete,[s],t)}function ud(s){let t=s.chart,e=t.options.animation;j(e&&e.onProgress,[s],t)}function ll(s){return Jn()&&typeof s=="string"?s=document.getElementById(s):s&&s.length&&(s=s[0]),s&&s.canvas&&(s=s.canvas),s}var Zi={},cl=s=>{let t=ll(s);return Object.values(Zi).filter(e=>e.canvas===t).pop()};function dd(s,t,e){let i=Object.keys(s);for(let n of i){let r=+n;if(r>=t){let o=s[n];delete s[n],(e>0||r>t)&&(s[r+e]=o)}}}function fd(s,t,e,i){return!e||s.type==="mouseout"?null:i?t:s}var xe=class{constructor(t,e){let i=this.config=new Sr(e),n=ll(t),r=cl(n);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas with ID '"+r.canvas.id+"' can be reused.");let o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||Ku(n)),this.platform.updateConfig(i);let a=this.platform.acquireContext(n,o.aspectRatio),l=a&&a.canvas,c=l&&l.height,h=l&&l.width;if(this.id=Do(),this.ctx=a,this.canvas=l,this.width=h,this.height=c,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new xr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=zo(u=>this.update(u),o.resizeDelay||0),this._dataChanges=[],Zi[this.id]=this,!a||!l){console.error("Failed to create chart: can't acquire context from the given item");return}jt.listen(this,"complete",Ca),jt.listen(this,"progress",ud),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:r}=this;return N(t)?e&&r?r:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Qn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Un(this.canvas,this.ctx),this}stop(){return jt.stop(this),this}resize(t,e){jt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let i=this.options,n=this.canvas,r=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(n,t,e,r),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,Qn(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),j(i.onResize,[this,o],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};H(e,(i,n)=>{i.id=n})}buildOrUpdateScales(){let t=this.options,e=t.scales,i=this.scales,n=Object.keys(i).reduce((o,a)=>(o[a]=!1,o),{}),r=[];e&&(r=r.concat(Object.keys(e).map(o=>{let a=e[o],l=wr(o,a),c=l==="r",h=l==="x";return{options:a,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),H(r,o=>{let a=o.options,l=a.id,c=wr(l,a),h=C(a.type,o.dtype);(a.position===void 0||Da(a.position,c)!==Da(o.dposition))&&(a.position=o.dposition),n[l]=!0;let u=null;if(l in i&&i[l].type===h)u=i[l];else{let d=Rt.getScale(h);u=new d({id:l,type:h,ctx:this.ctx,chart:this}),i[u.id]=u}u.init(a,t)}),H(n,(o,a)=>{o||delete i[a]}),H(i,o=>{lt.configure(this,o,o.options),lt.addBox(this,o)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((n,r)=>n.index-r.index),i>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((i,n)=>{e.filter(r=>r===i._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,i,n;for(this._removeUnreferencedMetasets(),i=0,n=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let r=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Ea("z","_idx"));let{_active:a,_lastEvent:l}=this;l?this._eventHandler(l,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){H(this.scales,t=>{lt.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);(!Cn(e,i)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:i,start:n,count:r}of e){let o=i==="_removeElements"?-r:r;dd(t,n,o)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,i=r=>new Set(t.filter(o=>o[0]===r).map((o,a)=>a+","+o.splice(1).join(","))),n=i(0);for(let r=1;rr.split(",")).map(r=>({method:r[1],start:+r[2],count:+r[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;lt.update(this,this.width,this.height,t);let e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],H(this.boxes,n=>{i&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,r)=>{n._idx=r}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,i=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,i=t._clip,n=!i.disabled,r=this.chartArea,o={meta:t,index:t.index,cancelable:!0};this.notifyPlugins("beforeDatasetDraw",o)!==!1&&(n&&ks(e,{left:i.left===!1?0:r.left-i.left,right:i.right===!1?this.width:r.right+i.right,top:i.top===!1?0:r.top-i.top,bottom:i.bottom===!1?this.height:r.bottom+i.bottom}),t.controller.draw(),n&&Ms(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Ae(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,n){let r=Fu.modes[e];return typeof r=="function"?r(this,t,i,n):[]}getDatasetMeta(t){let e=this.data.datasets[t],i=this._metasets,n=i.filter(r=>r&&r._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context=$t(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let i=this.getDatasetMeta(t);return typeof i.hidden=="boolean"?!i.hidden:!e.hidden}setDatasetVisibility(t,e){let i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){let n=i?"show":"hide",r=this.getDatasetMeta(t),o=r.controller._resolveAnimations(void 0,n);ft(e)?(r.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(r,{visible:i}),this.update(a=>a.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),jt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,r,o),t[r]=o},n=(r,o,a)=>{r.offsetX=o,r.offsetY=a,this._eventHandler(r)};H(this.options.events,r=>i(r,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,i=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},r=(l,c)=>{this.canvas&&this.resize(l,c)},o,a=()=>{n("attach",a),this.attached=!0,this.resize(),i("resize",r),i("detach",o)};o=()=>{this.attached=!1,n("resize",r),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){H(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},H(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){let n=i?"set":"remove",r,o,a,l;for(e==="dataset"&&(r=this.getDatasetMeta(t[0].datasetIndex),r.controller["_"+n+"DatasetHoverStyle"]()),a=0,l=t.length;a{let a=this.getDatasetMeta(r);if(!a)throw new Error("No dataset found at index "+r);return{datasetIndex:r,element:a.data[o],index:o}});!ws(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){let n=this.options.hover,r=(l,c)=>l.filter(h=>!c.some(u=>h.datasetIndex===u.datasetIndex&&h.index===u.index)),o=r(e,t),a=i?t:r(t,e);o.length&&this.updateHoverStyle(o,n.mode,!1),a.length&&n.mode&&this.updateHoverStyle(a,n.mode,!0)}_eventHandler(t,e){let i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=o=>(o.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",i,n)===!1)return;let r=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,n),(r||i.changed)&&this.render(),this}_handleEvent(t,e,i){let{_active:n=[],options:r}=this,o=e,a=this._getActiveElements(t,n,i,o),l=Io(t),c=fd(t,this._lastEvent,i,l);i&&(this._lastEvent=null,j(r.onHover,[t,a,this],this),l&&j(r.onClick,[t,a,this],this));let h=!ws(a,n);return(h||e)&&(this._active=a,this._updateHoverStyles(a,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,i,n){if(t.type==="mouseout")return[];if(!i)return e;let r=this.options.hover;return this.getElementsAtEventForMode(t,r.mode,r,n)}},Ia=()=>H(xe.instances,s=>s._plugins.invalidate()),ne=!0;Object.defineProperties(xe,{defaults:{enumerable:ne,value:L},instances:{enumerable:ne,value:Zi},overrides:{enumerable:ne,value:Qt},registry:{enumerable:ne,value:Rt},version:{enumerable:ne,value:cd},getChart:{enumerable:ne,value:cl},register:{enumerable:ne,value:(...s)=>{Rt.add(...s),Ia()}},unregister:{enumerable:ne,value:(...s)=>{Rt.remove(...s),Ia()}}});function hl(s,t,e){let{startAngle:i,pixelMargin:n,x:r,y:o,outerRadius:a,innerRadius:l}=t,c=n/a;s.beginPath(),s.arc(r,o,a,i-c,e+c),l>n?(c=n/l,s.arc(r,o,l,e+c,i-c,!0)):s.arc(r,o,n,e+Z,i-Z),s.closePath(),s.clip()}function md(s){return Ai(s,["outerStart","outerEnd","innerStart","innerEnd"])}function gd(s,t,e,i){let n=md(s.options.borderRadius),r=(e-t)/2,o=Math.min(r,i*t/2),a=l=>{let c=(e-Math.min(r,l))*i/2;return it(l,0,Math.min(r,c))};return{outerStart:a(n.outerStart),outerEnd:a(n.outerEnd),innerStart:it(n.innerStart,0,o),innerEnd:it(n.innerEnd,0,o)}}function He(s,t,e,i){return{x:e+s*Math.cos(t),y:i+s*Math.sin(t)}}function kr(s,t,e,i,n,r){let{x:o,y:a,startAngle:l,pixelMargin:c,innerRadius:h}=t,u=Math.max(t.outerRadius+i+e-c,0),d=h>0?h+i+e+c:0,f=0,m=n-l;if(i){let E=h>0?h-i:0,et=u>0?u-i:0,Q=(E+et)/2,fe=Q!==0?m*Q/(Q+i):m;f=(m-fe)/2}let g=Math.max(.001,m*u-e/Y)/u,p=(m-g)/2,y=l+p+f,b=n-p-f,{outerStart:_,outerEnd:w,innerStart:x,innerEnd:S}=gd(t,d,u,b-y),k=u-_,O=u-w,v=y+_/k,F=b-w/O,W=d+x,R=d+S,tt=y+x/W,ct=b-S/R;if(s.beginPath(),r){if(s.arc(o,a,u,v,F),w>0){let Q=He(O,F,o,a);s.arc(Q.x,Q.y,w,F,b+Z)}let E=He(R,b,o,a);if(s.lineTo(E.x,E.y),S>0){let Q=He(R,ct,o,a);s.arc(Q.x,Q.y,S,b+Z,ct+Math.PI)}if(s.arc(o,a,d,b-S/d,y+x/d,!0),x>0){let Q=He(W,tt,o,a);s.arc(Q.x,Q.y,x,tt+Math.PI,y-Z)}let et=He(k,y,o,a);if(s.lineTo(et.x,et.y),_>0){let Q=He(k,v,o,a);s.arc(Q.x,Q.y,_,y-Z,v)}}else{s.moveTo(o,a);let E=Math.cos(v)*u+o,et=Math.sin(v)*u+a;s.lineTo(E,et);let Q=Math.cos(F)*u+o,fe=Math.sin(F)*u+a;s.lineTo(Q,fe)}s.closePath()}function pd(s,t,e,i,n){let{fullCircles:r,startAngle:o,circumference:a}=t,l=t.endAngle;if(r){kr(s,t,e,i,o+B,n);for(let c=0;c=B||Ne(r,a,l),g=Lt(o,c+d,h+d);return m&&g}getCenterPoint(t){let{x:e,y:i,startAngle:n,endAngle:r,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:l,spacing:c}=this.options,h=(n+r)/2,u=(o+a+c+l)/2;return{x:e+Math.cos(h)*u,y:i+Math.sin(h)*u}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){let{options:e,circumference:i}=this,n=(e.offset||0)/2,r=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin=e.borderAlign==="inner"?.33:0,this.fullCircles=i>B?Math.floor(i/B):0,i===0||this.innerRadius<0||this.outerRadius<0)return;t.save();let a=0;if(n){a=n/2;let c=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(c)*a,Math.sin(c)*a),this.circumference>=Y&&(a=n)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;let l=pd(t,this,a,r,o);bd(t,this,a,r,l,o),t.restore()}};Ge.id="arc";Ge.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};Ge.defaultRoutes={backgroundColor:"backgroundColor"};function ul(s,t,e=t){s.lineCap=C(e.borderCapStyle,t.borderCapStyle),s.setLineDash(C(e.borderDash,t.borderDash)),s.lineDashOffset=C(e.borderDashOffset,t.borderDashOffset),s.lineJoin=C(e.borderJoinStyle,t.borderJoinStyle),s.lineWidth=C(e.borderWidth,t.borderWidth),s.strokeStyle=C(e.borderColor,t.borderColor)}function xd(s,t,e){s.lineTo(e.x,e.y)}function _d(s){return s.stepped?Zo:s.tension||s.cubicInterpolationMode==="monotone"?qo:xd}function dl(s,t,e={}){let i=s.length,{start:n=0,end:r=i-1}=e,{start:o,end:a}=t,l=Math.max(n,o),c=Math.min(r,a),h=na&&r>a;return{count:i,start:l,loop:t.loop,ilen:c(o+(c?a-w:w))%r,_=()=>{g!==p&&(s.lineTo(h,p),s.lineTo(h,g),s.lineTo(h,y))};for(l&&(f=n[b(0)],s.moveTo(f.x,f.y)),d=0;d<=a;++d){if(f=n[b(d)],f.skip)continue;let w=f.x,x=f.y,S=w|0;S===m?(xp&&(p=x),h=(u*h+w)/++u):(_(),s.lineTo(w,x),m=S,u=0,g=p=x),y=x}_()}function Mr(s){let t=s.options,e=t.borderDash&&t.borderDash.length;return!s._decimated&&!s._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?Sd:wd}function kd(s){return s.stepped?ia:s.tension||s.cubicInterpolationMode==="monotone"?na:Xt}function Md(s,t,e,i){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,i)&&n.closePath()),ul(s,t.options),s.stroke(n)}function Td(s,t,e,i){let{segments:n,options:r}=t,o=Mr(t);for(let a of n)ul(s,r,a.style),s.beginPath(),o(s,t,a,{start:e,end:e+i-1})&&s.closePath(),s.stroke()}var vd=typeof Path2D=="function";function Od(s,t,e,i){vd&&!t.options.segment?Md(s,t,e,i):Td(s,t,e,i)}var Nt=class extends yt{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let i=this.options;if((i.tension||i.cubicInterpolationMode==="monotone")&&!i.stepped&&!this._pointsUpdated){let n=i.spanGaps?this._loop:this._fullLoop;ta(this._points,i,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=oa(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){let i=this.options,n=t[e],r=this.points,o=nr(this,{property:e,start:n,end:n});if(!o.length)return;let a=[],l=kd(i),c,h;for(c=0,h=o.length;cs!=="borderDash"&&s!=="fill"};function Fa(s,t,e,i){let n=s.options,{[e]:r}=s.getProps([e],i);return Math.abs(t-r)=e)return s.slice(t,t+e);let o=[],a=(e-2)/(r-2),l=0,c=t+e-1,h=t,u,d,f,m,g;for(o[l++]=s[h],u=0;uf&&(f=m,d=s[b],g=b);o[l++]=d,h=g}return o[l++]=s[c],o}function Pd(s,t,e,i){let n=0,r=0,o,a,l,c,h,u,d,f,m,g,p=[],y=t+e-1,b=s[t].x,w=s[y].x-b;for(o=t;og&&(g=c,d=o),n=(r*n+a.x)/++r;else{let S=o-1;if(!N(u)&&!N(d)){let k=Math.min(u,d),O=Math.max(u,d);k!==f&&k!==S&&p.push({...s[k],x:n}),O!==f&&O!==S&&p.push({...s[O],x:n})}o>0&&S!==f&&p.push(s[S]),p.push(a),h=x,r=0,m=g=c,u=d=f=o}}return p}function ml(s){if(s._decimated){let t=s._data;delete s._decimated,delete s._data,Object.defineProperty(s,"data",{value:t})}}function Aa(s){s.data.datasets.forEach(t=>{ml(t)})}function Rd(s,t){let e=t.length,i=0,n,{iScale:r}=s,{min:o,max:a,minDefined:l,maxDefined:c}=r.getUserBounds();return l&&(i=it(Ft(t,r.axis,o).lo,0,e-1)),c?n=it(Ft(t,r.axis,a).hi+1,i,e)-i:n=e-i,{start:i,count:n}}var Nd={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(s,t,e)=>{if(!e.enabled){Aa(s);return}let i=s.width;s.data.datasets.forEach((n,r)=>{let{_data:o,indexAxis:a}=n,l=s.getDatasetMeta(r),c=o||n.data;if(ze([a,s.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=s.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||s.options.parsing)return;let{start:u,count:d}=Rd(l,c),f=e.threshold||4*i;if(d<=f){ml(n);return}N(o)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(g){this._data=g}}));let m;switch(e.algorithm){case"lttb":m=Ld(c,u,d,i,e);break;case"min-max":m=Pd(c,u,d,i);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=m})},destroy(s){Aa(s)}};function Wd(s,t,e){let i=s.segments,n=s.points,r=t.points,o=[];for(let a of i){let{start:l,end:c}=a;c=Dr(l,c,n);let h=Tr(e,n[l],n[c],a.loop);if(!t.segments){o.push({source:a,target:h,start:n[l],end:n[c]});continue}let u=nr(t,h);for(let d of u){let f=Tr(e,r[d.start],r[d.end],d.loop),m=ir(a,n,f);for(let g of m)o.push({source:g,target:d,start:{[e]:La(h,f,"start",Math.max)},end:{[e]:La(h,f,"end",Math.min)}})}}return o}function Tr(s,t,e,i){if(i)return;let n=t[s],r=e[s];return s==="angle"&&(n=ht(n),r=ht(r)),{property:s,start:n,end:r}}function zd(s,t){let{x:e=null,y:i=null}=s||{},n=t.points,r=[];return t.segments.forEach(({start:o,end:a})=>{a=Dr(o,a,n);let l=n[o],c=n[a];i!==null?(r.push({x:l.x,y:i}),r.push({x:c.x,y:i})):e!==null&&(r.push({x:e,y:l.y}),r.push({x:e,y:c.y}))}),r}function Dr(s,t,e){for(;t>s;t--){let i=e[t];if(!isNaN(i.x)&&!isNaN(i.y))break}return t}function La(s,t,e,i){return s&&t?i(s[e],t[e]):s?s[e]:t?t[e]:0}function gl(s,t){let e=[],i=!1;return $(s)?(i=!0,e=s):e=zd(s,t),e.length?new Nt({points:e,options:{tension:0},_loop:i,_fullLoop:i}):null}function Pa(s){return s&&s.fill!==!1}function Vd(s,t,e){let n=s[t].fill,r=[t],o;if(!e)return n;for(;n!==!1&&r.indexOf(n)===-1;){if(!K(n))return n;if(o=s[n],!o)return!1;if(o.visible)return n;r.push(n),n=o.fill}return!1}function Hd(s,t,e){let i=Ud(s);if(A(i))return isNaN(i.value)?!1:i;let n=parseFloat(i);return K(n)&&Math.floor(n)===n?Bd(i[0],t,n,e):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Bd(s,t,e,i){return(s==="-"||s==="+")&&(e=t+e),e===t||e<0||e>=i?!1:e}function $d(s,t){let e=null;return s==="start"?e=t.bottom:s==="end"?e=t.top:A(s)?e=t.getPixelForValue(s.value):t.getBasePixel&&(e=t.getBasePixel()),e}function jd(s,t,e){let i;return s==="start"?i=e:s==="end"?i=t.options.reverse?t.min:t.max:A(s)?i=s.value:i=t.getBaseValue(),i}function Ud(s){let t=s.options,e=t.fill,i=C(e&&e.target,e);return i===void 0&&(i=!!t.backgroundColor),i===!1||i===null?!1:i===!0?"origin":i}function Yd(s){let{scale:t,index:e,line:i}=s,n=[],r=i.segments,o=i.points,a=Zd(t,e);a.push(gl({x:null,y:t.bottom},i));for(let l=0;l=0;--o){let a=n[o].$filler;a&&(a.line.updateControlPoints(r,a.axis),i&&a.fill&&fr(s.ctx,a,r))}},beforeDatasetsDraw(s,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let i=s.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){let r=i[n].$filler;Pa(r)&&fr(s.ctx,r,s.chartArea)}},beforeDatasetDraw(s,t,e){let i=t.meta.$filler;!Pa(i)||e.drawTime!=="beforeDatasetDraw"||fr(s.ctx,i,s.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},za=(s,t)=>{let{boxHeight:e=t,boxWidth:i=t}=s;return s.usePointStyle&&(e=Math.min(e,t),i=s.pointStyleWidth||Math.min(i,t)),{boxWidth:i,boxHeight:e,itemHeight:Math.max(t,e)}},rf=(s,t)=>s!==null&&t!==null&&s.datasetIndex===t.datasetIndex&&s.index===t.index,Gi=class extends yt{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=j(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(i=>t.filter(i,this.chart.data))),t.sort&&(e=e.sort((i,n)=>t.sort(i,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let i=t.labels,n=st(i.font),r=n.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:l}=za(i,r),c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(o,r,a,l)+10):(h=this.maxHeight,c=this._fitCols(o,r,a,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,n){let{ctx:r,maxWidth:o,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+a,u=t;r.textAlign="left",r.textBaseline="middle";let d=-1,f=-h;return this.legendItems.forEach((m,g)=>{let p=i+e/2+r.measureText(m.text).width;(g===0||c[c.length-1]+p+2*a>o)&&(u+=h,c[c.length-(g>0?0:1)]=0,f+=h,d++),l[g]={left:0,top:f,row:d,width:p,height:n},c[c.length-1]+=p+a}),u}_fitCols(t,e,i,n){let{ctx:r,maxHeight:o,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=o-t,u=a,d=0,f=0,m=0,g=0;return this.legendItems.forEach((p,y)=>{let b=i+e/2+r.measureText(p.text).width;y>0&&f+n+2*a>h&&(u+=d+a,c.push({width:d,height:f}),m+=d+a,g++,d=f=0),l[y]={left:m,top:f,col:g,width:b,height:n},d=Math.max(d,b),f+=n+a}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:n},rtl:r}}=this,o=ye(r,this.left,this.width);if(this.isHorizontal()){let a=0,l=ot(i,this.left+n,this.right-this.lineWidths[a]);for(let c of e)a!==c.row&&(a=c.row,l=ot(i,this.left+n,this.right-this.lineWidths[a])),c.top+=this.top+t+n,c.left=o.leftForLtr(o.x(l),c.width),l+=c.width+n}else{let a=0,l=ot(i,this.top+t+n,this.bottom-this.columnSizes[a].height);for(let c of e)c.col!==a&&(a=c.col,l=ot(i,this.top+t+n,this.bottom-this.columnSizes[a].height)),c.top=l,c.left+=this.left+n,c.left=o.leftForLtr(o.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;ks(t,this),this._draw(),Ms(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:i,ctx:n}=this,{align:r,labels:o}=t,a=L.color,l=ye(t.rtl,this.left,this.width),c=st(o.font),{color:h,padding:u}=o,d=c.size,f=d/2,m;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;let{boxWidth:g,boxHeight:p,itemHeight:y}=za(o,d),b=function(k,O,v){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;n.save();let F=C(v.lineWidth,1);if(n.fillStyle=C(v.fillStyle,a),n.lineCap=C(v.lineCap,"butt"),n.lineDashOffset=C(v.lineDashOffset,0),n.lineJoin=C(v.lineJoin,"miter"),n.lineWidth=F,n.strokeStyle=C(v.strokeStyle,a),n.setLineDash(C(v.lineDash,[])),o.usePointStyle){let W={radius:p*Math.SQRT2/2,pointStyle:v.pointStyle,rotation:v.rotation,borderWidth:F},R=l.xPlus(k,g/2),tt=O+f;Yn(n,W,R,tt,o.pointStyleWidth&&g)}else{let W=O+Math.max((d-p)/2,0),R=l.leftForLtr(k,g),tt=se(v.borderRadius);n.beginPath(),Object.values(tt).some(ct=>ct!==0)?We(n,{x:R,y:W,w:g,h:p,radius:tt}):n.rect(R,W,g,p),n.fill(),F!==0&&n.stroke()}n.restore()},_=function(k,O,v){ee(n,v.text,k,O+y/2,c,{strikethrough:v.hidden,textAlign:l.textAlign(v.textAlign)})},w=this.isHorizontal(),x=this._computeTitleHeight();w?m={x:ot(r,this.left+u,this.right-i[0]),y:this.top+u+x,line:0}:m={x:this.left+u,y:ot(r,this.top+x+u,this.bottom-e[0].height),line:0},er(this.ctx,t.textDirection);let S=y+u;this.legendItems.forEach((k,O)=>{n.strokeStyle=k.fontColor||h,n.fillStyle=k.fontColor||h;let v=n.measureText(k.text).width,F=l.textAlign(k.textAlign||(k.textAlign=o.textAlign)),W=g+f+v,R=m.x,tt=m.y;l.setWidth(this.width),w?O>0&&R+W+u>this.right&&(tt=m.y+=S,m.line++,R=m.x=ot(r,this.left+u,this.right-i[m.line])):O>0&&tt+S>this.bottom&&(R=m.x=R+e[m.line].width+u,m.line++,tt=m.y=ot(r,this.top+x+u,this.bottom-e[m.line].height));let ct=l.x(R);b(ct,tt,k),R=Vo(F,R+g+f,w?R+W:this.right,t.rtl),_(l.x(R),tt,k),w?m.x+=W+u:m.y+=S}),sr(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,i=st(e.font),n=at(e.padding);if(!e.display)return;let r=ye(t.rtl,this.left,this.width),o=this.ctx,a=e.position,l=i.size/2,c=n.top+l,h,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+c,u=ot(t.align,u,this.right-d);else{let m=this.columnSizes.reduce((g,p)=>Math.max(g,p.height),0);h=c+ot(t.align,this.top,this.bottom-m-t.labels.padding-this._computeTitleHeight())}let f=ot(a,u,u+d);o.textAlign=r.textAlign(Ci(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,ee(o,e.text,f,h,i)}_computeTitleHeight(){let t=this.options.title,e=st(t.font),i=at(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,n,r;if(Lt(t,this.left,this.right)&&Lt(e,this.top,this.bottom)){for(r=this.legendHitBoxes,i=0;is.chart.options.color,boxWidth:40,padding:10,generateLabels(s){let t=s.data.datasets,{labels:{usePointStyle:e,pointStyle:i,textAlign:n,color:r}}=s.legend.options;return s._getSortedDatasetMetas().map(o=>{let a=o.controller.getStyle(e?0:void 0),l=at(a.borderWidth);return{text:t[o.index].label,fillStyle:a.backgroundColor,fontColor:r,hidden:!o.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:a.borderColor,pointStyle:i||a.pointStyle,rotation:a.rotation,textAlign:n||a.textAlign,borderRadius:0,datasetIndex:o.index}},this)}},title:{color:s=>s.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:s=>!s.startsWith("on"),labels:{_scriptable:s=>!["generateLabels","filter","sort"].includes(s)}}},Ps=class extends yt{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let i=this.options;if(this.left=0,this.top=0,!i.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let n=$(i.text)?i.text.length:1;this._padding=at(i.padding);let r=n*st(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=r:this.width=r}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:i,bottom:n,right:r,options:o}=this,a=o.align,l=0,c,h,u;return this.isHorizontal()?(h=ot(a,i,r),u=e+t,c=r-i):(o.position==="left"?(h=i+t,u=ot(a,n,e),l=Y*-.5):(h=r-t,u=ot(a,e,n),l=Y*.5),c=n-e),{titleX:h,titleY:u,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let i=st(e.font),r=i.lineHeight/2+this._padding.top,{titleX:o,titleY:a,maxWidth:l,rotation:c}=this._drawArgs(r);ee(t,e.text,0,0,i,{color:e.color,maxWidth:l,rotation:c,textAlign:Ci(e.align),textBaseline:"middle",translation:[o,a]})}};function lf(s,t){let e=new Ps({ctx:s.ctx,options:t,chart:s});lt.configure(s,e,t),lt.addBox(s,e),s.titleBlock=e}var cf={id:"title",_element:Ps,start(s,t,e){lf(s,e)},stop(s){let t=s.titleBlock;lt.removeBox(s,t),delete s.titleBlock},beforeUpdate(s,t,e){let i=s.titleBlock;lt.configure(s,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Vi=new WeakMap,hf={id:"subtitle",start(s,t,e){let i=new Ps({ctx:s.ctx,options:e,chart:s});lt.configure(s,i,e),lt.addBox(s,i),Vi.set(s,i)},stop(s){lt.removeBox(s,Vi.get(s)),Vi.delete(s)},beforeUpdate(s,t,e){let i=Vi.get(s);lt.configure(s,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Is={average(s){if(!s.length)return!1;let t,e,i=0,n=0,r=0;for(t=0,e=s.length;tt in s?Sc(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e;var v=(s,t,e)=>Mc(s,typeof t!="symbol"?t+"":t,e);function us(s){return s+.5|0}var Zt=(s,t,e)=>Math.max(Math.min(s,e),t);function cs(s){return Zt(us(s*2.55),0,255)}function qt(s){return Zt(us(s*255),0,255)}function Nt(s){return Zt(us(s/2.55)/100,0,1)}function No(s){return Zt(us(s*100),0,100)}var pt={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Zi=[..."0123456789ABCDEF"],Oc=s=>Zi[s&15],Tc=s=>Zi[(s&240)>>4]+Zi[s&15],Us=s=>(s&240)>>4===(s&15),Dc=s=>Us(s.r)&&Us(s.g)&&Us(s.b)&&Us(s.a);function Cc(s){var t=s.length,e;return s[0]==="#"&&(t===4||t===5?e={r:255&pt[s[1]]*17,g:255&pt[s[2]]*17,b:255&pt[s[3]]*17,a:t===5?pt[s[4]]*17:255}:(t===7||t===9)&&(e={r:pt[s[1]]<<4|pt[s[2]],g:pt[s[3]]<<4|pt[s[4]],b:pt[s[5]]<<4|pt[s[6]],a:t===9?pt[s[7]]<<4|pt[s[8]]:255})),e}var Pc=(s,t)=>s<255?t(s):"";function Ac(s){var t=Dc(s)?Oc:Tc;return s?"#"+t(s.r)+t(s.g)+t(s.b)+Pc(s.a,t):void 0}var Ic=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Bo(s,t,e){let i=t*Math.min(e,1-e),n=(o,r=(o+s/30)%12)=>e-i*Math.max(Math.min(r-3,9-r,1),-1);return[n(0),n(8),n(4)]}function Ec(s,t,e){let i=(n,o=(n+s/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[i(5),i(3),i(1)]}function Lc(s,t,e){let i=Bo(s,1,.5),n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)i[n]*=1-t-e,i[n]+=t;return i}function Fc(s,t,e,i,n){return s===n?(t-e)/i+(t.5?h/(2-o-r):h/(o+r),l=Fc(e,i,n,h,o),l=l*60+.5),[l|0,c||0,a]}function Gi(s,t,e,i){return(Array.isArray(t)?s(t[0],t[1],t[2]):s(t,e,i)).map(qt)}function Xi(s,t,e){return Gi(Bo,s,t,e)}function Rc(s,t,e){return Gi(Lc,s,t,e)}function Nc(s,t,e){return Gi(Ec,s,t,e)}function Ho(s){return(s%360+360)%360}function zc(s){let t=Ic.exec(s),e=255,i;if(!t)return;t[5]!==i&&(e=t[6]?cs(+t[5]):qt(+t[5]));let n=Ho(+t[2]),o=+t[3]/100,r=+t[4]/100;return t[1]==="hwb"?i=Rc(n,o,r):t[1]==="hsv"?i=Nc(n,o,r):i=Xi(n,o,r),{r:i[0],g:i[1],b:i[2],a:e}}function Vc(s,t){var e=qi(s);e[0]=Ho(e[0]+t),e=Xi(e),s.r=e[0],s.g=e[1],s.b=e[2]}function Wc(s){if(!s)return;let t=qi(s),e=t[0],i=No(t[1]),n=No(t[2]);return s.a<255?`hsla(${e}, ${i}%, ${n}%, ${Nt(s.a)})`:`hsl(${e}, ${i}%, ${n}%)`}var zo={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Vo={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function Bc(){let s={},t=Object.keys(Vo),e=Object.keys(zo),i,n,o,r,a;for(i=0;i>16&255,o>>8&255,o&255]}return s}var Ys;function Hc(s){Ys||(Ys=Bc(),Ys.transparent=[0,0,0,0]);let t=Ys[s.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var $c=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function jc(s){let t=$c.exec(s),e=255,i,n,o;if(t){if(t[7]!==i){let r=+t[7];e=t[8]?cs(r):Zt(r*255,0,255)}return i=+t[1],n=+t[3],o=+t[5],i=255&(t[2]?cs(i):Zt(i,0,255)),n=255&(t[4]?cs(n):Zt(n,0,255)),o=255&(t[6]?cs(o):Zt(o,0,255)),{r:i,g:n,b:o,a:e}}}function Uc(s){return s&&(s.a<255?`rgba(${s.r}, ${s.g}, ${s.b}, ${Nt(s.a)})`:`rgb(${s.r}, ${s.g}, ${s.b})`)}var Yi=s=>s<=.0031308?s*12.92:Math.pow(s,1/2.4)*1.055-.055,De=s=>s<=.04045?s/12.92:Math.pow((s+.055)/1.055,2.4);function Yc(s,t,e){let i=De(Nt(s.r)),n=De(Nt(s.g)),o=De(Nt(s.b));return{r:qt(Yi(i+e*(De(Nt(t.r))-i))),g:qt(Yi(n+e*(De(Nt(t.g))-n))),b:qt(Yi(o+e*(De(Nt(t.b))-o))),a:s.a+e*(t.a-s.a)}}function Zs(s,t,e){if(s){let i=qi(s);i[t]=Math.max(0,Math.min(i[t]+i[t]*e,t===0?360:1)),i=Xi(i),s.r=i[0],s.g=i[1],s.b=i[2]}}function $o(s,t){return s&&Object.assign(t||{},s)}function Wo(s){var t={r:0,g:0,b:0,a:255};return Array.isArray(s)?s.length>=3&&(t={r:s[0],g:s[1],b:s[2],a:255},s.length>3&&(t.a=qt(s[3]))):(t=$o(s,{r:0,g:0,b:0,a:1}),t.a=qt(t.a)),t}function Zc(s){return s.charAt(0)==="r"?jc(s):zc(s)}var hs=class s{constructor(t){if(t instanceof s)return t;let e=typeof t,i;e==="object"?i=Wo(t):e==="string"&&(i=Cc(t)||Hc(t)||Zc(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=$o(this._rgb);return t&&(t.a=Nt(t.a)),t}set rgb(t){this._rgb=Wo(t)}rgbString(){return this._valid?Uc(this._rgb):void 0}hexString(){return this._valid?Ac(this._rgb):void 0}hslString(){return this._valid?Wc(this._rgb):void 0}mix(t,e){if(t){let i=this.rgb,n=t.rgb,o,r=e===o?.5:e,a=2*r-1,l=i.a-n.a,c=((a*l===-1?a:(a+l)/(1+a*l))+1)/2;o=1-c,i.r=255&c*i.r+o*n.r+.5,i.g=255&c*i.g+o*n.g+.5,i.b=255&c*i.b+o*n.b+.5,i.a=r*i.a+(1-r)*n.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=Yc(this._rgb,t._rgb,e)),this}clone(){return new s(this.rgb)}alpha(t){return this._rgb.a=qt(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=us(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Zs(this._rgb,2,t),this}darken(t){return Zs(this._rgb,2,-t),this}saturate(t){return Zs(this._rgb,1,t),this}desaturate(t){return Zs(this._rgb,1,-t),this}rotate(t){return Vc(this._rgb,t),this}};function At(){}var tr=(()=>{let s=0;return()=>s++})();function I(s){return s==null}function H(s){if(Array.isArray&&Array.isArray(s))return!0;let t=Object.prototype.toString.call(s);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function E(s){return s!==null&&Object.prototype.toString.call(s)==="[object Object]"}function Z(s){return(typeof s=="number"||s instanceof Number)&&isFinite(+s)}function at(s,t){return Z(s)?s:t}function P(s,t){return typeof s>"u"?t:s}var er=(s,t)=>typeof s=="string"&&s.endsWith("%")?parseFloat(s)/100:+s/t,tn=(s,t)=>typeof s=="string"&&s.endsWith("%")?parseFloat(s)/100*t:+s;function W(s,t,e){if(s&&typeof s.call=="function")return s.apply(e,t)}function z(s,t,e,i){let n,o,r;if(H(s))if(o=s.length,i)for(n=o-1;n>=0;n--)t.call(e,s[n],n);else for(n=0;ns,x:s=>s.x,y:s=>s.y};function Xc(s){let t=s.split("."),e=[],i="";for(let n of t)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(e.push(i),i="");return e}function Jc(s){let t=Xc(s);return e=>{for(let i of t){if(i==="")break;e=e&&e[i]}return e}}function Wt(s,t){return(jo[t]||(jo[t]=Jc(t)))(s)}function ei(s){return s.charAt(0).toUpperCase()+s.slice(1)}var Ee=s=>typeof s<"u",zt=s=>typeof s=="function",en=(s,t)=>{if(s.size!==t.size)return!1;for(let e of s)if(!t.has(e))return!1;return!0};function ir(s){return s.type==="mouseup"||s.type==="click"||s.type==="contextmenu"}var F=Math.PI,$=2*F,Kc=$+F,Ks=Number.POSITIVE_INFINITY,Qc=F/180,q=F/2,he=F/4,Uo=F*2/3,Vt=Math.log10,St=Math.sign;function Le(s,t,e){return Math.abs(s-t)n-o).pop(),t}function th(s){return typeof s=="symbol"||typeof s=="object"&&s!==null&&!(Symbol.toPrimitive in s||"toString"in s||"valueOf"in s)}function fe(s){return!th(s)&&!isNaN(parseFloat(s))&&isFinite(s)}function or(s,t){let e=Math.round(s);return e-t<=s&&e+t>=s}function nn(s,t,e){let i,n,o;for(i=0,n=s.length;il&&c=Math.min(t,e)-i&&s<=Math.max(t,e)+i}function ii(s,t,e){e=e||(r=>s[r]1;)o=n+i>>1,e(o)?n=o:i=o;return{lo:n,hi:i}}var Ct=(s,t,e,i)=>ii(s,e,i?n=>{let o=s[n][t];return os[n][t]ii(s,e,i=>s[i][t]>=e);function lr(s,t,e){let i=0,n=s.length;for(;ii&&s[n-1]>e;)n--;return i>0||n{let i="_onData"+ei(e),n=s[e];Object.defineProperty(s,e,{configurable:!0,enumerable:!1,value(...o){let r=n.apply(this,o);return s._chartjs.listeners.forEach(a=>{typeof a[i]=="function"&&a[i](...o)}),r}})})}function an(s,t){let e=s._chartjs;if(!e)return;let i=e.listeners,n=i.indexOf(t);n!==-1&&i.splice(n,1),!(i.length>0)&&(cr.forEach(o=>{delete s[o]}),delete s._chartjs)}function ln(s){let t=new Set(s);return t.size===s.length?s:Array.from(t)}var cn=(function(){return typeof window>"u"?function(s){return s()}:window.requestAnimationFrame})();function hn(s,t){let e=[],i=!1;return function(...n){e=n,i||(i=!0,cn.call(window,()=>{i=!1,s.apply(t,e)}))}}function ur(s,t){let e;return function(...i){return t?(clearTimeout(e),e=setTimeout(s,t,i)):s.apply(this,i),t}}var ni=s=>s==="start"?"left":s==="end"?"right":"center",it=(s,t,e)=>s==="start"?t:s==="end"?e:(t+e)/2,dr=(s,t,e,i)=>s===(i?"left":"right")?e:s==="center"?(t+e)/2:t;function un(s,t,e){let i=t.length,n=0,o=i;if(s._sorted){let{iScale:r,vScale:a,_parsed:l}=s,c=s.dataset&&s.dataset.options?s.dataset.options.spanGaps:null,h=r.axis,{min:u,max:d,minDefined:f,maxDefined:g}=r.getUserBounds();if(f){if(n=Math.min(Ct(l,h,u).lo,e?i:Ct(t,h,r.getPixelForValue(u)).lo),c){let m=l.slice(0,n+1).reverse().findIndex(p=>!I(p[a.axis]));n-=Math.max(0,m)}n=K(n,0,i-1)}if(g){let m=Math.max(Ct(l,r.axis,d,!0).hi+1,e?0:Ct(t,h,r.getPixelForValue(d),!0).hi+1);if(c){let p=l.slice(m-1).findIndex(b=>!I(b[a.axis]));m+=Math.max(0,p)}o=K(m,n,i)-n}else o=i-n}return{start:n,count:o}}function dn(s){let{xScale:t,yScale:e,_scaleRanges:i}=s,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!i)return s._scaleRanges=n,!0;let o=i.xmin!==t.min||i.xmax!==t.max||i.ymin!==e.min||i.ymax!==e.max;return Object.assign(i,n),o}var qs=s=>s===0||s===1,Yo=(s,t,e)=>-(Math.pow(2,10*(s-=1))*Math.sin((s-t)*$/e)),Zo=(s,t,e)=>Math.pow(2,-10*s)*Math.sin((s-t)*$/e)+1,Ce={linear:s=>s,easeInQuad:s=>s*s,easeOutQuad:s=>-s*(s-2),easeInOutQuad:s=>(s/=.5)<1?.5*s*s:-.5*(--s*(s-2)-1),easeInCubic:s=>s*s*s,easeOutCubic:s=>(s-=1)*s*s+1,easeInOutCubic:s=>(s/=.5)<1?.5*s*s*s:.5*((s-=2)*s*s+2),easeInQuart:s=>s*s*s*s,easeOutQuart:s=>-((s-=1)*s*s*s-1),easeInOutQuart:s=>(s/=.5)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2),easeInQuint:s=>s*s*s*s*s,easeOutQuint:s=>(s-=1)*s*s*s*s+1,easeInOutQuint:s=>(s/=.5)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2),easeInSine:s=>-Math.cos(s*q)+1,easeOutSine:s=>Math.sin(s*q),easeInOutSine:s=>-.5*(Math.cos(F*s)-1),easeInExpo:s=>s===0?0:Math.pow(2,10*(s-1)),easeOutExpo:s=>s===1?1:-Math.pow(2,-10*s)+1,easeInOutExpo:s=>qs(s)?s:s<.5?.5*Math.pow(2,10*(s*2-1)):.5*(-Math.pow(2,-10*(s*2-1))+2),easeInCirc:s=>s>=1?s:-(Math.sqrt(1-s*s)-1),easeOutCirc:s=>Math.sqrt(1-(s-=1)*s),easeInOutCirc:s=>(s/=.5)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1),easeInElastic:s=>qs(s)?s:Yo(s,.075,.3),easeOutElastic:s=>qs(s)?s:Zo(s,.075,.3),easeInOutElastic(s){return qs(s)?s:s<.5?.5*Yo(s*2,.1125,.45):.5+.5*Zo(s*2-1,.1125,.45)},easeInBack(s){return s*s*((1.70158+1)*s-1.70158)},easeOutBack(s){return(s-=1)*s*((1.70158+1)*s+1.70158)+1},easeInOutBack(s){let t=1.70158;return(s/=.5)<1?.5*(s*s*(((t*=1.525)+1)*s-t)):.5*((s-=2)*s*(((t*=1.525)+1)*s+t)+2)},easeInBounce:s=>1-Ce.easeOutBounce(1-s),easeOutBounce(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},easeInOutBounce:s=>s<.5?Ce.easeInBounce(s*2)*.5:Ce.easeOutBounce(s*2-1)*.5+.5};function fn(s){if(s&&typeof s=="object"){let t=s.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function gn(s){return fn(s)?s:new hs(s)}function Ji(s){return fn(s)?s:new hs(s).saturate(.5).darken(.1).hexString()}var sh=["x","y","borderWidth","radius","tension"],ih=["color","borderColor","backgroundColor"];function nh(s){s.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),s.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>t!=="onProgress"&&t!=="onComplete"&&t!=="fn"}),s.set("animations",{colors:{type:"color",properties:ih},numbers:{type:"number",properties:sh}}),s.describe("animations",{_fallback:"animation"}),s.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>t|0}}}})}function oh(s){s.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var qo=new Map;function rh(s,t){t=t||{};let e=s+JSON.stringify(t),i=qo.get(e);return i||(i=new Intl.NumberFormat(s,t),qo.set(e,i)),i}function Re(s,t,e){return rh(t,e).format(s)}var fr={values(s){return H(s)?s:""+s},numeric(s,t,e){if(s===0)return"0";let i=this.chart.options.locale,n,o=s;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),o=ah(s,e)}let r=Vt(Math.abs(o)),a=isNaN(r)?1:Math.max(Math.min(-1*Math.floor(r),20),0),l={notation:n,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),Re(s,i,l)},logarithmic(s,t,e){if(s===0)return"0";let i=e[t].significand||s/Math.pow(10,Math.floor(Vt(s)));return[1,2,3,5,10,15].includes(i)||t>.8*e.length?fr.numeric.call(this,s,t,e):""}};function ah(s,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&s!==Math.floor(s)&&(e=s-Math.floor(s)),e}var ms={formatters:fr};function lh(s){s.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ms.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),s.route("scale.ticks","color","","color"),s.route("scale.grid","color","","borderColor"),s.route("scale.border","color","","borderColor"),s.route("scale.title","color","","color"),s.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&t!=="callback"&&t!=="parser",_indexable:t=>t!=="borderDash"&&t!=="tickBorderDash"&&t!=="dash"}),s.describe("scales",{_fallback:"scale"}),s.describe("scale.ticks",{_scriptable:t=>t!=="backdropPadding"&&t!=="callback",_indexable:t=>t!=="backdropPadding"})}var Jt=Object.create(null),oi=Object.create(null);function ds(s,t){if(!t)return s;let e=t.split(".");for(let i=0,n=e.length;ii.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(i,n)=>Ji(n.backgroundColor),this.hoverBorderColor=(i,n)=>Ji(n.borderColor),this.hoverColor=(i,n)=>Ji(n.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Ki(this,t,e)}get(t){return ds(this,t)}describe(t,e){return Ki(oi,t,e)}override(t,e){return Ki(Jt,t,e)}route(t,e,i,n){let o=ds(this,t),r=ds(this,i),a="_"+e;Object.defineProperties(o,{[a]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[a],c=r[n];return E(l)?Object.assign({},c,l):P(l,c)},set(l){this[a]=l}}})}apply(t){t.forEach(e=>e(this))}},j=new Qi({_scriptable:s=>!s.startsWith("on"),_indexable:s=>s!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[nh,oh,lh]);function ch(s){return!s||I(s.size)||I(s.family)?null:(s.style?s.style+" ":"")+(s.weight?s.weight+" ":"")+s.size+"px "+s.family}function fs(s,t,e,i,n){let o=t[n];return o||(o=t[n]=s.measureText(n).width,e.push(n)),o>i&&(i=o),i}function gr(s,t,e,i){i=i||{};let n=i.data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==t&&(n=i.data={},o=i.garbageCollect=[],i.font=t),s.save(),s.font=t;let r=0,a=e.length,l,c,h,u,d;for(l=0;le.length){for(l=0;l0&&s.stroke()}}function Pt(s,t,e){return e=e||.5,!t||s&&s.x>t.left-e&&s.xt.top-e&&s.y0&&o.strokeColor!=="",l,c;for(s.save(),s.font=n.string,hh(s,o),l=0;l+s||0;function ai(s,t){let e={},i=E(t),n=i?Object.keys(t):t,o=E(s)?i?r=>P(s[r],s[t[r]]):r=>s[r]:()=>s;for(let r of n)e[r]=ph(o(r));return e}function bn(s){return ai(s,{top:"y",right:"x",bottom:"y",left:"x"})}function te(s){return ai(s,["topLeft","topRight","bottomLeft","bottomRight"])}function nt(s){let t=bn(s);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function X(s,t){s=s||{},t=t||j.font;let e=P(s.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let i=P(s.style,t.style);i&&!(""+i).match(gh)&&(console.warn('Invalid font style specified: "'+i+'"'),i=void 0);let n={family:P(s.family,t.family),lineHeight:mh(P(s.lineHeight,t.lineHeight),e),size:e,style:i,weight:P(s.weight,t.weight),string:""};return n.string=ch(n),n}function ze(s,t,e,i){let n=!0,o,r,a;for(o=0,r=s.length;oe&&a===0?0:a+l;return{min:r(i,-Math.abs(o)),max:r(n,o)}}function Bt(s,t){return Object.assign(Object.create(s),t)}function li(s,t=[""],e,i,n=()=>s[0]){let o=e||s;typeof i>"u"&&(i=_r("_fallback",s));let r={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:s,_rootScopes:o,_fallback:i,_getTarget:n,override:a=>li([a,...s],t,o,i)};return new Proxy(r,{deleteProperty(a,l){return delete a[l],delete a._keys,delete s[0][l],!0},get(a,l){return yr(a,l,()=>Sh(l,t,s,a))},getOwnPropertyDescriptor(a,l){return Reflect.getOwnPropertyDescriptor(a._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(s[0])},has(a,l){return Xo(a).includes(l)},ownKeys(a){return Xo(a)},set(a,l,c){let h=a._storage||(a._storage=n());return a[l]=h[l]=c,delete a._keys,!0}})}function de(s,t,e,i){let n={_cacheable:!1,_proxy:s,_context:t,_subProxy:e,_stack:new Set,_descriptors:yn(s,i),setContext:o=>de(s,o,e,i),override:o=>de(s.override(o),t,e,i)};return new Proxy(n,{deleteProperty(o,r){return delete o[r],delete s[r],!0},get(o,r,a){return yr(o,r,()=>yh(o,r,a))},getOwnPropertyDescriptor(o,r){return o._descriptors.allKeys?Reflect.has(s,r)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(s,r)},getPrototypeOf(){return Reflect.getPrototypeOf(s)},has(o,r){return Reflect.has(s,r)},ownKeys(){return Reflect.ownKeys(s)},set(o,r,a){return s[r]=a,delete o[r],!0}})}function yn(s,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:i=t.indexable,_allKeys:n=t.allKeys}=s;return{allKeys:n,scriptable:e,indexable:i,isScriptable:zt(e)?e:()=>e,isIndexable:zt(i)?i:()=>i}}var bh=(s,t)=>s?s+ei(t):t,xn=(s,t)=>E(t)&&s!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function yr(s,t,e){if(Object.prototype.hasOwnProperty.call(s,t)||t==="constructor")return s[t];let i=e();return s[t]=i,i}function yh(s,t,e){let{_proxy:i,_context:n,_subProxy:o,_descriptors:r}=s,a=i[t];return zt(a)&&r.isScriptable(t)&&(a=xh(t,a,s,e)),H(a)&&a.length&&(a=_h(t,a,s,r.isIndexable)),xn(t,a)&&(a=de(a,n,o&&o[t],r)),a}function xh(s,t,e,i){let{_proxy:n,_context:o,_subProxy:r,_stack:a}=e;if(a.has(s))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+s);a.add(s);let l=t(o,r||i);return a.delete(s),xn(s,l)&&(l=_n(n._scopes,n,s,l)),l}function _h(s,t,e,i){let{_proxy:n,_context:o,_subProxy:r,_descriptors:a}=e;if(typeof o.index<"u"&&i(s))return t[o.index%t.length];if(E(t[0])){let l=t,c=n._scopes.filter(h=>h!==l);t=[];for(let h of l){let u=_n(c,n,s,h);t.push(de(u,o,r&&r[s],a))}}return t}function xr(s,t,e){return zt(s)?s(t,e):s}var wh=(s,t)=>s===!0?t:typeof s=="string"?Wt(t,s):void 0;function kh(s,t,e,i,n){for(let o of t){let r=wh(e,o);if(r){s.add(r);let a=xr(r._fallback,e,n);if(typeof a<"u"&&a!==e&&a!==i)return a}else if(r===!1&&typeof i<"u"&&e!==i)return null}return!1}function _n(s,t,e,i){let n=t._rootScopes,o=xr(t._fallback,e,i),r=[...s,...n],a=new Set;a.add(i);let l=Go(a,r,e,o||e,i);return l===null||typeof o<"u"&&o!==e&&(l=Go(a,r,o,l,i),l===null)?!1:li(Array.from(a),[""],n,o,()=>vh(t,e,i))}function Go(s,t,e,i,n){for(;e;)e=kh(s,t,e,i,n);return e}function vh(s,t,e){let i=s._getTarget();t in i||(i[t]={});let n=i[t];return H(n)&&E(e)?e:n||{}}function Sh(s,t,e,i){let n;for(let o of t)if(n=_r(bh(o,s),e),typeof n<"u")return xn(s,n)?_n(e,i,s,n):n}function _r(s,t){for(let e of t){if(!e)continue;let i=e[s];if(typeof i<"u")return i}}function Xo(s){let t=s._keys;return t||(t=s._keys=Mh(s._scopes)),t}function Mh(s){let t=new Set;for(let e of s)for(let i of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(i);return Array.from(t)}function wn(s,t,e,i){let{iScale:n}=s,{key:o="r"}=this._parsing,r=new Array(i),a,l,c,h;for(a=0,l=i;ats==="x"?"y":"x";function Th(s,t,e,i){let n=s.skip?t:s,o=t,r=e.skip?t:e,a=Qs(o,n),l=Qs(r,o),c=a/(a+l),h=l/(a+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let u=i*c,d=i*h;return{previous:{x:o.x-u*(r.x-n.x),y:o.y-u*(r.y-n.y)},next:{x:o.x+d*(r.x-n.x),y:o.y+d*(r.y-n.y)}}}function Dh(s,t,e){let i=s.length,n,o,r,a,l,c=Ae(s,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")Ph(s,n);else{let c=i?s[s.length-1]:s[0];for(o=0,r=s.length;os.ownerDocument.defaultView.getComputedStyle(s,null);function Ih(s,t){return ui(s).getPropertyValue(t)}var Eh=["top","right","bottom","left"];function ue(s,t,e){let i={};e=e?"-"+e:"";for(let n=0;n<4;n++){let o=Eh[n];i[o]=parseFloat(s[t+"-"+o+e])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}var Lh=(s,t,e)=>(s>0||t>0)&&(!e||!e.shadowRoot);function Fh(s,t){let e=s.touches,i=e&&e.length?e[0]:s,{offsetX:n,offsetY:o}=i,r=!1,a,l;if(Lh(n,o,s.target))a=n,l=o;else{let c=t.getBoundingClientRect();a=i.clientX-c.left,l=i.clientY-c.top,r=!0}return{x:a,y:l,box:r}}function ee(s,t){if("native"in s)return s;let{canvas:e,currentDevicePixelRatio:i}=t,n=ui(e),o=n.boxSizing==="border-box",r=ue(n,"padding"),a=ue(n,"border","width"),{x:l,y:c,box:h}=Fh(s,e),u=r.left+(h&&a.left),d=r.top+(h&&a.top),{width:f,height:g}=t;return o&&(f-=r.width+a.width,g-=r.height+a.height),{x:Math.round((l-u)/f*e.width/i),y:Math.round((c-d)/g*e.height/i)}}function Rh(s,t,e){let i,n;if(t===void 0||e===void 0){let o=s&&hi(s);if(!o)t=s.clientWidth,e=s.clientHeight;else{let r=o.getBoundingClientRect(),a=ui(o),l=ue(a,"border","width"),c=ue(a,"padding");t=r.width-c.width-l.width,e=r.height-c.height-l.height,i=ti(a.maxWidth,o,"clientWidth"),n=ti(a.maxHeight,o,"clientHeight")}}return{width:t,height:e,maxWidth:i||Ks,maxHeight:n||Ks}}var Xt=s=>Math.round(s*10)/10;function vr(s,t,e,i){let n=ui(s),o=ue(n,"margin"),r=ti(n.maxWidth,s,"clientWidth")||Ks,a=ti(n.maxHeight,s,"clientHeight")||Ks,l=Rh(s,t,e),{width:c,height:h}=l;if(n.boxSizing==="content-box"){let d=ue(n,"border","width"),f=ue(n,"padding");c-=f.width+d.width,h-=f.height+d.height}return c=Math.max(0,c-o.width),h=Math.max(0,i?c/i:h-o.height),c=Xt(Math.min(c,r,l.maxWidth)),h=Xt(Math.min(h,a,l.maxHeight)),c&&!h&&(h=Xt(c/2)),(t!==void 0||e!==void 0)&&i&&l.height&&h>l.height&&(h=l.height,c=Xt(Math.floor(h*i))),{width:c,height:h}}function kn(s,t,e){let i=t||1,n=Xt(s.height*i),o=Xt(s.width*i);s.height=Xt(s.height),s.width=Xt(s.width);let r=s.canvas;return r.style&&(e||!r.style.height&&!r.style.width)&&(r.style.height=`${s.height}px`,r.style.width=`${s.width}px`),s.currentDevicePixelRatio!==i||r.height!==n||r.width!==o?(s.currentDevicePixelRatio=i,r.height=n,r.width=o,s.ctx.setTransform(i,0,0,i,0,0),!0):!1}var Sr=(function(){let s=!1;try{let t={get passive(){return s=!0,!1}};ci()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch{}return s})();function vn(s,t){let e=Ih(s,t),i=e&&e.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function Gt(s,t,e,i){return{x:s.x+e*(t.x-s.x),y:s.y+e*(t.y-s.y)}}function Mr(s,t,e,i){return{x:s.x+e*(t.x-s.x),y:i==="middle"?e<.5?s.y:t.y:i==="after"?e<1?s.y:t.y:e>0?t.y:s.y}}function Or(s,t,e,i){let n={x:s.cp2x,y:s.cp2y},o={x:t.cp1x,y:t.cp1y},r=Gt(s,n,e),a=Gt(n,o,e),l=Gt(o,t,e),c=Gt(r,a,e),h=Gt(a,l,e);return Gt(c,h,e)}var Nh=function(s,t){return{x(e){return s+s+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,i){return e-i},leftForLtr(e,i){return e-i}}},zh=function(){return{x(s){return s},setWidth(s){},textAlign(s){return s},xPlus(s,t){return s+t},leftForLtr(s,t){return s}}};function ge(s,t,e){return s?Nh(t,e):zh()}function Sn(s,t){let e,i;(t==="ltr"||t==="rtl")&&(e=s.canvas.style,i=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),s.prevTextDirection=i)}function Mn(s,t){t!==void 0&&(delete s.prevTextDirection,s.canvas.style.setProperty("direction",t[0],t[1]))}function Tr(s){return s==="angle"?{between:Fe,compare:eh,normalize:st}:{between:It,compare:(t,e)=>t-e,normalize:t=>t}}function Jo({start:s,end:t,count:e,loop:i,style:n}){return{start:s%e,end:t%e,loop:i&&(t-s+1)%e===0,style:n}}function Vh(s,t,e){let{property:i,start:n,end:o}=e,{between:r,normalize:a}=Tr(i),l=t.length,{start:c,end:h,loop:u}=s,d,f;if(u){for(c+=l,h+=l,d=0,f=l;dl(n,_,b)&&a(n,_)!==0,x=()=>a(o,b)===0||l(o,_,b),k=()=>m||w(),S=()=>!m||x();for(let M=h,T=h;M<=u;++M)y=t[M%r],!y.skip&&(b=c(y[i]),b!==_&&(m=l(b,n,o),p===null&&k()&&(p=a(b,n)===0?M:T),p!==null&&S()&&(g.push(Jo({start:p,end:M,loop:d,count:r,style:f})),p=null),T=M,_=b));return p!==null&&g.push(Jo({start:p,end:u,loop:d,count:r,style:f})),g}function Tn(s,t){let e=[],i=s.segments;for(let n=0;nn&&s[o%t].skip;)o--;return o%=t,{start:n,end:o}}function Bh(s,t,e,i){let n=s.length,o=[],r=t,a=s[t],l;for(l=t+1;l<=e;++l){let c=s[l%n];c.skip||c.stop?a.skip||(i=!1,o.push({start:t%n,end:(l-1)%n,loop:i}),t=r=c.stop?l:null):(r=l,a.skip&&(t=l)),a=c}return r!==null&&o.push({start:t%n,end:r%n,loop:i}),o}function Dr(s,t){let e=s.points,i=s.options.spanGaps,n=e.length;if(!n)return[];let o=!!s._loop,{start:r,end:a}=Wh(e,n,o,i);if(i===!0)return Ko(s,[{start:r,end:a,loop:o}],e,t);let l=aa({chart:t,initial:e.initial,numSteps:r,currentStep:Math.min(i-e.start,r)}))}_refresh(){this._request||(this._running=!0,this._request=cn.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((i,n)=>{if(!i.running||!i.items.length)return;let o=i.items,r=o.length-1,a=!1,l;for(;r>=0;--r)l=o[r],l._active?(l._total>i.duration&&(i.duration=l._total),l.tick(t),a=!0):(o[r]=o[o.length-1],o.pop());a&&(n.draw(),this._notify(n,i,t,"progress")),o.length||(i.running=!1,this._notify(n,i,t,"complete"),i.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((i,n)=>Math.max(i,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let i=e.items,n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},Ht=new Wn,Cr="transparent",Uh={boolean(s,t,e){return e>.5?t:s},color(s,t,e){let i=gn(s||Cr),n=i.valid&&gn(t||Cr);return n&&n.valid?n.mix(i,e).hexString():t},number(s,t,e){return s+(t-s)*e}},Bn=class{constructor(t,e,i,n){let o=e[i];n=ze([t.to,n,o,t.from]);let r=ze([t.from,o,n]);this._active=!0,this._fn=t.fn||Uh[t.type||typeof r],this._easing=Ce[t.easing]||Ce.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=r,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);let n=this._target[this._prop],o=i-this._start,r=this._duration-o;this._start=i,this._duration=Math.floor(Math.max(r,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=ze([t.to,e,n,t.from]),this._from=ze([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,i=this._duration,n=this._prop,o=this._from,r=this._loop,a=this._to,l;if(this._active=o!==a&&(r||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,a,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,i)=>{t.push({res:e,rej:i})})}_notify(t){let e=t?"res":"rej",i=this._promises||[];for(let n=0;n{let o=t[n];if(!E(o))return;let r={};for(let a of e)r[a]=o[a];(H(o.properties)&&o.properties||[n]).forEach(a=>{(a===n||!i.has(a))&&i.set(a,r)})})}_animateOptions(t,e){let i=e.options,n=Zh(t,i);if(!n)return[];let o=this._createAnimations(n,i);return i.$shared&&Yh(t.options.$animations,i).then(()=>{t.options=i},()=>{}),o}_createAnimations(t,e){let i=this._properties,n=[],o=t.$animations||(t.$animations={}),r=Object.keys(e),a=Date.now(),l;for(l=r.length-1;l>=0;--l){let c=r[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}let h=e[c],u=o[c],d=i.get(c);if(u)if(d&&u.active()){u.update(d,h,a);continue}else u.cancel();if(!d||!d.duration){t[c]=h;continue}o[c]=u=new Bn(d,t,c,h),n.push(u)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let i=this._createAnimations(t,e);if(i.length)return Ht.add(this._chart,i),!0}};function Yh(s,t){let e=[],i=Object.keys(t);for(let n=0;n0||!e&&o<0)return n.index}return null}function Er(s,t){let{chart:e,_cachedMeta:i}=s,n=e._stacks||(e._stacks={}),{iScale:o,vScale:r,index:a}=i,l=o.axis,c=r.axis,h=Jh(o,r,i),u=t.length,d;for(let f=0;fe[i].axis===t).shift()}function tu(s,t){return Bt(s,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function eu(s,t,e){return Bt(s,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function ys(s,t){let e=s.controller.index,i=s.vScale&&s.vScale.axis;if(i){t=t||s._parsed;for(let n of t){let o=n._stacks;if(!o||o[i]===void 0||o[i][e]===void 0)return;delete o[i][e],o[i]._visualValues!==void 0&&o[i]._visualValues[e]!==void 0&&delete o[i]._visualValues[e]}}}var An=s=>s==="reset"||s==="none",Lr=(s,t)=>t?s:Object.assign({},s),su=(s,t,e)=>s&&!t.hidden&&t._stacked&&{keys:Da(e,!0),values:null},ut=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Cn(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&ys(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,i=this.getDataset(),n=(u,d,f,g)=>u==="x"?d:u==="r"?g:f,o=e.xAxisID=P(i.xAxisID,Pn(t,"x")),r=e.yAxisID=P(i.yAxisID,Pn(t,"y")),a=e.rAxisID=P(i.rAxisID,Pn(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,o,r,a),h=e.vAxisID=n(l,r,o,a);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(r),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&an(this._data,this),t._stacked&&ys(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(E(e)){let n=this._cachedMeta;this._data=Xh(e,n)}else if(i!==e){if(i){an(i,this);let n=this._cachedMeta;ys(n),n._parsed=[]}e&&Object.isExtensible(e)&&hr(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,i=this.getDataset(),n=!1;this._dataCheck();let o=e._stacked;e._stacked=Cn(e.vScale,e),e.stack!==i.stack&&(n=!0,ys(e),e.stack=i.stack),this._resyncElements(t),(n||o!==e._stacked)&&(Er(this,e._parsed),e._stacked=Cn(e.vScale,e))}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:i,_data:n}=this,{iScale:o,_stacked:r}=i,a=o.axis,l=t===0&&e===n.length?!0:i._sorted,c=t>0&&i._parsed[t-1],h,u,d;if(this._parsing===!1)i._parsed=n,i._sorted=!0,d=n;else{H(n[t])?d=this.parseArrayData(i,n,t,e):E(n[t])?d=this.parseObjectData(i,n,t,e):d=this.parsePrimitiveData(i,n,t,e);let f=()=>u[a]===null||c&&u[a]m||u=0;--d)if(!g()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,i=[],n,o,r;for(n=0,o=e.length;n=0&&tthis.getContext(i,n,e),m=c.resolveNamedOptions(d,f,g,u);return m.$shared&&(m.$shared=l,o[r]=Object.freeze(Lr(m,l))),m}_resolveAnimations(t,e,i){let n=this.chart,o=this._cachedDataOpts,r=`animation-${e}`,a=o[r];if(a)return a;let l;if(n.options.animation!==!1){let h=this.chart.config,u=h.datasetAnimationScopeKeys(this._type,e),d=h.getOptionScopes(this.getDataset(),u);l=h.createResolver(d,this.getContext(t,i,e))}let c=new _i(n,l&&l.animations);return l&&l._cacheable&&(o[r]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||An(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(i),r=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,i),{sharedOptions:o,includeOptions:r}}updateElement(t,e,i,n){An(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!An(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;let o=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,i=this._cachedMeta.data;for(let[a,l,c]of this._syncList)this[a](l,c);this._syncList=[];let n=i.length,o=e.length,r=Math.min(o,n);r&&this.parse(0,r),o>n?this._insertElements(n,o-n,t):o{for(c.length+=e,a=c.length-1;a>=r;a--)c[a]=c[a-e]};for(l(o),a=t;an-o))}return s._cache.$bar}function nu(s){let t=s.iScale,e=iu(t,s.type),i=t._length,n,o,r,a,l=()=>{r===32767||r===-32768||(Ee(a)&&(i=Math.min(i,Math.abs(r-a)||i)),a=r)};for(n=0,o=e.length;n0?n[s-1]:null,a=sMath.abs(a)&&(l=a,c=r),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:o,min:r,max:a}}function Ca(s,t,e,i){return H(s)?au(s,t,e,i):t[e.axis]=e.parse(s,i),t}function Fr(s,t,e,i){let n=s.iScale,o=s.vScale,r=n.getLabels(),a=n===o,l=[],c,h,u,d;for(c=e,h=e+i;c=e?1:-1)}function cu(s){let t,e,i,n,o;return s.horizontal?(t=s.base>s.x,e="left",i="right"):(t=s.baseh.controller.options.grouped),o=i.options.stacked,r=[],a=this._cachedMeta.controller.getParsed(e),l=a&&a[i.axis],c=h=>{let u=h._parsed.find(f=>f[i.axis]===l),d=u&&u[h.vScale.axis];if(I(d)||isNaN(d))return!0};for(let h of n)if(!(e!==void 0&&c(h))&&((o===!1||r.indexOf(h.stack)===-1||o===void 0&&h.stack===void 0)&&r.push(h.stack),h.index===t))break;return r.length||r.push(void 0),r}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(i=>t[i].axis===e).shift()}_getAxis(){let t={},e=this.getFirstScaleIdForIndexAxis();for(let i of this.chart.data.datasets)t[P(this.chart.options.indexAxis==="x"?i.xAxisID:i.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,i){let n=this._getStacks(t,i),o=e!==void 0?n.indexOf(e):-1;return o===-1?n.length-1:o}_getRuler(){let t=this.options,e=this._cachedMeta,i=e.iScale,n=[],o,r;for(o=0,r=e.data.length;o=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:n,yScale:o}=e,r=this.getParsed(t),a=n.getLabelForValue(r.x),l=o.getLabelForValue(r.y),c=r._custom;return{label:i[t]||"",value:"("+a+", "+l+(c?", "+c:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){let o=n==="reset",{iScale:r,vScale:a}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=r.axis,u=a.axis;for(let d=e;dFe(_,a,l,!0)?1:Math.max(w,w*e,x,x*e),g=(_,w,x)=>Fe(_,a,l,!0)?-1:Math.min(w,w*e,x,x*e),m=f(0,c,u),p=f(q,h,d),b=g(F,c,u),y=g(F+q,h,d);i=(m-b)/2,n=(p-y)/2,o=-(m+b)/2,r=-(p+y)/2}return{ratioX:i,ratioY:n,offsetX:o,offsetY:r}}var jt=class extends ut{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let i=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=i;else{let o=l=>+i[l];if(E(i[t])){let{key:l="value"}=this._parsing;o=c=>+Wt(i[c],l)}let r,a;for(r=t,a=t+e;r0&&!isNaN(t)?$*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Re(e._parsed[t],i.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){let e=0,i=this.chart,n,o,r,a,l;if(!t){for(n=0,o=i.data.datasets.length;nt!=="spacing",_indexable:t=>t!=="spacing"&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),v(jt,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data,{labels:{pointStyle:i,textAlign:n,color:o,useBorderRadius:r,borderRadius:a}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((l,c)=>{let u=t.getDatasetMeta(0).controller.getStyle(c);return{text:l,fillStyle:u.backgroundColor,fontColor:o,hidden:!t.getDataVisibility(c),lineDash:u.borderDash,lineDashOffset:u.borderDashOffset,lineJoin:u.borderJoinStyle,lineWidth:u.borderWidth,strokeStyle:u.borderColor,textAlign:n,pointStyle:i,borderRadius:r&&(a||u.borderRadius),index:c}}):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}});var He=class extends ut{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:i,data:n=[],_dataset:o}=e,r=this.chart._animationsDisabled,{start:a,count:l}=un(e,n,r);this._drawStart=a,this._drawCount=l,dn(e)&&(a=0,l=n.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!o._decimated,i.points=n;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(i,void 0,{animated:!r,options:c},t),this.updateElements(n,a,l,t)}updateElements(t,e,i,n){let o=n==="reset",{iScale:r,vScale:a,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:u}=this._getSharedOptions(e,n),d=r.axis,f=a.axis,{spanGaps:g,segment:m}=this.options,p=fe(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||n==="none",y=e+i,_=t.length,w=e>0&&this.getParsed(e-1);for(let x=0;x<_;++x){let k=t[x],S=b?k:{};if(x=y){S.skip=!0;continue}let M=this.getParsed(x),T=I(M[f]),C=S[d]=r.getPixelForValue(M[d],x),A=S[f]=o||T?a.getBasePixel():a.getPixelForValue(l?this.applyStack(a,M,l):M[f],x);S.skip=isNaN(C)||isNaN(A)||T,S.stop=x>0&&Math.abs(M[d]-w[d])>p,m&&(S.parsed=M,S.raw=c.data[x]),u&&(S.options=h||this.resolveDataElementOptions(x,k.active?"active":n)),b||this.updateElement(k,x,S,n),w=M}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;let o=n[0].size(this.resolveDataElementOptions(0)),r=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,o,r)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};v(He,"id","line"),v(He,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),v(He,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});var xe=class extends ut{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Re(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:o}}parseObjectData(t,e,i,n){return wn.bind(this)(t,e,i,n)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((i,n)=>{let o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(oe.max&&(e.max=o))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),r=Math.max(i.cutoutPercentage?o/100*i.cutoutPercentage:1,0),a=(o-r)/t.getVisibleDatasetCount();this.outerRadius=o-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,e,i,n){let o=n==="reset",r=this.chart,l=r.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,u=c.yCenter,d=c.getIndexAngle(0)-.5*F,f=d,g,m=360/this.countVisibleElements();for(g=0;g{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?bt(this.resolveDataElementOptions(t,e).angle||i):0}};v(xe,"id","polarArea"),v(xe,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),v(xe,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data;if(e.labels.length&&e.datasets.length){let{labels:{pointStyle:i,color:n}}=t.legend.options;return e.labels.map((o,r)=>{let l=t.getDatasetMeta(0).controller.getStyle(r);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:n,lineWidth:l.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(r),index:r}})}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var vs=class extends jt{};v(vs,"id","pie"),v(vs,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});var $e=class extends ut{getLabelAndValue(t){let e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,n){return wn.bind(this)(t,e,i,n)}update(t){let e=this._cachedMeta,i=e.dataset,n=e.data||[],o=e.iScale.getLabels();if(i.points=n,t!=="resize"){let r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0);let a={_loop:!0,_fullLoop:o.length===n.length,options:r};this.updateElement(i,void 0,a,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,i,n){let o=this._cachedMeta.rScale,r=n==="reset";for(let a=e;a0&&this.getParsed(e-1);for(let w=e;w0&&Math.abs(k[f]-_[f])>b,p&&(S.parsed=k,S.raw=c.data[w]),d&&(S.options=u||this.resolveDataElementOptions(w,x.active?"active":n)),y||this.updateElement(x,w,S,n),_=k}this.updateSharedOptions(u,n,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let a=0;for(let l=e.length-1;l>=0;--l)a=Math.max(a,e[l].size(this.resolveDataElementOptions(l))/2);return a>0&&a}let i=t.dataset,n=i.options&&i.options.borderWidth||0;if(!e.length)return n;let o=e[0].size(this.resolveDataElementOptions(0)),r=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,o,r)/2}};v(je,"id","scatter"),v(je,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),v(je,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});var gu=Object.freeze({__proto__:null,BarController:We,BubbleController:Be,DoughnutController:jt,LineController:He,PieController:vs,PolarAreaController:xe,RadarController:$e,ScatterController:je});function me(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var Hn=class s{constructor(t){v(this,"options");this.options=t||{}}static override(t){Object.assign(s.prototype,t)}init(){}formats(){return me()}parse(){return me()}format(){return me()}add(){return me()}diff(){return me()}startOf(){return me()}endOf(){return me()}},to={_date:Hn};function mu(s,t,e,i){let{controller:n,data:o,_sorted:r}=s,a=n._cachedMeta.iScale,l=s.dataset&&s.dataset.options?s.dataset.options.spanGaps:null;if(a&&t===a.axis&&t!=="r"&&r&&o.length){let c=a._reversePixels?ar:Ct;if(i){if(n._sharedOptions){let h=o[0],u=typeof h.getRange=="function"&&h.getRange(t);if(u){let d=c(o,t,e-u),f=c(o,t,e+u);return{lo:d.lo,hi:f.hi}}}}else{let h=c(o,t,e);if(l){let{vScale:u}=n._cachedMeta,{_parsed:d}=s,f=d.slice(0,h.lo+1).reverse().findIndex(m=>!I(m[u.axis]));h.lo-=Math.max(0,f);let g=d.slice(h.hi).findIndex(m=>!I(m[u.axis]));h.hi+=Math.max(0,g)}return h}}return{lo:0,hi:o.length-1}}function Ls(s,t,e,i,n){let o=s.getSortedVisibleDatasetMetas(),r=e[t];for(let a=0,l=o.length;a{l[r]&&l[r](t[e],n)&&(o.push({element:l,datasetIndex:c,index:h}),a=a||l.inRange(t.x,t.y,n))}),i&&!a?[]:o}var xu={evaluateInteractionItems:Ls,modes:{index(s,t,e,i){let n=ee(t,s),o=e.axis||"x",r=e.includeInvisible||!1,a=e.intersect?En(s,n,o,i,r):Ln(s,n,o,!1,i,r),l=[];return a.length?(s.getSortedVisibleDatasetMetas().forEach(c=>{let h=a[0].index,u=c.data[h];u&&!u.skip&&l.push({element:u,datasetIndex:c.index,index:h})}),l):[]},dataset(s,t,e,i){let n=ee(t,s),o=e.axis||"xy",r=e.includeInvisible||!1,a=e.intersect?En(s,n,o,i,r):Ln(s,n,o,!1,i,r);if(a.length>0){let l=a[0].datasetIndex,c=s.getDatasetMeta(l).data;a=[];for(let h=0;he.pos===t)}function Vr(s,t){return s.filter(e=>Pa.indexOf(e.pos)===-1&&e.box.axis===t)}function _s(s,t){return s.sort((e,i)=>{let n=t?i:e,o=t?e:i;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function _u(s){let t=[],e,i,n,o,r,a;for(e=0,i=(s||[]).length;ec.box.fullSize),!0),i=_s(xs(t,"left"),!0),n=_s(xs(t,"right")),o=_s(xs(t,"top"),!0),r=_s(xs(t,"bottom")),a=Vr(t,"x"),l=Vr(t,"y");return{fullSize:e,leftAndTop:i.concat(o),rightAndBottom:n.concat(l).concat(r).concat(a),chartArea:xs(t,"chartArea"),vertical:i.concat(n).concat(l),horizontal:o.concat(r).concat(a)}}function Wr(s,t,e,i){return Math.max(s[e],t[e])+Math.max(s[i],t[i])}function Aa(s,t){s.top=Math.max(s.top,t.top),s.left=Math.max(s.left,t.left),s.bottom=Math.max(s.bottom,t.bottom),s.right=Math.max(s.right,t.right)}function Su(s,t,e,i){let{pos:n,box:o}=e,r=s.maxPadding;if(!E(n)){e.size&&(s[n]-=e.size);let u=i[e.stack]||{size:0,count:1};u.size=Math.max(u.size,e.horizontal?o.height:o.width),e.size=u.size/u.count,s[n]+=e.size}o.getPadding&&Aa(r,o.getPadding());let a=Math.max(0,t.outerWidth-Wr(r,s,"left","right")),l=Math.max(0,t.outerHeight-Wr(r,s,"top","bottom")),c=a!==s.w,h=l!==s.h;return s.w=a,s.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Mu(s){let t=s.maxPadding;function e(i){let n=Math.max(t[i]-s[i],0);return s[i]+=n,n}s.y+=e("top"),s.x+=e("left"),e("right"),e("bottom")}function Ou(s,t){let e=t.maxPadding;function i(n){let o={left:0,top:0,right:0,bottom:0};return n.forEach(r=>{o[r]=Math.max(t[r],e[r])}),o}return i(s?["left","right"]:["top","bottom"])}function Ss(s,t,e,i){let n=[],o,r,a,l,c,h;for(o=0,r=s.length,c=0;o{typeof m.beforeLayout=="function"&&m.beforeLayout()});let h=l.reduce((m,p)=>p.box.options&&p.box.options.display===!1?m:m+1,0)||1,u=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:r,vBoxMaxWidth:o/2/h,hBoxMaxHeight:r/2}),d=Object.assign({},n);Aa(d,nt(i));let f=Object.assign({maxPadding:d,w:o,h:r,x:n.left,y:n.top},n),g=ku(l.concat(c),u);Ss(a.fullSize,f,u,g),Ss(l,f,u,g),Ss(c,f,u,g)&&Ss(l,f,u,g),Mu(f),Br(a.leftAndTop,f,u,g),f.x+=f.w,f.y+=f.h,Br(a.rightAndBottom,f,u,g),s.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},z(a.chartArea,m=>{let p=m.box;Object.assign(p,s.chartArea),p.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}},wi=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}updateConfig(t){}},$n=class extends wi{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},yi="$chartjs",Tu={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Hr=s=>s===null||s==="";function Du(s,t){let e=s.style,i=s.getAttribute("height"),n=s.getAttribute("width");if(s[yi]={initial:{height:i,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",Hr(n)){let o=vn(s,"width");o!==void 0&&(s.width=o)}if(Hr(i))if(s.style.height==="")s.height=s.width/(t||2);else{let o=vn(s,"height");o!==void 0&&(s.height=o)}return s}var Ia=Sr?{passive:!0}:!1;function Cu(s,t,e){s&&s.addEventListener(t,e,Ia)}function Pu(s,t,e){s&&s.canvas&&s.canvas.removeEventListener(t,e,Ia)}function Au(s,t){let e=Tu[s.type]||s.type,{x:i,y:n}=ee(s,t);return{type:e,chart:t,native:s,x:i!==void 0?i:null,y:n!==void 0?n:null}}function ki(s,t){for(let e of s)if(e===t||e.contains(t))return!0}function Iu(s,t,e){let i=s.canvas,n=new MutationObserver(o=>{let r=!1;for(let a of o)r=r||ki(a.addedNodes,i),r=r&&!ki(a.removedNodes,i);r&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function Eu(s,t,e){let i=s.canvas,n=new MutationObserver(o=>{let r=!1;for(let a of o)r=r||ki(a.removedNodes,i),r=r&&!ki(a.addedNodes,i);r&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}var As=new Map,$r=0;function Ea(){let s=window.devicePixelRatio;s!==$r&&($r=s,As.forEach((t,e)=>{e.currentDevicePixelRatio!==s&&t()}))}function Lu(s,t){As.size||window.addEventListener("resize",Ea),As.set(s,t)}function Fu(s){As.delete(s),As.size||window.removeEventListener("resize",Ea)}function Ru(s,t,e){let i=s.canvas,n=i&&hi(i);if(!n)return;let o=hn((a,l)=>{let c=n.clientWidth;e(a,l),c{let l=a[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||o(c,h)});return r.observe(n),Lu(s,o),r}function Fn(s,t,e){e&&e.disconnect(),t==="resize"&&Fu(s)}function Nu(s,t,e){let i=s.canvas,n=hn(o=>{s.ctx!==null&&e(Au(o,s))},s);return Cu(i,t,n),n}var jn=class extends wi{acquireContext(t,e){let i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(Du(t,e),i):null}releaseContext(t){let e=t.canvas;if(!e[yi])return!1;let i=e[yi].initial;["height","width"].forEach(o=>{let r=i[o];I(r)?e.removeAttribute(o):e.setAttribute(o,r)});let n=i.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[yi],!0}addEventListener(t,e,i){this.removeEventListener(t,e);let n=t.$proxies||(t.$proxies={}),r={attach:Iu,detach:Eu,resize:Ru}[e]||Nu;n[e]=r(t,e,i)}removeEventListener(t,e){let i=t.$proxies||(t.$proxies={}),n=i[e];if(!n)return;({attach:Fn,detach:Fn,resize:Fn}[e]||Pu)(t,e,n),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return vr(t,e,i,n)}isAttached(t){let e=t&&hi(t);return!!(e&&e.isConnected)}};function zu(s){return!ci()||typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas?$n:jn}var dt=class{constructor(){v(this,"x");v(this,"y");v(this,"active",!1);v(this,"options");v(this,"$animations")}tooltipPosition(t){let{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return fe(this.x)&&fe(this.y)}getProps(t,e){let i=this.$animations;if(!e||!i)return this;let n={};return t.forEach(o=>{n[o]=i[o]&&i[o].active()?i[o]._to:this[o]}),n}};v(dt,"defaults",{}),v(dt,"defaultRoutes");function Vu(s,t){let e=s.options.ticks,i=Wu(s),n=Math.min(e.maxTicksLimit||i,i),o=e.major.enabled?Hu(t):[],r=o.length,a=o[0],l=o[r-1],c=[];if(r>n)return $u(t,c,o,r/n),c;let h=Bu(o,t,n);if(r>0){let u,d,f=r>1?Math.round((l-a)/(r-1)):null;for(fi(t,c,h,I(f)?0:a-f,a),u=0,d=r-1;un)return l}return Math.max(n,1)}function Hu(s){let t=[],e,i;for(e=0,i=s.length;es==="left"?"right":s==="right"?"left":s,jr=(s,t,e)=>t==="top"||t==="left"?s[t]+e:s[t]-e,Ur=(s,t)=>Math.min(t||s,s);function Yr(s,t){let e=[],i=s.length/t,n=s.length,o=0;for(;or+a)))return l}function Zu(s,t){z(s,e=>{let i=e.gc,n=i.length/2,o;if(n>t){for(o=0;oi?i:e,i=n&&e>i?e:i,{min:at(e,at(i,e)),max:at(i,at(e,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){W(this.options.beforeUpdate,[this])}update(t,e,i){let{beginAtZero:n,grace:o,ticks:r}=this.options,a=r.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=br(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=a=o||i<=1||!this.isHorizontal()){this.labelRotation=n;return}let h=this._getLabelSizes(),u=h.widest.width,d=h.highest.height,f=K(this.chart.width-u,0,this.maxWidth);a=t.offset?this.maxWidth/i:f/(i-1),u+6>a&&(a=f/(i-(t.offset?.5:1)),l=this.maxHeight-ws(t.grid)-e.padding-Zr(t.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),r=si(Math.min(Math.asin(K((h.highest.height+6)/a,-1,1)),Math.asin(K(l/c,-1,1))-Math.asin(K(d/c,-1,1)))),r=Math.max(n,Math.min(o,r))),this.labelRotation=r}afterCalculateLabelRotation(){W(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){W(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:i,title:n,grid:o}}=this,r=this._isVisible(),a=this.isHorizontal();if(r){let l=Zr(n,e.options.font);if(a?(t.width=this.maxWidth,t.height=ws(o)+l):(t.height=this.maxHeight,t.width=ws(o)+l),i.display&&this.ticks.length){let{first:c,last:h,widest:u,highest:d}=this._getLabelSizes(),f=i.padding*2,g=bt(this.labelRotation),m=Math.cos(g),p=Math.sin(g);if(a){let b=i.mirror?0:p*u.width+m*d.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{let b=i.mirror?0:m*u.width+p*d.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,h,p,m)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,n){let{ticks:{align:o,padding:r},position:a}=this.options,l=this.labelRotation!==0,c=a!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,u=this.right-this.getPixelForTick(this.ticks.length-1),d=0,f=0;l?c?(d=n*t.width,f=i*e.height):(d=i*t.height,f=n*e.width):o==="start"?f=e.width:o==="end"?d=t.width:o!=="inner"&&(d=t.width/2,f=e.width/2),this.paddingLeft=Math.max((d-h+r)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-u+r)*this.width/(this.width-u),0)}else{let h=e.height/2,u=t.height/2;o==="start"?(h=0,u=t.height):o==="end"&&(h=e.height,u=0),this.paddingTop=h+r,this.paddingBottom=u+r}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){W(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,i;for(e=0,i=t.length;e({width:r[T]||0,height:a[T]||0});return{first:M(0),last:M(e-1),widest:M(k),highest:M(S),widths:r,heights:a}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return rr(this._alignToPixels?Kt(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&ta*n?a/i:l/n:l*n0}_computeGridLineItems(t){let e=this.axis,i=this.chart,n=this.options,{grid:o,position:r,border:a}=n,l=o.offset,c=this.isHorizontal(),u=this.ticks.length+(l?1:0),d=ws(o),f=[],g=a.setContext(this.getContext()),m=g.display?g.width:0,p=m/2,b=function(U){return Kt(i,U,m)},y,_,w,x,k,S,M,T,C,A,L,et;if(r==="top")y=b(this.bottom),S=this.bottom-d,T=y-p,A=b(t.top)+p,et=t.bottom;else if(r==="bottom")y=b(this.top),A=t.top,et=b(t.bottom)-p,S=y+p,T=this.top+d;else if(r==="left")y=b(this.right),k=this.right-d,M=y-p,C=b(t.left)+p,L=t.right;else if(r==="right")y=b(this.left),C=t.left,L=b(t.right)-p,k=y+p,M=this.left+d;else if(e==="x"){if(r==="center")y=b((t.top+t.bottom)/2+.5);else if(E(r)){let U=Object.keys(r)[0],G=r[U];y=b(this.chart.scales[U].getPixelForValue(G))}A=t.top,et=t.bottom,S=y+p,T=S+d}else if(e==="y"){if(r==="center")y=b((t.left+t.right)/2);else if(E(r)){let U=Object.keys(r)[0],G=r[U];y=b(this.chart.scales[U].getPixelForValue(G))}k=y-p,M=k-d,C=t.left,L=t.right}let ht=P(n.ticks.maxTicksLimit,u),V=Math.max(1,Math.ceil(u/ht));for(_=0;_0&&(ce-=le/2);break}js={left:ce,top:ls,width:le+Te.width,height:as+Te.height,color:V.backdropColor}}p.push({label:w,font:T,textOffset:L,options:{rotation:m,color:G,strokeColor:vt,strokeWidth:ot,textAlign:Oe,textBaseline:et,translation:[x,k],backdrop:js}})}return p}_getXAxisLabelAlignment(){let{position:t,ticks:e}=this.options;if(-bt(this.labelRotation))return t==="top"?"left":"right";let n="center";return e.align==="start"?n="left":e.align==="end"?n="right":e.align==="inner"&&(n="inner"),n}_getYAxisLabelAlignment(t){let{position:e,ticks:{crossAlign:i,mirror:n,padding:o}}=this.options,r=this._getLabelSizes(),a=t+o,l=r.widest.width,c,h;return e==="left"?n?(h=this.right+o,i==="near"?c="left":i==="center"?(c="center",h+=l/2):(c="right",h+=l)):(h=this.right-a,i==="near"?c="right":i==="center"?(c="center",h-=l/2):(c="left",h=this.left)):e==="right"?n?(h=this.left+o,i==="near"?c="right":i==="center"?(c="center",h-=l/2):(c="left",h-=l)):(h=this.left+a,i==="near"?c="left":i==="center"?(c="center",h+=l/2):(c="right",h=this.right)):c="right",{textAlign:c,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;let t=this.chart,e=this.options.position;if(e==="left"||e==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(e==="top"||e==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){let{ctx:t,options:{backgroundColor:e},left:i,top:n,width:o,height:r}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,n,o,r),t.restore())}getLineWidthForValue(t){let e=this.options.grid;if(!this._isVisible()||!e.display)return 0;let n=this.ticks.findIndex(o=>o.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){let e=this.options.grid,i=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o,r,a=(l,c,h)=>{!h.width||!h.color||(i.save(),i.lineWidth=h.width,i.strokeStyle=h.color,i.setLineDash(h.borderDash||[]),i.lineDashOffset=h.borderDashOffset,i.beginPath(),i.moveTo(l.x,l.y),i.lineTo(c.x,c.y),i.stroke(),i.restore())};if(e.display)for(o=0,r=n.length;o{this.draw(o)}}]:[{z:i,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",n=[],o,r;for(o=0,r=e.length;o{let i=e.split("."),n=i.pop(),o=[s].concat(i).join("."),r=t[e].split("."),a=r.pop(),l=r.join(".");j.route(o,n,l,a)})}function td(s){return"id"in s&&"defaults"in s}var Un=class{constructor(){this.controllers=new Ze(ut,"datasets",!0),this.elements=new Ze(dt,"elements"),this.plugins=new Ze(Object,"plugins"),this.scales=new Ze(we,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(n=>{let o=i||this._getRegistryForType(n);i||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):z(n,r=>{let a=i||this._getRegistryForType(r);this._exec(t,a,r)})})}_exec(t,e,i){let n=ei(t);W(i["before"+n],[],i),e[t](i),W(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;eo.filter(a=>!r.some(l=>a.plugin.id===l.plugin.id));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}};function ed(s){let t={},e=[],i=Object.keys(Lt.plugins.items);for(let o=0;o1&&qr(s[0].toLowerCase());if(i)return i}throw new Error(`Cannot determine type of '${s}' axis. Please provide 'axis' or 'position' option.`)}function Gr(s,t,e){if(e[t+"AxisID"]===s)return{axis:t}}function ld(s,t){if(t.data&&t.data.datasets){let e=t.data.datasets.filter(i=>i.xAxisID===s||i.yAxisID===s);if(e.length)return Gr(s,"x",e[0])||Gr(s,"y",e[0])}return{}}function cd(s,t){let e=Jt[s.type]||{scales:{}},i=t.scales||{},n=Zn(s.type,t),o=Object.create(null);return Object.keys(i).forEach(r=>{let a=i[r];if(!E(a))return console.error(`Invalid scale configuration for scale: ${r}`);if(a._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${r}`);let l=qn(r,a,ld(r,s),j.scales[a.type]),c=rd(l,n),h=e.scales||{};o[r]=Ie(Object.create(null),[{axis:l},a,h[l],h[c]])}),s.data.datasets.forEach(r=>{let a=r.type||s.type,l=r.indexAxis||Zn(a,t),h=(Jt[a]||{}).scales||{};Object.keys(h).forEach(u=>{let d=od(u,l),f=r[d+"AxisID"]||d;o[f]=o[f]||Object.create(null),Ie(o[f],[{axis:d},i[f],h[u]])})}),Object.keys(o).forEach(r=>{let a=o[r];Ie(a,[j.scales[a.type],j.scale])}),o}function La(s){let t=s.options||(s.options={});t.plugins=P(t.plugins,{}),t.scales=cd(s,t)}function Fa(s){return s=s||{},s.datasets=s.datasets||[],s.labels=s.labels||[],s}function hd(s){return s=s||{},s.data=Fa(s.data),La(s),s}var Xr=new Map,Ra=new Set;function gi(s,t){let e=Xr.get(s);return e||(e=t(),Xr.set(s,e),Ra.add(e)),e}var ks=(s,t,e)=>{let i=Wt(t,e);i!==void 0&&s.add(i)},Gn=class{constructor(t){this._config=hd(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Fa(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),La(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return gi(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return gi(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return gi(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,i=this.type;return gi(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let i=this._scopeCache,n=i.get(t);return(!n||e)&&(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){let{options:n,type:o}=this,r=this._cachedScopes(t,i),a=r.get(e);if(a)return a;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(u=>ks(l,t,u))),h.forEach(u=>ks(l,n,u)),h.forEach(u=>ks(l,Jt[o]||{},u)),h.forEach(u=>ks(l,j,u)),h.forEach(u=>ks(l,oi,u))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),Ra.has(e)&&r.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,Jt[e]||{},j.datasets[e]||{},{type:e},j,oi]}resolveNamedOptions(t,e,i,n=[""]){let o={$shared:!0},{resolver:r,subPrefixes:a}=Jr(this._resolverCache,t,n),l=r;if(dd(r,e)){o.$shared=!1,i=zt(i)?i():i;let c=this.createResolver(t,i,a);l=de(r,i,c)}for(let c of e)o[c]=l[c];return o}createResolver(t,e,i=[""],n){let{resolver:o}=Jr(this._resolverCache,t,i);return E(e)?de(o,e,void 0,n):o}};function Jr(s,t,e){let i=s.get(t);i||(i=new Map,s.set(t,i));let n=e.join(),o=i.get(n);return o||(o={resolver:li(t,e),subPrefixes:e.filter(a=>!a.toLowerCase().includes("hover"))},i.set(n,o)),o}var ud=s=>E(s)&&Object.getOwnPropertyNames(s).some(t=>zt(s[t]));function dd(s,t){let{isScriptable:e,isIndexable:i}=yn(s);for(let n of t){let o=e(n),r=i(n),a=(r||o)&&s[n];if(o&&(zt(a)||ud(a))||r&&H(a))return!0}return!1}var fd="4.5.1",gd=["top","bottom","left","right","chartArea"];function Kr(s,t){return s==="top"||s==="bottom"||gd.indexOf(s)===-1&&t==="x"}function Qr(s,t){return function(e,i){return e[s]===i[s]?e[t]-i[t]:e[s]-i[s]}}function ta(s){let t=s.chart,e=t.options.animation;t.notifyPlugins("afterRender"),W(e&&e.onComplete,[s],t)}function md(s){let t=s.chart,e=t.options.animation;W(e&&e.onProgress,[s],t)}function Na(s){return ci()&&typeof s=="string"?s=document.getElementById(s):s&&s.length&&(s=s[0]),s&&s.canvas&&(s=s.canvas),s}var xi={},ea=s=>{let t=Na(s);return Object.values(xi).filter(e=>e.canvas===t).pop()};function pd(s,t,e){let i=Object.keys(s);for(let n of i){let o=+n;if(o>=t){let r=s[n];delete s[n],(e>0||o>t)&&(s[o+e]=r)}}}function bd(s,t,e,i){return!e||s.type==="mouseout"?null:i?t:s}var yt=class{static register(...t){Lt.add(...t),sa()}static unregister(...t){Lt.remove(...t),sa()}constructor(t,e){let i=this.config=new Gn(e),n=Na(t),o=ea(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");let r=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||zu(n)),this.platform.updateConfig(i);let a=this.platform.acquireContext(n,r.aspectRatio),l=a&&a.canvas,c=l&&l.height,h=l&&l.width;if(this.id=tr(),this.ctx=a,this.canvas=l,this.width=h,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Yn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ur(u=>this.update(u),r.resizeDelay||0),this._dataChanges=[],xi[this.id]=this,!a||!l){console.error("Failed to create chart: can't acquire context from the given item");return}Ht.listen(this,"complete",ta),Ht.listen(this,"progress",md),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return I(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Lt}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():kn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return mn(this.canvas,this.ctx),this}stop(){return Ht.stop(this),this}resize(t,e){Ht.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let i=this.options,n=this.canvas,o=i.maintainAspectRatio&&this.aspectRatio,r=this.platform.getMaximumSize(n,t,e,o),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=r.width,this.height=r.height,this._aspectRatio=this.aspectRatio,kn(this,a,!0)&&(this.notifyPlugins("resize",{size:r}),W(i.onResize,[this,r],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};z(e,(i,n)=>{i.id=n})}buildOrUpdateScales(){let t=this.options,e=t.scales,i=this.scales,n=Object.keys(i).reduce((r,a)=>(r[a]=!1,r),{}),o=[];e&&(o=o.concat(Object.keys(e).map(r=>{let a=e[r],l=qn(r,a),c=l==="r",h=l==="x";return{options:a,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),z(o,r=>{let a=r.options,l=a.id,c=qn(l,a),h=P(a.type,r.dtype);(a.position===void 0||Kr(a.position,c)!==Kr(r.dposition))&&(a.position=r.dposition),n[l]=!0;let u=null;if(l in i&&i[l].type===h)u=i[l];else{let d=Lt.getScale(h);u=new d({id:l,type:h,ctx:this.ctx,chart:this}),i[u.id]=u}u.init(a,t)}),z(n,(r,a)=>{r||delete i[a]}),z(i,r=>{rt.configure(this,r,r.options),rt.addBox(this,r)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((n,o)=>n.index-o.index),i>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((i,n)=>{e.filter(o=>o===i._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,i,n;for(this._removeUnreferencedMetasets(),i=0,n=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let r=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Qr("z","_idx"));let{_active:a,_lastEvent:l}=this;l?this._eventHandler(l,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){z(this.scales,t=>{rt.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);(!en(e,i)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:i,start:n,count:o}of e){let r=i==="_removeElements"?-o:o;pd(t,n,r)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,i=o=>new Set(t.filter(r=>r[0]===o).map((r,a)=>a+","+r.splice(1).join(","))),n=i(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;rt.update(this,this.width,this.height,t);let e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],z(this.boxes,n=>{i&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,i=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,i={meta:t,index:t.index,cancelable:!0},n=Dn(this,t);this.notifyPlugins("beforeDatasetDraw",i)!==!1&&(n&&ps(e,n),t.controller.draw(),n&&bs(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Pt(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,n){let o=xu.modes[e];return typeof o=="function"?o(this,t,i,n):[]}getDatasetMeta(t){let e=this.data.datasets[t],i=this._metasets,n=i.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context=Bt(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let i=this.getDatasetMeta(t);return typeof i.hidden=="boolean"?!i.hidden:!e.hidden}setDatasetVisibility(t,e){let i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){let n=i?"show":"hide",o=this.getDatasetMeta(t),r=o.controller._resolveAnimations(void 0,n);Ee(e)?(o.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),r.update(o,{visible:i}),this.update(a=>a.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),Ht.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,o,r),t[o]=r},n=(o,r,a)=>{o.offsetX=r,o.offsetY=a,this._eventHandler(o)};z(this.options.events,o=>i(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,i=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)},r,a=()=>{n("attach",a),this.attached=!0,this.resize(),i("resize",o),i("detach",r)};r=()=>{this.attached=!1,n("resize",o),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():r()}unbindEvents(){z(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},z(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){let n=i?"set":"remove",o,r,a,l;for(e==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),a=0,l=t.length;a{let a=this.getDatasetMeta(o);if(!a)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:a.data[r],index:r}});!gs(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,i){let n=this.options.hover,o=(l,c)=>l.filter(h=>!c.some(u=>h.datasetIndex===u.datasetIndex&&h.index===u.index)),r=o(e,t),a=i?t:o(t,e);r.length&&this.updateHoverStyle(r,n.mode,!1),a.length&&n.mode&&this.updateHoverStyle(a,n.mode,!0)}_eventHandler(t,e){let i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=r=>(r.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",i,n)===!1)return;let o=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,n),(o||i.changed)&&this.render(),this}_handleEvent(t,e,i){let{_active:n=[],options:o}=this,r=e,a=this._getActiveElements(t,n,i,r),l=ir(t),c=bd(t,this._lastEvent,i,l);i&&(this._lastEvent=null,W(o.onHover,[t,a,this],this),l&&W(o.onClick,[t,a,this],this));let h=!gs(a,n);return(h||e)&&(this._active=a,this._updateHoverStyles(a,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,i,n){if(t.type==="mouseout")return[];if(!i)return e;let o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}};v(yt,"defaults",j),v(yt,"instances",xi),v(yt,"overrides",Jt),v(yt,"registry",Lt),v(yt,"version",fd),v(yt,"getChart",ea);function sa(){return z(yt.instances,s=>s._plugins.invalidate())}function yd(s,t,e){let{startAngle:i,x:n,y:o,outerRadius:r,innerRadius:a,options:l}=t,{borderWidth:c,borderJoinStyle:h}=l,u=Math.min(c/r,st(i-e));if(s.beginPath(),s.arc(n,o,r-c/2,i+u/2,e-u/2),a>0){let d=Math.min(c/a,st(i-e));s.arc(n,o,a+c/2,e-d/2,i+d/2,!0)}else{let d=Math.min(c/2,r*st(i-e));if(h==="round")s.arc(n,o,d,e-F/2,i+F/2,!0);else if(h==="bevel"){let f=2*d*d,g=-f*Math.cos(e+F/2)+n,m=-f*Math.sin(e+F/2)+o,p=f*Math.cos(i+F/2)+n,b=f*Math.sin(i+F/2)+o;s.lineTo(g,m),s.lineTo(p,b)}}s.closePath(),s.moveTo(0,0),s.rect(0,0,s.canvas.width,s.canvas.height),s.clip("evenodd")}function xd(s,t,e){let{startAngle:i,pixelMargin:n,x:o,y:r,outerRadius:a,innerRadius:l}=t,c=n/a;s.beginPath(),s.arc(o,r,a,i-c,e+c),l>n?(c=n/l,s.arc(o,r,l,e+c,i-c,!0)):s.arc(o,r,n,e+q,i-q),s.closePath(),s.clip()}function _d(s){return ai(s,["outerStart","outerEnd","innerStart","innerEnd"])}function wd(s,t,e,i){let n=_d(s.options.borderRadius),o=(e-t)/2,r=Math.min(o,i*t/2),a=l=>{let c=(e-Math.min(o,l))*i/2;return K(l,0,Math.min(o,c))};return{outerStart:a(n.outerStart),outerEnd:a(n.outerEnd),innerStart:K(n.innerStart,0,r),innerEnd:K(n.innerEnd,0,r)}}function Ve(s,t,e,i){return{x:e+s*Math.cos(t),y:i+s*Math.sin(t)}}function vi(s,t,e,i,n,o){let{x:r,y:a,startAngle:l,pixelMargin:c,innerRadius:h}=t,u=Math.max(t.outerRadius+i+e-c,0),d=h>0?h+i+e+c:0,f=0,g=n-l;if(i){let V=h>0?h-i:0,U=u>0?u-i:0,G=(V+U)/2,vt=G!==0?g*G/(G+i):g;f=(g-vt)/2}let m=Math.max(.001,g*u-e/F)/u,p=(g-m)/2,b=l+p+f,y=n-p-f,{outerStart:_,outerEnd:w,innerStart:x,innerEnd:k}=wd(t,d,u,y-b),S=u-_,M=u-w,T=b+_/S,C=y-w/M,A=d+x,L=d+k,et=b+x/A,ht=y-k/L;if(s.beginPath(),o){let V=(T+C)/2;if(s.arc(r,a,u,T,V),s.arc(r,a,u,V,C),w>0){let ot=Ve(M,C,r,a);s.arc(ot.x,ot.y,w,C,y+q)}let U=Ve(L,y,r,a);if(s.lineTo(U.x,U.y),k>0){let ot=Ve(L,ht,r,a);s.arc(ot.x,ot.y,k,y+q,ht+Math.PI)}let G=(y-k/d+(b+x/d))/2;if(s.arc(r,a,d,y-k/d,G,!0),s.arc(r,a,d,G,b+x/d,!0),x>0){let ot=Ve(A,et,r,a);s.arc(ot.x,ot.y,x,et+Math.PI,b-q)}let vt=Ve(S,b,r,a);if(s.lineTo(vt.x,vt.y),_>0){let ot=Ve(S,T,r,a);s.arc(ot.x,ot.y,_,b-q,T)}}else{s.moveTo(r,a);let V=Math.cos(T)*u+r,U=Math.sin(T)*u+a;s.lineTo(V,U);let G=Math.cos(C)*u+r,vt=Math.sin(C)*u+a;s.lineTo(G,vt)}s.closePath()}function kd(s,t,e,i,n){let{fullCircles:o,startAngle:r,circumference:a}=t,l=t.endAngle;if(o){vi(s,t,e,i,l,n);for(let c=0;c=F&&f===0&&h!=="miter"&&yd(s,t,m),o||(vi(s,t,e,i,m,n),s.stroke())}var be=class extends dt{constructor(e){super();v(this,"circumference");v(this,"endAngle");v(this,"fullCircles");v(this,"innerRadius");v(this,"outerRadius");v(this,"pixelMargin");v(this,"startAngle");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,i,n){let o=this.getProps(["x","y"],n),{angle:r,distance:a}=rn(o,{x:e,y:i}),{startAngle:l,endAngle:c,innerRadius:h,outerRadius:u,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),f=(this.options.spacing+this.options.borderWidth)/2,g=P(d,c-l),m=Fe(r,l,c)&&l!==c,p=g>=$||m,b=It(a,h+f,u+f);return p&&b}getCenterPoint(e){let{x:i,y:n,startAngle:o,endAngle:r,innerRadius:a,outerRadius:l}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:c,spacing:h}=this.options,u=(o+r)/2,d=(a+l+h+c)/2;return{x:i+Math.cos(u)*d,y:n+Math.sin(u)*d}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:i,circumference:n}=this,o=(i.offset||0)/4,r=(i.spacing||0)/2,a=i.circular;if(this.pixelMargin=i.borderAlign==="inner"?.33:0,this.fullCircles=n>$?Math.floor(n/$):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let l=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(l)*o,Math.sin(l)*o);let c=1-Math.sin(Math.min(F,n||0)),h=o*c;e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,kd(e,this,h,r,a),vd(e,this,h,r,a),e.restore()}};v(be,"id","arc"),v(be,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),v(be,"defaultRoutes",{backgroundColor:"backgroundColor"}),v(be,"descriptors",{_scriptable:!0,_indexable:e=>e!=="borderDash"});function za(s,t,e=t){s.lineCap=P(e.borderCapStyle,t.borderCapStyle),s.setLineDash(P(e.borderDash,t.borderDash)),s.lineDashOffset=P(e.borderDashOffset,t.borderDashOffset),s.lineJoin=P(e.borderJoinStyle,t.borderJoinStyle),s.lineWidth=P(e.borderWidth,t.borderWidth),s.strokeStyle=P(e.borderColor,t.borderColor)}function Sd(s,t,e){s.lineTo(e.x,e.y)}function Md(s){return s.stepped?mr:s.tension||s.cubicInterpolationMode==="monotone"?pr:Sd}function Va(s,t,e={}){let i=s.length,{start:n=0,end:o=i-1}=e,{start:r,end:a}=t,l=Math.max(n,r),c=Math.min(o,a),h=na&&o>a;return{count:i,start:l,loop:t.loop,ilen:c(r+(c?a-w:w))%o,_=()=>{m!==p&&(s.lineTo(h,p),s.lineTo(h,m),s.lineTo(h,b))};for(l&&(f=n[y(0)],s.moveTo(f.x,f.y)),d=0;d<=a;++d){if(f=n[y(d)],f.skip)continue;let w=f.x,x=f.y,k=w|0;k===g?(xp&&(p=x),h=(u*h+w)/++u):(_(),s.lineTo(w,x),g=k,u=0,m=p=x),b=x}_()}function Xn(s){let t=s.options,e=t.borderDash&&t.borderDash.length;return!s._decimated&&!s._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?Td:Od}function Dd(s){return s.stepped?Mr:s.tension||s.cubicInterpolationMode==="monotone"?Or:Gt}function Cd(s,t,e,i){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,i)&&n.closePath()),za(s,t.options),s.stroke(n)}function Pd(s,t,e,i){let{segments:n,options:o}=t,r=Xn(t);for(let a of n)za(s,o,a.style),s.beginPath(),r(s,t,a,{start:e,end:e+i-1})&&s.closePath(),s.stroke()}var Ad=typeof Path2D=="function";function Id(s,t,e,i){Ad&&!t.options.segment?Cd(s,t,e,i):Pd(s,t,e,i)}var Ft=class extends dt{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let i=this.options;if((i.tension||i.cubicInterpolationMode==="monotone")&&!i.stepped&&!this._pointsUpdated){let n=i.spanGaps?this._loop:this._fullLoop;kr(this._points,i,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Dr(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){let i=this.options,n=t[e],o=this.points,r=Tn(this,{property:e,start:n,end:n});if(!r.length)return;let a=[],l=Dd(i),c,h;for(c=0,h=r.length;ct!=="borderDash"&&t!=="fill"});function ia(s,t,e,i){let n=s.options,{[e]:o}=s.getProps([e],i);return Math.abs(t-o)s.replace("rgb(","rgba(").replace(")",", 0.5)"));function Ba(s){return Jn[s%Jn.length]}function Ha(s){return na[s%na.length]}function Vd(s,t){return s.borderColor=Ba(t),s.backgroundColor=Ha(t),++t}function Wd(s,t){return s.backgroundColor=s.data.map(()=>Ba(t++)),t}function Bd(s,t){return s.backgroundColor=s.data.map(()=>Ha(t++)),t}function Hd(s){let t=0;return(e,i)=>{let n=s.getDatasetMeta(i).controller;n instanceof jt?t=Wd(e,t):n instanceof xe?t=Bd(e,t):n&&(t=Vd(e,t))}}function oa(s){let t;for(t in s)if(s[t].borderColor||s[t].backgroundColor)return!0;return!1}function $d(s){return s&&(s.borderColor||s.backgroundColor)}function jd(){return j.borderColor!=="rgba(0,0,0,0.1)"||j.backgroundColor!=="rgba(0,0,0,0.1)"}var Ud={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(s,t,e){if(!e.enabled)return;let{data:{datasets:i},options:n}=s.config,{elements:o}=n,r=oa(i)||$d(n)||o&&oa(o)||jd();if(!e.forceOverride&&r)return;let a=Hd(s);i.forEach(a)}};function Yd(s,t,e,i,n){let o=n.samples||i;if(o>=e)return s.slice(t,t+e);let r=[],a=(e-2)/(o-2),l=0,c=t+e-1,h=t,u,d,f,g,m;for(r[l++]=s[h],u=0;uf&&(f=g,d=s[y],m=y);r[l++]=d,h=m}return r[l++]=s[c],r}function Zd(s,t,e,i){let n=0,o=0,r,a,l,c,h,u,d,f,g,m,p=[],b=t+e-1,y=s[t].x,w=s[b].x-y;for(r=t;rm&&(m=c,d=r),n=(o*n+a.x)/++o;else{let k=r-1;if(!I(u)&&!I(d)){let S=Math.min(u,d),M=Math.max(u,d);S!==f&&S!==k&&p.push({...s[S],x:n}),M!==f&&M!==k&&p.push({...s[M],x:n})}r>0&&k!==f&&p.push(s[k]),p.push(a),h=x,o=0,g=m=c,u=d=f=r}}return p}function $a(s){if(s._decimated){let t=s._data;delete s._decimated,delete s._data,Object.defineProperty(s,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function ra(s){s.data.datasets.forEach(t=>{$a(t)})}function qd(s,t){let e=t.length,i=0,n,{iScale:o}=s,{min:r,max:a,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(i=K(Ct(t,o.axis,r).lo,0,e-1)),c?n=K(Ct(t,o.axis,a).hi+1,i,e)-i:n=e-i,{start:i,count:n}}var Gd={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(s,t,e)=>{if(!e.enabled){ra(s);return}let i=s.width;s.data.datasets.forEach((n,o)=>{let{_data:r,indexAxis:a}=n,l=s.getDatasetMeta(o),c=r||n.data;if(ze([a,s.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=s.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||s.options.parsing)return;let{start:u,count:d}=qd(l,c),f=e.threshold||4*i;if(d<=f){$a(n);return}I(r)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(m){this._data=m}}));let g;switch(e.algorithm){case"lttb":g=Yd(c,u,d,i,e);break;case"min-max":g=Zd(c,u,d,i);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=g})},destroy(s){ra(s)}};function Xd(s,t,e){let i=s.segments,n=s.points,o=t.points,r=[];for(let a of i){let{start:l,end:c}=a;c=Oi(l,c,n);let h=Kn(e,n[l],n[c],a.loop);if(!t.segments){r.push({source:a,target:h,start:n[l],end:n[c]});continue}let u=Tn(t,h);for(let d of u){let f=Kn(e,o[d.start],o[d.end],d.loop),g=On(a,n,f);for(let m of g)r.push({source:m,target:d,start:{[e]:aa(h,f,"start",Math.max)},end:{[e]:aa(h,f,"end",Math.min)}})}}return r}function Kn(s,t,e,i){if(i)return;let n=t[s],o=e[s];return s==="angle"&&(n=st(n),o=st(o)),{property:s,start:n,end:o}}function Jd(s,t){let{x:e=null,y:i=null}=s||{},n=t.points,o=[];return t.segments.forEach(({start:r,end:a})=>{a=Oi(r,a,n);let l=n[r],c=n[a];i!==null?(o.push({x:l.x,y:i}),o.push({x:c.x,y:i})):e!==null&&(o.push({x:e,y:l.y}),o.push({x:e,y:c.y}))}),o}function Oi(s,t,e){for(;t>s;t--){let i=e[t];if(!isNaN(i.x)&&!isNaN(i.y))break}return t}function aa(s,t,e,i){return s&&t?i(s[e],t[e]):s?s[e]:t?t[e]:0}function ja(s,t){let e=[],i=!1;return H(s)?(i=!0,e=s):e=Jd(s,t),e.length?new Ft({points:e,options:{tension:0},_loop:i,_fullLoop:i}):null}function la(s){return s&&s.fill!==!1}function Kd(s,t,e){let n=s[t].fill,o=[t],r;if(!e)return n;for(;n!==!1&&o.indexOf(n)===-1;){if(!Z(n))return n;if(r=s[n],!r)return!1;if(r.visible)return n;o.push(n),n=r.fill}return!1}function Qd(s,t,e){let i=nf(s);if(E(i))return isNaN(i.value)?!1:i;let n=parseFloat(i);return Z(n)&&Math.floor(n)===n?tf(i[0],t,n,e):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function tf(s,t,e,i){return(s==="-"||s==="+")&&(e=t+e),e===t||e<0||e>=i?!1:e}function ef(s,t){let e=null;return s==="start"?e=t.bottom:s==="end"?e=t.top:E(s)?e=t.getPixelForValue(s.value):t.getBasePixel&&(e=t.getBasePixel()),e}function sf(s,t,e){let i;return s==="start"?i=e:s==="end"?i=t.options.reverse?t.min:t.max:E(s)?i=s.value:i=t.getBaseValue(),i}function nf(s){let t=s.options,e=t.fill,i=P(e&&e.target,e);return i===void 0&&(i=!!t.backgroundColor),i===!1||i===null?!1:i===!0?"origin":i}function of(s){let{scale:t,index:e,line:i}=s,n=[],o=i.segments,r=i.points,a=rf(t,e);a.push(ja({x:null,y:t.bottom},i));for(let l=0;l=0;--r){let a=n[r].$filler;a&&(a.line.updateControlPoints(o,a.axis),i&&a.fill&&zn(s.ctx,a,o))}},beforeDatasetsDraw(s,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let i=s.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){let o=i[n].$filler;la(o)&&zn(s.ctx,o,s.chartArea)}},beforeDatasetDraw(s,t,e){let i=t.meta.$filler;!la(i)||e.drawTime!=="beforeDatasetDraw"||zn(s.ctx,i,s.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},da=(s,t)=>{let{boxHeight:e=t,boxWidth:i=t}=s;return s.usePointStyle&&(e=Math.min(e,t),i=s.pointStyleWidth||Math.min(i,t)),{boxWidth:i,boxHeight:e,itemHeight:Math.max(t,e)}},bf=(s,t)=>s!==null&&t!==null&&s.datasetIndex===t.datasetIndex&&s.index===t.index,Mi=class extends dt{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=W(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(i=>t.filter(i,this.chart.data))),t.sort&&(e=e.sort((i,n)=>t.sort(i,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let i=t.labels,n=X(i.font),o=n.size,r=this._computeTitleHeight(),{boxWidth:a,itemHeight:l}=da(i,o),c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(r,o,a,l)+10):(h=this.maxHeight,c=this._fitCols(r,n,a,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,n){let{ctx:o,maxWidth:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+a,u=t;o.textAlign="left",o.textBaseline="middle";let d=-1,f=-h;return this.legendItems.forEach((g,m)=>{let p=i+e/2+o.measureText(g.text).width;(m===0||c[c.length-1]+p+2*a>r)&&(u+=h,c[c.length-(m>0?0:1)]=0,f+=h,d++),l[m]={left:0,top:f,row:d,width:p,height:n},c[c.length-1]+=p+a}),u}_fitCols(t,e,i,n){let{ctx:o,maxHeight:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=r-t,u=a,d=0,f=0,g=0,m=0;return this.legendItems.forEach((p,b)=>{let{itemWidth:y,itemHeight:_}=yf(i,e,o,p,n);b>0&&f+_+2*a>h&&(u+=d+a,c.push({width:d,height:f}),g+=d+a,m++,d=f=0),l[b]={left:g,top:f,col:m,width:y,height:_},d=Math.max(d,y),f+=_+a}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:n},rtl:o}}=this,r=ge(o,this.left,this.width);if(this.isHorizontal()){let a=0,l=it(i,this.left+n,this.right-this.lineWidths[a]);for(let c of e)a!==c.row&&(a=c.row,l=it(i,this.left+n,this.right-this.lineWidths[a])),c.top+=this.top+t+n,c.left=r.leftForLtr(r.x(l),c.width),l+=c.width+n}else{let a=0,l=it(i,this.top+t+n,this.bottom-this.columnSizes[a].height);for(let c of e)c.col!==a&&(a=c.col,l=it(i,this.top+t+n,this.bottom-this.columnSizes[a].height)),c.top=l,c.left+=this.left+n,c.left=r.leftForLtr(r.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;ps(t,this),this._draw(),bs(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:i,ctx:n}=this,{align:o,labels:r}=t,a=j.color,l=ge(t.rtl,this.left,this.width),c=X(r.font),{padding:h}=r,u=c.size,d=u/2,f;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;let{boxWidth:g,boxHeight:m,itemHeight:p}=da(r,u),b=function(k,S,M){if(isNaN(g)||g<=0||isNaN(m)||m<0)return;n.save();let T=P(M.lineWidth,1);if(n.fillStyle=P(M.fillStyle,a),n.lineCap=P(M.lineCap,"butt"),n.lineDashOffset=P(M.lineDashOffset,0),n.lineJoin=P(M.lineJoin,"miter"),n.lineWidth=T,n.strokeStyle=P(M.strokeStyle,a),n.setLineDash(P(M.lineDash,[])),r.usePointStyle){let C={radius:m*Math.SQRT2/2,pointStyle:M.pointStyle,rotation:M.rotation,borderWidth:T},A=l.xPlus(k,g/2),L=S+d;pn(n,C,A,L,r.pointStyleWidth&&g)}else{let C=S+Math.max((u-m)/2,0),A=l.leftForLtr(k,g),L=te(M.borderRadius);n.beginPath(),Object.values(L).some(et=>et!==0)?Ne(n,{x:A,y:C,w:g,h:m,radius:L}):n.rect(A,C,g,m),n.fill(),T!==0&&n.stroke()}n.restore()},y=function(k,S,M){Qt(n,M.text,k,S+p/2,c,{strikethrough:M.hidden,textAlign:l.textAlign(M.textAlign)})},_=this.isHorizontal(),w=this._computeTitleHeight();_?f={x:it(o,this.left+h,this.right-i[0]),y:this.top+h+w,line:0}:f={x:this.left+h,y:it(o,this.top+w+h,this.bottom-e[0].height),line:0},Sn(this.ctx,t.textDirection);let x=p+h;this.legendItems.forEach((k,S)=>{n.strokeStyle=k.fontColor,n.fillStyle=k.fontColor;let M=n.measureText(k.text).width,T=l.textAlign(k.textAlign||(k.textAlign=r.textAlign)),C=g+d+M,A=f.x,L=f.y;l.setWidth(this.width),_?S>0&&A+C+h>this.right&&(L=f.y+=x,f.line++,A=f.x=it(o,this.left+h,this.right-i[f.line])):S>0&&L+x>this.bottom&&(A=f.x=A+e[f.line].width+h,f.line++,L=f.y=it(o,this.top+w+h,this.bottom-e[f.line].height));let et=l.x(A);if(b(et,L,k),A=dr(T,A+g+d,_?A+C:this.right,t.rtl),y(l.x(A),L,k),_)f.x+=C+h;else if(typeof k.text!="string"){let ht=c.lineHeight;f.y+=Ua(k,ht)+h}else f.y+=x}),Mn(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,i=X(e.font),n=nt(e.padding);if(!e.display)return;let o=ge(t.rtl,this.left,this.width),r=this.ctx,a=e.position,l=i.size/2,c=n.top+l,h,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+c,u=it(t.align,u,this.right-d);else{let g=this.columnSizes.reduce((m,p)=>Math.max(m,p.height),0);h=c+it(t.align,this.top,this.bottom-g-t.labels.padding-this._computeTitleHeight())}let f=it(a,u,u+d);r.textAlign=o.textAlign(ni(a)),r.textBaseline="middle",r.strokeStyle=e.color,r.fillStyle=e.color,r.font=i.string,Qt(r,e.text,f,h,i)}_computeTitleHeight(){let t=this.options.title,e=X(t.font),i=nt(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,n,o;if(It(t,this.left,this.right)&&It(e,this.top,this.bottom)){for(o=this.legendHitBoxes,i=0;io.length>r.length?o:r)),t+e.size/2+i.measureText(n).width}function _f(s,t,e){let i=s;return typeof t.text!="string"&&(i=Ua(t,e)),i}function Ua(s,t){let e=s.text?s.text.length:0;return t*e}function wf(s,t){return!!((s==="mousemove"||s==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(s==="click"||s==="mouseup"))}var kf={id:"legend",_element:Mi,start(s,t,e){let i=s.legend=new Mi({ctx:s.ctx,options:e,chart:s});rt.configure(s,i,e),rt.addBox(s,i)},stop(s){rt.removeBox(s,s.legend),delete s.legend},beforeUpdate(s,t,e){let i=s.legend;rt.configure(s,i,e),i.options=e},afterUpdate(s){let t=s.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(s,t){t.replay||s.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(s,t,e){let i=t.datasetIndex,n=e.chart;n.isDatasetVisible(i)?(n.hide(i),t.hidden=!0):(n.show(i),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:s=>s.chart.options.color,boxWidth:40,padding:10,generateLabels(s){let t=s.data.datasets,{labels:{usePointStyle:e,pointStyle:i,textAlign:n,color:o,useBorderRadius:r,borderRadius:a}}=s.legend.options;return s._getSortedDatasetMetas().map(l=>{let c=l.controller.getStyle(e?0:void 0),h=nt(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:c.borderColor,pointStyle:i||c.pointStyle,rotation:c.rotation,textAlign:n||c.textAlign,borderRadius:r&&(a||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:s=>s.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:s=>!s.startsWith("on"),labels:{_scriptable:s=>!["generateLabels","filter","sort"].includes(s)}}},Is=class extends dt{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let i=this.options;if(this.left=0,this.top=0,!i.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let n=H(i.text)?i.text.length:1;this._padding=nt(i.padding);let o=n*X(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:i,bottom:n,right:o,options:r}=this,a=r.align,l=0,c,h,u;return this.isHorizontal()?(h=it(a,i,o),u=e+t,c=o-i):(r.position==="left"?(h=i+t,u=it(a,n,e),l=F*-.5):(h=o-t,u=it(a,e,n),l=F*.5),c=n-e),{titleX:h,titleY:u,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let i=X(e.font),o=i.lineHeight/2+this._padding.top,{titleX:r,titleY:a,maxWidth:l,rotation:c}=this._drawArgs(o);Qt(t,e.text,0,0,i,{color:e.color,maxWidth:l,rotation:c,textAlign:ni(e.align),textBaseline:"middle",translation:[r,a]})}};function vf(s,t){let e=new Is({ctx:s.ctx,options:t,chart:s});rt.configure(s,e,t),rt.addBox(s,e),s.titleBlock=e}var Sf={id:"title",_element:Is,start(s,t,e){vf(s,e)},stop(s){let t=s.titleBlock;rt.removeBox(s,t),delete s.titleBlock},beforeUpdate(s,t,e){let i=s.titleBlock;rt.configure(s,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},mi=new WeakMap,Mf={id:"subtitle",start(s,t,e){let i=new Is({ctx:s.ctx,options:e,chart:s});rt.configure(s,i,e),rt.addBox(s,i),mi.set(s,i)},stop(s){rt.removeBox(s,mi.get(s)),mi.delete(s)},beforeUpdate(s,t,e){let i=mi.get(s);rt.configure(s,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Ms={average(s){if(!s.length)return!1;let t,e,i=new Set,n=0,o=0;for(t=0,e=s.length;ta+l)/i.size,y:n/o}},nearest(s,t){if(!s.length)return!1;let e=t.x,i=t.y,n=Number.POSITIVE_INFINITY,o,r,a;for(o=0,r=s.length;o-1?s.split(` -`):s}function uf(s,t){let{element:e,datasetIndex:i,index:n}=t,r=s.getDatasetMeta(i).controller,{label:o,value:a}=r.getLabelAndValue(n);return{chart:s,label:o,parsed:r.getParsed(n),raw:s.data.datasets[i].data[n],formattedValue:a,dataset:r.getDataset(),dataIndex:n,datasetIndex:i,element:e}}function Va(s,t){let e=s.chart.ctx,{body:i,footer:n,title:r}=s,{boxWidth:o,boxHeight:a}=t,l=st(t.bodyFont),c=st(t.titleFont),h=st(t.footerFont),u=r.length,d=n.length,f=i.length,m=at(t.padding),g=m.height,p=0,y=i.reduce((w,x)=>w+x.before.length+x.lines.length+x.after.length,0);if(y+=s.beforeBody.length+s.afterBody.length,u&&(g+=u*c.lineHeight+(u-1)*t.titleSpacing+t.titleMarginBottom),y){let w=t.displayColors?Math.max(a,l.lineHeight):l.lineHeight;g+=f*w+(y-f)*l.lineHeight+(y-1)*t.bodySpacing}d&&(g+=t.footerMarginTop+d*h.lineHeight+(d-1)*t.footerSpacing);let b=0,_=function(w){p=Math.max(p,e.measureText(w).width+b)};return e.save(),e.font=c.string,H(s.title,_),e.font=l.string,H(s.beforeBody.concat(s.afterBody),_),b=t.displayColors?o+2+t.boxPadding:0,H(i,w=>{H(w.before,_),H(w.lines,_),H(w.after,_)}),b=0,e.font=h.string,H(s.footer,_),e.restore(),p+=m.width,{width:p,height:g}}function df(s,t){let{y:e,height:i}=t;return es.height-i/2?"bottom":"center"}function ff(s,t,e,i){let{x:n,width:r}=i,o=e.caretSize+e.caretPadding;if(s==="left"&&n+r+o>t.width||s==="right"&&n-r-o<0)return!0}function mf(s,t,e,i){let{x:n,width:r}=e,{width:o,chartArea:{left:a,right:l}}=s,c="center";return i==="center"?c=n<=(a+l)/2?"left":"right":n<=r/2?c="left":n>=o-r/2&&(c="right"),ff(c,s,t,e)&&(c="center"),c}function Ha(s,t,e){let i=e.yAlign||t.yAlign||df(s,e);return{xAlign:e.xAlign||t.xAlign||mf(s,t,e,i),yAlign:i}}function gf(s,t){let{x:e,width:i}=s;return t==="right"?e-=i:t==="center"&&(e-=i/2),e}function pf(s,t,e){let{y:i,height:n}=s;return t==="top"?i+=e:t==="bottom"?i-=n+e:i-=n/2,i}function Ba(s,t,e,i){let{caretSize:n,caretPadding:r,cornerRadius:o}=s,{xAlign:a,yAlign:l}=e,c=n+r,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=se(o),m=gf(t,a),g=pf(t,l,c);return l==="center"?a==="left"?m+=c:a==="right"&&(m-=c):a==="left"?m-=Math.max(h,d)+n:a==="right"&&(m+=Math.max(u,f)+n),{x:it(m,0,i.width-t.width),y:it(g,0,i.height-t.height)}}function Hi(s,t,e){let i=at(e.padding);return t==="center"?s.x+s.width/2:t==="right"?s.x+s.width-i.right:s.x+i.left}function $a(s){return Pt([],Ut(s))}function yf(s,t,e){return $t(s,{tooltip:t,tooltipItems:e,type:"tooltip"})}function ja(s,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?s.override(e):s}var Rs=class extends yt{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,i=this.options.setContext(this.getContext()),n=i.enabled&&e.options.animation&&i.animations,r=new ji(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(r)),r}getContext(){return this.$context||(this.$context=yf(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:i}=e,n=i.beforeTitle.apply(this,[t]),r=i.title.apply(this,[t]),o=i.afterTitle.apply(this,[t]),a=[];return a=Pt(a,Ut(n)),a=Pt(a,Ut(r)),a=Pt(a,Ut(o)),a}getBeforeBody(t,e){return $a(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){let{callbacks:i}=e,n=[];return H(t,r=>{let o={before:[],lines:[],after:[]},a=ja(i,r);Pt(o.before,Ut(a.beforeLabel.call(this,r))),Pt(o.lines,a.label.call(this,r)),Pt(o.after,Ut(a.afterLabel.call(this,r))),n.push(o)}),n}getAfterBody(t,e){return $a(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){let{callbacks:i}=e,n=i.beforeFooter.apply(this,[t]),r=i.footer.apply(this,[t]),o=i.afterFooter.apply(this,[t]),a=[];return a=Pt(a,Ut(n)),a=Pt(a,Ut(r)),a=Pt(a,Ut(o)),a}_createItems(t){let e=this._active,i=this.chart.data,n=[],r=[],o=[],a=[],l,c;for(l=0,c=e.length;lt.filter(h,u,d,i))),t.itemSort&&(a=a.sort((h,u)=>t.itemSort(h,u,i))),H(a,h=>{let u=ja(t.callbacks,h);n.push(u.labelColor.call(this,h)),r.push(u.labelPointStyle.call(this,h)),o.push(u.labelTextColor.call(this,h))}),this.labelColors=n,this.labelPointStyles=r,this.labelTextColors=o,this.dataPoints=a,a}update(t,e){let i=this.options.setContext(this.getContext()),n=this._active,r,o=[];if(!n.length)this.opacity!==0&&(r={opacity:0});else{let a=Is[i.position].call(this,n,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);let l=this._size=Va(this,i),c=Object.assign({},a,l),h=Ha(this.chart,i,c),u=Ba(i,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,r={opacity:1,x:u.x,y:u.y,width:l.width,height:l.height,caretX:a.x,caretY:a.y}}this._tooltipItems=o,this.$context=void 0,r&&this._resolveAnimations().update(this,r),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,n){let r=this.getCaretPosition(t,i,n);e.lineTo(r.x1,r.y1),e.lineTo(r.x2,r.y2),e.lineTo(r.x3,r.y3)}getCaretPosition(t,e,i){let{xAlign:n,yAlign:r}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:u}=se(a),{x:d,y:f}=t,{width:m,height:g}=e,p,y,b,_,w,x;return r==="center"?(w=f+g/2,n==="left"?(p=d,y=p-o,_=w+o,x=w-o):(p=d+m,y=p+o,_=w-o,x=w+o),b=p):(n==="left"?y=d+Math.max(l,h)+o:n==="right"?y=d+m-Math.max(c,u)-o:y=this.caretX,r==="top"?(_=f,w=_-o,p=y-o,b=y+o):(_=f+g,w=_+o,p=y+o,b=y-o),x=_),{x1:p,x2:y,x3:b,y1:_,y2:w,y3:x}}drawTitle(t,e,i){let n=this.title,r=n.length,o,a,l;if(r){let c=ye(i.rtl,this.x,this.width);for(t.x=Hi(this,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",o=st(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,l=0;l_!==0)?(t.beginPath(),t.fillStyle=r.multiKeyBackground,We(t,{x:p,y:g,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),We(t,{x:y,y:g+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=r.multiKeyBackground,t.fillRect(p,g,c,l),t.strokeRect(p,g,c,l),t.fillStyle=o.backgroundColor,t.fillRect(y,g+1,c-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){let{body:n}=this,{bodySpacing:r,bodyAlign:o,displayColors:a,boxHeight:l,boxWidth:c,boxPadding:h}=i,u=st(i.bodyFont),d=u.lineHeight,f=0,m=ye(i.rtl,this.x,this.width),g=function(O){e.fillText(O,m.x(t.x+f),t.y+d/2),t.y+=d+r},p=m.textAlign(o),y,b,_,w,x,S,k;for(e.textAlign=o,e.textBaseline="middle",e.font=u.string,t.x=Hi(this,p,i),e.fillStyle=i.bodyColor,H(this.beforeBody,g),f=a&&p!=="right"?o==="center"?c/2+h:c+2+h:0,w=0,S=n.length;w0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,i=this.$animations,n=i&&i.x,r=i&&i.y;if(n||r){let o=Is[t.position].call(this,this._active,this._eventPosition);if(!o)return;let a=this._size=Va(this,t),l=Object.assign({},o,this._size),c=Ha(e,t,l),h=Ba(t,l,c,e);(n._to!==h.x||r._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=a.width,this.height=a.height,this.caretX=o.x,this.caretY=o.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),i=this.opacity;if(!i)return;this._updateAnimationTarget(e);let n={width:this.width,height:this.height},r={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;let o=at(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(r,t,n,e),er(t,e.textDirection),r.y+=o.top,this.drawTitle(r,t,e),this.drawBody(r,t,e),this.drawFooter(r,t,e),sr(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let i=this._active,n=t.map(({datasetIndex:a,index:l})=>{let c=this.chart.getDatasetMeta(a);if(!c)throw new Error("Cannot find a dataset at index "+a);return{datasetIndex:a,element:c.data[l],index:l}}),r=!ws(i,n),o=this._positionChanged(n,e);(r||o)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let n=this.options,r=this._active||[],o=this._getActiveElements(t,r,e,i),a=this._positionChanged(o,t),l=e||!ws(o,r)||a;return l&&(this._active=o,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,i,n){let r=this.options;if(t.type==="mouseout")return[];if(!n)return e;let o=this.chart.getElementsAtEventForMode(t,r.mode,r,i);return r.reverse&&o.reverse(),o}_positionChanged(t,e){let{caretX:i,caretY:n,options:r}=this,o=Is[r.position].call(this,t,e);return o!==!1&&(i!==o.x||n!==o.y)}};Rs.positioners=Is;var bf={id:"tooltip",_element:Rs,positioners:Is,afterInit(s,t,e){e&&(s.tooltip=new Rs({chart:s,options:e}))},beforeUpdate(s,t,e){s.tooltip&&s.tooltip.initialize(e)},reset(s,t,e){s.tooltip&&s.tooltip.initialize(e)},afterDraw(s){let t=s.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(s.notifyPlugins("beforeTooltipDraw",e)===!1)return;t.draw(s.ctx),s.notifyPlugins("afterTooltipDraw",e)}},afterEvent(s,t){if(s.tooltip){let e=t.replay;s.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(s,t)=>t.bodyFont.size,boxWidth:(s,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:At,title(s){if(s.length>0){let t=s[0],e=t.chart.data.labels,i=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(i>0&&t.dataIndexs!=="filter"&&s!=="itemSort"&&s!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},xf=Object.freeze({__proto__:null,Decimation:Nd,Filler:nf,Legend:af,SubTitle:hf,Title:cf,Tooltip:bf}),_f=(s,t,e,i)=>(typeof t=="string"?(e=s.push(t)-1,i.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function wf(s,t,e,i){let n=s.indexOf(t);if(n===-1)return _f(s,t,e,i);let r=s.lastIndexOf(t);return n!==r?e:n}var Sf=(s,t)=>s===null?null:it(Math.round(s),0,t),Je=class extends Yt{constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){let e=this._addedLabels;if(e.length){let i=this.getLabels();for(let{index:n,label:r}of e)i[n]===r&&i.splice(n,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(N(t))return null;let i=this.getLabels();return e=isFinite(e)&&i[e]===t?e:wf(i,t,C(e,t),this._addedLabels),Sf(e,i.length-1)}determineDataLimits(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),{min:i,max:n}=this.getMinMax(!0);this.options.bounds==="ticks"&&(t||(i=0),e||(n=this.getLabels().length-1)),this.min=i,this.max=n}buildTicks(){let t=this.min,e=this.max,i=this.options.offset,n=[],r=this.getLabels();r=t===0&&e===r.length-1?r:r.slice(t,e+1),this._valueRange=Math.max(r.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let o=t;o<=e;o++)n.push({value:o});return n}getLabelForValue(t){let e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};Je.id="category";Je.defaults={ticks:{callback:Je.prototype.getLabelForValue}};function kf(s,t){let e=[],{bounds:n,step:r,min:o,max:a,precision:l,count:c,maxTicks:h,maxDigits:u,includeBounds:d}=s,f=r||1,m=h-1,{min:g,max:p}=t,y=!N(o),b=!N(a),_=!N(c),w=(p-g)/(u+1),x=In((p-g)/m/f)*f,S,k,O,v;if(x<1e-14&&!y&&!b)return[{value:g},{value:p}];v=Math.ceil(p/x)-Math.floor(g/x),v>m&&(x=In(v*x/m/f)*f),N(l)||(S=Math.pow(10,l),x=Math.ceil(x*S)/S),n==="ticks"?(k=Math.floor(g/x)*x,O=Math.ceil(p/x)*x):(k=g,O=p),y&&b&&r&&Ao((a-o)/r,x/1e3)?(v=Math.round(Math.min((a-o)/x,h)),x=(a-o)/v,k=o,O=a):_?(k=y?o:k,O=b?a:O,v=c-1,x=(O-k)/v):(v=(O-k)/x,Re(v,Math.round(v),x/1e3)?v=Math.round(v):v=Math.ceil(v));let F=Math.max(An(x),An(k));S=Math.pow(10,N(l)?F:l),k=Math.round(k*S)/S,O=Math.round(O*S)/S;let W=0;for(y&&(d&&k!==o?(e.push({value:o}),kn=e?n:l,a=l=>r=i?r:l;if(t){let l=Tt(n),c=Tt(r);l<0&&c<0?a(0):l>0&&c>0&&o(0)}if(n===r){let l=1;(r>=Number.MAX_SAFE_INTEGER||n<=Number.MIN_SAFE_INTEGER)&&(l=Math.abs(r*.05)),a(r+l),t||o(n-l)}this.min=n,this.max=r}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:i}=t,n;return i?(n=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,i=this.getTickLimit();i=Math.max(2,i);let n={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},r=this._range||this,o=kf(n,r);return t.bounds==="ticks"&&Fn(o,this,"value"),t.reverse?(o.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),o}configure(){let t=this.ticks,e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){let n=(i-e)/Math.max(t.length-1,1)/2;e-=n,i+=n}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Ve(t,this.chart.options.locale,this.options.ticks.format)}},Ns=class extends Qe{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=K(t)?t:0,this.max=K(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,i=wt(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,r=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,r.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};Ns.id="linear";Ns.defaults={ticks:{callback:Xi.formatters.numeric}};function Ya(s){return s/Math.pow(10,Math.floor(gt(s)))===1}function Mf(s,t){let e=Math.floor(gt(t.max)),i=Math.ceil(t.max/Math.pow(10,e)),n=[],r=mt(s.min,Math.pow(10,Math.floor(gt(t.min)))),o=Math.floor(gt(r)),a=Math.floor(r/Math.pow(10,o)),l=o<0?Math.pow(10,Math.abs(o)):1;do n.push({value:r,major:Ya(r)}),++a,a===10&&(a=1,++o,l=o>=0?1:l),r=Math.round(a*Math.pow(10,o)*l)/l;while(o0?i:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=K(t)?Math.max(0,t):null,this.max=K(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),i=this.min,n=this.max,r=l=>i=t?i:l,o=l=>n=e?n:l,a=(l,c)=>Math.pow(10,Math.floor(gt(l))+c);i===n&&(i<=0?(r(1),o(10)):(r(a(i,-1)),o(a(n,1)))),i<=0&&r(a(n,-1)),n<=0&&o(a(i,1)),this._zero&&this.min!==this._suggestedMin&&i===a(this.min,0)&&r(a(i,-1)),this.min=i,this.max=n}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},i=Mf(e,this);return t.bounds==="ticks"&&Fn(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return t===void 0?"0":Ve(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=gt(t),this._valueRange=gt(this.max)-gt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(gt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};Ws.id="logarithmic";Ws.defaults={ticks:{callback:Xi.formatters.logarithmic,major:{enabled:!0}}};function vr(s){let t=s.ticks;if(t.display&&s.display){let e=at(t.backdropPadding);return C(t.font&&t.font.size,L.font.size)+e.height}return 0}function Tf(s,t,e){return e=$(e)?e:[e],{w:Yo(s,t.string,e),h:e.length*t.lineHeight}}function Za(s,t,e,i,n){return s===i||s===n?{start:t-e/2,end:t+e/2}:sn?{start:t-e,end:t}:{start:t,end:t+e}}function vf(s){let t={l:s.left+s._padding.left,r:s.right-s._padding.right,t:s.top+s._padding.top,b:s.bottom-s._padding.bottom},e=Object.assign({},t),i=[],n=[],r=s._pointLabels.length,o=s.options.pointLabels,a=o.centerPointLabels?Y/r:0;for(let l=0;lt.r&&(a=(i.end-t.r)/r,s.r=Math.max(s.r,t.r+a)),n.startt.b&&(l=(n.end-t.b)/o,s.b=Math.max(s.b,t.b+l))}function Df(s,t,e){let i=[],n=s._pointLabels.length,r=s.options,o=vr(r)/2,a=s.drawingArea,l=r.pointLabels.centerPointLabels?Y/n:0;for(let c=0;c270||e<90)&&(s-=t),s}function Ff(s,t){let{ctx:e,options:{pointLabels:i}}=s;for(let n=t-1;n>=0;n--){let r=i.setContext(s.getPointLabelContext(n)),o=st(r.font),{x:a,y:l,textAlign:c,left:h,top:u,right:d,bottom:f}=s._pointLabelItems[n],{backdropColor:m}=r;if(!N(m)){let g=se(r.borderRadius),p=at(r.backdropPadding);e.fillStyle=m;let y=h-p.left,b=u-p.top,_=d-h+p.width,w=f-u+p.height;Object.values(g).some(x=>x!==0)?(e.beginPath(),We(e,{x:y,y:b,w:_,h:w,radius:g}),e.fill()):e.fillRect(y,b,_,w)}ee(e,s._pointLabels[n],a,l+o.lineHeight/2,o,{color:r.color,textAlign:c,textBaseline:"middle"})}}function pl(s,t,e,i){let{ctx:n}=s;if(e)n.arc(s.xCenter,s.yCenter,t,0,B);else{let r=s.getPointPosition(0,t);n.moveTo(r.x,r.y);for(let o=1;o{let n=j(this.options.pointLabels.callback,[e,i],this);return n||n===0?n:""}).filter((e,i)=>this.chart.getDataVisibility(i))}fit(){let t=this.options;t.display&&t.pointLabels.display?vf(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,n))}getIndexAngle(t){let e=B/(this._pointLabels.length||1),i=this.options.startAngle||0;return ht(t*e+wt(i))}getDistanceFromCenterForValue(t){if(N(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(N(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(h!==0){a=this.getDistanceFromCenterForValue(c.value);let u=n.setContext(this.getContext(h-1));Af(this,u,a,r)}}),i.display){for(t.save(),o=r-1;o>=0;o--){let c=i.setContext(this.getPointLabelContext(o)),{color:h,lineWidth:u}=c;!u||!h||(t.lineWidth=u,t.strokeStyle=h,t.setLineDash(c.borderDash),t.lineDashOffset=c.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(o,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;let n=this.getIndexAngle(0),r,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((a,l)=>{if(l===0&&!e.reverse)return;let c=i.setContext(this.getContext(l)),h=st(c.font);if(r=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,o=t.measureText(a.label).width,t.fillStyle=c.backdropColor;let u=at(c.backdropPadding);t.fillRect(-o/2-u.left,-r-h.size/2-u.top,o+u.width,h.size+u.height)}ee(t,a.label,0,-r,h,{color:c.color})}),t.restore()}drawTitle(){}};_e.id="radialLinear";_e.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Xi.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(s){return s},padding:5,centerPointLabels:!1}};_e.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};_e.descriptors={angleLines:{_fallback:"grid"}};var Ki={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ut=Object.keys(Ki);function Pf(s,t){return s-t}function qa(s,t){if(N(t))return null;let e=s._adapter,{parser:i,round:n,isoWeekday:r}=s._parseOpts,o=t;return typeof i=="function"&&(o=i(o)),K(o)||(o=typeof i=="string"?e.parse(o,i):e.parse(o)),o===null?null:(n&&(o=n==="week"&&(pe(r)||r===!0)?e.startOf(o,"isoWeek",r):e.startOf(o,n)),+o)}function Ga(s,t,e,i){let n=ut.length;for(let r=ut.indexOf(s);r=ut.indexOf(e);r--){let o=ut[r];if(Ki[o].common&&s._adapter.diff(n,i,o)>=t-1)return o}return ut[e?ut.indexOf(e):0]}function Nf(s){for(let t=ut.indexOf(s)+1,e=ut.length;t=t?e[i]:e[n];s[r]=!0}}function Wf(s,t,e,i){let n=s._adapter,r=+n.startOf(t[0].value,i),o=t[t.length-1].value,a,l;for(a=r;a<=o;a=+n.add(a,1,i))l=e[a],l>=0&&(t[l].major=!0);return t}function Ka(s,t,e){let i=[],n={},r=t.length,o,a;for(o=0;o+t.value))}initOffsets(t){let e=0,i=0,n,r;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,r=this.getDecimalForValue(t[t.length-1]),t.length===1?i=r:i=(r-this.getDecimalForValue(t[t.length-2]))/2);let o=t.length<3?.5:.25;e=it(e,0,o),i=it(i,0,o),this._offsets={start:e,end:i,factor:1/(e+1+i)}}_generate(){let t=this._adapter,e=this.min,i=this.max,n=this.options,r=n.time,o=r.unit||Ga(r.minUnit,e,i,this._getLabelCapacity(e)),a=C(r.stepSize,1),l=o==="week"?r.isoWeekday:!1,c=pe(l)||l===!0,h={},u=e,d,f;if(c&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,c?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);let m=n.ticks.source==="data"&&this.getDataTimestamps();for(d=u,f=0;dg-p).map(g=>+g)}getLabelForValue(t){let e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,n){let r=this.options,o=r.time.displayFormats,a=this._unit,l=this._majorUnit,c=a&&o[a],h=l&&o[l],u=i[e],d=l&&h&&u&&u.major,f=this._adapter.format(t,n||(d?h:c)),m=r.ticks.callback;return m?j(m,[f,e,i],this):f}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t=this._cache.data||[],e,i;if(t.length)return t;let n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,i=n.length;e=s[i].pos&&t<=s[n].pos&&({lo:i,hi:n}=Ft(s,"pos",t)),{pos:r,time:a}=s[i],{pos:o,time:l}=s[n]):(t>=s[i].time&&t<=s[n].time&&({lo:i,hi:n}=Ft(s,"time",t)),{time:r,pos:a}=s[i],{time:o,pos:l}=s[n]);let c=o-r;return c?a+(l-a)*(t-r)/c:a}var zs=class extends we{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Bi(e,this.min),this._tableRange=Bi(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:i}=this,n=[],r=[],o,a,l,c,h;for(o=0,a=t.length;o=e&&c<=i&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=n.length;o=0?m:1e3+m,(d-f)/(60*1e3)}equals(t){return t.type==="iana"&&t.name===this.name}get isValid(){return this.valid}};var bl={};function jf(s,t={}){let e=JSON.stringify([s,t]),i=bl[e];return i||(i=new Intl.ListFormat(s,t),bl[e]=i),i}var Fr={};function Ar(s,t={}){let e=JSON.stringify([s,t]),i=Fr[e];return i||(i=new Intl.DateTimeFormat(s,t),Fr[e]=i),i}var Lr={};function Uf(s,t={}){let e=JSON.stringify([s,t]),i=Lr[e];return i||(i=new Intl.NumberFormat(s,t),Lr[e]=i),i}var Pr={};function Yf(s,t={}){let{base:e,...i}=t,n=JSON.stringify([s,i]),r=Pr[n];return r||(r=new Intl.RelativeTimeFormat(s,t),Pr[n]=r),r}var oi=null;function Zf(){return oi||(oi=new Intl.DateTimeFormat().resolvedOptions().locale,oi)}var xl={};function qf(s){let t=xl[s];if(!t){let e=new Intl.Locale(s);t="getWeekInfo"in e?e.getWeekInfo():e.weekInfo,xl[s]=t}return t}function Gf(s){let t=s.indexOf("-x-");t!==-1&&(s=s.substring(0,t));let e=s.indexOf("-u-");if(e===-1)return[s];{let i,n;try{i=Ar(s).resolvedOptions(),n=s}catch{let l=s.substring(0,e);i=Ar(l).resolvedOptions(),n=l}let{numberingSystem:r,calendar:o}=i;return[n,r,o]}}function Xf(s,t,e){return(e||t)&&(s.includes("-u-")||(s+="-u"),e&&(s+=`-ca-${e}`),t&&(s+=`-nu-${t}`)),s}function Kf(s){let t=[];for(let e=1;e<=12;e++){let i=T.utc(2009,e,1);t.push(s(i))}return t}function Jf(s){let t=[];for(let e=1;e<=7;e++){let i=T.utc(2016,11,13+e);t.push(s(i))}return t}function on(s,t,e,i){let n=s.listingMode();return n==="error"?null:n==="en"?e(t):i(t)}function Qf(s){return s.numberingSystem&&s.numberingSystem!=="latn"?!1:s.numberingSystem==="latn"||!s.locale||s.locale.startsWith("en")||new Intl.DateTimeFormat(s.intl).resolvedOptions().numberingSystem==="latn"}var Rr=class{constructor(t,e,i){this.padTo=i.padTo||0,this.floor=i.floor||!1;let{padTo:n,floor:r,...o}=i;if(!e||Object.keys(o).length>0){let a={useGrouping:!1,...i};i.padTo>0&&(a.minimumIntegerDigits=i.padTo),this.inf=Uf(t,a)}}format(t){if(this.inf){let e=this.floor?Math.floor(t):t;return this.inf.format(e)}else{let e=this.floor?Math.floor(t):ss(t,3);return q(e,this.padTo)}}},Nr=class{constructor(t,e,i){this.opts=i,this.originalZone=void 0;let n;if(this.opts.timeZone)this.dt=t;else if(t.zone.type==="fixed"){let o=-1*(t.offset/60),a=o>=0?`Etc/GMT+${o}`:`Etc/GMT${o}`;t.offset!==0&&nt.create(a).valid?(n=a,this.dt=t):(n="UTC",this.dt=t.offset===0?t:t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone)}else t.zone.type==="system"?this.dt=t:t.zone.type==="iana"?(this.dt=t,n=t.zone.name):(n="UTC",this.dt=t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone);let r={...this.opts};r.timeZone=r.timeZone||n,this.dtf=Ar(e,r)}format(){return this.originalZone?this.formatToParts().map(({value:t})=>t).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){let t=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?t.map(e=>{if(e.type==="timeZoneName"){let i=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...e,value:i}}else return e}):t}resolvedOptions(){return this.dtf.resolvedOptions()}},Wr=class{constructor(t,e,i){this.opts={style:"long",...i},!e&&an()&&(this.rtf=Yf(t,i))}format(t,e){return this.rtf?this.rtf.format(t,e):_l(e,t,this.opts.numeric,this.opts.style!=="long")}formatToParts(t,e){return this.rtf?this.rtf.formatToParts(t,e):[]}},tm={firstDay:1,minimalDays:4,weekend:[6,7]},P=class{static fromOpts(t){return P.create(t.locale,t.numberingSystem,t.outputCalendar,t.weekSettings,t.defaultToEN)}static create(t,e,i,n,r=!1){let o=t||z.defaultLocale,a=o||(r?"en-US":Zf()),l=e||z.defaultNumberingSystem,c=i||z.defaultOutputCalendar,h=ai(n)||z.defaultWeekSettings;return new P(a,l,c,h,o)}static resetCache(){oi=null,Fr={},Lr={},Pr={}}static fromObject({locale:t,numberingSystem:e,outputCalendar:i,weekSettings:n}={}){return P.create(t,e,i,n)}constructor(t,e,i,n,r){let[o,a,l]=Gf(t);this.locale=o,this.numberingSystem=e||a||null,this.outputCalendar=i||l||null,this.weekSettings=n,this.intl=Xf(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=r,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached==null&&(this.fastNumbersCached=Qf(this)),this.fastNumbersCached}listingMode(){let t=this.isEnglish(),e=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return t&&e?"en":"intl"}clone(t){return!t||Object.getOwnPropertyNames(t).length===0?this:P.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,ai(t.weekSettings)||this.weekSettings,t.defaultToEN||!1)}redefaultToEN(t={}){return this.clone({...t,defaultToEN:!0})}redefaultToSystem(t={}){return this.clone({...t,defaultToEN:!1})}months(t,e=!1){return on(this,t,zr,()=>{let i=e?{month:t,day:"numeric"}:{month:t},n=e?"format":"standalone";return this.monthsCache[n][t]||(this.monthsCache[n][t]=Kf(r=>this.extract(r,i,"month"))),this.monthsCache[n][t]})}weekdays(t,e=!1){return on(this,t,Vr,()=>{let i=e?{weekday:t,year:"numeric",month:"long",day:"numeric"}:{weekday:t},n=e?"format":"standalone";return this.weekdaysCache[n][t]||(this.weekdaysCache[n][t]=Jf(r=>this.extract(r,i,"weekday"))),this.weekdaysCache[n][t]})}meridiems(){return on(this,void 0,()=>Hr,()=>{if(!this.meridiemCache){let t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[T.utc(2016,11,13,9),T.utc(2016,11,13,19)].map(e=>this.extract(e,t,"dayperiod"))}return this.meridiemCache})}eras(t){return on(this,t,Br,()=>{let e={era:t};return this.eraCache[t]||(this.eraCache[t]=[T.utc(-40,1,1),T.utc(2017,1,1)].map(i=>this.extract(i,e,"era"))),this.eraCache[t]})}extract(t,e,i){let n=this.dtFormatter(t,e),r=n.formatToParts(),o=r.find(a=>a.type.toLowerCase()===i);return o?o.value:null}numberFormatter(t={}){return new Rr(this.intl,t.forceSimple||this.fastNumbers,t)}dtFormatter(t,e={}){return new Nr(t,this.intl,e)}relFormatter(t={}){return new Wr(this.intl,this.isEnglish(),t)}listFormatter(t={}){return jf(this.intl,t)}isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:ln()?qf(this.locale):tm}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(t){return this.locale===t.locale&&this.numberingSystem===t.numberingSystem&&this.outputCalendar===t.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}};var jr=null,G=class extends dt{static get utcInstance(){return jr===null&&(jr=new G(0)),jr}static instance(t){return t===0?G.utcInstance:new G(t)}static parseSpecifier(t){if(t){let e=t.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(e)return new G(Se(e[1],e[2]))}return null}constructor(t){super(),this.fixed=t}get type(){return"fixed"}get name(){return this.fixed===0?"UTC":`UTC${le(this.fixed,"narrow")}`}get ianaName(){return this.fixed===0?"Etc/UTC":`Etc/GMT${le(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(t,e){return le(this.fixed,e)}get isUniversal(){return!0}offset(){return this.fixed}equals(t){return t.type==="fixed"&&t.fixed===this.fixed}get isValid(){return!0}};var is=class extends dt{constructor(t){super(),this.zoneName=t}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}};function Et(s,t){let e;if(D(s)||s===null)return t;if(s instanceof dt)return s;if(wl(s)){let i=s.toLowerCase();return i==="default"?t:i==="local"||i==="system"?zt.instance:i==="utc"||i==="gmt"?G.utcInstance:G.parseSpecifier(i)||nt.create(s)}else return Ct(s)?G.instance(s):typeof s=="object"&&"offset"in s&&typeof s.offset=="function"?s:new is(s)}var Ur={arab:"[\u0660-\u0669]",arabext:"[\u06F0-\u06F9]",bali:"[\u1B50-\u1B59]",beng:"[\u09E6-\u09EF]",deva:"[\u0966-\u096F]",fullwide:"[\uFF10-\uFF19]",gujr:"[\u0AE6-\u0AEF]",hanidec:"[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]",khmr:"[\u17E0-\u17E9]",knda:"[\u0CE6-\u0CEF]",laoo:"[\u0ED0-\u0ED9]",limb:"[\u1946-\u194F]",mlym:"[\u0D66-\u0D6F]",mong:"[\u1810-\u1819]",mymr:"[\u1040-\u1049]",orya:"[\u0B66-\u0B6F]",tamldec:"[\u0BE6-\u0BEF]",telu:"[\u0C66-\u0C6F]",thai:"[\u0E50-\u0E59]",tibt:"[\u0F20-\u0F29]",latn:"\\d"},Sl={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},em=Ur.hanidec.replace(/[\[|\]]/g,"").split("");function kl(s){let t=parseInt(s,10);if(isNaN(t)){t="";for(let e=0;e=r&&i<=o&&(t+=i-r)}}return parseInt(t,10)}else return t}var ns={};function Ml(){ns={}}function St({numberingSystem:s},t=""){let e=s||"latn";return ns[e]||(ns[e]={}),ns[e][t]||(ns[e][t]=new RegExp(`${Ur[e]}${t}`)),ns[e][t]}var Tl=()=>Date.now(),vl="system",Ol=null,Dl=null,El=null,Cl=60,Il,Fl=null,z=class{static get now(){return Tl}static set now(t){Tl=t}static set defaultZone(t){vl=t}static get defaultZone(){return Et(vl,zt.instance)}static get defaultLocale(){return Ol}static set defaultLocale(t){Ol=t}static get defaultNumberingSystem(){return Dl}static set defaultNumberingSystem(t){Dl=t}static get defaultOutputCalendar(){return El}static set defaultOutputCalendar(t){El=t}static get defaultWeekSettings(){return Fl}static set defaultWeekSettings(t){Fl=ai(t)}static get twoDigitCutoffYear(){return Cl}static set twoDigitCutoffYear(t){Cl=t%100}static get throwOnInvalid(){return Il}static set throwOnInvalid(t){Il=t}static resetCaches(){P.resetCache(),nt.resetCache(),T.resetCache(),Ml()}};var rt=class{constructor(t,e){this.reason=t,this.explanation=e}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}};var Al=[0,31,59,90,120,151,181,212,243,273,304,334],Ll=[0,31,60,91,121,152,182,213,244,274,305,335];function kt(s,t){return new rt("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${s}, which is invalid`)}function cn(s,t,e){let i=new Date(Date.UTC(s,t-1,e));s<100&&s>=0&&i.setUTCFullYear(i.getUTCFullYear()-1900);let n=i.getUTCDay();return n===0?7:n}function Pl(s,t,e){return e+(Me(s)?Ll:Al)[t-1]}function Rl(s,t){let e=Me(s)?Ll:Al,i=e.findIndex(r=>rke(i,t,e)?(c=i+1,l=1):c=i,{weekYear:c,weekNumber:l,weekday:a,...hi(s)}}function Yr(s,t=4,e=1){let{weekYear:i,weekNumber:n,weekday:r}=s,o=hn(cn(i,1,t),e),a=ce(i),l=n*7+r-o-7+t,c;l<1?(c=i-1,l+=ce(c)):l>a?(c=i+1,l-=ce(i)):c=i;let{month:h,day:u}=Rl(c,l);return{year:c,month:h,day:u,...hi(s)}}function un(s){let{year:t,month:e,day:i}=s,n=Pl(t,e,i);return{year:t,ordinal:n,...hi(s)}}function Zr(s){let{year:t,ordinal:e}=s,{month:i,day:n}=Rl(t,e);return{year:t,month:i,day:n,...hi(s)}}function qr(s,t){if(!D(s.localWeekday)||!D(s.localWeekNumber)||!D(s.localWeekYear)){if(!D(s.weekday)||!D(s.weekNumber)||!D(s.weekYear))throw new vt("Cannot mix locale-based week fields with ISO-based week fields");return D(s.localWeekday)||(s.weekday=s.localWeekday),D(s.localWeekNumber)||(s.weekNumber=s.localWeekNumber),D(s.localWeekYear)||(s.weekYear=s.localWeekYear),delete s.localWeekday,delete s.localWeekNumber,delete s.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function Nl(s,t=4,e=1){let i=ci(s.weekYear),n=xt(s.weekNumber,1,ke(s.weekYear,t,e)),r=xt(s.weekday,1,7);return i?n?r?!1:kt("weekday",s.weekday):kt("week",s.weekNumber):kt("weekYear",s.weekYear)}function Wl(s){let t=ci(s.year),e=xt(s.ordinal,1,ce(s.year));return t?e?!1:kt("ordinal",s.ordinal):kt("year",s.year)}function Gr(s){let t=ci(s.year),e=xt(s.month,1,12),i=xt(s.day,1,rs(s.year,s.month));return t?e?i?!1:kt("day",s.day):kt("month",s.month):kt("year",s.year)}function Xr(s){let{hour:t,minute:e,second:i,millisecond:n}=s,r=xt(t,0,23)||t===24&&e===0&&i===0&&n===0,o=xt(e,0,59),a=xt(i,0,59),l=xt(n,0,999);return r?o?a?l?!1:kt("millisecond",n):kt("second",i):kt("minute",e):kt("hour",t)}function D(s){return typeof s>"u"}function Ct(s){return typeof s=="number"}function ci(s){return typeof s=="number"&&s%1===0}function wl(s){return typeof s=="string"}function Vl(s){return Object.prototype.toString.call(s)==="[object Date]"}function an(){try{return typeof Intl<"u"&&!!Intl.RelativeTimeFormat}catch{return!1}}function ln(){try{return typeof Intl<"u"&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch{return!1}}function Hl(s){return Array.isArray(s)?s:[s]}function Kr(s,t,e){if(s.length!==0)return s.reduce((i,n)=>{let r=[t(n),n];return i&&e(i[0],r[0])===i[0]?i:r},null)[1]}function Bl(s,t){return t.reduce((e,i)=>(e[i]=s[i],e),{})}function he(s,t){return Object.prototype.hasOwnProperty.call(s,t)}function ai(s){if(s==null)return null;if(typeof s!="object")throw new J("Week settings must be an object");if(!xt(s.firstDay,1,7)||!xt(s.minimalDays,1,7)||!Array.isArray(s.weekend)||s.weekend.some(t=>!xt(t,1,7)))throw new J("Invalid week settings");return{firstDay:s.firstDay,minimalDays:s.minimalDays,weekend:Array.from(s.weekend)}}function xt(s,t,e){return ci(s)&&s>=t&&s<=e}function sm(s,t){return s-t*Math.floor(s/t)}function q(s,t=2){let e=s<0,i;return e?i="-"+(""+-s).padStart(t,"0"):i=(""+s).padStart(t,"0"),i}function qt(s){if(!(D(s)||s===null||s===""))return parseInt(s,10)}function ue(s){if(!(D(s)||s===null||s===""))return parseFloat(s)}function ui(s){if(!(D(s)||s===null||s==="")){let t=parseFloat("0."+s)*1e3;return Math.floor(t)}}function ss(s,t,e=!1){let i=10**t;return(e?Math.trunc:Math.round)(s*i)/i}function Me(s){return s%4===0&&(s%100!==0||s%400===0)}function ce(s){return Me(s)?366:365}function rs(s,t){let e=sm(t-1,12)+1,i=s+(t-e)/12;return e===2?Me(i)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][e-1]}function es(s){let t=Date.UTC(s.year,s.month-1,s.day,s.hour,s.minute,s.second,s.millisecond);return s.year<100&&s.year>=0&&(t=new Date(t),t.setUTCFullYear(s.year,s.month-1,s.day)),+t}function zl(s,t,e){return-hn(cn(s,1,t),e)+t-1}function ke(s,t=4,e=1){let i=zl(s,t,e),n=zl(s+1,t,e);return(ce(s)-i+n)/7}function di(s){return s>99?s:s>z.twoDigitCutoffYear?1900+s:2e3+s}function sn(s,t,e,i=null){let n=new Date(s),r={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};i&&(r.timeZone=i);let o={timeZoneName:t,...r},a=new Intl.DateTimeFormat(e,o).formatToParts(n).find(l=>l.type.toLowerCase()==="timezonename");return a?a.value:null}function Se(s,t){let e=parseInt(s,10);Number.isNaN(e)&&(e=0);let i=parseInt(t,10)||0,n=e<0||Object.is(e,-0)?-i:i;return e*60+n}function Jr(s){let t=Number(s);if(typeof s=="boolean"||s===""||Number.isNaN(t))throw new J(`Invalid unit value ${s}`);return t}function os(s,t){let e={};for(let i in s)if(he(s,i)){let n=s[i];if(n==null)continue;e[t(i)]=Jr(n)}return e}function le(s,t){let e=Math.trunc(Math.abs(s/60)),i=Math.trunc(Math.abs(s%60)),n=s>=0?"+":"-";switch(t){case"short":return`${n}${q(e,2)}:${q(i,2)}`;case"narrow":return`${n}${e}${i>0?`:${i}`:""}`;case"techie":return`${n}${q(e,2)}${q(i,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function hi(s){return Bl(s,["hour","minute","second","millisecond"])}var im=["January","February","March","April","May","June","July","August","September","October","November","December"],Qr=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],nm=["J","F","M","A","M","J","J","A","S","O","N","D"];function zr(s){switch(s){case"narrow":return[...nm];case"short":return[...Qr];case"long":return[...im];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}var to=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],eo=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],rm=["M","T","W","T","F","S","S"];function Vr(s){switch(s){case"narrow":return[...rm];case"short":return[...eo];case"long":return[...to];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}var Hr=["AM","PM"],om=["Before Christ","Anno Domini"],am=["BC","AD"],lm=["B","A"];function Br(s){switch(s){case"narrow":return[...lm];case"short":return[...am];case"long":return[...om];default:return null}}function $l(s){return Hr[s.hour<12?0:1]}function jl(s,t){return Vr(t)[s.weekday-1]}function Ul(s,t){return zr(t)[s.month-1]}function Yl(s,t){return Br(t)[s.year<0?0:1]}function _l(s,t,e="always",i=!1){let n={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},r=["hours","minutes","seconds"].indexOf(s)===-1;if(e==="auto"&&r){let u=s==="days";switch(t){case 1:return u?"tomorrow":`next ${n[s][0]}`;case-1:return u?"yesterday":`last ${n[s][0]}`;case 0:return u?"today":`this ${n[s][0]}`;default:}}let o=Object.is(t,-0)||t<0,a=Math.abs(t),l=a===1,c=n[s],h=i?l?c[1]:c[2]||c[1]:l?n[s][0]:s;return o?`${a} ${h} ago`:`in ${a} ${h}`}function Zl(s,t){let e="";for(let i of s)i.literal?e+=i.val:e+=t(i.val);return e}var cm={D:ae,DD:Hs,DDD:Bs,DDDD:$s,t:js,tt:Us,ttt:Ys,tttt:Zs,T:qs,TT:Gs,TTT:Xs,TTTT:Ks,f:Js,ff:ti,fff:si,ffff:ni,F:Qs,FF:ei,FFF:ii,FFFF:ri},X=class{static create(t,e={}){return new X(t,e)}static parseFormat(t){let e=null,i="",n=!1,r=[];for(let o=0;o0&&r.push({literal:n||/^\s+$/.test(i),val:i}),e=null,i="",n=!n):n||a===e?i+=a:(i.length>0&&r.push({literal:/^\s+$/.test(i),val:i}),i=a,e=a)}return i.length>0&&r.push({literal:n||/^\s+$/.test(i),val:i}),r}static macroTokenToFormatOpts(t){return cm[t]}constructor(t,e){this.opts=e,this.loc=t,this.systemLoc=null}formatWithSystemDefault(t,e){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(t,{...this.opts,...e}).format()}dtFormatter(t,e={}){return this.loc.dtFormatter(t,{...this.opts,...e})}formatDateTime(t,e){return this.dtFormatter(t,e).format()}formatDateTimeParts(t,e){return this.dtFormatter(t,e).formatToParts()}formatInterval(t,e){return this.dtFormatter(t.start,e).dtf.formatRange(t.start.toJSDate(),t.end.toJSDate())}resolvedOptions(t,e){return this.dtFormatter(t,e).resolvedOptions()}num(t,e=0){if(this.opts.forceSimple)return q(t,e);let i={...this.opts};return e>0&&(i.padTo=e),this.loc.numberFormatter(i).format(t)}formatDateTimeFromString(t,e){let i=this.loc.listingMode()==="en",n=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",r=(f,m)=>this.loc.extract(t,f,m),o=f=>t.isOffsetFixed&&t.offset===0&&f.allowZ?"Z":t.isValid?t.zone.formatOffset(t.ts,f.format):"",a=()=>i?$l(t):r({hour:"numeric",hourCycle:"h12"},"dayperiod"),l=(f,m)=>i?Ul(t,f):r(m?{month:f}:{month:f,day:"numeric"},"month"),c=(f,m)=>i?jl(t,f):r(m?{weekday:f}:{weekday:f,month:"long",day:"numeric"},"weekday"),h=f=>{let m=X.macroTokenToFormatOpts(f);return m?this.formatWithSystemDefault(t,m):f},u=f=>i?Yl(t,f):r({era:f},"era"),d=f=>{switch(f){case"S":return this.num(t.millisecond);case"u":case"SSS":return this.num(t.millisecond,3);case"s":return this.num(t.second);case"ss":return this.num(t.second,2);case"uu":return this.num(Math.floor(t.millisecond/10),2);case"uuu":return this.num(Math.floor(t.millisecond/100));case"m":return this.num(t.minute);case"mm":return this.num(t.minute,2);case"h":return this.num(t.hour%12===0?12:t.hour%12);case"hh":return this.num(t.hour%12===0?12:t.hour%12,2);case"H":return this.num(t.hour);case"HH":return this.num(t.hour,2);case"Z":return o({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return o({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return o({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return t.zone.offsetName(t.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return t.zone.offsetName(t.ts,{format:"long",locale:this.loc.locale});case"z":return t.zoneName;case"a":return a();case"d":return n?r({day:"numeric"},"day"):this.num(t.day);case"dd":return n?r({day:"2-digit"},"day"):this.num(t.day,2);case"c":return this.num(t.weekday);case"ccc":return c("short",!0);case"cccc":return c("long",!0);case"ccccc":return c("narrow",!0);case"E":return this.num(t.weekday);case"EEE":return c("short",!1);case"EEEE":return c("long",!1);case"EEEEE":return c("narrow",!1);case"L":return n?r({month:"numeric",day:"numeric"},"month"):this.num(t.month);case"LL":return n?r({month:"2-digit",day:"numeric"},"month"):this.num(t.month,2);case"LLL":return l("short",!0);case"LLLL":return l("long",!0);case"LLLLL":return l("narrow",!0);case"M":return n?r({month:"numeric"},"month"):this.num(t.month);case"MM":return n?r({month:"2-digit"},"month"):this.num(t.month,2);case"MMM":return l("short",!1);case"MMMM":return l("long",!1);case"MMMMM":return l("narrow",!1);case"y":return n?r({year:"numeric"},"year"):this.num(t.year);case"yy":return n?r({year:"2-digit"},"year"):this.num(t.year.toString().slice(-2),2);case"yyyy":return n?r({year:"numeric"},"year"):this.num(t.year,4);case"yyyyyy":return n?r({year:"numeric"},"year"):this.num(t.year,6);case"G":return u("short");case"GG":return u("long");case"GGGGG":return u("narrow");case"kk":return this.num(t.weekYear.toString().slice(-2),2);case"kkkk":return this.num(t.weekYear,4);case"W":return this.num(t.weekNumber);case"WW":return this.num(t.weekNumber,2);case"n":return this.num(t.localWeekNumber);case"nn":return this.num(t.localWeekNumber,2);case"ii":return this.num(t.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(t.localWeekYear,4);case"o":return this.num(t.ordinal);case"ooo":return this.num(t.ordinal,3);case"q":return this.num(t.quarter);case"qq":return this.num(t.quarter,2);case"X":return this.num(Math.floor(t.ts/1e3));case"x":return this.num(t.ts);default:return h(f)}};return Zl(X.parseFormat(e),d)}formatDurationFromString(t,e){let i=l=>{switch(l[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"w":return"week";case"M":return"month";case"y":return"year";default:return null}},n=l=>c=>{let h=i(c);return h?this.num(l.get(h),c.length):c},r=X.parseFormat(e),o=r.reduce((l,{literal:c,val:h})=>c?l:l.concat(h),[]),a=t.shiftTo(...o.map(i).filter(l=>l));return Zl(r,n(a))}};var Gl=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function ls(...s){let t=s.reduce((e,i)=>e+i.source,"");return RegExp(`^${t}$`)}function cs(...s){return t=>s.reduce(([e,i,n],r)=>{let[o,a,l]=r(t,n);return[{...e,...o},a||i,l]},[{},null,1]).slice(0,2)}function hs(s,...t){if(s==null)return[null,null];for(let[e,i]of t){let n=e.exec(s);if(n)return i(n)}return[null,null]}function Xl(...s){return(t,e)=>{let i={},n;for(n=0;nf!==void 0&&(m||f&&h)?-f:f;return[{years:d(ue(e)),months:d(ue(i)),weeks:d(ue(n)),days:d(ue(r)),hours:d(ue(o)),minutes:d(ue(a)),seconds:d(ue(l),l==="-0"),milliseconds:d(ui(c),u)}]}var Sm={GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function no(s,t,e,i,n,r,o){let a={year:t.length===2?di(qt(t)):qt(t),month:Qr.indexOf(e)+1,day:qt(i),hour:qt(n),minute:qt(r)};return o&&(a.second=qt(o)),s&&(a.weekday=s.length>3?to.indexOf(s)+1:eo.indexOf(s)+1),a}var km=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function Mm(s){let[,t,e,i,n,r,o,a,l,c,h,u]=s,d=no(t,n,i,e,r,o,a),f;return l?f=Sm[l]:c?f=0:f=Se(h,u),[d,new G(f)]}function Tm(s){return s.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}var vm=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,Om=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,Dm=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function ql(s){let[,t,e,i,n,r,o,a]=s;return[no(t,n,i,e,r,o,a),G.utcInstance]}function Em(s){let[,t,e,i,n,r,o,a]=s;return[no(t,a,e,i,n,r,o),G.utcInstance]}var Cm=ls(um,io),Im=ls(dm,io),Fm=ls(fm,io),Am=ls(Jl),tc=cs(bm,us,fi,mi),Lm=cs(mm,us,fi,mi),Pm=cs(gm,us,fi,mi),Rm=cs(us,fi,mi);function ec(s){return hs(s,[Cm,tc],[Im,Lm],[Fm,Pm],[Am,Rm])}function sc(s){return hs(Tm(s),[km,Mm])}function ic(s){return hs(s,[vm,ql],[Om,ql],[Dm,Em])}function nc(s){return hs(s,[_m,wm])}var Nm=cs(us);function rc(s){return hs(s,[xm,Nm])}var Wm=ls(pm,ym),zm=ls(Ql),Vm=cs(us,fi,mi);function oc(s){return hs(s,[Wm,tc],[zm,Vm])}var ac="Invalid Duration",cc={weeks:{days:7,hours:7*24,minutes:7*24*60,seconds:7*24*60*60,milliseconds:7*24*60*60*1e3},days:{hours:24,minutes:24*60,seconds:24*60*60,milliseconds:24*60*60*1e3},hours:{minutes:60,seconds:60*60,milliseconds:60*60*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},Hm={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:91*24,minutes:91*24*60,seconds:91*24*60*60,milliseconds:91*24*60*60*1e3},months:{weeks:4,days:30,hours:30*24,minutes:30*24*60,seconds:30*24*60*60,milliseconds:30*24*60*60*1e3},...cc},Mt=146097/400,ds=146097/4800,Bm={years:{quarters:4,months:12,weeks:Mt/7,days:Mt,hours:Mt*24,minutes:Mt*24*60,seconds:Mt*24*60*60,milliseconds:Mt*24*60*60*1e3},quarters:{months:3,weeks:Mt/28,days:Mt/4,hours:Mt*24/4,minutes:Mt*24*60/4,seconds:Mt*24*60*60/4,milliseconds:Mt*24*60*60*1e3/4},months:{weeks:ds/7,days:ds,hours:ds*24,minutes:ds*24*60,seconds:ds*24*60*60,milliseconds:ds*24*60*60*1e3},...cc},Te=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],$m=Te.slice(0).reverse();function de(s,t,e=!1){let i={values:e?t.values:{...s.values,...t.values||{}},loc:s.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||s.conversionAccuracy,matrix:t.matrix||s.matrix};return new I(i)}function hc(s,t){let e=t.milliseconds??0;for(let i of $m.slice(1))t[i]&&(e+=t[i]*s[i].milliseconds);return e}function lc(s,t){let e=hc(s,t)<0?-1:1;Te.reduceRight((i,n)=>{if(D(t[n]))return i;if(i){let r=t[i]*e,o=s[n][i],a=Math.floor(r/o);t[n]+=a*e,t[i]-=a*o*e}return n},null),Te.reduce((i,n)=>{if(D(t[n]))return i;if(i){let r=t[i]%1;t[i]-=r,t[n]+=r*s[i][n]}return n},null)}function jm(s){let t={};for(let[e,i]of Object.entries(s))i!==0&&(t[e]=i);return t}var I=class{constructor(t){let e=t.conversionAccuracy==="longterm"||!1,i=e?Bm:Hm;t.matrix&&(i=t.matrix),this.values=t.values,this.loc=t.loc||P.create(),this.conversionAccuracy=e?"longterm":"casual",this.invalid=t.invalid||null,this.matrix=i,this.isLuxonDuration=!0}static fromMillis(t,e){return I.fromObject({milliseconds:t},e)}static fromObject(t,e={}){if(t==null||typeof t!="object")throw new J(`Duration.fromObject: argument expected to be an object, got ${t===null?"null":typeof t}`);return new I({values:os(t,I.normalizeUnit),loc:P.fromObject(e),conversionAccuracy:e.conversionAccuracy,matrix:e.matrix})}static fromDurationLike(t){if(Ct(t))return I.fromMillis(t);if(I.isDuration(t))return t;if(typeof t=="object")return I.fromObject(t);throw new J(`Unknown duration argument ${t} of type ${typeof t}`)}static fromISO(t,e){let[i]=nc(t);return i?I.fromObject(i,e):I.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static fromISOTime(t,e){let[i]=rc(t);return i?I.fromObject(i,e):I.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static invalid(t,e=null){if(!t)throw new J("need to specify a reason the Duration is invalid");let i=t instanceof rt?t:new rt(t,e);if(z.throwOnInvalid)throw new tn(i);return new I({invalid:i})}static normalizeUnit(t){let e={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[t&&t.toLowerCase()];if(!e)throw new ts(t);return e}static isDuration(t){return t&&t.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(t,e={}){let i={...e,floor:e.round!==!1&&e.floor!==!1};return this.isValid?X.create(this.loc,i).formatDurationFromString(this,t):ac}toHuman(t={}){if(!this.isValid)return ac;let e=Te.map(i=>{let n=this.values[i];return D(n)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...t,unit:i.slice(0,-1)}).format(n)}).filter(i=>i);return this.loc.listFormatter({type:"conjunction",style:t.listStyle||"narrow",...t}).format(e)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let t="P";return this.years!==0&&(t+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(t+=this.months+this.quarters*3+"M"),this.weeks!==0&&(t+=this.weeks+"W"),this.days!==0&&(t+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(t+="T"),this.hours!==0&&(t+=this.hours+"H"),this.minutes!==0&&(t+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(t+=ss(this.seconds+this.milliseconds/1e3,3)+"S"),t==="P"&&(t+="T0S"),t}toISOTime(t={}){if(!this.isValid)return null;let e=this.toMillis();return e<0||e>=864e5?null:(t={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...t,includeOffset:!1},T.fromMillis(e,{zone:"UTC"}).toISOTime(t))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?hc(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(t){if(!this.isValid)return this;let e=I.fromDurationLike(t),i={};for(let n of Te)(he(e.values,n)||he(this.values,n))&&(i[n]=e.get(n)+this.get(n));return de(this,{values:i},!0)}minus(t){if(!this.isValid)return this;let e=I.fromDurationLike(t);return this.plus(e.negate())}mapUnits(t){if(!this.isValid)return this;let e={};for(let i of Object.keys(this.values))e[i]=Jr(t(this.values[i],i));return de(this,{values:e},!0)}get(t){return this[I.normalizeUnit(t)]}set(t){if(!this.isValid)return this;let e={...this.values,...os(t,I.normalizeUnit)};return de(this,{values:e})}reconfigure({locale:t,numberingSystem:e,conversionAccuracy:i,matrix:n}={}){let o={loc:this.loc.clone({locale:t,numberingSystem:e}),matrix:n,conversionAccuracy:i};return de(this,o)}as(t){return this.isValid?this.shiftTo(t).get(t):NaN}normalize(){if(!this.isValid)return this;let t=this.toObject();return lc(this.matrix,t),de(this,{values:t},!0)}rescale(){if(!this.isValid)return this;let t=jm(this.normalize().shiftToAll().toObject());return de(this,{values:t},!0)}shiftTo(...t){if(!this.isValid)return this;if(t.length===0)return this;t=t.map(o=>I.normalizeUnit(o));let e={},i={},n=this.toObject(),r;for(let o of Te)if(t.indexOf(o)>=0){r=o;let a=0;for(let c in i)a+=this.matrix[c][o]*i[c],i[c]=0;Ct(n[o])&&(a+=n[o]);let l=Math.trunc(a);e[o]=l,i[o]=(a*1e3-l*1e3)/1e3}else Ct(n[o])&&(i[o]=n[o]);for(let o in i)i[o]!==0&&(e[r]+=o===r?i[o]:i[o]/this.matrix[r][o]);return lc(this.matrix,e),de(this,{values:e},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;let t={};for(let e of Object.keys(this.values))t[e]=this.values[e]===0?0:-this.values[e];return de(this,{values:t},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(t){if(!this.isValid||!t.isValid||!this.loc.equals(t.loc))return!1;function e(i,n){return i===void 0||i===0?n===void 0||n===0:i===n}for(let i of Te)if(!e(this.values[i],t.values[i]))return!1;return!0}};var fs="Invalid Interval";function Um(s,t){return!s||!s.isValid?U.invalid("missing or invalid start"):!t||!t.isValid?U.invalid("missing or invalid end"):tt:!1}isBefore(t){return this.isValid?this.e<=t:!1}contains(t){return this.isValid?this.s<=t&&this.e>t:!1}set({start:t,end:e}={}){return this.isValid?U.fromDateTimes(t||this.s,e||this.e):this}splitAt(...t){if(!this.isValid)return[];let e=t.map(ms).filter(o=>this.contains(o)).sort((o,a)=>o.toMillis()-a.toMillis()),i=[],{s:n}=this,r=0;for(;n+this.e?this.e:o;i.push(U.fromDateTimes(n,a)),n=a,r+=1}return i}splitBy(t){let e=I.fromDurationLike(t);if(!this.isValid||!e.isValid||e.as("milliseconds")===0)return[];let{s:i}=this,n=1,r,o=[];for(;il*n));r=+a>+this.e?this.e:a,o.push(U.fromDateTimes(i,r)),i=r,n+=1}return o}divideEqually(t){return this.isValid?this.splitBy(this.length()/t).slice(0,t):[]}overlaps(t){return this.e>t.s&&this.s=t.e:!1}equals(t){return!this.isValid||!t.isValid?!1:this.s.equals(t.s)&&this.e.equals(t.e)}intersection(t){if(!this.isValid)return this;let e=this.s>t.s?this.s:t.s,i=this.e=i?null:U.fromDateTimes(e,i)}union(t){if(!this.isValid)return this;let e=this.st.e?this.e:t.e;return U.fromDateTimes(e,i)}static merge(t){let[e,i]=t.sort((n,r)=>n.s-r.s).reduce(([n,r],o)=>r?r.overlaps(o)||r.abutsStart(o)?[n,r.union(o)]:[n.concat([r]),o]:[n,o],[[],null]);return i&&e.push(i),e}static xor(t){let e=null,i=0,n=[],r=t.map(l=>[{time:l.s,type:"s"},{time:l.e,type:"e"}]),o=Array.prototype.concat(...r),a=o.sort((l,c)=>l.time-c.time);for(let l of a)i+=l.type==="s"?1:-1,i===1?e=l.time:(e&&+e!=+l.time&&n.push(U.fromDateTimes(e,l.time)),e=null);return U.merge(n)}difference(...t){return U.xor([this].concat(t)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} \u2013 ${this.e.toISO()})`:fs}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(t=ae,e={}){return this.isValid?X.create(this.s.loc.clone(e),t).formatInterval(this):fs}toISO(t){return this.isValid?`${this.s.toISO(t)}/${this.e.toISO(t)}`:fs}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:fs}toISOTime(t){return this.isValid?`${this.s.toISOTime(t)}/${this.e.toISOTime(t)}`:fs}toFormat(t,{separator:e=" \u2013 "}={}){return this.isValid?`${this.s.toFormat(t)}${e}${this.e.toFormat(t)}`:fs}toDuration(t,e){return this.isValid?this.e.diff(this.s,t,e):I.invalid(this.invalidReason)}mapEndpoints(t){return U.fromDateTimes(t(this.s),t(this.e))}};var Gt=class{static hasDST(t=z.defaultZone){let e=T.now().setZone(t).set({month:12});return!t.isUniversal&&e.offset!==e.set({month:6}).offset}static isValidIANAZone(t){return nt.isValidZone(t)}static normalizeZone(t){return Et(t,z.defaultZone)}static getStartOfWeek({locale:t=null,locObj:e=null}={}){return(e||P.create(t)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:t=null,locObj:e=null}={}){return(e||P.create(t)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:t=null,locObj:e=null}={}){return(e||P.create(t)).getWeekendDays().slice()}static months(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null,outputCalendar:r="gregory"}={}){return(n||P.create(e,i,r)).months(t)}static monthsFormat(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null,outputCalendar:r="gregory"}={}){return(n||P.create(e,i,r)).months(t,!0)}static weekdays(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null}={}){return(n||P.create(e,i,null)).weekdays(t)}static weekdaysFormat(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null}={}){return(n||P.create(e,i,null)).weekdays(t,!0)}static meridiems({locale:t=null}={}){return P.create(t).meridiems()}static eras(t="short",{locale:e=null}={}){return P.create(e,null,"gregory").eras(t)}static features(){return{relative:an(),localeWeek:ln()}}};function uc(s,t){let e=n=>n.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),i=e(t)-e(s);return Math.floor(I.fromMillis(i).as("days"))}function Ym(s,t,e){let i=[["years",(l,c)=>c.year-l.year],["quarters",(l,c)=>c.quarter-l.quarter+(c.year-l.year)*4],["months",(l,c)=>c.month-l.month+(c.year-l.year)*12],["weeks",(l,c)=>{let h=uc(l,c);return(h-h%7)/7}],["days",uc]],n={},r=s,o,a;for(let[l,c]of i)e.indexOf(l)>=0&&(o=l,n[l]=c(s,t),a=r.plus(n),a>t?(n[l]--,s=r.plus(n),s>t&&(a=s,n[l]--,s=r.plus(n))):s=a);return[s,n,a,o]}function dc(s,t,e,i){let[n,r,o,a]=Ym(s,t,e),l=t-n,c=e.filter(u=>["hours","minutes","seconds","milliseconds"].indexOf(u)>=0);c.length===0&&(o0?I.fromMillis(l,i).shiftTo(...c).plus(h):h}var Zm="missing Intl.DateTimeFormat.formatToParts support";function V(s,t=e=>e){return{regex:s,deser:([e])=>t(kl(e))}}var qm=String.fromCharCode(160),gc=`[ ${qm}]`,pc=new RegExp(gc,"g");function Gm(s){return s.replace(/\./g,"\\.?").replace(pc,gc)}function fc(s){return s.replace(/\./g,"").replace(pc," ").toLowerCase()}function It(s,t){return s===null?null:{regex:RegExp(s.map(Gm).join("|")),deser:([e])=>s.findIndex(i=>fc(e)===fc(i))+t}}function mc(s,t){return{regex:s,deser:([,e,i])=>Se(e,i),groups:t}}function dn(s){return{regex:s,deser:([t])=>t}}function Xm(s){return s.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function Km(s,t){let e=St(t),i=St(t,"{2}"),n=St(t,"{3}"),r=St(t,"{4}"),o=St(t,"{6}"),a=St(t,"{1,2}"),l=St(t,"{1,3}"),c=St(t,"{1,6}"),h=St(t,"{1,9}"),u=St(t,"{2,4}"),d=St(t,"{4,6}"),f=p=>({regex:RegExp(Xm(p.val)),deser:([y])=>y,literal:!0}),g=(p=>{if(s.literal)return f(p);switch(p.val){case"G":return It(t.eras("short"),0);case"GG":return It(t.eras("long"),0);case"y":return V(c);case"yy":return V(u,di);case"yyyy":return V(r);case"yyyyy":return V(d);case"yyyyyy":return V(o);case"M":return V(a);case"MM":return V(i);case"MMM":return It(t.months("short",!0),1);case"MMMM":return It(t.months("long",!0),1);case"L":return V(a);case"LL":return V(i);case"LLL":return It(t.months("short",!1),1);case"LLLL":return It(t.months("long",!1),1);case"d":return V(a);case"dd":return V(i);case"o":return V(l);case"ooo":return V(n);case"HH":return V(i);case"H":return V(a);case"hh":return V(i);case"h":return V(a);case"mm":return V(i);case"m":return V(a);case"q":return V(a);case"qq":return V(i);case"s":return V(a);case"ss":return V(i);case"S":return V(l);case"SSS":return V(n);case"u":return dn(h);case"uu":return dn(a);case"uuu":return V(e);case"a":return It(t.meridiems(),0);case"kkkk":return V(r);case"kk":return V(u,di);case"W":return V(a);case"WW":return V(i);case"E":case"c":return V(e);case"EEE":return It(t.weekdays("short",!1),1);case"EEEE":return It(t.weekdays("long",!1),1);case"ccc":return It(t.weekdays("short",!0),1);case"cccc":return It(t.weekdays("long",!0),1);case"Z":case"ZZ":return mc(new RegExp(`([+-]${a.source})(?::(${i.source}))?`),2);case"ZZZ":return mc(new RegExp(`([+-]${a.source})(${i.source})?`),2);case"z":return dn(/[a-z_+-/]{1,256}?/i);case" ":return dn(/[^\S\n\r]/);default:return f(p)}})(s)||{invalidReason:Zm};return g.token=s,g}var Jm={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};function Qm(s,t,e){let{type:i,value:n}=s;if(i==="literal"){let l=/^\s+$/.test(n);return{literal:!l,val:l?" ":n}}let r=t[i],o=i;i==="hour"&&(t.hour12!=null?o=t.hour12?"hour12":"hour24":t.hourCycle!=null?t.hourCycle==="h11"||t.hourCycle==="h12"?o="hour12":o="hour24":o=e.hour12?"hour12":"hour24");let a=Jm[o];if(typeof a=="object"&&(a=a[r]),a)return{literal:!1,val:a}}function tg(s){return[`^${s.map(e=>e.regex).reduce((e,i)=>`${e}(${i.source})`,"")}$`,s]}function eg(s,t,e){let i=s.match(t);if(i){let n={},r=1;for(let o in e)if(he(e,o)){let a=e[o],l=a.groups?a.groups+1:1;!a.literal&&a.token&&(n[a.token.val[0]]=a.deser(i.slice(r,r+l))),r+=l}return[i,n]}else return[i,{}]}function sg(s){let t=r=>{switch(r){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}},e=null,i;return D(s.z)||(e=nt.create(s.z)),D(s.Z)||(e||(e=new G(s.Z)),i=s.Z),D(s.q)||(s.M=(s.q-1)*3+1),D(s.h)||(s.h<12&&s.a===1?s.h+=12:s.h===12&&s.a===0&&(s.h=0)),s.G===0&&s.y&&(s.y=-s.y),D(s.u)||(s.S=ui(s.u)),[Object.keys(s).reduce((r,o)=>{let a=t(o);return a&&(r[a]=s[o]),r},{}),e,i]}var ro=null;function ig(){return ro||(ro=T.fromMillis(1555555555555)),ro}function ng(s,t){if(s.literal)return s;let e=X.macroTokenToFormatOpts(s.val),i=lo(e,t);return i==null||i.includes(void 0)?s:i}function oo(s,t){return Array.prototype.concat(...s.map(e=>ng(e,t)))}var gi=class{constructor(t,e){if(this.locale=t,this.format=e,this.tokens=oo(X.parseFormat(e),t),this.units=this.tokens.map(i=>Km(i,t)),this.disqualifyingUnit=this.units.find(i=>i.invalidReason),!this.disqualifyingUnit){let[i,n]=tg(this.units);this.regex=RegExp(i,"i"),this.handlers=n}}explainFromTokens(t){if(this.isValid){let[e,i]=eg(t,this.regex,this.handlers),[n,r,o]=i?sg(i):[null,null,void 0];if(he(i,"a")&&he(i,"H"))throw new vt("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:this.tokens,regex:this.regex,rawMatches:e,matches:i,result:n,zone:r,specificOffset:o}}else return{input:t,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}};function ao(s,t,e){return new gi(s,e).explainFromTokens(t)}function yc(s,t,e){let{result:i,zone:n,specificOffset:r,invalidReason:o}=ao(s,t,e);return[i,n,r,o]}function lo(s,t){if(!s)return null;let i=X.create(t,s).dtFormatter(ig()),n=i.formatToParts(),r=i.resolvedOptions();return n.map(o=>Qm(o,s,r))}var co="Invalid DateTime",bc=864e13;function pi(s){return new rt("unsupported zone",`the zone "${s.name}" is not supported`)}function ho(s){return s.weekData===null&&(s.weekData=li(s.c)),s.weekData}function uo(s){return s.localWeekData===null&&(s.localWeekData=li(s.c,s.loc.getMinDaysInFirstWeek(),s.loc.getStartOfWeek())),s.localWeekData}function ve(s,t){let e={ts:s.ts,zone:s.zone,c:s.c,o:s.o,loc:s.loc,invalid:s.invalid};return new T({...e,...t,old:e})}function Tc(s,t,e){let i=s-t*60*1e3,n=e.offset(i);if(t===n)return[i,t];i-=(n-t)*60*1e3;let r=e.offset(i);return n===r?[i,n]:[s-Math.min(n,r)*60*1e3,Math.max(n,r)]}function fn(s,t){s+=t*60*1e3;let e=new Date(s);return{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate(),hour:e.getUTCHours(),minute:e.getUTCMinutes(),second:e.getUTCSeconds(),millisecond:e.getUTCMilliseconds()}}function gn(s,t,e){return Tc(es(s),t,e)}function xc(s,t){let e=s.o,i=s.c.year+Math.trunc(t.years),n=s.c.month+Math.trunc(t.months)+Math.trunc(t.quarters)*3,r={...s.c,year:i,month:n,day:Math.min(s.c.day,rs(i,n))+Math.trunc(t.days)+Math.trunc(t.weeks)*7},o=I.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),a=es(r),[l,c]=Tc(a,e,s.zone);return o!==0&&(l+=o,c=s.zone.offset(l)),{ts:l,o:c}}function gs(s,t,e,i,n,r){let{setZone:o,zone:a}=e;if(s&&Object.keys(s).length!==0||t){let l=t||a,c=T.fromObject(s,{...e,zone:l,specificOffset:r});return o?c:c.setZone(a)}else return T.invalid(new rt("unparsable",`the input "${n}" can't be parsed as ${i}`))}function mn(s,t,e=!0){return s.isValid?X.create(P.create("en-US"),{allowZ:e,forceSimple:!0}).formatDateTimeFromString(s,t):null}function fo(s,t){let e=s.c.year>9999||s.c.year<0,i="";return e&&s.c.year>=0&&(i+="+"),i+=q(s.c.year,e?6:4),t?(i+="-",i+=q(s.c.month),i+="-",i+=q(s.c.day)):(i+=q(s.c.month),i+=q(s.c.day)),i}function _c(s,t,e,i,n,r){let o=q(s.c.hour);return t?(o+=":",o+=q(s.c.minute),(s.c.millisecond!==0||s.c.second!==0||!e)&&(o+=":")):o+=q(s.c.minute),(s.c.millisecond!==0||s.c.second!==0||!e)&&(o+=q(s.c.second),(s.c.millisecond!==0||!i)&&(o+=".",o+=q(s.c.millisecond,3))),n&&(s.isOffsetFixed&&s.offset===0&&!r?o+="Z":s.o<0?(o+="-",o+=q(Math.trunc(-s.o/60)),o+=":",o+=q(Math.trunc(-s.o%60))):(o+="+",o+=q(Math.trunc(s.o/60)),o+=":",o+=q(Math.trunc(s.o%60)))),r&&(o+="["+s.zone.ianaName+"]"),o}var vc={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},rg={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},og={ordinal:1,hour:0,minute:0,second:0,millisecond:0},Oc=["year","month","day","hour","minute","second","millisecond"],ag=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],lg=["year","ordinal","hour","minute","second","millisecond"];function cg(s){let t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[s.toLowerCase()];if(!t)throw new ts(s);return t}function wc(s){switch(s.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return cg(s)}}function hg(s){return yn[s]||(pn===void 0&&(pn=z.now()),yn[s]=s.offset(pn)),yn[s]}function Sc(s,t){let e=Et(t.zone,z.defaultZone);if(!e.isValid)return T.invalid(pi(e));let i=P.fromObject(t),n,r;if(D(s.year))n=z.now();else{for(let l of Oc)D(s[l])&&(s[l]=vc[l]);let o=Gr(s)||Xr(s);if(o)return T.invalid(o);let a=hg(e);[n,r]=gn(s,a,e)}return new T({ts:n,zone:e,loc:i,o:r})}function kc(s,t,e){let i=D(e.round)?!0:e.round,n=(o,a)=>(o=ss(o,i||e.calendary?0:2,!0),t.loc.clone(e).relFormatter(e).format(o,a)),r=o=>e.calendary?t.hasSame(s,o)?0:t.startOf(o).diff(s.startOf(o),o).get(o):t.diff(s,o).get(o);if(e.unit)return n(r(e.unit),e.unit);for(let o of e.units){let a=r(o);if(Math.abs(a)>=1)return n(a,o)}return n(s>t?-0:0,e.units[e.units.length-1])}function Mc(s){let t={},e;return s.length>0&&typeof s[s.length-1]=="object"?(t=s[s.length-1],e=Array.from(s).slice(0,s.length-1)):e=Array.from(s),[t,e]}var pn,yn={},T=class{constructor(t){let e=t.zone||z.defaultZone,i=t.invalid||(Number.isNaN(t.ts)?new rt("invalid input"):null)||(e.isValid?null:pi(e));this.ts=D(t.ts)?z.now():t.ts;let n=null,r=null;if(!i)if(t.old&&t.old.ts===this.ts&&t.old.zone.equals(e))[n,r]=[t.old.c,t.old.o];else{let a=Ct(t.o)&&!t.old?t.o:e.offset(this.ts);n=fn(this.ts,a),i=Number.isNaN(n.year)?new rt("invalid input"):null,n=i?null:n,r=i?null:a}this._zone=e,this.loc=t.loc||P.create(),this.invalid=i,this.weekData=null,this.localWeekData=null,this.c=n,this.o=r,this.isLuxonDateTime=!0}static now(){return new T({})}static local(){let[t,e]=Mc(arguments),[i,n,r,o,a,l,c]=e;return Sc({year:i,month:n,day:r,hour:o,minute:a,second:l,millisecond:c},t)}static utc(){let[t,e]=Mc(arguments),[i,n,r,o,a,l,c]=e;return t.zone=G.utcInstance,Sc({year:i,month:n,day:r,hour:o,minute:a,second:l,millisecond:c},t)}static fromJSDate(t,e={}){let i=Vl(t)?t.valueOf():NaN;if(Number.isNaN(i))return T.invalid("invalid input");let n=Et(e.zone,z.defaultZone);return n.isValid?new T({ts:i,zone:n,loc:P.fromObject(e)}):T.invalid(pi(n))}static fromMillis(t,e={}){if(Ct(t))return t<-bc||t>bc?T.invalid("Timestamp out of range"):new T({ts:t,zone:Et(e.zone,z.defaultZone),loc:P.fromObject(e)});throw new J(`fromMillis requires a numerical input, but received a ${typeof t} with value ${t}`)}static fromSeconds(t,e={}){if(Ct(t))return new T({ts:t*1e3,zone:Et(e.zone,z.defaultZone),loc:P.fromObject(e)});throw new J("fromSeconds requires a numerical input")}static fromObject(t,e={}){t=t||{};let i=Et(e.zone,z.defaultZone);if(!i.isValid)return T.invalid(pi(i));let n=P.fromObject(e),r=os(t,wc),{minDaysInFirstWeek:o,startOfWeek:a}=qr(r,n),l=z.now(),c=D(e.specificOffset)?i.offset(l):e.specificOffset,h=!D(r.ordinal),u=!D(r.year),d=!D(r.month)||!D(r.day),f=u||d,m=r.weekYear||r.weekNumber;if((f||h)&&m)throw new vt("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(d&&h)throw new vt("Can't mix ordinal dates with month/day");let g=m||r.weekday&&!f,p,y,b=fn(l,c);g?(p=ag,y=rg,b=li(b,o,a)):h?(p=lg,y=og,b=un(b)):(p=Oc,y=vc);let _=!1;for(let F of p){let W=r[F];D(W)?_?r[F]=y[F]:r[F]=b[F]:_=!0}let w=g?Nl(r,o,a):h?Wl(r):Gr(r),x=w||Xr(r);if(x)return T.invalid(x);let S=g?Yr(r,o,a):h?Zr(r):r,[k,O]=gn(S,c,i),v=new T({ts:k,zone:i,o:O,loc:n});return r.weekday&&f&&t.weekday!==v.weekday?T.invalid("mismatched weekday",`you can't specify both a weekday of ${r.weekday} and a date of ${v.toISO()}`):v.isValid?v:T.invalid(v.invalid)}static fromISO(t,e={}){let[i,n]=ec(t);return gs(i,n,e,"ISO 8601",t)}static fromRFC2822(t,e={}){let[i,n]=sc(t);return gs(i,n,e,"RFC 2822",t)}static fromHTTP(t,e={}){let[i,n]=ic(t);return gs(i,n,e,"HTTP",e)}static fromFormat(t,e,i={}){if(D(t)||D(e))throw new J("fromFormat requires an input string and a format");let{locale:n=null,numberingSystem:r=null}=i,o=P.fromOpts({locale:n,numberingSystem:r,defaultToEN:!0}),[a,l,c,h]=yc(o,t,e);return h?T.invalid(h):gs(a,l,i,`format ${e}`,t,c)}static fromString(t,e,i={}){return T.fromFormat(t,e,i)}static fromSQL(t,e={}){let[i,n]=oc(t);return gs(i,n,e,"SQL",t)}static invalid(t,e=null){if(!t)throw new J("need to specify a reason the DateTime is invalid");let i=t instanceof rt?t:new rt(t,e);if(z.throwOnInvalid)throw new Ji(i);return new T({invalid:i})}static isDateTime(t){return t&&t.isLuxonDateTime||!1}static parseFormatForOpts(t,e={}){let i=lo(t,P.fromObject(e));return i?i.map(n=>n?n.val:null).join(""):null}static expandFormat(t,e={}){return oo(X.parseFormat(t),P.fromObject(e)).map(n=>n.val).join("")}static resetCache(){pn=void 0,yn={}}get(t){return this[t]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?ho(this).weekYear:NaN}get weekNumber(){return this.isValid?ho(this).weekNumber:NaN}get weekday(){return this.isValid?ho(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?uo(this).weekday:NaN}get localWeekNumber(){return this.isValid?uo(this).weekNumber:NaN}get localWeekYear(){return this.isValid?uo(this).weekYear:NaN}get ordinal(){return this.isValid?un(this.c).ordinal:NaN}get monthShort(){return this.isValid?Gt.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Gt.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Gt.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Gt.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];let t=864e5,e=6e4,i=es(this.c),n=this.zone.offset(i-t),r=this.zone.offset(i+t),o=this.zone.offset(i-n*e),a=this.zone.offset(i-r*e);if(o===a)return[this];let l=i-o*e,c=i-a*e,h=fn(l,o),u=fn(c,a);return h.hour===u.hour&&h.minute===u.minute&&h.second===u.second&&h.millisecond===u.millisecond?[ve(this,{ts:l}),ve(this,{ts:c})]:[this]}get isInLeapYear(){return Me(this.year)}get daysInMonth(){return rs(this.year,this.month)}get daysInYear(){return this.isValid?ce(this.year):NaN}get weeksInWeekYear(){return this.isValid?ke(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?ke(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(t={}){let{locale:e,numberingSystem:i,calendar:n}=X.create(this.loc.clone(t),t).resolvedOptions(this);return{locale:e,numberingSystem:i,outputCalendar:n}}toUTC(t=0,e={}){return this.setZone(G.instance(t),e)}toLocal(){return this.setZone(z.defaultZone)}setZone(t,{keepLocalTime:e=!1,keepCalendarTime:i=!1}={}){if(t=Et(t,z.defaultZone),t.equals(this.zone))return this;if(t.isValid){let n=this.ts;if(e||i){let r=t.offset(this.ts),o=this.toObject();[n]=gn(o,r,t)}return ve(this,{ts:n,zone:t})}else return T.invalid(pi(t))}reconfigure({locale:t,numberingSystem:e,outputCalendar:i}={}){let n=this.loc.clone({locale:t,numberingSystem:e,outputCalendar:i});return ve(this,{loc:n})}setLocale(t){return this.reconfigure({locale:t})}set(t){if(!this.isValid)return this;let e=os(t,wc),{minDaysInFirstWeek:i,startOfWeek:n}=qr(e,this.loc),r=!D(e.weekYear)||!D(e.weekNumber)||!D(e.weekday),o=!D(e.ordinal),a=!D(e.year),l=!D(e.month)||!D(e.day),c=a||l,h=e.weekYear||e.weekNumber;if((c||o)&&h)throw new vt("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(l&&o)throw new vt("Can't mix ordinal dates with month/day");let u;r?u=Yr({...li(this.c,i,n),...e},i,n):D(e.ordinal)?(u={...this.toObject(),...e},D(e.day)&&(u.day=Math.min(rs(u.year,u.month),u.day))):u=Zr({...un(this.c),...e});let[d,f]=gn(u,this.o,this.zone);return ve(this,{ts:d,o:f})}plus(t){if(!this.isValid)return this;let e=I.fromDurationLike(t);return ve(this,xc(this,e))}minus(t){if(!this.isValid)return this;let e=I.fromDurationLike(t).negate();return ve(this,xc(this,e))}startOf(t,{useLocaleWeeks:e=!1}={}){if(!this.isValid)return this;let i={},n=I.normalizeUnit(t);switch(n){case"years":i.month=1;case"quarters":case"months":i.day=1;case"weeks":case"days":i.hour=0;case"hours":i.minute=0;case"minutes":i.second=0;case"seconds":i.millisecond=0;break;case"milliseconds":break}if(n==="weeks")if(e){let r=this.loc.getStartOfWeek(),{weekday:o}=this;othis.valueOf(),a=o?this:t,l=o?t:this,c=dc(a,l,r,n);return o?c.negate():c}diffNow(t="milliseconds",e={}){return this.diff(T.now(),t,e)}until(t){return this.isValid?U.fromDateTimes(this,t):this}hasSame(t,e,i){if(!this.isValid)return!1;let n=t.valueOf(),r=this.setZone(t.zone,{keepLocalTime:!0});return r.startOf(e,i)<=n&&n<=r.endOf(e,i)}equals(t){return this.isValid&&t.isValid&&this.valueOf()===t.valueOf()&&this.zone.equals(t.zone)&&this.loc.equals(t.loc)}toRelative(t={}){if(!this.isValid)return null;let e=t.base||T.fromObject({},{zone:this.zone}),i=t.padding?thise.valueOf(),Math.min)}static max(...t){if(!t.every(T.isDateTime))throw new J("max requires all arguments be DateTimes");return Kr(t,e=>e.valueOf(),Math.max)}static fromFormatExplain(t,e,i={}){let{locale:n=null,numberingSystem:r=null}=i,o=P.fromOpts({locale:n,numberingSystem:r,defaultToEN:!0});return ao(o,t,e)}static fromStringExplain(t,e,i={}){return T.fromFormatExplain(t,e,i)}static buildFormatParser(t,e={}){let{locale:i=null,numberingSystem:n=null}=e,r=P.fromOpts({locale:i,numberingSystem:n,defaultToEN:!0});return new gi(r,t)}static fromFormatParser(t,e,i={}){if(D(t)||D(e))throw new J("fromFormatParser requires an input string and a format parser");let{locale:n=null,numberingSystem:r=null}=i,o=P.fromOpts({locale:n,numberingSystem:r,defaultToEN:!0});if(!o.equals(e.locale))throw new J(`fromFormatParser called with a locale of ${o}, but the format parser was created for ${e.locale}`);let{result:a,zone:l,specificOffset:c,invalidReason:h}=e.explainFromTokens(t);return h?T.invalid(h):gs(a,l,i,`format ${e.format}`,t,c)}static get DATE_SHORT(){return ae}static get DATE_MED(){return Hs}static get DATE_MED_WITH_WEEKDAY(){return Er}static get DATE_FULL(){return Bs}static get DATE_HUGE(){return $s}static get TIME_SIMPLE(){return js}static get TIME_WITH_SECONDS(){return Us}static get TIME_WITH_SHORT_OFFSET(){return Ys}static get TIME_WITH_LONG_OFFSET(){return Zs}static get TIME_24_SIMPLE(){return qs}static get TIME_24_WITH_SECONDS(){return Gs}static get TIME_24_WITH_SHORT_OFFSET(){return Xs}static get TIME_24_WITH_LONG_OFFSET(){return Ks}static get DATETIME_SHORT(){return Js}static get DATETIME_SHORT_WITH_SECONDS(){return Qs}static get DATETIME_MED(){return ti}static get DATETIME_MED_WITH_SECONDS(){return ei}static get DATETIME_MED_WITH_WEEKDAY(){return Cr}static get DATETIME_FULL(){return si}static get DATETIME_FULL_WITH_SECONDS(){return ii}static get DATETIME_HUGE(){return ni}static get DATETIME_HUGE_WITH_SECONDS(){return ri}};function ms(s){if(T.isDateTime(s))return s;if(s&&s.valueOf&&Ct(s.valueOf()))return T.fromJSDate(s);if(s&&typeof s=="object")return T.fromObject(s);throw new J(`Unknown datetime argument: ${s}, of type ${typeof s}`)}var ug={datetime:T.DATETIME_MED_WITH_SECONDS,millisecond:"h:mm:ss.SSS a",second:T.TIME_WITH_SECONDS,minute:T.TIME_SIMPLE,hour:{hour:"numeric"},day:{day:"numeric",month:"short"},week:"DD",month:{month:"short",year:"numeric"},quarter:"'Q'q - yyyy",year:{year:"numeric"}};Or._date.override({_id:"luxon",_create:function(s){return T.fromMillis(s,this.options)},init(s){this.options.locale||(this.options.locale=s.locale)},formats:function(){return ug},parse:function(s,t){let e=this.options,i=typeof s;return s===null||i==="undefined"?null:(i==="number"?s=this._create(s):i==="string"?typeof t=="string"?s=T.fromFormat(s,t,e):s=T.fromISO(s,e):s instanceof Date?s=T.fromJSDate(s,e):i==="object"&&!(s instanceof T)&&(s=T.fromObject(s,e)),s.isValid?s.valueOf():null)},format:function(s,t){let e=this._create(s);return typeof t=="string"?e.toFormat(t):e.toLocaleString(t)},add:function(s,t,e){let i={};return i[e]=t,this._create(s).plus(i).valueOf()},diff:function(s,t,e){return this._create(s).diff(this._create(t)).as(e).valueOf()},startOf:function(s,t,e){if(t==="isoWeek"){e=Math.trunc(Math.min(Math.max(0,e),6));let i=this._create(s);return i.minus({days:(i.weekday-e+7)%7}).startOf("day").valueOf()}return t?this._create(s).startOf(t).valueOf():s},endOf:function(s,t){return this._create(s).endOf(t).valueOf()}});function bn({cachedData:s,options:t,type:e}){return{init:function(){this.initChart(),this.$wire.$on("updateChartData",({data:i})=>{bn=this.getChart(),bn.data=i,bn.update("resize")}),Alpine.effect(()=>{Alpine.store("theme"),this.$nextTick(()=>{this.getChart()&&(this.getChart().destroy(),this.initChart())})}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Alpine.store("theme")==="system"&&this.$nextTick(()=>{this.getChart().destroy(),this.initChart()})})},initChart:function(i=null){var o,a,l,c,h,u,d;Wt.defaults.animation.duration=0,Wt.defaults.backgroundColor=getComputedStyle(this.$refs.backgroundColorElement).color;let n=getComputedStyle(this.$refs.borderColorElement).color;Wt.defaults.borderColor=n,Wt.defaults.color=getComputedStyle(this.$refs.textColorElement).color,Wt.defaults.font.family=getComputedStyle(this.$el).fontFamily,Wt.defaults.plugins.legend.labels.boxWidth=12,Wt.defaults.plugins.legend.position="bottom";let r=getComputedStyle(this.$refs.gridColorElement).color;return t??(t={}),t.borderWidth??(t.borderWidth=2),t.pointBackgroundColor??(t.pointBackgroundColor=n),t.pointHitRadius??(t.pointHitRadius=4),t.pointRadius??(t.pointRadius=2),t.scales??(t.scales={}),(o=t.scales).x??(o.x={}),(a=t.scales.x).grid??(a.grid={}),t.scales.x.grid.color=r,(l=t.scales.x.grid).display??(l.display=!1),(c=t.scales.x.grid).drawBorder??(c.drawBorder=!1),(h=t.scales).y??(h.y={}),(u=t.scales.y).grid??(u.grid={}),t.scales.y.grid.color=r,(d=t.scales.y.grid).drawBorder??(d.drawBorder=!1),new Wt(this.$refs.canvas,{type:e,data:i??s,options:t,plugins:window.filamentChartJsPlugins??[]})},getChart:function(){return Wt.getChart(this.$refs.canvas)}}}export{bn as default}; +`):s}function Of(s,t){let{element:e,datasetIndex:i,index:n}=t,o=s.getDatasetMeta(i).controller,{label:r,value:a}=o.getLabelAndValue(n);return{chart:s,label:r,parsed:o.getParsed(n),raw:s.data.datasets[i].data[n],formattedValue:a,dataset:o.getDataset(),dataIndex:n,datasetIndex:i,element:e}}function fa(s,t){let e=s.chart.ctx,{body:i,footer:n,title:o}=s,{boxWidth:r,boxHeight:a}=t,l=X(t.bodyFont),c=X(t.titleFont),h=X(t.footerFont),u=o.length,d=n.length,f=i.length,g=nt(t.padding),m=g.height,p=0,b=i.reduce((w,x)=>w+x.before.length+x.lines.length+x.after.length,0);if(b+=s.beforeBody.length+s.afterBody.length,u&&(m+=u*c.lineHeight+(u-1)*t.titleSpacing+t.titleMarginBottom),b){let w=t.displayColors?Math.max(a,l.lineHeight):l.lineHeight;m+=f*w+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}d&&(m+=t.footerMarginTop+d*h.lineHeight+(d-1)*t.footerSpacing);let y=0,_=function(w){p=Math.max(p,e.measureText(w).width+y)};return e.save(),e.font=c.string,z(s.title,_),e.font=l.string,z(s.beforeBody.concat(s.afterBody),_),y=t.displayColors?r+2+t.boxPadding:0,z(i,w=>{z(w.before,_),z(w.lines,_),z(w.after,_)}),y=0,e.font=h.string,z(s.footer,_),e.restore(),p+=g.width,{width:p,height:m}}function Tf(s,t){let{y:e,height:i}=t;return es.height-i/2?"bottom":"center"}function Df(s,t,e,i){let{x:n,width:o}=i,r=e.caretSize+e.caretPadding;if(s==="left"&&n+o+r>t.width||s==="right"&&n-o-r<0)return!0}function Cf(s,t,e,i){let{x:n,width:o}=e,{width:r,chartArea:{left:a,right:l}}=s,c="center";return i==="center"?c=n<=(a+l)/2?"left":"right":n<=o/2?c="left":n>=r-o/2&&(c="right"),Df(c,s,t,e)&&(c="center"),c}function ga(s,t,e){let i=e.yAlign||t.yAlign||Tf(s,e);return{xAlign:e.xAlign||t.xAlign||Cf(s,t,e,i),yAlign:i}}function Pf(s,t){let{x:e,width:i}=s;return t==="right"?e-=i:t==="center"&&(e-=i/2),e}function Af(s,t,e){let{y:i,height:n}=s;return t==="top"?i+=e:t==="bottom"?i-=n+e:i-=n/2,i}function ma(s,t,e,i){let{caretSize:n,caretPadding:o,cornerRadius:r}=s,{xAlign:a,yAlign:l}=e,c=n+o,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=te(r),g=Pf(t,a),m=Af(t,l,c);return l==="center"?a==="left"?g+=c:a==="right"&&(g-=c):a==="left"?g-=Math.max(h,d)+n:a==="right"&&(g+=Math.max(u,f)+n),{x:K(g,0,i.width-t.width),y:K(m,0,i.height-t.height)}}function pi(s,t,e){let i=nt(e.padding);return t==="center"?s.x+s.width/2:t==="right"?s.x+s.width-i.right:s.x+i.left}function pa(s){return Et([],$t(s))}function If(s,t,e){return Bt(s,{tooltip:t,tooltipItems:e,type:"tooltip"})}function ba(s,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?s.override(e):s}var Ya={beforeTitle:At,title(s){if(s.length>0){let t=s[0],e=t.chart.data.labels,i=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(i>0&&t.dataIndex"u"?Ya[t].call(e,i):n}var Ps=class extends dt{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,i=this.options.setContext(this.getContext()),n=i.enabled&&e.options.animation&&i.animations,o=new _i(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=If(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:i}=e,n=lt(i,"beforeTitle",this,t),o=lt(i,"title",this,t),r=lt(i,"afterTitle",this,t),a=[];return a=Et(a,$t(n)),a=Et(a,$t(o)),a=Et(a,$t(r)),a}getBeforeBody(t,e){return pa(lt(e.callbacks,"beforeBody",this,t))}getBody(t,e){let{callbacks:i}=e,n=[];return z(t,o=>{let r={before:[],lines:[],after:[]},a=ba(i,o);Et(r.before,$t(lt(a,"beforeLabel",this,o))),Et(r.lines,lt(a,"label",this,o)),Et(r.after,$t(lt(a,"afterLabel",this,o))),n.push(r)}),n}getAfterBody(t,e){return pa(lt(e.callbacks,"afterBody",this,t))}getFooter(t,e){let{callbacks:i}=e,n=lt(i,"beforeFooter",this,t),o=lt(i,"footer",this,t),r=lt(i,"afterFooter",this,t),a=[];return a=Et(a,$t(n)),a=Et(a,$t(o)),a=Et(a,$t(r)),a}_createItems(t){let e=this._active,i=this.chart.data,n=[],o=[],r=[],a=[],l,c;for(l=0,c=e.length;lt.filter(h,u,d,i))),t.itemSort&&(a=a.sort((h,u)=>t.itemSort(h,u,i))),z(a,h=>{let u=ba(t.callbacks,h);n.push(lt(u,"labelColor",this,h)),o.push(lt(u,"labelPointStyle",this,h)),r.push(lt(u,"labelTextColor",this,h))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=r,this.dataPoints=a,a}update(t,e){let i=this.options.setContext(this.getContext()),n=this._active,o,r=[];if(!n.length)this.opacity!==0&&(o={opacity:0});else{let a=Ms[i.position].call(this,n,this._eventPosition);r=this._createItems(i),this.title=this.getTitle(r,i),this.beforeBody=this.getBeforeBody(r,i),this.body=this.getBody(r,i),this.afterBody=this.getAfterBody(r,i),this.footer=this.getFooter(r,i);let l=this._size=fa(this,i),c=Object.assign({},a,l),h=ga(this.chart,i,c),u=ma(i,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,o={opacity:1,x:u.x,y:u.y,width:l.width,height:l.height,caretX:a.x,caretY:a.y}}this._tooltipItems=r,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,n){let o=this.getCaretPosition(t,i,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,i){let{xAlign:n,yAlign:o}=this,{caretSize:r,cornerRadius:a}=i,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:u}=te(a),{x:d,y:f}=t,{width:g,height:m}=e,p,b,y,_,w,x;return o==="center"?(w=f+m/2,n==="left"?(p=d,b=p-r,_=w+r,x=w-r):(p=d+g,b=p+r,_=w-r,x=w+r),y=p):(n==="left"?b=d+Math.max(l,h)+r:n==="right"?b=d+g-Math.max(c,u)-r:b=this.caretX,o==="top"?(_=f,w=_-r,p=b-r,y=b+r):(_=f+m,w=_+r,p=b+r,y=b-r),x=_),{x1:p,x2:b,x3:y,y1:_,y2:w,y3:x}}drawTitle(t,e,i){let n=this.title,o=n.length,r,a,l;if(o){let c=ge(i.rtl,this.x,this.width);for(t.x=pi(this,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",r=X(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=r.string,l=0;ly!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,Ne(t,{x:m,y:g,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=r.backgroundColor,t.beginPath(),Ne(t,{x:p,y:g+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(m,g,c,l),t.strokeRect(m,g,c,l),t.fillStyle=r.backgroundColor,t.fillRect(p,g+1,c-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){let{body:n}=this,{bodySpacing:o,bodyAlign:r,displayColors:a,boxHeight:l,boxWidth:c,boxPadding:h}=i,u=X(i.bodyFont),d=u.lineHeight,f=0,g=ge(i.rtl,this.x,this.width),m=function(M){e.fillText(M,g.x(t.x+f),t.y+d/2),t.y+=d+o},p=g.textAlign(r),b,y,_,w,x,k,S;for(e.textAlign=r,e.textBaseline="middle",e.font=u.string,t.x=pi(this,p,i),e.fillStyle=i.bodyColor,z(this.beforeBody,m),f=a&&p!=="right"?r==="center"?c/2+h:c+2+h:0,w=0,k=n.length;w0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,i=this.$animations,n=i&&i.x,o=i&&i.y;if(n||o){let r=Ms[t.position].call(this,this._active,this._eventPosition);if(!r)return;let a=this._size=fa(this,t),l=Object.assign({},r,this._size),c=ga(e,t,l),h=ma(t,l,c,e);(n._to!==h.x||o._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=a.width,this.height=a.height,this.caretX=r.x,this.caretY=r.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),i=this.opacity;if(!i)return;this._updateAnimationTarget(e);let n={width:this.width,height:this.height},o={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;let r=nt(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(o,t,n,e),Sn(t,e.textDirection),o.y+=r.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),Mn(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let i=this._active,n=t.map(({datasetIndex:a,index:l})=>{let c=this.chart.getDatasetMeta(a);if(!c)throw new Error("Cannot find a dataset at index "+a);return{datasetIndex:a,element:c.data[l],index:l}}),o=!gs(i,n),r=this._positionChanged(n,e);(o||r)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let n=this.options,o=this._active||[],r=this._getActiveElements(t,o,e,i),a=this._positionChanged(r,t),l=e||!gs(r,o)||a;return l&&(this._active=r,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,i,n){let o=this.options;if(t.type==="mouseout")return[];if(!n)return e.filter(a=>this.chart.data.datasets[a.datasetIndex]&&this.chart.getDatasetMeta(a.datasetIndex).controller.getParsed(a.index)!==void 0);let r=this.chart.getElementsAtEventForMode(t,o.mode,o,i);return o.reverse&&r.reverse(),r}_positionChanged(t,e){let{caretX:i,caretY:n,options:o}=this,r=Ms[o.position].call(this,t,e);return r!==!1&&(i!==r.x||n!==r.y)}};v(Ps,"positioners",Ms);var Ef={id:"tooltip",_element:Ps,positioners:Ms,afterInit(s,t,e){e&&(s.tooltip=new Ps({chart:s,options:e}))},beforeUpdate(s,t,e){s.tooltip&&s.tooltip.initialize(e)},reset(s,t,e){s.tooltip&&s.tooltip.initialize(e)},afterDraw(s){let t=s.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(s.notifyPlugins("beforeTooltipDraw",{...e,cancelable:!0})===!1)return;t.draw(s.ctx),s.notifyPlugins("afterTooltipDraw",e)}},afterEvent(s,t){if(s.tooltip){let e=t.replay;s.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(s,t)=>t.bodyFont.size,boxWidth:(s,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Ya},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:s=>s!=="filter"&&s!=="itemSort"&&s!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Lf=Object.freeze({__proto__:null,Colors:Ud,Decimation:Gd,Filler:pf,Legend:kf,SubTitle:Mf,Title:Sf,Tooltip:Ef}),Ff=(s,t,e,i)=>(typeof t=="string"?(e=s.push(t)-1,i.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function Rf(s,t,e,i){let n=s.indexOf(t);if(n===-1)return Ff(s,t,e,i);let o=s.lastIndexOf(t);return n!==o?e:n}var Nf=(s,t)=>s===null?null:K(Math.round(s),0,t);function ya(s){let t=this.getLabels();return s>=0&&se.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};v(Os,"id","category"),v(Os,"defaults",{ticks:{callback:ya}});function zf(s,t){let e=[],{bounds:n,step:o,min:r,max:a,precision:l,count:c,maxTicks:h,maxDigits:u,includeBounds:d}=s,f=o||1,g=h-1,{min:m,max:p}=t,b=!I(r),y=!I(a),_=!I(c),w=(p-m)/(u+1),x=sn((p-m)/g/f)*f,k,S,M,T;if(x<1e-14&&!b&&!y)return[{value:m},{value:p}];T=Math.ceil(p/x)-Math.floor(m/x),T>g&&(x=sn(T*x/g/f)*f),I(l)||(k=Math.pow(10,l),x=Math.ceil(x*k)/k),n==="ticks"?(S=Math.floor(m/x)*x,M=Math.ceil(p/x)*x):(S=m,M=p),b&&y&&o&&or((a-r)/o,x/1e3)?(T=Math.round(Math.min((a-r)/x,h)),x=(a-r)/T,S=r,M=a):_?(S=b?r:S,M=y?a:M,T=c-1,x=(M-S)/T):(T=(M-S)/x,Le(T,Math.round(T),x/1e3)?T=Math.round(T):T=Math.ceil(T));let C=Math.max(on(x),on(S));k=Math.pow(10,I(l)?C:l),S=Math.round(S*k)/k,M=Math.round(M*k)/k;let A=0;for(b&&(d&&S!==r?(e.push({value:r}),Sa)break;e.push({value:L})}return y&&d&&M!==a?e.length&&Le(e[e.length-1].value,a,xa(a,w,s))?e[e.length-1].value=a:e.push({value:a}):(!y||M===a)&&e.push({value:M}),e}function xa(s,t,{horizontal:e,minRotation:i}){let n=bt(i),o=(e?Math.sin(n):Math.cos(n))||.001,r=.75*t*(""+s).length;return Math.min(t/o,r)}var qe=class extends we{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return I(t)||(typeof t=="number"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){let{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds(),{min:n,max:o}=this,r=l=>n=e?n:l,a=l=>o=i?o:l;if(t){let l=St(n),c=St(o);l<0&&c<0?a(0):l>0&&c>0&&r(0)}if(n===o){let l=o===0?1:Math.abs(o*.05);a(o+l),t||r(n-l)}this.min=n,this.max=o}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:i}=t,n;return i?(n=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,i=this.getTickLimit();i=Math.max(2,i);let n={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},o=this._range||this,r=zf(n,o);return t.bounds==="ticks"&&nn(r,this,"value"),t.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let t=this.ticks,e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){let n=(i-e)/Math.max(t.length-1,1)/2;e-=n,i+=n}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Re(t,this.chart.options.locale,this.options.ticks.format)}},Ts=class extends qe{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=Z(t)?t:0,this.max=Z(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,i=bt(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};v(Ts,"id","linear"),v(Ts,"defaults",{ticks:{callback:ms.formatters.numeric}});var Es=s=>Math.floor(Vt(s)),pe=(s,t)=>Math.pow(10,Es(s)+t);function _a(s){return s/Math.pow(10,Es(s))===1}function wa(s,t,e){let i=Math.pow(10,e),n=Math.floor(s/i);return Math.ceil(t/i)-n}function Vf(s,t){let e=t-s,i=Es(e);for(;wa(s,t,i)>10;)i++;for(;wa(s,t,i)<10;)i--;return Math.min(i,Es(s))}function Wf(s,{min:t,max:e}){t=at(s.min,t);let i=[],n=Es(t),o=Vf(t,e),r=o<0?Math.pow(10,Math.abs(o)):1,a=Math.pow(10,o),l=n>o?Math.pow(10,n):0,c=Math.round((t-l)*r)/r,h=Math.floor((t-l)/a/10)*a*10,u=Math.floor((c-h)/Math.pow(10,o)),d=at(s.min,Math.round((l+h+u*Math.pow(10,o))*r)/r);for(;d=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,r=o>=0?1:r),d=Math.round((l+h+u*Math.pow(10,o))*r)/r;let f=at(s.max,d);return i.push({value:f,major:_a(f),significand:u}),i}var Ds=class extends we{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){let i=qe.prototype.parse.apply(this,[t,e]);if(i===0){this._zero=!0;return}return Z(i)&&i>0?i:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=Z(t)?Math.max(0,t):null,this.max=Z(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Z(this._userMin)&&(this.min=t===pe(this.min,0)?pe(this.min,-1):pe(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),i=this.min,n=this.max,o=a=>i=t?i:a,r=a=>n=e?n:a;i===n&&(i<=0?(o(1),r(10)):(o(pe(i,-1)),r(pe(n,1)))),i<=0&&o(pe(n,-1)),n<=0&&r(pe(i,1)),this.min=i,this.max=n}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},i=Wf(e,this);return t.bounds==="ticks"&&nn(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return t===void 0?"0":Re(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=Vt(t),this._valueRange=Vt(this.max)-Vt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(Vt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};v(Ds,"id","logarithmic"),v(Ds,"defaults",{ticks:{callback:ms.formatters.logarithmic,major:{enabled:!0}}});function Qn(s){let t=s.ticks;if(t.display&&s.display){let e=nt(t.backdropPadding);return P(t.font&&t.font.size,j.font.size)+e.height}return 0}function Bf(s,t,e){return e=H(e)?e:[e],{w:gr(s,t.string,e),h:e.length*t.lineHeight}}function ka(s,t,e,i,n){return s===i||s===n?{start:t-e/2,end:t+e/2}:sn?{start:t-e,end:t}:{start:t,end:t+e}}function Hf(s){let t={l:s.left+s._padding.left,r:s.right-s._padding.right,t:s.top+s._padding.top,b:s.bottom-s._padding.bottom},e=Object.assign({},t),i=[],n=[],o=s._pointLabels.length,r=s.options.pointLabels,a=r.centerPointLabels?F/o:0;for(let l=0;lt.r&&(a=(i.end-t.r)/o,s.r=Math.max(s.r,t.r+a)),n.startt.b&&(l=(n.end-t.b)/r,s.b=Math.max(s.b,t.b+l))}function jf(s,t,e){let i=s.drawingArea,{extra:n,additionalAngle:o,padding:r,size:a}=e,l=s.getPointPosition(t,i+n+r,o),c=Math.round(si(st(l.angle+q))),h=Gf(l.y,a.h,c),u=Zf(c),d=qf(l.x,a.w,u);return{visible:!0,x:l.x,y:h,textAlign:u,left:d,top:h,right:d+a.w,bottom:h+a.h}}function Uf(s,t){if(!t)return!0;let{left:e,top:i,right:n,bottom:o}=s;return!(Pt({x:e,y:i},t)||Pt({x:e,y:o},t)||Pt({x:n,y:i},t)||Pt({x:n,y:o},t))}function Yf(s,t,e){let i=[],n=s._pointLabels.length,o=s.options,{centerPointLabels:r,display:a}=o.pointLabels,l={extra:Qn(o)/2,additionalAngle:r?F/n:0},c;for(let h=0;h270||e<90)&&(s-=t),s}function Xf(s,t,e){let{left:i,top:n,right:o,bottom:r}=e,{backdropColor:a}=t;if(!I(a)){let l=te(t.borderRadius),c=nt(t.backdropPadding);s.fillStyle=a;let h=i-c.left,u=n-c.top,d=o-i+c.width,f=r-n+c.height;Object.values(l).some(g=>g!==0)?(s.beginPath(),Ne(s,{x:h,y:u,w:d,h:f,radius:l}),s.fill()):s.fillRect(h,u,d,f)}}function Jf(s,t){let{ctx:e,options:{pointLabels:i}}=s;for(let n=t-1;n>=0;n--){let o=s._pointLabelItems[n];if(!o.visible)continue;let r=i.setContext(s.getPointLabelContext(n));Xf(e,r,o);let a=X(r.font),{x:l,y:c,textAlign:h}=o;Qt(e,s._pointLabels[n],l,c+a.lineHeight/2,a,{color:r.color,textAlign:h,textBaseline:"middle"})}}function Za(s,t,e,i){let{ctx:n}=s;if(e)n.arc(s.xCenter,s.yCenter,t,0,$);else{let o=s.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let r=1;r{let n=W(this.options.pointLabels.callback,[e,i],this);return n||n===0?n:""}).filter((e,i)=>this.chart.getDataVisibility(i))}fit(){let t=this.options;t.display&&t.pointLabels.display?Hf(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,n))}getIndexAngle(t){let e=$/(this._pointLabels.length||1),i=this.options.startAngle||0;return st(t*e+bt(i))}getDistanceFromCenterForValue(t){if(I(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(I(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(u!==0||u===0&&this.min<0){l=this.getDistanceFromCenterForValue(h.value);let d=this.getContext(u),f=n.setContext(d),g=o.setContext(d);Kf(this,f,l,r,g)}}),i.display){for(t.save(),a=r-1;a>=0;a--){let h=i.setContext(this.getPointLabelContext(a)),{color:u,lineWidth:d}=h;!d||!u||(t.lineWidth=d,t.strokeStyle=u,t.setLineDash(h.borderDash),t.lineDashOffset=h.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),c=this.getPointPosition(a,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(c.x,c.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;let n=this.getIndexAngle(0),o,r;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((a,l)=>{if(l===0&&this.min>=0&&!e.reverse)return;let c=i.setContext(this.getContext(l)),h=X(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,r=t.measureText(a.label).width,t.fillStyle=c.backdropColor;let u=nt(c.backdropPadding);t.fillRect(-r/2-u.left,-o-h.size/2-u.top,r+u.width,h.size+u.height)}Qt(t,a.label,0,-o,h,{color:c.color,strokeColor:c.textStrokeColor,strokeWidth:c.textStrokeWidth})}),t.restore()}drawTitle(){}};v(ye,"id","radialLinear"),v(ye,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ms.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),v(ye,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),v(ye,"descriptors",{angleLines:{_fallback:"grid"}});var Ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ct=Object.keys(Ti);function va(s,t){return s-t}function Sa(s,t){if(I(t))return null;let e=s._adapter,{parser:i,round:n,isoWeekday:o}=s._parseOpts,r=t;return typeof i=="function"&&(r=i(r)),Z(r)||(r=typeof i=="string"?e.parse(r,i):e.parse(r)),r===null?null:(n&&(r=n==="week"&&(fe(o)||o===!0)?e.startOf(r,"isoWeek",o):e.startOf(r,n)),+r)}function Ma(s,t,e,i){let n=ct.length;for(let o=ct.indexOf(s);o=ct.indexOf(e);o--){let r=ct[o];if(Ti[r].common&&s._adapter.diff(n,i,r)>=t-1)return r}return ct[e?ct.indexOf(e):0]}function eg(s){for(let t=ct.indexOf(s)+1,e=ct.length;t=t?e[i]:e[n];s[o]=!0}}function sg(s,t,e,i){let n=s._adapter,o=+n.startOf(t[0].value,i),r=t[t.length-1].value,a,l;for(a=o;a<=r;a=+n.add(a,1,i))l=e[a],l>=0&&(t[l].major=!0);return t}function Ta(s,t,e){let i=[],n={},o=t.length,r,a;for(r=0;r+t.value))}initOffsets(t=[]){let e=0,i=0,n,o;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?i=o:i=(o-this.getDecimalForValue(t[t.length-2]))/2);let r=t.length<3?.5:.25;e=K(e,0,r),i=K(i,0,r),this._offsets={start:e,end:i,factor:1/(e+1+i)}}_generate(){let t=this._adapter,e=this.min,i=this.max,n=this.options,o=n.time,r=o.unit||Ma(o.minUnit,e,i,this._getLabelCapacity(e)),a=P(n.ticks.stepSize,1),l=r==="week"?o.isoWeekday:!1,c=fe(l)||l===!0,h={},u=e,d,f;if(c&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,c?"day":r),t.diff(i,e,r)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+r);let g=n.ticks.source==="data"&&this.getDataTimestamps();for(d=u,f=0;d+m)}getLabelForValue(t){let e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){let n=this.options.time.displayFormats,o=this._unit,r=e||n[o];return this._adapter.format(t,r)}_tickFormatFunction(t,e,i,n){let o=this.options,r=o.ticks.callback;if(r)return W(r,[t,e,i],this);let a=o.time.displayFormats,l=this._unit,c=this._majorUnit,h=l&&a[l],u=c&&a[c],d=i[e],f=c&&u&&d&&d.major;return this._adapter.format(t,n||(f?u:h))}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t=this._cache.data||[],e,i;if(t.length)return t;let n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,i=n.length;e=s[i].pos&&t<=s[n].pos&&({lo:i,hi:n}=Ct(s,"pos",t)),{pos:o,time:a}=s[i],{pos:r,time:l}=s[n]):(t>=s[i].time&&t<=s[n].time&&({lo:i,hi:n}=Ct(s,"time",t)),{time:o,pos:a}=s[i],{time:r,pos:l}=s[n]);let c=r-o;return c?a+(l-a)*(t-o)/c:a}var Cs=class extends _e{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=bi(e,this.min),this._tableRange=bi(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:i}=this,n=[],o=[],r,a,l,c,h;for(r=0,a=t.length;r=e&&c<=i&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(r=0,a=n.length;rn-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;let e=this.getDataTimestamps(),i=this.getLabelTimestamps();return e.length&&i.length?t=this.normalize(e.concat(i)):t=e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(bi(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){let e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return bi(this._table,i*this._tableRange+this._minPos,!0)}};v(Cs,"id","timeseries"),v(Cs,"defaults",_e.defaults);var ig=Object.freeze({__proto__:null,CategoryScale:Os,LinearScale:Ts,LogarithmicScale:Ds,RadialLinearScale:ye,TimeScale:_e,TimeSeriesScale:Cs}),qa=[gu,zd,Lf,ig];yt.register(...qa);var Mt=yt;var Yt=class extends Error{},ho=class extends Yt{constructor(t){super(`Invalid DateTime: ${t.toMessage()}`)}},uo=class extends Yt{constructor(t){super(`Invalid Interval: ${t.toMessage()}`)}},fo=class extends Yt{constructor(t){super(`Invalid Duration: ${t.toMessage()}`)}},oe=class extends Yt{},Fi=class extends Yt{constructor(t){super(`Invalid unit ${t}`)}},Q=class extends Yt{},Rt=class extends Yt{constructor(){super("Zone is an abstract class")}},O="numeric",Dt="short",mt="long",Ri={year:O,month:O,day:O},Ml={year:O,month:Dt,day:O},ng={year:O,month:Dt,day:O,weekday:Dt},Ol={year:O,month:mt,day:O},Tl={year:O,month:mt,day:O,weekday:mt},Dl={hour:O,minute:O},Cl={hour:O,minute:O,second:O},Pl={hour:O,minute:O,second:O,timeZoneName:Dt},Al={hour:O,minute:O,second:O,timeZoneName:mt},Il={hour:O,minute:O,hourCycle:"h23"},El={hour:O,minute:O,second:O,hourCycle:"h23"},Ll={hour:O,minute:O,second:O,hourCycle:"h23",timeZoneName:Dt},Fl={hour:O,minute:O,second:O,hourCycle:"h23",timeZoneName:mt},Rl={year:O,month:O,day:O,hour:O,minute:O},Nl={year:O,month:O,day:O,hour:O,minute:O,second:O},zl={year:O,month:Dt,day:O,hour:O,minute:O},Vl={year:O,month:Dt,day:O,hour:O,minute:O,second:O},og={year:O,month:Dt,day:O,weekday:Dt,hour:O,minute:O},Wl={year:O,month:mt,day:O,hour:O,minute:O,timeZoneName:Dt},Bl={year:O,month:mt,day:O,hour:O,minute:O,second:O,timeZoneName:Dt},Hl={year:O,month:mt,day:O,weekday:mt,hour:O,minute:O,timeZoneName:mt},$l={year:O,month:mt,day:O,weekday:mt,hour:O,minute:O,second:O,timeZoneName:mt},Me=class{get type(){throw new Rt}get name(){throw new Rt}get ianaName(){return this.name}get isUniversal(){throw new Rt}offsetName(t,e){throw new Rt}formatOffset(t,e){throw new Rt}offset(t){throw new Rt}equals(t){throw new Rt}get isValid(){throw new Rt}},eo=null,Ni=class s extends Me{static get instance(){return eo===null&&(eo=new s),eo}get type(){return"system"}get name(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(t,{format:e,locale:i}){return tc(t,e,i)}formatOffset(t,e){return Vs(this.offset(t),e)}offset(t){return-new Date(t).getTimezoneOffset()}equals(t){return t.type==="system"}get isValid(){return!0}},go=new Map;function rg(s){let t=go.get(s);return t===void 0&&(t=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:s,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),go.set(s,t)),t}var ag={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function lg(s,t){let e=s.format(t).replace(/\u200E/g,""),i=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(e),[,n,o,r,a,l,c,h]=i;return[r,n,o,a,l,c,h]}function cg(s,t){let e=s.formatToParts(t),i=[];for(let n=0;n=0?g:1e3+g,(d-f)/(60*1e3)}equals(t){return t.type==="iana"&&t.name===this.name}get isValid(){return this.valid}},Ga={};function hg(s,t={}){let e=JSON.stringify([s,t]),i=Ga[e];return i||(i=new Intl.ListFormat(s,t),Ga[e]=i),i}var mo=new Map;function po(s,t={}){let e=JSON.stringify([s,t]),i=mo.get(e);return i===void 0&&(i=new Intl.DateTimeFormat(s,t),mo.set(e,i)),i}var bo=new Map;function ug(s,t={}){let e=JSON.stringify([s,t]),i=bo.get(e);return i===void 0&&(i=new Intl.NumberFormat(s,t),bo.set(e,i)),i}var yo=new Map;function dg(s,t={}){let{base:e,...i}=t,n=JSON.stringify([s,i]),o=yo.get(n);return o===void 0&&(o=new Intl.RelativeTimeFormat(s,t),yo.set(n,o)),o}var Rs=null;function fg(){return Rs||(Rs=new Intl.DateTimeFormat().resolvedOptions().locale,Rs)}var xo=new Map;function jl(s){let t=xo.get(s);return t===void 0&&(t=new Intl.DateTimeFormat(s).resolvedOptions(),xo.set(s,t)),t}var _o=new Map;function gg(s){let t=_o.get(s);if(!t){let e=new Intl.Locale(s);t="getWeekInfo"in e?e.getWeekInfo():e.weekInfo,"minimalDays"in t||(t={...Ul,...t}),_o.set(s,t)}return t}function mg(s){let t=s.indexOf("-x-");t!==-1&&(s=s.substring(0,t));let e=s.indexOf("-u-");if(e===-1)return[s];{let i,n;try{i=po(s).resolvedOptions(),n=s}catch{let l=s.substring(0,e);i=po(l).resolvedOptions(),n=l}let{numberingSystem:o,calendar:r}=i;return[n,o,r]}}function pg(s,t,e){return(e||t)&&(s.includes("-u-")||(s+="-u"),e&&(s+=`-ca-${e}`),t&&(s+=`-nu-${t}`)),s}function bg(s){let t=[];for(let e=1;e<=12;e++){let i=R.utc(2009,e,1);t.push(s(i))}return t}function yg(s){let t=[];for(let e=1;e<=7;e++){let i=R.utc(2016,11,13+e);t.push(s(i))}return t}function Di(s,t,e,i){let n=s.listingMode();return n==="error"?null:n==="en"?e(t):i(t)}function xg(s){return s.numberingSystem&&s.numberingSystem!=="latn"?!1:s.numberingSystem==="latn"||!s.locale||s.locale.startsWith("en")||jl(s.locale).numberingSystem==="latn"}var wo=class{constructor(t,e,i){this.padTo=i.padTo||0,this.floor=i.floor||!1;let{padTo:n,floor:o,...r}=i;if(!e||Object.keys(r).length>0){let a={useGrouping:!1,...i};i.padTo>0&&(a.minimumIntegerDigits=i.padTo),this.inf=ug(t,a)}}format(t){if(this.inf){let e=this.floor?Math.floor(t):t;return this.inf.format(e)}else{let e=this.floor?Math.floor(t):Eo(t,3);return J(e,this.padTo)}}},ko=class{constructor(t,e,i){this.opts=i,this.originalZone=void 0;let n;if(this.opts.timeZone)this.dt=t;else if(t.zone.type==="fixed"){let r=-1*(t.offset/60),a=r>=0?`Etc/GMT+${r}`:`Etc/GMT${r}`;t.offset!==0&&ae.create(a).valid?(n=a,this.dt=t):(n="UTC",this.dt=t.offset===0?t:t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone)}else t.zone.type==="system"?this.dt=t:t.zone.type==="iana"?(this.dt=t,n=t.zone.name):(n="UTC",this.dt=t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone);let o={...this.opts};o.timeZone=o.timeZone||n,this.dtf=po(e,o)}format(){return this.originalZone?this.formatToParts().map(({value:t})=>t).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){let t=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?t.map(e=>{if(e.type==="timeZoneName"){let i=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...e,value:i}}else return e}):t}resolvedOptions(){return this.dtf.resolvedOptions()}},vo=class{constructor(t,e,i){this.opts={style:"long",...i},!e&&Kl()&&(this.rtf=dg(t,i))}format(t,e){return this.rtf?this.rtf.format(t,e):Wg(e,t,this.opts.numeric,this.opts.style!=="long")}formatToParts(t,e){return this.rtf?this.rtf.formatToParts(t,e):[]}},Ul={firstDay:1,minimalDays:4,weekend:[6,7]},B=class s{static fromOpts(t){return s.create(t.locale,t.numberingSystem,t.outputCalendar,t.weekSettings,t.defaultToEN)}static create(t,e,i,n,o=!1){let r=t||Y.defaultLocale,a=r||(o?"en-US":fg()),l=e||Y.defaultNumberingSystem,c=i||Y.defaultOutputCalendar,h=Oo(n)||Y.defaultWeekSettings;return new s(a,l,c,h,r)}static resetCache(){Rs=null,mo.clear(),bo.clear(),yo.clear(),xo.clear(),_o.clear()}static fromObject({locale:t,numberingSystem:e,outputCalendar:i,weekSettings:n}={}){return s.create(t,e,i,n)}constructor(t,e,i,n,o){let[r,a,l]=mg(t);this.locale=r,this.numberingSystem=e||a||null,this.outputCalendar=i||l||null,this.weekSettings=n,this.intl=pg(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=o,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached==null&&(this.fastNumbersCached=xg(this)),this.fastNumbersCached}listingMode(){let t=this.isEnglish(),e=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return t&&e?"en":"intl"}clone(t){return!t||Object.getOwnPropertyNames(t).length===0?this:s.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,Oo(t.weekSettings)||this.weekSettings,t.defaultToEN||!1)}redefaultToEN(t={}){return this.clone({...t,defaultToEN:!0})}redefaultToSystem(t={}){return this.clone({...t,defaultToEN:!1})}months(t,e=!1){return Di(this,t,ic,()=>{let i=this.intl==="ja"||this.intl.startsWith("ja-");e&=!i;let n=e?{month:t,day:"numeric"}:{month:t},o=e?"format":"standalone";if(!this.monthsCache[o][t]){let r=i?a=>this.dtFormatter(a,n).format():a=>this.extract(a,n,"month");this.monthsCache[o][t]=bg(r)}return this.monthsCache[o][t]})}weekdays(t,e=!1){return Di(this,t,rc,()=>{let i=e?{weekday:t,year:"numeric",month:"long",day:"numeric"}:{weekday:t},n=e?"format":"standalone";return this.weekdaysCache[n][t]||(this.weekdaysCache[n][t]=yg(o=>this.extract(o,i,"weekday"))),this.weekdaysCache[n][t]})}meridiems(){return Di(this,void 0,()=>ac,()=>{if(!this.meridiemCache){let t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[R.utc(2016,11,13,9),R.utc(2016,11,13,19)].map(e=>this.extract(e,t,"dayperiod"))}return this.meridiemCache})}eras(t){return Di(this,t,lc,()=>{let e={era:t};return this.eraCache[t]||(this.eraCache[t]=[R.utc(-40,1,1),R.utc(2017,1,1)].map(i=>this.extract(i,e,"era"))),this.eraCache[t]})}extract(t,e,i){let n=this.dtFormatter(t,e),o=n.formatToParts(),r=o.find(a=>a.type.toLowerCase()===i);return r?r.value:null}numberFormatter(t={}){return new wo(this.intl,t.forceSimple||this.fastNumbers,t)}dtFormatter(t,e={}){return new ko(t,this.intl,e)}relFormatter(t={}){return new vo(this.intl,this.isEnglish(),t)}listFormatter(t={}){return hg(this.intl,t)}isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||jl(this.intl).locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:Ql()?gg(this.locale):Ul}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(t){return this.locale===t.locale&&this.numberingSystem===t.numberingSystem&&this.outputCalendar===t.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}},io=null,kt=class s extends Me{static get utcInstance(){return io===null&&(io=new s(0)),io}static instance(t){return t===0?s.utcInstance:new s(t)}static parseSpecifier(t){if(t){let e=t.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(e)return new s(ji(e[1],e[2]))}return null}constructor(t){super(),this.fixed=t}get type(){return"fixed"}get name(){return this.fixed===0?"UTC":`UTC${Vs(this.fixed,"narrow")}`}get ianaName(){return this.fixed===0?"Etc/UTC":`Etc/GMT${Vs(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(t,e){return Vs(this.fixed,e)}get isUniversal(){return!0}offset(){return this.fixed}equals(t){return t.type==="fixed"&&t.fixed===this.fixed}get isValid(){return!0}},So=class extends Me{constructor(t){super(),this.zoneName=t}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}};function ne(s,t){if(D(s)||s===null)return t;if(s instanceof Me)return s;if(Mg(s)){let e=s.toLowerCase();return e==="default"?t:e==="local"||e==="system"?Ni.instance:e==="utc"||e==="gmt"?kt.utcInstance:kt.parseSpecifier(e)||ae.create(s)}else return re(s)?kt.instance(s):typeof s=="object"&&"offset"in s&&typeof s.offset=="function"?s:new So(s)}var Co={arab:"[\u0660-\u0669]",arabext:"[\u06F0-\u06F9]",bali:"[\u1B50-\u1B59]",beng:"[\u09E6-\u09EF]",deva:"[\u0966-\u096F]",fullwide:"[\uFF10-\uFF19]",gujr:"[\u0AE6-\u0AEF]",hanidec:"[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]",khmr:"[\u17E0-\u17E9]",knda:"[\u0CE6-\u0CEF]",laoo:"[\u0ED0-\u0ED9]",limb:"[\u1946-\u194F]",mlym:"[\u0D66-\u0D6F]",mong:"[\u1810-\u1819]",mymr:"[\u1040-\u1049]",orya:"[\u0B66-\u0B6F]",tamldec:"[\u0BE6-\u0BEF]",telu:"[\u0C66-\u0C6F]",thai:"[\u0E50-\u0E59]",tibt:"[\u0F20-\u0F29]",latn:"\\d"},Xa={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},_g=Co.hanidec.replace(/[\[|\]]/g,"").split("");function wg(s){let t=parseInt(s,10);if(isNaN(t)){t="";for(let e=0;e=o&&i<=r&&(t+=i-o)}}return parseInt(t,10)}else return t}var Mo=new Map;function kg(){Mo.clear()}function Ot({numberingSystem:s},t=""){let e=s||"latn",i=Mo.get(e);i===void 0&&(i=new Map,Mo.set(e,i));let n=i.get(t);return n===void 0&&(n=new RegExp(`${Co[e]}${t}`),i.set(t,n)),n}var Ja=()=>Date.now(),Ka="system",Qa=null,tl=null,el=null,sl=60,il,nl=null,Y=class{static get now(){return Ja}static set now(t){Ja=t}static set defaultZone(t){Ka=t}static get defaultZone(){return ne(Ka,Ni.instance)}static get defaultLocale(){return Qa}static set defaultLocale(t){Qa=t}static get defaultNumberingSystem(){return tl}static set defaultNumberingSystem(t){tl=t}static get defaultOutputCalendar(){return el}static set defaultOutputCalendar(t){el=t}static get defaultWeekSettings(){return nl}static set defaultWeekSettings(t){nl=Oo(t)}static get twoDigitCutoffYear(){return sl}static set twoDigitCutoffYear(t){sl=t%100}static get throwOnInvalid(){return il}static set throwOnInvalid(t){il=t}static resetCaches(){B.resetCache(),ae.resetCache(),R.resetCache(),kg()}},gt=class{constructor(t,e){this.reason=t,this.explanation=e}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}},Yl=[0,31,59,90,120,151,181,212,243,273,304,334],Zl=[0,31,60,91,121,152,182,213,244,274,305,335];function _t(s,t){return new gt("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${s}, which is invalid`)}function Po(s,t,e){let i=new Date(Date.UTC(s,t-1,e));s<100&&s>=0&&i.setUTCFullYear(i.getUTCFullYear()-1900);let n=i.getUTCDay();return n===0?7:n}function ql(s,t,e){return e+(Bs(s)?Zl:Yl)[t-1]}function Gl(s,t){let e=Bs(s)?Zl:Yl,i=e.findIndex(o=>oWs(i,t,e)?(c=i+1,l=1):c=i,{weekYear:c,weekNumber:l,weekday:a,...Ui(s)}}function ol(s,t=4,e=1){let{weekYear:i,weekNumber:n,weekday:o}=s,r=Ao(Po(i,1,t),e),a=Qe(i),l=n*7+o-r-7+t,c;l<1?(c=i-1,l+=Qe(c)):l>a?(c=i+1,l-=Qe(i)):c=i;let{month:h,day:u}=Gl(c,l);return{year:c,month:h,day:u,...Ui(s)}}function no(s){let{year:t,month:e,day:i}=s,n=ql(t,e,i);return{year:t,ordinal:n,...Ui(s)}}function rl(s){let{year:t,ordinal:e}=s,{month:i,day:n}=Gl(t,e);return{year:t,month:i,day:n,...Ui(s)}}function al(s,t){if(!D(s.localWeekday)||!D(s.localWeekNumber)||!D(s.localWeekYear)){if(!D(s.weekday)||!D(s.weekNumber)||!D(s.weekYear))throw new oe("Cannot mix locale-based week fields with ISO-based week fields");return D(s.localWeekday)||(s.weekday=s.localWeekday),D(s.localWeekNumber)||(s.weekNumber=s.localWeekNumber),D(s.localWeekYear)||(s.weekYear=s.localWeekYear),delete s.localWeekday,delete s.localWeekNumber,delete s.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function vg(s,t=4,e=1){let i=Hi(s.weekYear),n=wt(s.weekNumber,1,Ws(s.weekYear,t,e)),o=wt(s.weekday,1,7);return i?n?o?!1:_t("weekday",s.weekday):_t("week",s.weekNumber):_t("weekYear",s.weekYear)}function Sg(s){let t=Hi(s.year),e=wt(s.ordinal,1,Qe(s.year));return t?e?!1:_t("ordinal",s.ordinal):_t("year",s.year)}function Xl(s){let t=Hi(s.year),e=wt(s.month,1,12),i=wt(s.day,1,Vi(s.year,s.month));return t?e?i?!1:_t("day",s.day):_t("month",s.month):_t("year",s.year)}function Jl(s){let{hour:t,minute:e,second:i,millisecond:n}=s,o=wt(t,0,23)||t===24&&e===0&&i===0&&n===0,r=wt(e,0,59),a=wt(i,0,59),l=wt(n,0,999);return o?r?a?l?!1:_t("millisecond",n):_t("second",i):_t("minute",e):_t("hour",t)}function D(s){return typeof s>"u"}function re(s){return typeof s=="number"}function Hi(s){return typeof s=="number"&&s%1===0}function Mg(s){return typeof s=="string"}function Og(s){return Object.prototype.toString.call(s)==="[object Date]"}function Kl(){try{return typeof Intl<"u"&&!!Intl.RelativeTimeFormat}catch{return!1}}function Ql(){try{return typeof Intl<"u"&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch{return!1}}function Tg(s){return Array.isArray(s)?s:[s]}function ll(s,t,e){if(s.length!==0)return s.reduce((i,n)=>{let o=[t(n),n];return i&&e(i[0],o[0])===i[0]?i:o},null)[1]}function Dg(s,t){return t.reduce((e,i)=>(e[i]=s[i],e),{})}function ss(s,t){return Object.prototype.hasOwnProperty.call(s,t)}function Oo(s){if(s==null)return null;if(typeof s!="object")throw new Q("Week settings must be an object");if(!wt(s.firstDay,1,7)||!wt(s.minimalDays,1,7)||!Array.isArray(s.weekend)||s.weekend.some(t=>!wt(t,1,7)))throw new Q("Invalid week settings");return{firstDay:s.firstDay,minimalDays:s.minimalDays,weekend:Array.from(s.weekend)}}function wt(s,t,e){return Hi(s)&&s>=t&&s<=e}function Cg(s,t){return s-t*Math.floor(s/t)}function J(s,t=2){let e=s<0,i;return e?i="-"+(""+-s).padStart(t,"0"):i=(""+s).padStart(t,"0"),i}function ie(s){if(!(D(s)||s===null||s===""))return parseInt(s,10)}function ke(s){if(!(D(s)||s===null||s===""))return parseFloat(s)}function Io(s){if(!(D(s)||s===null||s==="")){let t=parseFloat("0."+s)*1e3;return Math.floor(t)}}function Eo(s,t,e="round"){let i=10**t;switch(e){case"expand":return s>0?Math.ceil(s*i)/i:Math.floor(s*i)/i;case"trunc":return Math.trunc(s*i)/i;case"round":return Math.round(s*i)/i;case"floor":return Math.floor(s*i)/i;case"ceil":return Math.ceil(s*i)/i;default:throw new RangeError(`Value rounding ${e} is out of range`)}}function Bs(s){return s%4===0&&(s%100!==0||s%400===0)}function Qe(s){return Bs(s)?366:365}function Vi(s,t){let e=Cg(t-1,12)+1,i=s+(t-e)/12;return e===2?Bs(i)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][e-1]}function $i(s){let t=Date.UTC(s.year,s.month-1,s.day,s.hour,s.minute,s.second,s.millisecond);return s.year<100&&s.year>=0&&(t=new Date(t),t.setUTCFullYear(s.year,s.month-1,s.day)),+t}function cl(s,t,e){return-Ao(Po(s,1,t),e)+t-1}function Ws(s,t=4,e=1){let i=cl(s,t,e),n=cl(s+1,t,e);return(Qe(s)-i+n)/7}function To(s){return s>99?s:s>Y.twoDigitCutoffYear?1900+s:2e3+s}function tc(s,t,e,i=null){let n=new Date(s),o={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};i&&(o.timeZone=i);let r={timeZoneName:t,...o},a=new Intl.DateTimeFormat(e,r).formatToParts(n).find(l=>l.type.toLowerCase()==="timezonename");return a?a.value:null}function ji(s,t){let e=parseInt(s,10);Number.isNaN(e)&&(e=0);let i=parseInt(t,10)||0,n=e<0||Object.is(e,-0)?-i:i;return e*60+n}function ec(s){let t=Number(s);if(typeof s=="boolean"||s===""||!Number.isFinite(t))throw new Q(`Invalid unit value ${s}`);return t}function Wi(s,t){let e={};for(let i in s)if(ss(s,i)){let n=s[i];if(n==null)continue;e[t(i)]=ec(n)}return e}function Vs(s,t){let e=Math.trunc(Math.abs(s/60)),i=Math.trunc(Math.abs(s%60)),n=s>=0?"+":"-";switch(t){case"short":return`${n}${J(e,2)}:${J(i,2)}`;case"narrow":return`${n}${e}${i>0?`:${i}`:""}`;case"techie":return`${n}${J(e,2)}${J(i,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function Ui(s){return Dg(s,["hour","minute","second","millisecond"])}var Pg=["January","February","March","April","May","June","July","August","September","October","November","December"],sc=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Ag=["J","F","M","A","M","J","J","A","S","O","N","D"];function ic(s){switch(s){case"narrow":return[...Ag];case"short":return[...sc];case"long":return[...Pg];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}var nc=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],oc=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],Ig=["M","T","W","T","F","S","S"];function rc(s){switch(s){case"narrow":return[...Ig];case"short":return[...oc];case"long":return[...nc];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}var ac=["AM","PM"],Eg=["Before Christ","Anno Domini"],Lg=["BC","AD"],Fg=["B","A"];function lc(s){switch(s){case"narrow":return[...Fg];case"short":return[...Lg];case"long":return[...Eg];default:return null}}function Rg(s){return ac[s.hour<12?0:1]}function Ng(s,t){return rc(t)[s.weekday-1]}function zg(s,t){return ic(t)[s.month-1]}function Vg(s,t){return lc(t)[s.year<0?0:1]}function Wg(s,t,e="always",i=!1){let n={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},o=["hours","minutes","seconds"].indexOf(s)===-1;if(e==="auto"&&o){let u=s==="days";switch(t){case 1:return u?"tomorrow":`next ${n[s][0]}`;case-1:return u?"yesterday":`last ${n[s][0]}`;case 0:return u?"today":`this ${n[s][0]}`}}let r=Object.is(t,-0)||t<0,a=Math.abs(t),l=a===1,c=n[s],h=i?l?c[1]:c[2]||c[1]:l?n[s][0]:s;return r?`${a} ${h} ago`:`in ${a} ${h}`}function hl(s,t){let e="";for(let i of s)i.literal?e+=i.val:e+=t(i.val);return e}var Bg={D:Ri,DD:Ml,DDD:Ol,DDDD:Tl,t:Dl,tt:Cl,ttt:Pl,tttt:Al,T:Il,TT:El,TTT:Ll,TTTT:Fl,f:Rl,ff:zl,fff:Wl,ffff:Hl,F:Nl,FF:Vl,FFF:Bl,FFFF:$l},ft=class s{static create(t,e={}){return new s(t,e)}static parseFormat(t){let e=null,i="",n=!1,o=[];for(let r=0;r0||n)&&o.push({literal:n||/^\s+$/.test(i),val:i===""?"'":i}),e=null,i="",n=!n):n||a===e?i+=a:(i.length>0&&o.push({literal:/^\s+$/.test(i),val:i}),i=a,e=a)}return i.length>0&&o.push({literal:n||/^\s+$/.test(i),val:i}),o}static macroTokenToFormatOpts(t){return Bg[t]}constructor(t,e){this.opts=e,this.loc=t,this.systemLoc=null}formatWithSystemDefault(t,e){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(t,{...this.opts,...e}).format()}dtFormatter(t,e={}){return this.loc.dtFormatter(t,{...this.opts,...e})}formatDateTime(t,e){return this.dtFormatter(t,e).format()}formatDateTimeParts(t,e){return this.dtFormatter(t,e).formatToParts()}formatInterval(t,e){return this.dtFormatter(t.start,e).dtf.formatRange(t.start.toJSDate(),t.end.toJSDate())}resolvedOptions(t,e){return this.dtFormatter(t,e).resolvedOptions()}num(t,e=0,i=void 0){if(this.opts.forceSimple)return J(t,e);let n={...this.opts};return e>0&&(n.padTo=e),i&&(n.signDisplay=i),this.loc.numberFormatter(n).format(t)}formatDateTimeFromString(t,e){let i=this.loc.listingMode()==="en",n=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",o=(f,g)=>this.loc.extract(t,f,g),r=f=>t.isOffsetFixed&&t.offset===0&&f.allowZ?"Z":t.isValid?t.zone.formatOffset(t.ts,f.format):"",a=()=>i?Rg(t):o({hour:"numeric",hourCycle:"h12"},"dayperiod"),l=(f,g)=>i?zg(t,f):o(g?{month:f}:{month:f,day:"numeric"},"month"),c=(f,g)=>i?Ng(t,f):o(g?{weekday:f}:{weekday:f,month:"long",day:"numeric"},"weekday"),h=f=>{let g=s.macroTokenToFormatOpts(f);return g?this.formatWithSystemDefault(t,g):f},u=f=>i?Vg(t,f):o({era:f},"era"),d=f=>{switch(f){case"S":return this.num(t.millisecond);case"u":case"SSS":return this.num(t.millisecond,3);case"s":return this.num(t.second);case"ss":return this.num(t.second,2);case"uu":return this.num(Math.floor(t.millisecond/10),2);case"uuu":return this.num(Math.floor(t.millisecond/100));case"m":return this.num(t.minute);case"mm":return this.num(t.minute,2);case"h":return this.num(t.hour%12===0?12:t.hour%12);case"hh":return this.num(t.hour%12===0?12:t.hour%12,2);case"H":return this.num(t.hour);case"HH":return this.num(t.hour,2);case"Z":return r({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return r({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return r({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return t.zone.offsetName(t.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return t.zone.offsetName(t.ts,{format:"long",locale:this.loc.locale});case"z":return t.zoneName;case"a":return a();case"d":return n?o({day:"numeric"},"day"):this.num(t.day);case"dd":return n?o({day:"2-digit"},"day"):this.num(t.day,2);case"c":return this.num(t.weekday);case"ccc":return c("short",!0);case"cccc":return c("long",!0);case"ccccc":return c("narrow",!0);case"E":return this.num(t.weekday);case"EEE":return c("short",!1);case"EEEE":return c("long",!1);case"EEEEE":return c("narrow",!1);case"L":return n?o({month:"numeric",day:"numeric"},"month"):this.num(t.month);case"LL":return n?o({month:"2-digit",day:"numeric"},"month"):this.num(t.month,2);case"LLL":return l("short",!0);case"LLLL":return l("long",!0);case"LLLLL":return l("narrow",!0);case"M":return n?o({month:"numeric"},"month"):this.num(t.month);case"MM":return n?o({month:"2-digit"},"month"):this.num(t.month,2);case"MMM":return l("short",!1);case"MMMM":return l("long",!1);case"MMMMM":return l("narrow",!1);case"y":return n?o({year:"numeric"},"year"):this.num(t.year);case"yy":return n?o({year:"2-digit"},"year"):this.num(t.year.toString().slice(-2),2);case"yyyy":return n?o({year:"numeric"},"year"):this.num(t.year,4);case"yyyyyy":return n?o({year:"numeric"},"year"):this.num(t.year,6);case"G":return u("short");case"GG":return u("long");case"GGGGG":return u("narrow");case"kk":return this.num(t.weekYear.toString().slice(-2),2);case"kkkk":return this.num(t.weekYear,4);case"W":return this.num(t.weekNumber);case"WW":return this.num(t.weekNumber,2);case"n":return this.num(t.localWeekNumber);case"nn":return this.num(t.localWeekNumber,2);case"ii":return this.num(t.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(t.localWeekYear,4);case"o":return this.num(t.ordinal);case"ooo":return this.num(t.ordinal,3);case"q":return this.num(t.quarter);case"qq":return this.num(t.quarter,2);case"X":return this.num(Math.floor(t.ts/1e3));case"x":return this.num(t.ts);default:return h(f)}};return hl(s.parseFormat(e),d)}formatDurationFromString(t,e){let i=this.opts.signMode==="negativeLargestOnly"?-1:1,n=h=>{switch(h[0]){case"S":return"milliseconds";case"s":return"seconds";case"m":return"minutes";case"h":return"hours";case"d":return"days";case"w":return"weeks";case"M":return"months";case"y":return"years";default:return null}},o=(h,u)=>d=>{let f=n(d);if(f){let g=u.isNegativeDuration&&f!==u.largestUnit?i:1,m;return this.opts.signMode==="negativeLargestOnly"&&f!==u.largestUnit?m="never":this.opts.signMode==="all"?m="always":m="auto",this.num(h.get(f)*g,d.length,m)}else return d},r=s.parseFormat(e),a=r.reduce((h,{literal:u,val:d})=>u?h:h.concat(d),[]),l=t.shiftTo(...a.map(n).filter(h=>h)),c={isNegativeDuration:l<0,largestUnit:Object.keys(l.values)[0]};return hl(r,o(l,c))}},cc=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function is(...s){let t=s.reduce((e,i)=>e+i.source,"");return RegExp(`^${t}$`)}function ns(...s){return t=>s.reduce(([e,i,n],o)=>{let[r,a,l]=o(t,n);return[{...e,...r},a||i,l]},[{},null,1]).slice(0,2)}function os(s,...t){if(s==null)return[null,null];for(let[e,i]of t){let n=e.exec(s);if(n)return i(n)}return[null,null]}function hc(...s){return(t,e)=>{let i={},n;for(n=0;nf!==void 0&&(g||f&&h)?-f:f;return[{years:d(ke(e)),months:d(ke(i)),weeks:d(ke(n)),days:d(ke(o)),hours:d(ke(r)),minutes:d(ke(a)),seconds:d(ke(l),l==="-0"),milliseconds:d(Io(c),u)}]}var tm={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Ro(s,t,e,i,n,o,r){let a={year:t.length===2?To(ie(t)):ie(t),month:sc.indexOf(e)+1,day:ie(i),hour:ie(n),minute:ie(o)};return r&&(a.second=ie(r)),s&&(a.weekday=s.length>3?nc.indexOf(s)+1:oc.indexOf(s)+1),a}var em=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function sm(s){let[,t,e,i,n,o,r,a,l,c,h,u]=s,d=Ro(t,n,i,e,o,r,a),f;return l?f=tm[l]:c?f=0:f=ji(h,u),[d,new kt(f)]}function im(s){return s.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}var nm=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,om=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,rm=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function ul(s){let[,t,e,i,n,o,r,a]=s;return[Ro(t,n,i,e,o,r,a),kt.utcInstance]}function am(s){let[,t,e,i,n,o,r,a]=s;return[Ro(t,a,e,i,n,o,r),kt.utcInstance]}var lm=is($g,Fo),cm=is(jg,Fo),hm=is(Ug,Fo),um=is(dc),gc=ns(Xg,rs,Hs,$s),dm=ns(Yg,rs,Hs,$s),fm=ns(Zg,rs,Hs,$s),gm=ns(rs,Hs,$s);function mm(s){return os(s,[lm,gc],[cm,dm],[hm,fm],[um,gm])}function pm(s){return os(im(s),[em,sm])}function bm(s){return os(s,[nm,ul],[om,ul],[rm,am])}function ym(s){return os(s,[Kg,Qg])}var xm=ns(rs);function _m(s){return os(s,[Jg,xm])}var wm=is(qg,Gg),km=is(fc),vm=ns(rs,Hs,$s);function Sm(s){return os(s,[wm,gc],[km,vm])}var dl="Invalid Duration",mc={weeks:{days:7,hours:168,minutes:10080,seconds:10080*60,milliseconds:10080*60*1e3},days:{hours:24,minutes:1440,seconds:1440*60,milliseconds:1440*60*1e3},hours:{minutes:60,seconds:3600,milliseconds:3600*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},Mm={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:2184,minutes:2184*60,seconds:2184*60*60,milliseconds:2184*60*60*1e3},months:{weeks:4,days:30,hours:720,minutes:720*60,seconds:720*60*60,milliseconds:720*60*60*1e3},...mc},xt=146097/400,Ge=146097/4800,Om={years:{quarters:4,months:12,weeks:xt/7,days:xt,hours:xt*24,minutes:xt*24*60,seconds:xt*24*60*60,milliseconds:xt*24*60*60*1e3},quarters:{months:3,weeks:xt/28,days:xt/4,hours:xt*24/4,minutes:xt*24*60/4,seconds:xt*24*60*60/4,milliseconds:xt*24*60*60*1e3/4},months:{weeks:Ge/7,days:Ge,hours:Ge*24,minutes:Ge*24*60,seconds:Ge*24*60*60,milliseconds:Ge*24*60*60*1e3},...mc},Se=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],Tm=Se.slice(0).reverse();function Ut(s,t,e=!1){let i={values:e?t.values:{...s.values,...t.values||{}},loc:s.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||s.conversionAccuracy,matrix:t.matrix||s.matrix};return new tt(i)}function pc(s,t){let e=t.milliseconds??0;for(let i of Tm.slice(1))t[i]&&(e+=t[i]*s[i].milliseconds);return e}function fl(s,t){let e=pc(s,t)<0?-1:1;Se.reduceRight((i,n)=>{if(D(t[n]))return i;if(i){let o=t[i]*e,r=s[n][i],a=Math.floor(o/r);t[n]+=a*e,t[i]-=a*r*e}return n},null),Se.reduce((i,n)=>{if(D(t[n]))return i;if(i){let o=t[i]%1;t[i]-=o,t[n]+=o*s[i][n]}return n},null)}function gl(s){let t={};for(let[e,i]of Object.entries(s))i!==0&&(t[e]=i);return t}var tt=class s{constructor(t){let e=t.conversionAccuracy==="longterm"||!1,i=e?Om:Mm;t.matrix&&(i=t.matrix),this.values=t.values,this.loc=t.loc||B.create(),this.conversionAccuracy=e?"longterm":"casual",this.invalid=t.invalid||null,this.matrix=i,this.isLuxonDuration=!0}static fromMillis(t,e){return s.fromObject({milliseconds:t},e)}static fromObject(t,e={}){if(t==null||typeof t!="object")throw new Q(`Duration.fromObject: argument expected to be an object, got ${t===null?"null":typeof t}`);return new s({values:Wi(t,s.normalizeUnit),loc:B.fromObject(e),conversionAccuracy:e.conversionAccuracy,matrix:e.matrix})}static fromDurationLike(t){if(re(t))return s.fromMillis(t);if(s.isDuration(t))return t;if(typeof t=="object")return s.fromObject(t);throw new Q(`Unknown duration argument ${t} of type ${typeof t}`)}static fromISO(t,e){let[i]=ym(t);return i?s.fromObject(i,e):s.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static fromISOTime(t,e){let[i]=_m(t);return i?s.fromObject(i,e):s.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static invalid(t,e=null){if(!t)throw new Q("need to specify a reason the Duration is invalid");let i=t instanceof gt?t:new gt(t,e);if(Y.throwOnInvalid)throw new fo(i);return new s({invalid:i})}static normalizeUnit(t){let e={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[t&&t.toLowerCase()];if(!e)throw new Fi(t);return e}static isDuration(t){return t&&t.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(t,e={}){let i={...e,floor:e.round!==!1&&e.floor!==!1};return this.isValid?ft.create(this.loc,i).formatDurationFromString(this,t):dl}toHuman(t={}){if(!this.isValid)return dl;let e=t.showZeros!==!1,i=Se.map(n=>{let o=this.values[n];return D(o)||o===0&&!e?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...t,unit:n.slice(0,-1)}).format(o)}).filter(n=>n);return this.loc.listFormatter({type:"conjunction",style:t.listStyle||"narrow",...t}).format(i)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let t="P";return this.years!==0&&(t+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(t+=this.months+this.quarters*3+"M"),this.weeks!==0&&(t+=this.weeks+"W"),this.days!==0&&(t+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(t+="T"),this.hours!==0&&(t+=this.hours+"H"),this.minutes!==0&&(t+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(t+=Eo(this.seconds+this.milliseconds/1e3,3)+"S"),t==="P"&&(t+="T0S"),t}toISOTime(t={}){if(!this.isValid)return null;let e=this.toMillis();return e<0||e>=864e5?null:(t={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...t,includeOffset:!1},R.fromMillis(e,{zone:"UTC"}).toISOTime(t))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?pc(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(t){if(!this.isValid)return this;let e=s.fromDurationLike(t),i={};for(let n of Se)(ss(e.values,n)||ss(this.values,n))&&(i[n]=e.get(n)+this.get(n));return Ut(this,{values:i},!0)}minus(t){if(!this.isValid)return this;let e=s.fromDurationLike(t);return this.plus(e.negate())}mapUnits(t){if(!this.isValid)return this;let e={};for(let i of Object.keys(this.values))e[i]=ec(t(this.values[i],i));return Ut(this,{values:e},!0)}get(t){return this[s.normalizeUnit(t)]}set(t){if(!this.isValid)return this;let e={...this.values,...Wi(t,s.normalizeUnit)};return Ut(this,{values:e})}reconfigure({locale:t,numberingSystem:e,conversionAccuracy:i,matrix:n}={}){let r={loc:this.loc.clone({locale:t,numberingSystem:e}),matrix:n,conversionAccuracy:i};return Ut(this,r)}as(t){return this.isValid?this.shiftTo(t).get(t):NaN}normalize(){if(!this.isValid)return this;let t=this.toObject();return fl(this.matrix,t),Ut(this,{values:t},!0)}rescale(){if(!this.isValid)return this;let t=gl(this.normalize().shiftToAll().toObject());return Ut(this,{values:t},!0)}shiftTo(...t){if(!this.isValid)return this;if(t.length===0)return this;t=t.map(r=>s.normalizeUnit(r));let e={},i={},n=this.toObject(),o;for(let r of Se)if(t.indexOf(r)>=0){o=r;let a=0;for(let c in i)a+=this.matrix[c][r]*i[c],i[c]=0;re(n[r])&&(a+=n[r]);let l=Math.trunc(a);e[r]=l,i[r]=(a*1e3-l*1e3)/1e3}else re(n[r])&&(i[r]=n[r]);for(let r in i)i[r]!==0&&(e[o]+=r===o?i[r]:i[r]/this.matrix[o][r]);return fl(this.matrix,e),Ut(this,{values:e},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;let t={};for(let e of Object.keys(this.values))t[e]=this.values[e]===0?0:-this.values[e];return Ut(this,{values:t},!0)}removeZeros(){if(!this.isValid)return this;let t=gl(this.values);return Ut(this,{values:t},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(t){if(!this.isValid||!t.isValid||!this.loc.equals(t.loc))return!1;function e(i,n){return i===void 0||i===0?n===void 0||n===0:i===n}for(let i of Se)if(!e(this.values[i],t.values[i]))return!1;return!0}},Xe="Invalid Interval";function Dm(s,t){return!s||!s.isValid?es.invalid("missing or invalid start"):!t||!t.isValid?es.invalid("missing or invalid end"):tt:!1}isBefore(t){return this.isValid?this.e<=t:!1}contains(t){return this.isValid?this.s<=t&&this.e>t:!1}set({start:t,end:e}={}){return this.isValid?s.fromDateTimes(t||this.s,e||this.e):this}splitAt(...t){if(!this.isValid)return[];let e=t.map(Fs).filter(r=>this.contains(r)).sort((r,a)=>r.toMillis()-a.toMillis()),i=[],{s:n}=this,o=0;for(;n+this.e?this.e:r;i.push(s.fromDateTimes(n,a)),n=a,o+=1}return i}splitBy(t){let e=tt.fromDurationLike(t);if(!this.isValid||!e.isValid||e.as("milliseconds")===0)return[];let{s:i}=this,n=1,o,r=[];for(;il*n));o=+a>+this.e?this.e:a,r.push(s.fromDateTimes(i,o)),i=o,n+=1}return r}divideEqually(t){return this.isValid?this.splitBy(this.length()/t).slice(0,t):[]}overlaps(t){return this.e>t.s&&this.s=t.e:!1}equals(t){return!this.isValid||!t.isValid?!1:this.s.equals(t.s)&&this.e.equals(t.e)}intersection(t){if(!this.isValid)return this;let e=this.s>t.s?this.s:t.s,i=this.e=i?null:s.fromDateTimes(e,i)}union(t){if(!this.isValid)return this;let e=this.st.e?this.e:t.e;return s.fromDateTimes(e,i)}static merge(t){let[e,i]=t.sort((n,o)=>n.s-o.s).reduce(([n,o],r)=>o?o.overlaps(r)||o.abutsStart(r)?[n,o.union(r)]:[n.concat([o]),r]:[n,r],[[],null]);return i&&e.push(i),e}static xor(t){let e=null,i=0,n=[],o=t.map(l=>[{time:l.s,type:"s"},{time:l.e,type:"e"}]),r=Array.prototype.concat(...o),a=r.sort((l,c)=>l.time-c.time);for(let l of a)i+=l.type==="s"?1:-1,i===1?e=l.time:(e&&+e!=+l.time&&n.push(s.fromDateTimes(e,l.time)),e=null);return s.merge(n)}difference(...t){return s.xor([this].concat(t)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} \u2013 ${this.e.toISO()})`:Xe}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(t=Ri,e={}){return this.isValid?ft.create(this.s.loc.clone(e),t).formatInterval(this):Xe}toISO(t){return this.isValid?`${this.s.toISO(t)}/${this.e.toISO(t)}`:Xe}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:Xe}toISOTime(t){return this.isValid?`${this.s.toISOTime(t)}/${this.e.toISOTime(t)}`:Xe}toFormat(t,{separator:e=" \u2013 "}={}){return this.isValid?`${this.s.toFormat(t)}${e}${this.e.toFormat(t)}`:Xe}toDuration(t,e){return this.isValid?this.e.diff(this.s,t,e):tt.invalid(this.invalidReason)}mapEndpoints(t){return s.fromDateTimes(t(this.s),t(this.e))}},Ke=class{static hasDST(t=Y.defaultZone){let e=R.now().setZone(t).set({month:12});return!t.isUniversal&&e.offset!==e.set({month:6}).offset}static isValidIANAZone(t){return ae.isValidZone(t)}static normalizeZone(t){return ne(t,Y.defaultZone)}static getStartOfWeek({locale:t=null,locObj:e=null}={}){return(e||B.create(t)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:t=null,locObj:e=null}={}){return(e||B.create(t)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:t=null,locObj:e=null}={}){return(e||B.create(t)).getWeekendDays().slice()}static months(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null,outputCalendar:o="gregory"}={}){return(n||B.create(e,i,o)).months(t)}static monthsFormat(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null,outputCalendar:o="gregory"}={}){return(n||B.create(e,i,o)).months(t,!0)}static weekdays(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null}={}){return(n||B.create(e,i,null)).weekdays(t)}static weekdaysFormat(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null}={}){return(n||B.create(e,i,null)).weekdays(t,!0)}static meridiems({locale:t=null}={}){return B.create(t).meridiems()}static eras(t="short",{locale:e=null}={}){return B.create(e,null,"gregory").eras(t)}static features(){return{relative:Kl(),localeWeek:Ql()}}};function ml(s,t){let e=n=>n.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),i=e(t)-e(s);return Math.floor(tt.fromMillis(i).as("days"))}function Cm(s,t,e){let i=[["years",(l,c)=>c.year-l.year],["quarters",(l,c)=>c.quarter-l.quarter+(c.year-l.year)*4],["months",(l,c)=>c.month-l.month+(c.year-l.year)*12],["weeks",(l,c)=>{let h=ml(l,c);return(h-h%7)/7}],["days",ml]],n={},o=s,r,a;for(let[l,c]of i)e.indexOf(l)>=0&&(r=l,n[l]=c(s,t),a=o.plus(n),a>t?(n[l]--,s=o.plus(n),s>t&&(a=s,n[l]--,s=o.plus(n))):s=a);return[s,n,a,r]}function Pm(s,t,e,i){let[n,o,r,a]=Cm(s,t,e),l=t-n,c=e.filter(u=>["hours","minutes","seconds","milliseconds"].indexOf(u)>=0);c.length===0&&(r0?tt.fromMillis(l,i).shiftTo(...c).plus(h):h}var Am="missing Intl.DateTimeFormat.formatToParts support";function N(s,t=e=>e){return{regex:s,deser:([e])=>t(wg(e))}}var Im="\xA0",bc=`[ ${Im}]`,yc=new RegExp(bc,"g");function Em(s){return s.replace(/\./g,"\\.?").replace(yc,bc)}function pl(s){return s.replace(/\./g,"").replace(yc," ").toLowerCase()}function Tt(s,t){return s===null?null:{regex:RegExp(s.map(Em).join("|")),deser:([e])=>s.findIndex(i=>pl(e)===pl(i))+t}}function bl(s,t){return{regex:s,deser:([,e,i])=>ji(e,i),groups:t}}function Ci(s){return{regex:s,deser:([t])=>t}}function Lm(s){return s.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function Fm(s,t){let e=Ot(t),i=Ot(t,"{2}"),n=Ot(t,"{3}"),o=Ot(t,"{4}"),r=Ot(t,"{6}"),a=Ot(t,"{1,2}"),l=Ot(t,"{1,3}"),c=Ot(t,"{1,6}"),h=Ot(t,"{1,9}"),u=Ot(t,"{2,4}"),d=Ot(t,"{4,6}"),f=p=>({regex:RegExp(Lm(p.val)),deser:([b])=>b,literal:!0}),m=(p=>{if(s.literal)return f(p);switch(p.val){case"G":return Tt(t.eras("short"),0);case"GG":return Tt(t.eras("long"),0);case"y":return N(c);case"yy":return N(u,To);case"yyyy":return N(o);case"yyyyy":return N(d);case"yyyyyy":return N(r);case"M":return N(a);case"MM":return N(i);case"MMM":return Tt(t.months("short",!0),1);case"MMMM":return Tt(t.months("long",!0),1);case"L":return N(a);case"LL":return N(i);case"LLL":return Tt(t.months("short",!1),1);case"LLLL":return Tt(t.months("long",!1),1);case"d":return N(a);case"dd":return N(i);case"o":return N(l);case"ooo":return N(n);case"HH":return N(i);case"H":return N(a);case"hh":return N(i);case"h":return N(a);case"mm":return N(i);case"m":return N(a);case"q":return N(a);case"qq":return N(i);case"s":return N(a);case"ss":return N(i);case"S":return N(l);case"SSS":return N(n);case"u":return Ci(h);case"uu":return Ci(a);case"uuu":return N(e);case"a":return Tt(t.meridiems(),0);case"kkkk":return N(o);case"kk":return N(u,To);case"W":return N(a);case"WW":return N(i);case"E":case"c":return N(e);case"EEE":return Tt(t.weekdays("short",!1),1);case"EEEE":return Tt(t.weekdays("long",!1),1);case"ccc":return Tt(t.weekdays("short",!0),1);case"cccc":return Tt(t.weekdays("long",!0),1);case"Z":case"ZZ":return bl(new RegExp(`([+-]${a.source})(?::(${i.source}))?`),2);case"ZZZ":return bl(new RegExp(`([+-]${a.source})(${i.source})?`),2);case"z":return Ci(/[a-z_+-/]{1,256}?/i);case" ":return Ci(/[^\S\n\r]/);default:return f(p)}})(s)||{invalidReason:Am};return m.token=s,m}var Rm={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};function Nm(s,t,e){let{type:i,value:n}=s;if(i==="literal"){let l=/^\s+$/.test(n);return{literal:!l,val:l?" ":n}}let o=t[i],r=i;i==="hour"&&(t.hour12!=null?r=t.hour12?"hour12":"hour24":t.hourCycle!=null?t.hourCycle==="h11"||t.hourCycle==="h12"?r="hour12":r="hour24":r=e.hour12?"hour12":"hour24");let a=Rm[r];if(typeof a=="object"&&(a=a[o]),a)return{literal:!1,val:a}}function zm(s){return[`^${s.map(e=>e.regex).reduce((e,i)=>`${e}(${i.source})`,"")}$`,s]}function Vm(s,t,e){let i=s.match(t);if(i){let n={},o=1;for(let r in e)if(ss(e,r)){let a=e[r],l=a.groups?a.groups+1:1;!a.literal&&a.token&&(n[a.token.val[0]]=a.deser(i.slice(o,o+l))),o+=l}return[i,n]}else return[i,{}]}function Wm(s){let t=o=>{switch(o){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}},e=null,i;return D(s.z)||(e=ae.create(s.z)),D(s.Z)||(e||(e=new kt(s.Z)),i=s.Z),D(s.q)||(s.M=(s.q-1)*3+1),D(s.h)||(s.h<12&&s.a===1?s.h+=12:s.h===12&&s.a===0&&(s.h=0)),s.G===0&&s.y&&(s.y=-s.y),D(s.u)||(s.S=Io(s.u)),[Object.keys(s).reduce((o,r)=>{let a=t(r);return a&&(o[a]=s[r]),o},{}),e,i]}var oo=null;function Bm(){return oo||(oo=R.fromMillis(1555555555555)),oo}function Hm(s,t){if(s.literal)return s;let e=ft.macroTokenToFormatOpts(s.val),i=wc(e,t);return i==null||i.includes(void 0)?s:i}function xc(s,t){return Array.prototype.concat(...s.map(e=>Hm(e,t)))}var Bi=class{constructor(t,e){if(this.locale=t,this.format=e,this.tokens=xc(ft.parseFormat(e),t),this.units=this.tokens.map(i=>Fm(i,t)),this.disqualifyingUnit=this.units.find(i=>i.invalidReason),!this.disqualifyingUnit){let[i,n]=zm(this.units);this.regex=RegExp(i,"i"),this.handlers=n}}explainFromTokens(t){if(this.isValid){let[e,i]=Vm(t,this.regex,this.handlers),[n,o,r]=i?Wm(i):[null,null,void 0];if(ss(i,"a")&&ss(i,"H"))throw new oe("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:this.tokens,regex:this.regex,rawMatches:e,matches:i,result:n,zone:o,specificOffset:r}}else return{input:t,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}};function _c(s,t,e){return new Bi(s,e).explainFromTokens(t)}function $m(s,t,e){let{result:i,zone:n,specificOffset:o,invalidReason:r}=_c(s,t,e);return[i,n,o,r]}function wc(s,t){if(!s)return null;let i=ft.create(t,s).dtFormatter(Bm()),n=i.formatToParts(),o=i.resolvedOptions();return n.map(r=>Nm(r,s,o))}var ro="Invalid DateTime",yl=864e13;function Ns(s){return new gt("unsupported zone",`the zone "${s.name}" is not supported`)}function ao(s){return s.weekData===null&&(s.weekData=zi(s.c)),s.weekData}function lo(s){return s.localWeekData===null&&(s.localWeekData=zi(s.c,s.loc.getMinDaysInFirstWeek(),s.loc.getStartOfWeek())),s.localWeekData}function ve(s,t){let e={ts:s.ts,zone:s.zone,c:s.c,o:s.o,loc:s.loc,invalid:s.invalid};return new R({...e,...t,old:e})}function kc(s,t,e){let i=s-t*60*1e3,n=e.offset(i);if(t===n)return[i,t];i-=(n-t)*60*1e3;let o=e.offset(i);return n===o?[i,n]:[s-Math.min(n,o)*60*1e3,Math.max(n,o)]}function Pi(s,t){s+=t*60*1e3;let e=new Date(s);return{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate(),hour:e.getUTCHours(),minute:e.getUTCMinutes(),second:e.getUTCSeconds(),millisecond:e.getUTCMilliseconds()}}function Ii(s,t,e){return kc($i(s),t,e)}function xl(s,t){let e=s.o,i=s.c.year+Math.trunc(t.years),n=s.c.month+Math.trunc(t.months)+Math.trunc(t.quarters)*3,o={...s.c,year:i,month:n,day:Math.min(s.c.day,Vi(i,n))+Math.trunc(t.days)+Math.trunc(t.weeks)*7},r=tt.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),a=$i(o),[l,c]=kc(a,e,s.zone);return r!==0&&(l+=r,c=s.zone.offset(l)),{ts:l,o:c}}function Je(s,t,e,i,n,o){let{setZone:r,zone:a}=e;if(s&&Object.keys(s).length!==0||t){let l=t||a,c=R.fromObject(s,{...e,zone:l,specificOffset:o});return r?c:c.setZone(a)}else return R.invalid(new gt("unparsable",`the input "${n}" can't be parsed as ${i}`))}function Ai(s,t,e=!0){return s.isValid?ft.create(B.create("en-US"),{allowZ:e,forceSimple:!0}).formatDateTimeFromString(s,t):null}function co(s,t,e){let i=s.c.year>9999||s.c.year<0,n="";if(i&&s.c.year>=0&&(n+="+"),n+=J(s.c.year,i?6:4),e==="year")return n;if(t){if(n+="-",n+=J(s.c.month),e==="month")return n;n+="-"}else if(n+=J(s.c.month),e==="month")return n;return n+=J(s.c.day),n}function _l(s,t,e,i,n,o,r){let a=!e||s.c.millisecond!==0||s.c.second!==0,l="";switch(r){case"day":case"month":case"year":break;default:if(l+=J(s.c.hour),r==="hour")break;if(t){if(l+=":",l+=J(s.c.minute),r==="minute")break;a&&(l+=":",l+=J(s.c.second))}else{if(l+=J(s.c.minute),r==="minute")break;a&&(l+=J(s.c.second))}if(r==="second")break;a&&(!i||s.c.millisecond!==0)&&(l+=".",l+=J(s.c.millisecond,3))}return n&&(s.isOffsetFixed&&s.offset===0&&!o?l+="Z":s.o<0?(l+="-",l+=J(Math.trunc(-s.o/60)),l+=":",l+=J(Math.trunc(-s.o%60))):(l+="+",l+=J(Math.trunc(s.o/60)),l+=":",l+=J(Math.trunc(s.o%60)))),o&&(l+="["+s.zone.ianaName+"]"),l}var vc={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},jm={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},Um={ordinal:1,hour:0,minute:0,second:0,millisecond:0},Ei=["year","month","day","hour","minute","second","millisecond"],Ym=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],Zm=["year","ordinal","hour","minute","second","millisecond"];function Li(s){let t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[s.toLowerCase()];if(!t)throw new Fi(s);return t}function wl(s){switch(s.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return Li(s)}}function qm(s){if(zs===void 0&&(zs=Y.now()),s.type!=="iana")return s.offset(zs);let t=s.name,e=Do.get(t);return e===void 0&&(e=s.offset(zs),Do.set(t,e)),e}function kl(s,t){let e=ne(t.zone,Y.defaultZone);if(!e.isValid)return R.invalid(Ns(e));let i=B.fromObject(t),n,o;if(D(s.year))n=Y.now();else{for(let l of Ei)D(s[l])&&(s[l]=vc[l]);let r=Xl(s)||Jl(s);if(r)return R.invalid(r);let a=qm(e);[n,o]=Ii(s,a,e)}return new R({ts:n,zone:e,loc:i,o})}function vl(s,t,e){let i=D(e.round)?!0:e.round,n=D(e.rounding)?"trunc":e.rounding,o=(a,l)=>(a=Eo(a,i||e.calendary?0:2,e.calendary?"round":n),t.loc.clone(e).relFormatter(e).format(a,l)),r=a=>e.calendary?t.hasSame(s,a)?0:t.startOf(a).diff(s.startOf(a),a).get(a):t.diff(s,a).get(a);if(e.unit)return o(r(e.unit),e.unit);for(let a of e.units){let l=r(a);if(Math.abs(l)>=1)return o(l,a)}return o(s>t?-0:0,e.units[e.units.length-1])}function Sl(s){let t={},e;return s.length>0&&typeof s[s.length-1]=="object"?(t=s[s.length-1],e=Array.from(s).slice(0,s.length-1)):e=Array.from(s),[t,e]}var zs,Do=new Map,R=class s{constructor(t){let e=t.zone||Y.defaultZone,i=t.invalid||(Number.isNaN(t.ts)?new gt("invalid input"):null)||(e.isValid?null:Ns(e));this.ts=D(t.ts)?Y.now():t.ts;let n=null,o=null;if(!i)if(t.old&&t.old.ts===this.ts&&t.old.zone.equals(e))[n,o]=[t.old.c,t.old.o];else{let a=re(t.o)&&!t.old?t.o:e.offset(this.ts);n=Pi(this.ts,a),i=Number.isNaN(n.year)?new gt("invalid input"):null,n=i?null:n,o=i?null:a}this._zone=e,this.loc=t.loc||B.create(),this.invalid=i,this.weekData=null,this.localWeekData=null,this.c=n,this.o=o,this.isLuxonDateTime=!0}static now(){return new s({})}static local(){let[t,e]=Sl(arguments),[i,n,o,r,a,l,c]=e;return kl({year:i,month:n,day:o,hour:r,minute:a,second:l,millisecond:c},t)}static utc(){let[t,e]=Sl(arguments),[i,n,o,r,a,l,c]=e;return t.zone=kt.utcInstance,kl({year:i,month:n,day:o,hour:r,minute:a,second:l,millisecond:c},t)}static fromJSDate(t,e={}){let i=Og(t)?t.valueOf():NaN;if(Number.isNaN(i))return s.invalid("invalid input");let n=ne(e.zone,Y.defaultZone);return n.isValid?new s({ts:i,zone:n,loc:B.fromObject(e)}):s.invalid(Ns(n))}static fromMillis(t,e={}){if(re(t))return t<-yl||t>yl?s.invalid("Timestamp out of range"):new s({ts:t,zone:ne(e.zone,Y.defaultZone),loc:B.fromObject(e)});throw new Q(`fromMillis requires a numerical input, but received a ${typeof t} with value ${t}`)}static fromSeconds(t,e={}){if(re(t))return new s({ts:t*1e3,zone:ne(e.zone,Y.defaultZone),loc:B.fromObject(e)});throw new Q("fromSeconds requires a numerical input")}static fromObject(t,e={}){t=t||{};let i=ne(e.zone,Y.defaultZone);if(!i.isValid)return s.invalid(Ns(i));let n=B.fromObject(e),o=Wi(t,wl),{minDaysInFirstWeek:r,startOfWeek:a}=al(o,n),l=Y.now(),c=D(e.specificOffset)?i.offset(l):e.specificOffset,h=!D(o.ordinal),u=!D(o.year),d=!D(o.month)||!D(o.day),f=u||d,g=o.weekYear||o.weekNumber;if((f||h)&&g)throw new oe("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(d&&h)throw new oe("Can't mix ordinal dates with month/day");let m=g||o.weekday&&!f,p,b,y=Pi(l,c);m?(p=Ym,b=jm,y=zi(y,r,a)):h?(p=Zm,b=Um,y=no(y)):(p=Ei,b=vc);let _=!1;for(let C of p){let A=o[C];D(A)?_?o[C]=b[C]:o[C]=y[C]:_=!0}let w=m?vg(o,r,a):h?Sg(o):Xl(o),x=w||Jl(o);if(x)return s.invalid(x);let k=m?ol(o,r,a):h?rl(o):o,[S,M]=Ii(k,c,i),T=new s({ts:S,zone:i,o:M,loc:n});return o.weekday&&f&&t.weekday!==T.weekday?s.invalid("mismatched weekday",`you can't specify both a weekday of ${o.weekday} and a date of ${T.toISO()}`):T.isValid?T:s.invalid(T.invalid)}static fromISO(t,e={}){let[i,n]=mm(t);return Je(i,n,e,"ISO 8601",t)}static fromRFC2822(t,e={}){let[i,n]=pm(t);return Je(i,n,e,"RFC 2822",t)}static fromHTTP(t,e={}){let[i,n]=bm(t);return Je(i,n,e,"HTTP",e)}static fromFormat(t,e,i={}){if(D(t)||D(e))throw new Q("fromFormat requires an input string and a format");let{locale:n=null,numberingSystem:o=null}=i,r=B.fromOpts({locale:n,numberingSystem:o,defaultToEN:!0}),[a,l,c,h]=$m(r,t,e);return h?s.invalid(h):Je(a,l,i,`format ${e}`,t,c)}static fromString(t,e,i={}){return s.fromFormat(t,e,i)}static fromSQL(t,e={}){let[i,n]=Sm(t);return Je(i,n,e,"SQL",t)}static invalid(t,e=null){if(!t)throw new Q("need to specify a reason the DateTime is invalid");let i=t instanceof gt?t:new gt(t,e);if(Y.throwOnInvalid)throw new ho(i);return new s({invalid:i})}static isDateTime(t){return t&&t.isLuxonDateTime||!1}static parseFormatForOpts(t,e={}){let i=wc(t,B.fromObject(e));return i?i.map(n=>n?n.val:null).join(""):null}static expandFormat(t,e={}){return xc(ft.parseFormat(t),B.fromObject(e)).map(n=>n.val).join("")}static resetCache(){zs=void 0,Do.clear()}get(t){return this[t]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?ao(this).weekYear:NaN}get weekNumber(){return this.isValid?ao(this).weekNumber:NaN}get weekday(){return this.isValid?ao(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?lo(this).weekday:NaN}get localWeekNumber(){return this.isValid?lo(this).weekNumber:NaN}get localWeekYear(){return this.isValid?lo(this).weekYear:NaN}get ordinal(){return this.isValid?no(this.c).ordinal:NaN}get monthShort(){return this.isValid?Ke.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Ke.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Ke.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Ke.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];let t=864e5,e=6e4,i=$i(this.c),n=this.zone.offset(i-t),o=this.zone.offset(i+t),r=this.zone.offset(i-n*e),a=this.zone.offset(i-o*e);if(r===a)return[this];let l=i-r*e,c=i-a*e,h=Pi(l,r),u=Pi(c,a);return h.hour===u.hour&&h.minute===u.minute&&h.second===u.second&&h.millisecond===u.millisecond?[ve(this,{ts:l}),ve(this,{ts:c})]:[this]}get isInLeapYear(){return Bs(this.year)}get daysInMonth(){return Vi(this.year,this.month)}get daysInYear(){return this.isValid?Qe(this.year):NaN}get weeksInWeekYear(){return this.isValid?Ws(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?Ws(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(t={}){let{locale:e,numberingSystem:i,calendar:n}=ft.create(this.loc.clone(t),t).resolvedOptions(this);return{locale:e,numberingSystem:i,outputCalendar:n}}toUTC(t=0,e={}){return this.setZone(kt.instance(t),e)}toLocal(){return this.setZone(Y.defaultZone)}setZone(t,{keepLocalTime:e=!1,keepCalendarTime:i=!1}={}){if(t=ne(t,Y.defaultZone),t.equals(this.zone))return this;if(t.isValid){let n=this.ts;if(e||i){let o=t.offset(this.ts),r=this.toObject();[n]=Ii(r,o,t)}return ve(this,{ts:n,zone:t})}else return s.invalid(Ns(t))}reconfigure({locale:t,numberingSystem:e,outputCalendar:i}={}){let n=this.loc.clone({locale:t,numberingSystem:e,outputCalendar:i});return ve(this,{loc:n})}setLocale(t){return this.reconfigure({locale:t})}set(t){if(!this.isValid)return this;let e=Wi(t,wl),{minDaysInFirstWeek:i,startOfWeek:n}=al(e,this.loc),o=!D(e.weekYear)||!D(e.weekNumber)||!D(e.weekday),r=!D(e.ordinal),a=!D(e.year),l=!D(e.month)||!D(e.day),c=a||l,h=e.weekYear||e.weekNumber;if((c||r)&&h)throw new oe("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(l&&r)throw new oe("Can't mix ordinal dates with month/day");let u;o?u=ol({...zi(this.c,i,n),...e},i,n):D(e.ordinal)?(u={...this.toObject(),...e},D(e.day)&&(u.day=Math.min(Vi(u.year,u.month),u.day))):u=rl({...no(this.c),...e});let[d,f]=Ii(u,this.o,this.zone);return ve(this,{ts:d,o:f})}plus(t){if(!this.isValid)return this;let e=tt.fromDurationLike(t);return ve(this,xl(this,e))}minus(t){if(!this.isValid)return this;let e=tt.fromDurationLike(t).negate();return ve(this,xl(this,e))}startOf(t,{useLocaleWeeks:e=!1}={}){if(!this.isValid)return this;let i={},n=tt.normalizeUnit(t);switch(n){case"years":i.month=1;case"quarters":case"months":i.day=1;case"weeks":case"days":i.hour=0;case"hours":i.minute=0;case"minutes":i.second=0;case"seconds":i.millisecond=0;break}if(n==="weeks")if(e){let o=this.loc.getStartOfWeek(),{weekday:r}=this;r=3&&(l+="T"),l+=_l(this,a,e,i,n,o,r),l}toISODate({format:t="extended",precision:e="day"}={}){return this.isValid?co(this,t==="extended",Li(e)):null}toISOWeekDate(){return Ai(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:t=!1,suppressSeconds:e=!1,includeOffset:i=!0,includePrefix:n=!1,extendedZone:o=!1,format:r="extended",precision:a="milliseconds"}={}){return this.isValid?(a=Li(a),(n&&Ei.indexOf(a)>=3?"T":"")+_l(this,r==="extended",e,t,i,o,a)):null}toRFC2822(){return Ai(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return Ai(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?co(this,!0):null}toSQLTime({includeOffset:t=!0,includeZone:e=!1,includeOffsetSpace:i=!0}={}){let n="HH:mm:ss.SSS";return(e||t)&&(i&&(n+=" "),e?n+="z":t&&(n+="ZZ")),Ai(this,n,!0)}toSQL(t={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(t)}`:null}toString(){return this.isValid?this.toISO():ro}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(t={}){if(!this.isValid)return{};let e={...this.c};return t.includeConfig&&(e.outputCalendar=this.outputCalendar,e.numberingSystem=this.loc.numberingSystem,e.locale=this.loc.locale),e}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(t,e="milliseconds",i={}){if(!this.isValid||!t.isValid)return tt.invalid("created by diffing an invalid DateTime");let n={locale:this.locale,numberingSystem:this.numberingSystem,...i},o=Tg(e).map(tt.normalizeUnit),r=t.valueOf()>this.valueOf(),a=r?this:t,l=r?t:this,c=Pm(a,l,o,n);return r?c.negate():c}diffNow(t="milliseconds",e={}){return this.diff(s.now(),t,e)}until(t){return this.isValid?es.fromDateTimes(this,t):this}hasSame(t,e,i){if(!this.isValid)return!1;let n=t.valueOf(),o=this.setZone(t.zone,{keepLocalTime:!0});return o.startOf(e,i)<=n&&n<=o.endOf(e,i)}equals(t){return this.isValid&&t.isValid&&this.valueOf()===t.valueOf()&&this.zone.equals(t.zone)&&this.loc.equals(t.loc)}toRelative(t={}){if(!this.isValid)return null;let e=t.base||s.fromObject({},{zone:this.zone}),i=t.padding?thise.valueOf(),Math.min)}static max(...t){if(!t.every(s.isDateTime))throw new Q("max requires all arguments be DateTimes");return ll(t,e=>e.valueOf(),Math.max)}static fromFormatExplain(t,e,i={}){let{locale:n=null,numberingSystem:o=null}=i,r=B.fromOpts({locale:n,numberingSystem:o,defaultToEN:!0});return _c(r,t,e)}static fromStringExplain(t,e,i={}){return s.fromFormatExplain(t,e,i)}static buildFormatParser(t,e={}){let{locale:i=null,numberingSystem:n=null}=e,o=B.fromOpts({locale:i,numberingSystem:n,defaultToEN:!0});return new Bi(o,t)}static fromFormatParser(t,e,i={}){if(D(t)||D(e))throw new Q("fromFormatParser requires an input string and a format parser");let{locale:n=null,numberingSystem:o=null}=i,r=B.fromOpts({locale:n,numberingSystem:o,defaultToEN:!0});if(!r.equals(e.locale))throw new Q(`fromFormatParser called with a locale of ${r}, but the format parser was created for ${e.locale}`);let{result:a,zone:l,specificOffset:c,invalidReason:h}=e.explainFromTokens(t);return h?s.invalid(h):Je(a,l,i,`format ${e.format}`,t,c)}static get DATE_SHORT(){return Ri}static get DATE_MED(){return Ml}static get DATE_MED_WITH_WEEKDAY(){return ng}static get DATE_FULL(){return Ol}static get DATE_HUGE(){return Tl}static get TIME_SIMPLE(){return Dl}static get TIME_WITH_SECONDS(){return Cl}static get TIME_WITH_SHORT_OFFSET(){return Pl}static get TIME_WITH_LONG_OFFSET(){return Al}static get TIME_24_SIMPLE(){return Il}static get TIME_24_WITH_SECONDS(){return El}static get TIME_24_WITH_SHORT_OFFSET(){return Ll}static get TIME_24_WITH_LONG_OFFSET(){return Fl}static get DATETIME_SHORT(){return Rl}static get DATETIME_SHORT_WITH_SECONDS(){return Nl}static get DATETIME_MED(){return zl}static get DATETIME_MED_WITH_SECONDS(){return Vl}static get DATETIME_MED_WITH_WEEKDAY(){return og}static get DATETIME_FULL(){return Wl}static get DATETIME_FULL_WITH_SECONDS(){return Bl}static get DATETIME_HUGE(){return Hl}static get DATETIME_HUGE_WITH_SECONDS(){return $l}};function Fs(s){if(R.isDateTime(s))return s;if(s&&s.valueOf&&re(s.valueOf()))return R.fromJSDate(s);if(s&&typeof s=="object")return R.fromObject(s);throw new Q(`Unknown datetime argument: ${s}, of type ${typeof s}`)}var Gm={datetime:R.DATETIME_MED_WITH_SECONDS,millisecond:"h:mm:ss.SSS a",second:R.TIME_WITH_SECONDS,minute:R.TIME_SIMPLE,hour:{hour:"numeric"},day:{day:"numeric",month:"short"},week:"DD",month:{month:"short",year:"numeric"},quarter:"'Q'q - yyyy",year:{year:"numeric"}};to._date.override({_id:"luxon",_create:function(s){return R.fromMillis(s,this.options)},init(s){this.options.locale||(this.options.locale=s.locale)},formats:function(){return Gm},parse:function(s,t){let e=this.options,i=typeof s;return s===null||i==="undefined"?null:(i==="number"?s=this._create(s):i==="string"?typeof t=="string"?s=R.fromFormat(s,t,e):s=R.fromISO(s,e):s instanceof Date?s=R.fromJSDate(s,e):i==="object"&&!(s instanceof R)&&(s=R.fromObject(s,e)),s.isValid?s.valueOf():null)},format:function(s,t){let e=this._create(s);return typeof t=="string"?e.toFormat(t):e.toLocaleString(t)},add:function(s,t,e){let i={};return i[e]=t,this._create(s).plus(i).valueOf()},diff:function(s,t,e){return this._create(s).diff(this._create(t)).as(e).valueOf()},startOf:function(s,t,e){if(t==="isoWeek"){e=Math.trunc(Math.min(Math.max(0,e),6));let i=this._create(s);return i.minus({days:(i.weekday-e+7)%7}).startOf("day").valueOf()}return t?this._create(s).startOf(t).valueOf():s},endOf:function(s,t){return this._create(s).endOf(t).valueOf()}});window.filamentChartJsGlobalPlugins&&Array.isArray(window.filamentChartJsGlobalPlugins)&&window.filamentChartJsGlobalPlugins.length>0&&Mt.register(...window.filamentChartJsGlobalPlugins);function Xm({cachedData:s,maxHeight:t,options:e,type:i}){return{userPointBackgroundColor:e?.pointBackgroundColor,userXGridColor:e?.scales?.x?.grid?.color,userYGridColor:e?.scales?.y?.grid?.color,userRadialGridColor:e?.scales?.r?.grid?.color,userRadialTicksColor:e?.scales?.r?.ticks?.color,init(){this.initChart(),this.$wire.$on("updateChartData",({data:n})=>{let o=this.getChart();o&&(s=n,o.data=n,o.update("resize"))}),Alpine.effect(()=>{Alpine.store("theme"),this.$nextTick(()=>{let n=this.getChart();n&&(n.destroy(),this.initChart())})}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Alpine.store("theme")==="system"&&this.$nextTick(()=>{let n=this.getChart();n&&(n.destroy(),this.initChart())})}),this.resizeHandler=Alpine.debounce(()=>{let n=this.getChart();n&&(n.destroy(),this.initChart())},250),window.addEventListener("resize",this.resizeHandler),this.resizeObserver=new ResizeObserver(()=>this.resizeHandler()),this.resizeObserver.observe(this.$el)},initChart(n=null){var a,l,c,h,u,d,f,g,m,p,b,y,_,w,x,k;if(!this.$refs.canvas||!this.$refs.backgroundColorElement||!this.$refs.borderColorElement||!this.$refs.textColorElement||!this.$refs.gridColorElement)return;Mt.defaults.animation.duration=0,Mt.defaults.backgroundColor=getComputedStyle(this.$refs.backgroundColorElement).color;let o=getComputedStyle(this.$refs.borderColorElement).color;Mt.defaults.borderColor=o,Mt.defaults.color=getComputedStyle(this.$refs.textColorElement).color,Mt.defaults.font.family=getComputedStyle(this.$el).fontFamily,Mt.defaults.plugins.legend.labels.boxWidth=12,Mt.defaults.plugins.legend.position="bottom";let r=getComputedStyle(this.$refs.gridColorElement).color;if(e??(e={}),e.borderWidth??(e.borderWidth=2),e.maintainAspectRatio??(e.maintainAspectRatio=!!t),e.pointBackgroundColor=this.userPointBackgroundColor??o,e.pointHitRadius??(e.pointHitRadius=4),e.pointRadius??(e.pointRadius=2),e.scales??(e.scales={}),(a=e.scales).x??(a.x={}),(l=e.scales.x).border??(l.border={}),(c=e.scales.x.border).display??(c.display=!1),(h=e.scales.x).grid??(h.grid={}),e.scales.x.grid.color=this.userXGridColor??r,(u=e.scales.x.grid).display??(u.display=!1),(d=e.scales).y??(d.y={}),(f=e.scales.y).border??(f.border={}),(g=e.scales.y.border).display??(g.display=!1),(m=e.scales.y).grid??(m.grid={}),e.scales.y.grid.color=this.userYGridColor??r,["doughnut","pie","polarArea"].includes(i)&&((p=e.scales.x).display??(p.display=!1),(b=e.scales.y).display??(b.display=!1),(y=e.scales.y.grid).display??(y.display=!1)),i==="polarArea"){let S=getComputedStyle(this.$refs.textColorElement).color;(_=e.scales).r??(_.r={}),(w=e.scales.r).grid??(w.grid={}),e.scales.r.grid.color=this.userRadialGridColor??r,(x=e.scales.r).ticks??(x.ticks={}),e.scales.r.ticks.color=this.userRadialTicksColor??S,(k=e.scales.r.ticks).backdropColor??(k.backdropColor="transparent")}return new Mt(this.$refs.canvas,{type:i,data:n??s,options:e,plugins:window.filamentChartJsPlugins??[]})},getChart(){return this.$refs.canvas?Mt.getChart(this.$refs.canvas):null},destroy(){window.removeEventListener("resize",this.resizeHandler),this.resizeObserver&&this.resizeObserver.disconnect(),this.getChart()?.destroy()}}}export{Xm as default}; /*! Bundled license information: -chart.js/dist/chunks/helpers.segment.mjs: +@kurkle/color/dist/color.esm.js: (*! - * Chart.js v3.9.1 - * https://www.chartjs.org - * (c) 2022 Chart.js Contributors - * Released under the MIT License - *) - -chart.js/dist/chunks/helpers.segment.mjs: - (*! - * @kurkle/color v0.2.1 + * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme - * (c) 2022 Jukka Kurkela + * (c) 2024 Jukka Kurkela * Released under the MIT License *) -chart.js/dist/chart.mjs: +chart.js/dist/chunks/helpers.dataset.js: +chart.js/dist/chart.js: (*! - * Chart.js v3.9.1 + * Chart.js v4.5.1 * https://www.chartjs.org - * (c) 2022 Chart.js Contributors + * (c) 2025 Chart.js Contributors * Released under the MIT License *) diff --git a/public/js/filament/widgets/components/stats-overview/stat/chart.js b/public/js/filament/widgets/components/stats-overview/stat/chart.js index 51cd7e6bea..dd83e7101e 100644 --- a/public/js/filament/widgets/components/stats-overview/stat/chart.js +++ b/public/js/filament/widgets/components/stats-overview/stat/chart.js @@ -1,29 +1,22 @@ -function rt(){}var Hs=function(){let i=0;return function(){return i++}}();function T(i){return i===null||typeof i>"u"}function I(i){if(Array.isArray&&Array.isArray(i))return!0;let t=Object.prototype.toString.call(i);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function D(i){return i!==null&&Object.prototype.toString.call(i)==="[object Object]"}var W=i=>(typeof i=="number"||i instanceof Number)&&isFinite(+i);function Q(i,t){return W(i)?i:t}function C(i,t){return typeof i>"u"?t:i}var js=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100:i/t,Di=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100*t:+i;function z(i,t,e){if(i&&typeof i.call=="function")return i.apply(e,t)}function E(i,t,e,s){let n,o,a;if(I(i))if(o=i.length,s)for(n=o-1;n>=0;n--)t.call(e,i[n],n);else for(n=0;ni,x:i=>i.x,y:i=>i.y};function gt(i,t){return(Ds[t]||(Ds[t]=Io(t)))(i)}function Io(i){let t=zo(i);return e=>{for(let s of t){if(s==="")break;e=e&&e[s]}return e}}function zo(i){let t=i.split("."),e=[],s="";for(let n of t)s+=n,s.endsWith("\\")?s=s.slice(0,-1)+".":(e.push(s),s="");return e}function Ue(i){return i.charAt(0).toUpperCase()+i.slice(1)}var J=i=>typeof i<"u",ft=i=>typeof i=="function",Oi=(i,t)=>{if(i.size!==t.size)return!1;for(let e of i)if(!t.has(e))return!1;return!0};function Ys(i){return i.type==="mouseup"||i.type==="click"||i.type==="contextmenu"}var B=Math.PI,F=2*B,Bo=F+B,$e=Number.POSITIVE_INFINITY,Vo=B/180,V=B/2,fe=B/4,Os=B*2/3,tt=Math.log10,ot=Math.sign;function Ai(i){let t=Math.round(i);i=Kt(i,t,i/1e3)?t:i;let e=Math.pow(10,Math.floor(tt(i))),s=i/e;return(s<=1?1:s<=2?2:s<=5?5:10)*e}function Xs(i){let t=[],e=Math.sqrt(i),s;for(s=1;sn-o).pop(),t}function Rt(i){return!isNaN(parseFloat(i))&&isFinite(i)}function Kt(i,t,e){return Math.abs(i-t)=i}function Ti(i,t,e){let s,n,o;for(s=0,n=i.length;sl&&c=Math.min(t,e)-s&&i<=Math.max(t,e)+s}function qe(i,t,e){e=e||(a=>i[a]1;)o=n+s>>1,e(o)?n=o:s=o;return{lo:n,hi:s}}var at=(i,t,e,s)=>qe(i,e,s?n=>i[n][t]<=e:n=>i[n][t]qe(i,e,s=>i[s][t]>=e);function Gs(i,t,e){let s=0,n=i.length;for(;ss&&i[n-1]>e;)n--;return s>0||n{let s="_onData"+Ue(e),n=i[e];Object.defineProperty(i,e,{configurable:!0,enumerable:!1,value(...o){let a=n.apply(this,o);return i._chartjs.listeners.forEach(r=>{typeof r[s]=="function"&&r[s](...o)}),a}})})}function Ei(i,t){let e=i._chartjs;if(!e)return;let s=e.listeners,n=s.indexOf(t);n!==-1&&s.splice(n,1),!(s.length>0)&&(Zs.forEach(o=>{delete i[o]}),delete i._chartjs)}function Fi(i){let t=new Set,e,s;for(e=0,s=i.length;e"u"?function(i){return i()}:window.requestAnimationFrame}();function zi(i,t,e){let s=e||(a=>Array.prototype.slice.call(a)),n=!1,o=[];return function(...a){o=s(a),n||(n=!0,Ii.call(window,()=>{n=!1,i.apply(t,o)}))}}function Qs(i,t){let e;return function(...s){return t?(clearTimeout(e),e=setTimeout(i,t,s)):i.apply(this,s),t}}var Ge=i=>i==="start"?"left":i==="end"?"right":"center",X=(i,t,e)=>i==="start"?t:i==="end"?e:(t+e)/2,tn=(i,t,e,s)=>i===(s?"left":"right")?e:i==="center"?(t+e)/2:t;function Bi(i,t,e){let s=t.length,n=0,o=s;if(i._sorted){let{iScale:a,_parsed:r}=i,l=a.axis,{min:c,max:h,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=Y(Math.min(at(r,a.axis,c).lo,e?s:at(t,l,a.getPixelForValue(c)).lo),0,s-1)),u?o=Y(Math.max(at(r,a.axis,h,!0).hi+1,e?0:at(t,l,a.getPixelForValue(h),!0).hi+1),n,s)-n:o=s-n}return{start:n,count:o}}function Vi(i){let{xScale:t,yScale:e,_scaleRanges:s}=i,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!s)return i._scaleRanges=n,!0;let o=s.xmin!==t.min||s.xmax!==t.max||s.ymin!==e.min||s.ymax!==e.max;return Object.assign(s,n),o}var Be=i=>i===0||i===1,As=(i,t,e)=>-(Math.pow(2,10*(i-=1))*Math.sin((i-t)*F/e)),Ts=(i,t,e)=>Math.pow(2,-10*i)*Math.sin((i-t)*F/e)+1,Ht={linear:i=>i,easeInQuad:i=>i*i,easeOutQuad:i=>-i*(i-2),easeInOutQuad:i=>(i/=.5)<1?.5*i*i:-.5*(--i*(i-2)-1),easeInCubic:i=>i*i*i,easeOutCubic:i=>(i-=1)*i*i+1,easeInOutCubic:i=>(i/=.5)<1?.5*i*i*i:.5*((i-=2)*i*i+2),easeInQuart:i=>i*i*i*i,easeOutQuart:i=>-((i-=1)*i*i*i-1),easeInOutQuart:i=>(i/=.5)<1?.5*i*i*i*i:-.5*((i-=2)*i*i*i-2),easeInQuint:i=>i*i*i*i*i,easeOutQuint:i=>(i-=1)*i*i*i*i+1,easeInOutQuint:i=>(i/=.5)<1?.5*i*i*i*i*i:.5*((i-=2)*i*i*i*i+2),easeInSine:i=>-Math.cos(i*V)+1,easeOutSine:i=>Math.sin(i*V),easeInOutSine:i=>-.5*(Math.cos(B*i)-1),easeInExpo:i=>i===0?0:Math.pow(2,10*(i-1)),easeOutExpo:i=>i===1?1:-Math.pow(2,-10*i)+1,easeInOutExpo:i=>Be(i)?i:i<.5?.5*Math.pow(2,10*(i*2-1)):.5*(-Math.pow(2,-10*(i*2-1))+2),easeInCirc:i=>i>=1?i:-(Math.sqrt(1-i*i)-1),easeOutCirc:i=>Math.sqrt(1-(i-=1)*i),easeInOutCirc:i=>(i/=.5)<1?-.5*(Math.sqrt(1-i*i)-1):.5*(Math.sqrt(1-(i-=2)*i)+1),easeInElastic:i=>Be(i)?i:As(i,.075,.3),easeOutElastic:i=>Be(i)?i:Ts(i,.075,.3),easeInOutElastic(i){return Be(i)?i:i<.5?.5*As(i*2,.1125,.45):.5+.5*Ts(i*2-1,.1125,.45)},easeInBack(i){return i*i*((1.70158+1)*i-1.70158)},easeOutBack(i){return(i-=1)*i*((1.70158+1)*i+1.70158)+1},easeInOutBack(i){let t=1.70158;return(i/=.5)<1?.5*(i*i*(((t*=1.525)+1)*i-t)):.5*((i-=2)*i*(((t*=1.525)+1)*i+t)+2)},easeInBounce:i=>1-Ht.easeOutBounce(1-i),easeOutBounce(i){return i<1/2.75?7.5625*i*i:i<2/2.75?7.5625*(i-=1.5/2.75)*i+.75:i<2.5/2.75?7.5625*(i-=2.25/2.75)*i+.9375:7.5625*(i-=2.625/2.75)*i+.984375},easeInOutBounce:i=>i<.5?Ht.easeInBounce(i*2)*.5:Ht.easeOutBounce(i*2-1)*.5+.5};function _e(i){return i+.5|0}var yt=(i,t,e)=>Math.max(Math.min(i,e),t);function ge(i){return yt(_e(i*2.55),0,255)}function vt(i){return yt(_e(i*255),0,255)}function ut(i){return yt(_e(i/2.55)/100,0,1)}function Ls(i){return yt(_e(i*100),0,100)}var st={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pi=[..."0123456789ABCDEF"],No=i=>Pi[i&15],Ho=i=>Pi[(i&240)>>4]+Pi[i&15],Ve=i=>(i&240)>>4===(i&15),jo=i=>Ve(i.r)&&Ve(i.g)&&Ve(i.b)&&Ve(i.a);function $o(i){var t=i.length,e;return i[0]==="#"&&(t===4||t===5?e={r:255&st[i[1]]*17,g:255&st[i[2]]*17,b:255&st[i[3]]*17,a:t===5?st[i[4]]*17:255}:(t===7||t===9)&&(e={r:st[i[1]]<<4|st[i[2]],g:st[i[3]]<<4|st[i[4]],b:st[i[5]]<<4|st[i[6]],a:t===9?st[i[7]]<<4|st[i[8]]:255})),e}var Yo=(i,t)=>i<255?t(i):"";function Xo(i){var t=jo(i)?No:Ho;return i?"#"+t(i.r)+t(i.g)+t(i.b)+Yo(i.a,t):void 0}var Uo=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function en(i,t,e){let s=t*Math.min(e,1-e),n=(o,a=(o+i/30)%12)=>e-s*Math.max(Math.min(a-3,9-a,1),-1);return[n(0),n(8),n(4)]}function Ko(i,t,e){let s=(n,o=(n+i/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[s(5),s(3),s(1)]}function qo(i,t,e){let s=en(i,1,.5),n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)s[n]*=1-t-e,s[n]+=t;return s}function Go(i,t,e,s,n){return i===n?(t-e)/s+(t.5?h/(2-o-a):h/(o+a),l=Go(e,s,n,h,o),l=l*60+.5),[l|0,c||0,r]}function Ni(i,t,e,s){return(Array.isArray(t)?i(t[0],t[1],t[2]):i(t,e,s)).map(vt)}function Hi(i,t,e){return Ni(en,i,t,e)}function Zo(i,t,e){return Ni(qo,i,t,e)}function Jo(i,t,e){return Ni(Ko,i,t,e)}function sn(i){return(i%360+360)%360}function Qo(i){let t=Uo.exec(i),e=255,s;if(!t)return;t[5]!==s&&(e=t[6]?ge(+t[5]):vt(+t[5]));let n=sn(+t[2]),o=+t[3]/100,a=+t[4]/100;return t[1]==="hwb"?s=Zo(n,o,a):t[1]==="hsv"?s=Jo(n,o,a):s=Hi(n,o,a),{r:s[0],g:s[1],b:s[2],a:e}}function ta(i,t){var e=Wi(i);e[0]=sn(e[0]+t),e=Hi(e),i.r=e[0],i.g=e[1],i.b=e[2]}function ea(i){if(!i)return;let t=Wi(i),e=t[0],s=Ls(t[1]),n=Ls(t[2]);return i.a<255?`hsla(${e}, ${s}%, ${n}%, ${ut(i.a)})`:`hsl(${e}, ${s}%, ${n}%)`}var Rs={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Es={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function ia(){let i={},t=Object.keys(Es),e=Object.keys(Rs),s,n,o,a,r;for(s=0;s>16&255,o>>8&255,o&255]}return i}var We;function sa(i){We||(We=ia(),We.transparent=[0,0,0,0]);let t=We[i.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var na=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function oa(i){let t=na.exec(i),e=255,s,n,o;if(t){if(t[7]!==s){let a=+t[7];e=t[8]?ge(a):yt(a*255,0,255)}return s=+t[1],n=+t[3],o=+t[5],s=255&(t[2]?ge(s):yt(s,0,255)),n=255&(t[4]?ge(n):yt(n,0,255)),o=255&(t[6]?ge(o):yt(o,0,255)),{r:s,g:n,b:o,a:e}}}function aa(i){return i&&(i.a<255?`rgba(${i.r}, ${i.g}, ${i.b}, ${ut(i.a)})`:`rgb(${i.r}, ${i.g}, ${i.b})`)}var Mi=i=>i<=.0031308?i*12.92:Math.pow(i,1/2.4)*1.055-.055,Nt=i=>i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4);function ra(i,t,e){let s=Nt(ut(i.r)),n=Nt(ut(i.g)),o=Nt(ut(i.b));return{r:vt(Mi(s+e*(Nt(ut(t.r))-s))),g:vt(Mi(n+e*(Nt(ut(t.g))-n))),b:vt(Mi(o+e*(Nt(ut(t.b))-o))),a:i.a+e*(t.a-i.a)}}function Ne(i,t,e){if(i){let s=Wi(i);s[t]=Math.max(0,Math.min(s[t]+s[t]*e,t===0?360:1)),s=Hi(s),i.r=s[0],i.g=s[1],i.b=s[2]}}function nn(i,t){return i&&Object.assign(t||{},i)}function Fs(i){var t={r:0,g:0,b:0,a:255};return Array.isArray(i)?i.length>=3&&(t={r:i[0],g:i[1],b:i[2],a:255},i.length>3&&(t.a=vt(i[3]))):(t=nn(i,{r:0,g:0,b:0,a:1}),t.a=vt(t.a)),t}function la(i){return i.charAt(0)==="r"?oa(i):Qo(i)}var $t=class{constructor(t){if(t instanceof $t)return t;let e=typeof t,s;e==="object"?s=Fs(t):e==="string"&&(s=$o(t)||sa(t)||la(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=nn(this._rgb);return t&&(t.a=ut(t.a)),t}set rgb(t){this._rgb=Fs(t)}rgbString(){return this._valid?aa(this._rgb):void 0}hexString(){return this._valid?Xo(this._rgb):void 0}hslString(){return this._valid?ea(this._rgb):void 0}mix(t,e){if(t){let s=this.rgb,n=t.rgb,o,a=e===o?.5:e,r=2*a-1,l=s.a-n.a,c=((r*l===-1?r:(r+l)/(1+r*l))+1)/2;o=1-c,s.r=255&c*s.r+o*n.r+.5,s.g=255&c*s.g+o*n.g+.5,s.b=255&c*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=ra(this._rgb,t._rgb,e)),this}clone(){return new $t(this.rgb)}alpha(t){return this._rgb.a=vt(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=_e(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Ne(this._rgb,2,t),this}darken(t){return Ne(this._rgb,2,-t),this}saturate(t){return Ne(this._rgb,1,t),this}desaturate(t){return Ne(this._rgb,1,-t),this}rotate(t){return ta(this._rgb,t),this}};function on(i){return new $t(i)}function an(i){if(i&&typeof i=="object"){let t=i.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function ji(i){return an(i)?i:on(i)}function wi(i){return an(i)?i:on(i).saturate(.5).darken(.1).hexString()}var Mt=Object.create(null),Ze=Object.create(null);function pe(i,t){if(!t)return i;let e=t.split(".");for(let s=0,n=e.length;se.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,s)=>wi(s.backgroundColor),this.hoverBorderColor=(e,s)=>wi(s.borderColor),this.hoverColor=(e,s)=>wi(s.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return ki(this,t,e)}get(t){return pe(this,t)}describe(t,e){return ki(Ze,t,e)}override(t,e){return ki(Mt,t,e)}route(t,e,s,n){let o=pe(this,t),a=pe(this,s),r="_"+e;Object.defineProperties(o,{[r]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[r],c=a[n];return D(l)?Object.assign({},c,l):C(l,c)},set(l){this[r]=l}}})}},O=new Ci({_scriptable:i=>!i.startsWith("on"),_indexable:i=>i!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});function ca(i){return!i||T(i.size)||T(i.family)?null:(i.style?i.style+" ":"")+(i.weight?i.weight+" ":"")+i.size+"px "+i.family}function me(i,t,e,s,n){let o=t[n];return o||(o=t[n]=i.measureText(n).width,e.push(n)),o>s&&(s=o),s}function rn(i,t,e,s){s=s||{};let n=s.data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==t&&(n=s.data={},o=s.garbageCollect=[],s.font=t),i.save(),i.font=t;let a=0,r=e.length,l,c,h,d,u;for(l=0;le.length){for(l=0;l0&&i.stroke()}}function Yt(i,t,e){return e=e||.5,!t||i&&i.x>t.left-e&&i.xt.top-e&&i.y0&&o.strokeColor!=="",l,c;for(i.save(),i.font=n.string,ha(i,o),l=0;l+i||0;function Qe(i,t){let e={},s=D(t),n=s?Object.keys(t):t,o=D(i)?s?a=>C(i[a],i[t[a]]):a=>i[a]:()=>i;for(let a of n)e[a]=pa(o(a));return e}function Xi(i){return Qe(i,{top:"y",right:"x",bottom:"y",left:"x"})}function St(i){return Qe(i,["topLeft","topRight","bottomLeft","bottomRight"])}function U(i){let t=Xi(i);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function $(i,t){i=i||{},t=t||O.font;let e=C(i.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let s=C(i.style,t.style);s&&!(""+s).match(fa)&&(console.warn('Invalid font style specified: "'+s+'"'),s="");let n={family:C(i.family,t.family),lineHeight:ga(C(i.lineHeight,t.lineHeight),e),size:e,style:s,weight:C(i.weight,t.weight),string:""};return n.string=ca(n),n}function Zt(i,t,e,s){let n=!0,o,a,r;for(o=0,a=i.length;oe&&r===0?0:r+l;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function pt(i,t){return Object.assign(Object.create(i),t)}function ti(i,t=[""],e=i,s,n=()=>i[0]){J(s)||(s=fn("_fallback",i));let o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:i,_rootScopes:e,_fallback:s,_getTarget:n,override:a=>ti([a,...i],t,e,s)};return new Proxy(o,{deleteProperty(a,r){return delete a[r],delete a._keys,delete i[0][r],!0},get(a,r){return dn(a,r,()=>wa(r,t,i,a))},getOwnPropertyDescriptor(a,r){return Reflect.getOwnPropertyDescriptor(a._scopes[0],r)},getPrototypeOf(){return Reflect.getPrototypeOf(i[0])},has(a,r){return zs(a).includes(r)},ownKeys(a){return zs(a)},set(a,r,l){let c=a._storage||(a._storage=n());return a[r]=c[r]=l,delete a._keys,!0}})}function Lt(i,t,e,s){let n={_cacheable:!1,_proxy:i,_context:t,_subProxy:e,_stack:new Set,_descriptors:Ui(i,s),setContext:o=>Lt(i,o,e,s),override:o=>Lt(i.override(o),t,e,s)};return new Proxy(n,{deleteProperty(o,a){return delete o[a],delete i[a],!0},get(o,a,r){return dn(o,a,()=>ba(o,a,r))},getOwnPropertyDescriptor(o,a){return o._descriptors.allKeys?Reflect.has(i,a)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(i,a)},getPrototypeOf(){return Reflect.getPrototypeOf(i)},has(o,a){return Reflect.has(i,a)},ownKeys(){return Reflect.ownKeys(i)},set(o,a,r){return i[a]=r,delete o[a],!0}})}function Ui(i,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:s=t.indexable,_allKeys:n=t.allKeys}=i;return{allKeys:n,scriptable:e,indexable:s,isScriptable:ft(e)?e:()=>e,isIndexable:ft(s)?s:()=>s}}var ma=(i,t)=>i?i+Ue(t):t,Ki=(i,t)=>D(t)&&i!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function dn(i,t,e){if(Object.prototype.hasOwnProperty.call(i,t))return i[t];let s=e();return i[t]=s,s}function ba(i,t,e){let{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=i,r=s[t];return ft(r)&&a.isScriptable(t)&&(r=_a(t,r,i,e)),I(r)&&r.length&&(r=xa(t,r,i,a.isIndexable)),Ki(t,r)&&(r=Lt(r,n,o&&o[t],a)),r}function _a(i,t,e,s){let{_proxy:n,_context:o,_subProxy:a,_stack:r}=e;if(r.has(i))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+i);return r.add(i),t=t(o,a||s),r.delete(i),Ki(i,t)&&(t=qi(n._scopes,n,i,t)),t}function xa(i,t,e,s){let{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=e;if(J(o.index)&&s(i))t=t[o.index%t.length];else if(D(t[0])){let l=t,c=n._scopes.filter(h=>h!==l);t=[];for(let h of l){let d=qi(c,n,i,h);t.push(Lt(d,o,a&&a[i],r))}}return t}function un(i,t,e){return ft(i)?i(t,e):i}var ya=(i,t)=>i===!0?t:typeof i=="string"?gt(t,i):void 0;function va(i,t,e,s,n){for(let o of t){let a=ya(e,o);if(a){i.add(a);let r=un(a._fallback,e,n);if(J(r)&&r!==e&&r!==s)return r}else if(a===!1&&J(s)&&e!==s)return null}return!1}function qi(i,t,e,s){let n=t._rootScopes,o=un(t._fallback,e,s),a=[...i,...n],r=new Set;r.add(s);let l=Is(r,a,e,o||e,s);return l===null||J(o)&&o!==e&&(l=Is(r,a,o,l,s),l===null)?!1:ti(Array.from(r),[""],n,o,()=>Ma(t,e,s))}function Is(i,t,e,s,n){for(;e;)e=va(i,t,e,s,n);return e}function Ma(i,t,e){let s=i._getTarget();t in s||(s[t]={});let n=s[t];return I(n)&&D(e)?e:n}function wa(i,t,e,s){let n;for(let o of t)if(n=fn(ma(o,i),e),J(n))return Ki(i,n)?qi(e,s,i,n):n}function fn(i,t){for(let e of t){if(!e)continue;let s=e[i];if(J(s))return s}}function zs(i){let t=i._keys;return t||(t=i._keys=ka(i._scopes)),t}function ka(i){let t=new Set;for(let e of i)for(let s of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(s);return Array.from(t)}function Gi(i,t,e,s){let{iScale:n}=i,{key:o="r"}=this._parsing,a=new Array(s),r,l,c,h;for(r=0,l=s;rti==="x"?"y":"x";function Pa(i,t,e,s){let n=i.skip?t:i,o=t,a=e.skip?t:e,r=Ye(o,n),l=Ye(a,o),c=r/(r+l),h=l/(r+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let d=s*c,u=s*h;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function Ca(i,t,e){let s=i.length,n,o,a,r,l,c=Xt(i,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")Oa(i,n);else{let c=s?i[i.length-1]:i[0];for(o=0,a=i.length;owindow.getComputedStyle(i,null);function Ta(i,t){return ii(i).getPropertyValue(t)}var La=["top","right","bottom","left"];function Tt(i,t,e){let s={};e=e?"-"+e:"";for(let n=0;n<4;n++){let o=La[n];s[o]=parseFloat(i[t+"-"+o+e])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}var Ra=(i,t,e)=>(i>0||t>0)&&(!e||!e.shadowRoot);function Ea(i,t){let e=i.touches,s=e&&e.length?e[0]:i,{offsetX:n,offsetY:o}=s,a=!1,r,l;if(Ra(n,o,i.target))r=n,l=o;else{let c=t.getBoundingClientRect();r=s.clientX-c.left,l=s.clientY-c.top,a=!0}return{x:r,y:l,box:a}}function Pt(i,t){if("native"in i)return i;let{canvas:e,currentDevicePixelRatio:s}=t,n=ii(e),o=n.boxSizing==="border-box",a=Tt(n,"padding"),r=Tt(n,"border","width"),{x:l,y:c,box:h}=Ea(i,e),d=a.left+(h&&r.left),u=a.top+(h&&r.top),{width:f,height:g}=t;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*e.width/s),y:Math.round((c-u)/g*e.height/s)}}function Fa(i,t,e){let s,n;if(t===void 0||e===void 0){let o=ei(i);if(!o)t=i.clientWidth,e=i.clientHeight;else{let a=o.getBoundingClientRect(),r=ii(o),l=Tt(r,"border","width"),c=Tt(r,"padding");t=a.width-c.width-l.width,e=a.height-c.height-l.height,s=Xe(r.maxWidth,o,"clientWidth"),n=Xe(r.maxHeight,o,"clientHeight")}}return{width:t,height:e,maxWidth:s||$e,maxHeight:n||$e}}var Si=i=>Math.round(i*10)/10;function mn(i,t,e,s){let n=ii(i),o=Tt(n,"margin"),a=Xe(n.maxWidth,i,"clientWidth")||$e,r=Xe(n.maxHeight,i,"clientHeight")||$e,l=Fa(i,t,e),{width:c,height:h}=l;if(n.boxSizing==="content-box"){let d=Tt(n,"border","width"),u=Tt(n,"padding");c-=u.width+d.width,h-=u.height+d.height}return c=Math.max(0,c-o.width),h=Math.max(0,s?Math.floor(c/s):h-o.height),c=Si(Math.min(c,a,l.maxWidth)),h=Si(Math.min(h,r,l.maxHeight)),c&&!h&&(h=Si(c/2)),{width:c,height:h}}function Ji(i,t,e){let s=t||1,n=Math.floor(i.height*s),o=Math.floor(i.width*s);i.height=n/s,i.width=o/s;let a=i.canvas;return a.style&&(e||!a.style.height&&!a.style.width)&&(a.style.height=`${i.height}px`,a.style.width=`${i.width}px`),i.currentDevicePixelRatio!==s||a.height!==n||a.width!==o?(i.currentDevicePixelRatio=s,a.height=n,a.width=o,i.ctx.setTransform(s,0,0,s,0,0),!0):!1}var bn=function(){let i=!1;try{let t={get passive(){return i=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch{}return i}();function Qi(i,t){let e=Ta(i,t),s=e&&e.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function xt(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:i.y+e*(t.y-i.y)}}function _n(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:s==="middle"?e<.5?i.y:t.y:s==="after"?e<1?i.y:t.y:e>0?t.y:i.y}}function xn(i,t,e,s){let n={x:i.cp2x,y:i.cp2y},o={x:t.cp1x,y:t.cp1y},a=xt(i,n,e),r=xt(n,o,e),l=xt(o,t,e),c=xt(a,r,e),h=xt(r,l,e);return xt(c,h,e)}var Bs=new Map;function Ia(i,t){t=t||{};let e=i+JSON.stringify(t),s=Bs.get(e);return s||(s=new Intl.NumberFormat(i,t),Bs.set(e,s)),s}function Jt(i,t,e){return Ia(t,e).format(i)}var za=function(i,t){return{x(e){return i+i+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,s){return e-s},leftForLtr(e,s){return e-s}}},Ba=function(){return{x(i){return i},setWidth(i){},textAlign(i){return i},xPlus(i,t){return i+t},leftForLtr(i,t){return i}}};function Et(i,t,e){return i?za(t,e):Ba()}function ts(i,t){let e,s;(t==="ltr"||t==="rtl")&&(e=i.canvas.style,s=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),i.prevTextDirection=s)}function es(i,t){t!==void 0&&(delete i.prevTextDirection,i.canvas.style.setProperty("direction",t[0],t[1]))}function yn(i){return i==="angle"?{between:qt,compare:Wo,normalize:G}:{between:lt,compare:(t,e)=>t-e,normalize:t=>t}}function Vs({start:i,end:t,count:e,loop:s,style:n}){return{start:i%e,end:t%e,loop:s&&(t-i+1)%e===0,style:n}}function Va(i,t,e){let{property:s,start:n,end:o}=e,{between:a,normalize:r}=yn(s),l=t.length,{start:c,end:h,loop:d}=i,u,f;if(d){for(c+=l,h+=l,u=0,f=l;ul(n,v,b)&&r(n,v)!==0,x=()=>r(o,b)===0||l(o,v,b),M=()=>p||y(),w=()=>!p||x();for(let S=h,k=h;S<=d;++S)_=t[S%a],!_.skip&&(b=c(_[s]),b!==v&&(p=l(b,n,o),m===null&&M()&&(m=r(b,n)===0?S:k),m!==null&&w()&&(g.push(Vs({start:m,end:S,loop:u,count:a,style:f})),m=null),k=S,v=b));return m!==null&&g.push(Vs({start:m,end:d,loop:u,count:a,style:f})),g}function ss(i,t){let e=[],s=i.segments;for(let n=0;nn&&i[o%t].skip;)o--;return o%=t,{start:n,end:o}}function Na(i,t,e,s){let n=i.length,o=[],a=t,r=i[t],l;for(l=t+1;l<=e;++l){let c=i[l%n];c.skip||c.stop?r.skip||(s=!1,o.push({start:t%n,end:(l-1)%n,loop:s}),t=a=c.stop?l:null):(a=l,r.skip&&(t=l)),r=c}return a!==null&&o.push({start:t%n,end:a%n,loop:s}),o}function vn(i,t){let e=i.points,s=i.options.spanGaps,n=e.length;if(!n)return[];let o=!!i._loop,{start:a,end:r}=Wa(e,n,o,s);if(s===!0)return Ws(i,[{start:a,end:r,loop:o}],e,t);let l=rr({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Ii.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,n)=>{if(!s.running||!s.items.length)return;let o=s.items,a=o.length-1,r=!1,l;for(;a>=0;--a)l=o[a],l._active?(l._total>s.duration&&(s.duration=l._total),l.tick(t),r=!0):(o[a]=o[o.length-1],o.pop());r&&(n.draw(),this._notify(n,s,t,"progress")),o.length||(s.running=!1,this._notify(n,s,t,"complete"),s.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((s,n)=>Math.max(s,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let s=e.items,n=s.length-1;for(;n>=0;--n)s[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},mt=new fs,Mn="transparent",$a={boolean(i,t,e){return e>.5?t:i},color(i,t,e){let s=ji(i||Mn),n=s.valid&&ji(t||Mn);return n&&n.valid?n.mix(s,e).hexString():t},number(i,t,e){return i+(t-i)*e}},gs=class{constructor(t,e,s,n){let o=e[s];n=Zt([t.to,n,o,t.from]);let a=Zt([t.from,o,n]);this._active=!0,this._fn=t.fn||$a[t.type||typeof a],this._easing=Ht[t.easing]||Ht.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);let n=this._target[this._prop],o=s-this._start,a=this._duration-o;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=Zt([t.to,e,n,t.from]),this._from=Zt([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,s=this._duration,n=this._prop,o=this._from,a=this._loop,r=this._to,l;if(this._active=o!==r&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,r,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){let e=t?"res":"rej",s=this._promises||[];for(let n=0;ni!=="onProgress"&&i!=="onComplete"&&i!=="fn"});O.set("animations",{colors:{type:"color",properties:Xa},numbers:{type:"number",properties:Ya}});O.describe("animations",{_fallback:"animation"});O.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:i=>i|0}}}});var hi=class{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!D(t))return;let e=this._properties;Object.getOwnPropertyNames(t).forEach(s=>{let n=t[s];if(!D(n))return;let o={};for(let a of Ua)o[a]=n[a];(I(n.properties)&&n.properties||[s]).forEach(a=>{(a===s||!e.has(a))&&e.set(a,o)})})}_animateOptions(t,e){let s=e.options,n=qa(t,s);if(!n)return[];let o=this._createAnimations(n,s);return s.$shared&&Ka(t.options.$animations,s).then(()=>{t.options=s},()=>{}),o}_createAnimations(t,e){let s=this._properties,n=[],o=t.$animations||(t.$animations={}),a=Object.keys(e),r=Date.now(),l;for(l=a.length-1;l>=0;--l){let c=a[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}let h=e[c],d=o[c],u=s.get(c);if(d)if(u&&d.active()){d.update(u,h,r);continue}else d.cancel();if(!u||!u.duration){t[c]=h;continue}o[c]=d=new gs(u,t,c,h),n.push(d)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let s=this._createAnimations(t,e);if(s.length)return mt.add(this._chart,s),!0}};function Ka(i,t){let e=[],s=Object.keys(t);for(let n=0;n0||!e&&o<0)return n.index}return null}function Cn(i,t){let{chart:e,_cachedMeta:s}=i,n=e._stacks||(e._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,c=a.axis,h=Qa(o,a,s),d=t.length,u;for(let f=0;fe[s].axis===t).shift()}function ir(i,t){return pt(i,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function sr(i,t,e){return pt(i,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function ve(i,t){let e=i.controller.index,s=i.vScale&&i.vScale.axis;if(s){t=t||i._parsed;for(let n of t){let o=n._stacks;if(!o||o[s]===void 0||o[s][e]===void 0)return;delete o[s][e]}}}var os=i=>i==="reset"||i==="none",Dn=(i,t)=>t?i:Object.assign({},i),nr=(i,t,e)=>i&&!t.hidden&&t._stacked&&{keys:go(e,!0),values:null},et=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Sn(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&ve(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,s=this.getDataset(),n=(d,u,f,g)=>d==="x"?u:d==="r"?g:f,o=e.xAxisID=C(s.xAxisID,ns(t,"x")),a=e.yAxisID=C(s.yAxisID,ns(t,"y")),r=e.rAxisID=C(s.rAxisID,ns(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,o,a,r),h=e.vAxisID=n(l,a,o,r);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(r),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&Ei(this._data,this),t._stacked&&ve(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(D(e))this._data=Ja(e);else if(s!==e){if(s){Ei(s,this);let n=this._cachedMeta;ve(n),n._parsed=[]}e&&Object.isExtensible(e)&&Js(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,s=this.getDataset(),n=!1;this._dataCheck();let o=e._stacked;e._stacked=Sn(e.vScale,e),e.stack!==s.stack&&(n=!0,ve(e),e.stack=s.stack),this._resyncElements(t),(n||o!==e._stacked)&&Cn(this,e._parsed)}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:s,_data:n}=this,{iScale:o,_stacked:a}=s,r=o.axis,l=t===0&&e===n.length?!0:s._sorted,c=t>0&&s._parsed[t-1],h,d,u;if(this._parsing===!1)s._parsed=n,s._sorted=!0,u=n;else{I(n[t])?u=this.parseArrayData(s,n,t,e):D(n[t])?u=this.parseObjectData(s,n,t,e):u=this.parsePrimitiveData(s,n,t,e);let f=()=>d[r]===null||c&&d[r]p||d=0;--u)if(!g()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,s=[],n,o,a;for(n=0,o=e.length;n=0&&tthis.getContext(s,n),p=c.resolveNamedOptions(u,f,g,d);return p.$shared&&(p.$shared=l,o[a]=Object.freeze(Dn(p,l))),p}_resolveAnimations(t,e,s){let n=this.chart,o=this._cachedDataOpts,a=`animation-${e}`,r=o[a];if(r)return r;let l;if(n.options.animation!==!1){let h=this.chart.config,d=h.datasetAnimationScopeKeys(this._type,e),u=h.getOptionScopes(this.getDataset(),d);l=h.createResolver(u,this.getContext(t,s,e))}let c=new hi(n,l&&l.animations);return l&&l._cacheable&&(o[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||os(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let s=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(s),a=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,s),{sharedOptions:o,includeOptions:a}}updateElement(t,e,s,n){os(n)?Object.assign(t,s):this._resolveAnimations(e,n).update(t,s)}updateSharedOptions(t,e,s){t&&!os(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,n){t.active=n;let o=this.getStyle(e,n);this._resolveAnimations(e,s,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,s=this._cachedMeta.data;for(let[r,l,c]of this._syncList)this[r](l,c);this._syncList=[];let n=s.length,o=e.length,a=Math.min(o,n);a&&this.parse(0,a),o>n?this._insertElements(n,o-n,t):o{for(c.length+=e,r=c.length-1;r>=a;r--)c[r]=c[r-e]};for(l(o),r=t;rn-o))}return i._cache.$bar}function ar(i){let t=i.iScale,e=or(t,i.type),s=t._length,n,o,a,r,l=()=>{a===32767||a===-32768||(J(r)&&(s=Math.min(s,Math.abs(a-r)||s)),r=a)};for(n=0,o=e.length;n0?n[i-1]:null,r=iMath.abs(r)&&(l=r,c=a),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:o,min:a,max:r}}function po(i,t,e,s){return I(i)?cr(i,t,e,s):t[e.axis]=e.parse(i,s),t}function On(i,t,e,s){let n=i.iScale,o=i.vScale,a=n.getLabels(),r=n===o,l=[],c,h,d,u;for(c=e,h=e+s;c=e?1:-1)}function dr(i){let t,e,s,n,o;return i.horizontal?(t=i.base>i.x,e="left",s="right"):(t=i.basel.controller.options.grouped),o=s.options.stacked,a=[],r=l=>{let c=l.controller.getParsed(e),h=c&&c[l.vScale.axis];if(T(h)||isNaN(h))return!0};for(let l of n)if(!(e!==void 0&&r(l))&&((o===!1||a.indexOf(l.stack)===-1||o===void 0&&l.stack===void 0)&&a.push(l.stack),l.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,s){let n=this._getStacks(t,s),o=e!==void 0?n.indexOf(e):-1;return o===-1?n.length-1:o}_getRuler(){let t=this.options,e=this._cachedMeta,s=e.iScale,n=[],o,a;for(o=0,a=e.data.length;o=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:e.label,value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,n){let o=n==="reset",{iScale:a,vScale:r}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=a.axis,d=r.axis;for(let u=e;uqt(v,r,l,!0)?1:Math.max(y,y*e,x,x*e),g=(v,y,x)=>qt(v,r,l,!0)?-1:Math.min(y,y*e,x,x*e),p=f(0,c,d),m=f(V,h,u),b=g(B,c,d),_=g(B+V,h,u);s=(p-b)/2,n=(m-_)/2,o=-(p+b)/2,a=-(m+_)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}var Ot=class extends et{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let s=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=s;else{let o=l=>+s[l];if(D(s[t])){let{key:l="value"}=this._parsing;o=c=>+gt(s[c],l)}let a,r;for(a=t,r=t+e;a0&&!isNaN(t)?F*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=Jt(e._parsed[t],s.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){let e=0,s=this.chart,n,o,a,r,l;if(!t){for(n=0,o=s.data.datasets.length;ni!=="spacing",_indexable:i=>i!=="spacing"};Ot.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(i){let t=i.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:e}}=i.legend.options;return t.labels.map((s,n)=>{let a=i.getDatasetMeta(0).controller.getStyle(n);return{text:s,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,lineWidth:a.borderWidth,pointStyle:e,hidden:!i.getDataVisibility(n),index:n}})}return[]}},onClick(i,t,e){e.chart.toggleDataVisibility(t.index),e.chart.update()}},tooltip:{callbacks:{title(){return""},label(i){let t=i.label,e=": "+i.formattedValue;return I(t)?(t=t.slice(),t[0]+=e):t+=e,t}}}}};var se=class extends et{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:s,data:n=[],_dataset:o}=e,a=this.chart._animationsDisabled,{start:r,count:l}=Bi(e,n,a);this._drawStart=r,this._drawCount=l,Vi(e)&&(r=0,l=n.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!o._decimated,s.points=n;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:c},t),this.updateElements(n,r,l,t)}updateElements(t,e,s,n){let o=n==="reset",{iScale:a,vScale:r,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=Rt(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||n==="none",_=e>0&&this.getParsed(e-1);for(let v=e;v0&&Math.abs(x[u]-_[u])>m,p&&(M.parsed=x,M.raw=c.data[v]),d&&(M.options=h||this.resolveDataElementOptions(v,y.active?"active":n)),b||this.updateElement(y,v,M,n),_=x}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return s;let o=n[0].size(this.resolveDataElementOptions(0)),a=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(s,o,a)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};se.id="line";se.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1};se.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};var ne=class extends et{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=Jt(e._parsed[t].r,s.options.locale);return{label:n[t]||"",value:o}}parseObjectData(t,e,s,n){return Gi.bind(this)(t,e,s,n)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((s,n)=>{let o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(oe.max&&(e.max=o))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,s=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),a=Math.max(s.cutoutPercentage?o/100*s.cutoutPercentage:1,0),r=(o-a)/t.getVisibleDatasetCount();this.outerRadius=o-r*this.index,this.innerRadius=this.outerRadius-r}updateElements(t,e,s,n){let o=n==="reset",a=this.chart,l=a.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*B,f=u,g,p=360/this.countVisibleElements();for(g=0;g{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?nt(this.resolveDataElementOptions(t,e).angle||s):0}};ne.id="polarArea";ne.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0};ne.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(i){let t=i.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:e}}=i.legend.options;return t.labels.map((s,n)=>{let a=i.getDatasetMeta(0).controller.getStyle(n);return{text:s,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,lineWidth:a.borderWidth,pointStyle:e,hidden:!i.getDataVisibility(n),index:n}})}return[]}},onClick(i,t,e){e.chart.toggleDataVisibility(t.index),e.chart.update()}},tooltip:{callbacks:{title(){return""},label(i){return i.chart.data.labels[i.dataIndex]+": "+i.formattedValue}}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};var De=class extends Ot{};De.id="pie";De.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};var oe=class extends et{getLabelAndValue(t){let e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,n){return Gi.bind(this)(t,e,s,n)}update(t){let e=this._cachedMeta,s=e.dataset,n=e.data||[],o=e.iScale.getLabels();if(s.points=n,t!=="resize"){let a=this.resolveDatasetElementOptions(t);this.options.showLine||(a.borderWidth=0);let r={_loop:!0,_fullLoop:o.length===n.length,options:a};this.updateElement(s,void 0,r,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,s,n){let o=this._cachedMeta.rScale,a=n==="reset";for(let r=e;r{n[o]=s[o]&&s[o].active()?s[o]._to:this[o]}),n}};it.defaults={};it.defaultRoutes=void 0;var mo={values(i){return I(i)?i:""+i},numeric(i,t,e){if(i===0)return"0";let s=this.chart.options.locale,n,o=i;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),o=mr(i,e)}let a=tt(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Jt(i,s,l)},logarithmic(i,t,e){if(i===0)return"0";let s=i/Math.pow(10,Math.floor(tt(i)));return s===1||s===2||s===5?mo.numeric.call(this,i,t,e):""}};function mr(i,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&i!==Math.floor(i)&&(e=i-Math.floor(i)),e}var mi={formatters:mo};O.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(i,t)=>t.lineWidth,tickColor:(i,t)=>t.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:mi.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}});O.route("scale.ticks","color","","color");O.route("scale.grid","color","","borderColor");O.route("scale.grid","borderColor","","borderColor");O.route("scale.title","color","","color");O.describe("scale",{_fallback:!1,_scriptable:i=>!i.startsWith("before")&&!i.startsWith("after")&&i!=="callback"&&i!=="parser",_indexable:i=>i!=="borderDash"&&i!=="tickBorderDash"});O.describe("scales",{_fallback:"scale"});O.describe("scale.ticks",{_scriptable:i=>i!=="backdropPadding"&&i!=="callback",_indexable:i=>i!=="backdropPadding"});function br(i,t){let e=i.options.ticks,s=e.maxTicksLimit||_r(i),n=e.major.enabled?yr(t):[],o=n.length,a=n[0],r=n[o-1],l=[];if(o>s)return vr(t,l,n,o/s),l;let c=xr(n,t,s);if(o>0){let h,d,u=o>1?Math.round((r-a)/(o-1)):null;for(si(t,l,c,T(u)?0:a-u,a),h=0,d=o-1;hn)return l}return Math.max(n,1)}function yr(i){let t=[],e,s;for(e=0,s=i.length;ei==="left"?"right":i==="right"?"left":i,Ln=(i,t,e)=>t==="top"||t==="left"?i[t]+e:i[t]-e;function Rn(i,t){let e=[],s=i.length/t,n=i.length,o=0;for(;oa+r)))return l}function Sr(i,t){E(i,e=>{let s=e.gc,n=s.length/2,o;if(n>t){for(o=0;os?s:e,s=n&&e>s?e:s,{min:Q(e,Q(s,e)),max:Q(s,Q(e,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){z(this.options.beforeUpdate,[this])}update(t,e,s){let{beginAtZero:n,grace:o,ticks:a}=this.options,r=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=hn(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=r=o||s<=1||!this.isHorizontal()){this.labelRotation=n;return}let h=this._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Y(this.chart.width-d,0,this.maxWidth);r=t.offset?this.maxWidth/s:f/(s-1),d+6>r&&(r=f/(s-(t.offset?.5:1)),l=this.maxHeight-Me(t.grid)-e.padding-En(t.title,this.chart.options.font),c=Math.sqrt(d*d+u*u),a=Ke(Math.min(Math.asin(Y((h.highest.height+6)/r,-1,1)),Math.asin(Y(l/c,-1,1))-Math.asin(Y(u/c,-1,1)))),a=Math.max(n,Math.min(o,a))),this.labelRotation=a}afterCalculateLabelRotation(){z(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){z(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:s,title:n,grid:o}}=this,a=this._isVisible(),r=this.isHorizontal();if(a){let l=En(n,e.options.font);if(r?(t.width=this.maxWidth,t.height=Me(o)+l):(t.height=this.maxHeight,t.width=Me(o)+l),s.display&&this.ticks.length){let{first:c,last:h,widest:d,highest:u}=this._getLabelSizes(),f=s.padding*2,g=nt(this.labelRotation),p=Math.cos(g),m=Math.sin(g);if(r){let b=s.mirror?0:m*d.width+p*u.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{let b=s.mirror?0:p*d.width+m*u.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,h,m,p)}}this._handleMargins(),r?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,n){let{ticks:{align:o,padding:a},position:r}=this.options,l=this.labelRotation!==0,c=r!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1),u=0,f=0;l?c?(u=n*t.width,f=s*e.height):(u=s*t.height,f=n*e.width):o==="start"?f=e.width:o==="end"?u=t.width:o!=="inner"&&(u=t.width/2,f=e.width/2),this.paddingLeft=Math.max((u-h+a)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-d+a)*this.width/(this.width-d),0)}else{let h=e.height/2,d=t.height/2;o==="start"?(h=0,d=t.height):o==="end"&&(h=e.height,d=0),this.paddingTop=h+a,this.paddingBottom=d+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){z(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,s;for(e=0,s=t.length;e({width:o[w]||0,height:a[w]||0});return{first:M(0),last:M(e-1),widest:M(y),highest:M(x),widths:o,heights:a}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return Ks(this._alignToPixels?wt(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&tr*n?r/s:l/n:l*n0}_computeGridLineItems(t){let e=this.axis,s=this.chart,n=this.options,{grid:o,position:a}=n,r=o.offset,l=this.isHorizontal(),h=this.ticks.length+(r?1:0),d=Me(o),u=[],f=o.setContext(this.getContext()),g=f.drawBorder?f.borderWidth:0,p=g/2,m=function(P){return wt(s,P,g)},b,_,v,y,x,M,w,S,k,L,R,A;if(a==="top")b=m(this.bottom),M=this.bottom-d,S=b-p,L=m(t.top)+p,A=t.bottom;else if(a==="bottom")b=m(this.top),L=t.top,A=m(t.bottom)-p,M=b+p,S=this.top+d;else if(a==="left")b=m(this.right),x=this.right-d,w=b-p,k=m(t.left)+p,R=t.right;else if(a==="right")b=m(this.left),k=t.left,R=m(t.right)-p,x=b+p,w=this.left+d;else if(e==="x"){if(a==="center")b=m((t.top+t.bottom)/2+.5);else if(D(a)){let P=Object.keys(a)[0],j=a[P];b=m(this.chart.scales[P].getPixelForValue(j))}L=t.top,A=t.bottom,M=b+p,S=M+d}else if(e==="y"){if(a==="center")b=m((t.left+t.right)/2);else if(D(a)){let P=Object.keys(a)[0],j=a[P];b=m(this.chart.scales[P].getPixelForValue(j))}x=b-p,w=x-d,k=t.left,R=t.right}let H=C(n.ticks.maxTicksLimit,h),q=Math.max(1,Math.ceil(h/H));for(_=0;_o.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){let e=this.options.grid,s=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o,a,r=(l,c,h)=>{!h.width||!h.color||(s.save(),s.lineWidth=h.width,s.strokeStyle=h.color,s.setLineDash(h.borderDash||[]),s.lineDashOffset=h.borderDashOffset,s.beginPath(),s.moveTo(l.x,l.y),s.lineTo(c.x,c.y),s.stroke(),s.restore())};if(e.display)for(o=0,a=n.length;o{this.draw(n)}}]:[{z:s,draw:n=>{this.drawBackground(),this.drawGrid(n),this.drawTitle()}},{z:s+1,draw:()=>{this.drawBorder()}},{z:e,draw:n=>{this.drawLabels(n)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",n=[],o,a;for(o=0,a=e.length;o{let s=e.split("."),n=s.pop(),o=[i].concat(s).join("."),a=t[e].split("."),r=a.pop(),l=a.join(".");O.route(o,n,l,r)})}function Lr(i){return"id"in i&&"defaults"in i}var ps=class{constructor(){this.controllers=new te(et,"datasets",!0),this.elements=new te(it,"elements"),this.plugins=new te(Object,"plugins"),this.scales=new te(_t,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(n=>{let o=s||this._getRegistryForType(n);s||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):E(n,a=>{let r=s||this._getRegistryForType(a);this._exec(t,r,a)})})}_exec(t,e,s){let n=Ue(t);z(s["before"+n],[],s),e[t](s),z(s["after"+n],[],s)}_getRegistryForType(t){for(let e=0;e0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(M[f]-v[f])>b,m&&(w.parsed=M,w.raw=c.data[y]),u&&(w.options=d||this.resolveDataElementOptions(y,x.active?"active":n)),_||this.updateElement(x,y,w,n),v=M}this.updateSharedOptions(d,n,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let r=0;for(let l=e.length-1;l>=0;--l)r=Math.max(r,e[l].size(this.resolveDataElementOptions(l))/2);return r>0&&r}let s=t.dataset,n=s.options&&s.options.borderWidth||0;if(!e.length)return n;let o=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,o,a)/2}};ae.id="scatter";ae.defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1};ae.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title(){return""},label(i){return"("+i.label+", "+i.formattedValue+")"}}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Rr=Object.freeze({__proto__:null,BarController:ee,BubbleController:ie,DoughnutController:Ot,LineController:se,PolarAreaController:ne,PieController:De,RadarController:oe,ScatterController:ae});function Ft(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var Oe=class{constructor(t){this.options=t||{}}init(t){}formats(){return Ft()}parse(t,e){return Ft()}format(t,e){return Ft()}add(t,e,s){return Ft()}diff(t,e,s){return Ft()}startOf(t,e,s){return Ft()}endOf(t,e){return Ft()}};Oe.override=function(i){Object.assign(Oe.prototype,i)};var Er={_date:Oe};function Fr(i,t,e,s){let{controller:n,data:o,_sorted:a}=i,r=n._cachedMeta.iScale;if(r&&t===r.axis&&t!=="r"&&a&&o.length){let l=r._reversePixels?qs:at;if(s){if(n._sharedOptions){let c=o[0],h=typeof c.getRange=="function"&&c.getRange(t);if(h){let d=l(o,t,e-h),u=l(o,t,e+h);return{lo:d.lo,hi:u.hi}}}}else return l(o,t,e)}return{lo:0,hi:o.length-1}}function Ie(i,t,e,s,n){let o=i.getSortedVisibleDatasetMetas(),a=e[t];for(let r=0,l=o.length;r{l[a](t[e],n)&&(o.push({element:l,datasetIndex:c,index:h}),r=r||l.inRange(t.x,t.y,n))}),s&&!r?[]:o}var Vr={evaluateInteractionItems:Ie,modes:{index(i,t,e,s){let n=Pt(t,i),o=e.axis||"x",a=e.includeInvisible||!1,r=e.intersect?rs(i,n,o,s,a):ls(i,n,o,!1,s,a),l=[];return r.length?(i.getSortedVisibleDatasetMetas().forEach(c=>{let h=r[0].index,d=c.data[h];d&&!d.skip&&l.push({element:d,datasetIndex:c.index,index:h})}),l):[]},dataset(i,t,e,s){let n=Pt(t,i),o=e.axis||"xy",a=e.includeInvisible||!1,r=e.intersect?rs(i,n,o,s,a):ls(i,n,o,!1,s,a);if(r.length>0){let l=r[0].datasetIndex,c=i.getDatasetMeta(l).data;r=[];for(let h=0;he.pos===t)}function In(i,t){return i.filter(e=>bo.indexOf(e.pos)===-1&&e.box.axis===t)}function ke(i,t){return i.sort((e,s)=>{let n=t?s:e,o=t?e:s;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function Wr(i){let t=[],e,s,n,o,a,r;for(e=0,s=(i||[]).length;ec.box.fullSize),!0),s=ke(we(t,"left"),!0),n=ke(we(t,"right")),o=ke(we(t,"top"),!0),a=ke(we(t,"bottom")),r=In(t,"x"),l=In(t,"y");return{fullSize:e,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:we(t,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}function zn(i,t,e,s){return Math.max(i[e],t[e])+Math.max(i[s],t[s])}function _o(i,t){i.top=Math.max(i.top,t.top),i.left=Math.max(i.left,t.left),i.bottom=Math.max(i.bottom,t.bottom),i.right=Math.max(i.right,t.right)}function $r(i,t,e,s){let{pos:n,box:o}=e,a=i.maxPadding;if(!D(n)){e.size&&(i[n]-=e.size);let d=s[e.stack]||{size:0,count:1};d.size=Math.max(d.size,e.horizontal?o.height:o.width),e.size=d.size/d.count,i[n]+=e.size}o.getPadding&&_o(a,o.getPadding());let r=Math.max(0,t.outerWidth-zn(a,i,"left","right")),l=Math.max(0,t.outerHeight-zn(a,i,"top","bottom")),c=r!==i.w,h=l!==i.h;return i.w=r,i.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Yr(i){let t=i.maxPadding;function e(s){let n=Math.max(t[s]-i[s],0);return i[s]+=n,n}i.y+=e("top"),i.x+=e("left"),e("right"),e("bottom")}function Xr(i,t){let e=t.maxPadding;function s(n){let o={left:0,top:0,right:0,bottom:0};return n.forEach(a=>{o[a]=Math.max(t[a],e[a])}),o}return s(i?["left","right"]:["top","bottom"])}function Pe(i,t,e,s){let n=[],o,a,r,l,c,h;for(o=0,a=i.length,c=0;o{typeof p.beforeLayout=="function"&&p.beforeLayout()});let h=l.reduce((p,m)=>m.box.options&&m.box.options.display===!1?p:p+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},n);_o(u,U(s));let f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=Hr(l.concat(c),d);Pe(r.fullSize,f,d,g),Pe(l,f,d,g),Pe(c,f,d,g)&&Pe(l,f,d,g),Yr(f),Bn(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,Bn(r.rightAndBottom,f,d,g),i.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},E(r.chartArea,p=>{let m=p.box;Object.assign(m,i.chartArea),m.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}},di=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,n){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):s)}}isAttached(t){return!0}updateConfig(t){}},ms=class extends di{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},ci="$chartjs",Ur={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Vn=i=>i===null||i==="";function Kr(i,t){let e=i.style,s=i.getAttribute("height"),n=i.getAttribute("width");if(i[ci]={initial:{height:s,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",Vn(n)){let o=Qi(i,"width");o!==void 0&&(i.width=o)}if(Vn(s))if(i.style.height==="")i.height=i.width/(t||2);else{let o=Qi(i,"height");o!==void 0&&(i.height=o)}return i}var xo=bn?{passive:!0}:!1;function qr(i,t,e){i.addEventListener(t,e,xo)}function Gr(i,t,e){i.canvas.removeEventListener(t,e,xo)}function Zr(i,t){let e=Ur[i.type]||i.type,{x:s,y:n}=Pt(i,t);return{type:e,chart:t,native:i,x:s!==void 0?s:null,y:n!==void 0?n:null}}function ui(i,t){for(let e of i)if(e===t||e.contains(t))return!0}function Jr(i,t,e){let s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(let r of o)a=a||ui(r.addedNodes,s),a=a&&!ui(r.removedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function Qr(i,t,e){let s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(let r of o)a=a||ui(r.removedNodes,s),a=a&&!ui(r.addedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}var Ae=new Map,Wn=0;function yo(){let i=window.devicePixelRatio;i!==Wn&&(Wn=i,Ae.forEach((t,e)=>{e.currentDevicePixelRatio!==i&&t()}))}function tl(i,t){Ae.size||window.addEventListener("resize",yo),Ae.set(i,t)}function el(i){Ae.delete(i),Ae.size||window.removeEventListener("resize",yo)}function il(i,t,e){let s=i.canvas,n=s&&ei(s);if(!n)return;let o=zi((r,l)=>{let c=n.clientWidth;e(r,l),c{let l=r[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||o(c,h)});return a.observe(n),tl(i,o),a}function cs(i,t,e){e&&e.disconnect(),t==="resize"&&el(i)}function sl(i,t,e){let s=i.canvas,n=zi(o=>{i.ctx!==null&&e(Zr(o,i))},i,o=>{let a=o[0];return[a,a.offsetX,a.offsetY]});return qr(s,t,n),n}var bs=class extends di{acquireContext(t,e){let s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Kr(t,e),s):null}releaseContext(t){let e=t.canvas;if(!e[ci])return!1;let s=e[ci].initial;["height","width"].forEach(o=>{let a=s[o];T(a)?e.removeAttribute(o):e.setAttribute(o,a)});let n=s.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[ci],!0}addEventListener(t,e,s){this.removeEventListener(t,e);let n=t.$proxies||(t.$proxies={}),a={attach:Jr,detach:Qr,resize:il}[e]||sl;n[e]=a(t,e,s)}removeEventListener(t,e){let s=t.$proxies||(t.$proxies={}),n=s[e];if(!n)return;({attach:cs,detach:cs,resize:cs}[e]||Gr)(t,e,n),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,n){return mn(t,e,s,n)}isAttached(t){let e=ei(t);return!!(e&&e.isConnected)}};function nl(i){return!Zi()||typeof OffscreenCanvas<"u"&&i instanceof OffscreenCanvas?ms:bs}var _s=class{constructor(){this._init=[]}notify(t,e,s,n){e==="beforeInit"&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));let o=n?this._descriptors(t).filter(n):this._descriptors(t),a=this._notify(o,t,e,s);return e==="afterDestroy"&&(this._notify(o,t,"stop"),this._notify(this._init,t,"uninstall")),a}_notify(t,e,s,n){n=n||{};for(let o of t){let a=o.plugin,r=a[s],l=[e,n,o.options];if(z(r,l,a)===!1&&n.cancelable)return!1}return!0}invalidate(){T(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;let e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){let s=t&&t.config,n=C(s.options&&s.options.plugins,{}),o=ol(s);return n===!1&&!e?[]:rl(t,o,n,e)}_notifyStateChanges(t){let e=this._oldCache||[],s=this._cache,n=(o,a)=>o.filter(r=>!a.some(l=>r.plugin.id===l.plugin.id));this._notify(n(e,s),t,"stop"),this._notify(n(s,e),t,"start")}};function ol(i){let t={},e=[],s=Object.keys(ht.plugins.items);for(let o=0;o{let l=s[r];if(!D(l))return console.error(`Invalid scale configuration for scale: ${r}`);if(l._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${r}`);let c=ys(r,l),h=hl(c,n),d=e.scales||{};o[c]=o[c]||r,a[r]=Ut(Object.create(null),[{axis:c},l,d[c],d[h]])}),i.data.datasets.forEach(r=>{let l=r.type||i.type,c=r.indexAxis||xs(l,t),d=(Mt[l]||{}).scales||{};Object.keys(d).forEach(u=>{let f=cl(u,c),g=r[f+"AxisID"]||o[f]||f;a[g]=a[g]||Object.create(null),Ut(a[g],[{axis:f},s[g],d[u]])})}),Object.keys(a).forEach(r=>{let l=a[r];Ut(l,[O.scales[l.type],O.scale])}),a}function vo(i){let t=i.options||(i.options={});t.plugins=C(t.plugins,{}),t.scales=ul(i,t)}function Mo(i){return i=i||{},i.datasets=i.datasets||[],i.labels=i.labels||[],i}function fl(i){return i=i||{},i.data=Mo(i.data),vo(i),i}var Nn=new Map,wo=new Set;function oi(i,t){let e=Nn.get(i);return e||(e=t(),Nn.set(i,e),wo.add(e)),e}var Se=(i,t,e)=>{let s=gt(t,e);s!==void 0&&i.add(s)},vs=class{constructor(t){this._config=fl(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Mo(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),vo(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return oi(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return oi(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return oi(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,s=this.type;return oi(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let s=this._scopeCache,n=s.get(t);return(!n||e)&&(n=new Map,s.set(t,n)),n}getOptionScopes(t,e,s){let{options:n,type:o}=this,a=this._cachedScopes(t,s),r=a.get(e);if(r)return r;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(d=>Se(l,t,d))),h.forEach(d=>Se(l,n,d)),h.forEach(d=>Se(l,Mt[o]||{},d)),h.forEach(d=>Se(l,O,d)),h.forEach(d=>Se(l,Ze,d))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),wo.has(e)&&a.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,Mt[e]||{},O.datasets[e]||{},{type:e},O,Ze]}resolveNamedOptions(t,e,s,n=[""]){let o={$shared:!0},{resolver:a,subPrefixes:r}=Hn(this._resolverCache,t,n),l=a;if(pl(a,e)){o.$shared=!1,s=ft(s)?s():s;let c=this.createResolver(t,s,r);l=Lt(a,s,c)}for(let c of e)o[c]=l[c];return o}createResolver(t,e,s=[""],n){let{resolver:o}=Hn(this._resolverCache,t,s);return D(e)?Lt(o,e,void 0,n):o}};function Hn(i,t,e){let s=i.get(t);s||(s=new Map,i.set(t,s));let n=e.join(),o=s.get(n);return o||(o={resolver:ti(t,e),subPrefixes:e.filter(r=>!r.toLowerCase().includes("hover"))},s.set(n,o)),o}var gl=i=>D(i)&&Object.getOwnPropertyNames(i).reduce((t,e)=>t||ft(i[e]),!1);function pl(i,t){let{isScriptable:e,isIndexable:s}=Ui(i);for(let n of t){let o=e(n),a=s(n),r=(a||o)&&i[n];if(o&&(ft(r)||gl(r))||a&&I(r))return!0}return!1}var ml="3.9.1",bl=["top","bottom","left","right","chartArea"];function jn(i,t){return i==="top"||i==="bottom"||bl.indexOf(i)===-1&&t==="x"}function $n(i,t){return function(e,s){return e[i]===s[i]?e[t]-s[t]:e[i]-s[i]}}function Yn(i){let t=i.chart,e=t.options.animation;t.notifyPlugins("afterRender"),z(e&&e.onComplete,[i],t)}function _l(i){let t=i.chart,e=t.options.animation;z(e&&e.onProgress,[i],t)}function ko(i){return Zi()&&typeof i=="string"?i=document.getElementById(i):i&&i.length&&(i=i[0]),i&&i.canvas&&(i=i.canvas),i}var fi={},So=i=>{let t=ko(i);return Object.values(fi).filter(e=>e.canvas===t).pop()};function xl(i,t,e){let s=Object.keys(i);for(let n of s){let o=+n;if(o>=t){let a=i[n];delete i[n],(e>0||o>t)&&(i[o+e]=a)}}}function yl(i,t,e,s){return!e||i.type==="mouseout"?null:s?t:i}var It=class{constructor(t,e){let s=this.config=new vs(e),n=ko(t),o=So(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");let a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||nl(n)),this.platform.updateConfig(s);let r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,c=l&&l.height,h=l&&l.width;if(this.id=Hs(),this.ctx=r,this.canvas=l,this.width=h,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new _s,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Qs(d=>this.update(d),a.resizeDelay||0),this._dataChanges=[],fi[this.id]=this,!r||!l){console.error("Failed to create chart: can't acquire context from the given item");return}mt.listen(this,"complete",Yn),mt.listen(this,"progress",_l),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:n,_aspectRatio:o}=this;return T(t)?e&&o?o:n?s/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Ji(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return $i(this.canvas,this.ctx),this}stop(){return mt.stop(this),this}resize(t,e){mt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let s=this.options,n=this.canvas,o=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,o),r=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Ji(this,r,!0)&&(this.notifyPlugins("resize",{size:a}),z(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};E(e,(s,n)=>{s.id=n})}buildOrUpdateScales(){let t=this.options,e=t.scales,s=this.scales,n=Object.keys(s).reduce((a,r)=>(a[r]=!1,a),{}),o=[];e&&(o=o.concat(Object.keys(e).map(a=>{let r=e[a],l=ys(a,r),c=l==="r",h=l==="x";return{options:r,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),E(o,a=>{let r=a.options,l=r.id,c=ys(l,r),h=C(r.type,a.dtype);(r.position===void 0||jn(r.position,c)!==jn(a.dposition))&&(r.position=a.dposition),n[l]=!0;let d=null;if(l in s&&s[l].type===h)d=s[l];else{let u=ht.getScale(h);d=new u({id:l,type:h,ctx:this.ctx,chart:this}),s[d.id]=d}d.init(r,t)}),E(n,(a,r)=>{a||delete s[r]}),E(s,a=>{K.configure(this,a,a.options),K.addBox(this,a)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((n,o)=>n.index-o.index),s>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((s,n)=>{e.filter(o=>o===s._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,s,n;for(this._removeUnreferencedMetasets(),s=0,n=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort($n("z","_idx"));let{_active:r,_lastEvent:l}=this;l?this._eventHandler(l,!0):r.length&&this._updateHoverStyles(r,r,!0),this.render()}_updateScales(){E(this.scales,t=>{K.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);(!Oi(e,s)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:s,start:n,count:o}of e){let a=s==="_removeElements"?-o:o;xl(t,n,a)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,s=o=>new Set(t.filter(a=>a[0]===o).map((a,r)=>r+","+a.splice(1).join(","))),n=s(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;K.update(this,this.width,this.height,t);let e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],E(this.boxes,n=>{s&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,s=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,s=t._clip,n=!s.disabled,o=this.chartArea,a={meta:t,index:t.index,cancelable:!0};this.notifyPlugins("beforeDatasetDraw",a)!==!1&&(n&&xe(e,{left:s.left===!1?0:o.left-s.left,right:s.right===!1?this.width:o.right+s.right,top:s.top===!1?0:o.top-s.top,bottom:s.bottom===!1?this.height:o.bottom+s.bottom}),t.controller.draw(),n&&ye(e),a.cancelable=!1,this.notifyPlugins("afterDatasetDraw",a))}isPointInArea(t){return Yt(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,n){let o=Vr.modes[e];return typeof o=="function"?o(this,t,s,n):[]}getDatasetMeta(t){let e=this.data.datasets[t],s=this._metasets,n=s.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(n)),n}getContext(){return this.$context||(this.$context=pt(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let s=this.getDatasetMeta(t);return typeof s.hidden=="boolean"?!s.hidden:!e.hidden}setDatasetVisibility(t,e){let s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){let n=s?"show":"hide",o=this.getDatasetMeta(t),a=o.controller._resolveAnimations(void 0,n);J(e)?(o.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(o,{visible:s}),this.update(r=>r.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),mt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,o,a),t[o]=a},n=(o,a,r)=>{o.offsetX=a,o.offsetY=r,this._eventHandler(o)};E(this.options.events,o=>s(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,s=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)},a,r=()=>{n("attach",r),this.attached=!0,this.resize(),s("resize",o),s("detach",a)};a=()=>{this.attached=!1,n("resize",o),this._stop(),this._resize(0,0),s("attach",r)},e.isAttached(this.canvas)?r():a()}unbindEvents(){E(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},E(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){let n=s?"set":"remove",o,a,r,l;for(e==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),r=0,l=t.length;r{let r=this.getDatasetMeta(o);if(!r)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:r.data[a],index:a}});!be(s,e)&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}_updateHoverStyles(t,e,s){let n=this.options.hover,o=(l,c)=>l.filter(h=>!c.some(d=>h.datasetIndex===d.datasetIndex&&h.index===d.index)),a=o(e,t),r=s?t:o(t,e);a.length&&this.updateHoverStyle(a,n.mode,!1),r.length&&n.mode&&this.updateHoverStyle(r,n.mode,!0)}_eventHandler(t,e){let s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=a=>(a.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",s,n)===!1)return;let o=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,n),(o||s.changed)&&this.render(),this}_handleEvent(t,e,s){let{_active:n=[],options:o}=this,a=e,r=this._getActiveElements(t,n,s,a),l=Ys(t),c=yl(t,this._lastEvent,s,l);s&&(this._lastEvent=null,z(o.onHover,[t,r,this],this),l&&z(o.onClick,[t,r,this],this));let h=!be(r,n);return(h||e)&&(this._active=r,this._updateHoverStyles(r,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,s,n){if(t.type==="mouseout")return[];if(!s)return e;let o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}},Xn=()=>E(It.instances,i=>i._plugins.invalidate()),Ct=!0;Object.defineProperties(It,{defaults:{enumerable:Ct,value:O},instances:{enumerable:Ct,value:fi},overrides:{enumerable:Ct,value:Mt},registry:{enumerable:Ct,value:ht},version:{enumerable:Ct,value:ml},getChart:{enumerable:Ct,value:So},register:{enumerable:Ct,value:(...i)=>{ht.add(...i),Xn()}},unregister:{enumerable:Ct,value:(...i)=>{ht.remove(...i),Xn()}}});function Po(i,t,e){let{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=t,c=n/r;i.beginPath(),i.arc(o,a,r,s-c,e+c),l>n?(c=n/l,i.arc(o,a,l,e+c,s-c,!0)):i.arc(o,a,n,e+V,s-V),i.closePath(),i.clip()}function vl(i){return Qe(i,["outerStart","outerEnd","innerStart","innerEnd"])}function Ml(i,t,e,s){let n=vl(i.options.borderRadius),o=(e-t)/2,a=Math.min(o,s*t/2),r=l=>{let c=(e-Math.min(o,l))*s/2;return Y(l,0,Math.min(o,c))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Y(n.innerStart,0,a),innerEnd:Y(n.innerEnd,0,a)}}function Qt(i,t,e,s){return{x:e+i*Math.cos(t),y:s+i*Math.sin(t)}}function Ms(i,t,e,s,n,o){let{x:a,y:r,startAngle:l,pixelMargin:c,innerRadius:h}=t,d=Math.max(t.outerRadius+s+e-c,0),u=h>0?h+s+e+c:0,f=0,g=n-l;if(s){let P=h>0?h-s:0,j=d>0?d-s:0,N=(P+j)/2,At=N!==0?g*N/(N+s):g;f=(g-At)/2}let p=Math.max(.001,g*d-e/B)/d,m=(g-p)/2,b=l+m+f,_=n-m-f,{outerStart:v,outerEnd:y,innerStart:x,innerEnd:M}=Ml(t,u,d,_-b),w=d-v,S=d-y,k=b+v/w,L=_-y/S,R=u+x,A=u+M,H=b+x/R,q=_-M/A;if(i.beginPath(),o){if(i.arc(a,r,d,k,L),y>0){let N=Qt(S,L,a,r);i.arc(N.x,N.y,y,L,_+V)}let P=Qt(A,_,a,r);if(i.lineTo(P.x,P.y),M>0){let N=Qt(A,q,a,r);i.arc(N.x,N.y,M,_+V,q+Math.PI)}if(i.arc(a,r,u,_-M/u,b+x/u,!0),x>0){let N=Qt(R,H,a,r);i.arc(N.x,N.y,x,H+Math.PI,b-V)}let j=Qt(w,b,a,r);if(i.lineTo(j.x,j.y),v>0){let N=Qt(w,k,a,r);i.arc(N.x,N.y,v,b-V,k)}}else{i.moveTo(a,r);let P=Math.cos(k)*d+a,j=Math.sin(k)*d+r;i.lineTo(P,j);let N=Math.cos(L)*d+a,At=Math.sin(L)*d+r;i.lineTo(N,At)}i.closePath()}function wl(i,t,e,s,n){let{fullCircles:o,startAngle:a,circumference:r}=t,l=t.endAngle;if(o){Ms(i,t,e,s,a+F,n);for(let c=0;c=F||qt(o,r,l),p=lt(a,c+u,h+u);return g&&p}getCenterPoint(t){let{x:e,y:s,startAngle:n,endAngle:o,innerRadius:a,outerRadius:r}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:l,spacing:c}=this.options,h=(n+o)/2,d=(a+r+c+l)/2;return{x:e+Math.cos(h)*d,y:s+Math.sin(h)*d}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){let{options:e,circumference:s}=this,n=(e.offset||0)/2,o=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin=e.borderAlign==="inner"?.33:0,this.fullCircles=s>F?Math.floor(s/F):0,s===0||this.innerRadius<0||this.outerRadius<0)return;t.save();let r=0;if(n){r=n/2;let c=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(c)*r,Math.sin(c)*r),this.circumference>=B&&(r=n)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;let l=wl(t,this,r,o,a);Sl(t,this,r,o,l,a),t.restore()}};re.id="arc";re.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};re.defaultRoutes={backgroundColor:"backgroundColor"};function Co(i,t,e=t){i.lineCap=C(e.borderCapStyle,t.borderCapStyle),i.setLineDash(C(e.borderDash,t.borderDash)),i.lineDashOffset=C(e.borderDashOffset,t.borderDashOffset),i.lineJoin=C(e.borderJoinStyle,t.borderJoinStyle),i.lineWidth=C(e.borderWidth,t.borderWidth),i.strokeStyle=C(e.borderColor,t.borderColor)}function Pl(i,t,e){i.lineTo(e.x,e.y)}function Cl(i){return i.stepped?ln:i.tension||i.cubicInterpolationMode==="monotone"?cn:Pl}function Do(i,t,e={}){let s=i.length,{start:n=0,end:o=s-1}=e,{start:a,end:r}=t,l=Math.max(n,a),c=Math.min(o,r),h=nr&&o>r;return{count:s,start:l,loop:t.loop,ilen:c(a+(c?r-y:y))%o,v=()=>{p!==m&&(i.lineTo(h,m),i.lineTo(h,p),i.lineTo(h,b))};for(l&&(f=n[_(0)],i.moveTo(f.x,f.y)),u=0;u<=r;++u){if(f=n[_(u)],f.skip)continue;let y=f.x,x=f.y,M=y|0;M===g?(xm&&(m=x),h=(d*h+y)/++d):(v(),i.lineTo(y,x),g=M,d=0,p=m=x),b=x}v()}function ws(i){let t=i.options,e=t.borderDash&&t.borderDash.length;return!i._decimated&&!i._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?Ol:Dl}function Al(i){return i.stepped?_n:i.tension||i.cubicInterpolationMode==="monotone"?xn:xt}function Tl(i,t,e,s){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,s)&&n.closePath()),Co(i,t.options),i.stroke(n)}function Ll(i,t,e,s){let{segments:n,options:o}=t,a=ws(t);for(let r of n)Co(i,o,r.style),i.beginPath(),a(i,t,r,{start:e,end:e+s-1})&&i.closePath(),i.stroke()}var Rl=typeof Path2D=="function";function El(i,t,e,s){Rl&&!t.options.segment?Tl(i,t,e,s):Ll(i,t,e,s)}var dt=class extends it{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let s=this.options;if((s.tension||s.cubicInterpolationMode==="monotone")&&!s.stepped&&!this._pointsUpdated){let n=s.spanGaps?this._loop:this._fullLoop;pn(this._points,s,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=vn(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){let s=this.options,n=t[e],o=this.points,a=ss(this,{property:e,start:n,end:n});if(!a.length)return;let r=[],l=Al(s),c,h;for(c=0,h=a.length;ci!=="borderDash"&&i!=="fill"};function Un(i,t,e,s){let n=i.options,{[e]:o}=i.getProps([e],s);return Math.abs(t-o)=e)return i.slice(t,t+e);let a=[],r=(e-2)/(o-2),l=0,c=t+e-1,h=t,d,u,f,g,p;for(a[l++]=i[h],d=0;df&&(f=g,u=i[_],p=_);a[l++]=u,h=p}return a[l++]=i[c],a}function Hl(i,t,e,s){let n=0,o=0,a,r,l,c,h,d,u,f,g,p,m=[],b=t+e-1,_=i[t].x,y=i[b].x-_;for(a=t;ap&&(p=c,u=a),n=(o*n+r.x)/++o;else{let M=a-1;if(!T(d)&&!T(u)){let w=Math.min(d,u),S=Math.max(d,u);w!==f&&w!==M&&m.push({...i[w],x:n}),S!==f&&S!==M&&m.push({...i[S],x:n})}a>0&&M!==f&&m.push(i[M]),m.push(r),h=x,o=0,g=p=c,d=u=f=a}}return m}function Ao(i){if(i._decimated){let t=i._data;delete i._decimated,delete i._data,Object.defineProperty(i,"data",{value:t})}}function Kn(i){i.data.datasets.forEach(t=>{Ao(t)})}function jl(i,t){let e=t.length,s=0,n,{iScale:o}=i,{min:a,max:r,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(s=Y(at(t,o.axis,a).lo,0,e-1)),c?n=Y(at(t,o.axis,r).hi+1,s,e)-s:n=e-s,{start:s,count:n}}var $l={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(i,t,e)=>{if(!e.enabled){Kn(i);return}let s=i.width;i.data.datasets.forEach((n,o)=>{let{_data:a,indexAxis:r}=n,l=i.getDatasetMeta(o),c=a||n.data;if(Zt([r,i.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=i.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||i.options.parsing)return;let{start:d,count:u}=jl(l,c),f=e.threshold||4*s;if(u<=f){Ao(n);return}T(a)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(p){this._data=p}}));let g;switch(e.algorithm){case"lttb":g=Nl(c,d,u,s,e);break;case"min-max":g=Hl(c,d,u,s);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=g})},destroy(i){Kn(i)}};function Yl(i,t,e){let s=i.segments,n=i.points,o=t.points,a=[];for(let r of s){let{start:l,end:c}=r;c=Ps(l,c,n);let h=ks(e,n[l],n[c],r.loop);if(!t.segments){a.push({source:r,target:h,start:n[l],end:n[c]});continue}let d=ss(t,h);for(let u of d){let f=ks(e,o[u.start],o[u.end],u.loop),g=is(r,n,f);for(let p of g)a.push({source:p,target:u,start:{[e]:qn(h,f,"start",Math.max)},end:{[e]:qn(h,f,"end",Math.min)}})}}return a}function ks(i,t,e,s){if(s)return;let n=t[i],o=e[i];return i==="angle"&&(n=G(n),o=G(o)),{property:i,start:n,end:o}}function Xl(i,t){let{x:e=null,y:s=null}=i||{},n=t.points,o=[];return t.segments.forEach(({start:a,end:r})=>{r=Ps(a,r,n);let l=n[a],c=n[r];s!==null?(o.push({x:l.x,y:s}),o.push({x:c.x,y:s})):e!==null&&(o.push({x:e,y:l.y}),o.push({x:e,y:c.y}))}),o}function Ps(i,t,e){for(;t>i;t--){let s=e[t];if(!isNaN(s.x)&&!isNaN(s.y))break}return t}function qn(i,t,e,s){return i&&t?s(i[e],t[e]):i?i[e]:t?t[e]:0}function To(i,t){let e=[],s=!1;return I(i)?(s=!0,e=i):e=Xl(i,t),e.length?new dt({points:e,options:{tension:0},_loop:s,_fullLoop:s}):null}function Gn(i){return i&&i.fill!==!1}function Ul(i,t,e){let n=i[t].fill,o=[t],a;if(!e)return n;for(;n!==!1&&o.indexOf(n)===-1;){if(!W(n))return n;if(a=i[n],!a)return!1;if(a.visible)return n;o.push(n),n=a.fill}return!1}function Kl(i,t,e){let s=Jl(i);if(D(s))return isNaN(s.value)?!1:s;let n=parseFloat(s);return W(n)&&Math.floor(n)===n?ql(s[0],t,n,e):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ql(i,t,e,s){return(i==="-"||i==="+")&&(e=t+e),e===t||e<0||e>=s?!1:e}function Gl(i,t){let e=null;return i==="start"?e=t.bottom:i==="end"?e=t.top:D(i)?e=t.getPixelForValue(i.value):t.getBasePixel&&(e=t.getBasePixel()),e}function Zl(i,t,e){let s;return i==="start"?s=e:i==="end"?s=t.options.reverse?t.min:t.max:D(i)?s=i.value:s=t.getBaseValue(),s}function Jl(i){let t=i.options,e=t.fill,s=C(e&&e.target,e);return s===void 0&&(s=!!t.backgroundColor),s===!1||s===null?!1:s===!0?"origin":s}function Ql(i){let{scale:t,index:e,line:s}=i,n=[],o=s.segments,a=s.points,r=tc(t,e);r.push(To({x:null,y:t.bottom},s));for(let l=0;l=0;--a){let r=n[a].$filler;r&&(r.line.updateControlPoints(o,r.axis),s&&r.fill&&us(i.ctx,r,o))}},beforeDatasetsDraw(i,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let s=i.getSortedVisibleDatasetMetas();for(let n=s.length-1;n>=0;--n){let o=s[n].$filler;Gn(o)&&us(i.ctx,o,i.chartArea)}},beforeDatasetDraw(i,t,e){let s=t.meta.$filler;!Gn(s)||e.drawTime!=="beforeDatasetDraw"||us(i.ctx,s,i.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},to=(i,t)=>{let{boxHeight:e=t,boxWidth:s=t}=i;return i.usePointStyle&&(e=Math.min(e,t),s=i.pointStyleWidth||Math.min(s,t)),{boxWidth:s,boxHeight:e,itemHeight:Math.max(t,e)}},dc=(i,t)=>i!==null&&t!==null&&i.datasetIndex===t.datasetIndex&&i.index===t.index,pi=class extends it{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=z(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(s=>t.filter(s,this.chart.data))),t.sort&&(e=e.sort((s,n)=>t.sort(s,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let s=t.labels,n=$(s.font),o=n.size,a=this._computeTitleHeight(),{boxWidth:r,itemHeight:l}=to(s,o),c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(a,o,r,l)+10):(h=this.maxHeight,c=this._fitCols(a,o,r,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,n){let{ctx:o,maxWidth:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+r,d=t;o.textAlign="left",o.textBaseline="middle";let u=-1,f=-h;return this.legendItems.forEach((g,p)=>{let m=s+e/2+o.measureText(g.text).width;(p===0||c[c.length-1]+m+2*r>a)&&(d+=h,c[c.length-(p>0?0:1)]=0,f+=h,u++),l[p]={left:0,top:f,row:u,width:m,height:n},c[c.length-1]+=m+r}),d}_fitCols(t,e,s,n){let{ctx:o,maxHeight:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=a-t,d=r,u=0,f=0,g=0,p=0;return this.legendItems.forEach((m,b)=>{let _=s+e/2+o.measureText(m.text).width;b>0&&f+n+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,p++,u=f=0),l[b]={left:g,top:f,col:p,width:_,height:n},u=Math.max(u,_),f+=n+r}),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:n},rtl:o}}=this,a=Et(o,this.left,this.width);if(this.isHorizontal()){let r=0,l=X(s,this.left+n,this.right-this.lineWidths[r]);for(let c of e)r!==c.row&&(r=c.row,l=X(s,this.left+n,this.right-this.lineWidths[r])),c.top+=this.top+t+n,c.left=a.leftForLtr(a.x(l),c.width),l+=c.width+n}else{let r=0,l=X(s,this.top+t+n,this.bottom-this.columnSizes[r].height);for(let c of e)c.col!==r&&(r=c.col,l=X(s,this.top+t+n,this.bottom-this.columnSizes[r].height)),c.top=l,c.left+=this.left+n,c.left=a.leftForLtr(a.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;xe(t,this),this._draw(),ye(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:s,ctx:n}=this,{align:o,labels:a}=t,r=O.color,l=Et(t.rtl,this.left,this.width),c=$(a.font),{color:h,padding:d}=a,u=c.size,f=u/2,g;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;let{boxWidth:p,boxHeight:m,itemHeight:b}=to(a,u),_=function(w,S,k){if(isNaN(p)||p<=0||isNaN(m)||m<0)return;n.save();let L=C(k.lineWidth,1);if(n.fillStyle=C(k.fillStyle,r),n.lineCap=C(k.lineCap,"butt"),n.lineDashOffset=C(k.lineDashOffset,0),n.lineJoin=C(k.lineJoin,"miter"),n.lineWidth=L,n.strokeStyle=C(k.strokeStyle,r),n.setLineDash(C(k.lineDash,[])),a.usePointStyle){let R={radius:m*Math.SQRT2/2,pointStyle:k.pointStyle,rotation:k.rotation,borderWidth:L},A=l.xPlus(w,p/2),H=S+f;Yi(n,R,A,H,a.pointStyleWidth&&p)}else{let R=S+Math.max((u-m)/2,0),A=l.leftForLtr(w,p),H=St(k.borderRadius);n.beginPath(),Object.values(H).some(q=>q!==0)?Gt(n,{x:A,y:R,w:p,h:m,radius:H}):n.rect(A,R,p,m),n.fill(),L!==0&&n.stroke()}n.restore()},v=function(w,S,k){kt(n,k.text,w,S+b/2,c,{strikethrough:k.hidden,textAlign:l.textAlign(k.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();y?g={x:X(o,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:g={x:this.left+d,y:X(o,this.top+x+d,this.bottom-e[0].height),line:0},ts(this.ctx,t.textDirection);let M=b+d;this.legendItems.forEach((w,S)=>{n.strokeStyle=w.fontColor||h,n.fillStyle=w.fontColor||h;let k=n.measureText(w.text).width,L=l.textAlign(w.textAlign||(w.textAlign=a.textAlign)),R=p+f+k,A=g.x,H=g.y;l.setWidth(this.width),y?S>0&&A+R+d>this.right&&(H=g.y+=M,g.line++,A=g.x=X(o,this.left+d,this.right-s[g.line])):S>0&&H+M>this.bottom&&(A=g.x=A+e[g.line].width+d,g.line++,H=g.y=X(o,this.top+x+d,this.bottom-e[g.line].height));let q=l.x(A);_(q,H,w),A=tn(L,A+p+f,y?A+R:this.right,t.rtl),v(l.x(A),H,w),y?g.x+=R+d:g.y+=M}),es(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,s=$(e.font),n=U(e.padding);if(!e.display)return;let o=Et(t.rtl,this.left,this.width),a=this.ctx,r=e.position,l=s.size/2,c=n.top+l,h,d=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),h=this.top+c,d=X(t.align,d,this.right-u);else{let g=this.columnSizes.reduce((p,m)=>Math.max(p,m.height),0);h=c+X(t.align,this.top,this.bottom-g-t.labels.padding-this._computeTitleHeight())}let f=X(r,d,d+u);a.textAlign=o.textAlign(Ge(r)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,kt(a,e.text,f,h,s)}_computeTitleHeight(){let t=this.options.title,e=$(t.font),s=U(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,n,o;if(lt(t,this.left,this.right)&<(e,this.top,this.bottom)){for(o=this.legendHitBoxes,s=0;si.chart.options.color,boxWidth:40,padding:10,generateLabels(i){let t=i.data.datasets,{labels:{usePointStyle:e,pointStyle:s,textAlign:n,color:o}}=i.legend.options;return i._getSortedDatasetMetas().map(a=>{let r=a.controller.getStyle(e?0:void 0),l=U(r.borderWidth);return{text:t[a.index].label,fillStyle:r.backgroundColor,fontColor:o,hidden:!a.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:r.borderColor,pointStyle:s||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:0,datasetIndex:a.index}},this)}},title:{color:i=>i.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:i=>!i.startsWith("on"),labels:{_scriptable:i=>!["generateLabels","filter","sort"].includes(i)}}},Te=class extends it{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let s=this.options;if(this.left=0,this.top=0,!s.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let n=I(s.text)?s.text.length:1;this._padding=U(s.padding);let o=n*$(s.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:s,bottom:n,right:o,options:a}=this,r=a.align,l=0,c,h,d;return this.isHorizontal()?(h=X(r,s,o),d=e+t,c=o-s):(a.position==="left"?(h=s+t,d=X(r,n,e),l=B*-.5):(h=o-t,d=X(r,e,n),l=B*.5),c=n-e),{titleX:h,titleY:d,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let s=$(e.font),o=s.lineHeight/2+this._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=this._drawArgs(o);kt(t,e.text,0,0,s,{color:e.color,maxWidth:l,rotation:c,textAlign:Ge(e.align),textBaseline:"middle",translation:[a,r]})}};function gc(i,t){let e=new Te({ctx:i.ctx,options:t,chart:i});K.configure(i,e,t),K.addBox(i,e),i.titleBlock=e}var pc={id:"title",_element:Te,start(i,t,e){gc(i,e)},stop(i){let t=i.titleBlock;K.removeBox(i,t),delete i.titleBlock},beforeUpdate(i,t,e){let s=i.titleBlock;K.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},ai=new WeakMap,mc={id:"subtitle",start(i,t,e){let s=new Te({ctx:i.ctx,options:e,chart:i});K.configure(i,s,e),K.addBox(i,s),ai.set(i,s)},stop(i){K.removeBox(i,ai.get(i)),ai.delete(i)},beforeUpdate(i,t,e){let s=ai.get(i);K.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Ce={average(i){if(!i.length)return!1;let t,e,s=0,n=0,o=0;for(t=0,e=i.length;tt in i?Jo(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var M=(i,t,e)=>Zo(i,typeof t!="symbol"?t+"":t,e);function ve(i){return i+.5|0}var wt=(i,t,e)=>Math.max(Math.min(i,e),t);function _e(i){return wt(ve(i*2.55),0,255)}function St(i){return wt(ve(i*255),0,255)}function mt(i){return wt(ve(i/2.55)/100,0,1)}function zs(i){return wt(ve(i*100),0,100)}var nt={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ai=[..."0123456789ABCDEF"],Qo=i=>Ai[i&15],ta=i=>Ai[(i&240)>>4]+Ai[i&15],Ue=i=>(i&240)>>4===(i&15),ea=i=>Ue(i.r)&&Ue(i.g)&&Ue(i.b)&&Ue(i.a);function ia(i){var t=i.length,e;return i[0]==="#"&&(t===4||t===5?e={r:255&nt[i[1]]*17,g:255&nt[i[2]]*17,b:255&nt[i[3]]*17,a:t===5?nt[i[4]]*17:255}:(t===7||t===9)&&(e={r:nt[i[1]]<<4|nt[i[2]],g:nt[i[3]]<<4|nt[i[4]],b:nt[i[5]]<<4|nt[i[6]],a:t===9?nt[i[7]]<<4|nt[i[8]]:255})),e}var sa=(i,t)=>i<255?t(i):"";function na(i){var t=ea(i)?Qo:ta;return i?"#"+t(i.r)+t(i.g)+t(i.b)+sa(i.a,t):void 0}var oa=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Ns(i,t,e){let s=t*Math.min(e,1-e),n=(o,a=(o+i/30)%12)=>e-s*Math.max(Math.min(a-3,9-a,1),-1);return[n(0),n(8),n(4)]}function aa(i,t,e){let s=(n,o=(n+i/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[s(5),s(3),s(1)]}function ra(i,t,e){let s=Ns(i,1,.5),n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)s[n]*=1-t-e,s[n]+=t;return s}function la(i,t,e,s,n){return i===n?(t-e)/s+(t.5?h/(2-o-a):h/(o+a),l=la(e,s,n,h,o),l=l*60+.5),[l|0,c||0,r]}function Li(i,t,e,s){return(Array.isArray(t)?i(t[0],t[1],t[2]):i(t,e,s)).map(St)}function Ri(i,t,e){return Li(Ns,i,t,e)}function ca(i,t,e){return Li(ra,i,t,e)}function ha(i,t,e){return Li(aa,i,t,e)}function Hs(i){return(i%360+360)%360}function da(i){let t=oa.exec(i),e=255,s;if(!t)return;t[5]!==s&&(e=t[6]?_e(+t[5]):St(+t[5]));let n=Hs(+t[2]),o=+t[3]/100,a=+t[4]/100;return t[1]==="hwb"?s=ca(n,o,a):t[1]==="hsv"?s=ha(n,o,a):s=Ri(n,o,a),{r:s[0],g:s[1],b:s[2],a:e}}function ua(i,t){var e=Ti(i);e[0]=Hs(e[0]+t),e=Ri(e),i.r=e[0],i.g=e[1],i.b=e[2]}function fa(i){if(!i)return;let t=Ti(i),e=t[0],s=zs(t[1]),n=zs(t[2]);return i.a<255?`hsla(${e}, ${s}%, ${n}%, ${mt(i.a)})`:`hsl(${e}, ${s}%, ${n}%)`}var Bs={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Vs={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function ga(){let i={},t=Object.keys(Vs),e=Object.keys(Bs),s,n,o,a,r;for(s=0;s>16&255,o>>8&255,o&255]}return i}var Xe;function pa(i){Xe||(Xe=ga(),Xe.transparent=[0,0,0,0]);let t=Xe[i.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ma=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function ba(i){let t=ma.exec(i),e=255,s,n,o;if(t){if(t[7]!==s){let a=+t[7];e=t[8]?_e(a):wt(a*255,0,255)}return s=+t[1],n=+t[3],o=+t[5],s=255&(t[2]?_e(s):wt(s,0,255)),n=255&(t[4]?_e(n):wt(n,0,255)),o=255&(t[6]?_e(o):wt(o,0,255)),{r:s,g:n,b:o,a:e}}}function xa(i){return i&&(i.a<255?`rgba(${i.r}, ${i.g}, ${i.b}, ${mt(i.a)})`:`rgb(${i.r}, ${i.g}, ${i.b})`)}var Ci=i=>i<=.0031308?i*12.92:Math.pow(i,1/2.4)*1.055-.055,Gt=i=>i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4);function _a(i,t,e){let s=Gt(mt(i.r)),n=Gt(mt(i.g)),o=Gt(mt(i.b));return{r:St(Ci(s+e*(Gt(mt(t.r))-s))),g:St(Ci(n+e*(Gt(mt(t.g))-n))),b:St(Ci(o+e*(Gt(mt(t.b))-o))),a:i.a+e*(t.a-i.a)}}function Ke(i,t,e){if(i){let s=Ti(i);s[t]=Math.max(0,Math.min(s[t]+s[t]*e,t===0?360:1)),s=Ri(s),i.r=s[0],i.g=s[1],i.b=s[2]}}function js(i,t){return i&&Object.assign(t||{},i)}function Ws(i){var t={r:0,g:0,b:0,a:255};return Array.isArray(i)?i.length>=3&&(t={r:i[0],g:i[1],b:i[2],a:255},i.length>3&&(t.a=St(i[3]))):(t=js(i,{r:0,g:0,b:0,a:1}),t.a=St(t.a)),t}function ya(i){return i.charAt(0)==="r"?ba(i):da(i)}var ye=class i{constructor(t){if(t instanceof i)return t;let e=typeof t,s;e==="object"?s=Ws(t):e==="string"&&(s=ia(t)||pa(t)||ya(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=js(this._rgb);return t&&(t.a=mt(t.a)),t}set rgb(t){this._rgb=Ws(t)}rgbString(){return this._valid?xa(this._rgb):void 0}hexString(){return this._valid?na(this._rgb):void 0}hslString(){return this._valid?fa(this._rgb):void 0}mix(t,e){if(t){let s=this.rgb,n=t.rgb,o,a=e===o?.5:e,r=2*a-1,l=s.a-n.a,c=((r*l===-1?r:(r+l)/(1+r*l))+1)/2;o=1-c,s.r=255&c*s.r+o*n.r+.5,s.g=255&c*s.g+o*n.g+.5,s.b=255&c*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=_a(this._rgb,t._rgb,e)),this}clone(){return new i(this.rgb)}alpha(t){return this._rgb.a=St(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=ve(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Ke(this._rgb,2,t),this}darken(t){return Ke(this._rgb,2,-t),this}saturate(t){return Ke(this._rgb,1,t),this}desaturate(t){return Ke(this._rgb,1,-t),this}rotate(t){return ua(this._rgb,t),this}};function dt(){}var tn=(()=>{let i=0;return()=>i++})();function A(i){return i==null}function z(i){if(Array.isArray&&Array.isArray(i))return!0;let t=Object.prototype.toString.call(i);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function T(i){return i!==null&&Object.prototype.toString.call(i)==="[object Object]"}function N(i){return(typeof i=="number"||i instanceof Number)&&isFinite(+i)}function Z(i,t){return N(i)?i:t}function D(i,t){return typeof i>"u"?t:i}var en=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100:+i/t,zi=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100*t:+i;function F(i,t,e){if(i&&typeof i.call=="function")return i.apply(e,t)}function E(i,t,e,s){let n,o,a;if(z(i))if(o=i.length,s)for(n=o-1;n>=0;n--)t.call(e,i[n],n);else for(n=0;ni,x:i=>i.x,y:i=>i.y};function ka(i){let t=i.split("."),e=[],s="";for(let n of t)s+=n,s.endsWith("\\")?s=s.slice(0,-1)+".":(e.push(s),s="");return e}function wa(i){let t=ka(i);return e=>{for(let s of t){if(s==="")break;e=e&&e[s]}return e}}function _t(i,t){return($s[t]||($s[t]=wa(t)))(i)}function ii(i){return i.charAt(0).toUpperCase()+i.slice(1)}var ee=i=>typeof i<"u",bt=i=>typeof i=="function",Bi=(i,t)=>{if(i.size!==t.size)return!1;for(let e of i)if(!t.has(e))return!1;return!0};function nn(i){return i.type==="mouseup"||i.type==="click"||i.type==="contextmenu"}var R=Math.PI,B=2*R,Sa=B+R,Qe=Number.POSITIVE_INFINITY,Pa=R/180,H=R/2,Ft=R/4,Ys=R*2/3,xt=Math.log10,lt=Math.sign;function ie(i,t,e){return Math.abs(i-t)n-o).pop(),t}function Da(i){return typeof i=="symbol"||typeof i=="object"&&i!==null&&!(Symbol.toPrimitive in i||"toString"in i||"valueOf"in i)}function Vt(i){return!Da(i)&&!isNaN(parseFloat(i))&&isFinite(i)}function an(i,t){let e=Math.round(i);return e-t<=i&&e+t>=i}function Wi(i,t,e){let s,n,o;for(s=0,n=i.length;sl&&c=Math.min(t,e)-s&&i<=Math.max(t,e)+s}function ni(i,t,e){e=e||(a=>i[a]1;)o=n+s>>1,e(o)?n=o:s=o;return{lo:n,hi:s}}var ct=(i,t,e,s)=>ni(i,e,s?n=>{let o=i[n][t];return oi[n][t]ni(i,e,s=>i[s][t]>=e);function cn(i,t,e){let s=0,n=i.length;for(;ss&&i[n-1]>e;)n--;return s>0||n{let s="_onData"+ii(e),n=i[e];Object.defineProperty(i,e,{configurable:!0,enumerable:!1,value(...o){let a=n.apply(this,o);return i._chartjs.listeners.forEach(r=>{typeof r[s]=="function"&&r[s](...o)}),a}})})}function ji(i,t){let e=i._chartjs;if(!e)return;let s=e.listeners,n=s.indexOf(t);n!==-1&&s.splice(n,1),!(s.length>0)&&(hn.forEach(o=>{delete i[o]}),delete i._chartjs)}function $i(i){let t=new Set(i);return t.size===i.length?i:Array.from(t)}var Yi=(function(){return typeof window>"u"?function(i){return i()}:window.requestAnimationFrame})();function Ui(i,t){let e=[],s=!1;return function(...n){e=n,s||(s=!0,Yi.call(window,()=>{s=!1,i.apply(t,e)}))}}function un(i,t){let e;return function(...s){return t?(clearTimeout(e),e=setTimeout(i,t,s)):i.apply(this,s),t}}var oi=i=>i==="start"?"left":i==="end"?"right":"center",K=(i,t,e)=>i==="start"?t:i==="end"?e:(t+e)/2,fn=(i,t,e,s)=>i===(s?"left":"right")?e:i==="center"?(t+e)/2:t;function Xi(i,t,e){let s=t.length,n=0,o=s;if(i._sorted){let{iScale:a,vScale:r,_parsed:l}=i,c=i.dataset&&i.dataset.options?i.dataset.options.spanGaps:null,h=a.axis,{min:d,max:u,minDefined:f,maxDefined:g}=a.getUserBounds();if(f){if(n=Math.min(ct(l,h,d).lo,e?s:ct(t,h,a.getPixelForValue(d)).lo),c){let p=l.slice(0,n+1).reverse().findIndex(m=>!A(m[r.axis]));n-=Math.max(0,p)}n=Y(n,0,s-1)}if(g){let p=Math.max(ct(l,a.axis,u,!0).hi+1,e?0:ct(t,h,a.getPixelForValue(u),!0).hi+1);if(c){let m=l.slice(p-1).findIndex(b=>!A(b[r.axis]));p+=Math.max(0,m)}o=Y(p,n,s)-n}else o=s-n}return{start:n,count:o}}function Ki(i){let{xScale:t,yScale:e,_scaleRanges:s}=i,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!s)return i._scaleRanges=n,!0;let o=s.xmin!==t.min||s.xmax!==t.max||s.ymin!==e.min||s.ymax!==e.max;return Object.assign(s,n),o}var qe=i=>i===0||i===1,Us=(i,t,e)=>-(Math.pow(2,10*(i-=1))*Math.sin((i-t)*B/e)),Xs=(i,t,e)=>Math.pow(2,-10*i)*Math.sin((i-t)*B/e)+1,Jt={linear:i=>i,easeInQuad:i=>i*i,easeOutQuad:i=>-i*(i-2),easeInOutQuad:i=>(i/=.5)<1?.5*i*i:-.5*(--i*(i-2)-1),easeInCubic:i=>i*i*i,easeOutCubic:i=>(i-=1)*i*i+1,easeInOutCubic:i=>(i/=.5)<1?.5*i*i*i:.5*((i-=2)*i*i+2),easeInQuart:i=>i*i*i*i,easeOutQuart:i=>-((i-=1)*i*i*i-1),easeInOutQuart:i=>(i/=.5)<1?.5*i*i*i*i:-.5*((i-=2)*i*i*i-2),easeInQuint:i=>i*i*i*i*i,easeOutQuint:i=>(i-=1)*i*i*i*i+1,easeInOutQuint:i=>(i/=.5)<1?.5*i*i*i*i*i:.5*((i-=2)*i*i*i*i+2),easeInSine:i=>-Math.cos(i*H)+1,easeOutSine:i=>Math.sin(i*H),easeInOutSine:i=>-.5*(Math.cos(R*i)-1),easeInExpo:i=>i===0?0:Math.pow(2,10*(i-1)),easeOutExpo:i=>i===1?1:-Math.pow(2,-10*i)+1,easeInOutExpo:i=>qe(i)?i:i<.5?.5*Math.pow(2,10*(i*2-1)):.5*(-Math.pow(2,-10*(i*2-1))+2),easeInCirc:i=>i>=1?i:-(Math.sqrt(1-i*i)-1),easeOutCirc:i=>Math.sqrt(1-(i-=1)*i),easeInOutCirc:i=>(i/=.5)<1?-.5*(Math.sqrt(1-i*i)-1):.5*(Math.sqrt(1-(i-=2)*i)+1),easeInElastic:i=>qe(i)?i:Us(i,.075,.3),easeOutElastic:i=>qe(i)?i:Xs(i,.075,.3),easeInOutElastic(i){return qe(i)?i:i<.5?.5*Us(i*2,.1125,.45):.5+.5*Xs(i*2-1,.1125,.45)},easeInBack(i){return i*i*((1.70158+1)*i-1.70158)},easeOutBack(i){return(i-=1)*i*((1.70158+1)*i+1.70158)+1},easeInOutBack(i){let t=1.70158;return(i/=.5)<1?.5*(i*i*(((t*=1.525)+1)*i-t)):.5*((i-=2)*i*(((t*=1.525)+1)*i+t)+2)},easeInBounce:i=>1-Jt.easeOutBounce(1-i),easeOutBounce(i){return i<1/2.75?7.5625*i*i:i<2/2.75?7.5625*(i-=1.5/2.75)*i+.75:i<2.5/2.75?7.5625*(i-=2.25/2.75)*i+.9375:7.5625*(i-=2.625/2.75)*i+.984375},easeInOutBounce:i=>i<.5?Jt.easeInBounce(i*2)*.5:Jt.easeOutBounce(i*2-1)*.5+.5};function qi(i){if(i&&typeof i=="object"){let t=i.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function Gi(i){return qi(i)?i:new ye(i)}function Ei(i){return qi(i)?i:new ye(i).saturate(.5).darken(.1).hexString()}var Ca=["x","y","borderWidth","radius","tension"],Aa=["color","borderColor","backgroundColor"];function Ta(i){i.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),i.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>t!=="onProgress"&&t!=="onComplete"&&t!=="fn"}),i.set("animations",{colors:{type:"color",properties:Aa},numbers:{type:"number",properties:Ca}}),i.describe("animations",{_fallback:"animation"}),i.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>t|0}}}})}function La(i){i.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Ks=new Map;function Ra(i,t){t=t||{};let e=i+JSON.stringify(t),s=Ks.get(e);return s||(s=new Intl.NumberFormat(i,t),Ks.set(e,s)),s}function ne(i,t,e){return Ra(t,e).format(i)}var gn={values(i){return z(i)?i:""+i},numeric(i,t,e){if(i===0)return"0";let s=this.chart.options.locale,n,o=i;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),o=Ea(i,e)}let a=xt(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(i,s,l)},logarithmic(i,t,e){if(i===0)return"0";let s=e[t].significand||i/Math.pow(10,Math.floor(xt(i)));return[1,2,3,5,10,15].includes(s)||t>.8*e.length?gn.numeric.call(this,i,t,e):""}};function Ea(i,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&i!==Math.floor(i)&&(e=i-Math.floor(i)),e}var Se={formatters:gn};function Ia(i){i.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Se.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),i.route("scale.ticks","color","","color"),i.route("scale.grid","color","","borderColor"),i.route("scale.border","color","","borderColor"),i.route("scale.title","color","","color"),i.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&t!=="callback"&&t!=="parser",_indexable:t=>t!=="borderDash"&&t!=="tickBorderDash"&&t!=="dash"}),i.describe("scales",{_fallback:"scale"}),i.describe("scale.ticks",{_scriptable:t=>t!=="backdropPadding"&&t!=="callback",_indexable:t=>t!=="backdropPadding"})}var Ot=Object.create(null),ai=Object.create(null);function Me(i,t){if(!t)return i;let e=t.split(".");for(let s=0,n=e.length;ss.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(s,n)=>Ei(n.backgroundColor),this.hoverBorderColor=(s,n)=>Ei(n.borderColor),this.hoverColor=(s,n)=>Ei(n.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Ii(this,t,e)}get(t){return Me(this,t)}describe(t,e){return Ii(ai,t,e)}override(t,e){return Ii(Ot,t,e)}route(t,e,s,n){let o=Me(this,t),a=Me(this,s),r="_"+e;Object.defineProperties(o,{[r]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[r],c=a[n];return T(l)?Object.assign({},c,l):D(l,c)},set(l){this[r]=l}}})}apply(t){t.forEach(e=>e(this))}},V=new Fi({_scriptable:i=>!i.startsWith("on"),_indexable:i=>i!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[Ta,La,Ia]);function Fa(i){return!i||A(i.size)||A(i.family)?null:(i.style?i.style+" ":"")+(i.weight?i.weight+" ":"")+i.size+"px "+i.family}function ke(i,t,e,s,n){let o=t[n];return o||(o=t[n]=i.measureText(n).width,e.push(n)),o>s&&(s=o),s}function pn(i,t,e,s){s=s||{};let n=s.data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==t&&(n=s.data={},o=s.garbageCollect=[],s.font=t),i.save(),i.font=t;let a=0,r=e.length,l,c,h,d,u;for(l=0;le.length){for(l=0;l0&&i.stroke()}}function ht(i,t,e){return e=e||.5,!t||i&&i.x>t.left-e&&i.xt.top-e&&i.y0&&o.strokeColor!=="",l,c;for(i.save(),i.font=n.string,za(i,o),l=0;l+i||0;function li(i,t){let e={},s=T(t),n=s?Object.keys(t):t,o=T(i)?s?a=>D(i[a],i[t[a]]):a=>i[a]:()=>i;for(let a of n)e[a]=ja(o(a));return e}function Qi(i){return li(i,{top:"y",right:"x",bottom:"y",left:"x"})}function Tt(i){return li(i,["topLeft","topRight","bottomLeft","bottomRight"])}function q(i){let t=Qi(i);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function $(i,t){i=i||{},t=t||V.font;let e=D(i.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let s=D(i.style,t.style);s&&!(""+s).match(Na)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);let n={family:D(i.family,t.family),lineHeight:Ha(D(i.lineHeight,t.lineHeight),e),size:e,style:s,weight:D(i.weight,t.weight),string:""};return n.string=Fa(n),n}function ae(i,t,e,s){let n=!0,o,a,r;for(o=0,a=i.length;oe&&r===0?0:r+l;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function yt(i,t){return Object.assign(Object.create(i),t)}function ci(i,t=[""],e,s,n=()=>i[0]){let o=e||i;typeof s>"u"&&(s=vn("_fallback",i));let a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:i,_rootScopes:o,_fallback:s,_getTarget:n,override:r=>ci([r,...i],t,o,s)};return new Proxy(a,{deleteProperty(r,l){return delete r[l],delete r._keys,delete i[0][l],!0},get(r,l){return _n(r,l,()=>Ja(l,t,i,r))},getOwnPropertyDescriptor(r,l){return Reflect.getOwnPropertyDescriptor(r._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(i[0])},has(r,l){return Gs(r).includes(l)},ownKeys(r){return Gs(r)},set(r,l,c){let h=r._storage||(r._storage=n());return r[l]=h[l]=c,delete r._keys,!0}})}function Bt(i,t,e,s){let n={_cacheable:!1,_proxy:i,_context:t,_subProxy:e,_stack:new Set,_descriptors:ts(i,s),setContext:o=>Bt(i,o,e,s),override:o=>Bt(i.override(o),t,e,s)};return new Proxy(n,{deleteProperty(o,a){return delete o[a],delete i[a],!0},get(o,a,r){return _n(o,a,()=>Ya(o,a,r))},getOwnPropertyDescriptor(o,a){return o._descriptors.allKeys?Reflect.has(i,a)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(i,a)},getPrototypeOf(){return Reflect.getPrototypeOf(i)},has(o,a){return Reflect.has(i,a)},ownKeys(){return Reflect.ownKeys(i)},set(o,a,r){return i[a]=r,delete o[a],!0}})}function ts(i,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:s=t.indexable,_allKeys:n=t.allKeys}=i;return{allKeys:n,scriptable:e,indexable:s,isScriptable:bt(e)?e:()=>e,isIndexable:bt(s)?s:()=>s}}var $a=(i,t)=>i?i+ii(t):t,es=(i,t)=>T(t)&&i!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function _n(i,t,e){if(Object.prototype.hasOwnProperty.call(i,t)||t==="constructor")return i[t];let s=e();return i[t]=s,s}function Ya(i,t,e){let{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=i,r=s[t];return bt(r)&&a.isScriptable(t)&&(r=Ua(t,r,i,e)),z(r)&&r.length&&(r=Xa(t,r,i,a.isIndexable)),es(t,r)&&(r=Bt(r,n,o&&o[t],a)),r}function Ua(i,t,e,s){let{_proxy:n,_context:o,_subProxy:a,_stack:r}=e;if(r.has(i))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+i);r.add(i);let l=t(o,a||s);return r.delete(i),es(i,l)&&(l=is(n._scopes,n,i,l)),l}function Xa(i,t,e,s){let{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=e;if(typeof o.index<"u"&&s(i))return t[o.index%t.length];if(T(t[0])){let l=t,c=n._scopes.filter(h=>h!==l);t=[];for(let h of l){let d=is(c,n,i,h);t.push(Bt(d,o,a&&a[i],r))}}return t}function yn(i,t,e){return bt(i)?i(t,e):i}var Ka=(i,t)=>i===!0?t:typeof i=="string"?_t(t,i):void 0;function qa(i,t,e,s,n){for(let o of t){let a=Ka(e,o);if(a){i.add(a);let r=yn(a._fallback,e,n);if(typeof r<"u"&&r!==e&&r!==s)return r}else if(a===!1&&typeof s<"u"&&e!==s)return null}return!1}function is(i,t,e,s){let n=t._rootScopes,o=yn(t._fallback,e,s),a=[...i,...n],r=new Set;r.add(s);let l=qs(r,a,e,o||e,s);return l===null||typeof o<"u"&&o!==e&&(l=qs(r,a,o,l,s),l===null)?!1:ci(Array.from(r),[""],n,o,()=>Ga(t,e,s))}function qs(i,t,e,s,n){for(;e;)e=qa(i,t,e,s,n);return e}function Ga(i,t,e){let s=i._getTarget();t in s||(s[t]={});let n=s[t];return z(n)&&T(e)?e:n||{}}function Ja(i,t,e,s){let n;for(let o of t)if(n=vn($a(o,i),e),typeof n<"u")return es(i,n)?is(e,s,i,n):n}function vn(i,t){for(let e of t){if(!e)continue;let s=e[i];if(typeof s<"u")return s}}function Gs(i){let t=i._keys;return t||(t=i._keys=Za(i._scopes)),t}function Za(i){let t=new Set;for(let e of i)for(let s of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(s);return Array.from(t)}function ss(i,t,e,s){let{iScale:n}=i,{key:o="r"}=this._parsing,a=new Array(s),r,l,c,h;for(r=0,l=s;rti==="x"?"y":"x";function tr(i,t,e,s){let n=i.skip?t:i,o=t,a=e.skip?t:e,r=ti(o,n),l=ti(a,o),c=r/(r+l),h=l/(r+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let d=s*c,u=s*h;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function er(i,t,e){let s=i.length,n,o,a,r,l,c=Qt(i,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")sr(i,n);else{let c=s?i[i.length-1]:i[0];for(o=0,a=i.length;oi.ownerDocument.defaultView.getComputedStyle(i,null);function or(i,t){return ui(i).getPropertyValue(t)}var ar=["top","right","bottom","left"];function zt(i,t,e){let s={};e=e?"-"+e:"";for(let n=0;n<4;n++){let o=ar[n];s[o]=parseFloat(i[t+"-"+o+e])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}var rr=(i,t,e)=>(i>0||t>0)&&(!e||!e.shadowRoot);function lr(i,t){let e=i.touches,s=e&&e.length?e[0]:i,{offsetX:n,offsetY:o}=s,a=!1,r,l;if(rr(n,o,i.target))r=n,l=o;else{let c=t.getBoundingClientRect();r=s.clientX-c.left,l=s.clientY-c.top,a=!0}return{x:r,y:l,box:a}}function Lt(i,t){if("native"in i)return i;let{canvas:e,currentDevicePixelRatio:s}=t,n=ui(e),o=n.boxSizing==="border-box",a=zt(n,"padding"),r=zt(n,"border","width"),{x:l,y:c,box:h}=lr(i,e),d=a.left+(h&&r.left),u=a.top+(h&&r.top),{width:f,height:g}=t;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*e.width/s),y:Math.round((c-u)/g*e.height/s)}}function cr(i,t,e){let s,n;if(t===void 0||e===void 0){let o=i&&di(i);if(!o)t=i.clientWidth,e=i.clientHeight;else{let a=o.getBoundingClientRect(),r=ui(o),l=zt(r,"border","width"),c=zt(r,"padding");t=a.width-c.width-l.width,e=a.height-c.height-l.height,s=ei(r.maxWidth,o,"clientWidth"),n=ei(r.maxHeight,o,"clientHeight")}}return{width:t,height:e,maxWidth:s||Qe,maxHeight:n||Qe}}var Dt=i=>Math.round(i*10)/10;function wn(i,t,e,s){let n=ui(i),o=zt(n,"margin"),a=ei(n.maxWidth,i,"clientWidth")||Qe,r=ei(n.maxHeight,i,"clientHeight")||Qe,l=cr(i,t,e),{width:c,height:h}=l;if(n.boxSizing==="content-box"){let u=zt(n,"border","width"),f=zt(n,"padding");c-=f.width+u.width,h-=f.height+u.height}return c=Math.max(0,c-o.width),h=Math.max(0,s?c/s:h-o.height),c=Dt(Math.min(c,a,l.maxWidth)),h=Dt(Math.min(h,r,l.maxHeight)),c&&!h&&(h=Dt(c/2)),(t!==void 0||e!==void 0)&&s&&l.height&&h>l.height&&(h=l.height,c=Dt(Math.floor(h*s))),{width:c,height:h}}function ns(i,t,e){let s=t||1,n=Dt(i.height*s),o=Dt(i.width*s);i.height=Dt(i.height),i.width=Dt(i.width);let a=i.canvas;return a.style&&(e||!a.style.height&&!a.style.width)&&(a.style.height=`${i.height}px`,a.style.width=`${i.width}px`),i.currentDevicePixelRatio!==s||a.height!==n||a.width!==o?(i.currentDevicePixelRatio=s,a.height=n,a.width=o,i.ctx.setTransform(s,0,0,s,0,0),!0):!1}var Sn=(function(){let i=!1;try{let t={get passive(){return i=!0,!1}};hi()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch{}return i})();function os(i,t){let e=or(i,t),s=e&&e.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function Pt(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:i.y+e*(t.y-i.y)}}function Pn(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:s==="middle"?e<.5?i.y:t.y:s==="after"?e<1?i.y:t.y:e>0?t.y:i.y}}function Dn(i,t,e,s){let n={x:i.cp2x,y:i.cp2y},o={x:t.cp1x,y:t.cp1y},a=Pt(i,n,e),r=Pt(n,o,e),l=Pt(o,t,e),c=Pt(a,r,e),h=Pt(r,l,e);return Pt(c,h,e)}var hr=function(i,t){return{x(e){return i+i+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,s){return e-s},leftForLtr(e,s){return e-s}}},dr=function(){return{x(i){return i},setWidth(i){},textAlign(i){return i},xPlus(i,t){return i+t},leftForLtr(i,t){return i}}};function Wt(i,t,e){return i?hr(t,e):dr()}function as(i,t){let e,s;(t==="ltr"||t==="rtl")&&(e=i.canvas.style,s=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),i.prevTextDirection=s)}function rs(i,t){t!==void 0&&(delete i.prevTextDirection,i.canvas.style.setProperty("direction",t[0],t[1]))}function On(i){return i==="angle"?{between:se,compare:Oa,normalize:X}:{between:ut,compare:(t,e)=>t-e,normalize:t=>t}}function Js({start:i,end:t,count:e,loop:s,style:n}){return{start:i%e,end:t%e,loop:s&&(t-i+1)%e===0,style:n}}function ur(i,t,e){let{property:s,start:n,end:o}=e,{between:a,normalize:r}=On(s),l=t.length,{start:c,end:h,loop:d}=i,u,f;if(d){for(c+=l,h+=l,u=0,f=l;ul(n,v,b)&&r(n,v)!==0,_=()=>r(o,b)===0||l(o,v,b),k=()=>p||y(),w=()=>!p||_();for(let S=h,P=h;S<=d;++S)x=t[S%a],!x.skip&&(b=c(x[s]),b!==v&&(p=l(b,n,o),m===null&&k()&&(m=r(b,n)===0?S:P),m!==null&&w()&&(g.push(Js({start:m,end:S,loop:u,count:a,style:f})),m=null),P=S,v=b));return m!==null&&g.push(Js({start:m,end:d,loop:u,count:a,style:f})),g}function cs(i,t){let e=[],s=i.segments;for(let n=0;nn&&i[o%t].skip;)o--;return o%=t,{start:n,end:o}}function gr(i,t,e,s){let n=i.length,o=[],a=t,r=i[t],l;for(l=t+1;l<=e;++l){let c=i[l%n];c.skip||c.stop?r.skip||(s=!1,o.push({start:t%n,end:(l-1)%n,loop:s}),t=a=c.stop?l:null):(a=l,r.skip&&(t=l)),r=c}return a!==null&&o.push({start:t%n,end:a%n,loop:s}),o}function Cn(i,t){let e=i.points,s=i.options.spanGaps,n=e.length;if(!n)return[];let o=!!i._loop,{start:a,end:r}=fr(e,n,o,s);if(s===!0)return Zs(i,[{start:a,end:r,loop:o}],e,t);let l=rr({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Yi.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,n)=>{if(!s.running||!s.items.length)return;let o=s.items,a=o.length-1,r=!1,l;for(;a>=0;--a)l=o[a],l._active?(l._total>s.duration&&(s.duration=l._total),l.tick(t),r=!0):(o[a]=o[o.length-1],o.pop());r&&(n.draw(),this._notify(n,s,t,"progress")),o.length||(s.running=!1,this._notify(n,s,t,"complete"),s.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((s,n)=>Math.max(s,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let s=e.items,n=s.length-1;for(;n>=0;--n)s[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},vt=new Ms,An="transparent",xr={boolean(i,t,e){return e>.5?t:i},color(i,t,e){let s=Gi(i||An),n=s.valid&&Gi(t||An);return n&&n.valid?n.mix(s,e).hexString():t},number(i,t,e){return i+(t-i)*e}},ks=class{constructor(t,e,s,n){let o=e[s];n=ae([t.to,n,o,t.from]);let a=ae([t.from,o,n]);this._active=!0,this._fn=t.fn||xr[t.type||typeof a],this._easing=Jt[t.easing]||Jt.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);let n=this._target[this._prop],o=s-this._start,a=this._duration-o;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=ae([t.to,e,n,t.from]),this._from=ae([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,s=this._duration,n=this._prop,o=this._from,a=this._loop,r=this._to,l;if(this._active=o!==r&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,r,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){let e=t?"res":"rej",s=this._promises||[];for(let n=0;n{let o=t[n];if(!T(o))return;let a={};for(let r of e)a[r]=o[r];(z(o.properties)&&o.properties||[n]).forEach(r=>{(r===n||!s.has(r))&&s.set(r,a)})})}_animateOptions(t,e){let s=e.options,n=yr(t,s);if(!n)return[];let o=this._createAnimations(n,s);return s.$shared&&_r(t.options.$animations,s).then(()=>{t.options=s},()=>{}),o}_createAnimations(t,e){let s=this._properties,n=[],o=t.$animations||(t.$animations={}),a=Object.keys(e),r=Date.now(),l;for(l=a.length-1;l>=0;--l){let c=a[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}let h=e[c],d=o[c],u=s.get(c);if(d)if(u&&d.active()){d.update(u,h,r);continue}else d.cancel();if(!u||!u.duration){t[c]=h;continue}o[c]=d=new ks(u,t,c,h),n.push(d)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let s=this._createAnimations(t,e);if(s.length)return vt.add(this._chart,s),!0}};function _r(i,t){let e=[],s=Object.keys(t);for(let n=0;n0||!e&&o<0)return n.index}return null}function En(i,t){let{chart:e,_cachedMeta:s}=i,n=e._stacks||(e._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,c=a.axis,h=wr(o,a,s),d=t.length,u;for(let f=0;fe[s].axis===t).shift()}function Dr(i,t){return yt(i,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function Or(i,t,e){return yt(i,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function Oe(i,t){let e=i.controller.index,s=i.vScale&&i.vScale.axis;if(s){t=t||i._parsed;for(let n of t){let o=n._stacks;if(!o||o[s]===void 0||o[s][e]===void 0)return;delete o[s][e],o[s]._visualValues!==void 0&&o[s]._visualValues[e]!==void 0&&delete o[s]._visualValues[e]}}}var fs=i=>i==="reset"||i==="none",In=(i,t)=>t?i:Object.assign({},i),Cr=(i,t,e)=>i&&!t.hidden&&t._stacked&&{keys:Ao(e,!0),values:null},it=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=ds(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Oe(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,s=this.getDataset(),n=(d,u,f,g)=>d==="x"?u:d==="r"?g:f,o=e.xAxisID=D(s.xAxisID,us(t,"x")),a=e.yAxisID=D(s.yAxisID,us(t,"y")),r=e.rAxisID=D(s.rAxisID,us(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,o,a,r),h=e.vAxisID=n(l,a,o,r);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(r),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&ji(this._data,this),t._stacked&&Oe(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(T(e)){let n=this._cachedMeta;this._data=kr(e,n)}else if(s!==e){if(s){ji(s,this);let n=this._cachedMeta;Oe(n),n._parsed=[]}e&&Object.isExtensible(e)&&dn(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,s=this.getDataset(),n=!1;this._dataCheck();let o=e._stacked;e._stacked=ds(e.vScale,e),e.stack!==s.stack&&(n=!0,Oe(e),e.stack=s.stack),this._resyncElements(t),(n||o!==e._stacked)&&(En(this,e._parsed),e._stacked=ds(e.vScale,e))}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:s,_data:n}=this,{iScale:o,_stacked:a}=s,r=o.axis,l=t===0&&e===n.length?!0:s._sorted,c=t>0&&s._parsed[t-1],h,d,u;if(this._parsing===!1)s._parsed=n,s._sorted=!0,u=n;else{z(n[t])?u=this.parseArrayData(s,n,t,e):T(n[t])?u=this.parseObjectData(s,n,t,e):u=this.parsePrimitiveData(s,n,t,e);let f=()=>d[r]===null||c&&d[r]p||d=0;--u)if(!g()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,s=[],n,o,a;for(n=0,o=e.length;n=0&&tthis.getContext(s,n,e),p=c.resolveNamedOptions(u,f,g,d);return p.$shared&&(p.$shared=l,o[a]=Object.freeze(In(p,l))),p}_resolveAnimations(t,e,s){let n=this.chart,o=this._cachedDataOpts,a=`animation-${e}`,r=o[a];if(r)return r;let l;if(n.options.animation!==!1){let h=this.chart.config,d=h.datasetAnimationScopeKeys(this._type,e),u=h.getOptionScopes(this.getDataset(),d);l=h.createResolver(u,this.getContext(t,s,e))}let c=new vi(n,l&&l.animations);return l&&l._cacheable&&(o[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||fs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let s=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(s),a=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,s),{sharedOptions:o,includeOptions:a}}updateElement(t,e,s,n){fs(n)?Object.assign(t,s):this._resolveAnimations(e,n).update(t,s)}updateSharedOptions(t,e,s){t&&!fs(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,n){t.active=n;let o=this.getStyle(e,n);this._resolveAnimations(e,s,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,s=this._cachedMeta.data;for(let[r,l,c]of this._syncList)this[r](l,c);this._syncList=[];let n=s.length,o=e.length,a=Math.min(o,n);a&&this.parse(0,a),o>n?this._insertElements(n,o-n,t):o{for(c.length+=e,r=c.length-1;r>=a;r--)c[r]=c[r-e]};for(l(o),r=t;rn-o))}return i._cache.$bar}function Tr(i){let t=i.iScale,e=Ar(t,i.type),s=t._length,n,o,a,r,l=()=>{a===32767||a===-32768||(ee(r)&&(s=Math.min(s,Math.abs(a-r)||s)),r=a)};for(n=0,o=e.length;n0?n[i-1]:null,r=iMath.abs(r)&&(l=r,c=a),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:o,min:a,max:r}}function To(i,t,e,s){return z(i)?Er(i,t,e,s):t[e.axis]=e.parse(i,s),t}function Fn(i,t,e,s){let n=i.iScale,o=i.vScale,a=n.getLabels(),r=n===o,l=[],c,h,d,u;for(c=e,h=e+s;c=e?1:-1)}function Fr(i){let t,e,s,n,o;return i.horizontal?(t=i.base>i.x,e="left",s="right"):(t=i.baseh.controller.options.grouped),o=s.options.stacked,a=[],r=this._cachedMeta.controller.getParsed(e),l=r&&r[s.axis],c=h=>{let d=h._parsed.find(f=>f[s.axis]===l),u=d&&d[h.vScale.axis];if(A(u)||isNaN(u))return!0};for(let h of n)if(!(e!==void 0&&c(h))&&((o===!1||a.indexOf(h.stack)===-1||o===void 0&&h.stack===void 0)&&a.push(h.stack),h.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){let t={},e=this.getFirstScaleIdForIndexAxis();for(let s of this.chart.data.datasets)t[D(this.chart.options.indexAxis==="x"?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){let n=this._getStacks(t,s),o=e!==void 0?n.indexOf(e):-1;return o===-1?n.length-1:o}_getRuler(){let t=this.options,e=this._cachedMeta,s=e.iScale,n=[],o,a;for(o=0,a=e.data.length;o=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:n,yScale:o}=e,a=this.getParsed(t),r=n.getLabelForValue(a.x),l=o.getLabelForValue(a.y),c=a._custom;return{label:s[t]||"",value:"("+r+", "+l+(c?", "+c:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,n){let o=n==="reset",{iScale:a,vScale:r}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=a.axis,d=r.axis;for(let u=e;use(v,r,l,!0)?1:Math.max(y,y*e,_,_*e),g=(v,y,_)=>se(v,r,l,!0)?-1:Math.min(y,y*e,_,_*e),p=f(0,c,d),m=f(H,h,u),b=g(R,c,d),x=g(R+H,h,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}var kt=class extends it{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let s=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=s;else{let o=l=>+s[l];if(T(s[t])){let{key:l="value"}=this._parsing;o=c=>+_t(s[c],l)}let a,r;for(a=t,r=t+e;a0&&!isNaN(t)?B*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=ne(e._parsed[t],s.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){let e=0,s=this.chart,n,o,a,r,l;if(!t){for(n=0,o=s.data.datasets.length;nt!=="spacing",_indexable:t=>t!=="spacing"&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),M(kt,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data,{labels:{pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((l,c)=>{let d=t.getDatasetMeta(0).controller.getStyle(c);return{text:l,fillStyle:d.backgroundColor,fontColor:o,hidden:!t.getDataVisibility(c),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:n,pointStyle:s,borderRadius:a&&(r||d.borderRadius),index:c}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});var he=class extends it{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:s,data:n=[],_dataset:o}=e,a=this.chart._animationsDisabled,{start:r,count:l}=Xi(e,n,a);this._drawStart=r,this._drawCount=l,Ki(e)&&(r=0,l=n.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!o._decimated,s.points=n;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:c},t),this.updateElements(n,r,l,t)}updateElements(t,e,s,n){let o=n==="reset",{iScale:a,vScale:r,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=Vt(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||n==="none",x=e+s,v=t.length,y=e>0&&this.getParsed(e-1);for(let _=0;_=x){w.skip=!0;continue}let S=this.getParsed(_),P=A(S[f]),O=w[u]=a.getPixelForValue(S[u],_),C=w[f]=o||P?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,S,l):S[f],_);w.skip=isNaN(O)||isNaN(C)||P,w.stop=_>0&&Math.abs(S[u]-y[u])>m,p&&(w.parsed=S,w.raw=c.data[_]),d&&(w.options=h||this.resolveDataElementOptions(_,k.active?"active":n)),b||this.updateElement(k,_,w,n),y=S}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return s;let o=n[0].size(this.resolveDataElementOptions(0)),a=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(s,o,a)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};M(he,"id","line"),M(he,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),M(he,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});var Yt=class extends it{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=ne(e._parsed[t].r,s.options.locale);return{label:n[t]||"",value:o}}parseObjectData(t,e,s,n){return ss.bind(this)(t,e,s,n)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((s,n)=>{let o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(oe.max&&(e.max=o))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,s=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),a=Math.max(s.cutoutPercentage?o/100*s.cutoutPercentage:1,0),r=(o-a)/t.getVisibleDatasetCount();this.outerRadius=o-r*this.index,this.innerRadius=this.outerRadius-r}updateElements(t,e,s,n){let o=n==="reset",a=this.chart,l=a.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*R,f=u,g,p=360/this.countVisibleElements();for(g=0;g{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?ot(this.resolveDataElementOptions(t,e).angle||s):0}};M(Yt,"id","polarArea"),M(Yt,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),M(Yt,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data;if(e.labels.length&&e.datasets.length){let{labels:{pointStyle:s,color:n}}=t.legend.options;return e.labels.map((o,a)=>{let l=t.getDatasetMeta(0).controller.getStyle(a);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:n,lineWidth:l.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(a),index:a}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var Re=class extends kt{};M(Re,"id","pie"),M(Re,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});var de=class extends it{getLabelAndValue(t){let e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,n){return ss.bind(this)(t,e,s,n)}update(t){let e=this._cachedMeta,s=e.dataset,n=e.data||[],o=e.iScale.getLabels();if(s.points=n,t!=="resize"){let a=this.resolveDatasetElementOptions(t);this.options.showLine||(a.borderWidth=0);let r={_loop:!0,_fullLoop:o.length===n.length,options:a};this.updateElement(s,void 0,r,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,s,n){let o=this._cachedMeta.rScale,a=n==="reset";for(let r=e;r0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(k[f]-v[f])>b,m&&(w.parsed=k,w.raw=c.data[y]),u&&(w.options=d||this.resolveDataElementOptions(y,_.active?"active":n)),x||this.updateElement(_,y,w,n),v=k}this.updateSharedOptions(d,n,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let r=0;for(let l=e.length-1;l>=0;--l)r=Math.max(r,e[l].size(this.resolveDataElementOptions(l))/2);return r>0&&r}let s=t.dataset,n=s.options&&s.options.borderWidth||0;if(!e.length)return n;let o=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,o,a)/2}};M(ue,"id","scatter"),M(ue,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),M(ue,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});var Nr=Object.freeze({__proto__:null,BarController:le,BubbleController:ce,DoughnutController:kt,LineController:he,PieController:Re,PolarAreaController:Yt,RadarController:de,ScatterController:ue});function Nt(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var ws=class i{constructor(t){M(this,"options");this.options=t||{}}static override(t){Object.assign(i.prototype,t)}init(){}formats(){return Nt()}parse(){return Nt()}format(){return Nt()}add(){return Nt()}diff(){return Nt()}startOf(){return Nt()}endOf(){return Nt()}},Hr={_date:ws};function jr(i,t,e,s){let{controller:n,data:o,_sorted:a}=i,r=n._cachedMeta.iScale,l=i.dataset&&i.dataset.options?i.dataset.options.spanGaps:null;if(r&&t===r.axis&&t!=="r"&&a&&o.length){let c=r._reversePixels?ln:ct;if(s){if(n._sharedOptions){let h=o[0],d=typeof h.getRange=="function"&&h.getRange(t);if(d){let u=c(o,t,e-d),f=c(o,t,e+d);return{lo:u.lo,hi:f.hi}}}}else{let h=c(o,t,e);if(l){let{vScale:d}=n._cachedMeta,{_parsed:u}=i,f=u.slice(0,h.lo+1).reverse().findIndex(p=>!A(p[d.axis]));h.lo-=Math.max(0,f);let g=u.slice(h.hi).findIndex(p=>!A(p[d.axis]));h.hi+=Math.max(0,g)}return h}}return{lo:0,hi:o.length-1}}function $e(i,t,e,s,n){let o=i.getSortedVisibleDatasetMetas(),a=e[t];for(let r=0,l=o.length;r{l[a]&&l[a](t[e],n)&&(o.push({element:l,datasetIndex:c,index:h}),r=r||l.inRange(t.x,t.y,n))}),s&&!r?[]:o}var Xr={evaluateInteractionItems:$e,modes:{index(i,t,e,s){let n=Lt(t,i),o=e.axis||"x",a=e.includeInvisible||!1,r=e.intersect?ps(i,n,o,s,a):ms(i,n,o,!1,s,a),l=[];return r.length?(i.getSortedVisibleDatasetMetas().forEach(c=>{let h=r[0].index,d=c.data[h];d&&!d.skip&&l.push({element:d,datasetIndex:c.index,index:h})}),l):[]},dataset(i,t,e,s){let n=Lt(t,i),o=e.axis||"xy",a=e.includeInvisible||!1,r=e.intersect?ps(i,n,o,s,a):ms(i,n,o,!1,s,a);if(r.length>0){let l=r[0].datasetIndex,c=i.getDatasetMeta(l).data;r=[];for(let h=0;he.pos===t)}function Wn(i,t){return i.filter(e=>Lo.indexOf(e.pos)===-1&&e.box.axis===t)}function Ae(i,t){return i.sort((e,s)=>{let n=t?s:e,o=t?e:s;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function Kr(i){let t=[],e,s,n,o,a,r;for(e=0,s=(i||[]).length;ec.box.fullSize),!0),s=Ae(Ce(t,"left"),!0),n=Ae(Ce(t,"right")),o=Ae(Ce(t,"top"),!0),a=Ae(Ce(t,"bottom")),r=Wn(t,"x"),l=Wn(t,"y");return{fullSize:e,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ce(t,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}function Nn(i,t,e,s){return Math.max(i[e],t[e])+Math.max(i[s],t[s])}function Ro(i,t){i.top=Math.max(i.top,t.top),i.left=Math.max(i.left,t.left),i.bottom=Math.max(i.bottom,t.bottom),i.right=Math.max(i.right,t.right)}function Zr(i,t,e,s){let{pos:n,box:o}=e,a=i.maxPadding;if(!T(n)){e.size&&(i[n]-=e.size);let d=s[e.stack]||{size:0,count:1};d.size=Math.max(d.size,e.horizontal?o.height:o.width),e.size=d.size/d.count,i[n]+=e.size}o.getPadding&&Ro(a,o.getPadding());let r=Math.max(0,t.outerWidth-Nn(a,i,"left","right")),l=Math.max(0,t.outerHeight-Nn(a,i,"top","bottom")),c=r!==i.w,h=l!==i.h;return i.w=r,i.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Qr(i){let t=i.maxPadding;function e(s){let n=Math.max(t[s]-i[s],0);return i[s]+=n,n}i.y+=e("top"),i.x+=e("left"),e("right"),e("bottom")}function tl(i,t){let e=t.maxPadding;function s(n){let o={left:0,top:0,right:0,bottom:0};return n.forEach(a=>{o[a]=Math.max(t[a],e[a])}),o}return s(i?["left","right"]:["top","bottom"])}function Ee(i,t,e,s){let n=[],o,a,r,l,c,h;for(o=0,a=i.length,c=0;o{typeof p.beforeLayout=="function"&&p.beforeLayout()});let h=l.reduce((p,m)=>m.box.options&&m.box.options.display===!1?p:p+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},n);Ro(u,q(s));let f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=Gr(l.concat(c),d);Ee(r.fullSize,f,d,g),Ee(l,f,d,g),Ee(c,f,d,g)&&Ee(l,f,d,g),Qr(f),Hn(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,Hn(r.rightAndBottom,f,d,g),i.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},E(r.chartArea,p=>{let m=p.box;Object.assign(m,i.chartArea),m.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}},Mi=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,n){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):s)}}isAttached(t){return!0}updateConfig(t){}},Ss=class extends Mi{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},_i="$chartjs",el={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},jn=i=>i===null||i==="";function il(i,t){let e=i.style,s=i.getAttribute("height"),n=i.getAttribute("width");if(i[_i]={initial:{height:s,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",jn(n)){let o=os(i,"width");o!==void 0&&(i.width=o)}if(jn(s))if(i.style.height==="")i.height=i.width/(t||2);else{let o=os(i,"height");o!==void 0&&(i.height=o)}return i}var Eo=Sn?{passive:!0}:!1;function sl(i,t,e){i&&i.addEventListener(t,e,Eo)}function nl(i,t,e){i&&i.canvas&&i.canvas.removeEventListener(t,e,Eo)}function ol(i,t){let e=el[i.type]||i.type,{x:s,y:n}=Lt(i,t);return{type:e,chart:t,native:i,x:s!==void 0?s:null,y:n!==void 0?n:null}}function ki(i,t){for(let e of i)if(e===t||e.contains(t))return!0}function al(i,t,e){let s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(let r of o)a=a||ki(r.addedNodes,s),a=a&&!ki(r.removedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function rl(i,t,e){let s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(let r of o)a=a||ki(r.removedNodes,s),a=a&&!ki(r.addedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}var Ne=new Map,$n=0;function Io(){let i=window.devicePixelRatio;i!==$n&&($n=i,Ne.forEach((t,e)=>{e.currentDevicePixelRatio!==i&&t()}))}function ll(i,t){Ne.size||window.addEventListener("resize",Io),Ne.set(i,t)}function cl(i){Ne.delete(i),Ne.size||window.removeEventListener("resize",Io)}function hl(i,t,e){let s=i.canvas,n=s&&di(s);if(!n)return;let o=Ui((r,l)=>{let c=n.clientWidth;e(r,l),c{let l=r[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||o(c,h)});return a.observe(n),ll(i,o),a}function bs(i,t,e){e&&e.disconnect(),t==="resize"&&cl(i)}function dl(i,t,e){let s=i.canvas,n=Ui(o=>{i.ctx!==null&&e(ol(o,i))},i);return sl(s,t,n),n}var Ps=class extends Mi{acquireContext(t,e){let s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(il(t,e),s):null}releaseContext(t){let e=t.canvas;if(!e[_i])return!1;let s=e[_i].initial;["height","width"].forEach(o=>{let a=s[o];A(a)?e.removeAttribute(o):e.setAttribute(o,a)});let n=s.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[_i],!0}addEventListener(t,e,s){this.removeEventListener(t,e);let n=t.$proxies||(t.$proxies={}),a={attach:al,detach:rl,resize:hl}[e]||dl;n[e]=a(t,e,s)}removeEventListener(t,e){let s=t.$proxies||(t.$proxies={}),n=s[e];if(!n)return;({attach:bs,detach:bs,resize:bs}[e]||nl)(t,e,n),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,n){return wn(t,e,s,n)}isAttached(t){let e=t&&di(t);return!!(e&&e.isConnected)}};function ul(i){return!hi()||typeof OffscreenCanvas<"u"&&i instanceof OffscreenCanvas?Ss:Ps}var st=class{constructor(){M(this,"x");M(this,"y");M(this,"active",!1);M(this,"options");M(this,"$animations")}tooltipPosition(t){let{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return Vt(this.x)&&Vt(this.y)}getProps(t,e){let s=this.$animations;if(!e||!s)return this;let n={};return t.forEach(o=>{n[o]=s[o]&&s[o].active()?s[o]._to:this[o]}),n}};M(st,"defaults",{}),M(st,"defaultRoutes");function fl(i,t){let e=i.options.ticks,s=gl(i),n=Math.min(e.maxTicksLimit||s,s),o=e.major.enabled?ml(t):[],a=o.length,r=o[0],l=o[a-1],c=[];if(a>n)return bl(t,c,o,a/n),c;let h=pl(o,t,n);if(a>0){let d,u,f=a>1?Math.round((l-r)/(a-1)):null;for(gi(t,c,h,A(f)?0:r-f,r),d=0,u=a-1;dn)return l}return Math.max(n,1)}function ml(i){let t=[],e,s;for(e=0,s=i.length;ei==="left"?"right":i==="right"?"left":i,Yn=(i,t,e)=>t==="top"||t==="left"?i[t]+e:i[t]-e,Un=(i,t)=>Math.min(t||i,i);function Xn(i,t){let e=[],s=i.length/t,n=i.length,o=0;for(;oa+r)))return l}function vl(i,t){E(i,e=>{let s=e.gc,n=s.length/2,o;if(n>t){for(o=0;os?s:e,s=n&&e>s?e:s,{min:Z(e,Z(s,e)),max:Z(s,Z(e,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){F(this.options.beforeUpdate,[this])}update(t,e,s){let{beginAtZero:n,grace:o,ticks:a}=this.options,r=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=xn(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=r=o||s<=1||!this.isHorizontal()){this.labelRotation=n;return}let h=this._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Y(this.chart.width-d,0,this.maxWidth);r=t.offset?this.maxWidth/s:f/(s-1),d+6>r&&(r=f/(s-(t.offset?.5:1)),l=this.maxHeight-Te(t.grid)-e.padding-Kn(t.title,this.chart.options.font),c=Math.sqrt(d*d+u*u),a=si(Math.min(Math.asin(Y((h.highest.height+6)/r,-1,1)),Math.asin(Y(l/c,-1,1))-Math.asin(Y(u/c,-1,1)))),a=Math.max(n,Math.min(o,a))),this.labelRotation=a}afterCalculateLabelRotation(){F(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){F(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:s,title:n,grid:o}}=this,a=this._isVisible(),r=this.isHorizontal();if(a){let l=Kn(n,e.options.font);if(r?(t.width=this.maxWidth,t.height=Te(o)+l):(t.height=this.maxHeight,t.width=Te(o)+l),s.display&&this.ticks.length){let{first:c,last:h,widest:d,highest:u}=this._getLabelSizes(),f=s.padding*2,g=ot(this.labelRotation),p=Math.cos(g),m=Math.sin(g);if(r){let b=s.mirror?0:m*d.width+p*u.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{let b=s.mirror?0:p*d.width+m*u.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,h,m,p)}}this._handleMargins(),r?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,n){let{ticks:{align:o,padding:a},position:r}=this.options,l=this.labelRotation!==0,c=r!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1),u=0,f=0;l?c?(u=n*t.width,f=s*e.height):(u=s*t.height,f=n*e.width):o==="start"?f=e.width:o==="end"?u=t.width:o!=="inner"&&(u=t.width/2,f=e.width/2),this.paddingLeft=Math.max((u-h+a)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-d+a)*this.width/(this.width-d),0)}else{let h=e.height/2,d=t.height/2;o==="start"?(h=0,d=t.height):o==="end"&&(h=e.height,d=0),this.paddingTop=h+a,this.paddingBottom=d+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){F(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,s;for(e=0,s=t.length;e({width:a[P]||0,height:r[P]||0});return{first:S(0),last:S(e-1),widest:S(k),highest:S(w),widths:a,heights:r}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return rn(this._alignToPixels?Ct(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&tr*n?r/s:l/n:l*n0}_computeGridLineItems(t){let e=this.axis,s=this.chart,n=this.options,{grid:o,position:a,border:r}=n,l=o.offset,c=this.isHorizontal(),d=this.ticks.length+(l?1:0),u=Te(o),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(W){return Ct(s,W,p)},x,v,y,_,k,w,S,P,O,C,L,U;if(a==="top")x=b(this.bottom),w=this.bottom-u,P=x-m,C=b(t.top)+m,U=t.bottom;else if(a==="bottom")x=b(this.top),C=t.top,U=b(t.bottom)-m,w=x+m,P=this.top+u;else if(a==="left")x=b(this.right),k=this.right-u,S=x-m,O=b(t.left)+m,L=t.right;else if(a==="right")x=b(this.left),O=t.left,L=b(t.right)-m,k=x+m,S=this.left+u;else if(e==="x"){if(a==="center")x=b((t.top+t.bottom)/2+.5);else if(T(a)){let W=Object.keys(a)[0],j=a[W];x=b(this.chart.scales[W].getPixelForValue(j))}C=t.top,U=t.bottom,w=x+m,P=w+u}else if(e==="y"){if(a==="center")x=b((t.left+t.right)/2);else if(T(a)){let W=Object.keys(a)[0],j=a[W];x=b(this.chart.scales[W].getPixelForValue(j))}k=x-m,S=k-u,O=t.left,L=t.right}let et=D(n.ticks.maxTicksLimit,d),I=Math.max(1,Math.ceil(d/et));for(v=0;v0&&(It-=Et/2);break}Ye={left:It,top:xe,width:Et+qt.width,height:be+qt.height,color:I.backdropColor}}m.push({label:y,font:P,textOffset:L,options:{rotation:p,color:j,strokeColor:rt,strokeWidth:G,textAlign:Kt,textBaseline:U,translation:[_,k],backdrop:Ye}})}return m}_getXAxisLabelAlignment(){let{position:t,ticks:e}=this.options;if(-ot(this.labelRotation))return t==="top"?"left":"right";let n="center";return e.align==="start"?n="left":e.align==="end"?n="right":e.align==="inner"&&(n="inner"),n}_getYAxisLabelAlignment(t){let{position:e,ticks:{crossAlign:s,mirror:n,padding:o}}=this.options,a=this._getLabelSizes(),r=t+o,l=a.widest.width,c,h;return e==="left"?n?(h=this.right+o,s==="near"?c="left":s==="center"?(c="center",h+=l/2):(c="right",h+=l)):(h=this.right-r,s==="near"?c="right":s==="center"?(c="center",h-=l/2):(c="left",h=this.left)):e==="right"?n?(h=this.left+o,s==="near"?c="right":s==="center"?(c="center",h-=l/2):(c="left",h-=l)):(h=this.left+r,s==="near"?c="left":s==="center"?(c="center",h+=l/2):(c="right",h=this.right)):c="right",{textAlign:c,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;let t=this.chart,e=this.options.position;if(e==="left"||e==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(e==="top"||e==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){let{ctx:t,options:{backgroundColor:e},left:s,top:n,width:o,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,n,o,a),t.restore())}getLineWidthForValue(t){let e=this.options.grid;if(!this._isVisible()||!e.display)return 0;let n=this.ticks.findIndex(o=>o.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){let e=this.options.grid,s=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o,a,r=(l,c,h)=>{!h.width||!h.color||(s.save(),s.lineWidth=h.width,s.strokeStyle=h.color,s.setLineDash(h.borderDash||[]),s.lineDashOffset=h.borderDashOffset,s.beginPath(),s.moveTo(l.x,l.y),s.lineTo(c.x,c.y),s.stroke(),s.restore())};if(e.display)for(o=0,a=n.length;o{this.draw(o)}}]:[{z:s,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",n=[],o,a;for(o=0,a=e.length;o{let s=e.split("."),n=s.pop(),o=[i].concat(s).join("."),a=t[e].split("."),r=a.pop(),l=a.join(".");V.route(o,n,l,r)})}function Ol(i){return"id"in i&&"defaults"in i}var Ds=class{constructor(){this.controllers=new pe(it,"datasets",!0),this.elements=new pe(st,"elements"),this.plugins=new pe(Object,"plugins"),this.scales=new pe(Xt,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(n=>{let o=s||this._getRegistryForType(n);s||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):E(n,a=>{let r=s||this._getRegistryForType(a);this._exec(t,r,a)})})}_exec(t,e,s){let n=ii(t);F(s["before"+n],[],s),e[t](s),F(s["after"+n],[],s)}_getRegistryForType(t){for(let e=0;eo.filter(r=>!a.some(l=>r.plugin.id===l.plugin.id));this._notify(n(e,s),t,"stop"),this._notify(n(s,e),t,"start")}};function Cl(i){let t={},e=[],s=Object.keys(gt.plugins.items);for(let o=0;o1&&qn(i[0].toLowerCase());if(s)return s}throw new Error(`Cannot determine type of '${i}' axis. Please provide 'axis' or 'position' option.`)}function Gn(i,t,e){if(e[t+"AxisID"]===i)return{axis:t}}function Fl(i,t){if(t.data&&t.data.datasets){let e=t.data.datasets.filter(s=>s.xAxisID===i||s.yAxisID===i);if(e.length)return Gn(i,"x",e[0])||Gn(i,"y",e[0])}return{}}function zl(i,t){let e=Ot[i.type]||{scales:{}},s=t.scales||{},n=Cs(i.type,t),o=Object.create(null);return Object.keys(s).forEach(a=>{let r=s[a];if(!T(r))return console.error(`Invalid scale configuration for scale: ${a}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${a}`);let l=As(a,r,Fl(a,i),V.scales[r.type]),c=El(l,n),h=e.scales||{};o[a]=te(Object.create(null),[{axis:l},r,h[l],h[c]])}),i.data.datasets.forEach(a=>{let r=a.type||i.type,l=a.indexAxis||Cs(r,t),h=(Ot[r]||{}).scales||{};Object.keys(h).forEach(d=>{let u=Rl(d,l),f=a[u+"AxisID"]||u;o[f]=o[f]||Object.create(null),te(o[f],[{axis:u},s[f],h[d]])})}),Object.keys(o).forEach(a=>{let r=o[a];te(r,[V.scales[r.type],V.scale])}),o}function Fo(i){let t=i.options||(i.options={});t.plugins=D(t.plugins,{}),t.scales=zl(i,t)}function zo(i){return i=i||{},i.datasets=i.datasets||[],i.labels=i.labels||[],i}function Bl(i){return i=i||{},i.data=zo(i.data),Fo(i),i}var Jn=new Map,Bo=new Set;function pi(i,t){let e=Jn.get(i);return e||(e=t(),Jn.set(i,e),Bo.add(e)),e}var Le=(i,t,e)=>{let s=_t(t,e);s!==void 0&&i.add(s)},Ts=class{constructor(t){this._config=Bl(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=zo(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),Fo(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pi(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return pi(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return pi(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,s=this.type;return pi(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let s=this._scopeCache,n=s.get(t);return(!n||e)&&(n=new Map,s.set(t,n)),n}getOptionScopes(t,e,s){let{options:n,type:o}=this,a=this._cachedScopes(t,s),r=a.get(e);if(r)return r;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(d=>Le(l,t,d))),h.forEach(d=>Le(l,n,d)),h.forEach(d=>Le(l,Ot[o]||{},d)),h.forEach(d=>Le(l,V,d)),h.forEach(d=>Le(l,ai,d))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),Bo.has(e)&&a.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,Ot[e]||{},V.datasets[e]||{},{type:e},V,ai]}resolveNamedOptions(t,e,s,n=[""]){let o={$shared:!0},{resolver:a,subPrefixes:r}=Zn(this._resolverCache,t,n),l=a;if(Wl(a,e)){o.$shared=!1,s=bt(s)?s():s;let c=this.createResolver(t,s,r);l=Bt(a,s,c)}for(let c of e)o[c]=l[c];return o}createResolver(t,e,s=[""],n){let{resolver:o}=Zn(this._resolverCache,t,s);return T(e)?Bt(o,e,void 0,n):o}};function Zn(i,t,e){let s=i.get(t);s||(s=new Map,i.set(t,s));let n=e.join(),o=s.get(n);return o||(o={resolver:ci(t,e),subPrefixes:e.filter(r=>!r.toLowerCase().includes("hover"))},s.set(n,o)),o}var Vl=i=>T(i)&&Object.getOwnPropertyNames(i).some(t=>bt(i[t]));function Wl(i,t){let{isScriptable:e,isIndexable:s}=ts(i);for(let n of t){let o=e(n),a=s(n),r=(a||o)&&i[n];if(o&&(bt(r)||Vl(r))||a&&z(r))return!0}return!1}var Nl="4.5.1",Hl=["top","bottom","left","right","chartArea"];function Qn(i,t){return i==="top"||i==="bottom"||Hl.indexOf(i)===-1&&t==="x"}function to(i,t){return function(e,s){return e[i]===s[i]?e[t]-s[t]:e[i]-s[i]}}function eo(i){let t=i.chart,e=t.options.animation;t.notifyPlugins("afterRender"),F(e&&e.onComplete,[i],t)}function jl(i){let t=i.chart,e=t.options.animation;F(e&&e.onProgress,[i],t)}function Vo(i){return hi()&&typeof i=="string"?i=document.getElementById(i):i&&i.length&&(i=i[0]),i&&i.canvas&&(i=i.canvas),i}var yi={},io=i=>{let t=Vo(i);return Object.values(yi).filter(e=>e.canvas===t).pop()};function $l(i,t,e){let s=Object.keys(i);for(let n of s){let o=+n;if(o>=t){let a=i[n];delete i[n],(e>0||o>t)&&(i[o+e]=a)}}}function Yl(i,t,e,s){return!e||i.type==="mouseout"?null:s?t:i}var at=class{static register(...t){gt.add(...t),so()}static unregister(...t){gt.remove(...t),so()}constructor(t,e){let s=this.config=new Ts(e),n=Vo(t),o=io(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");let a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ul(n)),this.platform.updateConfig(s);let r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,c=l&&l.height,h=l&&l.width;if(this.id=tn(),this.ctx=r,this.canvas=l,this.width=h,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Os,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=un(d=>this.update(d),a.resizeDelay||0),this._dataChanges=[],yi[this.id]=this,!r||!l){console.error("Failed to create chart: can't acquire context from the given item");return}vt.listen(this,"complete",eo),vt.listen(this,"progress",jl),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:n,_aspectRatio:o}=this;return A(t)?e&&o?o:n?s/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return gt}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ns(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ji(this.canvas,this.ctx),this}stop(){return vt.stop(this),this}resize(t,e){vt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let s=this.options,n=this.canvas,o=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,o),r=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,ns(this,r,!0)&&(this.notifyPlugins("resize",{size:a}),F(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};E(e,(s,n)=>{s.id=n})}buildOrUpdateScales(){let t=this.options,e=t.scales,s=this.scales,n=Object.keys(s).reduce((a,r)=>(a[r]=!1,a),{}),o=[];e&&(o=o.concat(Object.keys(e).map(a=>{let r=e[a],l=As(a,r),c=l==="r",h=l==="x";return{options:r,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),E(o,a=>{let r=a.options,l=r.id,c=As(l,r),h=D(r.type,a.dtype);(r.position===void 0||Qn(r.position,c)!==Qn(a.dposition))&&(r.position=a.dposition),n[l]=!0;let d=null;if(l in s&&s[l].type===h)d=s[l];else{let u=gt.getScale(h);d=new u({id:l,type:h,ctx:this.ctx,chart:this}),s[d.id]=d}d.init(r,t)}),E(n,(a,r)=>{a||delete s[r]}),E(s,a=>{J.configure(this,a,a.options),J.addBox(this,a)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((n,o)=>n.index-o.index),s>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((s,n)=>{e.filter(o=>o===s._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,s,n;for(this._removeUnreferencedMetasets(),s=0,n=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(to("z","_idx"));let{_active:r,_lastEvent:l}=this;l?this._eventHandler(l,!0):r.length&&this._updateHoverStyles(r,r,!0),this.render()}_updateScales(){E(this.scales,t=>{J.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);(!Bi(e,s)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:s,start:n,count:o}of e){let a=s==="_removeElements"?-o:o;$l(t,n,a)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,s=o=>new Set(t.filter(a=>a[0]===o).map((a,r)=>r+","+a.splice(1).join(","))),n=s(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;J.update(this,this.width,this.height,t);let e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],E(this.boxes,n=>{s&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,s=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,s={meta:t,index:t.index,cancelable:!0},n=hs(this,t);this.notifyPlugins("beforeDatasetDraw",s)!==!1&&(n&&Pe(e,n),t.controller.draw(),n&&De(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return ht(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,n){let o=Xr.modes[e];return typeof o=="function"?o(this,t,s,n):[]}getDatasetMeta(t){let e=this.data.datasets[t],s=this._metasets,n=s.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(n)),n}getContext(){return this.$context||(this.$context=yt(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let s=this.getDatasetMeta(t);return typeof s.hidden=="boolean"?!s.hidden:!e.hidden}setDatasetVisibility(t,e){let s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){let n=s?"show":"hide",o=this.getDatasetMeta(t),a=o.controller._resolveAnimations(void 0,n);ee(e)?(o.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(o,{visible:s}),this.update(r=>r.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),vt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,o,a),t[o]=a},n=(o,a,r)=>{o.offsetX=a,o.offsetY=r,this._eventHandler(o)};E(this.options.events,o=>s(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,s=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)},a,r=()=>{n("attach",r),this.attached=!0,this.resize(),s("resize",o),s("detach",a)};a=()=>{this.attached=!1,n("resize",o),this._stop(),this._resize(0,0),s("attach",r)},e.isAttached(this.canvas)?r():a()}unbindEvents(){E(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},E(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){let n=s?"set":"remove",o,a,r,l;for(e==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),r=0,l=t.length;r{let r=this.getDatasetMeta(o);if(!r)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:r.data[a],index:a}});!we(s,e)&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,s){let n=this.options.hover,o=(l,c)=>l.filter(h=>!c.some(d=>h.datasetIndex===d.datasetIndex&&h.index===d.index)),a=o(e,t),r=s?t:o(t,e);a.length&&this.updateHoverStyle(a,n.mode,!1),r.length&&n.mode&&this.updateHoverStyle(r,n.mode,!0)}_eventHandler(t,e){let s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=a=>(a.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",s,n)===!1)return;let o=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,n),(o||s.changed)&&this.render(),this}_handleEvent(t,e,s){let{_active:n=[],options:o}=this,a=e,r=this._getActiveElements(t,n,s,a),l=nn(t),c=Yl(t,this._lastEvent,s,l);s&&(this._lastEvent=null,F(o.onHover,[t,r,this],this),l&&F(o.onClick,[t,r,this],this));let h=!we(r,n);return(h||e)&&(this._active=r,this._updateHoverStyles(r,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,s,n){if(t.type==="mouseout")return[];if(!s)return e;let o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}};M(at,"defaults",V),M(at,"instances",yi),M(at,"overrides",Ot),M(at,"registry",gt),M(at,"version",Nl),M(at,"getChart",io);function so(){return E(at.instances,i=>i._plugins.invalidate())}function Ul(i,t,e){let{startAngle:s,x:n,y:o,outerRadius:a,innerRadius:r,options:l}=t,{borderWidth:c,borderJoinStyle:h}=l,d=Math.min(c/a,X(s-e));if(i.beginPath(),i.arc(n,o,a-c/2,s+d/2,e-d/2),r>0){let u=Math.min(c/r,X(s-e));i.arc(n,o,r+c/2,e-u/2,s+u/2,!0)}else{let u=Math.min(c/2,a*X(s-e));if(h==="round")i.arc(n,o,u,e-R/2,s+R/2,!0);else if(h==="bevel"){let f=2*u*u,g=-f*Math.cos(e+R/2)+n,p=-f*Math.sin(e+R/2)+o,m=f*Math.cos(s+R/2)+n,b=f*Math.sin(s+R/2)+o;i.lineTo(g,p),i.lineTo(m,b)}}i.closePath(),i.moveTo(0,0),i.rect(0,0,i.canvas.width,i.canvas.height),i.clip("evenodd")}function Xl(i,t,e){let{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=t,c=n/r;i.beginPath(),i.arc(o,a,r,s-c,e+c),l>n?(c=n/l,i.arc(o,a,l,e+c,s-c,!0)):i.arc(o,a,n,e+H,s-H),i.closePath(),i.clip()}function Kl(i){return li(i,["outerStart","outerEnd","innerStart","innerEnd"])}function ql(i,t,e,s){let n=Kl(i.options.borderRadius),o=(e-t)/2,a=Math.min(o,s*t/2),r=l=>{let c=(e-Math.min(o,l))*s/2;return Y(l,0,Math.min(o,c))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Y(n.innerStart,0,a),innerEnd:Y(n.innerEnd,0,a)}}function re(i,t,e,s){return{x:e+i*Math.cos(t),y:s+i*Math.sin(t)}}function wi(i,t,e,s,n,o){let{x:a,y:r,startAngle:l,pixelMargin:c,innerRadius:h}=t,d=Math.max(t.outerRadius+s+e-c,0),u=h>0?h+s+e+c:0,f=0,g=n-l;if(s){let I=h>0?h-s:0,W=d>0?d-s:0,j=(I+W)/2,rt=j!==0?g*j/(j+s):g;f=(g-rt)/2}let p=Math.max(.001,g*d-e/R)/d,m=(g-p)/2,b=l+m+f,x=n-m-f,{outerStart:v,outerEnd:y,innerStart:_,innerEnd:k}=ql(t,u,d,x-b),w=d-v,S=d-y,P=b+v/w,O=x-y/S,C=u+_,L=u+k,U=b+_/C,et=x-k/L;if(i.beginPath(),o){let I=(P+O)/2;if(i.arc(a,r,d,P,I),i.arc(a,r,d,I,O),y>0){let G=re(S,O,a,r);i.arc(G.x,G.y,y,O,x+H)}let W=re(L,x,a,r);if(i.lineTo(W.x,W.y),k>0){let G=re(L,et,a,r);i.arc(G.x,G.y,k,x+H,et+Math.PI)}let j=(x-k/u+(b+_/u))/2;if(i.arc(a,r,u,x-k/u,j,!0),i.arc(a,r,u,j,b+_/u,!0),_>0){let G=re(C,U,a,r);i.arc(G.x,G.y,_,U+Math.PI,b-H)}let rt=re(w,b,a,r);if(i.lineTo(rt.x,rt.y),v>0){let G=re(w,P,a,r);i.arc(G.x,G.y,v,b-H,P)}}else{i.moveTo(a,r);let I=Math.cos(P)*d+a,W=Math.sin(P)*d+r;i.lineTo(I,W);let j=Math.cos(O)*d+a,rt=Math.sin(O)*d+r;i.lineTo(j,rt)}i.closePath()}function Gl(i,t,e,s,n){let{fullCircles:o,startAngle:a,circumference:r}=t,l=t.endAngle;if(o){wi(i,t,e,s,l,n);for(let c=0;c=R&&f===0&&h!=="miter"&&Ul(i,t,p),o||(wi(i,t,e,s,p,n),i.stroke())}var jt=class extends st{constructor(e){super();M(this,"circumference");M(this,"endAngle");M(this,"fullCircles");M(this,"innerRadius");M(this,"outerRadius");M(this,"pixelMargin");M(this,"startAngle");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,s,n){let o=this.getProps(["x","y"],n),{angle:a,distance:r}=Hi(o,{x:e,y:s}),{startAngle:l,endAngle:c,innerRadius:h,outerRadius:d,circumference:u}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),f=(this.options.spacing+this.options.borderWidth)/2,g=D(u,c-l),p=se(a,l,c)&&l!==c,m=g>=B||p,b=ut(r,h+f,d+f);return m&&b}getCenterPoint(e){let{x:s,y:n,startAngle:o,endAngle:a,innerRadius:r,outerRadius:l}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:c,spacing:h}=this.options,d=(o+a)/2,u=(r+l+h+c)/2;return{x:s+Math.cos(d)*u,y:n+Math.sin(d)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:s,circumference:n}=this,o=(s.offset||0)/4,a=(s.spacing||0)/2,r=s.circular;if(this.pixelMargin=s.borderAlign==="inner"?.33:0,this.fullCircles=n>B?Math.floor(n/B):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let l=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(l)*o,Math.sin(l)*o);let c=1-Math.sin(Math.min(R,n||0)),h=o*c;e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,Gl(e,this,h,a,r),Jl(e,this,h,a,r),e.restore()}};M(jt,"id","arc"),M(jt,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),M(jt,"defaultRoutes",{backgroundColor:"backgroundColor"}),M(jt,"descriptors",{_scriptable:!0,_indexable:e=>e!=="borderDash"});function Wo(i,t,e=t){i.lineCap=D(e.borderCapStyle,t.borderCapStyle),i.setLineDash(D(e.borderDash,t.borderDash)),i.lineDashOffset=D(e.borderDashOffset,t.borderDashOffset),i.lineJoin=D(e.borderJoinStyle,t.borderJoinStyle),i.lineWidth=D(e.borderWidth,t.borderWidth),i.strokeStyle=D(e.borderColor,t.borderColor)}function Zl(i,t,e){i.lineTo(e.x,e.y)}function Ql(i){return i.stepped?mn:i.tension||i.cubicInterpolationMode==="monotone"?bn:Zl}function No(i,t,e={}){let s=i.length,{start:n=0,end:o=s-1}=e,{start:a,end:r}=t,l=Math.max(n,a),c=Math.min(o,r),h=nr&&o>r;return{count:s,start:l,loop:t.loop,ilen:c(a+(c?r-y:y))%o,v=()=>{p!==m&&(i.lineTo(h,m),i.lineTo(h,p),i.lineTo(h,b))};for(l&&(f=n[x(0)],i.moveTo(f.x,f.y)),u=0;u<=r;++u){if(f=n[x(u)],f.skip)continue;let y=f.x,_=f.y,k=y|0;k===g?(_m&&(m=_),h=(d*h+y)/++d):(v(),i.lineTo(y,_),g=k,d=0,p=m=_),b=_}v()}function Ls(i){let t=i.options,e=t.borderDash&&t.borderDash.length;return!i._decimated&&!i._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?ec:tc}function ic(i){return i.stepped?Pn:i.tension||i.cubicInterpolationMode==="monotone"?Dn:Pt}function sc(i,t,e,s){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,s)&&n.closePath()),Wo(i,t.options),i.stroke(n)}function nc(i,t,e,s){let{segments:n,options:o}=t,a=Ls(t);for(let r of n)Wo(i,o,r.style),i.beginPath(),a(i,t,r,{start:e,end:e+s-1})&&i.closePath(),i.stroke()}var oc=typeof Path2D=="function";function ac(i,t,e,s){oc&&!t.options.segment?sc(i,t,e,s):nc(i,t,e,s)}var pt=class extends st{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let s=this.options;if((s.tension||s.cubicInterpolationMode==="monotone")&&!s.stepped&&!this._pointsUpdated){let n=s.spanGaps?this._loop:this._fullLoop;kn(this._points,s,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Cn(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){let s=this.options,n=t[e],o=this.points,a=cs(this,{property:e,start:n,end:n});if(!a.length)return;let r=[],l=ic(s),c,h;for(c=0,h=a.length;ct!=="borderDash"&&t!=="fill"});function no(i,t,e,s){let n=i.options,{[e]:o}=i.getProps([e],s);return Math.abs(t-o)i.replace("rgb(","rgba(").replace(")",", 0.5)"));function jo(i){return Rs[i%Rs.length]}function $o(i){return oo[i%oo.length]}function fc(i,t){return i.borderColor=jo(t),i.backgroundColor=$o(t),++t}function gc(i,t){return i.backgroundColor=i.data.map(()=>jo(t++)),t}function pc(i,t){return i.backgroundColor=i.data.map(()=>$o(t++)),t}function mc(i){let t=0;return(e,s)=>{let n=i.getDatasetMeta(s).controller;n instanceof kt?t=gc(e,t):n instanceof Yt?t=pc(e,t):n&&(t=fc(e,t))}}function ao(i){let t;for(t in i)if(i[t].borderColor||i[t].backgroundColor)return!0;return!1}function bc(i){return i&&(i.borderColor||i.backgroundColor)}function xc(){return V.borderColor!=="rgba(0,0,0,0.1)"||V.backgroundColor!=="rgba(0,0,0,0.1)"}var _c={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(i,t,e){if(!e.enabled)return;let{data:{datasets:s},options:n}=i.config,{elements:o}=n,a=ao(s)||bc(n)||o&&ao(o)||xc();if(!e.forceOverride&&a)return;let r=mc(i);s.forEach(r)}};function yc(i,t,e,s,n){let o=n.samples||s;if(o>=e)return i.slice(t,t+e);let a=[],r=(e-2)/(o-2),l=0,c=t+e-1,h=t,d,u,f,g,p;for(a[l++]=i[h],d=0;df&&(f=g,u=i[x],p=x);a[l++]=u,h=p}return a[l++]=i[c],a}function vc(i,t,e,s){let n=0,o=0,a,r,l,c,h,d,u,f,g,p,m=[],b=t+e-1,x=i[t].x,y=i[b].x-x;for(a=t;ap&&(p=c,u=a),n=(o*n+r.x)/++o;else{let k=a-1;if(!A(d)&&!A(u)){let w=Math.min(d,u),S=Math.max(d,u);w!==f&&w!==k&&m.push({...i[w],x:n}),S!==f&&S!==k&&m.push({...i[S],x:n})}a>0&&k!==f&&m.push(i[k]),m.push(r),h=_,o=0,g=p=c,d=u=f=a}}return m}function Yo(i){if(i._decimated){let t=i._data;delete i._decimated,delete i._data,Object.defineProperty(i,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function ro(i){i.data.datasets.forEach(t=>{Yo(t)})}function Mc(i,t){let e=t.length,s=0,n,{iScale:o}=i,{min:a,max:r,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(s=Y(ct(t,o.axis,a).lo,0,e-1)),c?n=Y(ct(t,o.axis,r).hi+1,s,e)-s:n=e-s,{start:s,count:n}}var kc={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(i,t,e)=>{if(!e.enabled){ro(i);return}let s=i.width;i.data.datasets.forEach((n,o)=>{let{_data:a,indexAxis:r}=n,l=i.getDatasetMeta(o),c=a||n.data;if(ae([r,i.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=i.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||i.options.parsing)return;let{start:d,count:u}=Mc(l,c),f=e.threshold||4*s;if(u<=f){Yo(n);return}A(a)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(p){this._data=p}}));let g;switch(e.algorithm){case"lttb":g=yc(c,d,u,s,e);break;case"min-max":g=vc(c,d,u,s);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=g})},destroy(i){ro(i)}};function wc(i,t,e){let s=i.segments,n=i.points,o=t.points,a=[];for(let r of s){let{start:l,end:c}=r;c=Di(l,c,n);let h=Es(e,n[l],n[c],r.loop);if(!t.segments){a.push({source:r,target:h,start:n[l],end:n[c]});continue}let d=cs(t,h);for(let u of d){let f=Es(e,o[u.start],o[u.end],u.loop),g=ls(r,n,f);for(let p of g)a.push({source:p,target:u,start:{[e]:lo(h,f,"start",Math.max)},end:{[e]:lo(h,f,"end",Math.min)}})}}return a}function Es(i,t,e,s){if(s)return;let n=t[i],o=e[i];return i==="angle"&&(n=X(n),o=X(o)),{property:i,start:n,end:o}}function Sc(i,t){let{x:e=null,y:s=null}=i||{},n=t.points,o=[];return t.segments.forEach(({start:a,end:r})=>{r=Di(a,r,n);let l=n[a],c=n[r];s!==null?(o.push({x:l.x,y:s}),o.push({x:c.x,y:s})):e!==null&&(o.push({x:e,y:l.y}),o.push({x:e,y:c.y}))}),o}function Di(i,t,e){for(;t>i;t--){let s=e[t];if(!isNaN(s.x)&&!isNaN(s.y))break}return t}function lo(i,t,e,s){return i&&t?s(i[e],t[e]):i?i[e]:t?t[e]:0}function Uo(i,t){let e=[],s=!1;return z(i)?(s=!0,e=i):e=Sc(i,t),e.length?new pt({points:e,options:{tension:0},_loop:s,_fullLoop:s}):null}function co(i){return i&&i.fill!==!1}function Pc(i,t,e){let n=i[t].fill,o=[t],a;if(!e)return n;for(;n!==!1&&o.indexOf(n)===-1;){if(!N(n))return n;if(a=i[n],!a)return!1;if(a.visible)return n;o.push(n),n=a.fill}return!1}function Dc(i,t,e){let s=Tc(i);if(T(s))return isNaN(s.value)?!1:s;let n=parseFloat(s);return N(n)&&Math.floor(n)===n?Oc(s[0],t,n,e):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function Oc(i,t,e,s){return(i==="-"||i==="+")&&(e=t+e),e===t||e<0||e>=s?!1:e}function Cc(i,t){let e=null;return i==="start"?e=t.bottom:i==="end"?e=t.top:T(i)?e=t.getPixelForValue(i.value):t.getBasePixel&&(e=t.getBasePixel()),e}function Ac(i,t,e){let s;return i==="start"?s=e:i==="end"?s=t.options.reverse?t.min:t.max:T(i)?s=i.value:s=t.getBaseValue(),s}function Tc(i){let t=i.options,e=t.fill,s=D(e&&e.target,e);return s===void 0&&(s=!!t.backgroundColor),s===!1||s===null?!1:s===!0?"origin":s}function Lc(i){let{scale:t,index:e,line:s}=i,n=[],o=s.segments,a=s.points,r=Rc(t,e);r.push(Uo({x:null,y:t.bottom},s));for(let l=0;l=0;--a){let r=n[a].$filler;r&&(r.line.updateControlPoints(o,r.axis),s&&r.fill&&ys(i.ctx,r,o))}},beforeDatasetsDraw(i,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let s=i.getSortedVisibleDatasetMetas();for(let n=s.length-1;n>=0;--n){let o=s[n].$filler;co(o)&&ys(i.ctx,o,i.chartArea)}},beforeDatasetDraw(i,t,e){let s=t.meta.$filler;!co(s)||e.drawTime!=="beforeDatasetDraw"||ys(i.ctx,s,i.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},go=(i,t)=>{let{boxHeight:e=t,boxWidth:s=t}=i;return i.usePointStyle&&(e=Math.min(e,t),s=i.pointStyleWidth||Math.min(s,t)),{boxWidth:s,boxHeight:e,itemHeight:Math.max(t,e)}},$c=(i,t)=>i!==null&&t!==null&&i.datasetIndex===t.datasetIndex&&i.index===t.index,Pi=class extends st{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=F(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(s=>t.filter(s,this.chart.data))),t.sort&&(e=e.sort((s,n)=>t.sort(s,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let s=t.labels,n=$(s.font),o=n.size,a=this._computeTitleHeight(),{boxWidth:r,itemHeight:l}=go(s,o),c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(a,o,r,l)+10):(h=this.maxHeight,c=this._fitCols(a,n,r,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,n){let{ctx:o,maxWidth:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+r,d=t;o.textAlign="left",o.textBaseline="middle";let u=-1,f=-h;return this.legendItems.forEach((g,p)=>{let m=s+e/2+o.measureText(g.text).width;(p===0||c[c.length-1]+m+2*r>a)&&(d+=h,c[c.length-(p>0?0:1)]=0,f+=h,u++),l[p]={left:0,top:f,row:u,width:m,height:n},c[c.length-1]+=m+r}),d}_fitCols(t,e,s,n){let{ctx:o,maxHeight:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=a-t,d=r,u=0,f=0,g=0,p=0;return this.legendItems.forEach((m,b)=>{let{itemWidth:x,itemHeight:v}=Yc(s,e,o,m,n);b>0&&f+v+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,p++,u=f=0),l[b]={left:g,top:f,col:p,width:x,height:v},u=Math.max(u,x),f+=v+r}),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:n},rtl:o}}=this,a=Wt(o,this.left,this.width);if(this.isHorizontal()){let r=0,l=K(s,this.left+n,this.right-this.lineWidths[r]);for(let c of e)r!==c.row&&(r=c.row,l=K(s,this.left+n,this.right-this.lineWidths[r])),c.top+=this.top+t+n,c.left=a.leftForLtr(a.x(l),c.width),l+=c.width+n}else{let r=0,l=K(s,this.top+t+n,this.bottom-this.columnSizes[r].height);for(let c of e)c.col!==r&&(r=c.col,l=K(s,this.top+t+n,this.bottom-this.columnSizes[r].height)),c.top=l,c.left+=this.left+n,c.left=a.leftForLtr(a.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;Pe(t,this),this._draw(),De(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:s,ctx:n}=this,{align:o,labels:a}=t,r=V.color,l=Wt(t.rtl,this.left,this.width),c=$(a.font),{padding:h}=a,d=c.size,u=d/2,f;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;let{boxWidth:g,boxHeight:p,itemHeight:m}=go(a,d),b=function(k,w,S){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;n.save();let P=D(S.lineWidth,1);if(n.fillStyle=D(S.fillStyle,r),n.lineCap=D(S.lineCap,"butt"),n.lineDashOffset=D(S.lineDashOffset,0),n.lineJoin=D(S.lineJoin,"miter"),n.lineWidth=P,n.strokeStyle=D(S.strokeStyle,r),n.setLineDash(D(S.lineDash,[])),a.usePointStyle){let O={radius:p*Math.SQRT2/2,pointStyle:S.pointStyle,rotation:S.rotation,borderWidth:P},C=l.xPlus(k,g/2),L=w+u;Zi(n,O,C,L,a.pointStyleWidth&&g)}else{let O=w+Math.max((d-p)/2,0),C=l.leftForLtr(k,g),L=Tt(S.borderRadius);n.beginPath(),Object.values(L).some(U=>U!==0)?oe(n,{x:C,y:O,w:g,h:p,radius:L}):n.rect(C,O,g,p),n.fill(),P!==0&&n.stroke()}n.restore()},x=function(k,w,S){At(n,S.text,k,w+m/2,c,{strikethrough:S.hidden,textAlign:l.textAlign(S.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();v?f={x:K(o,this.left+h,this.right-s[0]),y:this.top+h+y,line:0}:f={x:this.left+h,y:K(o,this.top+y+h,this.bottom-e[0].height),line:0},as(this.ctx,t.textDirection);let _=m+h;this.legendItems.forEach((k,w)=>{n.strokeStyle=k.fontColor,n.fillStyle=k.fontColor;let S=n.measureText(k.text).width,P=l.textAlign(k.textAlign||(k.textAlign=a.textAlign)),O=g+u+S,C=f.x,L=f.y;l.setWidth(this.width),v?w>0&&C+O+h>this.right&&(L=f.y+=_,f.line++,C=f.x=K(o,this.left+h,this.right-s[f.line])):w>0&&L+_>this.bottom&&(C=f.x=C+e[f.line].width+h,f.line++,L=f.y=K(o,this.top+y+h,this.bottom-e[f.line].height));let U=l.x(C);if(b(U,L,k),C=fn(P,C+g+u,v?C+O:this.right,t.rtl),x(l.x(C),L,k),v)f.x+=O+h;else if(typeof k.text!="string"){let et=c.lineHeight;f.y+=Xo(k,et)+h}else f.y+=_}),rs(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,s=$(e.font),n=q(e.padding);if(!e.display)return;let o=Wt(t.rtl,this.left,this.width),a=this.ctx,r=e.position,l=s.size/2,c=n.top+l,h,d=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),h=this.top+c,d=K(t.align,d,this.right-u);else{let g=this.columnSizes.reduce((p,m)=>Math.max(p,m.height),0);h=c+K(t.align,this.top,this.bottom-g-t.labels.padding-this._computeTitleHeight())}let f=K(r,d,d+u);a.textAlign=o.textAlign(oi(r)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,At(a,e.text,f,h,s)}_computeTitleHeight(){let t=this.options.title,e=$(t.font),s=q(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,n,o;if(ut(t,this.left,this.right)&&ut(e,this.top,this.bottom)){for(o=this.legendHitBoxes,s=0;so.length>a.length?o:a)),t+e.size/2+s.measureText(n).width}function Xc(i,t,e){let s=i;return typeof t.text!="string"&&(s=Xo(t,e)),s}function Xo(i,t){let e=i.text?i.text.length:0;return t*e}function Kc(i,t){return!!((i==="mousemove"||i==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(i==="click"||i==="mouseup"))}var qc={id:"legend",_element:Pi,start(i,t,e){let s=i.legend=new Pi({ctx:i.ctx,options:e,chart:i});J.configure(i,s,e),J.addBox(i,s)},stop(i){J.removeBox(i,i.legend),delete i.legend},beforeUpdate(i,t,e){let s=i.legend;J.configure(i,s,e),s.options=e},afterUpdate(i){let t=i.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(i,t){t.replay||i.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(i,t,e){let s=t.datasetIndex,n=e.chart;n.isDatasetVisible(s)?(n.hide(s),t.hidden=!0):(n.show(s),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:i=>i.chart.options.color,boxWidth:40,padding:10,generateLabels(i){let t=i.data.datasets,{labels:{usePointStyle:e,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=i.legend.options;return i._getSortedDatasetMetas().map(l=>{let c=l.controller.getStyle(e?0:void 0),h=q(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:c.borderColor,pointStyle:s||c.pointStyle,rotation:c.rotation,textAlign:n||c.textAlign,borderRadius:a&&(r||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:i=>i.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:i=>!i.startsWith("on"),labels:{_scriptable:i=>!["generateLabels","filter","sort"].includes(i)}}},He=class extends st{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let s=this.options;if(this.left=0,this.top=0,!s.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let n=z(s.text)?s.text.length:1;this._padding=q(s.padding);let o=n*$(s.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:s,bottom:n,right:o,options:a}=this,r=a.align,l=0,c,h,d;return this.isHorizontal()?(h=K(r,s,o),d=e+t,c=o-s):(a.position==="left"?(h=s+t,d=K(r,n,e),l=R*-.5):(h=o-t,d=K(r,e,n),l=R*.5),c=n-e),{titleX:h,titleY:d,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let s=$(e.font),o=s.lineHeight/2+this._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=this._drawArgs(o);At(t,e.text,0,0,s,{color:e.color,maxWidth:l,rotation:c,textAlign:oi(e.align),textBaseline:"middle",translation:[a,r]})}};function Gc(i,t){let e=new He({ctx:i.ctx,options:t,chart:i});J.configure(i,e,t),J.addBox(i,e),i.titleBlock=e}var Jc={id:"title",_element:He,start(i,t,e){Gc(i,e)},stop(i){let t=i.titleBlock;J.removeBox(i,t),delete i.titleBlock},beforeUpdate(i,t,e){let s=i.titleBlock;J.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},mi=new WeakMap,Zc={id:"subtitle",start(i,t,e){let s=new He({ctx:i.ctx,options:e,chart:i});J.configure(i,s,e),J.addBox(i,s),mi.set(i,s)},stop(i){J.removeBox(i,mi.get(i)),mi.delete(i)},beforeUpdate(i,t,e){let s=mi.get(i);J.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Ie={average(i){if(!i.length)return!1;let t,e,s=new Set,n=0,o=0;for(t=0,e=i.length;tr+l)/s.size,y:n/o}},nearest(i,t){if(!i.length)return!1;let e=t.x,s=t.y,n=Number.POSITIVE_INFINITY,o,a,r;for(o=0,a=i.length;o-1?i.split(` -`):i}function bc(i,t){let{element:e,datasetIndex:s,index:n}=t,o=i.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:i,label:a,parsed:o.getParsed(n),raw:i.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:e}}function eo(i,t){let e=i.chart.ctx,{body:s,footer:n,title:o}=i,{boxWidth:a,boxHeight:r}=t,l=$(t.bodyFont),c=$(t.titleFont),h=$(t.footerFont),d=o.length,u=n.length,f=s.length,g=U(t.padding),p=g.height,m=0,b=s.reduce((y,x)=>y+x.before.length+x.lines.length+x.after.length,0);if(b+=i.beforeBody.length+i.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),b){let y=t.displayColors?Math.max(r,l.lineHeight):l.lineHeight;p+=f*y+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}u&&(p+=t.footerMarginTop+u*h.lineHeight+(u-1)*t.footerSpacing);let _=0,v=function(y){m=Math.max(m,e.measureText(y).width+_)};return e.save(),e.font=c.string,E(i.title,v),e.font=l.string,E(i.beforeBody.concat(i.afterBody),v),_=t.displayColors?a+2+t.boxPadding:0,E(s,y=>{E(y.before,v),E(y.lines,v),E(y.after,v)}),_=0,e.font=h.string,E(i.footer,v),e.restore(),m+=g.width,{width:m,height:p}}function _c(i,t){let{y:e,height:s}=t;return ei.height-s/2?"bottom":"center"}function xc(i,t,e,s){let{x:n,width:o}=s,a=e.caretSize+e.caretPadding;if(i==="left"&&n+o+a>t.width||i==="right"&&n-o-a<0)return!0}function yc(i,t,e,s){let{x:n,width:o}=e,{width:a,chartArea:{left:r,right:l}}=i,c="center";return s==="center"?c=n<=(r+l)/2?"left":"right":n<=o/2?c="left":n>=a-o/2&&(c="right"),xc(c,i,t,e)&&(c="center"),c}function io(i,t,e){let s=e.yAlign||t.yAlign||_c(i,e);return{xAlign:e.xAlign||t.xAlign||yc(i,t,e,s),yAlign:s}}function vc(i,t){let{x:e,width:s}=i;return t==="right"?e-=s:t==="center"&&(e-=s/2),e}function Mc(i,t,e){let{y:s,height:n}=i;return t==="top"?s+=e:t==="bottom"?s-=n+e:s-=n/2,s}function so(i,t,e,s){let{caretSize:n,caretPadding:o,cornerRadius:a}=i,{xAlign:r,yAlign:l}=e,c=n+o,{topLeft:h,topRight:d,bottomLeft:u,bottomRight:f}=St(a),g=vc(t,r),p=Mc(t,l,c);return l==="center"?r==="left"?g+=c:r==="right"&&(g-=c):r==="left"?g-=Math.max(h,u)+n:r==="right"&&(g+=Math.max(d,f)+n),{x:Y(g,0,s.width-t.width),y:Y(p,0,s.height-t.height)}}function ri(i,t,e){let s=U(e.padding);return t==="center"?i.x+i.width/2:t==="right"?i.x+i.width-s.right:i.x+s.left}function no(i){return ct([],bt(i))}function wc(i,t,e){return pt(i,{tooltip:t,tooltipItems:e,type:"tooltip"})}function oo(i,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?i.override(e):i}var Le=class extends it{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,s=this.options.setContext(this.getContext()),n=s.enabled&&e.options.animation&&s.animations,o=new hi(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=wc(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:s}=e,n=s.beforeTitle.apply(this,[t]),o=s.title.apply(this,[t]),a=s.afterTitle.apply(this,[t]),r=[];return r=ct(r,bt(n)),r=ct(r,bt(o)),r=ct(r,bt(a)),r}getBeforeBody(t,e){return no(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){let{callbacks:s}=e,n=[];return E(t,o=>{let a={before:[],lines:[],after:[]},r=oo(s,o);ct(a.before,bt(r.beforeLabel.call(this,o))),ct(a.lines,r.label.call(this,o)),ct(a.after,bt(r.afterLabel.call(this,o))),n.push(a)}),n}getAfterBody(t,e){return no(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){let{callbacks:s}=e,n=s.beforeFooter.apply(this,[t]),o=s.footer.apply(this,[t]),a=s.afterFooter.apply(this,[t]),r=[];return r=ct(r,bt(n)),r=ct(r,bt(o)),r=ct(r,bt(a)),r}_createItems(t){let e=this._active,s=this.chart.data,n=[],o=[],a=[],r=[],l,c;for(l=0,c=e.length;lt.filter(h,d,u,s))),t.itemSort&&(r=r.sort((h,d)=>t.itemSort(h,d,s))),E(r,h=>{let d=oo(t.callbacks,h);n.push(d.labelColor.call(this,h)),o.push(d.labelPointStyle.call(this,h)),a.push(d.labelTextColor.call(this,h))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){let s=this.options.setContext(this.getContext()),n=this._active,o,a=[];if(!n.length)this.opacity!==0&&(o={opacity:0});else{let r=Ce[s.position].call(this,n,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);let l=this._size=eo(this,s),c=Object.assign({},r,l),h=io(this.chart,s,c),d=so(s,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,o={opacity:1,x:d.x,y:d.y,width:l.width,height:l.height,caretX:r.x,caretY:r.y}}this._tooltipItems=a,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,n){let o=this.getCaretPosition(t,s,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,s){let{xAlign:n,yAlign:o}=this,{caretSize:a,cornerRadius:r}=s,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:d}=St(r),{x:u,y:f}=t,{width:g,height:p}=e,m,b,_,v,y,x;return o==="center"?(y=f+p/2,n==="left"?(m=u,b=m-a,v=y+a,x=y-a):(m=u+g,b=m+a,v=y-a,x=y+a),_=m):(n==="left"?b=u+Math.max(l,h)+a:n==="right"?b=u+g-Math.max(c,d)-a:b=this.caretX,o==="top"?(v=f,y=v-a,m=b-a,_=b+a):(v=f+p,y=v+a,m=b+a,_=b-a),x=v),{x1:m,x2:b,x3:_,y1:v,y2:y,y3:x}}drawTitle(t,e,s){let n=this.title,o=n.length,a,r,l;if(o){let c=Et(s.rtl,this.x,this.width);for(t.x=ri(this,s.titleAlign,s),e.textAlign=c.textAlign(s.titleAlign),e.textBaseline="middle",a=$(s.titleFont),r=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;lv!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,Gt(t,{x:m,y:p,w:c,h:l,radius:_}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Gt(t,{x:b,y:p+1,w:c-2,h:l-2,radius:_}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(m,p,c,l),t.strokeRect(m,p,c,l),t.fillStyle=a.backgroundColor,t.fillRect(b,p+1,c-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){let{body:n}=this,{bodySpacing:o,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c,boxPadding:h}=s,d=$(s.bodyFont),u=d.lineHeight,f=0,g=Et(s.rtl,this.x,this.width),p=function(S){e.fillText(S,g.x(t.x+f),t.y+u/2),t.y+=u+o},m=g.textAlign(a),b,_,v,y,x,M,w;for(e.textAlign=a,e.textBaseline="middle",e.font=d.string,t.x=ri(this,m,s),e.fillStyle=s.bodyColor,E(this.beforeBody,p),f=r&&m!=="right"?a==="center"?c/2+h:c+2+h:0,y=0,M=n.length;y0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,s=this.$animations,n=s&&s.x,o=s&&s.y;if(n||o){let a=Ce[t.position].call(this,this._active,this._eventPosition);if(!a)return;let r=this._size=eo(this,t),l=Object.assign({},a,this._size),c=io(e,t,l),h=so(t,l,c,e);(n._to!==h.x||o._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=r.width,this.height=r.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),s=this.opacity;if(!s)return;this._updateAnimationTarget(e);let n={width:this.width,height:this.height},o={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;let a=U(e.padding),r=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&r&&(t.save(),t.globalAlpha=s,this.drawBackground(o,t,n,e),ts(t,e.textDirection),o.y+=a.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),es(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let s=this._active,n=t.map(({datasetIndex:r,index:l})=>{let c=this.chart.getDatasetMeta(r);if(!c)throw new Error("Cannot find a dataset at index "+r);return{datasetIndex:r,element:c.data[l],index:l}}),o=!be(s,n),a=this._positionChanged(n,e);(o||a)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let n=this.options,o=this._active||[],a=this._getActiveElements(t,o,e,s),r=this._positionChanged(a,t),l=e||!be(a,o)||r;return l&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,n){let o=this.options;if(t.type==="mouseout")return[];if(!n)return e;let a=this.chart.getElementsAtEventForMode(t,o.mode,o,s);return o.reverse&&a.reverse(),a}_positionChanged(t,e){let{caretX:s,caretY:n,options:o}=this,a=Ce[o.position].call(this,t,e);return a!==!1&&(s!==a.x||n!==a.y)}};Le.positioners=Ce;var kc={id:"tooltip",_element:Le,positioners:Ce,afterInit(i,t,e){e&&(i.tooltip=new Le({chart:i,options:e}))},beforeUpdate(i,t,e){i.tooltip&&i.tooltip.initialize(e)},reset(i,t,e){i.tooltip&&i.tooltip.initialize(e)},afterDraw(i){let t=i.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(i.notifyPlugins("beforeTooltipDraw",e)===!1)return;t.draw(i.ctx),i.notifyPlugins("afterTooltipDraw",e)}},afterEvent(i,t){if(i.tooltip){let e=t.replay;i.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(i,t)=>t.bodyFont.size,boxWidth:(i,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:rt,title(i){if(i.length>0){let t=i[0],e=t.chart.data.labels,s=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(s>0&&t.dataIndexi!=="filter"&&i!=="itemSort"&&i!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Sc=Object.freeze({__proto__:null,Decimation:$l,Filler:hc,Legend:fc,SubTitle:mc,Title:pc,Tooltip:kc}),Pc=(i,t,e,s)=>(typeof t=="string"?(e=i.push(t)-1,s.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function Cc(i,t,e,s){let n=i.indexOf(t);if(n===-1)return Pc(i,t,e,s);let o=i.lastIndexOf(t);return n!==o?e:n}var Dc=(i,t)=>i===null?null:Y(Math.round(i),0,t),he=class extends _t{constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){let e=this._addedLabels;if(e.length){let s=this.getLabels();for(let{index:n,label:o}of e)s[n]===o&&s.splice(n,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(T(t))return null;let s=this.getLabels();return e=isFinite(e)&&s[e]===t?e:Cc(s,t,C(e,t),this._addedLabels),Dc(e,s.length-1)}determineDataLimits(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),{min:s,max:n}=this.getMinMax(!0);this.options.bounds==="ticks"&&(t||(s=0),e||(n=this.getLabels().length-1)),this.min=s,this.max=n}buildTicks(){let t=this.min,e=this.max,s=this.options.offset,n=[],o=this.getLabels();o=t===0&&e===o.length-1?o:o.slice(t,e+1),this._valueRange=Math.max(o.length-(s?0:1),1),this._startValue=this.min-(s?.5:0);for(let a=t;a<=e;a++)n.push({value:a});return n}getLabelForValue(t){let e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};he.id="category";he.defaults={ticks:{callback:he.prototype.getLabelForValue}};function Oc(i,t){let e=[],{bounds:n,step:o,min:a,max:r,precision:l,count:c,maxTicks:h,maxDigits:d,includeBounds:u}=i,f=o||1,g=h-1,{min:p,max:m}=t,b=!T(a),_=!T(r),v=!T(c),y=(m-p)/(d+1),x=Ai((m-p)/g/f)*f,M,w,S,k;if(x<1e-14&&!b&&!_)return[{value:p},{value:m}];k=Math.ceil(m/x)-Math.floor(p/x),k>g&&(x=Ai(k*x/g/f)*f),T(l)||(M=Math.pow(10,l),x=Math.ceil(x*M)/M),n==="ticks"?(w=Math.floor(p/x)*x,S=Math.ceil(m/x)*x):(w=p,S=m),b&&_&&o&&Us((r-a)/o,x/1e3)?(k=Math.round(Math.min((r-a)/x,h)),x=(r-a)/k,w=a,S=r):v?(w=b?a:w,S=_?r:S,k=c-1,x=(S-w)/k):(k=(S-w)/x,Kt(k,Math.round(k),x/1e3)?k=Math.round(k):k=Math.ceil(k));let L=Math.max(Li(x),Li(w));M=Math.pow(10,T(l)?L:l),w=Math.round(w*M)/M,S=Math.round(S*M)/M;let R=0;for(b&&(u&&w!==a?(e.push({value:a}),wn=e?n:l,r=l=>o=s?o:l;if(t){let l=ot(n),c=ot(o);l<0&&c<0?r(0):l>0&&c>0&&a(0)}if(n===o){let l=1;(o>=Number.MAX_SAFE_INTEGER||n<=Number.MIN_SAFE_INTEGER)&&(l=Math.abs(o*.05)),r(o+l),t||a(n-l)}this.min=n,this.max=o}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:s}=t,n;return s?(n=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,s=this.getTickLimit();s=Math.max(2,s);let n={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},o=this._range||this,a=Oc(n,o);return t.bounds==="ticks"&&Ti(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){let t=this.ticks,e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){let n=(s-e)/Math.max(t.length-1,1)/2;e-=n,s+=n}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Jt(t,this.chart.options.locale,this.options.ticks.format)}},Re=class extends de{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=W(t)?t:0,this.max=W(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,s=nt(this.options.ticks.minRotation),n=(t?Math.sin(s):Math.cos(s))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};Re.id="linear";Re.defaults={ticks:{callback:mi.formatters.numeric}};function ro(i){return i/Math.pow(10,Math.floor(tt(i)))===1}function Ac(i,t){let e=Math.floor(tt(t.max)),s=Math.ceil(t.max/Math.pow(10,e)),n=[],o=Q(i.min,Math.pow(10,Math.floor(tt(t.min)))),a=Math.floor(tt(o)),r=Math.floor(o/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do n.push({value:o,major:ro(o)}),++r,r===10&&(r=1,++a,l=a>=0?1:l),o=Math.round(r*Math.pow(10,a)*l)/l;while(a0?s:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=W(t)?Math.max(0,t):null,this.max=W(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),s=this.min,n=this.max,o=l=>s=t?s:l,a=l=>n=e?n:l,r=(l,c)=>Math.pow(10,Math.floor(tt(l))+c);s===n&&(s<=0?(o(1),a(10)):(o(r(s,-1)),a(r(n,1)))),s<=0&&o(r(n,-1)),n<=0&&a(r(s,1)),this._zero&&this.min!==this._suggestedMin&&s===r(this.min,0)&&o(r(s,-1)),this.min=s,this.max=n}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},s=Ac(e,this);return t.bounds==="ticks"&&Ti(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return t===void 0?"0":Jt(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=tt(t),this._valueRange=tt(this.max)-tt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(tt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};Ee.id="logarithmic";Ee.defaults={ticks:{callback:mi.formatters.logarithmic,major:{enabled:!0}}};function Ss(i){let t=i.ticks;if(t.display&&i.display){let e=U(t.backdropPadding);return C(t.font&&t.font.size,O.font.size)+e.height}return 0}function Tc(i,t,e){return e=I(e)?e:[e],{w:rn(i,t.string,e),h:e.length*t.lineHeight}}function lo(i,t,e,s,n){return i===s||i===n?{start:t-e/2,end:t+e/2}:in?{start:t-e,end:t}:{start:t,end:t+e}}function Lc(i){let t={l:i.left+i._padding.left,r:i.right-i._padding.right,t:i.top+i._padding.top,b:i.bottom-i._padding.bottom},e=Object.assign({},t),s=[],n=[],o=i._pointLabels.length,a=i.options.pointLabels,r=a.centerPointLabels?B/o:0;for(let l=0;lt.r&&(r=(s.end-t.r)/o,i.r=Math.max(i.r,t.r+r)),n.startt.b&&(l=(n.end-t.b)/a,i.b=Math.max(i.b,t.b+l))}function Ec(i,t,e){let s=[],n=i._pointLabels.length,o=i.options,a=Ss(o)/2,r=i.drawingArea,l=o.pointLabels.centerPointLabels?B/n:0;for(let c=0;c270||e<90)&&(i-=t),i}function Bc(i,t){let{ctx:e,options:{pointLabels:s}}=i;for(let n=t-1;n>=0;n--){let o=s.setContext(i.getPointLabelContext(n)),a=$(o.font),{x:r,y:l,textAlign:c,left:h,top:d,right:u,bottom:f}=i._pointLabelItems[n],{backdropColor:g}=o;if(!T(g)){let p=St(o.borderRadius),m=U(o.backdropPadding);e.fillStyle=g;let b=h-m.left,_=d-m.top,v=u-h+m.width,y=f-d+m.height;Object.values(p).some(x=>x!==0)?(e.beginPath(),Gt(e,{x:b,y:_,w:v,h:y,radius:p}),e.fill()):e.fillRect(b,_,v,y)}kt(e,i._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:c,textBaseline:"middle"})}}function Lo(i,t,e,s){let{ctx:n}=i;if(e)n.arc(i.xCenter,i.yCenter,t,0,F);else{let o=i.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let a=1;a{let n=z(this.options.pointLabels.callback,[e,s],this);return n||n===0?n:""}).filter((e,s)=>this.chart.getDataVisibility(s))}fit(){let t=this.options;t.display&&t.pointLabels.display?Lc(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,n))}getIndexAngle(t){let e=F/(this._pointLabels.length||1),s=this.options.startAngle||0;return G(t*e+nt(s))}getDistanceFromCenterForValue(t){if(T(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(T(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(h!==0){r=this.getDistanceFromCenterForValue(c.value);let d=n.setContext(this.getContext(h-1));Vc(this,d,r,o)}}),s.display){for(t.save(),a=o-1;a>=0;a--){let c=s.setContext(this.getPointLabelContext(a)),{color:h,lineWidth:d}=c;!d||!h||(t.lineWidth=d,t.strokeStyle=h,t.setLineDash(c.borderDash),t.lineDashOffset=c.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;let n=this.getIndexAngle(0),o,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((r,l)=>{if(l===0&&!e.reverse)return;let c=s.setContext(this.getContext(l)),h=$(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,a=t.measureText(r.label).width,t.fillStyle=c.backdropColor;let d=U(c.backdropPadding);t.fillRect(-a/2-d.left,-o-h.size/2-d.top,a+d.width,h.size+d.height)}kt(t,r.label,0,-o,h,{color:c.color})}),t.restore()}drawTitle(){}};zt.id="radialLinear";zt.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:mi.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(i){return i},padding:5,centerPointLabels:!1}};zt.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};zt.descriptors={angleLines:{_fallback:"grid"}};var bi={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Z=Object.keys(bi);function Nc(i,t){return i-t}function co(i,t){if(T(t))return null;let e=i._adapter,{parser:s,round:n,isoWeekday:o}=i._parseOpts,a=t;return typeof s=="function"&&(a=s(a)),W(a)||(a=typeof s=="string"?e.parse(a,s):e.parse(a)),a===null?null:(n&&(a=n==="week"&&(Rt(o)||o===!0)?e.startOf(a,"isoWeek",o):e.startOf(a,n)),+a)}function ho(i,t,e,s){let n=Z.length;for(let o=Z.indexOf(i);o=Z.indexOf(e);o--){let a=Z[o];if(bi[a].common&&i._adapter.diff(n,s,a)>=t-1)return a}return Z[e?Z.indexOf(e):0]}function jc(i){for(let t=Z.indexOf(i)+1,e=Z.length;t=t?e[s]:e[n];i[o]=!0}}function $c(i,t,e,s){let n=i._adapter,o=+n.startOf(t[0].value,s),a=t[t.length-1].value,r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=e[r],l>=0&&(t[l].major=!0);return t}function fo(i,t,e){let s=[],n={},o=t.length,a,r;for(a=0;a+t.value))}initOffsets(t){let e=0,s=0,n,o;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?s=o:s=(o-this.getDecimalForValue(t[t.length-2]))/2);let a=t.length<3?.5:.25;e=Y(e,0,a),s=Y(s,0,a),this._offsets={start:e,end:s,factor:1/(e+1+s)}}_generate(){let t=this._adapter,e=this.min,s=this.max,n=this.options,o=n.time,a=o.unit||ho(o.minUnit,e,s,this._getLabelCapacity(e)),r=C(o.stepSize,1),l=a==="week"?o.isoWeekday:!1,c=Rt(l)||l===!0,h={},d=e,u,f;if(c&&(d=+t.startOf(d,"isoWeek",l)),d=+t.startOf(d,c?"day":a),t.diff(s,e,a)>1e5*r)throw new Error(e+" and "+s+" are too far apart with stepSize of "+r+" "+a);let g=n.ticks.source==="data"&&this.getDataTimestamps();for(u=d,f=0;up-m).map(p=>+p)}getLabelForValue(t){let e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}_tickFormatFunction(t,e,s,n){let o=this.options,a=o.time.displayFormats,r=this._unit,l=this._majorUnit,c=r&&a[r],h=l&&a[l],d=s[e],u=l&&h&&d&&d.major,f=this._adapter.format(t,n||(u?h:c)),g=o.ticks.callback;return g?z(g,[f,e,s],this):f}generateTickLabels(t){let e,s,n;for(e=0,s=t.length;e0?r:1}getDataTimestamps(){let t=this._cache.data||[],e,s;if(t.length)return t;let n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,s=n.length;e=i[s].pos&&t<=i[n].pos&&({lo:s,hi:n}=at(i,"pos",t)),{pos:o,time:r}=i[s],{pos:a,time:l}=i[n]):(t>=i[s].time&&t<=i[n].time&&({lo:s,hi:n}=at(i,"time",t)),{time:o,pos:r}=i[s],{time:a,pos:l}=i[n]);let c=a-o;return c?r+(l-r)*(t-o)/c:r}var Fe=class extends Bt{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=li(e,this.min),this._tableRange=li(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:s}=this,n=[],o=[],a,r,l,c,h;for(a=0,r=t.length;a=e&&c<=s&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,r=n.length;a{Alpine.store("theme");let s=this.getChart();s&&s.destroy(),this.initChart()}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Alpine.store("theme")==="system"&&this.$nextTick(()=>{let s=this.getChart();s&&s.destroy(),this.initChart()})})},initChart:function(){return new Cs(this.$refs.canvas,{type:"line",data:{labels:t,datasets:[{data:e,borderWidth:2,fill:"start",tension:.5,backgroundColor:getComputedStyle(this.$refs.backgroundColorElement).color,borderColor:getComputedStyle(this.$refs.borderColorElement).color}]},options:{animation:{duration:0},elements:{point:{radius:0}},maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{x:{display:!1},y:{display:!1}},tooltips:{enabled:!1}}})},getChart:function(){return Cs.getChart(this.$refs.canvas)}}}export{Xc as default}; +`):i}function Qc(i,t){let{element:e,datasetIndex:s,index:n}=t,o=i.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:i,label:a,parsed:o.getParsed(n),raw:i.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:e}}function po(i,t){let e=i.chart.ctx,{body:s,footer:n,title:o}=i,{boxWidth:a,boxHeight:r}=t,l=$(t.bodyFont),c=$(t.titleFont),h=$(t.footerFont),d=o.length,u=n.length,f=s.length,g=q(t.padding),p=g.height,m=0,b=s.reduce((y,_)=>y+_.before.length+_.lines.length+_.after.length,0);if(b+=i.beforeBody.length+i.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),b){let y=t.displayColors?Math.max(r,l.lineHeight):l.lineHeight;p+=f*y+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}u&&(p+=t.footerMarginTop+u*h.lineHeight+(u-1)*t.footerSpacing);let x=0,v=function(y){m=Math.max(m,e.measureText(y).width+x)};return e.save(),e.font=c.string,E(i.title,v),e.font=l.string,E(i.beforeBody.concat(i.afterBody),v),x=t.displayColors?a+2+t.boxPadding:0,E(s,y=>{E(y.before,v),E(y.lines,v),E(y.after,v)}),x=0,e.font=h.string,E(i.footer,v),e.restore(),m+=g.width,{width:m,height:p}}function th(i,t){let{y:e,height:s}=t;return ei.height-s/2?"bottom":"center"}function eh(i,t,e,s){let{x:n,width:o}=s,a=e.caretSize+e.caretPadding;if(i==="left"&&n+o+a>t.width||i==="right"&&n-o-a<0)return!0}function ih(i,t,e,s){let{x:n,width:o}=e,{width:a,chartArea:{left:r,right:l}}=i,c="center";return s==="center"?c=n<=(r+l)/2?"left":"right":n<=o/2?c="left":n>=a-o/2&&(c="right"),eh(c,i,t,e)&&(c="center"),c}function mo(i,t,e){let s=e.yAlign||t.yAlign||th(i,e);return{xAlign:e.xAlign||t.xAlign||ih(i,t,e,s),yAlign:s}}function sh(i,t){let{x:e,width:s}=i;return t==="right"?e-=s:t==="center"&&(e-=s/2),e}function nh(i,t,e){let{y:s,height:n}=i;return t==="top"?s+=e:t==="bottom"?s-=n+e:s-=n/2,s}function bo(i,t,e,s){let{caretSize:n,caretPadding:o,cornerRadius:a}=i,{xAlign:r,yAlign:l}=e,c=n+o,{topLeft:h,topRight:d,bottomLeft:u,bottomRight:f}=Tt(a),g=sh(t,r),p=nh(t,l,c);return l==="center"?r==="left"?g+=c:r==="right"&&(g-=c):r==="left"?g-=Math.max(h,u)+n:r==="right"&&(g+=Math.max(d,f)+n),{x:Y(g,0,s.width-t.width),y:Y(p,0,s.height-t.height)}}function bi(i,t,e){let s=q(e.padding);return t==="center"?i.x+i.width/2:t==="right"?i.x+i.width-s.right:i.x+s.left}function xo(i){return ft([],Mt(i))}function oh(i,t,e){return yt(i,{tooltip:t,tooltipItems:e,type:"tooltip"})}function _o(i,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?i.override(e):i}var Ko={beforeTitle:dt,title(i){if(i.length>0){let t=i[0],e=t.chart.data.labels,s=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(s>0&&t.dataIndex"u"?Ko[t].call(e,s):n}var We=class extends st{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,s=this.options.setContext(this.getContext()),n=s.enabled&&e.options.animation&&s.animations,o=new vi(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=oh(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:s}=e,n=Q(s,"beforeTitle",this,t),o=Q(s,"title",this,t),a=Q(s,"afterTitle",this,t),r=[];return r=ft(r,Mt(n)),r=ft(r,Mt(o)),r=ft(r,Mt(a)),r}getBeforeBody(t,e){return xo(Q(e.callbacks,"beforeBody",this,t))}getBody(t,e){let{callbacks:s}=e,n=[];return E(t,o=>{let a={before:[],lines:[],after:[]},r=_o(s,o);ft(a.before,Mt(Q(r,"beforeLabel",this,o))),ft(a.lines,Q(r,"label",this,o)),ft(a.after,Mt(Q(r,"afterLabel",this,o))),n.push(a)}),n}getAfterBody(t,e){return xo(Q(e.callbacks,"afterBody",this,t))}getFooter(t,e){let{callbacks:s}=e,n=Q(s,"beforeFooter",this,t),o=Q(s,"footer",this,t),a=Q(s,"afterFooter",this,t),r=[];return r=ft(r,Mt(n)),r=ft(r,Mt(o)),r=ft(r,Mt(a)),r}_createItems(t){let e=this._active,s=this.chart.data,n=[],o=[],a=[],r=[],l,c;for(l=0,c=e.length;lt.filter(h,d,u,s))),t.itemSort&&(r=r.sort((h,d)=>t.itemSort(h,d,s))),E(r,h=>{let d=_o(t.callbacks,h);n.push(Q(d,"labelColor",this,h)),o.push(Q(d,"labelPointStyle",this,h)),a.push(Q(d,"labelTextColor",this,h))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){let s=this.options.setContext(this.getContext()),n=this._active,o,a=[];if(!n.length)this.opacity!==0&&(o={opacity:0});else{let r=Ie[s.position].call(this,n,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);let l=this._size=po(this,s),c=Object.assign({},r,l),h=mo(this.chart,s,c),d=bo(s,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,o={opacity:1,x:d.x,y:d.y,width:l.width,height:l.height,caretX:r.x,caretY:r.y}}this._tooltipItems=a,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,n){let o=this.getCaretPosition(t,s,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,s){let{xAlign:n,yAlign:o}=this,{caretSize:a,cornerRadius:r}=s,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:d}=Tt(r),{x:u,y:f}=t,{width:g,height:p}=e,m,b,x,v,y,_;return o==="center"?(y=f+p/2,n==="left"?(m=u,b=m-a,v=y+a,_=y-a):(m=u+g,b=m+a,v=y-a,_=y+a),x=m):(n==="left"?b=u+Math.max(l,h)+a:n==="right"?b=u+g-Math.max(c,d)-a:b=this.caretX,o==="top"?(v=f,y=v-a,m=b-a,x=b+a):(v=f+p,y=v+a,m=b+a,x=b-a),_=v),{x1:m,x2:b,x3:x,y1:v,y2:y,y3:_}}drawTitle(t,e,s){let n=this.title,o=n.length,a,r,l;if(o){let c=Wt(s.rtl,this.x,this.width);for(t.x=bi(this,s.titleAlign,s),e.textAlign=c.textAlign(s.titleAlign),e.textBaseline="middle",a=$(s.titleFont),r=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;lx!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,oe(t,{x:p,y:g,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),oe(t,{x:m,y:g+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(p,g,c,l),t.strokeRect(p,g,c,l),t.fillStyle=a.backgroundColor,t.fillRect(m,g+1,c-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){let{body:n}=this,{bodySpacing:o,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c,boxPadding:h}=s,d=$(s.bodyFont),u=d.lineHeight,f=0,g=Wt(s.rtl,this.x,this.width),p=function(S){e.fillText(S,g.x(t.x+f),t.y+u/2),t.y+=u+o},m=g.textAlign(a),b,x,v,y,_,k,w;for(e.textAlign=a,e.textBaseline="middle",e.font=d.string,t.x=bi(this,m,s),e.fillStyle=s.bodyColor,E(this.beforeBody,p),f=r&&m!=="right"?a==="center"?c/2+h:c+2+h:0,y=0,k=n.length;y0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,s=this.$animations,n=s&&s.x,o=s&&s.y;if(n||o){let a=Ie[t.position].call(this,this._active,this._eventPosition);if(!a)return;let r=this._size=po(this,t),l=Object.assign({},a,this._size),c=mo(e,t,l),h=bo(t,l,c,e);(n._to!==h.x||o._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=r.width,this.height=r.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),s=this.opacity;if(!s)return;this._updateAnimationTarget(e);let n={width:this.width,height:this.height},o={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;let a=q(e.padding),r=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&r&&(t.save(),t.globalAlpha=s,this.drawBackground(o,t,n,e),as(t,e.textDirection),o.y+=a.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),rs(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let s=this._active,n=t.map(({datasetIndex:r,index:l})=>{let c=this.chart.getDatasetMeta(r);if(!c)throw new Error("Cannot find a dataset at index "+r);return{datasetIndex:r,element:c.data[l],index:l}}),o=!we(s,n),a=this._positionChanged(n,e);(o||a)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let n=this.options,o=this._active||[],a=this._getActiveElements(t,o,e,s),r=this._positionChanged(a,t),l=e||!we(a,o)||r;return l&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,n){let o=this.options;if(t.type==="mouseout")return[];if(!n)return e.filter(r=>this.chart.data.datasets[r.datasetIndex]&&this.chart.getDatasetMeta(r.datasetIndex).controller.getParsed(r.index)!==void 0);let a=this.chart.getElementsAtEventForMode(t,o.mode,o,s);return o.reverse&&a.reverse(),a}_positionChanged(t,e){let{caretX:s,caretY:n,options:o}=this,a=Ie[o.position].call(this,t,e);return a!==!1&&(s!==a.x||n!==a.y)}};M(We,"positioners",Ie);var ah={id:"tooltip",_element:We,positioners:Ie,afterInit(i,t,e){e&&(i.tooltip=new We({chart:i,options:e}))},beforeUpdate(i,t,e){i.tooltip&&i.tooltip.initialize(e)},reset(i,t,e){i.tooltip&&i.tooltip.initialize(e)},afterDraw(i){let t=i.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(i.notifyPlugins("beforeTooltipDraw",{...e,cancelable:!0})===!1)return;t.draw(i.ctx),i.notifyPlugins("afterTooltipDraw",e)}},afterEvent(i,t){if(i.tooltip){let e=t.replay;i.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(i,t)=>t.bodyFont.size,boxWidth:(i,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Ko},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:i=>i!=="filter"&&i!=="itemSort"&&i!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},rh=Object.freeze({__proto__:null,Colors:_c,Decimation:kc,Filler:jc,Legend:qc,SubTitle:Zc,Title:Jc,Tooltip:ah}),lh=(i,t,e,s)=>(typeof t=="string"?(e=i.push(t)-1,s.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function ch(i,t,e,s){let n=i.indexOf(t);if(n===-1)return lh(i,t,e,s);let o=i.lastIndexOf(t);return n!==o?e:n}var hh=(i,t)=>i===null?null:Y(Math.round(i),0,t);function yo(i){let t=this.getLabels();return i>=0&&ie.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};M(Fe,"id","category"),M(Fe,"defaults",{ticks:{callback:yo}});function dh(i,t){let e=[],{bounds:n,step:o,min:a,max:r,precision:l,count:c,maxTicks:h,maxDigits:d,includeBounds:u}=i,f=o||1,g=h-1,{min:p,max:m}=t,b=!A(a),x=!A(r),v=!A(c),y=(m-p)/(d+1),_=Vi((m-p)/g/f)*f,k,w,S,P;if(_<1e-14&&!b&&!x)return[{value:p},{value:m}];P=Math.ceil(m/_)-Math.floor(p/_),P>g&&(_=Vi(P*_/g/f)*f),A(l)||(k=Math.pow(10,l),_=Math.ceil(_*k)/k),n==="ticks"?(w=Math.floor(p/_)*_,S=Math.ceil(m/_)*_):(w=p,S=m),b&&x&&o&&an((r-a)/o,_/1e3)?(P=Math.round(Math.min((r-a)/_,h)),_=(r-a)/P,w=a,S=r):v?(w=b?a:w,S=x?r:S,P=c-1,_=(S-w)/P):(P=(S-w)/_,ie(P,Math.round(P),_/1e3)?P=Math.round(P):P=Math.ceil(P));let O=Math.max(Ni(_),Ni(w));k=Math.pow(10,A(l)?O:l),w=Math.round(w*k)/k,S=Math.round(S*k)/k;let C=0;for(b&&(u&&w!==a?(e.push({value:a}),wr)break;e.push({value:L})}return x&&u&&S!==r?e.length&&ie(e[e.length-1].value,r,vo(r,y,i))?e[e.length-1].value=r:e.push({value:r}):(!x||S===r)&&e.push({value:S}),e}function vo(i,t,{horizontal:e,minRotation:s}){let n=ot(s),o=(e?Math.sin(n):Math.cos(n))||.001,a=.75*t*(""+i).length;return Math.min(t/o,a)}var me=class extends Xt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return A(t)||(typeof t=="number"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){let{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds(),{min:n,max:o}=this,a=l=>n=e?n:l,r=l=>o=s?o:l;if(t){let l=lt(n),c=lt(o);l<0&&c<0?r(0):l>0&&c>0&&a(0)}if(n===o){let l=o===0?1:Math.abs(o*.05);r(o+l),t||a(n-l)}this.min=n,this.max=o}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:s}=t,n;return s?(n=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,s=this.getTickLimit();s=Math.max(2,s);let n={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},o=this._range||this,a=dh(n,o);return t.bounds==="ticks"&&Wi(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){let t=this.ticks,e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){let n=(s-e)/Math.max(t.length-1,1)/2;e-=n,s+=n}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}},ze=class extends me{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=N(t)?t:0,this.max=N(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,s=ot(this.options.ticks.minRotation),n=(t?Math.sin(s):Math.cos(s))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};M(ze,"id","linear"),M(ze,"defaults",{ticks:{callback:Se.formatters.numeric}});var je=i=>Math.floor(xt(i)),Ht=(i,t)=>Math.pow(10,je(i)+t);function Mo(i){return i/Math.pow(10,je(i))===1}function ko(i,t,e){let s=Math.pow(10,e),n=Math.floor(i/s);return Math.ceil(t/s)-n}function uh(i,t){let e=t-i,s=je(e);for(;ko(i,t,s)>10;)s++;for(;ko(i,t,s)<10;)s--;return Math.min(s,je(i))}function fh(i,{min:t,max:e}){t=Z(i.min,t);let s=[],n=je(t),o=uh(t,e),a=o<0?Math.pow(10,Math.abs(o)):1,r=Math.pow(10,o),l=n>o?Math.pow(10,n):0,c=Math.round((t-l)*a)/a,h=Math.floor((t-l)/r/10)*r*10,d=Math.floor((c-h)/Math.pow(10,o)),u=Z(i.min,Math.round((l+h+d*Math.pow(10,o))*a)/a);for(;u=10?d=d<15?15:20:d++,d>=20&&(o++,d=2,a=o>=0?1:a),u=Math.round((l+h+d*Math.pow(10,o))*a)/a;let f=Z(i.max,u);return s.push({value:f,major:Mo(f),significand:d}),s}var Be=class extends Xt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){let s=me.prototype.parse.apply(this,[t,e]);if(s===0){this._zero=!0;return}return N(s)&&s>0?s:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=N(t)?Math.max(0,t):null,this.max=N(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!N(this._userMin)&&(this.min=t===Ht(this.min,0)?Ht(this.min,-1):Ht(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),s=this.min,n=this.max,o=r=>s=t?s:r,a=r=>n=e?n:r;s===n&&(s<=0?(o(1),a(10)):(o(Ht(s,-1)),a(Ht(n,1)))),s<=0&&o(Ht(n,-1)),n<=0&&a(Ht(s,1)),this.min=s,this.max=n}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},s=fh(e,this);return t.bounds==="ticks"&&Wi(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return t===void 0?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=xt(t),this._valueRange=xt(this.max)-xt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(xt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};M(Be,"id","logarithmic"),M(Be,"defaults",{ticks:{callback:Se.formatters.logarithmic,major:{enabled:!0}}});function Is(i){let t=i.ticks;if(t.display&&i.display){let e=q(t.backdropPadding);return D(t.font&&t.font.size,V.font.size)+e.height}return 0}function gh(i,t,e){return e=z(e)?e:[e],{w:pn(i,t.string,e),h:e.length*t.lineHeight}}function wo(i,t,e,s,n){return i===s||i===n?{start:t-e/2,end:t+e/2}:in?{start:t-e,end:t}:{start:t,end:t+e}}function ph(i){let t={l:i.left+i._padding.left,r:i.right-i._padding.right,t:i.top+i._padding.top,b:i.bottom-i._padding.bottom},e=Object.assign({},t),s=[],n=[],o=i._pointLabels.length,a=i.options.pointLabels,r=a.centerPointLabels?R/o:0;for(let l=0;lt.r&&(r=(s.end-t.r)/o,i.r=Math.max(i.r,t.r+r)),n.startt.b&&(l=(n.end-t.b)/a,i.b=Math.max(i.b,t.b+l))}function bh(i,t,e){let s=i.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=e,l=i.getPointPosition(t,s+n+a,o),c=Math.round(si(X(l.angle+H))),h=Mh(l.y,r.h,c),d=yh(c),u=vh(l.x,r.w,d);return{visible:!0,x:l.x,y:h,textAlign:d,left:u,top:h,right:u+r.w,bottom:h+r.h}}function xh(i,t){if(!t)return!0;let{left:e,top:s,right:n,bottom:o}=i;return!(ht({x:e,y:s},t)||ht({x:e,y:o},t)||ht({x:n,y:s},t)||ht({x:n,y:o},t))}function _h(i,t,e){let s=[],n=i._pointLabels.length,o=i.options,{centerPointLabels:a,display:r}=o.pointLabels,l={extra:Is(o)/2,additionalAngle:a?R/n:0},c;for(let h=0;h270||e<90)&&(i-=t),i}function kh(i,t,e){let{left:s,top:n,right:o,bottom:a}=e,{backdropColor:r}=t;if(!A(r)){let l=Tt(t.borderRadius),c=q(t.backdropPadding);i.fillStyle=r;let h=s-c.left,d=n-c.top,u=o-s+c.width,f=a-n+c.height;Object.values(l).some(g=>g!==0)?(i.beginPath(),oe(i,{x:h,y:d,w:u,h:f,radius:l}),i.fill()):i.fillRect(h,d,u,f)}}function wh(i,t){let{ctx:e,options:{pointLabels:s}}=i;for(let n=t-1;n>=0;n--){let o=i._pointLabelItems[n];if(!o.visible)continue;let a=s.setContext(i.getPointLabelContext(n));kh(e,a,o);let r=$(a.font),{x:l,y:c,textAlign:h}=o;At(e,i._pointLabels[n],l,c+r.lineHeight/2,r,{color:a.color,textAlign:h,textBaseline:"middle"})}}function qo(i,t,e,s){let{ctx:n}=i;if(e)n.arc(i.xCenter,i.yCenter,t,0,B);else{let o=i.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let a=1;a{let n=F(this.options.pointLabels.callback,[e,s],this);return n||n===0?n:""}).filter((e,s)=>this.chart.getDataVisibility(s))}fit(){let t=this.options;t.display&&t.pointLabels.display?ph(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,n))}getIndexAngle(t){let e=B/(this._pointLabels.length||1),s=this.options.startAngle||0;return X(t*e+ot(s))}getDistanceFromCenterForValue(t){if(A(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(A(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(d!==0||d===0&&this.min<0){l=this.getDistanceFromCenterForValue(h.value);let u=this.getContext(d),f=n.setContext(u),g=o.setContext(u);Sh(this,f,l,a,g)}}),s.display){for(t.save(),r=a-1;r>=0;r--){let h=s.setContext(this.getPointLabelContext(r)),{color:d,lineWidth:u}=h;!u||!d||(t.lineWidth=u,t.strokeStyle=d,t.setLineDash(h.borderDash),t.lineDashOffset=h.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),c=this.getPointPosition(r,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(c.x,c.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;let n=this.getIndexAngle(0),o,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((r,l)=>{if(l===0&&this.min>=0&&!e.reverse)return;let c=s.setContext(this.getContext(l)),h=$(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,a=t.measureText(r.label).width,t.fillStyle=c.backdropColor;let d=q(c.backdropPadding);t.fillRect(-a/2-d.left,-o-h.size/2-d.top,a+d.width,h.size+d.height)}At(t,r.label,0,-o,h,{color:c.color,strokeColor:c.textStrokeColor,strokeWidth:c.textStrokeWidth})}),t.restore()}drawTitle(){}};M($t,"id","radialLinear"),M($t,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Se.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),M($t,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),M($t,"descriptors",{angleLines:{_fallback:"grid"}});var Oi={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},tt=Object.keys(Oi);function So(i,t){return i-t}function Po(i,t){if(A(t))return null;let e=i._adapter,{parser:s,round:n,isoWeekday:o}=i._parseOpts,a=t;return typeof s=="function"&&(a=s(a)),N(a)||(a=typeof s=="string"?e.parse(a,s):e.parse(a)),a===null?null:(n&&(a=n==="week"&&(Vt(o)||o===!0)?e.startOf(a,"isoWeek",o):e.startOf(a,n)),+a)}function Do(i,t,e,s){let n=tt.length;for(let o=tt.indexOf(i);o=tt.indexOf(e);o--){let a=tt[o];if(Oi[a].common&&i._adapter.diff(n,s,a)>=t-1)return a}return tt[e?tt.indexOf(e):0]}function Oh(i){for(let t=tt.indexOf(i)+1,e=tt.length;t=t?e[s]:e[n];i[o]=!0}}function Ch(i,t,e,s){let n=i._adapter,o=+n.startOf(t[0].value,s),a=t[t.length-1].value,r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=e[r],l>=0&&(t[l].major=!0);return t}function Co(i,t,e){let s=[],n={},o=t.length,a,r;for(a=0;a+t.value))}initOffsets(t=[]){let e=0,s=0,n,o;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?s=o:s=(o-this.getDecimalForValue(t[t.length-2]))/2);let a=t.length<3?.5:.25;e=Y(e,0,a),s=Y(s,0,a),this._offsets={start:e,end:s,factor:1/(e+1+s)}}_generate(){let t=this._adapter,e=this.min,s=this.max,n=this.options,o=n.time,a=o.unit||Do(o.minUnit,e,s,this._getLabelCapacity(e)),r=D(n.ticks.stepSize,1),l=a==="week"?o.isoWeekday:!1,c=Vt(l)||l===!0,h={},d=e,u,f;if(c&&(d=+t.startOf(d,"isoWeek",l)),d=+t.startOf(d,c?"day":a),t.diff(s,e,a)>1e5*r)throw new Error(e+" and "+s+" are too far apart with stepSize of "+r+" "+a);let g=n.ticks.source==="data"&&this.getDataTimestamps();for(u=d,f=0;u+p)}getLabelForValue(t){let e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){let n=this.options.time.displayFormats,o=this._unit,a=e||n[o];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,n){let o=this.options,a=o.ticks.callback;if(a)return F(a,[t,e,s],this);let r=o.time.displayFormats,l=this._unit,c=this._majorUnit,h=l&&r[l],d=c&&r[c],u=s[e],f=c&&d&&u&&u.major;return this._adapter.format(t,n||(f?d:h))}generateTickLabels(t){let e,s,n;for(e=0,s=t.length;e0?r:1}getDataTimestamps(){let t=this._cache.data||[],e,s;if(t.length)return t;let n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,s=n.length;e=i[s].pos&&t<=i[n].pos&&({lo:s,hi:n}=ct(i,"pos",t)),{pos:o,time:r}=i[s],{pos:a,time:l}=i[n]):(t>=i[s].time&&t<=i[n].time&&({lo:s,hi:n}=ct(i,"time",t)),{time:o,pos:r}=i[s],{time:a,pos:l}=i[n]);let c=a-o;return c?r+(l-r)*(t-o)/c:r}var Ve=class extends Ut{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=xi(e,this.min),this._tableRange=xi(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:s}=this,n=[],o=[],a,r,l,c,h;for(a=0,r=t.length;a=e&&c<=s&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,r=n.length;an-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;let e=this.getDataTimestamps(),s=this.getLabelTimestamps();return e.length&&s.length?t=this.normalize(e.concat(s)):t=e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(xi(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){let e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return xi(this._table,s*this._tableRange+this._minPos,!0)}};M(Ve,"id","timeseries"),M(Ve,"defaults",Ut.defaults);var Ah=Object.freeze({__proto__:null,CategoryScale:Fe,LinearScale:ze,LogarithmicScale:Be,RadialLinearScale:$t,TimeScale:Ut,TimeSeriesScale:Ve}),Go=[Nr,uc,rh,Ah];at.register(...Go);var Fs=at;function Th({dataChecksum:i,labels:t,values:e}){return{dataChecksum:i,init(){Alpine.effect(()=>{Alpine.store("theme");let s=this.getChart();s&&s.destroy(),this.initChart()}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Alpine.store("theme")==="system"&&this.$nextTick(()=>{let s=this.getChart();s&&s.destroy(),this.initChart()})})},initChart(){if(!(!this.$refs.canvas||!this.$refs.backgroundColorElement||!this.$refs.borderColorElement))return new Fs(this.$refs.canvas,{type:"line",data:{labels:t,datasets:[{data:e,borderWidth:2,fill:"start",tension:.5,backgroundColor:getComputedStyle(this.$refs.backgroundColorElement).color,borderColor:getComputedStyle(this.$refs.borderColorElement).color}]},options:{animation:{duration:0},elements:{point:{radius:0}},maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{x:{display:!1},y:{display:!1}},tooltips:{enabled:!1}}})},getChart(){return this.$refs.canvas?Fs.getChart(this.$refs.canvas):null}}}export{Th as default}; /*! Bundled license information: -chart.js/dist/chunks/helpers.segment.mjs: +@kurkle/color/dist/color.esm.js: (*! - * Chart.js v3.9.1 - * https://www.chartjs.org - * (c) 2022 Chart.js Contributors - * Released under the MIT License - *) - -chart.js/dist/chunks/helpers.segment.mjs: - (*! - * @kurkle/color v0.2.1 + * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme - * (c) 2022 Jukka Kurkela + * (c) 2024 Jukka Kurkela * Released under the MIT License *) -chart.js/dist/chart.mjs: +chart.js/dist/chunks/helpers.dataset.js: +chart.js/dist/chart.js: (*! - * Chart.js v3.9.1 + * Chart.js v4.5.1 * https://www.chartjs.org - * (c) 2022 Chart.js Contributors + * (c) 2025 Chart.js Contributors * Released under the MIT License *) */ diff --git a/public/js/keyboard.polyfill.js b/public/js/keyboard.polyfill.js deleted file mode 100644 index cc78b36dab..0000000000 --- a/public/js/keyboard.polyfill.js +++ /dev/null @@ -1,121 +0,0 @@ -/* global define, KeyboardEvent, module */ - -(function () { - - var keyboardeventKeyPolyfill = { - polyfill: polyfill, - keys: { - 3: 'Cancel', - 6: 'Help', - 8: 'Backspace', - 9: 'Tab', - 12: 'Clear', - 13: 'Enter', - 16: 'Shift', - 17: 'Control', - 18: 'Alt', - 19: 'Pause', - 20: 'CapsLock', - 27: 'Escape', - 28: 'Convert', - 29: 'NonConvert', - 30: 'Accept', - 31: 'ModeChange', - 32: ' ', - 33: 'PageUp', - 34: 'PageDown', - 35: 'End', - 36: 'Home', - 37: 'ArrowLeft', - 38: 'ArrowUp', - 39: 'ArrowRight', - 40: 'ArrowDown', - 41: 'Select', - 42: 'Print', - 43: 'Execute', - 44: 'PrintScreen', - 45: 'Insert', - 46: 'Delete', - 48: ['0', ')'], - 49: ['1', '!'], - 50: ['2', '@'], - 51: ['3', '#'], - 52: ['4', '$'], - 53: ['5', '%'], - 54: ['6', '^'], - 55: ['7', '&'], - 56: ['8', '*'], - 57: ['9', '('], - 91: 'OS', - 93: 'ContextMenu', - 144: 'NumLock', - 145: 'ScrollLock', - 181: 'VolumeMute', - 182: 'VolumeDown', - 183: 'VolumeUp', - 186: [';', ':'], - 187: ['=', '+'], - 188: [',', '<'], - 189: ['-', '_'], - 190: ['.', '>'], - 191: ['/', '?'], - 192: ['`', '~'], - 219: ['[', '{'], - 220: ['\\', '|'], - 221: [']', '}'], - 222: ["'", '"'], - 224: 'Meta', - 225: 'AltGraph', - 246: 'Attn', - 247: 'CrSel', - 248: 'ExSel', - 249: 'EraseEof', - 250: 'Play', - 251: 'ZoomOut' - } - }; - - // Function keys (F1-24). - var i; - for (i = 1; i < 25; i++) { - keyboardeventKeyPolyfill.keys[111 + i] = 'F' + i; - } - - // Printable ASCII characters. - var letter = ''; - for (i = 65; i < 91; i++) { - letter = String.fromCharCode(i); - keyboardeventKeyPolyfill.keys[i] = [letter.toLowerCase(), letter.toUpperCase()]; - } - - function polyfill () { - if (!('KeyboardEvent' in window) || - 'key' in KeyboardEvent.prototype) { - return false; - } - - // Polyfill `key` on `KeyboardEvent`. - var proto = { - get: function (x) { - var key = keyboardeventKeyPolyfill.keys[this.which || this.keyCode]; - - if (Array.isArray(key)) { - key = key[+this.shiftKey]; - } - - return key; - } - }; - Object.defineProperty(KeyboardEvent.prototype, 'key', proto); - return proto; - } - - if (typeof define === 'function' && define.amd) { - define('keyboardevent-key-polyfill', keyboardeventKeyPolyfill); - } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') { - module.exports = keyboardeventKeyPolyfill; - } else if (window) { - window.keyboardeventKeyPolyfill = keyboardeventKeyPolyfill; - } - -})(); diff --git a/public/pelican.svg b/public/pelican.svg index 908d94f845..2c0cd7d0e8 100644 --- a/public/pelican.svg +++ b/public/pelican.svg @@ -1,181 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/public/themes/panel/css/checkbox.css b/public/themes/panel/css/checkbox.css deleted file mode 100644 index a75e63af64..0000000000 --- a/public/themes/panel/css/checkbox.css +++ /dev/null @@ -1,232 +0,0 @@ -/** - * Bootsnip - "Bootstrap Checkboxes/Radios" - * Bootstrap 3.2.0 Snippet by i-heart-php - * - * Copyright (c) 2013 Bootsnipp.com - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - .checkbox { - padding-left: 20px; -} -.checkbox label { - display: inline-block; - position: relative; - padding-left: 5px; -} -.checkbox label::before { - content: ""; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - left: 0; - top: 2.5px; - margin-left: -20px; - border: 1px solid #cccccc; - border-radius: 3px; - background-color: #fff; - -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; - -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; - transition: border 0.15s ease-in-out, color 0.15s ease-in-out; -} -.checkbox label::after { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - left: 0; - top: 2.5px; - margin-left: -20px; - padding-left: 3px; - padding-top: 1px; - font-size: 11px; - color: #555555; -} -.checkbox input[type="checkbox"] { - opacity: 0; -} -.checkbox input[type="checkbox"]:focus + label::before { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.checkbox input[type="checkbox"]:checked + label::after { - font-family: 'FontAwesome'; - content: "\f00c"; -} -.checkbox input[type="checkbox"]:disabled + label { - opacity: 0.65; -} -.checkbox input[type="checkbox"]:disabled + label::before { - background-color: #eeeeee; - cursor: not-allowed; -} -.checkbox.checkbox-circle label::before { - border-radius: 50%; -} -.checkbox.checkbox-inline { - margin-top: 0; -} -.checkbox-primary input[type="checkbox"]:checked + label::before { - background-color: #428bca; - border-color: #428bca; -} -.checkbox-primary input[type="checkbox"]:checked + label::after { - color: #fff; -} -.checkbox-danger input[type="checkbox"]:checked + label::before { - background-color: #d9534f; - border-color: #d9534f; -} -.checkbox-danger input[type="checkbox"]:checked + label::after { - color: #fff; -} -.checkbox-info input[type="checkbox"]:checked + label::before { - background-color: #5bc0de; - border-color: #5bc0de; -} -.checkbox-info input[type="checkbox"]:checked + label::after { - color: #fff; -} -.checkbox-warning input[type="checkbox"]:checked + label::before { - background-color: #f0ad4e; - border-color: #f0ad4e; -} -.checkbox-warning input[type="checkbox"]:checked + label::after { - color: #fff; -} -.checkbox-success input[type="checkbox"]:checked + label::before { - background-color: #5cb85c; - border-color: #5cb85c; -} -.checkbox-success input[type="checkbox"]:checked + label::after { - color: #fff; -} -.radio { - padding-left: 20px; -} -.radio label { - display: inline-block; - position: relative; - padding-left: 5px; -} -.radio label::before { - content: ""; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - left: 0; - margin-left: -20px; - border: 1px solid #cccccc; - border-radius: 50%; - background-color: #fff; - -webkit-transition: border 0.15s ease-in-out; - -o-transition: border 0.15s ease-in-out; - transition: border 0.15s ease-in-out; -} -.radio label::after { - display: inline-block; - position: absolute; - content: " "; - width: 11px; - height: 11px; - left: 3px; - top: 3px; - margin-left: -20px; - border-radius: 50%; - background-color: #555555; - -webkit-transform: scale(0, 0); - -ms-transform: scale(0, 0); - -o-transform: scale(0, 0); - transform: scale(0, 0); - -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); - -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); - -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); - transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); -} -.radio input[type="radio"] { - opacity: 0; -} -.radio input[type="radio"]:focus + label::before { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.radio input[type="radio"]:checked + label::after { - -webkit-transform: scale(1, 1); - -ms-transform: scale(1, 1); - -o-transform: scale(1, 1); - transform: scale(1, 1); -} -.radio input[type="radio"]:disabled + label { - opacity: 0.65; -} -.radio input[type="radio"]:disabled + label::before { - cursor: not-allowed; -} -.radio.radio-inline { - margin-top: 0; -} -.radio-primary input[type="radio"] + label::after { - background-color: #428bca; -} -.radio-primary input[type="radio"]:checked + label::before { - border-color: #428bca; -} -.radio-primary input[type="radio"]:checked + label::after { - background-color: #428bca; -} -.radio-danger input[type="radio"] + label::after { - background-color: #d9534f; -} -.radio-danger input[type="radio"]:checked + label::before { - border-color: #d9534f; -} -.radio-danger input[type="radio"]:checked + label::after { - background-color: #d9534f; -} -.radio-info input[type="radio"] + label::after { - background-color: #5bc0de; -} -.radio-info input[type="radio"]:checked + label::before { - border-color: #5bc0de; -} -.radio-info input[type="radio"]:checked + label::after { - background-color: #5bc0de; -} -.radio-warning input[type="radio"] + label::after { - background-color: #f0ad4e; -} -.radio-warning input[type="radio"]:checked + label::before { - border-color: #f0ad4e; -} -.radio-warning input[type="radio"]:checked + label::after { - background-color: #f0ad4e; -} -.radio-success input[type="radio"] + label::after { - background-color: #5cb85c; -} -.radio-success input[type="radio"]:checked + label::before { - border-color: #5cb85c; -} -.radio-success input[type="radio"]:checked + label::after { - background-color: #5cb85c; -} diff --git a/public/themes/panel/css/panel.css b/public/themes/panel/css/panel.css deleted file mode 100644 index 69b8983e86..0000000000 --- a/public/themes/panel/css/panel.css +++ /dev/null @@ -1,813 +0,0 @@ - @import 'checkbox.css'; - -.login-page { - background: #10529f; -} - -#login-position-elements { - margin: 25% auto; -} - -.login-logo { - color: #fff; - font-weight: 400; -} - -.login-copyright { - color: rgba(255, 255, 255, 0.3); -} - -.login-copyright > a { - color: rgba(255, 255, 255, 0.6); -} - -.particles-js-canvas-el { - position: absolute; - width: 100%; - height: 100%; - top: 0; - z-index: -1; -} - -.panel-login-box { - background: rgba(0, 0, 0, 0.25); - border-radius: 3px; - padding: 20px; -} - -.panel-login-input > input { - background: rgba(0, 0, 0, 0.4); - border: 1px solid #000; - border-radius: 2px; - color: #fff; -} - -.panel-login-input > .form-control-feedback { - color: #fff; -} - -.panel-login-button--main { - background: rgba(0, 0, 0, 0.4); - border: 1px solid #000; - border-radius: 2px; - color: #fff; -} - -.panel-login-button--main:hover { - background: rgba(0, 0, 0, 0.7); - border: 1px solid #000; - border-radius: 2px; - color: #fff; -} - -.panel-login-button--left { - background: rgba(255, 255, 255, 0.4); - border: 1px solid rgba(255, 255, 255, 0.6); - border-radius: 2px; - color: #fff; -} - -.panel-login-button--left:hover { - background: rgba(255, 255, 255, 0.6); - border: 1px solid rgba(255, 255, 255, 0.8); - border-radius: 2px; - color: #fff; -} - -.weight-100 { - font-weight: 100; -} - -.weight-300 { - font-weight: 300; -} - -.btn-clear { - background: transparent; -} - -.user-panel > .info { - position: relative; - left: 0; -} - -code { - background-color: #eef1f6; - color: #596981; - border-radius: 2px; - padding-left: 4px; - padding-right: 4px; - line-height: 1.4; - font-size: 85%; - border: 1px solid rgba(0, 0, 0, .1); - display: inline-block; -} - -p { - line-height: 1.6 !important; -} - -p.small { - margin-top: 3px !important; -} - -.control-sidebar-dark .control-sidebar-menu > li > a.active { - background: #1e282c; -} - -.callout-nomargin { - margin: 0; -} - -.table { - font-size: 14px !important; -} - -.table .min-size { - width:1px; - white-space: nowrap; -} - -@media (max-width:767px) { - .box-header > .box-tools { - position: relative !important; - padding: 0px 10px 10px; - } -} - -.middle, .align-middle { - vertical-align: middle !important; -} - -#fileOptionMenu.dropdown-menu > li > a { - padding:3px 6px; -} - -.hasFileHover { - border: 2px dashed #0087F7; - border-top: 0 !important; - border-radius: 5px; - margin: 0; - opacity: 0.5; -} - -.hasFileHover * { - pointer-events: none !important; -} - -td.has-progress { - padding: 0px !important; - border-top: 0px !important; -} - -.progress.progress-table-bottom { - margin: 0 !important; - height:5px !important; - padding:0; - border:0; -} - -.muted { - filter: alpha(opacity=20); - opacity: 0.2; -} - -.muted-hover:hover { - filter: alpha(opacity=100); - opacity: 1; -} - -.use-pointer { - cursor: pointer !important; -} - -.input-loader { - display: none; - position:relative; - top: -25px; - float: right; - right: 5px; - color: #cccccc; - height: 0; -} - -.box-header > .form-group { - margin-bottom: 0; -} - -.box-header > .form-group > div > p.small { - margin: 0; -} - -.no-margin { - margin: 0 !important; -} - -li.select2-results__option--highlighted[aria-selected="false"] > .user-block > .username > a { - color: #fff; -} - -li.select2-results__option--highlighted[aria-selected="false"] > .user-block > .description { - color: #eee; -} - -.select2-selection.select2-selection--multiple { - min-height: 36px !important; -} - -.select2-search--inline .select2-search__field:focus { - outline: none; - border: 0 !important; -} - -.img-bordered-xs { - border: 1px solid #d2d6de; - padding: 1px; -} - -span[aria-labelledby="select2-pUserId-container"] { - padding-left: 2px !important; -} - -.box { - box-shadow: 0 0 0 1px rgba(89, 105, 128, .1), 0 1px 3px 0 rgba(89, 105, 128, .1), 0 1px 2px 0 rgba(0, 0, 0, .05) !important; -} - -.alert-danger { - color: #ffffff !important; - background: #d64242 !important; - border: 1px solid #841d1d; -} - -.alert-info { - color: #ffffff !important; - background: #408fec !important; - border: 1px solid #1055a5; -} - -.alert-success { - color: #ffffff !important; - background: #51b060 !important; - border: 1px solid #2b5f33; -} - -.alert-warning { - color: #ffffff !important; - background: #fa9636 !important; - border: 1px solid #b45b05; -} - -.callout-slim a { - color: #555 !important; -} - -.bg-purple { - background-color: #79589f !important; -} - -.label-default { - background-color: #eef1f6 !important; -} - -.callout.callout-info.callout-slim { - border: 1px solid #1055a5 !important; - border-left: 5px solid #1055a5 !important; - border-right: 5px solid #1055a5 !important; - color: #777 !important; - background: transparent !important; -} - -.callout.callout-danger.callout-slim { - border: 1px solid #c23321 !important; - border-left: 5px solid #c23321 !important; - border-right: 5px solid #c23321 !important; - color: #777 !important; - background: transparent !important; -} - -.callout.callout-warning.callout-slim { - border: 1px solid #c87f0a !important; - border-left: 5px solid #c87f0a !important; - border-right: 5px solid #c87f0a !important; - color: #777 !important; - background: transparent !important; -} - -.callout.callout-success.callout-slim { - border: 1px solid #00733e !important; - border-left: 5px solid #00733e !important; - border-right: 5px solid #00733e !important; - color: #777 !important; - background: transparent !important; -} - -.callout.callout-default.callout-slim { - border: 1px solid #eee !important; - border-left: 5px solid #eee !important; - border-right: 5px solid #eee !important; - color: #777 !important; - background: transparent !important; -} - -.callout code { - background-color: #515f6cbb; - color: #c3c3c3; - border: 1px solid rgba(0, 0, 0, .25); -} - -.tab-pane .box-footer { - margin: 0 -10px -10px; -} - -.select2-container{ width: 100% !important; } - -.nav-tabs-custom > .nav-tabs > li:hover { - border-top-color:#3c8dbc; -} - -.nav-tabs-custom > .nav-tabs > li.active.tab-danger, .nav-tabs-custom > .nav-tabs > li.tab-danger:hover { - border-top-color: #c23321; -} - -.nav-tabs-custom > .nav-tabs > li.active.tab-success, .nav-tabs-custom > .nav-tabs > li.tab-success:hover { - border-top-color: #00733e; -} - -.nav-tabs-custom > .nav-tabs > li.active.tab-info, .nav-tabs-custom > .nav-tabs > li.tab-info:hover { - border-top-color: #0097bc; -} - -.nav-tabs-custom > .nav-tabs > li.active.tab-warning, .nav-tabs-custom > .nav-tabs > li.tab-warning:hover { - border-top-color: #c87f0a; -} - -.nav-tabs-custom.nav-tabs-floating > .nav-tabs { - border-bottom: 0px !important; -} - -.nav-tabs-custom.nav-tabs-floating > .nav-tabs > li { - margin-bottom: 0px !important; -} - -.nav-tabs-custom.nav-tabs-floating > .nav-tabs > li:first-child.active, -.nav-tabs-custom.nav-tabs-floating > .nav-tabs > li:first-child:hover { - border-radius: 3px 0 0 0; -} - -.nav-tabs-custom.nav-tabs-floating > .nav-tabs > li:first-child.active > a { - border-radius: 0 0 0 3px; -} - -.position-relative { - position: relative; -} - -.no-pad-bottom { - padding-bottom: 0 !important; -} - -.no-margin-bottom { - margin-bottom: 0 !important; -} - -.btn-icon > i.fa { - line-height: 1.5; -} - -.btn.active, .btn.active.focus { - background-color: #408fec; -} - -.strong { - font-weight: bold !important; -} - -.server-description > td { - padding-top: 0 !important; - border-top: 0 !important; -} - -tr:hover + tr.server-description { - background-color: #f5f5f5 !important; -} - -.login-corner-info { - position: absolute; - bottom: 5px; - right: 10px; - color: white; -} - -input.form-autocomplete-stop[readonly] { - background: inherit; - cursor: text; -} - -/* fix Google Recaptcha badge */ -.grecaptcha-badge { - bottom: 54px !important; - background: white; - box-shadow: none !important; -} - -.dropdown-massactions { - min-width: 80px; -} - -.select-all-files { - position: relative; - bottom: 1px; - margin-right: 7px !important; -} - -.select-file { - position: relative; - bottom: 1px; - margin-right: 2px !important; -} - -.select-folder { - position: relative; - bottom: 1px; - margin-right: 5px !important; -} - -label.control-label > span { - font-size: 80%; - font-weight: 400; - font-style: italic; - color: #dd4b39; -} - -label.control-label > span.field-required:before { - content: "required"; - color: #dd4b39; -} - -label.control-label > span.field-optional:before { - content: "optional"; - color: #bbbbbb; -} - -.pagination > li > a, .pagination > li > span { - padding: 3px 10px !important; -} - -.logo-mini > img { - height: 42px; - width: auto; -} - -.search01 { - width: 30%; -} - -.number-info-box-content { - padding: 15px 10px 0; -} - - -/* ******* - - > Version v1.0 - -******* */ - -body { - color: #cad1d8; -} - -.fixed .main-header { - box-shadow: 0 4px 8px 0 rgba(0,0,0,.12), 0 2px 4px 0 rgba(0,0,0,.08); -} - -.skin-blue .wrapper, .skin-blue .main-sidebar, .skin-blue .left-side { - background-color: #181f27; - box-shadow: 0 4px 8px 0 rgba(0,0,0,.12), 0 2px 4px 0 rgba(0,0,0,.08); -} - -.skin-blue .main-header .logo { - background-color: #1f2933; - color: #9aa5b1; -} - -.skin-blue .main-header .navbar .sidebar-toggle { - color: #9aa5b1; -} - -.skin-blue .main-header .navbar .nav>li>a { - color: #9aa5b1; -} - -.skin-blue .sidebar-menu>li.header { - color: #797979; - background: #0e111582; -} - -.skin-blue .main-header .navbar { - background-color: #1f2933; -} - -.skin-blue .main-header .navbar .sidebar-toggle:hover { - background-color: #1c252e; -} - -.skin-blue .main-header .logo:hover { - background-color: #1c252e; -} - -.main-footer { - background: #1f2933; - color: #9aa5b1; - border-top: 1px solid #1f2933; -} - -.skin-blue .sidebar-menu>li.active>a { - border-left-color: #099aa5; -} - -.text-gray { - color: #9aa5b1 !important; -} - -.text-green { - color: #00a65a !important; -} - -.text-muted { - color: #9aa5b1 !important; -} - -.text-danger { - color: #ff1c00; -} - -.content-wrapper { - background-color: #33404d; -} - -.btn-success { - background-color: #189a1c; - border-color: #0f8513; -} - -.btn.btn-green:hover { - background-color: #0f8513; - border-color: #0e7717; -} - -.btn-primary { - background-color: #0967d3; - border-color: #0550b3; -} - -.btn.btn-primary:hover { - background-color: #0550b3; - border-color: #0345a0; -} - -.box { - box-shadow: 0 4px 8px 0 rgba(0,0,0,.12), 0 2px 4px 0 rgba(0,0,0,.08) !important; - background: #3f4d5a; - border-top: 3px solid #1f2933; -} - -.box-header { - color: #cad1d8; - background: #1f2933; -} - -.box-header.with-border { - border-bottom: 1px solid #1f2933; -} - -.box.box-default { - border-top-color: #1f2933; -} - -.box-footer { - border-top: 1px solid #4d5b69; - background-color: #3f4d5a; -} -.content-header>.breadcrumb>li>a { - color: #cad1d8; -} - -.breadcrumb>.active { - color: #cad1d8; -} - -.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, .h4 .small, .h4 small, .h5 .small, .h5 small, .h6 .small, .h6 small, h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small, h4 .small, h4 small, h5 .small, h5 small, h6 .small, h6 small { - color: #cad1d8; -} - -.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td { - border-top: 1px solid #4d5b69; -} - -.table>thead>tr>th { - border-bottom: 2px solid #4d5b69; -} - -.table-hover>tbody>tr:hover { - background-color: #33404d; -} - -a { - color: #007eff; -} - -.nav-tabs-custom { - background: #1f2933; -} - -.nav-tabs-custom>.nav-tabs>li.active { - border-top-color: #099aa5; -} - -.nav-tabs-custom>.nav-tabs>li.active>a { - border-top-color: transparent; - border-left-color: #15161c; - border-right-color: #15161c; - background: #13181e; -} - -.nav-tabs-custom>.nav-tabs>li>a { - color: #9aa5b1; -} - -.nav-tabs-custom>.nav-tabs>li.active>a, .nav-tabs-custom>.nav-tabs>li.active:hover>a { - color: #9aa5b1; -} - -input.form-control { - padding: .75rem; - background-color: #515f6cbb; - border-width: 1px; - border-color: #606d7b; - border-radius: .25rem; - color: #cad1d8; - box-shadow: none; - -webkit-transition: border .15s linear,box-shaodw .15s ease-in; - transition: border .15s linear,box-shaodw .15s ease-in; -} - -textarea.form-control { - padding: .75rem; - background-color: #515f6cbb; - border-width: 1px; - border-color: #606d7b; - border-radius: .25rem; - color: #cad1d8; - box-shadow: none; - -webkit-transition: border .15s linear,box-shaodw .15s ease-in; - transition: border .15s linear,box-shaodw .15s ease-in; -} - -.input-group .input-group-addon { - border-color: #606d7b; - background-color: #515f6cbb; - color: #cad1d8; -} - -.select2-container--default .select2-selection--single, .select2-selection .select2-selection--single { - border: 1px solid #606d7b; -} - -.select2-container--default .select2-selection--single { - background-color: #515f6cbb; -} - -.select2-container--default .select2-selection--single .select2-selection__rendered { - color: #cad1d8; -} - -.select2-container--default .select2-selection--multiple { - background-color: #515f6cbb; -} - -.select2-container--default .select2-selection--multiple { - border: 1px solid #606d7b; - border-radius: 0; -} - -code { - background-color: #515f6cbb; - color: #c3c3c3; - border: 1px solid rgba(0, 0, 0, .25); -} - -.btn-default { - background-color: #33404d; - color: #cad1d8; - border-color: #606d7b; -} - -.select2-results__option { - background-color: #b5bcc1; - color: #444; -} - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #3c8dbc; -} - -.modal-body { - background: #3f4d5a; -} - -.modal-header { - background: #3f4d5a; - border-bottom-color: #4d5b69; -} - -.modal-footer { - background: #3f4d5a; - border-top-color: #4d5b69; -} - -@media (max-width: 991px) { - .content-header>.breadcrumb { - background: #1f2933 !important; - } -} - -.nav-tabs-custom>.nav-tabs>li.active>a, .nav-tabs-custom>.nav-tabs>li.active:hover>a { - background-color: #101216; -} - -.select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[aria-selected=true]:hover { - color: #fff; -} - -.select2-dropdown { - background-color: #515f6cbb; - border: 1px solid #606d7b; -} -.select2-container--default.select2-container--focus .select2-selection--multiple, .select2-container--default .select2-search--dropdown .select2-search__field { - border-color: #d2d6de !important; - background-color: #515f6cbb; -} - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #099aa5; -} - -a { - color: #288afb; -} - -a:hover { - color: #206ec7; -} - -.form-control { - border-color: #606d7b; - background-color: #515f6cbb; - color: #cad1d8; -} - -.form-control[disabled], .form-control[readonly], -fieldset[disabled] .form-control { - background-color: #1f2933; - color: #cad1d8; - cursor: not-allowed; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #515f6cbb; - border: 1px solid #606d7b; -} - -.well-lg { - padding: 24px; -} - -.well-sm { - padding: 9px; -} - -.small-box h3, .small-box p { - color: #c3c3c3; -} - -.small-box-footer { - color: #288afb; -} - -.small-box .icon { - color: #cad1d8; -} - -.bg-gray { - background-color: #33404d !important; -} - -pre { - color: #cad1d8; - background-color: #515f6cbb; - border-color: #1f2933; -} diff --git a/public/themes/panel/css/terminal.css b/public/themes/panel/css/terminal.css deleted file mode 100644 index c63db7a1d6..0000000000 --- a/public/themes/panel/css/terminal.css +++ /dev/null @@ -1,105 +0,0 @@ -/*Design for Terminal*/ -@import url('https://fonts.bunny.net/css?family=Source+Code+Pro'); - -#terminal-body { - background: rgb(26, 26, 26); - margin: 0; - width: 100%; - height: 100%; - overflow: hidden; -} - -#terminal { - font-family: 'Source Code Pro', monospace; - color: rgb(223, 223, 223); - background: rgb(26, 26, 26); - font-size: 12px; - line-height: 14px; - padding: 10px 10px 0; - box-sizing: border-box; - height: 500px; - max-height: 500px; - overflow-y: auto; - overflow-x: hidden; - border-radius: 5px 5px 0 0; -} - -#terminal > .cmd { - padding: 1px 0; - word-wrap: break-word; - white-space: pre-wrap; -} - -#terminal_input { - width: 100%; - background: rgb(26, 26, 26); - border-radius: 0 0 5px 5px; - padding: 0 0 0 10px !important; -} - -.terminal_input--input, .terminal_input--prompt { - font-family: 'Source Code Pro', monospace; - margin-bottom: 0; - border: 0 !important; - background: transparent !important; - color: rgb(223, 223, 223); - font-size: 12px; - padding: 1px 0 4px !important; -} -.terminal_input--input { - margin-left: 6px; - line-height: 1; - outline: none !important; -} - -.terminal-notify { - position: absolute; - right: 30px; - bottom: 30px; - padding: 3.5px 7px; - border-radius: 3px; - background: #fff; - color: #000; - opacity: .5; - font-size: 16px; - cursor: pointer; - z-index: 10; -} - -.terminal-notify:hover { - opacity: .9; -} - -.ansi-black-fg { color: rgb(0, 0, 0); } -.ansi-red-fg { color: rgb(166, 0, 44); } -.ansi-green-fg { color: rgb(55, 106, 27); } -.ansi-yellow-fg { color: rgb(241, 133, 24); } -.ansi-blue-fg { color: rgb(17, 56, 163); } -.ansi-magenta-fg { color: rgb(67, 0, 117); } -.ansi-cyan-fg { color: rgb(18, 95, 105); } -.ansi-white-fg { color: rgb(255, 255, 255); } -.ansi-bright-black-fg { color: rgb(51, 51, 51); } -.ansi-bright-red-fg { color: rgb(223, 45, 39); } -.ansi-bright-green-fg { color: rgb(105, 175, 45); } -.ansi-bright-yellow-fg { color: rgb(254, 232, 57); } -.ansi-bright-blue-fg { color: rgb(68, 145, 240); } -.ansi-bright-magenta-fg { color: rgb(151, 50, 174); } -.ansi-bright-cyan-fg{ color: rgb(37, 173, 98); } -.ansi-bright-white-fg { color: rgb(208, 208, 208); } - -.ansi-black-bg { background: rgb(0, 0, 0); } -.ansi-red-bg { background: rgb(166, 0, 44); } -.ansi-green-bg { background: rgb(55, 106, 27); } -.ansi-yellow-bg { background: rgb(241, 133, 24); } -.ansi-blue-bg { background: rgb(17, 56, 163); } -.ansi-magenta-bg { background: rgb(67, 0, 117); } -.ansi-cyan-bg { background: rgb(18, 95, 105); } -.ansi-white-bg { background: rgb(255, 255, 255); } -.ansi-bright-black-bg { background: rgb(51, 51, 51); } -.ansi-bright-red-bg { background: rgb(223, 45, 39); } -.ansi-bright-green-bg { background: rgb(105, 175, 45); } -.ansi-bright-yellow-bg { background: rgb(254, 232, 57); } -.ansi-bright-blue-bg { background: rgb(68, 145, 240); } -.ansi-bright-magenta-bg { background: rgb(151, 50, 174); } -.ansi-bright-cyan-bg { background: rgb(37, 173, 98); } -.ansi-bright-white-bg { background: rgb(208, 208, 208); } diff --git a/public/themes/panel/js/admin/functions.js b/public/themes/panel/js/admin/functions.js deleted file mode 100644 index ea63303ed6..0000000000 --- a/public/themes/panel/js/admin/functions.js +++ /dev/null @@ -1,4 +0,0 @@ -$.urlParam=function(name){var results=new RegExp("[\\?&]"+name+"=([^&#]*)").exec(decodeURIComponent(window.location.href));if(results==null){return null}else{return results[1]||0}};function getPageName(url){var index=url.lastIndexOf("/")+1;var filenameWithExtension=url.substr(index);var filename=filenameWithExtension.split(".")[0];return filename} -// Remember Active Tab and Navigate to it on Reload -for(var queryParameters={},queryString=location.search.substring(1),re=/([^&=]+)=([^&]*)/g,m;m=re.exec(queryString);)queryParameters[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);$("a[data-toggle='tab']").click(function(){queryParameters.tab=$(this).attr("href").substring(1),window.history.pushState(null,null,location.pathname+"?"+$.param(queryParameters))}); -if($.urlParam('tab') != null){$('.nav.nav-tabs a[href="#' + $.urlParam('tab') + '"]').tab('show');} diff --git a/public/themes/panel/js/admin/new-server.js b/public/themes/panel/js/admin/new-server.js deleted file mode 100644 index b366419dbc..0000000000 --- a/public/themes/panel/js/admin/new-server.js +++ /dev/null @@ -1,177 +0,0 @@ -$(document).ready(function() { - $('#pEggId').select2({ - placeholder: 'Select an Egg', - }).change(); - - $('#pPackId').select2({ - placeholder: 'Select a Service Pack', - }); - - $('#pNodeId').select2({ - placeholder: 'Select a Node', - }).change(); - - $('#pAllocation').select2({ - placeholder: 'Select a Default Allocation', - }); - - $('#pAllocationAdditional').select2({ - placeholder: 'Select Additional Allocations', - }); -}); - -let lastActiveBox = null; -$(document).on('click', function (event) { - if (lastActiveBox !== null) { - lastActiveBox.removeClass('box-primary'); - } - - lastActiveBox = $(event.target).closest('.box'); - lastActiveBox.addClass('box-primary'); -}); - -$('#pNodeId').on('change', function () { - currentNode = $(this).val(); - $.each(Panel.nodeData, function (i, v) { - if (v.id == currentNode) { - $('#pAllocation').html('').select2({ - data: v.allocations, - placeholder: 'Select a Default Allocation', - }); - - updateAdditionalAllocations(); - } - }); -}); - -$('#pEggId').on('change', function (event) { - let objectChain = _.get(Panel.eggs, $('#pEggId').val(), null); - - const images = _.get(objectChain, 'docker_images', {}) - $('#pDefaultContainer').html(''); - const keys = Object.keys(images); - for (let i = 0; i < keys.length; i++) { - let opt = document.createElement('option'); - opt.value = images[keys[i]]; - opt.innerHTML = keys[i] + " (" + images[keys[i]] + ")"; - $('#pDefaultContainer').append(opt); - } - - $('#pStartup').val(_.get(objectChain, 'startup')); - - $('#pPackId').html('').select2({ - data: [{ id: 0, text: 'No Service Pack' }].concat( - $.map(_.get(objectChain, 'packs', []), function (item, i) { - return { - id: item.id, - text: item.name + ' (' + item.version + ')', - }; - }) - ), - }); - - const variableIds = {}; - $('#appendVariablesTo').html(''); - $.each(_.get(objectChain, 'variables', []), function (i, item) { - variableIds[item.env_variable] = 'var_ref_' + item.id; - - let isRequired = (item.required === 1) ? 'Required ' : ''; - let dataAppend = ' \ -
\ - \ - \ -

' + item.description + '
\ - Access in Startup: {{' + item.env_variable + '}}
\ - Validation Rules: ' + item.rules + '

\ -
\ - '; - $('#appendVariablesTo').append(dataAppend); - }); - - // If you receive a warning on this line, it should be fine to ignore. this function is - // defined in "resources/views/admin/servers/new.blade.php" near the bottom of the file. - eggVariablesUpdated($('#pEggId').val(), variableIds); -}); - -$('#pAllocation').on('change', function () { - updateAdditionalAllocations(); -}); - -function updateAdditionalAllocations() { - let currentAllocation = $('#pAllocation').val(); - let currentNode = $('#pNodeId').val(); - - $.each(Panel.nodeData, function (i, v) { - if (v.id == currentNode) { - let allocations = []; - - for (let i = 0; i < v.allocations.length; i++) { - const allocation = v.allocations[i]; - - if (allocation.id != currentAllocation) { - allocations.push(allocation); - } - } - - $('#pAllocationAdditional').html('').select2({ - data: allocations, - placeholder: 'Select Additional Allocations', - }); - } - }); -} - -function initUserIdSelect(data) { - function escapeHtml(str) { - var div = document.createElement('div'); - div.appendChild(document.createTextNode(str)); - return div.innerHTML; - } - - $('#pUserId').select2({ - ajax: { - url: '/admin/users/accounts.json', - dataType: 'json', - delay: 250, - - data: function (params) { - return { - filter: { email: params.term }, - page: params.page, - }; - }, - - processResults: function (data, params) { - return { results: data }; - }, - - cache: true, - }, - - data: data, - escapeMarkup: function (markup) { return markup; }, - minimumInputLength: 2, - templateResult: function (data) { - if (data.loading) return escapeHtml(data.text); - - return '
\ - User Image \ - \ - ' + escapeHtml(data.name_first) + ' ' + escapeHtml(data.name_last) +' \ - \ - ' + escapeHtml(data.email) + ' - ' + escapeHtml(data.username) + ' \ -
'; - }, - templateSelection: function (data) { - return '
\ - \ - User Image \ - \ - \ - ' + escapeHtml(data.name_first) + ' ' + escapeHtml(data.name_last) + ' (' + escapeHtml(data.email) + ') \ - \ -
'; - } - - }); -} diff --git a/public/themes/panel/js/admin/server/transfer.js b/public/themes/panel/js/admin/server/transfer.js deleted file mode 100644 index 51e48721a6..0000000000 --- a/public/themes/panel/js/admin/server/transfer.js +++ /dev/null @@ -1,79 +0,0 @@ -/* The MIT License (MIT) - - Pterodactyl® - Copyright © Dane Everitt and contributors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. */ - -$(document).ready(function () { - $('#pNodeId').select2({ - placeholder: 'Select a Node', - }).change(); - - $('#pAllocation').select2({ - placeholder: 'Select a Default Allocation', - }); - - $('#pAllocationAdditional').select2({ - placeholder: 'Select Additional Allocations', - }); -}); - -$('#pNodeId').on('change', function () { - let currentNode = $(this).val(); - - $.each(Panel.nodeData, function (i, v) { - if (v.id == currentNode) { - $('#pAllocation').html('').select2({ - data: v.allocations, - placeholder: 'Select a Default Allocation', - }); - - updateAdditionalAllocations(); - } - }); -}); - -$('#pAllocation').on('change', function () { - updateAdditionalAllocations(); -}); - -function updateAdditionalAllocations() { - let currentAllocation = $('#pAllocation').val(); - let currentNode = $('#pNodeId').val(); - - $.each(Panel.nodeData, function (i, v) { - if (v.id == currentNode) { - let allocations = []; - - for (let i = 0; i < v.allocations.length; i++) { - const allocation = v.allocations[i]; - - if (allocation.id != currentAllocation) { - allocations.push(allocation); - } - } - - $('#pAllocationAdditional').html('').select2({ - data: allocations, - placeholder: 'Select Additional Allocations', - }); - } - }); -} diff --git a/public/themes/panel/js/plugins/minecraft/eula.js b/public/themes/panel/js/plugins/minecraft/eula.js deleted file mode 100644 index 2b2dd21548..0000000000 --- a/public/themes/panel/js/plugins/minecraft/eula.js +++ /dev/null @@ -1,46 +0,0 @@ -$(document).ready(function () { - Socket.on('console', function (data) { - if (typeof data === 'undefined' || typeof data.line === 'undefined') { - return; - } - - if (~data.line.indexOf('You need to agree to the EULA in order to run the server')) { - swal({ - title: 'EULA Acceptance', - text: 'By pressing \'I Accept\' below you are indicating your agreement to the Mojang EULA.', - type: 'info', - html: true, - showCancelButton: true, - showConfirmButton: true, - cancelButtonText: 'I do not Accept', - confirmButtonText: 'I Accept', - closeOnConfirm: false, - showLoaderOnConfirm: true - }, function () { - $.ajax({ - type: 'POST', - url: Panel.meta.saveFile, - headers: { 'X-CSRF-Token': Panel.meta.csrfToken, }, - data: { - file: 'eula.txt', - contents: 'eula=true' - } - }).done(function (data) { - $('[data-attr="power"][data-action="start"]').trigger('click'); - swal({ - type: 'success', - title: '', - text: 'The EULA for this server has been accepted, restarting server now.', - }); - }).fail(function (jqXHR) { - console.error(jqXHR); - swal({ - title: 'Whoops!', - text: 'An error occurred while attempting to set the EULA as accepted: ' + jqXHR.responseJSON.error, - type: 'error' - }) - }); - }); - } - }); -}); diff --git a/public/themes/panel/vendor/ace/ace.js b/public/themes/panel/vendor/ace/ace.js deleted file mode 100644 index b4b7a55cb5..0000000000 --- a/public/themes/panel/vendor/ace/ace.js +++ /dev/null @@ -1,14 +0,0 @@ -(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE="",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n=53&&O()},I=o.delayedCall(j,50);r.addListener(n,"compositionstart",B),i.isGecko?r.addListener(n,"text",function(){I.schedule()}):(r.addListener(n,"keyup",function(){I.schedule()}),r.addListener(n,"keydown",function(){I.schedule()})),r.addListener(n,"compositionend",F),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){L=!0,b(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){if(!o&&i.isOldIE)return;p||(p=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+"height:"+n.style.height+";"+(i.isIE?"opacity:0.1;":"");var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+"px",n.style.top=Math.min(e.clientY-f-2,c)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(q),i.isWin&&!i.isOldIE&&r.capture(t.container,h,R)},this.onContextMenuClose=R;var q,U=function(e){t.textInput.onContextMenu(e),R()};r.addListener(n,"mouseup",U),r.addListener(n,"mousedown",function(e){e.preventDefault(),R()}),r.addListener(t.renderer.scroller,"contextmenu",U),r.addListener(n,"contextmenu",U)};t.TextInput=f}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function u(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function a(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function f(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var s=r.getSelectionRange(),o=s.isEmpty();r.$blockScrolling++,(o||i==1)&&r.selection.moveToPosition(n),r.$blockScrolling--,i==2&&r.textInput.onContextMenu(e.domEvent);return}this.mousedownEvent.time=Date.now();if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g,y&&/string\.end/.test(v.type)&&(y=!1);else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";function r(e){var n=/\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,"\\u$&")}t.packages={},r({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour/cstyle").CstyleBehaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i};(function(){this.$defaultBehaviour=new s,this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
")}}).call(s.prototype),t.Marker=s}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+"
"):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
"),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("
","
"),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:w?Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r||!r.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.6"}); - (function() { - window.require(["ace/ace"], function(a) { - if (a) { - a.config.init(true); - a.define = window.define; - } - if (!window.ace) - window.ace = a; - for (var key in a) if (a.hasOwnProperty(key)) - window.ace[key] = a[key]; - }); - })(); - \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/ext-elastic_tabstops_lite.js b/public/themes/panel/vendor/ace/ext-elastic_tabstops_lite.js deleted file mode 100644 index 756e0e1094..0000000000 --- a/public/themes/panel/vendor/ace/ext-elastic_tabstops_lite.js +++ /dev/null @@ -1,5 +0,0 @@ -define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"],function(e,t,n){"use strict";var r=function(e){this.$editor=e;var t=this,n=[],r=!1;this.onAfterExec=function(){r=!1,t.processRows(n),n=[]},this.onExec=function(){r=!0},this.onChange=function(e){r&&(n.indexOf(e.start.row)==-1&&n.push(e.start.row),e.end.row!=e.start.row&&n.push(e.end.row))}};(function(){this.processRows=function(e){this.$inChange=!0;var t=[];for(var n=0,r=e.length;n-1)continue;var s=this.$findCellWidthsForBlock(i),o=this.$setBlockCellWidthsToMax(s.cellWidths),u=s.firstRow;for(var a=0,f=o.length;a=0){n=this.$cellWidthsForRow(r);if(n.length==0)break;t.unshift(n),r--}var i=r+1;r=e;var s=this.$editor.session.getLength();while(r0&&(this.$editor.session.getDocument().insertInLine({row:e,column:f+1},Array(l+1).join(" ")+" "),this.$editor.session.getDocument().removeInLine(e,f,f+1),r+=l),l<0&&p>=-l&&(this.$editor.session.getDocument().removeInLine(e,f+l,f),r+=l)}},this.$izip_longest=function(e){if(!e[0])return[];var t=e[0].length,n=e.length;for(var r=1;rt&&(t=i)}var s=[];for(var o=0;o=t.length?t.length:e.length,r=[];for(var i=0;i\s+/g,">"),l=function(e,t,n){var i=r.createElement("div");i.innerHTML=f,this.element=i.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOptions=e.querySelector(".ace_search_options"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;s.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),s.stopPropagation(e)}),s.addListener(e,"click",function(e){var n=e.target||e.srcElement,r=n.getAttribute("action");r&&t[r]?t[r]():t.$searchBarKb.commands[r]&&t.$searchBarKb.commands[r].exec(t),s.stopPropagation(e)}),s.addCommandKeyListener(e,function(e,n,r){var i=a.keyCodeToString(r),o=t.$searchBarKb.findKeyCommand(n,i);o&&o.exec&&(o.exec(t),s.stopEvent(e))}),this.$onChange=i.delayedCall(function(){t.find(!1,!1)}),s.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),s.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),s.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new u([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new u,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceBox.style.display="",e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){r.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),r.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),r.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,n){var i=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:n}),s=!i&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",s),this.editor._emit("findSearchBox",{match:!s}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display="",this.replaceBox.style.display=t?"":"none",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(l.prototype),t.SearchBox=l,t.Search=function(e,t){var n=e.searchBox||new l(e);n.show(e.session.getTextRange(),t)}}),define("ace/ext/old_ie",["require","exports","module","ace/lib/useragent","ace/tokenizer","ace/ext/searchbox","ace/mode/text"],function(require,exports,module){"use strict";function patch(obj,name,regexp,replacement){eval("obj['"+name+"']="+obj[name].toString().replace(regexp,replacement))}var MAX_TOKEN_COUNT=1e3,useragent=require("../lib/useragent"),TokenizerModule=require("../tokenizer");useragent.isIE&&useragent.isIE<10&&window.top.document.compatMode==="BackCompat"&&(useragent.isOldIE=!0);if(typeof document!="undefined"&&!document.documentElement.querySelector){useragent.isOldIE=!0;var qs=function(e,t){if(t.charAt(0)==".")var n=t.slice(1);else var r=t.match(/(\w+)=(\w+)/),i=r&&r[1],s=r&&r[2];for(var o=0;o\s+/g,">"),l=function(e,t,n){var i=r.createElement("div");i.innerHTML=f,this.element=i.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOptions=e.querySelector(".ace_search_options"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;s.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),s.stopPropagation(e)}),s.addListener(e,"click",function(e){var n=e.target||e.srcElement,r=n.getAttribute("action");r&&t[r]?t[r]():t.$searchBarKb.commands[r]&&t.$searchBarKb.commands[r].exec(t),s.stopPropagation(e)}),s.addCommandKeyListener(e,function(e,n,r){var i=a.keyCodeToString(r),o=t.$searchBarKb.findKeyCommand(n,i);o&&o.exec&&(o.exec(t),s.stopEvent(e))}),this.$onChange=i.delayedCall(function(){t.find(!1,!1)}),s.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),s.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),s.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new u([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new u,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceBox.style.display="",e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){r.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),r.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),r.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,n){var i=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:n}),s=!i&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",s),this.editor._emit("findSearchBox",{match:!s}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display="",this.replaceBox.style.display=t?"":"none",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(l.prototype),t.SearchBox=l,t.Search=function(e,t){var n=e.searchBox||new l(e);n.show(e.session.getTextRange(),t)}}); - (function() { - window.require(["ace/ext/searchbox"], function() {}); - })(); - \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/ext-settings_menu.js b/public/themes/panel/vendor/ace/ext-settings_menu.js deleted file mode 100644 index 62a28c88b0..0000000000 --- a/public/themes/panel/vendor/ace/ext-settings_menu.js +++ /dev/null @@ -1,5 +0,0 @@ -define("ace/ext/menu_tools/element_generator",["require","exports","module"],function(e,t,n){"use strict";n.exports.createOption=function(t){var n,r=document.createElement("option");for(n in t)t.hasOwnProperty(n)&&(n==="selected"?r.setAttribute(n,t[n]):r[n]=t[n]);return r},n.exports.createCheckbox=function(t,n,r){var i=document.createElement("input");return i.setAttribute("type","checkbox"),i.setAttribute("id",t),i.setAttribute("name",t),i.setAttribute("value",n),i.setAttribute("class",r),n&&i.setAttribute("checked","checked"),i},n.exports.createInput=function(t,n,r){var i=document.createElement("input");return i.setAttribute("type","text"),i.setAttribute("id",t),i.setAttribute("name",t),i.setAttribute("value",n),i.setAttribute("class",r),i},n.exports.createLabel=function(t,n){var r=document.createElement("label");return r.setAttribute("for",n),r.textContent=t,r},n.exports.createSelection=function(t,r,i){var s=document.createElement("select");return s.setAttribute("id",t),s.setAttribute("name",t),s.setAttribute("class",i),r.forEach(function(e){s.appendChild(n.exports.createOption(e))}),s}}),define("ace/ext/modelist",["require","exports","module"],function(e,t,n){"use strict";function i(e){var t=a.text,n=e.split(/[\/\\]/).pop();for(var i=0;i 0!";if(e==this.$splits)return;if(e>this.$splits){while(this.$splitse)t=this.$editors[this.$splits-1],this.$container.removeChild(t.container),this.$splits--;this.resize()},this.getSplits=function(){return this.$splits},this.getEditor=function(e){return this.$editors[e]},this.getCurrentEditor=function(){return this.$cEditor},this.focus=function(){this.$cEditor.focus()},this.blur=function(){this.$cEditor.blur()},this.setTheme=function(e){this.$editors.forEach(function(t){t.setTheme(e)})},this.setKeyboardHandler=function(e){this.$editors.forEach(function(t){t.setKeyboardHandler(e)})},this.forEach=function(e,t){this.$editors.forEach(e,t)},this.$fontSize="",this.setFontSize=function(e){this.$fontSize=e,this.forEach(function(t){t.setFontSize(e)})},this.$cloneSession=function(e){var t=new a(e.getDocument(),e.getMode()),n=e.getUndoManager();if(n){var r=new l(n,t);t.setUndoManager(r)}return t.$informUndoManager=i.delayedCall(function(){t.$deltas=[]}),t.setTabSize(e.getTabSize()),t.setUseSoftTabs(e.getUseSoftTabs()),t.setOverwrite(e.getOverwrite()),t.setBreakpoints(e.getBreakpoints()),t.setUseWrapMode(e.getUseWrapMode()),t.setUseWorker(e.getUseWorker()),t.setWrapLimitRange(e.$wrapLimitRange.min,e.$wrapLimitRange.max),t.$foldData=e.$cloneFoldData(),t},this.setSession=function(e,t){var n;t==null?n=this.$cEditor:n=this.$editors[t];var r=this.$editors.some(function(t){return t.session===e});return r&&(e=this.$cloneSession(e)),n.setSession(e),e},this.getOrientation=function(){return this.$orientation},this.setOrientation=function(e){if(this.$orientation==e)return;this.$orientation=e,this.resize()},this.resize=function(){var e=this.$container.clientWidth,t=this.$container.clientHeight,n;if(this.$orientation==this.BESIDE){var r=e/this.$splits;for(var i=0;i"),o||l.push(""),f.$renderLine(l,h,!0,!1),l.push("\n");var p="
"+"
"+l.join("")+"
"+"
";return f.destroy(),{css:s+n.cssText,html:p,session:u}},n.exports=f,n.exports.highlight=f}); - (function() { - window.require(["ace/ext/static_highlight"], function() {}); - })(); - \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/ext-textarea.js b/public/themes/panel/vendor/ace/ext-textarea.js deleted file mode 100644 index 56b6eac9b3..0000000000 --- a/public/themes/panel/vendor/ace/ext-textarea.js +++ /dev/null @@ -1,5 +0,0 @@ -define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate"],function(e,t,n){"use strict";function a(e,t){for(var n in t)e.style[n]=t[n]}function f(e,t){if(e.type!="textarea")throw new Error("Textarea required!");var n=e.parentNode,i=document.createElement("div"),s=function(){var t="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(n){t+=n+":"+u(e,i,n)+";"});var n=u(e,i,"width")||e.clientWidth+"px",r=u(e,i,"height")||e.clientHeight+"px";t+="height:"+r+";width:"+n+";",t+="display:inline-block;",i.setAttribute("style",t)};r.addListener(window,"resize",s),s(),n.insertBefore(i,e.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var o=n.onsubmit;n.onsubmit=function(n){e.value=t(),o&&o.call(this,n)};break}n=n.parentNode}return i}function l(t,n,r){s.loadScript(t,function(){e([n],r)})}function c(e,t,n,r,i,s){function a(e){return e==="true"||e==1}var o=e.getSession(),u=e.renderer;return s=s||l,e.setDisplaySettings=function(t){t==null&&(t=n.style.display=="none"),t?(n.style.display="block",n.hideButton.focus(),e.on("focus",function r(){e.removeListener("focus",r),n.style.display="none"})):e.focus()},e.$setOption=e.setOption,e.$getOption=e.getOption,e.setOption=function(t,n){switch(t){case"mode":e.$setOption("mode","ace/mode/"+n);break;case"theme":e.$setOption("theme","ace/theme/"+n);break;case"keybindings":switch(n){case"vim":e.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":e.setKeyboardHandler("ace/keyboard/emacs");break;default:e.setKeyboardHandler(null)}break;case"softWrap":case"fontSize":e.$setOption(t,n);break;default:e.$setOption(t,a(n))}},e.getOption=function(t){switch(t){case"mode":return e.$getOption("mode").substr("ace/mode/".length);case"theme":return e.$getOption("theme").substr("ace/theme/".length);case"keybindings":var n=e.getKeyboardHandler();switch(n&&n.$id){case"ace/keyboard/vim":return"vim";case"ace/keyboard/emacs":return"emacs";default:return"ace"}break;default:return e.$getOption(t)}},e.setOptions(i),e}function h(e,n,i){function f(e,t,n,r){if(!n){e.push("");return}e.push("")}var s=null,o={mode:"Mode:",wrap:"Soft Wrap:",theme:"Theme:",fontSize:"Font Size:",showGutter:"Display Gutter:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"},u={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},showGutter:s,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},wrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:s,useSoftTabs:s,showInvisibles:s},a=[];a.push("");for(var l in t.defaultOptions)a.push(""),a.push("");a.push("
SettingValue
",o[l],""),f(a,l,u[l],i.getOption(l)),a.push("
"),e.innerHTML=a.join("");var c=function(e){var t=e.currentTarget;i.setOption(t.title,t.value)},h=function(e){var t=e.currentTarget;i.setOption(t.title,t.checked)},p=e.getElementsByTagName("select");for(var d=0;d0&&!(s%l)&&!(f%l)&&(r[l]=(r[l]||0)+1),n[f]=(n[f]||0)+1}s=f}while(up.score&&(p={score:v,length:u})}if(p.score&&p.score>1.4)var m=p.length;if(i>d+1){if(m==1||di+1)return{ch:" ",length:m}},t.detectIndentation=function(e){var n=e.getLines(0,1e3),r=t.$detectIndentation(n)||{};return r.ch&&e.setUseSoftTabs(r.ch==" "),r.length&&e.setTabSize(r.length),r},t.trimTrailingSpace=function(e,t){var n=e.getDocument(),r=n.getAllLines(),i=t?-1:0;for(var s=0,o=r.length;si&&n.removeInLine(s,a,u.length)}},t.convertIndentation=function(e,t,n){var i=e.getTabString()[0],s=e.getTabSize();n||(n=s),t||(t=i);var o=t==" "?t:r.stringRepeat(t,n),u=e.doc,a=u.getAllLines(),f={},l={};for(var c=0,h=a.length;c30&&this.$data.shift()},append:function(e){var t=this.$data.length-1,n=this.$data[t]||"";e&&(n+=e),n&&(this.$data[t]=n)},get:function(e){return e=e||1,this.$data.slice(this.$data.length-e,this.$data.length).reverse().join("\n")},pop:function(){return this.$data.length>1&&this.$data.pop(),this.get()},rotate:function(){return this.$data.unshift(this.$data.pop()),this.get()}}}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/keybinding-vim.js b/public/themes/panel/vendor/ace/keybinding-vim.js deleted file mode 100644 index 9900e9f8e5..0000000000 --- a/public/themes/panel/vendor/ace/keybinding-vim.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/multi_select"],function(e,t,n){"use strict";function r(){function t(e){return typeof e!="object"?e+"":"line"in e?e.line+":"+e.ch:"anchor"in e?t(e.anchor)+"->"+t(e.head):Array.isArray(e)?"["+e.map(function(e){return t(e)})+"]":JSON.stringify(e)}var e="";for(var n=0;n"):!1}function M(e){var t=e.state.vim;return t.onPasteFn||(t.onPasteFn=function(){t.insertMode||(e.setCursor(St(e.getCursor(),0,1)),yt.enterInsertMode(e,{},t))}),t.onPasteFn}function H(e,t){var n=[];for(var r=e;r=e.firstLine()&&t<=e.lastLine()}function U(e){return/^[a-z]$/.test(e)}function z(e){return"()[]{}".indexOf(e)!=-1}function W(e){return _.test(e)}function X(e){return/^[A-Z]$/.test(e)}function V(e){return/^\s*$/.test(e)}function $(e,t){for(var n=0;n"){var n=t.length-11,r=e.slice(0,n),i=t.slice(0,n);return r==i&&e.length>n?"full":i.indexOf(r)==0?"partial":!1}return e==t?"full":t.indexOf(e)==0?"partial":!1}function Ct(e){var t=/^.*(<[\w\-]+>)$/.exec(e),n=t?t[1]:e.slice(-1);if(n.length>1)switch(n){case"":n="\n";break;case"":n=" ";break;default:}return n}function kt(e,t,n){return function(){for(var r=0;r2&&(t=Mt.apply(undefined,Array.prototype.slice.call(arguments,1))),Ot(e,t)?e:t}function _t(e,t){return arguments.length>2&&(t=_t.apply(undefined,Array.prototype.slice.call(arguments,1))),Ot(e,t)?t:e}function Dt(e,t,n){var r=Ot(e,t),i=Ot(t,n);return r&&i}function Pt(e,t){return e.getLine(t).length}function Ht(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function Bt(e){return e.replace(/([.?*+$\[\]\/\\(){}|\-])/g,"\\$1")}function jt(e,t,n){var r=Pt(e,t),i=(new Array(n-r+1)).join(" ");e.setCursor(E(t,r)),e.replaceRange(i,e.getCursor())}function Ft(e,t){var n=[],r=e.listSelections(),i=Lt(e.clipPos(t)),s=!At(t,i),o=e.getCursor("head"),u=qt(r,o),a=At(r[u].head,r[u].anchor),f=r.length-1,l=f-u>u?f:0,c=r[l].anchor,h=Math.min(c.line,i.line),p=Math.max(c.line,i.line),d=c.ch,v=i.ch,m=r[l].head.ch-d,g=v-d;m>0&&g<=0?(d++,s||v--):m<0&&g>=0?(d--,a||v++):m<0&&g==-1&&(d--,v++);for(var y=h;y<=p;y++){var b={anchor:new E(y,d),head:new E(y,v)};n.push(b)}return u=i.line==p?n.length-1:0,e.setSelections(n),t.ch=v,c.ch=d,c}function It(e,t,n){var r=[];for(var i=0;ia&&(i.line=a),i.ch=Pt(e,i.line)}else i.ch=0,s.ch=Pt(e,s.line);return{ranges:[{anchor:s,head:i}],primary:0}}if(n=="block"){var f=Math.min(s.line,i.line),l=Math.min(s.ch,i.ch),c=Math.max(s.line,i.line),h=Math.max(s.ch,i.ch)+1,p=c-f+1,d=i.line==f?0:p-1,v=[];for(var m=0;m0&&s&&V(s);s=i.pop())n.line--,n.ch=0;s?(n.line--,n.ch=Pt(e,n.line)):n.ch=0}}function Kt(e,t,n){t.ch=0,n.ch=0,n.line++}function Qt(e){if(!e)return 0;var t=e.search(/\S/);return t==-1?e.length:t}function Gt(e,t,n,r,i){var s=Vt(e),o=e.getLine(s.line),u=s.ch,a=i?D[0]:P[0];while(!a(o.charAt(u))){u++;if(u>=o.length)return null}r?a=P[0]:(a=D[0],a(o.charAt(u))||(a=D[1]));var f=u,l=u;while(a(o.charAt(f))&&f=0)l--;l++;if(t){var c=f;while(/\s/.test(o.charAt(f))&&f0)l--;l||(l=h)}}return{start:E(s.line,l),end:E(s.line,f)}}function Yt(e,t,n){At(t,n)||nt.jumpList.add(e,t,n)}function Zt(e,t){nt.lastChararacterSearch.increment=e,nt.lastChararacterSearch.forward=t.forward,nt.lastChararacterSearch.selectedCharacter=t.selectedCharacter}function nn(e,t,n,r){var i=Lt(e.getCursor()),s=n?1:-1,o=n?e.lineCount():-1,u=i.ch,a=i.line,f=e.getLine(a),l={lineText:f,nextCh:f.charAt(u),lastCh:null,index:u,symb:r,reverseSymb:(n?{")":"(","}":"{"}:{"(":")","{":"}"})[r],forward:n,depth:0,curMoveThrough:!1},c=en[r];if(!c)return i;var h=tn[c].init,p=tn[c].isComplete;h&&h(l);while(a!==o&&t){l.index+=s,l.nextCh=l.lineText.charAt(l.index);if(!l.nextCh){a+=s,l.lineText=e.getLine(a)||"";if(s>0)l.index=0;else{var d=l.lineText.length;l.index=d>0?d-1:0}l.nextCh=l.lineText.charAt(l.index)}p(l)&&(i.line=a,i.ch=l.index,t--)}return l.nextCh||l.curMoveThrough?E(a,l.index):i}function rn(e,t,n,r,i){var s=t.line,o=t.ch,u=e.getLine(s),a=n?1:-1,f=r?P:D;if(i&&u==""){s+=a,u=e.getLine(s);if(!R(e,s))return null;o=n?0:u.length}for(;;){if(i&&u=="")return{from:0,to:0,line:s};var l=a>0?u.length:-1,c=l,h=l;while(o!=l){var p=!1;for(var d=0;d0?0:u.length}throw new Error("The impossible happened.")}function sn(e,t,n,r,i,s){var o=Lt(t),u=[];(r&&!i||!r&&i)&&n++;var a=!r||!i;for(var f=0;f0?1:-1;var n=e.ace.session.getFoldLine(t);n&&t+r>n.start.row&&t+r0?n.end.row:n.start.row)-t)}var s=t.line,o=e.firstLine(),u=e.lastLine(),a,f,l=s;if(r){while(o<=l&&l<=u&&n>0)p(l),h(l,r)&&n--,l+=r;return new E(l,0)}var d=e.state.vim;if(d.visualLine&&h(s,1,!0)){var v=d.sel.anchor;h(v.line,-1,!0)&&(!i||v.line!=s)&&(s+=1)}var m=c(s);for(l=s;l<=u&&n;l++)h(l,1,!0)&&(!i||c(l)!=m)&&n--;f=new E(l,0),l>u&&!m?m=!0:i=!1;for(l=s;l>o;l--)if(!i||c(l)==m||l==s)if(h(l,-1,!0))break;return a=new E(l,0),{start:a,end:f}}function cn(e,t,n,r){var i=t,s,o,u={"(":/[()]/,")":/[()]/,"[":/[[\]]/,"]":/[[\]]/,"{":/[{}]/,"}":/[{}]/}[n],a={"(":"(",")":"(","[":"[","]":"[","{":"{","}":"{"}[n],f=e.getLine(i.line).charAt(i.ch),l=f===a?1:0;s=e.scanForBracket(E(i.line,i.ch+l),-1,null,{bracketRegex:u}),o=e.scanForBracket(E(i.line,i.ch+l),1,null,{bracketRegex:u});if(!s||!o)return{start:i,end:i};s=s.pos,o=o.pos;if(s.line==o.line&&s.ch>o.ch||s.line>o.line){var c=s;s=o,o=c}return r?o.ch+=1:s.ch+=1,{start:s,end:o}}function hn(e,t,n,r){var i=Lt(t),s=e.getLine(i.line),o=s.split(""),u,a,f,l,c=o.indexOf(n);i.ch-1&&!u;f--)o[f]==n&&(u=f+1);if(u&&!a)for(f=u,l=o.length;f'+t+"
",{bottom:!0,duration:5e3}):alert(t)}function Nn(e,t){var n="";return e&&(n+=''+e+""),n+=' ',t&&(n+='',n+=t,n+=""),n}function kn(e,t){var n=(t.prefix||"")+" "+(t.desc||""),r=Nn(t.prefix,t.desc);vn(e,r,n,t.onClose,t)}function Ln(e,t){if(e instanceof RegExp&&t instanceof RegExp){var n=["global","multiline","ignoreCase","source"];for(var r=0;r=t&&e<=n:e==t}function Hn(e){var t=e.ace.renderer;return{top:t.getFirstFullyVisibleRow(),bottom:t.getLastFullyVisibleRow()}}function In(e,t,n,r,i,s,o,u,a){function c(){e.operation(function(){while(!f)h(),p();d()})}function h(){var t=e.getRange(s.from(),s.to()),n=t.replace(o,u);s.replace(n)}function p(){while(s.findNext()&&Pn(s.from(),r,i)){if(!n&&l&&s.from().line==l.line)continue;e.scrollIntoView(s.from(),30),e.setSelection(s.from(),s.to()),l=s.from(),f=!1;return}f=!0}function d(t){t&&t(),e.focus();if(l){e.setCursor(l);var n=e.state.vim;n.exMode=!1,n.lastHPos=n.lastHSPos=l.ch}a&&a()}function m(t,n,r){v.e_stop(t);var i=v.keyName(t);switch(i){case"Y":h(),p();break;case"N":p();break;case"A":var s=a;a=undefined,e.operation(c),a=s;break;case"L":h();case"Q":case"Esc":case"Ctrl-C":case"Ctrl-[":d(r)}return f&&d(r),!0}e.state.vim.exMode=!0;var f=!1,l=s.from();p();if(f){Tn(e,"No matches for "+o.source);return}if(!t){c(),a&&a();return}kn(e,{prefix:"replace with "+u+" (y/n/a/q/l)",onKeyDown:m})}function qn(e){var t=e.state.vim,n=nt.macroModeState,r=nt.registerController.getRegister("."),i=n.isPlaying,s=n.lastInsertModeChanges,o=[];if(!i){var u=s.inVisualBlock?t.lastSelection.visualBlock.height:1,a=s.changes,o=[],f=0;while(f1&&(Zn(e,t,t.insertModeRepeat-1,!0),t.lastEditInputState.repeatOverride=t.insertModeRepeat),delete t.insertModeRepeat,t.insertMode=!1,e.setCursor(e.getCursor().line,e.getCursor().ch-1),e.setOption("keyMap","vim"),e.setOption("disableInput",!0),e.toggleOverwrite(!1),r.setText(s.changes.join("")),v.signal(e,"vim-mode-change",{mode:"normal"}),n.isRecording&&Xn(n)}function Rn(e){b.unshift(e)}function Un(e,t,n,r,i){var s={keys:e,type:t};s[t]=n,s[t+"Args"]=r;for(var o in i)s[o]=i[o];Rn(s)}function zn(e,t,n,r){var i=nt.registerController.getRegister(r);if(r==":"){i.keyBuffer[0]&&Fn.processCommand(e,i.keyBuffer[0]),n.isPlaying=!1;return}var s=i.keyBuffer,o=0;n.isPlaying=!0,n.replaySearchQueries=i.searchQueries.slice(0);for(var u=0;u|<\w+>|./.exec(a),l=f[0],a=a.substring(f.index+l.length),v.Vim.handleKey(e,l,"macro");if(t.insertMode){var c=i.insertModeChanges[o++].changes;nt.macroModeState.lastInsertModeChanges.changes=c,er(e,c,1),qn(e)}}}n.isPlaying=!1}function Wn(e,t){if(e.isPlaying)return;var n=e.latestRegister,r=nt.registerController.getRegister(n);r&&r.pushText(t)}function Xn(e){if(e.isPlaying)return;var t=e.latestRegister,n=nt.registerController.getRegister(t);n&&n.pushInsertModeChanges&&n.pushInsertModeChanges(e.lastInsertModeChanges)}function Vn(e,t){if(e.isPlaying)return;var n=e.latestRegister,r=nt.registerController.getRegister(n);r&&r.pushSearchQuery&&r.pushSearchQuery(t)}function $n(e,t){var n=nt.macroModeState,r=n.lastInsertModeChanges;if(!n.isPlaying)while(t){r.expectCursorActivityForChange=!0;if(t.origin=="+input"||t.origin=="paste"||t.origin===undefined){var i=t.text.join("\n");r.maybeReset&&(r.changes=[],r.maybeReset=!1),r.changes.push(i)}t=t.next}}function Jn(e){var t=e.state.vim;if(t.insertMode){var n=nt.macroModeState;if(n.isPlaying)return;var r=n.lastInsertModeChanges;r.expectCursorActivityForChange?r.expectCursorActivityForChange=!1:r.maybeReset=!0}else e.curOp.isVimOp||Qn(e,t);t.visualMode&&Kn(e)}function Kn(e){var t=e.state.vim,n=wt(e,Lt(t.sel.head)),r=St(n,0,1);t.fakeCursor&&t.fakeCursor.clear(),t.fakeCursor=e.markText(n,r,{className:"cm-animate-fat-cursor"})}function Qn(e,t){var n=e.getCursor("anchor"),r=e.getCursor("head");t.visualMode&&!e.somethingSelected()?$t(e,!1):!t.visualMode&&!t.insertMode&&e.somethingSelected()&&(t.visualMode=!0,t.visualLine=!1,v.signal(e,"vim-mode-change",{mode:"visual"}));if(t.visualMode){var i=Ot(r,n)?0:-1,s=Ot(r,n)?-1:0;r=St(r,0,i),n=St(n,0,s),t.sel={anchor:n,head:r},an(e,t,"<",Mt(r,n)),an(e,t,">",_t(r,n))}else t.insertMode||(t.lastHPos=e.getCursor().ch)}function Gn(e){this.keyName=e}function Yn(e){function i(){return n.maybeReset&&(n.changes=[],n.maybeReset=!1),n.changes.push(new Gn(r)),!0}var t=nt.macroModeState,n=t.lastInsertModeChanges,r=v.keyName(e);if(!r)return;(r.indexOf("Delete")!=-1||r.indexOf("Backspace")!=-1)&&v.lookupKey(r,"vim-insert",i)}function Zn(e,t,n,r){function u(){s?ht.processAction(e,t,t.lastEditActionCommand):ht.evalInput(e,t)}function a(n){if(i.lastInsertModeChanges.changes.length>0){n=t.lastEditActionCommand?n:1;var r=i.lastInsertModeChanges;er(e,r.changes,n)}}var i=nt.macroModeState;i.isPlaying=!0;var s=!!t.lastEditActionCommand,o=t.inputState;t.inputState=t.lastEditInputState;if(s&&t.lastEditActionCommand.interlaceInsertRepeat)for(var f=0;f1&&t[0]=="n"&&(t=t.replace("numpad","")),t=tr[t]||t;var r="";return n.ctrlKey&&(r+="C-"),n.altKey&&(r+="A-"),n.shiftKey&&(r+="S-"),r+=t,r.length>1&&(r="<"+r+">"),r}function ir(e){var t=new e.constructor;return Object.keys(e).forEach(function(n){var r=e[n];Array.isArray(r)?r=r.slice():r&&typeof r=="object"&&r.constructor!=Object&&(r=ir(r)),t[n]=r}),e.sel&&(t.sel={head:e.sel.head&&Lt(e.sel.head),anchor:e.sel.anchor&&Lt(e.sel.anchor)}),t}function sr(e,t,n){var r=!1,i=S.maybeInitVimState_(e),s=i.visualBlock||i.wasInVisualBlock;i.wasInVisualBlock&&!e.ace.inMultiSelectMode?i.wasInVisualBlock=!1:e.ace.inMultiSelectMode&&i.visualBlock&&(i.wasInVisualBlock=!0);if(t==""&&!i.insertMode&&!i.visualMode&&e.ace.inMultiSelectMode)e.ace.exitMultiSelectMode();else if(s||!e.ace.inMultiSelectMode||e.ace.inVirtualSelectionMode)r=S.handleKey(e,t,n);else{var o=ir(i);e.operation(function(){e.ace.forEachSelection(function(){var i=e.ace.selection;e.state.vim.lastHPos=i.$desiredColumn==null?i.lead.column:i.$desiredColumn;var s=e.getCursor("head"),u=e.getCursor("anchor"),a=Ot(s,u)?0:-1,f=Ot(s,u)?-1:0;s=St(s,0,a),u=St(u,0,f),e.state.vim.sel.head=s,e.state.vim.sel.anchor=u,r=rr(e,t,n),i.$desiredColumn=e.state.vim.lastHPos==-1?null:e.state.vim.lastHPos,e.virtualSelectionMode()&&(e.state.vim=ir(o))}),e.curOp.cursorActivity&&!r&&(e.curOp.cursorActivity=!1)},!0)}return r}function ar(e,t){t.off("beforeEndOperation",ar);var n=t.state.cm.vimCmd;n&&t.execCommand(n.exec?n:n.name,n.args),t.curOp=t.prevOp}var i=e("../range").Range,s=e("../lib/event_emitter").EventEmitter,o=e("../lib/dom"),u=e("../lib/oop"),a=e("../lib/keys"),f=e("../lib/event"),l=e("../search").Search,c=e("../lib/useragent"),h=e("../search_highlight").SearchHighlight,p=e("../commands/multi_select_commands"),d=e("../mode/text").Mode.prototype.tokenRe;e("../multi_select");var v=function(e){this.ace=e,this.state={},this.marks={},this.$uid=0,this.onChange=this.onChange.bind(this),this.onSelectionChange=this.onSelectionChange.bind(this),this.onBeforeEndOperation=this.onBeforeEndOperation.bind(this),this.ace.on("change",this.onChange),this.ace.on("changeSelection",this.onSelectionChange),this.ace.on("beforeEndOperation",this.onBeforeEndOperation)};v.Pos=function(e,t){if(!(this instanceof E))return new E(e,t);this.line=e,this.ch=t},v.defineOption=function(e,t,n){},v.commands={redo:function(e){e.ace.redo()},undo:function(e){e.ace.undo()},newlineAndIndent:function(e){e.ace.insert("\n")}},v.keyMap={},v.addClass=v.rmClass=v.e_stop=function(){},v.keyName=function(e){if(e.key)return e.key;var t=a[e.keyCode]||"";return t.length==1&&(t=t.toUpperCase()),t=f.getModifierString(e).replace(/(^|-)\w/g,function(e){return e.toUpperCase()})+t,t},v.keyMap["default"]=function(e){return function(t){var n=t.ace.commands.commandKeyBinding[e.toLowerCase()];return n&&t.ace.execCommand(n)!==!1}},v.lookupKey=function fr(e,t,n){typeof t=="string"&&(t=v.keyMap[t]);var r=typeof t=="function"?t(e):t[e];if(r===!1)return"nothing";if(r==="...")return"multi";if(r!=null&&n(r))return"handled";if(t.fallthrough){if(!Array.isArray(t.fallthrough))return fr(e,t.fallthrough,n);for(var i=0;i0){a.row+=s,a.column+=a.row==r.row?o:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}};var e=function(e,t,n,r){this.cm=e,this.id=t,this.row=n,this.column=r,e.marks[this.id]=this};e.prototype.clear=function(){delete this.cm.marks[this.id]},e.prototype.find=function(){return g(this)},this.setBookmark=function(t,n){var r=new e(this,this.$uid++,t.line,t.ch);if(!n||!n.insertLeft)r.$insertRight=!0;return this.marks[r.id]=r,r},this.moveH=function(e,t){if(t=="char"){var n=this.ace.selection;n.clearSelection(),n.moveCursorBy(0,e)}},this.findPosV=function(e,t,n,r){if(n=="page"){var i=this.ace.renderer,s=i.layerConfig;t*=Math.floor(s.height/s.lineHeight),n="line"}if(n=="line"){var o=this.ace.session.documentToScreenPosition(e.line,e.ch);r!=null&&(o.column=r),o.row+=t,o.row=Math.min(Math.max(0,o.row),this.ace.session.getScreenLength()-1);var u=this.ace.session.screenToDocumentPosition(o.row,o.column);return g(u)}debugger},this.charCoords=function(e,t){if(t=="div"||!t){var n=this.ace.session.documentToScreenPosition(e.line,e.ch);return{left:n.column,top:n.row}}if(t=="local"){var r=this.ace.renderer,n=this.ace.session.documentToScreenPosition(e.line,e.ch),i=r.layerConfig.lineHeight,s=r.layerConfig.characterWidth,o=i*n.row;return{left:n.column*s,top:o,bottom:o+i}}},this.coordsChar=function(e,t){var n=this.ace.renderer;if(t=="local"){var r=Math.max(0,Math.floor(e.top/n.lineHeight)),i=Math.max(0,Math.floor(e.left/n.characterWidth)),s=n.session.screenToDocumentPosition(r,i);return g(s)}if(t=="div")throw"not implemented"},this.getSearchCursor=function(e,t,n){var r=!1,i=!1;e instanceof RegExp&&!e.global&&(r=!e.ignoreCase,e=e.source,i=!0);var s=new l;t.ch==undefined&&(t.ch=Number.MAX_VALUE);var o={row:t.line,column:t.ch},u=this,a=null;return{findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(t){s.setOptions({needle:e,caseSensitive:r,wrap:!1,backwards:t,regExp:i,start:a||o});var n=s.find(u.ace.session);return n&&n.isEmpty()&&u.getLine(n.start.row).length==n.start.column&&(s.$options.start=n,n=s.find(u.ace.session)),a=n,a},from:function(){return a&&g(a.start)},to:function(){return a&&g(a.end)},replace:function(e){a&&(a.end=u.ace.session.doc.replace(a,e))}}},this.scrollTo=function(e,t){var n=this.ace.renderer,r=n.layerConfig,i=r.maxHeight;i-=(n.$size.scrollerHeight-n.lineHeight)*n.$scrollPastEnd,t!=null&&this.ace.session.setScrollTop(Math.max(0,Math.min(t,i))),e!=null&&this.ace.session.setScrollLeft(Math.max(0,Math.min(e,r.width)))},this.scrollInfo=function(){return 0},this.scrollIntoView=function(e,t){if(e){var n=this.ace.renderer,r={top:0,bottom:t};n.scrollCursorIntoView(m(e),n.lineHeight*2/n.$size.scrollerHeight,r)}},this.getLine=function(e){return this.ace.session.getLine(e)},this.getRange=function(e,t){return this.ace.session.getTextRange(new i(e.line,e.ch,t.line,t.ch))},this.replaceRange=function(e,t,n){return n||(n=t),this.ace.session.replace(new i(t.line,t.ch,n.line,n.ch),e)},this.replaceSelections=function(e){var t=this.ace.selection;if(this.ace.inVirtualSelectionMode){this.ace.session.replace(t.getRange(),e[0]||"");return}t.inVirtualSelectionMode=!0;var n=t.rangeList.ranges;n.length||(n=[this.ace.multiSelect.getRange()]);for(var r=n.length;r--;)this.ace.session.replace(n[r],e[r]||"");t.inVirtualSelectionMode=!1},this.getSelection=function(){return this.ace.getSelectedText()},this.getSelections=function(){return this.listSelections().map(function(e){return this.getRange(e.anchor,e.head)},this)},this.getInputField=function(){return this.ace.textInput.getElement()},this.getWrapperElement=function(){return this.ace.containter};var t={indentWithTabs:"useSoftTabs",indentUnit:"tabSize",tabSize:"tabSize",firstLineNumber:"firstLineNumber",readOnly:"readOnly"};this.setOption=function(e,n){this.state[e]=n;switch(e){case"indentWithTabs":e=t[e],n=!n;break;default:e=t[e]}e&&this.ace.setOption(e,n)},this.getOption=function(e,n){var r=t[e];r&&(n=this.ace.getOption(r));switch(e){case"indentWithTabs":return e=t[e],!n}return r?n:this.state[e]},this.toggleOverwrite=function(e){return this.state.overwrite=e,this.ace.setOverwrite(e)},this.addOverlay=function(e){if(!this.$searchHighlight||!this.$searchHighlight.session){var t=new h(null,"ace_highlight-marker","text"),n=this.ace.session.addDynamicMarker(t);t.id=n.id,t.session=this.ace.session,t.destroy=function(e){t.session.off("change",t.updateOnChange),t.session.off("changeEditor",t.destroy),t.session.removeMarker(t.id),t.session=null},t.updateOnChange=function(e){var n=e.start.row;n==e.end.row?t.cache[n]=undefined:t.cache.splice(n,t.cache.length)},t.session.on("changeEditor",t.destroy),t.session.on("change",t.updateOnChange)}var r=new RegExp(e.query.source,"gmi");this.$searchHighlight=e.highlight=t,this.$searchHighlight.setRegexp(r),this.ace.renderer.updateBackMarkers()},this.removeOverlay=function(e){this.$searchHighlight&&this.$searchHighlight.session&&this.$searchHighlight.destroy()},this.getScrollInfo=function(){var e=this.ace.renderer,t=e.layerConfig;return{left:e.scrollLeft,top:e.scrollTop,height:t.maxHeight,width:t.width,clientHeight:t.height,clientWidth:t.width}},this.getValue=function(){return this.ace.getValue()},this.setValue=function(e){return this.ace.setValue(e)},this.getTokenTypeAt=function(e){var t=this.ace.session.getTokenAt(e.line,e.ch);return t&&/comment|string/.test(t.type)?"string":""},this.findMatchingBracket=function(e){var t=this.ace.session.findMatchingBracket(m(e));return{to:t&&g(t)}},this.indentLine=function(e,t){t===!0?this.ace.session.indentRows(e,e," "):t===!1&&this.ace.session.outdentRows(new i(e,0,e,0))},this.indexFromPos=function(e){return this.ace.session.doc.positionToIndex(m(e))},this.posFromIndex=function(e){return g(this.ace.session.doc.indexToPosition(e))},this.focus=function(e){return this.ace.focus()},this.blur=function(e){return this.ace.blur()},this.defaultTextHeight=function(e){return this.ace.renderer.layerConfig.lineHeight},this.scanForBracket=function(e,t,n,r){var i=r.bracketRegex.source;if(t==1)var s=this.ace.session.$findClosingBracket(i.slice(1,2),m(e),/paren|text/);else var s=this.ace.session.$findOpeningBracket(i.slice(-2,-1),{row:e.line,column:e.ch+1},/paren|text/);return s&&{pos:g(s)}},this.refresh=function(){return this.ace.resize(!0)},this.getMode=function(){return{name:this.getOption("mode")}}}.call(v.prototype);var y=v.StringStream=function(e,t){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};y.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||undefined},next:function(){if(this.post},eatSpace:function(){var e=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},backUp:function(e){this.pos-=e},column:function(){throw"not implemented"},indentation:function(){throw"not implemented"},match:function(e,t,n){if(typeof e!="string"){var s=this.string.slice(this.pos).match(e);return s&&s.index>0?null:(s&&t!==!1&&(this.pos+=s[0].length),s)}var r=function(e){return n?e.toLowerCase():e},i=this.string.substr(this.pos,e.length);if(r(i)==r(e))return t!==!1&&(this.pos+=e.length),!0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}}},v.defineExtension=function(e,t){v.prototype[e]=t},o.importCssString(".normal-mode .ace_cursor{ border: 1px solid red; background-color: red; opacity: 0.5;}.normal-mode .ace_hidden-cursors .ace_cursor{ background-color: transparent;}.ace_dialog { position: absolute; left: 0; right: 0; background: white; z-index: 15; padding: .1em .8em; overflow: hidden; color: #333;}.ace_dialog-top { border-bottom: 1px solid #eee; top: 0;}.ace_dialog-bottom { border-top: 1px solid #eee; bottom: 0;}.ace_dialog input { border: none; outline: none; background: transparent; width: 20em; color: inherit; font-family: monospace;}","vimMode"),function(){function e(e,t,n){var r=e.ace.container,i;return i=r.appendChild(document.createElement("div")),n?i.className="ace_dialog ace_dialog-bottom":i.className="ace_dialog ace_dialog-top",typeof t=="string"?i.innerHTML=t:i.appendChild(t),i}function t(e,t){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=t}v.defineExtension("openDialog",function(n,r,i){function a(e){if(typeof e=="string")f.value=e;else{if(o)return;o=!0,s.parentNode.removeChild(s),u.focus(),i.onClose&&i.onClose(s)}}if(this.virtualSelectionMode())return;i||(i={}),t(this,null);var s=e(this,n,i.bottom),o=!1,u=this,f=s.getElementsByTagName("input")[0],l;if(f)i.value&&(f.value=i.value,i.select!==!1&&f.select()),i.onInput&&v.on(f,"input",function(e){i.onInput(e,f.value,a)}),i.onKeyUp&&v.on(f,"keyup",function(e){i.onKeyUp(e,f.value,a)}),v.on(f,"keydown",function(e){if(i&&i.onKeyDown&&i.onKeyDown(e,f.value,a))return;if(e.keyCode==27||i.closeOnEnter!==!1&&e.keyCode==13)f.blur(),v.e_stop(e),a();e.keyCode==13&&r(f.value)}),i.closeOnBlur!==!1&&v.on(f,"blur",a),f.focus();else if(l=s.getElementsByTagName("button")[0])v.on(l,"click",function(){a(),u.focus()}),i.closeOnBlur!==!1&&v.on(l,"blur",a),l.focus();return a}),v.defineExtension("openNotification",function(n,r){function a(){if(s)return;s=!0,clearTimeout(o),i.parentNode.removeChild(i)}if(this.virtualSelectionMode())return;t(this,a);var i=e(this,n,r&&r.bottom),s=!1,o,u=r&&typeof r.duration!="undefined"?r.duration:5e3;return v.on(i,"click",function(e){v.e_preventDefault(e),a()}),u&&(o=setTimeout(a,u)),a})}();var b=[{keys:"",type:"keyToKey",toKeys:"h"},{keys:"",type:"keyToKey",toKeys:"l"},{keys:"",type:"keyToKey",toKeys:"k"},{keys:"",type:"keyToKey",toKeys:"j"},{keys:"",type:"keyToKey",toKeys:"l"},{keys:"",type:"keyToKey",toKeys:"h",context:"normal"},{keys:"",type:"keyToKey",toKeys:"W"},{keys:"",type:"keyToKey",toKeys:"B",context:"normal"},{keys:"",type:"keyToKey",toKeys:"w"},{keys:"",type:"keyToKey",toKeys:"b",context:"normal"},{keys:"",type:"keyToKey",toKeys:"j"},{keys:"",type:"keyToKey",toKeys:"k"},{keys:"",type:"keyToKey",toKeys:""},{keys:"",type:"keyToKey",toKeys:""},{keys:"",type:"keyToKey",toKeys:"",context:"insert"},{keys:"",type:"keyToKey",toKeys:"",context:"insert"},{keys:"s",type:"keyToKey",toKeys:"cl",context:"normal"},{keys:"s",type:"keyToKey",toKeys:"c",context:"visual"},{keys:"S",type:"keyToKey",toKeys:"cc",context:"normal"},{keys:"S",type:"keyToKey",toKeys:"VdO",context:"visual"},{keys:"",type:"keyToKey",toKeys:"0"},{keys:"",type:"keyToKey",toKeys:"$"},{keys:"",type:"keyToKey",toKeys:""},{keys:"",type:"keyToKey",toKeys:""},{keys:"",type:"keyToKey",toKeys:"j^",context:"normal"},{keys:"H",type:"motion",motion:"moveToTopLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"M",type:"motion",motion:"moveToMiddleLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"L",type:"motion",motion:"moveToBottomLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"h",type:"motion",motion:"moveByCharacters",motionArgs:{forward:!1}},{keys:"l",type:"motion",motion:"moveByCharacters",motionArgs:{forward:!0}},{keys:"j",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,linewise:!0}},{keys:"k",type:"motion",motion:"moveByLines",motionArgs:{forward:!1,linewise:!0}},{keys:"gj",type:"motion",motion:"moveByDisplayLines",motionArgs:{forward:!0}},{keys:"gk",type:"motion",motion:"moveByDisplayLines",motionArgs:{forward:!1}},{keys:"w",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!1}},{keys:"W",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!1,bigWord:!0}},{keys:"e",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!0,inclusive:!0}},{keys:"E",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:"b",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1}},{keys:"B",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1,bigWord:!0}},{keys:"ge",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!0,inclusive:!0}},{keys:"gE",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:"{",type:"motion",motion:"moveByParagraph",motionArgs:{forward:!1,toJumplist:!0}},{keys:"}",type:"motion",motion:"moveByParagraph",motionArgs:{forward:!0,toJumplist:!0}},{keys:"",type:"motion",motion:"moveByPage",motionArgs:{forward:!0}},{keys:"",type:"motion",motion:"moveByPage",motionArgs:{forward:!1}},{keys:"",type:"motion",motion:"moveByScroll",motionArgs:{forward:!0,explicitRepeat:!0}},{keys:"",type:"motion",motion:"moveByScroll",motionArgs:{forward:!1,explicitRepeat:!0}},{keys:"gg",type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:"G",type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!0,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:"0",type:"motion",motion:"moveToStartOfLine"},{keys:"^",type:"motion",motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"+",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,toFirstChar:!0}},{keys:"-",type:"motion",motion:"moveByLines",motionArgs:{forward:!1,toFirstChar:!0}},{keys:"_",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,toFirstChar:!0,repeatOffset:-1}},{keys:"$",type:"motion",motion:"moveToEol",motionArgs:{inclusive:!0}},{keys:"%",type:"motion",motion:"moveToMatchedSymbol",motionArgs:{inclusive:!0,toJumplist:!0}},{keys:"f",type:"motion",motion:"moveToCharacter",motionArgs:{forward:!0,inclusive:!0}},{keys:"F",type:"motion",motion:"moveToCharacter",motionArgs:{forward:!1}},{keys:"t",type:"motion",motion:"moveTillCharacter",motionArgs:{forward:!0,inclusive:!0}},{keys:"T",type:"motion",motion:"moveTillCharacter",motionArgs:{forward:!1}},{keys:";",type:"motion",motion:"repeatLastCharacterSearch",motionArgs:{forward:!0}},{keys:",",type:"motion",motion:"repeatLastCharacterSearch",motionArgs:{forward:!1}},{keys:"'",type:"motion",motion:"goToMark",motionArgs:{toJumplist:!0,linewise:!0}},{keys:"`",type:"motion",motion:"goToMark",motionArgs:{toJumplist:!0}},{keys:"]`",type:"motion",motion:"jumpToMark",motionArgs:{forward:!0}},{keys:"[`",type:"motion",motion:"jumpToMark",motionArgs:{forward:!1}},{keys:"]'",type:"motion",motion:"jumpToMark",motionArgs:{forward:!0,linewise:!0}},{keys:"['",type:"motion",motion:"jumpToMark",motionArgs:{forward:!1,linewise:!0}},{keys:"]p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!0,isEdit:!0,matchIndent:!0}},{keys:"[p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!1,isEdit:!0,matchIndent:!0}},{keys:"]",type:"motion",motion:"moveToSymbol",motionArgs:{forward:!0,toJumplist:!0}},{keys:"[",type:"motion",motion:"moveToSymbol",motionArgs:{forward:!1,toJumplist:!0}},{keys:"|",type:"motion",motion:"moveToColumn"},{keys:"o",type:"motion",motion:"moveToOtherHighlightedEnd",context:"visual"},{keys:"O",type:"motion",motion:"moveToOtherHighlightedEnd",motionArgs:{sameLine:!0},context:"visual"},{keys:"d",type:"operator",operator:"delete"},{keys:"y",type:"operator",operator:"yank"},{keys:"c",type:"operator",operator:"change"},{keys:">",type:"operator",operator:"indent",operatorArgs:{indentRight:!0}},{keys:"<",type:"operator",operator:"indent",operatorArgs:{indentRight:!1}},{keys:"g~",type:"operator",operator:"changeCase"},{keys:"gu",type:"operator",operator:"changeCase",operatorArgs:{toLower:!0},isEdit:!0},{keys:"gU",type:"operator",operator:"changeCase",operatorArgs:{toLower:!1},isEdit:!0},{keys:"n",type:"motion",motion:"findNext",motionArgs:{forward:!0,toJumplist:!0}},{keys:"N",type:"motion",motion:"findNext",motionArgs:{forward:!1,toJumplist:!0}},{keys:"x",type:"operatorMotion",operator:"delete",motion:"moveByCharacters",motionArgs:{forward:!0},operatorMotionArgs:{visualLine:!1}},{keys:"X",type:"operatorMotion",operator:"delete",motion:"moveByCharacters",motionArgs:{forward:!1},operatorMotionArgs:{visualLine:!0}},{keys:"D",type:"operatorMotion",operator:"delete",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"D",type:"operator",operator:"delete",operatorArgs:{linewise:!0},context:"visual"},{keys:"Y",type:"operatorMotion",operator:"yank",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"Y",type:"operator",operator:"yank",operatorArgs:{linewise:!0},context:"visual"},{keys:"C",type:"operatorMotion",operator:"change",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"C",type:"operator",operator:"change",operatorArgs:{linewise:!0},context:"visual"},{keys:"~",type:"operatorMotion",operator:"changeCase",motion:"moveByCharacters",motionArgs:{forward:!0},operatorArgs:{shouldMoveCursor:!0},context:"normal"},{keys:"~",type:"operator",operator:"changeCase",context:"visual"},{keys:"",type:"operatorMotion",operator:"delete",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1},context:"insert"},{keys:"",type:"action",action:"jumpListWalk",actionArgs:{forward:!0}},{keys:"",type:"action",action:"jumpListWalk",actionArgs:{forward:!1}},{keys:"",type:"action",action:"scroll",actionArgs:{forward:!0,linewise:!0}},{keys:"",type:"action",action:"scroll",actionArgs:{forward:!1,linewise:!0}},{keys:"a",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"charAfter"},context:"normal"},{keys:"A",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"eol"},context:"normal"},{keys:"A",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"endOfSelectedArea"},context:"visual"},{keys:"i",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"inplace"},context:"normal"},{keys:"I",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"firstNonBlank"},context:"normal"},{keys:"I",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"startOfSelectedArea"},context:"visual"},{keys:"o",type:"action",action:"newLineAndEnterInsertMode",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!0},context:"normal"},{keys:"O",type:"action",action:"newLineAndEnterInsertMode",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!1},context:"normal"},{keys:"v",type:"action",action:"toggleVisualMode"},{keys:"V",type:"action",action:"toggleVisualMode",actionArgs:{linewise:!0}},{keys:"",type:"action",action:"toggleVisualMode",actionArgs:{blockwise:!0}},{keys:"",type:"action",action:"toggleVisualMode",actionArgs:{blockwise:!0}},{keys:"gv",type:"action",action:"reselectLastSelection"},{keys:"J",type:"action",action:"joinLines",isEdit:!0},{keys:"p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!0,isEdit:!0}},{keys:"P",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!1,isEdit:!0}},{keys:"r",type:"action",action:"replace",isEdit:!0},{keys:"@",type:"action",action:"replayMacro"},{keys:"q",type:"action",action:"enterMacroRecordMode"},{keys:"R",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{replace:!0}},{keys:"u",type:"action",action:"undo",context:"normal"},{keys:"u",type:"operator",operator:"changeCase",operatorArgs:{toLower:!0},context:"visual",isEdit:!0},{keys:"U",type:"operator",operator:"changeCase",operatorArgs:{toLower:!1},context:"visual",isEdit:!0},{keys:"",type:"action",action:"redo"},{keys:"m",type:"action",action:"setMark"},{keys:'"',type:"action",action:"setRegister"},{keys:"zz",type:"action",action:"scrollToCursor",actionArgs:{position:"center"}},{keys:"z.",type:"action",action:"scrollToCursor",actionArgs:{position:"center"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"zt",type:"action",action:"scrollToCursor",actionArgs:{position:"top"}},{keys:"z",type:"action",action:"scrollToCursor",actionArgs:{position:"top"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"z-",type:"action",action:"scrollToCursor",actionArgs:{position:"bottom"}},{keys:"zb",type:"action",action:"scrollToCursor",actionArgs:{position:"bottom"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:".",type:"action",action:"repeatLastEdit"},{keys:"",type:"action",action:"incrementNumberToken",isEdit:!0,actionArgs:{increase:!0,backtrack:!1}},{keys:"",type:"action",action:"incrementNumberToken",isEdit:!0,actionArgs:{increase:!1,backtrack:!1}},{keys:"a",type:"motion",motion:"textObjectManipulation"},{keys:"i",type:"motion",motion:"textObjectManipulation",motionArgs:{textObjectInner:!0}},{keys:"/",type:"search",searchArgs:{forward:!0,querySrc:"prompt",toJumplist:!0}},{keys:"?",type:"search",searchArgs:{forward:!1,querySrc:"prompt",toJumplist:!0}},{keys:"*",type:"search",searchArgs:{forward:!0,querySrc:"wordUnderCursor",wholeWordOnly:!0,toJumplist:!0}},{keys:"#",type:"search",searchArgs:{forward:!1,querySrc:"wordUnderCursor",wholeWordOnly:!0,toJumplist:!0}},{keys:"g*",type:"search",searchArgs:{forward:!0,querySrc:"wordUnderCursor",toJumplist:!0}},{keys:"g#",type:"search",searchArgs:{forward:!1,querySrc:"wordUnderCursor",toJumplist:!0}},{keys:":",type:"ex"}],w=[{name:"colorscheme",shortName:"colo"},{name:"map"},{name:"imap",shortName:"im"},{name:"nmap",shortName:"nm"},{name:"vmap",shortName:"vm"},{name:"unmap"},{name:"write",shortName:"w"},{name:"undo",shortName:"u"},{name:"redo",shortName:"red"},{name:"set",shortName:"se"},{name:"set",shortName:"se"},{name:"setlocal",shortName:"setl"},{name:"setglobal",shortName:"setg"},{name:"sort",shortName:"sor"},{name:"substitute",shortName:"s",possiblyAsync:!0},{name:"nohlsearch",shortName:"noh"},{name:"delmarks",shortName:"delm"},{name:"registers",shortName:"reg",excludeFromCommandHistory:!0},{name:"global",shortName:"g"}],E=v.Pos,S=function(){return st};v.defineOption("vimMode",!1,function(e,t,n){t&&e.getOption("keyMap")!="vim"?e.setOption("keyMap","vim"):!t&&n!=v.Init&&/^vim/.test(e.getOption("keyMap"))&&e.setOption("keyMap","default")});var L={Shift:"S",Ctrl:"C",Alt:"A",Cmd:"D",Mod:"A"},A={Enter:"CR",Backspace:"BS",Delete:"Del"},_=/[\d]/,D=[v.isWordChar,function(e){return e&&!v.isWordChar(e)&&!/\s/.test(e)}],P=[function(e){return/\S/.test(e)}],B=H(65,26),j=H(97,26),F=H(48,10),I=[].concat(B,j,F,["<",">"]),q=[].concat(B,j,F,["-",'"',".",":","/"]),J={};K("filetype",undefined,"string",["ft"],function(e,t){if(t===undefined)return;if(e===undefined){var n=t.getOption("mode");return n=="null"?"":n}var n=e==""?"null":e;t.setOption("mode",n)});var Y=function(){function s(s,o,u){function l(n){var r=++t%e,o=i[r];o&&o.clear(),i[r]=s.setBookmark(n)}var a=t%e,f=i[a];if(f){var c=f.find();c&&!At(c,o)&&l(o)}else l(o);l(u),n=t,r=t-e+1,r<0&&(r=0)}function o(s,o){t+=o,t>n?t=n:t0?1:-1,f,l=s.getCursor();do{t+=a,u=i[(e+t)%e];if(u&&(f=u.find())&&!At(l,f))break}while(tr)}return u}var e=100,t=-1,n=0,r=0,i=new Array(e);return{cachedCursor:undefined,add:s,move:o}},Z=function(e){return e?{changes:e.changes,expectCursorActivityForChange:e.expectCursorActivityForChange}:{changes:[],expectCursorActivityForChange:!1}};et.prototype={exitMacroRecordMode:function(){var e=nt.macroModeState;e.onRecordingDone&&e.onRecordingDone(),e.onRecordingDone=undefined,e.isRecording=!1},enterMacroRecordMode:function(e,t){var n=nt.registerController.getRegister(t);n&&(n.clear(),this.latestRegister=t,e.openDialog&&(this.onRecordingDone=e.openDialog("(recording)["+t+"]",null,{bottom:!0})),this.isRecording=!0)}};var nt,it,st={buildKeyMap:function(){},getRegisterController:function(){return nt.registerController},resetVimGlobalState_:rt,getVimGlobalState_:function(){return nt},maybeInitVimState_:tt,suppressErrorLogging:!1,InsertModeKey:Gn,map:function(e,t,n){Fn.map(e,t,n)},unmap:function(e,t){Fn.unmap(e,t)},setOption:Q,getOption:G,defineOption:K,defineEx:function(e,t,n){if(!t)t=e;else if(e.indexOf(t)!==0)throw new Error('(Vim.defineEx) "'+t+'" is not a prefix of "'+e+'", command not registered');jn[e]=n,Fn.commandMap_[t]={name:e,shortName:t,type:"api"}},handleKey:function(e,t,n){var r=this.findKey(e,t,n);if(typeof r=="function")return r()},findKey:function(e,t,n){function i(){var r=nt.macroModeState;if(r.isRecording){if(t=="q")return r.exitMacroRecordMode(),ut(e),!0;n!="mapping"&&Wn(r,t)}}function s(){if(t=="")return ut(e),r.visualMode?$t(e):r.insertMode&&qn(e),!0}function o(n){var r;while(n)r=/<\w+-.+?>|<\w+>|./.exec(n),t=r[0],n=n.substring(r.index+t.length),v.Vim.handleKey(e,t,"mapping")}function u(){if(s())return!0;var n=r.inputState.keyBuffer=r.inputState.keyBuffer+t,i=t.length==1,o=ht.matchCommand(n,b,r.inputState,"insert");while(n.length>1&&o.type!="full"){var n=r.inputState.keyBuffer=n.slice(1),u=ht.matchCommand(n,b,r.inputState,"insert");u.type!="none"&&(o=u)}if(o.type=="none")return ut(e),!1;if(o.type=="partial")return it&&window.clearTimeout(it),it=window.setTimeout(function(){r.insertMode&&r.inputState.keyBuffer&&ut(e)},G("insertModeEscKeysTimeout")),!i;it&&window.clearTimeout(it);if(i){var a=e.listSelections();for(var f=0;f0||this.motionRepeat.length>0)e=1,this.prefixRepeat.length>0&&(e*=parseInt(this.prefixRepeat.join(""),10)),this.motionRepeat.length>0&&(e*=parseInt(this.motionRepeat.join(""),10));return e},at.prototype={setText:function(e,t,n){this.keyBuffer=[e||""],this.linewise=!!t,this.blockwise=!!n},pushText:function(e,t){t&&(this.linewise||this.keyBuffer.push("\n"),this.linewise=!0),this.keyBuffer.push(e)},pushInsertModeChanges:function(e){this.insertModeChanges.push(Z(e))},pushSearchQuery:function(e){this.searchQueries.push(e)},clear:function(){this.keyBuffer=[],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!1},toString:function(){return this.keyBuffer.join("")}},lt.prototype={pushText:function(e,t,n,r,i){r&&n.charAt(0)=="\n"&&(n=n.slice(1)+"\n"),r&&n.charAt(n.length-1)!=="\n"&&(n+="\n");var s=this.isValidRegister(e)?this.getRegister(e):null;if(!s){switch(t){case"yank":this.registers[0]=new at(n,r,i);break;case"delete":case"change":n.indexOf("\n")==-1?this.registers["-"]=new at(n,r):(this.shiftNumericRegisters_(),this.registers[1]=new at(n,r))}this.unnamedRegister.setText(n,r,i);return}var o=X(e);o?s.pushText(n,r):s.setText(n,r,i),this.unnamedRegister.setText(s.toString(),r)},getRegister:function(e){return this.isValidRegister(e)?(e=e.toLowerCase(),this.registers[e]||(this.registers[e]=new at),this.registers[e]):this.unnamedRegister},isValidRegister:function(e){return e&&$(e,q)},shiftNumericRegisters_:function(){for(var e=9;e>=2;e--)this.registers[e]=this.getRegister(""+(e-1))}},ct.prototype={nextMatch:function(e,t){var n=this.historyBuffer,r=t?-1:1;this.initialPrefix===null&&(this.initialPrefix=e);for(var i=this.iterator+r;t?i>=0:i=n.length)return this.iterator=n.length,this.initialPrefix;if(i<0)return e},pushInput:function(e){var t=this.historyBuffer.indexOf(e);t>-1&&this.historyBuffer.splice(t,1),e.length&&this.historyBuffer.push(e)},reset:function(){this.initialPrefix=null,this.iterator=this.historyBuffer.length}};var ht={matchCommand:function(e,t,n,r){var i=Tt(e,t,r,n);if(!i.full&&!i.partial)return{type:"none"};if(!i.full&&i.partial)return{type:"partial"};var s;for(var o=0;o"&&(n.selectedCharacter=Ct(e)),{type:"full",command:s}},processCommand:function(e,t,n){t.inputState.repeatOverride=n.repeatOverride;switch(n.type){case"motion":this.processMotion(e,t,n);break;case"operator":this.processOperator(e,t,n);break;case"operatorMotion":this.processOperatorMotion(e,t,n);break;case"action":this.processAction(e,t,n);break;case"search":this.processSearch(e,t,n);break;case"ex":case"keyToEx":this.processEx(e,t,n);break;default:}},processMotion:function(e,t,n){t.inputState.motion=n.motion,t.inputState.motionArgs=Et(n.motionArgs),this.evalInput(e,t)},processOperator:function(e,t,n){var r=t.inputState;if(r.operator){if(r.operator==n.operator){r.motion="expandToLine",r.motionArgs={linewise:!0},this.evalInput(e,t);return}ut(e)}r.operator=n.operator,r.operatorArgs=Et(n.operatorArgs),t.visualMode&&this.evalInput(e,t)},processOperatorMotion:function(e,t,n){var r=t.visualMode,i=Et(n.operatorMotionArgs);i&&r&&i.visualLine&&(t.visualLine=!0),this.processOperator(e,t,n),r||this.processMotion(e,t,n)},processAction:function(e,t,n){var r=t.inputState,i=r.getRepeat(),s=!!i,o=Et(n.actionArgs)||{};r.selectedCharacter&&(o.selectedCharacter=r.selectedCharacter),n.operator&&this.processOperator(e,t,n),n.motion&&this.processMotion(e,t,n),(n.motion||n.operator)&&this.evalInput(e,t),o.repeat=i||1,o.repeatIsExplicit=s,o.registerName=r.registerName,ut(e),t.lastMotion=null,n.isEdit&&this.recordLastEdit(t,r,n),yt[n.action](e,o,t)},processSearch:function(e,t,n){function a(r,i,s){nt.searchHistoryController.pushInput(r),nt.searchHistoryController.reset();try{An(e,r,i,s)}catch(o){Tn(e,"Invalid regex: "+r),ut(e);return}ht.processMotion(e,t,{type:"motion",motion:"findNext",motionArgs:{forward:!0,toJumplist:n.searchArgs.toJumplist}})}function f(t){e.scrollTo(u.left,u.top),a(t,!0,!0);var n=nt.macroModeState;n.isRecording&&Vn(n,t)}function l(t,n,i){var s=v.keyName(t),o;s=="Up"||s=="Down"?(o=s=="Up"?!0:!1,n=nt.searchHistoryController.nextMatch(n,o)||"",i(n)):s!="Left"&&s!="Right"&&s!="Ctrl"&&s!="Alt"&&s!="Shift"&&nt.searchHistoryController.reset();var a;try{a=An(e,n,!0,!0)}catch(t){}a?e.scrollIntoView(_n(e,!r,a),30):(Dn(e),e.scrollTo(u.left,u.top))}function c(t,n,r){var i=v.keyName(t);i=="Esc"||i=="Ctrl-C"||i=="Ctrl-["||i=="Backspace"&&n==""?(nt.searchHistoryController.pushInput(n),nt.searchHistoryController.reset(),An(e,o),Dn(e),e.scrollTo(u.left,u.top),v.e_stop(t),ut(e),r(),e.focus()):i=="Ctrl-U"&&(v.e_stop(t),r(""))}if(!e.getSearchCursor)return;var r=n.searchArgs.forward,i=n.searchArgs.wholeWordOnly;dn(e).setReversed(!r);var s=r?"/":"?",o=dn(e).getQuery(),u=e.getScrollInfo();switch(n.searchArgs.querySrc){case"prompt":var h=nt.macroModeState;if(h.isPlaying){var p=h.replaySearchQueries.shift();a(p,!0,!1)}else kn(e,{onClose:f,prefix:s,desc:Cn,onKeyUp:l,onKeyDown:c});break;case"wordUnderCursor":var d=Gt(e,!1,!0,!1,!0),m=!0;d||(d=Gt(e,!1,!0,!1,!1),m=!1);if(!d)return;var p=e.getLine(d.start.line).substring(d.start.ch,d.end.ch);m&&i?p="\\b"+p+"\\b":p=Bt(p),nt.jumpList.cachedCursor=e.getCursor(),e.setCursor(d.start),a(p,!0,!1)}},processEx:function(e,t,n){function r(t){nt.exCommandHistoryController.pushInput(t),nt.exCommandHistoryController.reset(),Fn.processCommand(e,t)}function i(t,n,r){var i=v.keyName(t),s;if(i=="Esc"||i=="Ctrl-C"||i=="Ctrl-["||i=="Backspace"&&n=="")nt.exCommandHistoryController.pushInput(n),nt.exCommandHistoryController.reset(),v.e_stop(t),ut(e),r(),e.focus();i=="Up"||i=="Down"?(s=i=="Up"?!0:!1,n=nt.exCommandHistoryController.nextMatch(n,s)||"",r(n)):i=="Ctrl-U"?(v.e_stop(t),r("")):i!="Left"&&i!="Right"&&i!="Ctrl"&&i!="Alt"&&i!="Shift"&&nt.exCommandHistoryController.reset()}n.type=="keyToEx"?Fn.processCommand(e,n.exArgs.input):t.visualMode?kn(e,{onClose:r,prefix:":",value:"'<,'>",onKeyDown:i}):kn(e,{onClose:r,prefix:":",onKeyDown:i})},evalInput:function(e,t){var n=t.inputState,r=n.motion,i=n.motionArgs||{},s=n.operator,o=n.operatorArgs||{},u=n.registerName,a=t.sel,f=Lt(t.visualMode?wt(e,a.head):e.getCursor("head")),l=Lt(t.visualMode?wt(e,a.anchor):e.getCursor("anchor")),c=Lt(f),h=Lt(l),p,d,v;s&&this.recordLastEdit(t,n),n.repeatOverride!==undefined?v=n.repeatOverride:v=n.getRepeat();if(v>0&&i.explicitRepeat)i.repeatIsExplicit=!0;else if(i.noRepeat||!i.explicitRepeat&&v===0)v=1,i.repeatIsExplicit=!1;n.selectedCharacter&&(i.selectedCharacter=o.selectedCharacter=n.selectedCharacter),i.repeat=v,ut(e);if(r){var m=pt[r](e,f,i,t);t.lastMotion=pt[r];if(!m)return;if(i.toJumplist){!s&&e.ace.curOp!=null&&(e.ace.curOp.command.scrollIntoView="center-animate");var g=nt.jumpList,y=g.cachedCursor;y?(Yt(e,y,m),delete g.cachedCursor):Yt(e,f,m)}m instanceof Array?(d=m[0],p=m[1]):p=m,p||(p=Lt(f));if(t.visualMode){if(!t.visualBlock||p.ch!==Infinity)p=wt(e,p,t.visualBlock);d&&(d=wt(e,d,!0)),d=d||h,a.anchor=d,a.head=p,Wt(e),an(e,t,"<",Ot(d,p)?d:p),an(e,t,">",Ot(d,p)?p:d)}else s||(p=wt(e,p),e.setCursor(p.line,p.ch))}if(s){if(o.lastSel){d=h;var b=o.lastSel,w=Math.abs(b.head.line-b.anchor.line),S=Math.abs(b.head.ch-b.anchor.ch);b.visualLine?p=E(h.line+w,h.ch):b.visualBlock?p=E(h.line+w,h.ch+S):b.head.line==b.anchor.line?p=E(h.line,h.ch+S):p=E(h.line+w,h.ch),t.visualMode=!0,t.visualLine=b.visualLine,t.visualBlock=b.visualBlock,a=t.sel={anchor:d,head:p},Wt(e)}else t.visualMode&&(o.lastSel={anchor:Lt(a.anchor),head:Lt(a.head),visualBlock:t.visualBlock,visualLine:t.visualLine});var x,T,N,C,k;if(t.visualMode){x=Mt(a.head,a.anchor),T=_t(a.head,a.anchor),N=t.visualLine||o.linewise,C=t.visualBlock?"block":N?"line":"char",k=Xt(e,{anchor:x,head:T},C);if(N){var L=k.ranges;if(C=="block")for(var A=0;Af&&i.line==f)return;var l=e.ace.session.getFoldLine(u);return l&&(n.forward?u>l.start.row&&(u=l.end.row+1):u=l.start.row),n.toFirstChar&&(s=Qt(e.getLine(u)),r.lastHPos=s),r.lastHSPos=e.charCoords(E(u,s),"div").left,E(u,s)},moveByDisplayLines:function(e,t,n,r){var i=t;switch(r.lastMotion){case this.moveByDisplayLines:case this.moveByScroll:case this.moveByLines:case this.moveToColumn:case this.moveToEol:break;default:r.lastHSPos=e.charCoords(i,"div").left}var s=n.repeat,o=e.findPosV(i,n.forward?s:-s,"line",r.lastHSPos);if(o.hitSide)if(n.forward)var u=e.charCoords(o,"div"),a={top:u.top+8,left:r.lastHSPos},o=e.coordsChar(a,"div");else{var f=e.charCoords(E(e.firstLine(),0),"div");f.left=r.lastHSPos,o=e.coordsChar(f,"div")}return r.lastHPos=o.ch,o},moveByPage:function(e,t,n){var r=t,i=n.repeat;return e.findPosV(r,n.forward?i:-i,"page")},moveByParagraph:function(e,t,n){var r=n.forward?1:-1;return ln(e,t,n.repeat,r)},moveByScroll:function(e,t,n,r){var i=e.getScrollInfo(),s=null,o=n.repeat;o||(o=i.clientHeight/(2*e.defaultTextHeight()));var u=e.charCoords(t,"local");n.repeat=o;var s=pt.moveByDisplayLines(e,t,n,r);if(!s)return null;var a=e.charCoords(s,"local");return e.scrollTo(null,i.top+a.top-u.top),s},moveByWords:function(e,t,n){return sn(e,t,n.repeat,!!n.forward,!!n.wordEnd,!!n.bigWord)},moveTillCharacter:function(e,t,n){var r=n.repeat,i=on(e,r,n.forward,n.selectedCharacter),s=n.forward?-1:1;return Zt(s,n),i?(i.ch+=s,i):null},moveToCharacter:function(e,t,n){var r=n.repeat;return Zt(0,n),on(e,r,n.forward,n.selectedCharacter)||t},moveToSymbol:function(e,t,n){var r=n.repeat;return nn(e,r,n.forward,n.selectedCharacter)||t},moveToColumn:function(e,t,n,r){var i=n.repeat;return r.lastHPos=i-1,r.lastHSPos=e.charCoords(t,"div").left,un(e,i)},moveToEol:function(e,t,n,r){var i=t;r.lastHPos=Infinity;var s=E(i.line+n.repeat-1,Infinity),o=e.clipPos(s);return o.ch--,r.lastHSPos=e.charCoords(o,"div").left,s},moveToFirstNonWhiteSpaceCharacter:function(e,t){var n=t;return E(n.line,Qt(e.getLine(n.line)))},moveToMatchedSymbol:function(e,t){var n=t,r=n.line,i=n.ch,s=e.getLine(r),o;do{o=s.charAt(i++);if(o&&z(o)){var u=e.getTokenTypeAt(E(r,i));if(u!=="string"&&u!=="comment")break}}while(o);if(o){var a=e.findMatchingBracket(E(r,i));return a.to}return n},moveToStartOfLine:function(e,t){return E(t.line,0)},moveToLineOrEdgeOfDocument:function(e,t,n){var r=n.forward?e.lastLine():e.firstLine();return n.repeatIsExplicit&&(r=n.repeat-e.getOption("firstLineNumber")),E(r,Qt(e.getLine(r)))},textObjectManipulation:function(e,t,n,r){var i={"(":")",")":"(","{":"}","}":"{","[":"]","]":"["},s={"'":!0,'"':!0},o=n.selectedCharacter;o=="b"?o="(":o=="B"&&(o="{");var u=!n.textObjectInner,a;if(i[o])a=cn(e,t,o,u);else if(s[o])a=hn(e,t,o,u);else if(o==="W")a=Gt(e,u,!0,!0);else if(o==="w")a=Gt(e,u,!0,!1);else{if(o!=="p")return null;a=ln(e,t,n.repeat,0,u),n.linewise=!0;if(r.visualMode)r.visualLine||(r.visualLine=!0);else{var f=r.inputState.operatorArgs;f&&(f.linewise=!0),a.end.line--}}return e.state.vim.visualMode?zt(e,a.start,a.end):[a.start,a.end]},repeatLastCharacterSearch:function(e,t,n){var r=nt.lastChararacterSearch,i=n.repeat,s=n.forward===r.forward,o=(r.increment?1:0)*(s?-1:1);e.moveH(-o,"char"),n.inclusive=s?!0:!1;var u=on(e,i,s,r.selectedCharacter);return u?(u.ch+=o,u):(e.moveH(o,"char"),t)}},mt={change:function(e,t,n){var r,i,s=e.state.vim;nt.macroModeState.lastInsertModeChanges.inVisualBlock=s.visualBlock;if(!s.visualMode){var o=n[0].anchor,u=n[0].head;i=e.getRange(o,u);var a=s.lastEditInputState||{};if(a.motion=="moveByWords"&&!V(i)){var f=/\s+$/.exec(i);f&&a.motionArgs&&a.motionArgs.forward&&(u=St(u,0,-f[0].length),i=i.slice(0,-f[0].length))}var l=new E(o.line-1,Number.MAX_VALUE),c=e.firstLine()==e.lastLine();u.line>e.lastLine()&&t.linewise&&!c?e.replaceRange("",l,u):e.replaceRange("",o,u),t.linewise&&(c||(e.setCursor(l),v.commands.newlineAndIndent(e)),o.ch=Number.MAX_VALUE),r=o}else{i=e.getSelection();var h=vt("",n.length);e.replaceSelections(h),r=Mt(n[0].head,n[0].anchor)}nt.registerController.pushText(t.registerName,"change",i,t.linewise,n.length>1),yt.enterInsertMode(e,{head:r},e.state.vim)},"delete":function(e,t,n){var r,i,s=e.state.vim;if(!s.visualBlock){var o=n[0].anchor,u=n[0].head;t.linewise&&u.line!=e.firstLine()&&o.line==e.lastLine()&&o.line==u.line-1&&(o.line==e.firstLine()?o.ch=0:o=E(o.line-1,Pt(e,o.line-1))),i=e.getRange(o,u),e.replaceRange("",o,u),r=o,t.linewise&&(r=pt.moveToFirstNonWhiteSpaceCharacter(e,o))}else{i=e.getSelection();var a=vt("",n.length);e.replaceSelections(a),r=n[0].anchor}return nt.registerController.pushText(t.registerName,"delete",i,t.linewise,s.visualBlock),wt(e,r)},indent:function(e,t,n){var r=e.state.vim,i=n[0].anchor.line,s=r.visualBlock?n[n.length-1].anchor.line:n[0].head.line,o=r.visualMode?t.repeat:1;t.linewise&&s--;for(var u=i;u<=s;u++)for(var a=0;af.top?(a.line+=(u-f.top)/i,a.line=Math.ceil(a.line),e.setCursor(a),f=e.charCoords(a,"local"),e.scrollTo(null,f.top)):e.scrollTo(null,u);else{var l=u+e.getScrollInfo().clientHeight;l=i.anchor.line?s=St(i.head,0,1):s=E(i.anchor.line,0);else if(r=="inplace"&&n.visualMode)return;e.setOption("keyMap","vim-insert"),e.setOption("disableInput",!1),t&&t.replace?(e.toggleOverwrite(!0),e.setOption("keyMap","vim-replace"),v.signal(e,"vim-mode-change",{mode:"replace"})):(e.setOption("keyMap","vim-insert"),v.signal(e,"vim-mode-change",{mode:"insert"})),nt.macroModeState.isPlaying||(e.on("change",$n),v.on(e.getInputField(),"keydown",Yn)),n.visualMode&&$t(e),It(e,s,o)},toggleVisualMode:function(e,t,n){var r=t.repeat,i=e.getCursor(),s;n.visualMode?n.visualLine^t.linewise||n.visualBlock^t.blockwise?(n.visualLine=!!t.linewise,n.visualBlock=!!t.blockwise,v.signal(e,"vim-mode-change",{mode:"visual",subMode:n.visualLine?"linewise":n.visualBlock?"blockwise":""}),Wt(e)):$t(e):(n.visualMode=!0,n.visualLine=!!t.linewise,n.visualBlock=!!t.blockwise,s=wt(e,E(i.line,i.ch+r-1),!0),n.sel={anchor:i,head:s},v.signal(e,"vim-mode-change",{mode:"visual",subMode:n.visualLine?"linewise":n.visualBlock?"blockwise":""}),Wt(e),an(e,n,"<",Mt(i,s)),an(e,n,">",_t(i,s)))},reselectLastSelection:function(e,t,n){var r=n.lastSelection;n.visualMode&&Ut(e,n);if(r){var i=r.anchorMark.find(),s=r.headMark.find();if(!i||!s)return;n.sel={anchor:i,head:s},n.visualMode=!0,n.visualLine=r.visualLine,n.visualBlock=r.visualBlock,Wt(e),an(e,n,"<",Mt(i,s)),an(e,n,">",_t(i,s)),v.signal(e,"vim-mode-change",{mode:"visual",subMode:n.visualLine?"linewise":n.visualBlock?"blockwise":""})}},joinLines:function(e,t,n){var r,i;if(n.visualMode){r=e.getCursor("anchor"),i=e.getCursor("head");if(Ot(i,r)){var s=i;i=r,r=s}i.ch=Pt(e,i.line)-1}else{var o=Math.max(t.repeat,2);r=e.getCursor(),i=wt(e,E(r.line+o-1,Infinity))}var u=0;for(var a=r.line;a1)var s=Array(t.repeat+1).join(s);var p=i.linewise,d=i.blockwise;if(p&&!d)n.visualMode?s=n.visualLine?s.slice(0,-1):"\n"+s.slice(0,s.length-1)+"\n":t.after?(s="\n"+s.slice(0,s.length-1),r.ch=Pt(e,r.line)):r.ch=0;else{if(d){s=s.split("\n");for(var v=0;ve.lastLine()&&e.replaceRange("\n",E(C,0));var k=Pt(e,C);ka.length&&(s=a.length),o=E(i.line,s)}if(r=="\n")n.visualMode||e.replaceRange("",i,o),(v.commands.newlineAndIndentContinueComment||v.commands.newlineAndIndent)(e);else{var f=e.getRange(i,o);f=f.replace(/[^\n]/g,r);if(n.visualBlock){var l=(new Array(e.getOption("tabSize")+1)).join(" ");f=e.getSelection(),f=f.replace(/\t/g,l).replace(/[^\n]/g,r).split("\n"),e.replaceSelections(f)}else e.replaceRange(f,i,o);n.visualMode?(i=Ot(u[0].anchor,u[0].head)?u[0].anchor:u[0].head,e.setCursor(i),$t(e,!1)):e.setCursor(St(o,0,-1))}},incrementNumberToken:function(e,t){var n=e.getCursor(),r=e.getLine(n.line),i=/-?\d+/g,s,o,u,a,f;while((s=i.exec(r))!==null){f=s[0],o=s.index,u=o+f.length;if(n.ch=1)return!0}else e.nextCh===e.reverseSymb&&e.depth--;return!1}},section:{init:function(e){e.curMoveThrough=!0,e.symb=(e.forward?"]":"[")===e.symb?"{":"}"},isComplete:function(e){return e.index===0&&e.nextCh===e.symb}},comment:{isComplete:function(e){var t=e.lastCh==="*"&&e.nextCh==="/";return e.lastCh=e.nextCh,t}},method:{init:function(e){e.symb=e.symb==="m"?"{":"}",e.reverseSymb=e.symb==="{"?"}":"{"},isComplete:function(e){return e.nextCh===e.symb?!0:!1}},preprocess:{init:function(e){e.index=0},isComplete:function(e){if(e.nextCh==="#"){var t=e.lineText.match(/#(\w+)/)[1];if(t==="endif"){if(e.forward&&e.depth===0)return!0;e.depth++}else if(t==="if"){if(!e.forward&&e.depth===0)return!0;e.depth--}if(t==="else"&&e.depth===0)return!0}return!1}}};K("pcre",!0,"boolean"),pn.prototype={getQuery:function(){return nt.query},setQuery:function(e){nt.query=e},getOverlay:function(){return this.searchOverlay},setOverlay:function(e){this.searchOverlay=e},isReversed:function(){return nt.isReversed},setReversed:function(e){nt.isReversed=e},getScrollbarAnnotate:function(){return this.annotate},setScrollbarAnnotate:function(e){this.annotate=e}};var bn={"\\n":"\n","\\r":"\r","\\t":" "},En={"\\/":"/","\\\\":"\\","\\n":"\n","\\r":"\r","\\t":" "},Cn="(Javascript regexp)",Bn=function(){this.buildCommandMap_()};Bn.prototype={processCommand:function(e,t,n){var r=this;e.operation(function(){e.curOp.isVimOp=!0,r._processCommand(e,t,n)})},_processCommand:function(e,t,n){var r=e.state.vim,i=nt.registerController.getRegister(":"),s=i.toString();r.visualMode&&$t(e);var o=new v.StringStream(t);i.setText(t);var u=n||{};u.input=t;try{this.parseInput_(e,o,u)}catch(a){throw Tn(e,a),a}var f,l;if(!u.commandName)u.line!==undefined&&(l="move");else{f=this.matchCommand_(u.commandName);if(f){l=f.name,f.excludeFromCommandHistory&&i.setText(s),this.parseCommandArgs_(o,u,f);if(f.type=="exToKey"){for(var c=0;c0;t--){var n=e.substring(0,t);if(this.commandMap_[n]){var r=this.commandMap_[n];if(r.name.indexOf(e)===0)return r}}return null},buildCommandMap_:function(){this.commandMap_={};for(var e=0;e
";if(!n)for(var s in r){var o=r[s].toString();o.length&&(i+='"'+s+" "+o+"
")}else{var s;n=n.join("");for(var u=0;u"}}Tn(e,i)},sort:function(e,t){function o(){if(t.argString){var e=new v.StringStream(t.argString);e.eat("!")&&(n=!0);if(e.eol())return;if(!e.eatSpace())return"Invalid arguments";var o=e.match(/[a-z]+/);if(o){o=o[0],r=o.indexOf("i")!=-1,i=o.indexOf("u")!=-1;var u=o.indexOf("d")!=-1&&1,a=o.indexOf("x")!=-1&&1,f=o.indexOf("o")!=-1&&1;if(u+a+f>1)return"Invalid arguments";s=u&&"decimal"||a&&"hex"||f&&"octal"}if(e.match(/\/.*\//))return"patterns not supported"}}function b(e,t){if(n){var i;i=e,e=t,t=i}r&&(e=e.toLowerCase(),t=t.toLowerCase());var o=s&&p.exec(e),u=s&&p.exec(t);return o?(o=parseInt((o[1]+o[2]).toLowerCase(),d),u=parseInt((u[1]+u[2]).toLowerCase(),d),o-u):e")}if(!u){Tn(e,c);return}var d=0,v=function(){if(d=f){Tn(e,"Invalid argument: "+t.argString.substring(i));return}for(var l=0;l<=f-a;l++){var c=String.fromCharCode(a+l);delete n.marks[c]}}else delete n.marks[s]}}},Fn=new Bn;v.keyMap.vim={attach:C,detach:N,call:k},K("insertModeEscKeysTimeout",200,"number"),v.keyMap["vim-insert"]={"Ctrl-N":"autocomplete","Ctrl-P":"autocomplete",Enter:function(e){var t=v.commands.newlineAndIndentContinueComment||v.commands.newlineAndIndent;t(e)},fallthrough:["default"],attach:C,detach:N,call:k},v.keyMap["vim-replace"]={Backspace:"goCharLeft",fallthrough:["vim-insert"],attach:C,detach:N,call:k},rt(),v.Vim=S(),S=v.Vim;var tr={"return":"CR",backspace:"BS","delete":"Del",esc:"Esc",left:"Left",right:"Right",up:"Up",down:"Down",space:"Space",home:"Home",end:"End",pageup:"PageUp",pagedown:"PageDown",enter:"CR"},rr=S.handleKey.bind(S);S.handleKey=function(e,t,n){return e.operation(function(){return rr(e,t,n)},!0)},t.CodeMirror=v;var or=S.maybeInitVimState_;t.handler={$id:"ace/keyboard/vim",drawCursor:function(e,t,n,r,s){var o=this.state.vim||{},u=n.characterWidth,a=n.lineHeight,f=t.top,l=t.left;if(!o.insertMode){var c=r.cursor?i.comparePoints(r.cursor,r.start)<=0:s.selection.isBackwards()||s.selection.isEmpty();!c&&l>u&&(l-=u)}!o.insertMode&&o.status&&(a/=2,f+=a),e.left=l+"px",e.top=f+"px",e.width=u+"px",e.height=a+"px"},handleKeyboard:function(e,t,n,r,i){var s=e.editor,o=s.state.cm,u=or(o);if(r==-1)return;if(n=="c"&&t==1){if(!c.isMac&&s.getCopyText())return s.once("copy",function(){s.selection.clearSelection()}),{command:"null",passEvent:!0}}else u.insertMode||c.isMac&&this.handleMacRepeat(e,t,n)&&(t=-1,n=e.inputChar);if(t==-1||t&1||t===0&&n.length>1){var a=u.insertMode,f=nr(t,n,i||{});u.status==null&&(u.status="");var l=sr(o,f,"user");u=or(o),l&&u.status!=null?u.status+=f:u.status==null&&(u.status=""),o._signal("changeStatus");if(!l&&(t!=-1||a))return;return{command:"null",passEvent:!l}}},attach:function(e){e.state||(e.state={});var t=new v(e);e.state.cm=t,e.$vimModeHandler=this,v.keyMap.vim.attach(t),or(t).status=null,t.on("vim-command-done",function(){if(t.virtualSelectionMode())return;or(t).status=null,t.ace._signal("changeStatus"),t.ace.session.markUndoGroup()}),t.on("changeStatus",function(){t.ace.renderer.updateCursor(),t.ace._signal("changeStatus")}),t.on("vim-mode-change",function(){if(t.virtualSelectionMode())return;t.ace.renderer.setStyle("normal-mode",!or(t).insertMode),t._signal("changeStatus")}),t.ace.renderer.setStyle("normal-mode",!or(t).insertMode),e.renderer.$cursorLayer.drawCursor=this.drawCursor.bind(t),this.updateMacCompositionHandlers(e,!0)},detach:function(e){var t=e.state.cm;v.keyMap.vim.detach(t),t.destroy(),e.state.cm=null,e.$vimModeHandler=null,e.renderer.$cursorLayer.drawCursor=null,e.renderer.setStyle("normal-mode",!1),this.updateMacCompositionHandlers(e,!1)},getStatusText:function(e){var t=e.state.cm,n=or(t);if(n.insertMode)return"INSERT";var r="";return n.visualMode&&(r+="VISUAL",n.visualLine&&(r+=" LINE"),n.visualBlock&&(r+=" BLOCK")),n.status&&(r+=(r?" ":"")+n.status),r},handleMacRepeat:function(e,t,n){if(t==-1)e.inputChar=n,e.lastEvent="input";else if(e.inputChar&&e.$lastHash==t&&e.$lastKey==n){if(e.lastEvent=="input")e.lastEvent="input1";else if(e.lastEvent=="input1")return!0}else e.$lastHash=t,e.$lastKey=n,e.lastEvent="keypress"},updateMacCompositionHandlers:function(e,t){var n=function(t){var n=e.state.cm,r=or(n);if(!r.insertMode){var i=this.textInput.getElement();i.blur(),i.focus(),i.value=t}else this.onCompositionUpdateOrig(t)},r=function(t){var n=e.state.cm,r=or(n);r.insertMode||this.onCompositionStartOrig(t)};t?e.onCompositionUpdateOrig||(e.onCompositionUpdateOrig=e.onCompositionUpdate,e.onCompositionUpdate=n,e.onCompositionStartOrig=e.onCompositionStart,e.onCompositionStart=r):e.onCompositionUpdateOrig&&(e.onCompositionUpdate=e.onCompositionUpdateOrig,e.onCompositionUpdateOrig=null,e.onCompositionStart=e.onCompositionStartOrig,e.onCompositionStartOrig=null)}};var ur={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return e.getLength().toString().length*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update)},detach:function(e){e.renderer.$gutterLayer.$renderer=null,e.off("changeSelection",this.update)}};S.defineOption({name:"wrap",set:function(e,t){t&&t.ace.setOption("wrap",e)},type:"boolean"},!1),S.defineEx("write","w",function(){console.log(":write is not implemented")}),b.push({keys:"zc",type:"action",action:"fold",actionArgs:{open:!1}},{keys:"zC",type:"action",action:"fold",actionArgs:{open:!1,all:!0}},{keys:"zo",type:"action",action:"fold",actionArgs:{open:!0}},{keys:"zO",type:"action",action:"fold",actionArgs:{open:!0,all:!0}},{keys:"za",type:"action",action:"fold",actionArgs:{toggle:!0}},{keys:"zA",type:"action",action:"fold",actionArgs:{toggle:!0,all:!0}},{keys:"zf",type:"action",action:"fold",actionArgs:{open:!0,all:!0}},{keys:"zd",type:"action",action:"fold",actionArgs:{open:!0,all:!0}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"addCursorAbove"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"addCursorBelow"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"addCursorAboveSkipCurrent"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"addCursorBelowSkipCurrent"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"selectMoreBefore"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"selectMoreAfter"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"selectNextBefore"}},{keys:"",type:"action",action:"aceCommand",actionArgs:{name:"selectNextAfter"}}),yt.aceCommand=function(e,t,n){e.vimCmd=t,e.ace.inVirtualSelectionMode?e.ace.on("beforeEndOperation",ar):ar(null,e.ace)},yt.fold=function(e,t,n){e.ace.execCommand(["toggleFoldWidget","toggleFoldWidget","foldOther","unfoldall"][(t.all?2:0)+(t.open?1:0)])},t.handler.defaultKeymap=b,t.handler.actions=yt,t.Vim=S,S.map("Y","yy","normal")}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-assembly_x86.js b/public/themes/panel/vendor/ace/mode-assembly_x86.js deleted file mode 100644 index 1ed120aac4..0000000000 --- a/public/themes/panel/vendor/ace/mode-assembly_x86.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/assembly_x86_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"keyword.control.assembly",regex:"\\b(?:aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invplg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswbpaddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vtestps|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(?:n?e|n?z)?|call|j(?:mp|n?e|ge?|ae?|le?|be?|n?o|n?z))\\b",caseInsensitive:!0},{token:"variable.parameter.register.assembly",regex:"\\b(?:CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RCX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R8-15|(?:Y|X)MM(?:[0-9]|10|11|12|13|14|15)|(?:A|B|C|D)(?:X|H|L)|CR(?:[0-4]|DR(?:[0-7]|TR6|TR7|EFER)))\\b",caseInsensitive:!0},{token:"constant.character.decimal.assembly",regex:"\\b[0-9]+\\b"},{token:"constant.character.hexadecimal.assembly",regex:"\\b0x[A-F0-9]+\\b",caseInsensitive:!0},{token:"constant.character.hexadecimal.assembly",regex:"\\b[A-F0-9]+h\\b",caseInsensitive:!0},{token:"string.assembly",regex:/'([^\\']|\\.)*'/},{token:"string.assembly",regex:/"([^\\"]|\\.)*"/},{token:"support.function.directive.assembly",regex:"^\\[",push:[{token:"support.function.directive.assembly",regex:"\\]$",next:"pop"},{defaultToken:"support.function.directive.assembly"}]},{token:["support.function.directive.assembly","support.function.directive.assembly","entity.name.function.assembly"],regex:"(^struc)( )([_a-zA-Z][_a-zA-Z0-9]*)"},{token:"support.function.directive.assembly",regex:"^endstruc\\b"},{token:["support.function.directive.assembly","entity.name.function.assembly","support.function.directive.assembly","constant.character.assembly"],regex:"^(%macro )([_a-zA-Z][_a-zA-Z0-9]*)( )([0-9]+)"},{token:"support.function.directive.assembly",regex:"^%endmacro"},{token:["text","support.function.directive.assembly","text","entity.name.function.assembly"],regex:"(\\s*)(%define|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\\$\\$|\\$|%unmacro|%if|%elif|%else|%endif|%(?:el)?ifdef|%(?:el)?ifmacro|%(?:el)?ifctx|%(?:el)?ifidn|%(?:el)?ifidni|%(?:el)?ifid|%(?:el)?ifnum|%(?:el)?ifstr|%(?:el)?iftoken|%(?:el)?ifempty|%(?:el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\\b( ?)((?:[_a-zA-Z][_a-zA-Z0-9]*)?)",caseInsensitive:!0},{token:"support.function.directive.assembly",regex:"\\b(?:d[bwdqtoy]|res[bwdqto]|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin)\\b",caseInsensitive:!0},{token:"entity.name.function.assembly",regex:"^\\s*%%[\\w.]+?:$"},{token:"entity.name.function.assembly",regex:"^\\s*%\\$[\\w.]+?:$"},{token:"entity.name.function.assembly",regex:"^[\\w.]+?:"},{token:"entity.name.function.assembly",regex:"^[\\w.]+?\\b"},{token:"comment.assembly",regex:";.*$"}]},this.normalizeRules()};s.metaData={fileTypes:["asm"],name:"Assembly x86",scopeName:"source.assembly"},r.inherits(s,i),t.AssemblyX86HighlightRules=s}),define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++nl){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}],singleLineComment:[{token:"comment",regex:/\\$/,next:"singleLineComment"},{token:"comment",regex:/$/,next:"start"},{defaultToken:"comment"}],directive:[{token:"constant.other.multiline",regex:/\\/},{token:"constant.other.multiline",regex:/.*\\/},{token:"constant.other",regex:"\\s*<.+?>",next:"start"},{token:"constant.other",regex:'\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]',next:"start"},{token:"constant.other",regex:"\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']",next:"start"},{token:"constant.other",regex:/[^\\\/]+/,next:"start"}]},this.embedRules(i,"doc-",[i.getEndRule("start")]),this.normalizeRules()};r.inherits(u,s),t.c_cppHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./c_cpp_highlight_rules").c_cppHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var u=t.match(/^.*[\{\(\[]\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/c_cpp"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-coffee.js b/public/themes/panel/vendor/ace/mode-coffee.js deleted file mode 100644 index 82005fd2a5..0000000000 --- a/public/themes/panel/vendor/ace/mode-coffee.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/coffee_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function s(){var e="[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*",t="this|throw|then|try|typeof|super|switch|return|break|by|continue|catch|class|in|instanceof|is|isnt|if|else|extends|for|own|finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|or|on|unless|until|and|yes",n="true|false|null|undefined|NaN|Infinity",r="case|const|default|function|var|void|with|enum|export|implements|interface|let|package|private|protected|public|static|yield",i="Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray",s="Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|encodeURIComponent|decodeURI|decodeURIComponent|String|",o="window|arguments|prototype|document",u=this.createKeywordMapper({keyword:t,"constant.language":n,"invalid.illegal":r,"language.support.class":i,"language.support.function":s,"variable.language":o},"identifier"),a={token:["paren.lparen","variable.parameter","paren.rparen","text","storage.type"],regex:/(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()"'\/])*?)(\))(\s*))?([\-=]>)/.source},f=/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;this.$rules={start:[{token:"constant.numeric",regex:"(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)"},{stateName:"qdoc",token:"string",regex:"'''",next:[{token:"string",regex:"'''",next:"start"},{token:"constant.language.escape",regex:f},{defaultToken:"string"}]},{stateName:"qqdoc",token:"string",regex:'"""',next:[{token:"string",regex:'"""',next:"start"},{token:"paren.string",regex:"#{",push:"start"},{token:"constant.language.escape",regex:f},{defaultToken:"string"}]},{stateName:"qstring",token:"string",regex:"'",next:[{token:"string",regex:"'",next:"start"},{token:"constant.language.escape",regex:f},{defaultToken:"string"}]},{stateName:"qqstring",token:"string.start",regex:'"',next:[{token:"string.end",regex:'"',next:"start"},{token:"paren.string",regex:"#{",push:"start"},{token:"constant.language.escape",regex:f},{defaultToken:"string"}]},{stateName:"js",token:"string",regex:"`",next:[{token:"string",regex:"`",next:"start"},{token:"constant.language.escape",regex:f},{defaultToken:"string"}]},{regex:"[{}]",onMatch:function(e,t,n){this.next="";if(e=="{"&&n.length)return n.unshift("start",t),"paren";if(e=="}"&&n.length){n.shift(),this.next=n.shift()||"";if(this.next.indexOf("string")!=-1)return"paren.string"}return"paren"}},{token:"string.regex",regex:"///",next:"heregex"},{token:"string.regex",regex:/(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/},{token:"comment",regex:"###(?!#)",next:"comment"},{token:"comment",regex:"#.*"},{token:["punctuation.operator","text","identifier"],regex:"(\\.)(\\s*)("+r+")"},{token:"punctuation.operator",regex:"\\.{1,3}"},{token:["keyword","text","language.support.class","text","keyword","text","language.support.class"],regex:"(class)(\\s+)("+e+")(?:(\\s+)(extends)(\\s+)("+e+"))?"},{token:["entity.name.function","text","keyword.operator","text"].concat(a.token),regex:"("+e+")(\\s*)([=:])(\\s*)"+a.regex},a,{token:"variable",regex:"@(?:"+e+")?"},{token:u,regex:e},{token:"punctuation.operator",regex:"\\,|\\."},{token:"storage.type",regex:"[\\-=]>"},{token:"keyword.operator",regex:"(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])"},{token:"paren.lparen",regex:"[({[]"},{token:"paren.rparen",regex:"[\\]})]"},{token:"text",regex:"\\s+"}],heregex:[{token:"string.regex",regex:".*?///[imgy]{0,4}",next:"start"},{token:"comment.regex",regex:"\\s+(?:#.*)?"},{token:"string.regex",regex:"\\S+"}],comment:[{token:"comment",regex:"###",next:"start"},{defaultToken:"comment"}]},this.normalizeRules()}var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules;r.inherits(s,i),t.CoffeeHighlightRules=s}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++nl){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u|\b(?:else|try|(?:swi|ca)tch(?:\s+[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$|^\s*(else\b\s*)?(?:if|for|while|loop)\b(?!.*\bthen\b)/;this.lineCommentStart="#",this.blockComment={start:"###",end:"###"},this.getNextLineIndent=function(t,n,r){var i=this.$getIndent(n),s=this.getTokenizer().getLineTokens(n,t).tokens;return(!s.length||s[s.length-1].type!=="comment")&&t==="start"&&e.test(n)&&(i+=r),i},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a(["ace"],"ace/mode/coffee_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/coffee"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-csharp.js b/public/themes/panel/vendor/ace/mode-csharp.js deleted file mode 100644 index 040bca7033..0000000000 --- a/public/themes/panel/vendor/ace/mode-csharp.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/csharp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o=function(){var e=this.createKeywordMapper({"variable.language":"this",keyword:"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic","constant.language":"null|true|false"},"identifier");this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string",regex:/'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/},{token:"string",start:'"',end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"string",start:'@"',end:'"',next:[{token:"constant.language.escape",regex:'""'}]},{token:"string",start:/\$"/,end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?$)|{{/},{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:e,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"keyword",regex:"^\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}]},this.embedRules(i,"doc-",[i.getEndRule("start")]),this.normalizeRules()};r.inherits(o,s),t.CSharpHighlightRules=o}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/folding/csharp",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./cstyle").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.usingRe=/^\s*using \S/,this.getFoldWidgetRangeBase=this.getFoldWidgetRange,this.getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=this.getFoldWidgetBase(e,t,n);if(!r){var i=e.getLine(n);if(/^\s*#region\b/.test(i))return"start";var s=this.usingRe;if(s.test(i)){var o=e.getLine(n-1),u=e.getLine(n+1);if(!s.test(o)&&s.test(u))return"start"}}return r},this.getFoldWidgetRange=function(e,t,n){var r=this.getFoldWidgetRangeBase(e,t,n);if(r)return r;var i=e.getLine(n);if(this.usingRe.test(i))return this.getUsingStatementBlock(e,i,n);if(/^\s*#region\b/.test(i))return this.getRegionBlock(e,i,n)},this.getUsingStatementBlock=function(e,t,n){var r=t.match(this.usingRe)[0].length-1,s=e.getLength(),o=n,u=n;while(++no){var a=e.getLine(u).length;return new i(o,r,u,a)}},this.getRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*#(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/csharp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/csharp_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/csharp"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./csharp_highlight_rules").CSharpHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./behaviour/cstyle").CstyleBehaviour,a=e("./folding/csharp").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(f,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var o=t.match(/^.*[\{\(\[]\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){return null},this.$id="ace/mode/csharp"}.call(f.prototype),t.Mode=f}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-css.js b/public/themes/panel/vendor/ace/mode-css.js deleted file mode 100644 index b41ecdc82b..0000000000 --- a/public/themes/panel/vendor/ace/mode-css.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-golang.js b/public/themes/panel/vendor/ace/mode-golang.js deleted file mode 100644 index 0bec98ab8f..0000000000 --- a/public/themes/panel/vendor/ace/mode-golang.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/golang_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o=function(){var e="else|break|case|return|goto|if|const|select|continue|struct|default|switch|for|range|func|import|package|chan|defer|fallthrough|go|interface|map|range|select|type|var",t="string|uint8|uint16|uint32|uint64|int8|int16|int32|int64|float32|float64|complex64|complex128|byte|rune|uint|int|uintptr|bool|error",n="new|close|cap|copy|panic|panicln|print|println|len|make|delete|real|recover|imag|append",r="nil|true|false|iota",s=this.createKeywordMapper({keyword:e,"constant.language":r,"support.function":n,"support.type":t},""),o="\\\\(?:[0-7]{3}|x\\h{2}|u{4}|U\\h{6}|[abfnrtv'\"\\\\])".replace(/\\h/g,"[a-fA-F\\d]");this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment.start",regex:"\\/\\*",next:"comment"},{token:"string",regex:/"(?:[^"\\]|\\.)*?"/},{token:"string",regex:"`",next:"bqstring"},{token:"constant.numeric",regex:"'(?:[^\\'\ud800-\udbff]|[\ud800-\udbff][\udc00-\udfff]|"+o.replace('"',"")+")'"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:["keyword","text","entity.name.function"],regex:"(func)(\\s+)([a-zA-Z_$][a-zA-Z0-9_$]*)\\b"},{token:function(e){return e[e.length-1]=="("?[{type:s(e.slice(0,-1))||"support.function",value:e.slice(0,-1)},{type:"paren.lparen",value:e.slice(-1)}]:s(e)||"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b\\(?"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^="},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment.end",regex:"\\*\\/",next:"start"},{defaultToken:"comment"}],bqstring:[{token:"string",regex:"`",next:"start"},{defaultToken:"string"}]},this.embedRules(i,"doc-",[i.getEndRule("start")])};r.inherits(o,s),t.GolangHighlightRules=o}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/golang",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/golang_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){var r=e("../lib/oop"),i=e("./text").Mode,s=e("./golang_highlight_rules").GolangHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./behaviour/cstyle").CstyleBehaviour,a=e("./folding/cstyle").FoldMode,f=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new a,this.$behaviour=new u};r.inherits(f,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var u=t.match(/^.*[\{\(\[]\s*$/);u&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/golang"}.call(f.prototype),t.Mode=f}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-haml.js b/public/themes/panel/vendor/ace/mode-haml.js deleted file mode 100644 index 23eee53dfc..0000000000 --- a/public/themes/panel/vendor/ace/mode-haml.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=t.constantOtherSymbol={token:"constant.other.symbol.ruby",regex:"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"},o=t.qString={token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},u=t.qqString={token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},a=t.tString={token:"string",regex:"[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"},f=t.constantNumericHex={token:"constant.numeric",regex:"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"},l=t.constantNumericFloat={token:"constant.numeric",regex:"[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b"},c=function(){var e="abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many",t="alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield",n="true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING",r="$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self",i=this.$keywords=this.createKeywordMapper({keyword:t,"constant.language":n,"variable.language":r,"support.function":e,"invalid.deprecated":"debugger"},"identifier");this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"comment",regex:"^=begin(?:$|\\s.*$)",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},[{regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)return n.unshift("start",t),"paren.lparen";if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1)return"paren.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.start",regex:/"/,push:[{token:"constant.language.escape",regex:/\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/"/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/`/,push:[{token:"constant.language.escape",regex:/\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/`/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/'/,push:[{token:"constant.language.escape",regex:/\\['\\]/},{token:"string.end",regex:/'/,next:"pop"},{defaultToken:"string"}]}],{token:"text",regex:"::"},{token:"variable.instance",regex:"@{1,2}[a-zA-Z_\\d]+"},{token:"support.class",regex:"[A-Z][a-zA-Z_\\d]+"},s,f,l,{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:i,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"punctuation.separator.key-value",regex:"=>"},{stateName:"heredoc",onMatch:function(e,t,n){var r=e[2]=="-"?"indentedHeredoc":"heredoc",i=e.split(this.splitRegex);return n.push(r,i[3]),[{type:"constant",value:i[1]},{type:"string",value:i[2]},{type:"support.class",value:i[3]},{type:"string",value:i[4]}]},regex:"(<<-?)(['\"`]?)([\\w]+)(['\"`]?)",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}],indentedHeredoc:[{token:"string",regex:"^ +"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}]}},{regex:"$",token:"empty",next:function(e,t){return t[0]==="heredoc"||t[0]==="indentedHeredoc"?t[0]:e}},{token:"string.character",regex:"\\B\\?."},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:"^=end(?:$|\\s.*$)",next:"start"},{token:"comment",regex:".+"}]},this.normalizeRules()};r.inherits(c,i),t.RubyHighlightRules=c}),define("ace/mode/haml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/ruby_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html_highlight_rules").HtmlHighlightRules,s=e("./ruby_highlight_rules"),o=s.RubyHighlightRules,u=function(){i.call(this),this.$rules.start.unshift({token:"punctuation.section.comment",regex:/^\s*\/.*/},{token:"string.quoted.double",regex:"==.+?=="},{token:"keyword.other.doctype",regex:"^!!!\\s*(?:[a-zA-Z0-9-_]+)?"},s.qString,s.qqString,s.tString,{token:"character.escape.haml",regex:"^\\s*\\\\."},{token:"text",regex:/^\s*/,next:"tag_single"},s.constantNumericHex,s.constantNumericFloat,s.constantOtherSymbol,{token:"text",regex:"=|-|~",next:"embedded_ruby"}),this.$rules.tag_single=[{token:"meta.tag.haml",regex:/(%[\w:\-]+)/},{token:"keyword.attribute-name.class.haml",regex:"\\.[\\w-]+"},{token:"keyword.attribute-name.id.haml",regex:"#[\\w-]+"},{token:"punctuation.section",regex:"\\{",next:"section"},s.constantOtherSymbol,{token:"text",regex:/\s/,next:"start"},{token:"empty",regex:"$|(?!\\.|#|\\{|\\[|=|-|~|\\/)",next:"start"}],this.$rules.section=[s.constantOtherSymbol,s.qString,s.qqString,s.tString,s.constantNumericHex,s.constantNumericFloat,{token:"punctuation.section",regex:"\\}",next:"start"}],this.$rules.embedded_ruby=[s.constantNumericHex,s.constantNumericFloat,{token:"support.class",regex:"[A-Z][a-zA-Z_\\d]+"},{token:(new o).getKeywords(),regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:["keyword","text","text"],regex:"(?:do|\\{)(?: \\|[^|]+\\|)?$",next:"start"},{token:["text"],regex:"^$",next:"start"},{token:["text"],regex:"^(?!.*\\|\\s*$)",next:"start"}],this.normalizeRules()};r.inherits(u,i),t.HamlHighlightRules=u}),define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++nl){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-ini.js b/public/themes/panel/vendor/ace/mode-ini.js deleted file mode 100644 index 3826b3cd06..0000000000 --- a/public/themes/panel/vendor/ace/mode-ini.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/ini_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s="\\\\(?:[\\\\0abtrn;#=:]|x[a-fA-F\\d]{4})",o=function(){this.$rules={start:[{token:"punctuation.definition.comment.ini",regex:"#.*",push_:[{token:"comment.line.number-sign.ini",regex:"$|^",next:"pop"},{defaultToken:"comment.line.number-sign.ini"}]},{token:"punctuation.definition.comment.ini",regex:";.*",push_:[{token:"comment.line.semicolon.ini",regex:"$|^",next:"pop"},{defaultToken:"comment.line.semicolon.ini"}]},{token:["keyword.other.definition.ini","text","punctuation.separator.key-value.ini"],regex:"\\b([a-zA-Z0-9_.-]+)\\b(\\s*)(=)"},{token:["punctuation.definition.entity.ini","constant.section.group-title.ini","punctuation.definition.entity.ini"],regex:"^(\\[)(.*?)(\\])"},{token:"punctuation.definition.string.begin.ini",regex:"'",push:[{token:"punctuation.definition.string.end.ini",regex:"'",next:"pop"},{token:"constant.language.escape",regex:s},{defaultToken:"string.quoted.single.ini"}]},{token:"punctuation.definition.string.begin.ini",regex:'"',push:[{token:"constant.language.escape",regex:s},{token:"punctuation.definition.string.end.ini",regex:'"',next:"pop"},{defaultToken:"string.quoted.double.ini"}]}]},this.normalizeRules()};o.metaData={fileTypes:["ini","conf"],keyEquivalent:"^~I",name:"Ini",scopeName:"source.ini"},r.inherits(o,i),t.IniHighlightRules=o}),define("ace/mode/folding/ini",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(){};r.inherits(o,s),function(){this.foldingStartMarker=/^\s*\[([^\])]*)]\s*(?:$|[;#])/,this.getFoldWidgetRange=function(e,t,n){var r=this.foldingStartMarker,s=e.getLine(n),o=s.match(r);if(!o)return;var u=o[1]+".",a=s.length,f=e.getLength(),l=n,c=n;while(++nl){var h=e.getLine(c).length;return new i(l,a,c,h)}}}.call(o.prototype)}),define("ace/mode/ini",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ini_highlight_rules","ace/mode/folding/ini"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./ini_highlight_rules").IniHighlightRules,o=e("./folding/ini").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart=";",this.blockComment=null,this.$id="ace/mode/ini"}.call(u.prototype),t.Mode=u}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-java.js b/public/themes/panel/vendor/ace/mode-java.js deleted file mode 100644 index cdddb9bb6e..0000000000 --- a/public/themes/panel/vendor/ace/mode-java.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/java_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o=function(){var e="abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while",t="null|Infinity|NaN|undefined",n="AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object",r=this.createKeywordMapper({"variable.language":"this",keyword:e,"constant.language":t,"support.function":n},"identifier");this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}]},this.embedRules(i,"doc-",[i.getEndRule("start")])};r.inherits(o,s),t.JavaHighlightRules=o}),define("ace/mode/java",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/java_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./javascript").Mode,s=e("./java_highlight_rules").JavaHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.createWorker=function(e){return null},this.$id="ace/mode/java"}.call(o.prototype),t.Mode=o}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-javascript.js b/public/themes/panel/vendor/ace/mode-javascript.js deleted file mode 100644 index 08939125f8..0000000000 --- a/public/themes/panel/vendor/ace/mode-javascript.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-json.js b/public/themes/panel/vendor/ace/mode-json.js deleted file mode 100644 index c919855a6c..0000000000 --- a/public/themes/panel/vendor/ace/mode-json.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'[^"\\\\]+'},{token:"string",regex:'"',next:"start"},{token:"string",regex:"",next:"start"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./json_highlight_rules").JsonHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./behaviour/cstyle").CstyleBehaviour,a=e("./folding/cstyle").FoldMode,f=e("../worker/worker_client").WorkerClient,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new u,this.foldingRules=new a};r.inherits(l,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new f(["ace"],"ace/mode/json_worker","JsonWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/json"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-kotlin.js b/public/themes/panel/vendor/ace/mode-kotlin.js deleted file mode 100644 index 462cc3444b..0000000000 --- a/public/themes/panel/vendor/ace/mode-kotlin.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/kotlin_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{include:"#comments"},{token:["text","keyword.other.kotlin","text","entity.name.package.kotlin","text"],regex:/^(\s*)(package)\b(?:(\s*)([^ ;$]+)(\s*))?/},{include:"#imports"},{include:"#statements"}],"#classes":[{token:"text",regex:/(?=\s*(?:companion|class|object|interface))/,push:[{token:"text",regex:/}|(?=$)/,next:"pop"},{token:["keyword.other.kotlin","text"],regex:/\b((?:companion\s*)?)(class|object|interface)\b/,push:[{token:"text",regex:/(?=<|{|\(|:)/,next:"pop"},{token:"keyword.other.kotlin",regex:/\bobject\b/},{token:"entity.name.type.class.kotlin",regex:/\w+/}]},{token:"text",regex://,next:"pop"},{include:"#generics"}]},{token:"text",regex:/\(/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#parameters"}]},{token:"keyword.operator.declaration.kotlin",regex:/:/,push:[{token:"text",regex:/(?={|$)/,next:"pop"},{token:"entity.other.inherited-class.kotlin",regex:/\w+/},{token:"text",regex:/\(/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#expressions"}]}]},{token:"text",regex:/\{/,push:[{token:"text",regex:/\}/,next:"pop"},{include:"#statements"}]}]}],"#comments":[{token:"punctuation.definition.comment.kotlin",regex:/\/\*/,push:[{token:"punctuation.definition.comment.kotlin",regex:/\*\//,next:"pop"},{defaultToken:"comment.block.kotlin"}]},{token:["text","punctuation.definition.comment.kotlin","comment.line.double-slash.kotlin"],regex:/(\s*)(\/\/)(.*$)/}],"#constants":[{token:"constant.language.kotlin",regex:/\b(?:true|false|null|this|super)\b/},{token:"constant.numeric.kotlin",regex:/\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\.?[0-9]*|\.[0-9]+)(?:(?:e|E)(?:\+|-)?[0-9]+)?)(?:[LlFfUuDd]|UL|ul)?\b/},{token:"constant.other.kotlin",regex:/\b[A-Z][A-Z0-9_]+\b/}],"#expressions":[{token:"text",regex:/\(/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#expressions"}]},{include:"#types"},{include:"#strings"},{include:"#constants"},{include:"#comments"},{include:"#keywords"}],"#functions":[{token:"text",regex:/(?=\s*fun)/,push:[{token:"text",regex:/}|(?=$)/,next:"pop"},{token:"keyword.other.kotlin",regex:/\bfun\b/,push:[{token:"text",regex:/(?=\()/,next:"pop"},{token:"text",regex://,next:"pop"},{include:"#generics"}]},{token:["text","entity.name.function.kotlin"],regex:/((?:[\.<\?>\w]+\.)?)(\w+)/}]},{token:"text",regex:/\(/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#parameters"}]},{token:"keyword.operator.declaration.kotlin",regex:/:/,push:[{token:"text",regex:/(?={|=|$)/,next:"pop"},{include:"#types"}]},{token:"text",regex:/\{/,push:[{token:"text",regex:/(?=\})/,next:"pop"},{include:"#statements"}]},{token:"keyword.operator.assignment.kotlin",regex:/=/,push:[{token:"text",regex:/(?=$)/,next:"pop"},{include:"#expressions"}]}]}],"#generics":[{token:"keyword.operator.declaration.kotlin",regex:/:/,push:[{token:"text",regex:/(?=,|>)/,next:"pop"},{include:"#types"}]},{include:"#keywords"},{token:"storage.type.generic.kotlin",regex:/\w+/}],"#getters-and-setters":[{token:["entity.name.function.kotlin","text"],regex:/\b(get)\b(\s*\(\s*\))/,push:[{token:"text",regex:/\}|(?=\bset\b)|$/,next:"pop"},{token:"keyword.operator.assignment.kotlin",regex:/=/,push:[{token:"text",regex:/(?=$|\bset\b)/,next:"pop"},{include:"#expressions"}]},{token:"text",regex:/\{/,push:[{token:"text",regex:/\}/,next:"pop"},{include:"#expressions"}]}]},{token:["entity.name.function.kotlin","text"],regex:/\b(set)\b(\s*)(?=\()/,push:[{token:"text",regex:/\}|(?=\bget\b)|$/,next:"pop"},{token:"text",regex:/\(/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#parameters"}]},{token:"keyword.operator.assignment.kotlin",regex:/=/,push:[{token:"text",regex:/(?=$|\bset\b)/,next:"pop"},{include:"#expressions"}]},{token:"text",regex:/\{/,push:[{token:"text",regex:/\}/,next:"pop"},{include:"#expressions"}]}]}],"#imports":[{token:["text","keyword.other.kotlin","text","keyword.other.kotlin"],regex:/^(\s*)(import)(\s+[^ $]+\s+)((?:as)?)/}],"#keywords":[{token:"storage.modifier.kotlin",regex:/\b(?:var|val|public|private|protected|abstract|final|enum|open|attribute|annotation|override|inline|var|val|vararg|lazy|in|out|internal|data|tailrec|operator|infix|const|yield|typealias|typeof)\b/},{token:"keyword.control.catch-exception.kotlin",regex:/\b(?:try|catch|finally|throw)\b/},{token:"keyword.control.kotlin",regex:/\b(?:if|else|while|for|do|return|when|where|break|continue)\b/},{token:"keyword.operator.kotlin",regex:/\b(?:in|is|as|assert)\b/},{token:"keyword.operator.comparison.kotlin",regex:/==|!=|===|!==|<=|>=|<|>/},{token:"keyword.operator.assignment.kotlin",regex:/=/},{token:"keyword.operator.declaration.kotlin",regex:/:/},{token:"keyword.operator.dot.kotlin",regex:/\./},{token:"keyword.operator.increment-decrement.kotlin",regex:/\-\-|\+\+/},{token:"keyword.operator.arithmetic.kotlin",regex:/\-|\+|\*|\/|%/},{token:"keyword.operator.arithmetic.assign.kotlin",regex:/\+=|\-=|\*=|\/=/},{token:"keyword.operator.logical.kotlin",regex:/!|&&|\|\|/},{token:"keyword.operator.range.kotlin",regex:/\.\./},{token:"punctuation.terminator.kotlin",regex:/;/}],"#namespaces":[{token:"keyword.other.kotlin",regex:/\bnamespace\b/},{token:"text",regex:/\{/,push:[{token:"text",regex:/\}/,next:"pop"},{include:"#statements"}]}],"#parameters":[{token:"keyword.operator.declaration.kotlin",regex:/:/,push:[{token:"text",regex:/(?=,|\)|=)/,next:"pop"},{include:"#types"}]},{token:"keyword.operator.declaration.kotlin",regex:/=/,push:[{token:"text",regex:/(?=,|\))/,next:"pop"},{include:"#expressions"}]},{include:"#keywords"},{token:"variable.parameter.function.kotlin",regex:/\w+/}],"#statements":[{include:"#namespaces"},{include:"#typedefs"},{include:"#classes"},{include:"#functions"},{include:"#variables"},{include:"#getters-and-setters"},{include:"#expressions"}],"#strings":[{token:"punctuation.definition.string.begin.kotlin",regex:/"""/,push:[{token:"punctuation.definition.string.end.kotlin",regex:/"""/,next:"pop"},{token:"variable.parameter.template.kotlin",regex:/\$\w+|\$\{[^\}]+\}/},{token:"constant.character.escape.kotlin",regex:/\\./},{defaultToken:"string.quoted.third.kotlin"}]},{token:"punctuation.definition.string.begin.kotlin",regex:/"/,push:[{token:"punctuation.definition.string.end.kotlin",regex:/"/,next:"pop"},{token:"variable.parameter.template.kotlin",regex:/\$\w+|\$\{[^\}]+\}/},{token:"constant.character.escape.kotlin",regex:/\\./},{defaultToken:"string.quoted.double.kotlin"}]},{token:"punctuation.definition.string.begin.kotlin",regex:/'/,push:[{token:"punctuation.definition.string.end.kotlin",regex:/'/,next:"pop"},{token:"constant.character.escape.kotlin",regex:/\\./},{defaultToken:"string.quoted.single.kotlin"}]},{token:"punctuation.definition.string.begin.kotlin",regex:/`/,push:[{token:"punctuation.definition.string.end.kotlin",regex:/`/,next:"pop"},{defaultToken:"string.quoted.single.kotlin"}]}],"#typedefs":[{token:"text",regex:/(?=\s*type)/,push:[{token:"text",regex:/(?=$)/,next:"pop"},{token:"keyword.other.kotlin",regex:/\btype\b/},{token:"text",regex://,next:"pop"},{include:"#generics"}]},{include:"#expressions"}]}],"#types":[{token:"storage.type.buildin.kotlin",regex:/\b(?:Any|Unit|String|Int|Boolean|Char|Long|Double|Float|Short|Byte|dynamic)\b/},{token:"storage.type.buildin.array.kotlin",regex:/\b(?:IntArray|BooleanArray|CharArray|LongArray|DoubleArray|FloatArray|ShortArray|ByteArray)\b/},{token:["storage.type.buildin.collection.kotlin","text"],regex:/\b(Array|List|Map)(<\b)/,push:[{token:"text",regex:/>/,next:"pop"},{include:"#types"},{include:"#keywords"}]},{token:"text",regex:/\w+/,next:"pop"},{include:"#types"},{include:"#keywords"}]},{token:["keyword.operator.tuple.kotlin","text"],regex:/(#)(\()/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#expressions"}]},{token:"text",regex:/\{/,push:[{token:"text",regex:/\}/,next:"pop"},{include:"#statements"}]},{token:"text",regex:/\(/,push:[{token:"text",regex:/\)/,next:"pop"},{include:"#types"}]},{token:"keyword.operator.declaration.kotlin",regex:/->/}],"#variables":[{token:"text",regex:/(?=\s*(?:var|val))/,push:[{token:"text",regex:/(?=:|=|$)/,next:"pop"},{token:"keyword.other.kotlin",regex:/\b(?:var|val)\b/,push:[{token:"text",regex:/(?=:|=|$)/,next:"pop"},{token:"text",regex://,next:"pop"},{include:"#generics"}]},{token:["text","entity.name.variable.kotlin"],regex:/((?:[\.<\?>\w]+\.)?)(\w+)/}]},{token:"keyword.operator.declaration.kotlin",regex:/:/,push:[{token:"text",regex:/(?==|$)/,next:"pop"},{include:"#types"},{include:"#getters-and-setters"}]},{token:"keyword.operator.assignment.kotlin",regex:/=/,push:[{token:"text",regex:/(?=$)/,next:"pop"},{include:"#expressions"},{include:"#getters-and-setters"}]}]}]},this.normalizeRules()};s.metaData={fileTypes:["kt","kts"],name:"Kotlin",scopeName:"source.Kotlin"},r.inherits(s,i),t.KotlinHighlightRules=s}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/kotlin",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/kotlin_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./kotlin_highlight_rules").KotlinHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o};r.inherits(u,i),function(){this.$id="ace/mode/kotlin"}.call(u.prototype),t.Mode=u}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-lua.js b/public/themes/panel/vendor/ace/mode-lua.js deleted file mode 100644 index bd473efc89..0000000000 --- a/public/themes/panel/vendor/ace/mode-lua.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/lua_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="break|do|else|elseif|end|for|function|if|in|local|repeat|return|then|until|while|or|and|not",t="true|false|nil|_G|_VERSION",n="string|xpcall|package|tostring|print|os|unpack|require|getfenv|setmetatable|next|assert|tonumber|io|rawequal|collectgarbage|getmetatable|module|rawset|math|debug|pcall|table|newproxy|type|coroutine|_G|select|gcinfo|pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|load|error|loadfile|sub|upper|len|gfind|rep|find|match|char|dump|gmatch|reverse|byte|format|gsub|lower|preload|loadlib|loaded|loaders|cpath|config|path|seeall|exit|setlocale|date|getenv|difftime|remove|time|clock|tmpname|rename|execute|lines|write|close|flush|open|output|type|read|stderr|stdin|input|stdout|popen|tmpfile|log|max|acos|huge|ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|gethook|setmetatable|setlocal|traceback|setfenv|getinfo|setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|foreachi|maxn|foreach|concat|sort|remove|resume|yield|status|wrap|create|running|__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber",r="string|package|os|io|math|debug|table|coroutine",i="setn|foreach|foreachi|gcinfo|log10|maxn",s=this.createKeywordMapper({keyword:e,"support.function":n,"keyword.deprecated":i,"constant.library":r,"constant.language":t,"variable.language":"self"},"identifier"),o="(?:(?:[1-9]\\d*)|(?:0))",u="(?:0[xX][\\dA-Fa-f]+)",a="(?:"+o+"|"+u+")",f="(?:\\.\\d+)",l="(?:\\d+)",c="(?:(?:"+l+"?"+f+")|(?:"+l+"\\.))",h="(?:"+c+")";this.$rules={start:[{stateName:"bracketedComment",onMatch:function(e,t,n){return n.unshift(this.next,e.length-2,t),"comment"},regex:/\-\-\[=*\[/,next:[{onMatch:function(e,t,n){return e.length==n[1]?(n.shift(),n.shift(),this.next=n.shift()):this.next="","comment"},regex:/\]=*\]/,next:"start"},{defaultToken:"comment"}]},{token:"comment",regex:"\\-\\-.*$"},{stateName:"bracketedString",onMatch:function(e,t,n){return n.unshift(this.next,e.length,t),"comment"},regex:/\[=*\[/,next:[{onMatch:function(e,t,n){return e.length==n[1]?(n.shift(),n.shift(),this.next=n.shift()):this.next="","comment"},regex:/\]=*\]/,next:"start"},{defaultToken:"comment"}]},{token:"string",regex:'"(?:[^\\\\]|\\\\.)*?"'},{token:"string",regex:"'(?:[^\\\\]|\\\\.)*?'"},{token:"constant.numeric",regex:h},{token:"constant.numeric",regex:a+"\\b"},{token:s,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\/|%|\\#|\\^|~|<|>|<=|=>|==|~=|=|\\:|\\.\\.\\.|\\.\\."},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+|\\w+"}]},this.normalizeRules()};r.inherits(s,i),t.LuaHighlightRules=s}),define("ace/mode/folding/lua",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=e("../../token_iterator").TokenIterator,u=t.FoldMode=function(){};r.inherits(u,i),function(){this.foldingStartMarker=/\b(function|then|do|repeat)\b|{\s*$|(\[=*\[)/,this.foldingStopMarker=/\bend\b|^\s*}|\]=*\]/,this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=this.foldingStartMarker.test(r),s=this.foldingStopMarker.test(r);if(i&&!s){var o=r.match(this.foldingStartMarker);if(o[1]=="then"&&/\belseif\b/.test(r))return;if(o[1]){if(e.getTokenAt(n,o.index+1).type==="keyword")return"start"}else{if(!o[2])return"start";var u=e.bgTokenizer.getState(n)||"";if(u[0]=="bracketedComment"||u[0]=="bracketedString")return"start"}}if(t!="markbeginend"||!s||i&&s)return"";var o=r.match(this.foldingStopMarker);if(o[0]==="end"){if(e.getTokenAt(n,o.index+1).type==="keyword")return"end"}else{if(o[0][0]!=="]")return"end";var u=e.bgTokenizer.getState(n-1)||"";if(u[0]=="bracketedComment"||u[0]=="bracketedString")return"end"}},this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getLine(n),i=this.foldingStartMarker.exec(r);if(i)return i[1]?this.luaBlock(e,n,i.index+1):i[2]?e.getCommentFoldRange(n,i.index+1):this.openingBracketBlock(e,"{",n,i.index);var i=this.foldingStopMarker.exec(r);if(i)return i[0]==="end"&&e.getTokenAt(n,i.index+1).type==="keyword"?this.luaBlock(e,n,i.index+1):i[0][0]==="]"?e.getCommentFoldRange(n,i.index+1):this.closingBracketBlock(e,"}",n,i.index+i[0].length)},this.luaBlock=function(e,t,n){var r=new o(e,t,n),i={"function":1,"do":1,then:1,elseif:-1,end:-1,repeat:1,until:-1},u=r.getCurrentToken();if(!u||u.type!="keyword")return;var a=u.value,f=[a],l=i[a];if(!l)return;var c=l===-1?r.getCurrentTokenColumn():e.getLine(t).length,h=t;r.step=l===-1?r.stepBackward:r.stepForward;while(u=r.step()){if(u.type!=="keyword")continue;var p=l*i[u.value];if(p>0)f.unshift(u.value);else if(p<=0){f.shift();if(!f.length&&u.value!="elseif")break;p===0&&f.unshift(u.value)}}var t=r.getCurrentTokenRow();return l===-1?new s(t,e.getLine(t).length,h,c):new s(h,c,t,r.getCurrentTokenColumn())}}.call(u.prototype)}),define("ace/mode/lua",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lua_highlight_rules","ace/mode/folding/lua","ace/range","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./lua_highlight_rules").LuaHighlightRules,o=e("./folding/lua").FoldMode,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(f,i),function(){function n(t){var n=0;for(var r=0;r0?1:0}this.lineCommentStart="--",this.blockComment={start:"--[",end:"]--"};var e={"function":1,then:1,"do":1,"else":1,elseif:1,repeat:1,end:-1,until:-1},t=["else","elseif","end","until"];this.getNextLineIndent=function(e,t,r){var i=this.$getIndent(t),s=0,o=this.getTokenizer().getLineTokens(t,e),u=o.tokens;return e=="start"&&(s=n(u)),s>0?i+r:s<0&&i.substr(i.length-r.length)==r&&!this.checkOutdent(e,t,"\n")?i.substr(0,i.length-r.length):i},this.checkOutdent=function(e,n,r){if(r!="\n"&&r!="\r"&&r!="\r\n")return!1;if(n.match(/^\s*[\)\}\]]$/))return!0;var i=this.getTokenizer().getLineTokens(n.trim(),e).tokens;return!i||!i.length?!1:i[0].type=="keyword"&&t.indexOf(i[0].value)!=-1},this.autoOutdent=function(e,t,r){var i=t.getLine(r-1),s=this.$getIndent(i).length,o=this.getTokenizer().getLineTokens(i,"start").tokens,a=t.getTabString().length,f=s+a*n(o),l=this.$getIndent(t.getLine(r)).length;if(l",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column"},this.createWorker=function(e){var t=new f(["ace"],"ace/mode/xml_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/xml"}.call(l.prototype),t.Mode=l}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=t.FoldMode=function(e,t){this.defaultMode=e,this.subModes=t};r.inherits(s,i),function(){this.$getMode=function(e){typeof e!="string"&&(e=e[0]);for(var t in this.subModes)if(e.indexOf(t)===0)return this.subModes[t];return null},this.$tryMode=function(e,t,n,r){var i=this.$getMode(e);return i?i.getFoldWidget(t,n,r):""},this.getFoldWidget=function(e,t,n){return this.$tryMode(e.getState(n-1),e,t,n)||this.$tryMode(e.getState(n),e,t,n)||this.defaultMode.getFoldWidget(e,t,n)},this.getFoldWidgetRange=function(e,t,n){var r=this.$getMode(e.getState(n-1));if(!r||!r.getFoldWidget(e,t,n))r=this.$getMode(e.getState(n));if(!r||!r.getFoldWidget(e,t,n))r=this.defaultMode;return r.getFoldWidgetRange(e,t,n)}}.call(s.prototype)}),define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./mixed").FoldMode,s=e("./xml").FoldMode,o=e("./cstyle").FoldMode,u=t.FoldMode=function(e,t){i.call(this,new s(e,t),{"js-":new o,"css-":new o})};r.inherits(u,i)}),define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"],function(e,t,n){"use strict";function f(e,t){return e.type.lastIndexOf(t+".xml")>-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),define("ace/mode/markdown_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules","ace/mode/html_highlight_rules","ace/mode/css_highlight_rules"],function(e,t,n){"use strict";function c(e,t){return{token:"support.function",regex:"^\\s*```"+e+"\\s*$",push:t+"start"}}var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./css_highlight_rules").CssHighlightRules,l=function(e){return"(?:[^"+i.escapeRegExp(e)+"\\\\]|\\\\.)*"},h=function(){a.call(this),this.$rules.start.unshift({token:"empty_line",regex:"^$",next:"allowBlock"},{token:"markup.heading.1",regex:"^=+(?=\\s*$)"},{token:"markup.heading.2",regex:"^\\-+(?=\\s*$)"},{token:function(e){return"markup.heading."+e.length},regex:/^#{1,6}(?=\s*[^ #]|\s+#.)/,next:"header"},c("(?:javascript|js)","jscode-"),c("xml","xmlcode-"),c("html","htmlcode-"),c("css","csscode-"),{token:"support.function",regex:"^\\s*```\\s*\\S*(?:{.*?\\})?\\s*$",next:"githubblock"},{token:"string.blockquote",regex:"^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+",next:"blockquote"},{token:"constant",regex:"^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$",next:"allowBlock"},{token:"markup.list",regex:"^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+",next:"listblock-start"},{include:"basic"}),this.addRules({basic:[{token:"constant.language.escape",regex:/\\[\\`*_{}\[\]()#+\-.!]/},{token:"support.function",regex:"(`+)(.*?[^`])(\\1)"},{token:["text","constant","text","url","string","text"],regex:'^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:["][^"]+["])?(\\s*))$'},{token:["text","string","text","constant","text"],regex:"(\\[)("+l("]")+")(\\]\\s*\\[)("+l("]")+")(\\])"},{token:["text","string","text","markup.underline","string","text"],regex:"(\\[)("+l("]")+")(\\]\\()"+'((?:[^\\)\\s\\\\]|\\\\.|\\s(?=[^"]))*)'+'(\\s*"'+l('"')+'"\\s*)?'+"(\\))"},{token:"string.strong",regex:"([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)"},{token:"string.emphasis",regex:"([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)"},{token:["text","url","text"],regex:"(<)((?:https?|ftp|dict):[^'\">\\s]+|(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+)(>)"}],allowBlock:[{token:"support.function",regex:"^ {4}.+",next:"allowBlock"},{token:"empty_line",regex:"^$",next:"allowBlock"},{token:"empty",regex:"",next:"start"}],header:[{regex:"$",next:"start"},{include:"basic"},{defaultToken:"heading"}],"listblock-start":[{token:"support.variable",regex:/(?:\[[ x]\])?/,next:"listblock"}],listblock:[{token:"empty_line",regex:"^$",next:"start"},{token:"markup.list",regex:"^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+",next:"listblock-start"},{include:"basic",noEscape:!0},{token:"support.function",regex:"^\\s*```\\s*[a-zA-Z]*(?:{.*?\\})?\\s*$",next:"githubblock"},{defaultToken:"list"}],blockquote:[{token:"empty_line",regex:"^\\s*$",next:"start"},{token:"string.blockquote",regex:"^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+",next:"blockquote"},{include:"basic",noEscape:!0},{defaultToken:"string.blockquote"}],githubblock:[{token:"support.function",regex:"^\\s*```",next:"start"},{token:"support.function",regex:".+"}]}),this.embedRules(o,"jscode-",[{token:"support.function",regex:"^\\s*```",next:"pop"}]),this.embedRules(a,"htmlcode-",[{token:"support.function",regex:"^\\s*```",next:"pop"}]),this.embedRules(f,"csscode-",[{token:"support.function",regex:"^\\s*```",next:"pop"}]),this.embedRules(u,"xmlcode-",[{token:"support.function",regex:"^\\s*```",next:"pop"}]),this.normalizeRules()};r.inherits(h,s),t.MarkdownHighlightRules=h}),define("ace/mode/folding/markdown",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.foldingStartMarker=/^(?:[=-]+\s*$|#{1,6} |`{3})/,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?r[0]=="`"?e.bgTokenizer.getState(n)=="start"?"end":"start":"start":""},this.getFoldWidgetRange=function(e,t,n){function l(t){return f=e.getTokens(t)[0],f&&f.type.lastIndexOf(c,0)===0}function h(){var e=f.value[0];return e=="="?6:e=="-"?5:7-f.value.search(/[^#]/)}var r=e.getLine(n),i=r.length,o=e.getLength(),u=n,a=n;if(!r.match(this.foldingStartMarker))return;if(r[0]=="`"){if(e.bgTokenizer.getState(n)!=="start"){while(++n0){r=e.getLine(n);if(r[0]=="`"&r.substring(0,3)=="```")break}return new s(n,r.length,u,0)}var f,c="markup.heading";if(l(n)){var p=h();while(++n=p)break}a=n-(!f||["=","-"].indexOf(f.value[0])==-1?1:2);if(a>u)while(a>u&&/^\s*$/.test(e.getLine(a)))a--;if(a>u){var v=e.getLine(a).length;return new s(u,i,a,v)}}}}.call(o.prototype)}),define("ace/mode/markdown",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript","ace/mode/xml","ace/mode/html","ace/mode/markdown_highlight_rules","ace/mode/folding/markdown"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript").Mode,o=e("./xml").Mode,u=e("./html").Mode,a=e("./markdown_highlight_rules").MarkdownHighlightRules,f=e("./folding/markdown").FoldMode,l=function(){this.HighlightRules=a,this.createModeDelegates({"js-":s,"xml-":o,"html-":u}),this.foldingRules=new f,this.$behaviour=this.$defaultBehaviour};r.inherits(l,i),function(){this.type="text",this.blockComment={start:""},this.getNextLineIndent=function(e,t,n){if(e=="listblock"){var r=/^(\s*)(?:([-+*])|(\d+)\.)(\s+)/.exec(t);if(!r)return"";var i=r[2];return i||(i=parseInt(r[3],10)+1+"."),r[1]+i+r[4]}return this.$getIndent(t)},this.$id="ace/mode/markdown"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-mysql.js b/public/themes/panel/vendor/ace/mode-mysql.js deleted file mode 100644 index b8e6a8d1be..0000000000 --- a/public/themes/panel/vendor/ace/mode-mysql.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/mysql_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./doc_comment_highlight_rules").DocCommentHighlightRules,o=e("./text_highlight_rules").TextHighlightRules,u=function(){function i(e){var t=e.start,n=e.escape;return{token:"string.start",regex:t,next:[{token:"constant.language.escape",regex:n},{token:"string.end",next:"start",regex:t},{defaultToken:"string"}]}}var e="alter|and|as|asc|between|count|create|delete|desc|distinct|drop|from|having|in|insert|into|is|join|like|not|on|or|order|select|set|table|union|update|values|where|accessible|action|add|after|algorithm|all|analyze|asensitive|at|authors|auto_increment|autocommit|avg|avg_row_length|before|binary|binlog|both|btree|cache|call|cascade|cascaded|case|catalog_name|chain|change|changed|character|check|checkpoint|checksum|class_origin|client_statistics|close|coalesce|code|collate|collation|collations|column|columns|comment|commit|committed|completion|concurrent|condition|connection|consistent|constraint|contains|continue|contributors|convert|cross|current_date|current_time|current_timestamp|current_user|cursor|data|database|databases|day_hour|day_microsecond|day_minute|day_second|deallocate|dec|declare|default|delay_key_write|delayed|delimiter|des_key_file|describe|deterministic|dev_pop|dev_samp|deviance|directory|disable|discard|distinctrow|div|dual|dumpfile|each|elseif|enable|enclosed|end|ends|engine|engines|enum|errors|escape|escaped|even|event|events|every|execute|exists|exit|explain|extended|fast|fetch|field|fields|first|flush|for|force|foreign|found_rows|full|fulltext|function|general|global|grant|grants|group|groupby_concat|handler|hash|help|high_priority|hosts|hour_microsecond|hour_minute|hour_second|if|ignore|ignore_server_ids|import|index|index_statistics|infile|inner|innodb|inout|insensitive|insert_method|install|interval|invoker|isolation|iterate|key|keys|kill|language|last|leading|leave|left|level|limit|linear|lines|list|load|local|localtime|localtimestamp|lock|logs|low_priority|master|master_heartbeat_period|master_ssl_verify_server_cert|masters|match|max|max_rows|maxvalue|message_text|middleint|migrate|min|min_rows|minute_microsecond|minute_second|mod|mode|modifies|modify|mutex|mysql_errno|natural|next|no|no_write_to_binlog|offline|offset|one|online|open|optimize|option|optionally|out|outer|outfile|pack_keys|parser|partition|partitions|password|phase|plugin|plugins|prepare|preserve|prev|primary|privileges|procedure|processlist|profile|profiles|purge|query|quick|range|read|read_write|reads|real|rebuild|recover|references|regexp|relaylog|release|remove|rename|reorganize|repair|repeatable|replace|require|resignal|restrict|resume|return|returns|revoke|right|rlike|rollback|rollup|row|row_format|rtree|savepoint|schedule|schema|schema_name|schemas|second_microsecond|security|sensitive|separator|serializable|server|session|share|show|signal|slave|slow|smallint|snapshot|soname|spatial|specific|sql|sql_big_result|sql_buffer_result|sql_cache|sql_calc_found_rows|sql_no_cache|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|start|starting|starts|status|std|stddev|stddev_pop|stddev_samp|storage|straight_join|subclass_origin|sum|suspend|table_name|table_statistics|tables|tablespace|temporary|terminated|to|trailing|transaction|trigger|triggers|truncate|uncommitted|undo|uninstall|unique|unlock|upgrade|usage|use|use_frm|user|user_resources|user_statistics|using|utc_date|utc_time|utc_timestamp|value|variables|varying|view|views|warnings|when|while|with|work|write|xa|xor|year_month|zerofill|begin|do|then|else|loop|repeat",t="by|bool|boolean|bit|blob|decimal|double|enum|float|long|longblob|longtext|medium|mediumblob|mediumint|mediumtext|time|timestamp|tinyblob|tinyint|tinytext|text|bigint|int|int1|int2|int3|int4|int8|integer|float|float4|float8|double|char|varbinary|varchar|varcharacter|precision|date|datetime|year|unsigned|signed|numeric|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl",n="charset|clear|connect|edit|ego|exit|go|help|nopager|notee|nowarning|pager|print|prompt|quit|rehash|source|status|system|tee",r=this.createKeywordMapper({"support.function":t,keyword:e,constant:"false|true|null|unknown|date|time|timestamp|ODBCdotTable|zerolessFloat","variable.language":n},"identifier",!0);this.$rules={start:[{token:"comment",regex:"(?:-- |#).*$"},i({start:'"',escape:/\\[0'"bnrtZ\\%_]?/}),i({start:"'",escape:/\\[0'"bnrtZ\\%_]?/}),s.getStartRule("doc-start"),{token:"comment",regex:/\/\*/,next:"comment"},{token:"constant.numeric",regex:/0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"constant.class",regex:"@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"constant.buildin",regex:"`[^`]*`"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:"\\*\\/",next:"start"},{defaultToken:"comment"}]},this.embedRules(s,"doc-",[s.getEndRule("start")]),this.normalizeRules()};r.inherits(u,o),t.MysqlHighlightRules=u}),define("ace/mode/mysql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mysql_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("../mode/text").Mode,s=e("./mysql_highlight_rules").MysqlHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart=["--","#"],this.blockComment={start:"/*",end:"*/"},this.$id="ace/mode/mysql"}.call(o.prototype),t.Mode=o}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-objectivec.js b/public/themes/panel/vendor/ace/mode-objectivec.js deleted file mode 100644 index 98645e5f68..0000000000 --- a/public/themes/panel/vendor/ace/mode-objectivec.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o=t.cFunctions="\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b",u=function(){var e="break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while|catch|operator|try|throw|using",t="asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|class|wchar_t|template|char16_t|char32_t",n="const|extern|register|restrict|static|volatile|inline|private|protected|public|friend|explicit|virtual|export|mutable|typename|constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local",r="and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eqconst_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace",s="NULL|true|false|TRUE|FALSE|nullptr",u=this.$keywords=this.createKeywordMapper({"keyword.control":e,"storage.type":t,"storage.modifier":n,"keyword.operator":r,"variable.language":"this","constant.language":s},"identifier"),a="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b",f=/\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source;this.$rules={start:[{token:"comment",regex:"//$",next:"start"},{token:"comment",regex:"//",next:"singleLineComment"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string",regex:"'(?:"+f+"|.)?'"},{token:"string.start",regex:'"',stateName:"qqstring",next:[{token:"string",regex:/\\\s*$/,next:"qqstring"},{token:"constant.language.escape",regex:f},{token:"constant.language.escape",regex:/%[^'"\\]/},{token:"string.end",regex:'"|$',next:"start"},{defaultToken:"string"}]},{token:"string.start",regex:'R"\\(',stateName:"rawString",next:[{token:"string.end",regex:'\\)"',next:"start"},{defaultToken:"string"}]},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b"},{token:"keyword",regex:"#\\s*(?:include|import|pragma|line|define|undef)\\b",next:"directive"},{token:"keyword",regex:"#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b"},{token:"support.function.C99.c",regex:o},{token:u,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*"},{token:"keyword.operator",regex:/--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}],singleLineComment:[{token:"comment",regex:/\\$/,next:"singleLineComment"},{token:"comment",regex:/$/,next:"start"},{defaultToken:"comment"}],directive:[{token:"constant.other.multiline",regex:/\\/},{token:"constant.other.multiline",regex:/.*\\/},{token:"constant.other",regex:"\\s*<.+?>",next:"start"},{token:"constant.other",regex:'\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]',next:"start"},{token:"constant.other",regex:"\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']",next:"start"},{token:"constant.other",regex:/[^\\\/]+/,next:"start"}]},this.embedRules(i,"doc-",[i.getEndRule("start")]),this.normalizeRules()};r.inherits(u,s),t.c_cppHighlightRules=u}),define("ace/mode/objectivec_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/c_cpp_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./c_cpp_highlight_rules"),o=s.c_cppHighlightRules,u=function(){var e="\\\\(?:[abefnrtv'\"?\\\\]|[0-3]\\d{1,2}|[4-7]\\d?|222|x[a-zA-Z0-9]+)",t=[{regex:"\\b_cmd\\b",token:"variable.other.selector.objc"},{regex:"\\b(?:self|super)\\b",token:"variable.language.objc"}],n=new o,r=n.getRules();this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:["storage.type.objc","punctuation.definition.storage.type.objc","entity.name.type.objc","text","entity.other.inherited-class.objc"],regex:"(@)(interface|protocol)(?!.+;)(\\s+[A-Za-z_][A-Za-z0-9_]*)(\\s*:\\s*)([A-Za-z]+)"},{token:["storage.type.objc"],regex:"(@end)"},{token:["storage.type.objc","entity.name.type.objc","entity.other.inherited-class.objc"],regex:"(@implementation)(\\s+[A-Za-z_][A-Za-z0-9_]*)(\\s*?::\\s*(?:[A-Za-z][A-Za-z0-9]*))?"},{token:"string.begin.objc",regex:'@"',next:"constant_NSString"},{token:"storage.type.objc",regex:"\\bid\\s*<",next:"protocol_list"},{token:"keyword.control.macro.objc",regex:"\\bNS_DURING|NS_HANDLER|NS_ENDHANDLER\\b"},{token:["punctuation.definition.keyword.objc","keyword.control.exception.objc"],regex:"(@)(try|catch|finally|throw)\\b"},{token:["punctuation.definition.keyword.objc","keyword.other.objc"],regex:"(@)(defs|encode)\\b"},{token:["storage.type.id.objc","text"],regex:"(\\bid\\b)(\\s|\\n)?"},{token:"storage.type.objc",regex:"\\bIBOutlet|IBAction|BOOL|SEL|id|unichar|IMP|Class\\b"},{token:["punctuation.definition.storage.type.objc","storage.type.objc"],regex:"(@)(class|protocol)\\b"},{token:["punctuation.definition.storage.type.objc","punctuation"],regex:"(@selector)(\\s*\\()",next:"selectors"},{token:["punctuation.definition.storage.modifier.objc","storage.modifier.objc"],regex:"(@)(synchronized|public|private|protected|package)\\b"},{token:"constant.language.objc",regex:"\\bYES|NO|Nil|nil\\b"},{token:"support.variable.foundation",regex:"\\bNSApp\\b"},{token:["support.function.cocoa.leopard"],regex:"(?:\\b)(NS(?:Rect(?:ToCGRect|FromCGRect)|MakeCollectable|S(?:tringFromProtocol|ize(?:ToCGSize|FromCGSize))|Draw(?:NinePartImage|ThreePartImage)|P(?:oint(?:ToCGPoint|FromCGPoint)|rotocolFromString)|EventMaskFromType|Value))(?:\\b)"},{token:["support.function.cocoa"],regex:"(?:\\b)(NS(?:R(?:ound(?:DownToMultipleOfPageSize|UpToMultipleOfPageSize)|un(?:CriticalAlertPanel(?:RelativeToWindow)?|InformationalAlertPanel(?:RelativeToWindow)?|AlertPanel(?:RelativeToWindow)?)|e(?:set(?:MapTable|HashTable)|c(?:ycleZone|t(?:Clip(?:List)?|F(?:ill(?:UsingOperation|List(?:UsingOperation|With(?:Grays|Colors(?:UsingOperation)?))?)?|romString))|ordAllocationEvent)|turnAddress|leaseAlertPanel|a(?:dPixel|l(?:MemoryAvailable|locateCollectable))|gisterServicesProvider)|angeFromString)|Get(?:SizeAndAlignment|CriticalAlertPanel|InformationalAlertPanel|UncaughtExceptionHandler|FileType(?:s)?|WindowServerMemory|AlertPanel)|M(?:i(?:n(?:X|Y)|d(?:X|Y))|ouseInRect|a(?:p(?:Remove|Get|Member|Insert(?:IfAbsent|KnownAbsent)?)|ke(?:R(?:ect|ange)|Size|Point)|x(?:Range|X|Y)))|B(?:itsPer(?:SampleFromDepth|PixelFromDepth)|e(?:stDepth|ep|gin(?:CriticalAlertSheet|InformationalAlertSheet|AlertSheet)))|S(?:ho(?:uldRetainWithZone|w(?:sServicesMenuItem|AnimationEffect))|tringFrom(?:R(?:ect|ange)|MapTable|S(?:ize|elector)|HashTable|Class|Point)|izeFromString|e(?:t(?:ShowsServicesMenuItem|ZoneName|UncaughtExceptionHandler|FocusRingStyle)|lectorFromString|archPathForDirectoriesInDomains)|wap(?:Big(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|Short|Host(?:ShortTo(?:Big|Little)|IntTo(?:Big|Little)|DoubleTo(?:Big|Little)|FloatTo(?:Big|Little)|Long(?:To(?:Big|Little)|LongTo(?:Big|Little)))|Int|Double|Float|L(?:ittle(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|ong(?:Long)?)))|H(?:ighlightRect|o(?:stByteOrder|meDirectory(?:ForUser)?)|eight|ash(?:Remove|Get|Insert(?:IfAbsent|KnownAbsent)?)|FSType(?:CodeFromFileType|OfFile))|N(?:umberOfColorComponents|ext(?:MapEnumeratorPair|HashEnumeratorItem))|C(?:o(?:n(?:tainsRect|vert(?:GlyphsToPackedGlyphs|Swapped(?:DoubleToHost|FloatToHost)|Host(?:DoubleToSwapped|FloatToSwapped)))|unt(?:MapTable|HashTable|Frames|Windows(?:ForContext)?)|py(?:M(?:emoryPages|apTableWithZone)|Bits|HashTableWithZone|Object)|lorSpaceFromDepth|mpare(?:MapTables|HashTables))|lassFromString|reate(?:MapTable(?:WithZone)?|HashTable(?:WithZone)?|Zone|File(?:namePboardType|ContentsPboardType)))|TemporaryDirectory|I(?:s(?:ControllerMarker|EmptyRect|FreedObject)|n(?:setRect|crementExtraRefCount|te(?:r(?:sect(?:sRect|ionR(?:ect|ange))|faceStyleForKey)|gralRect)))|Zone(?:Realloc|Malloc|Name|Calloc|Fr(?:omPointer|ee))|O(?:penStepRootDirectory|ffsetRect)|D(?:i(?:sableScreenUpdates|videRect)|ottedFrameRect|e(?:c(?:imal(?:Round|Multiply|S(?:tring|ubtract)|Normalize|Co(?:py|mpa(?:ct|re))|IsNotANumber|Divide|Power|Add)|rementExtraRefCountWasZero)|faultMallocZone|allocate(?:MemoryPages|Object))|raw(?:Gr(?:oove|ayBezel)|B(?:itmap|utton)|ColorTiledRects|TiledRects|DarkBezel|W(?:hiteBezel|indowBackground)|LightBezel))|U(?:serName|n(?:ionR(?:ect|ange)|registerServicesProvider)|pdateDynamicServices)|Java(?:Bundle(?:Setup|Cleanup)|Setup(?:VirtualMachine)?|Needs(?:ToLoadClasses|VirtualMachine)|ClassesF(?:orBundle|romPath)|ObjectNamedInPath|ProvidesClasses)|P(?:oint(?:InRect|FromString)|erformService|lanarFromDepth|ageSize)|E(?:n(?:d(?:MapTableEnumeration|HashTableEnumeration)|umerate(?:MapTable|HashTable)|ableScreenUpdates)|qual(?:R(?:ects|anges)|Sizes|Points)|raseRect|xtraRefCount)|F(?:ileTypeForHFSTypeCode|ullUserName|r(?:ee(?:MapTable|HashTable)|ame(?:Rect(?:WithWidth(?:UsingOperation)?)?|Address)))|Wi(?:ndowList(?:ForContext)?|dth)|Lo(?:cationInRange|g(?:v|PageSize)?)|A(?:ccessibility(?:R(?:oleDescription(?:ForUIElement)?|aiseBadArgumentException)|Unignored(?:Children(?:ForOnlyChild)?|Descendant|Ancestor)|PostNotification|ActionDescription)|pplication(?:Main|Load)|vailableWindowDepths|ll(?:MapTable(?:Values|Keys)|HashTableObjects|ocate(?:MemoryPages|Collectable|Object)))))(?:\\b)"},{token:["support.class.cocoa.leopard"],regex:"(?:\\b)(NS(?:RuleEditor|G(?:arbageCollector|radient)|MapTable|HashTable|Co(?:ndition|llectionView(?:Item)?)|T(?:oolbarItemGroup|extInputClient|r(?:eeNode|ackingArea))|InvocationOperation|Operation(?:Queue)?|D(?:ictionaryController|ockTile)|P(?:ointer(?:Functions|Array)|athC(?:o(?:ntrol(?:Delegate)?|mponentCell)|ell(?:Delegate)?)|r(?:intPanelAccessorizing|edicateEditor(?:RowTemplate)?))|ViewController|FastEnumeration|Animat(?:ionContext|ablePropertyContainer)))(?:\\b)"},{token:["support.class.cocoa"],regex:"(?:\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\b)"},{token:["support.type.cocoa.leopard"],regex:"(?:\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\b)"},{token:["support.class.quartz"],regex:"(?:\\b)(C(?:I(?:Sampler|Co(?:ntext|lor)|Image(?:Accumulator)?|PlugIn(?:Registration)?|Vector|Kernel|Filter(?:Generator|Shape)?)|A(?:Renderer|MediaTiming(?:Function)?|BasicAnimation|ScrollLayer|Constraint(?:LayoutManager)?|T(?:iledLayer|extLayer|rans(?:ition|action))|OpenGLLayer|PropertyAnimation|KeyframeAnimation|Layer|A(?:nimation(?:Group)?|ction))))(?:\\b)"},{token:["support.type.quartz"],regex:"(?:\\b)(C(?:G(?:Float|Point|Size|Rect)|IFormat|AConstraintAttribute))(?:\\b)"},{token:["support.type.cocoa"],regex:"(?:\\b)(NS(?:R(?:ect(?:Edge)?|ange)|G(?:lyph(?:Relation|LayoutMode)?|radientType)|M(?:odalSession|a(?:trixMode|p(?:Table|Enumerator)))|B(?:itmapImageFileType|orderType|uttonType|ezelStyle|ackingStoreType|rowserColumnResizingType)|S(?:cr(?:oll(?:er(?:Part|Arrow)|ArrowPosition)|eenAuxiliaryOpaque)|tringEncoding|ize|ocketNativeHandle|election(?:Granularity|Direction|Affinity)|wapped(?:Double|Float)|aveOperationType)|Ha(?:sh(?:Table|Enumerator)|ndler(?:2)?)|C(?:o(?:ntrol(?:Size|Tint)|mp(?:ositingOperation|arisonResult))|ell(?:State|Type|ImagePosition|Attribute))|T(?:hreadPrivate|ypesetterGlyphInfo|i(?:ckMarkPosition|tlePosition|meInterval)|o(?:ol(?:TipTag|bar(?:SizeMode|DisplayMode))|kenStyle)|IFFCompression|ext(?:TabType|Alignment)|ab(?:State|leViewDropOperation|ViewType)|rackingRectTag)|ImageInterpolation|Zone|OpenGL(?:ContextAuxiliary|PixelFormatAuxiliary)|D(?:ocumentChangeType|atePickerElementFlags|ra(?:werState|gOperation))|UsableScrollerParts|P(?:oint|r(?:intingPageOrder|ogressIndicator(?:Style|Th(?:ickness|readInfo))))|EventType|KeyValueObservingOptions|Fo(?:nt(?:SymbolicTraits|TraitMask|Action)|cusRingType)|W(?:indow(?:OrderingMode|Depth)|orkspace(?:IconCreationOptions|LaunchOptions)|ritingDirection)|L(?:ineBreakMode|ayout(?:Status|Direction))|A(?:nimation(?:Progress|Effect)|ppl(?:ication(?:TerminateReply|DelegateReply|PrintReply)|eEventManagerSuspensionID)|ffineTransformStruct|lertStyle)))(?:\\b)"},{token:["support.constant.cocoa"],regex:"(?:\\b)(NS(?:NotFound|Ordered(?:Ascending|Descending|Same)))(?:\\b)"},{token:["support.constant.notification.cocoa.leopard"],regex:"(?:\\b)(NS(?:MenuDidBeginTracking|ViewDidUpdateTrackingAreas)?Notification)(?:\\b)"},{token:["support.constant.notification.cocoa"],regex:"(?:\\b)(NS(?:Menu(?:Did(?:RemoveItem|SendAction|ChangeItem|EndTracking|AddItem)|WillSendAction)|S(?:ystemColorsDidChange|plitView(?:DidResizeSubviews|WillResizeSubviews))|C(?:o(?:nt(?:extHelpModeDid(?:Deactivate|Activate)|rolT(?:intDidChange|extDid(?:BeginEditing|Change|EndEditing)))|lor(?:PanelColorDidChange|ListDidChange)|mboBox(?:Selection(?:IsChanging|DidChange)|Will(?:Dismiss|PopUp)))|lassDescriptionNeededForClass)|T(?:oolbar(?:DidRemoveItem|WillAddItem)|ext(?:Storage(?:DidProcessEditing|WillProcessEditing)|Did(?:BeginEditing|Change|EndEditing)|View(?:DidChange(?:Selection|TypingAttributes)|WillChangeNotifyingTextView))|ableView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)))|ImageRepRegistryDidChange|OutlineView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)|Item(?:Did(?:Collapse|Expand)|Will(?:Collapse|Expand)))|Drawer(?:Did(?:Close|Open)|Will(?:Close|Open))|PopUpButton(?:CellWillPopUp|WillPopUp)|View(?:GlobalFrameDidChange|BoundsDidChange|F(?:ocusDidChange|rameDidChange))|FontSetChanged|W(?:indow(?:Did(?:Resi(?:ze|gn(?:Main|Key))|M(?:iniaturize|ove)|Become(?:Main|Key)|ChangeScreen(?:|Profile)|Deminiaturize|Update|E(?:ndSheet|xpose))|Will(?:M(?:iniaturize|ove)|BeginSheet|Close))|orkspace(?:SessionDid(?:ResignActive|BecomeActive)|Did(?:Mount|TerminateApplication|Unmount|PerformFileOperation|Wake|LaunchApplication)|Will(?:Sleep|Unmount|PowerOff|LaunchApplication)))|A(?:ntialiasThresholdChanged|ppl(?:ication(?:Did(?:ResignActive|BecomeActive|Hide|ChangeScreenParameters|U(?:nhide|pdate)|FinishLaunching)|Will(?:ResignActive|BecomeActive|Hide|Terminate|U(?:nhide|pdate)|FinishLaunching))|eEventManagerWillProcessFirstEvent)))Notification)(?:\\b)"},{token:["support.constant.cocoa.leopard"],regex:"(?:\\b)(NS(?:RuleEditor(?:RowType(?:Simple|Compound)|NestingMode(?:Si(?:ngle|mple)|Compound|List))|GradientDraws(?:BeforeStartingLocation|AfterEndingLocation)|M(?:inusSetExpressionType|a(?:chPortDeallocate(?:ReceiveRight|SendRight|None)|pTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality)))|B(?:oxCustom|undleExecutableArchitecture(?:X86|I386|PPC(?:64)?)|etweenPredicateOperatorType|ackgroundStyle(?:Raised|Dark|L(?:ight|owered)))|S(?:tring(?:DrawingTruncatesLastVisibleLine|EncodingConversion(?:ExternalRepresentation|AllowLossy))|ubqueryExpressionType|p(?:e(?:ech(?:SentenceBoundary|ImmediateBoundary|WordBoundary)|llingState(?:GrammarFlag|SpellingFlag))|litViewDividerStyleThi(?:n|ck))|e(?:rvice(?:RequestTimedOutError|M(?:iscellaneousError|alformedServiceDictionaryError)|InvalidPasteboardDataError|ErrorM(?:inimum|aximum)|Application(?:NotFoundError|LaunchFailedError))|gmentStyle(?:Round(?:Rect|ed)|SmallSquare|Capsule|Textured(?:Rounded|Square)|Automatic)))|H(?:UDWindowMask|ashTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality))|N(?:oModeColorPanel|etServiceNoAutoRename)|C(?:hangeRedone|o(?:ntainsPredicateOperatorType|l(?:orRenderingIntent(?:RelativeColorimetric|Saturation|Default|Perceptual|AbsoluteColorimetric)|lectorDisabledOption))|ellHit(?:None|ContentArea|TrackableArea|EditableTextArea))|T(?:imeZoneNameStyle(?:S(?:hort(?:Standard|DaylightSaving)|tandard)|DaylightSaving)|extFieldDatePickerStyle|ableViewSelectionHighlightStyle(?:Regular|SourceList)|racking(?:Mouse(?:Moved|EnteredAndExited)|CursorUpdate|InVisibleRect|EnabledDuringMouseDrag|A(?:ssumeInside|ctive(?:In(?:KeyWindow|ActiveApp)|WhenFirstResponder|Always))))|I(?:n(?:tersectSetExpressionType|dexedColorSpaceModel)|mageScale(?:None|Proportionally(?:Down|UpOrDown)|AxesIndependently))|Ope(?:nGLPFAAllowOfflineRenderers|rationQueue(?:DefaultMaxConcurrentOperationCount|Priority(?:High|Normal|Very(?:High|Low)|Low)))|D(?:iacriticInsensitiveSearch|ownloadsDirectory)|U(?:nionSetExpressionType|TF(?:16(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)|32(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)))|P(?:ointerFunctions(?:Ma(?:chVirtualMemory|llocMemory)|Str(?:ongMemory|uctPersonality)|C(?:StringPersonality|opyIn)|IntegerPersonality|ZeroingWeakMemory|O(?:paque(?:Memory|Personality)|bjectP(?:ointerPersonality|ersonality)))|at(?:hStyle(?:Standard|NavigationBar|PopUp)|ternColorSpaceModel)|rintPanelShows(?:Scaling|Copies|Orientation|P(?:a(?:perSize|ge(?:Range|SetupAccessory))|review)))|Executable(?:RuntimeMismatchError|NotLoadableError|ErrorM(?:inimum|aximum)|L(?:inkError|oadError)|ArchitectureMismatchError)|KeyValueObservingOption(?:Initial|Prior)|F(?:i(?:ndPanelSubstringMatchType(?:StartsWith|Contains|EndsWith|FullWord)|leRead(?:TooLargeError|UnknownStringEncodingError))|orcedOrderingSearch)|Wi(?:ndow(?:BackingLocation(?:MainMemory|Default|VideoMemory)|Sharing(?:Read(?:Only|Write)|None)|CollectionBehavior(?:MoveToActiveSpace|CanJoinAllSpaces|Default))|dthInsensitiveSearch)|AggregateExpressionType))(?:\\b)"},{token:["support.constant.cocoa"],regex:"(?:\\b)(NS(?:R(?:GB(?:ModeColorPanel|ColorSpaceModel)|ight(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey)|ound(?:RectBezelStyle|Bankers|ed(?:BezelStyle|TokenStyle|DisclosureBezelStyle)|Down|Up|Plain|Line(?:CapStyle|JoinStyle))|un(?:StoppedResponse|ContinuesResponse|AbortedResponse)|e(?:s(?:izableWindowMask|et(?:CursorRectsRunLoopOrdering|FunctionKey))|ce(?:ssedBezelStyle|iver(?:sCantHandleCommandScriptError|EvaluationScriptError))|turnTextMovement|doFunctionKey|quiredArgumentsMissingScriptError|l(?:evancyLevelIndicatorStyle|ative(?:Before|After))|gular(?:SquareBezelStyle|ControlSize)|moveTraitFontAction)|a(?:n(?:domSubelement|geDateMode)|tingLevelIndicatorStyle|dio(?:ModeMatrix|Button)))|G(?:IFFileType|lyph(?:Below|Inscribe(?:B(?:elow|ase)|Over(?:strike|Below)|Above)|Layout(?:WithPrevious|A(?:tAPoint|gainstAPoint))|A(?:ttribute(?:BidiLevel|Soft|Inscribe|Elastic)|bove))|r(?:ooveBorder|eaterThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|a(?:y(?:ModeColorPanel|ColorSpaceModel)|dient(?:None|Con(?:cave(?:Strong|Weak)|vex(?:Strong|Weak)))|phiteControlTint)))|XML(?:N(?:o(?:tationDeclarationKind|de(?:CompactEmptyElement|IsCDATA|OptionsNone|Use(?:SingleQuotes|DoubleQuotes)|Pre(?:serve(?:NamespaceOrder|C(?:haracterReferences|DATA)|DTD|Prefixes|E(?:ntities|mptyElements)|Quotes|Whitespace|A(?:ttributeOrder|ll))|ttyPrint)|ExpandEmptyElement))|amespaceKind)|CommentKind|TextKind|InvalidKind|D(?:ocument(?:X(?:MLKind|HTMLKind|Include)|HTMLKind|T(?:idy(?:XML|HTML)|extKind)|IncludeContentTypeDeclaration|Validate|Kind)|TDKind)|P(?:arser(?:GTRequiredError|XMLDeclNot(?:StartedError|FinishedError)|Mi(?:splaced(?:XMLDeclarationError|CDATAEndStringError)|xedContentDeclNot(?:StartedError|FinishedError))|S(?:t(?:andaloneValueError|ringNot(?:StartedError|ClosedError))|paceRequiredError|eparatorRequiredError)|N(?:MTOKENRequiredError|o(?:t(?:ationNot(?:StartedError|FinishedError)|WellBalancedError)|DTDError)|amespaceDeclarationError|AMERequiredError)|C(?:haracterRef(?:In(?:DTDError|PrologError|EpilogError)|AtEOFError)|o(?:nditionalSectionNot(?:StartedError|FinishedError)|mment(?:NotFinishedError|ContainsDoubleHyphenError))|DATANotFinishedError)|TagNameMismatchError|In(?:ternalError|valid(?:HexCharacterRefError|C(?:haracter(?:RefError|InEntityError|Error)|onditionalSectionError)|DecimalCharacterRefError|URIError|Encoding(?:NameError|Error)))|OutOfMemoryError|D(?:ocumentStartError|elegateAbortedParseError|OCTYPEDeclNotFinishedError)|U(?:RI(?:RequiredError|FragmentError)|n(?:declaredEntityError|parsedEntityError|knownEncodingError|finishedTagError))|P(?:CDATARequiredError|ublicIdentifierRequiredError|arsedEntityRef(?:MissingSemiError|NoNameError|In(?:Internal(?:SubsetError|Error)|PrologError|EpilogError)|AtEOFError)|r(?:ocessingInstructionNot(?:StartedError|FinishedError)|ematureDocumentEndError))|E(?:n(?:codingNotSupportedError|tity(?:Ref(?:In(?:DTDError|PrologError|EpilogError)|erence(?:MissingSemiError|WithoutNameError)|LoopError|AtEOFError)|BoundaryError|Not(?:StartedError|FinishedError)|Is(?:ParameterError|ExternalError)|ValueRequiredError))|qualExpectedError|lementContentDeclNot(?:StartedError|FinishedError)|xt(?:ernalS(?:tandaloneEntityError|ubsetNotFinishedError)|raContentError)|mptyDocumentError)|L(?:iteralNot(?:StartedError|FinishedError)|T(?:RequiredError|SlashRequiredError)|essThanSymbolInAttributeError)|Attribute(?:RedefinedError|HasNoValueError|Not(?:StartedError|FinishedError)|ListNot(?:StartedError|FinishedError)))|rocessingInstructionKind)|E(?:ntity(?:GeneralKind|DeclarationKind|UnparsedKind|P(?:ar(?:sedKind|ameterKind)|redefined))|lement(?:Declaration(?:MixedKind|UndefinedKind|E(?:lementKind|mptyKind)|Kind|AnyKind)|Kind))|Attribute(?:N(?:MToken(?:sKind|Kind)|otationKind)|CDATAKind|ID(?:Ref(?:sKind|Kind)|Kind)|DeclarationKind|En(?:tit(?:yKind|iesKind)|umerationKind)|Kind))|M(?:i(?:n(?:XEdge|iaturizableWindowMask|YEdge|uteCalendarUnit)|terLineJoinStyle|ddleSubelement|xedState)|o(?:nthCalendarUnit|deSwitchFunctionKey|use(?:Moved(?:Mask)?|E(?:ntered(?:Mask)?|ventSubtype|xited(?:Mask)?))|veToBezierPathElement|mentary(?:ChangeButton|Push(?:Button|InButton)|Light(?:Button)?))|enuFunctionKey|a(?:c(?:intoshInterfaceStyle|OSRomanStringEncoding)|tchesPredicateOperatorType|ppedRead|x(?:XEdge|YEdge))|ACHOperatingSystem)|B(?:MPFileType|o(?:ttomTabsBezelBorder|ldFontMask|rderlessWindowMask|x(?:Se(?:condary|parator)|OldStyle|Primary))|uttLineCapStyle|e(?:zelBorder|velLineJoinStyle|low(?:Bottom|Top)|gin(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|lueControlTint|ack(?:spaceCharacter|tabTextMovement|ingStore(?:Retained|Buffered|Nonretained)|TabCharacter|wardsSearch|groundTab)|r(?:owser(?:NoColumnResizing|UserColumnResizing|AutoColumnResizing)|eakFunctionKey))|S(?:h(?:ift(?:JISStringEncoding|KeyMask)|ow(?:ControlGlyphs|InvisibleGlyphs)|adowlessSquareBezelStyle)|y(?:s(?:ReqFunctionKey|tem(?:D(?:omainMask|efined(?:Mask)?)|FunctionKey))|mbolStringEncoding)|c(?:a(?:nnedOption|le(?:None|ToFit|Proportionally))|r(?:oll(?:er(?:NoPart|Increment(?:Page|Line|Arrow)|Decrement(?:Page|Line|Arrow)|Knob(?:Slot)?|Arrows(?:M(?:inEnd|axEnd)|None|DefaultSetting))|Wheel(?:Mask)?|LockFunctionKey)|eenChangedEventType))|t(?:opFunctionKey|r(?:ingDrawing(?:OneShot|DisableScreenFontSubstitution|Uses(?:DeviceMetrics|FontLeading|LineFragmentOrigin))|eam(?:Status(?:Reading|NotOpen|Closed|Open(?:ing)?|Error|Writing|AtEnd)|Event(?:Has(?:BytesAvailable|SpaceAvailable)|None|OpenCompleted|E(?:ndEncountered|rrorOccurred)))))|i(?:ngle(?:DateMode|UnderlineStyle)|ze(?:DownFontAction|UpFontAction))|olarisOperatingSystem|unOSOperatingSystem|pecialPageOrder|e(?:condCalendarUnit|lect(?:By(?:Character|Paragraph|Word)|i(?:ng(?:Next|Previous)|onAffinity(?:Downstream|Upstream))|edTab|FunctionKey)|gmentSwitchTracking(?:Momentary|Select(?:One|Any)))|quareLineCapStyle|witchButton|ave(?:ToOperation|Op(?:tions(?:Yes|No|Ask)|eration)|AsOperation)|mall(?:SquareBezelStyle|C(?:ontrolSize|apsFontMask)|IconButtonBezelStyle))|H(?:ighlightModeMatrix|SBModeColorPanel|o(?:ur(?:Minute(?:SecondDatePickerElementFlag|DatePickerElementFlag)|CalendarUnit)|rizontalRuler|meFunctionKey)|TTPCookieAcceptPolicy(?:Never|OnlyFromMainDocumentDomain|Always)|e(?:lp(?:ButtonBezelStyle|KeyMask|FunctionKey)|avierFontAction)|PUXOperatingSystem)|Year(?:MonthDa(?:yDatePickerElementFlag|tePickerElementFlag)|CalendarUnit)|N(?:o(?:n(?:StandardCharacterSetFontMask|ZeroWindingRule|activatingPanelMask|LossyASCIIStringEncoding)|Border|t(?:ification(?:SuspensionBehavior(?:Hold|Coalesce|D(?:eliverImmediately|rop))|NoCoalescing|CoalescingOn(?:Sender|Name)|DeliverImmediately|PostToAllSessions)|PredicateType|EqualToPredicateOperatorType)|S(?:cr(?:iptError|ollerParts)|ubelement|pecifierError)|CellMask|T(?:itle|opLevelContainersSpecifierError|abs(?:BezelBorder|NoBorder|LineBorder))|I(?:nterfaceStyle|mage)|UnderlineStyle|FontChangeAction)|u(?:ll(?:Glyph|CellType)|m(?:eric(?:Search|PadKeyMask)|berFormatter(?:Round(?:Half(?:Down|Up|Even)|Ceiling|Down|Up|Floor)|Behavior(?:10|Default)|S(?:cientificStyle|pellOutStyle)|NoStyle|CurrencyStyle|DecimalStyle|P(?:ercentStyle|ad(?:Before(?:Suffix|Prefix)|After(?:Suffix|Prefix))))))|e(?:t(?:Service(?:BadArgumentError|NotFoundError|C(?:ollisionError|ancelledError)|TimeoutError|InvalidError|UnknownError|ActivityInProgress)|workDomainMask)|wlineCharacter|xt(?:StepInterfaceStyle|FunctionKey))|EXTSTEPStringEncoding|a(?:t(?:iveShortGlyphPacking|uralTextAlignment)|rrowFontMask))|C(?:hange(?:ReadOtherContents|GrayCell(?:Mask)?|BackgroundCell(?:Mask)?|Cleared|Done|Undone|Autosaved)|MYK(?:ModeColorPanel|ColorSpaceModel)|ircular(?:BezelStyle|Slider)|o(?:n(?:stantValueExpressionType|t(?:inuousCapacityLevelIndicatorStyle|entsCellMask|ain(?:sComparison|erSpecifierError)|rol(?:Glyph|KeyMask))|densedFontMask)|lor(?:Panel(?:RGBModeMask|GrayModeMask|HSBModeMask|C(?:MYKModeMask|olorListModeMask|ustomPaletteModeMask|rayonModeMask)|WheelModeMask|AllModesMask)|ListModeColorPanel)|reServiceDirectory|m(?:p(?:osite(?:XOR|Source(?:In|O(?:ut|ver)|Atop)|Highlight|C(?:opy|lear)|Destination(?:In|O(?:ut|ver)|Atop)|Plus(?:Darker|Lighter))|ressedFontMask)|mandKeyMask))|u(?:stom(?:SelectorPredicateOperatorType|PaletteModeColorPanel)|r(?:sor(?:Update(?:Mask)?|PointingDevice)|veToBezierPathElement))|e(?:nterT(?:extAlignment|abStopType)|ll(?:State|H(?:ighlighted|as(?:Image(?:Horizontal|OnLeftOrBottom)|OverlappingImage))|ChangesContents|Is(?:Bordered|InsetButton)|Disabled|Editable|LightsBy(?:Gray|Background|Contents)|AllowsMixedState))|l(?:ipPagination|o(?:s(?:ePathBezierPathElement|ableWindowMask)|ckAndCalendarDatePickerStyle)|ear(?:ControlTint|DisplayFunctionKey|LineFunctionKey))|a(?:seInsensitive(?:Search|PredicateOption)|n(?:notCreateScriptCommandError|cel(?:Button|TextMovement))|chesDirectory|lculation(?:NoError|Overflow|DivideByZero|Underflow|LossOfPrecision)|rriageReturnCharacter)|r(?:itical(?:Request|AlertStyle)|ayonModeColorPanel))|T(?:hick(?:SquareBezelStyle|erSquareBezelStyle)|ypesetter(?:Behavior|HorizontalTabAction|ContainerBreakAction|ZeroAdvancementAction|OriginalBehavior|ParagraphBreakAction|WhitespaceAction|L(?:ineBreakAction|atestBehavior))|i(?:ckMark(?:Right|Below|Left|Above)|tledWindowMask|meZoneDatePickerElementFlag)|o(?:olbarItemVisibilityPriority(?:Standard|High|User|Low)|pTabsBezelBorder|ggleButton)|IFF(?:Compression(?:N(?:one|EXT)|CCITTFAX(?:3|4)|OldJPEG|JPEG|PackBits|LZW)|FileType)|e(?:rminate(?:Now|Cancel|Later)|xt(?:Read(?:InapplicableDocumentTypeError|WriteErrorM(?:inimum|aximum))|Block(?:M(?:i(?:nimum(?:Height|Width)|ddleAlignment)|a(?:rgin|ximum(?:Height|Width)))|B(?:o(?:ttomAlignment|rder)|aselineAlignment)|Height|TopAlignment|P(?:ercentageValueType|adding)|Width|AbsoluteValueType)|StorageEdited(?:Characters|Attributes)|CellType|ured(?:RoundedBezelStyle|BackgroundWindowMask|SquareBezelStyle)|Table(?:FixedLayoutAlgorithm|AutomaticLayoutAlgorithm)|Field(?:RoundedBezel|SquareBezel|AndStepperDatePickerStyle)|WriteInapplicableDocumentTypeError|ListPrependEnclosingMarker))|woByteGlyphPacking|ab(?:Character|TextMovement|le(?:tP(?:oint(?:Mask|EventSubtype)?|roximity(?:Mask|EventSubtype)?)|Column(?:NoResizing|UserResizingMask|AutoresizingMask)|View(?:ReverseSequentialColumnAutoresizingStyle|GridNone|S(?:olid(?:HorizontalGridLineMask|VerticalGridLineMask)|equentialColumnAutoresizingStyle)|NoColumnAutoresizing|UniformColumnAutoresizingStyle|FirstColumnOnlyAutoresizingStyle|LastColumnOnlyAutoresizingStyle)))|rackModeMatrix)|I(?:n(?:sert(?:CharFunctionKey|FunctionKey|LineFunctionKey)|t(?:Type|ernalS(?:criptError|pecifierError))|dexSubelement|validIndexSpecifierError|formational(?:Request|AlertStyle)|PredicateOperatorType)|talicFontMask|SO(?:2022JPStringEncoding|Latin(?:1StringEncoding|2StringEncoding))|dentityMappingCharacterCollection|llegalTextMovement|mage(?:R(?:ight|ep(?:MatchesDevice|LoadStatus(?:ReadingHeader|Completed|InvalidData|Un(?:expectedEOF|knownType)|WillNeedAllData)))|Below|C(?:ellType|ache(?:BySize|Never|Default|Always))|Interpolation(?:High|None|Default|Low)|O(?:nly|verlaps)|Frame(?:Gr(?:oove|ayBezel)|Button|None|Photo)|L(?:oadStatus(?:ReadError|C(?:ompleted|ancelled)|InvalidData|UnexpectedEOF)|eft)|A(?:lign(?:Right|Bottom(?:Right|Left)?|Center|Top(?:Right|Left)?|Left)|bove)))|O(?:n(?:State|eByteGlyphPacking|OffButton|lyScrollerArrows)|ther(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|TextMovement)|SF1OperatingSystem|pe(?:n(?:GL(?:GO(?:Re(?:setLibrary|tainRenderers)|ClearFormatCache|FormatCacheSize)|PFA(?:R(?:obust|endererID)|M(?:inimumPolicy|ulti(?:sample|Screen)|PSafe|aximumPolicy)|BackingStore|S(?:creenMask|te(?:ncilSize|reo)|ingleRenderer|upersample|ample(?:s|Buffers|Alpha))|NoRecovery|C(?:o(?:lor(?:Size|Float)|mpliant)|losestPolicy)|OffScreen|D(?:oubleBuffer|epthSize)|PixelBuffer|VirtualScreenCount|FullScreen|Window|A(?:cc(?:umSize|elerated)|ux(?:Buffers|DepthStencil)|l(?:phaSize|lRenderers))))|StepUnicodeReservedBase)|rationNotSupportedForKeyS(?:criptError|pecifierError))|ffState|KButton|rPredicateType|bjC(?:B(?:itfield|oolType)|S(?:hortType|tr(?:ingType|uctType)|electorType)|NoType|CharType|ObjectType|DoubleType|UnionType|PointerType|VoidType|FloatType|Long(?:Type|longType)|ArrayType))|D(?:i(?:s(?:c(?:losureBezelStyle|reteCapacityLevelIndicatorStyle)|playWindowRunLoopOrdering)|acriticInsensitivePredicateOption|rect(?:Selection|PredicateModifier))|o(?:c(?:ModalWindowMask|ument(?:Directory|ationDirectory))|ubleType|wn(?:TextMovement|ArrowFunctionKey))|e(?:s(?:cendingPageOrder|ktopDirectory)|cimalTabStopType|v(?:ice(?:NColorSpaceModel|IndependentModifierFlagsMask)|eloper(?:Directory|ApplicationDirectory))|fault(?:ControlTint|TokenStyle)|lete(?:Char(?:acter|FunctionKey)|FunctionKey|LineFunctionKey)|moApplicationDirectory)|a(?:yCalendarUnit|teFormatter(?:MediumStyle|Behavior(?:10|Default)|ShortStyle|NoStyle|FullStyle|LongStyle))|ra(?:wer(?:Clos(?:ingState|edState)|Open(?:ingState|State))|gOperation(?:Generic|Move|None|Copy|Delete|Private|Every|Link|All)))|U(?:ser(?:CancelledError|D(?:irectory|omainMask)|FunctionKey)|RL(?:Handle(?:NotLoaded|Load(?:Succeeded|InProgress|Failed))|CredentialPersistence(?:None|Permanent|ForSession))|n(?:scaledWindowMask|cachedRead|i(?:codeStringEncoding|talicFontMask|fiedTitleAndToolbarWindowMask)|d(?:o(?:CloseGroupingRunLoopOrdering|FunctionKey)|e(?:finedDateComponent|rline(?:Style(?:Single|None|Thick|Double)|Pattern(?:Solid|D(?:ot|ash(?:Dot(?:Dot)?)?)))))|known(?:ColorSpaceModel|P(?:ointingDevice|ageOrder)|KeyS(?:criptError|pecifierError))|boldFontMask)|tilityWindowMask|TF8StringEncoding|p(?:dateWindowsRunLoopOrdering|TextMovement|ArrowFunctionKey))|J(?:ustifiedTextAlignment|PEG(?:2000FileType|FileType)|apaneseEUC(?:GlyphPacking|StringEncoding))|P(?:o(?:s(?:t(?:Now|erFontMask|WhenIdle|ASAP)|iti(?:on(?:Replace|Be(?:fore|ginning)|End|After)|ve(?:IntType|DoubleType|FloatType)))|pUp(?:NoArrow|ArrowAt(?:Bottom|Center))|werOffEventType|rtraitOrientation)|NGFileType|ush(?:InCell(?:Mask)?|OnPushOffButton)|e(?:n(?:TipMask|UpperSideMask|PointingDevice|LowerSideMask)|riodic(?:Mask)?)|P(?:S(?:caleField|tatus(?:Title|Field)|aveButton)|N(?:ote(?:Title|Field)|ame(?:Title|Field))|CopiesField|TitleField|ImageButton|OptionsButton|P(?:a(?:perFeedButton|ge(?:Range(?:To|From)|ChoiceMatrix))|reviewButton)|LayoutButton)|lainTextTokenStyle|a(?:useFunctionKey|ragraphSeparatorCharacter|ge(?:DownFunctionKey|UpFunctionKey))|r(?:int(?:ing(?:ReplyLater|Success|Cancelled|Failure)|ScreenFunctionKey|erTable(?:NotFound|OK|Error)|FunctionKey)|o(?:p(?:ertyList(?:XMLFormat|MutableContainers(?:AndLeaves)?|BinaryFormat|Immutable|OpenStepFormat)|rietaryStringEncoding)|gressIndicator(?:BarStyle|SpinningStyle|Preferred(?:SmallThickness|Thickness|LargeThickness|AquaThickness)))|e(?:ssedTab|vFunctionKey))|L(?:HeightForm|CancelButton|TitleField|ImageButton|O(?:KButton|rientationMatrix)|UnitsButton|PaperNameButton|WidthForm))|E(?:n(?:terCharacter|d(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|v(?:e(?:nOddWindingRule|rySubelement)|aluatedObjectExpressionType)|qualTo(?:Comparison|PredicateOperatorType)|ra(?:serPointingDevice|CalendarUnit|DatePickerElementFlag)|x(?:clude(?:10|QuickDrawElementsIconCreationOption)|pandedFontMask|ecuteFunctionKey))|V(?:i(?:ew(?:M(?:in(?:XMargin|YMargin)|ax(?:XMargin|YMargin))|HeightSizable|NotSizable|WidthSizable)|aPanelFontAction)|erticalRuler|a(?:lidationErrorM(?:inimum|aximum)|riableExpressionType))|Key(?:SpecifierEvaluationScriptError|Down(?:Mask)?|Up(?:Mask)?|PathExpressionType|Value(?:MinusSetMutation|SetSetMutation|Change(?:Re(?:placement|moval)|Setting|Insertion)|IntersectSetMutation|ObservingOption(?:New|Old)|UnionSetMutation|ValidationError))|QTMovie(?:NormalPlayback|Looping(?:BackAndForthPlayback|Playback))|F(?:1(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|7FunctionKey|i(?:nd(?:PanelAction(?:Replace(?:A(?:ndFind|ll(?:InSelection)?))?|S(?:howFindPanel|e(?:tFindString|lectAll(?:InSelection)?))|Next|Previous)|FunctionKey)|tPagination|le(?:Read(?:No(?:SuchFileError|PermissionError)|CorruptFileError|In(?:validFileNameError|applicableStringEncodingError)|Un(?:supportedSchemeError|knownError))|HandlingPanel(?:CancelButton|OKButton)|NoSuchFileError|ErrorM(?:inimum|aximum)|Write(?:NoPermissionError|In(?:validFileNameError|applicableStringEncodingError)|OutOfSpaceError|Un(?:supportedSchemeError|knownError))|LockingError)|xedPitchFontMask)|2(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|o(?:nt(?:Mo(?:noSpaceTrait|dernSerifsClass)|BoldTrait|S(?:ymbolicClass|criptsClass|labSerifsClass|ansSerifClass)|C(?:o(?:ndensedTrait|llectionApplicationOnlyMask)|larendonSerifsClass)|TransitionalSerifsClass|I(?:ntegerAdvancementsRenderingMode|talicTrait)|O(?:ldStyleSerifsClass|rnamentalsClass)|DefaultRenderingMode|U(?:nknownClass|IOptimizedTrait)|Panel(?:S(?:hadowEffectModeMask|t(?:andardModesMask|rikethroughEffectModeMask)|izeModeMask)|CollectionModeMask|TextColorEffectModeMask|DocumentColorEffectModeMask|UnderlineEffectModeMask|FaceModeMask|All(?:ModesMask|EffectsModeMask))|ExpandedTrait|VerticalTrait|F(?:amilyClassMask|reeformSerifsClass)|Antialiased(?:RenderingMode|IntegerAdvancementsRenderingMode))|cusRing(?:Below|Type(?:None|Default|Exterior)|Only|Above)|urByteGlyphPacking|rm(?:attingError(?:M(?:inimum|aximum))?|FeedCharacter))|8FunctionKey|unction(?:ExpressionType|KeyMask)|3(?:1FunctionKey|2FunctionKey|3FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey)|9FunctionKey|4FunctionKey|P(?:RevertButton|S(?:ize(?:Title|Field)|etButton)|CurrentField|Preview(?:Button|Field))|l(?:oat(?:ingPointSamplesBitmapFormat|Type)|agsChanged(?:Mask)?)|axButton|5FunctionKey|6FunctionKey)|W(?:heelModeColorPanel|indow(?:s(?:NTOperatingSystem|CP125(?:1StringEncoding|2StringEncoding|3StringEncoding|4StringEncoding|0StringEncoding)|95(?:InterfaceStyle|OperatingSystem))|M(?:iniaturizeButton|ovedEventType)|Below|CloseButton|ToolbarButton|ZoomButton|Out|DocumentIconButton|ExposedEventType|Above)|orkspaceLaunch(?:NewInstance|InhibitingBackgroundOnly|Default|PreferringClassic|WithoutA(?:ctivation|ddingToRecents)|A(?:sync|nd(?:Hide(?:Others)?|Print)|llowingClassicStartup))|eek(?:day(?:CalendarUnit|OrdinalCalendarUnit)|CalendarUnit)|a(?:ntsBidiLevels|rningAlertStyle)|r(?:itingDirection(?:RightToLeft|Natural|LeftToRight)|apCalendarComponents))|L(?:i(?:stModeMatrix|ne(?:Moves(?:Right|Down|Up|Left)|B(?:order|reakBy(?:C(?:harWrapping|lipping)|Truncating(?:Middle|Head|Tail)|WordWrapping))|S(?:eparatorCharacter|weep(?:Right|Down|Up|Left))|ToBezierPathElement|DoesntMove|arSlider)|teralSearch|kePredicateOperatorType|ghterFontAction|braryDirectory)|ocalDomainMask|e(?:ssThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|ft(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey))|a(?:yout(?:RightToLeft|NotDone|CantFit|OutOfGlyphs|Done|LeftToRight)|ndscapeOrientation)|ABColorSpaceModel)|A(?:sc(?:iiWithDoubleByteEUCGlyphPacking|endingPageOrder)|n(?:y(?:Type|PredicateModifier|EventMask)|choredSearch|imation(?:Blocking|Nonblocking(?:Threaded)?|E(?:ffect(?:DisappearingItemDefault|Poof)|ase(?:In(?:Out)?|Out))|Linear)|dPredicateType)|t(?:Bottom|tachmentCharacter|omicWrite|Top)|SCIIStringEncoding|d(?:obe(?:GB1CharacterCollection|CNS1CharacterCollection|Japan(?:1CharacterCollection|2CharacterCollection)|Korea1CharacterCollection)|dTraitFontAction|minApplicationDirectory)|uto(?:saveOperation|Pagination)|pp(?:lication(?:SupportDirectory|D(?:irectory|e(?:fined(?:Mask)?|legateReply(?:Success|Cancel|Failure)|activatedEventType))|ActivatedEventType)|KitDefined(?:Mask)?)|l(?:ternateKeyMask|pha(?:ShiftKeyMask|NonpremultipliedBitmapFormat|FirstBitmapFormat)|ert(?:SecondButtonReturn|ThirdButtonReturn|OtherReturn|DefaultReturn|ErrorReturn|FirstButtonReturn|AlternateReturn)|l(?:ScrollerParts|DomainsMask|PredicateModifier|LibrariesDirectory|ApplicationsDirectory))|rgument(?:sWrongScriptError|EvaluationScriptError)|bove(?:Bottom|Top)|WTEventType)))(?:\\b)"},{token:"support.function.C99.c",regex:s.cFunctions},{token:n.getKeywords(),regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"punctuation.section.scope.begin.objc",regex:"\\[",next:"bracketed_content"},{token:"meta.function.objc",regex:"^(?:-|\\+)\\s*"}],constant_NSString:[{token:"constant.character.escape.objc",regex:e},{token:"invalid.illegal.unknown-escape.objc",regex:"\\\\."},{token:"string",regex:'[^"\\\\]+'},{token:"punctuation.definition.string.end",regex:'"',next:"start"}],protocol_list:[{token:"punctuation.section.scope.end.objc",regex:">",next:"start"},{token:"support.other.protocol.objc",regex:"\bNS(?:GlyphStorage|M(?:utableCopying|enuItem)|C(?:hangeSpelling|o(?:ding|pying|lorPicking(?:Custom|Default)))|T(?:oolbarItemValidations|ext(?:Input|AttachmentCell))|I(?:nputServ(?:iceProvider|erMouseTracker)|gnoreMisspelledWords)|Obj(?:CTypeSerializationCallBack|ect)|D(?:ecimalNumberBehaviors|raggingInfo)|U(?:serInterfaceValidations|RL(?:HandleClient|DownloadDelegate|ProtocolClient|AuthenticationChallengeSender))|Validated(?:ToobarItem|UserInterfaceItem)|Locking)\b"}],selectors:[{token:"support.function.any-method.name-of-parameter.objc",regex:"\\b(?:[a-zA-Z_:][\\w]*)+"},{token:"punctuation",regex:"\\)",next:"start"}],bracketed_content:[{token:"punctuation.section.scope.end.objc",regex:"]",next:"start"},{token:["support.function.any-method.objc"],regex:"(?:predicateWithFormat:| NSPredicate predicateWithFormat:)",next:"start"},{token:"support.function.any-method.objc",regex:"\\w+(?::|(?=]))",next:"start"}],bracketed_strings:[{token:"punctuation.section.scope.end.objc",regex:"]",next:"start"},{token:"keyword.operator.logical.predicate.cocoa",regex:"\\b(?:AND|OR|NOT|IN)\\b"},{token:["invalid.illegal.unknown-method.objc","punctuation.separator.arguments.objc"],regex:"\\b(\\w+)(:)"},{regex:"\\b(?:ALL|ANY|SOME|NONE)\\b",token:"constant.language.predicate.cocoa"},{regex:"\\b(?:NULL|NIL|SELF|TRUE|YES|FALSE|NO|FIRST|LAST|SIZE)\\b",token:"constant.language.predicate.cocoa"},{regex:"\\b(?:MATCHES|CONTAINS|BEGINSWITH|ENDSWITH|BETWEEN)\\b",token:"keyword.operator.comparison.predicate.cocoa"},{regex:"\\bC(?:ASEINSENSITIVE|I)\\b",token:"keyword.other.modifier.predicate.cocoa"},{regex:"\\b(?:ANYKEY|SUBQUERY|CAST|TRUEPREDICATE|FALSEPREDICATE)\\b",token:"keyword.other.predicate.cocoa"},{regex:e,token:"constant.character.escape.objc"},{regex:"\\\\.",token:"invalid.illegal.unknown-escape.objc"},{token:"string",regex:'[^"\\\\]'},{token:"punctuation.definition.string.end.objc",regex:'"',next:"predicates"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}],methods:[{token:"meta.function.objc",regex:"(?=\\{|#)|;",next:"start"}]};for(var u in r)this.$rules[u]?this.$rules[u].push&&this.$rules[u].push.apply(this.$rules[u],r[u]):this.$rules[u]=r[u];this.$rules.bracketed_content=this.$rules.bracketed_content.concat(this.$rules.start,t),this.embedRules(i,"doc-",[i.getEndRule("start")])};r.inherits(u,o),t.ObjectiveCHighlightRules=u}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/objectivec",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/objectivec_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./objectivec_highlight_rules").ObjectiveCHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$id="ace/mode/objectivec"}.call(u.prototype),t.Mode=u}) diff --git a/public/themes/panel/vendor/ace/mode-perl.js b/public/themes/panel/vendor/ace/mode-perl.js deleted file mode 100644 index 726f03cd87..0000000000 --- a/public/themes/panel/vendor/ace/mode-perl.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/perl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars",t="ARGV|ENV|INC|SIG",n="getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|getpeername|setpriority|getprotoent|setprotoent|getpriority|endprotoent|getservent|setservent|endservent|sethostent|socketpair|getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|map|die|uc|lc|do",r=this.createKeywordMapper({keyword:e,"constant.language":t,"support.function":n},"identifier");this.$rules={start:[{token:"comment.doc",regex:"^=(?:begin|item)\\b",next:"block_comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0x[0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"%#|\\$#|\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)"},{token:"comment",regex:"#.*$"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",regex:".+"}],block_comment:[{token:"comment.doc",regex:"^=cut\\b",next:"start"},{defaultToken:"comment.doc"}]}};r.inherits(s,i),t.PerlHighlightRules=s}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/perl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/perl_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./perl_highlight_rules").PerlHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./folding/cstyle").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u({start:"^=(begin|item)\\b",end:"^=(cut)\\b"}),this.$behaviour=this.$defaultBehaviour};r.inherits(a,i),function(){this.lineCommentStart="#",this.blockComment=[{start:"=begin",end:"=cut",lineStartOnly:!0},{start:"=item",end:"=cut",lineStartOnly:!0}],this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var o=t.match(/^.*[\{\(\[:]\s*$/);o&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/perl"}.call(a.prototype),t.Mode=a}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-php.js b/public/themes/panel/vendor/ace/mode-php.js deleted file mode 100644 index 0fc768d3c8..0000000000 --- a/public/themes/panel/vendor/ace/mode-php.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/php_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules","ace/mode/html_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./doc_comment_highlight_rules").DocCommentHighlightRules,o=e("./text_highlight_rules").TextHighlightRules,u=e("./html_highlight_rules").HtmlHighlightRules,a=function(){var e=s,t=i.arrayToMap("abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|class_parents|class_uses|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|get_declared_interfaces|get_declared_traits|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|m_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|m_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|m_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|m_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_affected_rows|mysqli_autocommit|mysqli_bind_param|mysqli_bind_result|mysqli_cache_stats|mysqli_change_user|mysqli_character_set_name|mysqli_client_encoding|mysqli_close|mysqli_commit|mysqli_connect|mysqli_connect_errno|mysqli_connect_error|mysqli_data_seek|mysqli_debug|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|mysqli_dump_debug_info|mysqli_embedded_server_end|mysqli_embedded_server_start|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_errno|mysqli_error|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_fetch_all|mysqli_fetch_array|mysqli_fetch_assoc|mysqli_fetch_field|mysqli_fetch_field_direct|mysqli_fetch_fields|mysqli_fetch_lengths|mysqli_fetch_object|mysqli_fetch_row|mysqli_field_count|mysqli_field_seek|mysqli_field_tell|mysqli_free_result|mysqli_get_charset|mysqli_get_client_info|mysqli_get_client_stats|mysqli_get_client_version|mysqli_get_connection_stats|mysqli_get_host_info|mysqli_get_metadata|mysqli_get_proto_info|mysqli_get_server_info|mysqli_get_server_version|mysqli_get_warnings|mysqli_info|mysqli_init|mysqli_insert_id|mysqli_kill|mysqli_link_construct|mysqli_master_query|mysqli_more_results|mysqli_multi_query|mysqli_next_result|mysqli_num_fields|mysqli_num_rows|mysqli_options|mysqli_param_count|mysqli_ping|mysqli_poll|mysqli_prepare|mysqli_query|mysqli_real_connect|mysqli_real_escape_string|mysqli_real_query|mysqli_reap_async_query|mysqli_refresh|mysqli_report|mysqli_result|mysqli_rollback|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_select_db|mysqli_send_long_data|mysqli_send_query|mysqli_set_charset|mysqli_set_local_infile_default|mysqli_set_local_infile_handler|mysqli_set_opt|mysqli_slave_query|mysqli_sqlstate|mysqli_ssl_set|mysqli_stat|mysqli_stmt|mysqli_stmt_affected_rows|mysqli_stmt_attr_get|mysqli_stmt_attr_set|mysqli_stmt_bind_param|mysqli_stmt_bind_result|mysqli_stmt_close|mysqli_stmt_data_seek|mysqli_stmt_errno|mysqli_stmt_error|mysqli_stmt_execute|mysqli_stmt_fetch|mysqli_stmt_field_count|mysqli_stmt_free_result|mysqli_stmt_get_result|mysqli_stmt_get_warnings|mysqli_stmt_init|mysqli_stmt_insert_id|mysqli_stmt_next_result|mysqli_stmt_num_rows|mysqli_stmt_param_count|mysqli_stmt_prepare|mysqli_stmt_reset|mysqli_stmt_result_metadata|mysqli_stmt_send_long_data|mysqli_stmt_sqlstate|mysqli_stmt_store_result|mysqli_store_result|mysqli_thread_id|mysqli_thread_safe|mysqli_use_result|mysqli_warning|mysqli_warning_count|mysqlnd_ms_get_stats|mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|trait_exists|transliterator|traversable|trigger_error|trim|uasort|ucfirst|ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type".split("|")),n=i.arrayToMap("abstract|and|array|as|break|case|catch|class|clone|const|continue|declare|default|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|final|for|foreach|function|global|goto|if|implements|interface|instanceof|namespace|new|or|private|protected|public|static|switch|throw|trait|try|use|var|while|xor".split("|")),r=i.arrayToMap("die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset".split("|")),o=i.arrayToMap("true|TRUE|false|FALSE|null|NULL|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__".split("|")),u=i.arrayToMap("$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|$http_response_header|$argc|$argv".split("|")),a=i.arrayToMap("key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregisterset_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|sql_regcase".split("|")),f=i.arrayToMap("cfunction|old_function".split("|")),l=i.arrayToMap([]);this.$rules={start:[{token:"comment",regex:/(?:#|\/\/)(?:[^?]|\?[^>])*/},e.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/][gimy]*\\s*(?=[).,;]|$)"},{token:"string",regex:'"',next:"qqstring"},{token:"string",regex:"'",next:"qstring"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language",regex:"\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|VERSION))|__COMPILER_HALT_OFFSET__)\\b"},{token:["keyword","text","support.class"],regex:"\\b(new)(\\s+)(\\w+)"},{token:["support.class","keyword.operator"],regex:"\\b(\\w+)(::)"},{token:"constant.language",regex:"\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\b"},{token:function(e){return n.hasOwnProperty(e)?"keyword":o.hasOwnProperty(e)?"constant.language":u.hasOwnProperty(e)?"variable.language":l.hasOwnProperty(e)?"invalid.illegal":t.hasOwnProperty(e)?"support.function":e=="debugger"?"invalid.deprecated":e.match(/^(\$[a-zA-Z_\x7f-\uffff][a-zA-Z0-9_\x7f-\uffff]*|self|parent)$/)?"variable":"identifier"},regex:/[a-zA-Z_$\x7f-\uffff][a-zA-Z0-9_\x7f-\uffff]*/},{onMatch:function(e,t,n){e=e.substr(3);if(e[0]=="'"||e[0]=='"')e=e.slice(1,-1);return n.unshift(this.next,e),"markup.list"},regex:/<<<(?:\w+|'\w+'|"\w+")$/,next:"heredoc"},{token:"keyword.operator",regex:"::|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|!=|!==|<=|>=|=>|<<=|>>=|>>>=|<>|<|>|=|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],heredoc:[{onMatch:function(e,t,n){return n[1]!=e?"string":(n.shift(),n.shift(),"markup.list")},regex:"^\\w+(?=;?$)",next:"start"},{token:"string",regex:".*"}],comment:[{token:"comment",regex:"\\*\\/",next:"start"},{defaultToken:"comment"}],qqstring:[{token:"constant.language.escape",regex:'\\\\(?:[nrtvef\\\\"$]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})'},{token:"variable",regex:/\$[\w]+(?:\[[\w\]+]|[=\-]>\w+)?/},{token:"variable",regex:/\$\{[^"\}]+\}?/},{token:"string",regex:'"',next:"start"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:/\\['\\]/},{token:"string",regex:"'",next:"start"},{defaultToken:"string"}]},this.embedRules(s,"doc-",[s.getEndRule("start")])};r.inherits(a,o);var f=function(){u.call(this);var e=[{token:"support.php_tag",regex:"<\\?(?:php|=)?",push:"php-start"}],t=[{token:"support.php_tag",regex:"\\?>",next:"pop"}];for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],e);this.embedRules(a,"php-",t,["start"]),this.normalizeRules()};r.inherits(f,u),t.PhpHighlightRules=f,t.PhpLangHighlightRules=a}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/php_completions",["require","exports","module"],function(e,t,n){"use strict";function s(e,t){return e.type.lastIndexOf(t)>-1}var r={abs:["int abs(int number)","Return the absolute value of the number"],acos:["float acos(float number)","Return the arc cosine of the number in radians"],acosh:["float acosh(float number)","Returns the inverse hyperbolic cosine of the number, i.e. the value whose hyperbolic cosine is number"],addGlob:["bool addGlob(string pattern[,int flags [, array options]])","Add files matching the glob pattern. See php's glob for the pattern syntax."],addPattern:["bool addPattern(string pattern[, string path [, array options]])","Add files matching the pcre pattern. See php's pcre for the pattern syntax."],addcslashes:["string addcslashes(string str, string charlist)","Escapes all chars mentioned in charlist with backslash. It creates octal representations if asked to backslash characters with 8th bit set or with ASCII<32 (except '\\n', '\\r', '\\t' etc...)"],addslashes:["string addslashes(string str)","Escapes single quote, double quotes and backslash characters in a string with backslashes"],apache_child_terminate:["bool apache_child_terminate(void)","Terminate apache process after this request"],apache_get_modules:["array apache_get_modules(void)","Get a list of loaded Apache modules"],apache_get_version:["string apache_get_version(void)","Fetch Apache version"],apache_getenv:["bool apache_getenv(string variable [, bool walk_to_top])","Get an Apache subprocess_env variable"],apache_lookup_uri:["object apache_lookup_uri(string URI)","Perform a partial request of the given URI to obtain information about it"],apache_note:["string apache_note(string note_name [, string note_value])","Get and set Apache request notes"],apache_request_auth_name:["string apache_request_auth_name()",""],apache_request_auth_type:["string apache_request_auth_type()",""],apache_request_discard_request_body:["long apache_request_discard_request_body()",""],apache_request_err_headers_out:["array apache_request_err_headers_out([{string name|array list} [, string value [, bool replace = false]]])","* fetch all headers that go out in case of an error or a subrequest"],apache_request_headers:["array apache_request_headers(void)","Fetch all HTTP request headers"],apache_request_headers_in:["array apache_request_headers_in()","* fetch all incoming request headers"],apache_request_headers_out:["array apache_request_headers_out([{string name|array list} [, string value [, bool replace = false]]])","* fetch all outgoing request headers"],apache_request_is_initial_req:["bool apache_request_is_initial_req()",""],apache_request_log_error:["boolean apache_request_log_error(string message, [long facility])",""],apache_request_meets_conditions:["long apache_request_meets_conditions()",""],apache_request_remote_host:["int apache_request_remote_host([int type])",""],apache_request_run:["long apache_request_run()","This is a wrapper for ap_sub_run_req and ap_destory_sub_req. It takes sub_request, runs it, destroys it, and returns it's status."],apache_request_satisfies:["long apache_request_satisfies()",""],apache_request_server_port:["int apache_request_server_port()",""],apache_request_set_etag:["void apache_request_set_etag()",""],apache_request_set_last_modified:["void apache_request_set_last_modified()",""],apache_request_some_auth_required:["bool apache_request_some_auth_required()",""],apache_request_sub_req_lookup_file:["object apache_request_sub_req_lookup_file(string file)","Returns sub-request for the specified file. You would need to run it yourself with run()."],apache_request_sub_req_lookup_uri:["object apache_request_sub_req_lookup_uri(string uri)","Returns sub-request for the specified uri. You would need to run it yourself with run()"],apache_request_sub_req_method_uri:["object apache_request_sub_req_method_uri(string method, string uri)","Returns sub-request for the specified file. You would need to run it yourself with run()."],apache_request_update_mtime:["long apache_request_update_mtime([int dependency_mtime])",""],apache_reset_timeout:["bool apache_reset_timeout(void)","Reset the Apache write timer"],apache_response_headers:["array apache_response_headers(void)","Fetch all HTTP response headers"],apache_setenv:["bool apache_setenv(string variable, string value [, bool walk_to_top])","Set an Apache subprocess_env variable"],array_change_key_case:["array array_change_key_case(array input [, int case=CASE_LOWER])","Retuns an array with all string keys lowercased [or uppercased]"],array_chunk:["array array_chunk(array input, int size [, bool preserve_keys])","Split array into chunks"],array_combine:["array array_combine(array keys, array values)","Creates an array by using the elements of the first parameter as keys and the elements of the second as the corresponding values"],array_count_values:["array array_count_values(array input)","Return the value as key and the frequency of that value in input as value"],array_diff:["array array_diff(array arr1, array arr2 [, array ...])","Returns the entries of arr1 that have values which are not present in any of the others arguments."],array_diff_assoc:["array array_diff_assoc(array arr1, array arr2 [, array ...])","Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal"],array_diff_key:["array array_diff_key(array arr1, array arr2 [, array ...])","Returns the entries of arr1 that have keys which are not present in any of the others arguments. This function is like array_diff() but works on the keys instead of the values. The associativity is preserved."],array_diff_uassoc:["array array_diff_uassoc(array arr1, array arr2 [, array ...], callback data_comp_func)","Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Elements are compared by user supplied function."],array_diff_ukey:["array array_diff_ukey(array arr1, array arr2 [, array ...], callback key_comp_func)","Returns the entries of arr1 that have keys which are not present in any of the others arguments. User supplied function is used for comparing the keys. This function is like array_udiff() but works on the keys instead of the values. The associativity is preserved."],array_fill:["array array_fill(int start_key, int num, mixed val)","Create an array containing num elements starting with index start_key each initialized to val"],array_fill_keys:["array array_fill_keys(array keys, mixed val)","Create an array using the elements of the first parameter as keys each initialized to val"],array_filter:["array array_filter(array input [, mixed callback])","Filters elements from the array via the callback."],array_flip:["array array_flip(array input)","Return array with key <-> value flipped"],array_intersect:["array array_intersect(array arr1, array arr2 [, array ...])","Returns the entries of arr1 that have values which are present in all the other arguments"],array_intersect_assoc:["array array_intersect_assoc(array arr1, array arr2 [, array ...])","Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check"],array_intersect_key:["array array_intersect_key(array arr1, array arr2 [, array ...])","Returns the entries of arr1 that have keys which are present in all the other arguments. Kind of equivalent to array_diff(array_keys($arr1), array_keys($arr2)[,array_keys(...)]). Equivalent of array_intersect_assoc() but does not do compare of the data."],array_intersect_uassoc:["array array_intersect_uassoc(array arr1, array arr2 [, array ...], callback key_compare_func)","Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check and they are compared by using an user-supplied callback."],array_intersect_ukey:["array array_intersect_ukey(array arr1, array arr2 [, array ...], callback key_compare_func)","Returns the entries of arr1 that have keys which are present in all the other arguments. Kind of equivalent to array_diff(array_keys($arr1), array_keys($arr2)[,array_keys(...)]). The comparison of the keys is performed by a user supplied function. Equivalent of array_intersect_uassoc() but does not do compare of the data."],array_key_exists:["bool array_key_exists(mixed key, array search)","Checks if the given key or index exists in the array"],array_keys:["array array_keys(array input [, mixed search_value[, bool strict]])","Return just the keys from the input array, optionally only for the specified search_value"],array_map:["array array_map(mixed callback, array input1 [, array input2 ,...])","Applies the callback to the elements in given arrays."],array_merge:["array array_merge(array arr1, array arr2 [, array ...])","Merges elements from passed arrays into one array"],array_merge_recursive:["array array_merge_recursive(array arr1, array arr2 [, array ...])","Recursively merges elements from passed arrays into one array"],array_multisort:["bool array_multisort(array ar1 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]] [, array ar2 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]], ...])","Sort multiple arrays at once similar to how ORDER BY clause works in SQL"],array_pad:["array array_pad(array input, int pad_size, mixed pad_value)","Returns a copy of input array padded with pad_value to size pad_size"],array_pop:["mixed array_pop(array stack)","Pops an element off the end of the array"],array_product:["mixed array_product(array input)","Returns the product of the array entries"],array_push:["int array_push(array stack, mixed var [, mixed ...])","Pushes elements onto the end of the array"],array_rand:["mixed array_rand(array input [, int num_req])","Return key/keys for random entry/entries in the array"],array_reduce:["mixed array_reduce(array input, mixed callback [, mixed initial])","Iteratively reduce the array to a single value via the callback."],array_replace:["array array_replace(array arr1, array arr2 [, array ...])","Replaces elements from passed arrays into one array"],array_replace_recursive:["array array_replace_recursive(array arr1, array arr2 [, array ...])","Recursively replaces elements from passed arrays into one array"],array_reverse:["array array_reverse(array input [, bool preserve keys])","Return input as a new array with the order of the entries reversed"],array_search:["mixed array_search(mixed needle, array haystack [, bool strict])","Searches the array for a given value and returns the corresponding key if successful"],array_shift:["mixed array_shift(array stack)","Pops an element off the beginning of the array"],array_slice:["array array_slice(array input, int offset [, int length [, bool preserve_keys]])","Returns elements specified by offset and length"],array_splice:["array array_splice(array input, int offset [, int length [, array replacement]])","Removes the elements designated by offset and length and replace them with supplied array"],array_sum:["mixed array_sum(array input)","Returns the sum of the array entries"],array_udiff:["array array_udiff(array arr1, array arr2 [, array ...], callback data_comp_func)","Returns the entries of arr1 that have values which are not present in any of the others arguments. Elements are compared by user supplied function."],array_udiff_assoc:["array array_udiff_assoc(array arr1, array arr2 [, array ...], callback key_comp_func)","Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Keys are compared by user supplied function."],array_udiff_uassoc:["array array_udiff_uassoc(array arr1, array arr2 [, array ...], callback data_comp_func, callback key_comp_func)","Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Keys and elements are compared by user supplied functions."],array_uintersect:["array array_uintersect(array arr1, array arr2 [, array ...], callback data_compare_func)","Returns the entries of arr1 that have values which are present in all the other arguments. Data is compared by using an user-supplied callback."],array_uintersect_assoc:["array array_uintersect_assoc(array arr1, array arr2 [, array ...], callback data_compare_func)","Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check. Data is compared by using an user-supplied callback."],array_uintersect_uassoc:["array array_uintersect_uassoc(array arr1, array arr2 [, array ...], callback data_compare_func, callback key_compare_func)","Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check. Both data and keys are compared by using user-supplied callbacks."],array_unique:["array array_unique(array input [, int sort_flags])","Removes duplicate values from array"],array_unshift:["int array_unshift(array stack, mixed var [, mixed ...])","Pushes elements onto the beginning of the array"],array_values:["array array_values(array input)","Return just the values from the input array"],array_walk:["bool array_walk(array input, string funcname [, mixed userdata])","Apply a user function to every member of an array"],array_walk_recursive:["bool array_walk_recursive(array input, string funcname [, mixed userdata])","Apply a user function recursively to every member of an array"],arsort:["bool arsort(array &array_arg [, int sort_flags])","Sort an array in reverse order and maintain index association"],asin:["float asin(float number)","Returns the arc sine of the number in radians"],asinh:["float asinh(float number)","Returns the inverse hyperbolic sine of the number, i.e. the value whose hyperbolic sine is number"],asort:["bool asort(array &array_arg [, int sort_flags])","Sort an array and maintain index association"],assert:["int assert(string|bool assertion)","Checks if assertion is false"],assert_options:["mixed assert_options(int what [, mixed value])","Set/get the various assert flags"],atan:["float atan(float number)","Returns the arc tangent of the number in radians"],atan2:["float atan2(float y, float x)","Returns the arc tangent of y/x, with the resulting quadrant determined by the signs of y and x"],atanh:["float atanh(float number)","Returns the inverse hyperbolic tangent of the number, i.e. the value whose hyperbolic tangent is number"],attachIterator:["void attachIterator(Iterator iterator[, mixed info])","Attach a new iterator"],base64_decode:["string base64_decode(string str[, bool strict])","Decodes string using MIME base64 algorithm"],base64_encode:["string base64_encode(string str)","Encodes string using MIME base64 algorithm"],base_convert:["string base_convert(string number, int frombase, int tobase)","Converts a number in a string from any base <= 36 to any base <= 36"],basename:["string basename(string path [, string suffix])","Returns the filename component of the path"],bcadd:["string bcadd(string left_operand, string right_operand [, int scale])","Returns the sum of two arbitrary precision numbers"],bccomp:["int bccomp(string left_operand, string right_operand [, int scale])","Compares two arbitrary precision numbers"],bcdiv:["string bcdiv(string left_operand, string right_operand [, int scale])","Returns the quotient of two arbitrary precision numbers (division)"],bcmod:["string bcmod(string left_operand, string right_operand)","Returns the modulus of the two arbitrary precision operands"],bcmul:["string bcmul(string left_operand, string right_operand [, int scale])","Returns the multiplication of two arbitrary precision numbers"],bcpow:["string bcpow(string x, string y [, int scale])","Returns the value of an arbitrary precision number raised to the power of another"],bcpowmod:["string bcpowmod(string x, string y, string mod [, int scale])","Returns the value of an arbitrary precision number raised to the power of another reduced by a modulous"],bcscale:["bool bcscale(int scale)","Sets default scale parameter for all bc math functions"],bcsqrt:["string bcsqrt(string operand [, int scale])","Returns the square root of an arbitray precision number"],bcsub:["string bcsub(string left_operand, string right_operand [, int scale])","Returns the difference between two arbitrary precision numbers"],bin2hex:["string bin2hex(string data)","Converts the binary representation of data to hex"],bind_textdomain_codeset:["string bind_textdomain_codeset (string domain, string codeset)","Specify the character encoding in which the messages from the DOMAIN message catalog will be returned."],bindec:["int bindec(string binary_number)","Returns the decimal equivalent of the binary number"],bindtextdomain:["string bindtextdomain(string domain_name, string dir)","Bind to the text domain domain_name, looking for translations in dir. Returns the current domain"],birdstep_autocommit:["bool birdstep_autocommit(int index)",""],birdstep_close:["bool birdstep_close(int id)",""],birdstep_commit:["bool birdstep_commit(int index)",""],birdstep_connect:["int birdstep_connect(string server, string user, string pass)",""],birdstep_exec:["int birdstep_exec(int index, string exec_str)",""],birdstep_fetch:["bool birdstep_fetch(int index)",""],birdstep_fieldname:["string birdstep_fieldname(int index, int col)",""],birdstep_fieldnum:["int birdstep_fieldnum(int index)",""],birdstep_freeresult:["bool birdstep_freeresult(int index)",""],birdstep_off_autocommit:["bool birdstep_off_autocommit(int index)",""],birdstep_result:["mixed birdstep_result(int index, mixed col)",""],birdstep_rollback:["bool birdstep_rollback(int index)",""],bzcompress:["string bzcompress(string source [, int blocksize100k [, int workfactor]])","Compresses a string into BZip2 encoded data"],bzdecompress:["string bzdecompress(string source [, int small])","Decompresses BZip2 compressed data"],bzerrno:["int bzerrno(resource bz)","Returns the error number"],bzerror:["array bzerror(resource bz)","Returns the error number and error string in an associative array"],bzerrstr:["string bzerrstr(resource bz)","Returns the error string"],bzopen:["resource bzopen(string|int file|fp, string mode)","Opens a new BZip2 stream"],bzread:["string bzread(resource bz[, int length])","Reads up to length bytes from a BZip2 stream, or 1024 bytes if length is not specified"],cal_days_in_month:["int cal_days_in_month(int calendar, int month, int year)","Returns the number of days in a month for a given year and calendar"],cal_from_jd:["array cal_from_jd(int jd, int calendar)","Converts from Julian Day Count to a supported calendar and return extended information"],cal_info:["array cal_info([int calendar])","Returns information about a particular calendar"],cal_to_jd:["int cal_to_jd(int calendar, int month, int day, int year)","Converts from a supported calendar to Julian Day Count"],call_user_func:["mixed call_user_func(mixed function_name [, mixed parmeter] [, mixed ...])","Call a user function which is the first parameter"],call_user_func_array:["mixed call_user_func_array(string function_name, array parameters)","Call a user function which is the first parameter with the arguments contained in array"],call_user_method:["mixed call_user_method(string method_name, mixed object [, mixed parameter] [, mixed ...])","Call a user method on a specific object or class"],call_user_method_array:["mixed call_user_method_array(string method_name, mixed object, array params)","Call a user method on a specific object or class using a parameter array"],ceil:["float ceil(float number)","Returns the next highest integer value of the number"],chdir:["bool chdir(string directory)","Change the current directory"],checkdate:["bool checkdate(int month, int day, int year)","Returns true(1) if it is a valid date in gregorian calendar"],chgrp:["bool chgrp(string filename, mixed group)","Change file group"],chmod:["bool chmod(string filename, int mode)","Change file mode"],chown:["bool chown (string filename, mixed user)","Change file owner"],chr:["string chr(int ascii)","Converts ASCII code to a character"],chroot:["bool chroot(string directory)","Change root directory"],chunk_split:["string chunk_split(string str [, int chunklen [, string ending]])","Returns split line"],class_alias:["bool class_alias(string user_class_name , string alias_name [, bool autoload])","Creates an alias for user defined class"],class_exists:["bool class_exists(string classname [, bool autoload])","Checks if the class exists"],class_implements:["array class_implements(mixed what [, bool autoload ])","Return all classes and interfaces implemented by SPL"],class_parents:["array class_parents(object instance [, boolean autoload = true])","Return an array containing the names of all parent classes"],clearstatcache:["void clearstatcache([bool clear_realpath_cache[, string filename]])","Clear file stat cache"],closedir:["void closedir([resource dir_handle])","Close directory connection identified by the dir_handle"],closelog:["bool closelog(void)","Close connection to system logger"],collator_asort:["bool collator_asort( Collator $coll, array(string) $arr )","* Sort array using specified collator, maintaining index association."],collator_compare:["int collator_compare( Collator $coll, string $str1, string $str2 )","* Compare two strings."],collator_create:["Collator collator_create( string $locale )","* Create collator."],collator_get_attribute:["int collator_get_attribute( Collator $coll, int $attr )","* Get collation attribute value."],collator_get_error_code:["int collator_get_error_code( Collator $coll )","* Get collator's last error code."],collator_get_error_message:["string collator_get_error_message( Collator $coll )","* Get text description for collator's last error code."],collator_get_locale:["string collator_get_locale( Collator $coll, int $type )","* Gets the locale name of the collator."],collator_get_sort_key:["bool collator_get_sort_key( Collator $coll, string $str )","* Get a sort key for a string from a Collator. }}}"],collator_get_strength:["int collator_get_strength(Collator coll)","* Returns the current collation strength."],collator_set_attribute:["bool collator_set_attribute( Collator $coll, int $attr, int $val )","* Set collation attribute."],collator_set_strength:["bool collator_set_strength(Collator coll, int strength)","* Set the collation strength."],collator_sort:["bool collator_sort( Collator $coll, array(string) $arr [, int $sort_flags] )","* Sort array using specified collator."],collator_sort_with_sort_keys:["bool collator_sort_with_sort_keys( Collator $coll, array(string) $arr )","* Equivalent to standard PHP sort using Collator. * Uses ICU ucol_getSortKey for performance."],com_create_guid:["string com_create_guid()","Generate a globally unique identifier (GUID)"],com_event_sink:["bool com_event_sink(object comobject, object sinkobject [, mixed sinkinterface])","Connect events from a COM object to a PHP object"],com_get_active_object:["object com_get_active_object(string progid [, int code_page ])","Returns a handle to an already running instance of a COM object"],com_load_typelib:["bool com_load_typelib(string typelib_name [, int case_insensitive])","Loads a Typelibrary and registers its constants"],com_message_pump:["bool com_message_pump([int timeoutms])","Process COM messages, sleeping for up to timeoutms milliseconds"],com_print_typeinfo:["bool com_print_typeinfo(object comobject | string typelib, string dispinterface, bool wantsink)","Print out a PHP class definition for a dispatchable interface"],compact:["array compact(mixed var_names [, mixed ...])","Creates a hash containing variables and their values"],compose_locale:["static string compose_locale($array)","* Creates a locale by combining the parts of locale-ID passed * }}}"],confirm_extname_compiled:["string confirm_extname_compiled(string arg)","Return a string to confirm that the module is compiled in"],connection_aborted:["int connection_aborted(void)","Returns true if client disconnected"],connection_status:["int connection_status(void)","Returns the connection status bitfield"],constant:["mixed constant(string const_name)","Given the name of a constant this function will return the constant's associated value"],convert_cyr_string:["string convert_cyr_string(string str, string from, string to)","Convert from one Cyrillic character set to another"],convert_uudecode:["string convert_uudecode(string data)","decode a uuencoded string"],convert_uuencode:["string convert_uuencode(string data)","uuencode a string"],copy:["bool copy(string source_file, string destination_file [, resource context])","Copy a file"],cos:["float cos(float number)","Returns the cosine of the number in radians"],cosh:["float cosh(float number)","Returns the hyperbolic cosine of the number, defined as (exp(number) + exp(-number))/2"],count:["int count(mixed var [, int mode])","Count the number of elements in a variable (usually an array)"],count_chars:["mixed count_chars(string input [, int mode])","Returns info about what characters are used in input"],crc32:["string crc32(string str)","Calculate the crc32 polynomial of a string"],create_function:["string create_function(string args, string code)","Creates an anonymous function, and returns its name (funny, eh?)"],crypt:["string crypt(string str [, string salt])","Hash a string"],ctype_alnum:["bool ctype_alnum(mixed c)","Checks for alphanumeric character(s)"],ctype_alpha:["bool ctype_alpha(mixed c)","Checks for alphabetic character(s)"],ctype_cntrl:["bool ctype_cntrl(mixed c)","Checks for control character(s)"],ctype_digit:["bool ctype_digit(mixed c)","Checks for numeric character(s)"],ctype_graph:["bool ctype_graph(mixed c)","Checks for any printable character(s) except space"],ctype_lower:["bool ctype_lower(mixed c)","Checks for lowercase character(s)"],ctype_print:["bool ctype_print(mixed c)","Checks for printable character(s)"],ctype_punct:["bool ctype_punct(mixed c)","Checks for any printable character which is not whitespace or an alphanumeric character"],ctype_space:["bool ctype_space(mixed c)","Checks for whitespace character(s)"],ctype_upper:["bool ctype_upper(mixed c)","Checks for uppercase character(s)"],ctype_xdigit:["bool ctype_xdigit(mixed c)","Checks for character(s) representing a hexadecimal digit"],curl_close:["void curl_close(resource ch)","Close a cURL session"],curl_copy_handle:["resource curl_copy_handle(resource ch)","Copy a cURL handle along with all of it's preferences"],curl_errno:["int curl_errno(resource ch)","Return an integer containing the last error number"],curl_error:["string curl_error(resource ch)","Return a string contain the last error for the current session"],curl_exec:["bool curl_exec(resource ch)","Perform a cURL session"],curl_getinfo:["mixed curl_getinfo(resource ch [, int option])","Get information regarding a specific transfer"],curl_init:["resource curl_init([string url])","Initialize a cURL session"],curl_multi_add_handle:["int curl_multi_add_handle(resource mh, resource ch)","Add a normal cURL handle to a cURL multi handle"],curl_multi_close:["void curl_multi_close(resource mh)","Close a set of cURL handles"],curl_multi_exec:["int curl_multi_exec(resource mh, int &still_running)","Run the sub-connections of the current cURL handle"],curl_multi_getcontent:["string curl_multi_getcontent(resource ch)","Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set"],curl_multi_info_read:["array curl_multi_info_read(resource mh [, long msgs_in_queue])","Get information about the current transfers"],curl_multi_init:["resource curl_multi_init(void)","Returns a new cURL multi handle"],curl_multi_remove_handle:["int curl_multi_remove_handle(resource mh, resource ch)","Remove a multi handle from a set of cURL handles"],curl_multi_select:["int curl_multi_select(resource mh[, double timeout])",'Get all the sockets associated with the cURL extension, which can then be "selected"'],curl_setopt:["bool curl_setopt(resource ch, int option, mixed value)","Set an option for a cURL transfer"],curl_setopt_array:["bool curl_setopt_array(resource ch, array options)","Set an array of option for a cURL transfer"],curl_version:["array curl_version([int version])","Return cURL version information."],current:["mixed current(array array_arg)","Return the element currently pointed to by the internal array pointer"],date:["string date(string format [, long timestamp])","Format a local date/time"],date_add:["DateTime date_add(DateTime object, DateInterval interval)","Adds an interval to the current date in object."],date_create:["DateTime date_create([string time[, DateTimeZone object]])","Returns new DateTime object"],date_create_from_format:["DateTime date_create_from_format(string format, string time[, DateTimeZone object])","Returns new DateTime object formatted according to the specified format"],date_date_set:["DateTime date_date_set(DateTime object, long year, long month, long day)","Sets the date."],date_default_timezone_get:["string date_default_timezone_get()","Gets the default timezone used by all date/time functions in a script"],date_default_timezone_set:["bool date_default_timezone_set(string timezone_identifier)","Sets the default timezone used by all date/time functions in a script"],date_diff:["DateInterval date_diff(DateTime object [, bool absolute])","Returns the difference between two DateTime objects."],date_format:["string date_format(DateTime object, string format)","Returns date formatted according to given format"],date_get_last_errors:["array date_get_last_errors()","Returns the warnings and errors found while parsing a date/time string."],date_interval_create_from_date_string:["DateInterval date_interval_create_from_date_string(string time)","Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string"],date_interval_format:["string date_interval_format(DateInterval object, string format)","Formats the interval."],date_isodate_set:["DateTime date_isodate_set(DateTime object, long year, long week[, long day])","Sets the ISO date."],date_modify:["DateTime date_modify(DateTime object, string modify)","Alters the timestamp."],date_offset_get:["long date_offset_get(DateTime object)","Returns the DST offset."],date_parse:["array date_parse(string date)","Returns associative array with detailed info about given date"],date_parse_from_format:["array date_parse_from_format(string format, string date)","Returns associative array with detailed info about given date"],date_sub:["DateTime date_sub(DateTime object, DateInterval interval)","Subtracts an interval to the current date in object."],date_sun_info:["array date_sun_info(long time, float latitude, float longitude)","Returns an array with information about sun set/rise and twilight begin/end"],date_sunrise:["mixed date_sunrise(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])","Returns time of sunrise for a given day and location"],date_sunset:["mixed date_sunset(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])","Returns time of sunset for a given day and location"],date_time_set:["DateTime date_time_set(DateTime object, long hour, long minute[, long second])","Sets the time."],date_timestamp_get:["long date_timestamp_get(DateTime object)","Gets the Unix timestamp."],date_timestamp_set:["DateTime date_timestamp_set(DateTime object, long unixTimestamp)","Sets the date and time based on an Unix timestamp."],date_timezone_get:["DateTimeZone date_timezone_get(DateTime object)","Return new DateTimeZone object relative to give DateTime"],date_timezone_set:["DateTime date_timezone_set(DateTime object, DateTimeZone object)","Sets the timezone for the DateTime object."],datefmt_create:["IntlDateFormatter datefmt_create(string $locale, long date_type, long time_type[, string $timezone_str, long $calendar, string $pattern] )","* Create formatter."],datefmt_format:["string datefmt_format( [mixed]int $args or array $args )","* Format the time value as a string. }}}"],datefmt_get_calendar:["string datefmt_get_calendar( IntlDateFormatter $mf )","* Get formatter calendar."],datefmt_get_datetype:["string datefmt_get_datetype( IntlDateFormatter $mf )","* Get formatter datetype."],datefmt_get_error_code:["int datefmt_get_error_code( IntlDateFormatter $nf )","* Get formatter's last error code."],datefmt_get_error_message:["string datefmt_get_error_message( IntlDateFormatter $coll )","* Get text description for formatter's last error code."],datefmt_get_locale:["string datefmt_get_locale(IntlDateFormatter $mf)","* Get formatter locale."],datefmt_get_pattern:["string datefmt_get_pattern( IntlDateFormatter $mf )","* Get formatter pattern."],datefmt_get_timetype:["string datefmt_get_timetype( IntlDateFormatter $mf )","* Get formatter timetype."],datefmt_get_timezone_id:["string datefmt_get_timezone_id( IntlDateFormatter $mf )","* Get formatter timezone_id."],datefmt_isLenient:["string datefmt_isLenient(IntlDateFormatter $mf)","* Get formatter locale."],datefmt_localtime:["integer datefmt_localtime( IntlDateFormatter $fmt, string $text_to_parse[, int $parse_pos ])","* Parse the string $value to a localtime array }}}"],datefmt_parse:["integer datefmt_parse( IntlDateFormatter $fmt, string $text_to_parse [, int $parse_pos] )","* Parse the string $value starting at parse_pos to a Unix timestamp -int }}}"],datefmt_setLenient:["string datefmt_setLenient(IntlDateFormatter $mf)","* Set formatter lenient."],datefmt_set_calendar:["bool datefmt_set_calendar( IntlDateFormatter $mf, int $calendar )","* Set formatter calendar."],datefmt_set_pattern:["bool datefmt_set_pattern( IntlDateFormatter $mf, string $pattern )","* Set formatter pattern."],datefmt_set_timezone_id:["boolean datefmt_set_timezone_id( IntlDateFormatter $mf,$timezone_id)","* Set formatter timezone_id."],dba_close:["void dba_close(resource handle)","Closes database"],dba_delete:["bool dba_delete(string key, resource handle)","Deletes the entry associated with key If inifile: remove all other key lines"],dba_exists:["bool dba_exists(string key, resource handle)","Checks, if the specified key exists"],dba_fetch:["string dba_fetch(string key, [int skip ,] resource handle)","Fetches the data associated with key"],dba_firstkey:["string dba_firstkey(resource handle)","Resets the internal key pointer and returns the first key"],dba_handlers:["array dba_handlers([bool full_info])","List configured database handlers"],dba_insert:["bool dba_insert(string key, string value, resource handle)","If not inifile: Insert value as key, return false, if key exists already If inifile: Add vakue as key (next instance of key)"],dba_key_split:["array|false dba_key_split(string key)","Splits an inifile key into an array of the form array(0=>group,1=>value_name) but returns false if input is false or null"],dba_list:["array dba_list()","List opened databases"],dba_nextkey:["string dba_nextkey(resource handle)","Returns the next key"],dba_open:["resource dba_open(string path, string mode [, string handlername, string ...])","Opens path using the specified handler in mode"],dba_optimize:["bool dba_optimize(resource handle)","Optimizes (e.g. clean up, vacuum) database"],dba_popen:["resource dba_popen(string path, string mode [, string handlername, string ...])","Opens path using the specified handler in mode persistently"],dba_replace:["bool dba_replace(string key, string value, resource handle)","Inserts value as key, replaces key, if key exists already If inifile: remove all other key lines"],dba_sync:["bool dba_sync(resource handle)","Synchronizes database"],dcgettext:["string dcgettext(string domain_name, string msgid, long category)","Return the translation of msgid for domain_name and category, or msgid unaltered if a translation does not exist"],dcngettext:["string dcngettext (string domain, string msgid1, string msgid2, int n, int category)","Plural version of dcgettext()"],debug_backtrace:["array debug_backtrace([bool provide_object])","Return backtrace as array"],debug_print_backtrace:["void debug_print_backtrace(void) */","ZEND_FUNCTION(debug_print_backtrace) { zend_execute_data *ptr, *skip; int lineno; char *function_name; char *filename; char *class_name = NULL; char *call_type; char *include_filename = NULL; zval *arg_array = NULL; int indent = 0; if (zend_parse_parameters_none() == FAILURE) { return; } ptr = EG(current_execute_data);","PHP_FUNCTION(dom_document_relaxNG_validate_file) { _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE); } /* }}} end dom_document_relaxNG_validate_file"],dom_document_relaxNG_validate_xml:["boolean dom_document_relaxNG_validate_xml(string source); */","PHP_FUNCTION(dom_document_relaxNG_validate_xml) { _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING); } /* }}} end dom_document_relaxNG_validate_xml"],dom_document_rename_node:["DOMNode dom_document_rename_node(node n, string namespaceURI, string qualifiedName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-renameNode Since: DOM Level 3"],dom_document_save:["int dom_document_save(string file);","Convenience method to save to file"],dom_document_save_html:["string dom_document_save_html();","Convenience method to output as html"],dom_document_save_html_file:["int dom_document_save_html_file(string file);","Convenience method to save to file as html"],dom_document_savexml:["string dom_document_savexml([node n]);","URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-saveXML Since: DOM Level 3"],dom_document_schema_validate:["boolean dom_document_schema_validate(string source); */","PHP_FUNCTION(dom_document_schema_validate_xml) { _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING); } /* }}} end dom_document_schema_validate"],dom_document_schema_validate_file:["boolean dom_document_schema_validate_file(string filename); */","PHP_FUNCTION(dom_document_schema_validate_file) { _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE); } /* }}} end dom_document_schema_validate_file"],dom_document_validate:["boolean dom_document_validate();","Since: DOM extended"],dom_document_xinclude:["int dom_document_xinclude([int options])","Substitutues xincludes in a DomDocument"],dom_domconfiguration_can_set_parameter:["boolean dom_domconfiguration_can_set_parameter(string name, domuserdata value);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-canSetParameter Since:"],dom_domconfiguration_get_parameter:["domdomuserdata dom_domconfiguration_get_parameter(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-getParameter Since:"],dom_domconfiguration_set_parameter:["dom_void dom_domconfiguration_set_parameter(string name, domuserdata value);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-property Since:"],dom_domerrorhandler_handle_error:["dom_boolean dom_domerrorhandler_handle_error(domerror error);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-ERRORS-DOMErrorHandler-handleError Since:"],dom_domimplementation_create_document:["DOMDocument dom_domimplementation_create_document(string namespaceURI, string qualifiedName, DOMDocumentType doctype);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocument Since: DOM Level 2"],dom_domimplementation_create_document_type:["DOMDocumentType dom_domimplementation_create_document_type(string qualifiedName, string publicId, string systemId);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocType Since: DOM Level 2"],dom_domimplementation_get_feature:["DOMNode dom_domimplementation_get_feature(string feature, string version);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementation3-getFeature Since: DOM Level 3"],dom_domimplementation_has_feature:["boolean dom_domimplementation_has_feature(string feature, string version);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-5CED94D7 Since:"],dom_domimplementationlist_item:["domdomimplementation dom_domimplementationlist_item(int index);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationList-item Since:"],dom_domimplementationsource_get_domimplementation:["domdomimplementation dom_domimplementationsource_get_domimplementation(string features);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpl Since:"],dom_domimplementationsource_get_domimplementations:["domimplementationlist dom_domimplementationsource_get_domimplementations(string features);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpls Since:"],dom_domstringlist_item:["domstring dom_domstringlist_item(int index);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMStringList-item Since:"],dom_element_get_attribute:["string dom_element_get_attribute(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9 Since:"],dom_element_get_attribute_node:["DOMAttr dom_element_get_attribute_node(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-217A91B8 Since:"],dom_element_get_attribute_node_ns:["DOMAttr dom_element_get_attribute_node_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAtNodeNS Since: DOM Level 2"],dom_element_get_attribute_ns:["string dom_element_get_attribute_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAttrNS Since: DOM Level 2"],dom_element_get_elements_by_tag_name:["DOMNodeList dom_element_get_elements_by_tag_name(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1938918D Since:"],dom_element_get_elements_by_tag_name_ns:["DOMNodeList dom_element_get_elements_by_tag_name_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C90942 Since: DOM Level 2"],dom_element_has_attribute:["boolean dom_element_has_attribute(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttr Since: DOM Level 2"],dom_element_has_attribute_ns:["boolean dom_element_has_attribute_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttrNS Since: DOM Level 2"],dom_element_remove_attribute:["void dom_element_remove_attribute(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9 Since:"],dom_element_remove_attribute_node:["DOMAttr dom_element_remove_attribute_node(DOMAttr oldAttr);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D589198 Since:"],dom_element_remove_attribute_ns:["void dom_element_remove_attribute_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElRemAtNS Since: DOM Level 2"],dom_element_set_attribute:["void dom_element_set_attribute(string name, string value);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082 Since:"],dom_element_set_attribute_node:["DOMAttr dom_element_set_attribute_node(DOMAttr newAttr);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-887236154 Since:"],dom_element_set_attribute_node_ns:["DOMAttr dom_element_set_attribute_node_ns(DOMAttr newAttr);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAtNodeNS Since: DOM Level 2"],dom_element_set_attribute_ns:["void dom_element_set_attribute_ns(string namespaceURI, string qualifiedName, string value);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAttrNS Since: DOM Level 2"],dom_element_set_id_attribute:["void dom_element_set_id_attribute(string name, boolean isId);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttr Since: DOM Level 3"],dom_element_set_id_attribute_node:["void dom_element_set_id_attribute_node(attr idAttr, boolean isId);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNode Since: DOM Level 3"],dom_element_set_id_attribute_ns:["void dom_element_set_id_attribute_ns(string namespaceURI, string localName, boolean isId);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNS Since: DOM Level 3"],dom_import_simplexml:["somNode dom_import_simplexml(sxeobject node)","Get a simplexml_element object from dom to allow for processing"],dom_namednodemap_get_named_item:["DOMNode dom_namednodemap_get_named_item(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549 Since:"],dom_namednodemap_get_named_item_ns:["DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS Since: DOM Level 2"],dom_namednodemap_item:["DOMNode dom_namednodemap_item(int index);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9 Since:"],dom_namednodemap_remove_named_item:["DOMNode dom_namednodemap_remove_named_item(string name);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193 Since:"],dom_namednodemap_remove_named_item_ns:["DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS Since: DOM Level 2"],dom_namednodemap_set_named_item:["DOMNode dom_namednodemap_set_named_item(DOMNode arg);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788 Since:"],dom_namednodemap_set_named_item_ns:["DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS Since: DOM Level 2"],dom_namelist_get_name:["string dom_namelist_get_name(int index);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getName Since:"],dom_namelist_get_namespace_uri:["string dom_namelist_get_namespace_uri(int index);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getNamespaceURI Since:"],dom_node_append_child:["DomNode dom_node_append_child(DomNode newChild);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107 Since:"],dom_node_clone_node:["DomNode dom_node_clone_node(boolean deep);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4 Since:"],dom_node_compare_document_position:["short dom_node_compare_document_position(DomNode other);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-compareDocumentPosition Since: DOM Level 3"],dom_node_get_feature:["DomNode dom_node_get_feature(string feature, string version);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getFeature Since: DOM Level 3"],dom_node_get_user_data:["mixed dom_node_get_user_data(string key);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData Since: DOM Level 3"],dom_node_has_attributes:["boolean dom_node_has_attributes();","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs Since: DOM Level 2"],dom_node_has_child_nodes:["boolean dom_node_has_child_nodes();","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187 Since:"],dom_node_insert_before:["domnode dom_node_insert_before(DomNode newChild, DomNode refChild);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727 Since:"],dom_node_is_default_namespace:["boolean dom_node_is_default_namespace(string namespaceURI);","URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace Since: DOM Level 3"],dom_node_is_equal_node:["boolean dom_node_is_equal_node(DomNode arg);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isEqualNode Since: DOM Level 3"],dom_node_is_same_node:["boolean dom_node_is_same_node(DomNode other);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode Since: DOM Level 3"],dom_node_is_supported:["boolean dom_node_is_supported(string feature, string version);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports Since: DOM Level 2"],dom_node_lookup_namespace_uri:["string dom_node_lookup_namespace_uri(string prefix);","URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI Since: DOM Level 3"],dom_node_lookup_prefix:["string dom_node_lookup_prefix(string namespaceURI);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix Since: DOM Level 3"],dom_node_normalize:["void dom_node_normalize();","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize Since:"],dom_node_remove_child:["DomNode dom_node_remove_child(DomNode oldChild);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066 Since:"],dom_node_replace_child:["DomNode dom_node_replace_child(DomNode newChild, DomNode oldChild);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307 Since:"],dom_node_set_user_data:["mixed dom_node_set_user_data(string key, mixed data, userdatahandler handler);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData Since: DOM Level 3"],dom_nodelist_item:["DOMNode dom_nodelist_item(int index);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-844377136 Since:"],dom_string_extend_find_offset16:["int dom_string_extend_find_offset16(int offset32);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset16 Since:"],dom_string_extend_find_offset32:["int dom_string_extend_find_offset32(int offset16);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset32 Since:"],dom_text_is_whitespace_in_element_content:["boolean dom_text_is_whitespace_in_element_content();","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Text3-isWhitespaceInElementContent Since: DOM Level 3"],dom_text_replace_whole_text:["DOMText dom_text_replace_whole_text(string content);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Text3-replaceWholeText Since: DOM Level 3"],dom_text_split_text:["DOMText dom_text_split_text(int offset);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-38853C1D Since:"],dom_userdatahandler_handle:["dom_void dom_userdatahandler_handle(short operation, string key, domobject data, node src, node dst);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-handleUserDataEvent Since:"],dom_xpath_evaluate:["mixed dom_xpath_evaluate(string expr [,DOMNode context]); */","PHP_FUNCTION(dom_xpath_evaluate) { php_xpath_eval(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_DOM_XPATH_EVALUATE); } /* }}} end dom_xpath_evaluate"],dom_xpath_query:["DOMNodeList dom_xpath_query(string expr [,DOMNode context]); */","PHP_FUNCTION(dom_xpath_query) { php_xpath_eval(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_DOM_XPATH_QUERY); } /* }}} end dom_xpath_query"],dom_xpath_register_ns:["boolean dom_xpath_register_ns(string prefix, string uri); */",'PHP_FUNCTION(dom_xpath_register_ns) { zval *id; xmlXPathContextPtr ctxp; int prefix_len, ns_uri_len; dom_xpath_object *intern; unsigned char *prefix, *ns_uri; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss", &id, dom_xpath_class_entry, &prefix, &prefix_len, &ns_uri, &ns_uri_len) == FAILURE) { return; } intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); ctxp = (xmlXPathContextPtr) intern->ptr; if (ctxp == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid XPath Context"); RETURN_FALSE; } if (xmlXPathRegisterNs(ctxp, prefix, ns_uri) != 0) { RETURN_FALSE } RETURN_TRUE; } /* }}}'],dom_xpath_register_php_functions:["void dom_xpath_register_php_functions() */",'PHP_FUNCTION(dom_xpath_register_php_functions) { zval *id; dom_xpath_object *intern; zval *array_value, **entry, *new_string; int name_len = 0; char *name; DOM_GET_THIS(id); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "a", &array_value) == SUCCESS) { intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); zend_hash_internal_pointer_reset(Z_ARRVAL_P(array_value)); while (zend_hash_get_current_data(Z_ARRVAL_P(array_value), (void **)&entry) == SUCCESS) { SEPARATE_ZVAL(entry); convert_to_string_ex(entry); MAKE_STD_ZVAL(new_string); ZVAL_LONG(new_string,1); zend_hash_update(intern->registered_phpfunctions, Z_STRVAL_PP(entry), Z_STRLEN_PP(entry) + 1, &new_string, sizeof(zval*), NULL); zend_hash_move_forward(Z_ARRVAL_P(array_value)); } intern->registerPhpFunctions = 2; RETURN_TRUE; } else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == SUCCESS) { intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); MAKE_STD_ZVAL(new_string); ZVAL_LONG(new_string,1); zend_hash_update(intern->registered_phpfunctions, name, name_len + 1, &new_string, sizeof(zval*), NULL); intern->registerPhpFunctions = 2; } else { intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); intern->registerPhpFunctions = 1; } } /* }}} end dom_xpath_register_php_functions'],each:["array each(array arr)","Return the currently pointed key..value pair in the passed array, and advance the pointer to the next element"],easter_date:["int easter_date([int year])","Return the timestamp of midnight on Easter of a given year (defaults to current year)"],easter_days:["int easter_days([int year, [int method]])","Return the number of days after March 21 that Easter falls on for a given year (defaults to current year)"],echo:["void echo(string arg1 [, string ...])","Output one or more strings"],empty:["bool empty( mixed var )","Determine whether a variable is empty"],enchant_broker_describe:["array enchant_broker_describe(resource broker)","Enumerates the Enchant providers and tells you some rudimentary information about them. The same info is provided through phpinfo()"],enchant_broker_dict_exists:["bool enchant_broker_dict_exists(resource broker, string tag)","Wether a dictionary exists or not. Using non-empty tag"],enchant_broker_free:["boolean enchant_broker_free(resource broker)","Destroys the broker object and its dictionnaries"],enchant_broker_free_dict:["resource enchant_broker_free_dict(resource dict)","Free the dictionary resource"],enchant_broker_get_dict_path:["string enchant_broker_get_dict_path(resource broker, int dict_type)","Get the directory path for a given backend, works with ispell and myspell"],enchant_broker_get_error:["string enchant_broker_get_error(resource broker)","Returns the last error of the broker"],enchant_broker_init:["resource enchant_broker_init()","create a new broker object capable of requesting"],enchant_broker_list_dicts:["string enchant_broker_list_dicts(resource broker)","Lists the dictionaries available for the given broker"],enchant_broker_request_dict:["resource enchant_broker_request_dict(resource broker, string tag)",'create a new dictionary using tag, the non-empty language tag you wish to request a dictionary for ("en_US", "de_DE", ...)'],enchant_broker_request_pwl_dict:["resource enchant_broker_request_pwl_dict(resource broker, string filename)","creates a dictionary using a PWL file. A PWL file is personal word file one word per line. It must exist before the call."],enchant_broker_set_dict_path:["bool enchant_broker_set_dict_path(resource broker, int dict_type, string value)","Set the directory path for a given backend, works with ispell and myspell"],enchant_broker_set_ordering:["bool enchant_broker_set_ordering(resource broker, string tag, string ordering)","Declares a preference of dictionaries to use for the language described/referred to by 'tag'. The ordering is a comma delimited list of provider names. As a special exception, the \"*\" tag can be used as a language tag to declare a default ordering for any language that does not explictly declare an ordering."],enchant_dict_add_to_personal:["void enchant_dict_add_to_personal(resource dict, string word)","add 'word' to personal word list"],enchant_dict_add_to_session:["void enchant_dict_add_to_session(resource dict, string word)","add 'word' to this spell-checking session"],enchant_dict_check:["bool enchant_dict_check(resource dict, string word)","If the word is correctly spelled return true, otherwise return false"],enchant_dict_describe:["array enchant_dict_describe(resource dict)","Describes an individual dictionary 'dict'"],enchant_dict_get_error:["string enchant_dict_get_error(resource dict)","Returns the last error of the current spelling-session"],enchant_dict_is_in_session:["bool enchant_dict_is_in_session(resource dict, string word)","whether or not 'word' exists in this spelling-session"],enchant_dict_quick_check:["bool enchant_dict_quick_check(resource dict, string word [, array &suggestions])","If the word is correctly spelled return true, otherwise return false, if suggestions variable is provided, fill it with spelling alternatives."],enchant_dict_store_replacement:["void enchant_dict_store_replacement(resource dict, string mis, string cor)","add a correction for 'mis' using 'cor'. Notes that you replaced @mis with @cor, so it's possibly more likely that future occurrences of @mis will be replaced with @cor. So it might bump @cor up in the suggestion list."],enchant_dict_suggest:["array enchant_dict_suggest(resource dict, string word)","Will return a list of values if any of those pre-conditions are not met."],end:["mixed end(array array_arg)","Advances array argument's internal pointer to the last element and return it"],ereg:["int ereg(string pattern, string string [, array registers])","Regular expression match"],ereg_replace:["string ereg_replace(string pattern, string replacement, string string)","Replace regular expression"],eregi:["int eregi(string pattern, string string [, array registers])","Case-insensitive regular expression match"],eregi_replace:["string eregi_replace(string pattern, string replacement, string string)","Case insensitive replace regular expression"],error_get_last:["array error_get_last()","Get the last occurred error as associative array. Returns NULL if there hasn't been an error yet."],error_log:["bool error_log(string message [, int message_type [, string destination [, string extra_headers]]])","Send an error message somewhere"],error_reporting:["int error_reporting([int new_error_level])","Return the current error_reporting level, and if an argument was passed - change to the new level"],escapeshellarg:["string escapeshellarg(string arg)","Quote and escape an argument for use in a shell command"],escapeshellcmd:["string escapeshellcmd(string command)","Escape shell metacharacters"],exec:["string exec(string command [, array &output [, int &return_value]])","Execute an external program"],exif_imagetype:["int exif_imagetype(string imagefile)","Get the type of an image"],exif_read_data:["array exif_read_data(string filename [, sections_needed [, sub_arrays[, read_thumbnail]]])","Reads header data from the JPEG/TIFF image filename and optionally reads the internal thumbnails"],exif_tagname:["string exif_tagname(index)","Get headername for index or false if not defined"],exif_thumbnail:["string exif_thumbnail(string filename [, &width, &height [, &imagetype]])","Reads the embedded thumbnail"],exit:["void exit([mixed status])","Output a message and terminate the current script"],exp:["float exp(float number)","Returns e raised to the power of the number"],explode:["array explode(string separator, string str [, int limit])","Splits a string on string separator and return array of components. If limit is positive only limit number of components is returned. If limit is negative all components except the last abs(limit) are returned."],expm1:["float expm1(float number)","Returns exp(number) - 1, computed in a way that accurate even when the value of number is close to zero"],extension_loaded:["bool extension_loaded(string extension_name)","Returns true if the named extension is loaded"],extract:["int extract(array var_array [, int extract_type [, string prefix]])","Imports variables into symbol table from an array"],ezmlm_hash:["int ezmlm_hash(string addr)","Calculate EZMLM list hash value."],fclose:["bool fclose(resource fp)","Close an open file pointer"],feof:["bool feof(resource fp)","Test for end-of-file on a file pointer"],fflush:["bool fflush(resource fp)","Flushes output"],fgetc:["string fgetc(resource fp)","Get a character from file pointer"],fgetcsv:["array fgetcsv(resource fp [,int length [, string delimiter [, string enclosure [, string escape]]]])","Get line from file pointer and parse for CSV fields"],fgets:["string fgets(resource fp[, int length])","Get a line from file pointer"],fgetss:["string fgetss(resource fp [, int length [, string allowable_tags]])","Get a line from file pointer and strip HTML tags"],file:["array file(string filename [, int flags[, resource context]])","Read entire file into an array"],file_exists:["bool file_exists(string filename)","Returns true if filename exists"],file_get_contents:["string file_get_contents(string filename [, bool use_include_path [, resource context [, long offset [, long maxlen]]]])","Read the entire file into a string"],file_put_contents:["int file_put_contents(string file, mixed data [, int flags [, resource context]])","Write/Create a file with contents data and return the number of bytes written"],fileatime:["int fileatime(string filename)","Get last access time of file"],filectime:["int filectime(string filename)","Get inode modification time of file"],filegroup:["int filegroup(string filename)","Get file group"],fileinode:["int fileinode(string filename)","Get file inode"],filemtime:["int filemtime(string filename)","Get last modification time of file"],fileowner:["int fileowner(string filename)","Get file owner"],fileperms:["int fileperms(string filename)","Get file permissions"],filesize:["int filesize(string filename)","Get file size"],filetype:["string filetype(string filename)","Get file type"],filter_has_var:["mixed filter_has_var(constant type, string variable_name)","* Returns true if the variable with the name 'name' exists in source."],filter_input:["mixed filter_input(constant type, string variable_name [, long filter [, mixed options]])","* Returns the filtered variable 'name'* from source `type`."],filter_input_array:["mixed filter_input_array(constant type, [, mixed options]])","* Returns an array with all arguments defined in 'definition'."],filter_var:["mixed filter_var(mixed variable [, long filter [, mixed options]])","* Returns the filtered version of the vriable."],filter_var_array:["mixed filter_var_array(array data, [, mixed options]])","* Returns an array with all arguments defined in 'definition'."],finfo_buffer:["string finfo_buffer(resource finfo, char *string [, int options [, resource context]])","Return infromation about a string buffer."],finfo_close:["resource finfo_close(resource finfo)","Close fileinfo resource."],finfo_file:["string finfo_file(resource finfo, char *file_name [, int options [, resource context]])","Return information about a file."],finfo_open:["resource finfo_open([int options [, string arg]])","Create a new fileinfo resource."],finfo_set_flags:["bool finfo_set_flags(resource finfo, int options)","Set libmagic configuration options."],floatval:["float floatval(mixed var)","Get the float value of a variable"],flock:["bool flock(resource fp, int operation [, int &wouldblock])","Portable file locking"],floor:["float floor(float number)","Returns the next lowest integer value from the number"],flush:["void flush(void)","Flush the output buffer"],fmod:["float fmod(float x, float y)","Returns the remainder of dividing x by y as a float"],fnmatch:["bool fnmatch(string pattern, string filename [, int flags])","Match filename against pattern"],fopen:["resource fopen(string filename, string mode [, bool use_include_path [, resource context]])","Open a file or a URL and return a file pointer"],forward_static_call:["mixed forward_static_call(mixed function_name [, mixed parmeter] [, mixed ...])","Call a user function which is the first parameter"],fpassthru:["int fpassthru(resource fp)","Output all remaining data from a file pointer"],fprintf:["int fprintf(resource stream, string format [, mixed arg1 [, mixed ...]])","Output a formatted string into a stream"],fputcsv:["int fputcsv(resource fp, array fields [, string delimiter [, string enclosure]])","Format line as CSV and write to file pointer"],fread:["string fread(resource fp, int length)","Binary-safe file read"],frenchtojd:["int frenchtojd(int month, int day, int year)","Converts a french republic calendar date to julian day count"],fscanf:["mixed fscanf(resource stream, string format [, string ...])","Implements a mostly ANSI compatible fscanf()"],fseek:["int fseek(resource fp, int offset [, int whence])","Seek on a file pointer"],fsockopen:["resource fsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])","Open Internet or Unix domain socket connection"],fstat:["array fstat(resource fp)","Stat() on a filehandle"],ftell:["int ftell(resource fp)","Get file pointer's read/write position"],ftok:["int ftok(string pathname, string proj)","Convert a pathname and a project identifier to a System V IPC key"],ftp_alloc:["bool ftp_alloc(resource stream, int size[, &response])","Attempt to allocate space on the remote FTP server"],ftp_cdup:["bool ftp_cdup(resource stream)","Changes to the parent directory"],ftp_chdir:["bool ftp_chdir(resource stream, string directory)","Changes directories"],ftp_chmod:["int ftp_chmod(resource stream, int mode, string filename)","Sets permissions on a file"],ftp_close:["bool ftp_close(resource stream)","Closes the FTP stream"],ftp_connect:["resource ftp_connect(string host [, int port [, int timeout]])","Opens a FTP stream"],ftp_delete:["bool ftp_delete(resource stream, string file)","Deletes a file"],ftp_exec:["bool ftp_exec(resource stream, string command)","Requests execution of a program on the FTP server"],ftp_fget:["bool ftp_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos])","Retrieves a file from the FTP server and writes it to an open file"],ftp_fput:["bool ftp_fput(resource stream, string remote_file, resource fp, int mode[, int startpos])","Stores a file from an open file to the FTP server"],ftp_get:["bool ftp_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos])","Retrieves a file from the FTP server and writes it to a local file"],ftp_get_option:["mixed ftp_get_option(resource stream, int option)","Gets an FTP option"],ftp_login:["bool ftp_login(resource stream, string username, string password)","Logs into the FTP server"],ftp_mdtm:["int ftp_mdtm(resource stream, string filename)","Returns the last modification time of the file, or -1 on error"],ftp_mkdir:["string ftp_mkdir(resource stream, string directory)","Creates a directory and returns the absolute path for the new directory or false on error"],ftp_nb_continue:["int ftp_nb_continue(resource stream)","Continues retrieving/sending a file nbronously"],ftp_nb_fget:["int ftp_nb_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos])","Retrieves a file from the FTP server asynchronly and writes it to an open file"],ftp_nb_fput:["int ftp_nb_fput(resource stream, string remote_file, resource fp, int mode[, int startpos])","Stores a file from an open file to the FTP server nbronly"],ftp_nb_get:["int ftp_nb_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos])","Retrieves a file from the FTP server nbhronly and writes it to a local file"],ftp_nb_put:["int ftp_nb_put(resource stream, string remote_file, string local_file, int mode[, int startpos])","Stores a file on the FTP server"],ftp_nlist:["array ftp_nlist(resource stream, string directory)","Returns an array of filenames in the given directory"],ftp_pasv:["bool ftp_pasv(resource stream, bool pasv)","Turns passive mode on or off"],ftp_put:["bool ftp_put(resource stream, string remote_file, string local_file, int mode[, int startpos])","Stores a file on the FTP server"],ftp_pwd:["string ftp_pwd(resource stream)","Returns the present working directory"],ftp_raw:["array ftp_raw(resource stream, string command)","Sends a literal command to the FTP server"],ftp_rawlist:["array ftp_rawlist(resource stream, string directory [, bool recursive])","Returns a detailed listing of a directory as an array of output lines"],ftp_rename:["bool ftp_rename(resource stream, string src, string dest)","Renames the given file to a new path"],ftp_rmdir:["bool ftp_rmdir(resource stream, string directory)","Removes a directory"],ftp_set_option:["bool ftp_set_option(resource stream, int option, mixed value)","Sets an FTP option"],ftp_site:["bool ftp_site(resource stream, string cmd)","Sends a SITE command to the server"],ftp_size:["int ftp_size(resource stream, string filename)","Returns the size of the file, or -1 on error"],ftp_ssl_connect:["resource ftp_ssl_connect(string host [, int port [, int timeout]])","Opens a FTP-SSL stream"],ftp_systype:["string ftp_systype(resource stream)","Returns the system type identifier"],ftruncate:["bool ftruncate(resource fp, int size)","Truncate file to 'size' length"],func_get_arg:["mixed func_get_arg(int arg_num)","Get the $arg_num'th argument that was passed to the function"],func_get_args:["array func_get_args()","Get an array of the arguments that were passed to the function"],func_num_args:["int func_num_args(void)","Get the number of arguments that were passed to the function"],function_exists:["bool function_exists(string function_name)","Checks if the function exists"],fwrite:["int fwrite(resource fp, string str [, int length])","Binary-safe file write"],gc_collect_cycles:["int gc_collect_cycles(void)","Forces collection of any existing garbage cycles. Returns number of freed zvals"],gc_disable:["void gc_disable(void)","Deactivates the circular reference collector"],gc_enable:["void gc_enable(void)","Activates the circular reference collector"],gc_enabled:["void gc_enabled(void)","Returns status of the circular reference collector"],gd_info:["array gd_info()",""],getKeywords:["static array getKeywords(string $locale) {","* return an associative array containing keyword-value * pairs for this locale. The keys are keys to the array (doh!) * }}}"],get_browser:["mixed get_browser([string browser_name [, bool return_array]])","Get information about the capabilities of a browser. If browser_name is omitted or null, HTTP_USER_AGENT is used. Returns an object by default; if return_array is true, returns an array."],get_called_class:["string get_called_class()",'Retrieves the "Late Static Binding" class name'],get_cfg_var:["mixed get_cfg_var(string option_name)","Get the value of a PHP configuration option"],get_class:["string get_class([object object])","Retrieves the class name"],get_class_methods:["array get_class_methods(mixed class)","Returns an array of method names for class or class instance."],get_class_vars:["array get_class_vars(string class_name)","Returns an array of default properties of the class."],get_current_user:["string get_current_user(void)","Get the name of the owner of the current PHP script"],get_declared_classes:["array get_declared_classes()","Returns an array of all declared classes."],get_declared_interfaces:["array get_declared_interfaces()","Returns an array of all declared interfaces."],get_defined_constants:["array get_defined_constants([bool categorize])","Return an array containing the names and values of all defined constants"],get_defined_functions:["array get_defined_functions(void)","Returns an array of all defined functions"],get_defined_vars:["array get_defined_vars(void)","Returns an associative array of names and values of all currently defined variable names (variables in the current scope)"],get_display_language:["static string get_display_language($locale[, $in_locale = null])","* gets the language for the $locale in $in_locale or default_locale"],get_display_name:["static string get_display_name($locale[, $in_locale = null])","* gets the name for the $locale in $in_locale or default_locale"],get_display_region:["static string get_display_region($locale, $in_locale = null)","* gets the region for the $locale in $in_locale or default_locale"],get_display_script:["static string get_display_script($locale, $in_locale = null)","* gets the script for the $locale in $in_locale or default_locale"],get_extension_funcs:["array get_extension_funcs(string extension_name)","Returns an array with the names of functions belonging to the named extension"],get_headers:["array get_headers(string url[, int format])","fetches all the headers sent by the server in response to a HTTP request"],get_html_translation_table:["array get_html_translation_table([int table [, int quote_style]])","Returns the internal translation table used by htmlspecialchars and htmlentities"],get_include_path:["string get_include_path()","Get the current include_path configuration option"],get_included_files:["array get_included_files(void)","Returns an array with the file names that were include_once()'d"],get_loaded_extensions:["array get_loaded_extensions([bool zend_extensions])","Return an array containing names of loaded extensions"],get_magic_quotes_gpc:["int get_magic_quotes_gpc(void)","Get the current active configuration setting of magic_quotes_gpc"],get_magic_quotes_runtime:["int get_magic_quotes_runtime(void)","Get the current active configuration setting of magic_quotes_runtime"],get_meta_tags:["array get_meta_tags(string filename [, bool use_include_path])","Extracts all meta tag content attributes from a file and returns an array"],get_object_vars:["array get_object_vars(object obj)","Returns an array of object properties"],get_parent_class:["string get_parent_class([mixed object])","Retrieves the parent class name for object or class or current scope."],get_resource_type:["string get_resource_type(resource res)","Get the resource type name for a given resource"],getallheaders:["array getallheaders(void)",""],getcwd:["mixed getcwd(void)","Gets the current directory"],getdate:["array getdate([int timestamp])","Get date/time information"],getenv:["string getenv(string varname)","Get the value of an environment variable"],gethostbyaddr:["string gethostbyaddr(string ip_address)","Get the Internet host name corresponding to a given IP address"],gethostbyname:["string gethostbyname(string hostname)","Get the IP address corresponding to a given Internet host name"],gethostbynamel:["array gethostbynamel(string hostname)","Return a list of IP addresses that a given hostname resolves to."],gethostname:["string gethostname()","Get the host name of the current machine"],getimagesize:["array getimagesize(string imagefile [, array info])","Get the size of an image as 4-element array"],getlastmod:["int getlastmod(void)","Get time of last page modification"],getmygid:["int getmygid(void)","Get PHP script owner's GID"],getmyinode:["int getmyinode(void)","Get the inode of the current script being parsed"],getmypid:["int getmypid(void)","Get current process ID"],getmyuid:["int getmyuid(void)","Get PHP script owner's UID"],getopt:["array getopt(string options [, array longopts])","Get options from the command line argument list"],getprotobyname:["int getprotobyname(string name)","Returns protocol number associated with name as per /etc/protocols"],getprotobynumber:["string getprotobynumber(int proto)","Returns protocol name associated with protocol number proto"],getrandmax:["int getrandmax(void)","Returns the maximum value a random number can have"],getrusage:["array getrusage([int who])","Returns an array of usage statistics"],getservbyname:["int getservbyname(string service, string protocol)",'Returns port associated with service. Protocol must be "tcp" or "udp"'],getservbyport:["string getservbyport(int port, string protocol)",'Returns service name associated with port. Protocol must be "tcp" or "udp"'],gettext:["string gettext(string msgid)","Return the translation of msgid for the current domain, or msgid unaltered if a translation does not exist"],gettimeofday:["array gettimeofday([bool get_as_float])","Returns the current time as array"],gettype:["string gettype(mixed var)","Returns the type of the variable"],glob:["array glob(string pattern [, int flags])","Find pathnames matching a pattern"],gmdate:["string gmdate(string format [, long timestamp])","Format a GMT date/time"],gmmktime:["int gmmktime([int hour [, int min [, int sec [, int mon [, int day [, int year]]]]]])","Get UNIX timestamp for a GMT date"],gmp_abs:["resource gmp_abs(resource a)","Calculates absolute value"],gmp_add:["resource gmp_add(resource a, resource b)","Add a and b"],gmp_and:["resource gmp_and(resource a, resource b)","Calculates logical AND of a and b"],gmp_clrbit:["void gmp_clrbit(resource &a, int index)","Clears bit in a"],gmp_cmp:["int gmp_cmp(resource a, resource b)","Compares two numbers"],gmp_com:["resource gmp_com(resource a)","Calculates one's complement of a"],gmp_div_q:["resource gmp_div_q(resource a, resource b [, int round])","Divide a by b, returns quotient only"],gmp_div_qr:["array gmp_div_qr(resource a, resource b [, int round])","Divide a by b, returns quotient and reminder"],gmp_div_r:["resource gmp_div_r(resource a, resource b [, int round])","Divide a by b, returns reminder only"],gmp_divexact:["resource gmp_divexact(resource a, resource b)","Divide a by b using exact division algorithm"],gmp_fact:["resource gmp_fact(int a)","Calculates factorial function"],gmp_gcd:["resource gmp_gcd(resource a, resource b)","Computes greatest common denominator (gcd) of a and b"],gmp_gcdext:["array gmp_gcdext(resource a, resource b)","Computes G, S, and T, such that AS + BT = G = `gcd' (A, B)"],gmp_hamdist:["int gmp_hamdist(resource a, resource b)","Calculates hamming distance between a and b"],gmp_init:["resource gmp_init(mixed number [, int base])","Initializes GMP number"],gmp_intval:["int gmp_intval(resource gmpnumber)","Gets signed long value of GMP number"],gmp_invert:["resource gmp_invert(resource a, resource b)","Computes the inverse of a modulo b"],gmp_jacobi:["int gmp_jacobi(resource a, resource b)","Computes Jacobi symbol"],gmp_legendre:["int gmp_legendre(resource a, resource b)","Computes Legendre symbol"],gmp_mod:["resource gmp_mod(resource a, resource b)","Computes a modulo b"],gmp_mul:["resource gmp_mul(resource a, resource b)","Multiply a and b"],gmp_neg:["resource gmp_neg(resource a)","Negates a number"],gmp_nextprime:["resource gmp_nextprime(resource a)","Finds next prime of a"],gmp_or:["resource gmp_or(resource a, resource b)","Calculates logical OR of a and b"],gmp_perfect_square:["bool gmp_perfect_square(resource a)","Checks if a is an exact square"],gmp_popcount:["int gmp_popcount(resource a)","Calculates the population count of a"],gmp_pow:["resource gmp_pow(resource base, int exp)","Raise base to power exp"],gmp_powm:["resource gmp_powm(resource base, resource exp, resource mod)","Raise base to power exp and take result modulo mod"],gmp_prob_prime:["int gmp_prob_prime(resource a[, int reps])",'Checks if a is "probably prime"'],gmp_random:["resource gmp_random([int limiter])","Gets random number"],gmp_scan0:["int gmp_scan0(resource a, int start)","Finds first zero bit"],gmp_scan1:["int gmp_scan1(resource a, int start)","Finds first non-zero bit"],gmp_setbit:["void gmp_setbit(resource &a, int index[, bool set_clear])","Sets or clear bit in a"],gmp_sign:["int gmp_sign(resource a)","Gets the sign of the number"],gmp_sqrt:["resource gmp_sqrt(resource a)","Takes integer part of square root of a"],gmp_sqrtrem:["array gmp_sqrtrem(resource a)","Square root with remainder"],gmp_strval:["string gmp_strval(resource gmpnumber [, int base])","Gets string representation of GMP number"],gmp_sub:["resource gmp_sub(resource a, resource b)","Subtract b from a"],gmp_testbit:["bool gmp_testbit(resource a, int index)","Tests if bit is set in a"],gmp_xor:["resource gmp_xor(resource a, resource b)","Calculates logical exclusive OR of a and b"],gmstrftime:["string gmstrftime(string format [, int timestamp])","Format a GMT/UCT time/date according to locale settings"],grapheme_extract:["string grapheme_extract(string str, int size[, int extract_type[, int start[, int next]]])","Function to extract a sequence of default grapheme clusters"],grapheme_stripos:["int grapheme_stripos(string haystack, string needle [, int offset ])","Find position of first occurrence of a string within another, ignoring case differences"],grapheme_stristr:["string grapheme_stristr(string haystack, string needle[, bool part])","Finds first occurrence of a string within another"],grapheme_strlen:["int grapheme_strlen(string str)","Get number of graphemes in a string"],grapheme_strpos:["int grapheme_strpos(string haystack, string needle [, int offset ])","Find position of first occurrence of a string within another"],grapheme_strripos:["int grapheme_strripos(string haystack, string needle [, int offset])","Find position of last occurrence of a string within another, ignoring case"],grapheme_strrpos:["int grapheme_strrpos(string haystack, string needle [, int offset])","Find position of last occurrence of a string within another"],grapheme_strstr:["string grapheme_strstr(string haystack, string needle[, bool part])","Finds first occurrence of a string within another"],grapheme_substr:["string grapheme_substr(string str, int start [, int length])","Returns part of a string"],gregoriantojd:["int gregoriantojd(int month, int day, int year)","Converts a gregorian calendar date to julian day count"],gzcompress:["string gzcompress(string data [, int level])","Gzip-compress a string"],gzdeflate:["string gzdeflate(string data [, int level])","Gzip-compress a string"],gzencode:["string gzencode(string data [, int level [, int encoding_mode]])","GZ encode a string"],gzfile:["array gzfile(string filename [, int use_include_path])","Read und uncompress entire .gz-file into an array"],gzinflate:["string gzinflate(string data [, int length])","Unzip a gzip-compressed string"],gzopen:["resource gzopen(string filename, string mode [, int use_include_path])","Open a .gz-file and return a .gz-file pointer"],gzuncompress:["string gzuncompress(string data [, int length])","Unzip a gzip-compressed string"],hash:["string hash(string algo, string data[, bool raw_output = false])","Generate a hash of a given input string Returns lowercase hexits by default"],hash_algos:["array hash_algos(void)","Return a list of registered hashing algorithms"],hash_copy:["resource hash_copy(resource context)","Copy hash resource"],hash_file:["string hash_file(string algo, string filename[, bool raw_output = false])","Generate a hash of a given file Returns lowercase hexits by default"],hash_final:["string hash_final(resource context[, bool raw_output=false])","Output resulting digest"],hash_hmac:["string hash_hmac(string algo, string data, string key[, bool raw_output = false])","Generate a hash of a given input string with a key using HMAC Returns lowercase hexits by default"],hash_hmac_file:["string hash_hmac_file(string algo, string filename, string key[, bool raw_output = false])","Generate a hash of a given file with a key using HMAC Returns lowercase hexits by default"],hash_init:["resource hash_init(string algo[, int options, string key])","Initialize a hashing context"],hash_update:["bool hash_update(resource context, string data)","Pump data into the hashing algorithm"],hash_update_file:["bool hash_update_file(resource context, string filename[, resource context])","Pump data into the hashing algorithm from a file"],hash_update_stream:["int hash_update_stream(resource context, resource handle[, integer length])","Pump data into the hashing algorithm from an open stream"],header:["void header(string header [, bool replace, [int http_response_code]])","Sends a raw HTTP header"],header_remove:["void header_remove([string name])","Removes an HTTP header previously set using header()"],headers_list:["array headers_list(void)","Return list of headers to be sent / already sent"],headers_sent:["bool headers_sent([string &$file [, int &$line]])","Returns true if headers have already been sent, false otherwise"],hebrev:["string hebrev(string str [, int max_chars_per_line])","Converts logical Hebrew text to visual text"],hebrevc:["string hebrevc(string str [, int max_chars_per_line])","Converts logical Hebrew text to visual text with newline conversion"],hexdec:["int hexdec(string hexadecimal_number)","Returns the decimal equivalent of the hexadecimal number"],highlight_file:["bool highlight_file(string file_name [, bool return] )","Syntax highlight a source file"],highlight_string:["bool highlight_string(string string [, bool return] )","Syntax highlight a string or optionally return it"],html_entity_decode:["string html_entity_decode(string string [, int quote_style][, string charset])","Convert all HTML entities to their applicable characters"],htmlentities:["string htmlentities(string string [, int quote_style[, string charset[, bool double_encode]]])","Convert all applicable characters to HTML entities"],htmlspecialchars:["string htmlspecialchars(string string [, int quote_style[, string charset[, bool double_encode]]])","Convert special characters to HTML entities"],htmlspecialchars_decode:["string htmlspecialchars_decode(string string [, int quote_style])","Convert special HTML entities back to characters"],http_build_query:["string http_build_query(mixed formdata [, string prefix [, string arg_separator]])","Generates a form-encoded query string from an associative array or object."],hypot:["float hypot(float num1, float num2)","Returns sqrt(num1*num1 + num2*num2)"],ibase_add_user:["bool ibase_add_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])","Add a user to security database"],ibase_affected_rows:["int ibase_affected_rows( [ resource link_identifier ] )","Returns the number of rows affected by the previous INSERT, UPDATE or DELETE statement"],ibase_backup:["mixed ibase_backup(resource service_handle, string source_db, string dest_file [, int options [, bool verbose]])","Initiates a backup task in the service manager and returns immediately"],ibase_blob_add:["bool ibase_blob_add(resource blob_handle, string data)","Add data into created blob"],ibase_blob_cancel:["bool ibase_blob_cancel(resource blob_handle)","Cancel creating blob"],ibase_blob_close:["string ibase_blob_close(resource blob_handle)","Close blob"],ibase_blob_create:["resource ibase_blob_create([resource link_identifier])","Create blob for adding data"],ibase_blob_echo:["bool ibase_blob_echo([ resource link_identifier, ] string blob_id)","Output blob contents to browser"],ibase_blob_get:["string ibase_blob_get(resource blob_handle, int len)","Get len bytes data from open blob"],ibase_blob_import:["string ibase_blob_import([ resource link_identifier, ] resource file)","Create blob, copy file in it, and close it"],ibase_blob_info:["array ibase_blob_info([ resource link_identifier, ] string blob_id)","Return blob length and other useful info"],ibase_blob_open:["resource ibase_blob_open([ resource link_identifier, ] string blob_id)","Open blob for retrieving data parts"],ibase_close:["bool ibase_close([resource link_identifier])","Close an InterBase connection"],ibase_commit:["bool ibase_commit( resource link_identifier )","Commit transaction"],ibase_commit_ret:["bool ibase_commit_ret( resource link_identifier )","Commit transaction and retain the transaction context"],ibase_connect:["resource ibase_connect(string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])","Open a connection to an InterBase database"],ibase_db_info:["string ibase_db_info(resource service_handle, string db, int action [, int argument])","Request statistics about a database"],ibase_delete_user:["bool ibase_delete_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])","Delete a user from security database"],ibase_drop_db:["bool ibase_drop_db([resource link_identifier])","Drop an InterBase database"],ibase_errcode:["int ibase_errcode(void)","Return error code"],ibase_errmsg:["string ibase_errmsg(void)","Return error message"],ibase_execute:["mixed ibase_execute(resource query [, mixed bind_arg [, mixed bind_arg [, ...]]])","Execute a previously prepared query"],ibase_fetch_assoc:["array ibase_fetch_assoc(resource result [, int fetch_flags])","Fetch a row from the results of a query"],ibase_fetch_object:["object ibase_fetch_object(resource result [, int fetch_flags])","Fetch a object from the results of a query"],ibase_fetch_row:["array ibase_fetch_row(resource result [, int fetch_flags])","Fetch a row from the results of a query"],ibase_field_info:["array ibase_field_info(resource query_result, int field_number)","Get information about a field"],ibase_free_event_handler:["bool ibase_free_event_handler(resource event)","Frees the event handler set by ibase_set_event_handler()"],ibase_free_query:["bool ibase_free_query(resource query)","Free memory used by a query"],ibase_free_result:["bool ibase_free_result(resource result)","Free the memory used by a result"],ibase_gen_id:["int ibase_gen_id(string generator [, int increment [, resource link_identifier ]])","Increments the named generator and returns its new value"],ibase_maintain_db:["bool ibase_maintain_db(resource service_handle, string db, int action [, int argument])","Execute a maintenance command on the database server"],ibase_modify_user:["bool ibase_modify_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])","Modify a user in security database"],ibase_name_result:["bool ibase_name_result(resource result, string name)","Assign a name to a result for use with ... WHERE CURRENT OF statements"],ibase_num_fields:["int ibase_num_fields(resource query_result)","Get the number of fields in result"],ibase_num_params:["int ibase_num_params(resource query)","Get the number of params in a prepared query"],ibase_num_rows:["int ibase_num_rows( resource result_identifier )","Return the number of rows that are available in a result"],ibase_param_info:["array ibase_param_info(resource query, int field_number)","Get information about a parameter"],ibase_pconnect:["resource ibase_pconnect(string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])","Open a persistent connection to an InterBase database"],ibase_prepare:["resource ibase_prepare(resource link_identifier[, string query [, resource trans_identifier ]])","Prepare a query for later execution"],ibase_query:["mixed ibase_query([resource link_identifier, [ resource link_identifier, ]] string query [, mixed bind_arg [, mixed bind_arg [, ...]]])","Execute a query"],ibase_restore:["mixed ibase_restore(resource service_handle, string source_file, string dest_db [, int options [, bool verbose]])","Initiates a restore task in the service manager and returns immediately"],ibase_rollback:["bool ibase_rollback( resource link_identifier )","Rollback transaction"],ibase_rollback_ret:["bool ibase_rollback_ret( resource link_identifier )","Rollback transaction and retain the transaction context"],ibase_server_info:["string ibase_server_info(resource service_handle, int action)","Request information about a database server"],ibase_service_attach:["resource ibase_service_attach(string host, string dba_username, string dba_password)","Connect to the service manager"],ibase_service_detach:["bool ibase_service_detach(resource service_handle)","Disconnect from the service manager"],ibase_set_event_handler:["resource ibase_set_event_handler([resource link_identifier,] callback handler, string event [, string event [, ...]])","Register the callback for handling each of the named events"],ibase_trans:["resource ibase_trans([int trans_args [, resource link_identifier [, ... ], int trans_args [, resource link_identifier [, ... ]] [, ...]]])","Start a transaction over one or several databases"],ibase_wait_event:["string ibase_wait_event([resource link_identifier,] string event [, string event [, ...]])","Waits for any one of the passed Interbase events to be posted by the database, and returns its name"],iconv:["string iconv(string in_charset, string out_charset, string str)","Returns str converted to the out_charset character set"],iconv_get_encoding:["mixed iconv_get_encoding([string type])","Get internal encoding and output encoding for ob_iconv_handler()"],iconv_mime_decode:["string iconv_mime_decode(string encoded_string [, int mode, string charset])","Decodes a mime header field"],iconv_mime_decode_headers:["array iconv_mime_decode_headers(string headers [, int mode, string charset])","Decodes multiple mime header fields"],iconv_mime_encode:["string iconv_mime_encode(string field_name, string field_value [, array preference])","Composes a mime header field with field_name and field_value in a specified scheme"],iconv_set_encoding:["bool iconv_set_encoding(string type, string charset)","Sets internal encoding and output encoding for ob_iconv_handler()"],iconv_strlen:["int iconv_strlen(string str [, string charset])","Returns the character count of str"],iconv_strpos:["int iconv_strpos(string haystack, string needle [, int offset [, string charset]])","Finds position of first occurrence of needle within part of haystack beginning with offset"],iconv_strrpos:["int iconv_strrpos(string haystack, string needle [, string charset])","Finds position of last occurrence of needle within part of haystack beginning with offset"],iconv_substr:["string iconv_substr(string str, int offset, [int length, string charset])","Returns specified part of a string"],idate:["int idate(string format [, int timestamp])","Format a local time/date as integer"],idn_to_ascii:["int idn_to_ascii(string domain[, int options])","Converts an Unicode domain to ASCII representation, as defined in the IDNA RFC"],idn_to_utf8:["int idn_to_utf8(string domain[, int options])","Converts an ASCII representation of the domain to Unicode (UTF-8), as defined in the IDNA RFC"],ignore_user_abort:["int ignore_user_abort([string value])","Set whether we want to ignore a user abort event or not"],image2wbmp:["bool image2wbmp(resource im [, string filename [, int threshold]])","Output WBMP image to browser or file"],image_type_to_extension:["string image_type_to_extension(int imagetype [, bool include_dot])","Get file extension for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype"],image_type_to_mime_type:["string image_type_to_mime_type(int imagetype)","Get Mime-Type for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype"],imagealphablending:["bool imagealphablending(resource im, bool on)","Turn alpha blending mode on or off for the given image"],imageantialias:["bool imageantialias(resource im, bool on)","Should antialiased functions used or not"],imagearc:["bool imagearc(resource im, int cx, int cy, int w, int h, int s, int e, int col)","Draw a partial ellipse"],imagechar:["bool imagechar(resource im, int font, int x, int y, string c, int col)","Draw a character"],imagecharup:["bool imagecharup(resource im, int font, int x, int y, string c, int col)","Draw a character rotated 90 degrees counter-clockwise"],imagecolorallocate:["int imagecolorallocate(resource im, int red, int green, int blue)","Allocate a color for an image"],imagecolorallocatealpha:["int imagecolorallocatealpha(resource im, int red, int green, int blue, int alpha)","Allocate a color with an alpha level. Works for true color and palette based images"],imagecolorat:["int imagecolorat(resource im, int x, int y)","Get the index of the color of a pixel"],imagecolorclosest:["int imagecolorclosest(resource im, int red, int green, int blue)","Get the index of the closest color to the specified color"],imagecolorclosestalpha:["int imagecolorclosestalpha(resource im, int red, int green, int blue, int alpha)","Find the closest matching colour with alpha transparency"],imagecolorclosesthwb:["int imagecolorclosesthwb(resource im, int red, int green, int blue)","Get the index of the color which has the hue, white and blackness nearest to the given color"],imagecolordeallocate:["bool imagecolordeallocate(resource im, int index)","De-allocate a color for an image"],imagecolorexact:["int imagecolorexact(resource im, int red, int green, int blue)","Get the index of the specified color"],imagecolorexactalpha:["int imagecolorexactalpha(resource im, int red, int green, int blue, int alpha)","Find exact match for colour with transparency"],imagecolormatch:["bool imagecolormatch(resource im1, resource im2)","Makes the colors of the palette version of an image more closely match the true color version"],imagecolorresolve:["int imagecolorresolve(resource im, int red, int green, int blue)","Get the index of the specified color or its closest possible alternative"],imagecolorresolvealpha:["int imagecolorresolvealpha(resource im, int red, int green, int blue, int alpha)","Resolve/Allocate a colour with an alpha level. Works for true colour and palette based images"],imagecolorset:["void imagecolorset(resource im, int col, int red, int green, int blue)","Set the color for the specified palette index"],imagecolorsforindex:["array imagecolorsforindex(resource im, int col)","Get the colors for an index"],imagecolorstotal:["int imagecolorstotal(resource im)","Find out the number of colors in an image's palette"],imagecolortransparent:["int imagecolortransparent(resource im [, int col])","Define a color as transparent"],imageconvolution:["resource imageconvolution(resource src_im, array matrix3x3, double div, double offset)","Apply a 3x3 convolution matrix, using coefficient div and offset"],imagecopy:["bool imagecopy(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)","Copy part of an image"],imagecopymerge:["bool imagecopymerge(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)","Merge one part of an image with another"],imagecopymergegray:["bool imagecopymergegray(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)","Merge one part of an image with another"],imagecopyresampled:["bool imagecopyresampled(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)","Copy and resize part of an image using resampling to help ensure clarity"],imagecopyresized:["bool imagecopyresized(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)","Copy and resize part of an image"],imagecreate:["resource imagecreate(int x_size, int y_size)","Create a new image"],imagecreatefromgd:["resource imagecreatefromgd(string filename)","Create a new image from GD file or URL"],imagecreatefromgd2:["resource imagecreatefromgd2(string filename)","Create a new image from GD2 file or URL"],imagecreatefromgd2part:["resource imagecreatefromgd2part(string filename, int srcX, int srcY, int width, int height)","Create a new image from a given part of GD2 file or URL"],imagecreatefromgif:["resource imagecreatefromgif(string filename)","Create a new image from GIF file or URL"],imagecreatefromjpeg:["resource imagecreatefromjpeg(string filename)","Create a new image from JPEG file or URL"],imagecreatefrompng:["resource imagecreatefrompng(string filename)","Create a new image from PNG file or URL"],imagecreatefromstring:["resource imagecreatefromstring(string image)","Create a new image from the image stream in the string"],imagecreatefromwbmp:["resource imagecreatefromwbmp(string filename)","Create a new image from WBMP file or URL"],imagecreatefromxbm:["resource imagecreatefromxbm(string filename)","Create a new image from XBM file or URL"],imagecreatefromxpm:["resource imagecreatefromxpm(string filename)","Create a new image from XPM file or URL"],imagecreatetruecolor:["resource imagecreatetruecolor(int x_size, int y_size)","Create a new true color image"],imagedashedline:["bool imagedashedline(resource im, int x1, int y1, int x2, int y2, int col)","Draw a dashed line"],imagedestroy:["bool imagedestroy(resource im)","Destroy an image"],imageellipse:["bool imageellipse(resource im, int cx, int cy, int w, int h, int color)","Draw an ellipse"],imagefill:["bool imagefill(resource im, int x, int y, int col)","Flood fill"],imagefilledarc:["bool imagefilledarc(resource im, int cx, int cy, int w, int h, int s, int e, int col, int style)","Draw a filled partial ellipse"],imagefilledellipse:["bool imagefilledellipse(resource im, int cx, int cy, int w, int h, int color)","Draw an ellipse"],imagefilledpolygon:["bool imagefilledpolygon(resource im, array point, int num_points, int col)","Draw a filled polygon"],imagefilledrectangle:["bool imagefilledrectangle(resource im, int x1, int y1, int x2, int y2, int col)","Draw a filled rectangle"],imagefilltoborder:["bool imagefilltoborder(resource im, int x, int y, int border, int col)","Flood fill to specific color"],imagefilter:["bool imagefilter(resource src_im, int filtertype, [args] )","Applies Filter an image using a custom angle"],imagefontheight:["int imagefontheight(int font)","Get font height"],imagefontwidth:["int imagefontwidth(int font)","Get font width"],imageftbbox:["array imageftbbox(float size, float angle, string font_file, string text [, array extrainfo])","Give the bounding box of a text using fonts via freetype2"],imagefttext:["array imagefttext(resource im, float size, float angle, int x, int y, int col, string font_file, string text [, array extrainfo])","Write text to the image using fonts via freetype2"],imagegammacorrect:["bool imagegammacorrect(resource im, float inputgamma, float outputgamma)","Apply a gamma correction to a GD image"],imagegd:["bool imagegd(resource im [, string filename])","Output GD image to browser or file"],imagegd2:["bool imagegd2(resource im [, string filename, [, int chunk_size, [, int type]]])","Output GD2 image to browser or file"],imagegif:["bool imagegif(resource im [, string filename])","Output GIF image to browser or file"],imagegrabscreen:["resource imagegrabscreen()","Grab a screenshot"],imagegrabwindow:["resource imagegrabwindow(int window_handle [, int client_area])","Grab a window or its client area using a windows handle (HWND property in COM instance)"],imageinterlace:["int imageinterlace(resource im [, int interlace])","Enable or disable interlace"],imageistruecolor:["bool imageistruecolor(resource im)","return true if the image uses truecolor"],imagejpeg:["bool imagejpeg(resource im [, string filename [, int quality]])","Output JPEG image to browser or file"],imagelayereffect:["bool imagelayereffect(resource im, int effect)","Set the alpha blending flag to use the bundled libgd layering effects"],imageline:["bool imageline(resource im, int x1, int y1, int x2, int y2, int col)","Draw a line"],imageloadfont:["int imageloadfont(string filename)","Load a new font"],imagepalettecopy:["void imagepalettecopy(resource dst, resource src)","Copy the palette from the src image onto the dst image"],imagepng:["bool imagepng(resource im [, string filename])","Output PNG image to browser or file"],imagepolygon:["bool imagepolygon(resource im, array point, int num_points, int col)","Draw a polygon"],imagepsbbox:["array imagepsbbox(string text, resource font, int size [, int space, int tightness, float angle])","Return the bounding box needed by a string if rasterized"],imagepscopyfont:["int imagepscopyfont(int font_index)","Make a copy of a font for purposes like extending or reenconding"],imagepsencodefont:["bool imagepsencodefont(resource font_index, string filename)","To change a fonts character encoding vector"],imagepsextendfont:["bool imagepsextendfont(resource font_index, float extend)","Extend or or condense (if extend < 1) a font"],imagepsfreefont:["bool imagepsfreefont(resource font_index)","Free memory used by a font"],imagepsloadfont:["resource imagepsloadfont(string pathname)","Load a new font from specified file"],imagepsslantfont:["bool imagepsslantfont(resource font_index, float slant)","Slant a font"],imagepstext:["array imagepstext(resource image, string text, resource font, int size, int foreground, int background, int xcoord, int ycoord [, int space [, int tightness [, float angle [, int antialias])","Rasterize a string over an image"],imagerectangle:["bool imagerectangle(resource im, int x1, int y1, int x2, int y2, int col)","Draw a rectangle"],imagerotate:["resource imagerotate(resource src_im, float angle, int bgdcolor [, int ignoretransparent])","Rotate an image using a custom angle"],imagesavealpha:["bool imagesavealpha(resource im, bool on)","Include alpha channel to a saved image"],imagesetbrush:["bool imagesetbrush(resource image, resource brush)",'Set the brush image to $brush when filling $image with the "IMG_COLOR_BRUSHED" color'],imagesetpixel:["bool imagesetpixel(resource im, int x, int y, int col)","Set a single pixel"],imagesetstyle:["bool imagesetstyle(resource im, array styles)","Set the line drawing styles for use with imageline and IMG_COLOR_STYLED."],imagesetthickness:["bool imagesetthickness(resource im, int thickness)","Set line thickness for drawing lines, ellipses, rectangles, polygons etc."],imagesettile:["bool imagesettile(resource image, resource tile)",'Set the tile image to $tile when filling $image with the "IMG_COLOR_TILED" color'],imagestring:["bool imagestring(resource im, int font, int x, int y, string str, int col)","Draw a string horizontally"],imagestringup:["bool imagestringup(resource im, int font, int x, int y, string str, int col)","Draw a string vertically - rotated 90 degrees counter-clockwise"],imagesx:["int imagesx(resource im)","Get image width"],imagesy:["int imagesy(resource im)","Get image height"],imagetruecolortopalette:["void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)","Convert a true colour image to a palette based image with a number of colours, optionally using dithering."],imagettfbbox:["array imagettfbbox(float size, float angle, string font_file, string text)","Give the bounding box of a text using TrueType fonts"],imagettftext:["array imagettftext(resource im, float size, float angle, int x, int y, int col, string font_file, string text)","Write text to the image using a TrueType font"],imagetypes:["int imagetypes(void)","Return the types of images supported in a bitfield - 1=GIF, 2=JPEG, 4=PNG, 8=WBMP, 16=XPM"],imagewbmp:["bool imagewbmp(resource im [, string filename, [, int foreground]])","Output WBMP image to browser or file"],imagexbm:["int imagexbm(int im, string filename [, int foreground])","Output XBM image to browser or file"],imap_8bit:["string imap_8bit(string text)","Convert an 8-bit string to a quoted-printable string"],imap_alerts:["array imap_alerts(void)","Returns an array of all IMAP alerts that have been generated since the last page load or since the last imap_alerts() call, whichever came last. The alert stack is cleared after imap_alerts() is called."],imap_append:["bool imap_append(resource stream_id, string folder, string message [, string options [, string internal_date]])","Append a new message to a specified mailbox"],imap_base64:["string imap_base64(string text)","Decode BASE64 encoded text"],imap_binary:["string imap_binary(string text)","Convert an 8bit string to a base64 string"],imap_body:["string imap_body(resource stream_id, int msg_no [, int options])","Read the message body"],imap_bodystruct:["object imap_bodystruct(resource stream_id, int msg_no, string section)","Read the structure of a specified body section of a specific message"],imap_check:["object imap_check(resource stream_id)","Get mailbox properties"],imap_clearflag_full:["bool imap_clearflag_full(resource stream_id, string sequence, string flag [, int options])","Clears flags on messages"],imap_close:["bool imap_close(resource stream_id [, int options])","Close an IMAP stream"],imap_createmailbox:["bool imap_createmailbox(resource stream_id, string mailbox)","Create a new mailbox"],imap_delete:["bool imap_delete(resource stream_id, int msg_no [, int options])","Mark a message for deletion"],imap_deletemailbox:["bool imap_deletemailbox(resource stream_id, string mailbox)","Delete a mailbox"],imap_errors:["array imap_errors(void)","Returns an array of all IMAP errors generated since the last page load, or since the last imap_errors() call, whichever came last. The error stack is cleared after imap_errors() is called."],imap_expunge:["bool imap_expunge(resource stream_id)","Permanently delete all messages marked for deletion"],imap_fetch_overview:["array imap_fetch_overview(resource stream_id, string sequence [, int options])","Read an overview of the information in the headers of the given message sequence"],imap_fetchbody:["string imap_fetchbody(resource stream_id, int msg_no, string section [, int options])","Get a specific body section"],imap_fetchheader:["string imap_fetchheader(resource stream_id, int msg_no [, int options])","Get the full unfiltered header for a message"],imap_fetchstructure:["object imap_fetchstructure(resource stream_id, int msg_no [, int options])","Read the full structure of a message"],imap_gc:["bool imap_gc(resource stream_id, int flags)","This function garbage collects (purges) the cache of entries of a specific type."],imap_get_quota:["array imap_get_quota(resource stream_id, string qroot)","Returns the quota set to the mailbox account qroot"],imap_get_quotaroot:["array imap_get_quotaroot(resource stream_id, string mbox)","Returns the quota set to the mailbox account mbox"],imap_getacl:["array imap_getacl(resource stream_id, string mailbox)","Gets the ACL for a given mailbox"],imap_getmailboxes:["array imap_getmailboxes(resource stream_id, string ref, string pattern)","Reads the list of mailboxes and returns a full array of objects containing name, attributes, and delimiter"],imap_getsubscribed:["array imap_getsubscribed(resource stream_id, string ref, string pattern)","Return a list of subscribed mailboxes, in the same format as imap_getmailboxes()"],imap_headerinfo:["object imap_headerinfo(resource stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])","Read the headers of the message"],imap_headers:["array imap_headers(resource stream_id)","Returns headers for all messages in a mailbox"],imap_last_error:["string imap_last_error(void)","Returns the last error that was generated by an IMAP function. The error stack is NOT cleared after this call."],imap_list:["array imap_list(resource stream_id, string ref, string pattern)","Read the list of mailboxes"],imap_listscan:["array imap_listscan(resource stream_id, string ref, string pattern, string content)","Read list of mailboxes containing a certain string"],imap_lsub:["array imap_lsub(resource stream_id, string ref, string pattern)","Return a list of subscribed mailboxes"],imap_mail:["bool imap_mail(string to, string subject, string message [, string additional_headers [, string cc [, string bcc [, string rpath]]]])","Send an email message"],imap_mail_compose:["string imap_mail_compose(array envelope, array body)","Create a MIME message based on given envelope and body sections"],imap_mail_copy:["bool imap_mail_copy(resource stream_id, string msglist, string mailbox [, int options])","Copy specified message to a mailbox"],imap_mail_move:["bool imap_mail_move(resource stream_id, string sequence, string mailbox [, int options])","Move specified message to a mailbox"],imap_mailboxmsginfo:["object imap_mailboxmsginfo(resource stream_id)","Returns info about the current mailbox"],imap_mime_header_decode:["array imap_mime_header_decode(string str)","Decode mime header element in accordance with RFC 2047 and return array of objects containing 'charset' encoding and decoded 'text'"],imap_msgno:["int imap_msgno(resource stream_id, int unique_msg_id)","Get the sequence number associated with a UID"],imap_mutf7_to_utf8:["string imap_mutf7_to_utf8(string in)","Decode a modified UTF-7 string to UTF-8"],imap_num_msg:["int imap_num_msg(resource stream_id)","Gives the number of messages in the current mailbox"],imap_num_recent:["int imap_num_recent(resource stream_id)","Gives the number of recent messages in current mailbox"],imap_open:["resource imap_open(string mailbox, string user, string password [, int options [, int n_retries]])","Open an IMAP stream to a mailbox"],imap_ping:["bool imap_ping(resource stream_id)","Check if the IMAP stream is still active"],imap_qprint:["string imap_qprint(string text)","Convert a quoted-printable string to an 8-bit string"],imap_renamemailbox:["bool imap_renamemailbox(resource stream_id, string old_name, string new_name)","Rename a mailbox"],imap_reopen:["bool imap_reopen(resource stream_id, string mailbox [, int options [, int n_retries]])","Reopen an IMAP stream to a new mailbox"],imap_rfc822_parse_adrlist:["array imap_rfc822_parse_adrlist(string address_string, string default_host)","Parses an address string"],imap_rfc822_parse_headers:["object imap_rfc822_parse_headers(string headers [, string default_host])","Parse a set of mail headers contained in a string, and return an object similar to imap_headerinfo()"],imap_rfc822_write_address:["string imap_rfc822_write_address(string mailbox, string host, string personal)","Returns a properly formatted email address given the mailbox, host, and personal info"],imap_savebody:['bool imap_savebody(resource stream_id, string|resource file, int msg_no[, string section = ""[, int options = 0]])',"Save a specific body section to a file"],imap_search:["array imap_search(resource stream_id, string criteria [, int options [, string charset]])","Return a list of messages matching the given criteria"],imap_set_quota:["bool imap_set_quota(resource stream_id, string qroot, int mailbox_size)","Will set the quota for qroot mailbox"],imap_setacl:["bool imap_setacl(resource stream_id, string mailbox, string id, string rights)","Sets the ACL for a given mailbox"],imap_setflag_full:["bool imap_setflag_full(resource stream_id, string sequence, string flag [, int options])","Sets flags on messages"],imap_sort:["array imap_sort(resource stream_id, int criteria, int reverse [, int options [, string search_criteria [, string charset]]])","Sort an array of message headers, optionally including only messages that meet specified criteria."],imap_status:["object imap_status(resource stream_id, string mailbox, int options)","Get status info from a mailbox"],imap_subscribe:["bool imap_subscribe(resource stream_id, string mailbox)","Subscribe to a mailbox"],imap_thread:["array imap_thread(resource stream_id [, int options])","Return threaded by REFERENCES tree"],imap_timeout:["mixed imap_timeout(int timeout_type [, int timeout])","Set or fetch imap timeout"],imap_uid:["int imap_uid(resource stream_id, int msg_no)","Get the unique message id associated with a standard sequential message number"],imap_undelete:["bool imap_undelete(resource stream_id, int msg_no [, int flags])","Remove the delete flag from a message"],imap_unsubscribe:["bool imap_unsubscribe(resource stream_id, string mailbox)","Unsubscribe from a mailbox"],imap_utf7_decode:["string imap_utf7_decode(string buf)","Decode a modified UTF-7 string"],imap_utf7_encode:["string imap_utf7_encode(string buf)","Encode a string in modified UTF-7"],imap_utf8:["string imap_utf8(string mime_encoded_text)","Convert a mime-encoded text to UTF-8"],imap_utf8_to_mutf7:["string imap_utf8_to_mutf7(string in)","Encode a UTF-8 string to modified UTF-7"],implode:["string implode([string glue,] array pieces)","Joins array elements placing glue string between items and return one string"],import_request_variables:["bool import_request_variables(string types [, string prefix])","Import GET/POST/Cookie variables into the global scope"],in_array:["bool in_array(mixed needle, array haystack [, bool strict])","Checks if the given value exists in the array"],include:["bool include(string path)","Includes and evaluates the specified file"],include_once:["bool include_once(string path)","Includes and evaluates the specified file"],inet_ntop:["string inet_ntop(string in_addr)","Converts a packed inet address to a human readable IP address string"],inet_pton:["string inet_pton(string ip_address)","Converts a human readable IP address to a packed binary string"],ini_get:["string ini_get(string varname)","Get a configuration option"],ini_get_all:["array ini_get_all([string extension[, bool details = true]])","Get all configuration options"],ini_restore:["void ini_restore(string varname)","Restore the value of a configuration option specified by varname"],ini_set:["string ini_set(string varname, string newvalue)","Set a configuration option, returns false on error and the old value of the configuration option on success"],interface_exists:["bool interface_exists(string classname [, bool autoload])","Checks if the class exists"],intl_error_name:["string intl_error_name()","* Return a string for a given error code. * The string will be the same as the name of the error code constant."],intl_get_error_code:["int intl_get_error_code()","* Get code of the last occured error."],intl_get_error_message:["string intl_get_error_message()","* Get text description of the last occured error."],intl_is_failure:["bool intl_is_failure()","* Check whether the given error code indicates a failure. * Returns true if it does, and false if the code * indicates success or a warning."],intval:["int intval(mixed var [, int base])","Get the integer value of a variable using the optional base for the conversion"],ip2long:["int ip2long(string ip_address)","Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address"],iptcembed:["array iptcembed(string iptcdata, string jpeg_file_name [, int spool])","Embed binary IPTC data into a JPEG image."],iptcparse:["array iptcparse(string iptcdata)","Parse binary IPTC-data into associative array"],is_a:["bool is_a(object object, string class_name)","Returns true if the object is of this class or has this class as one of its parents"],is_array:["bool is_array(mixed var)","Returns true if variable is an array"],is_bool:["bool is_bool(mixed var)","Returns true if variable is a boolean"],is_callable:["bool is_callable(mixed var [, bool syntax_only [, string callable_name]])","Returns true if var is callable."],is_dir:["bool is_dir(string filename)","Returns true if file is directory"],is_executable:["bool is_executable(string filename)","Returns true if file is executable"],is_file:["bool is_file(string filename)","Returns true if file is a regular file"],is_finite:["bool is_finite(float val)","Returns whether argument is finite"],is_float:["bool is_float(mixed var)","Returns true if variable is float point"],is_infinite:["bool is_infinite(float val)","Returns whether argument is infinite"],is_link:["bool is_link(string filename)","Returns true if file is symbolic link"],is_long:["bool is_long(mixed var)","Returns true if variable is a long (integer)"],is_nan:["bool is_nan(float val)","Returns whether argument is not a number"],is_null:["bool is_null(mixed var)","Returns true if variable is null"],is_numeric:["bool is_numeric(mixed value)","Returns true if value is a number or a numeric string"],is_object:["bool is_object(mixed var)","Returns true if variable is an object"],is_readable:["bool is_readable(string filename)","Returns true if file can be read"],is_resource:["bool is_resource(mixed var)","Returns true if variable is a resource"],is_scalar:["bool is_scalar(mixed value)","Returns true if value is a scalar"],is_string:["bool is_string(mixed var)","Returns true if variable is a string"],is_subclass_of:["bool is_subclass_of(object object, string class_name)","Returns true if the object has this class as one of its parents"],is_uploaded_file:["bool is_uploaded_file(string path)","Check if file was created by rfc1867 upload"],is_writable:["bool is_writable(string filename)","Returns true if file can be written"],isset:["bool isset(mixed var [, mixed var])","Determine whether a variable is set"],iterator_apply:["int iterator_apply(Traversable it, mixed function [, mixed params])","Calls a function for every element in an iterator"],iterator_count:["int iterator_count(Traversable it)","Count the elements in an iterator"],iterator_to_array:["array iterator_to_array(Traversable it [, bool use_keys = true])","Copy the iterator into an array"],jddayofweek:["mixed jddayofweek(int juliandaycount [, int mode])","Returns name or number of day of week from julian day count"],jdmonthname:["string jdmonthname(int juliandaycount, int mode)","Returns name of month for julian day count"],jdtofrench:["string jdtofrench(int juliandaycount)","Converts a julian day count to a french republic calendar date"],jdtogregorian:["string jdtogregorian(int juliandaycount)","Converts a julian day count to a gregorian calendar date"],jdtojewish:["string jdtojewish(int juliandaycount [, bool hebrew [, int fl]])","Converts a julian day count to a jewish calendar date"],jdtojulian:["string jdtojulian(int juliandaycount)","Convert a julian day count to a julian calendar date"],jdtounix:["int jdtounix(int jday)","Convert Julian Day to UNIX timestamp"],jewishtojd:["int jewishtojd(int month, int day, int year)","Converts a jewish calendar date to a julian day count"],join:["string join(array src, string glue)","An alias for implode"],jpeg2wbmp:["bool jpeg2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)","Convert JPEG image to WBMP image"],json_decode:["mixed json_decode(string json [, bool assoc [, long depth]])","Decodes the JSON representation into a PHP value"],json_encode:["string json_encode(mixed data [, int options])","Returns the JSON representation of a value"],json_last_error:["int json_last_error()","Returns the error code of the last json_decode()."],juliantojd:["int juliantojd(int month, int day, int year)","Converts a julian calendar date to julian day count"],key:["mixed key(array array_arg)","Return the key of the element currently pointed to by the internal array pointer"],krsort:["bool krsort(array &array_arg [, int sort_flags])","Sort an array by key value in reverse order"],ksort:["bool ksort(array &array_arg [, int sort_flags])","Sort an array by key"],lcfirst:["string lcfirst(string str)","Make a string's first character lowercase"],lcg_value:["float lcg_value()","Returns a value from the combined linear congruential generator"],lchgrp:["bool lchgrp(string filename, mixed group)","Change symlink group"],ldap_8859_to_t61:["string ldap_8859_to_t61(string value)","Translate 8859 characters to t61 characters"],ldap_add:["bool ldap_add(resource link, string dn, array entry)","Add entries to LDAP directory"],ldap_bind:["bool ldap_bind(resource link [, string dn [, string password]])","Bind to LDAP directory"],ldap_compare:["bool ldap_compare(resource link, string dn, string attr, string value)","Determine if an entry has a specific value for one of its attributes"],ldap_connect:["resource ldap_connect([string host [, int port [, string wallet [, string wallet_passwd [, int authmode]]]]])","Connect to an LDAP server"],ldap_count_entries:["int ldap_count_entries(resource link, resource result)","Count the number of entries in a search result"],ldap_delete:["bool ldap_delete(resource link, string dn)","Delete an entry from a directory"],ldap_dn2ufn:["string ldap_dn2ufn(string dn)","Convert DN to User Friendly Naming format"],ldap_err2str:["string ldap_err2str(int errno)","Convert error number to error string"],ldap_errno:["int ldap_errno(resource link)","Get the current ldap error number"],ldap_error:["string ldap_error(resource link)","Get the current ldap error string"],ldap_explode_dn:["array ldap_explode_dn(string dn, int with_attrib)","Splits DN into its component parts"],ldap_first_attribute:["string ldap_first_attribute(resource link, resource result_entry)","Return first attribute"],ldap_first_entry:["resource ldap_first_entry(resource link, resource result)","Return first result id"],ldap_first_reference:["resource ldap_first_reference(resource link, resource result)","Return first reference"],ldap_free_result:["bool ldap_free_result(resource result)","Free result memory"],ldap_get_attributes:["array ldap_get_attributes(resource link, resource result_entry)","Get attributes from a search result entry"],ldap_get_dn:["string ldap_get_dn(resource link, resource result_entry)","Get the DN of a result entry"],ldap_get_entries:["array ldap_get_entries(resource link, resource result)","Get all result entries"],ldap_get_option:["bool ldap_get_option(resource link, int option, mixed retval)","Get the current value of various session-wide parameters"],ldap_get_values_len:["array ldap_get_values_len(resource link, resource result_entry, string attribute)","Get all values with lengths from a result entry"],ldap_list:["resource ldap_list(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])","Single-level search"],ldap_mod_add:["bool ldap_mod_add(resource link, string dn, array entry)","Add attribute values to current"],ldap_mod_del:["bool ldap_mod_del(resource link, string dn, array entry)","Delete attribute values"],ldap_mod_replace:["bool ldap_mod_replace(resource link, string dn, array entry)","Replace attribute values with new ones"],ldap_next_attribute:["string ldap_next_attribute(resource link, resource result_entry)","Get the next attribute in result"],ldap_next_entry:["resource ldap_next_entry(resource link, resource result_entry)","Get next result entry"],ldap_next_reference:["resource ldap_next_reference(resource link, resource reference_entry)","Get next reference"],ldap_parse_reference:["bool ldap_parse_reference(resource link, resource reference_entry, array referrals)","Extract information from reference entry"],ldap_parse_result:["bool ldap_parse_result(resource link, resource result, int errcode, string matcheddn, string errmsg, array referrals)","Extract information from result"],ldap_read:["resource ldap_read(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])","Read an entry"],ldap_rename:["bool ldap_rename(resource link, string dn, string newrdn, string newparent, bool deleteoldrdn);","Modify the name of an entry"],ldap_sasl_bind:["bool ldap_sasl_bind(resource link [, string binddn [, string password [, string sasl_mech [, string sasl_realm [, string sasl_authc_id [, string sasl_authz_id [, string props]]]]]]])","Bind to LDAP directory using SASL"],ldap_search:["resource ldap_search(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])","Search LDAP tree under base_dn"],ldap_set_option:["bool ldap_set_option(resource link, int option, mixed newval)","Set the value of various session-wide parameters"],ldap_set_rebind_proc:["bool ldap_set_rebind_proc(resource link, string callback)","Set a callback function to do re-binds on referral chasing."],ldap_sort:["bool ldap_sort(resource link, resource result, string sortfilter)","Sort LDAP result entries"],ldap_start_tls:["bool ldap_start_tls(resource link)","Start TLS"],ldap_t61_to_8859:["string ldap_t61_to_8859(string value)","Translate t61 characters to 8859 characters"],ldap_unbind:["bool ldap_unbind(resource link)","Unbind from LDAP directory"],leak:["void leak(int num_bytes=3)","Cause an intentional memory leak, for testing/debugging purposes"],levenshtein:["int levenshtein(string str1, string str2[, int cost_ins, int cost_rep, int cost_del])","Calculate Levenshtein distance between two strings"],libxml_clear_errors:["void libxml_clear_errors()","Clear last error from libxml"],libxml_disable_entity_loader:["bool libxml_disable_entity_loader([boolean disable])","Disable/Enable ability to load external entities"],libxml_get_errors:["object libxml_get_errors()","Retrieve array of errors"],libxml_get_last_error:["object libxml_get_last_error()","Retrieve last error from libxml"],libxml_set_streams_context:["void libxml_set_streams_context(resource streams_context)","Set the streams context for the next libxml document load or write"],libxml_use_internal_errors:["bool libxml_use_internal_errors([boolean use_errors])","Disable libxml errors and allow user to fetch error information as needed"],link:["int link(string target, string link)","Create a hard link"],linkinfo:["int linkinfo(string filename)","Returns the st_dev field of the UNIX C stat structure describing the link"],litespeed_request_headers:["array litespeed_request_headers(void)","Fetch all HTTP request headers"],litespeed_response_headers:["array litespeed_response_headers(void)","Fetch all HTTP response headers"],locale_accept_from_http:["string locale_accept_from_http(string $http_accept)",null],locale_canonicalize:["static string locale_canonicalize(Locale $loc, string $locale)","* @param string $locale The locale string to canonicalize"],locale_filter_matches:["boolean locale_filter_matches(string $langtag, string $locale[, bool $canonicalize])","* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm"],locale_get_all_variants:["static array locale_get_all_variants($locale)","* gets an array containing the list of variants, or null"],locale_get_default:["static string locale_get_default( )","Get default locale"],locale_get_keywords:["static array locale_get_keywords(string $locale) {","* return an associative array containing keyword-value * pairs for this locale. The keys are keys to the array (doh!)"],locale_get_primary_language:["static string locale_get_primary_language($locale)","* gets the primary language for the $locale"],locale_get_region:["static string locale_get_region($locale)","* gets the region for the $locale"],locale_get_script:["static string locale_get_script($locale)","* gets the script for the $locale"],locale_lookup:["string locale_lookup(array $langtag, string $locale[, bool $canonicalize[, string $default = null]])","* Searchs the items in $langtag for the best match to the language * range"],locale_set_default:["static string locale_set_default( string $locale )","Set default locale"],localeconv:["array localeconv(void)","Returns numeric formatting information based on the current locale"],localtime:["array localtime([int timestamp [, bool associative_array]])","Returns the results of the C system call localtime as an associative array if the associative_array argument is set to 1 other wise it is a regular array"],log:["float log(float number, [float base])","Returns the natural logarithm of the number, or the base log if base is specified"],log10:["float log10(float number)","Returns the base-10 logarithm of the number"],log1p:["float log1p(float number)","Returns log(1 + number), computed in a way that accurate even when the value of number is close to zero"],long2ip:["string long2ip(int proper_address)","Converts an (IPv4) Internet network address into a string in Internet standard dotted format"],lstat:["array lstat(string filename)","Give information about a file or symbolic link"],ltrim:["string ltrim(string str [, string character_mask])","Strips whitespace from the beginning of a string"],mail:["int mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])","Send an email message"],max:["mixed max(mixed arg1 [, mixed arg2 [, mixed ...]])","Return the highest value in an array or a series of arguments"],mb_check_encoding:["bool mb_check_encoding([string var[, string encoding]])","Check if the string is valid for the specified encoding"],mb_convert_case:["string mb_convert_case(string sourcestring, int mode [, string encoding])","Returns a case-folded version of sourcestring"],mb_convert_encoding:["string mb_convert_encoding(string str, string to-encoding [, mixed from-encoding])","Returns converted string in desired encoding"],mb_convert_kana:["string mb_convert_kana(string str [, string option] [, string encoding])","Conversion between full-width character and half-width character (Japanese)"],mb_convert_variables:["string mb_convert_variables(string to-encoding, mixed from-encoding, mixed vars [, ...])","Converts the string resource in variables to desired encoding"],mb_decode_mimeheader:["string mb_decode_mimeheader(string string)",'Decodes the MIME "encoded-word" in the string'],mb_decode_numericentity:["string mb_decode_numericentity(string string, array convmap [, string encoding])","Converts HTML numeric entities to character code"],mb_detect_encoding:["string mb_detect_encoding(string str [, mixed encoding_list [, bool strict]])","Encodings of the given string is returned (as a string)"],mb_detect_order:["bool|array mb_detect_order([mixed encoding-list])","Sets the current detect_order or Return the current detect_order as a array"],mb_encode_mimeheader:["string mb_encode_mimeheader(string str [, string charset [, string transfer-encoding [, string linefeed [, int indent]]]])",'Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?='],mb_encode_numericentity:["string mb_encode_numericentity(string string, array convmap [, string encoding])","Converts specified characters to HTML numeric entities"],mb_encoding_aliases:["array mb_encoding_aliases(string encoding)","Returns an array of the aliases of a given encoding name"],mb_ereg:["int mb_ereg(string pattern, string string [, array registers])","Regular expression match for multibyte string"],mb_ereg_match:["bool mb_ereg_match(string pattern, string string [,string option])","Regular expression match for multibyte string"],mb_ereg_replace:["string mb_ereg_replace(string pattern, string replacement, string string [, string option])","Replace regular expression for multibyte string"],mb_ereg_search:["bool mb_ereg_search([string pattern[, string option]])","Regular expression search for multibyte string"],mb_ereg_search_getpos:["int mb_ereg_search_getpos(void)","Get search start position"],mb_ereg_search_getregs:["array mb_ereg_search_getregs(void)","Get matched substring of the last time"],mb_ereg_search_init:["bool mb_ereg_search_init(string string [, string pattern[, string option]])","Initialize string and regular expression for search."],mb_ereg_search_pos:["array mb_ereg_search_pos([string pattern[, string option]])","Regular expression search for multibyte string"],mb_ereg_search_regs:["array mb_ereg_search_regs([string pattern[, string option]])","Regular expression search for multibyte string"],mb_ereg_search_setpos:["bool mb_ereg_search_setpos(int position)","Set search start position"],mb_eregi:["int mb_eregi(string pattern, string string [, array registers])","Case-insensitive regular expression match for multibyte string"],mb_eregi_replace:["string mb_eregi_replace(string pattern, string replacement, string string)","Case insensitive replace regular expression for multibyte string"],mb_get_info:["mixed mb_get_info([string type])","Returns the current settings of mbstring"],mb_http_input:["mixed mb_http_input([string type])","Returns the input encoding"],mb_http_output:["string mb_http_output([string encoding])","Sets the current output_encoding or returns the current output_encoding as a string"],mb_internal_encoding:["string mb_internal_encoding([string encoding])","Sets the current internal encoding or Returns the current internal encoding as a string"],mb_language:["string mb_language([string language])","Sets the current language or Returns the current language as a string"],mb_list_encodings:["mixed mb_list_encodings()","Returns an array of all supported entity encodings"],mb_output_handler:["string mb_output_handler(string contents, int status)","Returns string in output buffer converted to the http_output encoding"],mb_parse_str:["bool mb_parse_str(string encoded_string [, array result])","Parses GET/POST/COOKIE data and sets global variables"],mb_preferred_mime_name:["string mb_preferred_mime_name(string encoding)","Return the preferred MIME name (charset) as a string"],mb_regex_encoding:["string mb_regex_encoding([string encoding])","Returns the current encoding for regex as a string."],mb_regex_set_options:["string mb_regex_set_options([string options])","Set or get the default options for mbregex functions"],mb_send_mail:["int mb_send_mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])","* Sends an email message with MIME scheme"],mb_split:["array mb_split(string pattern, string string [, int limit])","split multibyte string into array by regular expression"],mb_strcut:["string mb_strcut(string str, int start [, int length [, string encoding]])","Returns part of a string"],mb_strimwidth:["string mb_strimwidth(string str, int start, int width [, string trimmarker [, string encoding]])","Trim the string in terminal width"],mb_stripos:["int mb_stripos(string haystack, string needle [, int offset [, string encoding]])","Finds position of first occurrence of a string within another, case insensitive"],mb_stristr:["string mb_stristr(string haystack, string needle[, bool part[, string encoding]])","Finds first occurrence of a string within another, case insensitive"],mb_strlen:["int mb_strlen(string str [, string encoding])","Get character numbers of a string"],mb_strpos:["int mb_strpos(string haystack, string needle [, int offset [, string encoding]])","Find position of first occurrence of a string within another"],mb_strrchr:["string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])","Finds the last occurrence of a character in a string within another"],mb_strrichr:["string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])","Finds the last occurrence of a character in a string within another, case insensitive"],mb_strripos:["int mb_strripos(string haystack, string needle [, int offset [, string encoding]])","Finds position of last occurrence of a string within another, case insensitive"],mb_strrpos:["int mb_strrpos(string haystack, string needle [, int offset [, string encoding]])","Find position of last occurrence of a string within another"],mb_strstr:["string mb_strstr(string haystack, string needle[, bool part[, string encoding]])","Finds first occurrence of a string within another"],mb_strtolower:["string mb_strtolower(string sourcestring [, string encoding])","* Returns a lowercased version of sourcestring"],mb_strtoupper:["string mb_strtoupper(string sourcestring [, string encoding])","* Returns a uppercased version of sourcestring"],mb_strwidth:["int mb_strwidth(string str [, string encoding])","Gets terminal width of a string"],mb_substitute_character:["mixed mb_substitute_character([mixed substchar])","Sets the current substitute_character or returns the current substitute_character"],mb_substr:["string mb_substr(string str, int start [, int length [, string encoding]])","Returns part of a string"],mb_substr_count:["int mb_substr_count(string haystack, string needle [, string encoding])","Count the number of substring occurrences"],mcrypt_cbc:["string mcrypt_cbc(int cipher, string key, string data, int mode, string iv)","CBC crypt/decrypt data using key key with cipher cipher starting with iv"],mcrypt_cfb:["string mcrypt_cfb(int cipher, string key, string data, int mode, string iv)","CFB crypt/decrypt data using key key with cipher cipher starting with iv"],mcrypt_create_iv:["string mcrypt_create_iv(int size, int source)","Create an initialization vector (IV)"],mcrypt_decrypt:["string mcrypt_decrypt(string cipher, string key, string data, string mode, string iv)","OFB crypt/decrypt data using key key with cipher cipher starting with iv"],mcrypt_ecb:["string mcrypt_ecb(int cipher, string key, string data, int mode, string iv)","ECB crypt/decrypt data using key key with cipher cipher starting with iv"],mcrypt_enc_get_algorithms_name:["string mcrypt_enc_get_algorithms_name(resource td)","Returns the name of the algorithm specified by the descriptor td"],mcrypt_enc_get_block_size:["int mcrypt_enc_get_block_size(resource td)","Returns the block size of the cipher specified by the descriptor td"],mcrypt_enc_get_iv_size:["int mcrypt_enc_get_iv_size(resource td)","Returns the size of the IV in bytes of the algorithm specified by the descriptor td"],mcrypt_enc_get_key_size:["int mcrypt_enc_get_key_size(resource td)","Returns the maximum supported key size in bytes of the algorithm specified by the descriptor td"],mcrypt_enc_get_modes_name:["string mcrypt_enc_get_modes_name(resource td)","Returns the name of the mode specified by the descriptor td"],mcrypt_enc_get_supported_key_sizes:["array mcrypt_enc_get_supported_key_sizes(resource td)","This function decrypts the crypttext"],mcrypt_enc_is_block_algorithm:["bool mcrypt_enc_is_block_algorithm(resource td)","Returns TRUE if the alrogithm is a block algorithms"],mcrypt_enc_is_block_algorithm_mode:["bool mcrypt_enc_is_block_algorithm_mode(resource td)","Returns TRUE if the mode is for use with block algorithms"],mcrypt_enc_is_block_mode:["bool mcrypt_enc_is_block_mode(resource td)","Returns TRUE if the mode outputs blocks"],mcrypt_enc_self_test:["int mcrypt_enc_self_test(resource td)","This function runs the self test on the algorithm specified by the descriptor td"],mcrypt_encrypt:["string mcrypt_encrypt(string cipher, string key, string data, string mode, string iv)","OFB crypt/decrypt data using key key with cipher cipher starting with iv"],mcrypt_generic:["string mcrypt_generic(resource td, string data)","This function encrypts the plaintext"],mcrypt_generic_deinit:["bool mcrypt_generic_deinit(resource td)","This function terminates encrypt specified by the descriptor td"],mcrypt_generic_init:["int mcrypt_generic_init(resource td, string key, string iv)","This function initializes all buffers for the specific module"],mcrypt_get_block_size:["int mcrypt_get_block_size(string cipher, string module)","Get the key size of cipher"],mcrypt_get_cipher_name:["string mcrypt_get_cipher_name(string cipher)","Get the key size of cipher"],mcrypt_get_iv_size:["int mcrypt_get_iv_size(string cipher, string module)","Get the IV size of cipher (Usually the same as the blocksize)"],mcrypt_get_key_size:["int mcrypt_get_key_size(string cipher, string module)","Get the key size of cipher"],mcrypt_list_algorithms:["array mcrypt_list_algorithms([string lib_dir])",'List all algorithms in "module_dir"'],mcrypt_list_modes:["array mcrypt_list_modes([string lib_dir])",'List all modes "module_dir"'],mcrypt_module_close:["bool mcrypt_module_close(resource td)","Free the descriptor td"],mcrypt_module_get_algo_block_size:["int mcrypt_module_get_algo_block_size(string algorithm [, string lib_dir])","Returns the block size of the algorithm"],mcrypt_module_get_algo_key_size:["int mcrypt_module_get_algo_key_size(string algorithm [, string lib_dir])","Returns the maximum supported key size of the algorithm"],mcrypt_module_get_supported_key_sizes:["array mcrypt_module_get_supported_key_sizes(string algorithm [, string lib_dir])","This function decrypts the crypttext"],mcrypt_module_is_block_algorithm:["bool mcrypt_module_is_block_algorithm(string algorithm [, string lib_dir])","Returns TRUE if the algorithm is a block algorithm"],mcrypt_module_is_block_algorithm_mode:["bool mcrypt_module_is_block_algorithm_mode(string mode [, string lib_dir])","Returns TRUE if the mode is for use with block algorithms"],mcrypt_module_is_block_mode:["bool mcrypt_module_is_block_mode(string mode [, string lib_dir])","Returns TRUE if the mode outputs blocks of bytes"],mcrypt_module_open:["resource mcrypt_module_open(string cipher, string cipher_directory, string mode, string mode_directory)","Opens the module of the algorithm and the mode to be used"],mcrypt_module_self_test:["bool mcrypt_module_self_test(string algorithm [, string lib_dir])",'Does a self test of the module "module"'],mcrypt_ofb:["string mcrypt_ofb(int cipher, string key, string data, int mode, string iv)","OFB crypt/decrypt data using key key with cipher cipher starting with iv"],md5:["string md5(string str, [ bool raw_output])","Calculate the md5 hash of a string"],md5_file:["string md5_file(string filename [, bool raw_output])","Calculate the md5 hash of given filename"],mdecrypt_generic:["string mdecrypt_generic(resource td, string data)","This function decrypts the plaintext"],memory_get_peak_usage:["int memory_get_peak_usage([real_usage])","Returns the peak allocated by PHP memory"],memory_get_usage:["int memory_get_usage([real_usage])","Returns the allocated by PHP memory"],metaphone:["string metaphone(string text[, int phones])","Break english phrases down into their phonemes"],method_exists:["bool method_exists(object object, string method)","Checks if the class method exists"],mhash:["string mhash(int hash, string data [, string key])","Hash data with hash"],mhash_count:["int mhash_count(void)","Gets the number of available hashes"],mhash_get_block_size:["int mhash_get_block_size(int hash)","Gets the block size of hash"],mhash_get_hash_name:["string mhash_get_hash_name(int hash)","Gets the name of hash"],mhash_keygen_s2k:["string mhash_keygen_s2k(int hash, string input_password, string salt, int bytes)","Generates a key using hash functions"],microtime:["mixed microtime([bool get_as_float])","Returns either a string or a float containing the current time in seconds and microseconds"],mime_content_type:["string mime_content_type(string filename|resource stream)","Return content-type for file"],min:["mixed min(mixed arg1 [, mixed arg2 [, mixed ...]])","Return the lowest value in an array or a series of arguments"],mkdir:["bool mkdir(string pathname [, int mode [, bool recursive [, resource context]]])","Create a directory"],mktime:["int mktime([int hour [, int min [, int sec [, int mon [, int day [, int year]]]]]])","Get UNIX timestamp for a date"],money_format:["string money_format(string format , float value)","Convert monetary value(s) to string"],move_uploaded_file:["bool move_uploaded_file(string path, string new_path)","Move a file if and only if it was created by an upload"],msg_get_queue:["resource msg_get_queue(int key [, int perms])","Attach to a message queue"],msg_queue_exists:["bool msg_queue_exists(int key)","Check wether a message queue exists"],msg_receive:["mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed message [, bool unserialize=true [, int flags=0 [, int errorcode]]])","Send a message of type msgtype (must be > 0) to a message queue"],msg_remove_queue:["bool msg_remove_queue(resource queue)","Destroy the queue"],msg_send:["bool msg_send(resource queue, int msgtype, mixed message [, bool serialize=true [, bool blocking=true [, int errorcode]]])","Send a message of type msgtype (must be > 0) to a message queue"],msg_set_queue:["bool msg_set_queue(resource queue, array data)","Set information for a message queue"],msg_stat_queue:["array msg_stat_queue(resource queue)","Returns information about a message queue"],msgfmt_create:["MessageFormatter msgfmt_create( string $locale, string $pattern )","* Create formatter."],msgfmt_format:["mixed msgfmt_format( MessageFormatter $nf, array $args )","* Format a message."],msgfmt_format_message:["mixed msgfmt_format_message( string $locale, string $pattern, array $args )","* Format a message."],msgfmt_get_error_code:["int msgfmt_get_error_code( MessageFormatter $nf )","* Get formatter's last error code."],msgfmt_get_error_message:["string msgfmt_get_error_message( MessageFormatter $coll )","* Get text description for formatter's last error code."],msgfmt_get_locale:["string msgfmt_get_locale(MessageFormatter $mf)","* Get formatter locale."],msgfmt_get_pattern:["string msgfmt_get_pattern( MessageFormatter $mf )","* Get formatter pattern."],msgfmt_parse:["array msgfmt_parse( MessageFormatter $nf, string $source )","* Parse a message."],msgfmt_set_pattern:["bool msgfmt_set_pattern( MessageFormatter $mf, string $pattern )","* Set formatter pattern."],mssql_bind:["bool mssql_bind(resource stmt, string param_name, mixed var, int type [, bool is_output [, bool is_null [, int maxlen]]])","Adds a parameter to a stored procedure or a remote stored procedure"],mssql_close:["bool mssql_close([resource conn_id])","Closes a connection to a MS-SQL server"],mssql_connect:["int mssql_connect([string servername [, string username [, string password [, bool new_link]]]])","Establishes a connection to a MS-SQL server"],mssql_data_seek:["bool mssql_data_seek(resource result_id, int offset)","Moves the internal row pointer of the MS-SQL result associated with the specified result identifier to pointer to the specified row number"],mssql_execute:["mixed mssql_execute(resource stmt [, bool skip_results = false])","Executes a stored procedure on a MS-SQL server database"],mssql_fetch_array:["array mssql_fetch_array(resource result_id [, int result_type])","Returns an associative array of the current row in the result set specified by result_id"],mssql_fetch_assoc:["array mssql_fetch_assoc(resource result_id)","Returns an associative array of the current row in the result set specified by result_id"],mssql_fetch_batch:["int mssql_fetch_batch(resource result_index)","Returns the next batch of records"],mssql_fetch_field:["object mssql_fetch_field(resource result_id [, int offset])","Gets information about certain fields in a query result"],mssql_fetch_object:["object mssql_fetch_object(resource result_id)","Returns a pseudo-object of the current row in the result set specified by result_id"],mssql_fetch_row:["array mssql_fetch_row(resource result_id)","Returns an array of the current row in the result set specified by result_id"],mssql_field_length:["int mssql_field_length(resource result_id [, int offset])","Get the length of a MS-SQL field"],mssql_field_name:["string mssql_field_name(resource result_id [, int offset])","Returns the name of the field given by offset in the result set given by result_id"],mssql_field_seek:["bool mssql_field_seek(resource result_id, int offset)","Seeks to the specified field offset"],mssql_field_type:["string mssql_field_type(resource result_id [, int offset])","Returns the type of a field"],mssql_free_result:["bool mssql_free_result(resource result_index)","Free a MS-SQL result index"],mssql_free_statement:["bool mssql_free_statement(resource result_index)","Free a MS-SQL statement index"],mssql_get_last_message:["string mssql_get_last_message(void)","Gets the last message from the MS-SQL server"],mssql_guid_string:["string mssql_guid_string(string binary [,bool short_format])","Converts a 16 byte binary GUID to a string"],mssql_init:["int mssql_init(string sp_name [, resource conn_id])","Initializes a stored procedure or a remote stored procedure"],mssql_min_error_severity:["void mssql_min_error_severity(int severity)","Sets the lower error severity"],mssql_min_message_severity:["void mssql_min_message_severity(int severity)","Sets the lower message severity"],mssql_next_result:["bool mssql_next_result(resource result_id)","Move the internal result pointer to the next result"],mssql_num_fields:["int mssql_num_fields(resource mssql_result_index)","Returns the number of fields fetched in from the result id specified"],mssql_num_rows:["int mssql_num_rows(resource mssql_result_index)","Returns the number of rows fetched in from the result id specified"],mssql_pconnect:["int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]])","Establishes a persistent connection to a MS-SQL server"],mssql_query:["resource mssql_query(string query [, resource conn_id [, int batch_size]])","Perform an SQL query on a MS-SQL server database"],mssql_result:["string mssql_result(resource result_id, int row, mixed field)","Returns the contents of one cell from a MS-SQL result set"],mssql_rows_affected:["int mssql_rows_affected(resource conn_id)","Returns the number of records affected by the query"],mssql_select_db:["bool mssql_select_db(string database_name [, resource conn_id])","Select a MS-SQL database"],mt_getrandmax:["int mt_getrandmax(void)","Returns the maximum value a random number from Mersenne Twister can have"],mt_rand:["int mt_rand([int min, int max])","Returns a random number from Mersenne Twister"],mt_srand:["void mt_srand([int seed])","Seeds Mersenne Twister random number generator"],mysql_affected_rows:["int mysql_affected_rows([int link_identifier])","Gets number of affected rows in previous MySQL operation"],mysql_client_encoding:["string mysql_client_encoding([int link_identifier])","Returns the default character set for the current connection"],mysql_close:["bool mysql_close([int link_identifier])","Close a MySQL connection"],mysql_connect:["resource mysql_connect([string hostname[:port][:/path/to/socket] [, string username [, string password [, bool new [, int flags]]]]])","Opens a connection to a MySQL Server"],mysql_create_db:["bool mysql_create_db(string database_name [, int link_identifier])","Create a MySQL database"],mysql_data_seek:["bool mysql_data_seek(resource result, int row_number)","Move internal result pointer"],mysql_db_query:["resource mysql_db_query(string database_name, string query [, int link_identifier])","Sends an SQL query to MySQL"],mysql_drop_db:["bool mysql_drop_db(string database_name [, int link_identifier])","Drops (delete) a MySQL database"],mysql_errno:["int mysql_errno([int link_identifier])","Returns the number of the error message from previous MySQL operation"],mysql_error:["string mysql_error([int link_identifier])","Returns the text of the error message from previous MySQL operation"],mysql_escape_string:["string mysql_escape_string(string to_be_escaped)","Escape string for mysql query"],mysql_fetch_array:["array mysql_fetch_array(resource result [, int result_type])","Fetch a result row as an array (associative, numeric or both)"],mysql_fetch_assoc:["array mysql_fetch_assoc(resource result)","Fetch a result row as an associative array"],mysql_fetch_field:["object mysql_fetch_field(resource result [, int field_offset])","Gets column information from a result and return as an object"],mysql_fetch_lengths:["array mysql_fetch_lengths(resource result)","Gets max data size of each column in a result"],mysql_fetch_object:["object mysql_fetch_object(resource result [, string class_name [, NULL|array ctor_params]])","Fetch a result row as an object"],mysql_fetch_row:["array mysql_fetch_row(resource result)","Gets a result row as an enumerated array"],mysql_field_flags:["string mysql_field_flags(resource result, int field_offset)","Gets the flags associated with the specified field in a result"],mysql_field_len:["int mysql_field_len(resource result, int field_offset)","Returns the length of the specified field"],mysql_field_name:["string mysql_field_name(resource result, int field_index)","Gets the name of the specified field in a result"],mysql_field_seek:["bool mysql_field_seek(resource result, int field_offset)","Sets result pointer to a specific field offset"],mysql_field_table:["string mysql_field_table(resource result, int field_offset)","Gets name of the table the specified field is in"],mysql_field_type:["string mysql_field_type(resource result, int field_offset)","Gets the type of the specified field in a result"],mysql_free_result:["bool mysql_free_result(resource result)","Free result memory"],mysql_get_client_info:["string mysql_get_client_info(void)","Returns a string that represents the client library version"],mysql_get_host_info:["string mysql_get_host_info([int link_identifier])","Returns a string describing the type of connection in use, including the server host name"],mysql_get_proto_info:["int mysql_get_proto_info([int link_identifier])","Returns the protocol version used by current connection"],mysql_get_server_info:["string mysql_get_server_info([int link_identifier])","Returns a string that represents the server version number"],mysql_info:["string mysql_info([int link_identifier])","Returns a string containing information about the most recent query"],mysql_insert_id:["int mysql_insert_id([int link_identifier])","Gets the ID generated from the previous INSERT operation"],mysql_list_dbs:["resource mysql_list_dbs([int link_identifier])","List databases available on a MySQL server"],mysql_list_fields:["resource mysql_list_fields(string database_name, string table_name [, int link_identifier])","List MySQL result fields"],mysql_list_processes:["resource mysql_list_processes([int link_identifier])","Returns a result set describing the current server threads"],mysql_list_tables:["resource mysql_list_tables(string database_name [, int link_identifier])","List tables in a MySQL database"],mysql_num_fields:["int mysql_num_fields(resource result)","Gets number of fields in a result"],mysql_num_rows:["int mysql_num_rows(resource result)","Gets number of rows in a result"],mysql_pconnect:["resource mysql_pconnect([string hostname[:port][:/path/to/socket] [, string username [, string password [, int flags]]]])","Opens a persistent connection to a MySQL Server"],mysql_ping:["bool mysql_ping([int link_identifier])","Ping a server connection. If no connection then reconnect."],mysql_query:["resource mysql_query(string query [, int link_identifier])","Sends an SQL query to MySQL"],mysql_real_escape_string:["string mysql_real_escape_string(string to_be_escaped [, int link_identifier])","Escape special characters in a string for use in a SQL statement, taking into account the current charset of the connection"],mysql_result:["mixed mysql_result(resource result, int row [, mixed field])","Gets result data"],mysql_select_db:["bool mysql_select_db(string database_name [, int link_identifier])","Selects a MySQL database"],mysql_set_charset:["bool mysql_set_charset(string csname [, int link_identifier])","sets client character set"],mysql_stat:["string mysql_stat([int link_identifier])","Returns a string containing status information"],mysql_thread_id:["int mysql_thread_id([int link_identifier])","Returns the thread id of current connection"],mysql_unbuffered_query:["resource mysql_unbuffered_query(string query [, int link_identifier])","Sends an SQL query to MySQL, without fetching and buffering the result rows"],mysqli_affected_rows:["mixed mysqli_affected_rows(object link)","Get number of affected rows in previous MySQL operation"],mysqli_autocommit:["bool mysqli_autocommit(object link, bool mode)","Turn auto commit on or of"],mysqli_cache_stats:["array mysqli_cache_stats(void)","Returns statistics about the zval cache"],mysqli_change_user:["bool mysqli_change_user(object link, string user, string password, string database)","Change logged-in user of the active connection"],mysqli_character_set_name:["string mysqli_character_set_name(object link)","Returns the name of the character set used for this connection"],mysqli_close:["bool mysqli_close(object link)","Close connection"],mysqli_commit:["bool mysqli_commit(object link)","Commit outstanding actions and close transaction"],mysqli_connect:["object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]])","Open a connection to a mysql server"],mysqli_connect_errno:["int mysqli_connect_errno(void)","Returns the numerical value of the error message from last connect command"],mysqli_connect_error:["string mysqli_connect_error(void)","Returns the text of the error message from previous MySQL operation"],mysqli_data_seek:["bool mysqli_data_seek(object result, int offset)","Move internal result pointer"],mysqli_debug:["void mysqli_debug(string debug)",""],mysqli_dump_debug_info:["bool mysqli_dump_debug_info(object link)",""],mysqli_embedded_server_end:["void mysqli_embedded_server_end(void)",""],mysqli_embedded_server_start:["bool mysqli_embedded_server_start(bool start, array arguments, array groups)","initialize and start embedded server"],mysqli_errno:["int mysqli_errno(object link)","Returns the numerical value of the error message from previous MySQL operation"],mysqli_error:["string mysqli_error(object link)","Returns the text of the error message from previous MySQL operation"],mysqli_fetch_all:["mixed mysqli_fetch_all (object result [,int resulttype])","Fetches all result rows as an associative array, a numeric array, or both"],mysqli_fetch_array:["mixed mysqli_fetch_array (object result [,int resulttype])","Fetch a result row as an associative array, a numeric array, or both"],mysqli_fetch_assoc:["mixed mysqli_fetch_assoc (object result)","Fetch a result row as an associative array"],mysqli_fetch_field:["mixed mysqli_fetch_field (object result)","Get column information from a result and return as an object"],mysqli_fetch_field_direct:["mixed mysqli_fetch_field_direct (object result, int offset)","Fetch meta-data for a single field"],mysqli_fetch_fields:["mixed mysqli_fetch_fields (object result)","Return array of objects containing field meta-data"],mysqli_fetch_lengths:["mixed mysqli_fetch_lengths (object result)","Get the length of each output in a result"],mysqli_fetch_object:["mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]])","Fetch a result row as an object"],mysqli_fetch_row:["array mysqli_fetch_row (object result)","Get a result row as an enumerated array"],mysqli_field_count:["int mysqli_field_count(object link)","Fetch the number of fields returned by the last query for the given link"],mysqli_field_seek:["int mysqli_field_seek(object result, int fieldnr)","Set result pointer to a specified field offset"],mysqli_field_tell:["int mysqli_field_tell(object result)","Get current field offset of result pointer"],mysqli_free_result:["void mysqli_free_result(object result)","Free query result memory for the given result handle"],mysqli_get_charset:["object mysqli_get_charset(object link)","returns a character set object"],mysqli_get_client_info:["string mysqli_get_client_info(void)","Get MySQL client info"],mysqli_get_client_stats:["array mysqli_get_client_stats(void)","Returns statistics about the zval cache"],mysqli_get_client_version:["int mysqli_get_client_version(void)","Get MySQL client info"],mysqli_get_connection_stats:["array mysqli_get_connection_stats(void)","Returns statistics about the zval cache"],mysqli_get_host_info:["string mysqli_get_host_info (object link)","Get MySQL host info"],mysqli_get_proto_info:["int mysqli_get_proto_info(object link)","Get MySQL protocol information"],mysqli_get_server_info:["string mysqli_get_server_info(object link)","Get MySQL server info"],mysqli_get_server_version:["int mysqli_get_server_version(object link)","Return the MySQL version for the server referenced by the given link"],mysqli_get_warnings:["object mysqli_get_warnings(object link) */",'PHP_FUNCTION(mysqli_get_warnings) { MY_MYSQL *mysql; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; MYSQLI_WARNING *w; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); if (mysql_warning_count(mysql->mysql)) { w = php_get_warnings(mysql->mysql TSRMLS_CC); } else { RETURN_FALSE; } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = mysqli_resource->info = (void *)w; mysqli_resource->status = MYSQLI_STATUS_VALID; MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry); } /* }}}'],mysqli_info:["string mysqli_info(object link)","Get information about the most recent query"],mysqli_init:["resource mysqli_init(void)","Initialize mysqli and return a resource for use with mysql_real_connect"],mysqli_insert_id:["mixed mysqli_insert_id(object link)","Get the ID generated from the previous INSERT operation"],mysqli_kill:["bool mysqli_kill(object link, int processid)","Kill a mysql process on the server"],mysqli_link_construct:["object mysqli_link_construct()",""],mysqli_more_results:["bool mysqli_more_results(object link)","check if there any more query results from a multi query"],mysqli_multi_query:["bool mysqli_multi_query(object link, string query)","allows to execute multiple queries"],mysqli_next_result:["bool mysqli_next_result(object link)","read next result from multi_query"],mysqli_num_fields:["int mysqli_num_fields(object result)","Get number of fields in result"],mysqli_num_rows:["mixed mysqli_num_rows(object result)","Get number of rows in result"],mysqli_options:["bool mysqli_options(object link, int flags, mixed values)","Set options"],mysqli_ping:["bool mysqli_ping(object link)","Ping a server connection or reconnect if there is no connection"],mysqli_poll:["int mysqli_poll(array read, array write, array error, long sec [, long usec])","Poll connections"],mysqli_prepare:["mixed mysqli_prepare(object link, string query)","Prepare a SQL statement for execution"],mysqli_query:["mixed mysqli_query(object link, string query [,int resultmode]) */",'PHP_FUNCTION(mysqli_query) { MY_MYSQL *mysql; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; MYSQL_RES *result; char *query = NULL; unsigned int query_len; unsigned long resultmode = MYSQLI_STORE_RESULT; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) { return; } if (!query_len) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty query"); RETURN_FALSE; } if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode"); RETURN_FALSE; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); MYSQLI_DISABLE_MQ; #ifdef MYSQLI_USE_MYSQLND if (resultmode & MYSQLI_ASYNC) { if (mysqli_async_query(mysql->mysql, query, query_len)) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } mysql->async_result_fetch_type = resultmode & ~MYSQLI_ASYNC; RETURN_TRUE; } #endif if (mysql_real_query(mysql->mysql, query, query_len)) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } if (!mysql_field_count(mysql->mysql)) { /* no result set - not a SELECT'],mysqli_real_connect:["bool mysqli_real_connect(object link [,string hostname [,string username [,string passwd [,string dbname [,int port [,string socket [,int flags]]]]]]])","Open a connection to a mysql server"],mysqli_real_escape_string:["string mysqli_real_escape_string(object link, string escapestr)","Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection"],mysqli_real_query:["bool mysqli_real_query(object link, string query)","Binary-safe version of mysql_query()"],mysqli_reap_async_query:["int mysqli_reap_async_query(object link)","Poll connections"],mysqli_refresh:["bool mysqli_refresh(object link, long options)","Flush tables or caches, or reset replication server information"],mysqli_report:["bool mysqli_report(int flags)","sets report level"],mysqli_rollback:["bool mysqli_rollback(object link)","Undo actions from current transaction"],mysqli_select_db:["bool mysqli_select_db(object link, string dbname)","Select a MySQL database"],mysqli_set_charset:["bool mysqli_set_charset(object link, string csname)","sets client character set"],mysqli_set_local_infile_default:["void mysqli_set_local_infile_default(object link)","unsets user defined handler for load local infile command"],mysqli_set_local_infile_handler:["bool mysqli_set_local_infile_handler(object link, callback read_func)","Set callback functions for LOAD DATA LOCAL INFILE"],mysqli_sqlstate:["string mysqli_sqlstate(object link)","Returns the SQLSTATE error from previous MySQL operation"],mysqli_ssl_set:["bool mysqli_ssl_set(object link ,string key ,string cert ,string ca ,string capath ,string cipher])",""],mysqli_stat:["mixed mysqli_stat(object link)","Get current system status"],mysqli_stmt_affected_rows:["mixed mysqli_stmt_affected_rows(object stmt)","Return the number of rows affected in the last query for the given link"],mysqli_stmt_attr_get:["int mysqli_stmt_attr_get(object stmt, long attr)",""],mysqli_stmt_attr_set:["int mysqli_stmt_attr_set(object stmt, long attr, long mode)",""],mysqli_stmt_bind_param:["bool mysqli_stmt_bind_param(object stmt, string types, mixed variable [,mixed,....])","Bind variables to a prepared statement as parameters"],mysqli_stmt_bind_result:["bool mysqli_stmt_bind_result(object stmt, mixed var, [,mixed, ...])","Bind variables to a prepared statement for result storage"],mysqli_stmt_close:["bool mysqli_stmt_close(object stmt)","Close statement"],mysqli_stmt_data_seek:["void mysqli_stmt_data_seek(object stmt, int offset)","Move internal result pointer"],mysqli_stmt_errno:["int mysqli_stmt_errno(object stmt)",""],mysqli_stmt_error:["string mysqli_stmt_error(object stmt)",""],mysqli_stmt_execute:["bool mysqli_stmt_execute(object stmt)","Execute a prepared statement"],mysqli_stmt_fetch:["mixed mysqli_stmt_fetch(object stmt)","Fetch results from a prepared statement into the bound variables"],mysqli_stmt_field_count:["int mysqli_stmt_field_count(object stmt) {","Return the number of result columns for the given statement"],mysqli_stmt_free_result:["void mysqli_stmt_free_result(object stmt)","Free stored result memory for the given statement handle"],mysqli_stmt_get_result:["object mysqli_stmt_get_result(object link)","Buffer result set on client"],mysqli_stmt_get_warnings:["object mysqli_stmt_get_warnings(object link) */",'PHP_FUNCTION(mysqli_stmt_get_warnings) { MY_STMT *stmt; zval *stmt_link; MYSQLI_RESOURCE *mysqli_resource; MYSQLI_WARNING *w; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &stmt_link, mysqli_stmt_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt", MYSQLI_STATUS_VALID); if (mysqli_stmt_warning_count(stmt->stmt)) { w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC); } else { RETURN_FALSE; } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = mysqli_resource->info = (void *)w; mysqli_resource->status = MYSQLI_STATUS_VALID; MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry); } /* }}}'],mysqli_stmt_init:["mixed mysqli_stmt_init(object link)","Initialize statement object"],mysqli_stmt_insert_id:["mixed mysqli_stmt_insert_id(object stmt)","Get the ID generated from the previous INSERT operation"],mysqli_stmt_next_result:["bool mysqli_stmt_next_result(object link)","read next result from multi_query"],mysqli_stmt_num_rows:["mixed mysqli_stmt_num_rows(object stmt)","Return the number of rows in statements result set"],mysqli_stmt_param_count:["int mysqli_stmt_param_count(object stmt)","Return the number of parameter for the given statement"],mysqli_stmt_prepare:["bool mysqli_stmt_prepare(object stmt, string query)","prepare server side statement with query"],mysqli_stmt_reset:["bool mysqli_stmt_reset(object stmt)","reset a prepared statement"],mysqli_stmt_result_metadata:["mixed mysqli_stmt_result_metadata(object stmt)","return result set from statement"],mysqli_stmt_send_long_data:["bool mysqli_stmt_send_long_data(object stmt, int param_nr, string data)",""],mysqli_stmt_sqlstate:["string mysqli_stmt_sqlstate(object stmt)",""],mysqli_stmt_store_result:["bool mysqli_stmt_store_result(stmt)",""],mysqli_store_result:["object mysqli_store_result(object link)","Buffer result set on client"],mysqli_thread_id:["int mysqli_thread_id(object link)","Return the current thread ID"],mysqli_thread_safe:["bool mysqli_thread_safe(void)","Return whether thread safety is given or not"],mysqli_use_result:["mixed mysqli_use_result(object link)","Directly retrieve query results - do not buffer results on client side"],mysqli_warning_count:["int mysqli_warning_count (object link)","Return number of warnings from the last query for the given link"],natcasesort:["void natcasesort(array &array_arg)","Sort an array using case-insensitive natural sort"],natsort:["void natsort(array &array_arg)","Sort an array using natural sort"],next:["mixed next(array array_arg)","Move array argument's internal pointer to the next element and return it"],ngettext:["string ngettext(string MSGID1, string MSGID2, int N)","Plural version of gettext()"],nl2br:["string nl2br(string str [, bool is_xhtml])","Converts newlines to HTML line breaks"],nl_langinfo:["string nl_langinfo(int item)","Query language and locale information"],normalizer_is_normalize:["bool normalizer_is_normalize( string $input [, string $form = FORM_C] )","* Test if a string is in a given normalization form."],normalizer_normalize:["string normalizer_normalize( string $input [, string $form = FORM_C] )","* Normalize a string."],nsapi_request_headers:["array nsapi_request_headers(void)","Get all headers from the request"],nsapi_response_headers:["array nsapi_response_headers(void)","Get all headers from the response"],nsapi_virtual:["bool nsapi_virtual(string uri)","Perform an NSAPI sub-request"],number_format:["string number_format(float number [, int num_decimal_places [, string dec_seperator, string thousands_seperator]])","Formats a number with grouped thousands"],numfmt_create:["NumberFormatter numfmt_create( string $locale, int style[, string $pattern ] )","* Create number formatter."],numfmt_format:["mixed numfmt_format( NumberFormatter $nf, mixed $num[, int type] )","* Format a number."],numfmt_format_currency:["mixed numfmt_format_currency( NumberFormatter $nf, double $num, string $currency )","* Format a number as currency."],numfmt_get_attribute:["mixed numfmt_get_attribute( NumberFormatter $nf, int $attr )","* Get formatter attribute value."],numfmt_get_error_code:["int numfmt_get_error_code( NumberFormatter $nf )","* Get formatter's last error code."],numfmt_get_error_message:["string numfmt_get_error_message( NumberFormatter $nf )","* Get text description for formatter's last error code."],numfmt_get_locale:["string numfmt_get_locale( NumberFormatter $nf[, int type] )","* Get formatter locale."],numfmt_get_pattern:["string numfmt_get_pattern( NumberFormatter $nf )","* Get formatter pattern."],numfmt_get_symbol:["string numfmt_get_symbol( NumberFormatter $nf, int $attr )","* Get formatter symbol value."],numfmt_get_text_attribute:["string numfmt_get_text_attribute( NumberFormatter $nf, int $attr )","* Get formatter attribute value."],numfmt_parse:["mixed numfmt_parse( NumberFormatter $nf, string $str[, int $type, int &$position ])","* Parse a number."],numfmt_parse_currency:["double numfmt_parse_currency( NumberFormatter $nf, string $str, string $¤cy[, int $&position] )","* Parse a number as currency."],numfmt_parse_message:["array numfmt_parse_message( string $locale, string $pattern, string $source )","* Parse a message."],numfmt_set_attribute:["bool numfmt_set_attribute( NumberFormatter $nf, int $attr, mixed $value )","* Get formatter attribute value."],numfmt_set_pattern:["bool numfmt_set_pattern( NumberFormatter $nf, string $pattern )","* Set formatter pattern."],numfmt_set_symbol:["bool numfmt_set_symbol( NumberFormatter $nf, int $attr, string $symbol )","* Set formatter symbol value."],numfmt_set_text_attribute:["bool numfmt_set_text_attribute( NumberFormatter $nf, int $attr, string $value )","* Get formatter attribute value."],ob_clean:["bool ob_clean(void)","Clean (delete) the current output buffer"],ob_end_clean:["bool ob_end_clean(void)","Clean the output buffer, and delete current output buffer"],ob_end_flush:["bool ob_end_flush(void)","Flush (send) the output buffer, and delete current output buffer"],ob_flush:["bool ob_flush(void)","Flush (send) contents of the output buffer. The last buffer content is sent to next buffer"],ob_get_clean:["bool ob_get_clean(void)","Get current buffer contents and delete current output buffer"],ob_get_contents:["string ob_get_contents(void)","Return the contents of the output buffer"],ob_get_flush:["bool ob_get_flush(void)","Get current buffer contents, flush (send) the output buffer, and delete current output buffer"],ob_get_length:["int ob_get_length(void)","Return the length of the output buffer"],ob_get_level:["int ob_get_level(void)","Return the nesting level of the output buffer"],ob_get_status:["false|array ob_get_status([bool full_status])","Return the status of the active or all output buffers"],ob_gzhandler:["string ob_gzhandler(string str, int mode)","Encode str based on accept-encoding setting - designed to be called from ob_start()"],ob_iconv_handler:["string ob_iconv_handler(string contents, int status)","Returns str in output buffer converted to the iconv.output_encoding character set"],ob_implicit_flush:["void ob_implicit_flush([int flag])","Turn implicit flush on/off and is equivalent to calling flush() after every output call"],ob_list_handlers:["false|array ob_list_handlers()","* List all output_buffers in an array"],ob_start:["bool ob_start([ string|array user_function [, int chunk_size [, bool erase]]])","Turn on Output Buffering (specifying an optional output handler)."],oci_bind_array_by_name:["bool oci_bind_array_by_name(resource stmt, string name, array &var, int max_table_length [, int max_item_length [, int type ]])","Bind a PHP array to an Oracle PL/SQL type by name"],oci_bind_by_name:["bool oci_bind_by_name(resource stmt, string name, mixed &var, [, int maxlength [, int type]])","Bind a PHP variable to an Oracle placeholder by name"],oci_cancel:["bool oci_cancel(resource stmt)","Cancel reading from a cursor"],oci_close:["bool oci_close(resource connection)","Disconnect from database"],oci_collection_append:["bool oci_collection_append(string value)","Append an object to the collection"],oci_collection_assign:["bool oci_collection_assign(object from)","Assign a collection from another existing collection"],oci_collection_element_assign:["bool oci_collection_element_assign(int index, string val)","Assign element val to collection at index ndx"],oci_collection_element_get:["string oci_collection_element_get(int ndx)","Retrieve the value at collection index ndx"],oci_collection_max:["int oci_collection_max()","Return the max value of a collection. For a varray this is the maximum length of the array"],oci_collection_size:["int oci_collection_size()","Return the size of a collection"],oci_collection_trim:["bool oci_collection_trim(int num)","Trim num elements from the end of a collection"],oci_commit:["bool oci_commit(resource connection)","Commit the current context"],oci_connect:["resource oci_connect(string user, string pass [, string db [, string charset [, int session_mode ]])","Connect to an Oracle database and log on. Returns a new session."],oci_define_by_name:["bool oci_define_by_name(resource stmt, string name, mixed &var [, int type])","Define a PHP variable to an Oracle column by name"],oci_error:["array oci_error([resource stmt|connection|global])","Return the last error of stmt|connection|global. If no error happened returns false."],oci_execute:["bool oci_execute(resource stmt [, int mode])","Execute a parsed statement"],oci_fetch:["bool oci_fetch(resource stmt)","Prepare a new row of data for reading"],oci_fetch_all:["int oci_fetch_all(resource stmt, array &output[, int skip[, int maxrows[, int flags]]])","Fetch all rows of result data into an array"],oci_fetch_array:["array oci_fetch_array( resource stmt [, int mode ])","Fetch a result row as an array"],oci_fetch_assoc:["array oci_fetch_assoc( resource stmt )","Fetch a result row as an associative array"],oci_fetch_object:["object oci_fetch_object( resource stmt )","Fetch a result row as an object"],oci_fetch_row:["array oci_fetch_row( resource stmt )","Fetch a result row as an enumerated array"],oci_field_is_null:["bool oci_field_is_null(resource stmt, int col)","Tell whether a column is NULL"],oci_field_name:["string oci_field_name(resource stmt, int col)","Tell the name of a column"],oci_field_precision:["int oci_field_precision(resource stmt, int col)","Tell the precision of a column"],oci_field_scale:["int oci_field_scale(resource stmt, int col)","Tell the scale of a column"],oci_field_size:["int oci_field_size(resource stmt, int col)","Tell the maximum data size of a column"],oci_field_type:["mixed oci_field_type(resource stmt, int col)","Tell the data type of a column"],oci_field_type_raw:["int oci_field_type_raw(resource stmt, int col)","Tell the raw oracle data type of a column"],oci_free_collection:["bool oci_free_collection()","Deletes collection object"],oci_free_descriptor:["bool oci_free_descriptor()","Deletes large object description"],oci_free_statement:["bool oci_free_statement(resource stmt)","Free all resources associated with a statement"],oci_internal_debug:["void oci_internal_debug(int onoff)","Toggle internal debugging output for the OCI extension"],oci_lob_append:["bool oci_lob_append( object lob )","Appends data from a LOB to another LOB"],oci_lob_close:["bool oci_lob_close()","Closes lob descriptor"],oci_lob_copy:["bool oci_lob_copy( object lob_to, object lob_from [, int length ] )","Copies data from a LOB to another LOB"],oci_lob_eof:["bool oci_lob_eof()","Checks if EOF is reached"],oci_lob_erase:["int oci_lob_erase( [ int offset [, int length ] ] )","Erases a specified portion of the internal LOB, starting at a specified offset"],oci_lob_export:["bool oci_lob_export([string filename [, int start [, int length]]])","Writes a large object into a file"],oci_lob_flush:["bool oci_lob_flush( [ int flag ] )","Flushes the LOB buffer"],oci_lob_import:["bool oci_lob_import( string filename )","Loads file into a LOB"],oci_lob_is_equal:["bool oci_lob_is_equal( object lob1, object lob2 )","Tests to see if two LOB/FILE locators are equal"],oci_lob_load:["string oci_lob_load()","Loads a large object"],oci_lob_read:["string oci_lob_read( int length )","Reads particular part of a large object"],oci_lob_rewind:["bool oci_lob_rewind()","Rewind pointer of a LOB"],oci_lob_save:["bool oci_lob_save( string data [, int offset ])","Saves a large object"],oci_lob_seek:["bool oci_lob_seek( int offset [, int whence ])","Moves the pointer of a LOB"],oci_lob_size:["int oci_lob_size()","Returns size of a large object"],oci_lob_tell:["int oci_lob_tell()","Tells LOB pointer position"],oci_lob_truncate:["bool oci_lob_truncate( [ int length ])","Truncates a LOB"],oci_lob_write:["int oci_lob_write( string string [, int length ])","Writes data to current position of a LOB"],oci_lob_write_temporary:["bool oci_lob_write_temporary(string var [, int lob_type])","Writes temporary blob"],oci_new_collection:["object oci_new_collection(resource connection, string tdo [, string schema])","Initialize a new collection"],oci_new_connect:["resource oci_new_connect(string user, string pass [, string db])","Connect to an Oracle database and log on. Returns a new session."],oci_new_cursor:["resource oci_new_cursor(resource connection)","Return a new cursor (Statement-Handle) - use this to bind ref-cursors!"],oci_new_descriptor:["object oci_new_descriptor(resource connection [, int type])","Initialize a new empty descriptor LOB/FILE (LOB is default)"],oci_num_fields:["int oci_num_fields(resource stmt)","Return the number of result columns in a statement"],oci_num_rows:["int oci_num_rows(resource stmt)","Return the row count of an OCI statement"],oci_parse:["resource oci_parse(resource connection, string query)","Parse a query and return a statement"],oci_password_change:["bool oci_password_change(resource connection, string username, string old_password, string new_password)","Changes the password of an account"],oci_pconnect:["resource oci_pconnect(string user, string pass [, string db [, string charset ]])","Connect to an Oracle database using a persistent connection and log on. Returns a new session."],oci_result:["string oci_result(resource stmt, mixed column)","Return a single column of result data"],oci_rollback:["bool oci_rollback(resource connection)","Rollback the current context"],oci_server_version:["string oci_server_version(resource connection)","Return a string containing server version information"],oci_set_action:["bool oci_set_action(resource connection, string value)","Sets the action attribute on the connection"],oci_set_client_identifier:["bool oci_set_client_identifier(resource connection, string value)","Sets the client identifier attribute on the connection"],oci_set_client_info:["bool oci_set_client_info(resource connection, string value)","Sets the client info attribute on the connection"],oci_set_edition:["bool oci_set_edition(string value)","Sets the edition attribute for all subsequent connections created"],oci_set_module_name:["bool oci_set_module_name(resource connection, string value)","Sets the module attribute on the connection"],oci_set_prefetch:["bool oci_set_prefetch(resource stmt, int prefetch_rows)","Sets the number of rows to be prefetched on execute to prefetch_rows for stmt"],oci_statement_type:["string oci_statement_type(resource stmt)","Return the query type of an OCI statement"],ocifetchinto:["int ocifetchinto(resource stmt, array &output [, int mode])","Fetch a row of result data into an array"],ocigetbufferinglob:["bool ocigetbufferinglob()","Returns current state of buffering for a LOB"],ocisetbufferinglob:["bool ocisetbufferinglob( boolean flag )","Enables/disables buffering for a LOB"],octdec:["int octdec(string octal_number)","Returns the decimal equivalent of an octal string"],odbc_autocommit:["mixed odbc_autocommit(resource connection_id [, int OnOff])","Toggle autocommit mode or get status"],odbc_binmode:["bool odbc_binmode(int result_id, int mode)","Handle binary column data"],odbc_close:["void odbc_close(resource connection_id)","Close an ODBC connection"],odbc_close_all:["void odbc_close_all(void)","Close all ODBC connections"],odbc_columnprivileges:["resource odbc_columnprivileges(resource connection_id, string catalog, string schema, string table, string column)","Returns a result identifier that can be used to fetch a list of columns and associated privileges for the specified table"],odbc_columns:["resource odbc_columns(resource connection_id [, string qualifier [, string owner [, string table_name [, string column_name]]]])","Returns a result identifier that can be used to fetch a list of column names in specified tables"],odbc_commit:["bool odbc_commit(resource connection_id)","Commit an ODBC transaction"],odbc_connect:["resource odbc_connect(string DSN, string user, string password [, int cursor_option])","Connect to a datasource"],odbc_cursor:["string odbc_cursor(resource result_id)","Get cursor name"],odbc_data_source:["array odbc_data_source(resource connection_id, int fetch_type)","Return information about the currently connected data source"],odbc_error:["string odbc_error([resource connection_id])","Get the last error code"],odbc_errormsg:["string odbc_errormsg([resource connection_id])","Get the last error message"],odbc_exec:["resource odbc_exec(resource connection_id, string query [, int flags])","Prepare and execute an SQL statement"],odbc_execute:["bool odbc_execute(resource result_id [, array parameters_array])","Execute a prepared statement"],odbc_fetch_array:["array odbc_fetch_array(int result [, int rownumber])","Fetch a result row as an associative array"],odbc_fetch_into:["int odbc_fetch_into(resource result_id, array &result_array, [, int rownumber])","Fetch one result row into an array"],odbc_fetch_object:["object odbc_fetch_object(int result [, int rownumber])","Fetch a result row as an object"],odbc_fetch_row:["bool odbc_fetch_row(resource result_id [, int row_number])","Fetch a row"],odbc_field_len:["int odbc_field_len(resource result_id, int field_number)","Get the length (precision) of a column"],odbc_field_name:["string odbc_field_name(resource result_id, int field_number)","Get a column name"],odbc_field_num:["int odbc_field_num(resource result_id, string field_name)","Return column number"],odbc_field_scale:["int odbc_field_scale(resource result_id, int field_number)","Get the scale of a column"],odbc_field_type:["string odbc_field_type(resource result_id, int field_number)","Get the datatype of a column"],odbc_foreignkeys:["resource odbc_foreignkeys(resource connection_id, string pk_qualifier, string pk_owner, string pk_table, string fk_qualifier, string fk_owner, string fk_table)","Returns a result identifier to either a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table"],odbc_free_result:["bool odbc_free_result(resource result_id)","Free resources associated with a result"],odbc_gettypeinfo:["resource odbc_gettypeinfo(resource connection_id [, int data_type])","Returns a result identifier containing information about data types supported by the data source"],odbc_longreadlen:["bool odbc_longreadlen(int result_id, int length)","Handle LONG columns"],odbc_next_result:["bool odbc_next_result(resource result_id)","Checks if multiple results are avaiable"],odbc_num_fields:["int odbc_num_fields(resource result_id)","Get number of columns in a result"],odbc_num_rows:["int odbc_num_rows(resource result_id)","Get number of rows in a result"],odbc_pconnect:["resource odbc_pconnect(string DSN, string user, string password [, int cursor_option])","Establish a persistent connection to a datasource"],odbc_prepare:["resource odbc_prepare(resource connection_id, string query)","Prepares a statement for execution"],odbc_primarykeys:["resource odbc_primarykeys(resource connection_id, string qualifier, string owner, string table)","Returns a result identifier listing the column names that comprise the primary key for a table"],odbc_procedurecolumns:["resource odbc_procedurecolumns(resource connection_id [, string qualifier, string owner, string proc, string column])","Returns a result identifier containing the list of input and output parameters, as well as the columns that make up the result set for the specified procedures"],odbc_procedures:["resource odbc_procedures(resource connection_id [, string qualifier, string owner, string name])","Returns a result identifier containg the list of procedure names in a datasource"],odbc_result:["mixed odbc_result(resource result_id, mixed field)","Get result data"],odbc_result_all:["int odbc_result_all(resource result_id [, string format])","Print result as HTML table"],odbc_rollback:["bool odbc_rollback(resource connection_id)","Rollback a transaction"],odbc_setoption:["bool odbc_setoption(resource conn_id|result_id, int which, int option, int value)","Sets connection or statement options"],odbc_specialcolumns:["resource odbc_specialcolumns(resource connection_id, int type, string qualifier, string owner, string table, int scope, int nullable)","Returns a result identifier containing either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction"],odbc_statistics:["resource odbc_statistics(resource connection_id, string qualifier, string owner, string name, int unique, int accuracy)","Returns a result identifier that contains statistics about a single table and the indexes associated with the table"],odbc_tableprivileges:["resource odbc_tableprivileges(resource connection_id, string qualifier, string owner, string name)","Returns a result identifier containing a list of tables and the privileges associated with each table"],odbc_tables:["resource odbc_tables(resource connection_id [, string qualifier [, string owner [, string name [, string table_types]]]])","Call the SQLTables function"],opendir:["mixed opendir(string path[, resource context])","Open a directory and return a dir_handle"],openlog:["bool openlog(string ident, int option, int facility)","Open connection to system logger"],openssl_csr_export:["bool openssl_csr_export(resource csr, string &out [, bool notext=true])","Exports a CSR to file or a var"],openssl_csr_export_to_file:["bool openssl_csr_export_to_file(resource csr, string outfilename [, bool notext=true])","Exports a CSR to file"],openssl_csr_get_public_key:["mixed openssl_csr_get_public_key(mixed csr)","Returns the subject of a CERT or FALSE on error"],openssl_csr_get_subject:["mixed openssl_csr_get_subject(mixed csr)","Returns the subject of a CERT or FALSE on error"],openssl_csr_new:["bool openssl_csr_new(array dn, resource &privkey [, array configargs [, array extraattribs]])","Generates a privkey and CSR"],openssl_csr_sign:["resource openssl_csr_sign(mixed csr, mixed x509, mixed priv_key, long days [, array config_args [, long serial]])","Signs a cert with another CERT"],openssl_decrypt:["string openssl_decrypt(string data, string method, string password [, bool raw_input=false])","Takes raw or base64 encoded string and dectupt it using given method and key"],openssl_dh_compute_key:["string openssl_dh_compute_key(string pub_key, resource dh_key)","Computes shared sicret for public value of remote DH key and local DH key"],openssl_digest:["string openssl_digest(string data, string method [, bool raw_output=false])","Computes digest hash value for given data using given method, returns raw or binhex encoded string"],openssl_encrypt:["string openssl_encrypt(string data, string method, string password [, bool raw_output=false])","Encrypts given data with given method and key, returns raw or base64 encoded string"],openssl_error_string:["mixed openssl_error_string(void)","Returns a description of the last error, and alters the index of the error messages. Returns false when the are no more messages"],openssl_get_cipher_methods:["array openssl_get_cipher_methods([bool aliases = false])","Return array of available cipher methods"],openssl_get_md_methods:["array openssl_get_md_methods([bool aliases = false])","Return array of available digest methods"],openssl_open:["bool openssl_open(string data, &string opendata, string ekey, mixed privkey)","Opens data"],openssl_pkcs12_export:["bool openssl_pkcs12_export(mixed x509, string &out, mixed priv_key, string pass[, array args])","Creates and exports a PKCS12 to a var"],openssl_pkcs12_export_to_file:["bool openssl_pkcs12_export_to_file(mixed x509, string filename, mixed priv_key, string pass[, array args])","Creates and exports a PKCS to file"],openssl_pkcs12_read:["bool openssl_pkcs12_read(string PKCS12, array &certs, string pass)","Parses a PKCS12 to an array"],openssl_pkcs7_decrypt:["bool openssl_pkcs7_decrypt(string infilename, string outfilename, mixed recipcert [, mixed recipkey])","Decrypts the S/MIME message in the file name infilename and output the results to the file name outfilename. recipcert is a CERT for one of the recipients. recipkey specifies the private key matching recipcert, if recipcert does not include the key"],openssl_pkcs7_encrypt:["bool openssl_pkcs7_encrypt(string infile, string outfile, mixed recipcerts, array headers [, long flags [, long cipher]])","Encrypts the message in the file named infile with the certificates in recipcerts and output the result to the file named outfile"],openssl_pkcs7_sign:["bool openssl_pkcs7_sign(string infile, string outfile, mixed signcert, mixed signkey, array headers [, long flags [, string extracertsfilename]])","Signs the MIME message in the file named infile with signcert/signkey and output the result to file name outfile. headers lists plain text headers to exclude from the signed portion of the message, and should include to, from and subject as a minimum"],openssl_pkcs7_verify:["bool openssl_pkcs7_verify(string filename, long flags [, string signerscerts [, array cainfo [, string extracerts [, string content]]]])","Verifys that the data block is intact, the signer is who they say they are, and returns the CERTs of the signers"],openssl_pkey_export:["bool openssl_pkey_export(mixed key, &mixed out [, string passphrase [, array config_args]])","Gets an exportable representation of a key into a string or file"],openssl_pkey_export_to_file:["bool openssl_pkey_export_to_file(mixed key, string outfilename [, string passphrase, array config_args)","Gets an exportable representation of a key into a file"],openssl_pkey_free:["void openssl_pkey_free(int key)","Frees a key"],openssl_pkey_get_details:["resource openssl_pkey_get_details(resource key)","returns an array with the key details (bits, pkey, type)"],openssl_pkey_get_private:["int openssl_pkey_get_private(string key [, string passphrase])","Gets private keys"],openssl_pkey_get_public:["int openssl_pkey_get_public(mixed cert)","Gets public key from X.509 certificate"],openssl_pkey_new:["resource openssl_pkey_new([array configargs])","Generates a new private key"],openssl_private_decrypt:["bool openssl_private_decrypt(string data, string &decrypted, mixed key [, int padding])","Decrypts data with private key"],openssl_private_encrypt:["bool openssl_private_encrypt(string data, string &crypted, mixed key [, int padding])","Encrypts data with private key"],openssl_public_decrypt:["bool openssl_public_decrypt(string data, string &crypted, resource key [, int padding])","Decrypts data with public key"],openssl_public_encrypt:["bool openssl_public_encrypt(string data, string &crypted, mixed key [, int padding])","Encrypts data with public key"],openssl_random_pseudo_bytes:["string openssl_random_pseudo_bytes(integer length [, &bool returned_strong_result])","Returns a string of the length specified filled with random pseudo bytes"],openssl_seal:["int openssl_seal(string data, &string sealdata, &array ekeys, array pubkeys)","Seals data"],openssl_sign:["bool openssl_sign(string data, &string signature, mixed key[, mixed method])","Signs data"],openssl_verify:["int openssl_verify(string data, string signature, mixed key[, mixed method])","Verifys data"],openssl_x509_check_private_key:["bool openssl_x509_check_private_key(mixed cert, mixed key)","Checks if a private key corresponds to a CERT"],openssl_x509_checkpurpose:["int openssl_x509_checkpurpose(mixed x509cert, int purpose, array cainfo [, string untrustedfile])","Checks the CERT to see if it can be used for the purpose in purpose. cainfo holds information about trusted CAs"],openssl_x509_export:["bool openssl_x509_export(mixed x509, string &out [, bool notext = true])","Exports a CERT to file or a var"],openssl_x509_export_to_file:["bool openssl_x509_export_to_file(mixed x509, string outfilename [, bool notext = true])","Exports a CERT to file or a var"],openssl_x509_free:["void openssl_x509_free(resource x509)","Frees X.509 certificates"],openssl_x509_parse:["array openssl_x509_parse(mixed x509 [, bool shortnames=true])","Returns an array of the fields/values of the CERT"],openssl_x509_read:["resource openssl_x509_read(mixed cert)","Reads X.509 certificates"],ord:["int ord(string character)","Returns ASCII value of character"],output_add_rewrite_var:["bool output_add_rewrite_var(string name, string value)","Add URL rewriter values"],output_reset_rewrite_vars:["bool output_reset_rewrite_vars(void)","Reset(clear) URL rewriter values"],pack:["string pack(string format, mixed arg1 [, mixed arg2 [, mixed ...]])","Takes one or more arguments and packs them into a binary string according to the format argument"],parse_ini_file:["array parse_ini_file(string filename [, bool process_sections [, int scanner_mode]])","Parse configuration file"],parse_ini_string:["array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]])","Parse configuration string"],parse_locale:["static array parse_locale($locale)","* parses a locale-id into an array the different parts of it"],parse_str:["void parse_str(string encoded_string [, array result])","Parses GET/POST/COOKIE data and sets global variables"],parse_url:["mixed parse_url(string url, [int url_component])","Parse a URL and return its components"],passthru:["void passthru(string command [, int &return_value])","Execute an external program and display raw output"],pathinfo:["array pathinfo(string path[, int options])","Returns information about a certain string"],pclose:["int pclose(resource fp)","Close a file pointer opened by popen()"],pcnlt_sigwaitinfo:["int pcnlt_sigwaitinfo(array set[, array &siginfo])","Synchronously wait for queued signals"],pcntl_alarm:["int pcntl_alarm(int seconds)","Set an alarm clock for delivery of a signal"],pcntl_exec:["bool pcntl_exec(string path [, array args [, array envs]])","Executes specified program in current process space as defined by exec(2)"],pcntl_fork:["int pcntl_fork(void)","Forks the currently running process following the same behavior as the UNIX fork() system call"],pcntl_getpriority:["int pcntl_getpriority([int pid [, int process_identifier]])","Get the priority of any process"],pcntl_setpriority:["bool pcntl_setpriority(int priority [, int pid [, int process_identifier]])","Change the priority of any process"],pcntl_signal:["bool pcntl_signal(int signo, callback handle [, bool restart_syscalls])","Assigns a system signal handler to a PHP function"],pcntl_signal_dispatch:["bool pcntl_signal_dispatch()","Dispatch signals to signal handlers"],pcntl_sigprocmask:["bool pcntl_sigprocmask(int how, array set[, array &oldset])","Examine and change blocked signals"],pcntl_sigtimedwait:["int pcntl_sigtimedwait(array set[, array &siginfo[, int seconds[, int nanoseconds]]])","Wait for queued signals"],pcntl_wait:["int pcntl_wait(int &status)","Waits on or returns the status of a forked child as defined by the waitpid() system call"],pcntl_waitpid:["int pcntl_waitpid(int pid, int &status, int options)","Waits on or returns the status of a forked child as defined by the waitpid() system call"],pcntl_wexitstatus:["int pcntl_wexitstatus(int status)","Returns the status code of a child's exit"],pcntl_wifexited:["bool pcntl_wifexited(int status)","Returns true if the child status code represents a successful exit"],pcntl_wifsignaled:["bool pcntl_wifsignaled(int status)","Returns true if the child status code represents a process that was terminated due to a signal"],pcntl_wifstopped:["bool pcntl_wifstopped(int status)","Returns true if the child status code represents a stopped process (WUNTRACED must have been used with waitpid)"],pcntl_wstopsig:["int pcntl_wstopsig(int status)","Returns the number of the signal that caused the process to stop who's status code is passed"],pcntl_wtermsig:["int pcntl_wtermsig(int status)","Returns the number of the signal that terminated the process who's status code is passed"],pdo_drivers:["array pdo_drivers()","Return array of available PDO drivers"],pfsockopen:["resource pfsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])","Open persistent Internet or Unix domain socket connection"],pg_affected_rows:["int pg_affected_rows(resource result)","Returns the number of affected tuples"],pg_cancel_query:["bool pg_cancel_query(resource connection)","Cancel request"],pg_client_encoding:["string pg_client_encoding([resource connection])","Get the current client encoding"],pg_close:["bool pg_close([resource connection])","Close a PostgreSQL connection"],pg_connect:["resource pg_connect(string connection_string[, int connect_type] | [string host, string port [, string options [, string tty,]]] string database)","Open a PostgreSQL connection"],pg_connection_busy:["bool pg_connection_busy(resource connection)","Get connection is busy or not"],pg_connection_reset:["bool pg_connection_reset(resource connection)","Reset connection (reconnect)"],pg_connection_status:["int pg_connection_status(resource connnection)","Get connection status"],pg_convert:["array pg_convert(resource db, string table, array values[, int options])","Check and convert values for PostgreSQL SQL statement"],pg_copy_from:["bool pg_copy_from(resource connection, string table_name , array rows [, string delimiter [, string null_as]])","Copy table from array"],pg_copy_to:["array pg_copy_to(resource connection, string table_name [, string delimiter [, string null_as]])","Copy table to array"],pg_dbname:["string pg_dbname([resource connection])","Get the database name"],pg_delete:["mixed pg_delete(resource db, string table, array ids[, int options])","Delete records has ids (id=>value)"],pg_end_copy:["bool pg_end_copy([resource connection])","Sync with backend. Completes the Copy command"],pg_escape_bytea:["string pg_escape_bytea([resource connection,] string data)","Escape binary for bytea type"],pg_escape_string:["string pg_escape_string([resource connection,] string data)","Escape string for text/char type"],pg_execute:["resource pg_execute([resource connection,] string stmtname, array params)","Execute a prepared query"],pg_fetch_all:["array pg_fetch_all(resource result)","Fetch all rows into array"],pg_fetch_all_columns:["array pg_fetch_all_columns(resource result [, int column_number])","Fetch all rows into array"],pg_fetch_array:["array pg_fetch_array(resource result [, int row [, int result_type]])","Fetch a row as an array"],pg_fetch_assoc:["array pg_fetch_assoc(resource result [, int row])","Fetch a row as an assoc array"],pg_fetch_object:["object pg_fetch_object(resource result [, int row [, string class_name [, NULL|array ctor_params]]])","Fetch a row as an object"],pg_fetch_result:["mixed pg_fetch_result(resource result, [int row_number,] mixed field_name)","Returns values from a result identifier"],pg_fetch_row:["array pg_fetch_row(resource result [, int row [, int result_type]])","Get a row as an enumerated array"],pg_field_is_null:["int pg_field_is_null(resource result, [int row,] mixed field_name_or_number)","Test if a field is NULL"],pg_field_name:["string pg_field_name(resource result, int field_number)","Returns the name of the field"],pg_field_num:["int pg_field_num(resource result, string field_name)","Returns the field number of the named field"],pg_field_prtlen:["int pg_field_prtlen(resource result, [int row,] mixed field_name_or_number)","Returns the printed length"],pg_field_size:["int pg_field_size(resource result, int field_number)","Returns the internal size of the field"],pg_field_table:["mixed pg_field_table(resource result, int field_number[, bool oid_only])","Returns the name of the table field belongs to, or table's oid if oid_only is true"],pg_field_type:["string pg_field_type(resource result, int field_number)","Returns the type name for the given field"],pg_field_type_oid:["string pg_field_type_oid(resource result, int field_number)","Returns the type oid for the given field"],pg_free_result:["bool pg_free_result(resource result)","Free result memory"],pg_get_notify:["array pg_get_notify([resource connection[, result_type]])","Get asynchronous notification"],pg_get_pid:["int pg_get_pid([resource connection)","Get backend(server) pid"],pg_get_result:["resource pg_get_result(resource connection)","Get asynchronous query result"],pg_host:["string pg_host([resource connection])","Returns the host name associated with the connection"],pg_insert:["mixed pg_insert(resource db, string table, array values[, int options])","Insert values (filed=>value) to table"],pg_last_error:["string pg_last_error([resource connection])","Get the error message string"],pg_last_notice:["string pg_last_notice(resource connection)","Returns the last notice set by the backend"],pg_last_oid:["string pg_last_oid(resource result)","Returns the last object identifier"],pg_lo_close:["bool pg_lo_close(resource large_object)","Close a large object"],pg_lo_create:["mixed pg_lo_create([resource connection],[mixed large_object_oid])","Create a large object"],pg_lo_export:["bool pg_lo_export([resource connection, ] int objoid, string filename)","Export large object direct to filesystem"],pg_lo_import:["int pg_lo_import([resource connection, ] string filename [, mixed oid])","Import large object direct from filesystem"],pg_lo_open:["resource pg_lo_open([resource connection,] int large_object_oid, string mode)","Open a large object and return fd"],pg_lo_read:["string pg_lo_read(resource large_object [, int len])","Read a large object"],pg_lo_read_all:["int pg_lo_read_all(resource large_object)","Read a large object and send straight to browser"],pg_lo_seek:["bool pg_lo_seek(resource large_object, int offset [, int whence])","Seeks position of large object"],pg_lo_tell:["int pg_lo_tell(resource large_object)","Returns current position of large object"],pg_lo_unlink:["bool pg_lo_unlink([resource connection,] string large_object_oid)","Delete a large object"],pg_lo_write:["int pg_lo_write(resource large_object, string buf [, int len])","Write a large object"],pg_meta_data:["array pg_meta_data(resource db, string table)","Get meta_data"],pg_num_fields:["int pg_num_fields(resource result)","Return the number of fields in the result"],pg_num_rows:["int pg_num_rows(resource result)","Return the number of rows in the result"],pg_options:["string pg_options([resource connection])","Get the options associated with the connection"],pg_parameter_status:["string|false pg_parameter_status([resource connection,] string param_name)","Returns the value of a server parameter"],pg_pconnect:["resource pg_pconnect(string connection_string | [string host, string port [, string options [, string tty,]]] string database)","Open a persistent PostgreSQL connection"],pg_ping:["bool pg_ping([resource connection])","Ping database. If connection is bad, try to reconnect."],pg_port:["int pg_port([resource connection])","Return the port number associated with the connection"],pg_prepare:["resource pg_prepare([resource connection,] string stmtname, string query)","Prepare a query for future execution"],pg_put_line:["bool pg_put_line([resource connection,] string query)","Send null-terminated string to backend server"],pg_query:["resource pg_query([resource connection,] string query)","Execute a query"],pg_query_params:["resource pg_query_params([resource connection,] string query, array params)","Execute a query"],pg_result_error:["string pg_result_error(resource result)","Get error message associated with result"],pg_result_error_field:["string pg_result_error_field(resource result, int fieldcode)","Get error message field associated with result"],pg_result_seek:["bool pg_result_seek(resource result, int offset)","Set internal row offset"],pg_result_status:["mixed pg_result_status(resource result[, long result_type])","Get status of query result"],pg_select:["mixed pg_select(resource db, string table, array ids[, int options])","Select records that has ids (id=>value)"],pg_send_execute:["bool pg_send_execute(resource connection, string stmtname, array params)","Executes prevriously prepared stmtname asynchronously"],pg_send_prepare:["bool pg_send_prepare(resource connection, string stmtname, string query)","Asynchronously prepare a query for future execution"],pg_send_query:["bool pg_send_query(resource connection, string query)","Send asynchronous query"],pg_send_query_params:["bool pg_send_query_params(resource connection, string query, array params)","Send asynchronous parameterized query"],pg_set_client_encoding:["int pg_set_client_encoding([resource connection,] string encoding)","Set client encoding"],pg_set_error_verbosity:["int pg_set_error_verbosity([resource connection,] int verbosity)","Set error verbosity"],pg_trace:["bool pg_trace(string filename [, string mode [, resource connection]])","Enable tracing a PostgreSQL connection"],pg_transaction_status:["int pg_transaction_status(resource connnection)","Get transaction status"],pg_tty:["string pg_tty([resource connection])","Return the tty name associated with the connection"],pg_unescape_bytea:["string pg_unescape_bytea(string data)","Unescape binary for bytea type"],pg_untrace:["bool pg_untrace([resource connection])","Disable tracing of a PostgreSQL connection"],pg_update:["mixed pg_update(resource db, string table, array fields, array ids[, int options])","Update table using values (field=>value) and ids (id=>value)"],pg_version:["array pg_version([resource connection])","Returns an array with client, protocol and server version (when available)"],php_egg_logo_guid:["string php_egg_logo_guid(void)","Return the special ID used to request the PHP logo in phpinfo screens"],php_ini_loaded_file:["string php_ini_loaded_file(void)","Return the actual loaded ini filename"],php_ini_scanned_files:["string php_ini_scanned_files(void)","Return comma-separated string of .ini files parsed from the additional ini dir"],php_logo_guid:["string php_logo_guid(void)","Return the special ID used to request the PHP logo in phpinfo screens"],php_real_logo_guid:["string php_real_logo_guid(void)","Return the special ID used to request the PHP logo in phpinfo screens"],php_sapi_name:["string php_sapi_name(void)","Return the current SAPI module name"],php_snmpv3:["void php_snmpv3(INTERNAL_FUNCTION_PARAMETERS, int st)","* * Generic SNMPv3 object fetcher * From here is passed on the the common internal object fetcher. * * st=SNMP_CMD_GET snmp3_get() - query an agent and return a single value. * st=SNMP_CMD_GETNEXT snmp3_getnext() - query an agent and return the next single value. * st=SNMP_CMD_WALK snmp3_walk() - walk the mib and return a single dimensional array * containing the values. * st=SNMP_CMD_REALWALK snmp3_real_walk() - walk the mib and return an * array of oid,value pairs. * st=SNMP_CMD_SET snmp3_set() - query an agent and set a single value *"],php_strip_whitespace:["string php_strip_whitespace(string file_name)","Return source with stripped comments and whitespace"],php_uname:["string php_uname(void)","Return information about the system PHP was built on"],phpcredits:["void phpcredits([int flag])","Prints the list of people who've contributed to the PHP project"],phpinfo:["void phpinfo([int what])","Output a page of useful information about PHP and the current request"],phpversion:["string phpversion([string extension])","Return the current PHP version"],pi:["float pi(void)","Returns an approximation of pi"],png2wbmp:["bool png2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)","Convert PNG image to WBMP image"],popen:["resource popen(string command, string mode)","Execute a command and open either a read or a write pipe to it"],posix_access:["bool posix_access(string file [, int mode])","Determine accessibility of a file (POSIX.1 5.6.3)"],posix_ctermid:["string posix_ctermid(void)","Generate terminal path name (POSIX.1, 4.7.1)"],posix_get_last_error:["int posix_get_last_error(void)","Retrieve the error number set by the last posix function which failed."],posix_getcwd:["string posix_getcwd(void)","Get working directory pathname (POSIX.1, 5.2.2)"],posix_getegid:["int posix_getegid(void)","Get the current effective group id (POSIX.1, 4.2.1)"],posix_geteuid:["int posix_geteuid(void)","Get the current effective user id (POSIX.1, 4.2.1)"],posix_getgid:["int posix_getgid(void)","Get the current group id (POSIX.1, 4.2.1)"],posix_getgrgid:["array posix_getgrgid(long gid)","Group database access (POSIX.1, 9.2.1)"],posix_getgrnam:["array posix_getgrnam(string groupname)","Group database access (POSIX.1, 9.2.1)"],posix_getgroups:["array posix_getgroups(void)","Get supplementary group id's (POSIX.1, 4.2.3)"],posix_getlogin:["string posix_getlogin(void)","Get user name (POSIX.1, 4.2.4)"],posix_getpgid:["int posix_getpgid(void)","Get the process group id of the specified process (This is not a POSIX function, but a SVR4ism, so we compile conditionally)"],posix_getpgrp:["int posix_getpgrp(void)","Get current process group id (POSIX.1, 4.3.1)"],posix_getpid:["int posix_getpid(void)","Get the current process id (POSIX.1, 4.1.1)"],posix_getppid:["int posix_getppid(void)","Get the parent process id (POSIX.1, 4.1.1)"],posix_getpwnam:["array posix_getpwnam(string groupname)","User database access (POSIX.1, 9.2.2)"],posix_getpwuid:["array posix_getpwuid(long uid)","User database access (POSIX.1, 9.2.2)"],posix_getrlimit:["array posix_getrlimit(void)","Get system resource consumption limits (This is not a POSIX function, but a BSDism and a SVR4ism. We compile conditionally)"],posix_getsid:["int posix_getsid(void)","Get process group id of session leader (This is not a POSIX function, but a SVR4ism, so be compile conditionally)"],posix_getuid:["int posix_getuid(void)","Get the current user id (POSIX.1, 4.2.1)"],posix_initgroups:["bool posix_initgroups(string name, int base_group_id)","Calculate the group access list for the user specified in name."],posix_isatty:["bool posix_isatty(int fd)","Determine if filedesc is a tty (POSIX.1, 4.7.1)"],posix_kill:["bool posix_kill(int pid, int sig)","Send a signal to a process (POSIX.1, 3.3.2)"],posix_mkfifo:["bool posix_mkfifo(string pathname, int mode)","Make a FIFO special file (POSIX.1, 5.4.2)"],posix_mknod:["bool posix_mknod(string pathname, int mode [, int major [, int minor]])","Make a special or ordinary file (POSIX.1)"],posix_setegid:["bool posix_setegid(long uid)","Set effective group id"],posix_seteuid:["bool posix_seteuid(long uid)","Set effective user id"],posix_setgid:["bool posix_setgid(int uid)","Set group id (POSIX.1, 4.2.2)"],posix_setpgid:["bool posix_setpgid(int pid, int pgid)","Set process group id for job control (POSIX.1, 4.3.3)"],posix_setsid:["int posix_setsid(void)","Create session and set process group id (POSIX.1, 4.3.2)"],posix_setuid:["bool posix_setuid(long uid)","Set user id (POSIX.1, 4.2.2)"],posix_strerror:["string posix_strerror(int errno)","Retrieve the system error message associated with the given errno."],posix_times:["array posix_times(void)","Get process times (POSIX.1, 4.5.2)"],posix_ttyname:["string posix_ttyname(int fd)","Determine terminal device name (POSIX.1, 4.7.2)"],posix_uname:["array posix_uname(void)","Get system name (POSIX.1, 4.4.1)"],pow:["number pow(number base, number exponent)","Returns base raised to the power of exponent. Returns integer result when possible"],preg_filter:["mixed preg_filter(mixed regex, mixed replace, mixed subject [, int limit [, int &count]])","Perform Perl-style regular expression replacement and only return matches."],preg_grep:["array preg_grep(string regex, array input [, int flags])","Searches array and returns entries which match regex"],preg_last_error:["int preg_last_error()","Returns the error code of the last regexp execution."],preg_match:["int preg_match(string pattern, string subject [, array &subpatterns [, int flags [, int offset]]])","Perform a Perl-style regular expression match"],preg_match_all:["int preg_match_all(string pattern, string subject, array &subpatterns [, int flags [, int offset]])","Perform a Perl-style global regular expression match"],preg_quote:["string preg_quote(string str [, string delim_char])","Quote regular expression characters plus an optional character"],preg_replace:["mixed preg_replace(mixed regex, mixed replace, mixed subject [, int limit [, int &count]])","Perform Perl-style regular expression replacement."],preg_replace_callback:["mixed preg_replace_callback(mixed regex, mixed callback, mixed subject [, int limit [, int &count]])","Perform Perl-style regular expression replacement using replacement callback."],preg_split:["array preg_split(string pattern, string subject [, int limit [, int flags]])","Split string into an array using a perl-style regular expression as a delimiter"],prev:["mixed prev(array array_arg)","Move array argument's internal pointer to the previous element and return it"],print:["int print(string arg)","Output a string"],print_r:["mixed print_r(mixed var [, bool return])","Prints out or returns information about the specified variable"],printf:["int printf(string format [, mixed arg1 [, mixed ...]])","Output a formatted string"],proc_close:["int proc_close(resource process)","close a process opened by proc_open"],proc_get_status:["array proc_get_status(resource process)","get information about a process opened by proc_open"],proc_nice:["bool proc_nice(int priority)","Change the priority of the current process"],proc_open:["resource proc_open(string command, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]])","Run a process with more control over it's file descriptors"],proc_terminate:["bool proc_terminate(resource process [, long signal])","kill a process opened by proc_open"],property_exists:["bool property_exists(mixed object_or_class, string property_name)","Checks if the object or class has a property"],pspell_add_to_personal:["bool pspell_add_to_personal(int pspell, string word)","Adds a word to a personal list"],pspell_add_to_session:["bool pspell_add_to_session(int pspell, string word)","Adds a word to the current session"],pspell_check:["bool pspell_check(int pspell, string word)","Returns true if word is valid"],pspell_clear_session:["bool pspell_clear_session(int pspell)","Clears the current session"],pspell_config_create:["int pspell_config_create(string language [, string spelling [, string jargon [, string encoding]]])","Create a new config to be used later to create a manager"],pspell_config_data_dir:["bool pspell_config_data_dir(int conf, string directory)","location of language data files"],pspell_config_dict_dir:["bool pspell_config_dict_dir(int conf, string directory)","location of the main word list"],pspell_config_ignore:["bool pspell_config_ignore(int conf, int ignore)","Ignore words <= n chars"],pspell_config_mode:["bool pspell_config_mode(int conf, long mode)","Select mode for config (PSPELL_FAST, PSPELL_NORMAL or PSPELL_BAD_SPELLERS)"],pspell_config_personal:["bool pspell_config_personal(int conf, string personal)","Use a personal dictionary for this config"],pspell_config_repl:["bool pspell_config_repl(int conf, string repl)","Use a personal dictionary with replacement pairs for this config"],pspell_config_runtogether:["bool pspell_config_runtogether(int conf, bool runtogether)","Consider run-together words as valid components"],pspell_config_save_repl:["bool pspell_config_save_repl(int conf, bool save)","Save replacement pairs when personal list is saved for this config"],pspell_new:["int pspell_new(string language [, string spelling [, string jargon [, string encoding [, int mode]]]])","Load a dictionary"],pspell_new_config:["int pspell_new_config(int config)","Load a dictionary based on the given config"],pspell_new_personal:["int pspell_new_personal(string personal, string language [, string spelling [, string jargon [, string encoding [, int mode]]]])","Load a dictionary with a personal wordlist"],pspell_save_wordlist:["bool pspell_save_wordlist(int pspell)","Saves the current (personal) wordlist"],pspell_store_replacement:["bool pspell_store_replacement(int pspell, string misspell, string correct)","Notify the dictionary of a user-selected replacement"],pspell_suggest:["array pspell_suggest(int pspell, string word)","Returns array of suggestions"],putenv:["bool putenv(string setting)","Set the value of an environment variable"],quoted_printable_decode:["string quoted_printable_decode(string str)","Convert a quoted-printable string to an 8 bit string"],quoted_printable_encode:["string quoted_printable_encode(string str) */",'PHP_FUNCTION(quoted_printable_encode) { char *str, *new_str; int str_len; size_t new_str_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) != SUCCESS) { return; } if (!str_len) { RETURN_EMPTY_STRING(); } new_str = (char *)php_quot_print_encode((unsigned char *)str, (size_t)str_len, &new_str_len); RETURN_STRINGL(new_str, new_str_len, 0); } /* }}}'],quotemeta:["string quotemeta(string str)","Quotes meta characters"],rad2deg:["float rad2deg(float number)","Converts the radian number to the equivalent number in degrees"],rand:["int rand([int min, int max])","Returns a random number"],range:["array range(mixed low, mixed high[, int step])","Create an array containing the range of integers or characters from low to high (inclusive)"],rawurldecode:["string rawurldecode(string str)","Decodes URL-encodes string"],rawurlencode:["string rawurlencode(string str)","URL-encodes string"],readdir:["string readdir([resource dir_handle])","Read directory entry from dir_handle"],readfile:["int readfile(string filename [, bool use_include_path[, resource context]])","Output a file or a URL"],readgzfile:["int readgzfile(string filename [, int use_include_path])","Output a .gz-file"],readline:["string readline([string prompt])","Reads a line"],readline_add_history:["bool readline_add_history(string prompt)","Adds a line to the history"],readline_callback_handler_install:["void readline_callback_handler_install(string prompt, mixed callback)","Initializes the readline callback interface and terminal, prints the prompt and returns immediately"],readline_callback_handler_remove:["bool readline_callback_handler_remove()","Removes a previously installed callback handler and restores terminal settings"],readline_callback_read_char:["void readline_callback_read_char()","Informs the readline callback interface that a character is ready for input"],readline_clear_history:["bool readline_clear_history(void)","Clears the history"],readline_completion_function:["bool readline_completion_function(string funcname)","Readline completion function?"],readline_info:["mixed readline_info([string varname [, string newvalue]])","Gets/sets various internal readline variables."],readline_list_history:["array readline_list_history(void)","Lists the history"],readline_on_new_line:["void readline_on_new_line(void)","Inform readline that the cursor has moved to a new line"],readline_read_history:["bool readline_read_history([string filename])","Reads the history"],readline_redisplay:["void readline_redisplay(void)","Ask readline to redraw the display"],readline_write_history:["bool readline_write_history([string filename])","Writes the history"],readlink:["string readlink(string filename)","Return the target of a symbolic link"],realpath:["string realpath(string path)","Return the resolved path"],realpath_cache_get:["bool realpath_cache_get()","Get current size of realpath cache"],realpath_cache_size:["bool realpath_cache_size()","Get current size of realpath cache"],recode_file:["bool recode_file(string request, resource input, resource output)","Recode file input into file output according to request"],recode_string:["string recode_string(string request, string str)","Recode string str according to request string"],register_shutdown_function:["void register_shutdown_function(string function_name)","Register a user-level function to be called on request termination"],register_tick_function:["bool register_tick_function(string function_name [, mixed arg [, mixed ... ]])","Registers a tick callback function"],rename:["bool rename(string old_name, string new_name[, resource context])","Rename a file"],require:["bool require(string path)","Includes and evaluates the specified file, erroring if the file cannot be included"],require_once:["bool require_once(string path)","Includes and evaluates the specified file, erroring if the file cannot be included"],reset:["mixed reset(array array_arg)","Set array argument's internal pointer to the first element and return it"],restore_error_handler:["void restore_error_handler(void)","Restores the previously defined error handler function"],restore_exception_handler:["void restore_exception_handler(void)","Restores the previously defined exception handler function"],restore_include_path:["void restore_include_path()","Restore the value of the include_path configuration option"],rewind:["bool rewind(resource fp)","Rewind the position of a file pointer"],rewinddir:["void rewinddir([resource dir_handle])","Rewind dir_handle back to the start"],rmdir:["bool rmdir(string dirname[, resource context])","Remove a directory"],round:["float round(float number [, int precision [, int mode]])","Returns the number rounded to specified precision"],rsort:["bool rsort(array &array_arg [, int sort_flags])","Sort an array in reverse order"],rtrim:["string rtrim(string str [, string character_mask])","Removes trailing whitespace"],scandir:["array scandir(string dir [, int sorting_order [, resource context]])","List files & directories inside the specified path"],sem_acquire:["bool sem_acquire(resource id)","Acquires the semaphore with the given id, blocking if necessary"],sem_get:["resource sem_get(int key [, int max_acquire [, int perm [, int auto_release]])","Return an id for the semaphore with the given key, and allow max_acquire (default 1) processes to acquire it simultaneously"],sem_release:["bool sem_release(resource id)","Releases the semaphore with the given id"],sem_remove:["bool sem_remove(resource id)","Removes semaphore from Unix systems"],serialize:["string serialize(mixed variable)","Returns a string representation of variable (which can later be unserialized)"],session_cache_expire:["int session_cache_expire([int new_cache_expire])","Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire"],session_cache_limiter:["string session_cache_limiter([string new_cache_limiter])","Return the current cache limiter. If new_cache_limited is given, the current cache_limiter is replaced with new_cache_limiter"],session_decode:["bool session_decode(string data)","Deserializes data and reinitializes the variables"],session_destroy:["bool session_destroy(void)","Destroy the current session and all data associated with it"],session_encode:["string session_encode(void)","Serializes the current setup and returns the serialized representation"],session_get_cookie_params:["array session_get_cookie_params(void)","Return the session cookie parameters"],session_id:["string session_id([string newid])","Return the current session id. If newid is given, the session id is replaced with newid"],session_is_registered:["bool session_is_registered(string varname)","Checks if a variable is registered in session"],session_module_name:["string session_module_name([string newname])","Return the current module name used for accessing session data. If newname is given, the module name is replaced with newname"],session_name:["string session_name([string newname])","Return the current session name. If newname is given, the session name is replaced with newname"],session_regenerate_id:["bool session_regenerate_id([bool delete_old_session])","Update the current session id with a newly generated one. If delete_old_session is set to true, remove the old session."],session_register:["bool session_register(mixed var_names [, mixed ...])","Adds varname(s) to the list of variables which are freezed at the session end"],session_save_path:["string session_save_path([string newname])","Return the current save path passed to module_name. If newname is given, the save path is replaced with newname"],session_set_cookie_params:["void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly]]]])","Set session cookie parameters"],session_set_save_handler:["void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)","Sets user-level functions"],session_start:["bool session_start(void)","Begin session - reinitializes freezed variables, registers browsers etc"],session_unregister:["bool session_unregister(string varname)","Removes varname from the list of variables which are freezed at the session end"],session_unset:["void session_unset(void)","Unset all registered variables"],session_write_close:["void session_write_close(void)","Write session data and end session"],set_error_handler:["string set_error_handler(string error_handler [, int error_types])","Sets a user-defined error handler function. Returns the previously defined error handler, or false on error"],set_exception_handler:["string set_exception_handler(callable exception_handler)","Sets a user-defined exception handler function. Returns the previously defined exception handler, or false on error"],set_include_path:["string set_include_path(string new_include_path)","Sets the include_path configuration option"],set_magic_quotes_runtime:["bool set_magic_quotes_runtime(int new_setting)","Set the current active configuration setting of magic_quotes_runtime and return previous"],set_time_limit:["bool set_time_limit(int seconds)","Sets the maximum time a script can run"],setcookie:["bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly]]]]]])","Send a cookie"],setlocale:["string setlocale(mixed category, string locale [, string ...])","Set locale information"],setrawcookie:["bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly]]]]]])","Send a cookie with no url encoding of the value"],settype:["bool settype(mixed var, string type)","Set the type of the variable"],sha1:["string sha1(string str [, bool raw_output])","Calculate the sha1 hash of a string"],sha1_file:["string sha1_file(string filename [, bool raw_output])","Calculate the sha1 hash of given filename"],shell_exec:["string shell_exec(string cmd)","Execute command via shell and return complete output as string"],shm_attach:["int shm_attach(int key [, int memsize [, int perm]])","Creates or open a shared memory segment"],shm_detach:["bool shm_detach(resource shm_identifier)","Disconnects from shared memory segment"],shm_get_var:["mixed shm_get_var(resource id, int variable_key)","Returns a variable from shared memory"],shm_has_var:["bool shm_has_var(resource id, int variable_key)","Checks whether a specific entry exists"],shm_put_var:["bool shm_put_var(resource shm_identifier, int variable_key, mixed variable)","Inserts or updates a variable in shared memory"],shm_remove:["bool shm_remove(resource shm_identifier)","Removes shared memory from Unix systems"],shm_remove_var:["bool shm_remove_var(resource id, int variable_key)","Removes variable from shared memory"],shmop_close:["void shmop_close (int shmid)","closes a shared memory segment"],shmop_delete:["bool shmop_delete (int shmid)","mark segment for deletion"],shmop_open:["int shmop_open (int key, string flags, int mode, int size)","gets and attaches a shared memory segment"],shmop_read:["string shmop_read (int shmid, int start, int count)","reads from a shm segment"],shmop_size:["int shmop_size (int shmid)","returns the shm size"],shmop_write:["int shmop_write (int shmid, string data, int offset)","writes to a shared memory segment"],shuffle:["bool shuffle(array array_arg)","Randomly shuffle the contents of an array"],similar_text:["int similar_text(string str1, string str2 [, float percent])","Calculates the similarity between two strings"],simplexml_import_dom:["simplemxml_element simplexml_import_dom(domNode node [, string class_name])","Get a simplexml_element object from dom to allow for processing"],simplexml_load_file:["simplemxml_element simplexml_load_file(string filename [, string class_name [, int options [, string ns [, bool is_prefix]]]])","Load a filename and return a simplexml_element object to allow for processing"],simplexml_load_string:["simplemxml_element simplexml_load_string(string data [, string class_name [, int options [, string ns [, bool is_prefix]]]])","Load a string and return a simplexml_element object to allow for processing"],sin:["float sin(float number)","Returns the sine of the number in radians"],sinh:["float sinh(float number)","Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2"],sleep:["void sleep(int seconds)","Delay for a given number of seconds"],smfi_addheader:["bool smfi_addheader(string headerf, string headerv)","Adds a header to the current message."],smfi_addrcpt:["bool smfi_addrcpt(string rcpt)","Add a recipient to the message envelope."],smfi_chgheader:["bool smfi_chgheader(string headerf, string headerv)","Changes a header's value for the current message."],smfi_delrcpt:["bool smfi_delrcpt(string rcpt)","Removes the named recipient from the current message's envelope."],smfi_getsymval:["string smfi_getsymval(string macro)","Returns the value of the given macro or NULL if the macro is not defined."],smfi_replacebody:["bool smfi_replacebody(string body)","Replaces the body of the current message. If called more than once, subsequent calls result in data being appended to the new body."],smfi_setflags:["void smfi_setflags(long flags)","Sets the flags describing the actions the filter may take."],smfi_setreply:["bool smfi_setreply(string rcode, string xcode, string message)","Directly set the SMTP error reply code for this connection. This code will be used on subsequent error replies resulting from actions taken by this filter."],smfi_settimeout:["void smfi_settimeout(long timeout)","Sets the number of seconds libmilter will wait for an MTA connection before timing out a socket."],snmp2_get:["string snmp2_get(string host, string community, string object_id [, int timeout [, int retries]])","Fetch a SNMP object"],snmp2_getnext:["string snmp2_getnext(string host, string community, string object_id [, int timeout [, int retries]])","Fetch a SNMP object"],snmp2_real_walk:["array snmp2_real_walk(string host, string community, string object_id [, int timeout [, int retries]])","Return all objects including their respective object id withing the specified one"],snmp2_set:["int snmp2_set(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])","Set the value of a SNMP object"],snmp2_walk:["array snmp2_walk(string host, string community, string object_id [, int timeout [, int retries]])","Return all objects under the specified object id"],snmp3_get:["int snmp3_get(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])","Fetch the value of a SNMP object"],snmp3_getnext:["int snmp3_getnext(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])","Fetch the value of a SNMP object"],snmp3_real_walk:["int snmp3_real_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])","Fetch the value of a SNMP object"],snmp3_set:["int snmp3_set(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id, string type, mixed value [, int timeout [, int retries]])","Fetch the value of a SNMP object"],snmp3_walk:["int snmp3_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])","Fetch the value of a SNMP object"],snmp_get_quick_print:["bool snmp_get_quick_print(void)","Return the current status of quick_print"],snmp_get_valueretrieval:["int snmp_get_valueretrieval()","Return the method how the SNMP values will be returned"],snmp_read_mib:["int snmp_read_mib(string filename)","Reads and parses a MIB file into the active MIB tree."],snmp_set_enum_print:["void snmp_set_enum_print(int enum_print)","Return all values that are enums with their enum value instead of the raw integer"],snmp_set_oid_output_format:["void snmp_set_oid_output_format(int oid_format)","Set the OID output format."],snmp_set_quick_print:["void snmp_set_quick_print(int quick_print)","Return all objects including their respective object id withing the specified one"],snmp_set_valueretrieval:["void snmp_set_valueretrieval(int method)","Specify the method how the SNMP values will be returned"],snmpget:["string snmpget(string host, string community, string object_id [, int timeout [, int retries]])","Fetch a SNMP object"],snmpgetnext:["string snmpgetnext(string host, string community, string object_id [, int timeout [, int retries]])","Fetch a SNMP object"],snmprealwalk:["array snmprealwalk(string host, string community, string object_id [, int timeout [, int retries]])","Return all objects including their respective object id withing the specified one"],snmpset:["int snmpset(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])","Set the value of a SNMP object"],snmpwalk:["array snmpwalk(string host, string community, string object_id [, int timeout [, int retries]])","Return all objects under the specified object id"],socket_accept:["resource socket_accept(resource socket)","Accepts a connection on the listening socket fd"],socket_bind:["bool socket_bind(resource socket, string addr [, int port])","Binds an open socket to a listening port, port is only specified in AF_INET family."],socket_clear_error:["void socket_clear_error([resource socket])","Clears the error on the socket or the last error code."],socket_close:["void socket_close(resource socket)","Closes a file descriptor"],socket_connect:["bool socket_connect(resource socket, string addr [, int port])","Opens a connection to addr:port on the socket specified by socket"],socket_create:["resource socket_create(int domain, int type, int protocol)","Creates an endpoint for communication in the domain specified by domain, of type specified by type"],socket_create_listen:["resource socket_create_listen(int port[, int backlog])","Opens a socket on port to accept connections"],socket_create_pair:["bool socket_create_pair(int domain, int type, int protocol, array &fd)","Creates a pair of indistinguishable sockets and stores them in fds."],socket_get_option:["mixed socket_get_option(resource socket, int level, int optname)","Gets socket options for the socket"],socket_getpeername:["bool socket_getpeername(resource socket, string &addr[, int &port])","Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type."],socket_getsockname:["bool socket_getsockname(resource socket, string &addr[, int &port])","Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type."],socket_last_error:["int socket_last_error([resource socket])","Returns the last socket error (either the last used or the provided socket resource)"],socket_listen:["bool socket_listen(resource socket[, int backlog])","Sets the maximum number of connections allowed to be waited for on the socket specified by fd"],socket_read:["string socket_read(resource socket, int length [, int type])","Reads a maximum of length bytes from socket"],socket_recv:["int socket_recv(resource socket, string &buf, int len, int flags)","Receives data from a connected socket"],socket_recvfrom:["int socket_recvfrom(resource socket, string &buf, int len, int flags, string &name [, int &port])","Receives data from a socket, connected or not"],socket_select:["int socket_select(array &read_fds, array &write_fds, array &except_fds, int tv_sec[, int tv_usec])","Runs the select() system call on the sets mentioned with a timeout specified by tv_sec and tv_usec"],socket_send:["int socket_send(resource socket, string buf, int len, int flags)","Sends data to a connected socket"],socket_sendto:["int socket_sendto(resource socket, string buf, int len, int flags, string addr [, int port])","Sends a message to a socket, whether it is connected or not"],socket_set_block:["bool socket_set_block(resource socket)","Sets blocking mode on a socket resource"],socket_set_nonblock:["bool socket_set_nonblock(resource socket)","Sets nonblocking mode on a socket resource"],socket_set_option:["bool socket_set_option(resource socket, int level, int optname, int|array optval)","Sets socket options for the socket"],socket_shutdown:["bool socket_shutdown(resource socket[, int how])","Shuts down a socket for receiving, sending, or both."],socket_strerror:["string socket_strerror(int errno)","Returns a string describing an error"],socket_write:["int socket_write(resource socket, string buf[, int length])","Writes the buffer to the socket resource, length is optional"],solid_fetch_prev:["bool solid_fetch_prev(resource result_id)",""],sort:["bool sort(array &array_arg [, int sort_flags])","Sort an array"],soundex:["string soundex(string str)","Calculate the soundex key of a string"],spl_autoload:["void spl_autoload(string class_name [, string file_extensions])","Default implementation for __autoload()"],spl_autoload_call:["void spl_autoload_call(string class_name)","Try all registerd autoload function to load the requested class"],spl_autoload_extensions:["string spl_autoload_extensions([string file_extensions])","Register and return default file extensions for spl_autoload"],spl_autoload_functions:["false|array spl_autoload_functions()","Return all registered __autoload() functionns"],spl_autoload_register:['bool spl_autoload_register([mixed autoload_function = "spl_autoload" [, throw = true [, prepend]]])',"Register given function as __autoload() implementation"],spl_autoload_unregister:["bool spl_autoload_unregister(mixed autoload_function)","Unregister given function as __autoload() implementation"],spl_classes:["array spl_classes()","Return an array containing the names of all clsses and interfaces defined in SPL"],spl_object_hash:["string spl_object_hash(object obj)","Return hash id for given object"],split:["array split(string pattern, string string [, int limit])","Split string into array by regular expression"],spliti:["array spliti(string pattern, string string [, int limit])","Split string into array by regular expression case-insensitive"],sprintf:["string sprintf(string format [, mixed arg1 [, mixed ...]])","Return a formatted string"],sql_regcase:["string sql_regcase(string string)","Make regular expression for case insensitive match"],sqlite_array_query:["array sqlite_array_query(resource db, string query [ , int result_type [, bool decode_binary]])","Executes a query against a given database and returns an array of arrays."],sqlite_busy_timeout:["void sqlite_busy_timeout(resource db, int ms)","Set busy timeout duration. If ms <= 0, all busy handlers are disabled."],sqlite_changes:["int sqlite_changes(resource db)","Returns the number of rows that were changed by the most recent SQL statement."],sqlite_close:["void sqlite_close(resource db)","Closes an open sqlite database."],sqlite_column:["mixed sqlite_column(resource result, mixed index_or_name [, bool decode_binary])","Fetches a column from the current row of a result set."],sqlite_create_aggregate:["bool sqlite_create_aggregate(resource db, string funcname, mixed step_func, mixed finalize_func[, long num_args])","Registers an aggregate function for queries."],sqlite_create_function:["bool sqlite_create_function(resource db, string funcname, mixed callback[, long num_args])",'Registers a "regular" function for queries.'],sqlite_current:["array sqlite_current(resource result [, int result_type [, bool decode_binary]])","Fetches the current row from a result set as an array."],sqlite_error_string:["string sqlite_error_string(int error_code)","Returns the textual description of an error code."],sqlite_escape_string:["string sqlite_escape_string(string item)","Escapes a string for use as a query parameter."],sqlite_exec:["boolean sqlite_exec(string query, resource db[, string &error_message])","Executes a result-less query against a given database"],sqlite_factory:["object sqlite_factory(string filename [, int mode [, string &error_message]])","Opens a SQLite database and creates an object for it. Will create the database if it does not exist."],sqlite_fetch_all:["array sqlite_fetch_all(resource result [, int result_type [, bool decode_binary]])","Fetches all rows from a result set as an array of arrays."],sqlite_fetch_array:["array sqlite_fetch_array(resource result [, int result_type [, bool decode_binary]])","Fetches the next row from a result set as an array."],sqlite_fetch_column_types:["resource sqlite_fetch_column_types(string table_name, resource db [, int result_type])","Return an array of column types from a particular table."],sqlite_fetch_object:["object sqlite_fetch_object(resource result [, string class_name [, NULL|array ctor_params [, bool decode_binary]]])","Fetches the next row from a result set as an object."],sqlite_fetch_single:["string sqlite_fetch_single(resource result [, bool decode_binary])","Fetches the first column of a result set as a string."],sqlite_field_name:["string sqlite_field_name(resource result, int field_index)","Returns the name of a particular field of a result set."],sqlite_has_prev:["bool sqlite_has_prev(resource result)","* Returns whether a previous row is available."],sqlite_key:["int sqlite_key(resource result)","Return the current row index of a buffered result."],sqlite_last_error:["int sqlite_last_error(resource db)","Returns the error code of the last error for a database."],sqlite_last_insert_rowid:["int sqlite_last_insert_rowid(resource db)","Returns the rowid of the most recently inserted row."],sqlite_libencoding:["string sqlite_libencoding()","Returns the encoding (iso8859 or UTF-8) of the linked SQLite library."],sqlite_libversion:["string sqlite_libversion()","Returns the version of the linked SQLite library."],sqlite_next:["bool sqlite_next(resource result)","Seek to the next row number of a result set."],sqlite_num_fields:["int sqlite_num_fields(resource result)","Returns the number of fields in a result set."],sqlite_num_rows:["int sqlite_num_rows(resource result)","Returns the number of rows in a buffered result set."],sqlite_open:["resource sqlite_open(string filename [, int mode [, string &error_message]])","Opens a SQLite database. Will create the database if it does not exist."],sqlite_popen:["resource sqlite_popen(string filename [, int mode [, string &error_message]])","Opens a persistent handle to a SQLite database. Will create the database if it does not exist."],sqlite_prev:["bool sqlite_prev(resource result)","* Seek to the previous row number of a result set."],sqlite_query:["resource sqlite_query(string query, resource db [, int result_type [, string &error_message]])","Executes a query against a given database and returns a result handle."],sqlite_rewind:["bool sqlite_rewind(resource result)","Seek to the first row number of a buffered result set."],sqlite_seek:["bool sqlite_seek(resource result, int row)","Seek to a particular row number of a buffered result set."],sqlite_single_query:["array sqlite_single_query(resource db, string query [, bool first_row_only [, bool decode_binary]])","Executes a query and returns either an array for one single column or the value of the first row."],sqlite_udf_decode_binary:["string sqlite_udf_decode_binary(string data)","Decode binary encoding on a string parameter passed to an UDF."],sqlite_udf_encode_binary:["string sqlite_udf_encode_binary(string data)","Apply binary encoding (if required) to a string to return from an UDF."],sqlite_unbuffered_query:["resource sqlite_unbuffered_query(string query, resource db [ , int result_type [, string &error_message]])","Executes a query that does not prefetch and buffer all data."],sqlite_valid:["bool sqlite_valid(resource result)","Returns whether more rows are available."],sqrt:["float sqrt(float number)","Returns the square root of the number"],srand:["void srand([int seed])","Seeds random number generator"],sscanf:["mixed sscanf(string str, string format [, string ...])","Implements an ANSI C compatible sscanf"],stat:["array stat(string filename)","Give information about a file"],str_getcsv:["array str_getcsv(string input[, string delimiter[, string enclosure[, string escape]]])","Parse a CSV string into an array"],str_ireplace:["mixed str_ireplace(mixed search, mixed replace, mixed subject [, int &replace_count])","Replaces all occurrences of search in haystack with replace / case-insensitive"],str_pad:["string str_pad(string input, int pad_length [, string pad_string [, int pad_type]])","Returns input string padded on the left or right to specified length with pad_string"],str_repeat:["string str_repeat(string input, int mult)","Returns the input string repeat mult times"],str_replace:["mixed str_replace(mixed search, mixed replace, mixed subject [, int &replace_count])","Replaces all occurrences of search in haystack with replace"],str_rot13:["string str_rot13(string str)","Perform the rot13 transform on a string"],str_shuffle:["void str_shuffle(string str)","Shuffles string. One permutation of all possible is created"],str_split:["array str_split(string str [, int split_length])","Convert a string to an array. If split_length is specified, break the string down into chunks each split_length characters long."],str_word_count:["mixed str_word_count(string str, [int format [, string charlist]])",'Counts the number of words inside a string. If format of 1 is specified, then the function will return an array containing all the words found inside the string. If format of 2 is specified, then the function will return an associated array where the position of the word is the key and the word itself is the value. For the purpose of this function, \'word\' is defined as a locale dependent string containing alphabetic characters, which also may contain, but not start with "\'" and "-" characters.'],strcasecmp:["int strcasecmp(string str1, string str2)","Binary safe case-insensitive string comparison"],strchr:["string strchr(string haystack, string needle)","An alias for strstr"],strcmp:["int strcmp(string str1, string str2)","Binary safe string comparison"],strcoll:["int strcoll(string str1, string str2)","Compares two strings using the current locale"],strcspn:["int strcspn(string str, string mask [, start [, len]])","Finds length of initial segment consisting entirely of characters not found in mask. If start or/and length is provide works like strcspn(substr($s,$start,$len),$bad_chars)"],stream_bucket_append:["void stream_bucket_append(resource brigade, resource bucket)","Append bucket to brigade"],stream_bucket_make_writeable:["object stream_bucket_make_writeable(resource brigade)","Return a bucket object from the brigade for operating on"],stream_bucket_new:["resource stream_bucket_new(resource stream, string buffer)","Create a new bucket for use on the current stream"],stream_bucket_prepend:["void stream_bucket_prepend(resource brigade, resource bucket)","Prepend bucket to brigade"],stream_context_create:["resource stream_context_create([array options[, array params]])","Create a file context and optionally set parameters"],stream_context_get_default:["resource stream_context_get_default([array options])","Get a handle on the default file/stream context and optionally set parameters"],stream_context_get_options:["array stream_context_get_options(resource context|resource stream)","Retrieve options for a stream/wrapper/context"],stream_context_get_params:["array stream_context_get_params(resource context|resource stream)","Get parameters of a file context"],stream_context_set_default:["resource stream_context_set_default(array options)","Set default file/stream context, returns the context as a resource"],stream_context_set_option:["bool stream_context_set_option(resource context|resource stream, string wrappername, string optionname, mixed value)","Set an option for a wrapper"],stream_context_set_params:["bool stream_context_set_params(resource context|resource stream, array options)","Set parameters for a file context"],stream_copy_to_stream:["long stream_copy_to_stream(resource source, resource dest [, long maxlen [, long pos]])","Reads up to maxlen bytes from source stream and writes them to dest stream."],stream_filter_append:["resource stream_filter_append(resource stream, string filtername[, int read_write[, string filterparams]])","Append a filter to a stream"],stream_filter_prepend:["resource stream_filter_prepend(resource stream, string filtername[, int read_write[, string filterparams]])","Prepend a filter to a stream"],stream_filter_register:["bool stream_filter_register(string filtername, string classname)","Registers a custom filter handler class"],stream_filter_remove:["bool stream_filter_remove(resource stream_filter)","Flushes any data in the filter's internal buffer, removes it from the chain, and frees the resource"],stream_get_contents:["string stream_get_contents(resource source [, long maxlen [, long offset]])","Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string."],stream_get_filters:["array stream_get_filters(void)","Returns a list of registered filters"],stream_get_line:["string stream_get_line(resource stream, int maxlen [, string ending])","Read up to maxlen bytes from a stream or until the ending string is found"],stream_get_meta_data:["array stream_get_meta_data(resource fp)","Retrieves header/meta data from streams/file pointers"],stream_get_transports:["array stream_get_transports()","Retrieves list of registered socket transports"],stream_get_wrappers:["array stream_get_wrappers()","Retrieves list of registered stream wrappers"],stream_is_local:["bool stream_is_local(resource stream|string url)",""],stream_resolve_include_path:["string stream_resolve_include_path(string filename)","Determine what file will be opened by calls to fopen() with a relative path"],stream_select:["int stream_select(array &read_streams, array &write_streams, array &except_streams, int tv_sec[, int tv_usec])","Runs the select() system call on the sets of streams with a timeout specified by tv_sec and tv_usec"],stream_set_blocking:["bool stream_set_blocking(resource socket, int mode)","Set blocking/non-blocking mode on a socket or stream"],stream_set_timeout:["bool stream_set_timeout(resource stream, int seconds [, int microseconds])","Set timeout on stream read to seconds + microseonds"],stream_set_write_buffer:["int stream_set_write_buffer(resource fp, int buffer)","Set file write buffer"],stream_socket_accept:["resource stream_socket_accept(resource serverstream, [ double timeout [, string &peername ]])","Accept a client connection from a server socket"],stream_socket_client:["resource stream_socket_client(string remoteaddress [, long &errcode [, string &errstring [, double timeout [, long flags [, resource context]]]]])","Open a client connection to a remote address"],stream_socket_enable_crypto:["int stream_socket_enable_crypto(resource stream, bool enable [, int cryptokind [, resource sessionstream]])","Enable or disable a specific kind of crypto on the stream"],stream_socket_get_name:["string stream_socket_get_name(resource stream, bool want_peer)","Returns either the locally bound or remote name for a socket stream"],stream_socket_pair:["array stream_socket_pair(int domain, int type, int protocol)","Creates a pair of connected, indistinguishable socket streams"],stream_socket_recvfrom:["string stream_socket_recvfrom(resource stream, long amount [, long flags [, string &remote_addr]])","Receives data from a socket stream"],stream_socket_sendto:["long stream_socket_sendto(resouce stream, string data [, long flags [, string target_addr]])","Send data to a socket stream. If target_addr is specified it must be in dotted quad (or [ipv6]) format"],stream_socket_server:["resource stream_socket_server(string localaddress [, long &errcode [, string &errstring [, long flags [, resource context]]]])","Create a server socket bound to localaddress"],stream_socket_shutdown:["int stream_socket_shutdown(resource stream, int how)","causes all or part of a full-duplex connection on the socket associated with stream to be shut down. If how is SHUT_RD, further receptions will be disallowed. If how is SHUT_WR, further transmissions will be disallowed. If how is SHUT_RDWR, further receptions and transmissions will be disallowed."],stream_supports_lock:["bool stream_supports_lock(resource stream)","Tells wether the stream supports locking through flock()."],stream_wrapper_register:["bool stream_wrapper_register(string protocol, string classname[, integer flags])","Registers a custom URL protocol handler class"],stream_wrapper_restore:["bool stream_wrapper_restore(string protocol)","Restore the original protocol handler, overriding if necessary"],stream_wrapper_unregister:["bool stream_wrapper_unregister(string protocol)","Unregister a wrapper for the life of the current request."],strftime:["string strftime(string format [, int timestamp])","Format a local time/date according to locale settings"],strip_tags:["string strip_tags(string str [, string allowable_tags])","Strips HTML and PHP tags from a string"],stripcslashes:["string stripcslashes(string str)","Strips backslashes from a string. Uses C-style conventions"],stripos:["int stripos(string haystack, string needle [, int offset])","Finds position of first occurrence of a string within another, case insensitive"],stripslashes:["string stripslashes(string str)","Strips backslashes from a string"],stristr:["string stristr(string haystack, string needle[, bool part])","Finds first occurrence of a string within another, case insensitive"],strlen:["int strlen(string str)","Get string length"],strnatcasecmp:["int strnatcasecmp(string s1, string s2)","Returns the result of case-insensitive string comparison using 'natural' algorithm"],strnatcmp:["int strnatcmp(string s1, string s2)","Returns the result of string comparison using 'natural' algorithm"],strncasecmp:["int strncasecmp(string str1, string str2, int len)","Binary safe string comparison"],strncmp:["int strncmp(string str1, string str2, int len)","Binary safe string comparison"],strpbrk:["array strpbrk(string haystack, string char_list)","Search a string for any of a set of characters"],strpos:["int strpos(string haystack, string needle [, int offset])","Finds position of first occurrence of a string within another"],strptime:["string strptime(string timestamp, string format)","Parse a time/date generated with strftime()"],strrchr:["string strrchr(string haystack, string needle)","Finds the last occurrence of a character in a string within another"],strrev:["string strrev(string str)","Reverse a string"],strripos:["int strripos(string haystack, string needle [, int offset])","Finds position of last occurrence of a string within another string"],strrpos:["int strrpos(string haystack, string needle [, int offset])","Finds position of last occurrence of a string within another string"],strspn:["int strspn(string str, string mask [, start [, len]])","Finds length of initial segment consisting entirely of characters found in mask. If start or/and length is provided works like strspn(substr($s,$start,$len),$good_chars)"],strstr:["string strstr(string haystack, string needle[, bool part])","Finds first occurrence of a string within another"],strtok:["string strtok([string str,] string token)","Tokenize a string"],strtolower:["string strtolower(string str)","Makes a string lowercase"],strtotime:["int strtotime(string time [, int now ])","Convert string representation of date and time to a timestamp"],strtoupper:["string strtoupper(string str)","Makes a string uppercase"],strtr:["string strtr(string str, string from[, string to])","Translates characters in str using given translation tables"],strval:["string strval(mixed var)","Get the string value of a variable"],substr:["string substr(string str, int start [, int length])","Returns part of a string"],substr_compare:["int substr_compare(string main_str, string str, int offset [, int length [, bool case_sensitivity]])","Binary safe optionally case insensitive comparison of 2 strings from an offset, up to length characters"],substr_count:["int substr_count(string haystack, string needle [, int offset [, int length]])","Returns the number of times a substring occurs in the string"],substr_replace:["mixed substr_replace(mixed str, mixed repl, mixed start [, mixed length])","Replaces part of a string with another string"],sybase_affected_rows:["int sybase_affected_rows([resource link_id])","Get number of affected rows in last query"],sybase_close:["bool sybase_close([resource link_id])","Close Sybase connection"],sybase_connect:["int sybase_connect([string host [, string user [, string password [, string charset [, string appname [, bool new]]]]]])","Open Sybase server connection"],sybase_data_seek:["bool sybase_data_seek(resource result, int offset)","Move internal row pointer"],sybase_deadlock_retry_count:["void sybase_deadlock_retry_count(int retry_count)","Sets deadlock retry count"],sybase_fetch_array:["array sybase_fetch_array(resource result)","Fetch row as array"],sybase_fetch_assoc:["array sybase_fetch_assoc(resource result)","Fetch row as array without numberic indices"],sybase_fetch_field:["object sybase_fetch_field(resource result [, int offset])","Get field information"],sybase_fetch_object:["object sybase_fetch_object(resource result [, mixed object])","Fetch row as object"],sybase_fetch_row:["array sybase_fetch_row(resource result)","Get row as enumerated array"],sybase_field_seek:["bool sybase_field_seek(resource result, int offset)","Set field offset"],sybase_free_result:["bool sybase_free_result(resource result)","Free result memory"],sybase_get_last_message:["string sybase_get_last_message(void)","Returns the last message from server (over min_message_severity)"],sybase_min_client_severity:["void sybase_min_client_severity(int severity)","Sets minimum client severity"],sybase_min_server_severity:["void sybase_min_server_severity(int severity)","Sets minimum server severity"],sybase_num_fields:["int sybase_num_fields(resource result)","Get number of fields in result"],sybase_num_rows:["int sybase_num_rows(resource result)","Get number of rows in result"],sybase_pconnect:["int sybase_pconnect([string host [, string user [, string password [, string charset [, string appname]]]]])","Open persistent Sybase connection"],sybase_query:["int sybase_query(string query [, resource link_id])","Send Sybase query"],sybase_result:["string sybase_result(resource result, int row, mixed field)","Get result data"],sybase_select_db:["bool sybase_select_db(string database [, resource link_id])","Select Sybase database"],sybase_set_message_handler:["bool sybase_set_message_handler(mixed error_func [, resource connection])","Set the error handler, to be called when a server message is raised. If error_func is NULL the handler will be deleted"],sybase_unbuffered_query:["int sybase_unbuffered_query(string query [, resource link_id])","Send Sybase query"],symlink:["int symlink(string target, string link)","Create a symbolic link"],sys_get_temp_dir:["string sys_get_temp_dir()","Returns directory path used for temporary files"],sys_getloadavg:["array sys_getloadavg()",""],syslog:["bool syslog(int priority, string message)","Generate a system log message"],system:["int system(string command [, int &return_value])","Execute an external program and display output"],tan:["float tan(float number)","Returns the tangent of the number in radians"],tanh:["float tanh(float number)","Returns the hyperbolic tangent of the number, defined as sinh(number)/cosh(number)"],tempnam:["string tempnam(string dir, string prefix)","Create a unique filename in a directory"],textdomain:["string textdomain(string domain)",'Set the textdomain to "domain". Returns the current domain'],tidy_access_count:["int tidy_access_count()","Returns the Number of Tidy accessibility warnings encountered for specified document."],tidy_clean_repair:["boolean tidy_clean_repair()","Execute configured cleanup and repair operations on parsed markup"],tidy_config_count:["int tidy_config_count()","Returns the Number of Tidy configuration errors encountered for specified document."],tidy_diagnose:["boolean tidy_diagnose()","Run configured diagnostics on parsed and repaired markup."],tidy_error_count:["int tidy_error_count()","Returns the Number of Tidy errors encountered for specified document."],tidy_get_body:["TidyNode tidy_get_body(resource tidy)","Returns a TidyNode Object starting from the tag of the tidy parse tree"],tidy_get_config:["array tidy_get_config()","Get current Tidy configuarion"],tidy_get_error_buffer:["string tidy_get_error_buffer([boolean detailed])","Return warnings and errors which occured parsing the specified document"],tidy_get_head:["TidyNode tidy_get_head()","Returns a TidyNode Object starting from the tag of the tidy parse tree"],tidy_get_html:["TidyNode tidy_get_html()","Returns a TidyNode Object starting from the tag of the tidy parse tree"],tidy_get_html_ver:["int tidy_get_html_ver()","Get the Detected HTML version for the specified document."],tidy_get_opt_doc:["string tidy_get_opt_doc(tidy resource, string optname)","Returns the documentation for the given option name"],tidy_get_output:["string tidy_get_output()","Return a string representing the parsed tidy markup"],tidy_get_release:["string tidy_get_release()","Get release date (version) for Tidy library"],tidy_get_root:["TidyNode tidy_get_root()","Returns a TidyNode Object representing the root of the tidy parse tree"],tidy_get_status:["int tidy_get_status()","Get status of specfied document."],tidy_getopt:["mixed tidy_getopt(string option)","Returns the value of the specified configuration option for the tidy document."],tidy_is_xhtml:["boolean tidy_is_xhtml()","Indicates if the document is a XHTML document."],tidy_is_xml:["boolean tidy_is_xml()","Indicates if the document is a generic (non HTML/XHTML) XML document."],tidy_parse_file:["boolean tidy_parse_file(string file [, mixed config_options [, string encoding [, bool use_include_path]]])","Parse markup in file or URI"],tidy_parse_string:["bool tidy_parse_string(string input [, mixed config_options [, string encoding]])","Parse a document stored in a string"],tidy_repair_file:["boolean tidy_repair_file(string filename [, mixed config_file [, string encoding [, bool use_include_path]]])","Repair a file using an optionally provided configuration file"],tidy_repair_string:["boolean tidy_repair_string(string data [, mixed config_file [, string encoding]])","Repair a string using an optionally provided configuration file"],tidy_warning_count:["int tidy_warning_count()","Returns the Number of Tidy warnings encountered for specified document."],time:["int time(void)","Return current UNIX timestamp"],time_nanosleep:["mixed time_nanosleep(long seconds, long nanoseconds)","Delay for a number of seconds and nano seconds"],time_sleep_until:["mixed time_sleep_until(float timestamp)","Make the script sleep until the specified time"],timezone_abbreviations_list:["array timezone_abbreviations_list()","Returns associative array containing dst, offset and the timezone name"],timezone_identifiers_list:["array timezone_identifiers_list([long what[, string country]])","Returns numerically index array with all timezone identifiers."],timezone_location_get:["array timezone_location_get()","Returns location information for a timezone, including country code, latitude/longitude and comments"],timezone_name_from_abbr:["string timezone_name_from_abbr(string abbr[, long gmtOffset[, long isdst]])","Returns the timezone name from abbrevation"],timezone_name_get:["string timezone_name_get(DateTimeZone object)","Returns the name of the timezone."],timezone_offset_get:["long timezone_offset_get(DateTimeZone object, DateTime object)","Returns the timezone offset."],timezone_open:["DateTimeZone timezone_open(string timezone)","Returns new DateTimeZone object"],timezone_transitions_get:["array timezone_transitions_get(DateTimeZone object [, long timestamp_begin [, long timestamp_end ]])","Returns numerically indexed array containing associative array for all transitions in the specified range for the timezone."],timezone_version_get:["array timezone_version_get()","Returns the Olson database version number."],tmpfile:["resource tmpfile(void)","Create a temporary file that will be deleted automatically after use"],token_get_all:["array token_get_all(string source)",""],token_name:["string token_name(int type)",""],touch:["bool touch(string filename [, int time [, int atime]])","Set modification time of file"],trigger_error:["void trigger_error(string messsage [, int error_type])","Generates a user-level error/warning/notice message"],trim:["string trim(string str [, string character_mask])","Strips whitespace from the beginning and end of a string"],uasort:["bool uasort(array array_arg, string cmp_function)","Sort an array with a user-defined comparison function and maintain index association"],ucfirst:["string ucfirst(string str)","Make a string's first character lowercase"],ucwords:["string ucwords(string str)","Uppercase the first character of every word in a string"],uksort:["bool uksort(array array_arg, string cmp_function)","Sort an array by keys using a user-defined comparison function"],umask:["int umask([int mask])","Return or change the umask"],uniqid:["string uniqid([string prefix [, bool more_entropy]])","Generates a unique ID"],unixtojd:["int unixtojd([int timestamp])","Convert UNIX timestamp to Julian Day"],unlink:["bool unlink(string filename[, context context])","Delete a file"],unpack:["array unpack(string format, string input)","Unpack binary string into named array elements according to format argument"],unregister_tick_function:["void unregister_tick_function(string function_name)","Unregisters a tick callback function"],unserialize:["mixed unserialize(string variable_representation)","Takes a string representation of variable and recreates it"],unset:["void unset (mixed var [, mixed var])","Unset a given variable"],urldecode:["string urldecode(string str)","Decodes URL-encoded string"],urlencode:["string urlencode(string str)","URL-encodes string"],usleep:["void usleep(int micro_seconds)","Delay for a given number of micro seconds"],usort:["bool usort(array array_arg, string cmp_function)","Sort an array by values using a user-defined comparison function"],utf8_decode:["string utf8_decode(string data)","Converts a UTF-8 encoded string to ISO-8859-1"],utf8_encode:["string utf8_encode(string data)","Encodes an ISO-8859-1 string to UTF-8"],var_dump:["void var_dump(mixed var)","Dumps a string representation of variable to output"],var_export:["mixed var_export(mixed var [, bool return])","Outputs or returns a string representation of a variable"],variant_abs:["mixed variant_abs(mixed left)","Returns the absolute value of a variant"],variant_add:["mixed variant_add(mixed left, mixed right)",'"Adds" two variant values together and returns the result'],variant_and:["mixed variant_and(mixed left, mixed right)","performs a bitwise AND operation between two variants and returns the result"],variant_cast:["object variant_cast(object variant, int type)","Convert a variant into a new variant object of another type"],variant_cat:["mixed variant_cat(mixed left, mixed right)","concatenates two variant values together and returns the result"],variant_cmp:["int variant_cmp(mixed left, mixed right [, int lcid [, int flags]])","Compares two variants"],variant_date_from_timestamp:["object variant_date_from_timestamp(int timestamp)","Returns a variant date representation of a unix timestamp"],variant_date_to_timestamp:["int variant_date_to_timestamp(object variant)","Converts a variant date/time value to unix timestamp"],variant_div:["mixed variant_div(mixed left, mixed right)","Returns the result from dividing two variants"],variant_eqv:["mixed variant_eqv(mixed left, mixed right)","Performs a bitwise equivalence on two variants"],variant_fix:["mixed variant_fix(mixed left)","Returns the integer part ? of a variant"],variant_get_type:["int variant_get_type(object variant)","Returns the VT_XXX type code for a variant"],variant_idiv:["mixed variant_idiv(mixed left, mixed right)","Converts variants to integers and then returns the result from dividing them"],variant_imp:["mixed variant_imp(mixed left, mixed right)","Performs a bitwise implication on two variants"],variant_int:["mixed variant_int(mixed left)","Returns the integer portion of a variant"],variant_mod:["mixed variant_mod(mixed left, mixed right)","Divides two variants and returns only the remainder"],variant_mul:["mixed variant_mul(mixed left, mixed right)","multiplies the values of the two variants and returns the result"],variant_neg:["mixed variant_neg(mixed left)","Performs logical negation on a variant"],variant_not:["mixed variant_not(mixed left)","Performs bitwise not negation on a variant"],variant_or:["mixed variant_or(mixed left, mixed right)","Performs a logical disjunction on two variants"],variant_pow:["mixed variant_pow(mixed left, mixed right)","Returns the result of performing the power function with two variants"],variant_round:["mixed variant_round(mixed left, int decimals)","Rounds a variant to the specified number of decimal places"],variant_set:["void variant_set(object variant, mixed value)","Assigns a new value for a variant object"],variant_set_type:["void variant_set_type(object variant, int type)",'Convert a variant into another type. Variant is modified "in-place"'],variant_sub:["mixed variant_sub(mixed left, mixed right)","subtracts the value of the right variant from the left variant value and returns the result"],variant_xor:["mixed variant_xor(mixed left, mixed right)","Performs a logical exclusion on two variants"],version_compare:["int version_compare(string ver1, string ver2 [, string oper])",'Compares two "PHP-standardized" version number strings'],vfprintf:["int vfprintf(resource stream, string format, array args)","Output a formatted string into a stream"],virtual:["bool virtual(string filename)","Perform an Apache sub-request"],vprintf:["int vprintf(string format, array args)","Output a formatted string"],vsprintf:["string vsprintf(string format, array args)","Return a formatted string"],wddx_add_vars:["int wddx_add_vars(resource packet_id, mixed var_names [, mixed ...])","Serializes given variables and adds them to packet given by packet_id"],wddx_deserialize:["mixed wddx_deserialize(mixed packet)","Deserializes given packet and returns a PHP value"],wddx_packet_end:["string wddx_packet_end(resource packet_id)","Ends specified WDDX packet and returns the string containing the packet"],wddx_packet_start:["resource wddx_packet_start([string comment])","Starts a WDDX packet with optional comment and returns the packet id"],wddx_serialize_value:["string wddx_serialize_value(mixed var [, string comment])","Creates a new packet and serializes the given value"],wddx_serialize_vars:["string wddx_serialize_vars(mixed var_name [, mixed ...])","Creates a new packet and serializes given variables into a struct"],wordwrap:["string wordwrap(string str [, int width [, string break [, boolean cut]]])","Wraps buffer to selected number of characters using string break char"],xml_error_string:["string xml_error_string(int code)","Get XML parser error string"],xml_get_current_byte_index:["int xml_get_current_byte_index(resource parser)","Get current byte index for an XML parser"],xml_get_current_column_number:["int xml_get_current_column_number(resource parser)","Get current column number for an XML parser"],xml_get_current_line_number:["int xml_get_current_line_number(resource parser)","Get current line number for an XML parser"],xml_get_error_code:["int xml_get_error_code(resource parser)","Get XML parser error code"],xml_parse:["int xml_parse(resource parser, string data [, int isFinal])","Start parsing an XML document"],xml_parse_into_struct:["int xml_parse_into_struct(resource parser, string data, array &values [, array &index ])","Parsing a XML document"],xml_parser_create:["resource xml_parser_create([string encoding])","Create an XML parser"],xml_parser_create_ns:["resource xml_parser_create_ns([string encoding [, string sep]])","Create an XML parser"],xml_parser_free:["int xml_parser_free(resource parser)","Free an XML parser"],xml_parser_get_option:["int xml_parser_get_option(resource parser, int option)","Get options from an XML parser"],xml_parser_set_option:["int xml_parser_set_option(resource parser, int option, mixed value)","Set options in an XML parser"],xml_set_character_data_handler:["int xml_set_character_data_handler(resource parser, string hdl)","Set up character data handler"],xml_set_default_handler:["int xml_set_default_handler(resource parser, string hdl)","Set up default handler"],xml_set_element_handler:["int xml_set_element_handler(resource parser, string shdl, string ehdl)","Set up start and end element handlers"],xml_set_end_namespace_decl_handler:["int xml_set_end_namespace_decl_handler(resource parser, string hdl)","Set up character data handler"],xml_set_external_entity_ref_handler:["int xml_set_external_entity_ref_handler(resource parser, string hdl)","Set up external entity reference handler"],xml_set_notation_decl_handler:["int xml_set_notation_decl_handler(resource parser, string hdl)","Set up notation declaration handler"],xml_set_object:["int xml_set_object(resource parser, object &obj)","Set up object which should be used for callbacks"],xml_set_processing_instruction_handler:["int xml_set_processing_instruction_handler(resource parser, string hdl)","Set up processing instruction (PI) handler"],xml_set_start_namespace_decl_handler:["int xml_set_start_namespace_decl_handler(resource parser, string hdl)","Set up character data handler"],xml_set_unparsed_entity_decl_handler:["int xml_set_unparsed_entity_decl_handler(resource parser, string hdl)","Set up unparsed entity declaration handler"],xmlrpc_decode:["array xmlrpc_decode(string xml [, string encoding])","Decodes XML into native PHP types"],xmlrpc_decode_request:["array xmlrpc_decode_request(string xml, string& method [, string encoding])","Decodes XML into native PHP types"],xmlrpc_encode:["string xmlrpc_encode(mixed value)","Generates XML for a PHP value"],xmlrpc_encode_request:["string xmlrpc_encode_request(string method, mixed params [, array output_options])","Generates XML for a method request"],xmlrpc_get_type:["string xmlrpc_get_type(mixed value)","Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings"],xmlrpc_is_fault:["bool xmlrpc_is_fault(array)","Determines if an array value represents an XMLRPC fault."],xmlrpc_parse_method_descriptions:["array xmlrpc_parse_method_descriptions(string xml)","Decodes XML into a list of method descriptions"],xmlrpc_server_add_introspection_data:["int xmlrpc_server_add_introspection_data(resource server, array desc)","Adds introspection documentation"],xmlrpc_server_call_method:["mixed xmlrpc_server_call_method(resource server, string xml, mixed user_data [, array output_options])","Parses XML requests and call methods"],xmlrpc_server_create:["resource xmlrpc_server_create(void)","Creates an xmlrpc server"],xmlrpc_server_destroy:["int xmlrpc_server_destroy(resource server)","Destroys server resources"],xmlrpc_server_register_introspection_callback:["bool xmlrpc_server_register_introspection_callback(resource server, string function)","Register a PHP function to generate documentation"],xmlrpc_server_register_method:["bool xmlrpc_server_register_method(resource server, string method_name, string function)","Register a PHP function to handle method matching method_name"],xmlrpc_set_type:["bool xmlrpc_set_type(string value, string type)","Sets xmlrpc type, base64 or datetime, for a PHP string value"],xmlwriter_end_attribute:["bool xmlwriter_end_attribute(resource xmlwriter)","End attribute - returns FALSE on error"],xmlwriter_end_cdata:["bool xmlwriter_end_cdata(resource xmlwriter)","End current CDATA - returns FALSE on error"],xmlwriter_end_comment:["bool xmlwriter_end_comment(resource xmlwriter)","Create end comment - returns FALSE on error"],xmlwriter_end_document:["bool xmlwriter_end_document(resource xmlwriter)","End current document - returns FALSE on error"],xmlwriter_end_dtd:["bool xmlwriter_end_dtd(resource xmlwriter)","End current DTD - returns FALSE on error"],xmlwriter_end_dtd_attlist:["bool xmlwriter_end_dtd_attlist(resource xmlwriter)","End current DTD AttList - returns FALSE on error"],xmlwriter_end_dtd_element:["bool xmlwriter_end_dtd_element(resource xmlwriter)","End current DTD element - returns FALSE on error"],xmlwriter_end_dtd_entity:["bool xmlwriter_end_dtd_entity(resource xmlwriter)","End current DTD Entity - returns FALSE on error"],xmlwriter_end_element:["bool xmlwriter_end_element(resource xmlwriter)","End current element - returns FALSE on error"],xmlwriter_end_pi:["bool xmlwriter_end_pi(resource xmlwriter)","End current PI - returns FALSE on error"],xmlwriter_flush:["mixed xmlwriter_flush(resource xmlwriter [,bool empty])","Output current buffer"],xmlwriter_full_end_element:["bool xmlwriter_full_end_element(resource xmlwriter)","End current element - returns FALSE on error"],xmlwriter_open_memory:["resource xmlwriter_open_memory()","Create new xmlwriter using memory for string output"],xmlwriter_open_uri:["resource xmlwriter_open_uri(resource xmlwriter, string source)","Create new xmlwriter using source uri for output"],xmlwriter_output_memory:["string xmlwriter_output_memory(resource xmlwriter [,bool flush])","Output current buffer as string"],xmlwriter_set_indent:["bool xmlwriter_set_indent(resource xmlwriter, bool indent)","Toggle indentation on/off - returns FALSE on error"],xmlwriter_set_indent_string:["bool xmlwriter_set_indent_string(resource xmlwriter, string indentString)","Set string used for indenting - returns FALSE on error"],xmlwriter_start_attribute:["bool xmlwriter_start_attribute(resource xmlwriter, string name)","Create start attribute - returns FALSE on error"],xmlwriter_start_attribute_ns:["bool xmlwriter_start_attribute_ns(resource xmlwriter, string prefix, string name, string uri)","Create start namespaced attribute - returns FALSE on error"],xmlwriter_start_cdata:["bool xmlwriter_start_cdata(resource xmlwriter)","Create start CDATA tag - returns FALSE on error"],xmlwriter_start_comment:["bool xmlwriter_start_comment(resource xmlwriter)","Create start comment - returns FALSE on error"],xmlwriter_start_document:["bool xmlwriter_start_document(resource xmlwriter, string version, string encoding, string standalone)","Create document tag - returns FALSE on error"],xmlwriter_start_dtd:["bool xmlwriter_start_dtd(resource xmlwriter, string name, string pubid, string sysid)","Create start DTD tag - returns FALSE on error"],xmlwriter_start_dtd_attlist:["bool xmlwriter_start_dtd_attlist(resource xmlwriter, string name)","Create start DTD AttList - returns FALSE on error"],xmlwriter_start_dtd_element:["bool xmlwriter_start_dtd_element(resource xmlwriter, string name)","Create start DTD element - returns FALSE on error"],xmlwriter_start_dtd_entity:["bool xmlwriter_start_dtd_entity(resource xmlwriter, string name, bool isparam)","Create start DTD Entity - returns FALSE on error"],xmlwriter_start_element:["bool xmlwriter_start_element(resource xmlwriter, string name)","Create start element tag - returns FALSE on error"],xmlwriter_start_element_ns:["bool xmlwriter_start_element_ns(resource xmlwriter, string prefix, string name, string uri)","Create start namespaced element tag - returns FALSE on error"],xmlwriter_start_pi:["bool xmlwriter_start_pi(resource xmlwriter, string target)","Create start PI tag - returns FALSE on error"],xmlwriter_text:["bool xmlwriter_text(resource xmlwriter, string content)","Write text - returns FALSE on error"],xmlwriter_write_attribute:["bool xmlwriter_write_attribute(resource xmlwriter, string name, string content)","Write full attribute - returns FALSE on error"],xmlwriter_write_attribute_ns:["bool xmlwriter_write_attribute_ns(resource xmlwriter, string prefix, string name, string uri, string content)","Write full namespaced attribute - returns FALSE on error"],xmlwriter_write_cdata:["bool xmlwriter_write_cdata(resource xmlwriter, string content)","Write full CDATA tag - returns FALSE on error"],xmlwriter_write_comment:["bool xmlwriter_write_comment(resource xmlwriter, string content)","Write full comment tag - returns FALSE on error"],xmlwriter_write_dtd:["bool xmlwriter_write_dtd(resource xmlwriter, string name, string pubid, string sysid, string subset)","Write full DTD tag - returns FALSE on error"],xmlwriter_write_dtd_attlist:["bool xmlwriter_write_dtd_attlist(resource xmlwriter, string name, string content)","Write full DTD AttList tag - returns FALSE on error"],xmlwriter_write_dtd_element:["bool xmlwriter_write_dtd_element(resource xmlwriter, string name, string content)","Write full DTD element tag - returns FALSE on error"],xmlwriter_write_dtd_entity:["bool xmlwriter_write_dtd_entity(resource xmlwriter, string name, string content [, int pe [, string pubid [, string sysid [, string ndataid]]]])","Write full DTD Entity tag - returns FALSE on error"],xmlwriter_write_element:["bool xmlwriter_write_element(resource xmlwriter, string name[, string content])","Write full element tag - returns FALSE on error"],xmlwriter_write_element_ns:["bool xmlwriter_write_element_ns(resource xmlwriter, string prefix, string name, string uri[, string content])","Write full namesapced element tag - returns FALSE on error"],xmlwriter_write_pi:["bool xmlwriter_write_pi(resource xmlwriter, string target, string content)","Write full PI tag - returns FALSE on error"],xmlwriter_write_raw:["bool xmlwriter_write_raw(resource xmlwriter, string content)","Write text - returns FALSE on error"],xsl_xsltprocessor_get_parameter:["string xsl_xsltprocessor_get_parameter(string namespace, string name);",""],xsl_xsltprocessor_has_exslt_support:["bool xsl_xsltprocessor_has_exslt_support();",""],xsl_xsltprocessor_import_stylesheet:["void xsl_xsltprocessor_import_stylesheet(domdocument doc);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since:"],xsl_xsltprocessor_register_php_functions:["void xsl_xsltprocessor_register_php_functions([mixed $restrict]);",""],xsl_xsltprocessor_remove_parameter:["bool xsl_xsltprocessor_remove_parameter(string namespace, string name);",""],xsl_xsltprocessor_set_parameter:["bool xsl_xsltprocessor_set_parameter(string namespace, mixed name [, string value]);",""],xsl_xsltprocessor_set_profiling:["bool xsl_xsltprocessor_set_profiling(string filename) */",'PHP_FUNCTION(xsl_xsltprocessor_set_profiling) { zval *id; xsl_object *intern; char *filename = NULL; int filename_len; DOM_GET_THIS(id); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "s!", &filename, &filename_len) == SUCCESS) { intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC); if (intern->profiling) { efree(intern->profiling); } if (filename != NULL) { intern->profiling = estrndup(filename,filename_len); } else { intern->profiling = NULL; } RETURN_TRUE; } else { WRONG_PARAM_COUNT; } } /* }}} end xsl_xsltprocessor_set_profiling'],xsl_xsltprocessor_transform_to_doc:["domdocument xsl_xsltprocessor_transform_to_doc(domnode doc);","URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since:"],xsl_xsltprocessor_transform_to_uri:["int xsl_xsltprocessor_transform_to_uri(domdocument doc, string uri);",""],xsl_xsltprocessor_transform_to_xml:["string xsl_xsltprocessor_transform_to_xml(domdocument doc);",""],zend_logo_guid:["string zend_logo_guid(void)","Return the special ID used to request the Zend logo in phpinfo screens"],zend_version:["string zend_version(void)","Get the version of the Zend Engine"],zip_close:["void zip_close(resource zip)","Close a Zip archive"],zip_entry_close:["void zip_entry_close(resource zip_ent)","Close a zip entry"],zip_entry_compressedsize:["int zip_entry_compressedsize(resource zip_entry)","Return the compressed size of a ZZip entry"],zip_entry_compressionmethod:["string zip_entry_compressionmethod(resource zip_entry)","Return a string containing the compression method used on a particular entry"],zip_entry_filesize:["int zip_entry_filesize(resource zip_entry)","Return the actual filesize of a ZZip entry"],zip_entry_name:["string zip_entry_name(resource zip_entry)","Return the name given a ZZip entry"],zip_entry_open:["bool zip_entry_open(resource zip_dp, resource zip_entry [, string mode])","Open a Zip File, pointed by the resource entry"],zip_entry_read:["mixed zip_entry_read(resource zip_entry [, int len])","Read from an open directory entry"],zip_open:["resource zip_open(string filename)","Create new zip using source uri for output"],zip_read:["resource zip_read(resource zip)","Returns the next file in the archive"],zlib_get_coding_type:["string zlib_get_coding_type(void)","Returns the coding type used for output compression"]},i={$_COOKIE:{type:"array"},$_ENV:{type:"array"},$_FILES:{type:"array"},$_GET:{type:"array"},$_POST:{type:"array"},$_REQUEST:{type:"array"},$_SERVER:{type:"array",value:{DOCUMENT_ROOT:1,GATEWAY_INTERFACE:1,HTTP_ACCEPT:1,HTTP_ACCEPT_CHARSET:1,HTTP_ACCEPT_ENCODING:1,HTTP_ACCEPT_LANGUAGE:1,HTTP_CONNECTION:1,HTTP_HOST:1,HTTP_REFERER:1,HTTP_USER_AGENT:1,PATH_TRANSLATED:1,PHP_SELF:1,QUERY_STRING:1,REMOTE_ADDR:1,REMOTE_PORT:1,REQUEST_METHOD:1,REQUEST_URI:1,SCRIPT_FILENAME:1,SCRIPT_NAME:1,SERVER_ADMIN:1,SERVER_NAME:1,SERVER_PORT:1,SERVER_PROTOCOL:1,SERVER_SIGNATURE:1,SERVER_SOFTWARE:1}},$_SESSION:{type:"array"},$GLOBALS:{type:"array"}},o=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(i.type==="identifier")return this.getFunctionCompletions(e,t,n,r);if(s(i,"variable"))return this.getVariableCompletions(e,t,n,r);var o=t.getLine(n.row).substr(0,n.column);return i.type==="string"&&/(\$[\w]*)\[["']([^'"]*)$/i.test(o)?this.getArrayKeyCompletions(e,t,n,r):[]},this.getFunctionCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+"($0)",meta:"php function",score:Number.MAX_VALUE,docHTML:r[e][1]}})},this.getVariableCompletions=function(e,t,n,r){var s=Object.keys(i);return s.map(function(e){return{caption:e,value:e,meta:"php variable",score:Number.MAX_VALUE}})},this.getArrayKeyCompletions=function(e,t,n,r){var s=t.getLine(n.row).substr(0,n.column),o=s.match(/(\$[\w]*)\[["']([^'"]*)$/i)[1];if(!i[o])return[];var u=[];return i[o].type==="array"&&i[o].value&&(u=Object.keys(i[o].value)),u.map(function(e){return{caption:e,value:e,meta:"php array key",score:Number.MAX_VALUE}})}}).call(o.prototype),t.PhpCompletions=o}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),define("ace/mode/php",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/php_highlight_rules","ace/mode/php_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/php_completions","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/unicode","ace/mode/html","ace/mode/javascript","ace/mode/css"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./php_highlight_rules").PhpHighlightRules,o=e("./php_highlight_rules").PhpLangHighlightRules,u=e("./matching_brace_outdent").MatchingBraceOutdent,a=e("../range").Range,f=e("../worker/worker_client").WorkerClient,l=e("./php_completions").PhpCompletions,c=e("./behaviour/cstyle").CstyleBehaviour,h=e("./folding/cstyle").FoldMode,p=e("../unicode"),d=e("./html").Mode,v=e("./javascript").Mode,m=e("./css").Mode,g=function(e){this.HighlightRules=o,this.$outdent=new u,this.$behaviour=new c,this.$completer=new l,this.foldingRules=new h};r.inherits(g,i),function(){this.tokenRe=new RegExp("^["+p.packages.L+p.packages.Mn+p.packages.Mc+p.packages.Nd+p.packages.Pc+"_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+p.packages.L+p.packages.Mn+p.packages.Mc+p.packages.Nd+p.packages.Pc+"_]|\\s])+","g"),this.lineCommentStart=["//","#"],this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var u=t.match(/^.*[\{\(\[:]\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o!="doc-start")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.$id="ace/mode/php-inline"}.call(g.prototype);var y=function(e){if(e&&e.inline){var t=new g;return t.createWorker=this.createWorker,t.inlinePhp=!0,t}d.call(this),this.HighlightRules=s,this.createModeDelegates({"js-":v,"css-":m,"php-":g}),this.foldingRules.subModes["php-"]=new h};r.inherits(y,d),function(){this.createWorker=function(e){var t=new f(["ace"],"ace/mode/php_worker","PhpWorker");return t.attachToDocument(e.getDocument()),this.inlinePhp&&t.call("setOptions",[{inline:!0}]),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/php"}.call(y.prototype),t.Mode=y}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-plain_text.js b/public/themes/panel/vendor/ace/mode-plain_text.js deleted file mode 100644 index 2e2cfb44a0..0000000000 --- a/public/themes/panel/vendor/ace/mode-plain_text.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/plain_text",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/behaviour"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./text_highlight_rules").TextHighlightRules,o=e("./behaviour").Behaviour,u=function(){this.HighlightRules=s,this.$behaviour=new o};r.inherits(u,i),function(){this.type="text",this.getNextLineIndent=function(e,t,n){return""},this.$id="ace/mode/plain_text"}.call(u.prototype),t.Mode=u}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-properties.js b/public/themes/panel/vendor/ace/mode-properties.js deleted file mode 100644 index 1f77ca3afa..0000000000 --- a/public/themes/panel/vendor/ace/mode-properties.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/properties_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=/\\u[0-9a-fA-F]{4}|\\/;this.$rules={start:[{token:"comment",regex:/[!#].*$/},{token:"keyword",regex:/[=:]$/},{token:"keyword",regex:/[=:]/,next:"value"},{token:"constant.language.escape",regex:e},{defaultToken:"variable"}],value:[{regex:/\\$/,token:"string",next:"value"},{regex:/$/,token:"string",next:"start"},{token:"constant.language.escape",regex:e},{defaultToken:"string"}]}};r.inherits(s,i),t.PropertiesHighlightRules=s}),define("ace/mode/properties",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/properties_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./properties_highlight_rules").PropertiesHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/properties"}.call(o.prototype),t.Mode=o}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-python.js b/public/themes/panel/vendor/ace/mode-python.js deleted file mode 100644 index f4e6c0d692..0000000000 --- a/public/themes/panel/vendor/ace/mode-python.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/python_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield",t="True|False|None|NotImplemented|Ellipsis|__debug__",n="abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern",r=this.createKeywordMapper({"invalid.deprecated":"debugger","support.function":n,"constant.language":t,keyword:e},"identifier"),i="(?:r|u|ur|R|U|UR|Ur|uR)?",s="(?:(?:[1-9]\\d*)|(?:0))",o="(?:0[oO]?[0-7]+)",u="(?:0[xX][\\dA-Fa-f]+)",a="(?:0[bB][01]+)",f="(?:"+s+"|"+o+"|"+u+"|"+a+")",l="(?:[eE][+-]?\\d+)",c="(?:\\.\\d+)",h="(?:\\d+)",p="(?:(?:"+h+"?"+c+")|(?:"+h+"\\.))",d="(?:(?:"+p+"|"+h+")"+l+")",v="(?:"+d+"|"+p+")",m="\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})";this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string",regex:i+'"{3}',next:"qqstring3"},{token:"string",regex:i+'"(?=.)',next:"qqstring"},{token:"string",regex:i+"'{3}",next:"qstring3"},{token:"string",regex:i+"'(?=.)",next:"qstring"},{token:"constant.numeric",regex:"(?:"+v+"|\\d+)[jJ]\\b"},{token:"constant.numeric",regex:v},{token:"constant.numeric",regex:f+"[lL]\\b"},{token:"constant.numeric",regex:f+"\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],qqstring3:[{token:"constant.language.escape",regex:m},{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],qstring3:[{token:"constant.language.escape",regex:m},{token:"string",regex:"'{3}",next:"start"},{defaultToken:"string"}],qqstring:[{token:"constant.language.escape",regex:m},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:m},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"start"},{defaultToken:"string"}]}};r.inherits(s,i),t.PythonHighlightRules=s}),define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=t.FoldMode=function(e){this.foldingStartMarker=new RegExp("([\\[{])(?:\\s*)$|("+e+")(?:\\s*)(?:#.*)?$")};r.inherits(s,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.match(this.foldingStartMarker);if(i)return i[1]?this.openingBracketBlock(e,i[1],n,i.index):i[2]?this.indentationBlock(e,n,i.index+i[2].length):this.indentationBlock(e,n)}}.call(s.prototype)}),define("ace/mode/python",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/python_highlight_rules","ace/mode/folding/pythonic","ace/range"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./python_highlight_rules").PythonHighlightRules,o=e("./folding/pythonic").FoldMode,u=e("../range").Range,a=function(){this.HighlightRules=s,this.foldingRules=new o("\\:"),this.$behaviour=this.$defaultBehaviour};r.inherits(a,i),function(){this.lineCommentStart="#",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var o=t.match(/^.*[\{\(\[:]\s*$/);o&&(r+=n)}return r};var e={pass:1,"return":1,raise:1,"break":1,"continue":1};this.checkOutdent=function(t,n,r){if(r!=="\r\n"&&r!=="\r"&&r!=="\n")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type=="comment"||s.type=="text"&&s.value.match(/^\s+$/)));return s?s.type=="keyword"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new u(n,r.length-i.length,n,r.length))},this.$id="ace/mode/python"}.call(a.prototype),t.Mode=a}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-ruby.js b/public/themes/panel/vendor/ace/mode-ruby.js deleted file mode 100644 index b857c1fd02..0000000000 --- a/public/themes/panel/vendor/ace/mode-ruby.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=t.constantOtherSymbol={token:"constant.other.symbol.ruby",regex:"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"},o=t.qString={token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},u=t.qqString={token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},a=t.tString={token:"string",regex:"[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"},f=t.constantNumericHex={token:"constant.numeric",regex:"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"},l=t.constantNumericFloat={token:"constant.numeric",regex:"[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b"},c=function(){var e="abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many",t="alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield",n="true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING",r="$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self",i=this.$keywords=this.createKeywordMapper({keyword:t,"constant.language":n,"variable.language":r,"support.function":e,"invalid.deprecated":"debugger"},"identifier");this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"comment",regex:"^=begin(?:$|\\s.*$)",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},[{regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)return n.unshift("start",t),"paren.lparen";if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1)return"paren.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.start",regex:/"/,push:[{token:"constant.language.escape",regex:/\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/"/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/`/,push:[{token:"constant.language.escape",regex:/\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/`/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/'/,push:[{token:"constant.language.escape",regex:/\\['\\]/},{token:"string.end",regex:/'/,next:"pop"},{defaultToken:"string"}]}],{token:"text",regex:"::"},{token:"variable.instance",regex:"@{1,2}[a-zA-Z_\\d]+"},{token:"support.class",regex:"[A-Z][a-zA-Z_\\d]+"},s,f,l,{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:i,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"punctuation.separator.key-value",regex:"=>"},{stateName:"heredoc",onMatch:function(e,t,n){var r=e[2]=="-"?"indentedHeredoc":"heredoc",i=e.split(this.splitRegex);return n.push(r,i[3]),[{type:"constant",value:i[1]},{type:"string",value:i[2]},{type:"support.class",value:i[3]},{type:"string",value:i[4]}]},regex:"(<<-?)(['\"`]?)([\\w]+)(['\"`]?)",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}],indentedHeredoc:[{token:"string",regex:"^ +"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}]}},{regex:"$",token:"empty",next:function(e,t){return t[0]==="heredoc"||t[0]==="indentedHeredoc"?t[0]:e}},{token:"string.character",regex:"\\B\\?."},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:"^=end(?:$|\\s.*$)",next:"start"},{token:"comment",regex:".+"}]},this.normalizeRules()};r.inherits(c,i),t.RubyHighlightRules=c}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++nl){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u=n[1]?(e.length>n[1]&&(r="invalid"),n.shift(),n.shift(),this.next=n.shift()):this.next="",r},regex:/"#*/,next:"start"},{defaultToken:"string.quoted.raw.source.rust"}]},{token:"string.quoted.double.source.rust",regex:'"',push:[{token:"string.quoted.double.source.rust",regex:'"',next:"pop"},{token:"constant.character.escape.source.rust",regex:s},{defaultToken:"string.quoted.double.source.rust"}]},{token:["keyword.source.rust","text","entity.name.function.source.rust"],regex:"\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)"},{token:"support.constant",regex:"\\b[a-zA-Z_][\\w\\d]*::"},{token:"keyword.source.rust",regex:"\\b(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|for|final|if|impl|in|let|loop|macro|match|mod|move|mut|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\\b"},{token:"storage.type.source.rust",regex:"\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|u128|f16|f32|f64|i8|i16|i32|i64|i128|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\b"},{token:"variable.language.source.rust",regex:"\\bself\\b"},{token:"comment.line.doc.source.rust",regex:"//!.*$"},{token:"comment.line.double-dash.source.rust",regex:"//.*$"},{token:"comment.start.block.source.rust",regex:"/\\*",stateName:"comment",push:[{token:"comment.start.block.source.rust",regex:"/\\*",push:"comment"},{token:"comment.end.block.source.rust",regex:"\\*/",next:"pop"},{defaultToken:"comment.block.source.rust"}]},{token:"keyword.operator",regex:/\$|[-=]>|[-+%^=!&|<>]=?|[*/](?![*/])=?/},{token:"punctuation.operator",regex:/[?:,;.]/},{token:"paren.lparen",regex:/[\[({]/},{token:"paren.rparen",regex:/[\])}]/},{token:"constant.language.source.rust",regex:"\\b(?:true|false|Some|None|Ok|Err)\\b"},{token:"support.constant.source.rust",regex:"\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\b"},{token:"meta.preprocessor.source.rust",regex:"\\b\\w\\(\\w\\)*!|#\\[[\\w=\\(\\)_]+\\]\\b"},{token:"constant.numeric.source.rust",regex:/\b(?:0x[a-fA-F0-9_]+|0o[0-7_]+|0b[01_]+|[0-9][0-9_]*(?!\.))(?:[iu](?:size|8|16|32|64|128))?\b/},{token:"constant.numeric.source.rust",regex:/\b(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[Ee][+-][0-9][0-9_]*)?(?:f32|f64)?\b/}]},this.normalizeRules()};o.metaData={fileTypes:["rs","rc"],foldingStartMarker:"^.*\\bfn\\s*(\\w+\\s*)?\\([^\\)]*\\)(\\s*\\{[^\\}]*)?\\s*$",foldingStopMarker:"^\\s*\\}",name:"Rust",scopeName:"source.rust"},r.inherits(o,i),t.RustHighlightRules=o}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/rust",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/rust_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./rust_highlight_rules").RustHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/",nestable:!0},this.$id="ace/mode/rust"}.call(u.prototype),t.Mode=u}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-sh.js b/public/themes/panel/vendor/ace/mode-sh.js deleted file mode 100644 index 95e556e13b..0000000000 --- a/public/themes/panel/vendor/ace/mode-sh.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/sh_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=t.reservedKeywords="!|{|}|case|do|done|elif|else|esac|fi|for|if|in|then|until|while|&|;|export|local|read|typeset|unset|elif|select|set|function|declare|readonly",o=t.languageConstructs="[|]|alias|bg|bind|break|builtin|cd|command|compgen|complete|continue|dirs|disown|echo|enable|eval|exec|exit|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|return|set|shift|shopt|source|suspend|test|times|trap|type|ulimit|umask|unalias|wait",u=function(){var e=this.createKeywordMapper({keyword:s,"support.function.builtin":o,"invalid.deprecated":"debugger"},"identifier"),t="(?:(?:[1-9]\\d*)|(?:0))",n="(?:\\.\\d+)",r="(?:\\d+)",i="(?:(?:"+r+"?"+n+")|(?:"+r+"\\.))",u="(?:(?:"+i+"|"+r+")"+")",a="(?:"+u+"|"+i+")",f="(?:&"+r+")",l="[a-zA-Z_][a-zA-Z0-9_]*",c="(?:"+l+"=)",h="(?:\\$(?:SHLVL|\\$|\\!|\\?))",p="(?:"+l+"\\s*\\(\\))";this.$rules={start:[{token:"constant",regex:/\\./},{token:["text","comment"],regex:/(^|\s)(#.*)$/},{token:"string.start",regex:'"',push:[{token:"constant.language.escape",regex:/\\(?:[$`"\\]|$)/},{include:"variables"},{token:"keyword.operator",regex:/`/},{token:"string.end",regex:'"',next:"pop"},{defaultToken:"string"}]},{token:"string",regex:"\\$'",push:[{token:"constant.language.escape",regex:/\\(?:[abeEfnrtv\\'"]|x[a-fA-F\d]{1,2}|u[a-fA-F\d]{4}([a-fA-F\d]{4})?|c.|\d{1,3})/},{token:"string",regex:"'",next:"pop"},{defaultToken:"string"}]},{regex:"<<<",token:"keyword.operator"},{stateName:"heredoc",regex:"(<<-?)(\\s*)(['\"`]?)([\\w\\-]+)(['\"`]?)",onMatch:function(e,t,n){var r=e[2]=="-"?"indentedHeredoc":"heredoc",i=e.split(this.splitRegex);return n.push(r,i[4]),[{type:"constant",value:i[1]},{type:"text",value:i[2]},{type:"string",value:i[3]},{type:"support.class",value:i[4]},{type:"string",value:i[5]}]},rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}],indentedHeredoc:[{token:"string",regex:"^ +"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}]}},{regex:"$",token:"empty",next:function(e,t){return t[0]==="heredoc"||t[0]==="indentedHeredoc"?t[0]:e}},{token:["keyword","text","text","text","variable"],regex:/(declare|local|readonly)(\s+)(?:(-[fixar]+)(\s+))?([a-zA-Z_][a-zA-Z0-9_]*\b)/},{token:"variable.language",regex:h},{token:"variable",regex:c},{include:"variables"},{token:"support.function",regex:p},{token:"support.function",regex:f},{token:"string",start:"'",end:"'"},{token:"constant.numeric",regex:a},{token:"constant.numeric",regex:t+"\\b"},{token:e,regex:"[a-zA-Z_][a-zA-Z0-9_]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=|[%&|`]"},{token:"punctuation.operator",regex:";"},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]]"},{token:"paren.rparen",regex:"[\\)\\}]",next:"pop"}],variables:[{token:"variable",regex:/(\$)(\w+)/},{token:["variable","paren.lparen"],regex:/(\$)(\()/,push:"start"},{token:["variable","paren.lparen","keyword.operator","variable","keyword.operator"],regex:/(\$)(\{)([#!]?)(\w+|[*@#?\-$!0_])(:[?+\-=]?|##?|%%?|,,?\/|\^\^?)?/,push:"start"},{token:"variable",regex:/\$[*@#?\-$!0_]/},{token:["variable","paren.lparen"],regex:/(\$)(\{)/,push:"start"}]},this.normalizeRules()};r.inherits(u,i),t.ShHighlightRules=u}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/sh",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sh_highlight_rules","ace/range","ace/mode/folding/cstyle","ace/mode/behaviour/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./sh_highlight_rules").ShHighlightRules,o=e("../range").Range,u=e("./folding/cstyle").FoldMode,a=e("./behaviour/cstyle").CstyleBehaviour,f=function(){this.HighlightRules=s,this.foldingRules=new u,this.$behaviour=new a};r.inherits(f,i),function(){this.lineCommentStart="#",this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var o=t.match(/^.*[\{\(\[:]\s*$/);o&&(r+=n)}return r};var e={pass:1,"return":1,raise:1,"break":1,"continue":1};this.checkOutdent=function(t,n,r){if(r!=="\r\n"&&r!=="\r"&&r!=="\n")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type=="comment"||s.type=="text"&&s.value.match(/^\s+$/)));return s?s.type=="keyword"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new o(n,r.length-i.length,n,r.length))},this.$id="ace/mode/sh"}.call(f.prototype),t.Mode=f}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-smarty.js b/public/themes/panel/vendor/ace/mode-smarty.js deleted file mode 100644 index 98141f4576..0000000000 --- a/public/themes/panel/vendor/ace/mode-smarty.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"@.*?{",push:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{token:"comment",regex:"\\/\\*",push:"comment"},{token:"paren.lparen",regex:"\\{",push:"ruleset"},{token:"string",regex:"\\}",next:"pop"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],comment:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}],ruleset:[{token:"paren.rparen",regex:"\\}",next:"pop"},{token:"comment",regex:"\\/\\*",push:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{token:["support.function","string","support.function"],regex:"(url\\()(.*)(\\))"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),define("ace/mode/smarty_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html_highlight_rules").HtmlHighlightRules,s=function(){i.call(this);var e={start:[{include:"#comments"},{include:"#blocks"}],"#blocks":[{token:"punctuation.section.embedded.begin.smarty",regex:"\\{%?",push:[{token:"punctuation.section.embedded.end.smarty",regex:"%?\\}",next:"pop"},{include:"#strings"},{include:"#variables"},{include:"#lang"},{defaultToken:"source.smarty"}]}],"#comments":[{token:["punctuation.definition.comment.smarty","comment.block.smarty"],regex:"(\\{%?)(\\*)",push:[{token:"comment.block.smarty",regex:"\\*%?\\}",next:"pop"},{defaultToken:"comment.block.smarty"}]}],"#lang":[{token:"keyword.operator.smarty",regex:"(?:!=|!|<=|>=|<|>|===|==|%|&&|\\|\\|)|\\b(?:and|or|eq|neq|ne|gte|gt|ge|lte|lt|le|not|mod)\\b"},{token:"constant.language.smarty",regex:"\\b(?:TRUE|FALSE|true|false)\\b"},{token:"keyword.control.smarty",regex:"\\b(?:if|else|elseif|foreach|foreachelse|section|switch|case|break|default)\\b"},{token:"variable.parameter.smarty",regex:"\\b[a-zA-Z]+="},{token:"support.function.built-in.smarty",regex:"\\b(?:capture|config_load|counter|cycle|debug|eval|fetch|include_php|include|insert|literal|math|strip|rdelim|ldelim|assign|constant|block|html_[a-z_]*)\\b"},{token:"support.function.variable-modifier.smarty",regex:"\\|(?:capitalize|cat|count_characters|count_paragraphs|count_sentences|count_words|date_format|default|escape|indent|lower|nl2br|regex_replace|replace|spacify|string_format|strip_tags|strip|truncate|upper|wordwrap)"}],"#strings":[{token:"punctuation.definition.string.begin.smarty",regex:"'",push:[{token:"punctuation.definition.string.end.smarty",regex:"'",next:"pop"},{token:"constant.character.escape.smarty",regex:"\\\\."},{defaultToken:"string.quoted.single.smarty"}]},{token:"punctuation.definition.string.begin.smarty",regex:'"',push:[{token:"punctuation.definition.string.end.smarty",regex:'"',next:"pop"},{token:"constant.character.escape.smarty",regex:"\\\\."},{defaultToken:"string.quoted.double.smarty"}]}],"#variables":[{token:["punctuation.definition.variable.smarty","variable.other.global.smarty"],regex:"\\b(\\$)(Smarty\\.)"},{token:["punctuation.definition.variable.smarty","variable.other.smarty"],regex:"(\\$)([a-zA-Z_][a-zA-Z0-9_]*)\\b"},{token:["keyword.operator.smarty","variable.other.property.smarty"],regex:"(->)([a-zA-Z_][a-zA-Z0-9_]*)\\b"},{token:["keyword.operator.smarty","meta.function-call.object.smarty","punctuation.definition.variable.smarty","variable.other.smarty","punctuation.definition.variable.smarty"],regex:"(->)([a-zA-Z_][a-zA-Z0-9_]*)(\\()(.*?)(\\))"}]},t=e.start;for(var n in this.$rules)this.$rules[n].unshift.apply(this.$rules[n],t);Object.keys(e).forEach(function(t){this.$rules[t]||(this.$rules[t]=e[t])},this),this.normalizeRules()};s.metaData={fileTypes:["tpl"],foldingStartMarker:"\\{%?",foldingStopMarker:"%?\\}",name:"Smarty",scopeName:"text.html.smarty"},r.inherits(s,i),t.SmartyHighlightRules=s}),define("ace/mode/smarty",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/smarty_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html").Mode,s=e("./smarty_highlight_rules").SmartyHighlightRules,o=function(){i.call(this),this.HighlightRules=s};r.inherits(o,i),function(){this.$id="ace/mode/smarty"}.call(o.prototype),t.Mode=o}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-sql.js b/public/themes/panel/vendor/ace/mode-sql.js deleted file mode 100644 index 3441609d09..0000000000 --- a/public/themes/panel/vendor/ace/mode-sql.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|when|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|foreign|not|references|default|null|inner|cross|natural|database|drop|grant",t="true|false",n="avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl",r="int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|money|real|number|integer",i=this.createKeywordMapper({"support.function":n,keyword:e,"constant.language":t,"storage.type":r},"identifier",!0);this.$rules={start:[{token:"comment",regex:"--.*$"},{token:"comment",start:"/\\*",end:"\\*/"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:i,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]},this.normalizeRules()};r.inherits(s,i),t.SqlHighlightRules=s}),define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sql_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./sql_highlight_rules").SqlHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="--",this.$id="ace/mode/sql"}.call(o.prototype),t.Mode=o}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-xml.js b/public/themes/panel/vendor/ace/mode-xml.js deleted file mode 100644 index 44452a47d2..0000000000 --- a/public/themes/panel/vendor/ace/mode-xml.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.xml-decl.xml","keyword.xml-decl.xml"],regex:"(<\\?)(xml)(?=[\\s])",next:"xml_decl",caseInsensitive:!0},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],processing_instruction:[{token:"punctuation.instruction.xml",regex:"\\?>",next:"start"},{defaultToken:"instruction.xml"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:"(?:"+t+":)?"+t+""},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":""},this._getFirstTagInLine=function(e,t){var n=e.getTokens(t),r=new f;for(var i=0;i";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return null;var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column"},this.createWorker=function(e){var t=new f(["ace"],"ace/mode/xml_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/xml"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/public/themes/panel/vendor/ace/mode-yaml.js b/public/themes/panel/vendor/ace/mode-yaml.js deleted file mode 100644 index 64a1bdcf4b..0000000000 --- a/public/themes/panel/vendor/ace/mode-yaml.js +++ /dev/null @@ -1 +0,0 @@ -define("ace/mode/yaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"list.markup",regex:/^(?:-{3}|\.{3})\s*(?=#|$)/},{token:"list.markup",regex:/^\s*[\-?](?:$|\s)/},{token:"constant",regex:"!![\\w//]+"},{token:"constant.language",regex:"[&\\*][a-zA-Z0-9-_]+"},{token:["meta.tag","keyword"],regex:/^(\s*\w.*?)(:(?:\s+|$))/},{token:["meta.tag","keyword"],regex:/(\w+?)(\s*:(?:\s+|$))/},{token:"keyword.operator",regex:"<<\\w*:\\w*"},{token:"keyword.operator",regex:"-\\s*(?=[{])"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"[|>][-+\\d\\s]*$",next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:/(\b|[+\-\.])[\d_]+(?:(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)/},{token:"constant.numeric",regex:/[+\-]?\.inf\b|NaN\b|0x[\dA-Fa-f_]+|0b[10_]+/},{token:"constant.language.boolean",regex:"\\b(?:true|false|TRUE|FALSE|True|False|yes|no)\\b"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"}],qqstring:[{token:"string",regex:"(?=(?:(?:\\\\.)|(?:[^:]))*?:)",next:"start"},{token:"string",regex:".+"}]}};r.inherits(s,i),t.YamlHighlightRules=s}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++nl){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;othis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i=0&&this._ltIndex-1&&!t[u.type].hide&&(u.channel=t[u.type].channel,this._token=u,this._lt.push(u),this._ltIndexCache.push(this._lt.length-this._ltIndex+i),this._lt.length>5&&this._lt.shift(),this._ltIndexCache.length>5&&this._ltIndexCache.shift(),this._ltIndex=this._lt.length),a=t[u.type],a&&(a.hide||a.channel!==undefined&&e!==a.channel)?this.get(e):u.type},LA:function(e){var t=e,n;if(e>0){if(e>5)throw new Error("Too much lookahead.");while(t)n=this.get(),t--;while(tthis._tokenData.length?"UNKNOWN_TOKEN":this._tokenData[e].name},tokenType:function(e){return this._tokenData[e]||-1},unget:function(){if(!this._ltIndexCache.length)throw new Error("Too much lookahead.");this._ltIndex-=this._ltIndexCache.pop(),this._token=this._lt[this._ltIndex-1]}},parserlib.util={StringReader:t,SyntaxError:n,SyntaxUnit:r,EventTarget:e,TokenStreamBase:i}})(),function(){function Combinator(e,t,n){SyntaxUnit.call(this,e,t,n,Parser.COMBINATOR_TYPE),this.type="unknown",/^\s+$/.test(e)?this.type="descendant":e==">"?this.type="child":e=="+"?this.type="adjacent-sibling":e=="~"&&(this.type="sibling")}function MediaFeature(e,t){SyntaxUnit.call(this,"("+e+(t!==null?":"+t:"")+")",e.startLine,e.startCol,Parser.MEDIA_FEATURE_TYPE),this.name=e,this.value=t}function MediaQuery(e,t,n,r,i){SyntaxUnit.call(this,(e?e+" ":"")+(t?t:"")+(t&&n.length>0?" and ":"")+n.join(" and "),r,i,Parser.MEDIA_QUERY_TYPE),this.modifier=e,this.mediaType=t,this.features=n}function Parser(e){EventTarget.call(this),this.options=e||{},this._tokenStream=null}function PropertyName(e,t,n,r){SyntaxUnit.call(this,e,n,r,Parser.PROPERTY_NAME_TYPE),this.hack=t}function PropertyValue(e,t,n){SyntaxUnit.call(this,e.join(" "),t,n,Parser.PROPERTY_VALUE_TYPE),this.parts=e}function PropertyValueIterator(e){this._i=0,this._parts=e.parts,this._marks=[],this.value=e}function PropertyValuePart(text,line,col){SyntaxUnit.call(this,text,line,col,Parser.PROPERTY_VALUE_PART_TYPE),this.type="unknown";var temp;if(/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)){this.type="dimension",this.value=+RegExp.$1,this.units=RegExp.$2;switch(this.units.toLowerCase()){case"em":case"rem":case"ex":case"px":case"cm":case"mm":case"in":case"pt":case"pc":case"ch":case"vh":case"vw":case"vmax":case"vmin":this.type="length";break;case"deg":case"rad":case"grad":this.type="angle";break;case"ms":case"s":this.type="time";break;case"hz":case"khz":this.type="frequency";break;case"dpi":case"dpcm":this.type="resolution"}}else/^([+\-]?[\d\.]+)%$/i.test(text)?(this.type="percentage",this.value=+RegExp.$1):/^([+\-]?\d+)$/i.test(text)?(this.type="integer",this.value=+RegExp.$1):/^([+\-]?[\d\.]+)$/i.test(text)?(this.type="number",this.value=+RegExp.$1):/^#([a-f0-9]{3,6})/i.test(text)?(this.type="color",temp=RegExp.$1,temp.length==3?(this.red=parseInt(temp.charAt(0)+temp.charAt(0),16),this.green=parseInt(temp.charAt(1)+temp.charAt(1),16),this.blue=parseInt(temp.charAt(2)+temp.charAt(2),16)):(this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16))):/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3):/^rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100):/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3,this.alpha=+RegExp.$4):/^rgba\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100,this.alpha=+RegExp.$4):/^hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)?(this.type="color",this.hue=+RegExp.$1,this.saturation=+RegExp.$2/100,this.lightness=+RegExp.$3/100):/^hsla\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)?(this.type="color",this.hue=+RegExp.$1,this.saturation=+RegExp.$2/100,this.lightness=+RegExp.$3/100,this.alpha=+RegExp.$4):/^url\(["']?([^\)"']+)["']?\)/i.test(text)?(this.type="uri",this.uri=RegExp.$1):/^([^\(]+)\(/i.test(text)?(this.type="function",this.name=RegExp.$1,this.value=text):/^["'][^"']*["']/.test(text)?(this.type="string",this.value=eval(text)):Colors[text.toLowerCase()]?(this.type="color",temp=Colors[text.toLowerCase()].substring(1),this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16)):/^[\,\/]$/.test(text)?(this.type="operator",this.value=text):/^[a-z\-_\u0080-\uFFFF][a-z0-9\-_\u0080-\uFFFF]*$/i.test(text)&&(this.type="identifier",this.value=text)}function Selector(e,t,n){SyntaxUnit.call(this,e.join(" "),t,n,Parser.SELECTOR_TYPE),this.parts=e,this.specificity=Specificity.calculate(this)}function SelectorPart(e,t,n,r,i){SyntaxUnit.call(this,n,r,i,Parser.SELECTOR_PART_TYPE),this.elementName=e,this.modifiers=t}function SelectorSubPart(e,t,n,r){SyntaxUnit.call(this,e,n,r,Parser.SELECTOR_SUB_PART_TYPE),this.type=t,this.args=[]}function Specificity(e,t,n,r){this.a=e,this.b=t,this.c=n,this.d=r}function isHexDigit(e){return e!==null&&h.test(e)}function isDigit(e){return e!==null&&/\d/.test(e)}function isWhitespace(e){return e!==null&&/\s/.test(e)}function isNewLine(e){return e!==null&&nl.test(e)}function isNameStart(e){return e!==null&&/[a-z_\u0080-\uFFFF\\]/i.test(e)}function isNameChar(e){return e!==null&&(isNameStart(e)||/[0-9\-\\]/.test(e))}function isIdentStart(e){return e!==null&&(isNameStart(e)||/\-\\/.test(e))}function mix(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function TokenStream(e){TokenStreamBase.call(this,e,Tokens)}function ValidationError(e,t,n){this.col=n,this.line=t,this.message=e}var EventTarget=parserlib.util.EventTarget,TokenStreamBase=parserlib.util.TokenStreamBase,StringReader=parserlib.util.StringReader,SyntaxError=parserlib.util.SyntaxError,SyntaxUnit=parserlib.util.SyntaxUnit,Colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",activeBorder:"Active window border.",activecaption:"Active window caption.",appworkspace:"Background color of multiple document interface.",background:"Desktop background.",buttonface:"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.",buttonhighlight:"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.",buttonshadow:"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.",buttontext:"Text on push buttons.",captiontext:"Text in caption, size box, and scrollbar arrow box.",graytext:"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.",greytext:"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.",highlight:"Item(s) selected in a control.",highlighttext:"Text of item(s) selected in a control.",inactiveborder:"Inactive window border.",inactivecaption:"Inactive window caption.",inactivecaptiontext:"Color of text in an inactive caption.",infobackground:"Background color for tooltip controls.",infotext:"Text color for tooltip controls.",menu:"Menu background.",menutext:"Text in menus.",scrollbar:"Scroll bar gray area.",threeddarkshadow:"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedface:"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedhighlight:"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedlightshadow:"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",threedshadow:"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",window:"Window background.",windowframe:"Window frame.",windowtext:"Text in windows."};Combinator.prototype=new SyntaxUnit,Combinator.prototype.constructor=Combinator,MediaFeature.prototype=new SyntaxUnit,MediaFeature.prototype.constructor=MediaFeature,MediaQuery.prototype=new SyntaxUnit,MediaQuery.prototype.constructor=MediaQuery,Parser.DEFAULT_TYPE=0,Parser.COMBINATOR_TYPE=1,Parser.MEDIA_FEATURE_TYPE=2,Parser.MEDIA_QUERY_TYPE=3,Parser.PROPERTY_NAME_TYPE=4,Parser.PROPERTY_VALUE_TYPE=5,Parser.PROPERTY_VALUE_PART_TYPE=6,Parser.SELECTOR_TYPE=7,Parser.SELECTOR_PART_TYPE=8,Parser.SELECTOR_SUB_PART_TYPE=9,Parser.prototype=function(){var e=new EventTarget,t,n={constructor:Parser,DEFAULT_TYPE:0,COMBINATOR_TYPE:1,MEDIA_FEATURE_TYPE:2,MEDIA_QUERY_TYPE:3,PROPERTY_NAME_TYPE:4,PROPERTY_VALUE_TYPE:5,PROPERTY_VALUE_PART_TYPE:6,SELECTOR_TYPE:7,SELECTOR_PART_TYPE:8,SELECTOR_SUB_PART_TYPE:9,_stylesheet:function(){var e=this._tokenStream,t=null,n,r,i;this.fire("startstylesheet"),this._charset(),this._skipCruft();while(e.peek()==Tokens.IMPORT_SYM)this._import(),this._skipCruft();while(e.peek()==Tokens.NAMESPACE_SYM)this._namespace(),this._skipCruft();i=e.peek();while(i>Tokens.EOF){try{switch(i){case Tokens.MEDIA_SYM:this._media(),this._skipCruft();break;case Tokens.PAGE_SYM:this._page(),this._skipCruft();break;case Tokens.FONT_FACE_SYM:this._font_face(),this._skipCruft();break;case Tokens.KEYFRAMES_SYM:this._keyframes(),this._skipCruft();break;case Tokens.VIEWPORT_SYM:this._viewport(),this._skipCruft();break;case Tokens.UNKNOWN_SYM:e.get();if(!!this.options.strict)throw new SyntaxError("Unknown @ rule.",e.LT(0).startLine,e.LT(0).startCol);this.fire({type:"error",error:null,message:"Unknown @ rule: "+e.LT(0).value+".",line:e.LT(0).startLine,col:e.LT(0).startCol}),n=0;while(e.advance([Tokens.LBRACE,Tokens.RBRACE])==Tokens.LBRACE)n++;while(n)e.advance([Tokens.RBRACE]),n--;break;case Tokens.S:this._readWhitespace();break;default:if(!this._ruleset())switch(i){case Tokens.CHARSET_SYM:throw r=e.LT(1),this._charset(!1),new SyntaxError("@charset not allowed here.",r.startLine,r.startCol);case Tokens.IMPORT_SYM:throw r=e.LT(1),this._import(!1),new SyntaxError("@import not allowed here.",r.startLine,r.startCol);case Tokens.NAMESPACE_SYM:throw r=e.LT(1),this._namespace(!1),new SyntaxError("@namespace not allowed here.",r.startLine,r.startCol);default:e.get(),this._unexpectedToken(e.token())}}}catch(s){if(!(s instanceof SyntaxError&&!this.options.strict))throw s;this.fire({type:"error",error:s,message:s.message,line:s.line,col:s.col})}i=e.peek()}i!=Tokens.EOF&&this._unexpectedToken(e.token()),this.fire("endstylesheet")},_charset:function(e){var t=this._tokenStream,n,r,i,s;t.match(Tokens.CHARSET_SYM)&&(i=t.token().startLine,s=t.token().startCol,this._readWhitespace(),t.mustMatch(Tokens.STRING),r=t.token(),n=r.value,this._readWhitespace(),t.mustMatch(Tokens.SEMICOLON),e!==!1&&this.fire({type:"charset",charset:n,line:i,col:s}))},_import:function(e){var t=this._tokenStream,n,r,i,s=[];t.mustMatch(Tokens.IMPORT_SYM),i=t.token(),this._readWhitespace(),t.mustMatch([Tokens.STRING,Tokens.URI]),r=t.token().value.replace(/^(?:url\()?["']?([^"']+?)["']?\)?$/,"$1"),this._readWhitespace(),s=this._media_query_list(),t.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),e!==!1&&this.fire({type:"import",uri:r,media:s,line:i.startLine,col:i.startCol})},_namespace:function(e){var t=this._tokenStream,n,r,i,s;t.mustMatch(Tokens.NAMESPACE_SYM),n=t.token().startLine,r=t.token().startCol,this._readWhitespace(),t.match(Tokens.IDENT)&&(i=t.token().value,this._readWhitespace()),t.mustMatch([Tokens.STRING,Tokens.URI]),s=t.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/,"$1"),this._readWhitespace(),t.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),e!==!1&&this.fire({type:"namespace",prefix:i,uri:s,line:n,col:r})},_media:function(){var e=this._tokenStream,t,n,r;e.mustMatch(Tokens.MEDIA_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),r=this._media_query_list(),e.mustMatch(Tokens.LBRACE),this._readWhitespace(),this.fire({type:"startmedia",media:r,line:t,col:n});for(;;)if(e.peek()==Tokens.PAGE_SYM)this._page();else if(e.peek()==Tokens.FONT_FACE_SYM)this._font_face();else if(e.peek()==Tokens.VIEWPORT_SYM)this._viewport();else if(!this._ruleset())break;e.mustMatch(Tokens.RBRACE),this._readWhitespace(),this.fire({type:"endmedia",media:r,line:t,col:n})},_media_query_list:function(){var e=this._tokenStream,t=[];this._readWhitespace(),(e.peek()==Tokens.IDENT||e.peek()==Tokens.LPAREN)&&t.push(this._media_query());while(e.match(Tokens.COMMA))this._readWhitespace(),t.push(this._media_query());return t},_media_query:function(){var e=this._tokenStream,t=null,n=null,r=null,i=[];e.match(Tokens.IDENT)&&(n=e.token().value.toLowerCase(),n!="only"&&n!="not"?(e.unget(),n=null):r=e.token()),this._readWhitespace(),e.peek()==Tokens.IDENT?(t=this._media_type(),r===null&&(r=e.token())):e.peek()==Tokens.LPAREN&&(r===null&&(r=e.LT(1)),i.push(this._media_expression()));if(t===null&&i.length===0)return null;this._readWhitespace();while(e.match(Tokens.IDENT))e.token().value.toLowerCase()!="and"&&this._unexpectedToken(e.token()),this._readWhitespace(),i.push(this._media_expression());return new MediaQuery(n,t,i,r.startLine,r.startCol)},_media_type:function(){return this._media_feature()},_media_expression:function(){var e=this._tokenStream,t=null,n,r=null;return e.mustMatch(Tokens.LPAREN),t=this._media_feature(),this._readWhitespace(),e.match(Tokens.COLON)&&(this._readWhitespace(),n=e.LT(1),r=this._expression()),e.mustMatch(Tokens.RPAREN),this._readWhitespace(),new MediaFeature(t,r?new SyntaxUnit(r,n.startLine,n.startCol):null)},_media_feature:function(){var e=this._tokenStream;return e.mustMatch(Tokens.IDENT),SyntaxUnit.fromToken(e.token())},_page:function(){var e=this._tokenStream,t,n,r=null,i=null;e.mustMatch(Tokens.PAGE_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),e.match(Tokens.IDENT)&&(r=e.token().value,r.toLowerCase()==="auto"&&this._unexpectedToken(e.token())),e.peek()==Tokens.COLON&&(i=this._pseudo_page()),this._readWhitespace(),this.fire({type:"startpage",id:r,pseudo:i,line:t,col:n}),this._readDeclarations(!0,!0),this.fire({type:"endpage",id:r,pseudo:i,line:t,col:n})},_margin:function(){var e=this._tokenStream,t,n,r=this._margin_sym();return r?(t=e.token().startLine,n=e.token().startCol,this.fire({type:"startpagemargin",margin:r,line:t,col:n}),this._readDeclarations(!0),this.fire({type:"endpagemargin",margin:r,line:t,col:n}),!0):!1},_margin_sym:function(){var e=this._tokenStream;return e.match([Tokens.TOPLEFTCORNER_SYM,Tokens.TOPLEFT_SYM,Tokens.TOPCENTER_SYM,Tokens.TOPRIGHT_SYM,Tokens.TOPRIGHTCORNER_SYM,Tokens.BOTTOMLEFTCORNER_SYM,Tokens.BOTTOMLEFT_SYM,Tokens.BOTTOMCENTER_SYM,Tokens.BOTTOMRIGHT_SYM,Tokens.BOTTOMRIGHTCORNER_SYM,Tokens.LEFTTOP_SYM,Tokens.LEFTMIDDLE_SYM,Tokens.LEFTBOTTOM_SYM,Tokens.RIGHTTOP_SYM,Tokens.RIGHTMIDDLE_SYM,Tokens.RIGHTBOTTOM_SYM])?SyntaxUnit.fromToken(e.token()):null},_pseudo_page:function(){var e=this._tokenStream;return e.mustMatch(Tokens.COLON),e.mustMatch(Tokens.IDENT),e.token().value},_font_face:function(){var e=this._tokenStream,t,n;e.mustMatch(Tokens.FONT_FACE_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),this.fire({type:"startfontface",line:t,col:n}),this._readDeclarations(!0),this.fire({type:"endfontface",line:t,col:n})},_viewport:function(){var e=this._tokenStream,t,n;e.mustMatch(Tokens.VIEWPORT_SYM),t=e.token().startLine,n=e.token().startCol,this._readWhitespace(),this.fire({type:"startviewport",line:t,col:n}),this._readDeclarations(!0),this.fire({type:"endviewport",line:t,col:n})},_operator:function(e){var t=this._tokenStream,n=null;if(t.match([Tokens.SLASH,Tokens.COMMA])||e&&t.match([Tokens.PLUS,Tokens.STAR,Tokens.MINUS]))n=t.token(),this._readWhitespace();return n?PropertyValuePart.fromToken(n):null},_combinator:function(){var e=this._tokenStream,t=null,n;return e.match([Tokens.PLUS,Tokens.GREATER,Tokens.TILDE])&&(n=e.token(),t=new Combinator(n.value,n.startLine,n.startCol),this._readWhitespace()),t},_unary_operator:function(){var e=this._tokenStream;return e.match([Tokens.MINUS,Tokens.PLUS])?e.token().value:null},_property:function(){var e=this._tokenStream,t=null,n=null,r,i,s,o;return e.peek()==Tokens.STAR&&this.options.starHack&&(e.get(),i=e.token(),n=i.value,s=i.startLine,o=i.startCol),e.match(Tokens.IDENT)&&(i=e.token(),r=i.value,r.charAt(0)=="_"&&this.options.underscoreHack&&(n="_",r=r.substring(1)),t=new PropertyName(r,n,s||i.startLine,o||i.startCol),this._readWhitespace()),t},_ruleset:function(){var e=this._tokenStream,t,n;try{n=this._selectors_group()}catch(r){if(r instanceof SyntaxError&&!this.options.strict){this.fire({type:"error",error:r,message:r.message,line:r.line,col:r.col}),t=e.advance([Tokens.RBRACE]);if(t!=Tokens.RBRACE)throw r;return!0}throw r}return n&&(this.fire({type:"startrule",selectors:n,line:n[0].line,col:n[0].col}),this._readDeclarations(!0),this.fire({type:"endrule",selectors:n,line:n[0].line,col:n[0].col})),n},_selectors_group:function(){var e=this._tokenStream,t=[],n;n=this._selector();if(n!==null){t.push(n);while(e.match(Tokens.COMMA))this._readWhitespace(),n=this._selector(),n!==null?t.push(n):this._unexpectedToken(e.LT(1))}return t.length?t:null},_selector:function(){var e=this._tokenStream,t=[],n=null,r=null,i=null;n=this._simple_selector_sequence();if(n===null)return null;t.push(n);do{r=this._combinator();if(r!==null)t.push(r),n=this._simple_selector_sequence(),n===null?this._unexpectedToken(e.LT(1)):t.push(n);else{if(!this._readWhitespace())break;i=new Combinator(e.token().value,e.token().startLine,e.token().startCol),r=this._combinator(),n=this._simple_selector_sequence(),n===null?r!==null&&this._unexpectedToken(e.LT(1)):(r!==null?t.push(r):t.push(i),t.push(n))}}while(!0);return new Selector(t,t[0].line,t[0].col)},_simple_selector_sequence:function(){var e=this._tokenStream,t=null,n=[],r="",i=[function(){return e.match(Tokens.HASH)?new SelectorSubPart(e.token().value,"id",e.token().startLine,e.token().startCol):null},this._class,this._attrib,this._pseudo,this._negation],s=0,o=i.length,u=null,a=!1,f,l;f=e.LT(1).startLine,l=e.LT(1).startCol,t=this._type_selector(),t||(t=this._universal()),t!==null&&(r+=t);for(;;){if(e.peek()===Tokens.S)break;while(s1&&e.unget()),null)},_class:function(){var e=this._tokenStream,t;return e.match(Tokens.DOT)?(e.mustMatch(Tokens.IDENT),t=e.token(),new SelectorSubPart("."+t.value,"class",t.startLine,t.startCol-1)):null},_element_name:function(){var e=this._tokenStream,t;return e.match(Tokens.IDENT)?(t=e.token(),new SelectorSubPart(t.value,"elementName",t.startLine,t.startCol)):null},_namespace_prefix:function(){var e=this._tokenStream,t="";if(e.LA(1)===Tokens.PIPE||e.LA(2)===Tokens.PIPE)e.match([Tokens.IDENT,Tokens.STAR])&&(t+=e.token().value),e.mustMatch(Tokens.PIPE),t+="|";return t.length?t:null},_universal:function(){var e=this._tokenStream,t="",n;return n=this._namespace_prefix(),n&&(t+=n),e.match(Tokens.STAR)&&(t+="*"),t.length?t:null},_attrib:function(){var e=this._tokenStream,t=null,n,r;return e.match(Tokens.LBRACKET)?(r=e.token(),t=r.value,t+=this._readWhitespace(),n=this._namespace_prefix(),n&&(t+=n),e.mustMatch(Tokens.IDENT),t+=e.token().value,t+=this._readWhitespace(),e.match([Tokens.PREFIXMATCH,Tokens.SUFFIXMATCH,Tokens.SUBSTRINGMATCH,Tokens.EQUALS,Tokens.INCLUDES,Tokens.DASHMATCH])&&(t+=e.token().value,t+=this._readWhitespace(),e.mustMatch([Tokens.IDENT,Tokens.STRING]),t+=e.token().value,t+=this._readWhitespace()),e.mustMatch(Tokens.RBRACKET),new SelectorSubPart(t+"]","attribute",r.startLine,r.startCol)):null},_pseudo:function(){var e=this._tokenStream,t=null,n=":",r,i;return e.match(Tokens.COLON)&&(e.match(Tokens.COLON)&&(n+=":"),e.match(Tokens.IDENT)?(t=e.token().value,r=e.token().startLine,i=e.token().startCol-n.length):e.peek()==Tokens.FUNCTION&&(r=e.LT(1).startLine,i=e.LT(1).startCol-n.length,t=this._functional_pseudo()),t&&(t=new SelectorSubPart(n+t,"pseudo",r,i))),t},_functional_pseudo:function(){var e=this._tokenStream,t=null;return e.match(Tokens.FUNCTION)&&(t=e.token().value,t+=this._readWhitespace(),t+=this._expression(),e.mustMatch(Tokens.RPAREN),t+=")"),t},_expression:function(){var e=this._tokenStream,t="";while(e.match([Tokens.PLUS,Tokens.MINUS,Tokens.DIMENSION,Tokens.NUMBER,Tokens.STRING,Tokens.IDENT,Tokens.LENGTH,Tokens.FREQ,Tokens.ANGLE,Tokens.TIME,Tokens.RESOLUTION,Tokens.SLASH]))t+=e.token().value,t+=this._readWhitespace();return t.length?t:null},_negation:function(){var e=this._tokenStream,t,n,r="",i,s=null;return e.match(Tokens.NOT)&&(r=e.token().value,t=e.token().startLine,n=e.token().startCol,r+=this._readWhitespace(),i=this._negation_arg(),r+=i,r+=this._readWhitespace(),e.match(Tokens.RPAREN),r+=e.token().value,s=new SelectorSubPart(r,"not",t,n),s.args.push(i)),s},_negation_arg:function(){var e=this._tokenStream,t=[this._type_selector,this._universal,function(){return e.match(Tokens.HASH)?new SelectorSubPart(e.token().value,"id",e.token().startLine,e.token().startCol):null},this._class,this._attrib,this._pseudo],n=null,r=0,i=t.length,s,o,u,a;o=e.LT(1).startLine,u=e.LT(1).startCol;while(r0?new PropertyValue(n,n[0].line,n[0].col):null},_term:function(e){var t=this._tokenStream,n=null,r=null,i=null,s,o,u;return n=this._unary_operator(),n!==null&&(o=t.token().startLine,u=t.token().startCol),t.peek()==Tokens.IE_FUNCTION&&this.options.ieFilters?(r=this._ie_function(),n===null&&(o=t.token().startLine,u=t.token().startCol)):e&&t.match([Tokens.LPAREN,Tokens.LBRACE,Tokens.LBRACKET])?(s=t.token(),i=s.endChar,r=s.value+this._expr(e).text,n===null&&(o=t.token().startLine,u=t.token().startCol),t.mustMatch(Tokens.type(i)),r+=i,this._readWhitespace()):t.match([Tokens.NUMBER,Tokens.PERCENTAGE,Tokens.LENGTH,Tokens.ANGLE,Tokens.TIME,Tokens.FREQ,Tokens.STRING,Tokens.IDENT,Tokens.URI,Tokens.UNICODE_RANGE])?(r=t.token().value,n===null&&(o=t.token().startLine,u=t.token().startCol),this._readWhitespace()):(s=this._hexcolor(),s===null?(n===null&&(o=t.LT(1).startLine,u=t.LT(1).startCol),r===null&&(t.LA(3)==Tokens.EQUALS&&this.options.ieFilters?r=this._ie_function():r=this._function())):(r=s.value,n===null&&(o=s.startLine,u=s.startCol))),r!==null?new PropertyValuePart(n!==null?n+r:r,o,u):null},_function:function(){var e=this._tokenStream,t=null,n=null,r;if(e.match(Tokens.FUNCTION)){t=e.token().value,this._readWhitespace(),n=this._expr(!0),t+=n;if(this.options.ieFilters&&e.peek()==Tokens.EQUALS)do{this._readWhitespace()&&(t+=e.token().value),e.LA(0)==Tokens.COMMA&&(t+=e.token().value),e.match(Tokens.IDENT),t+=e.token().value,e.match(Tokens.EQUALS),t+=e.token().value,r=e.peek();while(r!=Tokens.COMMA&&r!=Tokens.S&&r!=Tokens.RPAREN)e.get(),t+=e.token().value,r=e.peek()}while(e.match([Tokens.COMMA,Tokens.S]));e.match(Tokens.RPAREN),t+=")",this._readWhitespace()}return t},_ie_function:function(){var e=this._tokenStream,t=null,n=null,r;if(e.match([Tokens.IE_FUNCTION,Tokens.FUNCTION])){t=e.token().value;do{this._readWhitespace()&&(t+=e.token().value),e.LA(0)==Tokens.COMMA&&(t+=e.token().value),e.match(Tokens.IDENT),t+=e.token().value,e.match(Tokens.EQUALS),t+=e.token().value,r=e.peek();while(r!=Tokens.COMMA&&r!=Tokens.S&&r!=Tokens.RPAREN)e.get(),t+=e.token().value,r=e.peek()}while(e.match([Tokens.COMMA,Tokens.S]));e.match(Tokens.RPAREN),t+=")",this._readWhitespace()}return t},_hexcolor:function(){var e=this._tokenStream,t=null,n;if(e.match(Tokens.HASH)){t=e.token(),n=t.value;if(!/#[a-f0-9]{3,6}/i.test(n))throw new SyntaxError("Expected a hex color but found '"+n+"' at line "+t.startLine+", col "+t.startCol+".",t.startLine,t.startCol);this._readWhitespace()}return t},_keyframes:function(){var e=this._tokenStream,t,n,r,i="";e.mustMatch(Tokens.KEYFRAMES_SYM),t=e.token(),/^@\-([^\-]+)\-/.test(t.value)&&(i=RegExp.$1),this._readWhitespace(),r=this._keyframe_name(),this._readWhitespace(),e.mustMatch(Tokens.LBRACE),this.fire({type:"startkeyframes",name:r,prefix:i,line:t.startLine,col:t.startCol}),this._readWhitespace(),n=e.peek();while(n==Tokens.IDENT||n==Tokens.PERCENTAGE)this._keyframe_rule(),this._readWhitespace(),n=e.peek();this.fire({type:"endkeyframes",name:r,prefix:i,line:t.startLine,col:t.startCol}),this._readWhitespace(),e.mustMatch(Tokens.RBRACE)},_keyframe_name:function(){var e=this._tokenStream,t;return e.mustMatch([Tokens.IDENT,Tokens.STRING]),SyntaxUnit.fromToken(e.token())},_keyframe_rule:function(){var e=this._tokenStream,t,n=this._key_list();this.fire({type:"startkeyframerule",keys:n,line:n[0].line,col:n[0].col}),this._readDeclarations(!0),this.fire({type:"endkeyframerule",keys:n,line:n[0].line,col:n[0].col})},_key_list:function(){var e=this._tokenStream,t,n,r=[];r.push(this._key()),this._readWhitespace();while(e.match(Tokens.COMMA))this._readWhitespace(),r.push(this._key()),this._readWhitespace();return r},_key:function(){var e=this._tokenStream,t;if(e.match(Tokens.PERCENTAGE))return SyntaxUnit.fromToken(e.token());if(e.match(Tokens.IDENT)){t=e.token();if(/from|to/i.test(t.value))return SyntaxUnit.fromToken(t);e.unget()}this._unexpectedToken(e.LT(1))},_skipCruft:function(){while(this._tokenStream.match([Tokens.S,Tokens.CDO,Tokens.CDC]));},_readDeclarations:function(e,t){var n=this._tokenStream,r;this._readWhitespace(),e&&n.mustMatch(Tokens.LBRACE),this._readWhitespace();try{for(;;){if(!(n.match(Tokens.SEMICOLON)||t&&this._margin())){if(!this._declaration())break;if(!n.match(Tokens.SEMICOLON))break}this._readWhitespace()}n.mustMatch(Tokens.RBRACE),this._readWhitespace()}catch(i){if(!(i instanceof SyntaxError&&!this.options.strict))throw i;this.fire({type:"error",error:i,message:i.message,line:i.line,col:i.col}),r=n.advance([Tokens.SEMICOLON,Tokens.RBRACE]);if(r==Tokens.SEMICOLON)this._readDeclarations(!1,t);else if(r!=Tokens.RBRACE)throw i}},_readWhitespace:function(){var e=this._tokenStream,t="";while(e.match(Tokens.S))t+=e.token().value;return t},_unexpectedToken:function(e){throw new SyntaxError("Unexpected token '"+e.value+"' at line "+e.startLine+", col "+e.startCol+".",e.startLine,e.startCol)},_verifyEnd:function(){this._tokenStream.LA(1)!=Tokens.EOF&&this._unexpectedToken(this._tokenStream.LT(1))},_validateProperty:function(e,t){Validation.validate(e,t)},parse:function(e){this._tokenStream=new TokenStream(e,Tokens),this._stylesheet()},parseStyleSheet:function(e){return this.parse(e)},parseMediaQuery:function(e){this._tokenStream=new TokenStream(e,Tokens);var t=this._media_query();return this._verifyEnd(),t},parsePropertyValue:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._expr();return this._readWhitespace(),this._verifyEnd(),t},parseRule:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._ruleset();return this._readWhitespace(),this._verifyEnd(),t},parseSelector:function(e){this._tokenStream=new TokenStream(e,Tokens),this._readWhitespace();var t=this._selector();return this._readWhitespace(),this._verifyEnd(),t},parseStyleAttribute:function(e){e+="}",this._tokenStream=new TokenStream(e,Tokens),this._readDeclarations()}};for(t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);return e}();var Properties={"align-items":"flex-start | flex-end | center | baseline | stretch","align-content":"flex-start | flex-end | center | space-between | space-around | stretch","align-self":"auto | flex-start | flex-end | center | baseline | stretch","-webkit-align-items":"flex-start | flex-end | center | baseline | stretch","-webkit-align-content":"flex-start | flex-end | center | space-between | space-around | stretch","-webkit-align-self":"auto | flex-start | flex-end | center | baseline | stretch","alignment-adjust":"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | | ","alignment-baseline":"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical",animation:1,"animation-delay":{multi:"